Browse Source

Merge branch 'dev' of https://github.com/mrdoob/three.js into dev

Brent Van Minnen 11 years ago
parent
commit
18993868e3

+ 11 - 11
docs/api/math/Box2.html

@@ -43,7 +43,7 @@
 
 
 
-		<h3>.set([page:Vector2 min], [page:Vector2 max]) [page:todo]</h3>
+		<h3>.set([page:Vector2 min], [page:Vector2 max]) [page:Box2 this]</h3>
 		<div>
 		min -- Lower (x, y) boundary of the box. <br />
 		max -- Upper (x, y) boundary of the box.
@@ -52,7 +52,7 @@
 		Sets the lower and upper (x, y) boundaries of this box.
 		</div>
 
-		<h3>.expandByPoint([page:Vector2 point]) [page:Box2]</h3>
+		<h3>.expandByPoint([page:Vector2 point]) [page:Box2 this]</h3>
 		<div>
 		point -- Point that should be included in the box.
 		</div>
@@ -77,7 +77,7 @@
 		Determines whether or not this box intersects *box*.
 		</div>
 
-		<h3>.setFromPoints([page:Array points]) [page:Box2]</h3>
+		<h3>.setFromPoints([page:Array points]) [page:Box2 this]</h3>
 		<div>
 		points -- Set of points that the resulting box will envelop.
 		</div>
@@ -93,7 +93,7 @@
 		Returns the width and height of this box.
 		</div>
 
-		<h3>.union([page:Box2 box]) [page:Box2]</h3>
+		<h3>.union([page:Box2 box]) [page:Box2 this]</h3>
 		<div>
 		box -- Box that will be unioned with this box.
 		</div>
@@ -111,7 +111,7 @@
 		Returns point as a proportion of this box's width and height.
 		</div>
 
-		<h3>.expandByScalar([page:float scalar]) [page:Box2]</h3>
+		<h3>.expandByScalar([page:float scalar]) [page:Box2 this]</h3>
 		<div>
 		scalar -- Distance to expand.
 		</div>
@@ -120,7 +120,7 @@
 		will be contracted.
 		</div>
 
-		<h3>.intersect([page:Box2 box]) [page:Box2]</h3>
+		<h3>.intersect([page:Box2 box]) [page:Box2 this]</h3>
 		<div>
 		box -- Box to intersect with.
 		</div>
@@ -139,7 +139,7 @@
 		this function also returns true. 
 		</div>
 
-		<h3>.translate([page:Vector2 offset]) [page:Box2]</h3>
+		<h3>.translate([page:Vector2 offset]) [page:Box2 this]</h3>
 		<div>
 		offset -- Direction and distance of offset.
 		</div>
@@ -168,7 +168,7 @@
 		Returns true if this box and *box* share the same lower and upper bounds.
 		</div>
 
-		<h3>.expandByVector([page:Vector2 vector]) [page:Box2]</h3>
+		<h3>.expandByVector([page:Vector2 vector]) [page:Box2 this]</h3>
 		<div>
 		vector -- Amount to expand this box in each dimension.
 		</div>
@@ -178,7 +178,7 @@
 		this box will be expanded by the y component of *vector* in both directions.
 		</div>
 
-		<h3>.copy([page:Box2 box]) [page:Box2]</h3>
+		<h3>.copy([page:Box2 box]) [page:Box2 this]</h3>
 		<div>
 		box -- Box to copy.
 		</div>
@@ -186,7 +186,7 @@
 		Copies the values of *box* to this box.
 		</div>
 
-		<h3>.makeEmpty() [page:Box2]</h3>
+		<h3>.makeEmpty() [page:Box2 this]</h3>
 		<div>
 		Makes this box empty.
 		</div>
@@ -216,7 +216,7 @@
 		Returns true if the specified point lies within the boundaries of this box.
 		</div>
 
-		<h3>.setFromCenterAndSize([page:Vector2 center], [page:Vector2 size]) [page:Box2]</h3>
+		<h3>.setFromCenterAndSize([page:Vector2 center], [page:Vector2 size]) [page:Box2 this]</h3>
 		<div>
 		center -- Desired center position of the box. <br />
 		size -- Desired x and y dimensions of the box. 

+ 15 - 18
docs/api/math/Box3.html

@@ -9,19 +9,19 @@
 	<body>
 		<h1>[name]</h1>
 
-		<div class="desc">todo</div>
+		<div class="desc">Represents a boundary box in 3d space.</div>
 
 
 		<h2>Constructor</h2>
 
 
-		<h3>[name]([page:todo min], [page:todo max])</h3>
+		<h3>[name]([page:Vector3 min], [page:Vector3 max])</h3>
 		<div>
-		min -- todo <br />
-		max -- todo
+		min -- Lower (x, y, z) boundary of the box.  <br />
+		max -- Upper (x, y, z) boundary of the box.
 		</div>
 		<div>
-		todo
+		Creates a box bounded by min and max
 		</div>
 
 		<h2>Properties</h2>
@@ -30,44 +30,41 @@
 
 		<h3>.[page:Vector3 max]</h3>
 		<div>
-		todo
+		Upper (x, y, z) boundary of this box.
 		</div> 
 
 		<h3>.[page:Vector3 min]</h3>
 		<div>
-		todo
+		Lower (x, y, z) boundary of this box.
 		</div> 
 
 		<h2>Methods</h2>
 
 
 
-		<h3>.set([page:todo min], [page:todo max]) [page:todo]</h3>
+		<h3>.set([page:Vector3 min], [page:Vector3 max]) [page:Box3 this]</h3>
 		<div>
-		min -- todo <br />
-		max -- todo
+		min -- Upper (x, y, z) boundary of this box. <br />
+		max -- Lower (x, y, z) boundary of this box.
 		</div>
 		<div>
 		todo
 		</div>
 
-		<h3>.applyMatrix4([page:todo matrix]) [page:todo]</h3>
+		<h3>.applyMatrix4([page:Matrix4 matrix]) [page:Box3 this]</h3>
 		<div>
-		matrix -- todo
+		matrix -- Transform the box with a matrix.
 		</div>
 		<div>
 		todo
 		</div>
 
-		<h3>.expandByPoint([page:todo point]) [page:todo]</h3>
+		<h3>.expandByPoint([page:Vector3 point]) [page:Box3 this]</h3>
 		<div>
-		point -- todo
-		</div>
-		<div>
-		todo
+		Expands the box outwards by the point. It takes the min and max values of the box.
 		</div>
 
-		<h3>.clampPoint([page:todo point], [page:todo optionalTarget]) [page:todo]</h3>
+		<h3>.clampPoint([page:Vector3 point], [page:todo optionalTarget]) [page:todo]</h3>
 		<div>
 		point -- todo <br />
 		optionalTarget -- todo

+ 19 - 19
docs/api/math/Color.html

@@ -47,7 +47,7 @@
 
 		<h2>Methods</h2>
 
-		<h3>.copy( [page:Color color] ) [page:this]</h3>
+		<h3>.copy( [page:Color color] ) [page:Color this]</h3>
 		<div>
 		color — Color to copy.
 		</div>
@@ -55,7 +55,7 @@
 		Copies given color.
 		</div>
 
-		<h3>.copyGammaToLinear( [page:Color color] ) [page:this]</h3>
+		<h3>.copyGammaToLinear( [page:Color color] ) [page:Color this]</h3>
 		<div>
 		color — Color to copy.
 		</div>
@@ -63,7 +63,7 @@
 		Copies given color making conversion from gamma to linear space.
 		</div>
 
-		<h3>.copyLinearToGamma( [page:Color color] ) [page:this]</h3>
+		<h3>.copyLinearToGamma( [page:Color color] ) [page:Color this]</h3>
 		<div>
 		color — Color to copy.
 		</div>
@@ -71,17 +71,17 @@
 		Copies given color making conversion from linear to gamma space.
 		</div>
 
-		<h3>.convertGammaToLinear() [page:this]</h3>
+		<h3>.convertGammaToLinear() [page:Color this]</h3>
 		<div>
 		Converts this color from gamma to linear space.
 		</div>
 
-		<h3>.convertLinearToGamma() [page:this]</h3>
+		<h3>.convertLinearToGamma() [page:Color this]</h3>
 		<div>
 		Converts this color from linear to gamma space.
 		</div>
 
-		<h3>.setRGB( [page:Float r], [page:Float g], [page:Float b] ) [page:this]</h3>
+		<h3>.setRGB( [page:Float r], [page:Float g], [page:Float b] ) [page:Color this]</h3>
 		<div>
 		r — Red channel value between 0 and 1.<br />
 		g — Green channel value between 0 and 1.<br />
@@ -101,7 +101,7 @@
 		Returns the string formated hexadecimal value of this color.
 		</div>
 
-		<h3>.setHex( [page:Integer hex] ) [page:this]</h3>
+		<h3>.setHex( [page:Integer hex] ) [page:Color this]</h3>
 		<div>
 		hex — Color in hexadecimal.<br />
 		</div>
@@ -109,7 +109,7 @@
 		Sets this color from a hexadecimal value.
 		</div>
 
-		<h3>.setStyle( [page:String style] ) [page:this]</h3>
+		<h3>.setStyle( [page:String style] ) [page:Color this]</h3>
 		<div>
 		style — color as a CSS-style string, for example, "rgb(250, 0,0)", "rgb(100%,0%,0%)", "#ff0000", "#f00", or "red"
 		</div>
@@ -122,7 +122,7 @@
 		Returns the value of this color as a CSS-style string. Example: rgb(255,0,0)
 		</div>
 
-		<h3>.setHSL( [page:Float h], [page:Float s], [page:Float l] ) [page:this]</h3>
+		<h3>.setHSL( [page:Float h], [page:Float s], [page:Float l] ) [page:Color this]</h3>
 		<div>
 		h — hue value between 0.0 and 1.0 <br />
 		s — saturation value between 0.0 and 1.0 <br />
@@ -137,37 +137,37 @@
 		Returns an object with properties h, s, and l.
 		</div>
 
-		<h3>.offsetHSL( [page:Float h], [page:Float s], [page:Float l] ) [page:this]</h3>
+		<h3>.offsetHSL( [page:Float h], [page:Float s], [page:Float l] ) [page:Color this]</h3>
 		<div>
 		Adds given h, s, and l to this color's existing h, s, and l values.
 		</div>
 
-		<h3>.add ( [page:Color color] ) [page:this]</h3>
+		<h3>.add ( [page:Color color] ) [page:Color this]</h3>
 		<div>
 		Adds rgb values of given color to rgb values of this color
 		</div>
 
-		<h3>.addColors( [page:Color color1], [page:Color color2] ) [page:this]</h3>
+		<h3>.addColors( [page:Color color1], [page:Color color2] ) [page:Color this]</h3>
 		<div>
 		Sets this color to the sum of color1 and color2
 		</div>
 
-		<h3>.addScalar( [page:Number s] ) [page:this]</h3>
+		<h3>.addScalar( [page:Number s] ) [page:Color this]</h3>
 		<div>
 		Adds s to the rgb values of this color
 		</div>
 
-		<h3>.multiply( [page:Color color] ) [page:this]</h3>
+		<h3>.multiply( [page:Color color] ) [page:Color this]</h3>
 		<div>
 		Multiplies this color's rgb values by given color's rgb values
 		</div>
 
-		<h3>.multiplyScalar( [page:Number s] ) [page:this]</h3>
+		<h3>.multiplyScalar( [page:Number s] ) [page:Color this]</h3>
 		<div>
 		Multiplies this color's rgb values by s
 		</div>
 
-		<h3>.lerp( [page:Color color], alpha ) [page:this]</h3>
+		<h3>.lerp( [page:Color color], alpha ) [page:Color this]</h3>
 		<div>
 		alpha -- a number between 0 and 1.
 		</div>
@@ -175,7 +175,7 @@
 		Linear interpolation of this colors rgb values and the rgb values of the first argument. The alpha argument can be thought of as the percent between the two colors, where 0 is this color and 1 is the first argument.
 		</div>
 
-		<h3>.equals( [page:Color c] ) [page:this]</h3>
+		<h3>.equals( [page:Color c] ) [page:Color this]</h3>
 		<div>
 		Compares this color and c and returns true if they are the same, false otherwise.
 		</div>
@@ -185,9 +185,9 @@
 		Clones this color.
 		</div>
 
-		<h3>.set([page:todo value]) [page:this]</h3>
+		<h3>.set( value ) [page:Color this]</h3>
 		<div>
-		value -- either an instance of Color, a hexadecimal value, or a css style string
+		value -- either an instance of [page:Color], a [page:Integer hexadecimal] value, or a css style [page:String string]
 		</div>
 		<div>
 		Delegates to .copy, .setStyle, or .setHex depending on input type.

+ 17 - 14
docs/api/math/Euler.html

@@ -9,7 +9,10 @@
   <body>
     <h1>[name]</h1>
 
-    <div class="desc">Euler Angles.</div>
+    <div class="desc">Euler Angles. <br/><br/>
+    
+    Euler angles describe a rotation transformation by rotating an object on its various axes in specified amounts per axis, and a specified axis order.
+    (More information on <a href='http://en.wikipedia.org/wiki/Euler_angles' target='blank'>Wikipedia</a>)</div>
 
     <h2>Example</h2>
 
@@ -22,11 +25,11 @@
     <h2>Constructor</h2>
 
 
-    <h3>[name]( [page:Float x], [page:Float y], [page:Float z], [page:String Order] )</h3>
+    <h3>[name]( [page:Float x], [page:Float y], [page:Float z], [page:String order] )</h3>
     <div>
-    x -- [page:Float] the angle of the x axis<br />
-    y -- [page:Float] the angle of the y axis<br />
-    z -- [page:Float] the angle of the z axis<br />
+    x -- [page:Float] the angle of the x axis in radians<br />
+    y -- [page:Float] the angle of the y axis in radians<br />
+    z -- [page:Float] the angle of the z axis in radians<br />
     order -- [page:String] A string representing the order that the rotations are applied, defaults to 'XYZ' (must be upper case).
     </div>
     <div>
@@ -48,23 +51,23 @@
 
     <h2>Methods</h2>
 
-    <h3>.set( [page:Float x], [page:Float y], [page:Float z], [page:String order] ) [page:this]</h3>
+    <h3>.set( [page:Float x], [page:Float y], [page:Float z], [page:String order] ) [page:Euler this]</h3>
     <div>
-    x -- [page:Float] Angle in x axis<br />
-    x -- [page:Float] Angle in x axis<br />
-    x -- [page:Float] Angle in x axis<br />
+    x -- [page:Float] Angle in x axis in radians<br />
+    x -- [page:Float] Angle in x axis in radians<br />
+    x -- [page:Float] Angle in x axis in radians<br />
     order -- [page:string] Order of axes, defaults to 'XYZ' (must be upper case)
     </div>
     <div>
     Sets the angles of this euler transform.
     </div>
 
-    <h3>.copy( [page:Euler euler] ) [page:this]</h3>
+    <h3>.copy( [page:Euler euler] ) [page:Euler this]</h3>
     <div>
     Copies value of *euler* to this euler.
     </div>
 
-    <h3>.setFromRotationMatrix( [page:Matrix4 m], [page:String order] ) [page:this]</h3>
+    <h3>.setFromRotationMatrix( [page:Matrix4 m], [page:String order] ) [page:Euler this]</h3>
     <div>
     m -- [page:Matrix4] assumes upper 3x3 of matrix is a pure rotation matrix (i.e. unscaled)<br />
     order -- [page:string] Order of axes, defaults to 'XYZ' (must be upper case)
@@ -73,7 +76,7 @@
     Sets the angles of this euler transform from a pure rotation matrix based on the orientation specified by order.
     </div>
 
-    <h3>.setFromQuaternion( [page:Quaternion q], [page:String order] ) [page:this]</h3>
+    <h3>.setFromQuaternion( [page:Quaternion q], [page:String order] ) [page:Euler this]</h3>
     <div>
     q -- [page:Quaternion] quaternion must be normalized<br />
     order -- [page:string] Order of axes, defaults to 'XYZ' (must be upper case)
@@ -82,13 +85,13 @@
     Sets the angles of this euler transform from a normalized quaternion based on the orientation specified by order.
     </div>
 
-    <h3>.reorder( [page:String newOrder] ) [page:this]</h3>
+    <h3>.reorder( [page:String newOrder] ) [page:Euler this]</h3>
     <div>
     Resets the euler angle with a new order by creating a quaternion from this euler angle and then setting this euler angle with the quaternion and the new order. <br />
     WARNING: this discards revolution information.
     </div>
 
-    <h3>.fromArray([page:Array array]) [page:this]</h3>
+    <h3>.fromArray([page:Array array]) [page:Euler this]</h3>
     <div>
     array -- [page:Array] of length 3 or 4. array[3] is an optional order argument.
     </div>

+ 26 - 26
docs/api/math/Frustum.html

@@ -15,17 +15,17 @@
 		<h2>Constructor</h2>
 
 
-		<h3>[name]([page:todo p0], [page:todo p1], [page:todo p2], [page:todo p3], [page:todo p4], [page:todo p5])</h3>
+		<h3>[name]([page:Plane p0], [page:Plane p1], [page:Plane p2], [page:Plane p3], [page:Plane p4], [page:Plane p5])</h3>
 		<div>
-		p0 -- todo <br />
-		p1 -- todo <br />
-		p2 -- todo <br />
-		p3 -- todo <br />
-		p4 -- todo <br />
-		p5 -- todo
+		p0 -- [page:Plane] <br />
+		p1 -- [page:Plane] <br />
+		p2 -- [page:Plane] <br />
+		p3 -- [page:Plane] <br />
+		p4 -- [page:Plane] <br />
+		p5 -- [page:Plane]
 		</div>
 		<div>
-		todo
+		Creates a frustum from the designated planes.
 		</div>
 
 
@@ -33,7 +33,7 @@
 
 		<h3>.[page:Array planes]</h3>
 		<div>
-		Array of 6 [page:Vector4 vectors].
+		Array of 6 [page:Plane planes].
 		</div>
 
 
@@ -46,46 +46,46 @@
 		Checks whether the object is inside the Frustum.
 		</div>
 
-		<h3>.clone() [page:todo]</h3>
+		<h3>.clone() [page:Frustum]</h3>
 		<div>
-		todo
+		Return a copy of this Frustum
 		</div>
 
-		<h3>.set([page:todo p0], [page:todo p1], [page:todo p2], [page:todo p3], [page:todo p4], [page:todo p5]) [page:todo]</h3>
+		<h3>.set([page:Plane p0], [page:Plane p1], [page:Plane p2], [page:Plane p3], [page:Plane p4], [page:Plane p5]) [page:Boolean]</h3>
 		<div>
-		p0 -- todo <br />
-		p1 -- todo <br />
-		p2 -- todo <br />
-		p3 -- todo <br />
-		p4 -- todo <br />
-		p5 -- todo
+		p0 -- [page:Plane] <br />
+		p1 -- [page:Plane] <br />
+		p2 -- [page:Plane] <br />
+		p3 -- [page:Plane] <br />
+		p4 -- [page:Plane] <br />
+		p5 -- [page:Plane]
 		</div>
 		<div>
 		todo
 		</div>
 
-		<h3>.copy([page:todo frustum]) [page:todo]</h3>
+		<h3>.copy([page:Frustum frustum]) [page:Frustum this]</h3>
 		<div>
-		frustum -- todo
+		frustum -- The frustum to copy
 		</div>
 		<div>
 		todo
 		</div>
 
-		<h3>.containsPoint([page:todo point]) [page:todo]</h3>
+		<h3>.containsPoint([page:Vector3 point]) [page:Boolean]</h3>
 		<div>
-		point -- todo
+		point -- [page:Vector3] to test
 		</div>
 		<div>
-		todo
+		Checks to see if the frustum contains the point.
 		</div>
 
-		<h3>.intersectsSphere([page:todo sphere]) [page:todo]</h3>
+		<h3>.intersectsSphere([page:Sphere sphere]) [page:Boolean]</h3>
 		<div>
-		sphere -- todo
+		sphere -- [page:Sphere]
 		</div>
 		<div>
-		todo
+		Check to see if the sphere intersects with the frustum.
 		</div>
 
 		<h2>Source</h2>

+ 19 - 17
docs/api/math/Math.html

@@ -72,42 +72,44 @@
 		Returns -1 if *x* is less than 0, 1 if *x* is greater than 0, and 0 if *x* is zero.
 		</div>
 
-		<h3>.degToRad([page:todo degrees]) [page:todo]</h3>
+		<h3>.degToRad([page:Float degrees]) [page:Float]</h3>
 		<div>
-		degrees -- todo
+		degrees -- [page:Float]
 		</div>
 		<div>
-		todo
+		Converts degrees to radians.
 		</div>
 
-		<h3>.smoothstep([page:todo x], [page:todo min], [page:todo max]) [page:todo]</h3>
+		<h3>.radToDeg([page:Float radians]) [page:Float]</h3>
 		<div>
-		x -- todo <br />
-		min -- todo <br />
-		max -- todo
+		radians -- [page:Float]
 		</div>
 		<div>
-		todo
+		Converts radians to degrees
 		</div>
 
-		<h3>.smootherstep([page:todo x], [page:todo min], [page:todo max]) [page:todo]</h3>
+		<h3>.smoothstep([page:Float x], [page:Float min], [page:Float max]) [page:Float]</h3>
 		<div>
-		x -- todo <br />
-		min -- todo <br />
-		max -- todo
+		x -- The value to evaluate based on its position between min and max. <br />
+		min -- Any x value below min will be 0 <br />
+		max -- Any x value above max will be 1
 		</div>
 		<div>
-		todo
+		Returns a value between 0-1 that represents the percentage that x has moved between min and max, but smoothed or slowed down the closer X is to the min and max.<br/><br/>
+		
+		[link:http://en.wikipedia.org/wiki/Smoothstep Wikipedia]
 		</div>
 
-		<h3>.radToDeg([page:todo radians]) [page:todo]</h3>
+		<h3>.smootherstep([page:Float x], [page:Float min], [page:Float max]) [page:Float]</h3>
 		<div>
-		radians -- todo
+		x -- The value to evaluate based on its position between min and max. <br />
+		min -- Any x value below min will be 0 <br />
+		max --  Any x value above max will be 1
 		</div>
 		<div>
-		todo
+		Returns a value between 0-1. It works the same as smoothstep, but more smooth.
 		</div>
-
+		
 		<h2>Source</h2>
 
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]

+ 58 - 45
docs/api/math/Matrix3.html

@@ -15,20 +15,26 @@
 		<h2>Constructor</h2>
 
 
-		<h3>[name]([page:todo n11], [page:todo n12], [page:todo n13], [page:todo n21], [page:todo n22], [page:todo n23], [page:todo n31], [page:todo n32], [page:todo n33])</h3>
+		<h3>[name]([page:Float n11], [page:Float n12], [page:Float n13], [page:Float n21], [page:Float n22], [page:Float n23], [page:Float n31], [page:Float n32], [page:Float n33])</h3>
 		<div>
-		n11 -- todo <br />
-		n12 -- todo <br />
-		n13 -- todo <br />
-		n21 -- todo <br />
-		n22 -- todo <br />
-		n23 -- todo <br />
-		n31 -- todo <br />
-		n32 -- todo <br />
-		n33 -- todo
+		n11 -- [page:Float] <br />
+		n12 -- [page:Float] <br />
+		n13 -- [page:Float] <br />
+		n21 -- [page:Float] <br />
+		n22 -- [page:Float] <br />
+		n23 -- [page:Float] <br />
+		n31 -- [page:Float] <br />
+		n32 -- [page:Float] <br />
+		n33 -- [page:Float]
 		</div>
 		<div>
-		Initialize the 3x3 matrix with a row-major sequence of values.
+		Initialize the 3x3 matrix with a row-major sequence of values.<br/><br/>
+		
+		n11, n12, n13,<br/>
+		n21, n22, n23,<br/>
+		n31, n32, n33<br/><br/>
+		
+		If no values are sent the matrix will be initialized as an identity matrix.
 		</div>
 
 
@@ -48,82 +54,89 @@
 		Transposes this matrix in place.
 		</div>
 
-		<h3>.transposeIntoArray( [page:Array r] ) [page:Matrix3]</h3>
+		<h3>.transposeIntoArray( [page:Array array] ) [page:Matrix3]</h3>
 		<div>
-		Transposes this matrix into the supplied array *r*, and returns itself.
+		array -- [page:Array] <br />
+		</div>
+		<div>
+		Transposes this matrix into the supplied array, and returns itself.
 		</div>
 
 
-		<h3>.determinant() [page:todo]</h3>
+		<h3>.determinant() [page:Float]</h3>
 		<div>
-		todo
+		Returns the matrix's determinant.
 		</div>
 
-		<h3>.set([page:todo n11], [page:todo n12], [page:todo n13], [page:todo n21], [page:todo n22], [page:todo n23], [page:todo n31], [page:todo n32], [page:todo n33]) [page:todo]</h3>
+		<h3>.set([page:Float n11], [page:Float n12], [page:Float n13], [page:Float n21], [page:Float n22], [page:Float n23], [page:Float n31], [page:Float n32], [page:Float n33]) [page:Matrix3 this]</h3>
 		<div>
-		n11 -- todo <br />
-		n12 -- todo <br />
-		n13 -- todo <br />
-		n21 -- todo <br />
-		n22 -- todo <br />
-		n23 -- todo <br />
-		n31 -- todo <br />
-		n32 -- todo <br />
-		n33 -- todo
+		n11 -- [page:Float] <br />
+		n12 -- [page:Float] <br />
+		n13 -- [page:Float] <br />
+		n21 -- [page:Float] <br />
+		n22 -- [page:Float] <br />
+		n23 -- [page:Float] <br />
+		n31 -- [page:Float] <br />
+		n32 -- [page:Float] <br />
+		n33 -- [page:Float]
 		</div>
 		<div>
 		Set the 3x3 matrix values to the given row-major sequence of values.
 		</div>
 
-		<h3>.multiplyScalar([page:todo s]) [page:todo]</h3>
+		<h3>.multiplyScalar([page:Float scalar]) [page:Matrix3 this]</h3>
 		<div>
-		s -- todo
+		scalar -- [page:Float]
 		</div>
 		<div>
-		todo
+		Multiply every component of the matrix by a scalar value.
 		</div>
 
-		<h3>.multiplyVector3Array([page:todo a]) [page:todo]</h3>
+		<h3>.multiplyVector3Array([page:Array array]) [page:Array]</h3>
 		<div>
-		a -- todo
+		array -- An array in the form [vector1x, vector1y, vector1z, vector2x, vector2y, vector2z, ...]
 		</div>
 		<div>
-		todo
+		Multiply (apply) this matrix against every vector3 in the array.
 		</div>
 
-		<h3>.getNormalMatrix([page:todo m]) [page:todo]</h3>
+		<h3>.getNormalMatrix([page:Matrix4 matrix4]) [page:Matrix3 this]</h3>
 		<div>
-		m -- todo
+		matrix4 -- [page:Matrix4]
 		</div>
 		<div>
-		todo
+		Set this matrix as the normal matrix of the passed [page:Matrix4 matrix4]. The normal matrix is the inverse transpose of the matrix.
 		</div>
 
-		<h3>.getInverse([page:todo matrix], [page:todo throwOnInvertible]) [page:todo]</h3>
+		<h3>.getInverse([page:Matrix4 matrix4], [page:Boolean throwOnInvertible]) [page:Matrix3 this]</h3>
 		<div>
-		matrix -- todo <br />
-		throwOnInvertible -- todo
+		matrix4 -- [page:Matrix4] <br />
+		throwOnInvertible -- [Page:Boolean] If true, throw an error if the matrix is invertible.
 		</div>
 		<div>
-		todo
+		Set this matrix to the inverse of the passed matrix.
 		</div>
 
-		<h3>.copy([page:todo m]) [page:todo]</h3>
+		<h3>.copy([page:Matrix3 matrix]) [page:Matrix3 this]</h3>
 		<div>
-		m -- todo
+		matrix -- [page:Matrix3]
 		</div>
 		<div>
-		todo
+		Copy the values of the passed matrix.
 		</div>
 
-		<h3>.clone() [page:todo]</h3>
+		<h3>.clone() [page:Matrix3]</h3>
 		<div>
-		todo
+		Create a copy of the matrix.
 		</div>
 
-		<h3>.identity() [page:todo]</h3>
+		<h3>.identity() [page:Matrix3 this]</h3>
 		<div>
-		todo
+		Set as an identity matrix.<br/><br/>
+		
+		1, 0, 0<br/>
+		0, 1, 0<br/>
+		0, 0, 1<br/>
 		</div>
 
 		<h2>Source</h2>

+ 31 - 31
docs/api/math/Matrix4.html

@@ -51,53 +51,53 @@
 
 		<h2>Methods</h2>
 
-		<h3>.set( [page:Float n11], [page:Float n12], [page:Float n13], [page:Float n14], [page:Float n21], [page:Float n22], [page:Float n23], [page:Float n24], [page:Float n31], [page:Float n32], [page:Float n33], [page:Float n34], [page:Float n41], [page:Float n42], [page:Float n43], [page:Float n44] ) [page:Matrix4]</h3>
+		<h3>.set( [page:Float n11], [page:Float n12], [page:Float n13], [page:Float n14], [page:Float n21], [page:Float n22], [page:Float n23], [page:Float n24], [page:Float n31], [page:Float n32], [page:Float n33], [page:Float n34], [page:Float n41], [page:Float n42], [page:Float n43], [page:Float n44] ) [page:Matrix4 this]</h3>
 		<div>
 		Sets all fields of this matrix to the supplied row-major values n11..n44.
 		</div>
 
-		<h3>.identity() [page:Matrix4]</h3>
+		<h3>.identity() [page:Matrix4 this]</h3>
 		<div>
 		Resets this matrix to identity.
 		</div>
 
-		<h3>.copy( [page:Matrix4 m] ) [page:Matrix4]</h3>
+		<h3>.copy( [page:Matrix4 m] ) [page:Matrix4 this]</h3>
 		<div>
 		Copies a matrix *m* into this matrix.
 		</div>
 
-		<h3>.copyPosition( [page:Matrix4 m] ) [page:Matrix4]</h3>
+		<h3>.copyPosition( [page:Matrix4 m] ) [page:Matrix4 this]</h3>
 		<div>
 		Copies the translation component of the supplied matrix *m* into this matrix translation component.
 		</div>
 
-		<h3>.extractRotation( [page:Matrix4 m] ) [page:Matrix4]</h3>
+		<h3>.extractRotation( [page:Matrix4 m] ) [page:Matrix4 this]</h3>
 		<div>
 		Extracts the rotation of the supplied matrix *m* into this matrix rotation component.
 		</div>
 
-		<h3>.lookAt( [page:Vector3 eye], [page:Vector3 center], [page:Vector3 up], ) [page:Matrix4]</h3>
+		<h3>.lookAt( [page:Vector3 eye], [page:Vector3 center], [page:Vector3 up], ) [page:Matrix4 this]</h3>
 		<div>
 		Constructs a rotation matrix, looking from *eye* towards *center* with defined *up* vector.
 		</div>
 
-		<h3>.multiply( [page:Matrix4 m] ) [page:Matrix4]</h3>
+		<h3>.multiply( [page:Matrix4 m] ) [page:Matrix4 this]</h3>
 		<div>
 		Multiplies this matrix by *m*.
 		</div>
 
-		<h3>.multiplyMatrices( [page:Matrix4 a], [page:Matrix4 b] ) [page:Matrix4]</h3>
+		<h3>.multiplyMatrices( [page:Matrix4 a], [page:Matrix4 b] ) [page:Matrix4 this]</h3>
 		<div>
 		Sets this matrix to *a x b*.
 		</div>
 
-		<h3>.multiplyToArray( [page:Matrix4 a], [page:Matrix4 b], [page:Array r] ) [page:Matrix4]</h3>
+		<h3>.multiplyToArray( [page:Matrix4 a], [page:Matrix4 b], [page:Array r] ) [page:Matrix4 this]</h3>
 		<div>
 		Sets this matrix to *a x b* and stores the result into the flat array *r*.<br />
 		*r* can be either a regular Array or a TypedArray.
 		</div>
 
-		<h3>.multiplyScalar( [page:Float s] ) [page:Matrix4]</h3>
+		<h3>.multiplyScalar( [page:Float s] ) [page:Matrix4 this]</h3>
 		<div>
 		Multiplies this matrix by *s*.
 		</div>
@@ -108,7 +108,7 @@
 		Based on [link:http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm]
 		</div>
 
-		<h3>.transpose() [page:Matrix4]</h3>
+		<h3>.transpose() [page:Matrix4 this]</h3>
 		<div>
 		Transposes this matrix.
 		</div>
@@ -123,18 +123,18 @@
 		Flattens this matrix into supplied *flat* array starting from *offset* position in the array.
 		</div>
 
-		<h3>.setPosition( [page:Vector3 v] ) [page:Matrix4]</h3>
+		<h3>.setPosition( [page:Vector3 v] ) [page:Matrix4 this]</h3>
 		<div>
 		Sets the position component for this matrix from vector *v*.
 		</div>
 
-		<h3>.getInverse( [page:Matrix4 m] ) [page:Matrix4]</h3>
+		<h3>.getInverse( [page:Matrix4 m] ) [page:Matrix4 this]</h3>
 		<div>
 		Sets this matrix to the inverse of matrix *m*.<br />
 		Based on [link:http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm].
 		</div>
 
-		<h3>.makeRotationFromEuler( [page:Vector3 v], [page:String order] ) [page:Matrix4]</h3>
+		<h3>.makeRotationFromEuler( [page:Vector3 v], [page:String order] ) [page:Matrix4 this]</h3>
 		<div>
 		v — Rotation vector.
 		order — The order of rotations. Eg. "XYZ".
@@ -144,17 +144,17 @@
 		Default order is *"XYZ"*.
 		</div>
 
-		<h3>.makeRotationFromQuaternion( [page:Quaternion q] ) [page:Matrix4]</h3>
+		<h3>.makeRotationFromQuaternion( [page:Quaternion q] ) [page:Matrix4 this]</h3>
 		<div>
 		Sets the rotation submatrix of this matrix to the rotation specified by *q*. The rest of the matrix is identity.
 		</div>
 
-		<h3>.scale( [page:Vector3 v] ) [page:Matrix4]</h3>
+		<h3>.scale( [page:Vector3 v] ) [page:Matrix4 this]</h3>
 		<div>
 		Multiplies the columns of this matrix by vector *v*.
 		</div>
 
-		<h3>.compose( [page:Vector3 translation], [page:Quaternion quaternion], [page:Vector3 scale] ) [page:Matrix4]</h3>
+		<h3>.compose( [page:Vector3 translation], [page:Quaternion quaternion], [page:Vector3 scale] ) [page:Matrix4 this]</h3>
 		<div>
 		Sets this matrix to the transformation composed of *translation*, *quaternion* and *scale*.
 		</div>
@@ -165,12 +165,12 @@
 		If parameters are not passed, new instances will be created.
 		</div>
 
-		<h3>.makeTranslation( [page:Float x], [page:Float y], [page:Float z] ) [page:Matrix4]</h3>
+		<h3>.makeTranslation( [page:Float x], [page:Float y], [page:Float z] ) [page:Matrix4 this]</h3>
 		<div>
 		Sets this matrix as translation transform.
 		</div>
 
-		<h3>.makeRotationX( [page:Float theta] ) [page:Matrix4]</h3>
+		<h3>.makeRotationX( [page:Float theta] ) [page:Matrix4 this]</h3>
 		<div>
 		theta — Rotation angle in radians.
 		</div>
@@ -178,7 +178,7 @@
 		Sets this matrix as rotation transform around x axis by *theta* radians.
 		</div>
 
-		<h3>.makeRotationY( [page:Float theta] ) [page:Matrix4]</h3>
+		<h3>.makeRotationY( [page:Float theta] ) [page:Matrix4 this]</h3>
 		<div>
 		theta — Rotation angle in radians.
 		</div>
@@ -186,7 +186,7 @@
 		Sets this matrix as rotation transform around y axis by *theta* radians.
 		</div>
 
-		<h3>.makeRotationZ( [page:Float theta] ) [page:Matrix4]</h3>
+		<h3>.makeRotationZ( [page:Float theta] ) [page:Matrix4 this]</h3>
 		<div>
 		theta — Rotation angle in radians.
 		</div>
@@ -194,7 +194,7 @@
 		Sets this matrix as rotation transform around z axis by *theta* radians.
 		</div>
 
-		<h3>.makeRotationAxis( [page:Vector3 axis], [page:Float theta] ) [page:Matrix4]</h3>
+		<h3>.makeRotationAxis( [page:Vector3 axis], [page:Float theta] ) [page:Matrix4 this]</h3>
 		<div>
 		axis — Rotation axis, should be normalized.
 		theta — Rotation angle in radians.
@@ -204,22 +204,22 @@
 		Based on [link:http://www.gamedev.net/reference/articles/article1199.asp].
 		</div>
 
-		<h3>.makeScale( [page:Float x], [page:Float y], [page:Float z] ) [page:Matrix4]</h3>
+		<h3>.makeScale( [page:Float x], [page:Float y], [page:Float z] ) [page:Matrix4 this]</h3>
 		<div>
 		Sets this matrix as scale transform.
 		</div>
 
-		<h3>.makeFrustum( [page:Float left], [page:Float right], [page:Float bottom], [page:Float top], [page:Float near], [page:Float far] ) [page:Matrix4]</h3>
+		<h3>.makeFrustum( [page:Float left], [page:Float right], [page:Float bottom], [page:Float top], [page:Float near], [page:Float far] ) [page:Matrix4 this]</h3>
 		<div>
 		Creates a [page:Frustum frustum] matrix.
 		</div>
 
-		<h3>.makePerspective( [page:Float fov], [page:Float aspect], [page:Float near], [page:Float far] ) [page:Matrix4]</h3>
+		<h3>.makePerspective( [page:Float fov], [page:Float aspect], [page:Float near], [page:Float far] ) [page:Matrix4 this]</h3>
 		<div>
 		Creates a perspective projection matrix.
 		</div>
 
-		<h3>.makeOrthographic( [page:Float left], [page:Float right], [page:Float bottom], [page:Float top], [page:Float near], [page:Float far] ) [page:Matrix4]</h3>
+		<h3>.makeOrthographic( [page:Float left], [page:Float right], [page:Float bottom], [page:Float top], [page:Float near], [page:Float far] ) [page:Matrix4 this]</h3>
 		<div>
 		Creates an orthographic projection matrix.
 		</div>
@@ -229,17 +229,17 @@
 		Clones this matrix.
 		</div>
 
-		<h3>.multiplyVector3Array([page:todo a]) [page:todo]</h3>
+		<h3>.multiplyVector3Array([page:Array a]) [page:Array]</h3>
 		<div>
-		a -- todo
+		array -- An array in the form [vector1x, vector1y, vector1z, vector2x, vector2y, vector2z, ...]
 		</div>
 		<div>
-		todo
+		Multiply (apply) this matrix against every vector3 in the array.
 		</div>
 
-		<h3>.getMaxScaleOnAxis() [page:todo]</h3>
+		<h3>.getMaxScaleOnAxis() [page:Float]</h3>
 		<div>
-		todo
+		Gets the max scale value of the 3 axes.
 		</div>
 
 		<h2>Source</h2>

+ 38 - 38
docs/api/math/Vector2.html

@@ -42,48 +42,48 @@
 
 		<h2>Methods</h2>
 
-		<h3>.set( [page:Float x], [page:Float y] ) [page:Vector2]</h3>
+		<h3>.set( [page:Float x], [page:Float y] ) [page:Vector2 this]</h3>
 		<div>
 		Sets value of this vector.
 		</div>
 
-		<h3>.copy( [page:Vector2 v] ) [page:Vector2]</h3>
+		<h3>.copy( [page:Vector2 v] ) [page:Vector2 this]</h3>
 		<div>
 		Copies value of *v* to this vector.
 		</div>
 
-		<h3>.add( [page:Vector2 v] ) [page:Vector2]</h3>
+		<h3>.add( [page:Vector2 v] ) [page:Vector2 this]</h3>
 		<div>
 		Adds *v* to this vector.
 		</div>
 
-		<h3>.addVectors( [page:Vector2 a], [page:Vector2 b] ) [page:Vector2]</h3>
+		<h3>.addVectors( [page:Vector2 a], [page:Vector2 b] ) [page:Vector2 this]</h3>
 		<div>
 		Sets this vector to *a + b*.
 		</div>
 
-		<h3>.sub( [page:Vector2 v] ) [page:Vector2]</h3>
+		<h3>.sub( [page:Vector2 v] ) [page:Vector2 this]</h3>
 		<div>
 		Subtracts *v* from this vector.
 		</div>
 
-		<h3>.subVectors( [page:Vector2 a], [page:Vector2 b] ) [page:Vector2]</h3>
+		<h3>.subVectors( [page:Vector2 a], [page:Vector2 b] ) [page:Vector2 this]</h3>
 		<div>
 		Sets this vector to *a - b*.
 		</div>
 
-		<h3>.multiplyScalar( [page:Float s] ) [page:Vector2]</h3>
+		<h3>.multiplyScalar( [page:Float s] ) [page:Vector2 this]</h3>
 		<div>
 		Multiplies this vector by scalar *s*.
 		</div>
 
-		<h3>.divideScalar( [page:Float s] ) [page:Vector2]</h3>
+		<h3>.divideScalar( [page:Float s] ) [page:Vector2 this]</h3>
 		<div>
 		Divides this vector by scalar *s*.<br />
 		Set vector to *( 0, 0 )* if *s == 0*.
 		</div>
 
-		<h3>.negate() [page:Vector2]</h3>
+		<h3>.negate() [page:Vector2 this]</h3>
 		<div>
 		Inverts this vector.
 		</div>
@@ -103,7 +103,7 @@
 		Computes length of this vector.
 		</div>
 
-		<h3>.normalize() [page:Vector2]</h3>
+		<h3>.normalize() [page:Vector2 this]</h3>
 		<div>
 		Normalizes this vector.
 		</div>
@@ -118,7 +118,7 @@
 		Computes squared distance of this vector to *v*.
 		</div>
 
-		<h3>.setLength( [page:Float l] ) [page:Vector2]</h3>
+		<h3>.setLength( [page:Float l] ) [page:Vector2 this]</h3>
 		<div>
 		Normalizes this vector and multiplies it by *l*.
 		</div>
@@ -134,7 +134,7 @@
 		</div>
 
 
-		<h3>.clamp([page:todo min], [page:todo max]) [page:this]</h3>
+		<h3>.clamp([page:Vector2 min], [page:Vector2 max]) [page:Vector2 this]</h3>
 		<div>
 		min -- [page:Vector2] containing the min x and y values in the desired range <br />
 		max -- [page:Vector2] containing the max x and y values in the desired range
@@ -143,12 +143,7 @@
 		If this vector's x or y value is greater than the max vector's x or y value, it is replaced by the corresponding value. <br />  If this vector's x or y value is less than the min vector's x or y value, it is replace by the corresponding value.
 		</div>
 
-		<h3>.toArray() [page:Array]</h3>
-		<div>
-		Returns an array [x, y].
-		</div>
-
-		<h3>.lerp([page:todo v], [page:todo alpha]) [page:this]</h3>
+		<h3>.lerp([page:Vector2 v], [page:Float alpha]) [page:Vector2 this]</h3>
 		<div>
 		v -- [page:Vector2] <br />
 		alpha -- [page:Float] between 0 and 1;
@@ -157,33 +152,25 @@
 		Linear interpolation between this vector and v, where alpha is the percent along the line.
 		</div>
 
-		<h3>.setComponent([page:todo index], [page:todo value]) [page:undefined]</h3>
+		<h3>.setComponent([page:Integer index], [page:Float value]) [page:undefined]</h3>
 		<div>
 		index -- 0 or 1 <br />
-		value -- [page:todo Float]
+		value -- [page:Float]
 		</div>
 		<div>
 		if index equals 0 method replaces this.x with value. <br />
 		if index equals 1 method replaces this.y with value.
 		</div>
 
-		<h3>.min([page:todo v]) [page:this]</h3>
-		<div>
-		v -- [page:Vector2]
-		</div>
-		<div>
-		If this vector's x or y value is less than v's x or y value, replace that value with the corresponding min value.
-		</div>
-
-		<h3>.addScalar([page:todo s]) [page:this]</h3>
+		<h3>.addScalar([page:Float s]) [page:Vector2 this]</h3>
 		<div>
-		s -- [page:todo Float]
+		s -- [page:Float]
 		</div>
 		<div>
 		Add the scalar value s to this vector's x and y values.
 		</div>
 
-		<h3>.getComponent([page:todo index]) [page:todo Float]</h3>
+		<h3>.getComponent([page:Integer index]) [page:Float]</h3>
 		<div>
 		index -- 0 or 1
 		</div>
@@ -192,15 +179,28 @@
 		if index equals 1 returns the y value.
 		</div>
 
-		<h3>.fromArray([page:todo array]) [page:todo this]</h3>
+		<h3>.fromArray([page:Array array]) [page:Vector2 this]</h3>
 		<div>
-		array -- [page:todo Array] of length 2
+		array -- [page:Array] of length 2
 		</div>
 		<div>
 		Sets this vector's x value to be array[0] and y value to be array[1].
 		</div>
 
-		<h3>.max([page:todo v]) [page:todo this]</h3>
+		<h3>.toArray() [page:Array]</h3>
+		<div>
+		Returns an array [x, y].
+		</div>
+
+		<h3>.min([page:Vector2 v]) [page:Vector2 this]</h3>
+		<div>
+		v -- [page:Vector2]
+		</div>
+		<div>
+		If this vector's x or y value is less than v's x or y value, replace that value with the corresponding min value.
+		</div>
+
+		<h3>.max([page:Vector2 v]) [page:Vector2 this]</h3>
 		<div>
 		v -- [page:Vector2]
 		</div>
@@ -208,17 +208,17 @@
 		If this vector's x or y value is greater than v's x or y value, replace that value with the corresponding max value.
 		</div>
 
-		<h3>.setX([page:todo x]) [page:todo this]</h3>
+		<h3>.setX([page:Float x]) [page:Vector2 this]</h3>
 		<div>
-		x -- [page:todo Float]
+		x -- [page:Float]
 		</div>
 		<div>
 		replace this vector's x value with x.
 		</div>
 
-		<h3>.setY([page:todo y]) [page:todo this]</h3>
+		<h3>.setY([page:Float y]) [page:Vector2 this]</h3>
 		<div>
-		y -- [page:todo Float]
+		y -- [page:Float]
 		</div>
 		<div>
 		replace this vector's y value with y.

+ 83 - 81
docs/api/math/Vector3.html

@@ -47,63 +47,63 @@
 
 		<h2>Methods</h2>
 
-		<h3>.set( [page:Float x], [page:Float y], [page:Float z] ) [page:this]</h3>
+		<h3>.set( [page:Float x], [page:Float y], [page:Float z] ) [page:Vector3 this]</h3>
 		<div>
 		Sets value of this vector.
 		</div>
 
-		<h3>.setX( [page:Float x] ) [page:this]</h3>
+		<h3>.setX( [page:Float x] ) [page:Vector3 this]</h3>
 		<div>
 		Sets x value of this vector.
 		</div>
 
-		<h3>.setY( [page:Float y] ) [page:this]</h3>
+		<h3>.setY( [page:Float y] ) [page:Vector3 this]</h3>
 		<div>
 		Sets y value of this vector.
 		</div>
 
-		<h3>.setZ( [page:Float z] ) [page:this]</h3>
+		<h3>.setZ( [page:Float z] ) [page:Vector3 this]</h3>
 		<div>
 		Sets z value of this vector.
 		</div>
 
-		<h3>.copy( [page:Vector3 v] ) [page:this]</h3>
+		<h3>.copy( [page:Vector3 v] ) [page:Vector3 this]</h3>
 		<div>
 		Copies value of *v* to this vector.
 		</div>
 
-		<h3>.add( [page:Vector3 v] ) [page:this]</h3>
+		<h3>.add( [page:Vector3 v] ) [page:Vector3 this]</h3>
 		<div>
 		Adds *v* to this vector.
 		</div>
 
-		<h3>.addVectors( [page:Vector3 a], [page:Vector3 b] ) [page:this]</h3>
+		<h3>.addVectors( [page:Vector3 a], [page:Vector3 b] ) [page:Vector3 this]</h3>
 		<div>
 		Sets this vector to *a + b*.
 		</div>
 
-		<h3>.sub( [page:Vector3 v] ) [page:this]</h3>
+		<h3>.sub( [page:Vector3 v] ) [page:Vector3 this]</h3>
 		<div>
 		Subtracts *v* from this vector.
 		</div>
 
-		<h3>.subVectors( [page:Vector3 a], [page:Vector3 b] ) [page:this]</h3>
+		<h3>.subVectors( [page:Vector3 a], [page:Vector3 b] ) [page:Vector3 this]</h3>
 		<div>
 		Sets this vector to *a - b*.
 		</div>
 
-		<h3>.multiplyScalar( [page:Float s] ) [page:this]</h3>
+		<h3>.multiplyScalar( [page:Float s] ) [page:Vector3 this]</h3>
 		<div>
 		Multiplies this vector by scalar *s*.
 		</div>
 
-		<h3>.divideScalar( [page:Float s] ) [page:this]</h3>
+		<h3>.divideScalar( [page:Float s] ) [page:Vector3 this]</h3>
 		<div>
 		Divides this vector by scalar *s*.<br />
 		Set vector to *( 0, 0, 0 )* if *s == 0*.
 		</div>
 
-		<h3>.negate() [page:this]</h3>
+		<h3>.negate() [page:Vector3 this]</h3>
 		<div>
 		Inverts this vector.
 		</div>
@@ -129,7 +129,7 @@
 		[link:http://en.wikipedia.org/wiki/Taxicab_geometry]
 		</div>
 
-		<h3>.normalize() [page:this]</h3>
+		<h3>.normalize() [page:Vector3 this]</h3>
 		<div>
 		Normalizes this vector. Transforms this Vector into a Unit vector by dividing the vector by it's length.
 		</div>
@@ -144,27 +144,27 @@
 		Computes squared distance of this vector to *v*.
 		</div>
 
-		<h3>.setLength( [page:Float l] ) [page:this]</h3>
+		<h3>.setLength( [page:Float l] ) [page:Vector3 this]</h3>
 		<div>
 		Normalizes this vector and multiplies it by *l*.
 		</div>
 
-		<h3>.cross( [page:Vector3 v] ) [page:this]</h3>
+		<h3>.cross( [page:Vector3 v] ) [page:Vector3 this]</h3>
 		<div>
 		Sets this vector to cross product of itself and *v*.
 		</div>
 
-		<h3>.crossVectors( [page:Vector3 a], [page:Vector3 b] ) [page:this]</h3>
+		<h3>.crossVectors( [page:Vector3 a], [page:Vector3 b] ) [page:Vector3 this]</h3>
 		<div>
 		Sets this vector to cross product of *a* and *b*.
 		</div>
 
-		<h3>.getPositionFromMatrix( [page:Matrix4 m] ) [page:this]</h3>
+		<h3>.getPositionFromMatrix( [page:Matrix4 m] ) [page:Vector3 this]</h3>
 		<div>
 		Sets this vector extracting position from matrix transform.
 		</div>
 
-		<h3>.getScaleFromMatrix( [page:Matrix4 m] ) [page:this]</h3>
+		<h3>.getScaleFromMatrix( [page:Matrix4 m] ) [page:Vector3 this]</h3>
 		<div>
 		Sets this vector extracting scale from matrix transform.
 		</div>
@@ -180,16 +180,17 @@
 		</div>
 
 
-		<h3>.clamp([page:todo min], [page:todo max]) [page:this]</h3>
+		<h3>.clamp([page:Vector3 min], [page:Vector3 max]) [page:Vector3 this]</h3>
 		<div>
 		min -- [page:Vector3] <br />
 		max -- [page:Vector3]
 		</div>
 		<div>
-		If this vector's x, y or z value is greater than the max vector's x, y or z value, it is replaced by the corresponding value. <br />  If this vector's x, y or z value is less than the min vector's x, y or z value, it is replace by the corresponding value.
+		If this vector's x, y or z value is greater than the max vector's x, y or z value, it is replaced by the corresponding value. <br /><br />
+		If this vector's x, y or z value is less than the min vector's x, y or z value, it is replace by the corresponding value.
 		</div>
 
-		<h3>.applyMatrix3([page:todo m]) [page:this]</h3>
+		<h3>.applyMatrix3([page:Matrix3 m]) [page:Vector3 this]</h3>
 		<div>
 		m -- [page:Matrix3]
 		</div>
@@ -197,58 +198,66 @@
 		Multiplies this vector times a 3 x 3 matrix.
 		</div>
 
-		<h3>.applyMatrix4([page:todo m]) [page:todo this]</h3>
+		<h3>.applyMatrix4([page:Matrix3 m]) [page:Vector3 this]</h3>
 		<div>
-		m -- [page:todo Matrix4]
+		m -- [page:Matrix4]
 		</div>
 		<div>
 		Multiplies this vector by 4 x 3 subset of a Matrix4.
 		</div>
 
-		<h3>.projectOnPlane([page:todo planeNormal]) [page:todo this]</h3>
+		<h3>.projectOnPlane([page:Vector3 planeNormal]) [page:Vector3 this]</h3>
 		<div>
-		planeNormal -- [page:todo Plane.normal]
+		planeNormal -- [page:Vector3 planeNormal] A vector representing a plane normal.
 		</div>
 		<div>
 		Projects this vector onto a plane by subtracting this vector projected onto the plane's normal from this vector.
 		</div>
 
-		<h3>.projectOnVector([page:todo vector]) [page:todo this]</h3>
+		<h3>.projectOnVector([page:Vector3]) [page:Vector3 this]</h3>
 		<div>
-		vector -- [page:todo Vector3]
+		vector -- [page:Vector3]
 		</div>
 		<div>
 		Projects this vector onto another vector.
 		</div>
 
-		<h3>.addScalar([page:todo s]) [page:todo this]</h3>
+		<h3>.addScalar([page:Float]) [page:Vector3 this]</h3>
 		<div>
-		s -- [page:todo Float]
+		s -- [page:Float]
 		</div>
 		<div>
 		Adds a s to this vector.
 		</div>
 
-		<h3>.divide([page:todo v]) [page:todo this]</h3>
+		<h3>.divide([page:Vector3 v]) [page:Vector3 this]</h3>
 		<div>
-		v -- [page:todo Vector3]
+		v -- [page:Vector3]
 		</div>
 		<div>
 		Divides this vector by vector v.
 		</div>
 
-		<h3>.min([page:todo v]) [page:todo]</h3>
+		<h3>.min([page:Vector3 v]) [page:Vector3 this]</h3>
 		<div>
-		v -- [page:todo Vector3]
+		v -- [page:Vector3]
 		</div>
 		<div>
 		If this vector's x, y, or z value is less than vector v's x, y, or z value, that value is replaced by the corresponding vector v value.
 		</div>
 
-		<h3>.setComponent([page:todo index], [page:todo value]) [page:todo this]</h3>
+		<h3>.max([page:Vector3 v]) [page:Vector3 this]</h3>
+		<div>
+		v -- [page:Vector3]
+		</div>
+		<div>
+		If this vector's x, y, or z value is greater than vector v's x, y, or z value, that value is replaced by the corresponding vector v value.
+		</div>
+
+		<h3>.setComponent([page:Integer index], [page:Float value]) [page:Vector3 this]</h3>
 		<div>
 		index -- 0, 1, or 2 <br />
-		value -- [page:todo Float]
+		value -- [page:Float]
 		</div>
 		<div>
 		If index equals 0 the method sets this vector's x value to value <br />
@@ -256,111 +265,104 @@
 		If index equals 2 the method sets this vector's z value to value
 		</div>
 
-		<h3>.transformDirection([page:todo m]) [page:todo this]</h3>
+		<h3>.transformDirection([page:Matrix4 m]) [page:Vector3 this]</h3>
 		<div>
-		m -- [page:todo Matrix4]
+		m -- [page:Matrix4]
 		</div>
 		<div>
-		Multiplies this vector by a 3 x 3 subset of a Matrix4 and then normalizes the results.
+		Transforms the direction of this vector by a matrix (a 3 x 3 subset of a Matrix4) and then normalizes the result.
 		</div>
 
-		<h3>.multiplyVectors([page:todo a], [page:todo b]) [page:todo this]</h3>
+		<h3>.multiplyVectors([page:Vector3 a], [page:Vector3 b]) [page:Vector3 this]</h3>
 		<div>
-		a -- [page:todo Vector3] <br />
-		b -- [page:todo Vector3]
+		a -- [page:Vector3] <br />
+		b -- [page:Vector3]
 		</div>
 		<div>
-		Sets this vector equal the result of multiplying vector a by vector b.
+		Sets this vector equal to the result of multiplying vector a by vector b.
 		</div>
 
-		<h3>.getComponent([page:todo index]) [page:todo Float]</h3>
+		<h3>.getComponent([page:Integer index]) [page:Float]</h3>
 		<div>
-		index -- 0, 1, or 2
+		index -- [page:Integer] 0, 1, or 2
 		</div>
 		<div>
-		If index equals 0 the method returns this vector's x value <br />
-		If index equals 1 the method returns this vector's y value <br />
-		If index equals 2 the method returns this vector's z value
+		
+		Returns the value of the vector component x, y, or z by an index. <br /><br />
+		
+		Index 0: x <br />
+		Index 1: y <br />
+		Index 2: z <br />
 		</div>
 
-		<h3>.applyAxisAngle([page:todo axis], [page:todo angle]) [page:todo this]</h3>
+		<h3>.applyAxisAngle([page:Vector3 axis], [page:Float angle]) [page:Vector3 this]</h3>
 		<div>
-		axis -- a normalized [page:todo Vector3] <br />
-		angle -- an angle in radians
+		axis -- A normalized [page:Vector3] <br />
+		angle -- An angle in radians
 		</div>
 		<div>
 		Applies a rotation specified by an axis and an angle to this vector.
 		</div>
 
-		<h3>.lerp([page:todo v], [page:todo alpha]) [page:todo this]</h3>
+		<h3>.lerp([page:Vector3 v], [page:Float alpha]) [page:Vector3 this]</h3>
 		<div>
-		v -- [page:todo Vector3] <br />
-		alpha -- [page:todo Float] between 0 and 1.
+		v -- [page:Vector3] <br />
+		alpha -- [page:Float] between 0 and 1.
 		</div>
 		<div>
 		Linear Interpolation between this vector and vector v, where alpha is the percent along the line.
 		</div>
 
-		<h3>.max([page:todo v]) [page:todo this]</h3>
-		<div>
-		v -- [page:todo Vector3]
-		</div>
-		<div>
-		If this vector's x, y, or z value is greater than vector v's x, y, or z value, that value is replaced by the corresponding vector v value.
-		</div>
-
-		<h3>.angleTo([page:todo v]) [page:todo Float]</h3>
+		<h3>.angleTo([page:Vector3 v]) [page:Float]</h3>
 		<div>
-		v -- [page:todo Vector3]
+		v -- [page:Vector3]
 		</div>
 		<div>
 		Returns the angle between this vector and vector v in radians.
 		</div>
 
-		<h3>.getColumnFromMatrix([page:todo index], [page:todo matrix]) [page:todo this]</h3>
+		<h3>.getColumnFromMatrix([page:Integer index], [page:Matrix4 matrix]) [page:Vector3 this]</h3>
 		<div>
 		index -- 0, 1, 2, or 3 <br />
-		matrix -- [page:todo Matrix4]
+		matrix -- [page:Matrix4]
 		</div>
 		<div>
 		Sets this vector's x, y, and z equal to the column of the matrix specified by the index.
 		</div>
 
-		<h3>.reflect([page:todo vector]) [page:todo this]</h3>
+		<h3>.reflect([page:Vector3 vector]) [page:Vector3 this]</h3>
 		<div>
-		vector -- [page:todo Vector3] the vector to reflect about
+		vector -- [page:Vector3] the vector to reflect about
 		</div>
 		<div>
 		Reflects this vector about a vector.
 		</div>
 
-		<h3>.fromArray([page:todo array]) [page:todo this]</h3>
+		<h3>.fromArray([page:Array array]) [page:Vector3 this]</h3>
 		<div>
-		array -- [page:todo Array]
+		array -- [page:Array] [x, y, z]
 		</div>
 		<div>
-		Assigns this vectors x value to array[0]. <br />
-		Assigns this vectors y value to array[1]. <br />
-		Assigns this vectors z value to array[2]. <br />
+		Sets the vector's components based on an array formatted like [x, y, z]
 		</div>
 
-		<h3>.multiply([page:todo v]) [page:todo this]</h3>
+		<h3>.multiply([page:Vector3 v]) [page:Vector3 this]</h3>
 		<div>
-		v -- [page:todo Vector3] <br />
+		v -- [page:Vector3] <br />
 		</div>
 		<div>
 		Multipies this vector by vector v.
 		</div>
 
-		<h3>.applyProjection([page:todo m]) [page:todo ths]</h3>
+		<h3>.applyProjection([page:Matrix4 m]) [page:Vector3 this]</h3>
 		<div>
-		m -- [page:todo Matrix4] projection matrix.
+		m -- [page:Matrix4] projection matrix.
 		</div>
 		<div>
 		Multiplies this vector and m, and divides by perspective.
 		</div>
 
-		<h3>.toArray() [page:todo Array]</h3>
+		<h3>.toArray() [page:Array]</h3>
 		<div>
 		Assigns this vector's x value to array[0]. <br />
 		Assigns this vector's y value to array[1]. <br />
@@ -368,17 +370,17 @@
 		Returns the created array.
 		</div>
 
-		<h3>.applyEuler( [page:todo euler] ) [page:todo this]</h3>
+		<h3>.applyEuler([page:Euler euler]) [page:Vector3 this]</h3>
 		<div>
-		euler -- [page:todo Euler]
+		euler -- [page:Euler]
 		</div>
 		<div>
 		Applies euler transform to this vector by converting the [page:Euler] obect to a [page:Quaternion] and applying.
 		</div>
 
-		<h3>.applyQuaternion([page:todo q]) [page:todo this]</h3>
+		<h3>.applyQuaternion([page:Quaternion quaternion]) [page:Vector3 this]</h3>
 		<div>
-		q -- [page:Quaternion]
+		quaternion -- [page:Quaternion]
 		</div>
 		<div>
 		Applies a [page:Quaternion] transform to this vector.

+ 83 - 72
docs/api/math/Vector4.html

@@ -17,13 +17,10 @@
 
 		<h3>[name]( [page:Float x], [page:Float y], [page:Float z], [page:Float w] )</h3>
 		<div>
-		x -- todo <br />
-		y -- todo <br />
-		z -- todo <br />
-		w -- todo
-		</div>
-		<div>
-		todo
+		x -- [page:Float] <br />
+		y -- [page:Float] <br />
+		z -- [page:Float] <br />
+		w -- [page:Float]
 		</div>
 
 
@@ -40,22 +37,22 @@
 
 		<h2>Methods</h2>
 
-		<h3>.set( [page:Float x], [page:Float y], [page:Float z], [page:Float w] ) [page:Vector4]</h3>
+		<h3>.set( [page:Float x], [page:Float y], [page:Float z], [page:Float w] ) [page:Vector4 this]</h3>
 		<div>
 		Sets value of this vector.
 		</div>
 
-		<h3>.copy( [page:Vector4 v] ) [page:Vector4]</h3>
+		<h3>.copy( [page:Vector4 v] ) [page:Vector4 this]</h3>
 		<div>
 		Copies value of *v* to this vector.
 		</div>
 
-		<h3>.add( [page:Vector4 v] ) [page:Vector4]</h3>
+		<h3>.add( [page:Vector4 v] ) [page:Vector4 this]</h3>
 		<div>
 		Adds *v* to this vector.
 		</div>
 
-		<h3>.addVectors( [page:Vector4 a], [page:Vector4 b] ) [page:Vector4]</h3>
+		<h3>.addVectors( [page:Vector4 a], [page:Vector4 b] ) [page:Vector4 this]</h3>
 		<div>
 		Sets this vector to *a + b*.
 		</div>
@@ -65,23 +62,23 @@
 		Subtracts *v* from this vector.
 		</div>
 
-		<h3>.subVectors( [page:Vector4 a], [page:Vector4 b] ) [page:Vector4]</h3>
+		<h3>.subVectors( [page:Vector4 a], [page:Vector4 b] ) [page:Vector4 this]</h3>
 		<div>
 		Sets this vector to *a - b*.
 		</div>
 
-		<h3>.multiplyScalar( [page:Float s] ) [page:Vector4]</h3>
+		<h3>.multiplyScalar( [page:Float s] ) [page:Vector4 this]</h3>
 		<div>
 		Multiplies this vector by scalar *s*.
 		</div>
 
-		<h3>.divideScalar( [page:Float s] ) [page:Vector4]</h3>
+		<h3>.divideScalar( [page:Float s] ) [page:Vector4 this]</h3>
 		<div>
 		Divides this vector by scalar *s*.<br />
 		Set vector to *( 0, 0, 0 )* if *s == 0*.
 		</div>
 
-		<h3>.negate() [page:Vector4]</h3>
+		<h3>.negate() [page:Vector4 this]</h3>
 		<div>
 		Inverts this vector.
 		</div>
@@ -101,17 +98,17 @@
 		Computes length of this vector.
 		</div>
 
-		<h3>.normalize() [page:Vector4]</h3>
+		<h3>.normalize() [page:Vector4 this]</h3>
 		<div>
 		Normalizes this vector.
 		</div>
 
-		<h3>.setLength( [page:Float l] ) [page:Vector4]</h3>
+		<h3>.setLength( [page:Float l] ) [page:Vector4 this]</h3>
 		<div>
 		Normalizes this vector and multiplies it by *l*.
 		</div>
 
-		<h3>.lerp( [page:Vector4 v], [page:Float alpha] ) [page:Vector4]</h3>
+		<h3>.lerp( [page:Vector4 v], [page:Float alpha] ) [page:Vector4 this]</h3>
 		<div>
 		Linearly interpolate between this vector and *v* with *alpha* factor.
 		</div>
@@ -122,136 +119,150 @@
 		</div>
 
 
-		<h3>.clamp([page:todo min], [page:todo max]) [page:todo]</h3>
+		<h3>.clamp([page:Vector4 min], [page:Vector4 max]) [page:Vector4 this]</h3>
 		<div>
-		min -- todo <br />
-		max -- todo
+		min -- [page:Vector4] <br />
+		max -- [page:Vector4]
 		</div>
 		<div>
-		todo
-		</div>
+		If this vector's x, y, z, or w value is greater than the max vector's x, y, z, or w value, it is replaced by the corresponding value.<br/><br/>
 
-		<h3>.toArray() [page:todo]</h3>
-		<div>
-		todo
+		If this vector's x, y, z, or w value is less than the min vector's x, y, z, or w value, it is replace by the corresponding value.
 		</div>
 
-		<h3>.applyMatrix4([page:todo m]) [page:todo]</h3>
+		<h3>.applyMatrix4([page:Matrix4 m]) [page:Vector4 this]</h3>
 		<div>
-		m -- todo
+		m -- [page:Matrix4]
 		</div>
 		<div>
-		todo
+		Transforms the vector by the matrix.
 		</div>
 
-		<h3>.min([page:todo v]) [page:todo]</h3>
+		<h3>.min([page:Vector4 v]) [page:Vector4 this]</h3>
 		<div>
-		v -- todo
+		v -- [page:Vector4]
 		</div>
 		<div>
-		todo
+		If this vector's x, y, z, or w value is less than vector v's x, y, z, or w value, that value is replaced by the corresponding vector v value.
 		</div>
 
-		<h3>.max([page:todo v]) [page:todo]</h3>
+		<h3>.max([page:Vector4 v]) [page:Vector4 this]</h3>
 		<div>
-		v -- todo
+		v -- [page:Vector4]
 		</div>
 		<div>
-		todo
+		If this vector's x, y, z, or w value is greater than vector v's x, y, z, or w value, that value is replaced by the corresponding vector v value. 
 		</div>
 
-		<h3>.setAxisAngleFromRotationMatrix([page:todo m]) [page:todo]</h3>
+		<h3>.addScalar([page:Float s]) [page:Vector4 this]</h3>
 		<div>
-		m -- todo
+		s -- [page:Float]
 		</div>
 		<div>
-		todo
+		Adds a scalar value to all of the vector's components.
 		</div>
 
-		<h3>.addScalar([page:todo s]) [page:todo]</h3>
+		<h3>.equals([page:Vector4 v]) [page:Boolean]</h3>
 		<div>
-		s -- todo
+		v -- [page:Vector4]
 		</div>
 		<div>
-		todo
+		Checks to see if this vector matches vector v.
 		</div>
-
-		<h3>.equals([page:todo v]) [page:todo]</h3>
+		
+		<h3>.setAxisAngleFromRotationMatrix([page:Matrix4 m]) [page:Vector4 this]</h3>
 		<div>
-		v -- todo
+		m -- [page:Matrix4]
 		</div>
 		<div>
-		todo
+		Sets this Vector4 to the computed <a href='http://en.wikipedia.org/wiki/Axis%E2%80%93angle_representation' target='_blank'>axis-angle representation</a> of the rotation defined by Matrix4 m. Assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled).<br/><br/>
+
+		The axis is stored in components (x, y, z) of the vector, and the rotation in radians is stored in component w
 		</div>
 
-		<h3>.setAxisAngleFromQuaternion([page:todo q]) [page:todo]</h3>
+		<h3>.setAxisAngleFromQuaternion([page:Quaternion q]) [page:Vector4 this]</h3>
 		<div>
-		q -- todo
+		q -- [page:Quaternion]
 		</div>
 		<div>
-		todo
+		Sets this Vector4 to the computed <a href='http://en.wikipedia.org/wiki/Axis%E2%80%93angle_representation' target='_blank'>axis-angle representation</a> of the rotation defined by Quaternion q.<br/><br/>
+
+		The axis is stored in components (x, y, z) of the vector, and the rotation in radians is stored in component w
 		</div>
 
-		<h3>.setW([page:todo w]) [page:todo]</h3>
+		<h3>.getComponent([page:Integer index]) [page:Float]</h3>
 		<div>
-		w -- todo
+		index -- [page:Integer] 0, 1, 2, or 3
 		</div>
 		<div>
-		todo
+		Returns the value of the vector component x, y, or z by an index.<br/><br/>
+
+		Index 0: x<br/>
+		Index 1: y<br/>
+		Index 2: z<br/>
+		Index 3: w<br/>
+ 
 		</div>
 
-		<h3>.getComponent([page:todo index]) [page:todo]</h3>
+		<h3>.setComponent([page:Integer index], [page:Float value])</h3>
 		<div>
-		index -- todo
+		index -- [page:Integer] 0 - 3 <br />
+		value -- [page:Float]
 		</div>
 		<div>
 		todo
 		</div>
-
-		<h3>.fromArray([page:todo array]) [page:todo]</h3>
+		
+		<h3>.fromArray([page:Array array]) [page:Vector4 this]</h3>
 		<div>
-		array -- todo
+		array -- [page:Array] An array formatted [x, y, z, w]
 		</div>
 		<div>
-		todo
+		Sets the vector's components based on an array formatted like [x, y, z, w]
 		</div>
 
-		<h3>.lengthManhattan() [page:todo]</h3>
+		<h3>.toArray() [page:Array]</h3>
 		<div>
-		todo
+		Returns an array in the format [x, y, z, w]
 		</div>
 
-		<h3>.setComponent([page:todo index], [page:todo value]) [page:todo]</h3>
+		<h3>.lengthManhattan() [page:Float]</h3>
 		<div>
-		index -- todo <br />
-		value -- todo
+		Computes Manhattan length of this vector.<br />
+		[link:http://en.wikipedia.org/wiki/Taxicab_geometry]
 		</div>
+
+
+		<h3>.setX([page:Float x]) [page:Vector4 this]</h3>
 		<div>
-		todo
+		x -- [page:Float]
+		</div>
+		<div>
+		Sets the x component of the vector.
 		</div>
 
-		<h3>.setX([page:todo x]) [page:todo]</h3>
+		<h3>.setY([page:Float y]) [page:Vector4 this]</h3>
 		<div>
-		x -- todo
+		y -- [page:Float]
 		</div>
 		<div>
-		todo
+		Sets the y component of the vector.
 		</div>
 
-		<h3>.setY([page:todo y]) [page:todo]</h3>
+		<h3>.setZ([page:Float z]) [page:Vector4 this]</h3>
 		<div>
-		y -- todo
+		z -- [page:Float]
 		</div>
 		<div>
-		todo
+		Sets the z component of the vector.
 		</div>
 
-		<h3>.setZ([page:todo z]) [page:todo]</h3>
+		<h3>.setW([page:Float w]) [page:Vector4 this]</h3>
 		<div>
-		z -- todo
+		w -- [page:Float]
 		</div>
 		<div>
-		todo
+		Sets the w component of the vector.
 		</div>
 
 		<h2>Source</h2>

+ 100 - 222
examples/js/loaders/OBJLoader.js

@@ -45,9 +45,84 @@ THREE.OBJLoader.prototype = {
 			return new THREE.Face3( a, b, c, normals );
 
 		}
-
+		
 		var object = new THREE.Object3D();
 		var geometry, material, mesh;
+		var face_offset = 0;
+		
+		function add_face( a, b, c, normals_inds ) {
+
+			if ( normals_inds === undefined ) {
+
+				geometry.faces.push( face3(
+					parseInt( a ) - (face_offset + 1),
+					parseInt( b ) - (face_offset + 1),
+					parseInt( c ) - (face_offset + 1)
+				) );
+
+			} else {
+
+				geometry.faces.push( face3(
+					parseInt( a ) - (face_offset + 1),
+					parseInt( b ) - (face_offset + 1),
+					parseInt( c ) - (face_offset + 1),
+					[
+						normals[ parseInt( normals_inds[ 0 ] ) - 1 ].clone(),
+						normals[ parseInt( normals_inds[ 1 ] ) - 1 ].clone(),
+						normals[ parseInt( normals_inds[ 2 ] ) - 1 ].clone()
+					]
+				) );
+
+			}
+
+		}
+		
+		function add_uvs( a, b, c ) {
+      
+			geometry.faceVertexUvs[ 0 ].push( [
+				uvs[ parseInt( a ) - 1 ].clone(),
+				uvs[ parseInt( b ) - 1 ].clone(),
+				uvs[ parseInt( c ) - 1 ].clone()
+			] );
+
+		}
+		
+		function handle_face_line(faces, uvs, normals_inds) {
+
+			if ( faces[ 3 ] === undefined ) {
+				
+				add_face( faces[ 0 ], faces[ 1 ], faces[ 2 ], normals_inds );
+				
+				if (!(uvs === undefined) && uvs.length > 0) {
+
+					add_uvs( uvs[ 0 ], uvs[ 1 ], uvs[ 2 ] );
+
+				}
+
+			} else {
+				
+				if (!(normals_inds === undefined) && normals_inds.length > 0) {
+
+					add_face( faces[ 0 ], faces[ 1 ], faces[ 3 ], [ normals_inds[ 0 ], normals_inds[ 1 ], normals_inds[ 3 ] ]);
+					add_face( faces[ 1 ], faces[ 2 ], faces[ 3 ], [ normals_inds[ 1 ], normals_inds[ 2 ], normals_inds[ 3 ] ]);
+
+				} else {
+
+					add_face( faces[ 0 ], faces[ 1 ], faces[ 3 ]);
+					add_face( faces[ 1 ], faces[ 2 ], faces[ 3 ]);
+
+				}
+				
+				if (!(uvs === undefined) && uvs.length > 0) {
+
+					add_uvs( uvs[ 0 ], uvs[ 1 ], uvs[ 3 ] );
+					add_uvs( uvs[ 1 ], uvs[ 2 ], uvs[ 3 ] );
+
+				}
+
+			}
+			
+		}
 
 		// create mesh if no objects in text
 
@@ -112,7 +187,7 @@ THREE.OBJLoader.prototype = {
 
 				// ["v 1.0 2.0 3.0", "1.0", "2.0", "3.0"]
 
-				vertices.push( vector(
+				geometry.vertices.push( vector(
 					parseFloat( result[ 1 ] ),
 					parseFloat( result[ 2 ] ),
 					parseFloat( result[ 3 ] )
@@ -141,244 +216,47 @@ THREE.OBJLoader.prototype = {
 
 				// ["f 1 2 3", "1", "2", "3", undefined]
 
-				 if ( result[ 4 ] === undefined ) {
-
-					geometry.vertices.push(
-						vertices[ parseInt( result[ 1 ] ) - 1 ],
-						vertices[ parseInt( result[ 2 ] ) - 1 ],
-						vertices[ parseInt( result[ 3 ] ) - 1 ]
-					);
-
-					geometry.faces.push( face3(
-						verticesCount ++,
-						verticesCount ++,
-						verticesCount ++
-					) );
-
-				} else {
-
-					geometry.vertices.push(
-						vertices[ parseInt( result[ 1 ] ) - 1 ],
-						vertices[ parseInt( result[ 2 ] ) - 1 ],
-						vertices[ parseInt( result[ 3 ] ) - 1 ],
-						vertices[ parseInt( result[ 4 ] ) - 1 ]
-					);
-
-					geometry.faces.push( face3(
-						verticesCount,
-						verticesCount + 1,
-						verticesCount + 3
-					) );
-
-					geometry.faces.push( face3(
-						verticesCount + 1,
-						verticesCount + 2,
-						verticesCount + 3
-					) );
-
-					verticesCount += 4;
-
-				}
+				handle_face_line([ 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]
-
-				if ( result[ 10 ] === undefined ) {
-
-					geometry.vertices.push(
-						vertices[ parseInt( result[ 2 ] ) - 1 ],
-						vertices[ parseInt( result[ 5 ] ) - 1 ],
-						vertices[ parseInt( result[ 8 ] ) - 1 ]
-					);
-
-					geometry.faces.push( face3(
-						verticesCount ++,
-						verticesCount ++,
-						verticesCount ++
-					) );
-
-					geometry.faceVertexUvs[ 0 ].push( [
-						uvs[ parseInt( result[ 3 ] ) - 1 ],
-						uvs[ parseInt( result[ 6 ] ) - 1 ],
-						uvs[ parseInt( result[ 9 ] ) - 1 ]
-					] );
-
-				} else {
-
-					geometry.vertices.push(
-						vertices[ parseInt( result[ 2 ] ) - 1 ],
-						vertices[ parseInt( result[ 5 ] ) - 1 ],
-						vertices[ parseInt( result[ 8 ] ) - 1 ],
-						vertices[ parseInt( result[ 11 ] ) - 1 ]
-					);
-
-					geometry.faces.push( face3(
-						verticesCount,
-						verticesCount + 1,
-						verticesCount + 3
-					) );
-
-					geometry.faceVertexUvs[ 0 ].push( [
-						uvs[ parseInt( result[ 3 ] ) - 1 ],
-						uvs[ parseInt( result[ 6 ] ) - 1 ],
-						uvs[ parseInt( result[ 12 ] ) - 1 ]
-					] );
-
-					geometry.faces.push( face3(
-						verticesCount + 1,
-						verticesCount + 2,
-						verticesCount + 3
-					) );
-
-					geometry.faceVertexUvs[ 0 ].push( [
-						uvs[ parseInt( result[ 6 ] ) - 1 ],
-						uvs[ parseInt( result[ 9 ] ) - 1 ],
-						uvs[ parseInt( result[ 12 ] ) - 1 ]
-					] );
-
-					verticesCount += 4;
-
-				}
+				
+				handle_face_line(
+					[ result[ 2 ], result[ 5 ], result[ 8 ], result[ 11 ] ], //faces
+					[ result[ 3 ], result[ 6 ], result[ 9 ], result[ 12 ] ] //uv
+				);
 
 			} 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]
 
-				if ( result[ 13 ] === undefined ) {
-
-					geometry.vertices.push(
-						vertices[ parseInt( result[ 2 ] ) - 1 ],
-						vertices[ parseInt( result[ 6 ] ) - 1 ],
-						vertices[ parseInt( result[ 10 ] ) - 1 ]
-					);
-
-					geometry.faces.push( face3(
-						verticesCount ++,
-						verticesCount ++,
-						verticesCount ++,
-						[
-							normals[ parseInt( result[ 4 ] ) - 1 ],
-							normals[ parseInt( result[ 8 ] ) - 1 ],
-							normals[ parseInt( result[ 12 ] ) - 1 ]
-						]
-					) );
-
-					geometry.faceVertexUvs[ 0 ].push( [
-						uvs[ parseInt( result[ 3 ] ) - 1 ],
-						uvs[ parseInt( result[ 7 ] ) - 1 ],
-						uvs[ parseInt( result[ 11 ] ) - 1 ]
-					] );
-
-				} else {
-
-					geometry.vertices.push(
-						vertices[ parseInt( result[ 2 ] ) - 1 ],
-						vertices[ parseInt( result[ 6 ] ) - 1 ],
-						vertices[ parseInt( result[ 10 ] ) - 1 ],
-						vertices[ parseInt( result[ 14 ] ) - 1 ]
-					);
-
-					geometry.faces.push( face3(
-						verticesCount,
-						verticesCount + 1,
-						verticesCount + 3,
-						[
-							normals[ parseInt( result[ 4 ] ) - 1 ],
-							normals[ parseInt( result[ 8 ] ) - 1 ],
-							normals[ parseInt( result[ 16 ] ) - 1 ]
-						]
-					) );
-
-					geometry.faceVertexUvs[ 0 ].push( [
-						uvs[ parseInt( result[ 3 ] ) - 1 ],
-						uvs[ parseInt( result[ 7 ] ) - 1 ],
-						uvs[ parseInt( result[ 15 ] ) - 1 ]
-					] );
-
-					geometry.faces.push( face3(
-						verticesCount + 1,
-						verticesCount + 2,
-						verticesCount + 3,
-						[
-							normals[ parseInt( result[ 8 ] ) - 1 ],
-							normals[ parseInt( result[ 12 ] ) - 1 ],
-							normals[ parseInt( result[ 16 ] ) - 1 ]
-						]
-					) );
-
-					geometry.faceVertexUvs[ 0 ].push( [
-						uvs[ parseInt( result[ 7 ] ) - 1 ],
-						uvs[ parseInt( result[ 11 ] ) - 1 ],
-						uvs[ parseInt( result[ 15 ] ) - 1 ]
-					] );
-
-					verticesCount += 4;
-
-				}
+				handle_face_line(
+					[ result[ 2 ], result[ 6 ], result[ 10 ], result[ 14 ] ], //faces
+					[ result[ 3 ], result[ 7 ], result[ 11 ], result[ 15 ] ], //uv
+					[ result[ 4 ], result[ 8 ], result[ 12 ], result[ 16 ] ] //normal
+				);
 
 			} 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]
 
-				if ( result[ 10 ] === undefined ) {
-
-					geometry.vertices.push(
-						vertices[ parseInt( result[ 2 ] ) - 1 ],
-						vertices[ parseInt( result[ 5 ] ) - 1 ],
-						vertices[ parseInt( result[ 8 ] ) - 1 ]
-					);
-
-					geometry.faces.push( face3(
-						verticesCount ++,
-						verticesCount ++,
-						verticesCount ++,
-						[
-							normals[ parseInt( result[ 3 ] ) - 1 ],
-							normals[ parseInt( result[ 6 ] ) - 1 ],
-							normals[ parseInt( result[ 9 ] ) - 1 ]
-						]
-					) );
-
-				} else {
-
-					geometry.vertices.push(
-						vertices[ parseInt( result[ 2 ] ) - 1 ],
-						vertices[ parseInt( result[ 5 ] ) - 1 ],
-						vertices[ parseInt( result[ 8 ] ) - 1 ],
-						vertices[ parseInt( result[ 11 ] ) - 1 ]
-					);
-
-					geometry.faces.push( face3(
-						verticesCount,
-						verticesCount + 1,
-						verticesCount + 3,
-						[
-							normals[ parseInt( result[ 3 ] ) - 1 ],
-							normals[ parseInt( result[ 6 ] ) - 1 ],
-							normals[ parseInt( result[ 12 ] ) - 1 ]
-						]
-					) );
-
-					geometry.faces.push( face3(
-						verticesCount + 1,
-						verticesCount + 2,
-						verticesCount + 3,
-						[
-							normals[ parseInt( result[ 6 ] ) - 1 ],
-							normals[ parseInt( result[ 9 ] ) - 1 ],
-							normals[ parseInt( result[ 12 ] ) - 1 ]
-						]
-					) );
-
-					verticesCount += 4;
-
-				}
+				handle_face_line(
+					[ result[ 2 ], result[ 5 ], result[ 8 ], result[ 11 ] ], //faces
+					[ ], //uv
+					[ result[ 3 ], result[ 6 ], result[ 9 ], result[ 12 ] ] //normal
+				);
 
 			} else if ( /^o /.test( line ) ) {
 
 				// object
 
+				if (!(geometry === undefined)) {
+
+					face_offset = face_offset + geometry.vertices.length;
+
+				}
+				
 				geometry = new THREE.Geometry();
 				material = new THREE.MeshLambertMaterial();
 
@@ -423,7 +301,7 @@ THREE.OBJLoader.prototype = {
 			geometry.computeBoundingSphere();
 
 		}
-
+		
 		return object;
 
 	}

+ 100 - 223
examples/js/loaders/OBJMTLLoader.js

@@ -78,9 +78,13 @@ THREE.OBJMTLLoader.prototype = {
 
 		}
 
+		var face_offset = 0;
+
 		function meshN( meshName, materialName ) {
 
-			if ( geometry.vertices.length > 0 ) {
+			if ( vertices.length > 0 ) {
+
+				geometry.vertices = vertices;
 
 				geometry.mergeVertices();
 				geometry.computeCentroids();
@@ -91,12 +95,12 @@ THREE.OBJMTLLoader.prototype = {
 
 				geometry = new THREE.Geometry();
 				mesh = new THREE.Mesh( geometry, material );
-
 				verticesCount = 0;
 
 			}
 
 			if ( meshName !== undefined ) mesh.name = meshName;
+
 			if ( materialName !== undefined ) {
 
 				material = new THREE.MeshLambertMaterial();
@@ -120,6 +124,79 @@ THREE.OBJMTLLoader.prototype = {
 		var normals = [];
 		var uvs = [];
 
+		function add_face( a, b, c, normals_inds ) {
+
+			if ( normals_inds === undefined ) {
+
+				geometry.faces.push( face3(
+					parseInt( a ) - (face_offset + 1),
+					parseInt( b ) - (face_offset + 1),
+					parseInt( c ) - (face_offset + 1)
+				) );
+
+			} else {
+
+				geometry.faces.push( face3(
+					parseInt( a ) - (face_offset + 1),
+					parseInt( b ) - (face_offset + 1),
+					parseInt( c ) - (face_offset + 1),
+					[
+						normals[ parseInt( normals_inds[ 0 ] ) - 1 ].clone(),
+						normals[ parseInt( normals_inds[ 1 ] ) - 1 ].clone(),
+						normals[ parseInt( normals_inds[ 2 ] ) - 1 ].clone()
+					]
+				) );
+
+			}
+
+		}
+		
+		function add_uvs( a, b, c ) {
+
+			geometry.faceVertexUvs[ 0 ].push( [
+				uvs[ parseInt( a ) - 1 ].clone(),
+				uvs[ parseInt( b ) - 1 ].clone(),
+				uvs[ parseInt( c ) - 1 ].clone()
+			] );
+
+		}
+		
+		function handle_face_line(faces, uvs, normals_inds) {
+			
+			if ( faces[ 3 ] === undefined ) {
+				
+				add_face( faces[ 0 ], faces[ 1 ], faces[ 2 ], normals_inds );
+				
+				if (!(uvs === undefined) && uvs.length > 0) {
+					add_uvs( uvs[ 0 ], uvs[ 1 ], uvs[ 2 ] );
+				}
+
+			} else {
+				
+				if (!(normals_inds === undefined) && normals_inds.length > 0) {
+
+					add_face( faces[ 0 ], faces[ 1 ], faces[ 3 ], [ normals_inds[ 0 ], normals_inds[ 1 ], normals_inds[ 3 ] ]);
+					add_face( faces[ 1 ], faces[ 2 ], faces[ 3 ], [ normals_inds[ 1 ], normals_inds[ 2 ], normals_inds[ 3 ] ]);
+
+				} else {
+
+					add_face( faces[ 0 ], faces[ 1 ], faces[ 3 ]);
+					add_face( faces[ 1 ], faces[ 2 ], faces[ 3 ]);
+
+				}
+				
+				if (!(uvs === undefined) && uvs.length > 0) {
+
+					add_uvs( uvs[ 0 ], uvs[ 1 ], uvs[ 3 ] );
+					add_uvs( uvs[ 1 ], uvs[ 2 ], uvs[ 3 ] );
+
+				}
+
+			}
+			
+		}
+
+
 		// v float float float
 
 		var vertex_pattern = /v( +[\d|\.|\+|\-|e]+)( +[\d|\.|\+|\-|e]+)( +[\d|\.|\+|\-|e]+)/;
@@ -196,244 +273,44 @@ THREE.OBJMTLLoader.prototype = {
 
 				// ["f 1 2 3", "1", "2", "3", undefined]
 
-				 if ( result[ 4 ] === undefined ) {
-
-					geometry.vertices.push(
-						vertices[ parseInt( result[ 1 ] ) - 1 ],
-						vertices[ parseInt( result[ 2 ] ) - 1 ],
-						vertices[ parseInt( result[ 3 ] ) - 1 ]
-					);
-
-					geometry.faces.push( face3(
-						verticesCount ++,
-						verticesCount ++,
-						verticesCount ++
-					) );
-
-				} else {
-
-					geometry.vertices.push(
-						vertices[ parseInt( result[ 1 ] ) - 1 ],
-						vertices[ parseInt( result[ 2 ] ) - 1 ],
-						vertices[ parseInt( result[ 3 ] ) - 1 ],
-						vertices[ parseInt( result[ 4 ] ) - 1 ]
-					);
-
-					geometry.faces.push( face3(
-						verticesCount,
-						verticesCount + 1,
-						verticesCount + 3
-					) );
-
-					geometry.faces.push( face3(
-						verticesCount + 1,
-						verticesCount + 2,
-						verticesCount + 3
-					) );
-
-					verticesCount += 4;
-
-				}
+				handle_face_line([ 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]
-
-				if ( result[ 10 ] === undefined ) {
-
-					geometry.vertices.push(
-						vertices[ parseInt( result[ 2 ] ) - 1 ],
-						vertices[ parseInt( result[ 5 ] ) - 1 ],
-						vertices[ parseInt( result[ 8 ] ) - 1 ]
-					);
-
-					geometry.faces.push( face3(
-						verticesCount ++,
-						verticesCount ++,
-						verticesCount ++
-					) );
-
-					geometry.faceVertexUvs[ 0 ].push( [
-						uvs[ parseInt( result[ 3 ] ) - 1 ],
-						uvs[ parseInt( result[ 6 ] ) - 1 ],
-						uvs[ parseInt( result[ 9 ] ) - 1 ]
-					] );
-
-				} else {
-
-					geometry.vertices.push(
-						vertices[ parseInt( result[ 2 ] ) - 1 ],
-						vertices[ parseInt( result[ 5 ] ) - 1 ],
-						vertices[ parseInt( result[ 8 ] ) - 1 ],
-						vertices[ parseInt( result[ 11 ] ) - 1 ]
-					);
-
-					geometry.faces.push( face3(
-						verticesCount,
-						verticesCount + 1,
-						verticesCount + 3
-					) );
-
-					geometry.faceVertexUvs[ 0 ].push( [
-						uvs[ parseInt( result[ 3 ] ) - 1 ],
-						uvs[ parseInt( result[ 6 ] ) - 1 ],
-						uvs[ parseInt( result[ 12 ] ) - 1 ]
-					] );
-
-					geometry.faces.push( face3(
-						verticesCount + 1,
-						verticesCount + 2,
-						verticesCount + 3
-					) );
-
-					geometry.faceVertexUvs[ 0 ].push( [
-						uvs[ parseInt( result[ 6 ] ) - 1 ],
-						uvs[ parseInt( result[ 9 ] ) - 1 ],
-						uvs[ parseInt( result[ 12 ] ) - 1 ]
-					] );
-
-					verticesCount += 4;
-
-				}
+				
+				handle_face_line(
+					[ result[ 2 ], result[ 5 ], result[ 8 ], result[ 11 ] ], //faces
+					[ result[ 3 ], result[ 6 ], result[ 9 ], result[ 12 ] ] //uv
+				);
 
 			} 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]
 
-				if ( result[ 13 ] === undefined ) {
-
-					geometry.vertices.push(
-						vertices[ parseInt( result[ 2 ] ) - 1 ],
-						vertices[ parseInt( result[ 6 ] ) - 1 ],
-						vertices[ parseInt( result[ 10 ] ) - 1 ]
-					);
-
-					geometry.faces.push( face3(
-						verticesCount ++,
-						verticesCount ++,
-						verticesCount ++,
-						[
-							normals[ parseInt( result[ 4 ] ) - 1 ],
-							normals[ parseInt( result[ 8 ] ) - 1 ],
-							normals[ parseInt( result[ 12 ] ) - 1 ]
-						]
-					) );
-
-					geometry.faceVertexUvs[ 0 ].push( [
-						uvs[ parseInt( result[ 3 ] ) - 1 ],
-						uvs[ parseInt( result[ 7 ] ) - 1 ],
-						uvs[ parseInt( result[ 11 ] ) - 1 ]
-					] );
-
-				} else {
-
-					geometry.vertices.push(
-						vertices[ parseInt( result[ 2 ] ) - 1 ],
-						vertices[ parseInt( result[ 6 ] ) - 1 ],
-						vertices[ parseInt( result[ 10 ] ) - 1 ],
-						vertices[ parseInt( result[ 14 ] ) - 1 ]
-					);
-
-					geometry.faces.push( face3(
-						verticesCount,
-						verticesCount + 1,
-						verticesCount + 3,
-						[
-							normals[ parseInt( result[ 4 ] ) - 1 ],
-							normals[ parseInt( result[ 8 ] ) - 1 ],
-							normals[ parseInt( result[ 16 ] ) - 1 ]
-						]
-					) );
-
-					geometry.faceVertexUvs[ 0 ].push( [
-						uvs[ parseInt( result[ 3 ] ) - 1 ],
-						uvs[ parseInt( result[ 7 ] ) - 1 ],
-						uvs[ parseInt( result[ 15 ] ) - 1 ]
-					] );
-
-					geometry.faces.push( face3(
-						verticesCount + 1,
-						verticesCount + 2,
-						verticesCount + 3,
-						[
-							normals[ parseInt( result[ 8 ] ) - 1 ],
-							normals[ parseInt( result[ 12 ] ) - 1 ],
-							normals[ parseInt( result[ 16 ] ) - 1 ]
-						]
-					) );
-
-					geometry.faceVertexUvs[ 0 ].push( [
-						uvs[ parseInt( result[ 7 ] ) - 1 ],
-						uvs[ parseInt( result[ 11 ] ) - 1 ],
-						uvs[ parseInt( result[ 15 ] ) - 1 ]
-					] );
-
-					verticesCount += 4;
-
-				}
+				handle_face_line(
+					[ result[ 2 ], result[ 6 ], result[ 10 ], result[ 14 ] ], //faces
+					[ result[ 3 ], result[ 7 ], result[ 11 ], result[ 15 ] ], //uv
+					[ result[ 4 ], result[ 8 ], result[ 12 ], result[ 16 ] ] //normal
+				);
 
 			} 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]
 
-				if ( result[ 10 ] === undefined ) {
-
-					geometry.vertices.push(
-						vertices[ parseInt( result[ 2 ] ) - 1 ],
-						vertices[ parseInt( result[ 5 ] ) - 1 ],
-						vertices[ parseInt( result[ 8 ] ) - 1 ]
-					);
-
-					geometry.faces.push( face3(
-						verticesCount ++,
-						verticesCount ++,
-						verticesCount ++,
-						[
-							normals[ parseInt( result[ 3 ] ) - 1 ],
-							normals[ parseInt( result[ 6 ] ) - 1 ],
-							normals[ parseInt( result[ 9 ] ) - 1 ]
-						]
-					) );
-
-				} else {
-
-					geometry.vertices.push(
-						vertices[ parseInt( result[ 2 ] ) - 1 ],
-						vertices[ parseInt( result[ 5 ] ) - 1 ],
-						vertices[ parseInt( result[ 8 ] ) - 1 ],
-						vertices[ parseInt( result[ 11 ] ) - 1 ]
-					);
-
-					geometry.faces.push( face3(
-						verticesCount,
-						verticesCount + 1,
-						verticesCount + 3,
-						[
-							normals[ parseInt( result[ 3 ] ) - 1 ],
-							normals[ parseInt( result[ 6 ] ) - 1 ],
-							normals[ parseInt( result[ 12 ] ) - 1 ]
-						]
-					) );
-
-					geometry.faces.push( face3(
-						verticesCount + 1,
-						verticesCount + 2,
-						verticesCount + 3,
-						[
-							normals[ parseInt( result[ 6 ] ) - 1 ],
-							normals[ parseInt( result[ 9 ] ) - 1 ],
-							normals[ parseInt( result[ 12 ] ) - 1 ]
-						]
-					) );
-
-					verticesCount += 4;
-
-				}
+				handle_face_line(
+					[ result[ 2 ], result[ 5 ], result[ 8 ], result[ 11 ] ], //faces
+					[ ], //uv
+					[ result[ 3 ], result[ 6 ], result[ 9 ], result[ 12 ] ] //normal
+				);
 
 			} else if ( /^o /.test( line ) ) {
 
 				// object
-
+				
+				meshN();
+				face_offset = face_offset + vertices.length;
+				vertices = [];
 				object = new THREE.Object3D();
 				object.name = line.substring( 2 ).trim();
 				group.add( object );
@@ -476,7 +353,7 @@ THREE.OBJMTLLoader.prototype = {
 
 		//Add last object
 		meshN(undefined, undefined);
-
+		
 		return group;
 
 	}

+ 321 - 53
examples/js/loaders/PLYLoader.js

@@ -8,14 +8,14 @@
  * Limitations: ASCII decoding assumes file is UTF-8.
  *
  * Usage:
- * 	var loader = new THREE.PLYLoader();
- * 	loader.addEventListener( 'load', function ( event ) {
+ *	var loader = new THREE.PLYLoader();
+ *	loader.addEventListener( 'load', function ( event ) {
  *
- * 		var geometry = event.content;
- * 		scene.add( new THREE.Mesh( geometry ) );
+ *		var geometry = event.content;
+ *		scene.add( new THREE.Mesh( geometry ) );
  *
- * 	} );
- * 	loader.load( './models/ply/ascii/dolphins.ply' );
+ *	} );
+ *	loader.load( './models/ply/ascii/dolphins.ply' );
  */
 
 
@@ -70,10 +70,11 @@ THREE.PLYLoader.prototype = {
 
 	},
 
-	isASCII: function(buf){
+	isASCII: function( data ){
 
-		// currently only supports ASCII encoded files.
-		return true;
+		var header = this.parseHeader( this.bin2str( data ) );
+		
+		return header.format === "ascii";
 
 	},
 
@@ -93,6 +94,159 @@ THREE.PLYLoader.prototype = {
 
 	},
 
+	parseHeader: function ( data ) {
+		
+		var patternHeader = /ply([\s\S]*)end_header\n/;
+		var headerText = "";
+		if ( ( result = patternHeader.exec( data ) ) != null ) {
+			headerText = result [ 1 ];
+		}
+		
+		var header = new Object();
+		header.comments = [];
+		header.elements = [];
+		header.headerLength = result[0].length;
+		
+		var lines = headerText.split( '\n' );
+		var currentElement = undefined;
+		var lineType, lineValues;
+
+		function make_ply_element_property(propertValues) {
+			
+			var property = Object();
+
+			property.type = propertValues[0]
+			
+			if ( property.type === "list" ) {
+				
+				property.name = propertValues[3]
+				property.countType = propertValues[1]
+				property.itemType = propertValues[2]
+
+			} else {
+
+				property.name = propertValues[1]
+
+			}
+
+			return property
+			
+		}
+		
+		for ( var i = 0; i < lines.length; i ++ ) {
+
+			var line = lines[ i ];
+			line = line.trim()
+			if ( line === "" ) { continue; }
+			lineValues = line.split( /\s+/ );
+			lineType = lineValues.shift()
+			line = lineValues.join(" ")
+			
+			switch( lineType ) {
+				
+			case "format":
+
+				header.format = lineValues[0];
+				header.version = lineValues[1];
+
+				break;
+
+			case "comment":
+
+				header.comments.push(line);
+
+				break;
+
+			case "element":
+
+				if ( !(currentElement === undefined) ) {
+
+					header.elements.push(currentElement);
+
+				}
+
+				currentElement = Object();
+				currentElement.name = lineValues[0];
+				currentElement.count = parseInt( lineValues[1] );
+				currentElement.properties = [];
+
+				break;
+				
+			case "property":
+
+				currentElement.properties.push( make_ply_element_property( lineValues ) );
+
+				break;
+				
+
+			default:
+
+				console.log("unhandled", lineType, lineValues);
+
+			}
+
+		}
+		
+		if ( !(currentElement === undefined) ) {
+
+			header.elements.push(currentElement);
+
+		}
+		
+		return header;
+		
+	},
+
+	parseASCIINumber: function ( n, type ) {
+		
+		switch( type ) {
+			
+		case 'char': case 'uchar': case 'short': case 'ushort': case 'int': case 'uint':
+		case 'int8': case 'uint8': case 'int16': case 'uint16': case 'int32': case 'uint32':
+
+			return parseInt( n );
+
+		case 'float': case 'double': case 'float32': case 'float64':
+
+			return parseFloat( n );
+			
+		}
+		
+	},
+
+	parseASCIIElement: function ( properties, line ) {
+
+		values = line.split( /\s+/ );
+		
+		var element = Object();
+		
+		for ( var i = 0; i < properties.length; i ++ ) {
+			
+			if ( properties[i].type === "list" ) {
+				
+				var list = [];
+				var n = this.parseASCIINumber( values.shift(), properties[i].countType );
+
+				for ( j = 0; j < n; j ++ ) {
+					
+					list.push( this.parseASCIINumber( values.shift(), properties[i].itemType ) );
+					
+				}
+				
+				element[ properties[i].name ] = list;
+				
+			} else {
+				
+				element[ properties[i].name ] = this.parseASCIINumber( values.shift(), properties[i].type );
+				
+			}
+			
+		}
+		
+		return element;
+		
+	},
+
 	parseASCII: function ( data ) {
 
 		// PLY ascii format specification, as per http://en.wikipedia.org/wiki/PLY_(file_format)
@@ -101,73 +255,187 @@ THREE.PLYLoader.prototype = {
 
 		var result;
 
-		var patternHeader = /ply([\s\S]*)end_header/;
-		var header = "";
-		if ( ( result = patternHeader.exec( data ) ) != null ) {
-			header = result [ 1 ];
-		}
+		var header = this.parseHeader( data );
 
-		var patternBody = /end_header([\s\S]*)$/;
+		var patternBody = /end_header\n([\s\S]*)$/;
 		var body = "";
 		if ( ( result = patternBody.exec( data ) ) != null ) {
 			body = result [ 1 ];
 		}
+		
+		var lines = body.split( '\n' );
+		var currentElement = 0;
+		var currentElementCount = 0;
+		geometry.useColor = false;
+		
+		for ( var i = 0; i < lines.length; i ++ ) {
+
+			var line = lines[ i ];
+			line = line.trim()
+			if ( line === "" ) { continue; }
+			
+			if ( currentElementCount >= header.elements[currentElement].count ) {
+
+				currentElement++;
+				currentElementCount = 0;
 
-		var patternVertexCount = /element[\s]+vertex[\s]+(\d+)/g;
-		var vertexCount = 0;
-		if ( ( result = patternVertexCount.exec( header ) ) != null ) {
-			vertexCount = parseInt( result[ 1 ] );
+			}
+			
+			var element = this.parseASCIIElement( header.elements[currentElement].properties, line );
+			
+			this.handleElement( geometry, header.elements[currentElement].name, element );
+			
+			currentElementCount++;
+			
 		}
 
-		var patternFaceCount = /element[\s]+face[\s]+(\d+)/g;
-		var faceCount = 0;
-		if ( ( result = patternFaceCount.exec( header ) ) != null ) {
-			faceCount = parseInt( result[ 1 ] );
-		}
+		return this.postProcess( geometry );
 
-		if ( vertexCount != 0 && faceCount != 0 ) {
-			// Vertex
-			// assume x y z
-			var patternVertex = /([-+]?[0-9]+\.?[0-9]*([eE][-+]?[0-9]+)?)+[\s]+([-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)+[\s]+([-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)+/g;
-			for ( var i = 0; i < vertexCount; i++) {
-				if ( ( result = patternVertex.exec( body ) ) != null ) {
-					geometry.vertices.push( new THREE.Vector3( parseFloat( result[ 1 ] ), parseFloat( result[ 3 ] ), parseFloat( result[ 5 ] ) ) );
-				} else {
-					console.error('Vertex error: vertex count mismatch.');
-					return geometry;
-				}
-			}
+	},
 
-			// Face
-			// assume 3 index0 index1 index2
-			var patternFace = /3[\s]+([-+]?[0-9]+)[\s]+([-+]?[0-9]+)[\s]+([-+]?[0-9]+)/g;
-			for (var i = 0; i < faceCount; i++) {
-				if ( ( result = patternFace.exec( body ) ) != null ) {
-					geometry.faces.push( new THREE.Face3( parseInt( result[ 1 ] ), parseInt( result[ 2 ] ), parseInt( result[ 3 ] ) ) );
-				} else {
-					console.error('Face error: vertex count mismatch.');
-					return geometry;
-				}
+	postProcess: function ( geometry ) {
+		
+		if ( geometry.useColor ) {
+			
+			for ( var i = 0; i < geometry.faces.length; i ++ ) {
+				
+				geometry.faces[i].vertexColors = [
+					geometry.colors[geometry.faces[i].a],
+					geometry.colors[geometry.faces[i].b],
+					geometry.colors[geometry.faces[i].c]
+				];
+				
 			}
-
-		} else {
-			console.error( 'Header error: vertexCount(' + vertexCount + '), faceCount(' + faceCount + ').' );
+			
+			geometry.elementsNeedUpdate = true;
+			
 		}
 
 		geometry.computeCentroids();
 		geometry.computeBoundingSphere();
 
 		return geometry;
+		
+	},
+
+	handleElement: function ( geometry, elementName, element ) {
+		
+		if ( elementName === "vertex" ) {
+
+			geometry.vertices.push(
+				new THREE.Vector3( element.x, element.y, element.z )
+			);
+			
+			if ( 'red' in element && 'green' in element && 'blue' in element ) {
+				
+				geometry.useColor = true;
+				
+				color = new THREE.Color();
+				color.setRGB( element.red / 255.0, element.green / 255.0, element.blue / 255.0 );
+				geometry.colors.push( color );
+				
+			}
+
+		} else if ( elementName === "face" ) {
+
+			geometry.faces.push(
+				new THREE.Face3( element.vertex_indices[0], element.vertex_indices[1], element.vertex_indices[2] )
+			);
 
+		}
+		
 	},
 
-	parseBinary: function (buf) {
+	binaryRead: function ( dataview, at, type, little_endian ) {
 
-		// not supported yet
-		console.error('Not supported yet.');
+		switch( type ) {
 
-	}
+			// corespondences for non-specific length types here match rply:
+		case 'int8':		case 'char':	 return [ dataview.getInt8( at ), 1 ];
 
+		case 'uint8':		case 'uchar':	 return [ dataview.getUint8( at ), 1 ];
+
+		case 'int16':		case 'short':	 return [ dataview.getInt16( at, little_endian ), 2 ];
+
+		case 'uint16':	case 'ushort': return [ dataview.getUint16( at, little_endian ), 2 ];
+
+		case 'int32':		case 'int':		 return [ dataview.getInt32( at, little_endian ), 4 ];
+
+		case 'uint32':	case 'uint':	 return [ dataview.getUint32( at, little_endian ), 4 ];
+
+		case 'float32': case 'float':	 return [ dataview.getFloat32( at, little_endian ), 4 ];
+
+		case 'float64': case 'double': return [ dataview.getFloat64( at, little_endian ), 8 ];
+			
+		}
+		
+	},
+
+	binaryReadElement: function ( dataview, at, properties, little_endian ) {
+		
+		var element = Object();
+		var result, read = 0;
+		
+		for ( var i = 0; i < properties.length; i ++ ) {
+		 
+			if ( properties[i].type === "list" ) {
+				
+				var list = [];
+
+				result = this.binaryRead( dataview, at+read, properties[i].countType, little_endian );
+				var n = result[0];
+				read += result[1];
+				
+				for ( j = 0; j < n; j ++ ) {
+					
+					result = this.binaryRead( dataview, at+read, properties[i].itemType, little_endian );
+					list.push( result[0] );
+					read += result[1];
+					
+				}
+				
+				element[ properties[i].name ] = list;
+				
+			} else {
+				
+				result = this.binaryRead( dataview, at+read, properties[i].type, little_endian );
+				element[ properties[i].name ] = result[0];
+				read += result[1];
+				
+			}
+			
+		}
+		
+		return [ element, read ];
+		
+	},
+
+	parseBinary: function ( data ) {
+
+		var geometry = new THREE.Geometry();
+
+		var header = this.parseHeader( this.bin2str( data ) );
+		var little_endian = (header.format === "binary_little_endian");
+		var body = new DataView( data, header.headerLength );
+		var result, loc = 0;
+
+		for ( var currentElement = 0; currentElement < header.elements.length; currentElement ++ ) {
+			
+			for ( var currentElementCount = 0; currentElementCount < header.elements[currentElement].count; currentElementCount ++ ) {
+			
+				result = this.binaryReadElement( body, loc, header.elements[currentElement].properties, little_endian );
+				loc += result[1];
+				var element = result[0];
+			
+				this.handleElement( geometry, header.elements[currentElement].name, element );
+			
+			}
+			
+		}
+		
+		return this.postProcess( geometry );
+		
+	}
 
 };
 

+ 2558 - 0
examples/models/ply/ascii/dolphins_colored.ply

@@ -0,0 +1,2558 @@
+ply
+format ascii 1.0
+comment VCGLIB generated
+element vertex 855
+property float x
+property float y
+property float z
+property uchar red
+property uchar green
+property uchar blue
+property uchar alpha
+element face 1689
+property list uchar int vertex_indices
+end_header
+13.6601 0 548.364 255 0 0 255 
+-24.9399 0 513.564 255 0 0 255 
+-19.6099 -8.13 512.804 255 0 0 255 
+21.2801 -6.1 547.094 255 0 0 255 
+46.6801 0 564.364 255 0 0 255 
+49.9901 -3.56 561.324 255 0 0 255 
+78.1801 0 566.654 255 0 0 255 
+79.9601 -1.27 562.334 255 0 0 255 
+96.2101 0 561.824 255 0 0 255 
+88.8501 0 496.294 255 0 0 255 
+78.1801 0 521.184 255 0 0 255 
+78.6901 -9.91 503.154 255 0 0 255 
+39.0601 -11.68 511.024 255 0 0 255 
+54.0501 -6.1 532.364 255 0 0 255 
+64.7201 -3.56 544.044 255 0 0 255 
+-201.22 0 402.574 255 0 0 255 
+-196.14 -7.62 406.384 255 0 0 255 
+-190.81 0 414.254 255 0 0 255 
+-173.28 0 430.004 255 0 0 255 
+-177.09 -13.97 423.654 255 0 0 255 
+-113.59 0 472.924 255 0 0 255 
+-147.63 0 449.304 255 0 0 255 
+-152.45 -5.33 444.484 255 0 0 255 
+-114.61 -18.29 466.834 255 0 0 255 
+-151.44 -13.97 442.444 255 0 0 255 
+-70.9199 0 493.504 255 0 0 255 
+-71.6799 -22.35 488.164 255 0 0 255 
+-22.6599 -24.64 497.824 255 0 0 255 
+35.5101 -26.67 496.294 255 0 0 255 
+91.6401 -20.32 484.354 255 0 0 255 
+157.94 -11.68 448.294 255 0 0 255 
+159.21 0 452.354 255 0 0 255 
+199.85 0 417.304 255 0 0 255 
+192.23 -14.73 408.154 255 0 0 255 
+217.88 0 393.684 255 0 0 255 
+207.97 -11.94 381.234 255 0 0 255 
+230.33 0 369.804 255 0 0 255 
+220.93 -7.87 358.374 255 0 0 255 
+236.42 0 349.734 255 0 0 255 
+230.83 -9.65 342.374 255 0 0 255 
+232.61 0 330.944 255 0 0 255 
+228.55 -7.37 334.754 255 0 0 255 
+-153.98 -22.35 436.094 255 0 0 255 
+-137.72 -32.77 434.824 255 0 0 255 
+-108.26 -29.97 452.864 255 0 0 255 
+-71.1699 -32 469.374 255 0 0 255 
+-22.6599 -35.81 480.044 255 0 0 255 
+27.8901 -34.04 478.774 255 0 0 255 
+88.3401 -28.45 470.894 255 0 0 255 
+154.63 -18.29 441.434 255 0 0 255 
+-159.56 -31.75 423.394 255 0 0 255 
+-149.4 -36.58 421.874 255 0 0 255 
+-167.18 -27.43 416.284 255 0 0 255 
+-183.44 -20.83 399.264 255 0 0 255 
+-197.66 -10.16 385.044 255 0 0 255 
+-158.04 -30.99 416.284 255 0 0 255 
+-147.12 -35.81 411.964 255 0 0 255 
+-199.44 -13.97 377.424 255 0 0 255 
+-224.33 -7.37 346.944 255 0 0 255 
+-219.25 -7.37 344.654 255 0 0 255 
+-192.58 -14.99 367.774 255 0 0 255 
+-206.81 0 376.154 255 0 0 255 
+-230.43 0 344.654 255 0 0 255 
+-229.16 -4.06 343.134 255 0 0 255 
+-204.01 -5.08 378.444 255 0 0 255 
+-160.58 -30.73 410.444 255 0 0 255 
+-167.95 -30.48 402.574 255 0 0 255 
+-166.93 -30.73 399.774 255 0 0 255 
+-180.39 -26.42 395.204 255 0 0 255 
+-177.09 -25.91 389.874 255 0 0 255 
+-188.77 -16.26 363.964 255 0 0 255 
+-212.9 -8.38 343.644 255 0 0 255 
+-170.49 -25.91 378.944 255 0 0 255 
+-161.6 -34.54 394.184 255 0 0 255 
+-138.74 -34.8 386.314 255 0 0 255 
+-167.95 -27.43 373.364 255 0 0 255 
+-156.52 -34.8 399.524 255 0 0 255 
+-154.48 -34.54 408.664 255 0 0 255 
+-140.77 -38.61 397.994 255 0 0 255 
+-209.09 -10.92 340.844 255 0 0 255 
+-187.25 -18.29 358.884 255 0 0 255 
+-150.67 -31.75 381.234 255 0 0 255 
+-163.88 -17.02 351.774 255 0 0 255 
+-128.32 -22.35 361.164 255 0 0 255 
+-181.41 -10.16 351.004 255 0 0 255 
+-186.74 -17.27 355.324 255 0 0 255 
+-99.8699 -43.18 382.504 255 0 0 255 
+-98.0999 -35.05 372.594 255 0 0 255 
+-136.45 -40.39 399.014 255 0 0 255 
+-96.8299 -49.28 412.734 255 0 0 255 
+-131.37 -40.13 416.794 255 0 0 255 
+-130.35 -36.58 429.744 255 0 0 255 
+-100.13 -42.67 436.354 255 0 0 255 
+-68.6299 -46.23 446.004 255 0 0 255 
+-56.6899 -51.05 420.854 255 0 0 255 
+-18.0899 -48.01 448.294 255 0 0 255 
+-13.0099 -51.05 429.494 255 0 0 255 
+29.9201 -46.23 453.374 255 0 0 255 
+31.9501 -49.02 429.744 255 0 0 255 
+85.8001 -43.94 447.274 255 0 0 255 
+85.2901 -44.7 420.354 255 0 0 255 
+144.98 -33.02 422.384 255 0 0 255 
+134.82 -28.45 400.034 255 0 0 255 
+180.29 -23.37 397.494 255 0 0 255 
+165.56 -21.84 377.674 255 0 0 255 
+198.07 -13.97 373.364 255 0 0 255 
+187.4 -14.22 362.434 255 0 0 255 
+210.01 -9.91 356.854 255 0 0 255 
+199.34 -10.67 349.994 255 0 0 255 
+224.23 -18.29 338.564 255 0 0 255 
+-61.0099 -41.15 388.094 255 0 0 255 
+-11.4799 -37.59 395.454 255 0 0 255 
+26.3601 -38.1 397.494 255 0 0 255 
+74.6201 -30.99 394.954 255 0 0 255 
+124.41 -17.27 381.484 255 0 0 255 
+157.94 -9.65 361.424 255 0 0 255 
+178.76 -7.11 353.044 255 0 0 255 
+199.85 -5.59 336.024 255 0 0 255 
+209.24 -11.94 327.894 255 0 0 255 
+-71.6799 -73.66 357.354 255 0 0 255 
+-72.4399 -71.37 354.564 255 0 0 255 
+-49.5799 -64.52 368.534 255 0 0 255 
+-25.9599 -77.22 353.294 255 0 0 255 
+-40.1799 -80.77 350.504 255 0 0 255 
+-60.4999 -80.01 353.044 255 0 0 255 
+-15.0399 0 382.254 255 0 0 255 
+-58.4699 0 372.344 255 0 0 255 
+72.3401 0 384.024 255 0 0 255 
+127.71 0 377.174 255 0 0 255 
+175.21 0 350.504 255 0 0 255 
+199.59 0 333.994 255 0 0 255 
+-123.75 0 358.624 255 0 0 255 
+-88.9499 0 365.744 255 0 0 255 
+-156.01 0 348.974 255 0 0 255 
+-178.61 0 348.974 255 0 0 255 
+-206.55 -7.87 337.804 255 0 0 255 
+-203.51 0 336.534 255 0 0 255 
+-220.02 -4.57 330.684 255 0 0 255 
+-222.3 0 328.404 255 0 0 255 
+234.9 -63.25 286.494 255 0 0 255 
+221.44 -73.15 304.524 255 0 0 255 
+236.17 -86.61 277.854 255 0 0 255 
+228.04 -16.51 324.334 255 0 0 255 
+233.63 -9.65 310.114 255 0 0 255 
+232.1 0 318.244 255 0 0 255 
+238.2 -5.84 301.224 255 0 0 255 
+234.39 0 308.334 255 0 0 255 
+222.45 -24.13 336.024 255 0 0 255 
+-227.13 0 338.054 255 0 0 255 
+-226.62 -3.81 337.804 255 0 0 255 
+-224.84 -4.83 332.724 255 0 0 255 
+-226.62 0 331.954 255 0 0 255 
+-59.9999 -78.23 350.244 255 0 0 255 
+-39.9299 -79.25 349.234 255 0 0 255 
+87.5801 0 542.014 255 0 0 255 
+99.2601 0 553.704 255 0 0 255 
+28.1401 0 385.804 255 0 0 255 
+154.89 0 360.664 255 0 0 255 
+209.5 0 325.354 255 0 0 255 
+214.58 -52.32 317.734 255 0 0 255 
+219.66 -73.15 302.744 255 0 0 255 
+217.63 -52.32 320.784 255 0 0 255 
+236.42 -21.59 294.364 255 0 0 255 
+-150.93 0 447.274 255 0 0 255 
+21.2801 6.1 547.094 255 0 0 255 
+-19.6099 8.13 512.804 255 0 0 255 
+49.9901 3.56 561.324 255 0 0 255 
+79.9601 1.27 562.334 255 0 0 255 
+78.6901 9.91 503.154 255 0 0 255 
+54.0501 6.1 532.364 255 0 0 255 
+39.0601 11.68 511.024 255 0 0 255 
+64.7201 3.56 544.044 255 0 0 255 
+-196.14 7.62 406.384 255 0 0 255 
+-177.09 13.97 423.654 255 0 0 255 
+-152.45 5.33 444.484 255 0 0 255 
+-151.44 13.97 442.444 255 0 0 255 
+-114.61 18.29 466.834 255 0 0 255 
+-71.6799 22.35 488.164 255 0 0 255 
+-22.6599 24.64 497.824 255 0 0 255 
+35.5101 26.67 496.294 255 0 0 255 
+91.6401 20.32 484.354 255 0 0 255 
+157.94 11.68 448.294 255 0 0 255 
+192.23 14.73 408.154 255 0 0 255 
+207.97 11.94 381.234 255 0 0 255 
+220.93 7.87 358.374 255 0 0 255 
+230.83 9.65 342.374 255 0 0 255 
+228.55 7.37 334.754 255 0 0 255 
+-153.98 22.35 436.094 255 0 0 255 
+-137.72 32.77 434.824 255 0 0 255 
+-108.26 29.97 452.864 255 0 0 255 
+-71.1699 32 469.374 255 0 0 255 
+-22.6599 35.81 480.044 255 0 0 255 
+27.8901 34.04 478.774 255 0 0 255 
+88.3401 28.45 470.894 255 0 0 255 
+154.63 18.29 441.434 255 0 0 255 
+-149.4 36.58 421.874 255 0 0 255 
+-159.56 31.75 423.394 255 0 0 255 
+-167.18 27.43 416.284 255 0 0 255 
+-183.44 20.83 399.264 255 0 0 255 
+-197.66 10.16 385.044 255 0 0 255 
+-147.12 35.81 411.964 255 0 0 255 
+-158.04 30.99 416.284 255 0 0 255 
+-199.44 13.97 377.424 255 0 0 255 
+-219.25 7.37 344.654 255 0 0 255 
+-224.33 7.37 346.944 255 0 0 255 
+-192.58 14.99 367.774 255 0 0 255 
+-204.01 5.08 378.444 255 0 0 255 
+-229.16 4.06 343.134 255 0 0 255 
+-160.58 30.73 410.444 255 0 0 255 
+-166.93 30.73 399.774 255 0 0 255 
+-167.95 30.48 402.574 255 0 0 255 
+-180.39 26.42 395.204 255 0 0 255 
+-177.09 25.91 389.874 255 0 0 255 
+-188.77 16.26 363.964 255 0 0 255 
+-212.9 8.38 343.644 255 0 0 255 
+-170.49 25.91 378.944 255 0 0 255 
+-161.6 34.54 394.184 255 0 0 255 
+-138.74 34.8 386.314 255 0 0 255 
+-167.95 27.43 373.364 255 0 0 255 
+-156.52 34.8 399.524 255 0 0 255 
+-154.48 34.54 408.664 255 0 0 255 
+-140.77 38.61 397.994 255 0 0 255 
+-209.09 10.92 340.844 255 0 0 255 
+-187.25 18.29 358.884 255 0 0 255 
+-163.88 17.02 351.774 255 0 0 255 
+-150.67 31.75 381.234 255 0 0 255 
+-128.32 22.35 361.164 255 0 0 255 
+-181.41 10.16 351.004 255 0 0 255 
+-186.74 17.27 355.324 255 0 0 255 
+-99.8699 43.18 382.504 255 0 0 255 
+-98.0999 35.05 372.594 255 0 0 255 
+-136.45 40.39 399.014 255 0 0 255 
+-96.8299 49.28 412.734 255 0 0 255 
+-131.37 40.13 416.794 255 0 0 255 
+-130.35 36.58 429.744 255 0 0 255 
+-100.13 42.67 436.354 255 0 0 255 
+-68.6299 46.23 446.004 255 0 0 255 
+-56.6899 51.05 420.854 255 0 0 255 
+-18.0899 48.01 448.294 255 0 0 255 
+-13.0099 51.05 429.494 255 0 0 255 
+29.9201 46.23 453.374 255 0 0 255 
+31.9501 49.02 429.744 255 0 0 255 
+85.8001 43.94 447.274 255 0 0 255 
+85.2901 44.7 420.354 255 0 0 255 
+144.98 33.02 422.384 255 0 0 255 
+134.82 28.45 400.034 255 0 0 255 
+180.29 23.37 397.494 255 0 0 255 
+165.56 21.84 377.674 255 0 0 255 
+198.07 13.97 373.364 255 0 0 255 
+187.4 14.22 362.434 255 0 0 255 
+210.01 9.91 356.854 255 0 0 255 
+199.34 10.67 349.994 255 0 0 255 
+224.23 18.29 338.564 255 0 0 255 
+-61.0099 41.15 388.094 255 0 0 255 
+-11.4799 37.59 395.454 255 0 0 255 
+26.3601 38.1 397.494 255 0 0 255 
+74.6201 30.99 394.954 255 0 0 255 
+124.41 17.27 381.484 255 0 0 255 
+157.94 9.65 361.424 255 0 0 255 
+178.76 7.11 353.044 255 0 0 255 
+199.85 5.59 336.024 255 0 0 255 
+209.24 11.94 327.894 255 0 0 255 
+-71.6799 73.66 357.354 255 0 0 255 
+-72.4399 71.37 354.564 255 0 0 255 
+-49.5799 64.52 368.534 255 0 0 255 
+-25.9599 77.22 353.294 255 0 0 255 
+-60.4999 80.01 353.044 255 0 0 255 
+-40.1799 80.77 350.504 255 0 0 255 
+-206.55 7.87 337.804 255 0 0 255 
+-220.02 4.57 330.684 255 0 0 255 
+236.17 86.61 277.854 255 0 0 255 
+221.44 73.15 304.524 255 0 0 255 
+234.9 63.25 286.494 255 0 0 255 
+228.04 16.51 324.334 255 0 0 255 
+233.63 9.65 310.114 255 0 0 255 
+238.2 5.84 301.224 255 0 0 255 
+222.45 24.13 336.024 255 0 0 255 
+-226.62 3.81 337.804 255 0 0 255 
+-224.84 4.83 332.724 255 0 0 255 
+-39.9299 79.25 349.234 255 0 0 255 
+-59.9999 78.23 350.244 255 0 0 255 
+219.66 73.15 302.744 255 0 0 255 
+214.58 52.32 317.734 255 0 0 255 
+217.63 52.32 320.784 255 0 0 255 
+236.42 21.59 294.364 255 0 0 255 
+-226.812 0 232.62 0 255 40 255 
+-265.411 0 197.82 0 255 84 255 
+-260.082 -8.13 197.06 0 255 64 255 
+-219.191 -6.1 231.35 0 255 20 255 
+-193.792 0 248.62 0 255 10 255 
+-190.482 -3.56 245.58 2 255 0 255 
+-162.292 0 250.91 2 255 0 255 
+-160.512 -1.27 246.59 12 255 0 255 
+-144.262 0 246.08 12 255 0 255 
+-151.622 0 180.55 165 255 0 255 
+-162.292 0 205.44 107 255 0 255 
+-161.782 -9.91 187.41 138 255 0 255 
+-201.411 -11.68 195.28 56 255 0 255 
+-186.422 -6.1 216.62 53 255 0 255 
+-175.751 -3.56 228.3 50 255 0 255 
+-443.296 0 110.65 0 60 255 255 
+-437.918 -7.62 114.026 0 80 255 255 
+-431.955 0 121.428 0 86 255 255 
+-413.181 0 135.672 0 124 255 255 
+-417.503 -13.97 129.659 0 127 255 255 
+-350.141 0 173.502 0 255 252 255 
+-386.02 0 152.782 0 181 255 255 
+-391.223 -5.33 148.377 0 175 255 255 
+-351.662 -18.29 167.517 0 255 242 255 
+-390.385 -13.97 146.261 0 185 255 255 
+-305.914 0 190.478 0 255 164 255 
+-307.113 -22.35 185.219 0 255 151 255 
+-263.132 -24.64 182.08 0 255 57 255 
+-204.962 -26.67 180.55 62 255 0 255 
+-148.832 -20.32 168.61 184 255 0 255 
+-93.9607 -11.68 156.706 255 209 0 255 
+-94.249 0 160.947 255 217 0 255 
+-53.2208 0 148.077 255 131 0 255 
+-53.8795 -14.73 136.347 255 113 0 255 
+-28.599 0 139.466 255 84 0 255 
+-27.6869 -11.94 123.685 255 52 0 255 
+-5.11479 0 130.218 255 56 0 255 
+-3.27847 -7.87 115.57 255 24 0 255 
+13.5002 0 121.323 255 64 0 255 
+15.5502 -9.65 112.299 255 55 0 255 
+25.9516 0 106.637 255 88 0 255 
+20.0443 -7.37 105.697 255 71 0 255 
+-393.443 -22.35 140.143 0 184 255 255 
+-377.343 -32.77 137.531 0 223 255 255 
+-346.491 -29.97 153.069 0 255 224 255 
+-308.161 -32 166.451 0 255 145 255 
+-263.132 -35.81 164.3 0 255 48 255 
+-212.582 -34.04 163.03 57 255 0 255 
+-152.132 -28.45 155.15 186 255 0 255 
+-94.3022 -18.29 149.11 255 202 0 255 
+-400.055 -31.75 127.949 0 174 255 255 
+-390.056 -36.58 125.592 0 197 255 255 
+-408.238 -27.43 121.494 0 155 255 255 
+-425.851 -20.83 105.879 0 115 255 255 
+-441.2 -10.16 92.8853 0 76 255 255 
+-399.129 -30.99 120.737 0 176 255 255 
+-388.604 -35.81 115.528 0 202 255 255 
+-443.605 -13.97 85.4389 0 78 255 255 
+-470.933 -7.37 57.1247 0 20 255 255 
+-466.06 -7.37 54.4219 0 30 255 255 
+-437.567 -14.99 75.254 0 92 255 255 
+-451.055 0 84.7835 0 44 255 255 
+-477.202 0 55.3477 0 0 255 255 
+-476.062 -4.06 53.7277 0 7 255 255 
+-448.074 -5.08 86.8338 0 57 255 255 
+-402.144 -30.73 115.128 0 170 255 255 
+-410.14 -30.48 107.895 0 154 255 255 
+-409.356 -30.73 105.02 0 156 255 255 
+-423.148 -26.42 101.58 0 126 255 255 
+-420.301 -25.91 95.9954 0 131 255 255 
+-434.086 -16.26 71.1415 0 101 255 255 
+-459.816 -8.38 52.8895 0 43 255 255 
+-414.628 -25.91 84.5564 0 145 255 255 
+-404.507 -34.54 99.0079 0 168 255 255 
+-382.377 -34.8 89.2719 0 215 255 255 
+-412.559 -27.43 78.7852 0 151 255 255 
+-399.002 -34.8 103.909 0 180 255 255 
+-396.212 -34.54 112.849 0 186 255 255 
+-383.433 -38.61 101.08 0 214 255 255 
+-456.251 -10.92 49.7836 0 52 255 255 
+-432.992 -18.29 65.9531 0 105 255 255 
+-394.687 -31.75 85.1973 0 189 255 255 
+-410.291 -17.02 56.9323 0 154 254 254 
+-374.075 -22.35 63.3454 0 232 255 255 
+-427.824 -10.16 57.6166 0 115 255 255 
+-432.778 -17.27 62.3631 0 105 255 255 
+-343.956 -43.18 82.2562 0 255 209 255 
+-343.013 -35.05 72.2337 0 255 210 255 
+-379.043 -40.39 101.739 0 224 254 254 
+-338.423 -49.28 112.131 0 255 198 255 
+-372.508 -40.13 119.037 0 237 255 255 
+-370.419 -36.58 131.858 0 239 255 255 
+-339.756 -42.67 135.943 0 255 204 255 
+-307.565 -46.23 142.951 0 255 137 255 
+-297.749 -51.05 116.899 0 255 112 255 
+-258.562 -48.01 132.55 0 255 31 255 
+-253.482 -51.05 113.75 0 255 18 255 
+-210.551 -46.23 137.63 68 255 0 255 
+-208.521 -49.02 114 77 255 0 255 
+-154.672 -43.94 131.53 188 255 0 255 
+-155.182 -44.7 104.61 191 255 0 255 
+-95.8451 -33.02 127.853 255 194 0 255 
+-97.1407 -28.45 103.346 255 190 0 255 
+-57.3849 -23.37 121.064 255 109 0 255 
+-59.4882 -21.84 96.521 255 110 0 255 
+-30.0968 -13.97 111.396 255 44 0 255 
+-31.8031 -14.22 96.2092 255 52 0 255 
+-10.0972 -9.91 106.796 255 0 0 255 
+-13.6219 -10.67 94.4402 255 27 0 255 
+13.9583 -18.29 104.714 255 54 0 255 
+-304.767 -41.15 84.6091 0 255 126 255 
+-251.952 -37.59 79.7098 0 255 14 255 
+-214.112 -38.1 81.7498 66 255 0 255 
+-165.852 -30.99 79.2098 168 255 0 255 
+-100.528 -17.27 82.3284 255 201 0 255 
+-57.8264 -9.65 78.6461 255 119 0 255 
+-33.3411 -7.11 83.4557 255 72 0 255 
+-3.05347 -5.59 84.6762 255 55 0 255 
+10.9947 -11.94 86.1008 255 67 0 255 
+-317.945 -73.66 69.0449 0 255 207 255 
+-318.934 -71.37 67.2508 0 255 211 255 
+-294.996 -64.52 75.1924 0 255 183 255 
+-272.719 -77.22 63.8741 0 255 243 255 
+-287.121 -80.77 62.8159 0 255 242 255 
+-307.161 -80.01 65.598 0 255 227 255 
+-255.512 0 66.5098 0 255 27 255 
+-303.54 0 68.7029 0 255 128 255 
+-168.132 0 68.2798 157 255 0 255 
+-95.5019 0 79.4587 255 201 0 255 
+-34.955 0 79.2651 255 87 0 255 
+-1.74321 0 83.0497 255 68 0 255 
+-369.731 0 60.4357 0 239 254 254 
+-334.461 0 64.6495 0 255 194 255 
+-402.68 0 53.4902 0 167 255 255 
+-425.202 0 55.3617 0 120 255 255 
+-453.971 -7.87 46.5438 0 55 255 255 
+-451.047 0 45.0264 0 60 255 255 
+-467.984 -4.57 40.5636 0 23 255 255 
+-470.445 0 38.4802 0 17 255 255 
+67.3042 -63.25 84.656 255 215 0 255 
+40.4659 -73.15 81.6897 255 190 0 255 
+76.6564 -86.61 81.9515 246 255 0 255 
+28.2489 -16.51 98.899 254 87 0 254 
+44.5047 -9.65 95.526 255 124 0 255 
+36.3058 0 98.7424 255 112 0 255 
+55.7289 -5.84 94.9715 255 149 0 255 
+46.6273 0 95.235 255 134 0 255 
+14.6811 -24.13 101.688 255 61 0 255 
+-474.46 0 48.4971 0 3 255 255 
+-473.972 -3.81 48.2057 0 11 255 255 
+-472.619 -4.83 42.9957 0 14 255 255 
+-474.457 0 42.3758 0 6 255 255 
+-306.894 -78.23 63.7284 0 255 224 255 
+-286.977 -79.25 61.9666 0 255 239 255 
+-152.892 0 226.27 58 255 0 255 
+-141.212 0 237.96 23 255 0 255 
+-212.332 0 70.0598 64 255 0 255 
+-60.3815 0 76.4308 255 132 0 255 
+13.2402 0 84.6209 255 86 0 255 
+23.6031 -52.32 83.7838 255 135 0 255 
+40.6611 -73.15 79.116 255 192 0 255 
+23.4522 -52.32 88.1758 255 131 0 255 
+60.8854 -21.59 89.8955 255 164 0 255 
+-389.477 0 151.032 0 174 255 255 
+-219.191 6.1 231.35 0 255 22 255 
+-260.082 8.13 197.06 0 255 77 255 
+-190.482 3.56 245.58 0 255 8 255 
+-160.512 1.27 246.59 12 255 0 255 
+-161.782 9.91 187.41 133 255 0 255 
+-186.422 6.1 216.62 53 255 0 255 
+-201.411 11.68 195.28 47 255 0 255 
+-175.751 3.56 228.3 39 255 0 255 
+-437.918 7.62 114.026 0 60 255 255 
+-417.503 13.97 129.659 0 96 255 255 
+-391.223 5.33 148.377 0 163 255 255 
+-390.385 13.97 146.261 0 153 255 255 
+-351.662 18.29 167.517 0 240 255 255 
+-307.113 22.35 185.219 0 255 173 255 
+-263.132 24.64 182.08 0 255 79 255 
+-204.962 26.67 180.55 44 255 0 255 
+-148.832 20.32 168.61 167 255 0 255 
+-93.9607 11.68 156.706 255 223 0 255 
+-53.8795 14.73 136.347 255 147 0 255 
+-27.6869 11.94 123.685 255 107 0 255 
+-3.27847 7.87 115.57 255 87 0 255 
+15.5502 9.65 112.299 255 92 0 255 
+20.0443 7.37 105.697 255 98 0 255 
+-393.443 22.35 140.143 0 149 255 255 
+-377.343 32.77 137.531 0 186 255 255 
+-346.491 29.97 153.069 0 250 255 255 
+-308.161 32 166.451 0 255 175 255 
+-263.132 35.81 164.3 0 255 79 255 
+-212.582 34.04 163.03 28 255 0 255 
+-152.132 28.45 155.15 157 255 0 255 
+-94.3022 18.29 149.11 255 227 0 255 
+-390.056 36.58 125.592 0 163 255 255 
+-400.055 31.75 127.949 0 140 255 255 
+-408.238 27.43 121.494 0 123 255 255 
+-425.851 20.83 105.879 0 89 255 255 
+-441.2 10.16 92.8853 0 58 255 255 
+-388.604 35.81 115.528 0 170 254 254 
+-399.129 30.99 120.737 0 144 255 255 
+-443.605 13.97 85.4389 0 64 255 255 
+-466.06 7.37 54.4219 0 25 255 255 
+-470.933 7.37 57.1247 0 14 255 255 
+-437.567 14.99 75.254 0 81 255 255 
+-448.074 5.08 86.8338 0 42 255 255 
+-476.062 4.06 53.7277 0 3 255 255 
+-402.144 30.73 115.128 0 140 255 255 
+-409.356 30.73 105.02 0 131 254 254 
+-410.14 30.48 107.895 0 127 255 255 
+-423.148 26.42 101.58 0 102 255 255 
+-420.301 25.91 95.9954 0 111 255 255 
+-434.086 16.26 71.1415 0 91 255 255 
+-459.816 8.38 52.8895 0 39 255 255 
+-414.628 25.91 84.5564 0 128 255 255 
+-404.507 34.54 99.0079 0 145 255 255 
+-382.377 34.8 89.2719 0 195 255 255 
+-412.559 27.43 78.7852 0 137 255 255 
+-399.002 34.8 103.909 0 154 255 255 
+-396.212 34.54 112.849 0 156 255 255 
+-383.433 38.61 101.08 0 189 255 255 
+-456.251 10.92 49.7836 0 49 255 255 
+-432.992 18.29 65.9531 0 98 255 255 
+-410.291 17.02 56.9323 0 149 255 255 
+-394.687 31.75 85.1973 0 172 254 254 
+-374.075 22.35 63.3454 0 224 255 255 
+-427.824 10.16 57.6166 0 112 255 255 
+-432.778 17.27 62.3631 0 100 255 255 
+-343.956 43.18 82.2562 0 255 230 255 
+-343.013 35.05 72.2337 0 255 224 255 
+-379.043 40.39 101.739 0 198 255 255 
+-338.423 49.28 112.131 0 255 230 255 
+-372.508 40.13 119.037 0 203 255 255 
+-370.419 36.58 131.858 0 201 255 255 
+-339.756 42.67 135.943 0 255 243 255 
+-307.565 46.23 142.951 0 255 176 255 
+-297.749 51.05 116.899 0 255 150 255 
+-258.562 48.01 132.55 0 255 75 255 
+-253.482 51.05 113.75 0 255 58 255 
+-210.551 46.23 137.63 25 255 0 255 
+-208.521 49.02 114 32 255 0 255 
+-154.672 43.94 131.53 140 255 0 255 
+-155.182 44.7 104.61 145 254 0 254 
+-95.8451 33.02 127.853 255 246 0 255 
+-97.1407 28.45 103.346 255 245 0 255 
+-57.3849 23.37 121.064 255 171 0 255 
+-59.4882 21.84 96.521 255 168 0 255 
+-30.0968 13.97 111.396 255 128 0 255 
+-31.8031 14.22 96.2092 255 123 0 255 
+-10.0972 9.91 106.796 255 110 0 255 
+-13.6219 10.67 94.4402 255 105 0 255 
+13.9583 18.29 104.714 255 115 0 255 
+-304.767 41.15 84.6091 0 255 146 255 
+-251.952 37.59 79.7098 0 255 34 255 
+-214.112 38.1 81.7498 42 255 0 255 
+-165.852 30.99 79.2098 145 255 0 255 
+-100.528 17.27 82.3284 255 226 0 255 
+-57.8264 9.65 78.6461 255 139 0 255 
+-33.3411 7.11 83.4557 255 99 0 255 
+-3.05347 5.59 84.6762 254 80 0 254 
+10.9947 11.94 86.1008 255 104 0 255 
+-317.945 73.66 69.0449 0 255 233 255 
+-318.934 71.37 67.2508 0 255 226 255 
+-294.996 64.52 75.1924 0 255 204 255 
+-272.719 77.22 63.8741 0 246 255 255 
+-307.161 80.01 65.598 0 255 252 255 
+-287.121 80.77 62.8159 0 245 255 255 
+-453.971 7.87 46.5438 0 54 255 255 
+-467.984 4.57 40.5636 0 22 255 255 
+76.6564 86.61 81.9515 197 255 0 255 
+40.4659 73.15 81.6897 255 249 0 255 
+67.3042 63.25 84.656 249 255 0 255 
+28.2489 16.51 98.899 255 127 0 255 
+44.5047 9.65 95.526 255 140 0 255 
+55.7289 5.84 94.9715 255 157 0 255 
+14.6811 24.13 101.688 255 129 0 255 
+-473.972 3.81 48.2057 0 8 255 255 
+-472.619 4.83 42.9957 0 12 255 255 
+-286.977 79.25 61.9666 0 248 255 255 
+-306.894 78.23 63.7284 0 255 247 255 
+40.6611 73.15 79.116 255 249 0 255 
+23.6031 52.32 83.7838 255 193 0 255 
+23.4522 52.32 88.1758 255 192 0 255 
+60.8854 21.59 89.8955 255 186 0 255 
+60.3909 0 -14.267 255 0 0 255 
+21.7909 0 -49.0671 255 0 0 255 
+27.1209 -8.13 -49.827 255 0 0 255 
+68.0109 -6.1 -15.5371 255 0 0 255 
+93.4109 0 1.73289 255 0 0 255 
+96.7209 -3.56 -1.30702 255 0 0 255 
+124.911 0 4.02293 255 0 0 255 
+126.691 -1.27 -0.297073 255 0 0 255 
+142.941 0 -0.807022 255 0 0 255 
+135.581 0 -66.3371 255 0 0 255 
+124.911 0 -41.447 255 0 0 255 
+125.421 -9.91 -59.4771 255 0 0 255 
+85.7909 -11.68 -51.6071 255 0 0 255 
+100.781 -6.1 -30.267 255 0 0 255 
+111.451 -3.56 -18.5871 255 0 0 255 
+-155.829 0 -105.688 255 0 0 255 
+-149.806 -7.62 -103.701 255 0 0 255 
+-142.33 0 -97.8861 255 0 0 255 
+-121.27 0 -88.0264 255 0 0 255 
+-126.647 -13.97 -93.0152 255 0 0 255 
+-55.682 0 -61.1221 255 0 0 255 
+-92.3232 0 -76.2877 255 0 0 255 
+-98 -5.33 -79.7238 255 0 0 255 
+-57.8645 -18.29 -66.8608 255 0 0 255 
+-97.5808 -13.97 -81.9538 255 0 0 255 
+-13.146 0 -48.7491 255 0 0 255 
+-14.648 -22.35 -53.8977 255 0 0 255 
+24.0709 -24.64 -64.8071 255 0 0 255 
+82.2409 -26.67 -66.3371 255 0 0 255 
+138.371 -20.32 -78.2771 255 0 0 255 
+186.158 -11.68 -81.2166 255 0 0 255 
+185.2 0 -77.0929 255 0 0 255 
+220.899 0 -79.2334 255 0 0 255 
+224.718 -14.73 -90.2981 255 0 0 255 
+243.424 0 -77.0948 255 0 0 255 
+251.86 -11.94 -90.2856 255 0 0 255 
+265.535 0 -72.7003 255 0 0 255 
+275.528 -7.87 -83.2222 255 0 0 255 
+283.87 0 -68.0132 255 0 0 255 
+291.213 -9.65 -73.1992 255 0 0 255 
+302.109 0 -69.5868 255 0 0 255 
+298.799 -7.37 -74.661 255 0 0 255 
+-101.583 -22.35 -87.4271 255 0 0 255 
+-86.6068 -32.77 -92.7643 255 0 0 255 
+-54.8287 -29.97 -81.8477 255 0 0 255 
+-17.0994 -32 -72.5196 255 0 0 255 
+24.0709 -35.81 -82.5871 255 0 0 255 
+74.6209 -34.04 -83.8571 255 0 0 255 
+135.071 -28.45 -91.7371 255 0 0 255 
+187.212 -18.29 -88.7372 255 0 0 255 
+-110.201 -31.75 -98.1805 255 0 0 255 
+-100.949 -36.58 -102.346 255 0 0 255 
+-119.391 -27.43 -102.907 255 0 0 255 
+-139.916 -20.83 -114.412 255 0 0 255 
+-158.108 -10.16 -123.431 255 0 0 255 
+-110.68 -30.99 -105.435 255 0 0 255 
+-101.342 -35.81 -112.507 255 0 0 255 
+-162.339 -13.97 -130.052 255 0 0 255 
+-197.49 -7.37 -149.936 255 0 0 255 
+-193.283 -7.37 -153.939 255 0 0 255 
+-158.784 -14.99 -141.428 255 0 0 255 
+-169.935 0 -128.784 255 0 0 255 
+-204.388 0 -149.785 255 0 0 255 
+-203.703 -4.06 -151.676 255 0 0 255 
+-166.443 -5.08 -127.569 255 0 0 255 
+-114.712 -30.73 -110.356 255 0 0 255 
+-124.024 -30.48 -115.833 255 0 0 255 
+-123.842 -30.73 -118.808 255 0 0 255 
+-138.214 -26.42 -119.208 255 0 0 255 
+-136.626 -25.91 -125.288 255 0 0 255 
+-156.248 -16.26 -146.274 255 0 0 255 
+-187.302 -8.38 -157.182 255 0 0 255 
+-133.434 -25.91 -137.698 255 0 0 255 
+-120.252 -34.54 -125.685 255 0 0 255 
+-99.8194 -34.8 -139.458 255 0 0 255 
+-132.58 -27.43 -143.784 255 0 0 255 
+-113.8 -34.8 -121.973 255 0 0 255 
+-109.325 -34.54 -113.734 255 0 0 255 
+-98.7887 -38.61 -127.648 255 0 0 255 
+-184.476 -10.92 -161.164 255 0 0 255 
+-156.383 -18.29 -151.579 255 0 0 255 
+-113.087 -31.75 -141.172 255 0 0 255 
+-134.962 -17.02 -165.628 255 0 0 255 
+-95.8002 -22.35 -166.454 255 0 0 255 
+-153.051 -10.16 -160.931 255 0 0 255 
+-157.031 -17.27 -155.117 255 0 0 255 
+-61.5124 -43.18 -152.391 255 0 0 255 
+-61.8778 -35.05 -162.451 255 0 0 255 
+-94.2744 -40.39 -127.765 255 0 0 255 
+-52.0421 -49.28 -123.469 255 0 0 255 
+-84.9024 -40.13 -111.795 255 0 0 255 
+-80.8243 -36.58 -99.4687 255 0 0 255 
+-50.4567 -42.67 -99.6724 255 0 0 255 
+-18.4438 -46.23 -95.9878 255 0 0 255 
+-10.8055 -51.05 -122.734 255 0 0 255 
+28.6409 -48.01 -114.337 255 0 0 255 
+33.7209 -51.05 -133.137 255 0 0 255 
+76.6509 -46.23 -109.257 255 0 0 255 
+78.6809 -49.02 -132.887 255 0 0 255 
+132.531 -43.94 -115.357 255 0 0 255 
+132.021 -44.7 -142.277 255 0 0 255 
+189.676 -33.02 -109.892 255 0 0 255 
+192.987 -28.45 -134.216 255 0 0 255 
+227.424 -23.37 -105.712 255 0 0 255 
+234.832 -21.84 -129.226 255 0 0 255 
+256.038 -13.97 -102.08 255 0 0 255 
+262.305 -14.22 -116.033 255 0 0 255 
+275.432 -9.91 -94.4293 255 0 0 255 
+279.807 -10.67 -106.572 255 0 0 255 
+295.199 -18.29 -79.8126 255 0 0 255 
+-20.5883 -41.15 -154.358 255 0 0 255 
+35.2509 -37.59 -167.177 255 0 0 255 
+73.0909 -38.1 -165.137 255 0 0 255 
+121.351 -30.99 -167.677 255 0 0 255 
+193.14 -17.27 -155.554 255 0 0 255 
+243.877 -9.65 -144.922 255 0 0 255 
+267.513 -7.11 -127.824 255 0 0 255 
+295.087 -5.59 -106.996 255 0 0 255 
+305.738 -11.94 -95.4139 255 0 0 255 
+-35.8993 -73.66 -157.12 255 0 0 255 
+-37.1344 -71.37 -158.801 255 0 0 255 
+-11.1361 -64.52 -153.047 255 0 0 255 
+11.7804 -77.22 -165.713 255 0 0 255 
+-3.68383 -80.77 -165.948 255 0 0 255 
+-24.8163 -80.01 -161.601 255 0 0 255 
+31.6909 0 -180.377 255 0 0 255 
+-20.6941 0 -170.311 255 0 0 255 
+119.071 0 -178.607 255 0 0 255 
+199.757 0 -157.293 255 0 0 255 
+268.094 0 -132.355 255 0 0 255 
+297.281 0 -107.278 255 0 0 255 
+-91.7303 0 -170.067 255 0 0 255 
+-53.8658 0 -171.081 255 0 0 255 
+-127.72 0 -170.631 255 0 0 255 
+-150.86 0 -163.751 255 0 0 255 
+-182.992 -7.87 -164.915 255 0 0 255 
+-180.358 0 -167.178 255 0 0 255 
+-199.213 -4.57 -166.68 255 0 0 255 
+-202.374 0 -167.949 255 0 0 255 
+342.92 -63.25 -47.1378 255 0 0 255 
+330.172 -73.15 -73.6594 255 0 0 255 
+349.473 -86.61 -39.3583 255 0 0 255 
+309.174 -16.51 -73.0276 255 0 0 255 
+321.927 -9.65 -61.7793 255 0 0 255 
+314.496 0 -66.6421 255 0 0 255 
+328.67 -5.84 -52.3222 255 0 0 255 
+323.395 0 -60.1321 255 0 0 255 
+297.777 -24.13 -81.4629 255 0 0 255 
+-203.597 0 -157.16 255 0 0 255 
+-203.182 -3.81 -157.585 255 0 0 255 
+-203.311 -4.83 -162.977 255 0 0 255 
+-205.392 0 -163.02 255 0 0 255 
+-24.7063 -78.23 -163.487 255 0 0 255 
+-3.58835 -79.25 -166.805 255 0 0 255 
+134.311 0 -20.6171 255 0 0 255 
+145.991 0 -8.92708 255 0 0 255 
+74.8709 0 -176.827 255 0 0 255 
+241.924 0 -148.121 255 0 0 255 
+308.539 0 -94.71 255 0 0 255 
+316.986 -52.32 -86.8887 255 0 0 255 
+332.318 -73.15 -75.031 255 0 0 255 
+313.656 -52.32 -84.0655 255 0 0 255 
+335.432 -21.59 -50.4412 255 0 0 255 
+-95.8842 0 -77.4169 255 0 0 255 
+68.0109 6.1 -15.5371 255 0 0 255 
+27.1209 8.13 -49.827 255 0 0 255 
+96.7209 3.56 -1.30702 255 0 0 255 
+126.691 1.27 -0.297073 255 0 0 255 
+125.421 9.91 -59.4771 255 0 0 255 
+100.781 6.1 -30.267 255 0 0 255 
+85.7909 11.68 -51.6071 255 0 0 255 
+111.451 3.56 -18.5871 255 0 0 255 
+-149.806 7.62 -103.701 255 0 0 255 
+-126.647 13.97 -93.0152 255 0 0 255 
+-98 5.33 -79.7238 255 0 0 255 
+-97.5808 13.97 -81.9538 255 0 0 255 
+-57.8645 18.29 -66.8608 255 0 0 255 
+-14.648 22.35 -53.8977 255 0 0 255 
+24.0709 24.64 -64.8071 255 0 0 255 
+82.2409 26.67 -66.3371 255 0 0 255 
+138.371 20.32 -78.2771 255 0 0 255 
+186.158 11.68 -81.2166 255 0 0 255 
+224.718 14.73 -90.2981 255 0 0 255 
+251.86 11.94 -90.2856 255 0 0 255 
+275.528 7.87 -83.2222 255 0 0 255 
+291.213 9.65 -73.1992 255 0 0 255 
+298.799 7.37 -74.661 255 0 0 255 
+-101.583 22.35 -87.4271 255 0 0 255 
+-86.6068 32.77 -92.7643 255 0 0 255 
+-54.8287 29.97 -81.8477 255 0 0 255 
+-17.0994 32 -72.5196 255 0 0 255 
+24.0709 35.81 -82.5871 255 0 0 255 
+74.6209 34.04 -83.8571 255 0 0 255 
+135.071 28.45 -91.7371 255 0 0 255 
+187.212 18.29 -88.7372 255 0 0 255 
+-100.949 36.58 -102.346 255 0 0 255 
+-110.201 31.75 -98.1805 255 0 0 255 
+-119.391 27.43 -102.907 255 0 0 255 
+-139.916 20.83 -114.412 255 0 0 255 
+-158.108 10.16 -123.431 255 0 0 255 
+-101.342 35.81 -112.507 255 0 0 255 
+-110.68 30.99 -105.435 255 0 0 255 
+-162.339 13.97 -130.052 255 0 0 255 
+-193.283 7.37 -153.939 255 0 0 255 
+-197.49 7.37 -149.936 255 0 0 255 
+-158.784 14.99 -141.428 255 0 0 255 
+-166.443 5.08 -127.569 255 0 0 255 
+-203.703 4.06 -151.676 255 0 0 255 
+-114.712 30.73 -110.356 255 0 0 255 
+-123.842 30.73 -118.808 255 0 0 255 
+-124.024 30.48 -115.833 255 0 0 255 
+-138.214 26.42 -119.208 255 0 0 255 
+-136.626 25.91 -125.288 255 0 0 255 
+-156.248 16.26 -146.274 255 0 0 255 
+-187.302 8.38 -157.182 255 0 0 255 
+-133.434 25.91 -137.698 255 0 0 255 
+-120.252 34.54 -125.685 255 0 0 255 
+-99.8194 34.8 -139.458 255 0 0 255 
+-132.58 27.43 -143.784 255 0 0 255 
+-113.8 34.8 -121.973 255 0 0 255 
+-109.325 34.54 -113.734 255 0 0 255 
+-98.7887 38.61 -127.648 255 0 0 255 
+-184.476 10.92 -161.164 255 0 0 255 
+-156.383 18.29 -151.579 255 0 0 255 
+-134.962 17.02 -165.628 255 0 0 255 
+-113.087 31.75 -141.172 255 0 0 255 
+-95.8002 22.35 -166.454 255 0 0 255 
+-153.051 10.16 -160.931 255 0 0 255 
+-157.031 17.27 -155.117 255 0 0 255 
+-61.5124 43.18 -152.391 255 0 0 255 
+-61.8778 35.05 -162.451 255 0 0 255 
+-94.2744 40.39 -127.765 255 0 0 255 
+-52.0421 49.28 -123.469 255 0 0 255 
+-84.9024 40.13 -111.795 255 0 0 255 
+-80.8243 36.58 -99.4687 255 0 0 255 
+-50.4567 42.67 -99.6724 255 0 0 255 
+-18.4438 46.23 -95.9878 255 0 0 255 
+-10.8055 51.05 -122.734 255 0 0 255 
+28.6409 48.01 -114.337 255 0 0 255 
+33.7209 51.05 -133.137 255 0 0 255 
+76.6509 46.23 -109.257 255 0 0 255 
+78.6809 49.02 -132.887 255 0 0 255 
+132.531 43.94 -115.357 255 0 0 255 
+132.021 44.7 -142.277 255 0 0 255 
+189.676 33.02 -109.892 255 0 0 255 
+192.987 28.45 -134.216 255 0 0 255 
+227.424 23.37 -105.712 255 0 0 255 
+234.832 21.84 -129.226 255 0 0 255 
+256.038 13.97 -102.08 255 0 0 255 
+262.305 14.22 -116.033 255 0 0 255 
+275.432 9.91 -94.4293 255 0 0 255 
+279.807 10.67 -106.572 255 0 0 255 
+295.199 18.29 -79.8126 255 0 0 255 
+-20.5883 41.15 -154.358 255 0 0 255 
+35.2509 37.59 -167.177 255 0 0 255 
+73.0909 38.1 -165.137 255 0 0 255 
+121.351 30.99 -167.677 255 0 0 255 
+193.14 17.27 -155.554 255 0 0 255 
+243.877 9.65 -144.922 255 0 0 255 
+267.513 7.11 -127.824 255 0 0 255 
+295.087 5.59 -106.996 255 0 0 255 
+305.738 11.94 -95.4139 255 0 0 255 
+-35.8993 73.66 -157.12 255 0 0 255 
+-37.1344 71.37 -158.801 255 0 0 255 
+-11.1361 64.52 -153.047 255 0 0 255 
+11.7804 77.22 -165.713 255 0 0 255 
+-24.8163 80.01 -161.601 255 0 0 255 
+-3.68383 80.77 -165.948 255 0 0 255 
+-182.992 7.87 -164.915 255 0 0 255 
+-199.213 4.57 -166.68 255 0 0 255 
+349.473 86.61 -39.3583 255 0 0 255 
+330.172 73.15 -73.6594 255 0 0 255 
+342.92 63.25 -47.1378 255 0 0 255 
+309.174 16.51 -73.0276 255 0 0 255 
+321.927 9.65 -61.7793 255 0 0 255 
+328.67 5.84 -52.3222 255 0 0 255 
+297.777 24.13 -81.4629 255 0 0 255 
+-203.182 3.81 -157.585 255 0 0 255 
+-203.311 4.83 -162.977 255 0 0 255 
+-3.58835 79.25 -166.805 255 0 0 255 
+-24.7063 78.23 -163.487 255 0 0 255 
+332.318 73.15 -75.031 255 0 0 255 
+316.986 52.32 -86.8887 255 0 0 255 
+313.656 52.32 -84.0655 255 0 0 255 
+335.432 21.59 -50.4412 255 0 0 255 
+3 0 1 2 
+3 2 3 0 
+3 4 0 3 
+3 3 5 4 
+3 6 4 5 
+3 5 7 6 
+3 8 6 7 
+3 9 10 11 
+3 3 2 12 
+3 12 13 3 
+3 5 3 13 
+3 13 14 5 
+3 7 5 14 
+3 15 16 17 
+3 18 17 16 
+3 16 19 18 
+3 20 21 22 
+3 22 23 20 
+3 23 22 24 
+3 25 20 23 
+3 23 26 25 
+3 1 25 26 
+3 26 2 1 
+3 27 2 26 
+3 12 2 27 
+3 27 28 12 
+3 11 12 28 
+3 28 29 11 
+3 9 11 29 
+3 9 29 30 
+3 30 31 9 
+3 32 31 30 
+3 30 33 32 
+3 34 32 33 
+3 33 35 34 
+3 36 34 35 
+3 35 37 36 
+3 38 36 37 
+3 37 39 38 
+3 40 38 39 
+3 39 41 40 
+3 24 19 42 
+3 24 42 43 
+3 24 43 44 
+3 44 23 24 
+3 26 23 44 
+3 44 45 26 
+3 27 26 45 
+3 45 46 27 
+3 28 27 46 
+3 46 47 28 
+3 29 28 47 
+3 47 48 29 
+3 30 29 48 
+3 48 49 30 
+3 33 30 49 
+3 50 51 43 
+3 43 42 50 
+3 52 50 42 
+3 42 19 52 
+3 53 52 19 
+3 19 16 53 
+3 54 53 16 
+3 55 56 51 
+3 51 50 55 
+3 52 55 50 
+3 54 57 53 
+3 58 59 60 
+3 60 57 58 
+3 61 62 63 
+3 63 64 61 
+3 64 54 16 
+3 16 15 64 
+3 61 64 15 
+3 65 52 66 
+3 66 67 65 
+3 52 53 68 
+3 68 66 52 
+3 67 66 68 
+3 68 69 67 
+3 69 68 57 
+3 57 60 69 
+3 70 60 59 
+3 59 71 70 
+3 69 60 70 
+3 70 72 69 
+3 73 67 69 
+3 74 73 72 
+3 72 75 74 
+3 57 54 64 
+3 65 67 76 
+3 77 65 76 
+3 56 77 76 
+3 78 56 76 
+3 73 78 76 
+3 67 73 76 
+3 71 79 80 
+3 80 70 71 
+3 70 80 75 
+3 75 72 70 
+3 81 75 82 
+3 82 74 81 
+3 74 82 83 
+3 84 82 75 
+3 75 85 84 
+3 86 74 83 
+3 83 87 86 
+3 88 74 86 
+3 86 89 88 
+3 88 78 74 
+3 56 78 88 
+3 88 90 56 
+3 43 51 56 
+3 56 91 43 
+3 91 56 90 
+3 92 90 88 
+3 88 89 92 
+3 93 92 89 
+3 89 94 93 
+3 95 93 94 
+3 94 96 95 
+3 97 95 96 
+3 96 98 97 
+3 99 97 98 
+3 98 100 99 
+3 101 99 100 
+3 100 102 101 
+3 103 101 102 
+3 102 104 103 
+3 105 103 104 
+3 104 106 105 
+3 107 105 106 
+3 106 108 107 
+3 91 90 92 
+3 44 91 92 
+3 43 91 44 
+3 45 44 92 
+3 92 93 45 
+3 46 45 93 
+3 93 95 46 
+3 47 46 95 
+3 95 97 47 
+3 48 47 97 
+3 97 99 48 
+3 49 48 99 
+3 99 101 49 
+3 33 49 101 
+3 101 103 33 
+3 35 33 103 
+3 103 105 35 
+3 37 35 105 
+3 105 107 37 
+3 39 37 107 
+3 107 109 39 
+3 41 39 109 
+3 94 89 86 
+3 86 110 94 
+3 96 94 110 
+3 110 111 96 
+3 98 96 111 
+3 111 112 98 
+3 100 98 112 
+3 112 113 100 
+3 102 100 113 
+3 113 114 102 
+3 104 102 114 
+3 114 115 104 
+3 106 104 115 
+3 115 116 106 
+3 108 106 116 
+3 116 117 108 
+3 118 108 117 
+3 119 86 87 
+3 87 120 119 
+3 110 86 119 
+3 119 121 110 
+3 122 121 119 
+3 119 123 122 
+3 123 119 124 
+3 125 111 110 
+3 110 126 125 
+3 114 113 127 
+3 127 128 114 
+3 117 116 129 
+3 129 130 117 
+3 87 83 131 
+3 131 132 87 
+3 110 87 132 
+3 132 126 110 
+3 83 82 133 
+3 133 131 83 
+3 82 84 134 
+3 134 133 82 
+3 84 135 136 
+3 136 134 84 
+3 84 85 135 
+3 137 138 136 
+3 136 135 137 
+3 139 140 141 
+3 41 142 143 
+3 143 144 41 
+3 144 143 145 
+3 145 146 144 
+3 147 109 107 
+3 107 108 147 
+3 118 147 108 
+3 58 57 64 
+3 64 63 58 
+3 148 149 63 
+3 63 62 148 
+3 58 63 149 
+3 149 59 58 
+3 75 80 85 
+3 79 135 85 
+3 85 80 79 
+3 135 79 137 
+3 150 137 79 
+3 79 71 150 
+3 149 150 71 
+3 71 59 149 
+3 138 137 150 
+3 150 151 138 
+3 149 148 151 
+3 151 150 149 
+3 55 52 65 
+3 77 56 55 
+3 74 78 73 
+3 57 68 53 
+3 65 77 55 
+3 152 153 123 
+3 123 124 152 
+3 124 119 120 
+3 120 152 124 
+3 122 123 153 
+3 121 120 87 
+3 87 110 121 
+3 122 153 152 
+3 152 121 122 
+3 121 152 120 
+3 10 13 12 
+3 12 11 10 
+3 10 154 14 
+3 14 13 10 
+3 154 155 8 
+3 8 14 154 
+3 14 8 7 
+3 113 112 156 
+3 156 127 113 
+3 156 112 111 
+3 111 125 156 
+3 129 116 115 
+3 115 157 129 
+3 128 157 115 
+3 115 114 128 
+3 117 130 158 
+3 158 118 117 
+3 159 160 140 
+3 140 161 159 
+3 161 147 118 
+3 118 159 161 
+3 141 140 160 
+3 41 144 40 
+3 118 158 146 
+3 146 145 162 
+3 162 118 146 
+3 118 162 159 
+3 162 139 160 
+3 160 159 162 
+3 160 139 141 
+3 140 139 162 
+3 162 161 140 
+3 162 145 143 
+3 143 161 162 
+3 161 143 142 
+3 161 142 147 
+3 142 41 109 
+3 109 147 142 
+3 21 163 22 
+3 19 22 163 
+3 163 18 19 
+3 19 24 22 
+3 1 0 164 
+3 164 165 1 
+3 0 4 166 
+3 166 164 0 
+3 4 6 167 
+3 167 166 4 
+3 167 6 8 
+3 168 10 9 
+3 165 164 169 
+3 169 170 165 
+3 164 166 171 
+3 171 169 164 
+3 171 166 167 
+3 17 172 15 
+3 17 18 173 
+3 173 172 17 
+3 174 21 20 
+3 20 175 174 
+3 175 20 176 
+3 20 25 177 
+3 177 176 20 
+3 25 1 165 
+3 165 177 25 
+3 177 165 178 
+3 165 170 179 
+3 179 178 165 
+3 170 168 180 
+3 180 179 170 
+3 180 168 9 
+3 180 9 31 
+3 31 181 180 
+3 31 32 182 
+3 182 181 31 
+3 32 34 183 
+3 183 182 32 
+3 34 36 184 
+3 184 183 34 
+3 36 38 185 
+3 185 184 36 
+3 38 40 186 
+3 186 185 38 
+3 187 173 175 
+3 188 187 175 
+3 188 175 176 
+3 176 189 188 
+3 176 177 190 
+3 190 189 176 
+3 177 178 191 
+3 191 190 177 
+3 178 179 192 
+3 192 191 178 
+3 179 180 193 
+3 193 192 179 
+3 180 181 194 
+3 194 193 180 
+3 194 181 182 
+3 195 196 187 
+3 187 188 195 
+3 196 197 173 
+3 173 187 196 
+3 173 197 198 
+3 198 172 173 
+3 172 198 199 
+3 200 201 196 
+3 196 195 200 
+3 196 201 197 
+3 198 202 199 
+3 203 204 202 
+3 202 205 203 
+3 62 61 206 
+3 206 207 62 
+3 199 206 15 
+3 15 172 199 
+3 15 206 61 
+3 197 208 209 
+3 209 210 197 
+3 198 197 210 
+3 210 211 198 
+3 210 209 212 
+3 212 211 210 
+3 211 212 205 
+3 205 202 211 
+3 205 213 214 
+3 214 203 205 
+3 205 212 215 
+3 215 213 205 
+3 212 209 216 
+3 216 217 218 
+3 218 215 216 
+3 206 199 202 
+3 219 209 208 
+3 219 208 220 
+3 219 220 200 
+3 219 200 221 
+3 219 221 216 
+3 219 216 209 
+3 222 214 213 
+3 213 223 222 
+3 223 213 215 
+3 215 218 223 
+3 224 218 225 
+3 225 226 224 
+3 226 225 217 
+3 224 227 228 
+3 228 218 224 
+3 217 229 230 
+3 230 226 217 
+3 217 231 232 
+3 232 229 217 
+3 217 221 231 
+3 221 200 233 
+3 233 231 221 
+3 200 195 188 
+3 188 233 200 
+3 233 188 234 
+3 233 235 232 
+3 232 231 233 
+3 235 236 237 
+3 237 232 235 
+3 236 238 239 
+3 239 237 236 
+3 238 240 241 
+3 241 239 238 
+3 240 242 243 
+3 243 241 240 
+3 242 244 245 
+3 245 243 242 
+3 244 246 247 
+3 247 245 244 
+3 246 248 249 
+3 249 247 246 
+3 248 250 251 
+3 251 249 248 
+3 235 233 234 
+3 235 234 189 
+3 189 234 188 
+3 189 190 236 
+3 236 235 189 
+3 190 191 238 
+3 238 236 190 
+3 191 192 240 
+3 240 238 191 
+3 192 193 242 
+3 242 240 192 
+3 193 194 244 
+3 244 242 193 
+3 194 182 246 
+3 246 244 194 
+3 182 183 248 
+3 248 246 182 
+3 183 184 250 
+3 250 248 183 
+3 184 185 252 
+3 252 250 184 
+3 252 185 186 
+3 232 237 253 
+3 253 229 232 
+3 237 239 254 
+3 254 253 237 
+3 239 241 255 
+3 255 254 239 
+3 241 243 256 
+3 256 255 241 
+3 243 245 257 
+3 257 256 243 
+3 245 247 258 
+3 258 257 245 
+3 247 249 259 
+3 259 258 247 
+3 249 251 260 
+3 260 259 249 
+3 260 251 261 
+3 229 262 263 
+3 263 230 229 
+3 229 253 264 
+3 264 262 229 
+3 262 264 265 
+3 265 266 262 
+3 266 265 267 
+3 254 125 126 
+3 126 253 254 
+3 256 257 128 
+3 128 127 256 
+3 259 260 130 
+3 130 129 259 
+3 226 230 132 
+3 132 131 226 
+3 230 253 126 
+3 126 132 230 
+3 224 226 131 
+3 131 133 224 
+3 227 224 133 
+3 133 134 227 
+3 268 227 134 
+3 134 136 268 
+3 268 228 227 
+3 138 269 268 
+3 268 136 138 
+3 270 271 272 
+3 273 186 144 
+3 144 274 273 
+3 274 144 146 
+3 146 275 274 
+3 252 276 251 
+3 251 250 252 
+3 251 276 261 
+3 202 204 207 
+3 207 206 202 
+3 277 148 62 
+3 62 207 277 
+3 207 204 203 
+3 203 277 207 
+3 228 223 218 
+3 268 222 223 
+3 223 228 268 
+3 269 222 268 
+3 269 278 214 
+3 214 222 269 
+3 278 277 203 
+3 203 214 278 
+3 269 138 151 
+3 151 278 269 
+3 148 277 278 
+3 278 151 148 
+3 208 197 201 
+3 201 200 220 
+3 216 221 217 
+3 198 211 202 
+3 201 220 208 
+3 279 280 266 
+3 266 267 279 
+3 262 266 280 
+3 280 263 262 
+3 279 267 265 
+3 263 264 253 
+3 253 230 263 
+3 280 279 265 
+3 265 263 280 
+3 263 265 264 
+3 169 10 168 
+3 168 170 169 
+3 154 10 169 
+3 169 171 154 
+3 154 167 8 
+3 167 154 171 
+3 255 256 127 
+3 127 156 255 
+3 255 156 125 
+3 125 254 255 
+3 259 129 157 
+3 157 258 259 
+3 157 128 257 
+3 257 258 157 
+3 130 260 261 
+3 261 158 130 
+3 281 282 283 
+3 283 271 281 
+3 276 283 282 
+3 282 261 276 
+3 281 271 270 
+3 40 144 186 
+3 146 158 261 
+3 284 275 146 
+3 146 282 284 
+3 282 146 261 
+3 272 284 282 
+3 282 281 272 
+3 270 272 281 
+3 272 271 283 
+3 283 284 272 
+3 275 284 283 
+3 283 274 275 
+3 273 274 283 
+3 276 273 283 
+3 186 273 276 
+3 276 252 186 
+3 174 163 21 
+3 174 173 18 
+3 18 163 174 
+3 174 175 173 
+3 216 215 212 
+3 69 72 73 
+3 285 286 287 
+3 287 288 285 
+3 289 285 288 
+3 288 290 289 
+3 291 289 290 
+3 290 292 291 
+3 293 291 292 
+3 294 295 296 
+3 288 287 297 
+3 297 298 288 
+3 290 288 298 
+3 298 299 290 
+3 292 290 299 
+3 300 301 302 
+3 303 302 301 
+3 301 304 303 
+3 305 306 307 
+3 307 308 305 
+3 308 307 309 
+3 310 305 308 
+3 308 311 310 
+3 286 310 311 
+3 311 287 286 
+3 312 287 311 
+3 297 287 312 
+3 312 313 297 
+3 296 297 313 
+3 313 314 296 
+3 294 296 314 
+3 294 314 315 
+3 315 316 294 
+3 317 316 315 
+3 315 318 317 
+3 319 317 318 
+3 318 320 319 
+3 321 319 320 
+3 320 322 321 
+3 323 321 322 
+3 322 324 323 
+3 325 323 324 
+3 324 326 325 
+3 309 304 327 
+3 309 327 328 
+3 309 328 329 
+3 329 308 309 
+3 311 308 329 
+3 329 330 311 
+3 312 311 330 
+3 330 331 312 
+3 313 312 331 
+3 331 332 313 
+3 314 313 332 
+3 332 333 314 
+3 315 314 333 
+3 333 334 315 
+3 318 315 334 
+3 335 336 328 
+3 328 327 335 
+3 337 335 327 
+3 327 304 337 
+3 338 337 304 
+3 304 301 338 
+3 339 338 301 
+3 340 341 336 
+3 336 335 340 
+3 337 340 335 
+3 339 342 338 
+3 343 344 345 
+3 345 342 343 
+3 346 347 348 
+3 348 349 346 
+3 349 339 301 
+3 301 300 349 
+3 346 349 300 
+3 350 337 351 
+3 351 352 350 
+3 337 338 353 
+3 353 351 337 
+3 352 351 353 
+3 353 354 352 
+3 354 353 342 
+3 342 345 354 
+3 355 345 344 
+3 344 356 355 
+3 354 345 355 
+3 355 357 354 
+3 358 352 354 
+3 359 358 357 
+3 357 360 359 
+3 342 339 349 
+3 350 352 361 
+3 362 350 361 
+3 341 362 361 
+3 363 341 361 
+3 358 363 361 
+3 352 358 361 
+3 356 364 365 
+3 365 355 356 
+3 355 365 360 
+3 360 357 355 
+3 366 360 367 
+3 367 359 366 
+3 359 367 368 
+3 369 367 360 
+3 360 370 369 
+3 371 359 368 
+3 368 372 371 
+3 373 359 371 
+3 371 374 373 
+3 373 363 359 
+3 341 363 373 
+3 373 375 341 
+3 328 336 341 
+3 341 376 328 
+3 376 341 375 
+3 377 375 373 
+3 373 374 377 
+3 378 377 374 
+3 374 379 378 
+3 380 378 379 
+3 379 381 380 
+3 382 380 381 
+3 381 383 382 
+3 384 382 383 
+3 383 385 384 
+3 386 384 385 
+3 385 387 386 
+3 388 386 387 
+3 387 389 388 
+3 390 388 389 
+3 389 391 390 
+3 392 390 391 
+3 391 393 392 
+3 376 375 377 
+3 329 376 377 
+3 328 376 329 
+3 330 329 377 
+3 377 378 330 
+3 331 330 378 
+3 378 380 331 
+3 332 331 380 
+3 380 382 332 
+3 333 332 382 
+3 382 384 333 
+3 334 333 384 
+3 384 386 334 
+3 318 334 386 
+3 386 388 318 
+3 320 318 388 
+3 388 390 320 
+3 322 320 390 
+3 390 392 322 
+3 324 322 392 
+3 392 394 324 
+3 326 324 394 
+3 379 374 371 
+3 371 395 379 
+3 381 379 395 
+3 395 396 381 
+3 383 381 396 
+3 396 397 383 
+3 385 383 397 
+3 397 398 385 
+3 387 385 398 
+3 398 399 387 
+3 389 387 399 
+3 399 400 389 
+3 391 389 400 
+3 400 401 391 
+3 393 391 401 
+3 401 402 393 
+3 403 393 402 
+3 404 371 372 
+3 372 405 404 
+3 395 371 404 
+3 404 406 395 
+3 407 406 404 
+3 404 408 407 
+3 408 404 409 
+3 410 396 395 
+3 395 411 410 
+3 399 398 412 
+3 412 413 399 
+3 402 401 414 
+3 414 415 402 
+3 372 368 416 
+3 416 417 372 
+3 395 372 417 
+3 417 411 395 
+3 368 367 418 
+3 418 416 368 
+3 367 369 419 
+3 419 418 367 
+3 369 420 421 
+3 421 419 369 
+3 369 370 420 
+3 422 423 421 
+3 421 420 422 
+3 424 425 426 
+3 326 427 428 
+3 428 429 326 
+3 429 428 430 
+3 430 431 429 
+3 432 394 392 
+3 392 393 432 
+3 403 432 393 
+3 343 342 349 
+3 349 348 343 
+3 433 434 348 
+3 348 347 433 
+3 343 348 434 
+3 434 344 343 
+3 360 365 370 
+3 364 420 370 
+3 370 365 364 
+3 420 364 422 
+3 435 422 364 
+3 364 356 435 
+3 434 435 356 
+3 356 344 434 
+3 423 422 435 
+3 435 436 423 
+3 434 433 436 
+3 436 435 434 
+3 340 337 350 
+3 362 341 340 
+3 359 363 358 
+3 342 353 338 
+3 350 362 340 
+3 437 438 408 
+3 408 409 437 
+3 409 404 405 
+3 405 437 409 
+3 407 408 438 
+3 406 405 372 
+3 372 395 406 
+3 407 438 437 
+3 437 406 407 
+3 406 437 405 
+3 295 298 297 
+3 297 296 295 
+3 295 439 299 
+3 299 298 295 
+3 439 440 293 
+3 293 299 439 
+3 299 293 292 
+3 398 397 441 
+3 441 412 398 
+3 441 397 396 
+3 396 410 441 
+3 414 401 400 
+3 400 442 414 
+3 413 442 400 
+3 400 399 413 
+3 402 415 443 
+3 443 403 402 
+3 444 445 425 
+3 425 446 444 
+3 446 432 403 
+3 403 444 446 
+3 426 425 445 
+3 326 429 325 
+3 403 443 431 
+3 431 430 447 
+3 447 403 431 
+3 403 447 444 
+3 447 424 445 
+3 445 444 447 
+3 445 424 426 
+3 425 424 447 
+3 447 446 425 
+3 447 430 428 
+3 428 446 447 
+3 446 428 427 
+3 446 427 432 
+3 427 326 394 
+3 394 432 427 
+3 306 448 307 
+3 304 307 448 
+3 448 303 304 
+3 304 309 307 
+3 286 285 449 
+3 449 450 286 
+3 285 289 451 
+3 451 449 285 
+3 289 291 452 
+3 452 451 289 
+3 452 291 293 
+3 453 295 294 
+3 450 449 454 
+3 454 455 450 
+3 449 451 456 
+3 456 454 449 
+3 456 451 452 
+3 302 457 300 
+3 302 303 458 
+3 458 457 302 
+3 459 306 305 
+3 305 460 459 
+3 460 305 461 
+3 305 310 462 
+3 462 461 305 
+3 310 286 450 
+3 450 462 310 
+3 462 450 463 
+3 450 455 464 
+3 464 463 450 
+3 455 453 465 
+3 465 464 455 
+3 465 453 294 
+3 465 294 316 
+3 316 466 465 
+3 316 317 467 
+3 467 466 316 
+3 317 319 468 
+3 468 467 317 
+3 319 321 469 
+3 469 468 319 
+3 321 323 470 
+3 470 469 321 
+3 323 325 471 
+3 471 470 323 
+3 472 458 460 
+3 473 472 460 
+3 473 460 461 
+3 461 474 473 
+3 461 462 475 
+3 475 474 461 
+3 462 463 476 
+3 476 475 462 
+3 463 464 477 
+3 477 476 463 
+3 464 465 478 
+3 478 477 464 
+3 465 466 479 
+3 479 478 465 
+3 479 466 467 
+3 480 481 472 
+3 472 473 480 
+3 481 482 458 
+3 458 472 481 
+3 458 482 483 
+3 483 457 458 
+3 457 483 484 
+3 485 486 481 
+3 481 480 485 
+3 481 486 482 
+3 483 487 484 
+3 488 489 487 
+3 487 490 488 
+3 347 346 491 
+3 491 492 347 
+3 484 491 300 
+3 300 457 484 
+3 300 491 346 
+3 482 493 494 
+3 494 495 482 
+3 483 482 495 
+3 495 496 483 
+3 495 494 497 
+3 497 496 495 
+3 496 497 490 
+3 490 487 496 
+3 490 498 499 
+3 499 488 490 
+3 490 497 500 
+3 500 498 490 
+3 497 494 501 
+3 501 502 503 
+3 503 500 501 
+3 491 484 487 
+3 504 494 493 
+3 504 493 505 
+3 504 505 485 
+3 504 485 506 
+3 504 506 501 
+3 504 501 494 
+3 507 499 498 
+3 498 508 507 
+3 508 498 500 
+3 500 503 508 
+3 509 503 510 
+3 510 511 509 
+3 511 510 502 
+3 509 512 513 
+3 513 503 509 
+3 502 514 515 
+3 515 511 502 
+3 502 516 517 
+3 517 514 502 
+3 502 506 516 
+3 506 485 518 
+3 518 516 506 
+3 485 480 473 
+3 473 518 485 
+3 518 473 519 
+3 518 520 517 
+3 517 516 518 
+3 520 521 522 
+3 522 517 520 
+3 521 523 524 
+3 524 522 521 
+3 523 525 526 
+3 526 524 523 
+3 525 527 528 
+3 528 526 525 
+3 527 529 530 
+3 530 528 527 
+3 529 531 532 
+3 532 530 529 
+3 531 533 534 
+3 534 532 531 
+3 533 535 536 
+3 536 534 533 
+3 520 518 519 
+3 520 519 474 
+3 474 519 473 
+3 474 475 521 
+3 521 520 474 
+3 475 476 523 
+3 523 521 475 
+3 476 477 525 
+3 525 523 476 
+3 477 478 527 
+3 527 525 477 
+3 478 479 529 
+3 529 527 478 
+3 479 467 531 
+3 531 529 479 
+3 467 468 533 
+3 533 531 467 
+3 468 469 535 
+3 535 533 468 
+3 469 470 537 
+3 537 535 469 
+3 537 470 471 
+3 517 522 538 
+3 538 514 517 
+3 522 524 539 
+3 539 538 522 
+3 524 526 540 
+3 540 539 524 
+3 526 528 541 
+3 541 540 526 
+3 528 530 542 
+3 542 541 528 
+3 530 532 543 
+3 543 542 530 
+3 532 534 544 
+3 544 543 532 
+3 534 536 545 
+3 545 544 534 
+3 545 536 546 
+3 514 547 548 
+3 548 515 514 
+3 514 538 549 
+3 549 547 514 
+3 547 549 550 
+3 550 551 547 
+3 551 550 552 
+3 539 410 411 
+3 411 538 539 
+3 541 542 413 
+3 413 412 541 
+3 544 545 415 
+3 415 414 544 
+3 511 515 417 
+3 417 416 511 
+3 515 538 411 
+3 411 417 515 
+3 509 511 416 
+3 416 418 509 
+3 512 509 418 
+3 418 419 512 
+3 553 512 419 
+3 419 421 553 
+3 553 513 512 
+3 423 554 553 
+3 553 421 423 
+3 555 556 557 
+3 558 471 429 
+3 429 559 558 
+3 559 429 431 
+3 431 560 559 
+3 537 561 536 
+3 536 535 537 
+3 536 561 546 
+3 487 489 492 
+3 492 491 487 
+3 562 433 347 
+3 347 492 562 
+3 492 489 488 
+3 488 562 492 
+3 513 508 503 
+3 553 507 508 
+3 508 513 553 
+3 554 507 553 
+3 554 563 499 
+3 499 507 554 
+3 563 562 488 
+3 488 499 563 
+3 554 423 436 
+3 436 563 554 
+3 433 562 563 
+3 563 436 433 
+3 493 482 486 
+3 486 485 505 
+3 501 506 502 
+3 483 496 487 
+3 486 505 493 
+3 564 565 551 
+3 551 552 564 
+3 547 551 565 
+3 565 548 547 
+3 564 552 550 
+3 548 549 538 
+3 538 515 548 
+3 565 564 550 
+3 550 548 565 
+3 548 550 549 
+3 454 295 453 
+3 453 455 454 
+3 439 295 454 
+3 454 456 439 
+3 439 452 293 
+3 452 439 456 
+3 540 541 412 
+3 412 441 540 
+3 540 441 410 
+3 410 539 540 
+3 544 414 442 
+3 442 543 544 
+3 442 413 542 
+3 542 543 442 
+3 415 545 546 
+3 546 443 415 
+3 566 567 568 
+3 568 556 566 
+3 561 568 567 
+3 567 546 561 
+3 566 556 555 
+3 325 429 471 
+3 431 443 546 
+3 569 560 431 
+3 431 567 569 
+3 567 431 546 
+3 557 569 567 
+3 567 566 557 
+3 555 557 566 
+3 557 556 568 
+3 568 569 557 
+3 560 569 568 
+3 568 559 560 
+3 558 559 568 
+3 561 558 568 
+3 471 558 561 
+3 561 537 471 
+3 459 448 306 
+3 459 458 303 
+3 303 448 459 
+3 459 460 458 
+3 501 500 497 
+3 354 357 358 
+3 570 571 572 
+3 572 573 570 
+3 574 570 573 
+3 573 575 574 
+3 576 574 575 
+3 575 577 576 
+3 578 576 577 
+3 579 580 581 
+3 573 572 582 
+3 582 583 573 
+3 575 573 583 
+3 583 584 575 
+3 577 575 584 
+3 585 586 587 
+3 588 587 586 
+3 586 589 588 
+3 590 591 592 
+3 592 593 590 
+3 593 592 594 
+3 595 590 593 
+3 593 596 595 
+3 571 595 596 
+3 596 572 571 
+3 597 572 596 
+3 582 572 597 
+3 597 598 582 
+3 581 582 598 
+3 598 599 581 
+3 579 581 599 
+3 579 599 600 
+3 600 601 579 
+3 602 601 600 
+3 600 603 602 
+3 604 602 603 
+3 603 605 604 
+3 606 604 605 
+3 605 607 606 
+3 608 606 607 
+3 607 609 608 
+3 610 608 609 
+3 609 611 610 
+3 594 589 612 
+3 594 612 613 
+3 594 613 614 
+3 614 593 594 
+3 596 593 614 
+3 614 615 596 
+3 597 596 615 
+3 615 616 597 
+3 598 597 616 
+3 616 617 598 
+3 599 598 617 
+3 617 618 599 
+3 600 599 618 
+3 618 619 600 
+3 603 600 619 
+3 620 621 613 
+3 613 612 620 
+3 622 620 612 
+3 612 589 622 
+3 623 622 589 
+3 589 586 623 
+3 624 623 586 
+3 625 626 621 
+3 621 620 625 
+3 622 625 620 
+3 624 627 623 
+3 628 629 630 
+3 630 627 628 
+3 631 632 633 
+3 633 634 631 
+3 634 624 586 
+3 586 585 634 
+3 631 634 585 
+3 635 622 636 
+3 636 637 635 
+3 622 623 638 
+3 638 636 622 
+3 637 636 638 
+3 638 639 637 
+3 639 638 627 
+3 627 630 639 
+3 640 630 629 
+3 629 641 640 
+3 639 630 640 
+3 640 642 639 
+3 643 637 639 
+3 644 643 642 
+3 642 645 644 
+3 627 624 634 
+3 635 637 646 
+3 647 635 646 
+3 626 647 646 
+3 648 626 646 
+3 643 648 646 
+3 637 643 646 
+3 641 649 650 
+3 650 640 641 
+3 640 650 645 
+3 645 642 640 
+3 651 645 652 
+3 652 644 651 
+3 644 652 653 
+3 654 652 645 
+3 645 655 654 
+3 656 644 653 
+3 653 657 656 
+3 658 644 656 
+3 656 659 658 
+3 658 648 644 
+3 626 648 658 
+3 658 660 626 
+3 613 621 626 
+3 626 661 613 
+3 661 626 660 
+3 662 660 658 
+3 658 659 662 
+3 663 662 659 
+3 659 664 663 
+3 665 663 664 
+3 664 666 665 
+3 667 665 666 
+3 666 668 667 
+3 669 667 668 
+3 668 670 669 
+3 671 669 670 
+3 670 672 671 
+3 673 671 672 
+3 672 674 673 
+3 675 673 674 
+3 674 676 675 
+3 677 675 676 
+3 676 678 677 
+3 661 660 662 
+3 614 661 662 
+3 613 661 614 
+3 615 614 662 
+3 662 663 615 
+3 616 615 663 
+3 663 665 616 
+3 617 616 665 
+3 665 667 617 
+3 618 617 667 
+3 667 669 618 
+3 619 618 669 
+3 669 671 619 
+3 603 619 671 
+3 671 673 603 
+3 605 603 673 
+3 673 675 605 
+3 607 605 675 
+3 675 677 607 
+3 609 607 677 
+3 677 679 609 
+3 611 609 679 
+3 664 659 656 
+3 656 680 664 
+3 666 664 680 
+3 680 681 666 
+3 668 666 681 
+3 681 682 668 
+3 670 668 682 
+3 682 683 670 
+3 672 670 683 
+3 683 684 672 
+3 674 672 684 
+3 684 685 674 
+3 676 674 685 
+3 685 686 676 
+3 678 676 686 
+3 686 687 678 
+3 688 678 687 
+3 689 656 657 
+3 657 690 689 
+3 680 656 689 
+3 689 691 680 
+3 692 691 689 
+3 689 693 692 
+3 693 689 694 
+3 695 681 680 
+3 680 696 695 
+3 684 683 697 
+3 697 698 684 
+3 687 686 699 
+3 699 700 687 
+3 657 653 701 
+3 701 702 657 
+3 680 657 702 
+3 702 696 680 
+3 653 652 703 
+3 703 701 653 
+3 652 654 704 
+3 704 703 652 
+3 654 705 706 
+3 706 704 654 
+3 654 655 705 
+3 707 708 706 
+3 706 705 707 
+3 709 710 711 
+3 611 712 713 
+3 713 714 611 
+3 714 713 715 
+3 715 716 714 
+3 717 679 677 
+3 677 678 717 
+3 688 717 678 
+3 628 627 634 
+3 634 633 628 
+3 718 719 633 
+3 633 632 718 
+3 628 633 719 
+3 719 629 628 
+3 645 650 655 
+3 649 705 655 
+3 655 650 649 
+3 705 649 707 
+3 720 707 649 
+3 649 641 720 
+3 719 720 641 
+3 641 629 719 
+3 708 707 720 
+3 720 721 708 
+3 719 718 721 
+3 721 720 719 
+3 625 622 635 
+3 647 626 625 
+3 644 648 643 
+3 627 638 623 
+3 635 647 625 
+3 722 723 693 
+3 693 694 722 
+3 694 689 690 
+3 690 722 694 
+3 692 693 723 
+3 691 690 657 
+3 657 680 691 
+3 692 723 722 
+3 722 691 692 
+3 691 722 690 
+3 580 583 582 
+3 582 581 580 
+3 580 724 584 
+3 584 583 580 
+3 724 725 578 
+3 578 584 724 
+3 584 578 577 
+3 683 682 726 
+3 726 697 683 
+3 726 682 681 
+3 681 695 726 
+3 699 686 685 
+3 685 727 699 
+3 698 727 685 
+3 685 684 698 
+3 687 700 728 
+3 728 688 687 
+3 729 730 710 
+3 710 731 729 
+3 731 717 688 
+3 688 729 731 
+3 711 710 730 
+3 611 714 610 
+3 688 728 716 
+3 716 715 732 
+3 732 688 716 
+3 688 732 729 
+3 732 709 730 
+3 730 729 732 
+3 730 709 711 
+3 710 709 732 
+3 732 731 710 
+3 732 715 713 
+3 713 731 732 
+3 731 713 712 
+3 731 712 717 
+3 712 611 679 
+3 679 717 712 
+3 591 733 592 
+3 589 592 733 
+3 733 588 589 
+3 589 594 592 
+3 571 570 734 
+3 734 735 571 
+3 570 574 736 
+3 736 734 570 
+3 574 576 737 
+3 737 736 574 
+3 737 576 578 
+3 738 580 579 
+3 735 734 739 
+3 739 740 735 
+3 734 736 741 
+3 741 739 734 
+3 741 736 737 
+3 587 742 585 
+3 587 588 743 
+3 743 742 587 
+3 744 591 590 
+3 590 745 744 
+3 745 590 746 
+3 590 595 747 
+3 747 746 590 
+3 595 571 735 
+3 735 747 595 
+3 747 735 748 
+3 735 740 749 
+3 749 748 735 
+3 740 738 750 
+3 750 749 740 
+3 750 738 579 
+3 750 579 601 
+3 601 751 750 
+3 601 602 752 
+3 752 751 601 
+3 602 604 753 
+3 753 752 602 
+3 604 606 754 
+3 754 753 604 
+3 606 608 755 
+3 755 754 606 
+3 608 610 756 
+3 756 755 608 
+3 757 743 745 
+3 758 757 745 
+3 758 745 746 
+3 746 759 758 
+3 746 747 760 
+3 760 759 746 
+3 747 748 761 
+3 761 760 747 
+3 748 749 762 
+3 762 761 748 
+3 749 750 763 
+3 763 762 749 
+3 750 751 764 
+3 764 763 750 
+3 764 751 752 
+3 765 766 757 
+3 757 758 765 
+3 766 767 743 
+3 743 757 766 
+3 743 767 768 
+3 768 742 743 
+3 742 768 769 
+3 770 771 766 
+3 766 765 770 
+3 766 771 767 
+3 768 772 769 
+3 773 774 772 
+3 772 775 773 
+3 632 631 776 
+3 776 777 632 
+3 769 776 585 
+3 585 742 769 
+3 585 776 631 
+3 767 778 779 
+3 779 780 767 
+3 768 767 780 
+3 780 781 768 
+3 780 779 782 
+3 782 781 780 
+3 781 782 775 
+3 775 772 781 
+3 775 783 784 
+3 784 773 775 
+3 775 782 785 
+3 785 783 775 
+3 782 779 786 
+3 786 787 788 
+3 788 785 786 
+3 776 769 772 
+3 789 779 778 
+3 789 778 790 
+3 789 790 770 
+3 789 770 791 
+3 789 791 786 
+3 789 786 779 
+3 792 784 783 
+3 783 793 792 
+3 793 783 785 
+3 785 788 793 
+3 794 788 795 
+3 795 796 794 
+3 796 795 787 
+3 794 797 798 
+3 798 788 794 
+3 787 799 800 
+3 800 796 787 
+3 787 801 802 
+3 802 799 787 
+3 787 791 801 
+3 791 770 803 
+3 803 801 791 
+3 770 765 758 
+3 758 803 770 
+3 803 758 804 
+3 803 805 802 
+3 802 801 803 
+3 805 806 807 
+3 807 802 805 
+3 806 808 809 
+3 809 807 806 
+3 808 810 811 
+3 811 809 808 
+3 810 812 813 
+3 813 811 810 
+3 812 814 815 
+3 815 813 812 
+3 814 816 817 
+3 817 815 814 
+3 816 818 819 
+3 819 817 816 
+3 818 820 821 
+3 821 819 818 
+3 805 803 804 
+3 805 804 759 
+3 759 804 758 
+3 759 760 806 
+3 806 805 759 
+3 760 761 808 
+3 808 806 760 
+3 761 762 810 
+3 810 808 761 
+3 762 763 812 
+3 812 810 762 
+3 763 764 814 
+3 814 812 763 
+3 764 752 816 
+3 816 814 764 
+3 752 753 818 
+3 818 816 752 
+3 753 754 820 
+3 820 818 753 
+3 754 755 822 
+3 822 820 754 
+3 822 755 756 
+3 802 807 823 
+3 823 799 802 
+3 807 809 824 
+3 824 823 807 
+3 809 811 825 
+3 825 824 809 
+3 811 813 826 
+3 826 825 811 
+3 813 815 827 
+3 827 826 813 
+3 815 817 828 
+3 828 827 815 
+3 817 819 829 
+3 829 828 817 
+3 819 821 830 
+3 830 829 819 
+3 830 821 831 
+3 799 832 833 
+3 833 800 799 
+3 799 823 834 
+3 834 832 799 
+3 832 834 835 
+3 835 836 832 
+3 836 835 837 
+3 824 695 696 
+3 696 823 824 
+3 826 827 698 
+3 698 697 826 
+3 829 830 700 
+3 700 699 829 
+3 796 800 702 
+3 702 701 796 
+3 800 823 696 
+3 696 702 800 
+3 794 796 701 
+3 701 703 794 
+3 797 794 703 
+3 703 704 797 
+3 838 797 704 
+3 704 706 838 
+3 838 798 797 
+3 708 839 838 
+3 838 706 708 
+3 840 841 842 
+3 843 756 714 
+3 714 844 843 
+3 844 714 716 
+3 716 845 844 
+3 822 846 821 
+3 821 820 822 
+3 821 846 831 
+3 772 774 777 
+3 777 776 772 
+3 847 718 632 
+3 632 777 847 
+3 777 774 773 
+3 773 847 777 
+3 798 793 788 
+3 838 792 793 
+3 793 798 838 
+3 839 792 838 
+3 839 848 784 
+3 784 792 839 
+3 848 847 773 
+3 773 784 848 
+3 839 708 721 
+3 721 848 839 
+3 718 847 848 
+3 848 721 718 
+3 778 767 771 
+3 771 770 790 
+3 786 791 787 
+3 768 781 772 
+3 771 790 778 
+3 849 850 836 
+3 836 837 849 
+3 832 836 850 
+3 850 833 832 
+3 849 837 835 
+3 833 834 823 
+3 823 800 833 
+3 850 849 835 
+3 835 833 850 
+3 833 835 834 
+3 739 580 738 
+3 738 740 739 
+3 724 580 739 
+3 739 741 724 
+3 724 737 578 
+3 737 724 741 
+3 825 826 697 
+3 697 726 825 
+3 825 726 695 
+3 695 824 825 
+3 829 699 727 
+3 727 828 829 
+3 727 698 827 
+3 827 828 727 
+3 700 830 831 
+3 831 728 700 
+3 851 852 853 
+3 853 841 851 
+3 846 853 852 
+3 852 831 846 
+3 851 841 840 
+3 610 714 756 
+3 716 728 831 
+3 854 845 716 
+3 716 852 854 
+3 852 716 831 
+3 842 854 852 
+3 852 851 842 
+3 840 842 851 
+3 842 841 853 
+3 853 854 842 
+3 845 854 853 
+3 853 844 845 
+3 843 844 853 
+3 846 843 853 
+3 756 843 846 
+3 846 822 756 
+3 744 733 591 
+3 744 743 588 
+3 588 733 744 
+3 744 745 743 
+3 786 785 782 
+3 639 642 643 

BIN
examples/models/ply/binary/dolphins_be.ply


BIN
examples/models/ply/binary/dolphins_le.ply