StackGenVis: Alignment of Data, Algorithms, and Models for Stacking Ensemble Learning Using Performance Metrics
https://doi.org/10.1109/TVCG.2020.3030352
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
31390 lines
1.7 MiB
31390 lines
1.7 MiB
(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){ |
|
'use strict' |
|
|
|
exports.byteLength = byteLength |
|
exports.toByteArray = toByteArray |
|
exports.fromByteArray = fromByteArray |
|
|
|
var lookup = [] |
|
var revLookup = [] |
|
var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array |
|
|
|
var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' |
|
for (var i = 0, len = code.length; i < len; ++i) { |
|
lookup[i] = code[i] |
|
revLookup[code.charCodeAt(i)] = i |
|
} |
|
|
|
revLookup['-'.charCodeAt(0)] = 62 |
|
revLookup['_'.charCodeAt(0)] = 63 |
|
|
|
function placeHoldersCount (b64) { |
|
var len = b64.length |
|
if (len % 4 > 0) { |
|
throw new Error('Invalid string. Length must be a multiple of 4') |
|
} |
|
|
|
// the number of equal signs (place holders) |
|
// if there are two placeholders, than the two characters before it |
|
// represent one byte |
|
// if there is only one, then the three characters before it represent 2 bytes |
|
// this is just a cheap hack to not do indexOf twice |
|
return b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0 |
|
} |
|
|
|
function byteLength (b64) { |
|
// base64 is 4/3 + up to two characters of the original data |
|
return b64.length * 3 / 4 - placeHoldersCount(b64) |
|
} |
|
|
|
function toByteArray (b64) { |
|
var i, j, l, tmp, placeHolders, arr |
|
var len = b64.length |
|
placeHolders = placeHoldersCount(b64) |
|
|
|
arr = new Arr(len * 3 / 4 - placeHolders) |
|
|
|
// if there are placeholders, only get up to the last complete 4 chars |
|
l = placeHolders > 0 ? len - 4 : len |
|
|
|
var L = 0 |
|
|
|
for (i = 0, j = 0; i < l; i += 4, j += 3) { |
|
tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)] |
|
arr[L++] = (tmp >> 16) & 0xFF |
|
arr[L++] = (tmp >> 8) & 0xFF |
|
arr[L++] = tmp & 0xFF |
|
} |
|
|
|
if (placeHolders === 2) { |
|
tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4) |
|
arr[L++] = tmp & 0xFF |
|
} else if (placeHolders === 1) { |
|
tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2) |
|
arr[L++] = (tmp >> 8) & 0xFF |
|
arr[L++] = tmp & 0xFF |
|
} |
|
|
|
return arr |
|
} |
|
|
|
function tripletToBase64 (num) { |
|
return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F] |
|
} |
|
|
|
function encodeChunk (uint8, start, end) { |
|
var tmp |
|
var output = [] |
|
for (var i = start; i < end; i += 3) { |
|
tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]) |
|
output.push(tripletToBase64(tmp)) |
|
} |
|
return output.join('') |
|
} |
|
|
|
function fromByteArray (uint8) { |
|
var tmp |
|
var len = uint8.length |
|
var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes |
|
var output = '' |
|
var parts = [] |
|
var maxChunkLength = 16383 // must be multiple of 3 |
|
|
|
// go through the array every three bytes, we'll deal with trailing stuff later |
|
for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { |
|
parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength))) |
|
} |
|
|
|
// pad the end with zeros, but make sure to not forget the extra bytes |
|
if (extraBytes === 1) { |
|
tmp = uint8[len - 1] |
|
output += lookup[tmp >> 2] |
|
output += lookup[(tmp << 4) & 0x3F] |
|
output += '==' |
|
} else if (extraBytes === 2) { |
|
tmp = (uint8[len - 2] << 8) + (uint8[len - 1]) |
|
output += lookup[tmp >> 10] |
|
output += lookup[(tmp >> 4) & 0x3F] |
|
output += lookup[(tmp << 2) & 0x3F] |
|
output += '=' |
|
} |
|
|
|
parts.push(output) |
|
|
|
return parts.join('') |
|
} |
|
|
|
},{}],2:[function(require,module,exports){ |
|
|
|
},{}],3:[function(require,module,exports){ |
|
/*! |
|
* The buffer module from node.js, for the browser. |
|
* |
|
* @author Feross Aboukhadijeh <feross@feross.org> <http://feross.org> |
|
* @license MIT |
|
*/ |
|
/* eslint-disable no-proto */ |
|
|
|
'use strict' |
|
|
|
var base64 = require('base64-js') |
|
var ieee754 = require('ieee754') |
|
|
|
exports.Buffer = Buffer |
|
exports.SlowBuffer = SlowBuffer |
|
exports.INSPECT_MAX_BYTES = 50 |
|
|
|
var K_MAX_LENGTH = 0x7fffffff |
|
exports.kMaxLength = K_MAX_LENGTH |
|
|
|
/** |
|
* If `Buffer.TYPED_ARRAY_SUPPORT`: |
|
* === true Use Uint8Array implementation (fastest) |
|
* === false Print warning and recommend using `buffer` v4.x which has an Object |
|
* implementation (most compatible, even IE6) |
|
* |
|
* Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, |
|
* Opera 11.6+, iOS 4.2+. |
|
* |
|
* We report that the browser does not support typed arrays if the are not subclassable |
|
* using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array` |
|
* (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support |
|
* for __proto__ and has a buggy typed array implementation. |
|
*/ |
|
Buffer.TYPED_ARRAY_SUPPORT = typedArraySupport() |
|
|
|
if (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' && |
|
typeof console.error === 'function') { |
|
console.error( |
|
'This browser lacks typed array (Uint8Array) support which is required by ' + |
|
'`buffer` v5.x. Use `buffer` v4.x if you require old browser support.' |
|
) |
|
} |
|
|
|
function typedArraySupport () { |
|
// Can typed array instances can be augmented? |
|
try { |
|
var arr = new Uint8Array(1) |
|
arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }} |
|
return arr.foo() === 42 |
|
} catch (e) { |
|
return false |
|
} |
|
} |
|
|
|
function createBuffer (length) { |
|
if (length > K_MAX_LENGTH) { |
|
throw new RangeError('Invalid typed array length') |
|
} |
|
// Return an augmented `Uint8Array` instance |
|
var buf = new Uint8Array(length) |
|
buf.__proto__ = Buffer.prototype |
|
return buf |
|
} |
|
|
|
/** |
|
* The Buffer constructor returns instances of `Uint8Array` that have their |
|
* prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of |
|
* `Uint8Array`, so the returned instances will have all the node `Buffer` methods |
|
* and the `Uint8Array` methods. Square bracket notation works as expected -- it |
|
* returns a single octet. |
|
* |
|
* The `Uint8Array` prototype remains unmodified. |
|
*/ |
|
|
|
function Buffer (arg, encodingOrOffset, length) { |
|
// Common case. |
|
if (typeof arg === 'number') { |
|
if (typeof encodingOrOffset === 'string') { |
|
throw new Error( |
|
'If encoding is specified then the first argument must be a string' |
|
) |
|
} |
|
return allocUnsafe(arg) |
|
} |
|
return from(arg, encodingOrOffset, length) |
|
} |
|
|
|
// Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97 |
|
if (typeof Symbol !== 'undefined' && Symbol.species && |
|
Buffer[Symbol.species] === Buffer) { |
|
Object.defineProperty(Buffer, Symbol.species, { |
|
value: null, |
|
configurable: true, |
|
enumerable: false, |
|
writable: false |
|
}) |
|
} |
|
|
|
Buffer.poolSize = 8192 // not used by this implementation |
|
|
|
function from (value, encodingOrOffset, length) { |
|
if (typeof value === 'number') { |
|
throw new TypeError('"value" argument must not be a number') |
|
} |
|
|
|
if (value instanceof ArrayBuffer) { |
|
return fromArrayBuffer(value, encodingOrOffset, length) |
|
} |
|
|
|
if (typeof value === 'string') { |
|
return fromString(value, encodingOrOffset) |
|
} |
|
|
|
return fromObject(value) |
|
} |
|
|
|
/** |
|
* Functionally equivalent to Buffer(arg, encoding) but throws a TypeError |
|
* if value is a number. |
|
* Buffer.from(str[, encoding]) |
|
* Buffer.from(array) |
|
* Buffer.from(buffer) |
|
* Buffer.from(arrayBuffer[, byteOffset[, length]]) |
|
**/ |
|
Buffer.from = function (value, encodingOrOffset, length) { |
|
return from(value, encodingOrOffset, length) |
|
} |
|
|
|
// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug: |
|
// https://github.com/feross/buffer/pull/148 |
|
Buffer.prototype.__proto__ = Uint8Array.prototype |
|
Buffer.__proto__ = Uint8Array |
|
|
|
function assertSize (size) { |
|
if (typeof size !== 'number') { |
|
throw new TypeError('"size" argument must be a number') |
|
} else if (size < 0) { |
|
throw new RangeError('"size" argument must not be negative') |
|
} |
|
} |
|
|
|
function alloc (size, fill, encoding) { |
|
assertSize(size) |
|
if (size <= 0) { |
|
return createBuffer(size) |
|
} |
|
if (fill !== undefined) { |
|
// Only pay attention to encoding if it's a string. This |
|
// prevents accidentally sending in a number that would |
|
// be interpretted as a start offset. |
|
return typeof encoding === 'string' |
|
? createBuffer(size).fill(fill, encoding) |
|
: createBuffer(size).fill(fill) |
|
} |
|
return createBuffer(size) |
|
} |
|
|
|
/** |
|
* Creates a new filled Buffer instance. |
|
* alloc(size[, fill[, encoding]]) |
|
**/ |
|
Buffer.alloc = function (size, fill, encoding) { |
|
return alloc(size, fill, encoding) |
|
} |
|
|
|
function allocUnsafe (size) { |
|
assertSize(size) |
|
return createBuffer(size < 0 ? 0 : checked(size) | 0) |
|
} |
|
|
|
/** |
|
* Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance. |
|
* */ |
|
Buffer.allocUnsafe = function (size) { |
|
return allocUnsafe(size) |
|
} |
|
/** |
|
* Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance. |
|
*/ |
|
Buffer.allocUnsafeSlow = function (size) { |
|
return allocUnsafe(size) |
|
} |
|
|
|
function fromString (string, encoding) { |
|
if (typeof encoding !== 'string' || encoding === '') { |
|
encoding = 'utf8' |
|
} |
|
|
|
if (!Buffer.isEncoding(encoding)) { |
|
throw new TypeError('"encoding" must be a valid string encoding') |
|
} |
|
|
|
var length = byteLength(string, encoding) | 0 |
|
var buf = createBuffer(length) |
|
|
|
var actual = buf.write(string, encoding) |
|
|
|
if (actual !== length) { |
|
// Writing a hex string, for example, that contains invalid characters will |
|
// cause everything after the first invalid character to be ignored. (e.g. |
|
// 'abxxcd' will be treated as 'ab') |
|
buf = buf.slice(0, actual) |
|
} |
|
|
|
return buf |
|
} |
|
|
|
function fromArrayLike (array) { |
|
var length = array.length < 0 ? 0 : checked(array.length) | 0 |
|
var buf = createBuffer(length) |
|
for (var i = 0; i < length; i += 1) { |
|
buf[i] = array[i] & 255 |
|
} |
|
return buf |
|
} |
|
|
|
function fromArrayBuffer (array, byteOffset, length) { |
|
if (byteOffset < 0 || array.byteLength < byteOffset) { |
|
throw new RangeError('\'offset\' is out of bounds') |
|
} |
|
|
|
if (array.byteLength < byteOffset + (length || 0)) { |
|
throw new RangeError('\'length\' is out of bounds') |
|
} |
|
|
|
var buf |
|
if (byteOffset === undefined && length === undefined) { |
|
buf = new Uint8Array(array) |
|
} else if (length === undefined) { |
|
buf = new Uint8Array(array, byteOffset) |
|
} else { |
|
buf = new Uint8Array(array, byteOffset, length) |
|
} |
|
|
|
// Return an augmented `Uint8Array` instance |
|
buf.__proto__ = Buffer.prototype |
|
return buf |
|
} |
|
|
|
function fromObject (obj) { |
|
if (Buffer.isBuffer(obj)) { |
|
var len = checked(obj.length) | 0 |
|
var buf = createBuffer(len) |
|
|
|
if (buf.length === 0) { |
|
return buf |
|
} |
|
|
|
obj.copy(buf, 0, 0, len) |
|
return buf |
|
} |
|
|
|
if (obj) { |
|
if (isArrayBufferView(obj) || 'length' in obj) { |
|
if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) { |
|
return createBuffer(0) |
|
} |
|
return fromArrayLike(obj) |
|
} |
|
|
|
if (obj.type === 'Buffer' && Array.isArray(obj.data)) { |
|
return fromArrayLike(obj.data) |
|
} |
|
} |
|
|
|
throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.') |
|
} |
|
|
|
function checked (length) { |
|
// Note: cannot use `length < K_MAX_LENGTH` here because that fails when |
|
// length is NaN (which is otherwise coerced to zero.) |
|
if (length >= K_MAX_LENGTH) { |
|
throw new RangeError('Attempt to allocate Buffer larger than maximum ' + |
|
'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes') |
|
} |
|
return length | 0 |
|
} |
|
|
|
function SlowBuffer (length) { |
|
if (+length != length) { // eslint-disable-line eqeqeq |
|
length = 0 |
|
} |
|
return Buffer.alloc(+length) |
|
} |
|
|
|
Buffer.isBuffer = function isBuffer (b) { |
|
return b != null && b._isBuffer === true |
|
} |
|
|
|
Buffer.compare = function compare (a, b) { |
|
if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) { |
|
throw new TypeError('Arguments must be Buffers') |
|
} |
|
|
|
if (a === b) return 0 |
|
|
|
var x = a.length |
|
var y = b.length |
|
|
|
for (var i = 0, len = Math.min(x, y); i < len; ++i) { |
|
if (a[i] !== b[i]) { |
|
x = a[i] |
|
y = b[i] |
|
break |
|
} |
|
} |
|
|
|
if (x < y) return -1 |
|
if (y < x) return 1 |
|
return 0 |
|
} |
|
|
|
Buffer.isEncoding = function isEncoding (encoding) { |
|
switch (String(encoding).toLowerCase()) { |
|
case 'hex': |
|
case 'utf8': |
|
case 'utf-8': |
|
case 'ascii': |
|
case 'latin1': |
|
case 'binary': |
|
case 'base64': |
|
case 'ucs2': |
|
case 'ucs-2': |
|
case 'utf16le': |
|
case 'utf-16le': |
|
return true |
|
default: |
|
return false |
|
} |
|
} |
|
|
|
Buffer.concat = function concat (list, length) { |
|
if (!Array.isArray(list)) { |
|
throw new TypeError('"list" argument must be an Array of Buffers') |
|
} |
|
|
|
if (list.length === 0) { |
|
return Buffer.alloc(0) |
|
} |
|
|
|
var i |
|
if (length === undefined) { |
|
length = 0 |
|
for (i = 0; i < list.length; ++i) { |
|
length += list[i].length |
|
} |
|
} |
|
|
|
var buffer = Buffer.allocUnsafe(length) |
|
var pos = 0 |
|
for (i = 0; i < list.length; ++i) { |
|
var buf = list[i] |
|
if (!Buffer.isBuffer(buf)) { |
|
throw new TypeError('"list" argument must be an Array of Buffers') |
|
} |
|
buf.copy(buffer, pos) |
|
pos += buf.length |
|
} |
|
return buffer |
|
} |
|
|
|
function byteLength (string, encoding) { |
|
if (Buffer.isBuffer(string)) { |
|
return string.length |
|
} |
|
if (isArrayBufferView(string) || string instanceof ArrayBuffer) { |
|
return string.byteLength |
|
} |
|
if (typeof string !== 'string') { |
|
string = '' + string |
|
} |
|
|
|
var len = string.length |
|
if (len === 0) return 0 |
|
|
|
// Use a for loop to avoid recursion |
|
var loweredCase = false |
|
for (;;) { |
|
switch (encoding) { |
|
case 'ascii': |
|
case 'latin1': |
|
case 'binary': |
|
return len |
|
case 'utf8': |
|
case 'utf-8': |
|
case undefined: |
|
return utf8ToBytes(string).length |
|
case 'ucs2': |
|
case 'ucs-2': |
|
case 'utf16le': |
|
case 'utf-16le': |
|
return len * 2 |
|
case 'hex': |
|
return len >>> 1 |
|
case 'base64': |
|
return base64ToBytes(string).length |
|
default: |
|
if (loweredCase) return utf8ToBytes(string).length // assume utf8 |
|
encoding = ('' + encoding).toLowerCase() |
|
loweredCase = true |
|
} |
|
} |
|
} |
|
Buffer.byteLength = byteLength |
|
|
|
function slowToString (encoding, start, end) { |
|
var loweredCase = false |
|
|
|
// No need to verify that "this.length <= MAX_UINT32" since it's a read-only |
|
// property of a typed array. |
|
|
|
// This behaves neither like String nor Uint8Array in that we set start/end |
|
// to their upper/lower bounds if the value passed is out of range. |
|
// undefined is handled specially as per ECMA-262 6th Edition, |
|
// Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization. |
|
if (start === undefined || start < 0) { |
|
start = 0 |
|
} |
|
// Return early if start > this.length. Done here to prevent potential uint32 |
|
// coercion fail below. |
|
if (start > this.length) { |
|
return '' |
|
} |
|
|
|
if (end === undefined || end > this.length) { |
|
end = this.length |
|
} |
|
|
|
if (end <= 0) { |
|
return '' |
|
} |
|
|
|
// Force coersion to uint32. This will also coerce falsey/NaN values to 0. |
|
end >>>= 0 |
|
start >>>= 0 |
|
|
|
if (end <= start) { |
|
return '' |
|
} |
|
|
|
if (!encoding) encoding = 'utf8' |
|
|
|
while (true) { |
|
switch (encoding) { |
|
case 'hex': |
|
return hexSlice(this, start, end) |
|
|
|
case 'utf8': |
|
case 'utf-8': |
|
return utf8Slice(this, start, end) |
|
|
|
case 'ascii': |
|
return asciiSlice(this, start, end) |
|
|
|
case 'latin1': |
|
case 'binary': |
|
return latin1Slice(this, start, end) |
|
|
|
case 'base64': |
|
return base64Slice(this, start, end) |
|
|
|
case 'ucs2': |
|
case 'ucs-2': |
|
case 'utf16le': |
|
case 'utf-16le': |
|
return utf16leSlice(this, start, end) |
|
|
|
default: |
|
if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) |
|
encoding = (encoding + '').toLowerCase() |
|
loweredCase = true |
|
} |
|
} |
|
} |
|
|
|
// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package) |
|
// to detect a Buffer instance. It's not possible to use `instanceof Buffer` |
|
// reliably in a browserify context because there could be multiple different |
|
// copies of the 'buffer' package in use. This method works even for Buffer |
|
// instances that were created from another copy of the `buffer` package. |
|
// See: https://github.com/feross/buffer/issues/154 |
|
Buffer.prototype._isBuffer = true |
|
|
|
function swap (b, n, m) { |
|
var i = b[n] |
|
b[n] = b[m] |
|
b[m] = i |
|
} |
|
|
|
Buffer.prototype.swap16 = function swap16 () { |
|
var len = this.length |
|
if (len % 2 !== 0) { |
|
throw new RangeError('Buffer size must be a multiple of 16-bits') |
|
} |
|
for (var i = 0; i < len; i += 2) { |
|
swap(this, i, i + 1) |
|
} |
|
return this |
|
} |
|
|
|
Buffer.prototype.swap32 = function swap32 () { |
|
var len = this.length |
|
if (len % 4 !== 0) { |
|
throw new RangeError('Buffer size must be a multiple of 32-bits') |
|
} |
|
for (var i = 0; i < len; i += 4) { |
|
swap(this, i, i + 3) |
|
swap(this, i + 1, i + 2) |
|
} |
|
return this |
|
} |
|
|
|
Buffer.prototype.swap64 = function swap64 () { |
|
var len = this.length |
|
if (len % 8 !== 0) { |
|
throw new RangeError('Buffer size must be a multiple of 64-bits') |
|
} |
|
for (var i = 0; i < len; i += 8) { |
|
swap(this, i, i + 7) |
|
swap(this, i + 1, i + 6) |
|
swap(this, i + 2, i + 5) |
|
swap(this, i + 3, i + 4) |
|
} |
|
return this |
|
} |
|
|
|
Buffer.prototype.toString = function toString () { |
|
var length = this.length |
|
if (length === 0) return '' |
|
if (arguments.length === 0) return utf8Slice(this, 0, length) |
|
return slowToString.apply(this, arguments) |
|
} |
|
|
|
Buffer.prototype.equals = function equals (b) { |
|
if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') |
|
if (this === b) return true |
|
return Buffer.compare(this, b) === 0 |
|
} |
|
|
|
Buffer.prototype.inspect = function inspect () { |
|
var str = '' |
|
var max = exports.INSPECT_MAX_BYTES |
|
if (this.length > 0) { |
|
str = this.toString('hex', 0, max).match(/.{2}/g).join(' ') |
|
if (this.length > max) str += ' ... ' |
|
} |
|
return '<Buffer ' + str + '>' |
|
} |
|
|
|
Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) { |
|
if (!Buffer.isBuffer(target)) { |
|
throw new TypeError('Argument must be a Buffer') |
|
} |
|
|
|
if (start === undefined) { |
|
start = 0 |
|
} |
|
if (end === undefined) { |
|
end = target ? target.length : 0 |
|
} |
|
if (thisStart === undefined) { |
|
thisStart = 0 |
|
} |
|
if (thisEnd === undefined) { |
|
thisEnd = this.length |
|
} |
|
|
|
if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) { |
|
throw new RangeError('out of range index') |
|
} |
|
|
|
if (thisStart >= thisEnd && start >= end) { |
|
return 0 |
|
} |
|
if (thisStart >= thisEnd) { |
|
return -1 |
|
} |
|
if (start >= end) { |
|
return 1 |
|
} |
|
|
|
start >>>= 0 |
|
end >>>= 0 |
|
thisStart >>>= 0 |
|
thisEnd >>>= 0 |
|
|
|
if (this === target) return 0 |
|
|
|
var x = thisEnd - thisStart |
|
var y = end - start |
|
var len = Math.min(x, y) |
|
|
|
var thisCopy = this.slice(thisStart, thisEnd) |
|
var targetCopy = target.slice(start, end) |
|
|
|
for (var i = 0; i < len; ++i) { |
|
if (thisCopy[i] !== targetCopy[i]) { |
|
x = thisCopy[i] |
|
y = targetCopy[i] |
|
break |
|
} |
|
} |
|
|
|
if (x < y) return -1 |
|
if (y < x) return 1 |
|
return 0 |
|
} |
|
|
|
// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`, |
|
// OR the last index of `val` in `buffer` at offset <= `byteOffset`. |
|
// |
|
// Arguments: |
|
// - buffer - a Buffer to search |
|
// - val - a string, Buffer, or number |
|
// - byteOffset - an index into `buffer`; will be clamped to an int32 |
|
// - encoding - an optional encoding, relevant is val is a string |
|
// - dir - true for indexOf, false for lastIndexOf |
|
function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) { |
|
// Empty buffer means no match |
|
if (buffer.length === 0) return -1 |
|
|
|
// Normalize byteOffset |
|
if (typeof byteOffset === 'string') { |
|
encoding = byteOffset |
|
byteOffset = 0 |
|
} else if (byteOffset > 0x7fffffff) { |
|
byteOffset = 0x7fffffff |
|
} else if (byteOffset < -0x80000000) { |
|
byteOffset = -0x80000000 |
|
} |
|
byteOffset = +byteOffset // Coerce to Number. |
|
if (numberIsNaN(byteOffset)) { |
|
// byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer |
|
byteOffset = dir ? 0 : (buffer.length - 1) |
|
} |
|
|
|
// Normalize byteOffset: negative offsets start from the end of the buffer |
|
if (byteOffset < 0) byteOffset = buffer.length + byteOffset |
|
if (byteOffset >= buffer.length) { |
|
if (dir) return -1 |
|
else byteOffset = buffer.length - 1 |
|
} else if (byteOffset < 0) { |
|
if (dir) byteOffset = 0 |
|
else return -1 |
|
} |
|
|
|
// Normalize val |
|
if (typeof val === 'string') { |
|
val = Buffer.from(val, encoding) |
|
} |
|
|
|
// Finally, search either indexOf (if dir is true) or lastIndexOf |
|
if (Buffer.isBuffer(val)) { |
|
// Special case: looking for empty string/buffer always fails |
|
if (val.length === 0) { |
|
return -1 |
|
} |
|
return arrayIndexOf(buffer, val, byteOffset, encoding, dir) |
|
} else if (typeof val === 'number') { |
|
val = val & 0xFF // Search for a byte value [0-255] |
|
if (typeof Uint8Array.prototype.indexOf === 'function') { |
|
if (dir) { |
|
return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset) |
|
} else { |
|
return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset) |
|
} |
|
} |
|
return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir) |
|
} |
|
|
|
throw new TypeError('val must be string, number or Buffer') |
|
} |
|
|
|
function arrayIndexOf (arr, val, byteOffset, encoding, dir) { |
|
var indexSize = 1 |
|
var arrLength = arr.length |
|
var valLength = val.length |
|
|
|
if (encoding !== undefined) { |
|
encoding = String(encoding).toLowerCase() |
|
if (encoding === 'ucs2' || encoding === 'ucs-2' || |
|
encoding === 'utf16le' || encoding === 'utf-16le') { |
|
if (arr.length < 2 || val.length < 2) { |
|
return -1 |
|
} |
|
indexSize = 2 |
|
arrLength /= 2 |
|
valLength /= 2 |
|
byteOffset /= 2 |
|
} |
|
} |
|
|
|
function read (buf, i) { |
|
if (indexSize === 1) { |
|
return buf[i] |
|
} else { |
|
return buf.readUInt16BE(i * indexSize) |
|
} |
|
} |
|
|
|
var i |
|
if (dir) { |
|
var foundIndex = -1 |
|
for (i = byteOffset; i < arrLength; i++) { |
|
if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) { |
|
if (foundIndex === -1) foundIndex = i |
|
if (i - foundIndex + 1 === valLength) return foundIndex * indexSize |
|
} else { |
|
if (foundIndex !== -1) i -= i - foundIndex |
|
foundIndex = -1 |
|
} |
|
} |
|
} else { |
|
if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength |
|
for (i = byteOffset; i >= 0; i--) { |
|
var found = true |
|
for (var j = 0; j < valLength; j++) { |
|
if (read(arr, i + j) !== read(val, j)) { |
|
found = false |
|
break |
|
} |
|
} |
|
if (found) return i |
|
} |
|
} |
|
|
|
return -1 |
|
} |
|
|
|
Buffer.prototype.includes = function includes (val, byteOffset, encoding) { |
|
return this.indexOf(val, byteOffset, encoding) !== -1 |
|
} |
|
|
|
Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) { |
|
return bidirectionalIndexOf(this, val, byteOffset, encoding, true) |
|
} |
|
|
|
Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) { |
|
return bidirectionalIndexOf(this, val, byteOffset, encoding, false) |
|
} |
|
|
|
function hexWrite (buf, string, offset, length) { |
|
offset = Number(offset) || 0 |
|
var remaining = buf.length - offset |
|
if (!length) { |
|
length = remaining |
|
} else { |
|
length = Number(length) |
|
if (length > remaining) { |
|
length = remaining |
|
} |
|
} |
|
|
|
// must be an even number of digits |
|
var strLen = string.length |
|
if (strLen % 2 !== 0) throw new TypeError('Invalid hex string') |
|
|
|
if (length > strLen / 2) { |
|
length = strLen / 2 |
|
} |
|
for (var i = 0; i < length; ++i) { |
|
var parsed = parseInt(string.substr(i * 2, 2), 16) |
|
if (numberIsNaN(parsed)) return i |
|
buf[offset + i] = parsed |
|
} |
|
return i |
|
} |
|
|
|
function utf8Write (buf, string, offset, length) { |
|
return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length) |
|
} |
|
|
|
function asciiWrite (buf, string, offset, length) { |
|
return blitBuffer(asciiToBytes(string), buf, offset, length) |
|
} |
|
|
|
function latin1Write (buf, string, offset, length) { |
|
return asciiWrite(buf, string, offset, length) |
|
} |
|
|
|
function base64Write (buf, string, offset, length) { |
|
return blitBuffer(base64ToBytes(string), buf, offset, length) |
|
} |
|
|
|
function ucs2Write (buf, string, offset, length) { |
|
return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length) |
|
} |
|
|
|
Buffer.prototype.write = function write (string, offset, length, encoding) { |
|
// Buffer#write(string) |
|
if (offset === undefined) { |
|
encoding = 'utf8' |
|
length = this.length |
|
offset = 0 |
|
// Buffer#write(string, encoding) |
|
} else if (length === undefined && typeof offset === 'string') { |
|
encoding = offset |
|
length = this.length |
|
offset = 0 |
|
// Buffer#write(string, offset[, length][, encoding]) |
|
} else if (isFinite(offset)) { |
|
offset = offset >>> 0 |
|
if (isFinite(length)) { |
|
length = length >>> 0 |
|
if (encoding === undefined) encoding = 'utf8' |
|
} else { |
|
encoding = length |
|
length = undefined |
|
} |
|
} else { |
|
throw new Error( |
|
'Buffer.write(string, encoding, offset[, length]) is no longer supported' |
|
) |
|
} |
|
|
|
var remaining = this.length - offset |
|
if (length === undefined || length > remaining) length = remaining |
|
|
|
if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) { |
|
throw new RangeError('Attempt to write outside buffer bounds') |
|
} |
|
|
|
if (!encoding) encoding = 'utf8' |
|
|
|
var loweredCase = false |
|
for (;;) { |
|
switch (encoding) { |
|
case 'hex': |
|
return hexWrite(this, string, offset, length) |
|
|
|
case 'utf8': |
|
case 'utf-8': |
|
return utf8Write(this, string, offset, length) |
|
|
|
case 'ascii': |
|
return asciiWrite(this, string, offset, length) |
|
|
|
case 'latin1': |
|
case 'binary': |
|
return latin1Write(this, string, offset, length) |
|
|
|
case 'base64': |
|
// Warning: maxLength not taken into account in base64Write |
|
return base64Write(this, string, offset, length) |
|
|
|
case 'ucs2': |
|
case 'ucs-2': |
|
case 'utf16le': |
|
case 'utf-16le': |
|
return ucs2Write(this, string, offset, length) |
|
|
|
default: |
|
if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) |
|
encoding = ('' + encoding).toLowerCase() |
|
loweredCase = true |
|
} |
|
} |
|
} |
|
|
|
Buffer.prototype.toJSON = function toJSON () { |
|
return { |
|
type: 'Buffer', |
|
data: Array.prototype.slice.call(this._arr || this, 0) |
|
} |
|
} |
|
|
|
function base64Slice (buf, start, end) { |
|
if (start === 0 && end === buf.length) { |
|
return base64.fromByteArray(buf) |
|
} else { |
|
return base64.fromByteArray(buf.slice(start, end)) |
|
} |
|
} |
|
|
|
function utf8Slice (buf, start, end) { |
|
end = Math.min(buf.length, end) |
|
var res = [] |
|
|
|
var i = start |
|
while (i < end) { |
|
var firstByte = buf[i] |
|
var codePoint = null |
|
var bytesPerSequence = (firstByte > 0xEF) ? 4 |
|
: (firstByte > 0xDF) ? 3 |
|
: (firstByte > 0xBF) ? 2 |
|
: 1 |
|
|
|
if (i + bytesPerSequence <= end) { |
|
var secondByte, thirdByte, fourthByte, tempCodePoint |
|
|
|
switch (bytesPerSequence) { |
|
case 1: |
|
if (firstByte < 0x80) { |
|
codePoint = firstByte |
|
} |
|
break |
|
case 2: |
|
secondByte = buf[i + 1] |
|
if ((secondByte & 0xC0) === 0x80) { |
|
tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F) |
|
if (tempCodePoint > 0x7F) { |
|
codePoint = tempCodePoint |
|
} |
|
} |
|
break |
|
case 3: |
|
secondByte = buf[i + 1] |
|
thirdByte = buf[i + 2] |
|
if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) { |
|
tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F) |
|
if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) { |
|
codePoint = tempCodePoint |
|
} |
|
} |
|
break |
|
case 4: |
|
secondByte = buf[i + 1] |
|
thirdByte = buf[i + 2] |
|
fourthByte = buf[i + 3] |
|
if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) { |
|
tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F) |
|
if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) { |
|
codePoint = tempCodePoint |
|
} |
|
} |
|
} |
|
} |
|
|
|
if (codePoint === null) { |
|
// we did not generate a valid codePoint so insert a |
|
// replacement char (U+FFFD) and advance only 1 byte |
|
codePoint = 0xFFFD |
|
bytesPerSequence = 1 |
|
} else if (codePoint > 0xFFFF) { |
|
// encode to utf16 (surrogate pair dance) |
|
codePoint -= 0x10000 |
|
res.push(codePoint >>> 10 & 0x3FF | 0xD800) |
|
codePoint = 0xDC00 | codePoint & 0x3FF |
|
} |
|
|
|
res.push(codePoint) |
|
i += bytesPerSequence |
|
} |
|
|
|
return decodeCodePointsArray(res) |
|
} |
|
|
|
// Based on http://stackoverflow.com/a/22747272/680742, the browser with |
|
// the lowest limit is Chrome, with 0x10000 args. |
|
// We go 1 magnitude less, for safety |
|
var MAX_ARGUMENTS_LENGTH = 0x1000 |
|
|
|
function decodeCodePointsArray (codePoints) { |
|
var len = codePoints.length |
|
if (len <= MAX_ARGUMENTS_LENGTH) { |
|
return String.fromCharCode.apply(String, codePoints) // avoid extra slice() |
|
} |
|
|
|
// Decode in chunks to avoid "call stack size exceeded". |
|
var res = '' |
|
var i = 0 |
|
while (i < len) { |
|
res += String.fromCharCode.apply( |
|
String, |
|
codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH) |
|
) |
|
} |
|
return res |
|
} |
|
|
|
function asciiSlice (buf, start, end) { |
|
var ret = '' |
|
end = Math.min(buf.length, end) |
|
|
|
for (var i = start; i < end; ++i) { |
|
ret += String.fromCharCode(buf[i] & 0x7F) |
|
} |
|
return ret |
|
} |
|
|
|
function latin1Slice (buf, start, end) { |
|
var ret = '' |
|
end = Math.min(buf.length, end) |
|
|
|
for (var i = start; i < end; ++i) { |
|
ret += String.fromCharCode(buf[i]) |
|
} |
|
return ret |
|
} |
|
|
|
function hexSlice (buf, start, end) { |
|
var len = buf.length |
|
|
|
if (!start || start < 0) start = 0 |
|
if (!end || end < 0 || end > len) end = len |
|
|
|
var out = '' |
|
for (var i = start; i < end; ++i) { |
|
out += toHex(buf[i]) |
|
} |
|
return out |
|
} |
|
|
|
function utf16leSlice (buf, start, end) { |
|
var bytes = buf.slice(start, end) |
|
var res = '' |
|
for (var i = 0; i < bytes.length; i += 2) { |
|
res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256)) |
|
} |
|
return res |
|
} |
|
|
|
Buffer.prototype.slice = function slice (start, end) { |
|
var len = this.length |
|
start = ~~start |
|
end = end === undefined ? len : ~~end |
|
|
|
if (start < 0) { |
|
start += len |
|
if (start < 0) start = 0 |
|
} else if (start > len) { |
|
start = len |
|
} |
|
|
|
if (end < 0) { |
|
end += len |
|
if (end < 0) end = 0 |
|
} else if (end > len) { |
|
end = len |
|
} |
|
|
|
if (end < start) end = start |
|
|
|
var newBuf = this.subarray(start, end) |
|
// Return an augmented `Uint8Array` instance |
|
newBuf.__proto__ = Buffer.prototype |
|
return newBuf |
|
} |
|
|
|
/* |
|
* Need to make sure that buffer isn't trying to write out of bounds. |
|
*/ |
|
function checkOffset (offset, ext, length) { |
|
if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint') |
|
if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length') |
|
} |
|
|
|
Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) { |
|
offset = offset >>> 0 |
|
byteLength = byteLength >>> 0 |
|
if (!noAssert) checkOffset(offset, byteLength, this.length) |
|
|
|
var val = this[offset] |
|
var mul = 1 |
|
var i = 0 |
|
while (++i < byteLength && (mul *= 0x100)) { |
|
val += this[offset + i] * mul |
|
} |
|
|
|
return val |
|
} |
|
|
|
Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) { |
|
offset = offset >>> 0 |
|
byteLength = byteLength >>> 0 |
|
if (!noAssert) { |
|
checkOffset(offset, byteLength, this.length) |
|
} |
|
|
|
var val = this[offset + --byteLength] |
|
var mul = 1 |
|
while (byteLength > 0 && (mul *= 0x100)) { |
|
val += this[offset + --byteLength] * mul |
|
} |
|
|
|
return val |
|
} |
|
|
|
Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) { |
|
offset = offset >>> 0 |
|
if (!noAssert) checkOffset(offset, 1, this.length) |
|
return this[offset] |
|
} |
|
|
|
Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) { |
|
offset = offset >>> 0 |
|
if (!noAssert) checkOffset(offset, 2, this.length) |
|
return this[offset] | (this[offset + 1] << 8) |
|
} |
|
|
|
Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) { |
|
offset = offset >>> 0 |
|
if (!noAssert) checkOffset(offset, 2, this.length) |
|
return (this[offset] << 8) | this[offset + 1] |
|
} |
|
|
|
Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) { |
|
offset = offset >>> 0 |
|
if (!noAssert) checkOffset(offset, 4, this.length) |
|
|
|
return ((this[offset]) | |
|
(this[offset + 1] << 8) | |
|
(this[offset + 2] << 16)) + |
|
(this[offset + 3] * 0x1000000) |
|
} |
|
|
|
Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) { |
|
offset = offset >>> 0 |
|
if (!noAssert) checkOffset(offset, 4, this.length) |
|
|
|
return (this[offset] * 0x1000000) + |
|
((this[offset + 1] << 16) | |
|
(this[offset + 2] << 8) | |
|
this[offset + 3]) |
|
} |
|
|
|
Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) { |
|
offset = offset >>> 0 |
|
byteLength = byteLength >>> 0 |
|
if (!noAssert) checkOffset(offset, byteLength, this.length) |
|
|
|
var val = this[offset] |
|
var mul = 1 |
|
var i = 0 |
|
while (++i < byteLength && (mul *= 0x100)) { |
|
val += this[offset + i] * mul |
|
} |
|
mul *= 0x80 |
|
|
|
if (val >= mul) val -= Math.pow(2, 8 * byteLength) |
|
|
|
return val |
|
} |
|
|
|
Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) { |
|
offset = offset >>> 0 |
|
byteLength = byteLength >>> 0 |
|
if (!noAssert) checkOffset(offset, byteLength, this.length) |
|
|
|
var i = byteLength |
|
var mul = 1 |
|
var val = this[offset + --i] |
|
while (i > 0 && (mul *= 0x100)) { |
|
val += this[offset + --i] * mul |
|
} |
|
mul *= 0x80 |
|
|
|
if (val >= mul) val -= Math.pow(2, 8 * byteLength) |
|
|
|
return val |
|
} |
|
|
|
Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) { |
|
offset = offset >>> 0 |
|
if (!noAssert) checkOffset(offset, 1, this.length) |
|
if (!(this[offset] & 0x80)) return (this[offset]) |
|
return ((0xff - this[offset] + 1) * -1) |
|
} |
|
|
|
Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) { |
|
offset = offset >>> 0 |
|
if (!noAssert) checkOffset(offset, 2, this.length) |
|
var val = this[offset] | (this[offset + 1] << 8) |
|
return (val & 0x8000) ? val | 0xFFFF0000 : val |
|
} |
|
|
|
Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) { |
|
offset = offset >>> 0 |
|
if (!noAssert) checkOffset(offset, 2, this.length) |
|
var val = this[offset + 1] | (this[offset] << 8) |
|
return (val & 0x8000) ? val | 0xFFFF0000 : val |
|
} |
|
|
|
Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) { |
|
offset = offset >>> 0 |
|
if (!noAssert) checkOffset(offset, 4, this.length) |
|
|
|
return (this[offset]) | |
|
(this[offset + 1] << 8) | |
|
(this[offset + 2] << 16) | |
|
(this[offset + 3] << 24) |
|
} |
|
|
|
Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) { |
|
offset = offset >>> 0 |
|
if (!noAssert) checkOffset(offset, 4, this.length) |
|
|
|
return (this[offset] << 24) | |
|
(this[offset + 1] << 16) | |
|
(this[offset + 2] << 8) | |
|
(this[offset + 3]) |
|
} |
|
|
|
Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) { |
|
offset = offset >>> 0 |
|
if (!noAssert) checkOffset(offset, 4, this.length) |
|
return ieee754.read(this, offset, true, 23, 4) |
|
} |
|
|
|
Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) { |
|
offset = offset >>> 0 |
|
if (!noAssert) checkOffset(offset, 4, this.length) |
|
return ieee754.read(this, offset, false, 23, 4) |
|
} |
|
|
|
Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) { |
|
offset = offset >>> 0 |
|
if (!noAssert) checkOffset(offset, 8, this.length) |
|
return ieee754.read(this, offset, true, 52, 8) |
|
} |
|
|
|
Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) { |
|
offset = offset >>> 0 |
|
if (!noAssert) checkOffset(offset, 8, this.length) |
|
return ieee754.read(this, offset, false, 52, 8) |
|
} |
|
|
|
function checkInt (buf, value, offset, ext, max, min) { |
|
if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance') |
|
if (value > max || value < min) throw new RangeError('"value" argument is out of bounds') |
|
if (offset + ext > buf.length) throw new RangeError('Index out of range') |
|
} |
|
|
|
Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) { |
|
value = +value |
|
offset = offset >>> 0 |
|
byteLength = byteLength >>> 0 |
|
if (!noAssert) { |
|
var maxBytes = Math.pow(2, 8 * byteLength) - 1 |
|
checkInt(this, value, offset, byteLength, maxBytes, 0) |
|
} |
|
|
|
var mul = 1 |
|
var i = 0 |
|
this[offset] = value & 0xFF |
|
while (++i < byteLength && (mul *= 0x100)) { |
|
this[offset + i] = (value / mul) & 0xFF |
|
} |
|
|
|
return offset + byteLength |
|
} |
|
|
|
Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) { |
|
value = +value |
|
offset = offset >>> 0 |
|
byteLength = byteLength >>> 0 |
|
if (!noAssert) { |
|
var maxBytes = Math.pow(2, 8 * byteLength) - 1 |
|
checkInt(this, value, offset, byteLength, maxBytes, 0) |
|
} |
|
|
|
var i = byteLength - 1 |
|
var mul = 1 |
|
this[offset + i] = value & 0xFF |
|
while (--i >= 0 && (mul *= 0x100)) { |
|
this[offset + i] = (value / mul) & 0xFF |
|
} |
|
|
|
return offset + byteLength |
|
} |
|
|
|
Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) { |
|
value = +value |
|
offset = offset >>> 0 |
|
if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0) |
|
this[offset] = (value & 0xff) |
|
return offset + 1 |
|
} |
|
|
|
Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) { |
|
value = +value |
|
offset = offset >>> 0 |
|
if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) |
|
this[offset] = (value & 0xff) |
|
this[offset + 1] = (value >>> 8) |
|
return offset + 2 |
|
} |
|
|
|
Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) { |
|
value = +value |
|
offset = offset >>> 0 |
|
if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) |
|
this[offset] = (value >>> 8) |
|
this[offset + 1] = (value & 0xff) |
|
return offset + 2 |
|
} |
|
|
|
Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) { |
|
value = +value |
|
offset = offset >>> 0 |
|
if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) |
|
this[offset + 3] = (value >>> 24) |
|
this[offset + 2] = (value >>> 16) |
|
this[offset + 1] = (value >>> 8) |
|
this[offset] = (value & 0xff) |
|
return offset + 4 |
|
} |
|
|
|
Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) { |
|
value = +value |
|
offset = offset >>> 0 |
|
if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) |
|
this[offset] = (value >>> 24) |
|
this[offset + 1] = (value >>> 16) |
|
this[offset + 2] = (value >>> 8) |
|
this[offset + 3] = (value & 0xff) |
|
return offset + 4 |
|
} |
|
|
|
Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) { |
|
value = +value |
|
offset = offset >>> 0 |
|
if (!noAssert) { |
|
var limit = Math.pow(2, (8 * byteLength) - 1) |
|
|
|
checkInt(this, value, offset, byteLength, limit - 1, -limit) |
|
} |
|
|
|
var i = 0 |
|
var mul = 1 |
|
var sub = 0 |
|
this[offset] = value & 0xFF |
|
while (++i < byteLength && (mul *= 0x100)) { |
|
if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) { |
|
sub = 1 |
|
} |
|
this[offset + i] = ((value / mul) >> 0) - sub & 0xFF |
|
} |
|
|
|
return offset + byteLength |
|
} |
|
|
|
Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) { |
|
value = +value |
|
offset = offset >>> 0 |
|
if (!noAssert) { |
|
var limit = Math.pow(2, (8 * byteLength) - 1) |
|
|
|
checkInt(this, value, offset, byteLength, limit - 1, -limit) |
|
} |
|
|
|
var i = byteLength - 1 |
|
var mul = 1 |
|
var sub = 0 |
|
this[offset + i] = value & 0xFF |
|
while (--i >= 0 && (mul *= 0x100)) { |
|
if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) { |
|
sub = 1 |
|
} |
|
this[offset + i] = ((value / mul) >> 0) - sub & 0xFF |
|
} |
|
|
|
return offset + byteLength |
|
} |
|
|
|
Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) { |
|
value = +value |
|
offset = offset >>> 0 |
|
if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80) |
|
if (value < 0) value = 0xff + value + 1 |
|
this[offset] = (value & 0xff) |
|
return offset + 1 |
|
} |
|
|
|
Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) { |
|
value = +value |
|
offset = offset >>> 0 |
|
if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) |
|
this[offset] = (value & 0xff) |
|
this[offset + 1] = (value >>> 8) |
|
return offset + 2 |
|
} |
|
|
|
Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) { |
|
value = +value |
|
offset = offset >>> 0 |
|
if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) |
|
this[offset] = (value >>> 8) |
|
this[offset + 1] = (value & 0xff) |
|
return offset + 2 |
|
} |
|
|
|
Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) { |
|
value = +value |
|
offset = offset >>> 0 |
|
if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) |
|
this[offset] = (value & 0xff) |
|
this[offset + 1] = (value >>> 8) |
|
this[offset + 2] = (value >>> 16) |
|
this[offset + 3] = (value >>> 24) |
|
return offset + 4 |
|
} |
|
|
|
Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) { |
|
value = +value |
|
offset = offset >>> 0 |
|
if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) |
|
if (value < 0) value = 0xffffffff + value + 1 |
|
this[offset] = (value >>> 24) |
|
this[offset + 1] = (value >>> 16) |
|
this[offset + 2] = (value >>> 8) |
|
this[offset + 3] = (value & 0xff) |
|
return offset + 4 |
|
} |
|
|
|
function checkIEEE754 (buf, value, offset, ext, max, min) { |
|
if (offset + ext > buf.length) throw new RangeError('Index out of range') |
|
if (offset < 0) throw new RangeError('Index out of range') |
|
} |
|
|
|
function writeFloat (buf, value, offset, littleEndian, noAssert) { |
|
value = +value |
|
offset = offset >>> 0 |
|
if (!noAssert) { |
|
checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38) |
|
} |
|
ieee754.write(buf, value, offset, littleEndian, 23, 4) |
|
return offset + 4 |
|
} |
|
|
|
Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) { |
|
return writeFloat(this, value, offset, true, noAssert) |
|
} |
|
|
|
Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) { |
|
return writeFloat(this, value, offset, false, noAssert) |
|
} |
|
|
|
function writeDouble (buf, value, offset, littleEndian, noAssert) { |
|
value = +value |
|
offset = offset >>> 0 |
|
if (!noAssert) { |
|
checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308) |
|
} |
|
ieee754.write(buf, value, offset, littleEndian, 52, 8) |
|
return offset + 8 |
|
} |
|
|
|
Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) { |
|
return writeDouble(this, value, offset, true, noAssert) |
|
} |
|
|
|
Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) { |
|
return writeDouble(this, value, offset, false, noAssert) |
|
} |
|
|
|
// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length) |
|
Buffer.prototype.copy = function copy (target, targetStart, start, end) { |
|
if (!start) start = 0 |
|
if (!end && end !== 0) end = this.length |
|
if (targetStart >= target.length) targetStart = target.length |
|
if (!targetStart) targetStart = 0 |
|
if (end > 0 && end < start) end = start |
|
|
|
// Copy 0 bytes; we're done |
|
if (end === start) return 0 |
|
if (target.length === 0 || this.length === 0) return 0 |
|
|
|
// Fatal error conditions |
|
if (targetStart < 0) { |
|
throw new RangeError('targetStart out of bounds') |
|
} |
|
if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds') |
|
if (end < 0) throw new RangeError('sourceEnd out of bounds') |
|
|
|
// Are we oob? |
|
if (end > this.length) end = this.length |
|
if (target.length - targetStart < end - start) { |
|
end = target.length - targetStart + start |
|
} |
|
|
|
var len = end - start |
|
var i |
|
|
|
if (this === target && start < targetStart && targetStart < end) { |
|
// descending copy from end |
|
for (i = len - 1; i >= 0; --i) { |
|
target[i + targetStart] = this[i + start] |
|
} |
|
} else if (len < 1000) { |
|
// ascending copy from start |
|
for (i = 0; i < len; ++i) { |
|
target[i + targetStart] = this[i + start] |
|
} |
|
} else { |
|
Uint8Array.prototype.set.call( |
|
target, |
|
this.subarray(start, start + len), |
|
targetStart |
|
) |
|
} |
|
|
|
return len |
|
} |
|
|
|
// Usage: |
|
// buffer.fill(number[, offset[, end]]) |
|
// buffer.fill(buffer[, offset[, end]]) |
|
// buffer.fill(string[, offset[, end]][, encoding]) |
|
Buffer.prototype.fill = function fill (val, start, end, encoding) { |
|
// Handle string cases: |
|
if (typeof val === 'string') { |
|
if (typeof start === 'string') { |
|
encoding = start |
|
start = 0 |
|
end = this.length |
|
} else if (typeof end === 'string') { |
|
encoding = end |
|
end = this.length |
|
} |
|
if (val.length === 1) { |
|
var code = val.charCodeAt(0) |
|
if (code < 256) { |
|
val = code |
|
} |
|
} |
|
if (encoding !== undefined && typeof encoding !== 'string') { |
|
throw new TypeError('encoding must be a string') |
|
} |
|
if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) { |
|
throw new TypeError('Unknown encoding: ' + encoding) |
|
} |
|
} else if (typeof val === 'number') { |
|
val = val & 255 |
|
} |
|
|
|
// Invalid ranges are not set to a default, so can range check early. |
|
if (start < 0 || this.length < start || this.length < end) { |
|
throw new RangeError('Out of range index') |
|
} |
|
|
|
if (end <= start) { |
|
return this |
|
} |
|
|
|
start = start >>> 0 |
|
end = end === undefined ? this.length : end >>> 0 |
|
|
|
if (!val) val = 0 |
|
|
|
var i |
|
if (typeof val === 'number') { |
|
for (i = start; i < end; ++i) { |
|
this[i] = val |
|
} |
|
} else { |
|
var bytes = Buffer.isBuffer(val) |
|
? val |
|
: new Buffer(val, encoding) |
|
var len = bytes.length |
|
for (i = 0; i < end - start; ++i) { |
|
this[i + start] = bytes[i % len] |
|
} |
|
} |
|
|
|
return this |
|
} |
|
|
|
// HELPER FUNCTIONS |
|
// ================ |
|
|
|
var INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g |
|
|
|
function base64clean (str) { |
|
// Node strips out invalid characters like \n and \t from the string, base64-js does not |
|
str = str.trim().replace(INVALID_BASE64_RE, '') |
|
// Node converts strings with length < 2 to '' |
|
if (str.length < 2) return '' |
|
// Node allows for non-padded base64 strings (missing trailing ===), base64-js does not |
|
while (str.length % 4 !== 0) { |
|
str = str + '=' |
|
} |
|
return str |
|
} |
|
|
|
function toHex (n) { |
|
if (n < 16) return '0' + n.toString(16) |
|
return n.toString(16) |
|
} |
|
|
|
function utf8ToBytes (string, units) { |
|
units = units || Infinity |
|
var codePoint |
|
var length = string.length |
|
var leadSurrogate = null |
|
var bytes = [] |
|
|
|
for (var i = 0; i < length; ++i) { |
|
codePoint = string.charCodeAt(i) |
|
|
|
// is surrogate component |
|
if (codePoint > 0xD7FF && codePoint < 0xE000) { |
|
// last char was a lead |
|
if (!leadSurrogate) { |
|
// no lead yet |
|
if (codePoint > 0xDBFF) { |
|
// unexpected trail |
|
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) |
|
continue |
|
} else if (i + 1 === length) { |
|
// unpaired lead |
|
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) |
|
continue |
|
} |
|
|
|
// valid lead |
|
leadSurrogate = codePoint |
|
|
|
continue |
|
} |
|
|
|
// 2 leads in a row |
|
if (codePoint < 0xDC00) { |
|
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) |
|
leadSurrogate = codePoint |
|
continue |
|
} |
|
|
|
// valid surrogate pair |
|
codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000 |
|
} else if (leadSurrogate) { |
|
// valid bmp char, but last char was a lead |
|
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) |
|
} |
|
|
|
leadSurrogate = null |
|
|
|
// encode utf8 |
|
if (codePoint < 0x80) { |
|
if ((units -= 1) < 0) break |
|
bytes.push(codePoint) |
|
} else if (codePoint < 0x800) { |
|
if ((units -= 2) < 0) break |
|
bytes.push( |
|
codePoint >> 0x6 | 0xC0, |
|
codePoint & 0x3F | 0x80 |
|
) |
|
} else if (codePoint < 0x10000) { |
|
if ((units -= 3) < 0) break |
|
bytes.push( |
|
codePoint >> 0xC | 0xE0, |
|
codePoint >> 0x6 & 0x3F | 0x80, |
|
codePoint & 0x3F | 0x80 |
|
) |
|
} else if (codePoint < 0x110000) { |
|
if ((units -= 4) < 0) break |
|
bytes.push( |
|
codePoint >> 0x12 | 0xF0, |
|
codePoint >> 0xC & 0x3F | 0x80, |
|
codePoint >> 0x6 & 0x3F | 0x80, |
|
codePoint & 0x3F | 0x80 |
|
) |
|
} else { |
|
throw new Error('Invalid code point') |
|
} |
|
} |
|
|
|
return bytes |
|
} |
|
|
|
function asciiToBytes (str) { |
|
var byteArray = [] |
|
for (var i = 0; i < str.length; ++i) { |
|
// Node's code seems to be doing this and not & 0x7F.. |
|
byteArray.push(str.charCodeAt(i) & 0xFF) |
|
} |
|
return byteArray |
|
} |
|
|
|
function utf16leToBytes (str, units) { |
|
var c, hi, lo |
|
var byteArray = [] |
|
for (var i = 0; i < str.length; ++i) { |
|
if ((units -= 2) < 0) break |
|
|
|
c = str.charCodeAt(i) |
|
hi = c >> 8 |
|
lo = c % 256 |
|
byteArray.push(lo) |
|
byteArray.push(hi) |
|
} |
|
|
|
return byteArray |
|
} |
|
|
|
function base64ToBytes (str) { |
|
return base64.toByteArray(base64clean(str)) |
|
} |
|
|
|
function blitBuffer (src, dst, offset, length) { |
|
for (var i = 0; i < length; ++i) { |
|
if ((i + offset >= dst.length) || (i >= src.length)) break |
|
dst[i + offset] = src[i] |
|
} |
|
return i |
|
} |
|
|
|
// Node 0.10 supports `ArrayBuffer` but lacks `ArrayBuffer.isView` |
|
function isArrayBufferView (obj) { |
|
return (typeof ArrayBuffer.isView === 'function') && ArrayBuffer.isView(obj) |
|
} |
|
|
|
function numberIsNaN (obj) { |
|
return obj !== obj // eslint-disable-line no-self-compare |
|
} |
|
|
|
},{"base64-js":1,"ieee754":4}],4:[function(require,module,exports){ |
|
exports.read = function (buffer, offset, isLE, mLen, nBytes) { |
|
var e, m |
|
var eLen = nBytes * 8 - mLen - 1 |
|
var eMax = (1 << eLen) - 1 |
|
var eBias = eMax >> 1 |
|
var nBits = -7 |
|
var i = isLE ? (nBytes - 1) : 0 |
|
var d = isLE ? -1 : 1 |
|
var s = buffer[offset + i] |
|
|
|
i += d |
|
|
|
e = s & ((1 << (-nBits)) - 1) |
|
s >>= (-nBits) |
|
nBits += eLen |
|
for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {} |
|
|
|
m = e & ((1 << (-nBits)) - 1) |
|
e >>= (-nBits) |
|
nBits += mLen |
|
for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {} |
|
|
|
if (e === 0) { |
|
e = 1 - eBias |
|
} else if (e === eMax) { |
|
return m ? NaN : ((s ? -1 : 1) * Infinity) |
|
} else { |
|
m = m + Math.pow(2, mLen) |
|
e = e - eBias |
|
} |
|
return (s ? -1 : 1) * m * Math.pow(2, e - mLen) |
|
} |
|
|
|
exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { |
|
var e, m, c |
|
var eLen = nBytes * 8 - mLen - 1 |
|
var eMax = (1 << eLen) - 1 |
|
var eBias = eMax >> 1 |
|
var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0) |
|
var i = isLE ? 0 : (nBytes - 1) |
|
var d = isLE ? 1 : -1 |
|
var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0 |
|
|
|
value = Math.abs(value) |
|
|
|
if (isNaN(value) || value === Infinity) { |
|
m = isNaN(value) ? 1 : 0 |
|
e = eMax |
|
} else { |
|
e = Math.floor(Math.log(value) / Math.LN2) |
|
if (value * (c = Math.pow(2, -e)) < 1) { |
|
e-- |
|
c *= 2 |
|
} |
|
if (e + eBias >= 1) { |
|
value += rt / c |
|
} else { |
|
value += rt * Math.pow(2, 1 - eBias) |
|
} |
|
if (value * c >= 2) { |
|
e++ |
|
c /= 2 |
|
} |
|
|
|
if (e + eBias >= eMax) { |
|
m = 0 |
|
e = eMax |
|
} else if (e + eBias >= 1) { |
|
m = (value * c - 1) * Math.pow(2, mLen) |
|
e = e + eBias |
|
} else { |
|
m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen) |
|
e = 0 |
|
} |
|
} |
|
|
|
for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} |
|
|
|
e = (e << mLen) | m |
|
eLen += mLen |
|
for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} |
|
|
|
buffer[offset + i - d] |= s * 128 |
|
} |
|
|
|
},{}],5:[function(require,module,exports){ |
|
// shim for using process in browser |
|
var process = module.exports = {}; |
|
|
|
// cached from whatever global is present so that test runners that stub it |
|
// don't break things. But we need to wrap it in a try catch in case it is |
|
// wrapped in strict mode code which doesn't define any globals. It's inside a |
|
// function because try/catches deoptimize in certain engines. |
|
|
|
var cachedSetTimeout; |
|
var cachedClearTimeout; |
|
|
|
function defaultSetTimout() { |
|
throw new Error('setTimeout has not been defined'); |
|
} |
|
function defaultClearTimeout () { |
|
throw new Error('clearTimeout has not been defined'); |
|
} |
|
(function () { |
|
try { |
|
if (typeof setTimeout === 'function') { |
|
cachedSetTimeout = setTimeout; |
|
} else { |
|
cachedSetTimeout = defaultSetTimout; |
|
} |
|
} catch (e) { |
|
cachedSetTimeout = defaultSetTimout; |
|
} |
|
try { |
|
if (typeof clearTimeout === 'function') { |
|
cachedClearTimeout = clearTimeout; |
|
} else { |
|
cachedClearTimeout = defaultClearTimeout; |
|
} |
|
} catch (e) { |
|
cachedClearTimeout = defaultClearTimeout; |
|
} |
|
} ()) |
|
function runTimeout(fun) { |
|
if (cachedSetTimeout === setTimeout) { |
|
//normal enviroments in sane situations |
|
return setTimeout(fun, 0); |
|
} |
|
// if setTimeout wasn't available but was latter defined |
|
if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { |
|
cachedSetTimeout = setTimeout; |
|
return setTimeout(fun, 0); |
|
} |
|
try { |
|
// when when somebody has screwed with setTimeout but no I.E. maddness |
|
return cachedSetTimeout(fun, 0); |
|
} catch(e){ |
|
try { |
|
// When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally |
|
return cachedSetTimeout.call(null, fun, 0); |
|
} catch(e){ |
|
// same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error |
|
return cachedSetTimeout.call(this, fun, 0); |
|
} |
|
} |
|
|
|
|
|
} |
|
function runClearTimeout(marker) { |
|
if (cachedClearTimeout === clearTimeout) { |
|
//normal enviroments in sane situations |
|
return clearTimeout(marker); |
|
} |
|
// if clearTimeout wasn't available but was latter defined |
|
if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { |
|
cachedClearTimeout = clearTimeout; |
|
return clearTimeout(marker); |
|
} |
|
try { |
|
// when when somebody has screwed with setTimeout but no I.E. maddness |
|
return cachedClearTimeout(marker); |
|
} catch (e){ |
|
try { |
|
// When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally |
|
return cachedClearTimeout.call(null, marker); |
|
} catch (e){ |
|
// same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. |
|
// Some versions of I.E. have different rules for clearTimeout vs setTimeout |
|
return cachedClearTimeout.call(this, marker); |
|
} |
|
} |
|
|
|
|
|
|
|
} |
|
var queue = []; |
|
var draining = false; |
|
var currentQueue; |
|
var queueIndex = -1; |
|
|
|
function cleanUpNextTick() { |
|
if (!draining || !currentQueue) { |
|
return; |
|
} |
|
draining = false; |
|
if (currentQueue.length) { |
|
queue = currentQueue.concat(queue); |
|
} else { |
|
queueIndex = -1; |
|
} |
|
if (queue.length) { |
|
drainQueue(); |
|
} |
|
} |
|
|
|
function drainQueue() { |
|
if (draining) { |
|
return; |
|
} |
|
var timeout = runTimeout(cleanUpNextTick); |
|
draining = true; |
|
|
|
var len = queue.length; |
|
while(len) { |
|
currentQueue = queue; |
|
queue = []; |
|
while (++queueIndex < len) { |
|
if (currentQueue) { |
|
currentQueue[queueIndex].run(); |
|
} |
|
} |
|
queueIndex = -1; |
|
len = queue.length; |
|
} |
|
currentQueue = null; |
|
draining = false; |
|
runClearTimeout(timeout); |
|
} |
|
|
|
process.nextTick = function (fun) { |
|
var args = new Array(arguments.length - 1); |
|
if (arguments.length > 1) { |
|
for (var i = 1; i < arguments.length; i++) { |
|
args[i - 1] = arguments[i]; |
|
} |
|
} |
|
queue.push(new Item(fun, args)); |
|
if (queue.length === 1 && !draining) { |
|
runTimeout(drainQueue); |
|
} |
|
}; |
|
|
|
// v8 likes predictible objects |
|
function Item(fun, array) { |
|
this.fun = fun; |
|
this.array = array; |
|
} |
|
Item.prototype.run = function () { |
|
this.fun.apply(null, this.array); |
|
}; |
|
process.title = 'browser'; |
|
process.browser = true; |
|
process.env = {}; |
|
process.argv = []; |
|
process.version = ''; // empty string to avoid regexp issues |
|
process.versions = {}; |
|
|
|
function noop() {} |
|
|
|
process.on = noop; |
|
process.addListener = noop; |
|
process.once = noop; |
|
process.off = noop; |
|
process.removeListener = noop; |
|
process.removeAllListeners = noop; |
|
process.emit = noop; |
|
process.prependListener = noop; |
|
process.prependOnceListener = noop; |
|
|
|
process.listeners = function (name) { return [] } |
|
|
|
process.binding = function (name) { |
|
throw new Error('process.binding is not supported'); |
|
}; |
|
|
|
process.cwd = function () { return '/' }; |
|
process.chdir = function (dir) { |
|
throw new Error('process.chdir is not supported'); |
|
}; |
|
process.umask = function() { return 0; }; |
|
|
|
},{}],6:[function(require,module,exports){ |
|
module.exports = {"positions":[[70.188,17.5,-0.002],[71.791,17.5,-0.002],[73.393,17.5,-0.002],[74.996,17.5,-0.002],[76.599,17.5,-0.002],[78.202,17.5,-0.002],[79.805,17.5,-0.002],[81.407,17.5,-0.002],[83.01,17.5,-0.002],[84.613,17.5,-0.002],[86.216,17.5,-0.002],[87.819,17.5,-0.002],[89.421,17.5,-0.002],[91.024,17.5,-0.002],[92.627,17.5,-0.002],[94.23,17.5,-0.002],[95.833,17.5,-0.002],[97.435,17.5,-0.002],[99.038,17.5,-0.002],[100.64,17.5,-0.002],[102.24,17.5,-0.002],[103.85,17.5,-0.002],[105.45,17.5,-0.002],[107.05,17.5,-0.002],[108.66,17.5,-0.002],[110.26,17.5,-0.002],[111.86,17.5,-0.002],[113.46,17.5,-0.002],[115.07,17.5,-0.002],[116.67,17.5,-0.002],[118.27,17.5,-0.002],[119.87,17.5,-0.002],[121.48,17.5,-0.002],[123.08,17.5,-0.002],[124.68,17.5,-0.002],[126.29,17.5,-0.002],[127.89,17.5,-0.002],[129.49,17.5,-0.002],[131.09,17.5,-0.002],[132.7,17.5,-0.002],[134.3,17.5,-0.002],[70.188,17.5,1.141],[71.791,17.5,1.141],[73.393,17.5,1.141],[74.996,17.5,1.141],[76.599,17.5,1.141],[78.202,17.5,1.141],[79.805,17.5,1.141],[81.407,17.5,1.141],[83.01,17.5,1.141],[84.613,17.5,1.141],[86.216,17.5,1.141],[87.819,17.5,1.141],[89.421,17.5,1.141],[91.024,17.5,1.141],[92.627,17.5,1.141],[94.23,17.5,1.141],[95.833,17.5,1.141],[97.435,17.5,1.141],[99.038,17.5,1.141],[100.64,17.5,1.141],[102.24,17.5,1.141],[103.85,17.5,1.141],[105.45,17.5,1.141],[107.05,17.5,1.141],[108.66,17.5,1.141],[110.26,17.5,1.141],[111.86,17.5,1.141],[113.46,17.5,1.141],[115.07,17.5,1.141],[116.67,17.5,1.141],[118.27,17.5,1.141],[119.87,17.5,1.141],[121.48,17.5,1.141],[123.08,17.5,1.141],[124.68,17.5,1.141],[126.29,17.5,1.141],[127.89,17.5,1.141],[129.49,17.5,1.141],[131.09,17.5,1.141],[132.7,17.5,1.141],[134.3,17.5,1.141],[70.188,17.5,2.284],[71.791,17.5,2.284],[73.393,17.5,2.284],[74.996,17.5,2.284],[76.599,17.5,2.284],[78.202,17.5,2.284],[79.805,17.5,2.284],[81.407,17.5,2.284],[83.01,17.5,2.284],[84.613,17.5,2.284],[86.216,17.5,2.284],[87.819,17.5,2.284],[89.421,17.5,2.284],[91.024,17.5,2.284],[92.627,17.5,2.284],[94.23,17.5,2.284],[95.833,17.5,2.284],[97.435,17.5,2.284],[99.038,17.5,2.284],[100.64,17.5,2.284],[102.24,17.5,2.284],[103.85,17.5,2.284],[105.45,17.5,2.284],[107.05,17.5,2.284],[108.66,17.5,2.284],[110.26,17.5,2.284],[111.86,17.5,2.284],[113.46,17.5,2.284],[115.07,17.5,2.284],[116.67,17.5,2.284],[118.27,17.5,2.284],[119.87,17.5,2.284],[121.48,17.5,2.284],[123.08,17.5,2.284],[124.68,17.5,2.284],[126.29,17.5,2.284],[127.89,17.5,2.284],[129.49,17.5,2.284],[131.09,17.5,2.284],[132.7,17.5,2.284],[134.3,17.5,2.284],[70.188,17.5,3.427],[71.791,17.5,3.427],[73.393,17.5,3.427],[74.996,17.5,3.427],[76.599,17.5,3.427],[78.202,17.5,3.427],[79.805,17.5,3.427],[81.407,17.5,3.427],[83.01,17.5,3.427],[84.613,17.5,3.427],[86.216,17.5,3.427],[87.819,17.5,3.427],[89.421,17.5,3.427],[91.024,17.5,3.427],[92.627,17.5,3.427],[94.23,17.5,3.427],[95.833,17.5,3.427],[97.435,17.5,3.427],[99.038,17.5,3.427],[100.64,17.5,3.427],[102.24,17.5,3.427],[103.85,17.5,3.427],[105.45,17.5,3.427],[107.05,17.5,3.427],[108.66,17.5,3.427],[110.26,17.5,3.427],[111.86,17.5,3.427],[113.46,17.5,3.427],[115.07,17.5,3.427],[116.67,17.5,3.427],[118.27,17.5,3.427],[119.87,17.5,3.427],[121.48,17.5,3.427],[123.08,17.5,3.427],[124.68,17.5,3.427],[126.29,17.5,3.427],[127.89,17.5,3.427],[129.49,17.5,3.427],[131.09,17.5,3.427],[132.7,17.5,3.427],[134.3,17.5,3.427],[70.188,17.5,4.57],[71.791,17.5,4.57],[73.393,17.5,4.57],[74.996,17.5,4.57],[76.599,17.5,4.57],[78.202,17.5,4.57],[79.805,17.5,4.57],[81.407,17.5,4.57],[83.01,17.5,4.57],[84.613,17.5,4.57],[86.216,17.5,4.57],[87.819,17.5,4.57],[89.421,17.5,4.57],[91.024,17.5,4.57],[92.627,17.5,4.57],[94.23,17.5,4.57],[95.833,17.5,4.57],[97.435,17.5,4.57],[99.038,17.5,4.57],[100.64,17.5,4.57],[102.24,17.5,4.57],[103.85,17.5,4.57],[105.45,17.5,4.57],[107.05,17.5,4.57],[108.66,17.5,4.57],[110.26,17.5,4.57],[111.86,17.5,4.57],[113.46,17.5,4.57],[115.07,17.5,4.57],[116.67,17.5,4.57],[118.27,17.5,4.57],[119.87,17.5,4.57],[121.48,17.5,4.57],[123.08,17.5,4.57],[124.68,17.5,4.57],[126.29,17.5,4.57],[127.89,17.5,4.57],[129.49,17.5,4.57],[131.09,17.5,4.57],[132.7,17.5,4.57],[134.3,17.5,4.57],[70.188,17.5,5.713],[71.791,17.5,5.713],[73.393,17.5,5.713],[74.996,17.5,5.713],[76.599,17.5,5.713],[78.202,17.5,5.713],[79.805,17.5,5.713],[81.407,17.5,5.713],[83.01,17.5,5.713],[84.613,17.5,5.713],[86.216,17.5,5.713],[87.819,17.5,5.713],[89.421,17.5,5.713],[91.024,17.5,5.713],[92.627,17.5,5.713],[94.23,17.5,5.713],[95.833,17.5,5.713],[97.435,17.5,5.713],[99.038,17.5,5.713],[100.64,17.5,5.713],[102.24,17.5,5.713],[103.85,17.5,5.713],[105.45,17.5,5.713],[107.05,17.5,5.713],[108.66,17.5,5.713],[110.26,17.5,5.713],[111.86,17.5,5.713],[113.46,17.5,5.713],[115.07,17.5,5.713],[116.67,17.5,5.713],[118.27,17.5,5.713],[119.87,17.5,5.713],[121.48,17.5,5.713],[123.08,17.5,5.713],[124.68,17.5,5.713],[126.29,17.5,5.713],[127.89,17.5,5.713],[129.49,17.5,5.713],[131.09,17.5,5.713],[132.7,17.5,5.713],[134.3,17.5,5.713],[70.188,17.5,6.856],[71.791,17.5,6.856],[73.393,17.5,6.856],[74.996,17.5,6.856],[76.599,17.5,6.856],[78.202,17.5,6.856],[79.805,17.5,6.856],[81.407,17.5,6.856],[83.01,17.5,6.856],[84.613,17.5,6.856],[86.216,17.5,6.856],[87.819,17.5,6.856],[89.421,17.5,6.856],[91.024,17.5,6.856],[92.627,17.5,6.856],[94.23,17.5,6.856],[95.833,17.5,6.856],[97.435,17.5,6.856],[99.038,17.5,6.856],[100.64,17.5,6.856],[102.24,17.5,6.856],[103.85,17.5,6.856],[105.45,17.5,6.856],[107.05,17.5,6.856],[108.66,17.5,6.856],[110.26,17.5,6.856],[111.86,17.5,6.856],[113.46,17.5,6.856],[115.07,17.5,6.856],[116.67,17.5,6.856],[118.27,17.5,6.856],[119.87,17.5,6.856],[121.48,17.5,6.856],[123.08,17.5,6.856],[124.68,17.5,6.856],[126.29,17.5,6.856],[127.89,17.5,6.856],[129.49,17.5,6.856],[131.09,17.5,6.856],[132.7,17.5,6.856],[134.3,17.5,6.856],[70.188,17.5,7.999],[71.791,17.5,7.999],[73.393,17.5,7.999],[74.996,17.5,7.999],[76.599,17.5,7.999],[78.202,17.5,7.999],[79.805,17.5,7.999],[81.407,17.5,7.999],[83.01,17.5,7.999],[84.613,17.5,7.999],[86.216,17.5,7.999],[87.819,17.5,7.999],[89.421,17.5,7.999],[91.024,17.5,7.999],[92.627,17.5,7.999],[94.23,17.5,7.999],[95.833,17.5,7.999],[97.435,17.5,7.999],[99.038,17.5,7.999],[100.64,17.5,7.999],[102.24,17.5,7.999],[103.85,17.5,7.999],[105.45,17.5,7.999],[107.05,17.5,7.999],[108.66,17.5,7.999],[110.26,17.5,7.999],[111.86,17.5,7.999],[113.46,17.5,7.999],[115.07,17.5,7.999],[116.67,17.5,7.999],[118.27,17.5,7.999],[119.87,17.5,7.999],[121.48,17.5,7.999],[123.08,17.5,7.999],[124.68,17.5,7.999],[126.29,17.5,7.999],[127.89,17.5,7.999],[129.49,17.5,7.999],[131.09,17.5,7.999],[132.7,17.5,7.999],[134.3,17.5,7.999],[70.188,17.5,9.142],[71.791,17.5,9.142],[73.393,17.5,9.142],[74.996,17.5,9.142],[76.599,17.5,9.142],[78.202,17.5,9.142],[79.805,17.5,9.142],[81.407,17.5,9.142],[83.01,17.5,9.142],[84.613,17.5,9.142],[86.216,17.5,9.142],[87.819,17.5,9.142],[89.421,17.5,9.142],[91.024,17.5,9.142],[92.627,17.5,9.142],[94.23,17.5,9.142],[95.833,17.5,9.142],[97.435,17.5,9.142],[99.038,17.5,9.142],[100.64,17.5,9.142],[102.24,17.5,9.142],[103.85,17.5,9.142],[105.45,17.5,9.142],[107.05,17.5,9.142],[108.66,17.5,9.142],[110.26,17.5,9.142],[111.86,17.5,9.142],[113.46,17.5,9.142],[115.07,17.5,9.142],[116.67,17.5,9.142],[118.27,17.5,9.142],[119.87,17.5,9.142],[121.48,17.5,9.142],[123.08,17.5,9.142],[124.68,17.5,9.142],[126.29,17.5,9.142],[127.89,17.5,9.142],[129.49,17.5,9.142],[131.09,17.5,9.142],[132.7,17.5,9.142],[134.3,17.5,9.142],[70.188,17.5,10.285],[71.791,17.5,10.285],[73.393,17.5,10.285],[74.996,17.5,10.285],[76.599,17.5,10.285],[78.202,17.5,10.285],[79.805,17.5,10.285],[81.407,17.5,10.285],[83.01,17.5,10.285],[84.613,17.5,10.285],[86.216,17.5,10.285],[87.819,17.5,10.285],[89.421,17.5,10.285],[91.024,17.5,10.285],[92.627,17.5,10.285],[94.23,17.5,10.285],[95.833,17.5,10.285],[97.435,17.5,10.285],[99.038,17.5,10.285],[100.64,17.5,10.285],[102.24,17.5,10.285],[103.85,17.5,10.285],[105.45,17.5,10.285],[107.05,17.5,10.285],[108.66,17.5,10.285],[110.26,17.5,10.285],[111.86,17.5,10.285],[113.46,17.5,10.285],[115.07,17.5,10.285],[116.67,17.5,10.285],[118.27,17.5,10.285],[119.87,17.5,10.285],[121.48,17.5,10.285],[123.08,17.5,10.285],[124.68,17.5,10.285],[126.29,17.5,10.285],[127.89,17.5,10.285],[129.49,17.5,10.285],[131.09,17.5,10.285],[132.7,17.5,10.285],[134.3,17.5,10.285],[70.188,17.5,11.428],[71.791,17.5,11.428],[73.393,17.5,11.428],[74.996,17.5,11.428],[76.599,17.5,11.428],[78.202,17.5,11.428],[79.805,17.5,11.428],[81.407,17.5,11.428],[83.01,17.5,11.428],[84.613,17.5,11.428],[86.216,17.5,11.428],[87.819,17.5,11.428],[89.421,17.5,11.428],[91.024,17.5,11.428],[92.627,17.5,11.428],[94.23,17.5,11.428],[95.833,17.5,11.428],[97.435,17.5,11.428],[99.038,17.5,11.428],[100.64,17.5,11.428],[102.24,17.5,11.428],[103.85,17.5,11.428],[105.45,17.5,11.428],[107.05,17.5,11.428],[108.66,17.5,11.428],[110.26,17.5,11.428],[111.86,17.5,11.428],[113.46,17.5,11.428],[115.07,17.5,11.428],[116.67,17.5,11.428],[118.27,17.5,11.428],[119.87,17.5,11.428],[121.48,17.5,11.428],[123.08,17.5,11.428],[124.68,17.5,11.428],[126.29,17.5,11.428],[127.89,17.5,11.428],[129.49,17.5,11.428],[131.09,17.5,11.428],[132.7,17.5,11.428],[134.3,17.5,11.428],[70.188,17.5,12.571],[71.791,17.5,12.571],[73.393,17.5,12.571],[74.996,17.5,12.571],[76.599,17.5,12.571],[78.202,17.5,12.571],[79.805,17.5,12.571],[81.407,17.5,12.571],[83.01,17.5,12.571],[84.613,17.5,12.571],[86.216,17.5,12.571],[87.819,17.5,12.571],[89.421,17.5,12.571],[91.024,17.5,12.571],[92.627,17.5,12.571],[94.23,17.5,12.571],[95.833,17.5,12.571],[97.435,17.5,12.571],[99.038,17.5,12.571],[100.64,17.5,12.571],[102.24,17.5,12.571],[103.85,17.5,12.571],[105.45,17.5,12.571],[107.05,17.5,12.571],[108.66,17.5,12.571],[110.26,17.5,12.571],[111.86,17.5,12.571],[113.46,17.5,12.571],[115.07,17.5,12.571],[116.67,17.5,12.571],[118.27,17.5,12.571],[119.87,17.5,12.571],[121.48,17.5,12.571],[123.08,17.5,12.571],[124.68,17.5,12.571],[126.29,17.5,12.571],[127.89,17.5,12.571],[129.49,17.5,12.571],[131.09,17.5,12.571],[132.7,17.5,12.571],[134.3,17.5,12.571],[70.188,17.5,13.714],[71.791,17.5,13.714],[73.393,17.5,13.714],[74.996,17.5,13.714],[76.599,17.5,13.714],[78.202,17.5,13.714],[79.805,17.5,13.714],[81.407,17.5,13.714],[83.01,17.5,13.714],[84.613,17.5,13.714],[86.216,17.5,13.714],[87.819,17.5,13.714],[89.421,17.5,13.714],[91.024,17.5,13.714],[92.627,17.5,13.714],[94.23,17.5,13.714],[95.833,17.5,13.714],[97.435,17.5,13.714],[99.038,17.5,13.714],[100.64,17.5,13.714],[102.24,17.5,13.714],[103.85,17.5,13.714],[105.45,17.5,13.714],[107.05,17.5,13.714],[108.66,17.5,13.714],[110.26,17.5,13.714],[111.86,17.5,13.714],[113.46,17.5,13.714],[115.07,17.5,13.714],[116.67,17.5,13.714],[118.27,17.5,13.714],[119.87,17.5,13.714],[121.48,17.5,13.714],[123.08,17.5,13.714],[124.68,17.5,13.714],[126.29,17.5,13.714],[127.89,17.5,13.714],[129.49,17.5,13.714],[131.09,17.5,13.714],[132.7,17.5,13.714],[134.3,17.5,13.714],[70.188,17.5,14.857],[71.791,17.5,14.857],[73.393,17.5,14.857],[74.996,17.5,14.857],[76.599,17.5,14.857],[78.202,17.5,14.857],[79.805,17.5,14.857],[81.407,17.5,14.857],[83.01,17.5,14.857],[84.613,17.5,14.857],[86.216,17.5,14.857],[87.819,17.5,14.857],[89.421,17.5,14.857],[91.024,17.5,14.857],[92.627,17.5,14.857],[94.23,17.5,14.857],[95.833,17.5,14.857],[97.435,17.5,14.857],[99.038,17.5,14.857],[100.64,17.5,14.857],[102.24,17.5,14.857],[103.85,17.5,14.857],[105.45,17.5,14.857],[107.05,17.5,14.857],[108.66,17.5,14.857],[110.26,17.5,14.857],[111.86,17.5,14.857],[113.46,17.5,14.857],[115.07,17.5,14.857],[116.67,17.5,14.857],[118.27,17.5,14.857],[119.87,17.5,14.857],[121.48,17.5,14.857],[123.08,17.5,14.857],[124.68,17.5,14.857],[126.29,17.5,14.857],[127.89,17.5,14.857],[129.49,17.5,14.857],[131.09,17.5,14.857],[132.7,17.5,14.857],[134.3,17.5,14.857],[70.188,17.5,16],[71.791,17.5,16],[73.393,17.5,16],[74.996,17.5,16],[76.599,17.5,16],[78.202,17.5,16],[79.805,17.5,16],[81.407,17.5,16],[83.01,17.5,16],[84.613,17.5,16],[86.216,17.5,16],[87.819,17.5,16],[89.421,17.5,16],[91.024,17.5,16],[92.627,17.5,16],[94.23,17.5,16],[95.833,17.5,16],[97.435,17.5,16],[99.038,17.5,16],[100.64,17.5,16],[102.24,17.5,16],[103.85,17.5,16],[105.45,17.5,16],[107.05,17.5,16],[108.66,17.5,16],[110.26,17.5,16],[111.86,17.5,16],[113.46,17.5,16],[115.07,17.5,16],[116.67,17.5,16],[118.27,17.5,16],[119.87,17.5,16],[121.48,17.5,16],[123.08,17.5,16],[124.68,17.5,16],[126.29,17.5,16],[127.89,17.5,16],[129.49,17.5,16],[131.09,17.5,16],[132.7,17.5,16],[134.3,17.5,16],[70.188,18.75,-0.002],[71.791,18.75,-0.002],[73.393,18.75,-0.002],[74.996,18.75,-0.002],[76.599,18.75,-0.002],[78.202,18.75,-0.002],[79.805,18.75,-0.002],[81.407,18.75,-0.002],[83.01,18.75,-0.002],[84.613,18.75,-0.002],[86.216,18.75,-0.002],[87.819,18.75,-0.002],[89.421,18.75,-0.002],[91.024,18.75,-0.002],[92.627,18.75,-0.002],[94.23,18.75,-0.002],[95.833,18.75,-0.002],[97.435,18.75,-0.002],[99.038,18.75,-0.002],[100.64,18.75,-0.002],[102.24,18.75,-0.002],[103.85,18.75,-0.002],[105.45,18.75,-0.002],[107.05,18.75,-0.002],[108.66,18.75,-0.002],[110.26,18.75,-0.002],[111.86,18.75,-0.002],[113.46,18.75,-0.002],[115.07,18.75,-0.002],[116.67,18.75,-0.002],[118.27,18.75,-0.002],[119.87,18.75,-0.002],[121.48,18.75,-0.002],[123.08,18.75,-0.002],[124.68,18.75,-0.002],[126.29,18.75,-0.002],[127.89,18.75,-0.002],[129.49,18.75,-0.002],[131.09,18.75,-0.002],[132.7,18.75,-0.002],[134.3,18.75,-0.002],[70.188,18.75,1.141],[71.791,18.75,1.141],[73.393,18.75,1.141],[74.996,18.75,1.141],[76.599,18.75,1.141],[78.202,18.75,1.141],[79.805,18.75,1.141],[81.407,18.75,1.141],[83.01,18.75,1.141],[84.613,18.75,1.141],[86.216,18.75,1.141],[87.819,18.75,1.141],[89.421,18.75,1.141],[91.024,18.75,1.141],[92.627,18.75,1.141],[94.23,18.75,1.141],[95.833,18.75,1.141],[97.435,18.75,1.141],[99.038,18.75,1.141],[100.64,18.75,1.141],[102.24,18.75,1.141],[103.85,18.75,1.141],[105.45,18.75,1.141],[107.05,18.75,1.141],[108.66,18.75,1.141],[110.26,18.75,1.141],[111.86,18.75,1.141],[113.46,18.75,1.141],[115.07,18.75,1.141],[116.67,18.75,1.141],[118.27,18.75,1.141],[119.87,18.75,1.141],[121.48,18.75,1.141],[123.08,18.75,1.141],[124.68,18.75,1.141],[126.29,18.75,1.141],[127.89,18.75,1.141],[129.49,18.75,1.141],[131.09,18.75,1.141],[132.7,18.75,1.141],[134.3,18.75,1.141],[70.188,18.75,2.284],[71.791,18.75,2.284],[73.393,18.75,2.284],[74.996,18.75,2.284],[76.599,18.75,2.284],[78.202,18.75,2.284],[79.805,18.75,2.284],[81.407,18.75,2.284],[83.01,18.75,2.284],[84.613,18.75,2.284],[86.216,18.75,2.284],[87.819,18.75,2.284],[89.421,18.75,2.284],[91.024,18.75,2.284],[92.627,18.75,2.284],[94.23,18.75,2.284],[95.833,18.75,2.284],[97.435,18.75,2.284],[99.038,18.75,2.284],[100.64,18.75,2.284],[102.24,18.75,2.284],[103.85,18.75,2.284],[105.45,18.75,2.284],[107.05,18.75,2.284],[108.66,18.75,2.284],[110.26,18.75,2.284],[111.86,18.75,2.284],[113.46,18.75,2.284],[115.07,18.75,2.284],[116.67,18.75,2.284],[118.27,18.75,2.284],[119.87,18.75,2.284],[121.48,18.75,2.284],[123.08,18.75,2.284],[124.68,18.75,2.284],[126.29,18.75,2.284],[127.89,18.75,2.284],[129.49,18.75,2.284],[131.09,18.75,2.284],[132.7,18.75,2.284],[134.3,18.75,2.284],[70.188,18.75,3.427],[71.791,18.75,3.427],[73.393,18.75,3.427],[74.996,18.75,3.427],[76.599,18.75,3.427],[78.202,18.75,3.427],[79.805,18.75,3.427],[81.407,18.75,3.427],[83.01,18.75,3.427],[84.613,18.75,3.427],[86.216,18.75,3.427],[87.819,18.75,3.427],[89.421,18.75,3.427],[91.024,18.75,3.427],[92.627,18.75,3.427],[94.23,18.75,3.427],[95.833,18.75,3.427],[97.435,18.75,3.427],[99.038,18.75,3.427],[100.64,18.75,3.427],[102.24,18.75,3.427],[103.85,18.75,3.427],[105.45,18.75,3.427],[107.05,18.75,3.427],[108.66,18.75,3.427],[110.26,18.75,3.427],[111.86,18.75,3.427],[113.46,18.75,3.427],[115.07,18.75,3.427],[116.67,18.75,3.427],[118.27,18.75,3.427],[119.87,18.75,3.427],[121.48,18.75,3.427],[123.08,18.75,3.427],[124.68,18.75,3.427],[126.29,18.75,3.427],[127.89,18.75,3.427],[129.49,18.75,3.427],[131.09,18.75,3.427],[132.7,18.75,3.427],[134.3,18.75,3.427],[70.188,18.75,4.57],[71.791,18.75,4.57],[73.393,18.75,4.57],[74.996,18.75,4.57],[76.599,18.75,4.57],[78.202,18.75,4.57],[79.805,18.75,4.57],[81.407,18.75,4.57],[83.01,18.75,4.57],[84.613,18.75,4.57],[86.216,18.75,4.57],[87.819,18.75,4.57],[89.421,18.75,4.57],[91.024,18.75,4.57],[92.627,18.75,4.57],[94.23,18.75,4.57],[95.833,18.75,4.57],[97.435,18.75,4.57],[99.038,18.75,4.57],[100.64,18.75,4.57],[102.24,18.75,4.57],[103.85,18.75,4.57],[105.45,18.75,4.57],[107.05,18.75,4.57],[108.66,18.75,4.57],[110.26,18.75,4.57],[111.86,18.75,4.57],[113.46,18.75,4.57],[115.07,18.75,4.57],[116.67,18.75,4.57],[118.27,18.75,4.57],[119.87,18.75,4.57],[121.48,18.75,4.57],[123.08,18.75,4.57],[124.68,18.75,4.57],[126.29,18.75,4.57],[127.89,18.75,4.57],[129.49,18.75,4.57],[131.09,18.75,4.57],[132.7,18.75,4.57],[134.3,18.75,4.57],[70.188,18.75,5.713],[71.791,18.75,5.713],[73.393,18.75,5.713],[74.996,18.75,5.713],[76.599,18.75,5.713],[78.202,18.75,5.713],[79.805,18.75,5.713],[81.407,18.75,5.713],[83.01,18.75,5.713],[84.613,18.75,5.713],[86.216,18.75,5.713],[87.819,18.75,5.713],[89.421,18.75,5.713],[91.024,18.75,5.713],[92.627,18.75,5.713],[94.23,18.75,5.713],[95.833,18.75,5.713],[97.435,18.75,5.713],[99.038,18.75,5.713],[100.64,18.75,5.713],[102.24,18.75,5.713],[103.85,18.75,5.713],[105.45,18.75,5.713],[107.05,18.75,5.713],[108.66,18.75,5.713],[110.26,18.75,5.713],[111.86,18.75,5.713],[113.46,18.75,5.713],[115.07,18.75,5.713],[116.67,18.75,5.713],[118.27,18.75,5.713],[119.87,18.75,5.713],[121.48,18.75,5.713],[123.08,18.75,5.713],[124.68,18.75,5.713],[126.29,18.75,5.713],[127.89,18.75,5.713],[129.49,18.75,5.713],[131.09,18.75,5.713],[132.7,18.75,5.713],[134.3,18.75,5.713],[70.188,18.75,6.856],[71.791,18.75,6.856],[73.393,18.75,6.856],[74.996,18.75,6.856],[76.599,18.75,6.856],[78.202,18.75,6.856],[79.805,18.75,6.856],[81.407,18.75,6.856],[83.01,18.75,6.856],[84.613,18.75,6.856],[86.216,18.75,6.856],[87.819,18.75,6.856],[89.421,18.75,6.856],[91.024,18.75,6.856],[92.627,18.75,6.856],[94.23,18.75,6.856],[95.833,18.75,6.856],[97.435,18.75,6.856],[99.038,18.75,6.856],[100.64,18.75,6.856],[102.24,18.75,6.856],[103.85,18.75,6.856],[105.45,18.75,6.856],[107.05,18.75,6.856],[108.66,18.75,6.856],[110.26,18.75,6.856],[111.86,18.75,6.856],[113.46,18.75,6.856],[115.07,18.75,6.856],[116.67,18.75,6.856],[118.27,18.75,6.856],[119.87,18.75,6.856],[121.48,18.75,6.856],[123.08,18.75,6.856],[124.68,18.75,6.856],[126.29,18.75,6.856],[127.89,18.75,6.856],[129.49,18.75,6.856],[131.09,18.75,6.856],[132.7,18.75,6.856],[134.3,18.75,6.856],[70.188,18.75,7.999],[71.791,18.75,7.999],[73.393,18.75,7.999],[74.996,18.75,7.999],[76.599,18.75,7.999],[78.202,18.75,7.999],[79.805,18.75,7.999],[81.407,18.75,7.999],[83.01,18.75,7.999],[84.613,18.75,7.999],[86.216,18.75,7.999],[87.819,18.75,7.999],[89.421,18.75,7.999],[91.024,18.75,7.999],[92.627,18.75,7.999],[94.23,18.75,7.999],[95.833,18.75,7.999],[97.435,18.75,7.999],[99.038,18.75,7.999],[100.64,18.75,7.999],[102.24,18.75,7.999],[103.85,18.75,7.999],[105.45,18.75,7.999],[107.05,18.75,7.999],[108.66,18.75,7.999],[110.26,18.75,7.999],[111.86,18.75,7.999],[113.46,18.75,7.999],[115.07,18.75,7.999],[116.67,18.75,7.999],[118.27,18.75,7.999],[119.87,18.75,7.999],[121.48,18.75,7.999],[123.08,18.75,7.999],[124.68,18.75,7.999],[126.29,18.75,7.999],[127.89,18.75,7.999],[129.49,18.75,7.999],[131.09,18.75,7.999],[132.7,18.75,7.999],[134.3,18.75,7.999],[70.188,18.75,9.142],[71.791,18.75,9.142],[73.393,18.75,9.142],[74.996,18.75,9.142],[76.599,18.75,9.142],[78.202,18.75,9.142],[79.805,18.75,9.142],[81.407,18.75,9.142],[83.01,18.75,9.142],[84.613,18.75,9.142],[86.216,18.75,9.142],[87.819,18.75,9.142],[89.421,18.75,9.142],[91.024,18.75,9.142],[92.627,18.75,9.142],[94.23,18.75,9.142],[95.833,18.75,9.142],[97.435,18.75,9.142],[99.038,18.75,9.142],[100.64,18.75,9.142],[102.24,18.75,9.142],[103.85,18.75,9.142],[105.45,18.75,9.142],[107.05,18.75,9.142],[108.66,18.75,9.142],[110.26,18.75,9.142],[111.86,18.75,9.142],[113.46,18.75,9.142],[115.07,18.75,9.142],[116.67,18.75,9.142],[118.27,18.75,9.142],[119.87,18.75,9.142],[121.48,18.75,9.142],[123.08,18.75,9.142],[124.68,18.75,9.142],[126.29,18.75,9.142],[127.89,18.75,9.142],[129.49,18.75,9.142],[131.09,18.75,9.142],[132.7,18.75,9.142],[134.3,18.75,9.142],[70.188,18.75,10.285],[71.791,18.75,10.285],[73.393,18.75,10.285],[74.996,18.75,10.285],[76.599,18.75,10.285],[78.202,18.75,10.285],[79.805,18.75,10.285],[81.407,18.75,10.285],[83.01,18.75,10.285],[84.613,18.75,10.285],[86.216,18.75,10.285],[87.819,18.75,10.285],[89.421,18.75,10.285],[91.024,18.75,10.285],[92.627,18.75,10.285],[94.23,18.75,10.285],[95.833,18.75,10.285],[97.435,18.75,10.285],[99.038,18.75,10.285],[100.64,18.75,10.285],[102.24,18.75,10.285],[103.85,18.75,10.285],[105.45,18.75,10.285],[107.05,18.75,10.285],[108.66,18.75,10.285],[110.26,18.75,10.285],[111.86,18.75,10.285],[113.46,18.75,10.285],[115.07,18.75,10.285],[116.67,18.75,10.285],[118.27,18.75,10.285],[119.87,18.75,10.285],[121.48,18.75,10.285],[123.08,18.75,10.285],[124.68,18.75,10.285],[126.29,18.75,10.285],[127.89,18.75,10.285],[129.49,18.75,10.285],[131.09,18.75,10.285],[132.7,18.75,10.285],[134.3,18.75,10.285],[70.188,18.75,11.428],[71.791,18.75,11.428],[73.393,18.75,11.428],[74.996,18.75,11.428],[76.599,18.75,11.428],[78.202,18.75,11.428],[79.805,18.75,11.428],[81.407,18.75,11.428],[83.01,18.75,11.428],[84.613,18.75,11.428],[86.216,18.75,11.428],[87.819,18.75,11.428],[89.421,18.75,11.428],[91.024,18.75,11.428],[92.627,18.75,11.428],[94.23,18.75,11.428],[95.833,18.75,11.428],[97.435,18.75,11.428],[99.038,18.75,11.428],[100.64,18.75,11.428],[102.24,18.75,11.428],[103.85,18.75,11.428],[105.45,18.75,11.428],[107.05,18.75,11.428],[108.66,18.75,11.428],[110.26,18.75,11.428],[111.86,18.75,11.428],[113.46,18.75,11.428],[115.07,18.75,11.428],[116.67,18.75,11.428],[118.27,18.75,11.428],[119.87,18.75,11.428],[121.48,18.75,11.428],[123.08,18.75,11.428],[124.68,18.75,11.428],[126.29,18.75,11.428],[127.89,18.75,11.428],[129.49,18.75,11.428],[131.09,18.75,11.428],[132.7,18.75,11.428],[134.3,18.75,11.428],[70.188,18.75,12.571],[71.791,18.75,12.571],[73.393,18.75,12.571],[74.996,18.75,12.571],[76.599,18.75,12.571],[78.202,18.75,12.571],[79.805,18.75,12.571],[81.407,18.75,12.571],[83.01,18.75,12.571],[84.613,18.75,12.571],[86.216,18.75,12.571],[87.819,18.75,12.571],[89.421,18.75,12.571],[91.024,18.75,12.571],[92.627,18.75,12.571],[94.23,18.75,12.571],[95.833,18.75,12.571],[97.435,18.75,12.571],[99.038,18.75,12.571],[100.64,18.75,12.571],[102.24,18.75,12.571],[103.85,18.75,12.571],[105.45,18.75,12.571],[107.05,18.75,12.571],[108.66,18.75,12.571],[110.26,18.75,12.571],[111.86,18.75,12.571],[113.46,18.75,12.571],[115.07,18.75,12.571],[116.67,18.75,12.571],[118.27,18.75,12.571],[119.87,18.75,12.571],[121.48,18.75,12.571],[123.08,18.75,12.571],[124.68,18.75,12.571],[126.29,18.75,12.571],[127.89,18.75,12.571],[129.49,18.75,12.571],[131.09,18.75,12.571],[132.7,18.75,12.571],[134.3,18.75,12.571],[70.188,18.75,13.714],[71.791,18.75,13.714],[73.393,18.75,13.714],[74.996,18.75,13.714],[76.599,18.75,13.714],[78.202,18.75,13.714],[79.805,18.75,13.714],[81.407,18.75,13.714],[83.01,18.75,13.714],[84.613,18.75,13.714],[86.216,18.75,13.714],[87.819,18.75,13.714],[89.421,18.75,13.714],[91.024,18.75,13.714],[92.627,18.75,13.714],[94.23,18.75,13.714],[95.833,18.75,13.714],[97.435,18.75,13.714],[99.038,18.75,13.714],[100.64,18.75,13.714],[102.24,18.75,13.714],[103.85,18.75,13.714],[105.45,18.75,13.714],[107.05,18.75,13.714],[108.66,18.75,13.714],[110.26,18.75,13.714],[111.86,18.75,13.714],[113.46,18.75,13.714],[115.07,18.75,13.714],[116.67,18.75,13.714],[118.27,18.75,13.714],[119.87,18.75,13.714],[121.48,18.75,13.714],[123.08,18.75,13.714],[124.68,18.75,13.714],[126.29,18.75,13.714],[127.89,18.75,13.714],[129.49,18.75,13.714],[131.09,18.75,13.714],[132.7,18.75,13.714],[134.3,18.75,13.714],[70.188,18.75,14.857],[71.791,18.75,14.857],[73.393,18.75,14.857],[74.996,18.75,14.857],[76.599,18.75,14.857],[78.202,18.75,14.857],[79.805,18.75,14.857],[81.407,18.75,14.857],[83.01,18.75,14.857],[84.613,18.75,14.857],[86.216,18.75,14.857],[87.819,18.75,14.857],[89.421,18.75,14.857],[91.024,18.75,14.857],[92.627,18.75,14.857],[94.23,18.75,14.857],[95.833,18.75,14.857],[97.435,18.75,14.857],[99.038,18.75,14.857],[100.64,18.75,14.857],[102.24,18.75,14.857],[103.85,18.75,14.857],[105.45,18.75,14.857],[107.05,18.75,14.857],[108.66,18.75,14.857],[110.26,18.75,14.857],[111.86,18.75,14.857],[113.46,18.75,14.857],[115.07,18.75,14.857],[116.67,18.75,14.857],[118.27,18.75,14.857],[119.87,18.75,14.857],[121.48,18.75,14.857],[123.08,18.75,14.857],[124.68,18.75,14.857],[126.29,18.75,14.857],[127.89,18.75,14.857],[129.49,18.75,14.857],[131.09,18.75,14.857],[132.7,18.75,14.857],[134.3,18.75,14.857],[70.188,18.75,16],[71.791,18.75,16],[73.393,18.75,16],[74.996,18.75,16],[76.599,18.75,16],[78.202,18.75,16],[79.805,18.75,16],[81.407,18.75,16],[83.01,18.75,16],[84.613,18.75,16],[86.216,18.75,16],[87.819,18.75,16],[89.421,18.75,16],[91.024,18.75,16],[92.627,18.75,16],[94.23,18.75,16],[95.833,18.75,16],[97.435,18.75,16],[99.038,18.75,16],[100.64,18.75,16],[102.24,18.75,16],[103.85,18.75,16],[105.45,18.75,16],[107.05,18.75,16],[108.66,18.75,16],[110.26,18.75,16],[111.86,18.75,16],[113.46,18.75,16],[115.07,18.75,16],[116.67,18.75,16],[118.27,18.75,16],[119.87,18.75,16],[121.48,18.75,16],[123.08,18.75,16],[124.68,18.75,16],[126.29,18.75,16],[127.89,18.75,16],[129.49,18.75,16],[131.09,18.75,16],[132.7,18.75,16],[134.3,18.75,16],[70.188,20,-0.002],[71.791,20,-0.002],[73.393,20,-0.002],[74.996,20,-0.002],[76.599,20,-0.002],[78.202,20,-0.002],[79.805,20,-0.002],[81.407,20,-0.002],[83.01,20,-0.002],[84.613,20,-0.002],[86.216,20,-0.002],[87.819,20,-0.002],[89.421,20,-0.002],[91.024,20,-0.002],[92.627,20,-0.002],[94.23,20,-0.002],[95.833,20,-0.002],[97.435,20,-0.002],[99.038,20,-0.002],[100.64,20,-0.002],[102.24,20,-0.002],[103.85,20,-0.002],[105.45,20,-0.002],[107.05,20,-0.002],[108.66,20,-0.002],[110.26,20,-0.002],[111.86,20,-0.002],[113.46,20,-0.002],[115.07,20,-0.002],[116.67,20,-0.002],[118.27,20,-0.002],[119.87,20,-0.002],[121.48,20,-0.002],[123.08,20,-0.002],[124.68,20,-0.002],[126.29,20,-0.002],[127.89,20,-0.002],[129.49,20,-0.002],[131.09,20,-0.002],[132.7,20,-0.002],[134.3,20,-0.002],[70.188,20,1.141],[71.791,20,1.141],[73.393,20,1.141],[74.996,20,1.141],[76.599,20,1.141],[78.202,20,1.141],[79.805,20,1.141],[81.407,20,1.141],[83.01,20,1.141],[84.613,20,1.141],[86.216,20,1.141],[87.819,20,1.141],[89.421,20,1.141],[91.024,20,1.141],[92.627,20,1.141],[94.23,20,1.141],[95.833,20,1.141],[97.435,20,1.141],[99.038,20,1.141],[100.64,20,1.141],[102.24,20,1.141],[103.85,20,1.141],[105.45,20,1.141],[107.05,20,1.141],[108.66,20,1.141],[110.26,20,1.141],[111.86,20,1.141],[113.46,20,1.141],[115.07,20,1.141],[116.67,20,1.141],[118.27,20,1.141],[119.87,20,1.141],[121.48,20,1.141],[123.08,20,1.141],[124.68,20,1.141],[126.29,20,1.141],[127.89,20,1.141],[129.49,20,1.141],[131.09,20,1.141],[132.7,20,1.141],[134.3,20,1.141],[70.188,20,2.284],[71.791,20,2.284],[73.393,20,2.284],[74.996,20,2.284],[76.599,20,2.284],[78.202,20,2.284],[79.805,20,2.284],[81.407,20,2.284],[83.01,20,2.284],[84.613,20,2.284],[86.216,20,2.284],[87.819,20,2.284],[89.421,20,2.284],[91.024,20,2.284],[92.627,20,2.284],[94.23,20,2.284],[95.833,20,2.284],[97.435,20,2.284],[99.038,20,2.284],[100.64,20,2.284],[102.24,20,2.284],[103.85,20,2.284],[105.45,20,2.284],[107.05,20,2.284],[108.66,20,2.284],[110.26,20,2.284],[111.86,20,2.284],[113.46,20,2.284],[115.07,20,2.284],[116.67,20,2.284],[118.27,20,2.284],[119.87,20,2.284],[121.48,20,2.284],[123.08,20,2.284],[124.68,20,2.284],[126.29,20,2.284],[127.89,20,2.284],[129.49,20,2.284],[131.09,20,2.284],[132.7,20,2.284],[134.3,20,2.284],[70.188,20,3.427],[71.791,20,3.427],[73.393,20,3.427],[74.996,20,3.427],[76.599,20,3.427],[78.202,20,3.427],[79.805,20,3.427],[81.407,20,3.427],[83.01,20,3.427],[84.613,20,3.427],[86.216,20,3.427],[87.819,20,3.427],[89.421,20,3.427],[91.024,20,3.427],[92.627,20,3.427],[94.23,20,3.427],[95.833,20,3.427],[97.435,20,3.427],[99.038,20,3.427],[100.64,20,3.427],[102.24,20,3.427],[103.85,20,3.427],[105.45,20,3.427],[107.05,20,3.427],[108.66,20,3.427],[110.26,20,3.427],[111.86,20,3.427],[113.46,20,3.427],[115.07,20,3.427],[116.67,20,3.427],[118.27,20,3.427],[119.87,20,3.427],[121.48,20,3.427],[123.08,20,3.427],[124.68,20,3.427],[126.29,20,3.427],[127.89,20,3.427],[129.49,20,3.427],[131.09,20,3.427],[132.7,20,3.427],[134.3,20,3.427],[70.188,20,4.57],[71.791,20,4.57],[73.393,20,4.57],[74.996,20,4.57],[76.599,20,4.57],[78.202,20,4.57],[79.805,20,4.57],[81.407,20,4.57],[83.01,20,4.57],[84.613,20,4.57],[86.216,20,4.57],[87.819,20,4.57],[89.421,20,4.57],[91.024,20,4.57],[92.627,20,4.57],[94.23,20,4.57],[95.833,20,4.57],[97.435,20,4.57],[99.038,20,4.57],[100.64,20,4.57],[102.24,20,4.57],[103.85,20,4.57],[105.45,20,4.57],[107.05,20,4.57],[108.66,20,4.57],[110.26,20,4.57],[111.86,20,4.57],[113.46,20,4.57],[115.07,20,4.57],[116.67,20,4.57],[118.27,20,4.57],[119.87,20,4.57],[121.48,20,4.57],[123.08,20,4.57],[124.68,20,4.57],[126.29,20,4.57],[127.89,20,4.57],[129.49,20,4.57],[131.09,20,4.57],[132.7,20,4.57],[134.3,20,4.57],[70.188,20,5.713],[71.791,20,5.713],[73.393,20,5.713],[74.996,20,5.713],[76.599,20,5.713],[78.202,20,5.713],[79.805,20,5.713],[81.407,20,5.713],[83.01,20,5.713],[84.613,20,5.713],[86.216,20,5.713],[87.819,20,5.713],[89.421,20,5.713],[91.024,20,5.713],[92.627,20,5.713],[94.23,20,5.713],[95.833,20,5.713],[97.435,20,5.713],[99.038,20,5.713],[100.64,20,5.713],[102.24,20,5.713],[103.85,20,5.713],[105.45,20,5.713],[107.05,20,5.713],[108.66,20,5.713],[110.26,20,5.713],[111.86,20,5.713],[113.46,20,5.713],[115.07,20,5.713],[116.67,20,5.713],[118.27,20,5.713],[119.87,20,5.713],[121.48,20,5.713],[123.08,20,5.713],[124.68,20,5.713],[126.29,20,5.713],[127.89,20,5.713],[129.49,20,5.713],[131.09,20,5.713],[132.7,20,5.713],[134.3,20,5.713],[70.188,20,6.856],[71.791,20,6.856],[73.393,20,6.856],[74.996,20,6.856],[76.599,20,6.856],[78.202,20,6.856],[79.805,20,6.856],[81.407,20,6.856],[83.01,20,6.856],[84.613,20,6.856],[86.216,20,6.856],[87.819,20,6.856],[89.421,20,6.856],[91.024,20,6.856],[92.627,20,6.856],[94.23,20,6.856],[95.833,20,6.856],[97.435,20,6.856],[99.038,20,6.856],[100.64,20,6.856],[102.24,20,6.856],[103.85,20,6.856],[105.45,20,6.856],[107.05,20,6.856],[108.66,20,6.856],[110.26,20,6.856],[111.86,20,6.856],[113.46,20,6.856],[115.07,20,6.856],[116.67,20,6.856],[118.27,20,6.856],[119.87,20,6.856],[121.48,20,6.856],[123.08,20,6.856],[124.68,20,6.856],[126.29,20,6.856],[127.89,20,6.856],[129.49,20,6.856],[131.09,20,6.856],[132.7,20,6.856],[134.3,20,6.856],[70.188,20,7.999],[71.791,20,7.999],[73.393,20,7.999],[74.996,20,7.999],[76.599,20,7.999],[78.202,20,7.999],[79.805,20,7.999],[81.407,20,7.999],[83.01,20,7.999],[84.613,20,7.999],[86.216,20,7.999],[87.819,20,7.999],[89.421,20,7.999],[91.024,20,7.999],[92.627,20,7.999],[94.23,20,7.999],[95.833,20,7.999],[97.435,20,7.999],[99.038,20,7.999],[100.64,20,7.999],[102.24,20,7.999],[103.85,20,7.999],[105.45,20,7.999],[107.05,20,7.999],[108.66,20,7.999],[110.26,20,7.999],[111.86,20,7.999],[113.46,20,7.999],[115.07,20,7.999],[116.67,20,7.999],[118.27,20,7.999],[119.87,20,7.999],[121.48,20,7.999],[123.08,20,7.999],[124.68,20,7.999],[126.29,20,7.999],[127.89,20,7.999],[129.49,20,7.999],[131.09,20,7.999],[132.7,20,7.999],[134.3,20,7.999],[70.188,20,9.142],[71.791,20,9.142],[73.393,20,9.142],[74.996,20,9.142],[76.599,20,9.142],[78.202,20,9.142],[79.805,20,9.142],[81.407,20,9.142],[83.01,20,9.142],[84.613,20,9.142],[86.216,20,9.142],[87.819,20,9.142],[89.421,20,9.142],[91.024,20,9.142],[92.627,20,9.142],[94.23,20,9.142],[95.833,20,9.142],[97.435,20,9.142],[99.038,20,9.142],[100.64,20,9.142],[102.24,20,9.142],[103.85,20,9.142],[105.45,20,9.142],[107.05,20,9.142],[108.66,20,9.142],[110.26,20,9.142],[111.86,20,9.142],[113.46,20,9.142],[115.07,20,9.142],[116.67,20,9.142],[118.27,20,9.142],[119.87,20,9.142],[121.48,20,9.142],[123.08,20,9.142],[124.68,20,9.142],[126.29,20,9.142],[127.89,20,9.142],[129.49,20,9.142],[131.09,20,9.142],[132.7,20,9.142],[134.3,20,9.142],[70.188,20,10.285],[71.791,20,10.285],[73.393,20,10.285],[74.996,20,10.285],[76.599,20,10.285],[78.202,20,10.285],[79.805,20,10.285],[81.407,20,10.285],[83.01,20,10.285],[84.613,20,10.285],[86.216,20,10.285],[87.819,20,10.285],[89.421,20,10.285],[91.024,20,10.285],[92.627,20,10.285],[94.23,20,10.285],[95.833,20,10.285],[97.435,20,10.285],[99.038,20,10.285],[100.64,20,10.285],[102.24,20,10.285],[103.85,20,10.285],[105.45,20,10.285],[107.05,20,10.285],[108.66,20,10.285],[110.26,20,10.285],[111.86,20,10.285],[113.46,20,10.285],[115.07,20,10.285],[116.67,20,10.285],[118.27,20,10.285],[119.87,20,10.285],[121.48,20,10.285],[123.08,20,10.285],[124.68,20,10.285],[126.29,20,10.285],[127.89,20,10.285],[129.49,20,10.285],[131.09,20,10.285],[132.7,20,10.285],[134.3,20,10.285],[70.188,20,11.428],[71.791,20,11.428],[73.393,20,11.428],[74.996,20,11.428],[76.599,20,11.428],[78.202,20,11.428],[79.805,20,11.428],[81.407,20,11.428],[83.01,20,11.428],[84.613,20,11.428],[86.216,20,11.428],[87.819,20,11.428],[89.421,20,11.428],[91.024,20,11.428],[92.627,20,11.428],[94.23,20,11.428],[95.833,20,11.428],[97.435,20,11.428],[99.038,20,11.428],[100.64,20,11.428],[102.24,20,11.428],[103.85,20,11.428],[105.45,20,11.428],[107.05,20,11.428],[108.66,20,11.428],[110.26,20,11.428],[111.86,20,11.428],[113.46,20,11.428],[115.07,20,11.428],[116.67,20,11.428],[118.27,20,11.428],[119.87,20,11.428],[121.48,20,11.428],[123.08,20,11.428],[124.68,20,11.428],[126.29,20,11.428],[127.89,20,11.428],[129.49,20,11.428],[131.09,20,11.428],[132.7,20,11.428],[134.3,20,11.428],[70.188,20,12.571],[71.791,20,12.571],[73.393,20,12.571],[74.996,20,12.571],[76.599,20,12.571],[78.202,20,12.571],[79.805,20,12.571],[81.407,20,12.571],[83.01,20,12.571],[84.613,20,12.571],[86.216,20,12.571],[87.819,20,12.571],[89.421,20,12.571],[91.024,20,12.571],[92.627,20,12.571],[94.23,20,12.571],[95.833,20,12.571],[97.435,20,12.571],[99.038,20,12.571],[100.64,20,12.571],[102.24,20,12.571],[103.85,20,12.571],[105.45,20,12.571],[107.05,20,12.571],[108.66,20,12.571],[110.26,20,12.571],[111.86,20,12.571],[113.46,20,12.571],[115.07,20,12.571],[116.67,20,12.571],[118.27,20,12.571],[119.87,20,12.571],[121.48,20,12.571],[123.08,20,12.571],[124.68,20,12.571],[126.29,20,12.571],[127.89,20,12.571],[129.49,20,12.571],[131.09,20,12.571],[132.7,20,12.571],[134.3,20,12.571],[70.188,20,13.714],[71.791,20,13.714],[73.393,20,13.714],[74.996,20,13.714],[76.599,20,13.714],[78.202,20,13.714],[79.805,20,13.714],[81.407,20,13.714],[83.01,20,13.714],[84.613,20,13.714],[86.216,20,13.714],[87.819,20,13.714],[89.421,20,13.714],[91.024,20,13.714],[92.627,20,13.714],[94.23,20,13.714],[95.833,20,13.714],[97.435,20,13.714],[99.038,20,13.714],[100.64,20,13.714],[102.24,20,13.714],[103.85,20,13.714],[105.45,20,13.714],[107.05,20,13.714],[108.66,20,13.714],[110.26,20,13.714],[111.86,20,13.714],[113.46,20,13.714],[115.07,20,13.714],[116.67,20,13.714],[118.27,20,13.714],[119.87,20,13.714],[121.48,20,13.714],[123.08,20,13.714],[124.68,20,13.714],[126.29,20,13.714],[127.89,20,13.714],[129.49,20,13.714],[131.09,20,13.714],[132.7,20,13.714],[134.3,20,13.714],[70.188,20,14.857],[71.791,20,14.857],[73.393,20,14.857],[74.996,20,14.857],[76.599,20,14.857],[78.202,20,14.857],[79.805,20,14.857],[81.407,20,14.857],[83.01,20,14.857],[84.613,20,14.857],[86.216,20,14.857],[87.819,20,14.857],[89.421,20,14.857],[91.024,20,14.857],[92.627,20,14.857],[94.23,20,14.857],[95.833,20,14.857],[97.435,20,14.857],[99.038,20,14.857],[100.64,20,14.857],[102.24,20,14.857],[103.85,20,14.857],[105.45,20,14.857],[107.05,20,14.857],[108.66,20,14.857],[110.26,20,14.857],[111.86,20,14.857],[113.46,20,14.857],[115.07,20,14.857],[116.67,20,14.857],[118.27,20,14.857],[119.87,20,14.857],[121.48,20,14.857],[123.08,20,14.857],[124.68,20,14.857],[126.29,20,14.857],[127.89,20,14.857],[129.49,20,14.857],[131.09,20,14.857],[132.7,20,14.857],[134.3,20,14.857],[70.188,20,16],[71.791,20,16],[73.393,20,16],[74.996,20,16],[76.599,20,16],[78.202,20,16],[79.805,20,16],[81.407,20,16],[83.01,20,16],[84.613,20,16],[86.216,20,16],[87.819,20,16],[89.421,20,16],[91.024,20,16],[92.627,20,16],[94.23,20,16],[95.833,20,16],[97.435,20,16],[99.038,20,16],[100.64,20,16],[102.24,20,16],[103.85,20,16],[105.45,20,16],[107.05,20,16],[108.66,20,16],[110.26,20,16],[111.86,20,16],[113.46,20,16],[115.07,20,16],[116.67,20,16],[118.27,20,16],[119.87,20,16],[121.48,20,16],[123.08,20,16],[124.68,20,16],[126.29,20,16],[127.89,20,16],[129.49,20,16],[131.09,20,16],[132.7,20,16],[134.3,20,16],[70.188,21.25,-0.002],[71.791,21.25,-0.002],[73.393,21.25,-0.002],[74.996,21.25,-0.002],[76.599,21.25,-0.002],[78.202,21.25,-0.002],[79.805,21.25,-0.002],[81.407,21.25,-0.002],[83.01,21.25,-0.002],[84.613,21.25,-0.002],[86.216,21.25,-0.002],[87.819,21.25,-0.002],[89.421,21.25,-0.002],[91.024,21.25,-0.002],[92.627,21.25,-0.002],[94.23,21.25,-0.002],[95.833,21.25,-0.002],[97.435,21.25,-0.002],[99.038,21.25,-0.002],[100.64,21.25,-0.002],[102.24,21.25,-0.002],[103.85,21.25,-0.002],[105.45,21.25,-0.002],[107.05,21.25,-0.002],[108.66,21.25,-0.002],[110.26,21.25,-0.002],[111.86,21.25,-0.002],[113.46,21.25,-0.002],[115.07,21.25,-0.002],[116.67,21.25,-0.002],[118.27,21.25,-0.002],[119.87,21.25,-0.002],[121.48,21.25,-0.002],[123.08,21.25,-0.002],[124.68,21.25,-0.002],[126.29,21.25,-0.002],[127.89,21.25,-0.002],[129.49,21.25,-0.002],[131.09,21.25,-0.002],[132.7,21.25,-0.002],[134.3,21.25,-0.002],[70.188,21.25,1.141],[71.791,21.25,1.141],[73.393,21.25,1.141],[74.996,21.25,1.141],[76.599,21.25,1.141],[78.202,21.25,1.141],[79.805,21.25,1.141],[81.407,21.25,1.141],[83.01,21.25,1.141],[84.613,21.25,1.141],[86.216,21.25,1.141],[87.819,21.25,1.141],[89.421,21.25,1.141],[91.024,21.25,1.141],[92.627,21.25,1.141],[94.23,21.25,1.141],[95.833,21.25,1.141],[97.435,21.25,1.141],[99.038,21.25,1.141],[100.64,21.25,1.141],[102.24,21.25,1.141],[103.85,21.25,1.141],[105.45,21.25,1.141],[107.05,21.25,1.141],[108.66,21.25,1.141],[110.26,21.25,1.141],[111.86,21.25,1.141],[113.46,21.25,1.141],[115.07,21.25,1.141],[116.67,21.25,1.141],[118.27,21.25,1.141],[119.87,21.25,1.141],[121.48,21.25,1.141],[123.08,21.25,1.141],[124.68,21.25,1.141],[126.29,21.25,1.141],[127.89,21.25,1.141],[129.49,21.25,1.141],[131.09,21.25,1.141],[132.7,21.25,1.141],[134.3,21.25,1.141],[70.188,21.25,2.284],[71.791,21.25,2.284],[73.393,21.25,2.284],[74.996,21.25,2.284],[76.599,21.25,2.284],[78.202,21.25,2.284],[79.805,21.25,2.284],[81.407,21.25,2.284],[83.01,21.25,2.284],[84.613,21.25,2.284],[86.216,21.25,2.284],[87.819,21.25,2.284],[89.421,21.25,2.284],[91.024,21.25,2.284],[92.627,21.25,2.284],[94.23,21.25,2.284],[95.833,21.25,2.284],[97.435,21.25,2.284],[99.038,21.25,2.284],[100.64,21.25,2.284],[102.24,21.25,2.284],[103.85,21.25,2.284],[105.45,21.25,2.284],[107.05,21.25,2.284],[108.66,21.25,2.284],[110.26,21.25,2.284],[111.86,21.25,2.284],[113.46,21.25,2.284],[115.07,21.25,2.284],[116.67,21.25,2.284],[118.27,21.25,2.284],[119.87,21.25,2.284],[121.48,21.25,2.284],[123.08,21.25,2.284],[124.68,21.25,2.284],[126.29,21.25,2.284],[127.89,21.25,2.284],[129.49,21.25,2.284],[131.09,21.25,2.284],[132.7,21.25,2.284],[134.3,21.25,2.284],[70.188,21.25,3.427],[71.791,21.25,3.427],[73.393,21.25,3.427],[74.996,21.25,3.427],[76.599,21.25,3.427],[78.202,21.25,3.427],[79.805,21.25,3.427],[81.407,21.25,3.427],[83.01,21.25,3.427],[84.613,21.25,3.427],[86.216,21.25,3.427],[87.819,21.25,3.427],[89.421,21.25,3.427],[91.024,21.25,3.427],[92.627,21.25,3.427],[94.23,21.25,3.427],[95.833,21.25,3.427],[97.435,21.25,3.427],[99.038,21.25,3.427],[100.64,21.25,3.427],[102.24,21.25,3.427],[103.85,21.25,3.427],[105.45,21.25,3.427],[107.05,21.25,3.427],[108.66,21.25,3.427],[110.26,21.25,3.427],[111.86,21.25,3.427],[113.46,21.25,3.427],[115.07,21.25,3.427],[116.67,21.25,3.427],[118.27,21.25,3.427],[119.87,21.25,3.427],[121.48,21.25,3.427],[123.08,21.25,3.427],[124.68,21.25,3.427],[126.29,21.25,3.427],[127.89,21.25,3.427],[129.49,21.25,3.427],[131.09,21.25,3.427],[132.7,21.25,3.427],[134.3,21.25,3.427],[70.188,21.25,4.57],[71.791,21.25,4.57],[73.393,21.25,4.57],[74.996,21.25,4.57],[76.599,21.25,4.57],[78.202,21.25,4.57],[79.805,21.25,4.57],[81.407,21.25,4.57],[83.01,21.25,4.57],[84.613,21.25,4.57],[86.216,21.25,4.57],[87.819,21.25,4.57],[89.421,21.25,4.57],[91.024,21.25,4.57],[92.627,21.25,4.57],[94.23,21.25,4.57],[95.833,21.25,4.57],[97.435,21.25,4.57],[99.038,21.25,4.57],[100.64,21.25,4.57],[102.24,21.25,4.57],[103.85,21.25,4.57],[105.45,21.25,4.57],[107.05,21.25,4.57],[108.66,21.25,4.57],[110.26,21.25,4.57],[111.86,21.25,4.57],[113.46,21.25,4.57],[115.07,21.25,4.57],[116.67,21.25,4.57],[118.27,21.25,4.57],[119.87,21.25,4.57],[121.48,21.25,4.57],[123.08,21.25,4.57],[124.68,21.25,4.57],[126.29,21.25,4.57],[127.89,21.25,4.57],[129.49,21.25,4.57],[131.09,21.25,4.57],[132.7,21.25,4.57],[134.3,21.25,4.57],[70.188,21.25,5.713],[71.791,21.25,5.713],[73.393,21.25,5.713],[74.996,21.25,5.713],[76.599,21.25,5.713],[78.202,21.25,5.713],[79.805,21.25,5.713],[81.407,21.25,5.713],[83.01,21.25,5.713],[84.613,21.25,5.713],[86.216,21.25,5.713],[87.819,21.25,5.713],[89.421,21.25,5.713],[91.024,21.25,5.713],[92.627,21.25,5.713],[94.23,21.25,5.713],[95.833,21.25,5.713],[97.435,21.25,5.713],[99.038,21.25,5.713],[100.64,21.25,5.713],[102.24,21.25,5.713],[103.85,21.25,5.713],[105.45,21.25,5.713],[107.05,21.25,5.713],[108.66,21.25,5.713],[110.26,21.25,5.713],[111.86,21.25,5.713],[113.46,21.25,5.713],[115.07,21.25,5.713],[116.67,21.25,5.713],[118.27,21.25,5.713],[119.87,21.25,5.713],[121.48,21.25,5.713],[123.08,21.25,5.713],[124.68,21.25,5.713],[126.29,21.25,5.713],[127.89,21.25,5.713],[129.49,21.25,5.713],[131.09,21.25,5.713],[132.7,21.25,5.713],[134.3,21.25,5.713],[70.188,21.25,6.856],[71.791,21.25,6.856],[73.393,21.25,6.856],[74.996,21.25,6.856],[76.599,21.25,6.856],[78.202,21.25,6.856],[79.805,21.25,6.856],[81.407,21.25,6.856],[83.01,21.25,6.856],[84.613,21.25,6.856],[86.216,21.25,6.856],[87.819,21.25,6.856],[89.421,21.25,6.856],[91.024,21.25,6.856],[92.627,21.25,6.856],[94.23,21.25,6.856],[95.833,21.25,6.856],[97.435,21.25,6.856],[99.038,21.25,6.856],[100.64,21.25,6.856],[102.24,21.25,6.856],[103.85,21.25,6.856],[105.45,21.25,6.856],[107.05,21.25,6.856],[108.66,21.25,6.856],[110.26,21.25,6.856],[111.86,21.25,6.856],[113.46,21.25,6.856],[115.07,21.25,6.856],[116.67,21.25,6.856],[118.27,21.25,6.856],[119.87,21.25,6.856],[121.48,21.25,6.856],[123.08,21.25,6.856],[124.68,21.25,6.856],[126.29,21.25,6.856],[127.89,21.25,6.856],[129.49,21.25,6.856],[131.09,21.25,6.856],[132.7,21.25,6.856],[134.3,21.25,6.856],[70.188,21.25,7.999],[71.791,21.25,7.999],[73.393,21.25,7.999],[74.996,21.25,7.999],[76.599,21.25,7.999],[78.202,21.25,7.999],[79.805,21.25,7.999],[81.407,21.25,7.999],[83.01,21.25,7.999],[84.613,21.25,7.999],[86.216,21.25,7.999],[87.819,21.25,7.999],[89.421,21.25,7.999],[91.024,21.25,7.999],[92.627,21.25,7.999],[94.23,21.25,7.999],[95.833,21.25,7.999],[97.435,21.25,7.999],[99.038,21.25,7.999],[100.64,21.25,7.999],[102.24,21.25,7.999],[103.85,21.25,7.999],[105.45,21.25,7.999],[107.05,21.25,7.999],[108.66,21.25,7.999],[110.26,21.25,7.999],[111.86,21.25,7.999],[113.46,21.25,7.999],[115.07,21.25,7.999],[116.67,21.25,7.999],[118.27,21.25,7.999],[119.87,21.25,7.999],[121.48,21.25,7.999],[123.08,21.25,7.999],[124.68,21.25,7.999],[126.29,21.25,7.999],[127.89,21.25,7.999],[129.49,21.25,7.999],[131.09,21.25,7.999],[132.7,21.25,7.999],[134.3,21.25,7.999],[70.188,21.25,9.142],[71.791,21.25,9.142],[73.393,21.25,9.142],[74.996,21.25,9.142],[76.599,21.25,9.142],[78.202,21.25,9.142],[79.805,21.25,9.142],[81.407,21.25,9.142],[83.01,21.25,9.142],[84.613,21.25,9.142],[86.216,21.25,9.142],[87.819,21.25,9.142],[89.421,21.25,9.142],[91.024,21.25,9.142],[92.627,21.25,9.142],[94.23,21.25,9.142],[95.833,21.25,9.142],[97.435,21.25,9.142],[99.038,21.25,9.142],[100.64,21.25,9.142],[102.24,21.25,9.142],[103.85,21.25,9.142],[105.45,21.25,9.142],[107.05,21.25,9.142],[108.66,21.25,9.142],[110.26,21.25,9.142],[111.86,21.25,9.142],[113.46,21.25,9.142],[115.07,21.25,9.142],[116.67,21.25,9.142],[118.27,21.25,9.142],[119.87,21.25,9.142],[121.48,21.25,9.142],[123.08,21.25,9.142],[124.68,21.25,9.142],[126.29,21.25,9.142],[127.89,21.25,9.142],[129.49,21.25,9.142],[131.09,21.25,9.142],[132.7,21.25,9.142],[134.3,21.25,9.142],[70.188,21.25,10.285],[71.791,21.25,10.285],[73.393,21.25,10.285],[74.996,21.25,10.285],[76.599,21.25,10.285],[78.202,21.25,10.285],[79.805,21.25,10.285],[81.407,21.25,10.285],[83.01,21.25,10.285],[84.613,21.25,10.285],[86.216,21.25,10.285],[87.819,21.25,10.285],[89.421,21.25,10.285],[91.024,21.25,10.285],[92.627,21.25,10.285],[94.23,21.25,10.285],[95.833,21.25,10.285],[97.435,21.25,10.285],[99.038,21.25,10.285],[100.64,21.25,10.285],[102.24,21.25,10.285],[103.85,21.25,10.285],[105.45,21.25,10.285],[107.05,21.25,10.285],[108.66,21.25,10.285],[110.26,21.25,10.285],[111.86,21.25,10.285],[113.46,21.25,10.285],[115.07,21.25,10.285],[116.67,21.25,10.285],[118.27,21.25,10.285],[119.87,21.25,10.285],[121.48,21.25,10.285],[123.08,21.25,10.285],[124.68,21.25,10.285],[126.29,21.25,10.285],[127.89,21.25,10.285],[129.49,21.25,10.285],[131.09,21.25,10.285],[132.7,21.25,10.285],[134.3,21.25,10.285],[70.188,21.25,11.428],[71.791,21.25,11.428],[73.393,21.25,11.428],[74.996,21.25,11.428],[76.599,21.25,11.428],[78.202,21.25,11.428],[79.805,21.25,11.428],[81.407,21.25,11.428],[83.01,21.25,11.428],[84.613,21.25,11.428],[86.216,21.25,11.428],[87.819,21.25,11.428],[89.421,21.25,11.428],[91.024,21.25,11.428],[92.627,21.25,11.428],[94.23,21.25,11.428],[95.833,21.25,11.428],[97.435,21.25,11.428],[99.038,21.25,11.428],[100.64,21.25,11.428],[102.24,21.25,11.428],[103.85,21.25,11.428],[105.45,21.25,11.428],[107.05,21.25,11.428],[108.66,21.25,11.428],[110.26,21.25,11.428],[111.86,21.25,11.428],[113.46,21.25,11.428],[115.07,21.25,11.428],[116.67,21.25,11.428],[118.27,21.25,11.428],[119.87,21.25,11.428],[121.48,21.25,11.428],[123.08,21.25,11.428],[124.68,21.25,11.428],[126.29,21.25,11.428],[127.89,21.25,11.428],[129.49,21.25,11.428],[131.09,21.25,11.428],[132.7,21.25,11.428],[134.3,21.25,11.428],[70.188,21.25,12.571],[71.791,21.25,12.571],[73.393,21.25,12.571],[74.996,21.25,12.571],[76.599,21.25,12.571],[78.202,21.25,12.571],[79.805,21.25,12.571],[81.407,21.25,12.571],[83.01,21.25,12.571],[84.613,21.25,12.571],[86.216,21.25,12.571],[87.819,21.25,12.571],[89.421,21.25,12.571],[91.024,21.25,12.571],[92.627,21.25,12.571],[94.23,21.25,12.571],[95.833,21.25,12.571],[97.435,21.25,12.571],[99.038,21.25,12.571],[100.64,21.25,12.571],[102.24,21.25,12.571],[103.85,21.25,12.571],[105.45,21.25,12.571],[107.05,21.25,12.571],[108.66,21.25,12.571],[110.26,21.25,12.571],[111.86,21.25,12.571],[113.46,21.25,12.571],[115.07,21.25,12.571],[116.67,21.25,12.571],[118.27,21.25,12.571],[119.87,21.25,12.571],[121.48,21.25,12.571],[123.08,21.25,12.571],[124.68,21.25,12.571],[126.29,21.25,12.571],[127.89,21.25,12.571],[129.49,21.25,12.571],[131.09,21.25,12.571],[132.7,21.25,12.571],[134.3,21.25,12.571],[70.188,21.25,13.714],[71.791,21.25,13.714],[73.393,21.25,13.714],[74.996,21.25,13.714],[76.599,21.25,13.714],[78.202,21.25,13.714],[79.805,21.25,13.714],[81.407,21.25,13.714],[83.01,21.25,13.714],[84.613,21.25,13.714],[86.216,21.25,13.714],[87.819,21.25,13.714],[89.421,21.25,13.714],[91.024,21.25,13.714],[92.627,21.25,13.714],[94.23,21.25,13.714],[95.833,21.25,13.714],[97.435,21.25,13.714],[99.038,21.25,13.714],[100.64,21.25,13.714],[102.24,21.25,13.714],[103.85,21.25,13.714],[105.45,21.25,13.714],[107.05,21.25,13.714],[108.66,21.25,13.714],[110.26,21.25,13.714],[111.86,21.25,13.714],[113.46,21.25,13.714],[115.07,21.25,13.714],[116.67,21.25,13.714],[118.27,21.25,13.714],[119.87,21.25,13.714],[121.48,21.25,13.714],[123.08,21.25,13.714],[124.68,21.25,13.714],[126.29,21.25,13.714],[127.89,21.25,13.714],[129.49,21.25,13.714],[131.09,21.25,13.714],[132.7,21.25,13.714],[134.3,21.25,13.714],[70.188,21.25,14.857],[71.791,21.25,14.857],[73.393,21.25,14.857],[74.996,21.25,14.857],[76.599,21.25,14.857],[78.202,21.25,14.857],[79.805,21.25,14.857],[81.407,21.25,14.857],[83.01,21.25,14.857],[84.613,21.25,14.857],[86.216,21.25,14.857],[87.819,21.25,14.857],[89.421,21.25,14.857],[91.024,21.25,14.857],[92.627,21.25,14.857],[94.23,21.25,14.857],[95.833,21.25,14.857],[97.435,21.25,14.857],[99.038,21.25,14.857],[100.64,21.25,14.857],[102.24,21.25,14.857],[103.85,21.25,14.857],[105.45,21.25,14.857],[107.05,21.25,14.857],[108.66,21.25,14.857],[110.26,21.25,14.857],[111.86,21.25,14.857],[113.46,21.25,14.857],[115.07,21.25,14.857],[116.67,21.25,14.857],[118.27,21.25,14.857],[119.87,21.25,14.857],[121.48,21.25,14.857],[123.08,21.25,14.857],[124.68,21.25,14.857],[126.29,21.25,14.857],[127.89,21.25,14.857],[129.49,21.25,14.857],[131.09,21.25,14.857],[132.7,21.25,14.857],[134.3,21.25,14.857],[70.188,21.25,16],[71.791,21.25,16],[73.393,21.25,16],[74.996,21.25,16],[76.599,21.25,16],[78.202,21.25,16],[79.805,21.25,16],[81.407,21.25,16],[83.01,21.25,16],[84.613,21.25,16],[86.216,21.25,16],[87.819,21.25,16],[89.421,21.25,16],[91.024,21.25,16],[92.627,21.25,16],[94.23,21.25,16],[95.833,21.25,16],[97.435,21.25,16],[99.038,21.25,16],[100.64,21.25,16],[102.24,21.25,16],[103.85,21.25,16],[105.45,21.25,16],[107.05,21.25,16],[108.66,21.25,16],[110.26,21.25,16],[111.86,21.25,16],[113.46,21.25,16],[115.07,21.25,16],[116.67,21.25,16],[118.27,21.25,16],[119.87,21.25,16],[121.48,21.25,16],[123.08,21.25,16],[124.68,21.25,16],[126.29,21.25,16],[127.89,21.25,16],[129.49,21.25,16],[131.09,21.25,16],[132.7,21.25,16],[134.3,21.25,16],[70.188,22.5,-0.002],[71.791,22.5,-0.002],[73.393,22.5,-0.002],[74.996,22.5,-0.002],[76.599,22.5,-0.002],[78.202,22.5,-0.002],[79.805,22.5,-0.002],[81.407,22.5,-0.002],[83.01,22.5,-0.002],[84.613,22.5,-0.002],[86.216,22.5,-0.002],[87.819,22.5,-0.002],[89.421,22.5,-0.002],[91.024,22.5,-0.002],[92.627,22.5,-0.002],[94.23,22.5,-0.002],[95.833,22.5,-0.002],[97.435,22.5,-0.002],[99.038,22.5,-0.002],[100.64,22.5,-0.002],[102.24,22.5,-0.002],[103.85,22.5,-0.002],[105.45,22.5,-0.002],[107.05,22.5,-0.002],[108.66,22.5,-0.002],[110.26,22.5,-0.002],[111.86,22.5,-0.002],[113.46,22.5,-0.002],[115.07,22.5,-0.002],[116.67,22.5,-0.002],[118.27,22.5,-0.002],[119.87,22.5,-0.002],[121.48,22.5,-0.002],[123.08,22.5,-0.002],[124.68,22.5,-0.002],[126.29,22.5,-0.002],[127.89,22.5,-0.002],[129.49,22.5,-0.002],[131.09,22.5,-0.002],[132.7,22.5,-0.002],[134.3,22.5,-0.002],[70.188,22.5,1.141],[71.791,22.5,1.141],[73.393,22.5,1.141],[74.996,22.5,1.141],[76.599,22.5,1.141],[78.202,22.5,1.141],[79.805,22.5,1.141],[81.407,22.5,1.141],[83.01,22.5,1.141],[84.613,22.5,1.141],[86.216,22.5,1.141],[87.819,22.5,1.141],[89.421,22.5,1.141],[91.024,22.5,1.141],[92.627,22.5,1.141],[94.23,22.5,1.141],[95.833,22.5,1.141],[97.435,22.5,1.141],[99.038,22.5,1.141],[100.64,22.5,1.141],[102.24,22.5,1.141],[103.85,22.5,1.141],[105.45,22.5,1.141],[107.05,22.5,1.141],[108.66,22.5,1.141],[110.26,22.5,1.141],[111.86,22.5,1.141],[113.46,22.5,1.141],[115.07,22.5,1.141],[116.67,22.5,1.141],[118.27,22.5,1.141],[119.87,22.5,1.141],[121.48,22.5,1.141],[123.08,22.5,1.141],[124.68,22.5,1.141],[126.29,22.5,1.141],[127.89,22.5,1.141],[129.49,22.5,1.141],[131.09,22.5,1.141],[132.7,22.5,1.141],[134.3,22.5,1.141],[70.188,22.5,2.284],[71.791,22.5,2.284],[73.393,22.5,2.284],[74.996,22.5,2.284],[76.599,22.5,2.284],[78.202,22.5,2.284],[79.805,22.5,2.284],[81.407,22.5,2.284],[83.01,22.5,2.284],[84.613,22.5,2.284],[86.216,22.5,2.284],[87.819,22.5,2.284],[89.421,22.5,2.284],[91.024,22.5,2.284],[92.627,22.5,2.284],[94.23,22.5,2.284],[95.833,22.5,2.284],[97.435,22.5,2.284],[99.038,22.5,2.284],[100.64,22.5,2.284],[102.24,22.5,2.284],[103.85,22.5,2.284],[105.45,22.5,2.284],[107.05,22.5,2.284],[108.66,22.5,2.284],[110.26,22.5,2.284],[111.86,22.5,2.284],[113.46,22.5,2.284],[115.07,22.5,2.284],[116.67,22.5,2.284],[118.27,22.5,2.284],[119.87,22.5,2.284],[121.48,22.5,2.284],[123.08,22.5,2.284],[124.68,22.5,2.284],[126.29,22.5,2.284],[127.89,22.5,2.284],[129.49,22.5,2.284],[131.09,22.5,2.284],[132.7,22.5,2.284],[134.3,22.5,2.284],[70.188,22.5,3.427],[71.791,22.5,3.427],[73.393,22.5,3.427],[74.996,22.5,3.427],[76.599,22.5,3.427],[78.202,22.5,3.427],[79.805,22.5,3.427],[81.407,22.5,3.427],[83.01,22.5,3.427],[84.613,22.5,3.427],[86.216,22.5,3.427],[87.819,22.5,3.427],[89.421,22.5,3.427],[91.024,22.5,3.427],[92.627,22.5,3.427],[94.23,22.5,3.427],[95.833,22.5,3.427],[97.435,22.5,3.427],[99.038,22.5,3.427],[100.64,22.5,3.427],[102.24,22.5,3.427],[103.85,22.5,3.427],[105.45,22.5,3.427],[107.05,22.5,3.427],[108.66,22.5,3.427],[110.26,22.5,3.427],[111.86,22.5,3.427],[113.46,22.5,3.427],[115.07,22.5,3.427],[116.67,22.5,3.427],[118.27,22.5,3.427],[119.87,22.5,3.427],[121.48,22.5,3.427],[123.08,22.5,3.427],[124.68,22.5,3.427],[126.29,22.5,3.427],[127.89,22.5,3.427],[129.49,22.5,3.427],[131.09,22.5,3.427],[132.7,22.5,3.427],[134.3,22.5,3.427],[70.188,22.5,4.57],[71.791,22.5,4.57],[73.393,22.5,4.57],[74.996,22.5,4.57],[76.599,22.5,4.57],[78.202,22.5,4.57],[79.805,22.5,4.57],[81.407,22.5,4.57],[83.01,22.5,4.57],[84.613,22.5,4.57],[86.216,22.5,4.57],[87.819,22.5,4.57],[89.421,22.5,4.57],[91.024,22.5,4.57],[92.627,22.5,4.57],[94.23,22.5,4.57],[95.833,22.5,4.57],[97.435,22.5,4.57],[99.038,22.5,4.57],[100.64,22.5,4.57],[102.24,22.5,4.57],[103.85,22.5,4.57],[105.45,22.5,4.57],[107.05,22.5,4.57],[108.66,22.5,4.57],[110.26,22.5,4.57],[111.86,22.5,4.57],[113.46,22.5,4.57],[115.07,22.5,4.57],[116.67,22.5,4.57],[118.27,22.5,4.57],[119.87,22.5,4.57],[121.48,22.5,4.57],[123.08,22.5,4.57],[124.68,22.5,4.57],[126.29,22.5,4.57],[127.89,22.5,4.57],[129.49,22.5,4.57],[131.09,22.5,4.57],[132.7,22.5,4.57],[134.3,22.5,4.57],[70.188,22.5,5.713],[71.791,22.5,5.713],[73.393,22.5,5.713],[74.996,22.5,5.713],[76.599,22.5,5.713],[78.202,22.5,5.713],[79.805,22.5,5.713],[81.407,22.5,5.713],[83.01,22.5,5.713],[84.613,22.5,5.713],[86.216,22.5,5.713],[87.819,22.5,5.713],[89.421,22.5,5.713],[91.024,22.5,5.713],[92.627,22.5,5.713],[94.23,22.5,5.713],[95.833,22.5,5.713],[97.435,22.5,5.713],[99.038,22.5,5.713],[100.64,22.5,5.713],[102.24,22.5,5.713],[103.85,22.5,5.713],[105.45,22.5,5.713],[107.05,22.5,5.713],[108.66,22.5,5.713],[110.26,22.5,5.713],[111.86,22.5,5.713],[113.46,22.5,5.713],[115.07,22.5,5.713],[116.67,22.5,5.713],[118.27,22.5,5.713],[119.87,22.5,5.713],[121.48,22.5,5.713],[123.08,22.5,5.713],[124.68,22.5,5.713],[126.29,22.5,5.713],[127.89,22.5,5.713],[129.49,22.5,5.713],[131.09,22.5,5.713],[132.7,22.5,5.713],[134.3,22.5,5.713],[70.188,22.5,6.856],[71.791,22.5,6.856],[73.393,22.5,6.856],[74.996,22.5,6.856],[76.599,22.5,6.856],[78.202,22.5,6.856],[79.805,22.5,6.856],[81.407,22.5,6.856],[83.01,22.5,6.856],[84.613,22.5,6.856],[86.216,22.5,6.856],[87.819,22.5,6.856],[89.421,22.5,6.856],[91.024,22.5,6.856],[92.627,22.5,6.856],[94.23,22.5,6.856],[95.833,22.5,6.856],[97.435,22.5,6.856],[99.038,22.5,6.856],[100.64,22.5,6.856],[102.24,22.5,6.856],[103.85,22.5,6.856],[105.45,22.5,6.856],[107.05,22.5,6.856],[108.66,22.5,6.856],[110.26,22.5,6.856],[111.86,22.5,6.856],[113.46,22.5,6.856],[115.07,22.5,6.856],[116.67,22.5,6.856],[118.27,22.5,6.856],[119.87,22.5,6.856],[121.48,22.5,6.856],[123.08,22.5,6.856],[124.68,22.5,6.856],[126.29,22.5,6.856],[127.89,22.5,6.856],[129.49,22.5,6.856],[131.09,22.5,6.856],[132.7,22.5,6.856],[134.3,22.5,6.856],[70.188,22.5,7.999],[71.791,22.5,7.999],[73.393,22.5,7.999],[74.996,22.5,7.999],[76.599,22.5,7.999],[78.202,22.5,7.999],[79.805,22.5,7.999],[81.407,22.5,7.999],[83.01,22.5,7.999],[84.613,22.5,7.999],[86.216,22.5,7.999],[87.819,22.5,7.999],[89.421,22.5,7.999],[91.024,22.5,7.999],[92.627,22.5,7.999],[94.23,22.5,7.999],[95.833,22.5,7.999],[97.435,22.5,7.999],[99.038,22.5,7.999],[100.64,22.5,7.999],[102.24,22.5,7.999],[103.85,22.5,7.999],[105.45,22.5,7.999],[107.05,22.5,7.999],[108.66,22.5,7.999],[110.26,22.5,7.999],[111.86,22.5,7.999],[113.46,22.5,7.999],[115.07,22.5,7.999],[116.67,22.5,7.999],[118.27,22.5,7.999],[119.87,22.5,7.999],[121.48,22.5,7.999],[123.08,22.5,7.999],[124.68,22.5,7.999],[126.29,22.5,7.999],[127.89,22.5,7.999],[129.49,22.5,7.999],[131.09,22.5,7.999],[132.7,22.5,7.999],[134.3,22.5,7.999],[70.188,22.5,9.142],[71.791,22.5,9.142],[73.393,22.5,9.142],[74.996,22.5,9.142],[76.599,22.5,9.142],[78.202,22.5,9.142],[79.805,22.5,9.142],[81.407,22.5,9.142],[83.01,22.5,9.142],[84.613,22.5,9.142],[86.216,22.5,9.142],[87.819,22.5,9.142],[89.421,22.5,9.142],[91.024,22.5,9.142],[92.627,22.5,9.142],[94.23,22.5,9.142],[95.833,22.5,9.142],[97.435,22.5,9.142],[99.038,22.5,9.142],[100.64,22.5,9.142],[102.24,22.5,9.142],[103.85,22.5,9.142],[105.45,22.5,9.142],[107.05,22.5,9.142],[108.66,22.5,9.142],[110.26,22.5,9.142],[111.86,22.5,9.142],[113.46,22.5,9.142],[115.07,22.5,9.142],[116.67,22.5,9.142],[118.27,22.5,9.142],[119.87,22.5,9.142],[121.48,22.5,9.142],[123.08,22.5,9.142],[124.68,22.5,9.142],[126.29,22.5,9.142],[127.89,22.5,9.142],[129.49,22.5,9.142],[131.09,22.5,9.142],[132.7,22.5,9.142],[134.3,22.5,9.142],[70.188,22.5,10.285],[71.791,22.5,10.285],[73.393,22.5,10.285],[74.996,22.5,10.285],[76.599,22.5,10.285],[78.202,22.5,10.285],[79.805,22.5,10.285],[81.407,22.5,10.285],[83.01,22.5,10.285],[84.613,22.5,10.285],[86.216,22.5,10.285],[87.819,22.5,10.285],[89.421,22.5,10.285],[91.024,22.5,10.285],[92.627,22.5,10.285],[94.23,22.5,10.285],[95.833,22.5,10.285],[97.435,22.5,10.285],[99.038,22.5,10.285],[100.64,22.5,10.285],[102.24,22.5,10.285],[103.85,22.5,10.285],[105.45,22.5,10.285],[107.05,22.5,10.285],[108.66,22.5,10.285],[110.26,22.5,10.285],[111.86,22.5,10.285],[113.46,22.5,10.285],[115.07,22.5,10.285],[116.67,22.5,10.285],[118.27,22.5,10.285],[119.87,22.5,10.285],[121.48,22.5,10.285],[123.08,22.5,10.285],[124.68,22.5,10.285],[126.29,22.5,10.285],[127.89,22.5,10.285],[129.49,22.5,10.285],[131.09,22.5,10.285],[132.7,22.5,10.285],[134.3,22.5,10.285],[70.188,22.5,11.428],[71.791,22.5,11.428],[73.393,22.5,11.428],[74.996,22.5,11.428],[76.599,22.5,11.428],[78.202,22.5,11.428],[79.805,22.5,11.428],[81.407,22.5,11.428],[83.01,22.5,11.428],[84.613,22.5,11.428],[86.216,22.5,11.428],[87.819,22.5,11.428],[89.421,22.5,11.428],[91.024,22.5,11.428],[92.627,22.5,11.428],[94.23,22.5,11.428],[95.833,22.5,11.428],[97.435,22.5,11.428],[99.038,22.5,11.428],[100.64,22.5,11.428],[102.24,22.5,11.428],[103.85,22.5,11.428],[105.45,22.5,11.428],[107.05,22.5,11.428],[108.66,22.5,11.428],[110.26,22.5,11.428],[111.86,22.5,11.428],[113.46,22.5,11.428],[115.07,22.5,11.428],[116.67,22.5,11.428],[118.27,22.5,11.428],[119.87,22.5,11.428],[121.48,22.5,11.428],[123.08,22.5,11.428],[124.68,22.5,11.428],[126.29,22.5,11.428],[127.89,22.5,11.428],[129.49,22.5,11.428],[131.09,22.5,11.428],[132.7,22.5,11.428],[134.3,22.5,11.428],[70.188,22.5,12.571],[71.791,22.5,12.571],[73.393,22.5,12.571],[74.996,22.5,12.571],[76.599,22.5,12.571],[78.202,22.5,12.571],[79.805,22.5,12.571],[81.407,22.5,12.571],[83.01,22.5,12.571],[84.613,22.5,12.571],[86.216,22.5,12.571],[87.819,22.5,12.571],[89.421,22.5,12.571],[91.024,22.5,12.571],[92.627,22.5,12.571],[94.23,22.5,12.571],[95.833,22.5,12.571],[97.435,22.5,12.571],[99.038,22.5,12.571],[100.64,22.5,12.571],[102.24,22.5,12.571],[103.85,22.5,12.571],[105.45,22.5,12.571],[107.05,22.5,12.571],[108.66,22.5,12.571],[110.26,22.5,12.571],[111.86,22.5,12.571],[113.46,22.5,12.571],[115.07,22.5,12.571],[116.67,22.5,12.571],[118.27,22.5,12.571],[119.87,22.5,12.571],[121.48,22.5,12.571],[123.08,22.5,12.571],[124.68,22.5,12.571],[126.29,22.5,12.571],[127.89,22.5,12.571],[129.49,22.5,12.571],[131.09,22.5,12.571],[132.7,22.5,12.571],[134.3,22.5,12.571],[70.188,22.5,13.714],[71.791,22.5,13.714],[73.393,22.5,13.714],[74.996,22.5,13.714],[76.599,22.5,13.714],[78.202,22.5,13.714],[79.805,22.5,13.714],[81.407,22.5,13.714],[83.01,22.5,13.714],[84.613,22.5,13.714],[86.216,22.5,13.714],[87.819,22.5,13.714],[89.421,22.5,13.714],[91.024,22.5,13.714],[92.627,22.5,13.714],[94.23,22.5,13.714],[95.833,22.5,13.714],[97.435,22.5,13.714],[99.038,22.5,13.714],[100.64,22.5,13.714],[102.24,22.5,13.714],[103.85,22.5,13.714],[105.45,22.5,13.714],[107.05,22.5,13.714],[108.66,22.5,13.714],[110.26,22.5,13.714],[111.86,22.5,13.714],[113.46,22.5,13.714],[115.07,22.5,13.714],[116.67,22.5,13.714],[118.27,22.5,13.714],[119.87,22.5,13.714],[121.48,22.5,13.714],[123.08,22.5,13.714],[124.68,22.5,13.714],[126.29,22.5,13.714],[127.89,22.5,13.714],[129.49,22.5,13.714],[131.09,22.5,13.714],[132.7,22.5,13.714],[134.3,22.5,13.714],[70.188,22.5,14.857],[71.791,22.5,14.857],[73.393,22.5,14.857],[74.996,22.5,14.857],[76.599,22.5,14.857],[78.202,22.5,14.857],[79.805,22.5,14.857],[81.407,22.5,14.857],[83.01,22.5,14.857],[84.613,22.5,14.857],[86.216,22.5,14.857],[87.819,22.5,14.857],[89.421,22.5,14.857],[91.024,22.5,14.857],[92.627,22.5,14.857],[94.23,22.5,14.857],[95.833,22.5,14.857],[97.435,22.5,14.857],[99.038,22.5,14.857],[100.64,22.5,14.857],[102.24,22.5,14.857],[103.85,22.5,14.857],[105.45,22.5,14.857],[107.05,22.5,14.857],[108.66,22.5,14.857],[110.26,22.5,14.857],[111.86,22.5,14.857],[113.46,22.5,14.857],[115.07,22.5,14.857],[116.67,22.5,14.857],[118.27,22.5,14.857],[119.87,22.5,14.857],[121.48,22.5,14.857],[123.08,22.5,14.857],[124.68,22.5,14.857],[126.29,22.5,14.857],[127.89,22.5,14.857],[129.49,22.5,14.857],[131.09,22.5,14.857],[132.7,22.5,14.857],[134.3,22.5,14.857],[70.188,22.5,16],[71.791,22.5,16],[73.393,22.5,16],[74.996,22.5,16],[76.599,22.5,16],[78.202,22.5,16],[79.805,22.5,16],[81.407,22.5,16],[83.01,22.5,16],[84.613,22.5,16],[86.216,22.5,16],[87.819,22.5,16],[89.421,22.5,16],[91.024,22.5,16],[92.627,22.5,16],[94.23,22.5,16],[95.833,22.5,16],[97.435,22.5,16],[99.038,22.5,16],[100.64,22.5,16],[102.24,22.5,16],[103.85,22.5,16],[105.45,22.5,16],[107.05,22.5,16],[108.66,22.5,16],[110.26,22.5,16],[111.86,22.5,16],[113.46,22.5,16],[115.07,22.5,16],[116.67,22.5,16],[118.27,22.5,16],[119.87,22.5,16],[121.48,22.5,16],[123.08,22.5,16],[124.68,22.5,16],[126.29,22.5,16],[127.89,22.5,16],[129.49,22.5,16],[131.09,22.5,16],[132.7,22.5,16],[134.3,22.5,16],[70.188,23.75,-0.002],[71.791,23.75,-0.002],[73.393,23.75,-0.002],[74.996,23.75,-0.002],[76.599,23.75,-0.002],[78.202,23.75,-0.002],[79.805,23.75,-0.002],[81.407,23.75,-0.002],[83.01,23.75,-0.002],[84.613,23.75,-0.002],[86.216,23.75,-0.002],[87.819,23.75,-0.002],[89.421,23.75,-0.002],[91.024,23.75,-0.002],[92.627,23.75,-0.002],[94.23,23.75,-0.002],[95.833,23.75,-0.002],[97.435,23.75,-0.002],[99.038,23.75,-0.002],[100.64,23.75,-0.002],[102.24,23.75,-0.002],[103.85,23.75,-0.002],[105.45,23.75,-0.002],[107.05,23.75,-0.002],[108.66,23.75,-0.002],[110.26,23.75,-0.002],[111.86,23.75,-0.002],[113.46,23.75,-0.002],[115.07,23.75,-0.002],[116.67,23.75,-0.002],[118.27,23.75,-0.002],[119.87,23.75,-0.002],[121.48,23.75,-0.002],[123.08,23.75,-0.002],[124.68,23.75,-0.002],[126.29,23.75,-0.002],[127.89,23.75,-0.002],[129.49,23.75,-0.002],[131.09,23.75,-0.002],[132.7,23.75,-0.002],[134.3,23.75,-0.002],[70.188,23.75,1.141],[71.791,23.75,1.141],[73.393,23.75,1.141],[74.996,23.75,1.141],[76.599,23.75,1.141],[78.202,23.75,1.141],[79.805,23.75,1.141],[81.407,23.75,1.141],[83.01,23.75,1.141],[84.613,23.75,1.141],[86.216,23.75,1.141],[87.819,23.75,1.141],[89.421,23.75,1.141],[91.024,23.75,1.141],[92.627,23.75,1.141],[94.23,23.75,1.141],[95.833,23.75,1.141],[97.435,23.75,1.141],[99.038,23.75,1.141],[100.64,23.75,1.141],[102.24,23.75,1.141],[103.85,23.75,1.141],[105.45,23.75,1.141],[107.05,23.75,1.141],[108.66,23.75,1.141],[110.26,23.75,1.141],[111.86,23.75,1.141],[113.46,23.75,1.141],[115.07,23.75,1.141],[116.67,23.75,1.141],[118.27,23.75,1.141],[119.87,23.75,1.141],[121.48,23.75,1.141],[123.08,23.75,1.141],[124.68,23.75,1.141],[126.29,23.75,1.141],[127.89,23.75,1.141],[129.49,23.75,1.141],[131.09,23.75,1.141],[132.7,23.75,1.141],[134.3,23.75,1.141],[70.188,23.75,2.284],[71.791,23.75,2.284],[73.393,23.75,2.284],[74.996,23.75,2.284],[76.599,23.75,2.284],[78.202,23.75,2.284],[79.805,23.75,2.284],[81.407,23.75,2.284],[83.01,23.75,2.284],[84.613,23.75,2.284],[86.216,23.75,2.284],[87.819,23.75,2.284],[89.421,23.75,2.284],[91.024,23.75,2.284],[92.627,23.75,2.284],[94.23,23.75,2.284],[95.833,23.75,2.284],[97.435,23.75,2.284],[99.038,23.75,2.284],[100.64,23.75,2.284],[102.24,23.75,2.284],[103.85,23.75,2.284],[105.45,23.75,2.284],[107.05,23.75,2.284],[108.66,23.75,2.284],[110.26,23.75,2.284],[111.86,23.75,2.284],[113.46,23.75,2.284],[115.07,23.75,2.284],[116.67,23.75,2.284],[118.27,23.75,2.284],[119.87,23.75,2.284],[121.48,23.75,2.284],[123.08,23.75,2.284],[124.68,23.75,2.284],[126.29,23.75,2.284],[127.89,23.75,2.284],[129.49,23.75,2.284],[131.09,23.75,2.284],[132.7,23.75,2.284],[134.3,23.75,2.284],[70.188,23.75,3.427],[71.791,23.75,3.427],[73.393,23.75,3.427],[74.996,23.75,3.427],[76.599,23.75,3.427],[78.202,23.75,3.427],[79.805,23.75,3.427],[81.407,23.75,3.427],[83.01,23.75,3.427],[84.613,23.75,3.427],[86.216,23.75,3.427],[87.819,23.75,3.427],[89.421,23.75,3.427],[91.024,23.75,3.427],[92.627,23.75,3.427],[94.23,23.75,3.427],[95.833,23.75,3.427],[97.435,23.75,3.427],[99.038,23.75,3.427],[100.64,23.75,3.427],[102.24,23.75,3.427],[103.85,23.75,3.427],[105.45,23.75,3.427],[107.05,23.75,3.427],[108.66,23.75,3.427],[110.26,23.75,3.427],[111.86,23.75,3.427],[113.46,23.75,3.427],[115.07,23.75,3.427],[116.67,23.75,3.427],[118.27,23.75,3.427],[119.87,23.75,3.427],[121.48,23.75,3.427],[123.08,23.75,3.427],[124.68,23.75,3.427],[126.29,23.75,3.427],[127.89,23.75,3.427],[129.49,23.75,3.427],[131.09,23.75,3.427],[132.7,23.75,3.427],[134.3,23.75,3.427],[70.188,23.75,4.57],[71.791,23.75,4.57],[73.393,23.75,4.57],[74.996,23.75,4.57],[76.599,23.75,4.57],[78.202,23.75,4.57],[79.805,23.75,4.57],[81.407,23.75,4.57],[83.01,23.75,4.57],[84.613,23.75,4.57],[86.216,23.75,4.57],[87.819,23.75,4.57],[89.421,23.75,4.57],[91.024,23.75,4.57],[92.627,23.75,4.57],[94.23,23.75,4.57],[95.833,23.75,4.57],[97.435,23.75,4.57],[99.038,23.75,4.57],[100.64,23.75,4.57],[102.24,23.75,4.57],[103.85,23.75,4.57],[105.45,23.75,4.57],[107.05,23.75,4.57],[108.66,23.75,4.57],[110.26,23.75,4.57],[111.86,23.75,4.57],[113.46,23.75,4.57],[115.07,23.75,4.57],[116.67,23.75,4.57],[118.27,23.75,4.57],[119.87,23.75,4.57],[121.48,23.75,4.57],[123.08,23.75,4.57],[124.68,23.75,4.57],[126.29,23.75,4.57],[127.89,23.75,4.57],[129.49,23.75,4.57],[131.09,23.75,4.57],[132.7,23.75,4.57],[134.3,23.75,4.57],[70.188,23.75,5.713],[71.791,23.75,5.713],[73.393,23.75,5.713],[74.996,23.75,5.713],[76.599,23.75,5.713],[78.202,23.75,5.713],[79.805,23.75,5.713],[81.407,23.75,5.713],[83.01,23.75,5.713],[84.613,23.75,5.713],[86.216,23.75,5.713],[87.819,23.75,5.713],[89.421,23.75,5.713],[91.024,23.75,5.713],[92.627,23.75,5.713],[94.23,23.75,5.713],[95.833,23.75,5.713],[97.435,23.75,5.713],[99.038,23.75,5.713],[100.64,23.75,5.713],[102.24,23.75,5.713],[103.85,23.75,5.713],[105.45,23.75,5.713],[107.05,23.75,5.713],[108.66,23.75,5.713],[110.26,23.75,5.713],[111.86,23.75,5.713],[113.46,23.75,5.713],[115.07,23.75,5.713],[116.67,23.75,5.713],[118.27,23.75,5.713],[119.87,23.75,5.713],[121.48,23.75,5.713],[123.08,23.75,5.713],[124.68,23.75,5.713],[126.29,23.75,5.713],[127.89,23.75,5.713],[129.49,23.75,5.713],[131.09,23.75,5.713],[132.7,23.75,5.713],[134.3,23.75,5.713],[70.188,23.75,6.856],[71.791,23.75,6.856],[73.393,23.75,6.856],[74.996,23.75,6.856],[76.599,23.75,6.856],[78.202,23.75,6.856],[79.805,23.75,6.856],[81.407,23.75,6.856],[83.01,23.75,6.856],[84.613,23.75,6.856],[86.216,23.75,6.856],[87.819,23.75,6.856],[89.421,23.75,6.856],[91.024,23.75,6.856],[92.627,23.75,6.856],[94.23,23.75,6.856],[95.833,23.75,6.856],[97.435,23.75,6.856],[99.038,23.75,6.856],[100.64,23.75,6.856],[102.24,23.75,6.856],[103.85,23.75,6.856],[105.45,23.75,6.856],[107.05,23.75,6.856],[108.66,23.75,6.856],[110.26,23.75,6.856],[111.86,23.75,6.856],[113.46,23.75,6.856],[115.07,23.75,6.856],[116.67,23.75,6.856],[118.27,23.75,6.856],[119.87,23.75,6.856],[121.48,23.75,6.856],[123.08,23.75,6.856],[124.68,23.75,6.856],[126.29,23.75,6.856],[127.89,23.75,6.856],[129.49,23.75,6.856],[131.09,23.75,6.856],[132.7,23.75,6.856],[134.3,23.75,6.856],[70.188,23.75,7.999],[71.791,23.75,7.999],[73.393,23.75,7.999],[74.996,23.75,7.999],[76.599,23.75,7.999],[78.202,23.75,7.999],[79.805,23.75,7.999],[81.407,23.75,7.999],[83.01,23.75,7.999],[84.613,23.75,7.999],[86.216,23.75,7.999],[87.819,23.75,7.999],[89.421,23.75,7.999],[91.024,23.75,7.999],[92.627,23.75,7.999],[94.23,23.75,7.999],[95.833,23.75,7.999],[97.435,23.75,7.999],[99.038,23.75,7.999],[100.64,23.75,7.999],[102.24,23.75,7.999],[103.85,23.75,7.999],[105.45,23.75,7.999],[107.05,23.75,7.999],[108.66,23.75,7.999],[110.26,23.75,7.999],[111.86,23.75,7.999],[113.46,23.75,7.999],[115.07,23.75,7.999],[116.67,23.75,7.999],[118.27,23.75,7.999],[119.87,23.75,7.999],[121.48,23.75,7.999],[123.08,23.75,7.999],[124.68,23.75,7.999],[126.29,23.75,7.999],[127.89,23.75,7.999],[129.49,23.75,7.999],[131.09,23.75,7.999],[132.7,23.75,7.999],[134.3,23.75,7.999],[70.188,23.75,9.142],[71.791,23.75,9.142],[73.393,23.75,9.142],[74.996,23.75,9.142],[76.599,23.75,9.142],[78.202,23.75,9.142],[79.805,23.75,9.142],[81.407,23.75,9.142],[83.01,23.75,9.142],[84.613,23.75,9.142],[86.216,23.75,9.142],[87.819,23.75,9.142],[89.421,23.75,9.142],[91.024,23.75,9.142],[92.627,23.75,9.142],[94.23,23.75,9.142],[95.833,23.75,9.142],[97.435,23.75,9.142],[99.038,23.75,9.142],[100.64,23.75,9.142],[102.24,23.75,9.142],[103.85,23.75,9.142],[105.45,23.75,9.142],[107.05,23.75,9.142],[108.66,23.75,9.142],[110.26,23.75,9.142],[111.86,23.75,9.142],[113.46,23.75,9.142],[115.07,23.75,9.142],[116.67,23.75,9.142],[118.27,23.75,9.142],[119.87,23.75,9.142],[121.48,23.75,9.142],[123.08,23.75,9.142],[124.68,23.75,9.142],[126.29,23.75,9.142],[127.89,23.75,9.142],[129.49,23.75,9.142],[131.09,23.75,9.142],[132.7,23.75,9.142],[134.3,23.75,9.142],[70.188,23.75,10.285],[71.791,23.75,10.285],[73.393,23.75,10.285],[74.996,23.75,10.285],[76.599,23.75,10.285],[78.202,23.75,10.285],[79.805,23.75,10.285],[81.407,23.75,10.285],[83.01,23.75,10.285],[84.613,23.75,10.285],[86.216,23.75,10.285],[87.819,23.75,10.285],[89.421,23.75,10.285],[91.024,23.75,10.285],[92.627,23.75,10.285],[94.23,23.75,10.285],[95.833,23.75,10.285],[97.435,23.75,10.285],[99.038,23.75,10.285],[100.64,23.75,10.285],[102.24,23.75,10.285],[103.85,23.75,10.285],[105.45,23.75,10.285],[107.05,23.75,10.285],[108.66,23.75,10.285],[110.26,23.75,10.285],[111.86,23.75,10.285],[113.46,23.75,10.285],[115.07,23.75,10.285],[116.67,23.75,10.285],[118.27,23.75,10.285],[119.87,23.75,10.285],[121.48,23.75,10.285],[123.08,23.75,10.285],[124.68,23.75,10.285],[126.29,23.75,10.285],[127.89,23.75,10.285],[129.49,23.75,10.285],[131.09,23.75,10.285],[132.7,23.75,10.285],[134.3,23.75,10.285],[70.188,23.75,11.428],[71.791,23.75,11.428],[73.393,23.75,11.428],[74.996,23.75,11.428],[76.599,23.75,11.428],[78.202,23.75,11.428],[79.805,23.75,11.428],[81.407,23.75,11.428],[83.01,23.75,11.428],[84.613,23.75,11.428],[86.216,23.75,11.428],[87.819,23.75,11.428],[89.421,23.75,11.428],[91.024,23.75,11.428],[92.627,23.75,11.428],[94.23,23.75,11.428],[95.833,23.75,11.428],[97.435,23.75,11.428],[99.038,23.75,11.428],[100.64,23.75,11.428],[102.24,23.75,11.428],[103.85,23.75,11.428],[105.45,23.75,11.428],[107.05,23.75,11.428],[108.66,23.75,11.428],[110.26,23.75,11.428],[111.86,23.75,11.428],[113.46,23.75,11.428],[115.07,23.75,11.428],[116.67,23.75,11.428],[118.27,23.75,11.428],[119.87,23.75,11.428],[121.48,23.75,11.428],[123.08,23.75,11.428],[124.68,23.75,11.428],[126.29,23.75,11.428],[127.89,23.75,11.428],[129.49,23.75,11.428],[131.09,23.75,11.428],[132.7,23.75,11.428],[134.3,23.75,11.428],[70.188,23.75,12.571],[71.791,23.75,12.571],[73.393,23.75,12.571],[74.996,23.75,12.571],[76.599,23.75,12.571],[78.202,23.75,12.571],[79.805,23.75,12.571],[81.407,23.75,12.571],[83.01,23.75,12.571],[84.613,23.75,12.571],[86.216,23.75,12.571],[87.819,23.75,12.571],[89.421,23.75,12.571],[91.024,23.75,12.571],[92.627,23.75,12.571],[94.23,23.75,12.571],[95.833,23.75,12.571],[97.435,23.75,12.571],[99.038,23.75,12.571],[100.64,23.75,12.571],[102.24,23.75,12.571],[103.85,23.75,12.571],[105.45,23.75,12.571],[107.05,23.75,12.571],[108.66,23.75,12.571],[110.26,23.75,12.571],[111.86,23.75,12.571],[113.46,23.75,12.571],[115.07,23.75,12.571],[116.67,23.75,12.571],[118.27,23.75,12.571],[119.87,23.75,12.571],[121.48,23.75,12.571],[123.08,23.75,12.571],[124.68,23.75,12.571],[126.29,23.75,12.571],[127.89,23.75,12.571],[129.49,23.75,12.571],[131.09,23.75,12.571],[132.7,23.75,12.571],[134.3,23.75,12.571],[70.188,23.75,13.714],[71.791,23.75,13.714],[73.393,23.75,13.714],[74.996,23.75,13.714],[76.599,23.75,13.714],[78.202,23.75,13.714],[79.805,23.75,13.714],[81.407,23.75,13.714],[83.01,23.75,13.714],[84.613,23.75,13.714],[86.216,23.75,13.714],[87.819,23.75,13.714],[89.421,23.75,13.714],[91.024,23.75,13.714],[92.627,23.75,13.714],[94.23,23.75,13.714],[95.833,23.75,13.714],[97.435,23.75,13.714],[99.038,23.75,13.714],[100.64,23.75,13.714],[102.24,23.75,13.714],[103.85,23.75,13.714],[105.45,23.75,13.714],[107.05,23.75,13.714],[108.66,23.75,13.714],[110.26,23.75,13.714],[111.86,23.75,13.714],[113.46,23.75,13.714],[115.07,23.75,13.714],[116.67,23.75,13.714],[118.27,23.75,13.714],[119.87,23.75,13.714],[121.48,23.75,13.714],[123.08,23.75,13.714],[124.68,23.75,13.714],[126.29,23.75,13.714],[127.89,23.75,13.714],[129.49,23.75,13.714],[131.09,23.75,13.714],[132.7,23.75,13.714],[134.3,23.75,13.714],[70.188,23.75,14.857],[71.791,23.75,14.857],[73.393,23.75,14.857],[74.996,23.75,14.857],[76.599,23.75,14.857],[78.202,23.75,14.857],[79.805,23.75,14.857],[81.407,23.75,14.857],[83.01,23.75,14.857],[84.613,23.75,14.857],[86.216,23.75,14.857],[87.819,23.75,14.857],[89.421,23.75,14.857],[91.024,23.75,14.857],[92.627,23.75,14.857],[94.23,23.75,14.857],[95.833,23.75,14.857],[97.435,23.75,14.857],[99.038,23.75,14.857],[100.64,23.75,14.857],[102.24,23.75,14.857],[103.85,23.75,14.857],[105.45,23.75,14.857],[107.05,23.75,14.857],[108.66,23.75,14.857],[110.26,23.75,14.857],[111.86,23.75,14.857],[113.46,23.75,14.857],[115.07,23.75,14.857],[116.67,23.75,14.857],[118.27,23.75,14.857],[119.87,23.75,14.857],[121.48,23.75,14.857],[123.08,23.75,14.857],[124.68,23.75,14.857],[126.29,23.75,14.857],[127.89,23.75,14.857],[129.49,23.75,14.857],[131.09,23.75,14.857],[132.7,23.75,14.857],[134.3,23.75,14.857],[70.188,23.75,16],[71.791,23.75,16],[73.393,23.75,16],[74.996,23.75,16],[76.599,23.75,16],[78.202,23.75,16],[79.805,23.75,16],[81.407,23.75,16],[83.01,23.75,16],[84.613,23.75,16],[86.216,23.75,16],[87.819,23.75,16],[89.421,23.75,16],[91.024,23.75,16],[92.627,23.75,16],[94.23,23.75,16],[95.833,23.75,16],[97.435,23.75,16],[99.038,23.75,16],[100.64,23.75,16],[102.24,23.75,16],[103.85,23.75,16],[105.45,23.75,16],[107.05,23.75,16],[108.66,23.75,16],[110.26,23.75,16],[111.86,23.75,16],[113.46,23.75,16],[115.07,23.75,16],[116.67,23.75,16],[118.27,23.75,16],[119.87,23.75,16],[121.48,23.75,16],[123.08,23.75,16],[124.68,23.75,16],[126.29,23.75,16],[127.89,23.75,16],[129.49,23.75,16],[131.09,23.75,16],[132.7,23.75,16],[134.3,23.75,16],[70.188,25,-0.002],[71.791,25,-0.002],[73.393,25,-0.002],[74.996,25,-0.002],[76.599,25,-0.002],[78.202,25,-0.002],[79.805,25,-0.002],[81.407,25,-0.002],[83.01,25,-0.002],[84.613,25,-0.002],[86.216,25,-0.002],[87.819,25,-0.002],[89.421,25,-0.002],[91.024,25,-0.002],[92.627,25,-0.002],[94.23,25,-0.002],[95.833,25,-0.002],[97.435,25,-0.002],[99.038,25,-0.002],[100.64,25,-0.002],[102.24,25,-0.002],[103.85,25,-0.002],[105.45,25,-0.002],[107.05,25,-0.002],[108.66,25,-0.002],[110.26,25,-0.002],[111.86,25,-0.002],[113.46,25,-0.002],[115.07,25,-0.002],[116.67,25,-0.002],[118.27,25,-0.002],[119.87,25,-0.002],[121.48,25,-0.002],[123.08,25,-0.002],[124.68,25,-0.002],[126.29,25,-0.002],[127.89,25,-0.002],[129.49,25,-0.002],[131.09,25,-0.002],[132.7,25,-0.002],[134.3,25,-0.002],[70.188,25,1.141],[71.791,25,1.141],[73.393,25,1.141],[74.996,25,1.141],[76.599,25,1.141],[78.202,25,1.141],[79.805,25,1.141],[81.407,25,1.141],[83.01,25,1.141],[84.613,25,1.141],[86.216,25,1.141],[87.819,25,1.141],[89.421,25,1.141],[91.024,25,1.141],[92.627,25,1.141],[94.23,25,1.141],[95.833,25,1.141],[97.435,25,1.141],[99.038,25,1.141],[100.64,25,1.141],[102.24,25,1.141],[103.85,25,1.141],[105.45,25,1.141],[107.05,25,1.141],[108.66,25,1.141],[110.26,25,1.141],[111.86,25,1.141],[113.46,25,1.141],[115.07,25,1.141],[116.67,25,1.141],[118.27,25,1.141],[119.87,25,1.141],[121.48,25,1.141],[123.08,25,1.141],[124.68,25,1.141],[126.29,25,1.141],[127.89,25,1.141],[129.49,25,1.141],[131.09,25,1.141],[132.7,25,1.141],[134.3,25,1.141],[70.188,25,2.284],[71.791,25,2.284],[73.393,25,2.284],[74.996,25,2.284],[76.599,25,2.284],[78.202,25,2.284],[79.805,25,2.284],[81.407,25,2.284],[83.01,25,2.284],[84.613,25,2.284],[86.216,25,2.284],[87.819,25,2.284],[89.421,25,2.284],[91.024,25,2.284],[92.627,25,2.284],[94.23,25,2.284],[95.833,25,2.284],[97.435,25,2.284],[99.038,25,2.284],[100.64,25,2.284],[102.24,25,2.284],[103.85,25,2.284],[105.45,25,2.284],[107.05,25,2.284],[108.66,25,2.284],[110.26,25,2.284],[111.86,25,2.284],[113.46,25,2.284],[115.07,25,2.284],[116.67,25,2.284],[118.27,25,2.284],[119.87,25,2.284],[121.48,25,2.284],[123.08,25,2.284],[124.68,25,2.284],[126.29,25,2.284],[127.89,25,2.284],[129.49,25,2.284],[131.09,25,2.284],[132.7,25,2.284],[134.3,25,2.284],[70.188,25,3.427],[71.791,25,3.427],[73.393,25,3.427],[74.996,25,3.427],[76.599,25,3.427],[78.202,25,3.427],[79.805,25,3.427],[81.407,25,3.427],[83.01,25,3.427],[84.613,25,3.427],[86.216,25,3.427],[87.819,25,3.427],[89.421,25,3.427],[91.024,25,3.427],[92.627,25,3.427],[94.23,25,3.427],[95.833,25,3.427],[97.435,25,3.427],[99.038,25,3.427],[100.64,25,3.427],[102.24,25,3.427],[103.85,25,3.427],[105.45,25,3.427],[107.05,25,3.427],[108.66,25,3.427],[110.26,25,3.427],[111.86,25,3.427],[113.46,25,3.427],[115.07,25,3.427],[116.67,25,3.427],[118.27,25,3.427],[119.87,25,3.427],[121.48,25,3.427],[123.08,25,3.427],[124.68,25,3.427],[126.29,25,3.427],[127.89,25,3.427],[129.49,25,3.427],[131.09,25,3.427],[132.7,25,3.427],[134.3,25,3.427],[70.188,25,4.57],[71.791,25,4.57],[73.393,25,4.57],[74.996,25,4.57],[76.599,25,4.57],[78.202,25,4.57],[79.805,25,4.57],[81.407,25,4.57],[83.01,25,4.57],[84.613,25,4.57],[86.216,25,4.57],[87.819,25,4.57],[89.421,25,4.57],[91.024,25,4.57],[92.627,25,4.57],[94.23,25,4.57],[95.833,25,4.57],[97.435,25,4.57],[99.038,25,4.57],[100.64,25,4.57],[102.24,25,4.57],[103.85,25,4.57],[105.45,25,4.57],[107.05,25,4.57],[108.66,25,4.57],[110.26,25,4.57],[111.86,25,4.57],[113.46,25,4.57],[115.07,25,4.57],[116.67,25,4.57],[118.27,25,4.57],[119.87,25,4.57],[121.48,25,4.57],[123.08,25,4.57],[124.68,25,4.57],[126.29,25,4.57],[127.89,25,4.57],[129.49,25,4.57],[131.09,25,4.57],[132.7,25,4.57],[134.3,25,4.57],[70.188,25,5.713],[71.791,25,5.713],[73.393,25,5.713],[74.996,25,5.713],[76.599,25,5.713],[78.202,25,5.713],[79.805,25,5.713],[81.407,25,5.713],[83.01,25,5.713],[84.613,25,5.713],[86.216,25,5.713],[87.819,25,5.713],[89.421,25,5.713],[91.024,25,5.713],[92.627,25,5.713],[94.23,25,5.713],[95.833,25,5.713],[97.435,25,5.713],[99.038,25,5.713],[100.64,25,5.713],[102.24,25,5.713],[103.85,25,5.713],[105.45,25,5.713],[107.05,25,5.713],[108.66,25,5.713],[110.26,25,5.713],[111.86,25,5.713],[113.46,25,5.713],[115.07,25,5.713],[116.67,25,5.713],[118.27,25,5.713],[119.87,25,5.713],[121.48,25,5.713],[123.08,25,5.713],[124.68,25,5.713],[126.29,25,5.713],[127.89,25,5.713],[129.49,25,5.713],[131.09,25,5.713],[132.7,25,5.713],[134.3,25,5.713],[70.188,25,6.856],[71.791,25,6.856],[73.393,25,6.856],[74.996,25,6.856],[76.599,25,6.856],[78.202,25,6.856],[79.805,25,6.856],[81.407,25,6.856],[83.01,25,6.856],[84.613,25,6.856],[86.216,25,6.856],[87.819,25,6.856],[89.421,25,6.856],[91.024,25,6.856],[92.627,25,6.856],[94.23,25,6.856],[95.833,25,6.856],[97.435,25,6.856],[99.038,25,6.856],[100.64,25,6.856],[102.24,25,6.856],[103.85,25,6.856],[105.45,25,6.856],[107.05,25,6.856],[108.66,25,6.856],[110.26,25,6.856],[111.86,25,6.856],[113.46,25,6.856],[115.07,25,6.856],[116.67,25,6.856],[118.27,25,6.856],[119.87,25,6.856],[121.48,25,6.856],[123.08,25,6.856],[124.68,25,6.856],[126.29,25,6.856],[127.89,25,6.856],[129.49,25,6.856],[131.09,25,6.856],[132.7,25,6.856],[134.3,25,6.856],[70.188,25,7.999],[71.791,25,7.999],[73.393,25,7.999],[74.996,25,7.999],[76.599,25,7.999],[78.202,25,7.999],[79.805,25,7.999],[81.407,25,7.999],[83.01,25,7.999],[84.613,25,7.999],[86.216,25,7.999],[87.819,25,7.999],[89.421,25,7.999],[91.024,25,7.999],[92.627,25,7.999],[94.23,25,7.999],[95.833,25,7.999],[97.435,25,7.999],[99.038,25,7.999],[100.64,25,7.999],[102.24,25,7.999],[103.85,25,7.999],[105.45,25,7.999],[107.05,25,7.999],[108.66,25,7.999],[110.26,25,7.999],[111.86,25,7.999],[113.46,25,7.999],[115.07,25,7.999],[116.67,25,7.999],[118.27,25,7.999],[119.87,25,7.999],[121.48,25,7.999],[123.08,25,7.999],[124.68,25,7.999],[126.29,25,7.999],[127.89,25,7.999],[129.49,25,7.999],[131.09,25,7.999],[132.7,25,7.999],[134.3,25,7.999],[70.188,25,9.142],[71.791,25,9.142],[73.393,25,9.142],[74.996,25,9.142],[76.599,25,9.142],[78.202,25,9.142],[79.805,25,9.142],[81.407,25,9.142],[83.01,25,9.142],[84.613,25,9.142],[86.216,25,9.142],[87.819,25,9.142],[89.421,25,9.142],[91.024,25,9.142],[92.627,25,9.142],[94.23,25,9.142],[95.833,25,9.142],[97.435,25,9.142],[99.038,25,9.142],[100.64,25,9.142],[102.24,25,9.142],[103.85,25,9.142],[105.45,25,9.142],[107.05,25,9.142],[108.66,25,9.142],[110.26,25,9.142],[111.86,25,9.142],[113.46,25,9.142],[115.07,25,9.142],[116.67,25,9.142],[118.27,25,9.142],[119.87,25,9.142],[121.48,25,9.142],[123.08,25,9.142],[124.68,25,9.142],[126.29,25,9.142],[127.89,25,9.142],[129.49,25,9.142],[131.09,25,9.142],[132.7,25,9.142],[134.3,25,9.142],[70.188,25,10.285],[71.791,25,10.285],[73.393,25,10.285],[74.996,25,10.285],[76.599,25,10.285],[78.202,25,10.285],[79.805,25,10.285],[81.407,25,10.285],[83.01,25,10.285],[84.613,25,10.285],[86.216,25,10.285],[87.819,25,10.285],[89.421,25,10.285],[91.024,25,10.285],[92.627,25,10.285],[94.23,25,10.285],[95.833,25,10.285],[97.435,25,10.285],[99.038,25,10.285],[100.64,25,10.285],[102.24,25,10.285],[103.85,25,10.285],[105.45,25,10.285],[107.05,25,10.285],[108.66,25,10.285],[110.26,25,10.285],[111.86,25,10.285],[113.46,25,10.285],[115.07,25,10.285],[116.67,25,10.285],[118.27,25,10.285],[119.87,25,10.285],[121.48,25,10.285],[123.08,25,10.285],[124.68,25,10.285],[126.29,25,10.285],[127.89,25,10.285],[129.49,25,10.285],[131.09,25,10.285],[132.7,25,10.285],[134.3,25,10.285],[70.188,25,11.428],[71.791,25,11.428],[73.393,25,11.428],[74.996,25,11.428],[76.599,25,11.428],[78.202,25,11.428],[79.805,25,11.428],[81.407,25,11.428],[83.01,25,11.428],[84.613,25,11.428],[86.216,25,11.428],[87.819,25,11.428],[89.421,25,11.428],[91.024,25,11.428],[92.627,25,11.428],[94.23,25,11.428],[95.833,25,11.428],[97.435,25,11.428],[99.038,25,11.428],[100.64,25,11.428],[102.24,25,11.428],[103.85,25,11.428],[105.45,25,11.428],[107.05,25,11.428],[108.66,25,11.428],[110.26,25,11.428],[111.86,25,11.428],[113.46,25,11.428],[115.07,25,11.428],[116.67,25,11.428],[118.27,25,11.428],[119.87,25,11.428],[121.48,25,11.428],[123.08,25,11.428],[124.68,25,11.428],[126.29,25,11.428],[127.89,25,11.428],[129.49,25,11.428],[131.09,25,11.428],[132.7,25,11.428],[134.3,25,11.428],[70.188,25,12.571],[71.791,25,12.571],[73.393,25,12.571],[74.996,25,12.571],[76.599,25,12.571],[78.202,25,12.571],[79.805,25,12.571],[81.407,25,12.571],[83.01,25,12.571],[84.613,25,12.571],[86.216,25,12.571],[87.819,25,12.571],[89.421,25,12.571],[91.024,25,12.571],[92.627,25,12.571],[94.23,25,12.571],[95.833,25,12.571],[97.435,25,12.571],[99.038,25,12.571],[100.64,25,12.571],[102.24,25,12.571],[103.85,25,12.571],[105.45,25,12.571],[107.05,25,12.571],[108.66,25,12.571],[110.26,25,12.571],[111.86,25,12.571],[113.46,25,12.571],[115.07,25,12.571],[116.67,25,12.571],[118.27,25,12.571],[119.87,25,12.571],[121.48,25,12.571],[123.08,25,12.571],[124.68,25,12.571],[126.29,25,12.571],[127.89,25,12.571],[129.49,25,12.571],[131.09,25,12.571],[132.7,25,12.571],[134.3,25,12.571],[70.188,25,13.714],[71.791,25,13.714],[73.393,25,13.714],[74.996,25,13.714],[76.599,25,13.714],[78.202,25,13.714],[79.805,25,13.714],[81.407,25,13.714],[83.01,25,13.714],[84.613,25,13.714],[86.216,25,13.714],[87.819,25,13.714],[89.421,25,13.714],[91.024,25,13.714],[92.627,25,13.714],[94.23,25,13.714],[95.833,25,13.714],[97.435,25,13.714],[99.038,25,13.714],[100.64,25,13.714],[102.24,25,13.714],[103.85,25,13.714],[105.45,25,13.714],[107.05,25,13.714],[108.66,25,13.714],[110.26,25,13.714],[111.86,25,13.714],[113.46,25,13.714],[115.07,25,13.714],[116.67,25,13.714],[118.27,25,13.714],[119.87,25,13.714],[121.48,25,13.714],[123.08,25,13.714],[124.68,25,13.714],[126.29,25,13.714],[127.89,25,13.714],[129.49,25,13.714],[131.09,25,13.714],[132.7,25,13.714],[134.3,25,13.714],[70.188,25,14.857],[71.791,25,14.857],[73.393,25,14.857],[74.996,25,14.857],[76.599,25,14.857],[78.202,25,14.857],[79.805,25,14.857],[81.407,25,14.857],[83.01,25,14.857],[84.613,25,14.857],[86.216,25,14.857],[87.819,25,14.857],[89.421,25,14.857],[91.024,25,14.857],[92.627,25,14.857],[94.23,25,14.857],[95.833,25,14.857],[97.435,25,14.857],[99.038,25,14.857],[100.64,25,14.857],[102.24,25,14.857],[103.85,25,14.857],[105.45,25,14.857],[107.05,25,14.857],[108.66,25,14.857],[110.26,25,14.857],[111.86,25,14.857],[113.46,25,14.857],[115.07,25,14.857],[116.67,25,14.857],[118.27,25,14.857],[119.87,25,14.857],[121.48,25,14.857],[123.08,25,14.857],[124.68,25,14.857],[126.29,25,14.857],[127.89,25,14.857],[129.49,25,14.857],[131.09,25,14.857],[132.7,25,14.857],[134.3,25,14.857],[70.188,25,16],[71.791,25,16],[73.393,25,16],[74.996,25,16],[76.599,25,16],[78.202,25,16],[79.805,25,16],[81.407,25,16],[83.01,25,16],[84.613,25,16],[86.216,25,16],[87.819,25,16],[89.421,25,16],[91.024,25,16],[92.627,25,16],[94.23,25,16],[95.833,25,16],[97.435,25,16],[99.038,25,16],[100.64,25,16],[102.24,25,16],[103.85,25,16],[105.45,25,16],[107.05,25,16],[108.66,25,16],[110.26,25,16],[111.86,25,16],[113.46,25,16],[115.07,25,16],[116.67,25,16],[118.27,25,16],[119.87,25,16],[121.48,25,16],[123.08,25,16],[124.68,25,16],[126.29,25,16],[127.89,25,16],[129.49,25,16],[131.09,25,16],[132.7,25,16],[134.3,25,16],[70.188,26.25,-0.002],[71.791,26.25,-0.002],[73.393,26.25,-0.002],[74.996,26.25,-0.002],[76.599,26.25,-0.002],[78.202,26.25,-0.002],[79.805,26.25,-0.002],[81.407,26.25,-0.002],[83.01,26.25,-0.002],[84.613,26.25,-0.002],[86.216,26.25,-0.002],[87.819,26.25,-0.002],[89.421,26.25,-0.002],[91.024,26.25,-0.002],[92.627,26.25,-0.002],[94.23,26.25,-0.002],[95.833,26.25,-0.002],[97.435,26.25,-0.002],[99.038,26.25,-0.002],[100.64,26.25,-0.002],[102.24,26.25,-0.002],[103.85,26.25,-0.002],[105.45,26.25,-0.002],[107.05,26.25,-0.002],[108.66,26.25,-0.002],[110.26,26.25,-0.002],[111.86,26.25,-0.002],[113.46,26.25,-0.002],[115.07,26.25,-0.002],[116.67,26.25,-0.002],[118.27,26.25,-0.002],[119.87,26.25,-0.002],[121.48,26.25,-0.002],[123.08,26.25,-0.002],[124.68,26.25,-0.002],[126.29,26.25,-0.002],[127.89,26.25,-0.002],[129.49,26.25,-0.002],[131.09,26.25,-0.002],[132.7,26.25,-0.002],[134.3,26.25,-0.002],[70.188,26.25,1.141],[71.791,26.25,1.141],[73.393,26.25,1.141],[74.996,26.25,1.141],[76.599,26.25,1.141],[78.202,26.25,1.141],[79.805,26.25,1.141],[81.407,26.25,1.141],[83.01,26.25,1.141],[84.613,26.25,1.141],[86.216,26.25,1.141],[87.819,26.25,1.141],[89.421,26.25,1.141],[91.024,26.25,1.141],[92.627,26.25,1.141],[94.23,26.25,1.141],[95.833,26.25,1.141],[97.435,26.25,1.141],[99.038,26.25,1.141],[100.64,26.25,1.141],[102.24,26.25,1.141],[103.85,26.25,1.141],[105.45,26.25,1.141],[107.05,26.25,1.141],[108.66,26.25,1.141],[110.26,26.25,1.141],[111.86,26.25,1.141],[113.46,26.25,1.141],[115.07,26.25,1.141],[116.67,26.25,1.141],[118.27,26.25,1.141],[119.87,26.25,1.141],[121.48,26.25,1.141],[123.08,26.25,1.141],[124.68,26.25,1.141],[126.29,26.25,1.141],[127.89,26.25,1.141],[129.49,26.25,1.141],[131.09,26.25,1.141],[132.7,26.25,1.141],[134.3,26.25,1.141],[70.188,26.25,2.284],[71.791,26.25,2.284],[73.393,26.25,2.284],[74.996,26.25,2.284],[76.599,26.25,2.284],[78.202,26.25,2.284],[79.805,26.25,2.284],[81.407,26.25,2.284],[83.01,26.25,2.284],[84.613,26.25,2.284],[86.216,26.25,2.284],[87.819,26.25,2.284],[89.421,26.25,2.284],[91.024,26.25,2.284],[92.627,26.25,2.284],[94.23,26.25,2.284],[95.833,26.25,2.284],[97.435,26.25,2.284],[99.038,26.25,2.284],[100.64,26.25,2.284],[102.24,26.25,2.284],[103.85,26.25,2.284],[105.45,26.25,2.284],[107.05,26.25,2.284],[108.66,26.25,2.284],[110.26,26.25,2.284],[111.86,26.25,2.284],[113.46,26.25,2.284],[115.07,26.25,2.284],[116.67,26.25,2.284],[118.27,26.25,2.284],[119.87,26.25,2.284],[121.48,26.25,2.284],[123.08,26.25,2.284],[124.68,26.25,2.284],[126.29,26.25,2.284],[127.89,26.25,2.284],[129.49,26.25,2.284],[131.09,26.25,2.284],[132.7,26.25,2.284],[134.3,26.25,2.284],[70.188,26.25,3.427],[71.791,26.25,3.427],[73.393,26.25,3.427],[74.996,26.25,3.427],[76.599,26.25,3.427],[78.202,26.25,3.427],[79.805,26.25,3.427],[81.407,26.25,3.427],[83.01,26.25,3.427],[84.613,26.25,3.427],[86.216,26.25,3.427],[87.819,26.25,3.427],[89.421,26.25,3.427],[91.024,26.25,3.427],[92.627,26.25,3.427],[94.23,26.25,3.427],[95.833,26.25,3.427],[97.435,26.25,3.427],[99.038,26.25,3.427],[100.64,26.25,3.427],[102.24,26.25,3.427],[103.85,26.25,3.427],[105.45,26.25,3.427],[107.05,26.25,3.427],[108.66,26.25,3.427],[110.26,26.25,3.427],[111.86,26.25,3.427],[113.46,26.25,3.427],[115.07,26.25,3.427],[116.67,26.25,3.427],[118.27,26.25,3.427],[119.87,26.25,3.427],[121.48,26.25,3.427],[123.08,26.25,3.427],[124.68,26.25,3.427],[126.29,26.25,3.427],[127.89,26.25,3.427],[129.49,26.25,3.427],[131.09,26.25,3.427],[132.7,26.25,3.427],[134.3,26.25,3.427],[70.188,26.25,4.57],[71.791,26.25,4.57],[73.393,26.25,4.57],[74.996,26.25,4.57],[76.599,26.25,4.57],[78.202,26.25,4.57],[79.805,26.25,4.57],[81.407,26.25,4.57],[83.01,26.25,4.57],[84.613,26.25,4.57],[86.216,26.25,4.57],[87.819,26.25,4.57],[89.421,26.25,4.57],[91.024,26.25,4.57],[92.627,26.25,4.57],[94.23,26.25,4.57],[95.833,26.25,4.57],[97.435,26.25,4.57],[99.038,26.25,4.57],[100.64,26.25,4.57],[102.24,26.25,4.57],[103.85,26.25,4.57],[105.45,26.25,4.57],[107.05,26.25,4.57],[108.66,26.25,4.57],[110.26,26.25,4.57],[111.86,26.25,4.57],[113.46,26.25,4.57],[115.07,26.25,4.57],[116.67,26.25,4.57],[118.27,26.25,4.57],[119.87,26.25,4.57],[121.48,26.25,4.57],[123.08,26.25,4.57],[124.68,26.25,4.57],[126.29,26.25,4.57],[127.89,26.25,4.57],[129.49,26.25,4.57],[131.09,26.25,4.57],[132.7,26.25,4.57],[134.3,26.25,4.57],[70.188,26.25,5.713],[71.791,26.25,5.713],[73.393,26.25,5.713],[74.996,26.25,5.713],[76.599,26.25,5.713],[78.202,26.25,5.713],[79.805,26.25,5.713],[81.407,26.25,5.713],[83.01,26.25,5.713],[84.613,26.25,5.713],[86.216,26.25,5.713],[87.819,26.25,5.713],[89.421,26.25,5.713],[91.024,26.25,5.713],[92.627,26.25,5.713],[94.23,26.25,5.713],[95.833,26.25,5.713],[97.435,26.25,5.713],[99.038,26.25,5.713],[100.64,26.25,5.713],[102.24,26.25,5.713],[103.85,26.25,5.713],[105.45,26.25,5.713],[107.05,26.25,5.713],[108.66,26.25,5.713],[110.26,26.25,5.713],[111.86,26.25,5.713],[113.46,26.25,5.713],[115.07,26.25,5.713],[116.67,26.25,5.713],[118.27,26.25,5.713],[119.87,26.25,5.713],[121.48,26.25,5.713],[123.08,26.25,5.713],[124.68,26.25,5.713],[126.29,26.25,5.713],[127.89,26.25,5.713],[129.49,26.25,5.713],[131.09,26.25,5.713],[132.7,26.25,5.713],[134.3,26.25,5.713],[70.188,26.25,6.856],[71.791,26.25,6.856],[73.393,26.25,6.856],[74.996,26.25,6.856],[76.599,26.25,6.856],[78.202,26.25,6.856],[79.805,26.25,6.856],[81.407,26.25,6.856],[83.01,26.25,6.856],[84.613,26.25,6.856],[86.216,26.25,6.856],[87.819,26.25,6.856],[89.421,26.25,6.856],[91.024,26.25,6.856],[92.627,26.25,6.856],[94.23,26.25,6.856],[95.833,26.25,6.856],[97.435,26.25,6.856],[99.038,26.25,6.856],[100.64,26.25,6.856],[102.24,26.25,6.856],[103.85,26.25,6.856],[105.45,26.25,6.856],[107.05,26.25,6.856],[108.66,26.25,6.856],[110.26,26.25,6.856],[111.86,26.25,6.856],[113.46,26.25,6.856],[115.07,26.25,6.856],[116.67,26.25,6.856],[118.27,26.25,6.856],[119.87,26.25,6.856],[121.48,26.25,6.856],[123.08,26.25,6.856],[124.68,26.25,6.856],[126.29,26.25,6.856],[127.89,26.25,6.856],[129.49,26.25,6.856],[131.09,26.25,6.856],[132.7,26.25,6.856],[134.3,26.25,6.856],[70.188,26.25,7.999],[71.791,26.25,7.999],[73.393,26.25,7.999],[74.996,26.25,7.999],[76.599,26.25,7.999],[78.202,26.25,7.999],[79.805,26.25,7.999],[81.407,26.25,7.999],[83.01,26.25,7.999],[84.613,26.25,7.999],[86.216,26.25,7.999],[87.819,26.25,7.999],[89.421,26.25,7.999],[91.024,26.25,7.999],[92.627,26.25,7.999],[94.23,26.25,7.999],[95.833,26.25,7.999],[97.435,26.25,7.999],[99.038,26.25,7.999],[100.64,26.25,7.999],[102.24,26.25,7.999],[103.85,26.25,7.999],[105.45,26.25,7.999],[107.05,26.25,7.999],[108.66,26.25,7.999],[110.26,26.25,7.999],[111.86,26.25,7.999],[113.46,26.25,7.999],[115.07,26.25,7.999],[116.67,26.25,7.999],[118.27,26.25,7.999],[119.87,26.25,7.999],[121.48,26.25,7.999],[123.08,26.25,7.999],[124.68,26.25,7.999],[126.29,26.25,7.999],[127.89,26.25,7.999],[129.49,26.25,7.999],[131.09,26.25,7.999],[132.7,26.25,7.999],[134.3,26.25,7.999],[70.188,26.25,9.142],[71.791,26.25,9.142],[73.393,26.25,9.142],[74.996,26.25,9.142],[76.599,26.25,9.142],[78.202,26.25,9.142],[79.805,26.25,9.142],[81.407,26.25,9.142],[83.01,26.25,9.142],[84.613,26.25,9.142],[86.216,26.25,9.142],[87.819,26.25,9.142],[89.421,26.25,9.142],[91.024,26.25,9.142],[92.627,26.25,9.142],[94.23,26.25,9.142],[95.833,26.25,9.142],[97.435,26.25,9.142],[99.038,26.25,9.142],[100.64,26.25,9.142],[102.24,26.25,9.142],[103.85,26.25,9.142],[105.45,26.25,9.142],[107.05,26.25,9.142],[108.66,26.25,9.142],[110.26,26.25,9.142],[111.86,26.25,9.142],[113.46,26.25,9.142],[115.07,26.25,9.142],[116.67,26.25,9.142],[118.27,26.25,9.142],[119.87,26.25,9.142],[121.48,26.25,9.142],[123.08,26.25,9.142],[124.68,26.25,9.142],[126.29,26.25,9.142],[127.89,26.25,9.142],[129.49,26.25,9.142],[131.09,26.25,9.142],[132.7,26.25,9.142],[134.3,26.25,9.142],[70.188,26.25,10.285],[71.791,26.25,10.285],[73.393,26.25,10.285],[74.996,26.25,10.285],[76.599,26.25,10.285],[78.202,26.25,10.285],[79.805,26.25,10.285],[81.407,26.25,10.285],[83.01,26.25,10.285],[84.613,26.25,10.285],[86.216,26.25,10.285],[87.819,26.25,10.285],[89.421,26.25,10.285],[91.024,26.25,10.285],[92.627,26.25,10.285],[94.23,26.25,10.285],[95.833,26.25,10.285],[97.435,26.25,10.285],[99.038,26.25,10.285],[100.64,26.25,10.285],[102.24,26.25,10.285],[103.85,26.25,10.285],[105.45,26.25,10.285],[107.05,26.25,10.285],[108.66,26.25,10.285],[110.26,26.25,10.285],[111.86,26.25,10.285],[113.46,26.25,10.285],[115.07,26.25,10.285],[116.67,26.25,10.285],[118.27,26.25,10.285],[119.87,26.25,10.285],[121.48,26.25,10.285],[123.08,26.25,10.285],[124.68,26.25,10.285],[126.29,26.25,10.285],[127.89,26.25,10.285],[129.49,26.25,10.285],[131.09,26.25,10.285],[132.7,26.25,10.285],[134.3,26.25,10.285],[70.188,26.25,11.428],[71.791,26.25,11.428],[73.393,26.25,11.428],[74.996,26.25,11.428],[76.599,26.25,11.428],[78.202,26.25,11.428],[79.805,26.25,11.428],[81.407,26.25,11.428],[83.01,26.25,11.428],[84.613,26.25,11.428],[86.216,26.25,11.428],[87.819,26.25,11.428],[89.421,26.25,11.428],[91.024,26.25,11.428],[92.627,26.25,11.428],[94.23,26.25,11.428],[95.833,26.25,11.428],[97.435,26.25,11.428],[99.038,26.25,11.428],[100.64,26.25,11.428],[102.24,26.25,11.428],[103.85,26.25,11.428],[105.45,26.25,11.428],[107.05,26.25,11.428],[108.66,26.25,11.428],[110.26,26.25,11.428],[111.86,26.25,11.428],[113.46,26.25,11.428],[115.07,26.25,11.428],[116.67,26.25,11.428],[118.27,26.25,11.428],[119.87,26.25,11.428],[121.48,26.25,11.428],[123.08,26.25,11.428],[124.68,26.25,11.428],[126.29,26.25,11.428],[127.89,26.25,11.428],[129.49,26.25,11.428],[131.09,26.25,11.428],[132.7,26.25,11.428],[134.3,26.25,11.428],[70.188,26.25,12.571],[71.791,26.25,12.571],[73.393,26.25,12.571],[74.996,26.25,12.571],[76.599,26.25,12.571],[78.202,26.25,12.571],[79.805,26.25,12.571],[81.407,26.25,12.571],[83.01,26.25,12.571],[84.613,26.25,12.571],[86.216,26.25,12.571],[87.819,26.25,12.571],[89.421,26.25,12.571],[91.024,26.25,12.571],[92.627,26.25,12.571],[94.23,26.25,12.571],[95.833,26.25,12.571],[97.435,26.25,12.571],[99.038,26.25,12.571],[100.64,26.25,12.571],[102.24,26.25,12.571],[103.85,26.25,12.571],[105.45,26.25,12.571],[107.05,26.25,12.571],[108.66,26.25,12.571],[110.26,26.25,12.571],[111.86,26.25,12.571],[113.46,26.25,12.571],[115.07,26.25,12.571],[116.67,26.25,12.571],[118.27,26.25,12.571],[119.87,26.25,12.571],[121.48,26.25,12.571],[123.08,26.25,12.571],[124.68,26.25,12.571],[126.29,26.25,12.571],[127.89,26.25,12.571],[129.49,26.25,12.571],[131.09,26.25,12.571],[132.7,26.25,12.571],[134.3,26.25,12.571],[70.188,26.25,13.714],[71.791,26.25,13.714],[73.393,26.25,13.714],[74.996,26.25,13.714],[76.599,26.25,13.714],[78.202,26.25,13.714],[79.805,26.25,13.714],[81.407,26.25,13.714],[83.01,26.25,13.714],[84.613,26.25,13.714],[86.216,26.25,13.714],[87.819,26.25,13.714],[89.421,26.25,13.714],[91.024,26.25,13.714],[92.627,26.25,13.714],[94.23,26.25,13.714],[95.833,26.25,13.714],[97.435,26.25,13.714],[99.038,26.25,13.714],[100.64,26.25,13.714],[102.24,26.25,13.714],[103.85,26.25,13.714],[105.45,26.25,13.714],[107.05,26.25,13.714],[108.66,26.25,13.714],[110.26,26.25,13.714],[111.86,26.25,13.714],[113.46,26.25,13.714],[115.07,26.25,13.714],[116.67,26.25,13.714],[118.27,26.25,13.714],[119.87,26.25,13.714],[121.48,26.25,13.714],[123.08,26.25,13.714],[124.68,26.25,13.714],[126.29,26.25,13.714],[127.89,26.25,13.714],[129.49,26.25,13.714],[131.09,26.25,13.714],[132.7,26.25,13.714],[134.3,26.25,13.714],[70.188,26.25,14.857],[71.791,26.25,14.857],[73.393,26.25,14.857],[74.996,26.25,14.857],[76.599,26.25,14.857],[78.202,26.25,14.857],[79.805,26.25,14.857],[81.407,26.25,14.857],[83.01,26.25,14.857],[84.613,26.25,14.857],[86.216,26.25,14.857],[87.819,26.25,14.857],[89.421,26.25,14.857],[91.024,26.25,14.857],[92.627,26.25,14.857],[94.23,26.25,14.857],[95.833,26.25,14.857],[97.435,26.25,14.857],[99.038,26.25,14.857],[100.64,26.25,14.857],[102.24,26.25,14.857],[103.85,26.25,14.857],[105.45,26.25,14.857],[107.05,26.25,14.857],[108.66,26.25,14.857],[110.26,26.25,14.857],[111.86,26.25,14.857],[113.46,26.25,14.857],[115.07,26.25,14.857],[116.67,26.25,14.857],[118.27,26.25,14.857],[119.87,26.25,14.857],[121.48,26.25,14.857],[123.08,26.25,14.857],[124.68,26.25,14.857],[126.29,26.25,14.857],[127.89,26.25,14.857],[129.49,26.25,14.857],[131.09,26.25,14.857],[132.7,26.25,14.857],[134.3,26.25,14.857],[70.188,26.25,16],[71.791,26.25,16],[73.393,26.25,16],[74.996,26.25,16],[76.599,26.25,16],[78.202,26.25,16],[79.805,26.25,16],[81.407,26.25,16],[83.01,26.25,16],[84.613,26.25,16],[86.216,26.25,16],[87.819,26.25,16],[89.421,26.25,16],[91.024,26.25,16],[92.627,26.25,16],[94.23,26.25,16],[95.833,26.25,16],[97.435,26.25,16],[99.038,26.25,16],[100.64,26.25,16],[102.24,26.25,16],[103.85,26.25,16],[105.45,26.25,16],[107.05,26.25,16],[108.66,26.25,16],[110.26,26.25,16],[111.86,26.25,16],[113.46,26.25,16],[115.07,26.25,16],[116.67,26.25,16],[118.27,26.25,16],[119.87,26.25,16],[121.48,26.25,16],[123.08,26.25,16],[124.68,26.25,16],[126.29,26.25,16],[127.89,26.25,16],[129.49,26.25,16],[131.09,26.25,16],[132.7,26.25,16],[134.3,26.25,16],[70.188,27.5,-0.002],[71.791,27.5,-0.002],[73.393,27.5,-0.002],[74.996,27.5,-0.002],[76.599,27.5,-0.002],[78.202,27.5,-0.002],[79.805,27.5,-0.002],[81.407,27.5,-0.002],[83.01,27.5,-0.002],[84.613,27.5,-0.002],[86.216,27.5,-0.002],[87.819,27.5,-0.002],[89.421,27.5,-0.002],[91.024,27.5,-0.002],[92.627,27.5,-0.002],[94.23,27.5,-0.002],[95.833,27.5,-0.002],[97.435,27.5,-0.002],[99.038,27.5,-0.002],[100.64,27.5,-0.002],[102.24,27.5,-0.002],[103.85,27.5,-0.002],[105.45,27.5,-0.002],[107.05,27.5,-0.002],[108.66,27.5,-0.002],[110.26,27.5,-0.002],[111.86,27.5,-0.002],[113.46,27.5,-0.002],[115.07,27.5,-0.002],[116.67,27.5,-0.002],[118.27,27.5,-0.002],[119.87,27.5,-0.002],[121.48,27.5,-0.002],[123.08,27.5,-0.002],[124.68,27.5,-0.002],[126.29,27.5,-0.002],[127.89,27.5,-0.002],[129.49,27.5,-0.002],[131.09,27.5,-0.002],[132.7,27.5,-0.002],[134.3,27.5,-0.002],[70.188,27.5,1.141],[71.791,27.5,1.141],[73.393,27.5,1.141],[74.996,27.5,1.141],[76.599,27.5,1.141],[78.202,27.5,1.141],[79.805,27.5,1.141],[81.407,27.5,1.141],[83.01,27.5,1.141],[84.613,27.5,1.141],[86.216,27.5,1.141],[87.819,27.5,1.141],[89.421,27.5,1.141],[91.024,27.5,1.141],[92.627,27.5,1.141],[94.23,27.5,1.141],[95.833,27.5,1.141],[97.435,27.5,1.141],[99.038,27.5,1.141],[100.64,27.5,1.141],[102.24,27.5,1.141],[103.85,27.5,1.141],[105.45,27.5,1.141],[107.05,27.5,1.141],[108.66,27.5,1.141],[110.26,27.5,1.141],[111.86,27.5,1.141],[113.46,27.5,1.141],[115.07,27.5,1.141],[116.67,27.5,1.141],[118.27,27.5,1.141],[119.87,27.5,1.141],[121.48,27.5,1.141],[123.08,27.5,1.141],[124.68,27.5,1.141],[126.29,27.5,1.141],[127.89,27.5,1.141],[129.49,27.5,1.141],[131.09,27.5,1.141],[132.7,27.5,1.141],[134.3,27.5,1.141],[70.188,27.5,2.284],[71.791,27.5,2.284],[73.393,27.5,2.284],[74.996,27.5,2.284],[76.599,27.5,2.284],[78.202,27.5,2.284],[79.805,27.5,2.284],[81.407,27.5,2.284],[83.01,27.5,2.284],[84.613,27.5,2.284],[86.216,27.5,2.284],[87.819,27.5,2.284],[89.421,27.5,2.284],[91.024,27.5,2.284],[92.627,27.5,2.284],[94.23,27.5,2.284],[95.833,27.5,2.284],[97.435,27.5,2.284],[99.038,27.5,2.284],[100.64,27.5,2.284],[102.24,27.5,2.284],[103.85,27.5,2.284],[105.45,27.5,2.284],[107.05,27.5,2.284],[108.66,27.5,2.284],[110.26,27.5,2.284],[111.86,27.5,2.284],[113.46,27.5,2.284],[115.07,27.5,2.284],[116.67,27.5,2.284],[118.27,27.5,2.284],[119.87,27.5,2.284],[121.48,27.5,2.284],[123.08,27.5,2.284],[124.68,27.5,2.284],[126.29,27.5,2.284],[127.89,27.5,2.284],[129.49,27.5,2.284],[131.09,27.5,2.284],[132.7,27.5,2.284],[134.3,27.5,2.284],[70.188,27.5,3.427],[71.791,27.5,3.427],[73.393,27.5,3.427],[74.996,27.5,3.427],[76.599,27.5,3.427],[78.202,27.5,3.427],[79.805,27.5,3.427],[81.407,27.5,3.427],[83.01,27.5,3.427],[84.613,27.5,3.427],[86.216,27.5,3.427],[87.819,27.5,3.427],[89.421,27.5,3.427],[91.024,27.5,3.427],[92.627,27.5,3.427],[94.23,27.5,3.427],[95.833,27.5,3.427],[97.435,27.5,3.427],[99.038,27.5,3.427],[100.64,27.5,3.427],[102.24,27.5,3.427],[103.85,27.5,3.427],[105.45,27.5,3.427],[107.05,27.5,3.427],[108.66,27.5,3.427],[110.26,27.5,3.427],[111.86,27.5,3.427],[113.46,27.5,3.427],[115.07,27.5,3.427],[116.67,27.5,3.427],[118.27,27.5,3.427],[119.87,27.5,3.427],[121.48,27.5,3.427],[123.08,27.5,3.427],[124.68,27.5,3.427],[126.29,27.5,3.427],[127.89,27.5,3.427],[129.49,27.5,3.427],[131.09,27.5,3.427],[132.7,27.5,3.427],[134.3,27.5,3.427],[70.188,27.5,4.57],[71.791,27.5,4.57],[73.393,27.5,4.57],[74.996,27.5,4.57],[76.599,27.5,4.57],[78.202,27.5,4.57],[79.805,27.5,4.57],[81.407,27.5,4.57],[83.01,27.5,4.57],[84.613,27.5,4.57],[86.216,27.5,4.57],[87.819,27.5,4.57],[89.421,27.5,4.57],[91.024,27.5,4.57],[92.627,27.5,4.57],[94.23,27.5,4.57],[95.833,27.5,4.57],[97.435,27.5,4.57],[99.038,27.5,4.57],[100.64,27.5,4.57],[102.24,27.5,4.57],[103.85,27.5,4.57],[105.45,27.5,4.57],[107.05,27.5,4.57],[108.66,27.5,4.57],[110.26,27.5,4.57],[111.86,27.5,4.57],[113.46,27.5,4.57],[115.07,27.5,4.57],[116.67,27.5,4.57],[118.27,27.5,4.57],[119.87,27.5,4.57],[121.48,27.5,4.57],[123.08,27.5,4.57],[124.68,27.5,4.57],[126.29,27.5,4.57],[127.89,27.5,4.57],[129.49,27.5,4.57],[131.09,27.5,4.57],[132.7,27.5,4.57],[134.3,27.5,4.57],[70.188,27.5,5.713],[71.791,27.5,5.713],[73.393,27.5,5.713],[74.996,27.5,5.713],[76.599,27.5,5.713],[78.202,27.5,5.713],[79.805,27.5,5.713],[81.407,27.5,5.713],[83.01,27.5,5.713],[84.613,27.5,5.713],[86.216,27.5,5.713],[87.819,27.5,5.713],[89.421,27.5,5.713],[91.024,27.5,5.713],[92.627,27.5,5.713],[94.23,27.5,5.713],[95.833,27.5,5.713],[97.435,27.5,5.713],[99.038,27.5,5.713],[100.64,27.5,5.713],[102.24,27.5,5.713],[103.85,27.5,5.713],[105.45,27.5,5.713],[107.05,27.5,5.713],[108.66,27.5,5.713],[110.26,27.5,5.713],[111.86,27.5,5.713],[113.46,27.5,5.713],[115.07,27.5,5.713],[116.67,27.5,5.713],[118.27,27.5,5.713],[119.87,27.5,5.713],[121.48,27.5,5.713],[123.08,27.5,5.713],[124.68,27.5,5.713],[126.29,27.5,5.713],[127.89,27.5,5.713],[129.49,27.5,5.713],[131.09,27.5,5.713],[132.7,27.5,5.713],[134.3,27.5,5.713],[70.188,27.5,6.856],[71.791,27.5,6.856],[73.393,27.5,6.856],[74.996,27.5,6.856],[76.599,27.5,6.856],[78.202,27.5,6.856],[79.805,27.5,6.856],[81.407,27.5,6.856],[83.01,27.5,6.856],[84.613,27.5,6.856],[86.216,27.5,6.856],[87.819,27.5,6.856],[89.421,27.5,6.856],[91.024,27.5,6.856],[92.627,27.5,6.856],[94.23,27.5,6.856],[95.833,27.5,6.856],[97.435,27.5,6.856],[99.038,27.5,6.856],[100.64,27.5,6.856],[102.24,27.5,6.856],[103.85,27.5,6.856],[105.45,27.5,6.856],[107.05,27.5,6.856],[108.66,27.5,6.856],[110.26,27.5,6.856],[111.86,27.5,6.856],[113.46,27.5,6.856],[115.07,27.5,6.856],[116.67,27.5,6.856],[118.27,27.5,6.856],[119.87,27.5,6.856],[121.48,27.5,6.856],[123.08,27.5,6.856],[124.68,27.5,6.856],[126.29,27.5,6.856],[127.89,27.5,6.856],[129.49,27.5,6.856],[131.09,27.5,6.856],[132.7,27.5,6.856],[134.3,27.5,6.856],[70.188,27.5,7.999],[71.791,27.5,7.999],[73.393,27.5,7.999],[74.996,27.5,7.999],[76.599,27.5,7.999],[78.202,27.5,7.999],[79.805,27.5,7.999],[81.407,27.5,7.999],[83.01,27.5,7.999],[84.613,27.5,7.999],[86.216,27.5,7.999],[87.819,27.5,7.999],[89.421,27.5,7.999],[91.024,27.5,7.999],[92.627,27.5,7.999],[94.23,27.5,7.999],[95.833,27.5,7.999],[97.435,27.5,7.999],[99.038,27.5,7.999],[100.64,27.5,7.999],[102.24,27.5,7.999],[103.85,27.5,7.999],[105.45,27.5,7.999],[107.05,27.5,7.999],[108.66,27.5,7.999],[110.26,27.5,7.999],[111.86,27.5,7.999],[113.46,27.5,7.999],[115.07,27.5,7.999],[116.67,27.5,7.999],[118.27,27.5,7.999],[119.87,27.5,7.999],[121.48,27.5,7.999],[123.08,27.5,7.999],[124.68,27.5,7.999],[126.29,27.5,7.999],[127.89,27.5,7.999],[129.49,27.5,7.999],[131.09,27.5,7.999],[132.7,27.5,7.999],[134.3,27.5,7.999],[70.188,27.5,9.142],[71.791,27.5,9.142],[73.393,27.5,9.142],[74.996,27.5,9.142],[76.599,27.5,9.142],[78.202,27.5,9.142],[79.805,27.5,9.142],[81.407,27.5,9.142],[83.01,27.5,9.142],[84.613,27.5,9.142],[86.216,27.5,9.142],[87.819,27.5,9.142],[89.421,27.5,9.142],[91.024,27.5,9.142],[92.627,27.5,9.142],[94.23,27.5,9.142],[95.833,27.5,9.142],[97.435,27.5,9.142],[99.038,27.5,9.142],[100.64,27.5,9.142],[102.24,27.5,9.142],[103.85,27.5,9.142],[105.45,27.5,9.142],[107.05,27.5,9.142],[108.66,27.5,9.142],[110.26,27.5,9.142],[111.86,27.5,9.142],[113.46,27.5,9.142],[115.07,27.5,9.142],[116.67,27.5,9.142],[118.27,27.5,9.142],[119.87,27.5,9.142],[121.48,27.5,9.142],[123.08,27.5,9.142],[124.68,27.5,9.142],[126.29,27.5,9.142],[127.89,27.5,9.142],[129.49,27.5,9.142],[131.09,27.5,9.142],[132.7,27.5,9.142],[134.3,27.5,9.142],[70.188,27.5,10.285],[71.791,27.5,10.285],[73.393,27.5,10.285],[74.996,27.5,10.285],[76.599,27.5,10.285],[78.202,27.5,10.285],[79.805,27.5,10.285],[81.407,27.5,10.285],[83.01,27.5,10.285],[84.613,27.5,10.285],[86.216,27.5,10.285],[87.819,27.5,10.285],[89.421,27.5,10.285],[91.024,27.5,10.285],[92.627,27.5,10.285],[94.23,27.5,10.285],[95.833,27.5,10.285],[97.435,27.5,10.285],[99.038,27.5,10.285],[100.64,27.5,10.285],[102.24,27.5,10.285],[103.85,27.5,10.285],[105.45,27.5,10.285],[107.05,27.5,10.285],[108.66,27.5,10.285],[110.26,27.5,10.285],[111.86,27.5,10.285],[113.46,27.5,10.285],[115.07,27.5,10.285],[116.67,27.5,10.285],[118.27,27.5,10.285],[119.87,27.5,10.285],[121.48,27.5,10.285],[123.08,27.5,10.285],[124.68,27.5,10.285],[126.29,27.5,10.285],[127.89,27.5,10.285],[129.49,27.5,10.285],[131.09,27.5,10.285],[132.7,27.5,10.285],[134.3,27.5,10.285],[70.188,27.5,11.428],[71.791,27.5,11.428],[73.393,27.5,11.428],[74.996,27.5,11.428],[76.599,27.5,11.428],[78.202,27.5,11.428],[79.805,27.5,11.428],[81.407,27.5,11.428],[83.01,27.5,11.428],[84.613,27.5,11.428],[86.216,27.5,11.428],[87.819,27.5,11.428],[89.421,27.5,11.428],[91.024,27.5,11.428],[92.627,27.5,11.428],[94.23,27.5,11.428],[95.833,27.5,11.428],[97.435,27.5,11.428],[99.038,27.5,11.428],[100.64,27.5,11.428],[102.24,27.5,11.428],[103.85,27.5,11.428],[105.45,27.5,11.428],[107.05,27.5,11.428],[108.66,27.5,11.428],[110.26,27.5,11.428],[111.86,27.5,11.428],[113.46,27.5,11.428],[115.07,27.5,11.428],[116.67,27.5,11.428],[118.27,27.5,11.428],[119.87,27.5,11.428],[121.48,27.5,11.428],[123.08,27.5,11.428],[124.68,27.5,11.428],[126.29,27.5,11.428],[127.89,27.5,11.428],[129.49,27.5,11.428],[131.09,27.5,11.428],[132.7,27.5,11.428],[134.3,27.5,11.428],[70.188,27.5,12.571],[71.791,27.5,12.571],[73.393,27.5,12.571],[74.996,27.5,12.571],[76.599,27.5,12.571],[78.202,27.5,12.571],[79.805,27.5,12.571],[81.407,27.5,12.571],[83.01,27.5,12.571],[84.613,27.5,12.571],[86.216,27.5,12.571],[87.819,27.5,12.571],[89.421,27.5,12.571],[91.024,27.5,12.571],[92.627,27.5,12.571],[94.23,27.5,12.571],[95.833,27.5,12.571],[97.435,27.5,12.571],[99.038,27.5,12.571],[100.64,27.5,12.571],[102.24,27.5,12.571],[103.85,27.5,12.571],[105.45,27.5,12.571],[107.05,27.5,12.571],[108.66,27.5,12.571],[110.26,27.5,12.571],[111.86,27.5,12.571],[113.46,27.5,12.571],[115.07,27.5,12.571],[116.67,27.5,12.571],[118.27,27.5,12.571],[119.87,27.5,12.571],[121.48,27.5,12.571],[123.08,27.5,12.571],[124.68,27.5,12.571],[126.29,27.5,12.571],[127.89,27.5,12.571],[129.49,27.5,12.571],[131.09,27.5,12.571],[132.7,27.5,12.571],[134.3,27.5,12.571],[70.188,27.5,13.714],[71.791,27.5,13.714],[73.393,27.5,13.714],[74.996,27.5,13.714],[76.599,27.5,13.714],[78.202,27.5,13.714],[79.805,27.5,13.714],[81.407,27.5,13.714],[83.01,27.5,13.714],[84.613,27.5,13.714],[86.216,27.5,13.714],[87.819,27.5,13.714],[89.421,27.5,13.714],[91.024,27.5,13.714],[92.627,27.5,13.714],[94.23,27.5,13.714],[95.833,27.5,13.714],[97.435,27.5,13.714],[99.038,27.5,13.714],[100.64,27.5,13.714],[102.24,27.5,13.714],[103.85,27.5,13.714],[105.45,27.5,13.714],[107.05,27.5,13.714],[108.66,27.5,13.714],[110.26,27.5,13.714],[111.86,27.5,13.714],[113.46,27.5,13.714],[115.07,27.5,13.714],[116.67,27.5,13.714],[118.27,27.5,13.714],[119.87,27.5,13.714],[121.48,27.5,13.714],[123.08,27.5,13.714],[124.68,27.5,13.714],[126.29,27.5,13.714],[127.89,27.5,13.714],[129.49,27.5,13.714],[131.09,27.5,13.714],[132.7,27.5,13.714],[134.3,27.5,13.714],[70.188,27.5,14.857],[71.791,27.5,14.857],[73.393,27.5,14.857],[74.996,27.5,14.857],[76.599,27.5,14.857],[78.202,27.5,14.857],[79.805,27.5,14.857],[81.407,27.5,14.857],[83.01,27.5,14.857],[84.613,27.5,14.857],[86.216,27.5,14.857],[87.819,27.5,14.857],[89.421,27.5,14.857],[91.024,27.5,14.857],[92.627,27.5,14.857],[94.23,27.5,14.857],[95.833,27.5,14.857],[97.435,27.5,14.857],[99.038,27.5,14.857],[100.64,27.5,14.857],[102.24,27.5,14.857],[103.85,27.5,14.857],[105.45,27.5,14.857],[107.05,27.5,14.857],[108.66,27.5,14.857],[110.26,27.5,14.857],[111.86,27.5,14.857],[113.46,27.5,14.857],[115.07,27.5,14.857],[116.67,27.5,14.857],[118.27,27.5,14.857],[119.87,27.5,14.857],[121.48,27.5,14.857],[123.08,27.5,14.857],[124.68,27.5,14.857],[126.29,27.5,14.857],[127.89,27.5,14.857],[129.49,27.5,14.857],[131.09,27.5,14.857],[132.7,27.5,14.857],[134.3,27.5,14.857],[70.188,27.5,16],[71.791,27.5,16],[73.393,27.5,16],[74.996,27.5,16],[76.599,27.5,16],[78.202,27.5,16],[79.805,27.5,16],[81.407,27.5,16],[83.01,27.5,16],[84.613,27.5,16],[86.216,27.5,16],[87.819,27.5,16],[89.421,27.5,16],[91.024,27.5,16],[92.627,27.5,16],[94.23,27.5,16],[95.833,27.5,16],[97.435,27.5,16],[99.038,27.5,16],[100.64,27.5,16],[102.24,27.5,16],[103.85,27.5,16],[105.45,27.5,16],[107.05,27.5,16],[108.66,27.5,16],[110.26,27.5,16],[111.86,27.5,16],[113.46,27.5,16],[115.07,27.5,16],[116.67,27.5,16],[118.27,27.5,16],[119.87,27.5,16],[121.48,27.5,16],[123.08,27.5,16],[124.68,27.5,16],[126.29,27.5,16],[127.89,27.5,16],[129.49,27.5,16],[131.09,27.5,16],[132.7,27.5,16],[134.3,27.5,16],[70.188,28.75,-0.002],[71.791,28.75,-0.002],[73.393,28.75,-0.002],[74.996,28.75,-0.002],[76.599,28.75,-0.002],[78.202,28.75,-0.002],[79.805,28.75,-0.002],[81.407,28.75,-0.002],[83.01,28.75,-0.002],[84.613,28.75,-0.002],[86.216,28.75,-0.002],[87.819,28.75,-0.002],[89.421,28.75,-0.002],[91.024,28.75,-0.002],[92.627,28.75,-0.002],[94.23,28.75,-0.002],[95.833,28.75,-0.002],[97.435,28.75,-0.002],[99.038,28.75,-0.002],[100.64,28.75,-0.002],[102.24,28.75,-0.002],[103.85,28.75,-0.002],[105.45,28.75,-0.002],[107.05,28.75,-0.002],[108.66,28.75,-0.002],[110.26,28.75,-0.002],[111.86,28.75,-0.002],[113.46,28.75,-0.002],[115.07,28.75,-0.002],[116.67,28.75,-0.002],[118.27,28.75,-0.002],[119.87,28.75,-0.002],[121.48,28.75,-0.002],[123.08,28.75,-0.002],[124.68,28.75,-0.002],[126.29,28.75,-0.002],[127.89,28.75,-0.002],[129.49,28.75,-0.002],[131.09,28.75,-0.002],[132.7,28.75,-0.002],[134.3,28.75,-0.002],[70.188,28.75,1.141],[71.791,28.75,1.141],[73.393,28.75,1.141],[74.996,28.75,1.141],[76.599,28.75,1.141],[78.202,28.75,1.141],[79.805,28.75,1.141],[81.407,28.75,1.141],[83.01,28.75,1.141],[84.613,28.75,1.141],[86.216,28.75,1.141],[87.819,28.75,1.141],[89.421,28.75,1.141],[91.024,28.75,1.141],[92.627,28.75,1.141],[94.23,28.75,1.141],[95.833,28.75,1.141],[97.435,28.75,1.141],[99.038,28.75,1.141],[100.64,28.75,1.141],[102.24,28.75,1.141],[103.85,28.75,1.141],[105.45,28.75,1.141],[107.05,28.75,1.141],[108.66,28.75,1.141],[110.26,28.75,1.141],[111.86,28.75,1.141],[113.46,28.75,1.141],[115.07,28.75,1.141],[116.67,28.75,1.141],[118.27,28.75,1.141],[119.87,28.75,1.141],[121.48,28.75,1.141],[123.08,28.75,1.141],[124.68,28.75,1.141],[126.29,28.75,1.141],[127.89,28.75,1.141],[129.49,28.75,1.141],[131.09,28.75,1.141],[132.7,28.75,1.141],[134.3,28.75,1.141],[70.188,28.75,2.284],[71.791,28.75,2.284],[73.393,28.75,2.284],[74.996,28.75,2.284],[76.599,28.75,2.284],[78.202,28.75,2.284],[79.805,28.75,2.284],[81.407,28.75,2.284],[83.01,28.75,2.284],[84.613,28.75,2.284],[86.216,28.75,2.284],[87.819,28.75,2.284],[89.421,28.75,2.284],[91.024,28.75,2.284],[92.627,28.75,2.284],[94.23,28.75,2.284],[95.833,28.75,2.284],[97.435,28.75,2.284],[99.038,28.75,2.284],[100.64,28.75,2.284],[102.24,28.75,2.284],[103.85,28.75,2.284],[105.45,28.75,2.284],[107.05,28.75,2.284],[108.66,28.75,2.284],[110.26,28.75,2.284],[111.86,28.75,2.284],[113.46,28.75,2.284],[115.07,28.75,2.284],[116.67,28.75,2.284],[118.27,28.75,2.284],[119.87,28.75,2.284],[121.48,28.75,2.284],[123.08,28.75,2.284],[124.68,28.75,2.284],[126.29,28.75,2.284],[127.89,28.75,2.284],[129.49,28.75,2.284],[131.09,28.75,2.284],[132.7,28.75,2.284],[134.3,28.75,2.284],[70.188,28.75,3.427],[71.791,28.75,3.427],[73.393,28.75,3.427],[74.996,28.75,3.427],[76.599,28.75,3.427],[78.202,28.75,3.427],[79.805,28.75,3.427],[81.407,28.75,3.427],[83.01,28.75,3.427],[84.613,28.75,3.427],[86.216,28.75,3.427],[87.819,28.75,3.427],[89.421,28.75,3.427],[91.024,28.75,3.427],[92.627,28.75,3.427],[94.23,28.75,3.427],[95.833,28.75,3.427],[97.435,28.75,3.427],[99.038,28.75,3.427],[100.64,28.75,3.427],[102.24,28.75,3.427],[103.85,28.75,3.427],[105.45,28.75,3.427],[107.05,28.75,3.427],[108.66,28.75,3.427],[110.26,28.75,3.427],[111.86,28.75,3.427],[113.46,28.75,3.427],[115.07,28.75,3.427],[116.67,28.75,3.427],[118.27,28.75,3.427],[119.87,28.75,3.427],[121.48,28.75,3.427],[123.08,28.75,3.427],[124.68,28.75,3.427],[126.29,28.75,3.427],[127.89,28.75,3.427],[129.49,28.75,3.427],[131.09,28.75,3.427],[132.7,28.75,3.427],[134.3,28.75,3.427],[70.188,28.75,4.57],[71.791,28.75,4.57],[73.393,28.75,4.57],[74.996,28.75,4.57],[76.599,28.75,4.57],[78.202,28.75,4.57],[79.805,28.75,4.57],[81.407,28.75,4.57],[83.01,28.75,4.57],[84.613,28.75,4.57],[86.216,28.75,4.57],[87.819,28.75,4.57],[89.421,28.75,4.57],[91.024,28.75,4.57],[92.627,28.75,4.57],[94.23,28.75,4.57],[95.833,28.75,4.57],[97.435,28.75,4.57],[99.038,28.75,4.57],[100.64,28.75,4.57],[102.24,28.75,4.57],[103.85,28.75,4.57],[105.45,28.75,4.57],[107.05,28.75,4.57],[108.66,28.75,4.57],[110.26,28.75,4.57],[111.86,28.75,4.57],[113.46,28.75,4.57],[115.07,28.75,4.57],[116.67,28.75,4.57],[118.27,28.75,4.57],[119.87,28.75,4.57],[121.48,28.75,4.57],[123.08,28.75,4.57],[124.68,28.75,4.57],[126.29,28.75,4.57],[127.89,28.75,4.57],[129.49,28.75,4.57],[131.09,28.75,4.57],[132.7,28.75,4.57],[134.3,28.75,4.57],[70.188,28.75,5.713],[71.791,28.75,5.713],[73.393,28.75,5.713],[74.996,28.75,5.713],[76.599,28.75,5.713],[78.202,28.75,5.713],[79.805,28.75,5.713],[81.407,28.75,5.713],[83.01,28.75,5.713],[84.613,28.75,5.713],[86.216,28.75,5.713],[87.819,28.75,5.713],[89.421,28.75,5.713],[91.024,28.75,5.713],[92.627,28.75,5.713],[94.23,28.75,5.713],[95.833,28.75,5.713],[97.435,28.75,5.713],[99.038,28.75,5.713],[100.64,28.75,5.713],[102.24,28.75,5.713],[103.85,28.75,5.713],[105.45,28.75,5.713],[107.05,28.75,5.713],[108.66,28.75,5.713],[110.26,28.75,5.713],[111.86,28.75,5.713],[113.46,28.75,5.713],[115.07,28.75,5.713],[116.67,28.75,5.713],[118.27,28.75,5.713],[119.87,28.75,5.713],[121.48,28.75,5.713],[123.08,28.75,5.713],[124.68,28.75,5.713],[126.29,28.75,5.713],[127.89,28.75,5.713],[129.49,28.75,5.713],[131.09,28.75,5.713],[132.7,28.75,5.713],[134.3,28.75,5.713],[70.188,28.75,6.856],[71.791,28.75,6.856],[73.393,28.75,6.856],[74.996,28.75,6.856],[76.599,28.75,6.856],[78.202,28.75,6.856],[79.805,28.75,6.856],[81.407,28.75,6.856],[83.01,28.75,6.856],[84.613,28.75,6.856],[86.216,28.75,6.856],[87.819,28.75,6.856],[89.421,28.75,6.856],[91.024,28.75,6.856],[92.627,28.75,6.856],[94.23,28.75,6.856],[95.833,28.75,6.856],[97.435,28.75,6.856],[99.038,28.75,6.856],[100.64,28.75,6.856],[102.24,28.75,6.856],[103.85,28.75,6.856],[105.45,28.75,6.856],[107.05,28.75,6.856],[108.66,28.75,6.856],[110.26,28.75,6.856],[111.86,28.75,6.856],[113.46,28.75,6.856],[115.07,28.75,6.856],[116.67,28.75,6.856],[118.27,28.75,6.856],[119.87,28.75,6.856],[121.48,28.75,6.856],[123.08,28.75,6.856],[124.68,28.75,6.856],[126.29,28.75,6.856],[127.89,28.75,6.856],[129.49,28.75,6.856],[131.09,28.75,6.856],[132.7,28.75,6.856],[134.3,28.75,6.856],[70.188,28.75,7.999],[71.791,28.75,7.999],[73.393,28.75,7.999],[74.996,28.75,7.999],[76.599,28.75,7.999],[78.202,28.75,7.999],[79.805,28.75,7.999],[81.407,28.75,7.999],[83.01,28.75,7.999],[84.613,28.75,7.999],[86.216,28.75,7.999],[87.819,28.75,7.999],[89.421,28.75,7.999],[91.024,28.75,7.999],[92.627,28.75,7.999],[94.23,28.75,7.999],[95.833,28.75,7.999],[97.435,28.75,7.999],[99.038,28.75,7.999],[100.64,28.75,7.999],[102.24,28.75,7.999],[103.85,28.75,7.999],[105.45,28.75,7.999],[107.05,28.75,7.999],[108.66,28.75,7.999],[110.26,28.75,7.999],[111.86,28.75,7.999],[113.46,28.75,7.999],[115.07,28.75,7.999],[116.67,28.75,7.999],[118.27,28.75,7.999],[119.87,28.75,7.999],[121.48,28.75,7.999],[123.08,28.75,7.999],[124.68,28.75,7.999],[126.29,28.75,7.999],[127.89,28.75,7.999],[129.49,28.75,7.999],[131.09,28.75,7.999],[132.7,28.75,7.999],[134.3,28.75,7.999],[70.188,28.75,9.142],[71.791,28.75,9.142],[73.393,28.75,9.142],[74.996,28.75,9.142],[76.599,28.75,9.142],[78.202,28.75,9.142],[79.805,28.75,9.142],[81.407,28.75,9.142],[83.01,28.75,9.142],[84.613,28.75,9.142],[86.216,28.75,9.142],[87.819,28.75,9.142],[89.421,28.75,9.142],[91.024,28.75,9.142],[92.627,28.75,9.142],[94.23,28.75,9.142],[95.833,28.75,9.142],[97.435,28.75,9.142],[99.038,28.75,9.142],[100.64,28.75,9.142],[102.24,28.75,9.142],[103.85,28.75,9.142],[105.45,28.75,9.142],[107.05,28.75,9.142],[108.66,28.75,9.142],[110.26,28.75,9.142],[111.86,28.75,9.142],[113.46,28.75,9.142],[115.07,28.75,9.142],[116.67,28.75,9.142],[118.27,28.75,9.142],[119.87,28.75,9.142],[121.48,28.75,9.142],[123.08,28.75,9.142],[124.68,28.75,9.142],[126.29,28.75,9.142],[127.89,28.75,9.142],[129.49,28.75,9.142],[131.09,28.75,9.142],[132.7,28.75,9.142],[134.3,28.75,9.142],[70.188,28.75,10.285],[71.791,28.75,10.285],[73.393,28.75,10.285],[74.996,28.75,10.285],[76.599,28.75,10.285],[78.202,28.75,10.285],[79.805,28.75,10.285],[81.407,28.75,10.285],[83.01,28.75,10.285],[84.613,28.75,10.285],[86.216,28.75,10.285],[87.819,28.75,10.285],[89.421,28.75,10.285],[91.024,28.75,10.285],[92.627,28.75,10.285],[94.23,28.75,10.285],[95.833,28.75,10.285],[97.435,28.75,10.285],[99.038,28.75,10.285],[100.64,28.75,10.285],[102.24,28.75,10.285],[103.85,28.75,10.285],[105.45,28.75,10.285],[107.05,28.75,10.285],[108.66,28.75,10.285],[110.26,28.75,10.285],[111.86,28.75,10.285],[113.46,28.75,10.285],[115.07,28.75,10.285],[116.67,28.75,10.285],[118.27,28.75,10.285],[119.87,28.75,10.285],[121.48,28.75,10.285],[123.08,28.75,10.285],[124.68,28.75,10.285],[126.29,28.75,10.285],[127.89,28.75,10.285],[129.49,28.75,10.285],[131.09,28.75,10.285],[132.7,28.75,10.285],[134.3,28.75,10.285],[70.188,28.75,11.428],[71.791,28.75,11.428],[73.393,28.75,11.428],[74.996,28.75,11.428],[76.599,28.75,11.428],[78.202,28.75,11.428],[79.805,28.75,11.428],[81.407,28.75,11.428],[83.01,28.75,11.428],[84.613,28.75,11.428],[86.216,28.75,11.428],[87.819,28.75,11.428],[89.421,28.75,11.428],[91.024,28.75,11.428],[92.627,28.75,11.428],[94.23,28.75,11.428],[95.833,28.75,11.428],[97.435,28.75,11.428],[99.038,28.75,11.428],[100.64,28.75,11.428],[102.24,28.75,11.428],[103.85,28.75,11.428],[105.45,28.75,11.428],[107.05,28.75,11.428],[108.66,28.75,11.428],[110.26,28.75,11.428],[111.86,28.75,11.428],[113.46,28.75,11.428],[115.07,28.75,11.428],[116.67,28.75,11.428],[118.27,28.75,11.428],[119.87,28.75,11.428],[121.48,28.75,11.428],[123.08,28.75,11.428],[124.68,28.75,11.428],[126.29,28.75,11.428],[127.89,28.75,11.428],[129.49,28.75,11.428],[131.09,28.75,11.428],[132.7,28.75,11.428],[134.3,28.75,11.428],[70.188,28.75,12.571],[71.791,28.75,12.571],[73.393,28.75,12.571],[74.996,28.75,12.571],[76.599,28.75,12.571],[78.202,28.75,12.571],[79.805,28.75,12.571],[81.407,28.75,12.571],[83.01,28.75,12.571],[84.613,28.75,12.571],[86.216,28.75,12.571],[87.819,28.75,12.571],[89.421,28.75,12.571],[91.024,28.75,12.571],[92.627,28.75,12.571],[94.23,28.75,12.571],[95.833,28.75,12.571],[97.435,28.75,12.571],[99.038,28.75,12.571],[100.64,28.75,12.571],[102.24,28.75,12.571],[103.85,28.75,12.571],[105.45,28.75,12.571],[107.05,28.75,12.571],[108.66,28.75,12.571],[110.26,28.75,12.571],[111.86,28.75,12.571],[113.46,28.75,12.571],[115.07,28.75,12.571],[116.67,28.75,12.571],[118.27,28.75,12.571],[119.87,28.75,12.571],[121.48,28.75,12.571],[123.08,28.75,12.571],[124.68,28.75,12.571],[126.29,28.75,12.571],[127.89,28.75,12.571],[129.49,28.75,12.571],[131.09,28.75,12.571],[132.7,28.75,12.571],[134.3,28.75,12.571],[70.188,28.75,13.714],[71.791,28.75,13.714],[73.393,28.75,13.714],[74.996,28.75,13.714],[76.599,28.75,13.714],[78.202,28.75,13.714],[79.805,28.75,13.714],[81.407,28.75,13.714],[83.01,28.75,13.714],[84.613,28.75,13.714],[86.216,28.75,13.714],[87.819,28.75,13.714],[89.421,28.75,13.714],[91.024,28.75,13.714],[92.627,28.75,13.714],[94.23,28.75,13.714],[95.833,28.75,13.714],[97.435,28.75,13.714],[99.038,28.75,13.714],[100.64,28.75,13.714],[102.24,28.75,13.714],[103.85,28.75,13.714],[105.45,28.75,13.714],[107.05,28.75,13.714],[108.66,28.75,13.714],[110.26,28.75,13.714],[111.86,28.75,13.714],[113.46,28.75,13.714],[115.07,28.75,13.714],[116.67,28.75,13.714],[118.27,28.75,13.714],[119.87,28.75,13.714],[121.48,28.75,13.714],[123.08,28.75,13.714],[124.68,28.75,13.714],[126.29,28.75,13.714],[127.89,28.75,13.714],[129.49,28.75,13.714],[131.09,28.75,13.714],[132.7,28.75,13.714],[134.3,28.75,13.714],[70.188,28.75,14.857],[71.791,28.75,14.857],[73.393,28.75,14.857],[74.996,28.75,14.857],[76.599,28.75,14.857],[78.202,28.75,14.857],[79.805,28.75,14.857],[81.407,28.75,14.857],[83.01,28.75,14.857],[84.613,28.75,14.857],[86.216,28.75,14.857],[87.819,28.75,14.857],[89.421,28.75,14.857],[91.024,28.75,14.857],[92.627,28.75,14.857],[94.23,28.75,14.857],[95.833,28.75,14.857],[97.435,28.75,14.857],[99.038,28.75,14.857],[100.64,28.75,14.857],[102.24,28.75,14.857],[103.85,28.75,14.857],[105.45,28.75,14.857],[107.05,28.75,14.857],[108.66,28.75,14.857],[110.26,28.75,14.857],[111.86,28.75,14.857],[113.46,28.75,14.857],[115.07,28.75,14.857],[116.67,28.75,14.857],[118.27,28.75,14.857],[119.87,28.75,14.857],[121.48,28.75,14.857],[123.08,28.75,14.857],[124.68,28.75,14.857],[126.29,28.75,14.857],[127.89,28.75,14.857],[129.49,28.75,14.857],[131.09,28.75,14.857],[132.7,28.75,14.857],[134.3,28.75,14.857],[70.188,28.75,16],[71.791,28.75,16],[73.393,28.75,16],[74.996,28.75,16],[76.599,28.75,16],[78.202,28.75,16],[79.805,28.75,16],[81.407,28.75,16],[83.01,28.75,16],[84.613,28.75,16],[86.216,28.75,16],[87.819,28.75,16],[89.421,28.75,16],[91.024,28.75,16],[92.627,28.75,16],[94.23,28.75,16],[95.833,28.75,16],[97.435,28.75,16],[99.038,28.75,16],[100.64,28.75,16],[102.24,28.75,16],[103.85,28.75,16],[105.45,28.75,16],[107.05,28.75,16],[108.66,28.75,16],[110.26,28.75,16],[111.86,28.75,16],[113.46,28.75,16],[115.07,28.75,16],[116.67,28.75,16],[118.27,28.75,16],[119.87,28.75,16],[121.48,28.75,16],[123.08,28.75,16],[124.68,28.75,16],[126.29,28.75,16],[127.89,28.75,16],[129.49,28.75,16],[131.09,28.75,16],[132.7,28.75,16],[134.3,28.75,16],[70.188,30,-0.002],[71.791,30,-0.002],[73.393,30,-0.002],[74.996,30,-0.002],[76.599,30,-0.002],[78.202,30,-0.002],[79.805,30,-0.002],[81.407,30,-0.002],[83.01,30,-0.002],[84.613,30,-0.002],[86.216,30,-0.002],[87.819,30,-0.002],[89.421,30,-0.002],[91.024,30,-0.002],[92.627,30,-0.002],[94.23,30,-0.002],[95.833,30,-0.002],[97.435,30,-0.002],[99.038,30,-0.002],[100.64,30,-0.002],[102.24,30,-0.002],[103.85,30,-0.002],[105.45,30,-0.002],[107.05,30,-0.002],[108.66,30,-0.002],[110.26,30,-0.002],[111.86,30,-0.002],[113.46,30,-0.002],[115.07,30,-0.002],[116.67,30,-0.002],[118.27,30,-0.002],[119.87,30,-0.002],[121.48,30,-0.002],[123.08,30,-0.002],[124.68,30,-0.002],[126.29,30,-0.002],[127.89,30,-0.002],[129.49,30,-0.002],[131.09,30,-0.002],[132.7,30,-0.002],[134.3,30,-0.002],[70.188,30,1.141],[71.791,30,1.141],[73.393,30,1.141],[74.996,30,1.141],[76.599,30,1.141],[78.202,30,1.141],[79.805,30,1.141],[81.407,30,1.141],[83.01,30,1.141],[84.613,30,1.141],[86.216,30,1.141],[87.819,30,1.141],[89.421,30,1.141],[91.024,30,1.141],[92.627,30,1.141],[94.23,30,1.141],[95.833,30,1.141],[97.435,30,1.141],[99.038,30,1.141],[100.64,30,1.141],[102.24,30,1.141],[103.85,30,1.141],[105.45,30,1.141],[107.05,30,1.141],[108.66,30,1.141],[110.26,30,1.141],[111.86,30,1.141],[113.46,30,1.141],[115.07,30,1.141],[116.67,30,1.141],[118.27,30,1.141],[119.87,30,1.141],[121.48,30,1.141],[123.08,30,1.141],[124.68,30,1.141],[126.29,30,1.141],[127.89,30,1.141],[129.49,30,1.141],[131.09,30,1.141],[132.7,30,1.141],[134.3,30,1.141],[70.188,30,2.284],[71.791,30,2.284],[73.393,30,2.284],[74.996,30,2.284],[76.599,30,2.284],[78.202,30,2.284],[79.805,30,2.284],[81.407,30,2.284],[83.01,30,2.284],[84.613,30,2.284],[86.216,30,2.284],[87.819,30,2.284],[89.421,30,2.284],[91.024,30,2.284],[92.627,30,2.284],[94.23,30,2.284],[95.833,30,2.284],[97.435,30,2.284],[99.038,30,2.284],[100.64,30,2.284],[102.24,30,2.284],[103.85,30,2.284],[105.45,30,2.284],[107.05,30,2.284],[108.66,30,2.284],[110.26,30,2.284],[111.86,30,2.284],[113.46,30,2.284],[115.07,30,2.284],[116.67,30,2.284],[118.27,30,2.284],[119.87,30,2.284],[121.48,30,2.284],[123.08,30,2.284],[124.68,30,2.284],[126.29,30,2.284],[127.89,30,2.284],[129.49,30,2.284],[131.09,30,2.284],[132.7,30,2.284],[134.3,30,2.284],[70.188,30,3.427],[71.791,30,3.427],[73.393,30,3.427],[74.996,30,3.427],[76.599,30,3.427],[78.202,30,3.427],[79.805,30,3.427],[81.407,30,3.427],[83.01,30,3.427],[84.613,30,3.427],[86.216,30,3.427],[87.819,30,3.427],[89.421,30,3.427],[91.024,30,3.427],[92.627,30,3.427],[94.23,30,3.427],[95.833,30,3.427],[97.435,30,3.427],[99.038,30,3.427],[100.64,30,3.427],[102.24,30,3.427],[103.85,30,3.427],[105.45,30,3.427],[107.05,30,3.427],[108.66,30,3.427],[110.26,30,3.427],[111.86,30,3.427],[113.46,30,3.427],[115.07,30,3.427],[116.67,30,3.427],[118.27,30,3.427],[119.87,30,3.427],[121.48,30,3.427],[123.08,30,3.427],[124.68,30,3.427],[126.29,30,3.427],[127.89,30,3.427],[129.49,30,3.427],[131.09,30,3.427],[132.7,30,3.427],[134.3,30,3.427],[70.188,30,4.57],[71.791,30,4.57],[73.393,30,4.57],[74.996,30,4.57],[76.599,30,4.57],[78.202,30,4.57],[79.805,30,4.57],[81.407,30,4.57],[83.01,30,4.57],[84.613,30,4.57],[86.216,30,4.57],[87.819,30,4.57],[89.421,30,4.57],[91.024,30,4.57],[92.627,30,4.57],[94.23,30,4.57],[95.833,30,4.57],[97.435,30,4.57],[99.038,30,4.57],[100.64,30,4.57],[102.24,30,4.57],[103.85,30,4.57],[105.45,30,4.57],[107.05,30,4.57],[108.66,30,4.57],[110.26,30,4.57],[111.86,30,4.57],[113.46,30,4.57],[115.07,30,4.57],[116.67,30,4.57],[118.27,30,4.57],[119.87,30,4.57],[121.48,30,4.57],[123.08,30,4.57],[124.68,30,4.57],[126.29,30,4.57],[127.89,30,4.57],[129.49,30,4.57],[131.09,30,4.57],[132.7,30,4.57],[134.3,30,4.57],[70.188,30,5.713],[71.791,30,5.713],[73.393,30,5.713],[74.996,30,5.713],[76.599,30,5.713],[78.202,30,5.713],[79.805,30,5.713],[81.407,30,5.713],[83.01,30,5.713],[84.613,30,5.713],[86.216,30,5.713],[87.819,30,5.713],[89.421,30,5.713],[91.024,30,5.713],[92.627,30,5.713],[94.23,30,5.713],[95.833,30,5.713],[97.435,30,5.713],[99.038,30,5.713],[100.64,30,5.713],[102.24,30,5.713],[103.85,30,5.713],[105.45,30,5.713],[107.05,30,5.713],[108.66,30,5.713],[110.26,30,5.713],[111.86,30,5.713],[113.46,30,5.713],[115.07,30,5.713],[116.67,30,5.713],[118.27,30,5.713],[119.87,30,5.713],[121.48,30,5.713],[123.08,30,5.713],[124.68,30,5.713],[126.29,30,5.713],[127.89,30,5.713],[129.49,30,5.713],[131.09,30,5.713],[132.7,30,5.713],[134.3,30,5.713],[70.188,30,6.856],[71.791,30,6.856],[73.393,30,6.856],[74.996,30,6.856],[76.599,30,6.856],[78.202,30,6.856],[79.805,30,6.856],[81.407,30,6.856],[83.01,30,6.856],[84.613,30,6.856],[86.216,30,6.856],[87.819,30,6.856],[89.421,30,6.856],[91.024,30,6.856],[92.627,30,6.856],[94.23,30,6.856],[95.833,30,6.856],[97.435,30,6.856],[99.038,30,6.856],[100.64,30,6.856],[102.24,30,6.856],[103.85,30,6.856],[105.45,30,6.856],[107.05,30,6.856],[108.66,30,6.856],[110.26,30,6.856],[111.86,30,6.856],[113.46,30,6.856],[115.07,30,6.856],[116.67,30,6.856],[118.27,30,6.856],[119.87,30,6.856],[121.48,30,6.856],[123.08,30,6.856],[124.68,30,6.856],[126.29,30,6.856],[127.89,30,6.856],[129.49,30,6.856],[131.09,30,6.856],[132.7,30,6.856],[134.3,30,6.856],[70.188,30,7.999],[71.791,30,7.999],[73.393,30,7.999],[74.996,30,7.999],[76.599,30,7.999],[78.202,30,7.999],[79.805,30,7.999],[81.407,30,7.999],[83.01,30,7.999],[84.613,30,7.999],[86.216,30,7.999],[87.819,30,7.999],[89.421,30,7.999],[91.024,30,7.999],[92.627,30,7.999],[94.23,30,7.999],[95.833,30,7.999],[97.435,30,7.999],[99.038,30,7.999],[100.64,30,7.999],[102.24,30,7.999],[103.85,30,7.999],[105.45,30,7.999],[107.05,30,7.999],[108.66,30,7.999],[110.26,30,7.999],[111.86,30,7.999],[113.46,30,7.999],[115.07,30,7.999],[116.67,30,7.999],[118.27,30,7.999],[119.87,30,7.999],[121.48,30,7.999],[123.08,30,7.999],[124.68,30,7.999],[126.29,30,7.999],[127.89,30,7.999],[129.49,30,7.999],[131.09,30,7.999],[132.7,30,7.999],[134.3,30,7.999],[70.188,30,9.142],[71.791,30,9.142],[73.393,30,9.142],[74.996,30,9.142],[76.599,30,9.142],[78.202,30,9.142],[79.805,30,9.142],[81.407,30,9.142],[83.01,30,9.142],[84.613,30,9.142],[86.216,30,9.142],[87.819,30,9.142],[89.421,30,9.142],[91.024,30,9.142],[92.627,30,9.142],[94.23,30,9.142],[95.833,30,9.142],[97.435,30,9.142],[99.038,30,9.142],[100.64,30,9.142],[102.24,30,9.142],[103.85,30,9.142],[105.45,30,9.142],[107.05,30,9.142],[108.66,30,9.142],[110.26,30,9.142],[111.86,30,9.142],[113.46,30,9.142],[115.07,30,9.142],[116.67,30,9.142],[118.27,30,9.142],[119.87,30,9.142],[121.48,30,9.142],[123.08,30,9.142],[124.68,30,9.142],[126.29,30,9.142],[127.89,30,9.142],[129.49,30,9.142],[131.09,30,9.142],[132.7,30,9.142],[134.3,30,9.142],[70.188,30,10.285],[71.791,30,10.285],[73.393,30,10.285],[74.996,30,10.285],[76.599,30,10.285],[78.202,30,10.285],[79.805,30,10.285],[81.407,30,10.285],[83.01,30,10.285],[84.613,30,10.285],[86.216,30,10.285],[87.819,30,10.285],[89.421,30,10.285],[91.024,30,10.285],[92.627,30,10.285],[94.23,30,10.285],[95.833,30,10.285],[97.435,30,10.285],[99.038,30,10.285],[100.64,30,10.285],[102.24,30,10.285],[103.85,30,10.285],[105.45,30,10.285],[107.05,30,10.285],[108.66,30,10.285],[110.26,30,10.285],[111.86,30,10.285],[113.46,30,10.285],[115.07,30,10.285],[116.67,30,10.285],[118.27,30,10.285],[119.87,30,10.285],[121.48,30,10.285],[123.08,30,10.285],[124.68,30,10.285],[126.29,30,10.285],[127.89,30,10.285],[129.49,30,10.285],[131.09,30,10.285],[132.7,30,10.285],[134.3,30,10.285],[70.188,30,11.428],[71.791,30,11.428],[73.393,30,11.428],[74.996,30,11.428],[76.599,30,11.428],[78.202,30,11.428],[79.805,30,11.428],[81.407,30,11.428],[83.01,30,11.428],[84.613,30,11.428],[86.216,30,11.428],[87.819,30,11.428],[89.421,30,11.428],[91.024,30,11.428],[92.627,30,11.428],[94.23,30,11.428],[95.833,30,11.428],[97.435,30,11.428],[99.038,30,11.428],[100.64,30,11.428],[102.24,30,11.428],[103.85,30,11.428],[105.45,30,11.428],[107.05,30,11.428],[108.66,30,11.428],[110.26,30,11.428],[111.86,30,11.428],[113.46,30,11.428],[115.07,30,11.428],[116.67,30,11.428],[118.27,30,11.428],[119.87,30,11.428],[121.48,30,11.428],[123.08,30,11.428],[124.68,30,11.428],[126.29,30,11.428],[127.89,30,11.428],[129.49,30,11.428],[131.09,30,11.428],[132.7,30,11.428],[134.3,30,11.428],[70.188,30,12.571],[71.791,30,12.571],[73.393,30,12.571],[74.996,30,12.571],[76.599,30,12.571],[78.202,30,12.571],[79.805,30,12.571],[81.407,30,12.571],[83.01,30,12.571],[84.613,30,12.571],[86.216,30,12.571],[87.819,30,12.571],[89.421,30,12.571],[91.024,30,12.571],[92.627,30,12.571],[94.23,30,12.571],[95.833,30,12.571],[97.435,30,12.571],[99.038,30,12.571],[100.64,30,12.571],[102.24,30,12.571],[103.85,30,12.571],[105.45,30,12.571],[107.05,30,12.571],[108.66,30,12.571],[110.26,30,12.571],[111.86,30,12.571],[113.46,30,12.571],[115.07,30,12.571],[116.67,30,12.571],[118.27,30,12.571],[119.87,30,12.571],[121.48,30,12.571],[123.08,30,12.571],[124.68,30,12.571],[126.29,30,12.571],[127.89,30,12.571],[129.49,30,12.571],[131.09,30,12.571],[132.7,30,12.571],[134.3,30,12.571],[70.188,30,13.714],[71.791,30,13.714],[73.393,30,13.714],[74.996,30,13.714],[76.599,30,13.714],[78.202,30,13.714],[79.805,30,13.714],[81.407,30,13.714],[83.01,30,13.714],[84.613,30,13.714],[86.216,30,13.714],[87.819,30,13.714],[89.421,30,13.714],[91.024,30,13.714],[92.627,30,13.714],[94.23,30,13.714],[95.833,30,13.714],[97.435,30,13.714],[99.038,30,13.714],[100.64,30,13.714],[102.24,30,13.714],[103.85,30,13.714],[105.45,30,13.714],[107.05,30,13.714],[108.66,30,13.714],[110.26,30,13.714],[111.86,30,13.714],[113.46,30,13.714],[115.07,30,13.714],[116.67,30,13.714],[118.27,30,13.714],[119.87,30,13.714],[121.48,30,13.714],[123.08,30,13.714],[124.68,30,13.714],[126.29,30,13.714],[127.89,30,13.714],[129.49,30,13.714],[131.09,30,13.714],[132.7,30,13.714],[134.3,30,13.714],[70.188,30,14.857],[71.791,30,14.857],[73.393,30,14.857],[74.996,30,14.857],[76.599,30,14.857],[78.202,30,14.857],[79.805,30,14.857],[81.407,30,14.857],[83.01,30,14.857],[84.613,30,14.857],[86.216,30,14.857],[87.819,30,14.857],[89.421,30,14.857],[91.024,30,14.857],[92.627,30,14.857],[94.23,30,14.857],[95.833,30,14.857],[97.435,30,14.857],[99.038,30,14.857],[100.64,30,14.857],[102.24,30,14.857],[103.85,30,14.857],[105.45,30,14.857],[107.05,30,14.857],[108.66,30,14.857],[110.26,30,14.857],[111.86,30,14.857],[113.46,30,14.857],[115.07,30,14.857],[116.67,30,14.857],[118.27,30,14.857],[119.87,30,14.857],[121.48,30,14.857],[123.08,30,14.857],[124.68,30,14.857],[126.29,30,14.857],[127.89,30,14.857],[129.49,30,14.857],[131.09,30,14.857],[132.7,30,14.857],[134.3,30,14.857],[70.188,30,16],[71.791,30,16],[73.393,30,16],[74.996,30,16],[76.599,30,16],[78.202,30,16],[79.805,30,16],[81.407,30,16],[83.01,30,16],[84.613,30,16],[86.216,30,16],[87.819,30,16],[89.421,30,16],[91.024,30,16],[92.627,30,16],[94.23,30,16],[95.833,30,16],[97.435,30,16],[99.038,30,16],[100.64,30,16],[102.24,30,16],[103.85,30,16],[105.45,30,16],[107.05,30,16],[108.66,30,16],[110.26,30,16],[111.86,30,16],[113.46,30,16],[115.07,30,16],[116.67,30,16],[118.27,30,16],[119.87,30,16],[121.48,30,16],[123.08,30,16],[124.68,30,16],[126.29,30,16],[127.89,30,16],[129.49,30,16],[131.09,30,16],[132.7,30,16],[134.3,30,16],[70.188,31.25,-0.002],[71.791,31.25,-0.002],[73.393,31.25,-0.002],[74.996,31.25,-0.002],[76.599,31.25,-0.002],[78.202,31.25,-0.002],[79.805,31.25,-0.002],[81.407,31.25,-0.002],[83.01,31.25,-0.002],[84.613,31.25,-0.002],[86.216,31.25,-0.002],[87.819,31.25,-0.002],[89.421,31.25,-0.002],[91.024,31.25,-0.002],[92.627,31.25,-0.002],[94.23,31.25,-0.002],[95.833,31.25,-0.002],[97.435,31.25,-0.002],[99.038,31.25,-0.002],[100.64,31.25,-0.002],[102.24,31.25,-0.002],[103.85,31.25,-0.002],[105.45,31.25,-0.002],[107.05,31.25,-0.002],[108.66,31.25,-0.002],[110.26,31.25,-0.002],[111.86,31.25,-0.002],[113.46,31.25,-0.002],[115.07,31.25,-0.002],[116.67,31.25,-0.002],[118.27,31.25,-0.002],[119.87,31.25,-0.002],[121.48,31.25,-0.002],[123.08,31.25,-0.002],[124.68,31.25,-0.002],[126.29,31.25,-0.002],[127.89,31.25,-0.002],[129.49,31.25,-0.002],[131.09,31.25,-0.002],[132.7,31.25,-0.002],[134.3,31.25,-0.002],[70.188,31.25,1.141],[71.791,31.25,1.141],[73.393,31.25,1.141],[74.996,31.25,1.141],[76.599,31.25,1.141],[78.202,31.25,1.141],[79.805,31.25,1.141],[81.407,31.25,1.141],[83.01,31.25,1.141],[84.613,31.25,1.141],[86.216,31.25,1.141],[87.819,31.25,1.141],[89.421,31.25,1.141],[91.024,31.25,1.141],[92.627,31.25,1.141],[94.23,31.25,1.141],[95.833,31.25,1.141],[97.435,31.25,1.141],[99.038,31.25,1.141],[100.64,31.25,1.141],[102.24,31.25,1.141],[103.85,31.25,1.141],[105.45,31.25,1.141],[107.05,31.25,1.141],[108.66,31.25,1.141],[110.26,31.25,1.141],[111.86,31.25,1.141],[113.46,31.25,1.141],[115.07,31.25,1.141],[116.67,31.25,1.141],[118.27,31.25,1.141],[119.87,31.25,1.141],[121.48,31.25,1.141],[123.08,31.25,1.141],[124.68,31.25,1.141],[126.29,31.25,1.141],[127.89,31.25,1.141],[129.49,31.25,1.141],[131.09,31.25,1.141],[132.7,31.25,1.141],[134.3,31.25,1.141],[70.188,31.25,2.284],[71.791,31.25,2.284],[73.393,31.25,2.284],[74.996,31.25,2.284],[76.599,31.25,2.284],[78.202,31.25,2.284],[79.805,31.25,2.284],[81.407,31.25,2.284],[83.01,31.25,2.284],[84.613,31.25,2.284],[86.216,31.25,2.284],[87.819,31.25,2.284],[89.421,31.25,2.284],[91.024,31.25,2.284],[92.627,31.25,2.284],[94.23,31.25,2.284],[95.833,31.25,2.284],[97.435,31.25,2.284],[99.038,31.25,2.284],[100.64,31.25,2.284],[102.24,31.25,2.284],[103.85,31.25,2.284],[105.45,31.25,2.284],[107.05,31.25,2.284],[108.66,31.25,2.284],[110.26,31.25,2.284],[111.86,31.25,2.284],[113.46,31.25,2.284],[115.07,31.25,2.284],[116.67,31.25,2.284],[118.27,31.25,2.284],[119.87,31.25,2.284],[121.48,31.25,2.284],[123.08,31.25,2.284],[124.68,31.25,2.284],[126.29,31.25,2.284],[127.89,31.25,2.284],[129.49,31.25,2.284],[131.09,31.25,2.284],[132.7,31.25,2.284],[134.3,31.25,2.284],[70.188,31.25,3.427],[71.791,31.25,3.427],[73.393,31.25,3.427],[74.996,31.25,3.427],[76.599,31.25,3.427],[78.202,31.25,3.427],[79.805,31.25,3.427],[81.407,31.25,3.427],[83.01,31.25,3.427],[84.613,31.25,3.427],[86.216,31.25,3.427],[87.819,31.25,3.427],[89.421,31.25,3.427],[91.024,31.25,3.427],[92.627,31.25,3.427],[94.23,31.25,3.427],[95.833,31.25,3.427],[97.435,31.25,3.427],[99.038,31.25,3.427],[100.64,31.25,3.427],[102.24,31.25,3.427],[103.85,31.25,3.427],[105.45,31.25,3.427],[107.05,31.25,3.427],[108.66,31.25,3.427],[110.26,31.25,3.427],[111.86,31.25,3.427],[113.46,31.25,3.427],[115.07,31.25,3.427],[116.67,31.25,3.427],[118.27,31.25,3.427],[119.87,31.25,3.427],[121.48,31.25,3.427],[123.08,31.25,3.427],[124.68,31.25,3.427],[126.29,31.25,3.427],[127.89,31.25,3.427],[129.49,31.25,3.427],[131.09,31.25,3.427],[132.7,31.25,3.427],[134.3,31.25,3.427],[70.188,31.25,4.57],[71.791,31.25,4.57],[73.393,31.25,4.57],[74.996,31.25,4.57],[76.599,31.25,4.57],[78.202,31.25,4.57],[79.805,31.25,4.57],[81.407,31.25,4.57],[83.01,31.25,4.57],[84.613,31.25,4.57],[86.216,31.25,4.57],[87.819,31.25,4.57],[89.421,31.25,4.57],[91.024,31.25,4.57],[92.627,31.25,4.57],[94.23,31.25,4.57],[95.833,31.25,4.57],[97.435,31.25,4.57],[99.038,31.25,4.57],[100.64,31.25,4.57],[102.24,31.25,4.57],[103.85,31.25,4.57],[105.45,31.25,4.57],[107.05,31.25,4.57],[108.66,31.25,4.57],[110.26,31.25,4.57],[111.86,31.25,4.57],[113.46,31.25,4.57],[115.07,31.25,4.57],[116.67,31.25,4.57],[118.27,31.25,4.57],[119.87,31.25,4.57],[121.48,31.25,4.57],[123.08,31.25,4.57],[124.68,31.25,4.57],[126.29,31.25,4.57],[127.89,31.25,4.57],[129.49,31.25,4.57],[131.09,31.25,4.57],[132.7,31.25,4.57],[134.3,31.25,4.57],[70.188,31.25,5.713],[71.791,31.25,5.713],[73.393,31.25,5.713],[74.996,31.25,5.713],[76.599,31.25,5.713],[78.202,31.25,5.713],[79.805,31.25,5.713],[81.407,31.25,5.713],[83.01,31.25,5.713],[84.613,31.25,5.713],[86.216,31.25,5.713],[87.819,31.25,5.713],[89.421,31.25,5.713],[91.024,31.25,5.713],[92.627,31.25,5.713],[94.23,31.25,5.713],[95.833,31.25,5.713],[97.435,31.25,5.713],[99.038,31.25,5.713],[100.64,31.25,5.713],[102.24,31.25,5.713],[103.85,31.25,5.713],[105.45,31.25,5.713],[107.05,31.25,5.713],[108.66,31.25,5.713],[110.26,31.25,5.713],[111.86,31.25,5.713],[113.46,31.25,5.713],[115.07,31.25,5.713],[116.67,31.25,5.713],[118.27,31.25,5.713],[119.87,31.25,5.713],[121.48,31.25,5.713],[123.08,31.25,5.713],[124.68,31.25,5.713],[126.29,31.25,5.713],[127.89,31.25,5.713],[129.49,31.25,5.713],[131.09,31.25,5.713],[132.7,31.25,5.713],[134.3,31.25,5.713],[70.188,31.25,6.856],[71.791,31.25,6.856],[73.393,31.25,6.856],[74.996,31.25,6.856],[76.599,31.25,6.856],[78.202,31.25,6.856],[79.805,31.25,6.856],[81.407,31.25,6.856],[83.01,31.25,6.856],[84.613,31.25,6.856],[86.216,31.25,6.856],[87.819,31.25,6.856],[89.421,31.25,6.856],[91.024,31.25,6.856],[92.627,31.25,6.856],[94.23,31.25,6.856],[95.833,31.25,6.856],[97.435,31.25,6.856],[99.038,31.25,6.856],[100.64,31.25,6.856],[102.24,31.25,6.856],[103.85,31.25,6.856],[105.45,31.25,6.856],[107.05,31.25,6.856],[108.66,31.25,6.856],[110.26,31.25,6.856],[111.86,31.25,6.856],[113.46,31.25,6.856],[115.07,31.25,6.856],[116.67,31.25,6.856],[118.27,31.25,6.856],[119.87,31.25,6.856],[121.48,31.25,6.856],[123.08,31.25,6.856],[124.68,31.25,6.856],[126.29,31.25,6.856],[127.89,31.25,6.856],[129.49,31.25,6.856],[131.09,31.25,6.856],[132.7,31.25,6.856],[134.3,31.25,6.856],[70.188,31.25,7.999],[71.791,31.25,7.999],[73.393,31.25,7.999],[74.996,31.25,7.999],[76.599,31.25,7.999],[78.202,31.25,7.999],[79.805,31.25,7.999],[81.407,31.25,7.999],[83.01,31.25,7.999],[84.613,31.25,7.999],[86.216,31.25,7.999],[87.819,31.25,7.999],[89.421,31.25,7.999],[91.024,31.25,7.999],[92.627,31.25,7.999],[94.23,31.25,7.999],[95.833,31.25,7.999],[97.435,31.25,7.999],[99.038,31.25,7.999],[100.64,31.25,7.999],[102.24,31.25,7.999],[103.85,31.25,7.999],[105.45,31.25,7.999],[107.05,31.25,7.999],[108.66,31.25,7.999],[110.26,31.25,7.999],[111.86,31.25,7.999],[113.46,31.25,7.999],[115.07,31.25,7.999],[116.67,31.25,7.999],[118.27,31.25,7.999],[119.87,31.25,7.999],[121.48,31.25,7.999],[123.08,31.25,7.999],[124.68,31.25,7.999],[126.29,31.25,7.999],[127.89,31.25,7.999],[129.49,31.25,7.999],[131.09,31.25,7.999],[132.7,31.25,7.999],[134.3,31.25,7.999],[70.188,31.25,9.142],[71.791,31.25,9.142],[73.393,31.25,9.142],[74.996,31.25,9.142],[76.599,31.25,9.142],[78.202,31.25,9.142],[79.805,31.25,9.142],[81.407,31.25,9.142],[83.01,31.25,9.142],[84.613,31.25,9.142],[86.216,31.25,9.142],[87.819,31.25,9.142],[89.421,31.25,9.142],[91.024,31.25,9.142],[92.627,31.25,9.142],[94.23,31.25,9.142],[95.833,31.25,9.142],[97.435,31.25,9.142],[99.038,31.25,9.142],[100.64,31.25,9.142],[102.24,31.25,9.142],[103.85,31.25,9.142],[105.45,31.25,9.142],[107.05,31.25,9.142],[108.66,31.25,9.142],[110.26,31.25,9.142],[111.86,31.25,9.142],[113.46,31.25,9.142],[115.07,31.25,9.142],[116.67,31.25,9.142],[118.27,31.25,9.142],[119.87,31.25,9.142],[121.48,31.25,9.142],[123.08,31.25,9.142],[124.68,31.25,9.142],[126.29,31.25,9.142],[127.89,31.25,9.142],[129.49,31.25,9.142],[131.09,31.25,9.142],[132.7,31.25,9.142],[134.3,31.25,9.142],[70.188,31.25,10.285],[71.791,31.25,10.285],[73.393,31.25,10.285],[74.996,31.25,10.285],[76.599,31.25,10.285],[78.202,31.25,10.285],[79.805,31.25,10.285],[81.407,31.25,10.285],[83.01,31.25,10.285],[84.613,31.25,10.285],[86.216,31.25,10.285],[87.819,31.25,10.285],[89.421,31.25,10.285],[91.024,31.25,10.285],[92.627,31.25,10.285],[94.23,31.25,10.285],[95.833,31.25,10.285],[97.435,31.25,10.285],[99.038,31.25,10.285],[100.64,31.25,10.285],[102.24,31.25,10.285],[103.85,31.25,10.285],[105.45,31.25,10.285],[107.05,31.25,10.285],[108.66,31.25,10.285],[110.26,31.25,10.285],[111.86,31.25,10.285],[113.46,31.25,10.285],[115.07,31.25,10.285],[116.67,31.25,10.285],[118.27,31.25,10.285],[119.87,31.25,10.285],[121.48,31.25,10.285],[123.08,31.25,10.285],[124.68,31.25,10.285],[126.29,31.25,10.285],[127.89,31.25,10.285],[129.49,31.25,10.285],[131.09,31.25,10.285],[132.7,31.25,10.285],[134.3,31.25,10.285],[70.188,31.25,11.428],[71.791,31.25,11.428],[73.393,31.25,11.428],[74.996,31.25,11.428],[76.599,31.25,11.428],[78.202,31.25,11.428],[79.805,31.25,11.428],[81.407,31.25,11.428],[83.01,31.25,11.428],[84.613,31.25,11.428],[86.216,31.25,11.428],[87.819,31.25,11.428],[89.421,31.25,11.428],[91.024,31.25,11.428],[92.627,31.25,11.428],[94.23,31.25,11.428],[95.833,31.25,11.428],[97.435,31.25,11.428],[99.038,31.25,11.428],[100.64,31.25,11.428],[102.24,31.25,11.428],[103.85,31.25,11.428],[105.45,31.25,11.428],[107.05,31.25,11.428],[108.66,31.25,11.428],[110.26,31.25,11.428],[111.86,31.25,11.428],[113.46,31.25,11.428],[115.07,31.25,11.428],[116.67,31.25,11.428],[118.27,31.25,11.428],[119.87,31.25,11.428],[121.48,31.25,11.428],[123.08,31.25,11.428],[124.68,31.25,11.428],[126.29,31.25,11.428],[127.89,31.25,11.428],[129.49,31.25,11.428],[131.09,31.25,11.428],[132.7,31.25,11.428],[134.3,31.25,11.428],[70.188,31.25,12.571],[71.791,31.25,12.571],[73.393,31.25,12.571],[74.996,31.25,12.571],[76.599,31.25,12.571],[78.202,31.25,12.571],[79.805,31.25,12.571],[81.407,31.25,12.571],[83.01,31.25,12.571],[84.613,31.25,12.571],[86.216,31.25,12.571],[87.819,31.25,12.571],[89.421,31.25,12.571],[91.024,31.25,12.571],[92.627,31.25,12.571],[94.23,31.25,12.571],[95.833,31.25,12.571],[97.435,31.25,12.571],[99.038,31.25,12.571],[100.64,31.25,12.571],[102.24,31.25,12.571],[103.85,31.25,12.571],[105.45,31.25,12.571],[107.05,31.25,12.571],[108.66,31.25,12.571],[110.26,31.25,12.571],[111.86,31.25,12.571],[113.46,31.25,12.571],[115.07,31.25,12.571],[116.67,31.25,12.571],[118.27,31.25,12.571],[119.87,31.25,12.571],[121.48,31.25,12.571],[123.08,31.25,12.571],[124.68,31.25,12.571],[126.29,31.25,12.571],[127.89,31.25,12.571],[129.49,31.25,12.571],[131.09,31.25,12.571],[132.7,31.25,12.571],[134.3,31.25,12.571],[70.188,31.25,13.714],[71.791,31.25,13.714],[73.393,31.25,13.714],[74.996,31.25,13.714],[76.599,31.25,13.714],[78.202,31.25,13.714],[79.805,31.25,13.714],[81.407,31.25,13.714],[83.01,31.25,13.714],[84.613,31.25,13.714],[86.216,31.25,13.714],[87.819,31.25,13.714],[89.421,31.25,13.714],[91.024,31.25,13.714],[92.627,31.25,13.714],[94.23,31.25,13.714],[95.833,31.25,13.714],[97.435,31.25,13.714],[99.038,31.25,13.714],[100.64,31.25,13.714],[102.24,31.25,13.714],[103.85,31.25,13.714],[105.45,31.25,13.714],[107.05,31.25,13.714],[108.66,31.25,13.714],[110.26,31.25,13.714],[111.86,31.25,13.714],[113.46,31.25,13.714],[115.07,31.25,13.714],[116.67,31.25,13.714],[118.27,31.25,13.714],[119.87,31.25,13.714],[121.48,31.25,13.714],[123.08,31.25,13.714],[124.68,31.25,13.714],[126.29,31.25,13.714],[127.89,31.25,13.714],[129.49,31.25,13.714],[131.09,31.25,13.714],[132.7,31.25,13.714],[134.3,31.25,13.714],[70.188,31.25,14.857],[71.791,31.25,14.857],[73.393,31.25,14.857],[74.996,31.25,14.857],[76.599,31.25,14.857],[78.202,31.25,14.857],[79.805,31.25,14.857],[81.407,31.25,14.857],[83.01,31.25,14.857],[84.613,31.25,14.857],[86.216,31.25,14.857],[87.819,31.25,14.857],[89.421,31.25,14.857],[91.024,31.25,14.857],[92.627,31.25,14.857],[94.23,31.25,14.857],[95.833,31.25,14.857],[97.435,31.25,14.857],[99.038,31.25,14.857],[100.64,31.25,14.857],[102.24,31.25,14.857],[103.85,31.25,14.857],[105.45,31.25,14.857],[107.05,31.25,14.857],[108.66,31.25,14.857],[110.26,31.25,14.857],[111.86,31.25,14.857],[113.46,31.25,14.857],[115.07,31.25,14.857],[116.67,31.25,14.857],[118.27,31.25,14.857],[119.87,31.25,14.857],[121.48,31.25,14.857],[123.08,31.25,14.857],[124.68,31.25,14.857],[126.29,31.25,14.857],[127.89,31.25,14.857],[129.49,31.25,14.857],[131.09,31.25,14.857],[132.7,31.25,14.857],[134.3,31.25,14.857],[70.188,31.25,16],[71.791,31.25,16],[73.393,31.25,16],[74.996,31.25,16],[76.599,31.25,16],[78.202,31.25,16],[79.805,31.25,16],[81.407,31.25,16],[83.01,31.25,16],[84.613,31.25,16],[86.216,31.25,16],[87.819,31.25,16],[89.421,31.25,16],[91.024,31.25,16],[92.627,31.25,16],[94.23,31.25,16],[95.833,31.25,16],[97.435,31.25,16],[99.038,31.25,16],[100.64,31.25,16],[102.24,31.25,16],[103.85,31.25,16],[105.45,31.25,16],[107.05,31.25,16],[108.66,31.25,16],[110.26,31.25,16],[111.86,31.25,16],[113.46,31.25,16],[115.07,31.25,16],[116.67,31.25,16],[118.27,31.25,16],[119.87,31.25,16],[121.48,31.25,16],[123.08,31.25,16],[124.68,31.25,16],[126.29,31.25,16],[127.89,31.25,16],[129.49,31.25,16],[131.09,31.25,16],[132.7,31.25,16],[134.3,31.25,16],[70.188,32.5,-0.002],[71.791,32.5,-0.002],[73.393,32.5,-0.002],[74.996,32.5,-0.002],[76.599,32.5,-0.002],[78.202,32.5,-0.002],[79.805,32.5,-0.002],[81.407,32.5,-0.002],[83.01,32.5,-0.002],[84.613,32.5,-0.002],[86.216,32.5,-0.002],[87.819,32.5,-0.002],[89.421,32.5,-0.002],[91.024,32.5,-0.002],[92.627,32.5,-0.002],[94.23,32.5,-0.002],[95.833,32.5,-0.002],[97.435,32.5,-0.002],[99.038,32.5,-0.002],[100.64,32.5,-0.002],[102.24,32.5,-0.002],[103.85,32.5,-0.002],[105.45,32.5,-0.002],[107.05,32.5,-0.002],[108.66,32.5,-0.002],[110.26,32.5,-0.002],[111.86,32.5,-0.002],[113.46,32.5,-0.002],[115.07,32.5,-0.002],[116.67,32.5,-0.002],[118.27,32.5,-0.002],[119.87,32.5,-0.002],[121.48,32.5,-0.002],[123.08,32.5,-0.002],[124.68,32.5,-0.002],[126.29,32.5,-0.002],[127.89,32.5,-0.002],[129.49,32.5,-0.002],[131.09,32.5,-0.002],[132.7,32.5,-0.002],[134.3,32.5,-0.002],[70.188,32.5,1.141],[71.791,32.5,1.141],[73.393,32.5,1.141],[74.996,32.5,1.141],[76.599,32.5,1.141],[78.202,32.5,1.141],[79.805,32.5,1.141],[81.407,32.5,1.141],[83.01,32.5,1.141],[84.613,32.5,1.141],[86.216,32.5,1.141],[87.819,32.5,1.141],[89.421,32.5,1.141],[91.024,32.5,1.141],[92.627,32.5,1.141],[94.23,32.5,1.141],[95.833,32.5,1.141],[97.435,32.5,1.141],[99.038,32.5,1.141],[100.64,32.5,1.141],[102.24,32.5,1.141],[103.85,32.5,1.141],[105.45,32.5,1.141],[107.05,32.5,1.141],[108.66,32.5,1.141],[110.26,32.5,1.141],[111.86,32.5,1.141],[113.46,32.5,1.141],[115.07,32.5,1.141],[116.67,32.5,1.141],[118.27,32.5,1.141],[119.87,32.5,1.141],[121.48,32.5,1.141],[123.08,32.5,1.141],[124.68,32.5,1.141],[126.29,32.5,1.141],[127.89,32.5,1.141],[129.49,32.5,1.141],[131.09,32.5,1.141],[132.7,32.5,1.141],[134.3,32.5,1.141],[70.188,32.5,2.284],[71.791,32.5,2.284],[73.393,32.5,2.284],[74.996,32.5,2.284],[76.599,32.5,2.284],[78.202,32.5,2.284],[79.805,32.5,2.284],[81.407,32.5,2.284],[83.01,32.5,2.284],[84.613,32.5,2.284],[86.216,32.5,2.284],[87.819,32.5,2.284],[89.421,32.5,2.284],[91.024,32.5,2.284],[92.627,32.5,2.284],[94.23,32.5,2.284],[95.833,32.5,2.284],[97.435,32.5,2.284],[99.038,32.5,2.284],[100.64,32.5,2.284],[102.24,32.5,2.284],[103.85,32.5,2.284],[105.45,32.5,2.284],[107.05,32.5,2.284],[108.66,32.5,2.284],[110.26,32.5,2.284],[111.86,32.5,2.284],[113.46,32.5,2.284],[115.07,32.5,2.284],[116.67,32.5,2.284],[118.27,32.5,2.284],[119.87,32.5,2.284],[121.48,32.5,2.284],[123.08,32.5,2.284],[124.68,32.5,2.284],[126.29,32.5,2.284],[127.89,32.5,2.284],[129.49,32.5,2.284],[131.09,32.5,2.284],[132.7,32.5,2.284],[134.3,32.5,2.284],[70.188,32.5,3.427],[71.791,32.5,3.427],[73.393,32.5,3.427],[74.996,32.5,3.427],[76.599,32.5,3.427],[78.202,32.5,3.427],[79.805,32.5,3.427],[81.407,32.5,3.427],[83.01,32.5,3.427],[84.613,32.5,3.427],[86.216,32.5,3.427],[87.819,32.5,3.427],[89.421,32.5,3.427],[91.024,32.5,3.427],[92.627,32.5,3.427],[94.23,32.5,3.427],[95.833,32.5,3.427],[97.435,32.5,3.427],[99.038,32.5,3.427],[100.64,32.5,3.427],[102.24,32.5,3.427],[103.85,32.5,3.427],[105.45,32.5,3.427],[107.05,32.5,3.427],[108.66,32.5,3.427],[110.26,32.5,3.427],[111.86,32.5,3.427],[113.46,32.5,3.427],[115.07,32.5,3.427],[116.67,32.5,3.427],[118.27,32.5,3.427],[119.87,32.5,3.427],[121.48,32.5,3.427],[123.08,32.5,3.427],[124.68,32.5,3.427],[126.29,32.5,3.427],[127.89,32.5,3.427],[129.49,32.5,3.427],[131.09,32.5,3.427],[132.7,32.5,3.427],[134.3,32.5,3.427],[70.188,32.5,4.57],[71.791,32.5,4.57],[73.393,32.5,4.57],[74.996,32.5,4.57],[76.599,32.5,4.57],[78.202,32.5,4.57],[79.805,32.5,4.57],[81.407,32.5,4.57],[83.01,32.5,4.57],[84.613,32.5,4.57],[86.216,32.5,4.57],[87.819,32.5,4.57],[89.421,32.5,4.57],[91.024,32.5,4.57],[92.627,32.5,4.57],[94.23,32.5,4.57],[95.833,32.5,4.57],[97.435,32.5,4.57],[99.038,32.5,4.57],[100.64,32.5,4.57],[102.24,32.5,4.57],[103.85,32.5,4.57],[105.45,32.5,4.57],[107.05,32.5,4.57],[108.66,32.5,4.57],[110.26,32.5,4.57],[111.86,32.5,4.57],[113.46,32.5,4.57],[115.07,32.5,4.57],[116.67,32.5,4.57],[118.27,32.5,4.57],[119.87,32.5,4.57],[121.48,32.5,4.57],[123.08,32.5,4.57],[124.68,32.5,4.57],[126.29,32.5,4.57],[127.89,32.5,4.57],[129.49,32.5,4.57],[131.09,32.5,4.57],[132.7,32.5,4.57],[134.3,32.5,4.57],[70.188,32.5,5.713],[71.791,32.5,5.713],[73.393,32.5,5.713],[74.996,32.5,5.713],[76.599,32.5,5.713],[78.202,32.5,5.713],[79.805,32.5,5.713],[81.407,32.5,5.713],[83.01,32.5,5.713],[84.613,32.5,5.713],[86.216,32.5,5.713],[87.819,32.5,5.713],[89.421,32.5,5.713],[91.024,32.5,5.713],[92.627,32.5,5.713],[94.23,32.5,5.713],[95.833,32.5,5.713],[97.435,32.5,5.713],[99.038,32.5,5.713],[100.64,32.5,5.713],[102.24,32.5,5.713],[103.85,32.5,5.713],[105.45,32.5,5.713],[107.05,32.5,5.713],[108.66,32.5,5.713],[110.26,32.5,5.713],[111.86,32.5,5.713],[113.46,32.5,5.713],[115.07,32.5,5.713],[116.67,32.5,5.713],[118.27,32.5,5.713],[119.87,32.5,5.713],[121.48,32.5,5.713],[123.08,32.5,5.713],[124.68,32.5,5.713],[126.29,32.5,5.713],[127.89,32.5,5.713],[129.49,32.5,5.713],[131.09,32.5,5.713],[132.7,32.5,5.713],[134.3,32.5,5.713],[70.188,32.5,6.856],[71.791,32.5,6.856],[73.393,32.5,6.856],[74.996,32.5,6.856],[76.599,32.5,6.856],[78.202,32.5,6.856],[79.805,32.5,6.856],[81.407,32.5,6.856],[83.01,32.5,6.856],[84.613,32.5,6.856],[86.216,32.5,6.856],[87.819,32.5,6.856],[89.421,32.5,6.856],[91.024,32.5,6.856],[92.627,32.5,6.856],[94.23,32.5,6.856],[95.833,32.5,6.856],[97.435,32.5,6.856],[99.038,32.5,6.856],[100.64,32.5,6.856],[102.24,32.5,6.856],[103.85,32.5,6.856],[105.45,32.5,6.856],[107.05,32.5,6.856],[108.66,32.5,6.856],[110.26,32.5,6.856],[111.86,32.5,6.856],[113.46,32.5,6.856],[115.07,32.5,6.856],[116.67,32.5,6.856],[118.27,32.5,6.856],[119.87,32.5,6.856],[121.48,32.5,6.856],[123.08,32.5,6.856],[124.68,32.5,6.856],[126.29,32.5,6.856],[127.89,32.5,6.856],[129.49,32.5,6.856],[131.09,32.5,6.856],[132.7,32.5,6.856],[134.3,32.5,6.856],[70.188,32.5,7.999],[71.791,32.5,7.999],[73.393,32.5,7.999],[74.996,32.5,7.999],[76.599,32.5,7.999],[78.202,32.5,7.999],[79.805,32.5,7.999],[81.407,32.5,7.999],[83.01,32.5,7.999],[84.613,32.5,7.999],[86.216,32.5,7.999],[87.819,32.5,7.999],[89.421,32.5,7.999],[91.024,32.5,7.999],[92.627,32.5,7.999],[94.23,32.5,7.999],[95.833,32.5,7.999],[97.435,32.5,7.999],[99.038,32.5,7.999],[100.64,32.5,7.999],[102.24,32.5,7.999],[103.85,32.5,7.999],[105.45,32.5,7.999],[107.05,32.5,7.999],[108.66,32.5,7.999],[110.26,32.5,7.999],[111.86,32.5,7.999],[113.46,32.5,7.999],[115.07,32.5,7.999],[116.67,32.5,7.999],[118.27,32.5,7.999],[119.87,32.5,7.999],[121.48,32.5,7.999],[123.08,32.5,7.999],[124.68,32.5,7.999],[126.29,32.5,7.999],[127.89,32.5,7.999],[129.49,32.5,7.999],[131.09,32.5,7.999],[132.7,32.5,7.999],[134.3,32.5,7.999],[70.188,32.5,9.142],[71.791,32.5,9.142],[73.393,32.5,9.142],[74.996,32.5,9.142],[76.599,32.5,9.142],[78.202,32.5,9.142],[79.805,32.5,9.142],[81.407,32.5,9.142],[83.01,32.5,9.142],[84.613,32.5,9.142],[86.216,32.5,9.142],[87.819,32.5,9.142],[89.421,32.5,9.142],[91.024,32.5,9.142],[92.627,32.5,9.142],[94.23,32.5,9.142],[95.833,32.5,9.142],[97.435,32.5,9.142],[99.038,32.5,9.142],[100.64,32.5,9.142],[102.24,32.5,9.142],[103.85,32.5,9.142],[105.45,32.5,9.142],[107.05,32.5,9.142],[108.66,32.5,9.142],[110.26,32.5,9.142],[111.86,32.5,9.142],[113.46,32.5,9.142],[115.07,32.5,9.142],[116.67,32.5,9.142],[118.27,32.5,9.142],[119.87,32.5,9.142],[121.48,32.5,9.142],[123.08,32.5,9.142],[124.68,32.5,9.142],[126.29,32.5,9.142],[127.89,32.5,9.142],[129.49,32.5,9.142],[131.09,32.5,9.142],[132.7,32.5,9.142],[134.3,32.5,9.142],[70.188,32.5,10.285],[71.791,32.5,10.285],[73.393,32.5,10.285],[74.996,32.5,10.285],[76.599,32.5,10.285],[78.202,32.5,10.285],[79.805,32.5,10.285],[81.407,32.5,10.285],[83.01,32.5,10.285],[84.613,32.5,10.285],[86.216,32.5,10.285],[87.819,32.5,10.285],[89.421,32.5,10.285],[91.024,32.5,10.285],[92.627,32.5,10.285],[94.23,32.5,10.285],[95.833,32.5,10.285],[97.435,32.5,10.285],[99.038,32.5,10.285],[100.64,32.5,10.285],[102.24,32.5,10.285],[103.85,32.5,10.285],[105.45,32.5,10.285],[107.05,32.5,10.285],[108.66,32.5,10.285],[110.26,32.5,10.285],[111.86,32.5,10.285],[113.46,32.5,10.285],[115.07,32.5,10.285],[116.67,32.5,10.285],[118.27,32.5,10.285],[119.87,32.5,10.285],[121.48,32.5,10.285],[123.08,32.5,10.285],[124.68,32.5,10.285],[126.29,32.5,10.285],[127.89,32.5,10.285],[129.49,32.5,10.285],[131.09,32.5,10.285],[132.7,32.5,10.285],[134.3,32.5,10.285],[70.188,32.5,11.428],[71.791,32.5,11.428],[73.393,32.5,11.428],[74.996,32.5,11.428],[76.599,32.5,11.428],[78.202,32.5,11.428],[79.805,32.5,11.428],[81.407,32.5,11.428],[83.01,32.5,11.428],[84.613,32.5,11.428],[86.216,32.5,11.428],[87.819,32.5,11.428],[89.421,32.5,11.428],[91.024,32.5,11.428],[92.627,32.5,11.428],[94.23,32.5,11.428],[95.833,32.5,11.428],[97.435,32.5,11.428],[99.038,32.5,11.428],[100.64,32.5,11.428],[102.24,32.5,11.428],[103.85,32.5,11.428],[105.45,32.5,11.428],[107.05,32.5,11.428],[108.66,32.5,11.428],[110.26,32.5,11.428],[111.86,32.5,11.428],[113.46,32.5,11.428],[115.07,32.5,11.428],[116.67,32.5,11.428],[118.27,32.5,11.428],[119.87,32.5,11.428],[121.48,32.5,11.428],[123.08,32.5,11.428],[124.68,32.5,11.428],[126.29,32.5,11.428],[127.89,32.5,11.428],[129.49,32.5,11.428],[131.09,32.5,11.428],[132.7,32.5,11.428],[134.3,32.5,11.428],[70.188,32.5,12.571],[71.791,32.5,12.571],[73.393,32.5,12.571],[74.996,32.5,12.571],[76.599,32.5,12.571],[78.202,32.5,12.571],[79.805,32.5,12.571],[81.407,32.5,12.571],[83.01,32.5,12.571],[84.613,32.5,12.571],[86.216,32.5,12.571],[87.819,32.5,12.571],[89.421,32.5,12.571],[91.024,32.5,12.571],[92.627,32.5,12.571],[94.23,32.5,12.571],[95.833,32.5,12.571],[97.435,32.5,12.571],[99.038,32.5,12.571],[100.64,32.5,12.571],[102.24,32.5,12.571],[103.85,32.5,12.571],[105.45,32.5,12.571],[107.05,32.5,12.571],[108.66,32.5,12.571],[110.26,32.5,12.571],[111.86,32.5,12.571],[113.46,32.5,12.571],[115.07,32.5,12.571],[116.67,32.5,12.571],[118.27,32.5,12.571],[119.87,32.5,12.571],[121.48,32.5,12.571],[123.08,32.5,12.571],[124.68,32.5,12.571],[126.29,32.5,12.571],[127.89,32.5,12.571],[129.49,32.5,12.571],[131.09,32.5,12.571],[132.7,32.5,12.571],[134.3,32.5,12.571],[70.188,32.5,13.714],[71.791,32.5,13.714],[73.393,32.5,13.714],[74.996,32.5,13.714],[76.599,32.5,13.714],[78.202,32.5,13.714],[79.805,32.5,13.714],[81.407,32.5,13.714],[83.01,32.5,13.714],[84.613,32.5,13.714],[86.216,32.5,13.714],[87.819,32.5,13.714],[89.421,32.5,13.714],[91.024,32.5,13.714],[92.627,32.5,13.714],[94.23,32.5,13.714],[95.833,32.5,13.714],[97.435,32.5,13.714],[99.038,32.5,13.714],[100.64,32.5,13.714],[102.24,32.5,13.714],[103.85,32.5,13.714],[105.45,32.5,13.714],[107.05,32.5,13.714],[108.66,32.5,13.714],[110.26,32.5,13.714],[111.86,32.5,13.714],[113.46,32.5,13.714],[115.07,32.5,13.714],[116.67,32.5,13.714],[118.27,32.5,13.714],[119.87,32.5,13.714],[121.48,32.5,13.714],[123.08,32.5,13.714],[124.68,32.5,13.714],[126.29,32.5,13.714],[127.89,32.5,13.714],[129.49,32.5,13.714],[131.09,32.5,13.714],[132.7,32.5,13.714],[134.3,32.5,13.714],[70.188,32.5,14.857],[71.791,32.5,14.857],[73.393,32.5,14.857],[74.996,32.5,14.857],[76.599,32.5,14.857],[78.202,32.5,14.857],[79.805,32.5,14.857],[81.407,32.5,14.857],[83.01,32.5,14.857],[84.613,32.5,14.857],[86.216,32.5,14.857],[87.819,32.5,14.857],[89.421,32.5,14.857],[91.024,32.5,14.857],[92.627,32.5,14.857],[94.23,32.5,14.857],[95.833,32.5,14.857],[97.435,32.5,14.857],[99.038,32.5,14.857],[100.64,32.5,14.857],[102.24,32.5,14.857],[103.85,32.5,14.857],[105.45,32.5,14.857],[107.05,32.5,14.857],[108.66,32.5,14.857],[110.26,32.5,14.857],[111.86,32.5,14.857],[113.46,32.5,14.857],[115.07,32.5,14.857],[116.67,32.5,14.857],[118.27,32.5,14.857],[119.87,32.5,14.857],[121.48,32.5,14.857],[123.08,32.5,14.857],[124.68,32.5,14.857],[126.29,32.5,14.857],[127.89,32.5,14.857],[129.49,32.5,14.857],[131.09,32.5,14.857],[132.7,32.5,14.857],[134.3,32.5,14.857],[70.188,32.5,16],[71.791,32.5,16],[73.393,32.5,16],[74.996,32.5,16],[76.599,32.5,16],[78.202,32.5,16],[79.805,32.5,16],[81.407,32.5,16],[83.01,32.5,16],[84.613,32.5,16],[86.216,32.5,16],[87.819,32.5,16],[89.421,32.5,16],[91.024,32.5,16],[92.627,32.5,16],[94.23,32.5,16],[95.833,32.5,16],[97.435,32.5,16],[99.038,32.5,16],[100.64,32.5,16],[102.24,32.5,16],[103.85,32.5,16],[105.45,32.5,16],[107.05,32.5,16],[108.66,32.5,16],[110.26,32.5,16],[111.86,32.5,16],[113.46,32.5,16],[115.07,32.5,16],[116.67,32.5,16],[118.27,32.5,16],[119.87,32.5,16],[121.48,32.5,16],[123.08,32.5,16],[124.68,32.5,16],[126.29,32.5,16],[127.89,32.5,16],[129.49,32.5,16],[131.09,32.5,16],[132.7,32.5,16],[134.3,32.5,16],[70.188,33.75,-0.002],[71.791,33.75,-0.002],[73.393,33.75,-0.002],[74.996,33.75,-0.002],[76.599,33.75,-0.002],[78.202,33.75,-0.002],[79.805,33.75,-0.002],[81.407,33.75,-0.002],[83.01,33.75,-0.002],[84.613,33.75,-0.002],[86.216,33.75,-0.002],[87.819,33.75,-0.002],[89.421,33.75,-0.002],[91.024,33.75,-0.002],[92.627,33.75,-0.002],[94.23,33.75,-0.002],[95.833,33.75,-0.002],[97.435,33.75,-0.002],[99.038,33.75,-0.002],[100.64,33.75,-0.002],[102.24,33.75,-0.002],[103.85,33.75,-0.002],[105.45,33.75,-0.002],[107.05,33.75,-0.002],[108.66,33.75,-0.002],[110.26,33.75,-0.002],[111.86,33.75,-0.002],[113.46,33.75,-0.002],[115.07,33.75,-0.002],[116.67,33.75,-0.002],[118.27,33.75,-0.002],[119.87,33.75,-0.002],[121.48,33.75,-0.002],[123.08,33.75,-0.002],[124.68,33.75,-0.002],[126.29,33.75,-0.002],[127.89,33.75,-0.002],[129.49,33.75,-0.002],[131.09,33.75,-0.002],[132.7,33.75,-0.002],[134.3,33.75,-0.002],[70.188,33.75,1.141],[71.791,33.75,1.141],[73.393,33.75,1.141],[74.996,33.75,1.141],[76.599,33.75,1.141],[78.202,33.75,1.141],[79.805,33.75,1.141],[81.407,33.75,1.141],[83.01,33.75,1.141],[84.613,33.75,1.141],[86.216,33.75,1.141],[87.819,33.75,1.141],[89.421,33.75,1.141],[91.024,33.75,1.141],[92.627,33.75,1.141],[94.23,33.75,1.141],[95.833,33.75,1.141],[97.435,33.75,1.141],[99.038,33.75,1.141],[100.64,33.75,1.141],[102.24,33.75,1.141],[103.85,33.75,1.141],[105.45,33.75,1.141],[107.05,33.75,1.141],[108.66,33.75,1.141],[110.26,33.75,1.141],[111.86,33.75,1.141],[113.46,33.75,1.141],[115.07,33.75,1.141],[116.67,33.75,1.141],[118.27,33.75,1.141],[119.87,33.75,1.141],[121.48,33.75,1.141],[123.08,33.75,1.141],[124.68,33.75,1.141],[126.29,33.75,1.141],[127.89,33.75,1.141],[129.49,33.75,1.141],[131.09,33.75,1.141],[132.7,33.75,1.141],[134.3,33.75,1.141],[70.188,33.75,2.284],[71.791,33.75,2.284],[73.393,33.75,2.284],[74.996,33.75,2.284],[76.599,33.75,2.284],[78.202,33.75,2.284],[79.805,33.75,2.284],[81.407,33.75,2.284],[83.01,33.75,2.284],[84.613,33.75,2.284],[86.216,33.75,2.284],[87.819,33.75,2.284],[89.421,33.75,2.284],[91.024,33.75,2.284],[92.627,33.75,2.284],[94.23,33.75,2.284],[95.833,33.75,2.284],[97.435,33.75,2.284],[99.038,33.75,2.284],[100.64,33.75,2.284],[102.24,33.75,2.284],[103.85,33.75,2.284],[105.45,33.75,2.284],[107.05,33.75,2.284],[108.66,33.75,2.284],[110.26,33.75,2.284],[111.86,33.75,2.284],[113.46,33.75,2.284],[115.07,33.75,2.284],[116.67,33.75,2.284],[118.27,33.75,2.284],[119.87,33.75,2.284],[121.48,33.75,2.284],[123.08,33.75,2.284],[124.68,33.75,2.284],[126.29,33.75,2.284],[127.89,33.75,2.284],[129.49,33.75,2.284],[131.09,33.75,2.284],[132.7,33.75,2.284],[134.3,33.75,2.284],[70.188,33.75,3.427],[71.791,33.75,3.427],[73.393,33.75,3.427],[74.996,33.75,3.427],[76.599,33.75,3.427],[78.202,33.75,3.427],[79.805,33.75,3.427],[81.407,33.75,3.427],[83.01,33.75,3.427],[84.613,33.75,3.427],[86.216,33.75,3.427],[87.819,33.75,3.427],[89.421,33.75,3.427],[91.024,33.75,3.427],[92.627,33.75,3.427],[94.23,33.75,3.427],[95.833,33.75,3.427],[97.435,33.75,3.427],[99.038,33.75,3.427],[100.64,33.75,3.427],[102.24,33.75,3.427],[103.85,33.75,3.427],[105.45,33.75,3.427],[107.05,33.75,3.427],[108.66,33.75,3.427],[110.26,33.75,3.427],[111.86,33.75,3.427],[113.46,33.75,3.427],[115.07,33.75,3.427],[116.67,33.75,3.427],[118.27,33.75,3.427],[119.87,33.75,3.427],[121.48,33.75,3.427],[123.08,33.75,3.427],[124.68,33.75,3.427],[126.29,33.75,3.427],[127.89,33.75,3.427],[129.49,33.75,3.427],[131.09,33.75,3.427],[132.7,33.75,3.427],[134.3,33.75,3.427],[70.188,33.75,4.57],[71.791,33.75,4.57],[73.393,33.75,4.57],[74.996,33.75,4.57],[76.599,33.75,4.57],[78.202,33.75,4.57],[79.805,33.75,4.57],[81.407,33.75,4.57],[83.01,33.75,4.57],[84.613,33.75,4.57],[86.216,33.75,4.57],[87.819,33.75,4.57],[89.421,33.75,4.57],[91.024,33.75,4.57],[92.627,33.75,4.57],[94.23,33.75,4.57],[95.833,33.75,4.57],[97.435,33.75,4.57],[99.038,33.75,4.57],[100.64,33.75,4.57],[102.24,33.75,4.57],[103.85,33.75,4.57],[105.45,33.75,4.57],[107.05,33.75,4.57],[108.66,33.75,4.57],[110.26,33.75,4.57],[111.86,33.75,4.57],[113.46,33.75,4.57],[115.07,33.75,4.57],[116.67,33.75,4.57],[118.27,33.75,4.57],[119.87,33.75,4.57],[121.48,33.75,4.57],[123.08,33.75,4.57],[124.68,33.75,4.57],[126.29,33.75,4.57],[127.89,33.75,4.57],[129.49,33.75,4.57],[131.09,33.75,4.57],[132.7,33.75,4.57],[134.3,33.75,4.57],[70.188,33.75,5.713],[71.791,33.75,5.713],[73.393,33.75,5.713],[74.996,33.75,5.713],[76.599,33.75,5.713],[78.202,33.75,5.713],[79.805,33.75,5.713],[81.407,33.75,5.713],[83.01,33.75,5.713],[84.613,33.75,5.713],[86.216,33.75,5.713],[87.819,33.75,5.713],[89.421,33.75,5.713],[91.024,33.75,5.713],[92.627,33.75,5.713],[94.23,33.75,5.713],[95.833,33.75,5.713],[97.435,33.75,5.713],[99.038,33.75,5.713],[100.64,33.75,5.713],[102.24,33.75,5.713],[103.85,33.75,5.713],[105.45,33.75,5.713],[107.05,33.75,5.713],[108.66,33.75,5.713],[110.26,33.75,5.713],[111.86,33.75,5.713],[113.46,33.75,5.713],[115.07,33.75,5.713],[116.67,33.75,5.713],[118.27,33.75,5.713],[119.87,33.75,5.713],[121.48,33.75,5.713],[123.08,33.75,5.713],[124.68,33.75,5.713],[126.29,33.75,5.713],[127.89,33.75,5.713],[129.49,33.75,5.713],[131.09,33.75,5.713],[132.7,33.75,5.713],[134.3,33.75,5.713],[70.188,33.75,6.856],[71.791,33.75,6.856],[73.393,33.75,6.856],[74.996,33.75,6.856],[76.599,33.75,6.856],[78.202,33.75,6.856],[79.805,33.75,6.856],[81.407,33.75,6.856],[83.01,33.75,6.856],[84.613,33.75,6.856],[86.216,33.75,6.856],[87.819,33.75,6.856],[89.421,33.75,6.856],[91.024,33.75,6.856],[92.627,33.75,6.856],[94.23,33.75,6.856],[95.833,33.75,6.856],[97.435,33.75,6.856],[99.038,33.75,6.856],[100.64,33.75,6.856],[102.24,33.75,6.856],[103.85,33.75,6.856],[105.45,33.75,6.856],[107.05,33.75,6.856],[108.66,33.75,6.856],[110.26,33.75,6.856],[111.86,33.75,6.856],[113.46,33.75,6.856],[115.07,33.75,6.856],[116.67,33.75,6.856],[118.27,33.75,6.856],[119.87,33.75,6.856],[121.48,33.75,6.856],[123.08,33.75,6.856],[124.68,33.75,6.856],[126.29,33.75,6.856],[127.89,33.75,6.856],[129.49,33.75,6.856],[131.09,33.75,6.856],[132.7,33.75,6.856],[134.3,33.75,6.856],[70.188,33.75,7.999],[71.791,33.75,7.999],[73.393,33.75,7.999],[74.996,33.75,7.999],[76.599,33.75,7.999],[78.202,33.75,7.999],[79.805,33.75,7.999],[81.407,33.75,7.999],[83.01,33.75,7.999],[84.613,33.75,7.999],[86.216,33.75,7.999],[87.819,33.75,7.999],[89.421,33.75,7.999],[91.024,33.75,7.999],[92.627,33.75,7.999],[94.23,33.75,7.999],[95.833,33.75,7.999],[97.435,33.75,7.999],[99.038,33.75,7.999],[100.64,33.75,7.999],[102.24,33.75,7.999],[103.85,33.75,7.999],[105.45,33.75,7.999],[107.05,33.75,7.999],[108.66,33.75,7.999],[110.26,33.75,7.999],[111.86,33.75,7.999],[113.46,33.75,7.999],[115.07,33.75,7.999],[116.67,33.75,7.999],[118.27,33.75,7.999],[119.87,33.75,7.999],[121.48,33.75,7.999],[123.08,33.75,7.999],[124.68,33.75,7.999],[126.29,33.75,7.999],[127.89,33.75,7.999],[129.49,33.75,7.999],[131.09,33.75,7.999],[132.7,33.75,7.999],[134.3,33.75,7.999],[70.188,33.75,9.142],[71.791,33.75,9.142],[73.393,33.75,9.142],[74.996,33.75,9.142],[76.599,33.75,9.142],[78.202,33.75,9.142],[79.805,33.75,9.142],[81.407,33.75,9.142],[83.01,33.75,9.142],[84.613,33.75,9.142],[86.216,33.75,9.142],[87.819,33.75,9.142],[89.421,33.75,9.142],[91.024,33.75,9.142],[92.627,33.75,9.142],[94.23,33.75,9.142],[95.833,33.75,9.142],[97.435,33.75,9.142],[99.038,33.75,9.142],[100.64,33.75,9.142],[102.24,33.75,9.142],[103.85,33.75,9.142],[105.45,33.75,9.142],[107.05,33.75,9.142],[108.66,33.75,9.142],[110.26,33.75,9.142],[111.86,33.75,9.142],[113.46,33.75,9.142],[115.07,33.75,9.142],[116.67,33.75,9.142],[118.27,33.75,9.142],[119.87,33.75,9.142],[121.48,33.75,9.142],[123.08,33.75,9.142],[124.68,33.75,9.142],[126.29,33.75,9.142],[127.89,33.75,9.142],[129.49,33.75,9.142],[131.09,33.75,9.142],[132.7,33.75,9.142],[134.3,33.75,9.142],[70.188,33.75,10.285],[71.791,33.75,10.285],[73.393,33.75,10.285],[74.996,33.75,10.285],[76.599,33.75,10.285],[78.202,33.75,10.285],[79.805,33.75,10.285],[81.407,33.75,10.285],[83.01,33.75,10.285],[84.613,33.75,10.285],[86.216,33.75,10.285],[87.819,33.75,10.285],[89.421,33.75,10.285],[91.024,33.75,10.285],[92.627,33.75,10.285],[94.23,33.75,10.285],[95.833,33.75,10.285],[97.435,33.75,10.285],[99.038,33.75,10.285],[100.64,33.75,10.285],[102.24,33.75,10.285],[103.85,33.75,10.285],[105.45,33.75,10.285],[107.05,33.75,10.285],[108.66,33.75,10.285],[110.26,33.75,10.285],[111.86,33.75,10.285],[113.46,33.75,10.285],[115.07,33.75,10.285],[116.67,33.75,10.285],[118.27,33.75,10.285],[119.87,33.75,10.285],[121.48,33.75,10.285],[123.08,33.75,10.285],[124.68,33.75,10.285],[126.29,33.75,10.285],[127.89,33.75,10.285],[129.49,33.75,10.285],[131.09,33.75,10.285],[132.7,33.75,10.285],[134.3,33.75,10.285],[70.188,33.75,11.428],[71.791,33.75,11.428],[73.393,33.75,11.428],[74.996,33.75,11.428],[76.599,33.75,11.428],[78.202,33.75,11.428],[79.805,33.75,11.428],[81.407,33.75,11.428],[83.01,33.75,11.428],[84.613,33.75,11.428],[86.216,33.75,11.428],[87.819,33.75,11.428],[89.421,33.75,11.428],[91.024,33.75,11.428],[92.627,33.75,11.428],[94.23,33.75,11.428],[95.833,33.75,11.428],[97.435,33.75,11.428],[99.038,33.75,11.428],[100.64,33.75,11.428],[102.24,33.75,11.428],[103.85,33.75,11.428],[105.45,33.75,11.428],[107.05,33.75,11.428],[108.66,33.75,11.428],[110.26,33.75,11.428],[111.86,33.75,11.428],[113.46,33.75,11.428],[115.07,33.75,11.428],[116.67,33.75,11.428],[118.27,33.75,11.428],[119.87,33.75,11.428],[121.48,33.75,11.428],[123.08,33.75,11.428],[124.68,33.75,11.428],[126.29,33.75,11.428],[127.89,33.75,11.428],[129.49,33.75,11.428],[131.09,33.75,11.428],[132.7,33.75,11.428],[134.3,33.75,11.428],[70.188,33.75,12.571],[71.791,33.75,12.571],[73.393,33.75,12.571],[74.996,33.75,12.571],[76.599,33.75,12.571],[78.202,33.75,12.571],[79.805,33.75,12.571],[81.407,33.75,12.571],[83.01,33.75,12.571],[84.613,33.75,12.571],[86.216,33.75,12.571],[87.819,33.75,12.571],[89.421,33.75,12.571],[91.024,33.75,12.571],[92.627,33.75,12.571],[94.23,33.75,12.571],[95.833,33.75,12.571],[97.435,33.75,12.571],[99.038,33.75,12.571],[100.64,33.75,12.571],[102.24,33.75,12.571],[103.85,33.75,12.571],[105.45,33.75,12.571],[107.05,33.75,12.571],[108.66,33.75,12.571],[110.26,33.75,12.571],[111.86,33.75,12.571],[113.46,33.75,12.571],[115.07,33.75,12.571],[116.67,33.75,12.571],[118.27,33.75,12.571],[119.87,33.75,12.571],[121.48,33.75,12.571],[123.08,33.75,12.571],[124.68,33.75,12.571],[126.29,33.75,12.571],[127.89,33.75,12.571],[129.49,33.75,12.571],[131.09,33.75,12.571],[132.7,33.75,12.571],[134.3,33.75,12.571],[70.188,33.75,13.714],[71.791,33.75,13.714],[73.393,33.75,13.714],[74.996,33.75,13.714],[76.599,33.75,13.714],[78.202,33.75,13.714],[79.805,33.75,13.714],[81.407,33.75,13.714],[83.01,33.75,13.714],[84.613,33.75,13.714],[86.216,33.75,13.714],[87.819,33.75,13.714],[89.421,33.75,13.714],[91.024,33.75,13.714],[92.627,33.75,13.714],[94.23,33.75,13.714],[95.833,33.75,13.714],[97.435,33.75,13.714],[99.038,33.75,13.714],[100.64,33.75,13.714],[102.24,33.75,13.714],[103.85,33.75,13.714],[105.45,33.75,13.714],[107.05,33.75,13.714],[108.66,33.75,13.714],[110.26,33.75,13.714],[111.86,33.75,13.714],[113.46,33.75,13.714],[115.07,33.75,13.714],[116.67,33.75,13.714],[118.27,33.75,13.714],[119.87,33.75,13.714],[121.48,33.75,13.714],[123.08,33.75,13.714],[124.68,33.75,13.714],[126.29,33.75,13.714],[127.89,33.75,13.714],[129.49,33.75,13.714],[131.09,33.75,13.714],[132.7,33.75,13.714],[134.3,33.75,13.714],[70.188,33.75,14.857],[71.791,33.75,14.857],[73.393,33.75,14.857],[74.996,33.75,14.857],[76.599,33.75,14.857],[78.202,33.75,14.857],[79.805,33.75,14.857],[81.407,33.75,14.857],[83.01,33.75,14.857],[84.613,33.75,14.857],[86.216,33.75,14.857],[87.819,33.75,14.857],[89.421,33.75,14.857],[91.024,33.75,14.857],[92.627,33.75,14.857],[94.23,33.75,14.857],[95.833,33.75,14.857],[97.435,33.75,14.857],[99.038,33.75,14.857],[100.64,33.75,14.857],[102.24,33.75,14.857],[103.85,33.75,14.857],[105.45,33.75,14.857],[107.05,33.75,14.857],[108.66,33.75,14.857],[110.26,33.75,14.857],[111.86,33.75,14.857],[113.46,33.75,14.857],[115.07,33.75,14.857],[116.67,33.75,14.857],[118.27,33.75,14.857],[119.87,33.75,14.857],[121.48,33.75,14.857],[123.08,33.75,14.857],[124.68,33.75,14.857],[126.29,33.75,14.857],[127.89,33.75,14.857],[129.49,33.75,14.857],[131.09,33.75,14.857],[132.7,33.75,14.857],[134.3,33.75,14.857],[70.188,33.75,16],[71.791,33.75,16],[73.393,33.75,16],[74.996,33.75,16],[76.599,33.75,16],[78.202,33.75,16],[79.805,33.75,16],[81.407,33.75,16],[83.01,33.75,16],[84.613,33.75,16],[86.216,33.75,16],[87.819,33.75,16],[89.421,33.75,16],[91.024,33.75,16],[92.627,33.75,16],[94.23,33.75,16],[95.833,33.75,16],[97.435,33.75,16],[99.038,33.75,16],[100.64,33.75,16],[102.24,33.75,16],[103.85,33.75,16],[105.45,33.75,16],[107.05,33.75,16],[108.66,33.75,16],[110.26,33.75,16],[111.86,33.75,16],[113.46,33.75,16],[115.07,33.75,16],[116.67,33.75,16],[118.27,33.75,16],[119.87,33.75,16],[121.48,33.75,16],[123.08,33.75,16],[124.68,33.75,16],[126.29,33.75,16],[127.89,33.75,16],[129.49,33.75,16],[131.09,33.75,16],[132.7,33.75,16],[134.3,33.75,16],[70.188,35,-0.002],[71.791,35,-0.002],[73.393,35,-0.002],[74.996,35,-0.002],[76.599,35,-0.002],[78.202,35,-0.002],[79.805,35,-0.002],[81.407,35,-0.002],[83.01,35,-0.002],[84.613,35,-0.002],[86.216,35,-0.002],[87.819,35,-0.002],[89.421,35,-0.002],[91.024,35,-0.002],[92.627,35,-0.002],[94.23,35,-0.002],[95.833,35,-0.002],[97.435,35,-0.002],[99.038,35,-0.002],[100.64,35,-0.002],[102.24,35,-0.002],[103.85,35,-0.002],[105.45,35,-0.002],[107.05,35,-0.002],[108.66,35,-0.002],[110.26,35,-0.002],[111.86,35,-0.002],[113.46,35,-0.002],[115.07,35,-0.002],[116.67,35,-0.002],[118.27,35,-0.002],[119.87,35,-0.002],[121.48,35,-0.002],[123.08,35,-0.002],[124.68,35,-0.002],[126.29,35,-0.002],[127.89,35,-0.002],[129.49,35,-0.002],[131.09,35,-0.002],[132.7,35,-0.002],[134.3,35,-0.002],[70.188,35,1.141],[71.791,35,1.141],[73.393,35,1.141],[74.996,35,1.141],[76.599,35,1.141],[78.202,35,1.141],[79.805,35,1.141],[81.407,35,1.141],[83.01,35,1.141],[84.613,35,1.141],[86.216,35,1.141],[87.819,35,1.141],[89.421,35,1.141],[91.024,35,1.141],[92.627,35,1.141],[94.23,35,1.141],[95.833,35,1.141],[97.435,35,1.141],[99.038,35,1.141],[100.64,35,1.141],[102.24,35,1.141],[103.85,35,1.141],[105.45,35,1.141],[107.05,35,1.141],[108.66,35,1.141],[110.26,35,1.141],[111.86,35,1.141],[113.46,35,1.141],[115.07,35,1.141],[116.67,35,1.141],[118.27,35,1.141],[119.87,35,1.141],[121.48,35,1.141],[123.08,35,1.141],[124.68,35,1.141],[126.29,35,1.141],[127.89,35,1.141],[129.49,35,1.141],[131.09,35,1.141],[132.7,35,1.141],[134.3,35,1.141],[70.188,35,2.284],[71.791,35,2.284],[73.393,35,2.284],[74.996,35,2.284],[76.599,35,2.284],[78.202,35,2.284],[79.805,35,2.284],[81.407,35,2.284],[83.01,35,2.284],[84.613,35,2.284],[86.216,35,2.284],[87.819,35,2.284],[89.421,35,2.284],[91.024,35,2.284],[92.627,35,2.284],[94.23,35,2.284],[95.833,35,2.284],[97.435,35,2.284],[99.038,35,2.284],[100.64,35,2.284],[102.24,35,2.284],[103.85,35,2.284],[105.45,35,2.284],[107.05,35,2.284],[108.66,35,2.284],[110.26,35,2.284],[111.86,35,2.284],[113.46,35,2.284],[115.07,35,2.284],[116.67,35,2.284],[118.27,35,2.284],[119.87,35,2.284],[121.48,35,2.284],[123.08,35,2.284],[124.68,35,2.284],[126.29,35,2.284],[127.89,35,2.284],[129.49,35,2.284],[131.09,35,2.284],[132.7,35,2.284],[134.3,35,2.284],[70.188,35,3.427],[71.791,35,3.427],[73.393,35,3.427],[74.996,35,3.427],[76.599,35,3.427],[78.202,35,3.427],[79.805,35,3.427],[81.407,35,3.427],[83.01,35,3.427],[84.613,35,3.427],[86.216,35,3.427],[87.819,35,3.427],[89.421,35,3.427],[91.024,35,3.427],[92.627,35,3.427],[94.23,35,3.427],[95.833,35,3.427],[97.435,35,3.427],[99.038,35,3.427],[100.64,35,3.427],[102.24,35,3.427],[103.85,35,3.427],[105.45,35,3.427],[107.05,35,3.427],[108.66,35,3.427],[110.26,35,3.427],[111.86,35,3.427],[113.46,35,3.427],[115.07,35,3.427],[116.67,35,3.427],[118.27,35,3.427],[119.87,35,3.427],[121.48,35,3.427],[123.08,35,3.427],[124.68,35,3.427],[126.29,35,3.427],[127.89,35,3.427],[129.49,35,3.427],[131.09,35,3.427],[132.7,35,3.427],[134.3,35,3.427],[70.188,35,4.57],[71.791,35,4.57],[73.393,35,4.57],[74.996,35,4.57],[76.599,35,4.57],[78.202,35,4.57],[79.805,35,4.57],[81.407,35,4.57],[83.01,35,4.57],[84.613,35,4.57],[86.216,35,4.57],[87.819,35,4.57],[89.421,35,4.57],[91.024,35,4.57],[92.627,35,4.57],[94.23,35,4.57],[95.833,35,4.57],[97.435,35,4.57],[99.038,35,4.57],[100.64,35,4.57],[102.24,35,4.57],[103.85,35,4.57],[105.45,35,4.57],[107.05,35,4.57],[108.66,35,4.57],[110.26,35,4.57],[111.86,35,4.57],[113.46,35,4.57],[115.07,35,4.57],[116.67,35,4.57],[118.27,35,4.57],[119.87,35,4.57],[121.48,35,4.57],[123.08,35,4.57],[124.68,35,4.57],[126.29,35,4.57],[127.89,35,4.57],[129.49,35,4.57],[131.09,35,4.57],[132.7,35,4.57],[134.3,35,4.57],[70.188,35,5.713],[71.791,35,5.713],[73.393,35,5.713],[74.996,35,5.713],[76.599,35,5.713],[78.202,35,5.713],[79.805,35,5.713],[81.407,35,5.713],[83.01,35,5.713],[84.613,35,5.713],[86.216,35,5.713],[87.819,35,5.713],[89.421,35,5.713],[91.024,35,5.713],[92.627,35,5.713],[94.23,35,5.713],[95.833,35,5.713],[97.435,35,5.713],[99.038,35,5.713],[100.64,35,5.713],[102.24,35,5.713],[103.85,35,5.713],[105.45,35,5.713],[107.05,35,5.713],[108.66,35,5.713],[110.26,35,5.713],[111.86,35,5.713],[113.46,35,5.713],[115.07,35,5.713],[116.67,35,5.713],[118.27,35,5.713],[119.87,35,5.713],[121.48,35,5.713],[123.08,35,5.713],[124.68,35,5.713],[126.29,35,5.713],[127.89,35,5.713],[129.49,35,5.713],[131.09,35,5.713],[132.7,35,5.713],[134.3,35,5.713],[70.188,35,6.856],[71.791,35,6.856],[73.393,35,6.856],[74.996,35,6.856],[76.599,35,6.856],[78.202,35,6.856],[79.805,35,6.856],[81.407,35,6.856],[83.01,35,6.856],[84.613,35,6.856],[86.216,35,6.856],[87.819,35,6.856],[89.421,35,6.856],[91.024,35,6.856],[92.627,35,6.856],[94.23,35,6.856],[95.833,35,6.856],[97.435,35,6.856],[99.038,35,6.856],[100.64,35,6.856],[102.24,35,6.856],[103.85,35,6.856],[105.45,35,6.856],[107.05,35,6.856],[108.66,35,6.856],[110.26,35,6.856],[111.86,35,6.856],[113.46,35,6.856],[115.07,35,6.856],[116.67,35,6.856],[118.27,35,6.856],[119.87,35,6.856],[121.48,35,6.856],[123.08,35,6.856],[124.68,35,6.856],[126.29,35,6.856],[127.89,35,6.856],[129.49,35,6.856],[131.09,35,6.856],[132.7,35,6.856],[134.3,35,6.856],[70.188,35,7.999],[71.791,35,7.999],[73.393,35,7.999],[74.996,35,7.999],[76.599,35,7.999],[78.202,35,7.999],[79.805,35,7.999],[81.407,35,7.999],[83.01,35,7.999],[84.613,35,7.999],[86.216,35,7.999],[87.819,35,7.999],[89.421,35,7.999],[91.024,35,7.999],[92.627,35,7.999],[94.23,35,7.999],[95.833,35,7.999],[97.435,35,7.999],[99.038,35,7.999],[100.64,35,7.999],[102.24,35,7.999],[103.85,35,7.999],[105.45,35,7.999],[107.05,35,7.999],[108.66,35,7.999],[110.26,35,7.999],[111.86,35,7.999],[113.46,35,7.999],[115.07,35,7.999],[116.67,35,7.999],[118.27,35,7.999],[119.87,35,7.999],[121.48,35,7.999],[123.08,35,7.999],[124.68,35,7.999],[126.29,35,7.999],[127.89,35,7.999],[129.49,35,7.999],[131.09,35,7.999],[132.7,35,7.999],[134.3,35,7.999],[70.188,35,9.142],[71.791,35,9.142],[73.393,35,9.142],[74.996,35,9.142],[76.599,35,9.142],[78.202,35,9.142],[79.805,35,9.142],[81.407,35,9.142],[83.01,35,9.142],[84.613,35,9.142],[86.216,35,9.142],[87.819,35,9.142],[89.421,35,9.142],[91.024,35,9.142],[92.627,35,9.142],[94.23,35,9.142],[95.833,35,9.142],[97.435,35,9.142],[99.038,35,9.142],[100.64,35,9.142],[102.24,35,9.142],[103.85,35,9.142],[105.45,35,9.142],[107.05,35,9.142],[108.66,35,9.142],[110.26,35,9.142],[111.86,35,9.142],[113.46,35,9.142],[115.07,35,9.142],[116.67,35,9.142],[118.27,35,9.142],[119.87,35,9.142],[121.48,35,9.142],[123.08,35,9.142],[124.68,35,9.142],[126.29,35,9.142],[127.89,35,9.142],[129.49,35,9.142],[131.09,35,9.142],[132.7,35,9.142],[134.3,35,9.142],[70.188,35,10.285],[71.791,35,10.285],[73.393,35,10.285],[74.996,35,10.285],[76.599,35,10.285],[78.202,35,10.285],[79.805,35,10.285],[81.407,35,10.285],[83.01,35,10.285],[84.613,35,10.285],[86.216,35,10.285],[87.819,35,10.285],[89.421,35,10.285],[91.024,35,10.285],[92.627,35,10.285],[94.23,35,10.285],[95.833,35,10.285],[97.435,35,10.285],[99.038,35,10.285],[100.64,35,10.285],[102.24,35,10.285],[103.85,35,10.285],[105.45,35,10.285],[107.05,35,10.285],[108.66,35,10.285],[110.26,35,10.285],[111.86,35,10.285],[113.46,35,10.285],[115.07,35,10.285],[116.67,35,10.285],[118.27,35,10.285],[119.87,35,10.285],[121.48,35,10.285],[123.08,35,10.285],[124.68,35,10.285],[126.29,35,10.285],[127.89,35,10.285],[129.49,35,10.285],[131.09,35,10.285],[132.7,35,10.285],[134.3,35,10.285],[70.188,35,11.428],[71.791,35,11.428],[73.393,35,11.428],[74.996,35,11.428],[76.599,35,11.428],[78.202,35,11.428],[79.805,35,11.428],[81.407,35,11.428],[83.01,35,11.428],[84.613,35,11.428],[86.216,35,11.428],[87.819,35,11.428],[89.421,35,11.428],[91.024,35,11.428],[92.627,35,11.428],[94.23,35,11.428],[95.833,35,11.428],[97.435,35,11.428],[99.038,35,11.428],[100.64,35,11.428],[102.24,35,11.428],[103.85,35,11.428],[105.45,35,11.428],[107.05,35,11.428],[108.66,35,11.428],[110.26,35,11.428],[111.86,35,11.428],[113.46,35,11.428],[115.07,35,11.428],[116.67,35,11.428],[118.27,35,11.428],[119.87,35,11.428],[121.48,35,11.428],[123.08,35,11.428],[124.68,35,11.428],[126.29,35,11.428],[127.89,35,11.428],[129.49,35,11.428],[131.09,35,11.428],[132.7,35,11.428],[134.3,35,11.428],[70.188,35,12.571],[71.791,35,12.571],[73.393,35,12.571],[74.996,35,12.571],[76.599,35,12.571],[78.202,35,12.571],[79.805,35,12.571],[81.407,35,12.571],[83.01,35,12.571],[84.613,35,12.571],[86.216,35,12.571],[87.819,35,12.571],[89.421,35,12.571],[91.024,35,12.571],[92.627,35,12.571],[94.23,35,12.571],[95.833,35,12.571],[97.435,35,12.571],[99.038,35,12.571],[100.64,35,12.571],[102.24,35,12.571],[103.85,35,12.571],[105.45,35,12.571],[107.05,35,12.571],[108.66,35,12.571],[110.26,35,12.571],[111.86,35,12.571],[113.46,35,12.571],[115.07,35,12.571],[116.67,35,12.571],[118.27,35,12.571],[119.87,35,12.571],[121.48,35,12.571],[123.08,35,12.571],[124.68,35,12.571],[126.29,35,12.571],[127.89,35,12.571],[129.49,35,12.571],[131.09,35,12.571],[132.7,35,12.571],[134.3,35,12.571],[70.188,35,13.714],[71.791,35,13.714],[73.393,35,13.714],[74.996,35,13.714],[76.599,35,13.714],[78.202,35,13.714],[79.805,35,13.714],[81.407,35,13.714],[83.01,35,13.714],[84.613,35,13.714],[86.216,35,13.714],[87.819,35,13.714],[89.421,35,13.714],[91.024,35,13.714],[92.627,35,13.714],[94.23,35,13.714],[95.833,35,13.714],[97.435,35,13.714],[99.038,35,13.714],[100.64,35,13.714],[102.24,35,13.714],[103.85,35,13.714],[105.45,35,13.714],[107.05,35,13.714],[108.66,35,13.714],[110.26,35,13.714],[111.86,35,13.714],[113.46,35,13.714],[115.07,35,13.714],[116.67,35,13.714],[118.27,35,13.714],[119.87,35,13.714],[121.48,35,13.714],[123.08,35,13.714],[124.68,35,13.714],[126.29,35,13.714],[127.89,35,13.714],[129.49,35,13.714],[131.09,35,13.714],[132.7,35,13.714],[134.3,35,13.714],[70.188,35,14.857],[71.791,35,14.857],[73.393,35,14.857],[74.996,35,14.857],[76.599,35,14.857],[78.202,35,14.857],[79.805,35,14.857],[81.407,35,14.857],[83.01,35,14.857],[84.613,35,14.857],[86.216,35,14.857],[87.819,35,14.857],[89.421,35,14.857],[91.024,35,14.857],[92.627,35,14.857],[94.23,35,14.857],[95.833,35,14.857],[97.435,35,14.857],[99.038,35,14.857],[100.64,35,14.857],[102.24,35,14.857],[103.85,35,14.857],[105.45,35,14.857],[107.05,35,14.857],[108.66,35,14.857],[110.26,35,14.857],[111.86,35,14.857],[113.46,35,14.857],[115.07,35,14.857],[116.67,35,14.857],[118.27,35,14.857],[119.87,35,14.857],[121.48,35,14.857],[123.08,35,14.857],[124.68,35,14.857],[126.29,35,14.857],[127.89,35,14.857],[129.49,35,14.857],[131.09,35,14.857],[132.7,35,14.857],[134.3,35,14.857],[70.188,35,16],[71.791,35,16],[73.393,35,16],[74.996,35,16],[76.599,35,16],[78.202,35,16],[79.805,35,16],[81.407,35,16],[83.01,35,16],[84.613,35,16],[86.216,35,16],[87.819,35,16],[89.421,35,16],[91.024,35,16],[92.627,35,16],[94.23,35,16],[95.833,35,16],[97.435,35,16],[99.038,35,16],[100.64,35,16],[102.24,35,16],[103.85,35,16],[105.45,35,16],[107.05,35,16],[108.66,35,16],[110.26,35,16],[111.86,35,16],[113.46,35,16],[115.07,35,16],[116.67,35,16],[118.27,35,16],[119.87,35,16],[121.48,35,16],[123.08,35,16],[124.68,35,16],[126.29,35,16],[127.89,35,16],[129.49,35,16],[131.09,35,16],[132.7,35,16],[134.3,35,16],[70.188,36.25,-0.002],[71.791,36.25,-0.002],[73.393,36.25,-0.002],[74.996,36.25,-0.002],[76.599,36.25,-0.002],[78.202,36.25,-0.002],[79.805,36.25,-0.002],[81.407,36.25,-0.002],[83.01,36.25,-0.002],[84.613,36.25,-0.002],[86.216,36.25,-0.002],[87.819,36.25,-0.002],[89.421,36.25,-0.002],[91.024,36.25,-0.002],[92.627,36.25,-0.002],[94.23,36.25,-0.002],[95.833,36.25,-0.002],[97.435,36.25,-0.002],[99.038,36.25,-0.002],[100.64,36.25,-0.002],[102.24,36.25,-0.002],[103.85,36.25,-0.002],[105.45,36.25,-0.002],[107.05,36.25,-0.002],[108.66,36.25,-0.002],[110.26,36.25,-0.002],[111.86,36.25,-0.002],[113.46,36.25,-0.002],[115.07,36.25,-0.002],[116.67,36.25,-0.002],[118.27,36.25,-0.002],[119.87,36.25,-0.002],[121.48,36.25,-0.002],[123.08,36.25,-0.002],[124.68,36.25,-0.002],[126.29,36.25,-0.002],[127.89,36.25,-0.002],[129.49,36.25,-0.002],[131.09,36.25,-0.002],[132.7,36.25,-0.002],[134.3,36.25,-0.002],[70.188,36.25,1.141],[71.791,36.25,1.141],[73.393,36.25,1.141],[74.996,36.25,1.141],[76.599,36.25,1.141],[78.202,36.25,1.141],[79.805,36.25,1.141],[81.407,36.25,1.141],[83.01,36.25,1.141],[84.613,36.25,1.141],[86.216,36.25,1.141],[87.819,36.25,1.141],[89.421,36.25,1.141],[91.024,36.25,1.141],[92.627,36.25,1.141],[94.23,36.25,1.141],[95.833,36.25,1.141],[97.435,36.25,1.141],[99.038,36.25,1.141],[100.64,36.25,1.141],[102.24,36.25,1.141],[103.85,36.25,1.141],[105.45,36.25,1.141],[107.05,36.25,1.141],[108.66,36.25,1.141],[110.26,36.25,1.141],[111.86,36.25,1.141],[113.46,36.25,1.141],[115.07,36.25,1.141],[116.67,36.25,1.141],[118.27,36.25,1.141],[119.87,36.25,1.141],[121.48,36.25,1.141],[123.08,36.25,1.141],[124.68,36.25,1.141],[126.29,36.25,1.141],[127.89,36.25,1.141],[129.49,36.25,1.141],[131.09,36.25,1.141],[132.7,36.25,1.141],[134.3,36.25,1.141],[70.188,36.25,2.284],[71.791,36.25,2.284],[73.393,36.25,2.284],[74.996,36.25,2.284],[76.599,36.25,2.284],[78.202,36.25,2.284],[79.805,36.25,2.284],[81.407,36.25,2.284],[83.01,36.25,2.284],[84.613,36.25,2.284],[86.216,36.25,2.284],[87.819,36.25,2.284],[89.421,36.25,2.284],[91.024,36.25,2.284],[92.627,36.25,2.284],[94.23,36.25,2.284],[95.833,36.25,2.284],[97.435,36.25,2.284],[99.038,36.25,2.284],[100.64,36.25,2.284],[102.24,36.25,2.284],[103.85,36.25,2.284],[105.45,36.25,2.284],[107.05,36.25,2.284],[108.66,36.25,2.284],[110.26,36.25,2.284],[111.86,36.25,2.284],[113.46,36.25,2.284],[115.07,36.25,2.284],[116.67,36.25,2.284],[118.27,36.25,2.284],[119.87,36.25,2.284],[121.48,36.25,2.284],[123.08,36.25,2.284],[124.68,36.25,2.284],[126.29,36.25,2.284],[127.89,36.25,2.284],[129.49,36.25,2.284],[131.09,36.25,2.284],[132.7,36.25,2.284],[134.3,36.25,2.284],[70.188,36.25,3.427],[71.791,36.25,3.427],[73.393,36.25,3.427],[74.996,36.25,3.427],[76.599,36.25,3.427],[78.202,36.25,3.427],[79.805,36.25,3.427],[81.407,36.25,3.427],[83.01,36.25,3.427],[84.613,36.25,3.427],[86.216,36.25,3.427],[87.819,36.25,3.427],[89.421,36.25,3.427],[91.024,36.25,3.427],[92.627,36.25,3.427],[94.23,36.25,3.427],[95.833,36.25,3.427],[97.435,36.25,3.427],[99.038,36.25,3.427],[100.64,36.25,3.427],[102.24,36.25,3.427],[103.85,36.25,3.427],[105.45,36.25,3.427],[107.05,36.25,3.427],[108.66,36.25,3.427],[110.26,36.25,3.427],[111.86,36.25,3.427],[113.46,36.25,3.427],[115.07,36.25,3.427],[116.67,36.25,3.427],[118.27,36.25,3.427],[119.87,36.25,3.427],[121.48,36.25,3.427],[123.08,36.25,3.427],[124.68,36.25,3.427],[126.29,36.25,3.427],[127.89,36.25,3.427],[129.49,36.25,3.427],[131.09,36.25,3.427],[132.7,36.25,3.427],[134.3,36.25,3.427],[70.188,36.25,4.57],[71.791,36.25,4.57],[73.393,36.25,4.57],[74.996,36.25,4.57],[76.599,36.25,4.57],[78.202,36.25,4.57],[79.805,36.25,4.57],[81.407,36.25,4.57],[83.01,36.25,4.57],[84.613,36.25,4.57],[86.216,36.25,4.57],[87.819,36.25,4.57],[89.421,36.25,4.57],[91.024,36.25,4.57],[92.627,36.25,4.57],[94.23,36.25,4.57],[95.833,36.25,4.57],[97.435,36.25,4.57],[99.038,36.25,4.57],[100.64,36.25,4.57],[102.24,36.25,4.57],[103.85,36.25,4.57],[105.45,36.25,4.57],[107.05,36.25,4.57],[108.66,36.25,4.57],[110.26,36.25,4.57],[111.86,36.25,4.57],[113.46,36.25,4.57],[115.07,36.25,4.57],[116.67,36.25,4.57],[118.27,36.25,4.57],[119.87,36.25,4.57],[121.48,36.25,4.57],[123.08,36.25,4.57],[124.68,36.25,4.57],[126.29,36.25,4.57],[127.89,36.25,4.57],[129.49,36.25,4.57],[131.09,36.25,4.57],[132.7,36.25,4.57],[134.3,36.25,4.57],[70.188,36.25,5.713],[71.791,36.25,5.713],[73.393,36.25,5.713],[74.996,36.25,5.713],[76.599,36.25,5.713],[78.202,36.25,5.713],[79.805,36.25,5.713],[81.407,36.25,5.713],[83.01,36.25,5.713],[84.613,36.25,5.713],[86.216,36.25,5.713],[87.819,36.25,5.713],[89.421,36.25,5.713],[91.024,36.25,5.713],[92.627,36.25,5.713],[94.23,36.25,5.713],[95.833,36.25,5.713],[97.435,36.25,5.713],[99.038,36.25,5.713],[100.64,36.25,5.713],[102.24,36.25,5.713],[103.85,36.25,5.713],[105.45,36.25,5.713],[107.05,36.25,5.713],[108.66,36.25,5.713],[110.26,36.25,5.713],[111.86,36.25,5.713],[113.46,36.25,5.713],[115.07,36.25,5.713],[116.67,36.25,5.713],[118.27,36.25,5.713],[119.87,36.25,5.713],[121.48,36.25,5.713],[123.08,36.25,5.713],[124.68,36.25,5.713],[126.29,36.25,5.713],[127.89,36.25,5.713],[129.49,36.25,5.713],[131.09,36.25,5.713],[132.7,36.25,5.713],[134.3,36.25,5.713],[70.188,36.25,6.856],[71.791,36.25,6.856],[73.393,36.25,6.856],[74.996,36.25,6.856],[76.599,36.25,6.856],[78.202,36.25,6.856],[79.805,36.25,6.856],[81.407,36.25,6.856],[83.01,36.25,6.856],[84.613,36.25,6.856],[86.216,36.25,6.856],[87.819,36.25,6.856],[89.421,36.25,6.856],[91.024,36.25,6.856],[92.627,36.25,6.856],[94.23,36.25,6.856],[95.833,36.25,6.856],[97.435,36.25,6.856],[99.038,36.25,6.856],[100.64,36.25,6.856],[102.24,36.25,6.856],[103.85,36.25,6.856],[105.45,36.25,6.856],[107.05,36.25,6.856],[108.66,36.25,6.856],[110.26,36.25,6.856],[111.86,36.25,6.856],[113.46,36.25,6.856],[115.07,36.25,6.856],[116.67,36.25,6.856],[118.27,36.25,6.856],[119.87,36.25,6.856],[121.48,36.25,6.856],[123.08,36.25,6.856],[124.68,36.25,6.856],[126.29,36.25,6.856],[127.89,36.25,6.856],[129.49,36.25,6.856],[131.09,36.25,6.856],[132.7,36.25,6.856],[134.3,36.25,6.856],[70.188,36.25,7.999],[71.791,36.25,7.999],[73.393,36.25,7.999],[74.996,36.25,7.999],[76.599,36.25,7.999],[78.202,36.25,7.999],[79.805,36.25,7.999],[81.407,36.25,7.999],[83.01,36.25,7.999],[84.613,36.25,7.999],[86.216,36.25,7.999],[87.819,36.25,7.999],[89.421,36.25,7.999],[91.024,36.25,7.999],[92.627,36.25,7.999],[94.23,36.25,7.999],[95.833,36.25,7.999],[97.435,36.25,7.999],[99.038,36.25,7.999],[100.64,36.25,7.999],[102.24,36.25,7.999],[103.85,36.25,7.999],[105.45,36.25,7.999],[107.05,36.25,7.999],[108.66,36.25,7.999],[110.26,36.25,7.999],[111.86,36.25,7.999],[113.46,36.25,7.999],[115.07,36.25,7.999],[116.67,36.25,7.999],[118.27,36.25,7.999],[119.87,36.25,7.999],[121.48,36.25,7.999],[123.08,36.25,7.999],[124.68,36.25,7.999],[126.29,36.25,7.999],[127.89,36.25,7.999],[129.49,36.25,7.999],[131.09,36.25,7.999],[132.7,36.25,7.999],[134.3,36.25,7.999],[70.188,36.25,9.142],[71.791,36.25,9.142],[73.393,36.25,9.142],[74.996,36.25,9.142],[76.599,36.25,9.142],[78.202,36.25,9.142],[79.805,36.25,9.142],[81.407,36.25,9.142],[83.01,36.25,9.142],[84.613,36.25,9.142],[86.216,36.25,9.142],[87.819,36.25,9.142],[89.421,36.25,9.142],[91.024,36.25,9.142],[92.627,36.25,9.142],[94.23,36.25,9.142],[95.833,36.25,9.142],[97.435,36.25,9.142],[99.038,36.25,9.142],[100.64,36.25,9.142],[102.24,36.25,9.142],[103.85,36.25,9.142],[105.45,36.25,9.142],[107.05,36.25,9.142],[108.66,36.25,9.142],[110.26,36.25,9.142],[111.86,36.25,9.142],[113.46,36.25,9.142],[115.07,36.25,9.142],[116.67,36.25,9.142],[118.27,36.25,9.142],[119.87,36.25,9.142],[121.48,36.25,9.142],[123.08,36.25,9.142],[124.68,36.25,9.142],[126.29,36.25,9.142],[127.89,36.25,9.142],[129.49,36.25,9.142],[131.09,36.25,9.142],[132.7,36.25,9.142],[134.3,36.25,9.142],[70.188,36.25,10.285],[71.791,36.25,10.285],[73.393,36.25,10.285],[74.996,36.25,10.285],[76.599,36.25,10.285],[78.202,36.25,10.285],[79.805,36.25,10.285],[81.407,36.25,10.285],[83.01,36.25,10.285],[84.613,36.25,10.285],[86.216,36.25,10.285],[87.819,36.25,10.285],[89.421,36.25,10.285],[91.024,36.25,10.285],[92.627,36.25,10.285],[94.23,36.25,10.285],[95.833,36.25,10.285],[97.435,36.25,10.285],[99.038,36.25,10.285],[100.64,36.25,10.285],[102.24,36.25,10.285],[103.85,36.25,10.285],[105.45,36.25,10.285],[107.05,36.25,10.285],[108.66,36.25,10.285],[110.26,36.25,10.285],[111.86,36.25,10.285],[113.46,36.25,10.285],[115.07,36.25,10.285],[116.67,36.25,10.285],[118.27,36.25,10.285],[119.87,36.25,10.285],[121.48,36.25,10.285],[123.08,36.25,10.285],[124.68,36.25,10.285],[126.29,36.25,10.285],[127.89,36.25,10.285],[129.49,36.25,10.285],[131.09,36.25,10.285],[132.7,36.25,10.285],[134.3,36.25,10.285],[70.188,36.25,11.428],[71.791,36.25,11.428],[73.393,36.25,11.428],[74.996,36.25,11.428],[76.599,36.25,11.428],[78.202,36.25,11.428],[79.805,36.25,11.428],[81.407,36.25,11.428],[83.01,36.25,11.428],[84.613,36.25,11.428],[86.216,36.25,11.428],[87.819,36.25,11.428],[89.421,36.25,11.428],[91.024,36.25,11.428],[92.627,36.25,11.428],[94.23,36.25,11.428],[95.833,36.25,11.428],[97.435,36.25,11.428],[99.038,36.25,11.428],[100.64,36.25,11.428],[102.24,36.25,11.428],[103.85,36.25,11.428],[105.45,36.25,11.428],[107.05,36.25,11.428],[108.66,36.25,11.428],[110.26,36.25,11.428],[111.86,36.25,11.428],[113.46,36.25,11.428],[115.07,36.25,11.428],[116.67,36.25,11.428],[118.27,36.25,11.428],[119.87,36.25,11.428],[121.48,36.25,11.428],[123.08,36.25,11.428],[124.68,36.25,11.428],[126.29,36.25,11.428],[127.89,36.25,11.428],[129.49,36.25,11.428],[131.09,36.25,11.428],[132.7,36.25,11.428],[134.3,36.25,11.428],[70.188,36.25,12.571],[71.791,36.25,12.571],[73.393,36.25,12.571],[74.996,36.25,12.571],[76.599,36.25,12.571],[78.202,36.25,12.571],[79.805,36.25,12.571],[81.407,36.25,12.571],[83.01,36.25,12.571],[84.613,36.25,12.571],[86.216,36.25,12.571],[87.819,36.25,12.571],[89.421,36.25,12.571],[91.024,36.25,12.571],[92.627,36.25,12.571],[94.23,36.25,12.571],[95.833,36.25,12.571],[97.435,36.25,12.571],[99.038,36.25,12.571],[100.64,36.25,12.571],[102.24,36.25,12.571],[103.85,36.25,12.571],[105.45,36.25,12.571],[107.05,36.25,12.571],[108.66,36.25,12.571],[110.26,36.25,12.571],[111.86,36.25,12.571],[113.46,36.25,12.571],[115.07,36.25,12.571],[116.67,36.25,12.571],[118.27,36.25,12.571],[119.87,36.25,12.571],[121.48,36.25,12.571],[123.08,36.25,12.571],[124.68,36.25,12.571],[126.29,36.25,12.571],[127.89,36.25,12.571],[129.49,36.25,12.571],[131.09,36.25,12.571],[132.7,36.25,12.571],[134.3,36.25,12.571],[70.188,36.25,13.714],[71.791,36.25,13.714],[73.393,36.25,13.714],[74.996,36.25,13.714],[76.599,36.25,13.714],[78.202,36.25,13.714],[79.805,36.25,13.714],[81.407,36.25,13.714],[83.01,36.25,13.714],[84.613,36.25,13.714],[86.216,36.25,13.714],[87.819,36.25,13.714],[89.421,36.25,13.714],[91.024,36.25,13.714],[92.627,36.25,13.714],[94.23,36.25,13.714],[95.833,36.25,13.714],[97.435,36.25,13.714],[99.038,36.25,13.714],[100.64,36.25,13.714],[102.24,36.25,13.714],[103.85,36.25,13.714],[105.45,36.25,13.714],[107.05,36.25,13.714],[108.66,36.25,13.714],[110.26,36.25,13.714],[111.86,36.25,13.714],[113.46,36.25,13.714],[115.07,36.25,13.714],[116.67,36.25,13.714],[118.27,36.25,13.714],[119.87,36.25,13.714],[121.48,36.25,13.714],[123.08,36.25,13.714],[124.68,36.25,13.714],[126.29,36.25,13.714],[127.89,36.25,13.714],[129.49,36.25,13.714],[131.09,36.25,13.714],[132.7,36.25,13.714],[134.3,36.25,13.714],[70.188,36.25,14.857],[71.791,36.25,14.857],[73.393,36.25,14.857],[74.996,36.25,14.857],[76.599,36.25,14.857],[78.202,36.25,14.857],[79.805,36.25,14.857],[81.407,36.25,14.857],[83.01,36.25,14.857],[84.613,36.25,14.857],[86.216,36.25,14.857],[87.819,36.25,14.857],[89.421,36.25,14.857],[91.024,36.25,14.857],[92.627,36.25,14.857],[94.23,36.25,14.857],[95.833,36.25,14.857],[97.435,36.25,14.857],[99.038,36.25,14.857],[100.64,36.25,14.857],[102.24,36.25,14.857],[103.85,36.25,14.857],[105.45,36.25,14.857],[107.05,36.25,14.857],[108.66,36.25,14.857],[110.26,36.25,14.857],[111.86,36.25,14.857],[113.46,36.25,14.857],[115.07,36.25,14.857],[116.67,36.25,14.857],[118.27,36.25,14.857],[119.87,36.25,14.857],[121.48,36.25,14.857],[123.08,36.25,14.857],[124.68,36.25,14.857],[126.29,36.25,14.857],[127.89,36.25,14.857],[129.49,36.25,14.857],[131.09,36.25,14.857],[132.7,36.25,14.857],[134.3,36.25,14.857],[70.188,36.25,16],[71.791,36.25,16],[73.393,36.25,16],[74.996,36.25,16],[76.599,36.25,16],[78.202,36.25,16],[79.805,36.25,16],[81.407,36.25,16],[83.01,36.25,16],[84.613,36.25,16],[86.216,36.25,16],[87.819,36.25,16],[89.421,36.25,16],[91.024,36.25,16],[92.627,36.25,16],[94.23,36.25,16],[95.833,36.25,16],[97.435,36.25,16],[99.038,36.25,16],[100.64,36.25,16],[102.24,36.25,16],[103.85,36.25,16],[105.45,36.25,16],[107.05,36.25,16],[108.66,36.25,16],[110.26,36.25,16],[111.86,36.25,16],[113.46,36.25,16],[115.07,36.25,16],[116.67,36.25,16],[118.27,36.25,16],[119.87,36.25,16],[121.48,36.25,16],[123.08,36.25,16],[124.68,36.25,16],[126.29,36.25,16],[127.89,36.25,16],[129.49,36.25,16],[131.09,36.25,16],[132.7,36.25,16],[134.3,36.25,16],[70.188,37.5,-0.002],[71.791,37.5,-0.002],[73.393,37.5,-0.002],[74.996,37.5,-0.002],[76.599,37.5,-0.002],[78.202,37.5,-0.002],[79.805,37.5,-0.002],[81.407,37.5,-0.002],[83.01,37.5,-0.002],[84.613,37.5,-0.002],[86.216,37.5,-0.002],[87.819,37.5,-0.002],[89.421,37.5,-0.002],[91.024,37.5,-0.002],[92.627,37.5,-0.002],[94.23,37.5,-0.002],[95.833,37.5,-0.002],[97.435,37.5,-0.002],[99.038,37.5,-0.002],[100.64,37.5,-0.002],[102.24,37.5,-0.002],[103.85,37.5,-0.002],[105.45,37.5,-0.002],[107.05,37.5,-0.002],[108.66,37.5,-0.002],[110.26,37.5,-0.002],[111.86,37.5,-0.002],[113.46,37.5,-0.002],[115.07,37.5,-0.002],[116.67,37.5,-0.002],[118.27,37.5,-0.002],[119.87,37.5,-0.002],[121.48,37.5,-0.002],[123.08,37.5,-0.002],[124.68,37.5,-0.002],[126.29,37.5,-0.002],[127.89,37.5,-0.002],[129.49,37.5,-0.002],[131.09,37.5,-0.002],[132.7,37.5,-0.002],[134.3,37.5,-0.002],[70.188,37.5,1.141],[71.791,37.5,1.141],[73.393,37.5,1.141],[74.996,37.5,1.141],[76.599,37.5,1.141],[78.202,37.5,1.141],[79.805,37.5,1.141],[81.407,37.5,1.141],[83.01,37.5,1.141],[84.613,37.5,1.141],[86.216,37.5,1.141],[87.819,37.5,1.141],[89.421,37.5,1.141],[91.024,37.5,1.141],[92.627,37.5,1.141],[94.23,37.5,1.141],[95.833,37.5,1.141],[97.435,37.5,1.141],[99.038,37.5,1.141],[100.64,37.5,1.141],[102.24,37.5,1.141],[103.85,37.5,1.141],[105.45,37.5,1.141],[107.05,37.5,1.141],[108.66,37.5,1.141],[110.26,37.5,1.141],[111.86,37.5,1.141],[113.46,37.5,1.141],[115.07,37.5,1.141],[116.67,37.5,1.141],[118.27,37.5,1.141],[119.87,37.5,1.141],[121.48,37.5,1.141],[123.08,37.5,1.141],[124.68,37.5,1.141],[126.29,37.5,1.141],[127.89,37.5,1.141],[129.49,37.5,1.141],[131.09,37.5,1.141],[132.7,37.5,1.141],[134.3,37.5,1.141],[70.188,37.5,2.284],[71.791,37.5,2.284],[73.393,37.5,2.284],[74.996,37.5,2.284],[76.599,37.5,2.284],[78.202,37.5,2.284],[79.805,37.5,2.284],[81.407,37.5,2.284],[83.01,37.5,2.284],[84.613,37.5,2.284],[86.216,37.5,2.284],[87.819,37.5,2.284],[89.421,37.5,2.284],[91.024,37.5,2.284],[92.627,37.5,2.284],[94.23,37.5,2.284],[95.833,37.5,2.284],[97.435,37.5,2.284],[99.038,37.5,2.284],[100.64,37.5,2.284],[102.24,37.5,2.284],[103.85,37.5,2.284],[105.45,37.5,2.284],[107.05,37.5,2.284],[108.66,37.5,2.284],[110.26,37.5,2.284],[111.86,37.5,2.284],[113.46,37.5,2.284],[115.07,37.5,2.284],[116.67,37.5,2.284],[118.27,37.5,2.284],[119.87,37.5,2.284],[121.48,37.5,2.284],[123.08,37.5,2.284],[124.68,37.5,2.284],[126.29,37.5,2.284],[127.89,37.5,2.284],[129.49,37.5,2.284],[131.09,37.5,2.284],[132.7,37.5,2.284],[134.3,37.5,2.284],[70.188,37.5,3.427],[71.791,37.5,3.427],[73.393,37.5,3.427],[74.996,37.5,3.427],[76.599,37.5,3.427],[78.202,37.5,3.427],[79.805,37.5,3.427],[81.407,37.5,3.427],[83.01,37.5,3.427],[84.613,37.5,3.427],[86.216,37.5,3.427],[87.819,37.5,3.427],[89.421,37.5,3.427],[91.024,37.5,3.427],[92.627,37.5,3.427],[94.23,37.5,3.427],[95.833,37.5,3.427],[97.435,37.5,3.427],[99.038,37.5,3.427],[100.64,37.5,3.427],[102.24,37.5,3.427],[103.85,37.5,3.427],[105.45,37.5,3.427],[107.05,37.5,3.427],[108.66,37.5,3.427],[110.26,37.5,3.427],[111.86,37.5,3.427],[113.46,37.5,3.427],[115.07,37.5,3.427],[116.67,37.5,3.427],[118.27,37.5,3.427],[119.87,37.5,3.427],[121.48,37.5,3.427],[123.08,37.5,3.427],[124.68,37.5,3.427],[126.29,37.5,3.427],[127.89,37.5,3.427],[129.49,37.5,3.427],[131.09,37.5,3.427],[132.7,37.5,3.427],[134.3,37.5,3.427],[70.188,37.5,4.57],[71.791,37.5,4.57],[73.393,37.5,4.57],[74.996,37.5,4.57],[76.599,37.5,4.57],[78.202,37.5,4.57],[79.805,37.5,4.57],[81.407,37.5,4.57],[83.01,37.5,4.57],[84.613,37.5,4.57],[86.216,37.5,4.57],[87.819,37.5,4.57],[89.421,37.5,4.57],[91.024,37.5,4.57],[92.627,37.5,4.57],[94.23,37.5,4.57],[95.833,37.5,4.57],[97.435,37.5,4.57],[99.038,37.5,4.57],[100.64,37.5,4.57],[102.24,37.5,4.57],[103.85,37.5,4.57],[105.45,37.5,4.57],[107.05,37.5,4.57],[108.66,37.5,4.57],[110.26,37.5,4.57],[111.86,37.5,4.57],[113.46,37.5,4.57],[115.07,37.5,4.57],[116.67,37.5,4.57],[118.27,37.5,4.57],[119.87,37.5,4.57],[121.48,37.5,4.57],[123.08,37.5,4.57],[124.68,37.5,4.57],[126.29,37.5,4.57],[127.89,37.5,4.57],[129.49,37.5,4.57],[131.09,37.5,4.57],[132.7,37.5,4.57],[134.3,37.5,4.57],[70.188,37.5,5.713],[71.791,37.5,5.713],[73.393,37.5,5.713],[74.996,37.5,5.713],[76.599,37.5,5.713],[78.202,37.5,5.713],[79.805,37.5,5.713],[81.407,37.5,5.713],[83.01,37.5,5.713],[84.613,37.5,5.713],[86.216,37.5,5.713],[87.819,37.5,5.713],[89.421,37.5,5.713],[91.024,37.5,5.713],[92.627,37.5,5.713],[94.23,37.5,5.713],[95.833,37.5,5.713],[97.435,37.5,5.713],[99.038,37.5,5.713],[100.64,37.5,5.713],[102.24,37.5,5.713],[103.85,37.5,5.713],[105.45,37.5,5.713],[107.05,37.5,5.713],[108.66,37.5,5.713],[110.26,37.5,5.713],[111.86,37.5,5.713],[113.46,37.5,5.713],[115.07,37.5,5.713],[116.67,37.5,5.713],[118.27,37.5,5.713],[119.87,37.5,5.713],[121.48,37.5,5.713],[123.08,37.5,5.713],[124.68,37.5,5.713],[126.29,37.5,5.713],[127.89,37.5,5.713],[129.49,37.5,5.713],[131.09,37.5,5.713],[132.7,37.5,5.713],[134.3,37.5,5.713],[70.188,37.5,6.856],[71.791,37.5,6.856],[73.393,37.5,6.856],[74.996,37.5,6.856],[76.599,37.5,6.856],[78.202,37.5,6.856],[79.805,37.5,6.856],[81.407,37.5,6.856],[83.01,37.5,6.856],[84.613,37.5,6.856],[86.216,37.5,6.856],[87.819,37.5,6.856],[89.421,37.5,6.856],[91.024,37.5,6.856],[92.627,37.5,6.856],[94.23,37.5,6.856],[95.833,37.5,6.856],[97.435,37.5,6.856],[99.038,37.5,6.856],[100.64,37.5,6.856],[102.24,37.5,6.856],[103.85,37.5,6.856],[105.45,37.5,6.856],[107.05,37.5,6.856],[108.66,37.5,6.856],[110.26,37.5,6.856],[111.86,37.5,6.856],[113.46,37.5,6.856],[115.07,37.5,6.856],[116.67,37.5,6.856],[118.27,37.5,6.856],[119.87,37.5,6.856],[121.48,37.5,6.856],[123.08,37.5,6.856],[124.68,37.5,6.856],[126.29,37.5,6.856],[127.89,37.5,6.856],[129.49,37.5,6.856],[131.09,37.5,6.856],[132.7,37.5,6.856],[134.3,37.5,6.856],[70.188,37.5,7.999],[71.791,37.5,7.999],[73.393,37.5,7.999],[74.996,37.5,7.999],[76.599,37.5,7.999],[78.202,37.5,7.999],[79.805,37.5,7.999],[81.407,37.5,7.999],[83.01,37.5,7.999],[84.613,37.5,7.999],[86.216,37.5,7.999],[87.819,37.5,7.999],[89.421,37.5,7.999],[91.024,37.5,7.999],[92.627,37.5,7.999],[94.23,37.5,7.999],[95.833,37.5,7.999],[97.435,37.5,7.999],[99.038,37.5,7.999],[100.64,37.5,7.999],[102.24,37.5,7.999],[103.85,37.5,7.999],[105.45,37.5,7.999],[107.05,37.5,7.999],[108.66,37.5,7.999],[110.26,37.5,7.999],[111.86,37.5,7.999],[113.46,37.5,7.999],[115.07,37.5,7.999],[116.67,37.5,7.999],[118.27,37.5,7.999],[119.87,37.5,7.999],[121.48,37.5,7.999],[123.08,37.5,7.999],[124.68,37.5,7.999],[126.29,37.5,7.999],[127.89,37.5,7.999],[129.49,37.5,7.999],[131.09,37.5,7.999],[132.7,37.5,7.999],[134.3,37.5,7.999],[70.188,37.5,9.142],[71.791,37.5,9.142],[73.393,37.5,9.142],[74.996,37.5,9.142],[76.599,37.5,9.142],[78.202,37.5,9.142],[79.805,37.5,9.142],[81.407,37.5,9.142],[83.01,37.5,9.142],[84.613,37.5,9.142],[86.216,37.5,9.142],[87.819,37.5,9.142],[89.421,37.5,9.142],[91.024,37.5,9.142],[92.627,37.5,9.142],[94.23,37.5,9.142],[95.833,37.5,9.142],[97.435,37.5,9.142],[99.038,37.5,9.142],[100.64,37.5,9.142],[102.24,37.5,9.142],[103.85,37.5,9.142],[105.45,37.5,9.142],[107.05,37.5,9.142],[108.66,37.5,9.142],[110.26,37.5,9.142],[111.86,37.5,9.142],[113.46,37.5,9.142],[115.07,37.5,9.142],[116.67,37.5,9.142],[118.27,37.5,9.142],[119.87,37.5,9.142],[121.48,37.5,9.142],[123.08,37.5,9.142],[124.68,37.5,9.142],[126.29,37.5,9.142],[127.89,37.5,9.142],[129.49,37.5,9.142],[131.09,37.5,9.142],[132.7,37.5,9.142],[134.3,37.5,9.142],[70.188,37.5,10.285],[71.791,37.5,10.285],[73.393,37.5,10.285],[74.996,37.5,10.285],[76.599,37.5,10.285],[78.202,37.5,10.285],[79.805,37.5,10.285],[81.407,37.5,10.285],[83.01,37.5,10.285],[84.613,37.5,10.285],[86.216,37.5,10.285],[87.819,37.5,10.285],[89.421,37.5,10.285],[91.024,37.5,10.285],[92.627,37.5,10.285],[94.23,37.5,10.285],[95.833,37.5,10.285],[97.435,37.5,10.285],[99.038,37.5,10.285],[100.64,37.5,10.285],[102.24,37.5,10.285],[103.85,37.5,10.285],[105.45,37.5,10.285],[107.05,37.5,10.285],[108.66,37.5,10.285],[110.26,37.5,10.285],[111.86,37.5,10.285],[113.46,37.5,10.285],[115.07,37.5,10.285],[116.67,37.5,10.285],[118.27,37.5,10.285],[119.87,37.5,10.285],[121.48,37.5,10.285],[123.08,37.5,10.285],[124.68,37.5,10.285],[126.29,37.5,10.285],[127.89,37.5,10.285],[129.49,37.5,10.285],[131.09,37.5,10.285],[132.7,37.5,10.285],[134.3,37.5,10.285],[70.188,37.5,11.428],[71.791,37.5,11.428],[73.393,37.5,11.428],[74.996,37.5,11.428],[76.599,37.5,11.428],[78.202,37.5,11.428],[79.805,37.5,11.428],[81.407,37.5,11.428],[83.01,37.5,11.428],[84.613,37.5,11.428],[86.216,37.5,11.428],[87.819,37.5,11.428],[89.421,37.5,11.428],[91.024,37.5,11.428],[92.627,37.5,11.428],[94.23,37.5,11.428],[95.833,37.5,11.428],[97.435,37.5,11.428],[99.038,37.5,11.428],[100.64,37.5,11.428],[102.24,37.5,11.428],[103.85,37.5,11.428],[105.45,37.5,11.428],[107.05,37.5,11.428],[108.66,37.5,11.428],[110.26,37.5,11.428],[111.86,37.5,11.428],[113.46,37.5,11.428],[115.07,37.5,11.428],[116.67,37.5,11.428],[118.27,37.5,11.428],[119.87,37.5,11.428],[121.48,37.5,11.428],[123.08,37.5,11.428],[124.68,37.5,11.428],[126.29,37.5,11.428],[127.89,37.5,11.428],[129.49,37.5,11.428],[131.09,37.5,11.428],[132.7,37.5,11.428],[134.3,37.5,11.428],[70.188,37.5,12.571],[71.791,37.5,12.571],[73.393,37.5,12.571],[74.996,37.5,12.571],[76.599,37.5,12.571],[78.202,37.5,12.571],[79.805,37.5,12.571],[81.407,37.5,12.571],[83.01,37.5,12.571],[84.613,37.5,12.571],[86.216,37.5,12.571],[87.819,37.5,12.571],[89.421,37.5,12.571],[91.024,37.5,12.571],[92.627,37.5,12.571],[94.23,37.5,12.571],[95.833,37.5,12.571],[97.435,37.5,12.571],[99.038,37.5,12.571],[100.64,37.5,12.571],[102.24,37.5,12.571],[103.85,37.5,12.571],[105.45,37.5,12.571],[107.05,37.5,12.571],[108.66,37.5,12.571],[110.26,37.5,12.571],[111.86,37.5,12.571],[113.46,37.5,12.571],[115.07,37.5,12.571],[116.67,37.5,12.571],[118.27,37.5,12.571],[119.87,37.5,12.571],[121.48,37.5,12.571],[123.08,37.5,12.571],[124.68,37.5,12.571],[126.29,37.5,12.571],[127.89,37.5,12.571],[129.49,37.5,12.571],[131.09,37.5,12.571],[132.7,37.5,12.571],[134.3,37.5,12.571],[70.188,37.5,13.714],[71.791,37.5,13.714],[73.393,37.5,13.714],[74.996,37.5,13.714],[76.599,37.5,13.714],[78.202,37.5,13.714],[79.805,37.5,13.714],[81.407,37.5,13.714],[83.01,37.5,13.714],[84.613,37.5,13.714],[86.216,37.5,13.714],[87.819,37.5,13.714],[89.421,37.5,13.714],[91.024,37.5,13.714],[92.627,37.5,13.714],[94.23,37.5,13.714],[95.833,37.5,13.714],[97.435,37.5,13.714],[99.038,37.5,13.714],[100.64,37.5,13.714],[102.24,37.5,13.714],[103.85,37.5,13.714],[105.45,37.5,13.714],[107.05,37.5,13.714],[108.66,37.5,13.714],[110.26,37.5,13.714],[111.86,37.5,13.714],[113.46,37.5,13.714],[115.07,37.5,13.714],[116.67,37.5,13.714],[118.27,37.5,13.714],[119.87,37.5,13.714],[121.48,37.5,13.714],[123.08,37.5,13.714],[124.68,37.5,13.714],[126.29,37.5,13.714],[127.89,37.5,13.714],[129.49,37.5,13.714],[131.09,37.5,13.714],[132.7,37.5,13.714],[134.3,37.5,13.714],[70.188,37.5,14.857],[71.791,37.5,14.857],[73.393,37.5,14.857],[74.996,37.5,14.857],[76.599,37.5,14.857],[78.202,37.5,14.857],[79.805,37.5,14.857],[81.407,37.5,14.857],[83.01,37.5,14.857],[84.613,37.5,14.857],[86.216,37.5,14.857],[87.819,37.5,14.857],[89.421,37.5,14.857],[91.024,37.5,14.857],[92.627,37.5,14.857],[94.23,37.5,14.857],[95.833,37.5,14.857],[97.435,37.5,14.857],[99.038,37.5,14.857],[100.64,37.5,14.857],[102.24,37.5,14.857],[103.85,37.5,14.857],[105.45,37.5,14.857],[107.05,37.5,14.857],[108.66,37.5,14.857],[110.26,37.5,14.857],[111.86,37.5,14.857],[113.46,37.5,14.857],[115.07,37.5,14.857],[116.67,37.5,14.857],[118.27,37.5,14.857],[119.87,37.5,14.857],[121.48,37.5,14.857],[123.08,37.5,14.857],[124.68,37.5,14.857],[126.29,37.5,14.857],[127.89,37.5,14.857],[129.49,37.5,14.857],[131.09,37.5,14.857],[132.7,37.5,14.857],[134.3,37.5,14.857],[70.188,37.5,16],[71.791,37.5,16],[73.393,37.5,16],[74.996,37.5,16],[76.599,37.5,16],[78.202,37.5,16],[79.805,37.5,16],[81.407,37.5,16],[83.01,37.5,16],[84.613,37.5,16],[86.216,37.5,16],[87.819,37.5,16],[89.421,37.5,16],[91.024,37.5,16],[92.627,37.5,16],[94.23,37.5,16],[95.833,37.5,16],[97.435,37.5,16],[99.038,37.5,16],[100.64,37.5,16],[102.24,37.5,16],[103.85,37.5,16],[105.45,37.5,16],[107.05,37.5,16],[108.66,37.5,16],[110.26,37.5,16],[111.86,37.5,16],[113.46,37.5,16],[115.07,37.5,16],[116.67,37.5,16],[118.27,37.5,16],[119.87,37.5,16],[121.48,37.5,16],[123.08,37.5,16],[124.68,37.5,16],[126.29,37.5,16],[127.89,37.5,16],[129.49,37.5,16],[131.09,37.5,16],[132.7,37.5,16],[134.3,37.5,16],[70.188,38.75,-0.002],[71.791,38.75,-0.002],[73.393,38.75,-0.002],[74.996,38.75,-0.002],[76.599,38.75,-0.002],[78.202,38.75,-0.002],[79.805,38.75,-0.002],[81.407,38.75,-0.002],[83.01,38.75,-0.002],[84.613,38.75,-0.002],[86.216,38.75,-0.002],[87.819,38.75,-0.002],[89.421,38.75,-0.002],[91.024,38.75,-0.002],[92.627,38.75,-0.002],[94.23,38.75,-0.002],[95.833,38.75,-0.002],[97.435,38.75,-0.002],[99.038,38.75,-0.002],[100.64,38.75,-0.002],[102.24,38.75,-0.002],[103.85,38.75,-0.002],[105.45,38.75,-0.002],[107.05,38.75,-0.002],[108.66,38.75,-0.002],[110.26,38.75,-0.002],[111.86,38.75,-0.002],[113.46,38.75,-0.002],[115.07,38.75,-0.002],[116.67,38.75,-0.002],[118.27,38.75,-0.002],[119.87,38.75,-0.002],[121.48,38.75,-0.002],[123.08,38.75,-0.002],[124.68,38.75,-0.002],[126.29,38.75,-0.002],[127.89,38.75,-0.002],[129.49,38.75,-0.002],[131.09,38.75,-0.002],[132.7,38.75,-0.002],[134.3,38.75,-0.002],[70.188,38.75,1.141],[71.791,38.75,1.141],[73.393,38.75,1.141],[74.996,38.75,1.141],[76.599,38.75,1.141],[78.202,38.75,1.141],[79.805,38.75,1.141],[81.407,38.75,1.141],[83.01,38.75,1.141],[84.613,38.75,1.141],[86.216,38.75,1.141],[87.819,38.75,1.141],[89.421,38.75,1.141],[91.024,38.75,1.141],[92.627,38.75,1.141],[94.23,38.75,1.141],[95.833,38.75,1.141],[97.435,38.75,1.141],[99.038,38.75,1.141],[100.64,38.75,1.141],[102.24,38.75,1.141],[103.85,38.75,1.141],[105.45,38.75,1.141],[107.05,38.75,1.141],[108.66,38.75,1.141],[110.26,38.75,1.141],[111.86,38.75,1.141],[113.46,38.75,1.141],[115.07,38.75,1.141],[116.67,38.75,1.141],[118.27,38.75,1.141],[119.87,38.75,1.141],[121.48,38.75,1.141],[123.08,38.75,1.141],[124.68,38.75,1.141],[126.29,38.75,1.141],[127.89,38.75,1.141],[129.49,38.75,1.141],[131.09,38.75,1.141],[132.7,38.75,1.141],[134.3,38.75,1.141],[70.188,38.75,2.284],[71.791,38.75,2.284],[73.393,38.75,2.284],[74.996,38.75,2.284],[76.599,38.75,2.284],[78.202,38.75,2.284],[79.805,38.75,2.284],[81.407,38.75,2.284],[83.01,38.75,2.284],[84.613,38.75,2.284],[86.216,38.75,2.284],[87.819,38.75,2.284],[89.421,38.75,2.284],[91.024,38.75,2.284],[92.627,38.75,2.284],[94.23,38.75,2.284],[95.833,38.75,2.284],[97.435,38.75,2.284],[99.038,38.75,2.284],[100.64,38.75,2.284],[102.24,38.75,2.284],[103.85,38.75,2.284],[105.45,38.75,2.284],[107.05,38.75,2.284],[108.66,38.75,2.284],[110.26,38.75,2.284],[111.86,38.75,2.284],[113.46,38.75,2.284],[115.07,38.75,2.284],[116.67,38.75,2.284],[118.27,38.75,2.284],[119.87,38.75,2.284],[121.48,38.75,2.284],[123.08,38.75,2.284],[124.68,38.75,2.284],[126.29,38.75,2.284],[127.89,38.75,2.284],[129.49,38.75,2.284],[131.09,38.75,2.284],[132.7,38.75,2.284],[134.3,38.75,2.284],[70.188,38.75,3.427],[71.791,38.75,3.427],[73.393,38.75,3.427],[74.996,38.75,3.427],[76.599,38.75,3.427],[78.202,38.75,3.427],[79.805,38.75,3.427],[81.407,38.75,3.427],[83.01,38.75,3.427],[84.613,38.75,3.427],[86.216,38.75,3.427],[87.819,38.75,3.427],[89.421,38.75,3.427],[91.024,38.75,3.427],[92.627,38.75,3.427],[94.23,38.75,3.427],[95.833,38.75,3.427],[97.435,38.75,3.427],[99.038,38.75,3.427],[100.64,38.75,3.427],[102.24,38.75,3.427],[103.85,38.75,3.427],[105.45,38.75,3.427],[107.05,38.75,3.427],[108.66,38.75,3.427],[110.26,38.75,3.427],[111.86,38.75,3.427],[113.46,38.75,3.427],[115.07,38.75,3.427],[116.67,38.75,3.427],[118.27,38.75,3.427],[119.87,38.75,3.427],[121.48,38.75,3.427],[123.08,38.75,3.427],[124.68,38.75,3.427],[126.29,38.75,3.427],[127.89,38.75,3.427],[129.49,38.75,3.427],[131.09,38.75,3.427],[132.7,38.75,3.427],[134.3,38.75,3.427],[70.188,38.75,4.57],[71.791,38.75,4.57],[73.393,38.75,4.57],[74.996,38.75,4.57],[76.599,38.75,4.57],[78.202,38.75,4.57],[79.805,38.75,4.57],[81.407,38.75,4.57],[83.01,38.75,4.57],[84.613,38.75,4.57],[86.216,38.75,4.57],[87.819,38.75,4.57],[89.421,38.75,4.57],[91.024,38.75,4.57],[92.627,38.75,4.57],[94.23,38.75,4.57],[95.833,38.75,4.57],[97.435,38.75,4.57],[99.038,38.75,4.57],[100.64,38.75,4.57],[102.24,38.75,4.57],[103.85,38.75,4.57],[105.45,38.75,4.57],[107.05,38.75,4.57],[108.66,38.75,4.57],[110.26,38.75,4.57],[111.86,38.75,4.57],[113.46,38.75,4.57],[115.07,38.75,4.57],[116.67,38.75,4.57],[118.27,38.75,4.57],[119.87,38.75,4.57],[121.48,38.75,4.57],[123.08,38.75,4.57],[124.68,38.75,4.57],[126.29,38.75,4.57],[127.89,38.75,4.57],[129.49,38.75,4.57],[131.09,38.75,4.57],[132.7,38.75,4.57],[134.3,38.75,4.57],[70.188,38.75,5.713],[71.791,38.75,5.713],[73.393,38.75,5.713],[74.996,38.75,5.713],[76.599,38.75,5.713],[78.202,38.75,5.713],[79.805,38.75,5.713],[81.407,38.75,5.713],[83.01,38.75,5.713],[84.613,38.75,5.713],[86.216,38.75,5.713],[87.819,38.75,5.713],[89.421,38.75,5.713],[91.024,38.75,5.713],[92.627,38.75,5.713],[94.23,38.75,5.713],[95.833,38.75,5.713],[97.435,38.75,5.713],[99.038,38.75,5.713],[100.64,38.75,5.713],[102.24,38.75,5.713],[103.85,38.75,5.713],[105.45,38.75,5.713],[107.05,38.75,5.713],[108.66,38.75,5.713],[110.26,38.75,5.713],[111.86,38.75,5.713],[113.46,38.75,5.713],[115.07,38.75,5.713],[116.67,38.75,5.713],[118.27,38.75,5.713],[119.87,38.75,5.713],[121.48,38.75,5.713],[123.08,38.75,5.713],[124.68,38.75,5.713],[126.29,38.75,5.713],[127.89,38.75,5.713],[129.49,38.75,5.713],[131.09,38.75,5.713],[132.7,38.75,5.713],[134.3,38.75,5.713],[70.188,38.75,6.856],[71.791,38.75,6.856],[73.393,38.75,6.856],[74.996,38.75,6.856],[76.599,38.75,6.856],[78.202,38.75,6.856],[79.805,38.75,6.856],[81.407,38.75,6.856],[83.01,38.75,6.856],[84.613,38.75,6.856],[86.216,38.75,6.856],[87.819,38.75,6.856],[89.421,38.75,6.856],[91.024,38.75,6.856],[92.627,38.75,6.856],[94.23,38.75,6.856],[95.833,38.75,6.856],[97.435,38.75,6.856],[99.038,38.75,6.856],[100.64,38.75,6.856],[102.24,38.75,6.856],[103.85,38.75,6.856],[105.45,38.75,6.856],[107.05,38.75,6.856],[108.66,38.75,6.856],[110.26,38.75,6.856],[111.86,38.75,6.856],[113.46,38.75,6.856],[115.07,38.75,6.856],[116.67,38.75,6.856],[118.27,38.75,6.856],[119.87,38.75,6.856],[121.48,38.75,6.856],[123.08,38.75,6.856],[124.68,38.75,6.856],[126.29,38.75,6.856],[127.89,38.75,6.856],[129.49,38.75,6.856],[131.09,38.75,6.856],[132.7,38.75,6.856],[134.3,38.75,6.856],[70.188,38.75,7.999],[71.791,38.75,7.999],[73.393,38.75,7.999],[74.996,38.75,7.999],[76.599,38.75,7.999],[78.202,38.75,7.999],[79.805,38.75,7.999],[81.407,38.75,7.999],[83.01,38.75,7.999],[84.613,38.75,7.999],[86.216,38.75,7.999],[87.819,38.75,7.999],[89.421,38.75,7.999],[91.024,38.75,7.999],[92.627,38.75,7.999],[94.23,38.75,7.999],[95.833,38.75,7.999],[97.435,38.75,7.999],[99.038,38.75,7.999],[100.64,38.75,7.999],[102.24,38.75,7.999],[103.85,38.75,7.999],[105.45,38.75,7.999],[107.05,38.75,7.999],[108.66,38.75,7.999],[110.26,38.75,7.999],[111.86,38.75,7.999],[113.46,38.75,7.999],[115.07,38.75,7.999],[116.67,38.75,7.999],[118.27,38.75,7.999],[119.87,38.75,7.999],[121.48,38.75,7.999],[123.08,38.75,7.999],[124.68,38.75,7.999],[126.29,38.75,7.999],[127.89,38.75,7.999],[129.49,38.75,7.999],[131.09,38.75,7.999],[132.7,38.75,7.999],[134.3,38.75,7.999],[70.188,38.75,9.142],[71.791,38.75,9.142],[73.393,38.75,9.142],[74.996,38.75,9.142],[76.599,38.75,9.142],[78.202,38.75,9.142],[79.805,38.75,9.142],[81.407,38.75,9.142],[83.01,38.75,9.142],[84.613,38.75,9.142],[86.216,38.75,9.142],[87.819,38.75,9.142],[89.421,38.75,9.142],[91.024,38.75,9.142],[92.627,38.75,9.142],[94.23,38.75,9.142],[95.833,38.75,9.142],[97.435,38.75,9.142],[99.038,38.75,9.142],[100.64,38.75,9.142],[102.24,38.75,9.142],[103.85,38.75,9.142],[105.45,38.75,9.142],[107.05,38.75,9.142],[108.66,38.75,9.142],[110.26,38.75,9.142],[111.86,38.75,9.142],[113.46,38.75,9.142],[115.07,38.75,9.142],[116.67,38.75,9.142],[118.27,38.75,9.142],[119.87,38.75,9.142],[121.48,38.75,9.142],[123.08,38.75,9.142],[124.68,38.75,9.142],[126.29,38.75,9.142],[127.89,38.75,9.142],[129.49,38.75,9.142],[131.09,38.75,9.142],[132.7,38.75,9.142],[134.3,38.75,9.142],[70.188,38.75,10.285],[71.791,38.75,10.285],[73.393,38.75,10.285],[74.996,38.75,10.285],[76.599,38.75,10.285],[78.202,38.75,10.285],[79.805,38.75,10.285],[81.407,38.75,10.285],[83.01,38.75,10.285],[84.613,38.75,10.285],[86.216,38.75,10.285],[87.819,38.75,10.285],[89.421,38.75,10.285],[91.024,38.75,10.285],[92.627,38.75,10.285],[94.23,38.75,10.285],[95.833,38.75,10.285],[97.435,38.75,10.285],[99.038,38.75,10.285],[100.64,38.75,10.285],[102.24,38.75,10.285],[103.85,38.75,10.285],[105.45,38.75,10.285],[107.05,38.75,10.285],[108.66,38.75,10.285],[110.26,38.75,10.285],[111.86,38.75,10.285],[113.46,38.75,10.285],[115.07,38.75,10.285],[116.67,38.75,10.285],[118.27,38.75,10.285],[119.87,38.75,10.285],[121.48,38.75,10.285],[123.08,38.75,10.285],[124.68,38.75,10.285],[126.29,38.75,10.285],[127.89,38.75,10.285],[129.49,38.75,10.285],[131.09,38.75,10.285],[132.7,38.75,10.285],[134.3,38.75,10.285],[70.188,38.75,11.428],[71.791,38.75,11.428],[73.393,38.75,11.428],[74.996,38.75,11.428],[76.599,38.75,11.428],[78.202,38.75,11.428],[79.805,38.75,11.428],[81.407,38.75,11.428],[83.01,38.75,11.428],[84.613,38.75,11.428],[86.216,38.75,11.428],[87.819,38.75,11.428],[89.421,38.75,11.428],[91.024,38.75,11.428],[92.627,38.75,11.428],[94.23,38.75,11.428],[95.833,38.75,11.428],[97.435,38.75,11.428],[99.038,38.75,11.428],[100.64,38.75,11.428],[102.24,38.75,11.428],[103.85,38.75,11.428],[105.45,38.75,11.428],[107.05,38.75,11.428],[108.66,38.75,11.428],[110.26,38.75,11.428],[111.86,38.75,11.428],[113.46,38.75,11.428],[115.07,38.75,11.428],[116.67,38.75,11.428],[118.27,38.75,11.428],[119.87,38.75,11.428],[121.48,38.75,11.428],[123.08,38.75,11.428],[124.68,38.75,11.428],[126.29,38.75,11.428],[127.89,38.75,11.428],[129.49,38.75,11.428],[131.09,38.75,11.428],[132.7,38.75,11.428],[134.3,38.75,11.428],[70.188,38.75,12.571],[71.791,38.75,12.571],[73.393,38.75,12.571],[74.996,38.75,12.571],[76.599,38.75,12.571],[78.202,38.75,12.571],[79.805,38.75,12.571],[81.407,38.75,12.571],[83.01,38.75,12.571],[84.613,38.75,12.571],[86.216,38.75,12.571],[87.819,38.75,12.571],[89.421,38.75,12.571],[91.024,38.75,12.571],[92.627,38.75,12.571],[94.23,38.75,12.571],[95.833,38.75,12.571],[97.435,38.75,12.571],[99.038,38.75,12.571],[100.64,38.75,12.571],[102.24,38.75,12.571],[103.85,38.75,12.571],[105.45,38.75,12.571],[107.05,38.75,12.571],[108.66,38.75,12.571],[110.26,38.75,12.571],[111.86,38.75,12.571],[113.46,38.75,12.571],[115.07,38.75,12.571],[116.67,38.75,12.571],[118.27,38.75,12.571],[119.87,38.75,12.571],[121.48,38.75,12.571],[123.08,38.75,12.571],[124.68,38.75,12.571],[126.29,38.75,12.571],[127.89,38.75,12.571],[129.49,38.75,12.571],[131.09,38.75,12.571],[132.7,38.75,12.571],[134.3,38.75,12.571],[70.188,38.75,13.714],[71.791,38.75,13.714],[73.393,38.75,13.714],[74.996,38.75,13.714],[76.599,38.75,13.714],[78.202,38.75,13.714],[79.805,38.75,13.714],[81.407,38.75,13.714],[83.01,38.75,13.714],[84.613,38.75,13.714],[86.216,38.75,13.714],[87.819,38.75,13.714],[89.421,38.75,13.714],[91.024,38.75,13.714],[92.627,38.75,13.714],[94.23,38.75,13.714],[95.833,38.75,13.714],[97.435,38.75,13.714],[99.038,38.75,13.714],[100.64,38.75,13.714],[102.24,38.75,13.714],[103.85,38.75,13.714],[105.45,38.75,13.714],[107.05,38.75,13.714],[108.66,38.75,13.714],[110.26,38.75,13.714],[111.86,38.75,13.714],[113.46,38.75,13.714],[115.07,38.75,13.714],[116.67,38.75,13.714],[118.27,38.75,13.714],[119.87,38.75,13.714],[121.48,38.75,13.714],[123.08,38.75,13.714],[124.68,38.75,13.714],[126.29,38.75,13.714],[127.89,38.75,13.714],[129.49,38.75,13.714],[131.09,38.75,13.714],[132.7,38.75,13.714],[134.3,38.75,13.714],[70.188,38.75,14.857],[71.791,38.75,14.857],[73.393,38.75,14.857],[74.996,38.75,14.857],[76.599,38.75,14.857],[78.202,38.75,14.857],[79.805,38.75,14.857],[81.407,38.75,14.857],[83.01,38.75,14.857],[84.613,38.75,14.857],[86.216,38.75,14.857],[87.819,38.75,14.857],[89.421,38.75,14.857],[91.024,38.75,14.857],[92.627,38.75,14.857],[94.23,38.75,14.857],[95.833,38.75,14.857],[97.435,38.75,14.857],[99.038,38.75,14.857],[100.64,38.75,14.857],[102.24,38.75,14.857],[103.85,38.75,14.857],[105.45,38.75,14.857],[107.05,38.75,14.857],[108.66,38.75,14.857],[110.26,38.75,14.857],[111.86,38.75,14.857],[113.46,38.75,14.857],[115.07,38.75,14.857],[116.67,38.75,14.857],[118.27,38.75,14.857],[119.87,38.75,14.857],[121.48,38.75,14.857],[123.08,38.75,14.857],[124.68,38.75,14.857],[126.29,38.75,14.857],[127.89,38.75,14.857],[129.49,38.75,14.857],[131.09,38.75,14.857],[132.7,38.75,14.857],[134.3,38.75,14.857],[70.188,38.75,16],[71.791,38.75,16],[73.393,38.75,16],[74.996,38.75,16],[76.599,38.75,16],[78.202,38.75,16],[79.805,38.75,16],[81.407,38.75,16],[83.01,38.75,16],[84.613,38.75,16],[86.216,38.75,16],[87.819,38.75,16],[89.421,38.75,16],[91.024,38.75,16],[92.627,38.75,16],[94.23,38.75,16],[95.833,38.75,16],[97.435,38.75,16],[99.038,38.75,16],[100.64,38.75,16],[102.24,38.75,16],[103.85,38.75,16],[105.45,38.75,16],[107.05,38.75,16],[108.66,38.75,16],[110.26,38.75,16],[111.86,38.75,16],[113.46,38.75,16],[115.07,38.75,16],[116.67,38.75,16],[118.27,38.75,16],[119.87,38.75,16],[121.48,38.75,16],[123.08,38.75,16],[124.68,38.75,16],[126.29,38.75,16],[127.89,38.75,16],[129.49,38.75,16],[131.09,38.75,16],[132.7,38.75,16],[134.3,38.75,16],[70.188,40,-0.002],[71.791,40,-0.002],[73.393,40,-0.002],[74.996,40,-0.002],[76.599,40,-0.002],[78.202,40,-0.002],[79.805,40,-0.002],[81.407,40,-0.002],[83.01,40,-0.002],[84.613,40,-0.002],[86.216,40,-0.002],[87.819,40,-0.002],[89.421,40,-0.002],[91.024,40,-0.002],[92.627,40,-0.002],[94.23,40,-0.002],[95.833,40,-0.002],[97.435,40,-0.002],[99.038,40,-0.002],[100.64,40,-0.002],[102.24,40,-0.002],[103.85,40,-0.002],[105.45,40,-0.002],[107.05,40,-0.002],[108.66,40,-0.002],[110.26,40,-0.002],[111.86,40,-0.002],[113.46,40,-0.002],[115.07,40,-0.002],[116.67,40,-0.002],[118.27,40,-0.002],[119.87,40,-0.002],[121.48,40,-0.002],[123.08,40,-0.002],[124.68,40,-0.002],[126.29,40,-0.002],[127.89,40,-0.002],[129.49,40,-0.002],[131.09,40,-0.002],[132.7,40,-0.002],[134.3,40,-0.002],[70.188,40,1.141],[71.791,40,1.141],[73.393,40,1.141],[74.996,40,1.141],[76.599,40,1.141],[78.202,40,1.141],[79.805,40,1.141],[81.407,40,1.141],[83.01,40,1.141],[84.613,40,1.141],[86.216,40,1.141],[87.819,40,1.141],[89.421,40,1.141],[91.024,40,1.141],[92.627,40,1.141],[94.23,40,1.141],[95.833,40,1.141],[97.435,40,1.141],[99.038,40,1.141],[100.64,40,1.141],[102.24,40,1.141],[103.85,40,1.141],[105.45,40,1.141],[107.05,40,1.141],[108.66,40,1.141],[110.26,40,1.141],[111.86,40,1.141],[113.46,40,1.141],[115.07,40,1.141],[116.67,40,1.141],[118.27,40,1.141],[119.87,40,1.141],[121.48,40,1.141],[123.08,40,1.141],[124.68,40,1.141],[126.29,40,1.141],[127.89,40,1.141],[129.49,40,1.141],[131.09,40,1.141],[132.7,40,1.141],[134.3,40,1.141],[70.188,40,2.284],[71.791,40,2.284],[73.393,40,2.284],[74.996,40,2.284],[76.599,40,2.284],[78.202,40,2.284],[79.805,40,2.284],[81.407,40,2.284],[83.01,40,2.284],[84.613,40,2.284],[86.216,40,2.284],[87.819,40,2.284],[89.421,40,2.284],[91.024,40,2.284],[92.627,40,2.284],[94.23,40,2.284],[95.833,40,2.284],[97.435,40,2.284],[99.038,40,2.284],[100.64,40,2.284],[102.24,40,2.284],[103.85,40,2.284],[105.45,40,2.284],[107.05,40,2.284],[108.66,40,2.284],[110.26,40,2.284],[111.86,40,2.284],[113.46,40,2.284],[115.07,40,2.284],[116.67,40,2.284],[118.27,40,2.284],[119.87,40,2.284],[121.48,40,2.284],[123.08,40,2.284],[124.68,40,2.284],[126.29,40,2.284],[127.89,40,2.284],[129.49,40,2.284],[131.09,40,2.284],[132.7,40,2.284],[134.3,40,2.284],[70.188,40,3.427],[71.791,40,3.427],[73.393,40,3.427],[74.996,40,3.427],[76.599,40,3.427],[78.202,40,3.427],[79.805,40,3.427],[81.407,40,3.427],[83.01,40,3.427],[84.613,40,3.427],[86.216,40,3.427],[87.819,40,3.427],[89.421,40,3.427],[91.024,40,3.427],[92.627,40,3.427],[94.23,40,3.427],[95.833,40,3.427],[97.435,40,3.427],[99.038,40,3.427],[100.64,40,3.427],[102.24,40,3.427],[103.85,40,3.427],[105.45,40,3.427],[107.05,40,3.427],[108.66,40,3.427],[110.26,40,3.427],[111.86,40,3.427],[113.46,40,3.427],[115.07,40,3.427],[116.67,40,3.427],[118.27,40,3.427],[119.87,40,3.427],[121.48,40,3.427],[123.08,40,3.427],[124.68,40,3.427],[126.29,40,3.427],[127.89,40,3.427],[129.49,40,3.427],[131.09,40,3.427],[132.7,40,3.427],[134.3,40,3.427],[70.188,40,4.57],[71.791,40,4.57],[73.393,40,4.57],[74.996,40,4.57],[76.599,40,4.57],[78.202,40,4.57],[79.805,40,4.57],[81.407,40,4.57],[83.01,40,4.57],[84.613,40,4.57],[86.216,40,4.57],[87.819,40,4.57],[89.421,40,4.57],[91.024,40,4.57],[92.627,40,4.57],[94.23,40,4.57],[95.833,40,4.57],[97.435,40,4.57],[99.038,40,4.57],[100.64,40,4.57],[102.24,40,4.57],[103.85,40,4.57],[105.45,40,4.57],[107.05,40,4.57],[108.66,40,4.57],[110.26,40,4.57],[111.86,40,4.57],[113.46,40,4.57],[115.07,40,4.57],[116.67,40,4.57],[118.27,40,4.57],[119.87,40,4.57],[121.48,40,4.57],[123.08,40,4.57],[124.68,40,4.57],[126.29,40,4.57],[127.89,40,4.57],[129.49,40,4.57],[131.09,40,4.57],[132.7,40,4.57],[134.3,40,4.57],[70.188,40,5.713],[71.791,40,5.713],[73.393,40,5.713],[74.996,40,5.713],[76.599,40,5.713],[78.202,40,5.713],[79.805,40,5.713],[81.407,40,5.713],[83.01,40,5.713],[84.613,40,5.713],[86.216,40,5.713],[87.819,40,5.713],[89.421,40,5.713],[91.024,40,5.713],[92.627,40,5.713],[94.23,40,5.713],[95.833,40,5.713],[97.435,40,5.713],[99.038,40,5.713],[100.64,40,5.713],[102.24,40,5.713],[103.85,40,5.713],[105.45,40,5.713],[107.05,40,5.713],[108.66,40,5.713],[110.26,40,5.713],[111.86,40,5.713],[113.46,40,5.713],[115.07,40,5.713],[116.67,40,5.713],[118.27,40,5.713],[119.87,40,5.713],[121.48,40,5.713],[123.08,40,5.713],[124.68,40,5.713],[126.29,40,5.713],[127.89,40,5.713],[129.49,40,5.713],[131.09,40,5.713],[132.7,40,5.713],[134.3,40,5.713],[70.188,40,6.856],[71.791,40,6.856],[73.393,40,6.856],[74.996,40,6.856],[76.599,40,6.856],[78.202,40,6.856],[79.805,40,6.856],[81.407,40,6.856],[83.01,40,6.856],[84.613,40,6.856],[86.216,40,6.856],[87.819,40,6.856],[89.421,40,6.856],[91.024,40,6.856],[92.627,40,6.856],[94.23,40,6.856],[95.833,40,6.856],[97.435,40,6.856],[99.038,40,6.856],[100.64,40,6.856],[102.24,40,6.856],[103.85,40,6.856],[105.45,40,6.856],[107.05,40,6.856],[108.66,40,6.856],[110.26,40,6.856],[111.86,40,6.856],[113.46,40,6.856],[115.07,40,6.856],[116.67,40,6.856],[118.27,40,6.856],[119.87,40,6.856],[121.48,40,6.856],[123.08,40,6.856],[124.68,40,6.856],[126.29,40,6.856],[127.89,40,6.856],[129.49,40,6.856],[131.09,40,6.856],[132.7,40,6.856],[134.3,40,6.856],[70.188,40,7.999],[71.791,40,7.999],[73.393,40,7.999],[74.996,40,7.999],[76.599,40,7.999],[78.202,40,7.999],[79.805,40,7.999],[81.407,40,7.999],[83.01,40,7.999],[84.613,40,7.999],[86.216,40,7.999],[87.819,40,7.999],[89.421,40,7.999],[91.024,40,7.999],[92.627,40,7.999],[94.23,40,7.999],[95.833,40,7.999],[97.435,40,7.999],[99.038,40,7.999],[100.64,40,7.999],[102.24,40,7.999],[103.85,40,7.999],[105.45,40,7.999],[107.05,40,7.999],[108.66,40,7.999],[110.26,40,7.999],[111.86,40,7.999],[113.46,40,7.999],[115.07,40,7.999],[116.67,40,7.999],[118.27,40,7.999],[119.87,40,7.999],[121.48,40,7.999],[123.08,40,7.999],[124.68,40,7.999],[126.29,40,7.999],[127.89,40,7.999],[129.49,40,7.999],[131.09,40,7.999],[132.7,40,7.999],[134.3,40,7.999],[70.188,40,9.142],[71.791,40,9.142],[73.393,40,9.142],[74.996,40,9.142],[76.599,40,9.142],[78.202,40,9.142],[79.805,40,9.142],[81.407,40,9.142],[83.01,40,9.142],[84.613,40,9.142],[86.216,40,9.142],[87.819,40,9.142],[89.421,40,9.142],[91.024,40,9.142],[92.627,40,9.142],[94.23,40,9.142],[95.833,40,9.142],[97.435,40,9.142],[99.038,40,9.142],[100.64,40,9.142],[102.24,40,9.142],[103.85,40,9.142],[105.45,40,9.142],[107.05,40,9.142],[108.66,40,9.142],[110.26,40,9.142],[111.86,40,9.142],[113.46,40,9.142],[115.07,40,9.142],[116.67,40,9.142],[118.27,40,9.142],[119.87,40,9.142],[121.48,40,9.142],[123.08,40,9.142],[124.68,40,9.142],[126.29,40,9.142],[127.89,40,9.142],[129.49,40,9.142],[131.09,40,9.142],[132.7,40,9.142],[134.3,40,9.142],[70.188,40,10.285],[71.791,40,10.285],[73.393,40,10.285],[74.996,40,10.285],[76.599,40,10.285],[78.202,40,10.285],[79.805,40,10.285],[81.407,40,10.285],[83.01,40,10.285],[84.613,40,10.285],[86.216,40,10.285],[87.819,40,10.285],[89.421,40,10.285],[91.024,40,10.285],[92.627,40,10.285],[94.23,40,10.285],[95.833,40,10.285],[97.435,40,10.285],[99.038,40,10.285],[100.64,40,10.285],[102.24,40,10.285],[103.85,40,10.285],[105.45,40,10.285],[107.05,40,10.285],[108.66,40,10.285],[110.26,40,10.285],[111.86,40,10.285],[113.46,40,10.285],[115.07,40,10.285],[116.67,40,10.285],[118.27,40,10.285],[119.87,40,10.285],[121.48,40,10.285],[123.08,40,10.285],[124.68,40,10.285],[126.29,40,10.285],[127.89,40,10.285],[129.49,40,10.285],[131.09,40,10.285],[132.7,40,10.285],[134.3,40,10.285],[70.188,40,11.428],[71.791,40,11.428],[73.393,40,11.428],[74.996,40,11.428],[76.599,40,11.428],[78.202,40,11.428],[79.805,40,11.428],[81.407,40,11.428],[83.01,40,11.428],[84.613,40,11.428],[86.216,40,11.428],[87.819,40,11.428],[89.421,40,11.428],[91.024,40,11.428],[92.627,40,11.428],[94.23,40,11.428],[95.833,40,11.428],[97.435,40,11.428],[99.038,40,11.428],[100.64,40,11.428],[102.24,40,11.428],[103.85,40,11.428],[105.45,40,11.428],[107.05,40,11.428],[108.66,40,11.428],[110.26,40,11.428],[111.86,40,11.428],[113.46,40,11.428],[115.07,40,11.428],[116.67,40,11.428],[118.27,40,11.428],[119.87,40,11.428],[121.48,40,11.428],[123.08,40,11.428],[124.68,40,11.428],[126.29,40,11.428],[127.89,40,11.428],[129.49,40,11.428],[131.09,40,11.428],[132.7,40,11.428],[134.3,40,11.428],[70.188,40,12.571],[71.791,40,12.571],[73.393,40,12.571],[74.996,40,12.571],[76.599,40,12.571],[78.202,40,12.571],[79.805,40,12.571],[81.407,40,12.571],[83.01,40,12.571],[84.613,40,12.571],[86.216,40,12.571],[87.819,40,12.571],[89.421,40,12.571],[91.024,40,12.571],[92.627,40,12.571],[94.23,40,12.571],[95.833,40,12.571],[97.435,40,12.571],[99.038,40,12.571],[100.64,40,12.571],[102.24,40,12.571],[103.85,40,12.571],[105.45,40,12.571],[107.05,40,12.571],[108.66,40,12.571],[110.26,40,12.571],[111.86,40,12.571],[113.46,40,12.571],[115.07,40,12.571],[116.67,40,12.571],[118.27,40,12.571],[119.87,40,12.571],[121.48,40,12.571],[123.08,40,12.571],[124.68,40,12.571],[126.29,40,12.571],[127.89,40,12.571],[129.49,40,12.571],[131.09,40,12.571],[132.7,40,12.571],[134.3,40,12.571],[70.188,40,13.714],[71.791,40,13.714],[73.393,40,13.714],[74.996,40,13.714],[76.599,40,13.714],[78.202,40,13.714],[79.805,40,13.714],[81.407,40,13.714],[83.01,40,13.714],[84.613,40,13.714],[86.216,40,13.714],[87.819,40,13.714],[89.421,40,13.714],[91.024,40,13.714],[92.627,40,13.714],[94.23,40,13.714],[95.833,40,13.714],[97.435,40,13.714],[99.038,40,13.714],[100.64,40,13.714],[102.24,40,13.714],[103.85,40,13.714],[105.45,40,13.714],[107.05,40,13.714],[108.66,40,13.714],[110.26,40,13.714],[111.86,40,13.714],[113.46,40,13.714],[115.07,40,13.714],[116.67,40,13.714],[118.27,40,13.714],[119.87,40,13.714],[121.48,40,13.714],[123.08,40,13.714],[124.68,40,13.714],[126.29,40,13.714],[127.89,40,13.714],[129.49,40,13.714],[131.09,40,13.714],[132.7,40,13.714],[134.3,40,13.714],[70.188,40,14.857],[71.791,40,14.857],[73.393,40,14.857],[74.996,40,14.857],[76.599,40,14.857],[78.202,40,14.857],[79.805,40,14.857],[81.407,40,14.857],[83.01,40,14.857],[84.613,40,14.857],[86.216,40,14.857],[87.819,40,14.857],[89.421,40,14.857],[91.024,40,14.857],[92.627,40,14.857],[94.23,40,14.857],[95.833,40,14.857],[97.435,40,14.857],[99.038,40,14.857],[100.64,40,14.857],[102.24,40,14.857],[103.85,40,14.857],[105.45,40,14.857],[107.05,40,14.857],[108.66,40,14.857],[110.26,40,14.857],[111.86,40,14.857],[113.46,40,14.857],[115.07,40,14.857],[116.67,40,14.857],[118.27,40,14.857],[119.87,40,14.857],[121.48,40,14.857],[123.08,40,14.857],[124.68,40,14.857],[126.29,40,14.857],[127.89,40,14.857],[129.49,40,14.857],[131.09,40,14.857],[132.7,40,14.857],[134.3,40,14.857],[70.188,40,16],[71.791,40,16],[73.393,40,16],[74.996,40,16],[76.599,40,16],[78.202,40,16],[79.805,40,16],[81.407,40,16],[83.01,40,16],[84.613,40,16],[86.216,40,16],[87.819,40,16],[89.421,40,16],[91.024,40,16],[92.627,40,16],[94.23,40,16],[95.833,40,16],[97.435,40,16],[99.038,40,16],[100.64,40,16],[102.24,40,16],[103.85,40,16],[105.45,40,16],[107.05,40,16],[108.66,40,16],[110.26,40,16],[111.86,40,16],[113.46,40,16],[115.07,40,16],[116.67,40,16],[118.27,40,16],[119.87,40,16],[121.48,40,16],[123.08,40,16],[124.68,40,16],[126.29,40,16],[127.89,40,16],[129.49,40,16],[131.09,40,16],[132.7,40,16],[134.3,40,16],[70.188,41.25,-0.002],[71.791,41.25,-0.002],[73.393,41.25,-0.002],[74.996,41.25,-0.002],[76.599,41.25,-0.002],[78.202,41.25,-0.002],[79.805,41.25,-0.002],[81.407,41.25,-0.002],[83.01,41.25,-0.002],[84.613,41.25,-0.002],[86.216,41.25,-0.002],[87.819,41.25,-0.002],[89.421,41.25,-0.002],[91.024,41.25,-0.002],[92.627,41.25,-0.002],[94.23,41.25,-0.002],[95.833,41.25,-0.002],[97.435,41.25,-0.002],[99.038,41.25,-0.002],[100.64,41.25,-0.002],[102.24,41.25,-0.002],[103.85,41.25,-0.002],[105.45,41.25,-0.002],[107.05,41.25,-0.002],[108.66,41.25,-0.002],[110.26,41.25,-0.002],[111.86,41.25,-0.002],[113.46,41.25,-0.002],[115.07,41.25,-0.002],[116.67,41.25,-0.002],[118.27,41.25,-0.002],[119.87,41.25,-0.002],[121.48,41.25,-0.002],[123.08,41.25,-0.002],[124.68,41.25,-0.002],[126.29,41.25,-0.002],[127.89,41.25,-0.002],[129.49,41.25,-0.002],[131.09,41.25,-0.002],[132.7,41.25,-0.002],[134.3,41.25,-0.002],[70.188,41.25,1.141],[71.791,41.25,1.141],[73.393,41.25,1.141],[74.996,41.25,1.141],[76.599,41.25,1.141],[78.202,41.25,1.141],[79.805,41.25,1.141],[81.407,41.25,1.141],[83.01,41.25,1.141],[84.613,41.25,1.141],[86.216,41.25,1.141],[87.819,41.25,1.141],[89.421,41.25,1.141],[91.024,41.25,1.141],[92.627,41.25,1.141],[94.23,41.25,1.141],[95.833,41.25,1.141],[97.435,41.25,1.141],[99.038,41.25,1.141],[100.64,41.25,1.141],[102.24,41.25,1.141],[103.85,41.25,1.141],[105.45,41.25,1.141],[107.05,41.25,1.141],[108.66,41.25,1.141],[110.26,41.25,1.141],[111.86,41.25,1.141],[113.46,41.25,1.141],[115.07,41.25,1.141],[116.67,41.25,1.141],[118.27,41.25,1.141],[119.87,41.25,1.141],[121.48,41.25,1.141],[123.08,41.25,1.141],[124.68,41.25,1.141],[126.29,41.25,1.141],[127.89,41.25,1.141],[129.49,41.25,1.141],[131.09,41.25,1.141],[132.7,41.25,1.141],[134.3,41.25,1.141],[70.188,41.25,2.284],[71.791,41.25,2.284],[73.393,41.25,2.284],[74.996,41.25,2.284],[76.599,41.25,2.284],[78.202,41.25,2.284],[79.805,41.25,2.284],[81.407,41.25,2.284],[83.01,41.25,2.284],[84.613,41.25,2.284],[86.216,41.25,2.284],[87.819,41.25,2.284],[89.421,41.25,2.284],[91.024,41.25,2.284],[92.627,41.25,2.284],[94.23,41.25,2.284],[95.833,41.25,2.284],[97.435,41.25,2.284],[99.038,41.25,2.284],[100.64,41.25,2.284],[102.24,41.25,2.284],[103.85,41.25,2.284],[105.45,41.25,2.284],[107.05,41.25,2.284],[108.66,41.25,2.284],[110.26,41.25,2.284],[111.86,41.25,2.284],[113.46,41.25,2.284],[115.07,41.25,2.284],[116.67,41.25,2.284],[118.27,41.25,2.284],[119.87,41.25,2.284],[121.48,41.25,2.284],[123.08,41.25,2.284],[124.68,41.25,2.284],[126.29,41.25,2.284],[127.89,41.25,2.284],[129.49,41.25,2.284],[131.09,41.25,2.284],[132.7,41.25,2.284],[134.3,41.25,2.284],[70.188,41.25,3.427],[71.791,41.25,3.427],[73.393,41.25,3.427],[74.996,41.25,3.427],[76.599,41.25,3.427],[78.202,41.25,3.427],[79.805,41.25,3.427],[81.407,41.25,3.427],[83.01,41.25,3.427],[84.613,41.25,3.427],[86.216,41.25,3.427],[87.819,41.25,3.427],[89.421,41.25,3.427],[91.024,41.25,3.427],[92.627,41.25,3.427],[94.23,41.25,3.427],[95.833,41.25,3.427],[97.435,41.25,3.427],[99.038,41.25,3.427],[100.64,41.25,3.427],[102.24,41.25,3.427],[103.85,41.25,3.427],[105.45,41.25,3.427],[107.05,41.25,3.427],[108.66,41.25,3.427],[110.26,41.25,3.427],[111.86,41.25,3.427],[113.46,41.25,3.427],[115.07,41.25,3.427],[116.67,41.25,3.427],[118.27,41.25,3.427],[119.87,41.25,3.427],[121.48,41.25,3.427],[123.08,41.25,3.427],[124.68,41.25,3.427],[126.29,41.25,3.427],[127.89,41.25,3.427],[129.49,41.25,3.427],[131.09,41.25,3.427],[132.7,41.25,3.427],[134.3,41.25,3.427],[70.188,41.25,4.57],[71.791,41.25,4.57],[73.393,41.25,4.57],[74.996,41.25,4.57],[76.599,41.25,4.57],[78.202,41.25,4.57],[79.805,41.25,4.57],[81.407,41.25,4.57],[83.01,41.25,4.57],[84.613,41.25,4.57],[86.216,41.25,4.57],[87.819,41.25,4.57],[89.421,41.25,4.57],[91.024,41.25,4.57],[92.627,41.25,4.57],[94.23,41.25,4.57],[95.833,41.25,4.57],[97.435,41.25,4.57],[99.038,41.25,4.57],[100.64,41.25,4.57],[102.24,41.25,4.57],[103.85,41.25,4.57],[105.45,41.25,4.57],[107.05,41.25,4.57],[108.66,41.25,4.57],[110.26,41.25,4.57],[111.86,41.25,4.57],[113.46,41.25,4.57],[115.07,41.25,4.57],[116.67,41.25,4.57],[118.27,41.25,4.57],[119.87,41.25,4.57],[121.48,41.25,4.57],[123.08,41.25,4.57],[124.68,41.25,4.57],[126.29,41.25,4.57],[127.89,41.25,4.57],[129.49,41.25,4.57],[131.09,41.25,4.57],[132.7,41.25,4.57],[134.3,41.25,4.57],[70.188,41.25,5.713],[71.791,41.25,5.713],[73.393,41.25,5.713],[74.996,41.25,5.713],[76.599,41.25,5.713],[78.202,41.25,5.713],[79.805,41.25,5.713],[81.407,41.25,5.713],[83.01,41.25,5.713],[84.613,41.25,5.713],[86.216,41.25,5.713],[87.819,41.25,5.713],[89.421,41.25,5.713],[91.024,41.25,5.713],[92.627,41.25,5.713],[94.23,41.25,5.713],[95.833,41.25,5.713],[97.435,41.25,5.713],[99.038,41.25,5.713],[100.64,41.25,5.713],[102.24,41.25,5.713],[103.85,41.25,5.713],[105.45,41.25,5.713],[107.05,41.25,5.713],[108.66,41.25,5.713],[110.26,41.25,5.713],[111.86,41.25,5.713],[113.46,41.25,5.713],[115.07,41.25,5.713],[116.67,41.25,5.713],[118.27,41.25,5.713],[119.87,41.25,5.713],[121.48,41.25,5.713],[123.08,41.25,5.713],[124.68,41.25,5.713],[126.29,41.25,5.713],[127.89,41.25,5.713],[129.49,41.25,5.713],[131.09,41.25,5.713],[132.7,41.25,5.713],[134.3,41.25,5.713],[70.188,41.25,6.856],[71.791,41.25,6.856],[73.393,41.25,6.856],[74.996,41.25,6.856],[76.599,41.25,6.856],[78.202,41.25,6.856],[79.805,41.25,6.856],[81.407,41.25,6.856],[83.01,41.25,6.856],[84.613,41.25,6.856],[86.216,41.25,6.856],[87.819,41.25,6.856],[89.421,41.25,6.856],[91.024,41.25,6.856],[92.627,41.25,6.856],[94.23,41.25,6.856],[95.833,41.25,6.856],[97.435,41.25,6.856],[99.038,41.25,6.856],[100.64,41.25,6.856],[102.24,41.25,6.856],[103.85,41.25,6.856],[105.45,41.25,6.856],[107.05,41.25,6.856],[108.66,41.25,6.856],[110.26,41.25,6.856],[111.86,41.25,6.856],[113.46,41.25,6.856],[115.07,41.25,6.856],[116.67,41.25,6.856],[118.27,41.25,6.856],[119.87,41.25,6.856],[121.48,41.25,6.856],[123.08,41.25,6.856],[124.68,41.25,6.856],[126.29,41.25,6.856],[127.89,41.25,6.856],[129.49,41.25,6.856],[131.09,41.25,6.856],[132.7,41.25,6.856],[134.3,41.25,6.856],[70.188,41.25,7.999],[71.791,41.25,7.999],[73.393,41.25,7.999],[74.996,41.25,7.999],[76.599,41.25,7.999],[78.202,41.25,7.999],[79.805,41.25,7.999],[81.407,41.25,7.999],[83.01,41.25,7.999],[84.613,41.25,7.999],[86.216,41.25,7.999],[87.819,41.25,7.999],[89.421,41.25,7.999],[91.024,41.25,7.999],[92.627,41.25,7.999],[94.23,41.25,7.999],[95.833,41.25,7.999],[97.435,41.25,7.999],[99.038,41.25,7.999],[100.64,41.25,7.999],[102.24,41.25,7.999],[103.85,41.25,7.999],[105.45,41.25,7.999],[107.05,41.25,7.999],[108.66,41.25,7.999],[110.26,41.25,7.999],[111.86,41.25,7.999],[113.46,41.25,7.999],[115.07,41.25,7.999],[116.67,41.25,7.999],[118.27,41.25,7.999],[119.87,41.25,7.999],[121.48,41.25,7.999],[123.08,41.25,7.999],[124.68,41.25,7.999],[126.29,41.25,7.999],[127.89,41.25,7.999],[129.49,41.25,7.999],[131.09,41.25,7.999],[132.7,41.25,7.999],[134.3,41.25,7.999],[70.188,41.25,9.142],[71.791,41.25,9.142],[73.393,41.25,9.142],[74.996,41.25,9.142],[76.599,41.25,9.142],[78.202,41.25,9.142],[79.805,41.25,9.142],[81.407,41.25,9.142],[83.01,41.25,9.142],[84.613,41.25,9.142],[86.216,41.25,9.142],[87.819,41.25,9.142],[89.421,41.25,9.142],[91.024,41.25,9.142],[92.627,41.25,9.142],[94.23,41.25,9.142],[95.833,41.25,9.142],[97.435,41.25,9.142],[99.038,41.25,9.142],[100.64,41.25,9.142],[102.24,41.25,9.142],[103.85,41.25,9.142],[105.45,41.25,9.142],[107.05,41.25,9.142],[108.66,41.25,9.142],[110.26,41.25,9.142],[111.86,41.25,9.142],[113.46,41.25,9.142],[115.07,41.25,9.142],[116.67,41.25,9.142],[118.27,41.25,9.142],[119.87,41.25,9.142],[121.48,41.25,9.142],[123.08,41.25,9.142],[124.68,41.25,9.142],[126.29,41.25,9.142],[127.89,41.25,9.142],[129.49,41.25,9.142],[131.09,41.25,9.142],[132.7,41.25,9.142],[134.3,41.25,9.142],[70.188,41.25,10.285],[71.791,41.25,10.285],[73.393,41.25,10.285],[74.996,41.25,10.285],[76.599,41.25,10.285],[78.202,41.25,10.285],[79.805,41.25,10.285],[81.407,41.25,10.285],[83.01,41.25,10.285],[84.613,41.25,10.285],[86.216,41.25,10.285],[87.819,41.25,10.285],[89.421,41.25,10.285],[91.024,41.25,10.285],[92.627,41.25,10.285],[94.23,41.25,10.285],[95.833,41.25,10.285],[97.435,41.25,10.285],[99.038,41.25,10.285],[100.64,41.25,10.285],[102.24,41.25,10.285],[103.85,41.25,10.285],[105.45,41.25,10.285],[107.05,41.25,10.285],[108.66,41.25,10.285],[110.26,41.25,10.285],[111.86,41.25,10.285],[113.46,41.25,10.285],[115.07,41.25,10.285],[116.67,41.25,10.285],[118.27,41.25,10.285],[119.87,41.25,10.285],[121.48,41.25,10.285],[123.08,41.25,10.285],[124.68,41.25,10.285],[126.29,41.25,10.285],[127.89,41.25,10.285],[129.49,41.25,10.285],[131.09,41.25,10.285],[132.7,41.25,10.285],[134.3,41.25,10.285],[70.188,41.25,11.428],[71.791,41.25,11.428],[73.393,41.25,11.428],[74.996,41.25,11.428],[76.599,41.25,11.428],[78.202,41.25,11.428],[79.805,41.25,11.428],[81.407,41.25,11.428],[83.01,41.25,11.428],[84.613,41.25,11.428],[86.216,41.25,11.428],[87.819,41.25,11.428],[89.421,41.25,11.428],[91.024,41.25,11.428],[92.627,41.25,11.428],[94.23,41.25,11.428],[95.833,41.25,11.428],[97.435,41.25,11.428],[99.038,41.25,11.428],[100.64,41.25,11.428],[102.24,41.25,11.428],[103.85,41.25,11.428],[105.45,41.25,11.428],[107.05,41.25,11.428],[108.66,41.25,11.428],[110.26,41.25,11.428],[111.86,41.25,11.428],[113.46,41.25,11.428],[115.07,41.25,11.428],[116.67,41.25,11.428],[118.27,41.25,11.428],[119.87,41.25,11.428],[121.48,41.25,11.428],[123.08,41.25,11.428],[124.68,41.25,11.428],[126.29,41.25,11.428],[127.89,41.25,11.428],[129.49,41.25,11.428],[131.09,41.25,11.428],[132.7,41.25,11.428],[134.3,41.25,11.428],[70.188,41.25,12.571],[71.791,41.25,12.571],[73.393,41.25,12.571],[74.996,41.25,12.571],[76.599,41.25,12.571],[78.202,41.25,12.571],[79.805,41.25,12.571],[81.407,41.25,12.571],[83.01,41.25,12.571],[84.613,41.25,12.571],[86.216,41.25,12.571],[87.819,41.25,12.571],[89.421,41.25,12.571],[91.024,41.25,12.571],[92.627,41.25,12.571],[94.23,41.25,12.571],[95.833,41.25,12.571],[97.435,41.25,12.571],[99.038,41.25,12.571],[100.64,41.25,12.571],[102.24,41.25,12.571],[103.85,41.25,12.571],[105.45,41.25,12.571],[107.05,41.25,12.571],[108.66,41.25,12.571],[110.26,41.25,12.571],[111.86,41.25,12.571],[113.46,41.25,12.571],[115.07,41.25,12.571],[116.67,41.25,12.571],[118.27,41.25,12.571],[119.87,41.25,12.571],[121.48,41.25,12.571],[123.08,41.25,12.571],[124.68,41.25,12.571],[126.29,41.25,12.571],[127.89,41.25,12.571],[129.49,41.25,12.571],[131.09,41.25,12.571],[132.7,41.25,12.571],[134.3,41.25,12.571],[70.188,41.25,13.714],[71.791,41.25,13.714],[73.393,41.25,13.714],[74.996,41.25,13.714],[76.599,41.25,13.714],[78.202,41.25,13.714],[79.805,41.25,13.714],[81.407,41.25,13.714],[83.01,41.25,13.714],[84.613,41.25,13.714],[86.216,41.25,13.714],[87.819,41.25,13.714],[89.421,41.25,13.714],[91.024,41.25,13.714],[92.627,41.25,13.714],[94.23,41.25,13.714],[95.833,41.25,13.714],[97.435,41.25,13.714],[99.038,41.25,13.714],[100.64,41.25,13.714],[102.24,41.25,13.714],[103.85,41.25,13.714],[105.45,41.25,13.714],[107.05,41.25,13.714],[108.66,41.25,13.714],[110.26,41.25,13.714],[111.86,41.25,13.714],[113.46,41.25,13.714],[115.07,41.25,13.714],[116.67,41.25,13.714],[118.27,41.25,13.714],[119.87,41.25,13.714],[121.48,41.25,13.714],[123.08,41.25,13.714],[124.68,41.25,13.714],[126.29,41.25,13.714],[127.89,41.25,13.714],[129.49,41.25,13.714],[131.09,41.25,13.714],[132.7,41.25,13.714],[134.3,41.25,13.714],[70.188,41.25,14.857],[71.791,41.25,14.857],[73.393,41.25,14.857],[74.996,41.25,14.857],[76.599,41.25,14.857],[78.202,41.25,14.857],[79.805,41.25,14.857],[81.407,41.25,14.857],[83.01,41.25,14.857],[84.613,41.25,14.857],[86.216,41.25,14.857],[87.819,41.25,14.857],[89.421,41.25,14.857],[91.024,41.25,14.857],[92.627,41.25,14.857],[94.23,41.25,14.857],[95.833,41.25,14.857],[97.435,41.25,14.857],[99.038,41.25,14.857],[100.64,41.25,14.857],[102.24,41.25,14.857],[103.85,41.25,14.857],[105.45,41.25,14.857],[107.05,41.25,14.857],[108.66,41.25,14.857],[110.26,41.25,14.857],[111.86,41.25,14.857],[113.46,41.25,14.857],[115.07,41.25,14.857],[116.67,41.25,14.857],[118.27,41.25,14.857],[119.87,41.25,14.857],[121.48,41.25,14.857],[123.08,41.25,14.857],[124.68,41.25,14.857],[126.29,41.25,14.857],[127.89,41.25,14.857],[129.49,41.25,14.857],[131.09,41.25,14.857],[132.7,41.25,14.857],[134.3,41.25,14.857],[70.188,41.25,16],[71.791,41.25,16],[73.393,41.25,16],[74.996,41.25,16],[76.599,41.25,16],[78.202,41.25,16],[79.805,41.25,16],[81.407,41.25,16],[83.01,41.25,16],[84.613,41.25,16],[86.216,41.25,16],[87.819,41.25,16],[89.421,41.25,16],[91.024,41.25,16],[92.627,41.25,16],[94.23,41.25,16],[95.833,41.25,16],[97.435,41.25,16],[99.038,41.25,16],[100.64,41.25,16],[102.24,41.25,16],[103.85,41.25,16],[105.45,41.25,16],[107.05,41.25,16],[108.66,41.25,16],[110.26,41.25,16],[111.86,41.25,16],[113.46,41.25,16],[115.07,41.25,16],[116.67,41.25,16],[118.27,41.25,16],[119.87,41.25,16],[121.48,41.25,16],[123.08,41.25,16],[124.68,41.25,16],[126.29,41.25,16],[127.89,41.25,16],[129.49,41.25,16],[131.09,41.25,16],[132.7,41.25,16],[134.3,41.25,16],[70.188,42.5,-0.002],[71.791,42.5,-0.002],[73.393,42.5,-0.002],[74.996,42.5,-0.002],[76.599,42.5,-0.002],[78.202,42.5,-0.002],[79.805,42.5,-0.002],[81.407,42.5,-0.002],[83.01,42.5,-0.002],[84.613,42.5,-0.002],[86.216,42.5,-0.002],[87.819,42.5,-0.002],[89.421,42.5,-0.002],[91.024,42.5,-0.002],[92.627,42.5,-0.002],[94.23,42.5,-0.002],[95.833,42.5,-0.002],[97.435,42.5,-0.002],[99.038,42.5,-0.002],[100.64,42.5,-0.002],[102.24,42.5,-0.002],[103.85,42.5,-0.002],[105.45,42.5,-0.002],[107.05,42.5,-0.002],[108.66,42.5,-0.002],[110.26,42.5,-0.002],[111.86,42.5,-0.002],[113.46,42.5,-0.002],[115.07,42.5,-0.002],[116.67,42.5,-0.002],[118.27,42.5,-0.002],[119.87,42.5,-0.002],[121.48,42.5,-0.002],[123.08,42.5,-0.002],[124.68,42.5,-0.002],[126.29,42.5,-0.002],[127.89,42.5,-0.002],[129.49,42.5,-0.002],[131.09,42.5,-0.002],[132.7,42.5,-0.002],[134.3,42.5,-0.002],[70.188,42.5,1.141],[71.791,42.5,1.141],[73.393,42.5,1.141],[74.996,42.5,1.141],[76.599,42.5,1.141],[78.202,42.5,1.141],[79.805,42.5,1.141],[81.407,42.5,1.141],[83.01,42.5,1.141],[84.613,42.5,1.141],[86.216,42.5,1.141],[87.819,42.5,1.141],[89.421,42.5,1.141],[91.024,42.5,1.141],[92.627,42.5,1.141],[94.23,42.5,1.141],[95.833,42.5,1.141],[97.435,42.5,1.141],[99.038,42.5,1.141],[100.64,42.5,1.141],[102.24,42.5,1.141],[103.85,42.5,1.141],[105.45,42.5,1.141],[107.05,42.5,1.141],[108.66,42.5,1.141],[110.26,42.5,1.141],[111.86,42.5,1.141],[113.46,42.5,1.141],[115.07,42.5,1.141],[116.67,42.5,1.141],[118.27,42.5,1.141],[119.87,42.5,1.141],[121.48,42.5,1.141],[123.08,42.5,1.141],[124.68,42.5,1.141],[126.29,42.5,1.141],[127.89,42.5,1.141],[129.49,42.5,1.141],[131.09,42.5,1.141],[132.7,42.5,1.141],[134.3,42.5,1.141],[70.188,42.5,2.284],[71.791,42.5,2.284],[73.393,42.5,2.284],[74.996,42.5,2.284],[76.599,42.5,2.284],[78.202,42.5,2.284],[79.805,42.5,2.284],[81.407,42.5,2.284],[83.01,42.5,2.284],[84.613,42.5,2.284],[86.216,42.5,2.284],[87.819,42.5,2.284],[89.421,42.5,2.284],[91.024,42.5,2.284],[92.627,42.5,2.284],[94.23,42.5,2.284],[95.833,42.5,2.284],[97.435,42.5,2.284],[99.038,42.5,2.284],[100.64,42.5,2.284],[102.24,42.5,2.284],[103.85,42.5,2.284],[105.45,42.5,2.284],[107.05,42.5,2.284],[108.66,42.5,2.284],[110.26,42.5,2.284],[111.86,42.5,2.284],[113.46,42.5,2.284],[115.07,42.5,2.284],[116.67,42.5,2.284],[118.27,42.5,2.284],[119.87,42.5,2.284],[121.48,42.5,2.284],[123.08,42.5,2.284],[124.68,42.5,2.284],[126.29,42.5,2.284],[127.89,42.5,2.284],[129.49,42.5,2.284],[131.09,42.5,2.284],[132.7,42.5,2.284],[134.3,42.5,2.284],[70.188,42.5,3.427],[71.791,42.5,3.427],[73.393,42.5,3.427],[74.996,42.5,3.427],[76.599,42.5,3.427],[78.202,42.5,3.427],[79.805,42.5,3.427],[81.407,42.5,3.427],[83.01,42.5,3.427],[84.613,42.5,3.427],[86.216,42.5,3.427],[87.819,42.5,3.427],[89.421,42.5,3.427],[91.024,42.5,3.427],[92.627,42.5,3.427],[94.23,42.5,3.427],[95.833,42.5,3.427],[97.435,42.5,3.427],[99.038,42.5,3.427],[100.64,42.5,3.427],[102.24,42.5,3.427],[103.85,42.5,3.427],[105.45,42.5,3.427],[107.05,42.5,3.427],[108.66,42.5,3.427],[110.26,42.5,3.427],[111.86,42.5,3.427],[113.46,42.5,3.427],[115.07,42.5,3.427],[116.67,42.5,3.427],[118.27,42.5,3.427],[119.87,42.5,3.427],[121.48,42.5,3.427],[123.08,42.5,3.427],[124.68,42.5,3.427],[126.29,42.5,3.427],[127.89,42.5,3.427],[129.49,42.5,3.427],[131.09,42.5,3.427],[132.7,42.5,3.427],[134.3,42.5,3.427],[70.188,42.5,4.57],[71.791,42.5,4.57],[73.393,42.5,4.57],[74.996,42.5,4.57],[76.599,42.5,4.57],[78.202,42.5,4.57],[79.805,42.5,4.57],[81.407,42.5,4.57],[83.01,42.5,4.57],[84.613,42.5,4.57],[86.216,42.5,4.57],[87.819,42.5,4.57],[89.421,42.5,4.57],[91.024,42.5,4.57],[92.627,42.5,4.57],[94.23,42.5,4.57],[95.833,42.5,4.57],[97.435,42.5,4.57],[99.038,42.5,4.57],[100.64,42.5,4.57],[102.24,42.5,4.57],[103.85,42.5,4.57],[105.45,42.5,4.57],[107.05,42.5,4.57],[108.66,42.5,4.57],[110.26,42.5,4.57],[111.86,42.5,4.57],[113.46,42.5,4.57],[115.07,42.5,4.57],[116.67,42.5,4.57],[118.27,42.5,4.57],[119.87,42.5,4.57],[121.48,42.5,4.57],[123.08,42.5,4.57],[124.68,42.5,4.57],[126.29,42.5,4.57],[127.89,42.5,4.57],[129.49,42.5,4.57],[131.09,42.5,4.57],[132.7,42.5,4.57],[134.3,42.5,4.57],[70.188,42.5,5.713],[71.791,42.5,5.713],[73.393,42.5,5.713],[74.996,42.5,5.713],[76.599,42.5,5.713],[78.202,42.5,5.713],[79.805,42.5,5.713],[81.407,42.5,5.713],[83.01,42.5,5.713],[84.613,42.5,5.713],[86.216,42.5,5.713],[87.819,42.5,5.713],[89.421,42.5,5.713],[91.024,42.5,5.713],[92.627,42.5,5.713],[94.23,42.5,5.713],[95.833,42.5,5.713],[97.435,42.5,5.713],[99.038,42.5,5.713],[100.64,42.5,5.713],[102.24,42.5,5.713],[103.85,42.5,5.713],[105.45,42.5,5.713],[107.05,42.5,5.713],[108.66,42.5,5.713],[110.26,42.5,5.713],[111.86,42.5,5.713],[113.46,42.5,5.713],[115.07,42.5,5.713],[116.67,42.5,5.713],[118.27,42.5,5.713],[119.87,42.5,5.713],[121.48,42.5,5.713],[123.08,42.5,5.713],[124.68,42.5,5.713],[126.29,42.5,5.713],[127.89,42.5,5.713],[129.49,42.5,5.713],[131.09,42.5,5.713],[132.7,42.5,5.713],[134.3,42.5,5.713],[70.188,42.5,6.856],[71.791,42.5,6.856],[73.393,42.5,6.856],[74.996,42.5,6.856],[76.599,42.5,6.856],[78.202,42.5,6.856],[79.805,42.5,6.856],[81.407,42.5,6.856],[83.01,42.5,6.856],[84.613,42.5,6.856],[86.216,42.5,6.856],[87.819,42.5,6.856],[89.421,42.5,6.856],[91.024,42.5,6.856],[92.627,42.5,6.856],[94.23,42.5,6.856],[95.833,42.5,6.856],[97.435,42.5,6.856],[99.038,42.5,6.856],[100.64,42.5,6.856],[102.24,42.5,6.856],[103.85,42.5,6.856],[105.45,42.5,6.856],[107.05,42.5,6.856],[108.66,42.5,6.856],[110.26,42.5,6.856],[111.86,42.5,6.856],[113.46,42.5,6.856],[115.07,42.5,6.856],[116.67,42.5,6.856],[118.27,42.5,6.856],[119.87,42.5,6.856],[121.48,42.5,6.856],[123.08,42.5,6.856],[124.68,42.5,6.856],[126.29,42.5,6.856],[127.89,42.5,6.856],[129.49,42.5,6.856],[131.09,42.5,6.856],[132.7,42.5,6.856],[134.3,42.5,6.856],[70.188,42.5,7.999],[71.791,42.5,7.999],[73.393,42.5,7.999],[74.996,42.5,7.999],[76.599,42.5,7.999],[78.202,42.5,7.999],[79.805,42.5,7.999],[81.407,42.5,7.999],[83.01,42.5,7.999],[84.613,42.5,7.999],[86.216,42.5,7.999],[87.819,42.5,7.999],[89.421,42.5,7.999],[91.024,42.5,7.999],[92.627,42.5,7.999],[94.23,42.5,7.999],[95.833,42.5,7.999],[97.435,42.5,7.999],[99.038,42.5,7.999],[100.64,42.5,7.999],[102.24,42.5,7.999],[103.85,42.5,7.999],[105.45,42.5,7.999],[107.05,42.5,7.999],[108.66,42.5,7.999],[110.26,42.5,7.999],[111.86,42.5,7.999],[113.46,42.5,7.999],[115.07,42.5,7.999],[116.67,42.5,7.999],[118.27,42.5,7.999],[119.87,42.5,7.999],[121.48,42.5,7.999],[123.08,42.5,7.999],[124.68,42.5,7.999],[126.29,42.5,7.999],[127.89,42.5,7.999],[129.49,42.5,7.999],[131.09,42.5,7.999],[132.7,42.5,7.999],[134.3,42.5,7.999],[70.188,42.5,9.142],[71.791,42.5,9.142],[73.393,42.5,9.142],[74.996,42.5,9.142],[76.599,42.5,9.142],[78.202,42.5,9.142],[79.805,42.5,9.142],[81.407,42.5,9.142],[83.01,42.5,9.142],[84.613,42.5,9.142],[86.216,42.5,9.142],[87.819,42.5,9.142],[89.421,42.5,9.142],[91.024,42.5,9.142],[92.627,42.5,9.142],[94.23,42.5,9.142],[95.833,42.5,9.142],[97.435,42.5,9.142],[99.038,42.5,9.142],[100.64,42.5,9.142],[102.24,42.5,9.142],[103.85,42.5,9.142],[105.45,42.5,9.142],[107.05,42.5,9.142],[108.66,42.5,9.142],[110.26,42.5,9.142],[111.86,42.5,9.142],[113.46,42.5,9.142],[115.07,42.5,9.142],[116.67,42.5,9.142],[118.27,42.5,9.142],[119.87,42.5,9.142],[121.48,42.5,9.142],[123.08,42.5,9.142],[124.68,42.5,9.142],[126.29,42.5,9.142],[127.89,42.5,9.142],[129.49,42.5,9.142],[131.09,42.5,9.142],[132.7,42.5,9.142],[134.3,42.5,9.142],[70.188,42.5,10.285],[71.791,42.5,10.285],[73.393,42.5,10.285],[74.996,42.5,10.285],[76.599,42.5,10.285],[78.202,42.5,10.285],[79.805,42.5,10.285],[81.407,42.5,10.285],[83.01,42.5,10.285],[84.613,42.5,10.285],[86.216,42.5,10.285],[87.819,42.5,10.285],[89.421,42.5,10.285],[91.024,42.5,10.285],[92.627,42.5,10.285],[94.23,42.5,10.285],[95.833,42.5,10.285],[97.435,42.5,10.285],[99.038,42.5,10.285],[100.64,42.5,10.285],[102.24,42.5,10.285],[103.85,42.5,10.285],[105.45,42.5,10.285],[107.05,42.5,10.285],[108.66,42.5,10.285],[110.26,42.5,10.285],[111.86,42.5,10.285],[113.46,42.5,10.285],[115.07,42.5,10.285],[116.67,42.5,10.285],[118.27,42.5,10.285],[119.87,42.5,10.285],[121.48,42.5,10.285],[123.08,42.5,10.285],[124.68,42.5,10.285],[126.29,42.5,10.285],[127.89,42.5,10.285],[129.49,42.5,10.285],[131.09,42.5,10.285],[132.7,42.5,10.285],[134.3,42.5,10.285],[70.188,42.5,11.428],[71.791,42.5,11.428],[73.393,42.5,11.428],[74.996,42.5,11.428],[76.599,42.5,11.428],[78.202,42.5,11.428],[79.805,42.5,11.428],[81.407,42.5,11.428],[83.01,42.5,11.428],[84.613,42.5,11.428],[86.216,42.5,11.428],[87.819,42.5,11.428],[89.421,42.5,11.428],[91.024,42.5,11.428],[92.627,42.5,11.428],[94.23,42.5,11.428],[95.833,42.5,11.428],[97.435,42.5,11.428],[99.038,42.5,11.428],[100.64,42.5,11.428],[102.24,42.5,11.428],[103.85,42.5,11.428],[105.45,42.5,11.428],[107.05,42.5,11.428],[108.66,42.5,11.428],[110.26,42.5,11.428],[111.86,42.5,11.428],[113.46,42.5,11.428],[115.07,42.5,11.428],[116.67,42.5,11.428],[118.27,42.5,11.428],[119.87,42.5,11.428],[121.48,42.5,11.428],[123.08,42.5,11.428],[124.68,42.5,11.428],[126.29,42.5,11.428],[127.89,42.5,11.428],[129.49,42.5,11.428],[131.09,42.5,11.428],[132.7,42.5,11.428],[134.3,42.5,11.428],[70.188,42.5,12.571],[71.791,42.5,12.571],[73.393,42.5,12.571],[74.996,42.5,12.571],[76.599,42.5,12.571],[78.202,42.5,12.571],[79.805,42.5,12.571],[81.407,42.5,12.571],[83.01,42.5,12.571],[84.613,42.5,12.571],[86.216,42.5,12.571],[87.819,42.5,12.571],[89.421,42.5,12.571],[91.024,42.5,12.571],[92.627,42.5,12.571],[94.23,42.5,12.571],[95.833,42.5,12.571],[97.435,42.5,12.571],[99.038,42.5,12.571],[100.64,42.5,12.571],[102.24,42.5,12.571],[103.85,42.5,12.571],[105.45,42.5,12.571],[107.05,42.5,12.571],[108.66,42.5,12.571],[110.26,42.5,12.571],[111.86,42.5,12.571],[113.46,42.5,12.571],[115.07,42.5,12.571],[116.67,42.5,12.571],[118.27,42.5,12.571],[119.87,42.5,12.571],[121.48,42.5,12.571],[123.08,42.5,12.571],[124.68,42.5,12.571],[126.29,42.5,12.571],[127.89,42.5,12.571],[129.49,42.5,12.571],[131.09,42.5,12.571],[132.7,42.5,12.571],[134.3,42.5,12.571],[70.188,42.5,13.714],[71.791,42.5,13.714],[73.393,42.5,13.714],[74.996,42.5,13.714],[76.599,42.5,13.714],[78.202,42.5,13.714],[79.805,42.5,13.714],[81.407,42.5,13.714],[83.01,42.5,13.714],[84.613,42.5,13.714],[86.216,42.5,13.714],[87.819,42.5,13.714],[89.421,42.5,13.714],[91.024,42.5,13.714],[92.627,42.5,13.714],[94.23,42.5,13.714],[95.833,42.5,13.714],[97.435,42.5,13.714],[99.038,42.5,13.714],[100.64,42.5,13.714],[102.24,42.5,13.714],[103.85,42.5,13.714],[105.45,42.5,13.714],[107.05,42.5,13.714],[108.66,42.5,13.714],[110.26,42.5,13.714],[111.86,42.5,13.714],[113.46,42.5,13.714],[115.07,42.5,13.714],[116.67,42.5,13.714],[118.27,42.5,13.714],[119.87,42.5,13.714],[121.48,42.5,13.714],[123.08,42.5,13.714],[124.68,42.5,13.714],[126.29,42.5,13.714],[127.89,42.5,13.714],[129.49,42.5,13.714],[131.09,42.5,13.714],[132.7,42.5,13.714],[134.3,42.5,13.714],[70.188,42.5,14.857],[71.791,42.5,14.857],[73.393,42.5,14.857],[74.996,42.5,14.857],[76.599,42.5,14.857],[78.202,42.5,14.857],[79.805,42.5,14.857],[81.407,42.5,14.857],[83.01,42.5,14.857],[84.613,42.5,14.857],[86.216,42.5,14.857],[87.819,42.5,14.857],[89.421,42.5,14.857],[91.024,42.5,14.857],[92.627,42.5,14.857],[94.23,42.5,14.857],[95.833,42.5,14.857],[97.435,42.5,14.857],[99.038,42.5,14.857],[100.64,42.5,14.857],[102.24,42.5,14.857],[103.85,42.5,14.857],[105.45,42.5,14.857],[107.05,42.5,14.857],[108.66,42.5,14.857],[110.26,42.5,14.857],[111.86,42.5,14.857],[113.46,42.5,14.857],[115.07,42.5,14.857],[116.67,42.5,14.857],[118.27,42.5,14.857],[119.87,42.5,14.857],[121.48,42.5,14.857],[123.08,42.5,14.857],[124.68,42.5,14.857],[126.29,42.5,14.857],[127.89,42.5,14.857],[129.49,42.5,14.857],[131.09,42.5,14.857],[132.7,42.5,14.857],[134.3,42.5,14.857],[70.188,42.5,16],[71.791,42.5,16],[73.393,42.5,16],[74.996,42.5,16],[76.599,42.5,16],[78.202,42.5,16],[79.805,42.5,16],[81.407,42.5,16],[83.01,42.5,16],[84.613,42.5,16],[86.216,42.5,16],[87.819,42.5,16],[89.421,42.5,16],[91.024,42.5,16],[92.627,42.5,16],[94.23,42.5,16],[95.833,42.5,16],[97.435,42.5,16],[99.038,42.5,16],[100.64,42.5,16],[102.24,42.5,16],[103.85,42.5,16],[105.45,42.5,16],[107.05,42.5,16],[108.66,42.5,16],[110.26,42.5,16],[111.86,42.5,16],[113.46,42.5,16],[115.07,42.5,16],[116.67,42.5,16],[118.27,42.5,16],[119.87,42.5,16],[121.48,42.5,16],[123.08,42.5,16],[124.68,42.5,16],[126.29,42.5,16],[127.89,42.5,16],[129.49,42.5,16],[131.09,42.5,16],[132.7,42.5,16],[134.3,42.5,16],[70.188,43.75,-0.002],[71.791,43.75,-0.002],[73.393,43.75,-0.002],[74.996,43.75,-0.002],[76.599,43.75,-0.002],[78.202,43.75,-0.002],[79.805,43.75,-0.002],[81.407,43.75,-0.002],[83.01,43.75,-0.002],[84.613,43.75,-0.002],[86.216,43.75,-0.002],[87.819,43.75,-0.002],[89.421,43.75,-0.002],[91.024,43.75,-0.002],[92.627,43.75,-0.002],[94.23,43.75,-0.002],[95.833,43.75,-0.002],[97.435,43.75,-0.002],[99.038,43.75,-0.002],[100.64,43.75,-0.002],[102.24,43.75,-0.002],[103.85,43.75,-0.002],[105.45,43.75,-0.002],[107.05,43.75,-0.002],[108.66,43.75,-0.002],[110.26,43.75,-0.002],[111.86,43.75,-0.002],[113.46,43.75,-0.002],[115.07,43.75,-0.002],[116.67,43.75,-0.002],[118.27,43.75,-0.002],[119.87,43.75,-0.002],[121.48,43.75,-0.002],[123.08,43.75,-0.002],[124.68,43.75,-0.002],[126.29,43.75,-0.002],[127.89,43.75,-0.002],[129.49,43.75,-0.002],[131.09,43.75,-0.002],[132.7,43.75,-0.002],[134.3,43.75,-0.002],[70.188,43.75,1.141],[71.791,43.75,1.141],[73.393,43.75,1.141],[74.996,43.75,1.141],[76.599,43.75,1.141],[78.202,43.75,1.141],[79.805,43.75,1.141],[81.407,43.75,1.141],[83.01,43.75,1.141],[84.613,43.75,1.141],[86.216,43.75,1.141],[87.819,43.75,1.141],[89.421,43.75,1.141],[91.024,43.75,1.141],[92.627,43.75,1.141],[94.23,43.75,1.141],[95.833,43.75,1.141],[97.435,43.75,1.141],[99.038,43.75,1.141],[100.64,43.75,1.141],[102.24,43.75,1.141],[103.85,43.75,1.141],[105.45,43.75,1.141],[107.05,43.75,1.141],[108.66,43.75,1.141],[110.26,43.75,1.141],[111.86,43.75,1.141],[113.46,43.75,1.141],[115.07,43.75,1.141],[116.67,43.75,1.141],[118.27,43.75,1.141],[119.87,43.75,1.141],[121.48,43.75,1.141],[123.08,43.75,1.141],[124.68,43.75,1.141],[126.29,43.75,1.141],[127.89,43.75,1.141],[129.49,43.75,1.141],[131.09,43.75,1.141],[132.7,43.75,1.141],[134.3,43.75,1.141],[70.188,43.75,2.284],[71.791,43.75,2.284],[73.393,43.75,2.284],[74.996,43.75,2.284],[76.599,43.75,2.284],[78.202,43.75,2.284],[79.805,43.75,2.284],[81.407,43.75,2.284],[83.01,43.75,2.284],[84.613,43.75,2.284],[86.216,43.75,2.284],[87.819,43.75,2.284],[89.421,43.75,2.284],[91.024,43.75,2.284],[92.627,43.75,2.284],[94.23,43.75,2.284],[95.833,43.75,2.284],[97.435,43.75,2.284],[99.038,43.75,2.284],[100.64,43.75,2.284],[102.24,43.75,2.284],[103.85,43.75,2.284],[105.45,43.75,2.284],[107.05,43.75,2.284],[108.66,43.75,2.284],[110.26,43.75,2.284],[111.86,43.75,2.284],[113.46,43.75,2.284],[115.07,43.75,2.284],[116.67,43.75,2.284],[118.27,43.75,2.284],[119.87,43.75,2.284],[121.48,43.75,2.284],[123.08,43.75,2.284],[124.68,43.75,2.284],[126.29,43.75,2.284],[127.89,43.75,2.284],[129.49,43.75,2.284],[131.09,43.75,2.284],[132.7,43.75,2.284],[134.3,43.75,2.284],[70.188,43.75,3.427],[71.791,43.75,3.427],[73.393,43.75,3.427],[74.996,43.75,3.427],[76.599,43.75,3.427],[78.202,43.75,3.427],[79.805,43.75,3.427],[81.407,43.75,3.427],[83.01,43.75,3.427],[84.613,43.75,3.427],[86.216,43.75,3.427],[87.819,43.75,3.427],[89.421,43.75,3.427],[91.024,43.75,3.427],[92.627,43.75,3.427],[94.23,43.75,3.427],[95.833,43.75,3.427],[97.435,43.75,3.427],[99.038,43.75,3.427],[100.64,43.75,3.427],[102.24,43.75,3.427],[103.85,43.75,3.427],[105.45,43.75,3.427],[107.05,43.75,3.427],[108.66,43.75,3.427],[110.26,43.75,3.427],[111.86,43.75,3.427],[113.46,43.75,3.427],[115.07,43.75,3.427],[116.67,43.75,3.427],[118.27,43.75,3.427],[119.87,43.75,3.427],[121.48,43.75,3.427],[123.08,43.75,3.427],[124.68,43.75,3.427],[126.29,43.75,3.427],[127.89,43.75,3.427],[129.49,43.75,3.427],[131.09,43.75,3.427],[132.7,43.75,3.427],[134.3,43.75,3.427],[70.188,43.75,4.57],[71.791,43.75,4.57],[73.393,43.75,4.57],[74.996,43.75,4.57],[76.599,43.75,4.57],[78.202,43.75,4.57],[79.805,43.75,4.57],[81.407,43.75,4.57],[83.01,43.75,4.57],[84.613,43.75,4.57],[86.216,43.75,4.57],[87.819,43.75,4.57],[89.421,43.75,4.57],[91.024,43.75,4.57],[92.627,43.75,4.57],[94.23,43.75,4.57],[95.833,43.75,4.57],[97.435,43.75,4.57],[99.038,43.75,4.57],[100.64,43.75,4.57],[102.24,43.75,4.57],[103.85,43.75,4.57],[105.45,43.75,4.57],[107.05,43.75,4.57],[108.66,43.75,4.57],[110.26,43.75,4.57],[111.86,43.75,4.57],[113.46,43.75,4.57],[115.07,43.75,4.57],[116.67,43.75,4.57],[118.27,43.75,4.57],[119.87,43.75,4.57],[121.48,43.75,4.57],[123.08,43.75,4.57],[124.68,43.75,4.57],[126.29,43.75,4.57],[127.89,43.75,4.57],[129.49,43.75,4.57],[131.09,43.75,4.57],[132.7,43.75,4.57],[134.3,43.75,4.57],[70.188,43.75,5.713],[71.791,43.75,5.713],[73.393,43.75,5.713],[74.996,43.75,5.713],[76.599,43.75,5.713],[78.202,43.75,5.713],[79.805,43.75,5.713],[81.407,43.75,5.713],[83.01,43.75,5.713],[84.613,43.75,5.713],[86.216,43.75,5.713],[87.819,43.75,5.713],[89.421,43.75,5.713],[91.024,43.75,5.713],[92.627,43.75,5.713],[94.23,43.75,5.713],[95.833,43.75,5.713],[97.435,43.75,5.713],[99.038,43.75,5.713],[100.64,43.75,5.713],[102.24,43.75,5.713],[103.85,43.75,5.713],[105.45,43.75,5.713],[107.05,43.75,5.713],[108.66,43.75,5.713],[110.26,43.75,5.713],[111.86,43.75,5.713],[113.46,43.75,5.713],[115.07,43.75,5.713],[116.67,43.75,5.713],[118.27,43.75,5.713],[119.87,43.75,5.713],[121.48,43.75,5.713],[123.08,43.75,5.713],[124.68,43.75,5.713],[126.29,43.75,5.713],[127.89,43.75,5.713],[129.49,43.75,5.713],[131.09,43.75,5.713],[132.7,43.75,5.713],[134.3,43.75,5.713],[70.188,43.75,6.856],[71.791,43.75,6.856],[73.393,43.75,6.856],[74.996,43.75,6.856],[76.599,43.75,6.856],[78.202,43.75,6.856],[79.805,43.75,6.856],[81.407,43.75,6.856],[83.01,43.75,6.856],[84.613,43.75,6.856],[86.216,43.75,6.856],[87.819,43.75,6.856],[89.421,43.75,6.856],[91.024,43.75,6.856],[92.627,43.75,6.856],[94.23,43.75,6.856],[95.833,43.75,6.856],[97.435,43.75,6.856],[99.038,43.75,6.856],[100.64,43.75,6.856],[102.24,43.75,6.856],[103.85,43.75,6.856],[105.45,43.75,6.856],[107.05,43.75,6.856],[108.66,43.75,6.856],[110.26,43.75,6.856],[111.86,43.75,6.856],[113.46,43.75,6.856],[115.07,43.75,6.856],[116.67,43.75,6.856],[118.27,43.75,6.856],[119.87,43.75,6.856],[121.48,43.75,6.856],[123.08,43.75,6.856],[124.68,43.75,6.856],[126.29,43.75,6.856],[127.89,43.75,6.856],[129.49,43.75,6.856],[131.09,43.75,6.856],[132.7,43.75,6.856],[134.3,43.75,6.856],[70.188,43.75,7.999],[71.791,43.75,7.999],[73.393,43.75,7.999],[74.996,43.75,7.999],[76.599,43.75,7.999],[78.202,43.75,7.999],[79.805,43.75,7.999],[81.407,43.75,7.999],[83.01,43.75,7.999],[84.613,43.75,7.999],[86.216,43.75,7.999],[87.819,43.75,7.999],[89.421,43.75,7.999],[91.024,43.75,7.999],[92.627,43.75,7.999],[94.23,43.75,7.999],[95.833,43.75,7.999],[97.435,43.75,7.999],[99.038,43.75,7.999],[100.64,43.75,7.999],[102.24,43.75,7.999],[103.85,43.75,7.999],[105.45,43.75,7.999],[107.05,43.75,7.999],[108.66,43.75,7.999],[110.26,43.75,7.999],[111.86,43.75,7.999],[113.46,43.75,7.999],[115.07,43.75,7.999],[116.67,43.75,7.999],[118.27,43.75,7.999],[119.87,43.75,7.999],[121.48,43.75,7.999],[123.08,43.75,7.999],[124.68,43.75,7.999],[126.29,43.75,7.999],[127.89,43.75,7.999],[129.49,43.75,7.999],[131.09,43.75,7.999],[132.7,43.75,7.999],[134.3,43.75,7.999],[70.188,43.75,9.142],[71.791,43.75,9.142],[73.393,43.75,9.142],[74.996,43.75,9.142],[76.599,43.75,9.142],[78.202,43.75,9.142],[79.805,43.75,9.142],[81.407,43.75,9.142],[83.01,43.75,9.142],[84.613,43.75,9.142],[86.216,43.75,9.142],[87.819,43.75,9.142],[89.421,43.75,9.142],[91.024,43.75,9.142],[92.627,43.75,9.142],[94.23,43.75,9.142],[95.833,43.75,9.142],[97.435,43.75,9.142],[99.038,43.75,9.142],[100.64,43.75,9.142],[102.24,43.75,9.142],[103.85,43.75,9.142],[105.45,43.75,9.142],[107.05,43.75,9.142],[108.66,43.75,9.142],[110.26,43.75,9.142],[111.86,43.75,9.142],[113.46,43.75,9.142],[115.07,43.75,9.142],[116.67,43.75,9.142],[118.27,43.75,9.142],[119.87,43.75,9.142],[121.48,43.75,9.142],[123.08,43.75,9.142],[124.68,43.75,9.142],[126.29,43.75,9.142],[127.89,43.75,9.142],[129.49,43.75,9.142],[131.09,43.75,9.142],[132.7,43.75,9.142],[134.3,43.75,9.142],[70.188,43.75,10.285],[71.791,43.75,10.285],[73.393,43.75,10.285],[74.996,43.75,10.285],[76.599,43.75,10.285],[78.202,43.75,10.285],[79.805,43.75,10.285],[81.407,43.75,10.285],[83.01,43.75,10.285],[84.613,43.75,10.285],[86.216,43.75,10.285],[87.819,43.75,10.285],[89.421,43.75,10.285],[91.024,43.75,10.285],[92.627,43.75,10.285],[94.23,43.75,10.285],[95.833,43.75,10.285],[97.435,43.75,10.285],[99.038,43.75,10.285],[100.64,43.75,10.285],[102.24,43.75,10.285],[103.85,43.75,10.285],[105.45,43.75,10.285],[107.05,43.75,10.285],[108.66,43.75,10.285],[110.26,43.75,10.285],[111.86,43.75,10.285],[113.46,43.75,10.285],[115.07,43.75,10.285],[116.67,43.75,10.285],[118.27,43.75,10.285],[119.87,43.75,10.285],[121.48,43.75,10.285],[123.08,43.75,10.285],[124.68,43.75,10.285],[126.29,43.75,10.285],[127.89,43.75,10.285],[129.49,43.75,10.285],[131.09,43.75,10.285],[132.7,43.75,10.285],[134.3,43.75,10.285],[70.188,43.75,11.428],[71.791,43.75,11.428],[73.393,43.75,11.428],[74.996,43.75,11.428],[76.599,43.75,11.428],[78.202,43.75,11.428],[79.805,43.75,11.428],[81.407,43.75,11.428],[83.01,43.75,11.428],[84.613,43.75,11.428],[86.216,43.75,11.428],[87.819,43.75,11.428],[89.421,43.75,11.428],[91.024,43.75,11.428],[92.627,43.75,11.428],[94.23,43.75,11.428],[95.833,43.75,11.428],[97.435,43.75,11.428],[99.038,43.75,11.428],[100.64,43.75,11.428],[102.24,43.75,11.428],[103.85,43.75,11.428],[105.45,43.75,11.428],[107.05,43.75,11.428],[108.66,43.75,11.428],[110.26,43.75,11.428],[111.86,43.75,11.428],[113.46,43.75,11.428],[115.07,43.75,11.428],[116.67,43.75,11.428],[118.27,43.75,11.428],[119.87,43.75,11.428],[121.48,43.75,11.428],[123.08,43.75,11.428],[124.68,43.75,11.428],[126.29,43.75,11.428],[127.89,43.75,11.428],[129.49,43.75,11.428],[131.09,43.75,11.428],[132.7,43.75,11.428],[134.3,43.75,11.428],[70.188,43.75,12.571],[71.791,43.75,12.571],[73.393,43.75,12.571],[74.996,43.75,12.571],[76.599,43.75,12.571],[78.202,43.75,12.571],[79.805,43.75,12.571],[81.407,43.75,12.571],[83.01,43.75,12.571],[84.613,43.75,12.571],[86.216,43.75,12.571],[87.819,43.75,12.571],[89.421,43.75,12.571],[91.024,43.75,12.571],[92.627,43.75,12.571],[94.23,43.75,12.571],[95.833,43.75,12.571],[97.435,43.75,12.571],[99.038,43.75,12.571],[100.64,43.75,12.571],[102.24,43.75,12.571],[103.85,43.75,12.571],[105.45,43.75,12.571],[107.05,43.75,12.571],[108.66,43.75,12.571],[110.26,43.75,12.571],[111.86,43.75,12.571],[113.46,43.75,12.571],[115.07,43.75,12.571],[116.67,43.75,12.571],[118.27,43.75,12.571],[119.87,43.75,12.571],[121.48,43.75,12.571],[123.08,43.75,12.571],[124.68,43.75,12.571],[126.29,43.75,12.571],[127.89,43.75,12.571],[129.49,43.75,12.571],[131.09,43.75,12.571],[132.7,43.75,12.571],[134.3,43.75,12.571],[70.188,43.75,13.714],[71.791,43.75,13.714],[73.393,43.75,13.714],[74.996,43.75,13.714],[76.599,43.75,13.714],[78.202,43.75,13.714],[79.805,43.75,13.714],[81.407,43.75,13.714],[83.01,43.75,13.714],[84.613,43.75,13.714],[86.216,43.75,13.714],[87.819,43.75,13.714],[89.421,43.75,13.714],[91.024,43.75,13.714],[92.627,43.75,13.714],[94.23,43.75,13.714],[95.833,43.75,13.714],[97.435,43.75,13.714],[99.038,43.75,13.714],[100.64,43.75,13.714],[102.24,43.75,13.714],[103.85,43.75,13.714],[105.45,43.75,13.714],[107.05,43.75,13.714],[108.66,43.75,13.714],[110.26,43.75,13.714],[111.86,43.75,13.714],[113.46,43.75,13.714],[115.07,43.75,13.714],[116.67,43.75,13.714],[118.27,43.75,13.714],[119.87,43.75,13.714],[121.48,43.75,13.714],[123.08,43.75,13.714],[124.68,43.75,13.714],[126.29,43.75,13.714],[127.89,43.75,13.714],[129.49,43.75,13.714],[131.09,43.75,13.714],[132.7,43.75,13.714],[134.3,43.75,13.714],[70.188,43.75,14.857],[71.791,43.75,14.857],[73.393,43.75,14.857],[74.996,43.75,14.857],[76.599,43.75,14.857],[78.202,43.75,14.857],[79.805,43.75,14.857],[81.407,43.75,14.857],[83.01,43.75,14.857],[84.613,43.75,14.857],[86.216,43.75,14.857],[87.819,43.75,14.857],[89.421,43.75,14.857],[91.024,43.75,14.857],[92.627,43.75,14.857],[94.23,43.75,14.857],[95.833,43.75,14.857],[97.435,43.75,14.857],[99.038,43.75,14.857],[100.64,43.75,14.857],[102.24,43.75,14.857],[103.85,43.75,14.857],[105.45,43.75,14.857],[107.05,43.75,14.857],[108.66,43.75,14.857],[110.26,43.75,14.857],[111.86,43.75,14.857],[113.46,43.75,14.857],[115.07,43.75,14.857],[116.67,43.75,14.857],[118.27,43.75,14.857],[119.87,43.75,14.857],[121.48,43.75,14.857],[123.08,43.75,14.857],[124.68,43.75,14.857],[126.29,43.75,14.857],[127.89,43.75,14.857],[129.49,43.75,14.857],[131.09,43.75,14.857],[132.7,43.75,14.857],[134.3,43.75,14.857],[70.188,43.75,16],[71.791,43.75,16],[73.393,43.75,16],[74.996,43.75,16],[76.599,43.75,16],[78.202,43.75,16],[79.805,43.75,16],[81.407,43.75,16],[83.01,43.75,16],[84.613,43.75,16],[86.216,43.75,16],[87.819,43.75,16],[89.421,43.75,16],[91.024,43.75,16],[92.627,43.75,16],[94.23,43.75,16],[95.833,43.75,16],[97.435,43.75,16],[99.038,43.75,16],[100.64,43.75,16],[102.24,43.75,16],[103.85,43.75,16],[105.45,43.75,16],[107.05,43.75,16],[108.66,43.75,16],[110.26,43.75,16],[111.86,43.75,16],[113.46,43.75,16],[115.07,43.75,16],[116.67,43.75,16],[118.27,43.75,16],[119.87,43.75,16],[121.48,43.75,16],[123.08,43.75,16],[124.68,43.75,16],[126.29,43.75,16],[127.89,43.75,16],[129.49,43.75,16],[131.09,43.75,16],[132.7,43.75,16],[134.3,43.75,16],[70.188,45,-0.002],[71.791,45,-0.002],[73.393,45,-0.002],[74.996,45,-0.002],[76.599,45,-0.002],[78.202,45,-0.002],[79.805,45,-0.002],[81.407,45,-0.002],[83.01,45,-0.002],[84.613,45,-0.002],[86.216,45,-0.002],[87.819,45,-0.002],[89.421,45,-0.002],[91.024,45,-0.002],[92.627,45,-0.002],[94.23,45,-0.002],[95.833,45,-0.002],[97.435,45,-0.002],[99.038,45,-0.002],[100.64,45,-0.002],[102.24,45,-0.002],[103.85,45,-0.002],[105.45,45,-0.002],[107.05,45,-0.002],[108.66,45,-0.002],[110.26,45,-0.002],[111.86,45,-0.002],[113.46,45,-0.002],[115.07,45,-0.002],[116.67,45,-0.002],[118.27,45,-0.002],[119.87,45,-0.002],[121.48,45,-0.002],[123.08,45,-0.002],[124.68,45,-0.002],[126.29,45,-0.002],[127.89,45,-0.002],[129.49,45,-0.002],[131.09,45,-0.002],[132.7,45,-0.002],[134.3,45,-0.002],[70.188,45,1.141],[71.791,45,1.141],[73.393,45,1.141],[74.996,45,1.141],[76.599,45,1.141],[78.202,45,1.141],[79.805,45,1.141],[81.407,45,1.141],[83.01,45,1.141],[84.613,45,1.141],[86.216,45,1.141],[87.819,45,1.141],[89.421,45,1.141],[91.024,45,1.141],[92.627,45,1.141],[94.23,45,1.141],[95.833,45,1.141],[97.435,45,1.141],[99.038,45,1.141],[100.64,45,1.141],[102.24,45,1.141],[103.85,45,1.141],[105.45,45,1.141],[107.05,45,1.141],[108.66,45,1.141],[110.26,45,1.141],[111.86,45,1.141],[113.46,45,1.141],[115.07,45,1.141],[116.67,45,1.141],[118.27,45,1.141],[119.87,45,1.141],[121.48,45,1.141],[123.08,45,1.141],[124.68,45,1.141],[126.29,45,1.141],[127.89,45,1.141],[129.49,45,1.141],[131.09,45,1.141],[132.7,45,1.141],[134.3,45,1.141],[70.188,45,2.284],[71.791,45,2.284],[73.393,45,2.284],[74.996,45,2.284],[76.599,45,2.284],[78.202,45,2.284],[79.805,45,2.284],[81.407,45,2.284],[83.01,45,2.284],[84.613,45,2.284],[86.216,45,2.284],[87.819,45,2.284],[89.421,45,2.284],[91.024,45,2.284],[92.627,45,2.284],[94.23,45,2.284],[95.833,45,2.284],[97.435,45,2.284],[99.038,45,2.284],[100.64,45,2.284],[102.24,45,2.284],[103.85,45,2.284],[105.45,45,2.284],[107.05,45,2.284],[108.66,45,2.284],[110.26,45,2.284],[111.86,45,2.284],[113.46,45,2.284],[115.07,45,2.284],[116.67,45,2.284],[118.27,45,2.284],[119.87,45,2.284],[121.48,45,2.284],[123.08,45,2.284],[124.68,45,2.284],[126.29,45,2.284],[127.89,45,2.284],[129.49,45,2.284],[131.09,45,2.284],[132.7,45,2.284],[134.3,45,2.284],[70.188,45,3.427],[71.791,45,3.427],[73.393,45,3.427],[74.996,45,3.427],[76.599,45,3.427],[78.202,45,3.427],[79.805,45,3.427],[81.407,45,3.427],[83.01,45,3.427],[84.613,45,3.427],[86.216,45,3.427],[87.819,45,3.427],[89.421,45,3.427],[91.024,45,3.427],[92.627,45,3.427],[94.23,45,3.427],[95.833,45,3.427],[97.435,45,3.427],[99.038,45,3.427],[100.64,45,3.427],[102.24,45,3.427],[103.85,45,3.427],[105.45,45,3.427],[107.05,45,3.427],[108.66,45,3.427],[110.26,45,3.427],[111.86,45,3.427],[113.46,45,3.427],[115.07,45,3.427],[116.67,45,3.427],[118.27,45,3.427],[119.87,45,3.427],[121.48,45,3.427],[123.08,45,3.427],[124.68,45,3.427],[126.29,45,3.427],[127.89,45,3.427],[129.49,45,3.427],[131.09,45,3.427],[132.7,45,3.427],[134.3,45,3.427],[70.188,45,4.57],[71.791,45,4.57],[73.393,45,4.57],[74.996,45,4.57],[76.599,45,4.57],[78.202,45,4.57],[79.805,45,4.57],[81.407,45,4.57],[83.01,45,4.57],[84.613,45,4.57],[86.216,45,4.57],[87.819,45,4.57],[89.421,45,4.57],[91.024,45,4.57],[92.627,45,4.57],[94.23,45,4.57],[95.833,45,4.57],[97.435,45,4.57],[99.038,45,4.57],[100.64,45,4.57],[102.24,45,4.57],[103.85,45,4.57],[105.45,45,4.57],[107.05,45,4.57],[108.66,45,4.57],[110.26,45,4.57],[111.86,45,4.57],[113.46,45,4.57],[115.07,45,4.57],[116.67,45,4.57],[118.27,45,4.57],[119.87,45,4.57],[121.48,45,4.57],[123.08,45,4.57],[124.68,45,4.57],[126.29,45,4.57],[127.89,45,4.57],[129.49,45,4.57],[131.09,45,4.57],[132.7,45,4.57],[134.3,45,4.57],[70.188,45,5.713],[71.791,45,5.713],[73.393,45,5.713],[74.996,45,5.713],[76.599,45,5.713],[78.202,45,5.713],[79.805,45,5.713],[81.407,45,5.713],[83.01,45,5.713],[84.613,45,5.713],[86.216,45,5.713],[87.819,45,5.713],[89.421,45,5.713],[91.024,45,5.713],[92.627,45,5.713],[94.23,45,5.713],[95.833,45,5.713],[97.435,45,5.713],[99.038,45,5.713],[100.64,45,5.713],[102.24,45,5.713],[103.85,45,5.713],[105.45,45,5.713],[107.05,45,5.713],[108.66,45,5.713],[110.26,45,5.713],[111.86,45,5.713],[113.46,45,5.713],[115.07,45,5.713],[116.67,45,5.713],[118.27,45,5.713],[119.87,45,5.713],[121.48,45,5.713],[123.08,45,5.713],[124.68,45,5.713],[126.29,45,5.713],[127.89,45,5.713],[129.49,45,5.713],[131.09,45,5.713],[132.7,45,5.713],[134.3,45,5.713],[70.188,45,6.856],[71.791,45,6.856],[73.393,45,6.856],[74.996,45,6.856],[76.599,45,6.856],[78.202,45,6.856],[79.805,45,6.856],[81.407,45,6.856],[83.01,45,6.856],[84.613,45,6.856],[86.216,45,6.856],[87.819,45,6.856],[89.421,45,6.856],[91.024,45,6.856],[92.627,45,6.856],[94.23,45,6.856],[95.833,45,6.856],[97.435,45,6.856],[99.038,45,6.856],[100.64,45,6.856],[102.24,45,6.856],[103.85,45,6.856],[105.45,45,6.856],[107.05,45,6.856],[108.66,45,6.856],[110.26,45,6.856],[111.86,45,6.856],[113.46,45,6.856],[115.07,45,6.856],[116.67,45,6.856],[118.27,45,6.856],[119.87,45,6.856],[121.48,45,6.856],[123.08,45,6.856],[124.68,45,6.856],[126.29,45,6.856],[127.89,45,6.856],[129.49,45,6.856],[131.09,45,6.856],[132.7,45,6.856],[134.3,45,6.856],[70.188,45,7.999],[71.791,45,7.999],[73.393,45,7.999],[74.996,45,7.999],[76.599,45,7.999],[78.202,45,7.999],[79.805,45,7.999],[81.407,45,7.999],[83.01,45,7.999],[84.613,45,7.999],[86.216,45,7.999],[87.819,45,7.999],[89.421,45,7.999],[91.024,45,7.999],[92.627,45,7.999],[94.23,45,7.999],[95.833,45,7.999],[97.435,45,7.999],[99.038,45,7.999],[100.64,45,7.999],[102.24,45,7.999],[103.85,45,7.999],[105.45,45,7.999],[107.05,45,7.999],[108.66,45,7.999],[110.26,45,7.999],[111.86,45,7.999],[113.46,45,7.999],[115.07,45,7.999],[116.67,45,7.999],[118.27,45,7.999],[119.87,45,7.999],[121.48,45,7.999],[123.08,45,7.999],[124.68,45,7.999],[126.29,45,7.999],[127.89,45,7.999],[129.49,45,7.999],[131.09,45,7.999],[132.7,45,7.999],[134.3,45,7.999],[70.188,45,9.142],[71.791,45,9.142],[73.393,45,9.142],[74.996,45,9.142],[76.599,45,9.142],[78.202,45,9.142],[79.805,45,9.142],[81.407,45,9.142],[83.01,45,9.142],[84.613,45,9.142],[86.216,45,9.142],[87.819,45,9.142],[89.421,45,9.142],[91.024,45,9.142],[92.627,45,9.142],[94.23,45,9.142],[95.833,45,9.142],[97.435,45,9.142],[99.038,45,9.142],[100.64,45,9.142],[102.24,45,9.142],[103.85,45,9.142],[105.45,45,9.142],[107.05,45,9.142],[108.66,45,9.142],[110.26,45,9.142],[111.86,45,9.142],[113.46,45,9.142],[115.07,45,9.142],[116.67,45,9.142],[118.27,45,9.142],[119.87,45,9.142],[121.48,45,9.142],[123.08,45,9.142],[124.68,45,9.142],[126.29,45,9.142],[127.89,45,9.142],[129.49,45,9.142],[131.09,45,9.142],[132.7,45,9.142],[134.3,45,9.142],[70.188,45,10.285],[71.791,45,10.285],[73.393,45,10.285],[74.996,45,10.285],[76.599,45,10.285],[78.202,45,10.285],[79.805,45,10.285],[81.407,45,10.285],[83.01,45,10.285],[84.613,45,10.285],[86.216,45,10.285],[87.819,45,10.285],[89.421,45,10.285],[91.024,45,10.285],[92.627,45,10.285],[94.23,45,10.285],[95.833,45,10.285],[97.435,45,10.285],[99.038,45,10.285],[100.64,45,10.285],[102.24,45,10.285],[103.85,45,10.285],[105.45,45,10.285],[107.05,45,10.285],[108.66,45,10.285],[110.26,45,10.285],[111.86,45,10.285],[113.46,45,10.285],[115.07,45,10.285],[116.67,45,10.285],[118.27,45,10.285],[119.87,45,10.285],[121.48,45,10.285],[123.08,45,10.285],[124.68,45,10.285],[126.29,45,10.285],[127.89,45,10.285],[129.49,45,10.285],[131.09,45,10.285],[132.7,45,10.285],[134.3,45,10.285],[70.188,45,11.428],[71.791,45,11.428],[73.393,45,11.428],[74.996,45,11.428],[76.599,45,11.428],[78.202,45,11.428],[79.805,45,11.428],[81.407,45,11.428],[83.01,45,11.428],[84.613,45,11.428],[86.216,45,11.428],[87.819,45,11.428],[89.421,45,11.428],[91.024,45,11.428],[92.627,45,11.428],[94.23,45,11.428],[95.833,45,11.428],[97.435,45,11.428],[99.038,45,11.428],[100.64,45,11.428],[102.24,45,11.428],[103.85,45,11.428],[105.45,45,11.428],[107.05,45,11.428],[108.66,45,11.428],[110.26,45,11.428],[111.86,45,11.428],[113.46,45,11.428],[115.07,45,11.428],[116.67,45,11.428],[118.27,45,11.428],[119.87,45,11.428],[121.48,45,11.428],[123.08,45,11.428],[124.68,45,11.428],[126.29,45,11.428],[127.89,45,11.428],[129.49,45,11.428],[131.09,45,11.428],[132.7,45,11.428],[134.3,45,11.428],[70.188,45,12.571],[71.791,45,12.571],[73.393,45,12.571],[74.996,45,12.571],[76.599,45,12.571],[78.202,45,12.571],[79.805,45,12.571],[81.407,45,12.571],[83.01,45,12.571],[84.613,45,12.571],[86.216,45,12.571],[87.819,45,12.571],[89.421,45,12.571],[91.024,45,12.571],[92.627,45,12.571],[94.23,45,12.571],[95.833,45,12.571],[97.435,45,12.571],[99.038,45,12.571],[100.64,45,12.571],[102.24,45,12.571],[103.85,45,12.571],[105.45,45,12.571],[107.05,45,12.571],[108.66,45,12.571],[110.26,45,12.571],[111.86,45,12.571],[113.46,45,12.571],[115.07,45,12.571],[116.67,45,12.571],[118.27,45,12.571],[119.87,45,12.571],[121.48,45,12.571],[123.08,45,12.571],[124.68,45,12.571],[126.29,45,12.571],[127.89,45,12.571],[129.49,45,12.571],[131.09,45,12.571],[132.7,45,12.571],[134.3,45,12.571],[70.188,45,13.714],[71.791,45,13.714],[73.393,45,13.714],[74.996,45,13.714],[76.599,45,13.714],[78.202,45,13.714],[79.805,45,13.714],[81.407,45,13.714],[83.01,45,13.714],[84.613,45,13.714],[86.216,45,13.714],[87.819,45,13.714],[89.421,45,13.714],[91.024,45,13.714],[92.627,45,13.714],[94.23,45,13.714],[95.833,45,13.714],[97.435,45,13.714],[99.038,45,13.714],[100.64,45,13.714],[102.24,45,13.714],[103.85,45,13.714],[105.45,45,13.714],[107.05,45,13.714],[108.66,45,13.714],[110.26,45,13.714],[111.86,45,13.714],[113.46,45,13.714],[115.07,45,13.714],[116.67,45,13.714],[118.27,45,13.714],[119.87,45,13.714],[121.48,45,13.714],[123.08,45,13.714],[124.68,45,13.714],[126.29,45,13.714],[127.89,45,13.714],[129.49,45,13.714],[131.09,45,13.714],[132.7,45,13.714],[134.3,45,13.714],[70.188,45,14.857],[71.791,45,14.857],[73.393,45,14.857],[74.996,45,14.857],[76.599,45,14.857],[78.202,45,14.857],[79.805,45,14.857],[81.407,45,14.857],[83.01,45,14.857],[84.613,45,14.857],[86.216,45,14.857],[87.819,45,14.857],[89.421,45,14.857],[91.024,45,14.857],[92.627,45,14.857],[94.23,45,14.857],[95.833,45,14.857],[97.435,45,14.857],[99.038,45,14.857],[100.64,45,14.857],[102.24,45,14.857],[103.85,45,14.857],[105.45,45,14.857],[107.05,45,14.857],[108.66,45,14.857],[110.26,45,14.857],[111.86,45,14.857],[113.46,45,14.857],[115.07,45,14.857],[116.67,45,14.857],[118.27,45,14.857],[119.87,45,14.857],[121.48,45,14.857],[123.08,45,14.857],[124.68,45,14.857],[126.29,45,14.857],[127.89,45,14.857],[129.49,45,14.857],[131.09,45,14.857],[132.7,45,14.857],[134.3,45,14.857],[70.188,45,16],[71.791,45,16],[73.393,45,16],[74.996,45,16],[76.599,45,16],[78.202,45,16],[79.805,45,16],[81.407,45,16],[83.01,45,16],[84.613,45,16],[86.216,45,16],[87.819,45,16],[89.421,45,16],[91.024,45,16],[92.627,45,16],[94.23,45,16],[95.833,45,16],[97.435,45,16],[99.038,45,16],[100.64,45,16],[102.24,45,16],[103.85,45,16],[105.45,45,16],[107.05,45,16],[108.66,45,16],[110.26,45,16],[111.86,45,16],[113.46,45,16],[115.07,45,16],[116.67,45,16],[118.27,45,16],[119.87,45,16],[121.48,45,16],[123.08,45,16],[124.68,45,16],[126.29,45,16],[127.89,45,16],[129.49,45,16],[131.09,45,16],[132.7,45,16],[134.3,45,16],[70.188,46.25,-0.002],[71.791,46.25,-0.002],[73.393,46.25,-0.002],[74.996,46.25,-0.002],[76.599,46.25,-0.002],[78.202,46.25,-0.002],[79.805,46.25,-0.002],[81.407,46.25,-0.002],[83.01,46.25,-0.002],[84.613,46.25,-0.002],[86.216,46.25,-0.002],[87.819,46.25,-0.002],[89.421,46.25,-0.002],[91.024,46.25,-0.002],[92.627,46.25,-0.002],[94.23,46.25,-0.002],[95.833,46.25,-0.002],[97.435,46.25,-0.002],[99.038,46.25,-0.002],[100.64,46.25,-0.002],[102.24,46.25,-0.002],[103.85,46.25,-0.002],[105.45,46.25,-0.002],[107.05,46.25,-0.002],[108.66,46.25,-0.002],[110.26,46.25,-0.002],[111.86,46.25,-0.002],[113.46,46.25,-0.002],[115.07,46.25,-0.002],[116.67,46.25,-0.002],[118.27,46.25,-0.002],[119.87,46.25,-0.002],[121.48,46.25,-0.002],[123.08,46.25,-0.002],[124.68,46.25,-0.002],[126.29,46.25,-0.002],[127.89,46.25,-0.002],[129.49,46.25,-0.002],[131.09,46.25,-0.002],[132.7,46.25,-0.002],[134.3,46.25,-0.002],[70.188,46.25,1.141],[71.791,46.25,1.141],[73.393,46.25,1.141],[74.996,46.25,1.141],[76.599,46.25,1.141],[78.202,46.25,1.141],[79.805,46.25,1.141],[81.407,46.25,1.141],[83.01,46.25,1.141],[84.613,46.25,1.141],[86.216,46.25,1.141],[87.819,46.25,1.141],[89.421,46.25,1.141],[91.024,46.25,1.141],[92.627,46.25,1.141],[94.23,46.25,1.141],[95.833,46.25,1.141],[97.435,46.25,1.141],[99.038,46.25,1.141],[100.64,46.25,1.141],[102.24,46.25,1.141],[103.85,46.25,1.141],[105.45,46.25,1.141],[107.05,46.25,1.141],[108.66,46.25,1.141],[110.26,46.25,1.141],[111.86,46.25,1.141],[113.46,46.25,1.141],[115.07,46.25,1.141],[116.67,46.25,1.141],[118.27,46.25,1.141],[119.87,46.25,1.141],[121.48,46.25,1.141],[123.08,46.25,1.141],[124.68,46.25,1.141],[126.29,46.25,1.141],[127.89,46.25,1.141],[129.49,46.25,1.141],[131.09,46.25,1.141],[132.7,46.25,1.141],[134.3,46.25,1.141],[70.188,46.25,2.284],[71.791,46.25,2.284],[73.393,46.25,2.284],[74.996,46.25,2.284],[76.599,46.25,2.284],[78.202,46.25,2.284],[79.805,46.25,2.284],[81.407,46.25,2.284],[83.01,46.25,2.284],[84.613,46.25,2.284],[86.216,46.25,2.284],[87.819,46.25,2.284],[89.421,46.25,2.284],[91.024,46.25,2.284],[92.627,46.25,2.284],[94.23,46.25,2.284],[95.833,46.25,2.284],[97.435,46.25,2.284],[99.038,46.25,2.284],[100.64,46.25,2.284],[102.24,46.25,2.284],[103.85,46.25,2.284],[105.45,46.25,2.284],[107.05,46.25,2.284],[108.66,46.25,2.284],[110.26,46.25,2.284],[111.86,46.25,2.284],[113.46,46.25,2.284],[115.07,46.25,2.284],[116.67,46.25,2.284],[118.27,46.25,2.284],[119.87,46.25,2.284],[121.48,46.25,2.284],[123.08,46.25,2.284],[124.68,46.25,2.284],[126.29,46.25,2.284],[127.89,46.25,2.284],[129.49,46.25,2.284],[131.09,46.25,2.284],[132.7,46.25,2.284],[134.3,46.25,2.284],[70.188,46.25,3.427],[71.791,46.25,3.427],[73.393,46.25,3.427],[74.996,46.25,3.427],[76.599,46.25,3.427],[78.202,46.25,3.427],[79.805,46.25,3.427],[81.407,46.25,3.427],[83.01,46.25,3.427],[84.613,46.25,3.427],[86.216,46.25,3.427],[87.819,46.25,3.427],[89.421,46.25,3.427],[91.024,46.25,3.427],[92.627,46.25,3.427],[94.23,46.25,3.427],[95.833,46.25,3.427],[97.435,46.25,3.427],[99.038,46.25,3.427],[100.64,46.25,3.427],[102.24,46.25,3.427],[103.85,46.25,3.427],[105.45,46.25,3.427],[107.05,46.25,3.427],[108.66,46.25,3.427],[110.26,46.25,3.427],[111.86,46.25,3.427],[113.46,46.25,3.427],[115.07,46.25,3.427],[116.67,46.25,3.427],[118.27,46.25,3.427],[119.87,46.25,3.427],[121.48,46.25,3.427],[123.08,46.25,3.427],[124.68,46.25,3.427],[126.29,46.25,3.427],[127.89,46.25,3.427],[129.49,46.25,3.427],[131.09,46.25,3.427],[132.7,46.25,3.427],[134.3,46.25,3.427],[70.188,46.25,4.57],[71.791,46.25,4.57],[73.393,46.25,4.57],[74.996,46.25,4.57],[76.599,46.25,4.57],[78.202,46.25,4.57],[79.805,46.25,4.57],[81.407,46.25,4.57],[83.01,46.25,4.57],[84.613,46.25,4.57],[86.216,46.25,4.57],[87.819,46.25,4.57],[89.421,46.25,4.57],[91.024,46.25,4.57],[92.627,46.25,4.57],[94.23,46.25,4.57],[95.833,46.25,4.57],[97.435,46.25,4.57],[99.038,46.25,4.57],[100.64,46.25,4.57],[102.24,46.25,4.57],[103.85,46.25,4.57],[105.45,46.25,4.57],[107.05,46.25,4.57],[108.66,46.25,4.57],[110.26,46.25,4.57],[111.86,46.25,4.57],[113.46,46.25,4.57],[115.07,46.25,4.57],[116.67,46.25,4.57],[118.27,46.25,4.57],[119.87,46.25,4.57],[121.48,46.25,4.57],[123.08,46.25,4.57],[124.68,46.25,4.57],[126.29,46.25,4.57],[127.89,46.25,4.57],[129.49,46.25,4.57],[131.09,46.25,4.57],[132.7,46.25,4.57],[134.3,46.25,4.57],[70.188,46.25,5.713],[71.791,46.25,5.713],[73.393,46.25,5.713],[74.996,46.25,5.713],[76.599,46.25,5.713],[78.202,46.25,5.713],[79.805,46.25,5.713],[81.407,46.25,5.713],[83.01,46.25,5.713],[84.613,46.25,5.713],[86.216,46.25,5.713],[87.819,46.25,5.713],[89.421,46.25,5.713],[91.024,46.25,5.713],[92.627,46.25,5.713],[94.23,46.25,5.713],[95.833,46.25,5.713],[97.435,46.25,5.713],[99.038,46.25,5.713],[100.64,46.25,5.713],[102.24,46.25,5.713],[103.85,46.25,5.713],[105.45,46.25,5.713],[107.05,46.25,5.713],[108.66,46.25,5.713],[110.26,46.25,5.713],[111.86,46.25,5.713],[113.46,46.25,5.713],[115.07,46.25,5.713],[116.67,46.25,5.713],[118.27,46.25,5.713],[119.87,46.25,5.713],[121.48,46.25,5.713],[123.08,46.25,5.713],[124.68,46.25,5.713],[126.29,46.25,5.713],[127.89,46.25,5.713],[129.49,46.25,5.713],[131.09,46.25,5.713],[132.7,46.25,5.713],[134.3,46.25,5.713],[70.188,46.25,6.856],[71.791,46.25,6.856],[73.393,46.25,6.856],[74.996,46.25,6.856],[76.599,46.25,6.856],[78.202,46.25,6.856],[79.805,46.25,6.856],[81.407,46.25,6.856],[83.01,46.25,6.856],[84.613,46.25,6.856],[86.216,46.25,6.856],[87.819,46.25,6.856],[89.421,46.25,6.856],[91.024,46.25,6.856],[92.627,46.25,6.856],[94.23,46.25,6.856],[95.833,46.25,6.856],[97.435,46.25,6.856],[99.038,46.25,6.856],[100.64,46.25,6.856],[102.24,46.25,6.856],[103.85,46.25,6.856],[105.45,46.25,6.856],[107.05,46.25,6.856],[108.66,46.25,6.856],[110.26,46.25,6.856],[111.86,46.25,6.856],[113.46,46.25,6.856],[115.07,46.25,6.856],[116.67,46.25,6.856],[118.27,46.25,6.856],[119.87,46.25,6.856],[121.48,46.25,6.856],[123.08,46.25,6.856],[124.68,46.25,6.856],[126.29,46.25,6.856],[127.89,46.25,6.856],[129.49,46.25,6.856],[131.09,46.25,6.856],[132.7,46.25,6.856],[134.3,46.25,6.856],[70.188,46.25,7.999],[71.791,46.25,7.999],[73.393,46.25,7.999],[74.996,46.25,7.999],[76.599,46.25,7.999],[78.202,46.25,7.999],[79.805,46.25,7.999],[81.407,46.25,7.999],[83.01,46.25,7.999],[84.613,46.25,7.999],[86.216,46.25,7.999],[87.819,46.25,7.999],[89.421,46.25,7.999],[91.024,46.25,7.999],[92.627,46.25,7.999],[94.23,46.25,7.999],[95.833,46.25,7.999],[97.435,46.25,7.999],[99.038,46.25,7.999],[100.64,46.25,7.999],[102.24,46.25,7.999],[103.85,46.25,7.999],[105.45,46.25,7.999],[107.05,46.25,7.999],[108.66,46.25,7.999],[110.26,46.25,7.999],[111.86,46.25,7.999],[113.46,46.25,7.999],[115.07,46.25,7.999],[116.67,46.25,7.999],[118.27,46.25,7.999],[119.87,46.25,7.999],[121.48,46.25,7.999],[123.08,46.25,7.999],[124.68,46.25,7.999],[126.29,46.25,7.999],[127.89,46.25,7.999],[129.49,46.25,7.999],[131.09,46.25,7.999],[132.7,46.25,7.999],[134.3,46.25,7.999],[70.188,46.25,9.142],[71.791,46.25,9.142],[73.393,46.25,9.142],[74.996,46.25,9.142],[76.599,46.25,9.142],[78.202,46.25,9.142],[79.805,46.25,9.142],[81.407,46.25,9.142],[83.01,46.25,9.142],[84.613,46.25,9.142],[86.216,46.25,9.142],[87.819,46.25,9.142],[89.421,46.25,9.142],[91.024,46.25,9.142],[92.627,46.25,9.142],[94.23,46.25,9.142],[95.833,46.25,9.142],[97.435,46.25,9.142],[99.038,46.25,9.142],[100.64,46.25,9.142],[102.24,46.25,9.142],[103.85,46.25,9.142],[105.45,46.25,9.142],[107.05,46.25,9.142],[108.66,46.25,9.142],[110.26,46.25,9.142],[111.86,46.25,9.142],[113.46,46.25,9.142],[115.07,46.25,9.142],[116.67,46.25,9.142],[118.27,46.25,9.142],[119.87,46.25,9.142],[121.48,46.25,9.142],[123.08,46.25,9.142],[124.68,46.25,9.142],[126.29,46.25,9.142],[127.89,46.25,9.142],[129.49,46.25,9.142],[131.09,46.25,9.142],[132.7,46.25,9.142],[134.3,46.25,9.142],[70.188,46.25,10.285],[71.791,46.25,10.285],[73.393,46.25,10.285],[74.996,46.25,10.285],[76.599,46.25,10.285],[78.202,46.25,10.285],[79.805,46.25,10.285],[81.407,46.25,10.285],[83.01,46.25,10.285],[84.613,46.25,10.285],[86.216,46.25,10.285],[87.819,46.25,10.285],[89.421,46.25,10.285],[91.024,46.25,10.285],[92.627,46.25,10.285],[94.23,46.25,10.285],[95.833,46.25,10.285],[97.435,46.25,10.285],[99.038,46.25,10.285],[100.64,46.25,10.285],[102.24,46.25,10.285],[103.85,46.25,10.285],[105.45,46.25,10.285],[107.05,46.25,10.285],[108.66,46.25,10.285],[110.26,46.25,10.285],[111.86,46.25,10.285],[113.46,46.25,10.285],[115.07,46.25,10.285],[116.67,46.25,10.285],[118.27,46.25,10.285],[119.87,46.25,10.285],[121.48,46.25,10.285],[123.08,46.25,10.285],[124.68,46.25,10.285],[126.29,46.25,10.285],[127.89,46.25,10.285],[129.49,46.25,10.285],[131.09,46.25,10.285],[132.7,46.25,10.285],[134.3,46.25,10.285],[70.188,46.25,11.428],[71.791,46.25,11.428],[73.393,46.25,11.428],[74.996,46.25,11.428],[76.599,46.25,11.428],[78.202,46.25,11.428],[79.805,46.25,11.428],[81.407,46.25,11.428],[83.01,46.25,11.428],[84.613,46.25,11.428],[86.216,46.25,11.428],[87.819,46.25,11.428],[89.421,46.25,11.428],[91.024,46.25,11.428],[92.627,46.25,11.428],[94.23,46.25,11.428],[95.833,46.25,11.428],[97.435,46.25,11.428],[99.038,46.25,11.428],[100.64,46.25,11.428],[102.24,46.25,11.428],[103.85,46.25,11.428],[105.45,46.25,11.428],[107.05,46.25,11.428],[108.66,46.25,11.428],[110.26,46.25,11.428],[111.86,46.25,11.428],[113.46,46.25,11.428],[115.07,46.25,11.428],[116.67,46.25,11.428],[118.27,46.25,11.428],[119.87,46.25,11.428],[121.48,46.25,11.428],[123.08,46.25,11.428],[124.68,46.25,11.428],[126.29,46.25,11.428],[127.89,46.25,11.428],[129.49,46.25,11.428],[131.09,46.25,11.428],[132.7,46.25,11.428],[134.3,46.25,11.428],[70.188,46.25,12.571],[71.791,46.25,12.571],[73.393,46.25,12.571],[74.996,46.25,12.571],[76.599,46.25,12.571],[78.202,46.25,12.571],[79.805,46.25,12.571],[81.407,46.25,12.571],[83.01,46.25,12.571],[84.613,46.25,12.571],[86.216,46.25,12.571],[87.819,46.25,12.571],[89.421,46.25,12.571],[91.024,46.25,12.571],[92.627,46.25,12.571],[94.23,46.25,12.571],[95.833,46.25,12.571],[97.435,46.25,12.571],[99.038,46.25,12.571],[100.64,46.25,12.571],[102.24,46.25,12.571],[103.85,46.25,12.571],[105.45,46.25,12.571],[107.05,46.25,12.571],[108.66,46.25,12.571],[110.26,46.25,12.571],[111.86,46.25,12.571],[113.46,46.25,12.571],[115.07,46.25,12.571],[116.67,46.25,12.571],[118.27,46.25,12.571],[119.87,46.25,12.571],[121.48,46.25,12.571],[123.08,46.25,12.571],[124.68,46.25,12.571],[126.29,46.25,12.571],[127.89,46.25,12.571],[129.49,46.25,12.571],[131.09,46.25,12.571],[132.7,46.25,12.571],[134.3,46.25,12.571],[70.188,46.25,13.714],[71.791,46.25,13.714],[73.393,46.25,13.714],[74.996,46.25,13.714],[76.599,46.25,13.714],[78.202,46.25,13.714],[79.805,46.25,13.714],[81.407,46.25,13.714],[83.01,46.25,13.714],[84.613,46.25,13.714],[86.216,46.25,13.714],[87.819,46.25,13.714],[89.421,46.25,13.714],[91.024,46.25,13.714],[92.627,46.25,13.714],[94.23,46.25,13.714],[95.833,46.25,13.714],[97.435,46.25,13.714],[99.038,46.25,13.714],[100.64,46.25,13.714],[102.24,46.25,13.714],[103.85,46.25,13.714],[105.45,46.25,13.714],[107.05,46.25,13.714],[108.66,46.25,13.714],[110.26,46.25,13.714],[111.86,46.25,13.714],[113.46,46.25,13.714],[115.07,46.25,13.714],[116.67,46.25,13.714],[118.27,46.25,13.714],[119.87,46.25,13.714],[121.48,46.25,13.714],[123.08,46.25,13.714],[124.68,46.25,13.714],[126.29,46.25,13.714],[127.89,46.25,13.714],[129.49,46.25,13.714],[131.09,46.25,13.714],[132.7,46.25,13.714],[134.3,46.25,13.714],[70.188,46.25,14.857],[71.791,46.25,14.857],[73.393,46.25,14.857],[74.996,46.25,14.857],[76.599,46.25,14.857],[78.202,46.25,14.857],[79.805,46.25,14.857],[81.407,46.25,14.857],[83.01,46.25,14.857],[84.613,46.25,14.857],[86.216,46.25,14.857],[87.819,46.25,14.857],[89.421,46.25,14.857],[91.024,46.25,14.857],[92.627,46.25,14.857],[94.23,46.25,14.857],[95.833,46.25,14.857],[97.435,46.25,14.857],[99.038,46.25,14.857],[100.64,46.25,14.857],[102.24,46.25,14.857],[103.85,46.25,14.857],[105.45,46.25,14.857],[107.05,46.25,14.857],[108.66,46.25,14.857],[110.26,46.25,14.857],[111.86,46.25,14.857],[113.46,46.25,14.857],[115.07,46.25,14.857],[116.67,46.25,14.857],[118.27,46.25,14.857],[119.87,46.25,14.857],[121.48,46.25,14.857],[123.08,46.25,14.857],[124.68,46.25,14.857],[126.29,46.25,14.857],[127.89,46.25,14.857],[129.49,46.25,14.857],[131.09,46.25,14.857],[132.7,46.25,14.857],[134.3,46.25,14.857],[70.188,46.25,16],[71.791,46.25,16],[73.393,46.25,16],[74.996,46.25,16],[76.599,46.25,16],[78.202,46.25,16],[79.805,46.25,16],[81.407,46.25,16],[83.01,46.25,16],[84.613,46.25,16],[86.216,46.25,16],[87.819,46.25,16],[89.421,46.25,16],[91.024,46.25,16],[92.627,46.25,16],[94.23,46.25,16],[95.833,46.25,16],[97.435,46.25,16],[99.038,46.25,16],[100.64,46.25,16],[102.24,46.25,16],[103.85,46.25,16],[105.45,46.25,16],[107.05,46.25,16],[108.66,46.25,16],[110.26,46.25,16],[111.86,46.25,16],[113.46,46.25,16],[115.07,46.25,16],[116.67,46.25,16],[118.27,46.25,16],[119.87,46.25,16],[121.48,46.25,16],[123.08,46.25,16],[124.68,46.25,16],[126.29,46.25,16],[127.89,46.25,16],[129.49,46.25,16],[131.09,46.25,16],[132.7,46.25,16],[134.3,46.25,16],[70.188,47.5,-0.002],[71.791,47.5,-0.002],[73.393,47.5,-0.002],[74.996,47.5,-0.002],[76.599,47.5,-0.002],[78.202,47.5,-0.002],[79.805,47.5,-0.002],[81.407,47.5,-0.002],[83.01,47.5,-0.002],[84.613,47.5,-0.002],[86.216,47.5,-0.002],[87.819,47.5,-0.002],[89.421,47.5,-0.002],[91.024,47.5,-0.002],[92.627,47.5,-0.002],[94.23,47.5,-0.002],[95.833,47.5,-0.002],[97.435,47.5,-0.002],[99.038,47.5,-0.002],[100.64,47.5,-0.002],[102.24,47.5,-0.002],[103.85,47.5,-0.002],[105.45,47.5,-0.002],[107.05,47.5,-0.002],[108.66,47.5,-0.002],[110.26,47.5,-0.002],[111.86,47.5,-0.002],[113.46,47.5,-0.002],[115.07,47.5,-0.002],[116.67,47.5,-0.002],[118.27,47.5,-0.002],[119.87,47.5,-0.002],[121.48,47.5,-0.002],[123.08,47.5,-0.002],[124.68,47.5,-0.002],[126.29,47.5,-0.002],[127.89,47.5,-0.002],[129.49,47.5,-0.002],[131.09,47.5,-0.002],[132.7,47.5,-0.002],[134.3,47.5,-0.002],[70.188,47.5,1.141],[71.791,47.5,1.141],[73.393,47.5,1.141],[74.996,47.5,1.141],[76.599,47.5,1.141],[78.202,47.5,1.141],[79.805,47.5,1.141],[81.407,47.5,1.141],[83.01,47.5,1.141],[84.613,47.5,1.141],[86.216,47.5,1.141],[87.819,47.5,1.141],[89.421,47.5,1.141],[91.024,47.5,1.141],[92.627,47.5,1.141],[94.23,47.5,1.141],[95.833,47.5,1.141],[97.435,47.5,1.141],[99.038,47.5,1.141],[100.64,47.5,1.141],[102.24,47.5,1.141],[103.85,47.5,1.141],[105.45,47.5,1.141],[107.05,47.5,1.141],[108.66,47.5,1.141],[110.26,47.5,1.141],[111.86,47.5,1.141],[113.46,47.5,1.141],[115.07,47.5,1.141],[116.67,47.5,1.141],[118.27,47.5,1.141],[119.87,47.5,1.141],[121.48,47.5,1.141],[123.08,47.5,1.141],[124.68,47.5,1.141],[126.29,47.5,1.141],[127.89,47.5,1.141],[129.49,47.5,1.141],[131.09,47.5,1.141],[132.7,47.5,1.141],[134.3,47.5,1.141],[70.188,47.5,2.284],[71.791,47.5,2.284],[73.393,47.5,2.284],[74.996,47.5,2.284],[76.599,47.5,2.284],[78.202,47.5,2.284],[79.805,47.5,2.284],[81.407,47.5,2.284],[83.01,47.5,2.284],[84.613,47.5,2.284],[86.216,47.5,2.284],[87.819,47.5,2.284],[89.421,47.5,2.284],[91.024,47.5,2.284],[92.627,47.5,2.284],[94.23,47.5,2.284],[95.833,47.5,2.284],[97.435,47.5,2.284],[99.038,47.5,2.284],[100.64,47.5,2.284],[102.24,47.5,2.284],[103.85,47.5,2.284],[105.45,47.5,2.284],[107.05,47.5,2.284],[108.66,47.5,2.284],[110.26,47.5,2.284],[111.86,47.5,2.284],[113.46,47.5,2.284],[115.07,47.5,2.284],[116.67,47.5,2.284],[118.27,47.5,2.284],[119.87,47.5,2.284],[121.48,47.5,2.284],[123.08,47.5,2.284],[124.68,47.5,2.284],[126.29,47.5,2.284],[127.89,47.5,2.284],[129.49,47.5,2.284],[131.09,47.5,2.284],[132.7,47.5,2.284],[134.3,47.5,2.284],[70.188,47.5,3.427],[71.791,47.5,3.427],[73.393,47.5,3.427],[74.996,47.5,3.427],[76.599,47.5,3.427],[78.202,47.5,3.427],[79.805,47.5,3.427],[81.407,47.5,3.427],[83.01,47.5,3.427],[84.613,47.5,3.427],[86.216,47.5,3.427],[87.819,47.5,3.427],[89.421,47.5,3.427],[91.024,47.5,3.427],[92.627,47.5,3.427],[94.23,47.5,3.427],[95.833,47.5,3.427],[97.435,47.5,3.427],[99.038,47.5,3.427],[100.64,47.5,3.427],[102.24,47.5,3.427],[103.85,47.5,3.427],[105.45,47.5,3.427],[107.05,47.5,3.427],[108.66,47.5,3.427],[110.26,47.5,3.427],[111.86,47.5,3.427],[113.46,47.5,3.427],[115.07,47.5,3.427],[116.67,47.5,3.427],[118.27,47.5,3.427],[119.87,47.5,3.427],[121.48,47.5,3.427],[123.08,47.5,3.427],[124.68,47.5,3.427],[126.29,47.5,3.427],[127.89,47.5,3.427],[129.49,47.5,3.427],[131.09,47.5,3.427],[132.7,47.5,3.427],[134.3,47.5,3.427],[70.188,47.5,4.57],[71.791,47.5,4.57],[73.393,47.5,4.57],[74.996,47.5,4.57],[76.599,47.5,4.57],[78.202,47.5,4.57],[79.805,47.5,4.57],[81.407,47.5,4.57],[83.01,47.5,4.57],[84.613,47.5,4.57],[86.216,47.5,4.57],[87.819,47.5,4.57],[89.421,47.5,4.57],[91.024,47.5,4.57],[92.627,47.5,4.57],[94.23,47.5,4.57],[95.833,47.5,4.57],[97.435,47.5,4.57],[99.038,47.5,4.57],[100.64,47.5,4.57],[102.24,47.5,4.57],[103.85,47.5,4.57],[105.45,47.5,4.57],[107.05,47.5,4.57],[108.66,47.5,4.57],[110.26,47.5,4.57],[111.86,47.5,4.57],[113.46,47.5,4.57],[115.07,47.5,4.57],[116.67,47.5,4.57],[118.27,47.5,4.57],[119.87,47.5,4.57],[121.48,47.5,4.57],[123.08,47.5,4.57],[124.68,47.5,4.57],[126.29,47.5,4.57],[127.89,47.5,4.57],[129.49,47.5,4.57],[131.09,47.5,4.57],[132.7,47.5,4.57],[134.3,47.5,4.57],[70.188,47.5,5.713],[71.791,47.5,5.713],[73.393,47.5,5.713],[74.996,47.5,5.713],[76.599,47.5,5.713],[78.202,47.5,5.713],[79.805,47.5,5.713],[81.407,47.5,5.713],[83.01,47.5,5.713],[84.613,47.5,5.713],[86.216,47.5,5.713],[87.819,47.5,5.713],[89.421,47.5,5.713],[91.024,47.5,5.713],[92.627,47.5,5.713],[94.23,47.5,5.713],[95.833,47.5,5.713],[97.435,47.5,5.713],[99.038,47.5,5.713],[100.64,47.5,5.713],[102.24,47.5,5.713],[103.85,47.5,5.713],[105.45,47.5,5.713],[107.05,47.5,5.713],[108.66,47.5,5.713],[110.26,47.5,5.713],[111.86,47.5,5.713],[113.46,47.5,5.713],[115.07,47.5,5.713],[116.67,47.5,5.713],[118.27,47.5,5.713],[119.87,47.5,5.713],[121.48,47.5,5.713],[123.08,47.5,5.713],[124.68,47.5,5.713],[126.29,47.5,5.713],[127.89,47.5,5.713],[129.49,47.5,5.713],[131.09,47.5,5.713],[132.7,47.5,5.713],[134.3,47.5,5.713],[70.188,47.5,6.856],[71.791,47.5,6.856],[73.393,47.5,6.856],[74.996,47.5,6.856],[76.599,47.5,6.856],[78.202,47.5,6.856],[79.805,47.5,6.856],[81.407,47.5,6.856],[83.01,47.5,6.856],[84.613,47.5,6.856],[86.216,47.5,6.856],[87.819,47.5,6.856],[89.421,47.5,6.856],[91.024,47.5,6.856],[92.627,47.5,6.856],[94.23,47.5,6.856],[95.833,47.5,6.856],[97.435,47.5,6.856],[99.038,47.5,6.856],[100.64,47.5,6.856],[102.24,47.5,6.856],[103.85,47.5,6.856],[105.45,47.5,6.856],[107.05,47.5,6.856],[108.66,47.5,6.856],[110.26,47.5,6.856],[111.86,47.5,6.856],[113.46,47.5,6.856],[115.07,47.5,6.856],[116.67,47.5,6.856],[118.27,47.5,6.856],[119.87,47.5,6.856],[121.48,47.5,6.856],[123.08,47.5,6.856],[124.68,47.5,6.856],[126.29,47.5,6.856],[127.89,47.5,6.856],[129.49,47.5,6.856],[131.09,47.5,6.856],[132.7,47.5,6.856],[134.3,47.5,6.856],[70.188,47.5,7.999],[71.791,47.5,7.999],[73.393,47.5,7.999],[74.996,47.5,7.999],[76.599,47.5,7.999],[78.202,47.5,7.999],[79.805,47.5,7.999],[81.407,47.5,7.999],[83.01,47.5,7.999],[84.613,47.5,7.999],[86.216,47.5,7.999],[87.819,47.5,7.999],[89.421,47.5,7.999],[91.024,47.5,7.999],[92.627,47.5,7.999],[94.23,47.5,7.999],[95.833,47.5,7.999],[97.435,47.5,7.999],[99.038,47.5,7.999],[100.64,47.5,7.999],[102.24,47.5,7.999],[103.85,47.5,7.999],[105.45,47.5,7.999],[107.05,47.5,7.999],[108.66,47.5,7.999],[110.26,47.5,7.999],[111.86,47.5,7.999],[113.46,47.5,7.999],[115.07,47.5,7.999],[116.67,47.5,7.999],[118.27,47.5,7.999],[119.87,47.5,7.999],[121.48,47.5,7.999],[123.08,47.5,7.999],[124.68,47.5,7.999],[126.29,47.5,7.999],[127.89,47.5,7.999],[129.49,47.5,7.999],[131.09,47.5,7.999],[132.7,47.5,7.999],[134.3,47.5,7.999],[70.188,47.5,9.142],[71.791,47.5,9.142],[73.393,47.5,9.142],[74.996,47.5,9.142],[76.599,47.5,9.142],[78.202,47.5,9.142],[79.805,47.5,9.142],[81.407,47.5,9.142],[83.01,47.5,9.142],[84.613,47.5,9.142],[86.216,47.5,9.142],[87.819,47.5,9.142],[89.421,47.5,9.142],[91.024,47.5,9.142],[92.627,47.5,9.142],[94.23,47.5,9.142],[95.833,47.5,9.142],[97.435,47.5,9.142],[99.038,47.5,9.142],[100.64,47.5,9.142],[102.24,47.5,9.142],[103.85,47.5,9.142],[105.45,47.5,9.142],[107.05,47.5,9.142],[108.66,47.5,9.142],[110.26,47.5,9.142],[111.86,47.5,9.142],[113.46,47.5,9.142],[115.07,47.5,9.142],[116.67,47.5,9.142],[118.27,47.5,9.142],[119.87,47.5,9.142],[121.48,47.5,9.142],[123.08,47.5,9.142],[124.68,47.5,9.142],[126.29,47.5,9.142],[127.89,47.5,9.142],[129.49,47.5,9.142],[131.09,47.5,9.142],[132.7,47.5,9.142],[134.3,47.5,9.142],[70.188,47.5,10.285],[71.791,47.5,10.285],[73.393,47.5,10.285],[74.996,47.5,10.285],[76.599,47.5,10.285],[78.202,47.5,10.285],[79.805,47.5,10.285],[81.407,47.5,10.285],[83.01,47.5,10.285],[84.613,47.5,10.285],[86.216,47.5,10.285],[87.819,47.5,10.285],[89.421,47.5,10.285],[91.024,47.5,10.285],[92.627,47.5,10.285],[94.23,47.5,10.285],[95.833,47.5,10.285],[97.435,47.5,10.285],[99.038,47.5,10.285],[100.64,47.5,10.285],[102.24,47.5,10.285],[103.85,47.5,10.285],[105.45,47.5,10.285],[107.05,47.5,10.285],[108.66,47.5,10.285],[110.26,47.5,10.285],[111.86,47.5,10.285],[113.46,47.5,10.285],[115.07,47.5,10.285],[116.67,47.5,10.285],[118.27,47.5,10.285],[119.87,47.5,10.285],[121.48,47.5,10.285],[123.08,47.5,10.285],[124.68,47.5,10.285],[126.29,47.5,10.285],[127.89,47.5,10.285],[129.49,47.5,10.285],[131.09,47.5,10.285],[132.7,47.5,10.285],[134.3,47.5,10.285],[70.188,47.5,11.428],[71.791,47.5,11.428],[73.393,47.5,11.428],[74.996,47.5,11.428],[76.599,47.5,11.428],[78.202,47.5,11.428],[79.805,47.5,11.428],[81.407,47.5,11.428],[83.01,47.5,11.428],[84.613,47.5,11.428],[86.216,47.5,11.428],[87.819,47.5,11.428],[89.421,47.5,11.428],[91.024,47.5,11.428],[92.627,47.5,11.428],[94.23,47.5,11.428],[95.833,47.5,11.428],[97.435,47.5,11.428],[99.038,47.5,11.428],[100.64,47.5,11.428],[102.24,47.5,11.428],[103.85,47.5,11.428],[105.45,47.5,11.428],[107.05,47.5,11.428],[108.66,47.5,11.428],[110.26,47.5,11.428],[111.86,47.5,11.428],[113.46,47.5,11.428],[115.07,47.5,11.428],[116.67,47.5,11.428],[118.27,47.5,11.428],[119.87,47.5,11.428],[121.48,47.5,11.428],[123.08,47.5,11.428],[124.68,47.5,11.428],[126.29,47.5,11.428],[127.89,47.5,11.428],[129.49,47.5,11.428],[131.09,47.5,11.428],[132.7,47.5,11.428],[134.3,47.5,11.428],[70.188,47.5,12.571],[71.791,47.5,12.571],[73.393,47.5,12.571],[74.996,47.5,12.571],[76.599,47.5,12.571],[78.202,47.5,12.571],[79.805,47.5,12.571],[81.407,47.5,12.571],[83.01,47.5,12.571],[84.613,47.5,12.571],[86.216,47.5,12.571],[87.819,47.5,12.571],[89.421,47.5,12.571],[91.024,47.5,12.571],[92.627,47.5,12.571],[94.23,47.5,12.571],[95.833,47.5,12.571],[97.435,47.5,12.571],[99.038,47.5,12.571],[100.64,47.5,12.571],[102.24,47.5,12.571],[103.85,47.5,12.571],[105.45,47.5,12.571],[107.05,47.5,12.571],[108.66,47.5,12.571],[110.26,47.5,12.571],[111.86,47.5,12.571],[113.46,47.5,12.571],[115.07,47.5,12.571],[116.67,47.5,12.571],[118.27,47.5,12.571],[119.87,47.5,12.571],[121.48,47.5,12.571],[123.08,47.5,12.571],[124.68,47.5,12.571],[126.29,47.5,12.571],[127.89,47.5,12.571],[129.49,47.5,12.571],[131.09,47.5,12.571],[132.7,47.5,12.571],[134.3,47.5,12.571],[70.188,47.5,13.714],[71.791,47.5,13.714],[73.393,47.5,13.714],[74.996,47.5,13.714],[76.599,47.5,13.714],[78.202,47.5,13.714],[79.805,47.5,13.714],[81.407,47.5,13.714],[83.01,47.5,13.714],[84.613,47.5,13.714],[86.216,47.5,13.714],[87.819,47.5,13.714],[89.421,47.5,13.714],[91.024,47.5,13.714],[92.627,47.5,13.714],[94.23,47.5,13.714],[95.833,47.5,13.714],[97.435,47.5,13.714],[99.038,47.5,13.714],[100.64,47.5,13.714],[102.24,47.5,13.714],[103.85,47.5,13.714],[105.45,47.5,13.714],[107.05,47.5,13.714],[108.66,47.5,13.714],[110.26,47.5,13.714],[111.86,47.5,13.714],[113.46,47.5,13.714],[115.07,47.5,13.714],[116.67,47.5,13.714],[118.27,47.5,13.714],[119.87,47.5,13.714],[121.48,47.5,13.714],[123.08,47.5,13.714],[124.68,47.5,13.714],[126.29,47.5,13.714],[127.89,47.5,13.714],[129.49,47.5,13.714],[131.09,47.5,13.714],[132.7,47.5,13.714],[134.3,47.5,13.714],[70.188,47.5,14.857],[71.791,47.5,14.857],[73.393,47.5,14.857],[74.996,47.5,14.857],[76.599,47.5,14.857],[78.202,47.5,14.857],[79.805,47.5,14.857],[81.407,47.5,14.857],[83.01,47.5,14.857],[84.613,47.5,14.857],[86.216,47.5,14.857],[87.819,47.5,14.857],[89.421,47.5,14.857],[91.024,47.5,14.857],[92.627,47.5,14.857],[94.23,47.5,14.857],[95.833,47.5,14.857],[97.435,47.5,14.857],[99.038,47.5,14.857],[100.64,47.5,14.857],[102.24,47.5,14.857],[103.85,47.5,14.857],[105.45,47.5,14.857],[107.05,47.5,14.857],[108.66,47.5,14.857],[110.26,47.5,14.857],[111.86,47.5,14.857],[113.46,47.5,14.857],[115.07,47.5,14.857],[116.67,47.5,14.857],[118.27,47.5,14.857],[119.87,47.5,14.857],[121.48,47.5,14.857],[123.08,47.5,14.857],[124.68,47.5,14.857],[126.29,47.5,14.857],[127.89,47.5,14.857],[129.49,47.5,14.857],[131.09,47.5,14.857],[132.7,47.5,14.857],[134.3,47.5,14.857],[70.188,47.5,16],[71.791,47.5,16],[73.393,47.5,16],[74.996,47.5,16],[76.599,47.5,16],[78.202,47.5,16],[79.805,47.5,16],[81.407,47.5,16],[83.01,47.5,16],[84.613,47.5,16],[86.216,47.5,16],[87.819,47.5,16],[89.421,47.5,16],[91.024,47.5,16],[92.627,47.5,16],[94.23,47.5,16],[95.833,47.5,16],[97.435,47.5,16],[99.038,47.5,16],[100.64,47.5,16],[102.24,47.5,16],[103.85,47.5,16],[105.45,47.5,16],[107.05,47.5,16],[108.66,47.5,16],[110.26,47.5,16],[111.86,47.5,16],[113.46,47.5,16],[115.07,47.5,16],[116.67,47.5,16],[118.27,47.5,16],[119.87,47.5,16],[121.48,47.5,16],[123.08,47.5,16],[124.68,47.5,16],[126.29,47.5,16],[127.89,47.5,16],[129.49,47.5,16],[131.09,47.5,16],[132.7,47.5,16],[134.3,47.5,16],[70.188,48.75,-0.002],[71.791,48.75,-0.002],[73.393,48.75,-0.002],[74.996,48.75,-0.002],[76.599,48.75,-0.002],[78.202,48.75,-0.002],[79.805,48.75,-0.002],[81.407,48.75,-0.002],[83.01,48.75,-0.002],[84.613,48.75,-0.002],[86.216,48.75,-0.002],[87.819,48.75,-0.002],[89.421,48.75,-0.002],[91.024,48.75,-0.002],[92.627,48.75,-0.002],[94.23,48.75,-0.002],[95.833,48.75,-0.002],[97.435,48.75,-0.002],[99.038,48.75,-0.002],[100.64,48.75,-0.002],[102.24,48.75,-0.002],[103.85,48.75,-0.002],[105.45,48.75,-0.002],[107.05,48.75,-0.002],[108.66,48.75,-0.002],[110.26,48.75,-0.002],[111.86,48.75,-0.002],[113.46,48.75,-0.002],[115.07,48.75,-0.002],[116.67,48.75,-0.002],[118.27,48.75,-0.002],[119.87,48.75,-0.002],[121.48,48.75,-0.002],[123.08,48.75,-0.002],[124.68,48.75,-0.002],[126.29,48.75,-0.002],[127.89,48.75,-0.002],[129.49,48.75,-0.002],[131.09,48.75,-0.002],[132.7,48.75,-0.002],[134.3,48.75,-0.002],[70.188,48.75,1.141],[71.791,48.75,1.141],[73.393,48.75,1.141],[74.996,48.75,1.141],[76.599,48.75,1.141],[78.202,48.75,1.141],[79.805,48.75,1.141],[81.407,48.75,1.141],[83.01,48.75,1.141],[84.613,48.75,1.141],[86.216,48.75,1.141],[87.819,48.75,1.141],[89.421,48.75,1.141],[91.024,48.75,1.141],[92.627,48.75,1.141],[94.23,48.75,1.141],[95.833,48.75,1.141],[97.435,48.75,1.141],[99.038,48.75,1.141],[100.64,48.75,1.141],[102.24,48.75,1.141],[103.85,48.75,1.141],[105.45,48.75,1.141],[107.05,48.75,1.141],[108.66,48.75,1.141],[110.26,48.75,1.141],[111.86,48.75,1.141],[113.46,48.75,1.141],[115.07,48.75,1.141],[116.67,48.75,1.141],[118.27,48.75,1.141],[119.87,48.75,1.141],[121.48,48.75,1.141],[123.08,48.75,1.141],[124.68,48.75,1.141],[126.29,48.75,1.141],[127.89,48.75,1.141],[129.49,48.75,1.141],[131.09,48.75,1.141],[132.7,48.75,1.141],[134.3,48.75,1.141],[70.188,48.75,2.284],[71.791,48.75,2.284],[73.393,48.75,2.284],[74.996,48.75,2.284],[76.599,48.75,2.284],[78.202,48.75,2.284],[79.805,48.75,2.284],[81.407,48.75,2.284],[83.01,48.75,2.284],[84.613,48.75,2.284],[86.216,48.75,2.284],[87.819,48.75,2.284],[89.421,48.75,2.284],[91.024,48.75,2.284],[92.627,48.75,2.284],[94.23,48.75,2.284],[95.833,48.75,2.284],[97.435,48.75,2.284],[99.038,48.75,2.284],[100.64,48.75,2.284],[102.24,48.75,2.284],[103.85,48.75,2.284],[105.45,48.75,2.284],[107.05,48.75,2.284],[108.66,48.75,2.284],[110.26,48.75,2.284],[111.86,48.75,2.284],[113.46,48.75,2.284],[115.07,48.75,2.284],[116.67,48.75,2.284],[118.27,48.75,2.284],[119.87,48.75,2.284],[121.48,48.75,2.284],[123.08,48.75,2.284],[124.68,48.75,2.284],[126.29,48.75,2.284],[127.89,48.75,2.284],[129.49,48.75,2.284],[131.09,48.75,2.284],[132.7,48.75,2.284],[134.3,48.75,2.284],[70.188,48.75,3.427],[71.791,48.75,3.427],[73.393,48.75,3.427],[74.996,48.75,3.427],[76.599,48.75,3.427],[78.202,48.75,3.427],[79.805,48.75,3.427],[81.407,48.75,3.427],[83.01,48.75,3.427],[84.613,48.75,3.427],[86.216,48.75,3.427],[87.819,48.75,3.427],[89.421,48.75,3.427],[91.024,48.75,3.427],[92.627,48.75,3.427],[94.23,48.75,3.427],[95.833,48.75,3.427],[97.435,48.75,3.427],[99.038,48.75,3.427],[100.64,48.75,3.427],[102.24,48.75,3.427],[103.85,48.75,3.427],[105.45,48.75,3.427],[107.05,48.75,3.427],[108.66,48.75,3.427],[110.26,48.75,3.427],[111.86,48.75,3.427],[113.46,48.75,3.427],[115.07,48.75,3.427],[116.67,48.75,3.427],[118.27,48.75,3.427],[119.87,48.75,3.427],[121.48,48.75,3.427],[123.08,48.75,3.427],[124.68,48.75,3.427],[126.29,48.75,3.427],[127.89,48.75,3.427],[129.49,48.75,3.427],[131.09,48.75,3.427],[132.7,48.75,3.427],[134.3,48.75,3.427],[70.188,48.75,4.57],[71.791,48.75,4.57],[73.393,48.75,4.57],[74.996,48.75,4.57],[76.599,48.75,4.57],[78.202,48.75,4.57],[79.805,48.75,4.57],[81.407,48.75,4.57],[83.01,48.75,4.57],[84.613,48.75,4.57],[86.216,48.75,4.57],[87.819,48.75,4.57],[89.421,48.75,4.57],[91.024,48.75,4.57],[92.627,48.75,4.57],[94.23,48.75,4.57],[95.833,48.75,4.57],[97.435,48.75,4.57],[99.038,48.75,4.57],[100.64,48.75,4.57],[102.24,48.75,4.57],[103.85,48.75,4.57],[105.45,48.75,4.57],[107.05,48.75,4.57],[108.66,48.75,4.57],[110.26,48.75,4.57],[111.86,48.75,4.57],[113.46,48.75,4.57],[115.07,48.75,4.57],[116.67,48.75,4.57],[118.27,48.75,4.57],[119.87,48.75,4.57],[121.48,48.75,4.57],[123.08,48.75,4.57],[124.68,48.75,4.57],[126.29,48.75,4.57],[127.89,48.75,4.57],[129.49,48.75,4.57],[131.09,48.75,4.57],[132.7,48.75,4.57],[134.3,48.75,4.57],[70.188,48.75,5.713],[71.791,48.75,5.713],[73.393,48.75,5.713],[74.996,48.75,5.713],[76.599,48.75,5.713],[78.202,48.75,5.713],[79.805,48.75,5.713],[81.407,48.75,5.713],[83.01,48.75,5.713],[84.613,48.75,5.713],[86.216,48.75,5.713],[87.819,48.75,5.713],[89.421,48.75,5.713],[91.024,48.75,5.713],[92.627,48.75,5.713],[94.23,48.75,5.713],[95.833,48.75,5.713],[97.435,48.75,5.713],[99.038,48.75,5.713],[100.64,48.75,5.713],[102.24,48.75,5.713],[103.85,48.75,5.713],[105.45,48.75,5.713],[107.05,48.75,5.713],[108.66,48.75,5.713],[110.26,48.75,5.713],[111.86,48.75,5.713],[113.46,48.75,5.713],[115.07,48.75,5.713],[116.67,48.75,5.713],[118.27,48.75,5.713],[119.87,48.75,5.713],[121.48,48.75,5.713],[123.08,48.75,5.713],[124.68,48.75,5.713],[126.29,48.75,5.713],[127.89,48.75,5.713],[129.49,48.75,5.713],[131.09,48.75,5.713],[132.7,48.75,5.713],[134.3,48.75,5.713],[70.188,48.75,6.856],[71.791,48.75,6.856],[73.393,48.75,6.856],[74.996,48.75,6.856],[76.599,48.75,6.856],[78.202,48.75,6.856],[79.805,48.75,6.856],[81.407,48.75,6.856],[83.01,48.75,6.856],[84.613,48.75,6.856],[86.216,48.75,6.856],[87.819,48.75,6.856],[89.421,48.75,6.856],[91.024,48.75,6.856],[92.627,48.75,6.856],[94.23,48.75,6.856],[95.833,48.75,6.856],[97.435,48.75,6.856],[99.038,48.75,6.856],[100.64,48.75,6.856],[102.24,48.75,6.856],[103.85,48.75,6.856],[105.45,48.75,6.856],[107.05,48.75,6.856],[108.66,48.75,6.856],[110.26,48.75,6.856],[111.86,48.75,6.856],[113.46,48.75,6.856],[115.07,48.75,6.856],[116.67,48.75,6.856],[118.27,48.75,6.856],[119.87,48.75,6.856],[121.48,48.75,6.856],[123.08,48.75,6.856],[124.68,48.75,6.856],[126.29,48.75,6.856],[127.89,48.75,6.856],[129.49,48.75,6.856],[131.09,48.75,6.856],[132.7,48.75,6.856],[134.3,48.75,6.856],[70.188,48.75,7.999],[71.791,48.75,7.999],[73.393,48.75,7.999],[74.996,48.75,7.999],[76.599,48.75,7.999],[78.202,48.75,7.999],[79.805,48.75,7.999],[81.407,48.75,7.999],[83.01,48.75,7.999],[84.613,48.75,7.999],[86.216,48.75,7.999],[87.819,48.75,7.999],[89.421,48.75,7.999],[91.024,48.75,7.999],[92.627,48.75,7.999],[94.23,48.75,7.999],[95.833,48.75,7.999],[97.435,48.75,7.999],[99.038,48.75,7.999],[100.64,48.75,7.999],[102.24,48.75,7.999],[103.85,48.75,7.999],[105.45,48.75,7.999],[107.05,48.75,7.999],[108.66,48.75,7.999],[110.26,48.75,7.999],[111.86,48.75,7.999],[113.46,48.75,7.999],[115.07,48.75,7.999],[116.67,48.75,7.999],[118.27,48.75,7.999],[119.87,48.75,7.999],[121.48,48.75,7.999],[123.08,48.75,7.999],[124.68,48.75,7.999],[126.29,48.75,7.999],[127.89,48.75,7.999],[129.49,48.75,7.999],[131.09,48.75,7.999],[132.7,48.75,7.999],[134.3,48.75,7.999],[70.188,48.75,9.142],[71.791,48.75,9.142],[73.393,48.75,9.142],[74.996,48.75,9.142],[76.599,48.75,9.142],[78.202,48.75,9.142],[79.805,48.75,9.142],[81.407,48.75,9.142],[83.01,48.75,9.142],[84.613,48.75,9.142],[86.216,48.75,9.142],[87.819,48.75,9.142],[89.421,48.75,9.142],[91.024,48.75,9.142],[92.627,48.75,9.142],[94.23,48.75,9.142],[95.833,48.75,9.142],[97.435,48.75,9.142],[99.038,48.75,9.142],[100.64,48.75,9.142],[102.24,48.75,9.142],[103.85,48.75,9.142],[105.45,48.75,9.142],[107.05,48.75,9.142],[108.66,48.75,9.142],[110.26,48.75,9.142],[111.86,48.75,9.142],[113.46,48.75,9.142],[115.07,48.75,9.142],[116.67,48.75,9.142],[118.27,48.75,9.142],[119.87,48.75,9.142],[121.48,48.75,9.142],[123.08,48.75,9.142],[124.68,48.75,9.142],[126.29,48.75,9.142],[127.89,48.75,9.142],[129.49,48.75,9.142],[131.09,48.75,9.142],[132.7,48.75,9.142],[134.3,48.75,9.142],[70.188,48.75,10.285],[71.791,48.75,10.285],[73.393,48.75,10.285],[74.996,48.75,10.285],[76.599,48.75,10.285],[78.202,48.75,10.285],[79.805,48.75,10.285],[81.407,48.75,10.285],[83.01,48.75,10.285],[84.613,48.75,10.285],[86.216,48.75,10.285],[87.819,48.75,10.285],[89.421,48.75,10.285],[91.024,48.75,10.285],[92.627,48.75,10.285],[94.23,48.75,10.285],[95.833,48.75,10.285],[97.435,48.75,10.285],[99.038,48.75,10.285],[100.64,48.75,10.285],[102.24,48.75,10.285],[103.85,48.75,10.285],[105.45,48.75,10.285],[107.05,48.75,10.285],[108.66,48.75,10.285],[110.26,48.75,10.285],[111.86,48.75,10.285],[113.46,48.75,10.285],[115.07,48.75,10.285],[116.67,48.75,10.285],[118.27,48.75,10.285],[119.87,48.75,10.285],[121.48,48.75,10.285],[123.08,48.75,10.285],[124.68,48.75,10.285],[126.29,48.75,10.285],[127.89,48.75,10.285],[129.49,48.75,10.285],[131.09,48.75,10.285],[132.7,48.75,10.285],[134.3,48.75,10.285],[70.188,48.75,11.428],[71.791,48.75,11.428],[73.393,48.75,11.428],[74.996,48.75,11.428],[76.599,48.75,11.428],[78.202,48.75,11.428],[79.805,48.75,11.428],[81.407,48.75,11.428],[83.01,48.75,11.428],[84.613,48.75,11.428],[86.216,48.75,11.428],[87.819,48.75,11.428],[89.421,48.75,11.428],[91.024,48.75,11.428],[92.627,48.75,11.428],[94.23,48.75,11.428],[95.833,48.75,11.428],[97.435,48.75,11.428],[99.038,48.75,11.428],[100.64,48.75,11.428],[102.24,48.75,11.428],[103.85,48.75,11.428],[105.45,48.75,11.428],[107.05,48.75,11.428],[108.66,48.75,11.428],[110.26,48.75,11.428],[111.86,48.75,11.428],[113.46,48.75,11.428],[115.07,48.75,11.428],[116.67,48.75,11.428],[118.27,48.75,11.428],[119.87,48.75,11.428],[121.48,48.75,11.428],[123.08,48.75,11.428],[124.68,48.75,11.428],[126.29,48.75,11.428],[127.89,48.75,11.428],[129.49,48.75,11.428],[131.09,48.75,11.428],[132.7,48.75,11.428],[134.3,48.75,11.428],[70.188,48.75,12.571],[71.791,48.75,12.571],[73.393,48.75,12.571],[74.996,48.75,12.571],[76.599,48.75,12.571],[78.202,48.75,12.571],[79.805,48.75,12.571],[81.407,48.75,12.571],[83.01,48.75,12.571],[84.613,48.75,12.571],[86.216,48.75,12.571],[87.819,48.75,12.571],[89.421,48.75,12.571],[91.024,48.75,12.571],[92.627,48.75,12.571],[94.23,48.75,12.571],[95.833,48.75,12.571],[97.435,48.75,12.571],[99.038,48.75,12.571],[100.64,48.75,12.571],[102.24,48.75,12.571],[103.85,48.75,12.571],[105.45,48.75,12.571],[107.05,48.75,12.571],[108.66,48.75,12.571],[110.26,48.75,12.571],[111.86,48.75,12.571],[113.46,48.75,12.571],[115.07,48.75,12.571],[116.67,48.75,12.571],[118.27,48.75,12.571],[119.87,48.75,12.571],[121.48,48.75,12.571],[123.08,48.75,12.571],[124.68,48.75,12.571],[126.29,48.75,12.571],[127.89,48.75,12.571],[129.49,48.75,12.571],[131.09,48.75,12.571],[132.7,48.75,12.571],[134.3,48.75,12.571],[70.188,48.75,13.714],[71.791,48.75,13.714],[73.393,48.75,13.714],[74.996,48.75,13.714],[76.599,48.75,13.714],[78.202,48.75,13.714],[79.805,48.75,13.714],[81.407,48.75,13.714],[83.01,48.75,13.714],[84.613,48.75,13.714],[86.216,48.75,13.714],[87.819,48.75,13.714],[89.421,48.75,13.714],[91.024,48.75,13.714],[92.627,48.75,13.714],[94.23,48.75,13.714],[95.833,48.75,13.714],[97.435,48.75,13.714],[99.038,48.75,13.714],[100.64,48.75,13.714],[102.24,48.75,13.714],[103.85,48.75,13.714],[105.45,48.75,13.714],[107.05,48.75,13.714],[108.66,48.75,13.714],[110.26,48.75,13.714],[111.86,48.75,13.714],[113.46,48.75,13.714],[115.07,48.75,13.714],[116.67,48.75,13.714],[118.27,48.75,13.714],[119.87,48.75,13.714],[121.48,48.75,13.714],[123.08,48.75,13.714],[124.68,48.75,13.714],[126.29,48.75,13.714],[127.89,48.75,13.714],[129.49,48.75,13.714],[131.09,48.75,13.714],[132.7,48.75,13.714],[134.3,48.75,13.714],[70.188,48.75,14.857],[71.791,48.75,14.857],[73.393,48.75,14.857],[74.996,48.75,14.857],[76.599,48.75,14.857],[78.202,48.75,14.857],[79.805,48.75,14.857],[81.407,48.75,14.857],[83.01,48.75,14.857],[84.613,48.75,14.857],[86.216,48.75,14.857],[87.819,48.75,14.857],[89.421,48.75,14.857],[91.024,48.75,14.857],[92.627,48.75,14.857],[94.23,48.75,14.857],[95.833,48.75,14.857],[97.435,48.75,14.857],[99.038,48.75,14.857],[100.64,48.75,14.857],[102.24,48.75,14.857],[103.85,48.75,14.857],[105.45,48.75,14.857],[107.05,48.75,14.857],[108.66,48.75,14.857],[110.26,48.75,14.857],[111.86,48.75,14.857],[113.46,48.75,14.857],[115.07,48.75,14.857],[116.67,48.75,14.857],[118.27,48.75,14.857],[119.87,48.75,14.857],[121.48,48.75,14.857],[123.08,48.75,14.857],[124.68,48.75,14.857],[126.29,48.75,14.857],[127.89,48.75,14.857],[129.49,48.75,14.857],[131.09,48.75,14.857],[132.7,48.75,14.857],[134.3,48.75,14.857],[70.188,48.75,16],[71.791,48.75,16],[73.393,48.75,16],[74.996,48.75,16],[76.599,48.75,16],[78.202,48.75,16],[79.805,48.75,16],[81.407,48.75,16],[83.01,48.75,16],[84.613,48.75,16],[86.216,48.75,16],[87.819,48.75,16],[89.421,48.75,16],[91.024,48.75,16],[92.627,48.75,16],[94.23,48.75,16],[95.833,48.75,16],[97.435,48.75,16],[99.038,48.75,16],[100.64,48.75,16],[102.24,48.75,16],[103.85,48.75,16],[105.45,48.75,16],[107.05,48.75,16],[108.66,48.75,16],[110.26,48.75,16],[111.86,48.75,16],[113.46,48.75,16],[115.07,48.75,16],[116.67,48.75,16],[118.27,48.75,16],[119.87,48.75,16],[121.48,48.75,16],[123.08,48.75,16],[124.68,48.75,16],[126.29,48.75,16],[127.89,48.75,16],[129.49,48.75,16],[131.09,48.75,16],[132.7,48.75,16],[134.3,48.75,16],[70.188,50,-0.002],[71.791,50,-0.002],[73.393,50,-0.002],[74.996,50,-0.002],[76.599,50,-0.002],[78.202,50,-0.002],[79.805,50,-0.002],[81.407,50,-0.002],[83.01,50,-0.002],[84.613,50,-0.002],[86.216,50,-0.002],[87.819,50,-0.002],[89.421,50,-0.002],[91.024,50,-0.002],[92.627,50,-0.002],[94.23,50,-0.002],[95.833,50,-0.002],[97.435,50,-0.002],[99.038,50,-0.002],[100.64,50,-0.002],[102.24,50,-0.002],[103.85,50,-0.002],[105.45,50,-0.002],[107.05,50,-0.002],[108.66,50,-0.002],[110.26,50,-0.002],[111.86,50,-0.002],[113.46,50,-0.002],[115.07,50,-0.002],[116.67,50,-0.002],[118.27,50,-0.002],[119.87,50,-0.002],[121.48,50,-0.002],[123.08,50,-0.002],[124.68,50,-0.002],[126.29,50,-0.002],[127.89,50,-0.002],[129.49,50,-0.002],[131.09,50,-0.002],[132.7,50,-0.002],[134.3,50,-0.002],[70.188,50,1.141],[71.791,50,1.141],[73.393,50,1.141],[74.996,50,1.141],[76.599,50,1.141],[78.202,50,1.141],[79.805,50,1.141],[81.407,50,1.141],[83.01,50,1.141],[84.613,50,1.141],[86.216,50,1.141],[87.819,50,1.141],[89.421,50,1.141],[91.024,50,1.141],[92.627,50,1.141],[94.23,50,1.141],[95.833,50,1.141],[97.435,50,1.141],[99.038,50,1.141],[100.64,50,1.141],[102.24,50,1.141],[103.85,50,1.141],[105.45,50,1.141],[107.05,50,1.141],[108.66,50,1.141],[110.26,50,1.141],[111.86,50,1.141],[113.46,50,1.141],[115.07,50,1.141],[116.67,50,1.141],[118.27,50,1.141],[119.87,50,1.141],[121.48,50,1.141],[123.08,50,1.141],[124.68,50,1.141],[126.29,50,1.141],[127.89,50,1.141],[129.49,50,1.141],[131.09,50,1.141],[132.7,50,1.141],[134.3,50,1.141],[70.188,50,2.284],[71.791,50,2.284],[73.393,50,2.284],[74.996,50,2.284],[76.599,50,2.284],[78.202,50,2.284],[79.805,50,2.284],[81.407,50,2.284],[83.01,50,2.284],[84.613,50,2.284],[86.216,50,2.284],[87.819,50,2.284],[89.421,50,2.284],[91.024,50,2.284],[92.627,50,2.284],[94.23,50,2.284],[95.833,50,2.284],[97.435,50,2.284],[99.038,50,2.284],[100.64,50,2.284],[102.24,50,2.284],[103.85,50,2.284],[105.45,50,2.284],[107.05,50,2.284],[108.66,50,2.284],[110.26,50,2.284],[111.86,50,2.284],[113.46,50,2.284],[115.07,50,2.284],[116.67,50,2.284],[118.27,50,2.284],[119.87,50,2.284],[121.48,50,2.284],[123.08,50,2.284],[124.68,50,2.284],[126.29,50,2.284],[127.89,50,2.284],[129.49,50,2.284],[131.09,50,2.284],[132.7,50,2.284],[134.3,50,2.284],[70.188,50,3.427],[71.791,50,3.427],[73.393,50,3.427],[74.996,50,3.427],[76.599,50,3.427],[78.202,50,3.427],[79.805,50,3.427],[81.407,50,3.427],[83.01,50,3.427],[84.613,50,3.427],[86.216,50,3.427],[87.819,50,3.427],[89.421,50,3.427],[91.024,50,3.427],[92.627,50,3.427],[94.23,50,3.427],[95.833,50,3.427],[97.435,50,3.427],[99.038,50,3.427],[100.64,50,3.427],[102.24,50,3.427],[103.85,50,3.427],[105.45,50,3.427],[107.05,50,3.427],[108.66,50,3.427],[110.26,50,3.427],[111.86,50,3.427],[113.46,50,3.427],[115.07,50,3.427],[116.67,50,3.427],[118.27,50,3.427],[119.87,50,3.427],[121.48,50,3.427],[123.08,50,3.427],[124.68,50,3.427],[126.29,50,3.427],[127.89,50,3.427],[129.49,50,3.427],[131.09,50,3.427],[132.7,50,3.427],[134.3,50,3.427],[70.188,50,4.57],[71.791,50,4.57],[73.393,50,4.57],[74.996,50,4.57],[76.599,50,4.57],[78.202,50,4.57],[79.805,50,4.57],[81.407,50,4.57],[83.01,50,4.57],[84.613,50,4.57],[86.216,50,4.57],[87.819,50,4.57],[89.421,50,4.57],[91.024,50,4.57],[92.627,50,4.57],[94.23,50,4.57],[95.833,50,4.57],[97.435,50,4.57],[99.038,50,4.57],[100.64,50,4.57],[102.24,50,4.57],[103.85,50,4.57],[105.45,50,4.57],[107.05,50,4.57],[108.66,50,4.57],[110.26,50,4.57],[111.86,50,4.57],[113.46,50,4.57],[115.07,50,4.57],[116.67,50,4.57],[118.27,50,4.57],[119.87,50,4.57],[121.48,50,4.57],[123.08,50,4.57],[124.68,50,4.57],[126.29,50,4.57],[127.89,50,4.57],[129.49,50,4.57],[131.09,50,4.57],[132.7,50,4.57],[134.3,50,4.57],[70.188,50,5.713],[71.791,50,5.713],[73.393,50,5.713],[74.996,50,5.713],[76.599,50,5.713],[78.202,50,5.713],[79.805,50,5.713],[81.407,50,5.713],[83.01,50,5.713],[84.613,50,5.713],[86.216,50,5.713],[87.819,50,5.713],[89.421,50,5.713],[91.024,50,5.713],[92.627,50,5.713],[94.23,50,5.713],[95.833,50,5.713],[97.435,50,5.713],[99.038,50,5.713],[100.64,50,5.713],[102.24,50,5.713],[103.85,50,5.713],[105.45,50,5.713],[107.05,50,5.713],[108.66,50,5.713],[110.26,50,5.713],[111.86,50,5.713],[113.46,50,5.713],[115.07,50,5.713],[116.67,50,5.713],[118.27,50,5.713],[119.87,50,5.713],[121.48,50,5.713],[123.08,50,5.713],[124.68,50,5.713],[126.29,50,5.713],[127.89,50,5.713],[129.49,50,5.713],[131.09,50,5.713],[132.7,50,5.713],[134.3,50,5.713],[70.188,50,6.856],[71.791,50,6.856],[73.393,50,6.856],[74.996,50,6.856],[76.599,50,6.856],[78.202,50,6.856],[79.805,50,6.856],[81.407,50,6.856],[83.01,50,6.856],[84.613,50,6.856],[86.216,50,6.856],[87.819,50,6.856],[89.421,50,6.856],[91.024,50,6.856],[92.627,50,6.856],[94.23,50,6.856],[95.833,50,6.856],[97.435,50,6.856],[99.038,50,6.856],[100.64,50,6.856],[102.24,50,6.856],[103.85,50,6.856],[105.45,50,6.856],[107.05,50,6.856],[108.66,50,6.856],[110.26,50,6.856],[111.86,50,6.856],[113.46,50,6.856],[115.07,50,6.856],[116.67,50,6.856],[118.27,50,6.856],[119.87,50,6.856],[121.48,50,6.856],[123.08,50,6.856],[124.68,50,6.856],[126.29,50,6.856],[127.89,50,6.856],[129.49,50,6.856],[131.09,50,6.856],[132.7,50,6.856],[134.3,50,6.856],[70.188,50,7.999],[71.791,50,7.999],[73.393,50,7.999],[74.996,50,7.999],[76.599,50,7.999],[78.202,50,7.999],[79.805,50,7.999],[81.407,50,7.999],[83.01,50,7.999],[84.613,50,7.999],[86.216,50,7.999],[87.819,50,7.999],[89.421,50,7.999],[91.024,50,7.999],[92.627,50,7.999],[94.23,50,7.999],[95.833,50,7.999],[97.435,50,7.999],[99.038,50,7.999],[100.64,50,7.999],[102.24,50,7.999],[103.85,50,7.999],[105.45,50,7.999],[107.05,50,7.999],[108.66,50,7.999],[110.26,50,7.999],[111.86,50,7.999],[113.46,50,7.999],[115.07,50,7.999],[116.67,50,7.999],[118.27,50,7.999],[119.87,50,7.999],[121.48,50,7.999],[123.08,50,7.999],[124.68,50,7.999],[126.29,50,7.999],[127.89,50,7.999],[129.49,50,7.999],[131.09,50,7.999],[132.7,50,7.999],[134.3,50,7.999],[70.188,50,9.142],[71.791,50,9.142],[73.393,50,9.142],[74.996,50,9.142],[76.599,50,9.142],[78.202,50,9.142],[79.805,50,9.142],[81.407,50,9.142],[83.01,50,9.142],[84.613,50,9.142],[86.216,50,9.142],[87.819,50,9.142],[89.421,50,9.142],[91.024,50,9.142],[92.627,50,9.142],[94.23,50,9.142],[95.833,50,9.142],[97.435,50,9.142],[99.038,50,9.142],[100.64,50,9.142],[102.24,50,9.142],[103.85,50,9.142],[105.45,50,9.142],[107.05,50,9.142],[108.66,50,9.142],[110.26,50,9.142],[111.86,50,9.142],[113.46,50,9.142],[115.07,50,9.142],[116.67,50,9.142],[118.27,50,9.142],[119.87,50,9.142],[121.48,50,9.142],[123.08,50,9.142],[124.68,50,9.142],[126.29,50,9.142],[127.89,50,9.142],[129.49,50,9.142],[131.09,50,9.142],[132.7,50,9.142],[134.3,50,9.142],[70.188,50,10.285],[71.791,50,10.285],[73.393,50,10.285],[74.996,50,10.285],[76.599,50,10.285],[78.202,50,10.285],[79.805,50,10.285],[81.407,50,10.285],[83.01,50,10.285],[84.613,50,10.285],[86.216,50,10.285],[87.819,50,10.285],[89.421,50,10.285],[91.024,50,10.285],[92.627,50,10.285],[94.23,50,10.285],[95.833,50,10.285],[97.435,50,10.285],[99.038,50,10.285],[100.64,50,10.285],[102.24,50,10.285],[103.85,50,10.285],[105.45,50,10.285],[107.05,50,10.285],[108.66,50,10.285],[110.26,50,10.285],[111.86,50,10.285],[113.46,50,10.285],[115.07,50,10.285],[116.67,50,10.285],[118.27,50,10.285],[119.87,50,10.285],[121.48,50,10.285],[123.08,50,10.285],[124.68,50,10.285],[126.29,50,10.285],[127.89,50,10.285],[129.49,50,10.285],[131.09,50,10.285],[132.7,50,10.285],[134.3,50,10.285],[70.188,50,11.428],[71.791,50,11.428],[73.393,50,11.428],[74.996,50,11.428],[76.599,50,11.428],[78.202,50,11.428],[79.805,50,11.428],[81.407,50,11.428],[83.01,50,11.428],[84.613,50,11.428],[86.216,50,11.428],[87.819,50,11.428],[89.421,50,11.428],[91.024,50,11.428],[92.627,50,11.428],[94.23,50,11.428],[95.833,50,11.428],[97.435,50,11.428],[99.038,50,11.428],[100.64,50,11.428],[102.24,50,11.428],[103.85,50,11.428],[105.45,50,11.428],[107.05,50,11.428],[108.66,50,11.428],[110.26,50,11.428],[111.86,50,11.428],[113.46,50,11.428],[115.07,50,11.428],[116.67,50,11.428],[118.27,50,11.428],[119.87,50,11.428],[121.48,50,11.428],[123.08,50,11.428],[124.68,50,11.428],[126.29,50,11.428],[127.89,50,11.428],[129.49,50,11.428],[131.09,50,11.428],[132.7,50,11.428],[134.3,50,11.428],[70.188,50,12.571],[71.791,50,12.571],[73.393,50,12.571],[74.996,50,12.571],[76.599,50,12.571],[78.202,50,12.571],[79.805,50,12.571],[81.407,50,12.571],[83.01,50,12.571],[84.613,50,12.571],[86.216,50,12.571],[87.819,50,12.571],[89.421,50,12.571],[91.024,50,12.571],[92.627,50,12.571],[94.23,50,12.571],[95.833,50,12.571],[97.435,50,12.571],[99.038,50,12.571],[100.64,50,12.571],[102.24,50,12.571],[103.85,50,12.571],[105.45,50,12.571],[107.05,50,12.571],[108.66,50,12.571],[110.26,50,12.571],[111.86,50,12.571],[113.46,50,12.571],[115.07,50,12.571],[116.67,50,12.571],[118.27,50,12.571],[119.87,50,12.571],[121.48,50,12.571],[123.08,50,12.571],[124.68,50,12.571],[126.29,50,12.571],[127.89,50,12.571],[129.49,50,12.571],[131.09,50,12.571],[132.7,50,12.571],[134.3,50,12.571],[70.188,50,13.714],[71.791,50,13.714],[73.393,50,13.714],[74.996,50,13.714],[76.599,50,13.714],[78.202,50,13.714],[79.805,50,13.714],[81.407,50,13.714],[83.01,50,13.714],[84.613,50,13.714],[86.216,50,13.714],[87.819,50,13.714],[89.421,50,13.714],[91.024,50,13.714],[92.627,50,13.714],[94.23,50,13.714],[95.833,50,13.714],[97.435,50,13.714],[99.038,50,13.714],[100.64,50,13.714],[102.24,50,13.714],[103.85,50,13.714],[105.45,50,13.714],[107.05,50,13.714],[108.66,50,13.714],[110.26,50,13.714],[111.86,50,13.714],[113.46,50,13.714],[115.07,50,13.714],[116.67,50,13.714],[118.27,50,13.714],[119.87,50,13.714],[121.48,50,13.714],[123.08,50,13.714],[124.68,50,13.714],[126.29,50,13.714],[127.89,50,13.714],[129.49,50,13.714],[131.09,50,13.714],[132.7,50,13.714],[134.3,50,13.714],[70.188,50,14.857],[71.791,50,14.857],[73.393,50,14.857],[74.996,50,14.857],[76.599,50,14.857],[78.202,50,14.857],[79.805,50,14.857],[81.407,50,14.857],[83.01,50,14.857],[84.613,50,14.857],[86.216,50,14.857],[87.819,50,14.857],[89.421,50,14.857],[91.024,50,14.857],[92.627,50,14.857],[94.23,50,14.857],[95.833,50,14.857],[97.435,50,14.857],[99.038,50,14.857],[100.64,50,14.857],[102.24,50,14.857],[103.85,50,14.857],[105.45,50,14.857],[107.05,50,14.857],[108.66,50,14.857],[110.26,50,14.857],[111.86,50,14.857],[113.46,50,14.857],[115.07,50,14.857],[116.67,50,14.857],[118.27,50,14.857],[119.87,50,14.857],[121.48,50,14.857],[123.08,50,14.857],[124.68,50,14.857],[126.29,50,14.857],[127.89,50,14.857],[129.49,50,14.857],[131.09,50,14.857],[132.7,50,14.857],[134.3,50,14.857],[70.188,50,16],[71.791,50,16],[73.393,50,16],[74.996,50,16],[76.599,50,16],[78.202,50,16],[79.805,50,16],[81.407,50,16],[83.01,50,16],[84.613,50,16],[86.216,50,16],[87.819,50,16],[89.421,50,16],[91.024,50,16],[92.627,50,16],[94.23,50,16],[95.833,50,16],[97.435,50,16],[99.038,50,16],[100.64,50,16],[102.24,50,16],[103.85,50,16],[105.45,50,16],[107.05,50,16],[108.66,50,16],[110.26,50,16],[111.86,50,16],[113.46,50,16],[115.07,50,16],[116.67,50,16],[118.27,50,16],[119.87,50,16],[121.48,50,16],[123.08,50,16],[124.68,50,16],[126.29,50,16],[127.89,50,16],[129.49,50,16],[131.09,50,16],[132.7,50,16],[134.3,50,16],[70.188,51.25,-0.002],[71.791,51.25,-0.002],[73.393,51.25,-0.002],[74.996,51.25,-0.002],[76.599,51.25,-0.002],[78.202,51.25,-0.002],[79.805,51.25,-0.002],[81.407,51.25,-0.002],[83.01,51.25,-0.002],[84.613,51.25,-0.002],[86.216,51.25,-0.002],[87.819,51.25,-0.002],[89.421,51.25,-0.002],[91.024,51.25,-0.002],[92.627,51.25,-0.002],[94.23,51.25,-0.002],[95.833,51.25,-0.002],[97.435,51.25,-0.002],[99.038,51.25,-0.002],[100.64,51.25,-0.002],[102.24,51.25,-0.002],[103.85,51.25,-0.002],[105.45,51.25,-0.002],[107.05,51.25,-0.002],[108.66,51.25,-0.002],[110.26,51.25,-0.002],[111.86,51.25,-0.002],[113.46,51.25,-0.002],[115.07,51.25,-0.002],[116.67,51.25,-0.002],[118.27,51.25,-0.002],[119.87,51.25,-0.002],[121.48,51.25,-0.002],[123.08,51.25,-0.002],[124.68,51.25,-0.002],[126.29,51.25,-0.002],[127.89,51.25,-0.002],[129.49,51.25,-0.002],[131.09,51.25,-0.002],[132.7,51.25,-0.002],[134.3,51.25,-0.002],[70.188,51.25,1.141],[71.791,51.25,1.141],[73.393,51.25,1.141],[74.996,51.25,1.141],[76.599,51.25,1.141],[78.202,51.25,1.141],[79.805,51.25,1.141],[81.407,51.25,1.141],[83.01,51.25,1.141],[84.613,51.25,1.141],[86.216,51.25,1.141],[87.819,51.25,1.141],[89.421,51.25,1.141],[91.024,51.25,1.141],[92.627,51.25,1.141],[94.23,51.25,1.141],[95.833,51.25,1.141],[97.435,51.25,1.141],[99.038,51.25,1.141],[100.64,51.25,1.141],[102.24,51.25,1.141],[103.85,51.25,1.141],[105.45,51.25,1.141],[107.05,51.25,1.141],[108.66,51.25,1.141],[110.26,51.25,1.141],[111.86,51.25,1.141],[113.46,51.25,1.141],[115.07,51.25,1.141],[116.67,51.25,1.141],[118.27,51.25,1.141],[119.87,51.25,1.141],[121.48,51.25,1.141],[123.08,51.25,1.141],[124.68,51.25,1.141],[126.29,51.25,1.141],[127.89,51.25,1.141],[129.49,51.25,1.141],[131.09,51.25,1.141],[132.7,51.25,1.141],[134.3,51.25,1.141],[70.188,51.25,2.284],[71.791,51.25,2.284],[73.393,51.25,2.284],[74.996,51.25,2.284],[76.599,51.25,2.284],[78.202,51.25,2.284],[79.805,51.25,2.284],[81.407,51.25,2.284],[83.01,51.25,2.284],[84.613,51.25,2.284],[86.216,51.25,2.284],[87.819,51.25,2.284],[89.421,51.25,2.284],[91.024,51.25,2.284],[92.627,51.25,2.284],[94.23,51.25,2.284],[95.833,51.25,2.284],[97.435,51.25,2.284],[99.038,51.25,2.284],[100.64,51.25,2.284],[102.24,51.25,2.284],[103.85,51.25,2.284],[105.45,51.25,2.284],[107.05,51.25,2.284],[108.66,51.25,2.284],[110.26,51.25,2.284],[111.86,51.25,2.284],[113.46,51.25,2.284],[115.07,51.25,2.284],[116.67,51.25,2.284],[118.27,51.25,2.284],[119.87,51.25,2.284],[121.48,51.25,2.284],[123.08,51.25,2.284],[124.68,51.25,2.284],[126.29,51.25,2.284],[127.89,51.25,2.284],[129.49,51.25,2.284],[131.09,51.25,2.284],[132.7,51.25,2.284],[134.3,51.25,2.284],[70.188,51.25,3.427],[71.791,51.25,3.427],[73.393,51.25,3.427],[74.996,51.25,3.427],[76.599,51.25,3.427],[78.202,51.25,3.427],[79.805,51.25,3.427],[81.407,51.25,3.427],[83.01,51.25,3.427],[84.613,51.25,3.427],[86.216,51.25,3.427],[87.819,51.25,3.427],[89.421,51.25,3.427],[91.024,51.25,3.427],[92.627,51.25,3.427],[94.23,51.25,3.427],[95.833,51.25,3.427],[97.435,51.25,3.427],[99.038,51.25,3.427],[100.64,51.25,3.427],[102.24,51.25,3.427],[103.85,51.25,3.427],[105.45,51.25,3.427],[107.05,51.25,3.427],[108.66,51.25,3.427],[110.26,51.25,3.427],[111.86,51.25,3.427],[113.46,51.25,3.427],[115.07,51.25,3.427],[116.67,51.25,3.427],[118.27,51.25,3.427],[119.87,51.25,3.427],[121.48,51.25,3.427],[123.08,51.25,3.427],[124.68,51.25,3.427],[126.29,51.25,3.427],[127.89,51.25,3.427],[129.49,51.25,3.427],[131.09,51.25,3.427],[132.7,51.25,3.427],[134.3,51.25,3.427],[70.188,51.25,4.57],[71.791,51.25,4.57],[73.393,51.25,4.57],[74.996,51.25,4.57],[76.599,51.25,4.57],[78.202,51.25,4.57],[79.805,51.25,4.57],[81.407,51.25,4.57],[83.01,51.25,4.57],[84.613,51.25,4.57],[86.216,51.25,4.57],[87.819,51.25,4.57],[89.421,51.25,4.57],[91.024,51.25,4.57],[92.627,51.25,4.57],[94.23,51.25,4.57],[95.833,51.25,4.57],[97.435,51.25,4.57],[99.038,51.25,4.57],[100.64,51.25,4.57],[102.24,51.25,4.57],[103.85,51.25,4.57],[105.45,51.25,4.57],[107.05,51.25,4.57],[108.66,51.25,4.57],[110.26,51.25,4.57],[111.86,51.25,4.57],[113.46,51.25,4.57],[115.07,51.25,4.57],[116.67,51.25,4.57],[118.27,51.25,4.57],[119.87,51.25,4.57],[121.48,51.25,4.57],[123.08,51.25,4.57],[124.68,51.25,4.57],[126.29,51.25,4.57],[127.89,51.25,4.57],[129.49,51.25,4.57],[131.09,51.25,4.57],[132.7,51.25,4.57],[134.3,51.25,4.57],[70.188,51.25,5.713],[71.791,51.25,5.713],[73.393,51.25,5.713],[74.996,51.25,5.713],[76.599,51.25,5.713],[78.202,51.25,5.713],[79.805,51.25,5.713],[81.407,51.25,5.713],[83.01,51.25,5.713],[84.613,51.25,5.713],[86.216,51.25,5.713],[87.819,51.25,5.713],[89.421,51.25,5.713],[91.024,51.25,5.713],[92.627,51.25,5.713],[94.23,51.25,5.713],[95.833,51.25,5.713],[97.435,51.25,5.713],[99.038,51.25,5.713],[100.64,51.25,5.713],[102.24,51.25,5.713],[103.85,51.25,5.713],[105.45,51.25,5.713],[107.05,51.25,5.713],[108.66,51.25,5.713],[110.26,51.25,5.713],[111.86,51.25,5.713],[113.46,51.25,5.713],[115.07,51.25,5.713],[116.67,51.25,5.713],[118.27,51.25,5.713],[119.87,51.25,5.713],[121.48,51.25,5.713],[123.08,51.25,5.713],[124.68,51.25,5.713],[126.29,51.25,5.713],[127.89,51.25,5.713],[129.49,51.25,5.713],[131.09,51.25,5.713],[132.7,51.25,5.713],[134.3,51.25,5.713],[70.188,51.25,6.856],[71.791,51.25,6.856],[73.393,51.25,6.856],[74.996,51.25,6.856],[76.599,51.25,6.856],[78.202,51.25,6.856],[79.805,51.25,6.856],[81.407,51.25,6.856],[83.01,51.25,6.856],[84.613,51.25,6.856],[86.216,51.25,6.856],[87.819,51.25,6.856],[89.421,51.25,6.856],[91.024,51.25,6.856],[92.627,51.25,6.856],[94.23,51.25,6.856],[95.833,51.25,6.856],[97.435,51.25,6.856],[99.038,51.25,6.856],[100.64,51.25,6.856],[102.24,51.25,6.856],[103.85,51.25,6.856],[105.45,51.25,6.856],[107.05,51.25,6.856],[108.66,51.25,6.856],[110.26,51.25,6.856],[111.86,51.25,6.856],[113.46,51.25,6.856],[115.07,51.25,6.856],[116.67,51.25,6.856],[118.27,51.25,6.856],[119.87,51.25,6.856],[121.48,51.25,6.856],[123.08,51.25,6.856],[124.68,51.25,6.856],[126.29,51.25,6.856],[127.89,51.25,6.856],[129.49,51.25,6.856],[131.09,51.25,6.856],[132.7,51.25,6.856],[134.3,51.25,6.856],[70.188,51.25,7.999],[71.791,51.25,7.999],[73.393,51.25,7.999],[74.996,51.25,7.999],[76.599,51.25,7.999],[78.202,51.25,7.999],[79.805,51.25,7.999],[81.407,51.25,7.999],[83.01,51.25,7.999],[84.613,51.25,7.999],[86.216,51.25,7.999],[87.819,51.25,7.999],[89.421,51.25,7.999],[91.024,51.25,7.999],[92.627,51.25,7.999],[94.23,51.25,7.999],[95.833,51.25,7.999],[97.435,51.25,7.999],[99.038,51.25,7.999],[100.64,51.25,7.999],[102.24,51.25,7.999],[103.85,51.25,7.999],[105.45,51.25,7.999],[107.05,51.25,7.999],[108.66,51.25,7.999],[110.26,51.25,7.999],[111.86,51.25,7.999],[113.46,51.25,7.999],[115.07,51.25,7.999],[116.67,51.25,7.999],[118.27,51.25,7.999],[119.87,51.25,7.999],[121.48,51.25,7.999],[123.08,51.25,7.999],[124.68,51.25,7.999],[126.29,51.25,7.999],[127.89,51.25,7.999],[129.49,51.25,7.999],[131.09,51.25,7.999],[132.7,51.25,7.999],[134.3,51.25,7.999],[70.188,51.25,9.142],[71.791,51.25,9.142],[73.393,51.25,9.142],[74.996,51.25,9.142],[76.599,51.25,9.142],[78.202,51.25,9.142],[79.805,51.25,9.142],[81.407,51.25,9.142],[83.01,51.25,9.142],[84.613,51.25,9.142],[86.216,51.25,9.142],[87.819,51.25,9.142],[89.421,51.25,9.142],[91.024,51.25,9.142],[92.627,51.25,9.142],[94.23,51.25,9.142],[95.833,51.25,9.142],[97.435,51.25,9.142],[99.038,51.25,9.142],[100.64,51.25,9.142],[102.24,51.25,9.142],[103.85,51.25,9.142],[105.45,51.25,9.142],[107.05,51.25,9.142],[108.66,51.25,9.142],[110.26,51.25,9.142],[111.86,51.25,9.142],[113.46,51.25,9.142],[115.07,51.25,9.142],[116.67,51.25,9.142],[118.27,51.25,9.142],[119.87,51.25,9.142],[121.48,51.25,9.142],[123.08,51.25,9.142],[124.68,51.25,9.142],[126.29,51.25,9.142],[127.89,51.25,9.142],[129.49,51.25,9.142],[131.09,51.25,9.142],[132.7,51.25,9.142],[134.3,51.25,9.142],[70.188,51.25,10.285],[71.791,51.25,10.285],[73.393,51.25,10.285],[74.996,51.25,10.285],[76.599,51.25,10.285],[78.202,51.25,10.285],[79.805,51.25,10.285],[81.407,51.25,10.285],[83.01,51.25,10.285],[84.613,51.25,10.285],[86.216,51.25,10.285],[87.819,51.25,10.285],[89.421,51.25,10.285],[91.024,51.25,10.285],[92.627,51.25,10.285],[94.23,51.25,10.285],[95.833,51.25,10.285],[97.435,51.25,10.285],[99.038,51.25,10.285],[100.64,51.25,10.285],[102.24,51.25,10.285],[103.85,51.25,10.285],[105.45,51.25,10.285],[107.05,51.25,10.285],[108.66,51.25,10.285],[110.26,51.25,10.285],[111.86,51.25,10.285],[113.46,51.25,10.285],[115.07,51.25,10.285],[116.67,51.25,10.285],[118.27,51.25,10.285],[119.87,51.25,10.285],[121.48,51.25,10.285],[123.08,51.25,10.285],[124.68,51.25,10.285],[126.29,51.25,10.285],[127.89,51.25,10.285],[129.49,51.25,10.285],[131.09,51.25,10.285],[132.7,51.25,10.285],[134.3,51.25,10.285],[70.188,51.25,11.428],[71.791,51.25,11.428],[73.393,51.25,11.428],[74.996,51.25,11.428],[76.599,51.25,11.428],[78.202,51.25,11.428],[79.805,51.25,11.428],[81.407,51.25,11.428],[83.01,51.25,11.428],[84.613,51.25,11.428],[86.216,51.25,11.428],[87.819,51.25,11.428],[89.421,51.25,11.428],[91.024,51.25,11.428],[92.627,51.25,11.428],[94.23,51.25,11.428],[95.833,51.25,11.428],[97.435,51.25,11.428],[99.038,51.25,11.428],[100.64,51.25,11.428],[102.24,51.25,11.428],[103.85,51.25,11.428],[105.45,51.25,11.428],[107.05,51.25,11.428],[108.66,51.25,11.428],[110.26,51.25,11.428],[111.86,51.25,11.428],[113.46,51.25,11.428],[115.07,51.25,11.428],[116.67,51.25,11.428],[118.27,51.25,11.428],[119.87,51.25,11.428],[121.48,51.25,11.428],[123.08,51.25,11.428],[124.68,51.25,11.428],[126.29,51.25,11.428],[127.89,51.25,11.428],[129.49,51.25,11.428],[131.09,51.25,11.428],[132.7,51.25,11.428],[134.3,51.25,11.428],[70.188,51.25,12.571],[71.791,51.25,12.571],[73.393,51.25,12.571],[74.996,51.25,12.571],[76.599,51.25,12.571],[78.202,51.25,12.571],[79.805,51.25,12.571],[81.407,51.25,12.571],[83.01,51.25,12.571],[84.613,51.25,12.571],[86.216,51.25,12.571],[87.819,51.25,12.571],[89.421,51.25,12.571],[91.024,51.25,12.571],[92.627,51.25,12.571],[94.23,51.25,12.571],[95.833,51.25,12.571],[97.435,51.25,12.571],[99.038,51.25,12.571],[100.64,51.25,12.571],[102.24,51.25,12.571],[103.85,51.25,12.571],[105.45,51.25,12.571],[107.05,51.25,12.571],[108.66,51.25,12.571],[110.26,51.25,12.571],[111.86,51.25,12.571],[113.46,51.25,12.571],[115.07,51.25,12.571],[116.67,51.25,12.571],[118.27,51.25,12.571],[119.87,51.25,12.571],[121.48,51.25,12.571],[123.08,51.25,12.571],[124.68,51.25,12.571],[126.29,51.25,12.571],[127.89,51.25,12.571],[129.49,51.25,12.571],[131.09,51.25,12.571],[132.7,51.25,12.571],[134.3,51.25,12.571],[70.188,51.25,13.714],[71.791,51.25,13.714],[73.393,51.25,13.714],[74.996,51.25,13.714],[76.599,51.25,13.714],[78.202,51.25,13.714],[79.805,51.25,13.714],[81.407,51.25,13.714],[83.01,51.25,13.714],[84.613,51.25,13.714],[86.216,51.25,13.714],[87.819,51.25,13.714],[89.421,51.25,13.714],[91.024,51.25,13.714],[92.627,51.25,13.714],[94.23,51.25,13.714],[95.833,51.25,13.714],[97.435,51.25,13.714],[99.038,51.25,13.714],[100.64,51.25,13.714],[102.24,51.25,13.714],[103.85,51.25,13.714],[105.45,51.25,13.714],[107.05,51.25,13.714],[108.66,51.25,13.714],[110.26,51.25,13.714],[111.86,51.25,13.714],[113.46,51.25,13.714],[115.07,51.25,13.714],[116.67,51.25,13.714],[118.27,51.25,13.714],[119.87,51.25,13.714],[121.48,51.25,13.714],[123.08,51.25,13.714],[124.68,51.25,13.714],[126.29,51.25,13.714],[127.89,51.25,13.714],[129.49,51.25,13.714],[131.09,51.25,13.714],[132.7,51.25,13.714],[134.3,51.25,13.714],[70.188,51.25,14.857],[71.791,51.25,14.857],[73.393,51.25,14.857],[74.996,51.25,14.857],[76.599,51.25,14.857],[78.202,51.25,14.857],[79.805,51.25,14.857],[81.407,51.25,14.857],[83.01,51.25,14.857],[84.613,51.25,14.857],[86.216,51.25,14.857],[87.819,51.25,14.857],[89.421,51.25,14.857],[91.024,51.25,14.857],[92.627,51.25,14.857],[94.23,51.25,14.857],[95.833,51.25,14.857],[97.435,51.25,14.857],[99.038,51.25,14.857],[100.64,51.25,14.857],[102.24,51.25,14.857],[103.85,51.25,14.857],[105.45,51.25,14.857],[107.05,51.25,14.857],[108.66,51.25,14.857],[110.26,51.25,14.857],[111.86,51.25,14.857],[113.46,51.25,14.857],[115.07,51.25,14.857],[116.67,51.25,14.857],[118.27,51.25,14.857],[119.87,51.25,14.857],[121.48,51.25,14.857],[123.08,51.25,14.857],[124.68,51.25,14.857],[126.29,51.25,14.857],[127.89,51.25,14.857],[129.49,51.25,14.857],[131.09,51.25,14.857],[132.7,51.25,14.857],[134.3,51.25,14.857],[70.188,51.25,16],[71.791,51.25,16],[73.393,51.25,16],[74.996,51.25,16],[76.599,51.25,16],[78.202,51.25,16],[79.805,51.25,16],[81.407,51.25,16],[83.01,51.25,16],[84.613,51.25,16],[86.216,51.25,16],[87.819,51.25,16],[89.421,51.25,16],[91.024,51.25,16],[92.627,51.25,16],[94.23,51.25,16],[95.833,51.25,16],[97.435,51.25,16],[99.038,51.25,16],[100.64,51.25,16],[102.24,51.25,16],[103.85,51.25,16],[105.45,51.25,16],[107.05,51.25,16],[108.66,51.25,16],[110.26,51.25,16],[111.86,51.25,16],[113.46,51.25,16],[115.07,51.25,16],[116.67,51.25,16],[118.27,51.25,16],[119.87,51.25,16],[121.48,51.25,16],[123.08,51.25,16],[124.68,51.25,16],[126.29,51.25,16],[127.89,51.25,16],[129.49,51.25,16],[131.09,51.25,16],[132.7,51.25,16],[134.3,51.25,16],[70.188,52.5,-0.002],[71.791,52.5,-0.002],[73.393,52.5,-0.002],[74.996,52.5,-0.002],[76.599,52.5,-0.002],[78.202,52.5,-0.002],[79.805,52.5,-0.002],[81.407,52.5,-0.002],[83.01,52.5,-0.002],[84.613,52.5,-0.002],[86.216,52.5,-0.002],[87.819,52.5,-0.002],[89.421,52.5,-0.002],[91.024,52.5,-0.002],[92.627,52.5,-0.002],[94.23,52.5,-0.002],[95.833,52.5,-0.002],[97.435,52.5,-0.002],[99.038,52.5,-0.002],[100.64,52.5,-0.002],[102.24,52.5,-0.002],[103.85,52.5,-0.002],[105.45,52.5,-0.002],[107.05,52.5,-0.002],[108.66,52.5,-0.002],[110.26,52.5,-0.002],[111.86,52.5,-0.002],[113.46,52.5,-0.002],[115.07,52.5,-0.002],[116.67,52.5,-0.002],[118.27,52.5,-0.002],[119.87,52.5,-0.002],[121.48,52.5,-0.002],[123.08,52.5,-0.002],[124.68,52.5,-0.002],[126.29,52.5,-0.002],[127.89,52.5,-0.002],[129.49,52.5,-0.002],[131.09,52.5,-0.002],[132.7,52.5,-0.002],[134.3,52.5,-0.002],[70.188,52.5,1.141],[71.791,52.5,1.141],[73.393,52.5,1.141],[74.996,52.5,1.141],[76.599,52.5,1.141],[78.202,52.5,1.141],[79.805,52.5,1.141],[81.407,52.5,1.141],[83.01,52.5,1.141],[84.613,52.5,1.141],[86.216,52.5,1.141],[87.819,52.5,1.141],[89.421,52.5,1.141],[91.024,52.5,1.141],[92.627,52.5,1.141],[94.23,52.5,1.141],[95.833,52.5,1.141],[97.435,52.5,1.141],[99.038,52.5,1.141],[100.64,52.5,1.141],[102.24,52.5,1.141],[103.85,52.5,1.141],[105.45,52.5,1.141],[107.05,52.5,1.141],[108.66,52.5,1.141],[110.26,52.5,1.141],[111.86,52.5,1.141],[113.46,52.5,1.141],[115.07,52.5,1.141],[116.67,52.5,1.141],[118.27,52.5,1.141],[119.87,52.5,1.141],[121.48,52.5,1.141],[123.08,52.5,1.141],[124.68,52.5,1.141],[126.29,52.5,1.141],[127.89,52.5,1.141],[129.49,52.5,1.141],[131.09,52.5,1.141],[132.7,52.5,1.141],[134.3,52.5,1.141],[70.188,52.5,2.284],[71.791,52.5,2.284],[73.393,52.5,2.284],[74.996,52.5,2.284],[76.599,52.5,2.284],[78.202,52.5,2.284],[79.805,52.5,2.284],[81.407,52.5,2.284],[83.01,52.5,2.284],[84.613,52.5,2.284],[86.216,52.5,2.284],[87.819,52.5,2.284],[89.421,52.5,2.284],[91.024,52.5,2.284],[92.627,52.5,2.284],[94.23,52.5,2.284],[95.833,52.5,2.284],[97.435,52.5,2.284],[99.038,52.5,2.284],[100.64,52.5,2.284],[102.24,52.5,2.284],[103.85,52.5,2.284],[105.45,52.5,2.284],[107.05,52.5,2.284],[108.66,52.5,2.284],[110.26,52.5,2.284],[111.86,52.5,2.284],[113.46,52.5,2.284],[115.07,52.5,2.284],[116.67,52.5,2.284],[118.27,52.5,2.284],[119.87,52.5,2.284],[121.48,52.5,2.284],[123.08,52.5,2.284],[124.68,52.5,2.284],[126.29,52.5,2.284],[127.89,52.5,2.284],[129.49,52.5,2.284],[131.09,52.5,2.284],[132.7,52.5,2.284],[134.3,52.5,2.284],[70.188,52.5,3.427],[71.791,52.5,3.427],[73.393,52.5,3.427],[74.996,52.5,3.427],[76.599,52.5,3.427],[78.202,52.5,3.427],[79.805,52.5,3.427],[81.407,52.5,3.427],[83.01,52.5,3.427],[84.613,52.5,3.427],[86.216,52.5,3.427],[87.819,52.5,3.427],[89.421,52.5,3.427],[91.024,52.5,3.427],[92.627,52.5,3.427],[94.23,52.5,3.427],[95.833,52.5,3.427],[97.435,52.5,3.427],[99.038,52.5,3.427],[100.64,52.5,3.427],[102.24,52.5,3.427],[103.85,52.5,3.427],[105.45,52.5,3.427],[107.05,52.5,3.427],[108.66,52.5,3.427],[110.26,52.5,3.427],[111.86,52.5,3.427],[113.46,52.5,3.427],[115.07,52.5,3.427],[116.67,52.5,3.427],[118.27,52.5,3.427],[119.87,52.5,3.427],[121.48,52.5,3.427],[123.08,52.5,3.427],[124.68,52.5,3.427],[126.29,52.5,3.427],[127.89,52.5,3.427],[129.49,52.5,3.427],[131.09,52.5,3.427],[132.7,52.5,3.427],[134.3,52.5,3.427],[70.188,52.5,4.57],[71.791,52.5,4.57],[73.393,52.5,4.57],[74.996,52.5,4.57],[76.599,52.5,4.57],[78.202,52.5,4.57],[79.805,52.5,4.57],[81.407,52.5,4.57],[83.01,52.5,4.57],[84.613,52.5,4.57],[86.216,52.5,4.57],[87.819,52.5,4.57],[89.421,52.5,4.57],[91.024,52.5,4.57],[92.627,52.5,4.57],[94.23,52.5,4.57],[95.833,52.5,4.57],[97.435,52.5,4.57],[99.038,52.5,4.57],[100.64,52.5,4.57],[102.24,52.5,4.57],[103.85,52.5,4.57],[105.45,52.5,4.57],[107.05,52.5,4.57],[108.66,52.5,4.57],[110.26,52.5,4.57],[111.86,52.5,4.57],[113.46,52.5,4.57],[115.07,52.5,4.57],[116.67,52.5,4.57],[118.27,52.5,4.57],[119.87,52.5,4.57],[121.48,52.5,4.57],[123.08,52.5,4.57],[124.68,52.5,4.57],[126.29,52.5,4.57],[127.89,52.5,4.57],[129.49,52.5,4.57],[131.09,52.5,4.57],[132.7,52.5,4.57],[134.3,52.5,4.57],[70.188,52.5,5.713],[71.791,52.5,5.713],[73.393,52.5,5.713],[74.996,52.5,5.713],[76.599,52.5,5.713],[78.202,52.5,5.713],[79.805,52.5,5.713],[81.407,52.5,5.713],[83.01,52.5,5.713],[84.613,52.5,5.713],[86.216,52.5,5.713],[87.819,52.5,5.713],[89.421,52.5,5.713],[91.024,52.5,5.713],[92.627,52.5,5.713],[94.23,52.5,5.713],[95.833,52.5,5.713],[97.435,52.5,5.713],[99.038,52.5,5.713],[100.64,52.5,5.713],[102.24,52.5,5.713],[103.85,52.5,5.713],[105.45,52.5,5.713],[107.05,52.5,5.713],[108.66,52.5,5.713],[110.26,52.5,5.713],[111.86,52.5,5.713],[113.46,52.5,5.713],[115.07,52.5,5.713],[116.67,52.5,5.713],[118.27,52.5,5.713],[119.87,52.5,5.713],[121.48,52.5,5.713],[123.08,52.5,5.713],[124.68,52.5,5.713],[126.29,52.5,5.713],[127.89,52.5,5.713],[129.49,52.5,5.713],[131.09,52.5,5.713],[132.7,52.5,5.713],[134.3,52.5,5.713],[70.188,52.5,6.856],[71.791,52.5,6.856],[73.393,52.5,6.856],[74.996,52.5,6.856],[76.599,52.5,6.856],[78.202,52.5,6.856],[79.805,52.5,6.856],[81.407,52.5,6.856],[83.01,52.5,6.856],[84.613,52.5,6.856],[86.216,52.5,6.856],[87.819,52.5,6.856],[89.421,52.5,6.856],[91.024,52.5,6.856],[92.627,52.5,6.856],[94.23,52.5,6.856],[95.833,52.5,6.856],[97.435,52.5,6.856],[99.038,52.5,6.856],[100.64,52.5,6.856],[102.24,52.5,6.856],[103.85,52.5,6.856],[105.45,52.5,6.856],[107.05,52.5,6.856],[108.66,52.5,6.856],[110.26,52.5,6.856],[111.86,52.5,6.856],[113.46,52.5,6.856],[115.07,52.5,6.856],[116.67,52.5,6.856],[118.27,52.5,6.856],[119.87,52.5,6.856],[121.48,52.5,6.856],[123.08,52.5,6.856],[124.68,52.5,6.856],[126.29,52.5,6.856],[127.89,52.5,6.856],[129.49,52.5,6.856],[131.09,52.5,6.856],[132.7,52.5,6.856],[134.3,52.5,6.856],[70.188,52.5,7.999],[71.791,52.5,7.999],[73.393,52.5,7.999],[74.996,52.5,7.999],[76.599,52.5,7.999],[78.202,52.5,7.999],[79.805,52.5,7.999],[81.407,52.5,7.999],[83.01,52.5,7.999],[84.613,52.5,7.999],[86.216,52.5,7.999],[87.819,52.5,7.999],[89.421,52.5,7.999],[91.024,52.5,7.999],[92.627,52.5,7.999],[94.23,52.5,7.999],[95.833,52.5,7.999],[97.435,52.5,7.999],[99.038,52.5,7.999],[100.64,52.5,7.999],[102.24,52.5,7.999],[103.85,52.5,7.999],[105.45,52.5,7.999],[107.05,52.5,7.999],[108.66,52.5,7.999],[110.26,52.5,7.999],[111.86,52.5,7.999],[113.46,52.5,7.999],[115.07,52.5,7.999],[116.67,52.5,7.999],[118.27,52.5,7.999],[119.87,52.5,7.999],[121.48,52.5,7.999],[123.08,52.5,7.999],[124.68,52.5,7.999],[126.29,52.5,7.999],[127.89,52.5,7.999],[129.49,52.5,7.999],[131.09,52.5,7.999],[132.7,52.5,7.999],[134.3,52.5,7.999],[70.188,52.5,9.142],[71.791,52.5,9.142],[73.393,52.5,9.142],[74.996,52.5,9.142],[76.599,52.5,9.142],[78.202,52.5,9.142],[79.805,52.5,9.142],[81.407,52.5,9.142],[83.01,52.5,9.142],[84.613,52.5,9.142],[86.216,52.5,9.142],[87.819,52.5,9.142],[89.421,52.5,9.142],[91.024,52.5,9.142],[92.627,52.5,9.142],[94.23,52.5,9.142],[95.833,52.5,9.142],[97.435,52.5,9.142],[99.038,52.5,9.142],[100.64,52.5,9.142],[102.24,52.5,9.142],[103.85,52.5,9.142],[105.45,52.5,9.142],[107.05,52.5,9.142],[108.66,52.5,9.142],[110.26,52.5,9.142],[111.86,52.5,9.142],[113.46,52.5,9.142],[115.07,52.5,9.142],[116.67,52.5,9.142],[118.27,52.5,9.142],[119.87,52.5,9.142],[121.48,52.5,9.142],[123.08,52.5,9.142],[124.68,52.5,9.142],[126.29,52.5,9.142],[127.89,52.5,9.142],[129.49,52.5,9.142],[131.09,52.5,9.142],[132.7,52.5,9.142],[134.3,52.5,9.142],[70.188,52.5,10.285],[71.791,52.5,10.285],[73.393,52.5,10.285],[74.996,52.5,10.285],[76.599,52.5,10.285],[78.202,52.5,10.285],[79.805,52.5,10.285],[81.407,52.5,10.285],[83.01,52.5,10.285],[84.613,52.5,10.285],[86.216,52.5,10.285],[87.819,52.5,10.285],[89.421,52.5,10.285],[91.024,52.5,10.285],[92.627,52.5,10.285],[94.23,52.5,10.285],[95.833,52.5,10.285],[97.435,52.5,10.285],[99.038,52.5,10.285],[100.64,52.5,10.285],[102.24,52.5,10.285],[103.85,52.5,10.285],[105.45,52.5,10.285],[107.05,52.5,10.285],[108.66,52.5,10.285],[110.26,52.5,10.285],[111.86,52.5,10.285],[113.46,52.5,10.285],[115.07,52.5,10.285],[116.67,52.5,10.285],[118.27,52.5,10.285],[119.87,52.5,10.285],[121.48,52.5,10.285],[123.08,52.5,10.285],[124.68,52.5,10.285],[126.29,52.5,10.285],[127.89,52.5,10.285],[129.49,52.5,10.285],[131.09,52.5,10.285],[132.7,52.5,10.285],[134.3,52.5,10.285],[70.188,52.5,11.428],[71.791,52.5,11.428],[73.393,52.5,11.428],[74.996,52.5,11.428],[76.599,52.5,11.428],[78.202,52.5,11.428],[79.805,52.5,11.428],[81.407,52.5,11.428],[83.01,52.5,11.428],[84.613,52.5,11.428],[86.216,52.5,11.428],[87.819,52.5,11.428],[89.421,52.5,11.428],[91.024,52.5,11.428],[92.627,52.5,11.428],[94.23,52.5,11.428],[95.833,52.5,11.428],[97.435,52.5,11.428],[99.038,52.5,11.428],[100.64,52.5,11.428],[102.24,52.5,11.428],[103.85,52.5,11.428],[105.45,52.5,11.428],[107.05,52.5,11.428],[108.66,52.5,11.428],[110.26,52.5,11.428],[111.86,52.5,11.428],[113.46,52.5,11.428],[115.07,52.5,11.428],[116.67,52.5,11.428],[118.27,52.5,11.428],[119.87,52.5,11.428],[121.48,52.5,11.428],[123.08,52.5,11.428],[124.68,52.5,11.428],[126.29,52.5,11.428],[127.89,52.5,11.428],[129.49,52.5,11.428],[131.09,52.5,11.428],[132.7,52.5,11.428],[134.3,52.5,11.428],[70.188,52.5,12.571],[71.791,52.5,12.571],[73.393,52.5,12.571],[74.996,52.5,12.571],[76.599,52.5,12.571],[78.202,52.5,12.571],[79.805,52.5,12.571],[81.407,52.5,12.571],[83.01,52.5,12.571],[84.613,52.5,12.571],[86.216,52.5,12.571],[87.819,52.5,12.571],[89.421,52.5,12.571],[91.024,52.5,12.571],[92.627,52.5,12.571],[94.23,52.5,12.571],[95.833,52.5,12.571],[97.435,52.5,12.571],[99.038,52.5,12.571],[100.64,52.5,12.571],[102.24,52.5,12.571],[103.85,52.5,12.571],[105.45,52.5,12.571],[107.05,52.5,12.571],[108.66,52.5,12.571],[110.26,52.5,12.571],[111.86,52.5,12.571],[113.46,52.5,12.571],[115.07,52.5,12.571],[116.67,52.5,12.571],[118.27,52.5,12.571],[119.87,52.5,12.571],[121.48,52.5,12.571],[123.08,52.5,12.571],[124.68,52.5,12.571],[126.29,52.5,12.571],[127.89,52.5,12.571],[129.49,52.5,12.571],[131.09,52.5,12.571],[132.7,52.5,12.571],[134.3,52.5,12.571],[70.188,52.5,13.714],[71.791,52.5,13.714],[73.393,52.5,13.714],[74.996,52.5,13.714],[76.599,52.5,13.714],[78.202,52.5,13.714],[79.805,52.5,13.714],[81.407,52.5,13.714],[83.01,52.5,13.714],[84.613,52.5,13.714],[86.216,52.5,13.714],[87.819,52.5,13.714],[89.421,52.5,13.714],[91.024,52.5,13.714],[92.627,52.5,13.714],[94.23,52.5,13.714],[95.833,52.5,13.714],[97.435,52.5,13.714],[99.038,52.5,13.714],[100.64,52.5,13.714],[102.24,52.5,13.714],[103.85,52.5,13.714],[105.45,52.5,13.714],[107.05,52.5,13.714],[108.66,52.5,13.714],[110.26,52.5,13.714],[111.86,52.5,13.714],[113.46,52.5,13.714],[115.07,52.5,13.714],[116.67,52.5,13.714],[118.27,52.5,13.714],[119.87,52.5,13.714],[121.48,52.5,13.714],[123.08,52.5,13.714],[124.68,52.5,13.714],[126.29,52.5,13.714],[127.89,52.5,13.714],[129.49,52.5,13.714],[131.09,52.5,13.714],[132.7,52.5,13.714],[134.3,52.5,13.714],[70.188,52.5,14.857],[71.791,52.5,14.857],[73.393,52.5,14.857],[74.996,52.5,14.857],[76.599,52.5,14.857],[78.202,52.5,14.857],[79.805,52.5,14.857],[81.407,52.5,14.857],[83.01,52.5,14.857],[84.613,52.5,14.857],[86.216,52.5,14.857],[87.819,52.5,14.857],[89.421,52.5,14.857],[91.024,52.5,14.857],[92.627,52.5,14.857],[94.23,52.5,14.857],[95.833,52.5,14.857],[97.435,52.5,14.857],[99.038,52.5,14.857],[100.64,52.5,14.857],[102.24,52.5,14.857],[103.85,52.5,14.857],[105.45,52.5,14.857],[107.05,52.5,14.857],[108.66,52.5,14.857],[110.26,52.5,14.857],[111.86,52.5,14.857],[113.46,52.5,14.857],[115.07,52.5,14.857],[116.67,52.5,14.857],[118.27,52.5,14.857],[119.87,52.5,14.857],[121.48,52.5,14.857],[123.08,52.5,14.857],[124.68,52.5,14.857],[126.29,52.5,14.857],[127.89,52.5,14.857],[129.49,52.5,14.857],[131.09,52.5,14.857],[132.7,52.5,14.857],[134.3,52.5,14.857],[70.188,52.5,16],[71.791,52.5,16],[73.393,52.5,16],[74.996,52.5,16],[76.599,52.5,16],[78.202,52.5,16],[79.805,52.5,16],[81.407,52.5,16],[83.01,52.5,16],[84.613,52.5,16],[86.216,52.5,16],[87.819,52.5,16],[89.421,52.5,16],[91.024,52.5,16],[92.627,52.5,16],[94.23,52.5,16],[95.833,52.5,16],[97.435,52.5,16],[99.038,52.5,16],[100.64,52.5,16],[102.24,52.5,16],[103.85,52.5,16],[105.45,52.5,16],[107.05,52.5,16],[108.66,52.5,16],[110.26,52.5,16],[111.86,52.5,16],[113.46,52.5,16],[115.07,52.5,16],[116.67,52.5,16],[118.27,52.5,16],[119.87,52.5,16],[121.48,52.5,16],[123.08,52.5,16],[124.68,52.5,16],[126.29,52.5,16],[127.89,52.5,16],[129.49,52.5,16],[131.09,52.5,16],[132.7,52.5,16],[134.3,52.5,16],[70.188,53.75,-0.002],[71.791,53.75,-0.002],[73.393,53.75,-0.002],[74.996,53.75,-0.002],[76.599,53.75,-0.002],[78.202,53.75,-0.002],[79.805,53.75,-0.002],[81.407,53.75,-0.002],[83.01,53.75,-0.002],[84.613,53.75,-0.002],[86.216,53.75,-0.002],[87.819,53.75,-0.002],[89.421,53.75,-0.002],[91.024,53.75,-0.002],[92.627,53.75,-0.002],[94.23,53.75,-0.002],[95.833,53.75,-0.002],[97.435,53.75,-0.002],[99.038,53.75,-0.002],[100.64,53.75,-0.002],[102.24,53.75,-0.002],[103.85,53.75,-0.002],[105.45,53.75,-0.002],[107.05,53.75,-0.002],[108.66,53.75,-0.002],[110.26,53.75,-0.002],[111.86,53.75,-0.002],[113.46,53.75,-0.002],[115.07,53.75,-0.002],[116.67,53.75,-0.002],[118.27,53.75,-0.002],[119.87,53.75,-0.002],[121.48,53.75,-0.002],[123.08,53.75,-0.002],[124.68,53.75,-0.002],[126.29,53.75,-0.002],[127.89,53.75,-0.002],[129.49,53.75,-0.002],[131.09,53.75,-0.002],[132.7,53.75,-0.002],[134.3,53.75,-0.002],[70.188,53.75,1.141],[71.791,53.75,1.141],[73.393,53.75,1.141],[74.996,53.75,1.141],[76.599,53.75,1.141],[78.202,53.75,1.141],[79.805,53.75,1.141],[81.407,53.75,1.141],[83.01,53.75,1.141],[84.613,53.75,1.141],[86.216,53.75,1.141],[87.819,53.75,1.141],[89.421,53.75,1.141],[91.024,53.75,1.141],[92.627,53.75,1.141],[94.23,53.75,1.141],[95.833,53.75,1.141],[97.435,53.75,1.141],[99.038,53.75,1.141],[100.64,53.75,1.141],[102.24,53.75,1.141],[103.85,53.75,1.141],[105.45,53.75,1.141],[107.05,53.75,1.141],[108.66,53.75,1.141],[110.26,53.75,1.141],[111.86,53.75,1.141],[113.46,53.75,1.141],[115.07,53.75,1.141],[116.67,53.75,1.141],[118.27,53.75,1.141],[119.87,53.75,1.141],[121.48,53.75,1.141],[123.08,53.75,1.141],[124.68,53.75,1.141],[126.29,53.75,1.141],[127.89,53.75,1.141],[129.49,53.75,1.141],[131.09,53.75,1.141],[132.7,53.75,1.141],[134.3,53.75,1.141],[70.188,53.75,2.284],[71.791,53.75,2.284],[73.393,53.75,2.284],[74.996,53.75,2.284],[76.599,53.75,2.284],[78.202,53.75,2.284],[79.805,53.75,2.284],[81.407,53.75,2.284],[83.01,53.75,2.284],[84.613,53.75,2.284],[86.216,53.75,2.284],[87.819,53.75,2.284],[89.421,53.75,2.284],[91.024,53.75,2.284],[92.627,53.75,2.284],[94.23,53.75,2.284],[95.833,53.75,2.284],[97.435,53.75,2.284],[99.038,53.75,2.284],[100.64,53.75,2.284],[102.24,53.75,2.284],[103.85,53.75,2.284],[105.45,53.75,2.284],[107.05,53.75,2.284],[108.66,53.75,2.284],[110.26,53.75,2.284],[111.86,53.75,2.284],[113.46,53.75,2.284],[115.07,53.75,2.284],[116.67,53.75,2.284],[118.27,53.75,2.284],[119.87,53.75,2.284],[121.48,53.75,2.284],[123.08,53.75,2.284],[124.68,53.75,2.284],[126.29,53.75,2.284],[127.89,53.75,2.284],[129.49,53.75,2.284],[131.09,53.75,2.284],[132.7,53.75,2.284],[134.3,53.75,2.284],[70.188,53.75,3.427],[71.791,53.75,3.427],[73.393,53.75,3.427],[74.996,53.75,3.427],[76.599,53.75,3.427],[78.202,53.75,3.427],[79.805,53.75,3.427],[81.407,53.75,3.427],[83.01,53.75,3.427],[84.613,53.75,3.427],[86.216,53.75,3.427],[87.819,53.75,3.427],[89.421,53.75,3.427],[91.024,53.75,3.427],[92.627,53.75,3.427],[94.23,53.75,3.427],[95.833,53.75,3.427],[97.435,53.75,3.427],[99.038,53.75,3.427],[100.64,53.75,3.427],[102.24,53.75,3.427],[103.85,53.75,3.427],[105.45,53.75,3.427],[107.05,53.75,3.427],[108.66,53.75,3.427],[110.26,53.75,3.427],[111.86,53.75,3.427],[113.46,53.75,3.427],[115.07,53.75,3.427],[116.67,53.75,3.427],[118.27,53.75,3.427],[119.87,53.75,3.427],[121.48,53.75,3.427],[123.08,53.75,3.427],[124.68,53.75,3.427],[126.29,53.75,3.427],[127.89,53.75,3.427],[129.49,53.75,3.427],[131.09,53.75,3.427],[132.7,53.75,3.427],[134.3,53.75,3.427],[70.188,53.75,4.57],[71.791,53.75,4.57],[73.393,53.75,4.57],[74.996,53.75,4.57],[76.599,53.75,4.57],[78.202,53.75,4.57],[79.805,53.75,4.57],[81.407,53.75,4.57],[83.01,53.75,4.57],[84.613,53.75,4.57],[86.216,53.75,4.57],[87.819,53.75,4.57],[89.421,53.75,4.57],[91.024,53.75,4.57],[92.627,53.75,4.57],[94.23,53.75,4.57],[95.833,53.75,4.57],[97.435,53.75,4.57],[99.038,53.75,4.57],[100.64,53.75,4.57],[102.24,53.75,4.57],[103.85,53.75,4.57],[105.45,53.75,4.57],[107.05,53.75,4.57],[108.66,53.75,4.57],[110.26,53.75,4.57],[111.86,53.75,4.57],[113.46,53.75,4.57],[115.07,53.75,4.57],[116.67,53.75,4.57],[118.27,53.75,4.57],[119.87,53.75,4.57],[121.48,53.75,4.57],[123.08,53.75,4.57],[124.68,53.75,4.57],[126.29,53.75,4.57],[127.89,53.75,4.57],[129.49,53.75,4.57],[131.09,53.75,4.57],[132.7,53.75,4.57],[134.3,53.75,4.57],[70.188,53.75,5.713],[71.791,53.75,5.713],[73.393,53.75,5.713],[74.996,53.75,5.713],[76.599,53.75,5.713],[78.202,53.75,5.713],[79.805,53.75,5.713],[81.407,53.75,5.713],[83.01,53.75,5.713],[84.613,53.75,5.713],[86.216,53.75,5.713],[87.819,53.75,5.713],[89.421,53.75,5.713],[91.024,53.75,5.713],[92.627,53.75,5.713],[94.23,53.75,5.713],[95.833,53.75,5.713],[97.435,53.75,5.713],[99.038,53.75,5.713],[100.64,53.75,5.713],[102.24,53.75,5.713],[103.85,53.75,5.713],[105.45,53.75,5.713],[107.05,53.75,5.713],[108.66,53.75,5.713],[110.26,53.75,5.713],[111.86,53.75,5.713],[113.46,53.75,5.713],[115.07,53.75,5.713],[116.67,53.75,5.713],[118.27,53.75,5.713],[119.87,53.75,5.713],[121.48,53.75,5.713],[123.08,53.75,5.713],[124.68,53.75,5.713],[126.29,53.75,5.713],[127.89,53.75,5.713],[129.49,53.75,5.713],[131.09,53.75,5.713],[132.7,53.75,5.713],[134.3,53.75,5.713],[70.188,53.75,6.856],[71.791,53.75,6.856],[73.393,53.75,6.856],[74.996,53.75,6.856],[76.599,53.75,6.856],[78.202,53.75,6.856],[79.805,53.75,6.856],[81.407,53.75,6.856],[83.01,53.75,6.856],[84.613,53.75,6.856],[86.216,53.75,6.856],[87.819,53.75,6.856],[89.421,53.75,6.856],[91.024,53.75,6.856],[92.627,53.75,6.856],[94.23,53.75,6.856],[95.833,53.75,6.856],[97.435,53.75,6.856],[99.038,53.75,6.856],[100.64,53.75,6.856],[102.24,53.75,6.856],[103.85,53.75,6.856],[105.45,53.75,6.856],[107.05,53.75,6.856],[108.66,53.75,6.856],[110.26,53.75,6.856],[111.86,53.75,6.856],[113.46,53.75,6.856],[115.07,53.75,6.856],[116.67,53.75,6.856],[118.27,53.75,6.856],[119.87,53.75,6.856],[121.48,53.75,6.856],[123.08,53.75,6.856],[124.68,53.75,6.856],[126.29,53.75,6.856],[127.89,53.75,6.856],[129.49,53.75,6.856],[131.09,53.75,6.856],[132.7,53.75,6.856],[134.3,53.75,6.856],[70.188,53.75,7.999],[71.791,53.75,7.999],[73.393,53.75,7.999],[74.996,53.75,7.999],[76.599,53.75,7.999],[78.202,53.75,7.999],[79.805,53.75,7.999],[81.407,53.75,7.999],[83.01,53.75,7.999],[84.613,53.75,7.999],[86.216,53.75,7.999],[87.819,53.75,7.999],[89.421,53.75,7.999],[91.024,53.75,7.999],[92.627,53.75,7.999],[94.23,53.75,7.999],[95.833,53.75,7.999],[97.435,53.75,7.999],[99.038,53.75,7.999],[100.64,53.75,7.999],[102.24,53.75,7.999],[103.85,53.75,7.999],[105.45,53.75,7.999],[107.05,53.75,7.999],[108.66,53.75,7.999],[110.26,53.75,7.999],[111.86,53.75,7.999],[113.46,53.75,7.999],[115.07,53.75,7.999],[116.67,53.75,7.999],[118.27,53.75,7.999],[119.87,53.75,7.999],[121.48,53.75,7.999],[123.08,53.75,7.999],[124.68,53.75,7.999],[126.29,53.75,7.999],[127.89,53.75,7.999],[129.49,53.75,7.999],[131.09,53.75,7.999],[132.7,53.75,7.999],[134.3,53.75,7.999],[70.188,53.75,9.142],[71.791,53.75,9.142],[73.393,53.75,9.142],[74.996,53.75,9.142],[76.599,53.75,9.142],[78.202,53.75,9.142],[79.805,53.75,9.142],[81.407,53.75,9.142],[83.01,53.75,9.142],[84.613,53.75,9.142],[86.216,53.75,9.142],[87.819,53.75,9.142],[89.421,53.75,9.142],[91.024,53.75,9.142],[92.627,53.75,9.142],[94.23,53.75,9.142],[95.833,53.75,9.142],[97.435,53.75,9.142],[99.038,53.75,9.142],[100.64,53.75,9.142],[102.24,53.75,9.142],[103.85,53.75,9.142],[105.45,53.75,9.142],[107.05,53.75,9.142],[108.66,53.75,9.142],[110.26,53.75,9.142],[111.86,53.75,9.142],[113.46,53.75,9.142],[115.07,53.75,9.142],[116.67,53.75,9.142],[118.27,53.75,9.142],[119.87,53.75,9.142],[121.48,53.75,9.142],[123.08,53.75,9.142],[124.68,53.75,9.142],[126.29,53.75,9.142],[127.89,53.75,9.142],[129.49,53.75,9.142],[131.09,53.75,9.142],[132.7,53.75,9.142],[134.3,53.75,9.142],[70.188,53.75,10.285],[71.791,53.75,10.285],[73.393,53.75,10.285],[74.996,53.75,10.285],[76.599,53.75,10.285],[78.202,53.75,10.285],[79.805,53.75,10.285],[81.407,53.75,10.285],[83.01,53.75,10.285],[84.613,53.75,10.285],[86.216,53.75,10.285],[87.819,53.75,10.285],[89.421,53.75,10.285],[91.024,53.75,10.285],[92.627,53.75,10.285],[94.23,53.75,10.285],[95.833,53.75,10.285],[97.435,53.75,10.285],[99.038,53.75,10.285],[100.64,53.75,10.285],[102.24,53.75,10.285],[103.85,53.75,10.285],[105.45,53.75,10.285],[107.05,53.75,10.285],[108.66,53.75,10.285],[110.26,53.75,10.285],[111.86,53.75,10.285],[113.46,53.75,10.285],[115.07,53.75,10.285],[116.67,53.75,10.285],[118.27,53.75,10.285],[119.87,53.75,10.285],[121.48,53.75,10.285],[123.08,53.75,10.285],[124.68,53.75,10.285],[126.29,53.75,10.285],[127.89,53.75,10.285],[129.49,53.75,10.285],[131.09,53.75,10.285],[132.7,53.75,10.285],[134.3,53.75,10.285],[70.188,53.75,11.428],[71.791,53.75,11.428],[73.393,53.75,11.428],[74.996,53.75,11.428],[76.599,53.75,11.428],[78.202,53.75,11.428],[79.805,53.75,11.428],[81.407,53.75,11.428],[83.01,53.75,11.428],[84.613,53.75,11.428],[86.216,53.75,11.428],[87.819,53.75,11.428],[89.421,53.75,11.428],[91.024,53.75,11.428],[92.627,53.75,11.428],[94.23,53.75,11.428],[95.833,53.75,11.428],[97.435,53.75,11.428],[99.038,53.75,11.428],[100.64,53.75,11.428],[102.24,53.75,11.428],[103.85,53.75,11.428],[105.45,53.75,11.428],[107.05,53.75,11.428],[108.66,53.75,11.428],[110.26,53.75,11.428],[111.86,53.75,11.428],[113.46,53.75,11.428],[115.07,53.75,11.428],[116.67,53.75,11.428],[118.27,53.75,11.428],[119.87,53.75,11.428],[121.48,53.75,11.428],[123.08,53.75,11.428],[124.68,53.75,11.428],[126.29,53.75,11.428],[127.89,53.75,11.428],[129.49,53.75,11.428],[131.09,53.75,11.428],[132.7,53.75,11.428],[134.3,53.75,11.428],[70.188,53.75,12.571],[71.791,53.75,12.571],[73.393,53.75,12.571],[74.996,53.75,12.571],[76.599,53.75,12.571],[78.202,53.75,12.571],[79.805,53.75,12.571],[81.407,53.75,12.571],[83.01,53.75,12.571],[84.613,53.75,12.571],[86.216,53.75,12.571],[87.819,53.75,12.571],[89.421,53.75,12.571],[91.024,53.75,12.571],[92.627,53.75,12.571],[94.23,53.75,12.571],[95.833,53.75,12.571],[97.435,53.75,12.571],[99.038,53.75,12.571],[100.64,53.75,12.571],[102.24,53.75,12.571],[103.85,53.75,12.571],[105.45,53.75,12.571],[107.05,53.75,12.571],[108.66,53.75,12.571],[110.26,53.75,12.571],[111.86,53.75,12.571],[113.46,53.75,12.571],[115.07,53.75,12.571],[116.67,53.75,12.571],[118.27,53.75,12.571],[119.87,53.75,12.571],[121.48,53.75,12.571],[123.08,53.75,12.571],[124.68,53.75,12.571],[126.29,53.75,12.571],[127.89,53.75,12.571],[129.49,53.75,12.571],[131.09,53.75,12.571],[132.7,53.75,12.571],[134.3,53.75,12.571],[70.188,53.75,13.714],[71.791,53.75,13.714],[73.393,53.75,13.714],[74.996,53.75,13.714],[76.599,53.75,13.714],[78.202,53.75,13.714],[79.805,53.75,13.714],[81.407,53.75,13.714],[83.01,53.75,13.714],[84.613,53.75,13.714],[86.216,53.75,13.714],[87.819,53.75,13.714],[89.421,53.75,13.714],[91.024,53.75,13.714],[92.627,53.75,13.714],[94.23,53.75,13.714],[95.833,53.75,13.714],[97.435,53.75,13.714],[99.038,53.75,13.714],[100.64,53.75,13.714],[102.24,53.75,13.714],[103.85,53.75,13.714],[105.45,53.75,13.714],[107.05,53.75,13.714],[108.66,53.75,13.714],[110.26,53.75,13.714],[111.86,53.75,13.714],[113.46,53.75,13.714],[115.07,53.75,13.714],[116.67,53.75,13.714],[118.27,53.75,13.714],[119.87,53.75,13.714],[121.48,53.75,13.714],[123.08,53.75,13.714],[124.68,53.75,13.714],[126.29,53.75,13.714],[127.89,53.75,13.714],[129.49,53.75,13.714],[131.09,53.75,13.714],[132.7,53.75,13.714],[134.3,53.75,13.714],[70.188,53.75,14.857],[71.791,53.75,14.857],[73.393,53.75,14.857],[74.996,53.75,14.857],[76.599,53.75,14.857],[78.202,53.75,14.857],[79.805,53.75,14.857],[81.407,53.75,14.857],[83.01,53.75,14.857],[84.613,53.75,14.857],[86.216,53.75,14.857],[87.819,53.75,14.857],[89.421,53.75,14.857],[91.024,53.75,14.857],[92.627,53.75,14.857],[94.23,53.75,14.857],[95.833,53.75,14.857],[97.435,53.75,14.857],[99.038,53.75,14.857],[100.64,53.75,14.857],[102.24,53.75,14.857],[103.85,53.75,14.857],[105.45,53.75,14.857],[107.05,53.75,14.857],[108.66,53.75,14.857],[110.26,53.75,14.857],[111.86,53.75,14.857],[113.46,53.75,14.857],[115.07,53.75,14.857],[116.67,53.75,14.857],[118.27,53.75,14.857],[119.87,53.75,14.857],[121.48,53.75,14.857],[123.08,53.75,14.857],[124.68,53.75,14.857],[126.29,53.75,14.857],[127.89,53.75,14.857],[129.49,53.75,14.857],[131.09,53.75,14.857],[132.7,53.75,14.857],[134.3,53.75,14.857],[70.188,53.75,16],[71.791,53.75,16],[73.393,53.75,16],[74.996,53.75,16],[76.599,53.75,16],[78.202,53.75,16],[79.805,53.75,16],[81.407,53.75,16],[83.01,53.75,16],[84.613,53.75,16],[86.216,53.75,16],[87.819,53.75,16],[89.421,53.75,16],[91.024,53.75,16],[92.627,53.75,16],[94.23,53.75,16],[95.833,53.75,16],[97.435,53.75,16],[99.038,53.75,16],[100.64,53.75,16],[102.24,53.75,16],[103.85,53.75,16],[105.45,53.75,16],[107.05,53.75,16],[108.66,53.75,16],[110.26,53.75,16],[111.86,53.75,16],[113.46,53.75,16],[115.07,53.75,16],[116.67,53.75,16],[118.27,53.75,16],[119.87,53.75,16],[121.48,53.75,16],[123.08,53.75,16],[124.68,53.75,16],[126.29,53.75,16],[127.89,53.75,16],[129.49,53.75,16],[131.09,53.75,16],[132.7,53.75,16],[134.3,53.75,16],[70.188,55,-0.002],[71.791,55,-0.002],[73.393,55,-0.002],[74.996,55,-0.002],[76.599,55,-0.002],[78.202,55,-0.002],[79.805,55,-0.002],[81.407,55,-0.002],[83.01,55,-0.002],[84.613,55,-0.002],[86.216,55,-0.002],[87.819,55,-0.002],[89.421,55,-0.002],[91.024,55,-0.002],[92.627,55,-0.002],[94.23,55,-0.002],[95.833,55,-0.002],[97.435,55,-0.002],[99.038,55,-0.002],[100.64,55,-0.002],[102.24,55,-0.002],[103.85,55,-0.002],[105.45,55,-0.002],[107.05,55,-0.002],[108.66,55,-0.002],[110.26,55,-0.002],[111.86,55,-0.002],[113.46,55,-0.002],[115.07,55,-0.002],[116.67,55,-0.002],[118.27,55,-0.002],[119.87,55,-0.002],[121.48,55,-0.002],[123.08,55,-0.002],[124.68,55,-0.002],[126.29,55,-0.002],[127.89,55,-0.002],[129.49,55,-0.002],[131.09,55,-0.002],[132.7,55,-0.002],[134.3,55,-0.002],[70.188,55,1.141],[71.791,55,1.141],[73.393,55,1.141],[74.996,55,1.141],[76.599,55,1.141],[78.202,55,1.141],[79.805,55,1.141],[81.407,55,1.141],[83.01,55,1.141],[84.613,55,1.141],[86.216,55,1.141],[87.819,55,1.141],[89.421,55,1.141],[91.024,55,1.141],[92.627,55,1.141],[94.23,55,1.141],[95.833,55,1.141],[97.435,55,1.141],[99.038,55,1.141],[100.64,55,1.141],[102.24,55,1.141],[103.85,55,1.141],[105.45,55,1.141],[107.05,55,1.141],[108.66,55,1.141],[110.26,55,1.141],[111.86,55,1.141],[113.46,55,1.141],[115.07,55,1.141],[116.67,55,1.141],[118.27,55,1.141],[119.87,55,1.141],[121.48,55,1.141],[123.08,55,1.141],[124.68,55,1.141],[126.29,55,1.141],[127.89,55,1.141],[129.49,55,1.141],[131.09,55,1.141],[132.7,55,1.141],[134.3,55,1.141],[70.188,55,2.284],[71.791,55,2.284],[73.393,55,2.284],[74.996,55,2.284],[76.599,55,2.284],[78.202,55,2.284],[79.805,55,2.284],[81.407,55,2.284],[83.01,55,2.284],[84.613,55,2.284],[86.216,55,2.284],[87.819,55,2.284],[89.421,55,2.284],[91.024,55,2.284],[92.627,55,2.284],[94.23,55,2.284],[95.833,55,2.284],[97.435,55,2.284],[99.038,55,2.284],[100.64,55,2.284],[102.24,55,2.284],[103.85,55,2.284],[105.45,55,2.284],[107.05,55,2.284],[108.66,55,2.284],[110.26,55,2.284],[111.86,55,2.284],[113.46,55,2.284],[115.07,55,2.284],[116.67,55,2.284],[118.27,55,2.284],[119.87,55,2.284],[121.48,55,2.284],[123.08,55,2.284],[124.68,55,2.284],[126.29,55,2.284],[127.89,55,2.284],[129.49,55,2.284],[131.09,55,2.284],[132.7,55,2.284],[134.3,55,2.284],[70.188,55,3.427],[71.791,55,3.427],[73.393,55,3.427],[74.996,55,3.427],[76.599,55,3.427],[78.202,55,3.427],[79.805,55,3.427],[81.407,55,3.427],[83.01,55,3.427],[84.613,55,3.427],[86.216,55,3.427],[87.819,55,3.427],[89.421,55,3.427],[91.024,55,3.427],[92.627,55,3.427],[94.23,55,3.427],[95.833,55,3.427],[97.435,55,3.427],[99.038,55,3.427],[100.64,55,3.427],[102.24,55,3.427],[103.85,55,3.427],[105.45,55,3.427],[107.05,55,3.427],[108.66,55,3.427],[110.26,55,3.427],[111.86,55,3.427],[113.46,55,3.427],[115.07,55,3.427],[116.67,55,3.427],[118.27,55,3.427],[119.87,55,3.427],[121.48,55,3.427],[123.08,55,3.427],[124.68,55,3.427],[126.29,55,3.427],[127.89,55,3.427],[129.49,55,3.427],[131.09,55,3.427],[132.7,55,3.427],[134.3,55,3.427],[70.188,55,4.57],[71.791,55,4.57],[73.393,55,4.57],[74.996,55,4.57],[76.599,55,4.57],[78.202,55,4.57],[79.805,55,4.57],[81.407,55,4.57],[83.01,55,4.57],[84.613,55,4.57],[86.216,55,4.57],[87.819,55,4.57],[89.421,55,4.57],[91.024,55,4.57],[92.627,55,4.57],[94.23,55,4.57],[95.833,55,4.57],[97.435,55,4.57],[99.038,55,4.57],[100.64,55,4.57],[102.24,55,4.57],[103.85,55,4.57],[105.45,55,4.57],[107.05,55,4.57],[108.66,55,4.57],[110.26,55,4.57],[111.86,55,4.57],[113.46,55,4.57],[115.07,55,4.57],[116.67,55,4.57],[118.27,55,4.57],[119.87,55,4.57],[121.48,55,4.57],[123.08,55,4.57],[124.68,55,4.57],[126.29,55,4.57],[127.89,55,4.57],[129.49,55,4.57],[131.09,55,4.57],[132.7,55,4.57],[134.3,55,4.57],[70.188,55,5.713],[71.791,55,5.713],[73.393,55,5.713],[74.996,55,5.713],[76.599,55,5.713],[78.202,55,5.713],[79.805,55,5.713],[81.407,55,5.713],[83.01,55,5.713],[84.613,55,5.713],[86.216,55,5.713],[87.819,55,5.713],[89.421,55,5.713],[91.024,55,5.713],[92.627,55,5.713],[94.23,55,5.713],[95.833,55,5.713],[97.435,55,5.713],[99.038,55,5.713],[100.64,55,5.713],[102.24,55,5.713],[103.85,55,5.713],[105.45,55,5.713],[107.05,55,5.713],[108.66,55,5.713],[110.26,55,5.713],[111.86,55,5.713],[113.46,55,5.713],[115.07,55,5.713],[116.67,55,5.713],[118.27,55,5.713],[119.87,55,5.713],[121.48,55,5.713],[123.08,55,5.713],[124.68,55,5.713],[126.29,55,5.713],[127.89,55,5.713],[129.49,55,5.713],[131.09,55,5.713],[132.7,55,5.713],[134.3,55,5.713],[70.188,55,6.856],[71.791,55,6.856],[73.393,55,6.856],[74.996,55,6.856],[76.599,55,6.856],[78.202,55,6.856],[79.805,55,6.856],[81.407,55,6.856],[83.01,55,6.856],[84.613,55,6.856],[86.216,55,6.856],[87.819,55,6.856],[89.421,55,6.856],[91.024,55,6.856],[92.627,55,6.856],[94.23,55,6.856],[95.833,55,6.856],[97.435,55,6.856],[99.038,55,6.856],[100.64,55,6.856],[102.24,55,6.856],[103.85,55,6.856],[105.45,55,6.856],[107.05,55,6.856],[108.66,55,6.856],[110.26,55,6.856],[111.86,55,6.856],[113.46,55,6.856],[115.07,55,6.856],[116.67,55,6.856],[118.27,55,6.856],[119.87,55,6.856],[121.48,55,6.856],[123.08,55,6.856],[124.68,55,6.856],[126.29,55,6.856],[127.89,55,6.856],[129.49,55,6.856],[131.09,55,6.856],[132.7,55,6.856],[134.3,55,6.856],[70.188,55,7.999],[71.791,55,7.999],[73.393,55,7.999],[74.996,55,7.999],[76.599,55,7.999],[78.202,55,7.999],[79.805,55,7.999],[81.407,55,7.999],[83.01,55,7.999],[84.613,55,7.999],[86.216,55,7.999],[87.819,55,7.999],[89.421,55,7.999],[91.024,55,7.999],[92.627,55,7.999],[94.23,55,7.999],[95.833,55,7.999],[97.435,55,7.999],[99.038,55,7.999],[100.64,55,7.999],[102.24,55,7.999],[103.85,55,7.999],[105.45,55,7.999],[107.05,55,7.999],[108.66,55,7.999],[110.26,55,7.999],[111.86,55,7.999],[113.46,55,7.999],[115.07,55,7.999],[116.67,55,7.999],[118.27,55,7.999],[119.87,55,7.999],[121.48,55,7.999],[123.08,55,7.999],[124.68,55,7.999],[126.29,55,7.999],[127.89,55,7.999],[129.49,55,7.999],[131.09,55,7.999],[132.7,55,7.999],[134.3,55,7.999],[70.188,55,9.142],[71.791,55,9.142],[73.393,55,9.142],[74.996,55,9.142],[76.599,55,9.142],[78.202,55,9.142],[79.805,55,9.142],[81.407,55,9.142],[83.01,55,9.142],[84.613,55,9.142],[86.216,55,9.142],[87.819,55,9.142],[89.421,55,9.142],[91.024,55,9.142],[92.627,55,9.142],[94.23,55,9.142],[95.833,55,9.142],[97.435,55,9.142],[99.038,55,9.142],[100.64,55,9.142],[102.24,55,9.142],[103.85,55,9.142],[105.45,55,9.142],[107.05,55,9.142],[108.66,55,9.142],[110.26,55,9.142],[111.86,55,9.142],[113.46,55,9.142],[115.07,55,9.142],[116.67,55,9.142],[118.27,55,9.142],[119.87,55,9.142],[121.48,55,9.142],[123.08,55,9.142],[124.68,55,9.142],[126.29,55,9.142],[127.89,55,9.142],[129.49,55,9.142],[131.09,55,9.142],[132.7,55,9.142],[134.3,55,9.142],[70.188,55,10.285],[71.791,55,10.285],[73.393,55,10.285],[74.996,55,10.285],[76.599,55,10.285],[78.202,55,10.285],[79.805,55,10.285],[81.407,55,10.285],[83.01,55,10.285],[84.613,55,10.285],[86.216,55,10.285],[87.819,55,10.285],[89.421,55,10.285],[91.024,55,10.285],[92.627,55,10.285],[94.23,55,10.285],[95.833,55,10.285],[97.435,55,10.285],[99.038,55,10.285],[100.64,55,10.285],[102.24,55,10.285],[103.85,55,10.285],[105.45,55,10.285],[107.05,55,10.285],[108.66,55,10.285],[110.26,55,10.285],[111.86,55,10.285],[113.46,55,10.285],[115.07,55,10.285],[116.67,55,10.285],[118.27,55,10.285],[119.87,55,10.285],[121.48,55,10.285],[123.08,55,10.285],[124.68,55,10.285],[126.29,55,10.285],[127.89,55,10.285],[129.49,55,10.285],[131.09,55,10.285],[132.7,55,10.285],[134.3,55,10.285],[70.188,55,11.428],[71.791,55,11.428],[73.393,55,11.428],[74.996,55,11.428],[76.599,55,11.428],[78.202,55,11.428],[79.805,55,11.428],[81.407,55,11.428],[83.01,55,11.428],[84.613,55,11.428],[86.216,55,11.428],[87.819,55,11.428],[89.421,55,11.428],[91.024,55,11.428],[92.627,55,11.428],[94.23,55,11.428],[95.833,55,11.428],[97.435,55,11.428],[99.038,55,11.428],[100.64,55,11.428],[102.24,55,11.428],[103.85,55,11.428],[105.45,55,11.428],[107.05,55,11.428],[108.66,55,11.428],[110.26,55,11.428],[111.86,55,11.428],[113.46,55,11.428],[115.07,55,11.428],[116.67,55,11.428],[118.27,55,11.428],[119.87,55,11.428],[121.48,55,11.428],[123.08,55,11.428],[124.68,55,11.428],[126.29,55,11.428],[127.89,55,11.428],[129.49,55,11.428],[131.09,55,11.428],[132.7,55,11.428],[134.3,55,11.428],[70.188,55,12.571],[71.791,55,12.571],[73.393,55,12.571],[74.996,55,12.571],[76.599,55,12.571],[78.202,55,12.571],[79.805,55,12.571],[81.407,55,12.571],[83.01,55,12.571],[84.613,55,12.571],[86.216,55,12.571],[87.819,55,12.571],[89.421,55,12.571],[91.024,55,12.571],[92.627,55,12.571],[94.23,55,12.571],[95.833,55,12.571],[97.435,55,12.571],[99.038,55,12.571],[100.64,55,12.571],[102.24,55,12.571],[103.85,55,12.571],[105.45,55,12.571],[107.05,55,12.571],[108.66,55,12.571],[110.26,55,12.571],[111.86,55,12.571],[113.46,55,12.571],[115.07,55,12.571],[116.67,55,12.571],[118.27,55,12.571],[119.87,55,12.571],[121.48,55,12.571],[123.08,55,12.571],[124.68,55,12.571],[126.29,55,12.571],[127.89,55,12.571],[129.49,55,12.571],[131.09,55,12.571],[132.7,55,12.571],[134.3,55,12.571],[70.188,55,13.714],[71.791,55,13.714],[73.393,55,13.714],[74.996,55,13.714],[76.599,55,13.714],[78.202,55,13.714],[79.805,55,13.714],[81.407,55,13.714],[83.01,55,13.714],[84.613,55,13.714],[86.216,55,13.714],[87.819,55,13.714],[89.421,55,13.714],[91.024,55,13.714],[92.627,55,13.714],[94.23,55,13.714],[95.833,55,13.714],[97.435,55,13.714],[99.038,55,13.714],[100.64,55,13.714],[102.24,55,13.714],[103.85,55,13.714],[105.45,55,13.714],[107.05,55,13.714],[108.66,55,13.714],[110.26,55,13.714],[111.86,55,13.714],[113.46,55,13.714],[115.07,55,13.714],[116.67,55,13.714],[118.27,55,13.714],[119.87,55,13.714],[121.48,55,13.714],[123.08,55,13.714],[124.68,55,13.714],[126.29,55,13.714],[127.89,55,13.714],[129.49,55,13.714],[131.09,55,13.714],[132.7,55,13.714],[134.3,55,13.714],[70.188,55,14.857],[71.791,55,14.857],[73.393,55,14.857],[74.996,55,14.857],[76.599,55,14.857],[78.202,55,14.857],[79.805,55,14.857],[81.407,55,14.857],[83.01,55,14.857],[84.613,55,14.857],[86.216,55,14.857],[87.819,55,14.857],[89.421,55,14.857],[91.024,55,14.857],[92.627,55,14.857],[94.23,55,14.857],[95.833,55,14.857],[97.435,55,14.857],[99.038,55,14.857],[100.64,55,14.857],[102.24,55,14.857],[103.85,55,14.857],[105.45,55,14.857],[107.05,55,14.857],[108.66,55,14.857],[110.26,55,14.857],[111.86,55,14.857],[113.46,55,14.857],[115.07,55,14.857],[116.67,55,14.857],[118.27,55,14.857],[119.87,55,14.857],[121.48,55,14.857],[123.08,55,14.857],[124.68,55,14.857],[126.29,55,14.857],[127.89,55,14.857],[129.49,55,14.857],[131.09,55,14.857],[132.7,55,14.857],[134.3,55,14.857],[70.188,55,16],[71.791,55,16],[73.393,55,16],[74.996,55,16],[76.599,55,16],[78.202,55,16],[79.805,55,16],[81.407,55,16],[83.01,55,16],[84.613,55,16],[86.216,55,16],[87.819,55,16],[89.421,55,16],[91.024,55,16],[92.627,55,16],[94.23,55,16],[95.833,55,16],[97.435,55,16],[99.038,55,16],[100.64,55,16],[102.24,55,16],[103.85,55,16],[105.45,55,16],[107.05,55,16],[108.66,55,16],[110.26,55,16],[111.86,55,16],[113.46,55,16],[115.07,55,16],[116.67,55,16],[118.27,55,16],[119.87,55,16],[121.48,55,16],[123.08,55,16],[124.68,55,16],[126.29,55,16],[127.89,55,16],[129.49,55,16],[131.09,55,16],[132.7,55,16],[134.3,55,16],[70.188,56.25,-0.002],[71.791,56.25,-0.002],[73.393,56.25,-0.002],[74.996,56.25,-0.002],[76.599,56.25,-0.002],[78.202,56.25,-0.002],[79.805,56.25,-0.002],[81.407,56.25,-0.002],[83.01,56.25,-0.002],[84.613,56.25,-0.002],[86.216,56.25,-0.002],[87.819,56.25,-0.002],[89.421,56.25,-0.002],[91.024,56.25,-0.002],[92.627,56.25,-0.002],[94.23,56.25,-0.002],[95.833,56.25,-0.002],[97.435,56.25,-0.002],[99.038,56.25,-0.002],[100.64,56.25,-0.002],[102.24,56.25,-0.002],[103.85,56.25,-0.002],[105.45,56.25,-0.002],[107.05,56.25,-0.002],[108.66,56.25,-0.002],[110.26,56.25,-0.002],[111.86,56.25,-0.002],[113.46,56.25,-0.002],[115.07,56.25,-0.002],[116.67,56.25,-0.002],[118.27,56.25,-0.002],[119.87,56.25,-0.002],[121.48,56.25,-0.002],[123.08,56.25,-0.002],[124.68,56.25,-0.002],[126.29,56.25,-0.002],[127.89,56.25,-0.002],[129.49,56.25,-0.002],[131.09,56.25,-0.002],[132.7,56.25,-0.002],[134.3,56.25,-0.002],[70.188,56.25,1.141],[71.791,56.25,1.141],[73.393,56.25,1.141],[74.996,56.25,1.141],[76.599,56.25,1.141],[78.202,56.25,1.141],[79.805,56.25,1.141],[81.407,56.25,1.141],[83.01,56.25,1.141],[84.613,56.25,1.141],[86.216,56.25,1.141],[87.819,56.25,1.141],[89.421,56.25,1.141],[91.024,56.25,1.141],[92.627,56.25,1.141],[94.23,56.25,1.141],[95.833,56.25,1.141],[97.435,56.25,1.141],[99.038,56.25,1.141],[100.64,56.25,1.141],[102.24,56.25,1.141],[103.85,56.25,1.141],[105.45,56.25,1.141],[107.05,56.25,1.141],[108.66,56.25,1.141],[110.26,56.25,1.141],[111.86,56.25,1.141],[113.46,56.25,1.141],[115.07,56.25,1.141],[116.67,56.25,1.141],[118.27,56.25,1.141],[119.87,56.25,1.141],[121.48,56.25,1.141],[123.08,56.25,1.141],[124.68,56.25,1.141],[126.29,56.25,1.141],[127.89,56.25,1.141],[129.49,56.25,1.141],[131.09,56.25,1.141],[132.7,56.25,1.141],[134.3,56.25,1.141],[70.188,56.25,2.284],[71.791,56.25,2.284],[73.393,56.25,2.284],[74.996,56.25,2.284],[76.599,56.25,2.284],[78.202,56.25,2.284],[79.805,56.25,2.284],[81.407,56.25,2.284],[83.01,56.25,2.284],[84.613,56.25,2.284],[86.216,56.25,2.284],[87.819,56.25,2.284],[89.421,56.25,2.284],[91.024,56.25,2.284],[92.627,56.25,2.284],[94.23,56.25,2.284],[95.833,56.25,2.284],[97.435,56.25,2.284],[99.038,56.25,2.284],[100.64,56.25,2.284],[102.24,56.25,2.284],[103.85,56.25,2.284],[105.45,56.25,2.284],[107.05,56.25,2.284],[108.66,56.25,2.284],[110.26,56.25,2.284],[111.86,56.25,2.284],[113.46,56.25,2.284],[115.07,56.25,2.284],[116.67,56.25,2.284],[118.27,56.25,2.284],[119.87,56.25,2.284],[121.48,56.25,2.284],[123.08,56.25,2.284],[124.68,56.25,2.284],[126.29,56.25,2.284],[127.89,56.25,2.284],[129.49,56.25,2.284],[131.09,56.25,2.284],[132.7,56.25,2.284],[134.3,56.25,2.284],[70.188,56.25,3.427],[71.791,56.25,3.427],[73.393,56.25,3.427],[74.996,56.25,3.427],[76.599,56.25,3.427],[78.202,56.25,3.427],[79.805,56.25,3.427],[81.407,56.25,3.427],[83.01,56.25,3.427],[84.613,56.25,3.427],[86.216,56.25,3.427],[87.819,56.25,3.427],[89.421,56.25,3.427],[91.024,56.25,3.427],[92.627,56.25,3.427],[94.23,56.25,3.427],[95.833,56.25,3.427],[97.435,56.25,3.427],[99.038,56.25,3.427],[100.64,56.25,3.427],[102.24,56.25,3.427],[103.85,56.25,3.427],[105.45,56.25,3.427],[107.05,56.25,3.427],[108.66,56.25,3.427],[110.26,56.25,3.427],[111.86,56.25,3.427],[113.46,56.25,3.427],[115.07,56.25,3.427],[116.67,56.25,3.427],[118.27,56.25,3.427],[119.87,56.25,3.427],[121.48,56.25,3.427],[123.08,56.25,3.427],[124.68,56.25,3.427],[126.29,56.25,3.427],[127.89,56.25,3.427],[129.49,56.25,3.427],[131.09,56.25,3.427],[132.7,56.25,3.427],[134.3,56.25,3.427],[70.188,56.25,4.57],[71.791,56.25,4.57],[73.393,56.25,4.57],[74.996,56.25,4.57],[76.599,56.25,4.57],[78.202,56.25,4.57],[79.805,56.25,4.57],[81.407,56.25,4.57],[83.01,56.25,4.57],[84.613,56.25,4.57],[86.216,56.25,4.57],[87.819,56.25,4.57],[89.421,56.25,4.57],[91.024,56.25,4.57],[92.627,56.25,4.57],[94.23,56.25,4.57],[95.833,56.25,4.57],[97.435,56.25,4.57],[99.038,56.25,4.57],[100.64,56.25,4.57],[102.24,56.25,4.57],[103.85,56.25,4.57],[105.45,56.25,4.57],[107.05,56.25,4.57],[108.66,56.25,4.57],[110.26,56.25,4.57],[111.86,56.25,4.57],[113.46,56.25,4.57],[115.07,56.25,4.57],[116.67,56.25,4.57],[118.27,56.25,4.57],[119.87,56.25,4.57],[121.48,56.25,4.57],[123.08,56.25,4.57],[124.68,56.25,4.57],[126.29,56.25,4.57],[127.89,56.25,4.57],[129.49,56.25,4.57],[131.09,56.25,4.57],[132.7,56.25,4.57],[134.3,56.25,4.57],[70.188,56.25,5.713],[71.791,56.25,5.713],[73.393,56.25,5.713],[74.996,56.25,5.713],[76.599,56.25,5.713],[78.202,56.25,5.713],[79.805,56.25,5.713],[81.407,56.25,5.713],[83.01,56.25,5.713],[84.613,56.25,5.713],[86.216,56.25,5.713],[87.819,56.25,5.713],[89.421,56.25,5.713],[91.024,56.25,5.713],[92.627,56.25,5.713],[94.23,56.25,5.713],[95.833,56.25,5.713],[97.435,56.25,5.713],[99.038,56.25,5.713],[100.64,56.25,5.713],[102.24,56.25,5.713],[103.85,56.25,5.713],[105.45,56.25,5.713],[107.05,56.25,5.713],[108.66,56.25,5.713],[110.26,56.25,5.713],[111.86,56.25,5.713],[113.46,56.25,5.713],[115.07,56.25,5.713],[116.67,56.25,5.713],[118.27,56.25,5.713],[119.87,56.25,5.713],[121.48,56.25,5.713],[123.08,56.25,5.713],[124.68,56.25,5.713],[126.29,56.25,5.713],[127.89,56.25,5.713],[129.49,56.25,5.713],[131.09,56.25,5.713],[132.7,56.25,5.713],[134.3,56.25,5.713],[70.188,56.25,6.856],[71.791,56.25,6.856],[73.393,56.25,6.856],[74.996,56.25,6.856],[76.599,56.25,6.856],[78.202,56.25,6.856],[79.805,56.25,6.856],[81.407,56.25,6.856],[83.01,56.25,6.856],[84.613,56.25,6.856],[86.216,56.25,6.856],[87.819,56.25,6.856],[89.421,56.25,6.856],[91.024,56.25,6.856],[92.627,56.25,6.856],[94.23,56.25,6.856],[95.833,56.25,6.856],[97.435,56.25,6.856],[99.038,56.25,6.856],[100.64,56.25,6.856],[102.24,56.25,6.856],[103.85,56.25,6.856],[105.45,56.25,6.856],[107.05,56.25,6.856],[108.66,56.25,6.856],[110.26,56.25,6.856],[111.86,56.25,6.856],[113.46,56.25,6.856],[115.07,56.25,6.856],[116.67,56.25,6.856],[118.27,56.25,6.856],[119.87,56.25,6.856],[121.48,56.25,6.856],[123.08,56.25,6.856],[124.68,56.25,6.856],[126.29,56.25,6.856],[127.89,56.25,6.856],[129.49,56.25,6.856],[131.09,56.25,6.856],[132.7,56.25,6.856],[134.3,56.25,6.856],[70.188,56.25,7.999],[71.791,56.25,7.999],[73.393,56.25,7.999],[74.996,56.25,7.999],[76.599,56.25,7.999],[78.202,56.25,7.999],[79.805,56.25,7.999],[81.407,56.25,7.999],[83.01,56.25,7.999],[84.613,56.25,7.999],[86.216,56.25,7.999],[87.819,56.25,7.999],[89.421,56.25,7.999],[91.024,56.25,7.999],[92.627,56.25,7.999],[94.23,56.25,7.999],[95.833,56.25,7.999],[97.435,56.25,7.999],[99.038,56.25,7.999],[100.64,56.25,7.999],[102.24,56.25,7.999],[103.85,56.25,7.999],[105.45,56.25,7.999],[107.05,56.25,7.999],[108.66,56.25,7.999],[110.26,56.25,7.999],[111.86,56.25,7.999],[113.46,56.25,7.999],[115.07,56.25,7.999],[116.67,56.25,7.999],[118.27,56.25,7.999],[119.87,56.25,7.999],[121.48,56.25,7.999],[123.08,56.25,7.999],[124.68,56.25,7.999],[126.29,56.25,7.999],[127.89,56.25,7.999],[129.49,56.25,7.999],[131.09,56.25,7.999],[132.7,56.25,7.999],[134.3,56.25,7.999],[70.188,56.25,9.142],[71.791,56.25,9.142],[73.393,56.25,9.142],[74.996,56.25,9.142],[76.599,56.25,9.142],[78.202,56.25,9.142],[79.805,56.25,9.142],[81.407,56.25,9.142],[83.01,56.25,9.142],[84.613,56.25,9.142],[86.216,56.25,9.142],[87.819,56.25,9.142],[89.421,56.25,9.142],[91.024,56.25,9.142],[92.627,56.25,9.142],[94.23,56.25,9.142],[95.833,56.25,9.142],[97.435,56.25,9.142],[99.038,56.25,9.142],[100.64,56.25,9.142],[102.24,56.25,9.142],[103.85,56.25,9.142],[105.45,56.25,9.142],[107.05,56.25,9.142],[108.66,56.25,9.142],[110.26,56.25,9.142],[111.86,56.25,9.142],[113.46,56.25,9.142],[115.07,56.25,9.142],[116.67,56.25,9.142],[118.27,56.25,9.142],[119.87,56.25,9.142],[121.48,56.25,9.142],[123.08,56.25,9.142],[124.68,56.25,9.142],[126.29,56.25,9.142],[127.89,56.25,9.142],[129.49,56.25,9.142],[131.09,56.25,9.142],[132.7,56.25,9.142],[134.3,56.25,9.142],[70.188,56.25,10.285],[71.791,56.25,10.285],[73.393,56.25,10.285],[74.996,56.25,10.285],[76.599,56.25,10.285],[78.202,56.25,10.285],[79.805,56.25,10.285],[81.407,56.25,10.285],[83.01,56.25,10.285],[84.613,56.25,10.285],[86.216,56.25,10.285],[87.819,56.25,10.285],[89.421,56.25,10.285],[91.024,56.25,10.285],[92.627,56.25,10.285],[94.23,56.25,10.285],[95.833,56.25,10.285],[97.435,56.25,10.285],[99.038,56.25,10.285],[100.64,56.25,10.285],[102.24,56.25,10.285],[103.85,56.25,10.285],[105.45,56.25,10.285],[107.05,56.25,10.285],[108.66,56.25,10.285],[110.26,56.25,10.285],[111.86,56.25,10.285],[113.46,56.25,10.285],[115.07,56.25,10.285],[116.67,56.25,10.285],[118.27,56.25,10.285],[119.87,56.25,10.285],[121.48,56.25,10.285],[123.08,56.25,10.285],[124.68,56.25,10.285],[126.29,56.25,10.285],[127.89,56.25,10.285],[129.49,56.25,10.285],[131.09,56.25,10.285],[132.7,56.25,10.285],[134.3,56.25,10.285],[70.188,56.25,11.428],[71.791,56.25,11.428],[73.393,56.25,11.428],[74.996,56.25,11.428],[76.599,56.25,11.428],[78.202,56.25,11.428],[79.805,56.25,11.428],[81.407,56.25,11.428],[83.01,56.25,11.428],[84.613,56.25,11.428],[86.216,56.25,11.428],[87.819,56.25,11.428],[89.421,56.25,11.428],[91.024,56.25,11.428],[92.627,56.25,11.428],[94.23,56.25,11.428],[95.833,56.25,11.428],[97.435,56.25,11.428],[99.038,56.25,11.428],[100.64,56.25,11.428],[102.24,56.25,11.428],[103.85,56.25,11.428],[105.45,56.25,11.428],[107.05,56.25,11.428],[108.66,56.25,11.428],[110.26,56.25,11.428],[111.86,56.25,11.428],[113.46,56.25,11.428],[115.07,56.25,11.428],[116.67,56.25,11.428],[118.27,56.25,11.428],[119.87,56.25,11.428],[121.48,56.25,11.428],[123.08,56.25,11.428],[124.68,56.25,11.428],[126.29,56.25,11.428],[127.89,56.25,11.428],[129.49,56.25,11.428],[131.09,56.25,11.428],[132.7,56.25,11.428],[134.3,56.25,11.428],[70.188,56.25,12.571],[71.791,56.25,12.571],[73.393,56.25,12.571],[74.996,56.25,12.571],[76.599,56.25,12.571],[78.202,56.25,12.571],[79.805,56.25,12.571],[81.407,56.25,12.571],[83.01,56.25,12.571],[84.613,56.25,12.571],[86.216,56.25,12.571],[87.819,56.25,12.571],[89.421,56.25,12.571],[91.024,56.25,12.571],[92.627,56.25,12.571],[94.23,56.25,12.571],[95.833,56.25,12.571],[97.435,56.25,12.571],[99.038,56.25,12.571],[100.64,56.25,12.571],[102.24,56.25,12.571],[103.85,56.25,12.571],[105.45,56.25,12.571],[107.05,56.25,12.571],[108.66,56.25,12.571],[110.26,56.25,12.571],[111.86,56.25,12.571],[113.46,56.25,12.571],[115.07,56.25,12.571],[116.67,56.25,12.571],[118.27,56.25,12.571],[119.87,56.25,12.571],[121.48,56.25,12.571],[123.08,56.25,12.571],[124.68,56.25,12.571],[126.29,56.25,12.571],[127.89,56.25,12.571],[129.49,56.25,12.571],[131.09,56.25,12.571],[132.7,56.25,12.571],[134.3,56.25,12.571],[70.188,56.25,13.714],[71.791,56.25,13.714],[73.393,56.25,13.714],[74.996,56.25,13.714],[76.599,56.25,13.714],[78.202,56.25,13.714],[79.805,56.25,13.714],[81.407,56.25,13.714],[83.01,56.25,13.714],[84.613,56.25,13.714],[86.216,56.25,13.714],[87.819,56.25,13.714],[89.421,56.25,13.714],[91.024,56.25,13.714],[92.627,56.25,13.714],[94.23,56.25,13.714],[95.833,56.25,13.714],[97.435,56.25,13.714],[99.038,56.25,13.714],[100.64,56.25,13.714],[102.24,56.25,13.714],[103.85,56.25,13.714],[105.45,56.25,13.714],[107.05,56.25,13.714],[108.66,56.25,13.714],[110.26,56.25,13.714],[111.86,56.25,13.714],[113.46,56.25,13.714],[115.07,56.25,13.714],[116.67,56.25,13.714],[118.27,56.25,13.714],[119.87,56.25,13.714],[121.48,56.25,13.714],[123.08,56.25,13.714],[124.68,56.25,13.714],[126.29,56.25,13.714],[127.89,56.25,13.714],[129.49,56.25,13.714],[131.09,56.25,13.714],[132.7,56.25,13.714],[134.3,56.25,13.714],[70.188,56.25,14.857],[71.791,56.25,14.857],[73.393,56.25,14.857],[74.996,56.25,14.857],[76.599,56.25,14.857],[78.202,56.25,14.857],[79.805,56.25,14.857],[81.407,56.25,14.857],[83.01,56.25,14.857],[84.613,56.25,14.857],[86.216,56.25,14.857],[87.819,56.25,14.857],[89.421,56.25,14.857],[91.024,56.25,14.857],[92.627,56.25,14.857],[94.23,56.25,14.857],[95.833,56.25,14.857],[97.435,56.25,14.857],[99.038,56.25,14.857],[100.64,56.25,14.857],[102.24,56.25,14.857],[103.85,56.25,14.857],[105.45,56.25,14.857],[107.05,56.25,14.857],[108.66,56.25,14.857],[110.26,56.25,14.857],[111.86,56.25,14.857],[113.46,56.25,14.857],[115.07,56.25,14.857],[116.67,56.25,14.857],[118.27,56.25,14.857],[119.87,56.25,14.857],[121.48,56.25,14.857],[123.08,56.25,14.857],[124.68,56.25,14.857],[126.29,56.25,14.857],[127.89,56.25,14.857],[129.49,56.25,14.857],[131.09,56.25,14.857],[132.7,56.25,14.857],[134.3,56.25,14.857],[70.188,56.25,16],[71.791,56.25,16],[73.393,56.25,16],[74.996,56.25,16],[76.599,56.25,16],[78.202,56.25,16],[79.805,56.25,16],[81.407,56.25,16],[83.01,56.25,16],[84.613,56.25,16],[86.216,56.25,16],[87.819,56.25,16],[89.421,56.25,16],[91.024,56.25,16],[92.627,56.25,16],[94.23,56.25,16],[95.833,56.25,16],[97.435,56.25,16],[99.038,56.25,16],[100.64,56.25,16],[102.24,56.25,16],[103.85,56.25,16],[105.45,56.25,16],[107.05,56.25,16],[108.66,56.25,16],[110.26,56.25,16],[111.86,56.25,16],[113.46,56.25,16],[115.07,56.25,16],[116.67,56.25,16],[118.27,56.25,16],[119.87,56.25,16],[121.48,56.25,16],[123.08,56.25,16],[124.68,56.25,16],[126.29,56.25,16],[127.89,56.25,16],[129.49,56.25,16],[131.09,56.25,16],[132.7,56.25,16],[134.3,56.25,16],[70.188,57.5,-0.002],[71.791,57.5,-0.002],[73.393,57.5,-0.002],[74.996,57.5,-0.002],[76.599,57.5,-0.002],[78.202,57.5,-0.002],[79.805,57.5,-0.002],[81.407,57.5,-0.002],[83.01,57.5,-0.002],[84.613,57.5,-0.002],[86.216,57.5,-0.002],[87.819,57.5,-0.002],[89.421,57.5,-0.002],[91.024,57.5,-0.002],[92.627,57.5,-0.002],[94.23,57.5,-0.002],[95.833,57.5,-0.002],[97.435,57.5,-0.002],[99.038,57.5,-0.002],[100.64,57.5,-0.002],[102.24,57.5,-0.002],[103.85,57.5,-0.002],[105.45,57.5,-0.002],[107.05,57.5,-0.002],[108.66,57.5,-0.002],[110.26,57.5,-0.002],[111.86,57.5,-0.002],[113.46,57.5,-0.002],[115.07,57.5,-0.002],[116.67,57.5,-0.002],[118.27,57.5,-0.002],[119.87,57.5,-0.002],[121.48,57.5,-0.002],[123.08,57.5,-0.002],[124.68,57.5,-0.002],[126.29,57.5,-0.002],[127.89,57.5,-0.002],[129.49,57.5,-0.002],[131.09,57.5,-0.002],[132.7,57.5,-0.002],[134.3,57.5,-0.002],[70.188,57.5,1.141],[71.791,57.5,1.141],[73.393,57.5,1.141],[74.996,57.5,1.141],[76.599,57.5,1.141],[78.202,57.5,1.141],[79.805,57.5,1.141],[81.407,57.5,1.141],[83.01,57.5,1.141],[84.613,57.5,1.141],[86.216,57.5,1.141],[87.819,57.5,1.141],[89.421,57.5,1.141],[91.024,57.5,1.141],[92.627,57.5,1.141],[94.23,57.5,1.141],[95.833,57.5,1.141],[97.435,57.5,1.141],[99.038,57.5,1.141],[100.64,57.5,1.141],[102.24,57.5,1.141],[103.85,57.5,1.141],[105.45,57.5,1.141],[107.05,57.5,1.141],[108.66,57.5,1.141],[110.26,57.5,1.141],[111.86,57.5,1.141],[113.46,57.5,1.141],[115.07,57.5,1.141],[116.67,57.5,1.141],[118.27,57.5,1.141],[119.87,57.5,1.141],[121.48,57.5,1.141],[123.08,57.5,1.141],[124.68,57.5,1.141],[126.29,57.5,1.141],[127.89,57.5,1.141],[129.49,57.5,1.141],[131.09,57.5,1.141],[132.7,57.5,1.141],[134.3,57.5,1.141],[70.188,57.5,2.284],[71.791,57.5,2.284],[73.393,57.5,2.284],[74.996,57.5,2.284],[76.599,57.5,2.284],[78.202,57.5,2.284],[79.805,57.5,2.284],[81.407,57.5,2.284],[83.01,57.5,2.284],[84.613,57.5,2.284],[86.216,57.5,2.284],[87.819,57.5,2.284],[89.421,57.5,2.284],[91.024,57.5,2.284],[92.627,57.5,2.284],[94.23,57.5,2.284],[95.833,57.5,2.284],[97.435,57.5,2.284],[99.038,57.5,2.284],[100.64,57.5,2.284],[102.24,57.5,2.284],[103.85,57.5,2.284],[105.45,57.5,2.284],[107.05,57.5,2.284],[108.66,57.5,2.284],[110.26,57.5,2.284],[111.86,57.5,2.284],[113.46,57.5,2.284],[115.07,57.5,2.284],[116.67,57.5,2.284],[118.27,57.5,2.284],[119.87,57.5,2.284],[121.48,57.5,2.284],[123.08,57.5,2.284],[124.68,57.5,2.284],[126.29,57.5,2.284],[127.89,57.5,2.284],[129.49,57.5,2.284],[131.09,57.5,2.284],[132.7,57.5,2.284],[134.3,57.5,2.284],[70.188,57.5,3.427],[71.791,57.5,3.427],[73.393,57.5,3.427],[74.996,57.5,3.427],[76.599,57.5,3.427],[78.202,57.5,3.427],[79.805,57.5,3.427],[81.407,57.5,3.427],[83.01,57.5,3.427],[84.613,57.5,3.427],[86.216,57.5,3.427],[87.819,57.5,3.427],[89.421,57.5,3.427],[91.024,57.5,3.427],[92.627,57.5,3.427],[94.23,57.5,3.427],[95.833,57.5,3.427],[97.435,57.5,3.427],[99.038,57.5,3.427],[100.64,57.5,3.427],[102.24,57.5,3.427],[103.85,57.5,3.427],[105.45,57.5,3.427],[107.05,57.5,3.427],[108.66,57.5,3.427],[110.26,57.5,3.427],[111.86,57.5,3.427],[113.46,57.5,3.427],[115.07,57.5,3.427],[116.67,57.5,3.427],[118.27,57.5,3.427],[119.87,57.5,3.427],[121.48,57.5,3.427],[123.08,57.5,3.427],[124.68,57.5,3.427],[126.29,57.5,3.427],[127.89,57.5,3.427],[129.49,57.5,3.427],[131.09,57.5,3.427],[132.7,57.5,3.427],[134.3,57.5,3.427],[70.188,57.5,4.57],[71.791,57.5,4.57],[73.393,57.5,4.57],[74.996,57.5,4.57],[76.599,57.5,4.57],[78.202,57.5,4.57],[79.805,57.5,4.57],[81.407,57.5,4.57],[83.01,57.5,4.57],[84.613,57.5,4.57],[86.216,57.5,4.57],[87.819,57.5,4.57],[89.421,57.5,4.57],[91.024,57.5,4.57],[92.627,57.5,4.57],[94.23,57.5,4.57],[95.833,57.5,4.57],[97.435,57.5,4.57],[99.038,57.5,4.57],[100.64,57.5,4.57],[102.24,57.5,4.57],[103.85,57.5,4.57],[105.45,57.5,4.57],[107.05,57.5,4.57],[108.66,57.5,4.57],[110.26,57.5,4.57],[111.86,57.5,4.57],[113.46,57.5,4.57],[115.07,57.5,4.57],[116.67,57.5,4.57],[118.27,57.5,4.57],[119.87,57.5,4.57],[121.48,57.5,4.57],[123.08,57.5,4.57],[124.68,57.5,4.57],[126.29,57.5,4.57],[127.89,57.5,4.57],[129.49,57.5,4.57],[131.09,57.5,4.57],[132.7,57.5,4.57],[134.3,57.5,4.57],[70.188,57.5,5.713],[71.791,57.5,5.713],[73.393,57.5,5.713],[74.996,57.5,5.713],[76.599,57.5,5.713],[78.202,57.5,5.713],[79.805,57.5,5.713],[81.407,57.5,5.713],[83.01,57.5,5.713],[84.613,57.5,5.713],[86.216,57.5,5.713],[87.819,57.5,5.713],[89.421,57.5,5.713],[91.024,57.5,5.713],[92.627,57.5,5.713],[94.23,57.5,5.713],[95.833,57.5,5.713],[97.435,57.5,5.713],[99.038,57.5,5.713],[100.64,57.5,5.713],[102.24,57.5,5.713],[103.85,57.5,5.713],[105.45,57.5,5.713],[107.05,57.5,5.713],[108.66,57.5,5.713],[110.26,57.5,5.713],[111.86,57.5,5.713],[113.46,57.5,5.713],[115.07,57.5,5.713],[116.67,57.5,5.713],[118.27,57.5,5.713],[119.87,57.5,5.713],[121.48,57.5,5.713],[123.08,57.5,5.713],[124.68,57.5,5.713],[126.29,57.5,5.713],[127.89,57.5,5.713],[129.49,57.5,5.713],[131.09,57.5,5.713],[132.7,57.5,5.713],[134.3,57.5,5.713],[70.188,57.5,6.856],[71.791,57.5,6.856],[73.393,57.5,6.856],[74.996,57.5,6.856],[76.599,57.5,6.856],[78.202,57.5,6.856],[79.805,57.5,6.856],[81.407,57.5,6.856],[83.01,57.5,6.856],[84.613,57.5,6.856],[86.216,57.5,6.856],[87.819,57.5,6.856],[89.421,57.5,6.856],[91.024,57.5,6.856],[92.627,57.5,6.856],[94.23,57.5,6.856],[95.833,57.5,6.856],[97.435,57.5,6.856],[99.038,57.5,6.856],[100.64,57.5,6.856],[102.24,57.5,6.856],[103.85,57.5,6.856],[105.45,57.5,6.856],[107.05,57.5,6.856],[108.66,57.5,6.856],[110.26,57.5,6.856],[111.86,57.5,6.856],[113.46,57.5,6.856],[115.07,57.5,6.856],[116.67,57.5,6.856],[118.27,57.5,6.856],[119.87,57.5,6.856],[121.48,57.5,6.856],[123.08,57.5,6.856],[124.68,57.5,6.856],[126.29,57.5,6.856],[127.89,57.5,6.856],[129.49,57.5,6.856],[131.09,57.5,6.856],[132.7,57.5,6.856],[134.3,57.5,6.856],[70.188,57.5,7.999],[71.791,57.5,7.999],[73.393,57.5,7.999],[74.996,57.5,7.999],[76.599,57.5,7.999],[78.202,57.5,7.999],[79.805,57.5,7.999],[81.407,57.5,7.999],[83.01,57.5,7.999],[84.613,57.5,7.999],[86.216,57.5,7.999],[87.819,57.5,7.999],[89.421,57.5,7.999],[91.024,57.5,7.999],[92.627,57.5,7.999],[94.23,57.5,7.999],[95.833,57.5,7.999],[97.435,57.5,7.999],[99.038,57.5,7.999],[100.64,57.5,7.999],[102.24,57.5,7.999],[103.85,57.5,7.999],[105.45,57.5,7.999],[107.05,57.5,7.999],[108.66,57.5,7.999],[110.26,57.5,7.999],[111.86,57.5,7.999],[113.46,57.5,7.999],[115.07,57.5,7.999],[116.67,57.5,7.999],[118.27,57.5,7.999],[119.87,57.5,7.999],[121.48,57.5,7.999],[123.08,57.5,7.999],[124.68,57.5,7.999],[126.29,57.5,7.999],[127.89,57.5,7.999],[129.49,57.5,7.999],[131.09,57.5,7.999],[132.7,57.5,7.999],[134.3,57.5,7.999],[70.188,57.5,9.142],[71.791,57.5,9.142],[73.393,57.5,9.142],[74.996,57.5,9.142],[76.599,57.5,9.142],[78.202,57.5,9.142],[79.805,57.5,9.142],[81.407,57.5,9.142],[83.01,57.5,9.142],[84.613,57.5,9.142],[86.216,57.5,9.142],[87.819,57.5,9.142],[89.421,57.5,9.142],[91.024,57.5,9.142],[92.627,57.5,9.142],[94.23,57.5,9.142],[95.833,57.5,9.142],[97.435,57.5,9.142],[99.038,57.5,9.142],[100.64,57.5,9.142],[102.24,57.5,9.142],[103.85,57.5,9.142],[105.45,57.5,9.142],[107.05,57.5,9.142],[108.66,57.5,9.142],[110.26,57.5,9.142],[111.86,57.5,9.142],[113.46,57.5,9.142],[115.07,57.5,9.142],[116.67,57.5,9.142],[118.27,57.5,9.142],[119.87,57.5,9.142],[121.48,57.5,9.142],[123.08,57.5,9.142],[124.68,57.5,9.142],[126.29,57.5,9.142],[127.89,57.5,9.142],[129.49,57.5,9.142],[131.09,57.5,9.142],[132.7,57.5,9.142],[134.3,57.5,9.142],[70.188,57.5,10.285],[71.791,57.5,10.285],[73.393,57.5,10.285],[74.996,57.5,10.285],[76.599,57.5,10.285],[78.202,57.5,10.285],[79.805,57.5,10.285],[81.407,57.5,10.285],[83.01,57.5,10.285],[84.613,57.5,10.285],[86.216,57.5,10.285],[87.819,57.5,10.285],[89.421,57.5,10.285],[91.024,57.5,10.285],[92.627,57.5,10.285],[94.23,57.5,10.285],[95.833,57.5,10.285],[97.435,57.5,10.285],[99.038,57.5,10.285],[100.64,57.5,10.285],[102.24,57.5,10.285],[103.85,57.5,10.285],[105.45,57.5,10.285],[107.05,57.5,10.285],[108.66,57.5,10.285],[110.26,57.5,10.285],[111.86,57.5,10.285],[113.46,57.5,10.285],[115.07,57.5,10.285],[116.67,57.5,10.285],[118.27,57.5,10.285],[119.87,57.5,10.285],[121.48,57.5,10.285],[123.08,57.5,10.285],[124.68,57.5,10.285],[126.29,57.5,10.285],[127.89,57.5,10.285],[129.49,57.5,10.285],[131.09,57.5,10.285],[132.7,57.5,10.285],[134.3,57.5,10.285],[70.188,57.5,11.428],[71.791,57.5,11.428],[73.393,57.5,11.428],[74.996,57.5,11.428],[76.599,57.5,11.428],[78.202,57.5,11.428],[79.805,57.5,11.428],[81.407,57.5,11.428],[83.01,57.5,11.428],[84.613,57.5,11.428],[86.216,57.5,11.428],[87.819,57.5,11.428],[89.421,57.5,11.428],[91.024,57.5,11.428],[92.627,57.5,11.428],[94.23,57.5,11.428],[95.833,57.5,11.428],[97.435,57.5,11.428],[99.038,57.5,11.428],[100.64,57.5,11.428],[102.24,57.5,11.428],[103.85,57.5,11.428],[105.45,57.5,11.428],[107.05,57.5,11.428],[108.66,57.5,11.428],[110.26,57.5,11.428],[111.86,57.5,11.428],[113.46,57.5,11.428],[115.07,57.5,11.428],[116.67,57.5,11.428],[118.27,57.5,11.428],[119.87,57.5,11.428],[121.48,57.5,11.428],[123.08,57.5,11.428],[124.68,57.5,11.428],[126.29,57.5,11.428],[127.89,57.5,11.428],[129.49,57.5,11.428],[131.09,57.5,11.428],[132.7,57.5,11.428],[134.3,57.5,11.428],[70.188,57.5,12.571],[71.791,57.5,12.571],[73.393,57.5,12.571],[74.996,57.5,12.571],[76.599,57.5,12.571],[78.202,57.5,12.571],[79.805,57.5,12.571],[81.407,57.5,12.571],[83.01,57.5,12.571],[84.613,57.5,12.571],[86.216,57.5,12.571],[87.819,57.5,12.571],[89.421,57.5,12.571],[91.024,57.5,12.571],[92.627,57.5,12.571],[94.23,57.5,12.571],[95.833,57.5,12.571],[97.435,57.5,12.571],[99.038,57.5,12.571],[100.64,57.5,12.571],[102.24,57.5,12.571],[103.85,57.5,12.571],[105.45,57.5,12.571],[107.05,57.5,12.571],[108.66,57.5,12.571],[110.26,57.5,12.571],[111.86,57.5,12.571],[113.46,57.5,12.571],[115.07,57.5,12.571],[116.67,57.5,12.571],[118.27,57.5,12.571],[119.87,57.5,12.571],[121.48,57.5,12.571],[123.08,57.5,12.571],[124.68,57.5,12.571],[126.29,57.5,12.571],[127.89,57.5,12.571],[129.49,57.5,12.571],[131.09,57.5,12.571],[132.7,57.5,12.571],[134.3,57.5,12.571],[70.188,57.5,13.714],[71.791,57.5,13.714],[73.393,57.5,13.714],[74.996,57.5,13.714],[76.599,57.5,13.714],[78.202,57.5,13.714],[79.805,57.5,13.714],[81.407,57.5,13.714],[83.01,57.5,13.714],[84.613,57.5,13.714],[86.216,57.5,13.714],[87.819,57.5,13.714],[89.421,57.5,13.714],[91.024,57.5,13.714],[92.627,57.5,13.714],[94.23,57.5,13.714],[95.833,57.5,13.714],[97.435,57.5,13.714],[99.038,57.5,13.714],[100.64,57.5,13.714],[102.24,57.5,13.714],[103.85,57.5,13.714],[105.45,57.5,13.714],[107.05,57.5,13.714],[108.66,57.5,13.714],[110.26,57.5,13.714],[111.86,57.5,13.714],[113.46,57.5,13.714],[115.07,57.5,13.714],[116.67,57.5,13.714],[118.27,57.5,13.714],[119.87,57.5,13.714],[121.48,57.5,13.714],[123.08,57.5,13.714],[124.68,57.5,13.714],[126.29,57.5,13.714],[127.89,57.5,13.714],[129.49,57.5,13.714],[131.09,57.5,13.714],[132.7,57.5,13.714],[134.3,57.5,13.714],[70.188,57.5,14.857],[71.791,57.5,14.857],[73.393,57.5,14.857],[74.996,57.5,14.857],[76.599,57.5,14.857],[78.202,57.5,14.857],[79.805,57.5,14.857],[81.407,57.5,14.857],[83.01,57.5,14.857],[84.613,57.5,14.857],[86.216,57.5,14.857],[87.819,57.5,14.857],[89.421,57.5,14.857],[91.024,57.5,14.857],[92.627,57.5,14.857],[94.23,57.5,14.857],[95.833,57.5,14.857],[97.435,57.5,14.857],[99.038,57.5,14.857],[100.64,57.5,14.857],[102.24,57.5,14.857],[103.85,57.5,14.857],[105.45,57.5,14.857],[107.05,57.5,14.857],[108.66,57.5,14.857],[110.26,57.5,14.857],[111.86,57.5,14.857],[113.46,57.5,14.857],[115.07,57.5,14.857],[116.67,57.5,14.857],[118.27,57.5,14.857],[119.87,57.5,14.857],[121.48,57.5,14.857],[123.08,57.5,14.857],[124.68,57.5,14.857],[126.29,57.5,14.857],[127.89,57.5,14.857],[129.49,57.5,14.857],[131.09,57.5,14.857],[132.7,57.5,14.857],[134.3,57.5,14.857],[70.188,57.5,16],[71.791,57.5,16],[73.393,57.5,16],[74.996,57.5,16],[76.599,57.5,16],[78.202,57.5,16],[79.805,57.5,16],[81.407,57.5,16],[83.01,57.5,16],[84.613,57.5,16],[86.216,57.5,16],[87.819,57.5,16],[89.421,57.5,16],[91.024,57.5,16],[92.627,57.5,16],[94.23,57.5,16],[95.833,57.5,16],[97.435,57.5,16],[99.038,57.5,16],[100.64,57.5,16],[102.24,57.5,16],[103.85,57.5,16],[105.45,57.5,16],[107.05,57.5,16],[108.66,57.5,16],[110.26,57.5,16],[111.86,57.5,16],[113.46,57.5,16],[115.07,57.5,16],[116.67,57.5,16],[118.27,57.5,16],[119.87,57.5,16],[121.48,57.5,16],[123.08,57.5,16],[124.68,57.5,16],[126.29,57.5,16],[127.89,57.5,16],[129.49,57.5,16],[131.09,57.5,16],[132.7,57.5,16],[134.3,57.5,16],[70.188,58.75,-0.002],[71.791,58.75,-0.002],[73.393,58.75,-0.002],[74.996,58.75,-0.002],[76.599,58.75,-0.002],[78.202,58.75,-0.002],[79.805,58.75,-0.002],[81.407,58.75,-0.002],[83.01,58.75,-0.002],[84.613,58.75,-0.002],[86.216,58.75,-0.002],[87.819,58.75,-0.002],[89.421,58.75,-0.002],[91.024,58.75,-0.002],[92.627,58.75,-0.002],[94.23,58.75,-0.002],[95.833,58.75,-0.002],[97.435,58.75,-0.002],[99.038,58.75,-0.002],[100.64,58.75,-0.002],[102.24,58.75,-0.002],[103.85,58.75,-0.002],[105.45,58.75,-0.002],[107.05,58.75,-0.002],[108.66,58.75,-0.002],[110.26,58.75,-0.002],[111.86,58.75,-0.002],[113.46,58.75,-0.002],[115.07,58.75,-0.002],[116.67,58.75,-0.002],[118.27,58.75,-0.002],[119.87,58.75,-0.002],[121.48,58.75,-0.002],[123.08,58.75,-0.002],[124.68,58.75,-0.002],[126.29,58.75,-0.002],[127.89,58.75,-0.002],[129.49,58.75,-0.002],[131.09,58.75,-0.002],[132.7,58.75,-0.002],[134.3,58.75,-0.002],[70.188,58.75,1.141],[71.791,58.75,1.141],[73.393,58.75,1.141],[74.996,58.75,1.141],[76.599,58.75,1.141],[78.202,58.75,1.141],[79.805,58.75,1.141],[81.407,58.75,1.141],[83.01,58.75,1.141],[84.613,58.75,1.141],[86.216,58.75,1.141],[87.819,58.75,1.141],[89.421,58.75,1.141],[91.024,58.75,1.141],[92.627,58.75,1.141],[94.23,58.75,1.141],[95.833,58.75,1.141],[97.435,58.75,1.141],[99.038,58.75,1.141],[100.64,58.75,1.141],[102.24,58.75,1.141],[103.85,58.75,1.141],[105.45,58.75,1.141],[107.05,58.75,1.141],[108.66,58.75,1.141],[110.26,58.75,1.141],[111.86,58.75,1.141],[113.46,58.75,1.141],[115.07,58.75,1.141],[116.67,58.75,1.141],[118.27,58.75,1.141],[119.87,58.75,1.141],[121.48,58.75,1.141],[123.08,58.75,1.141],[124.68,58.75,1.141],[126.29,58.75,1.141],[127.89,58.75,1.141],[129.49,58.75,1.141],[131.09,58.75,1.141],[132.7,58.75,1.141],[134.3,58.75,1.141],[70.188,58.75,2.284],[71.791,58.75,2.284],[73.393,58.75,2.284],[74.996,58.75,2.284],[76.599,58.75,2.284],[78.202,58.75,2.284],[79.805,58.75,2.284],[81.407,58.75,2.284],[83.01,58.75,2.284],[84.613,58.75,2.284],[86.216,58.75,2.284],[87.819,58.75,2.284],[89.421,58.75,2.284],[91.024,58.75,2.284],[92.627,58.75,2.284],[94.23,58.75,2.284],[95.833,58.75,2.284],[97.435,58.75,2.284],[99.038,58.75,2.284],[100.64,58.75,2.284],[102.24,58.75,2.284],[103.85,58.75,2.284],[105.45,58.75,2.284],[107.05,58.75,2.284],[108.66,58.75,2.284],[110.26,58.75,2.284],[111.86,58.75,2.284],[113.46,58.75,2.284],[115.07,58.75,2.284],[116.67,58.75,2.284],[118.27,58.75,2.284],[119.87,58.75,2.284],[121.48,58.75,2.284],[123.08,58.75,2.284],[124.68,58.75,2.284],[126.29,58.75,2.284],[127.89,58.75,2.284],[129.49,58.75,2.284],[131.09,58.75,2.284],[132.7,58.75,2.284],[134.3,58.75,2.284],[70.188,58.75,3.427],[71.791,58.75,3.427],[73.393,58.75,3.427],[74.996,58.75,3.427],[76.599,58.75,3.427],[78.202,58.75,3.427],[79.805,58.75,3.427],[81.407,58.75,3.427],[83.01,58.75,3.427],[84.613,58.75,3.427],[86.216,58.75,3.427],[87.819,58.75,3.427],[89.421,58.75,3.427],[91.024,58.75,3.427],[92.627,58.75,3.427],[94.23,58.75,3.427],[95.833,58.75,3.427],[97.435,58.75,3.427],[99.038,58.75,3.427],[100.64,58.75,3.427],[102.24,58.75,3.427],[103.85,58.75,3.427],[105.45,58.75,3.427],[107.05,58.75,3.427],[108.66,58.75,3.427],[110.26,58.75,3.427],[111.86,58.75,3.427],[113.46,58.75,3.427],[115.07,58.75,3.427],[116.67,58.75,3.427],[118.27,58.75,3.427],[119.87,58.75,3.427],[121.48,58.75,3.427],[123.08,58.75,3.427],[124.68,58.75,3.427],[126.29,58.75,3.427],[127.89,58.75,3.427],[129.49,58.75,3.427],[131.09,58.75,3.427],[132.7,58.75,3.427],[134.3,58.75,3.427],[70.188,58.75,4.57],[71.791,58.75,4.57],[73.393,58.75,4.57],[74.996,58.75,4.57],[76.599,58.75,4.57],[78.202,58.75,4.57],[79.805,58.75,4.57],[81.407,58.75,4.57],[83.01,58.75,4.57],[84.613,58.75,4.57],[86.216,58.75,4.57],[87.819,58.75,4.57],[89.421,58.75,4.57],[91.024,58.75,4.57],[92.627,58.75,4.57],[94.23,58.75,4.57],[95.833,58.75,4.57],[97.435,58.75,4.57],[99.038,58.75,4.57],[100.64,58.75,4.57],[102.24,58.75,4.57],[103.85,58.75,4.57],[105.45,58.75,4.57],[107.05,58.75,4.57],[108.66,58.75,4.57],[110.26,58.75,4.57],[111.86,58.75,4.57],[113.46,58.75,4.57],[115.07,58.75,4.57],[116.67,58.75,4.57],[118.27,58.75,4.57],[119.87,58.75,4.57],[121.48,58.75,4.57],[123.08,58.75,4.57],[124.68,58.75,4.57],[126.29,58.75,4.57],[127.89,58.75,4.57],[129.49,58.75,4.57],[131.09,58.75,4.57],[132.7,58.75,4.57],[134.3,58.75,4.57],[70.188,58.75,5.713],[71.791,58.75,5.713],[73.393,58.75,5.713],[74.996,58.75,5.713],[76.599,58.75,5.713],[78.202,58.75,5.713],[79.805,58.75,5.713],[81.407,58.75,5.713],[83.01,58.75,5.713],[84.613,58.75,5.713],[86.216,58.75,5.713],[87.819,58.75,5.713],[89.421,58.75,5.713],[91.024,58.75,5.713],[92.627,58.75,5.713],[94.23,58.75,5.713],[95.833,58.75,5.713],[97.435,58.75,5.713],[99.038,58.75,5.713],[100.64,58.75,5.713],[102.24,58.75,5.713],[103.85,58.75,5.713],[105.45,58.75,5.713],[107.05,58.75,5.713],[108.66,58.75,5.713],[110.26,58.75,5.713],[111.86,58.75,5.713],[113.46,58.75,5.713],[115.07,58.75,5.713],[116.67,58.75,5.713],[118.27,58.75,5.713],[119.87,58.75,5.713],[121.48,58.75,5.713],[123.08,58.75,5.713],[124.68,58.75,5.713],[126.29,58.75,5.713],[127.89,58.75,5.713],[129.49,58.75,5.713],[131.09,58.75,5.713],[132.7,58.75,5.713],[134.3,58.75,5.713],[70.188,58.75,6.856],[71.791,58.75,6.856],[73.393,58.75,6.856],[74.996,58.75,6.856],[76.599,58.75,6.856],[78.202,58.75,6.856],[79.805,58.75,6.856],[81.407,58.75,6.856],[83.01,58.75,6.856],[84.613,58.75,6.856],[86.216,58.75,6.856],[87.819,58.75,6.856],[89.421,58.75,6.856],[91.024,58.75,6.856],[92.627,58.75,6.856],[94.23,58.75,6.856],[95.833,58.75,6.856],[97.435,58.75,6.856],[99.038,58.75,6.856],[100.64,58.75,6.856],[102.24,58.75,6.856],[103.85,58.75,6.856],[105.45,58.75,6.856],[107.05,58.75,6.856],[108.66,58.75,6.856],[110.26,58.75,6.856],[111.86,58.75,6.856],[113.46,58.75,6.856],[115.07,58.75,6.856],[116.67,58.75,6.856],[118.27,58.75,6.856],[119.87,58.75,6.856],[121.48,58.75,6.856],[123.08,58.75,6.856],[124.68,58.75,6.856],[126.29,58.75,6.856],[127.89,58.75,6.856],[129.49,58.75,6.856],[131.09,58.75,6.856],[132.7,58.75,6.856],[134.3,58.75,6.856],[70.188,58.75,7.999],[71.791,58.75,7.999],[73.393,58.75,7.999],[74.996,58.75,7.999],[76.599,58.75,7.999],[78.202,58.75,7.999],[79.805,58.75,7.999],[81.407,58.75,7.999],[83.01,58.75,7.999],[84.613,58.75,7.999],[86.216,58.75,7.999],[87.819,58.75,7.999],[89.421,58.75,7.999],[91.024,58.75,7.999],[92.627,58.75,7.999],[94.23,58.75,7.999],[95.833,58.75,7.999],[97.435,58.75,7.999],[99.038,58.75,7.999],[100.64,58.75,7.999],[102.24,58.75,7.999],[103.85,58.75,7.999],[105.45,58.75,7.999],[107.05,58.75,7.999],[108.66,58.75,7.999],[110.26,58.75,7.999],[111.86,58.75,7.999],[113.46,58.75,7.999],[115.07,58.75,7.999],[116.67,58.75,7.999],[118.27,58.75,7.999],[119.87,58.75,7.999],[121.48,58.75,7.999],[123.08,58.75,7.999],[124.68,58.75,7.999],[126.29,58.75,7.999],[127.89,58.75,7.999],[129.49,58.75,7.999],[131.09,58.75,7.999],[132.7,58.75,7.999],[134.3,58.75,7.999],[70.188,58.75,9.142],[71.791,58.75,9.142],[73.393,58.75,9.142],[74.996,58.75,9.142],[76.599,58.75,9.142],[78.202,58.75,9.142],[79.805,58.75,9.142],[81.407,58.75,9.142],[83.01,58.75,9.142],[84.613,58.75,9.142],[86.216,58.75,9.142],[87.819,58.75,9.142],[89.421,58.75,9.142],[91.024,58.75,9.142],[92.627,58.75,9.142],[94.23,58.75,9.142],[95.833,58.75,9.142],[97.435,58.75,9.142],[99.038,58.75,9.142],[100.64,58.75,9.142],[102.24,58.75,9.142],[103.85,58.75,9.142],[105.45,58.75,9.142],[107.05,58.75,9.142],[108.66,58.75,9.142],[110.26,58.75,9.142],[111.86,58.75,9.142],[113.46,58.75,9.142],[115.07,58.75,9.142],[116.67,58.75,9.142],[118.27,58.75,9.142],[119.87,58.75,9.142],[121.48,58.75,9.142],[123.08,58.75,9.142],[124.68,58.75,9.142],[126.29,58.75,9.142],[127.89,58.75,9.142],[129.49,58.75,9.142],[131.09,58.75,9.142],[132.7,58.75,9.142],[134.3,58.75,9.142],[70.188,58.75,10.285],[71.791,58.75,10.285],[73.393,58.75,10.285],[74.996,58.75,10.285],[76.599,58.75,10.285],[78.202,58.75,10.285],[79.805,58.75,10.285],[81.407,58.75,10.285],[83.01,58.75,10.285],[84.613,58.75,10.285],[86.216,58.75,10.285],[87.819,58.75,10.285],[89.421,58.75,10.285],[91.024,58.75,10.285],[92.627,58.75,10.285],[94.23,58.75,10.285],[95.833,58.75,10.285],[97.435,58.75,10.285],[99.038,58.75,10.285],[100.64,58.75,10.285],[102.24,58.75,10.285],[103.85,58.75,10.285],[105.45,58.75,10.285],[107.05,58.75,10.285],[108.66,58.75,10.285],[110.26,58.75,10.285],[111.86,58.75,10.285],[113.46,58.75,10.285],[115.07,58.75,10.285],[116.67,58.75,10.285],[118.27,58.75,10.285],[119.87,58.75,10.285],[121.48,58.75,10.285],[123.08,58.75,10.285],[124.68,58.75,10.285],[126.29,58.75,10.285],[127.89,58.75,10.285],[129.49,58.75,10.285],[131.09,58.75,10.285],[132.7,58.75,10.285],[134.3,58.75,10.285],[70.188,58.75,11.428],[71.791,58.75,11.428],[73.393,58.75,11.428],[74.996,58.75,11.428],[76.599,58.75,11.428],[78.202,58.75,11.428],[79.805,58.75,11.428],[81.407,58.75,11.428],[83.01,58.75,11.428],[84.613,58.75,11.428],[86.216,58.75,11.428],[87.819,58.75,11.428],[89.421,58.75,11.428],[91.024,58.75,11.428],[92.627,58.75,11.428],[94.23,58.75,11.428],[95.833,58.75,11.428],[97.435,58.75,11.428],[99.038,58.75,11.428],[100.64,58.75,11.428],[102.24,58.75,11.428],[103.85,58.75,11.428],[105.45,58.75,11.428],[107.05,58.75,11.428],[108.66,58.75,11.428],[110.26,58.75,11.428],[111.86,58.75,11.428],[113.46,58.75,11.428],[115.07,58.75,11.428],[116.67,58.75,11.428],[118.27,58.75,11.428],[119.87,58.75,11.428],[121.48,58.75,11.428],[123.08,58.75,11.428],[124.68,58.75,11.428],[126.29,58.75,11.428],[127.89,58.75,11.428],[129.49,58.75,11.428],[131.09,58.75,11.428],[132.7,58.75,11.428],[134.3,58.75,11.428],[70.188,58.75,12.571],[71.791,58.75,12.571],[73.393,58.75,12.571],[74.996,58.75,12.571],[76.599,58.75,12.571],[78.202,58.75,12.571],[79.805,58.75,12.571],[81.407,58.75,12.571],[83.01,58.75,12.571],[84.613,58.75,12.571],[86.216,58.75,12.571],[87.819,58.75,12.571],[89.421,58.75,12.571],[91.024,58.75,12.571],[92.627,58.75,12.571],[94.23,58.75,12.571],[95.833,58.75,12.571],[97.435,58.75,12.571],[99.038,58.75,12.571],[100.64,58.75,12.571],[102.24,58.75,12.571],[103.85,58.75,12.571],[105.45,58.75,12.571],[107.05,58.75,12.571],[108.66,58.75,12.571],[110.26,58.75,12.571],[111.86,58.75,12.571],[113.46,58.75,12.571],[115.07,58.75,12.571],[116.67,58.75,12.571],[118.27,58.75,12.571],[119.87,58.75,12.571],[121.48,58.75,12.571],[123.08,58.75,12.571],[124.68,58.75,12.571],[126.29,58.75,12.571],[127.89,58.75,12.571],[129.49,58.75,12.571],[131.09,58.75,12.571],[132.7,58.75,12.571],[134.3,58.75,12.571],[70.188,58.75,13.714],[71.791,58.75,13.714],[73.393,58.75,13.714],[74.996,58.75,13.714],[76.599,58.75,13.714],[78.202,58.75,13.714],[79.805,58.75,13.714],[81.407,58.75,13.714],[83.01,58.75,13.714],[84.613,58.75,13.714],[86.216,58.75,13.714],[87.819,58.75,13.714],[89.421,58.75,13.714],[91.024,58.75,13.714],[92.627,58.75,13.714],[94.23,58.75,13.714],[95.833,58.75,13.714],[97.435,58.75,13.714],[99.038,58.75,13.714],[100.64,58.75,13.714],[102.24,58.75,13.714],[103.85,58.75,13.714],[105.45,58.75,13.714],[107.05,58.75,13.714],[108.66,58.75,13.714],[110.26,58.75,13.714],[111.86,58.75,13.714],[113.46,58.75,13.714],[115.07,58.75,13.714],[116.67,58.75,13.714],[118.27,58.75,13.714],[119.87,58.75,13.714],[121.48,58.75,13.714],[123.08,58.75,13.714],[124.68,58.75,13.714],[126.29,58.75,13.714],[127.89,58.75,13.714],[129.49,58.75,13.714],[131.09,58.75,13.714],[132.7,58.75,13.714],[134.3,58.75,13.714],[70.188,58.75,14.857],[71.791,58.75,14.857],[73.393,58.75,14.857],[74.996,58.75,14.857],[76.599,58.75,14.857],[78.202,58.75,14.857],[79.805,58.75,14.857],[81.407,58.75,14.857],[83.01,58.75,14.857],[84.613,58.75,14.857],[86.216,58.75,14.857],[87.819,58.75,14.857],[89.421,58.75,14.857],[91.024,58.75,14.857],[92.627,58.75,14.857],[94.23,58.75,14.857],[95.833,58.75,14.857],[97.435,58.75,14.857],[99.038,58.75,14.857],[100.64,58.75,14.857],[102.24,58.75,14.857],[103.85,58.75,14.857],[105.45,58.75,14.857],[107.05,58.75,14.857],[108.66,58.75,14.857],[110.26,58.75,14.857],[111.86,58.75,14.857],[113.46,58.75,14.857],[115.07,58.75,14.857],[116.67,58.75,14.857],[118.27,58.75,14.857],[119.87,58.75,14.857],[121.48,58.75,14.857],[123.08,58.75,14.857],[124.68,58.75,14.857],[126.29,58.75,14.857],[127.89,58.75,14.857],[129.49,58.75,14.857],[131.09,58.75,14.857],[132.7,58.75,14.857],[134.3,58.75,14.857],[70.188,58.75,16],[71.791,58.75,16],[73.393,58.75,16],[74.996,58.75,16],[76.599,58.75,16],[78.202,58.75,16],[79.805,58.75,16],[81.407,58.75,16],[83.01,58.75,16],[84.613,58.75,16],[86.216,58.75,16],[87.819,58.75,16],[89.421,58.75,16],[91.024,58.75,16],[92.627,58.75,16],[94.23,58.75,16],[95.833,58.75,16],[97.435,58.75,16],[99.038,58.75,16],[100.64,58.75,16],[102.24,58.75,16],[103.85,58.75,16],[105.45,58.75,16],[107.05,58.75,16],[108.66,58.75,16],[110.26,58.75,16],[111.86,58.75,16],[113.46,58.75,16],[115.07,58.75,16],[116.67,58.75,16],[118.27,58.75,16],[119.87,58.75,16],[121.48,58.75,16],[123.08,58.75,16],[124.68,58.75,16],[126.29,58.75,16],[127.89,58.75,16],[129.49,58.75,16],[131.09,58.75,16],[132.7,58.75,16],[134.3,58.75,16],[70.188,60,-0.002],[71.791,60,-0.002],[73.393,60,-0.002],[74.996,60,-0.002],[76.599,60,-0.002],[78.202,60,-0.002],[79.805,60,-0.002],[81.407,60,-0.002],[83.01,60,-0.002],[84.613,60,-0.002],[86.216,60,-0.002],[87.819,60,-0.002],[89.421,60,-0.002],[91.024,60,-0.002],[92.627,60,-0.002],[94.23,60,-0.002],[95.833,60,-0.002],[97.435,60,-0.002],[99.038,60,-0.002],[100.64,60,-0.002],[102.24,60,-0.002],[103.85,60,-0.002],[105.45,60,-0.002],[107.05,60,-0.002],[108.66,60,-0.002],[110.26,60,-0.002],[111.86,60,-0.002],[113.46,60,-0.002],[115.07,60,-0.002],[116.67,60,-0.002],[118.27,60,-0.002],[119.87,60,-0.002],[121.48,60,-0.002],[123.08,60,-0.002],[124.68,60,-0.002],[126.29,60,-0.002],[127.89,60,-0.002],[129.49,60,-0.002],[131.09,60,-0.002],[132.7,60,-0.002],[134.3,60,-0.002],[70.188,60,1.141],[71.791,60,1.141],[73.393,60,1.141],[74.996,60,1.141],[76.599,60,1.141],[78.202,60,1.141],[79.805,60,1.141],[81.407,60,1.141],[83.01,60,1.141],[84.613,60,1.141],[86.216,60,1.141],[87.819,60,1.141],[89.421,60,1.141],[91.024,60,1.141],[92.627,60,1.141],[94.23,60,1.141],[95.833,60,1.141],[97.435,60,1.141],[99.038,60,1.141],[100.64,60,1.141],[102.24,60,1.141],[103.85,60,1.141],[105.45,60,1.141],[107.05,60,1.141],[108.66,60,1.141],[110.26,60,1.141],[111.86,60,1.141],[113.46,60,1.141],[115.07,60,1.141],[116.67,60,1.141],[118.27,60,1.141],[119.87,60,1.141],[121.48,60,1.141],[123.08,60,1.141],[124.68,60,1.141],[126.29,60,1.141],[127.89,60,1.141],[129.49,60,1.141],[131.09,60,1.141],[132.7,60,1.141],[134.3,60,1.141],[70.188,60,2.284],[71.791,60,2.284],[73.393,60,2.284],[74.996,60,2.284],[76.599,60,2.284],[78.202,60,2.284],[79.805,60,2.284],[81.407,60,2.284],[83.01,60,2.284],[84.613,60,2.284],[86.216,60,2.284],[87.819,60,2.284],[89.421,60,2.284],[91.024,60,2.284],[92.627,60,2.284],[94.23,60,2.284],[95.833,60,2.284],[97.435,60,2.284],[99.038,60,2.284],[100.64,60,2.284],[102.24,60,2.284],[103.85,60,2.284],[105.45,60,2.284],[107.05,60,2.284],[108.66,60,2.284],[110.26,60,2.284],[111.86,60,2.284],[113.46,60,2.284],[115.07,60,2.284],[116.67,60,2.284],[118.27,60,2.284],[119.87,60,2.284],[121.48,60,2.284],[123.08,60,2.284],[124.68,60,2.284],[126.29,60,2.284],[127.89,60,2.284],[129.49,60,2.284],[131.09,60,2.284],[132.7,60,2.284],[134.3,60,2.284],[70.188,60,3.427],[71.791,60,3.427],[73.393,60,3.427],[74.996,60,3.427],[76.599,60,3.427],[78.202,60,3.427],[79.805,60,3.427],[81.407,60,3.427],[83.01,60,3.427],[84.613,60,3.427],[86.216,60,3.427],[87.819,60,3.427],[89.421,60,3.427],[91.024,60,3.427],[92.627,60,3.427],[94.23,60,3.427],[95.833,60,3.427],[97.435,60,3.427],[99.038,60,3.427],[100.64,60,3.427],[102.24,60,3.427],[103.85,60,3.427],[105.45,60,3.427],[107.05,60,3.427],[108.66,60,3.427],[110.26,60,3.427],[111.86,60,3.427],[113.46,60,3.427],[115.07,60,3.427],[116.67,60,3.427],[118.27,60,3.427],[119.87,60,3.427],[121.48,60,3.427],[123.08,60,3.427],[124.68,60,3.427],[126.29,60,3.427],[127.89,60,3.427],[129.49,60,3.427],[131.09,60,3.427],[132.7,60,3.427],[134.3,60,3.427],[70.188,60,4.57],[71.791,60,4.57],[73.393,60,4.57],[74.996,60,4.57],[76.599,60,4.57],[78.202,60,4.57],[79.805,60,4.57],[81.407,60,4.57],[83.01,60,4.57],[84.613,60,4.57],[86.216,60,4.57],[87.819,60,4.57],[89.421,60,4.57],[91.024,60,4.57],[92.627,60,4.57],[94.23,60,4.57],[95.833,60,4.57],[97.435,60,4.57],[99.038,60,4.57],[100.64,60,4.57],[102.24,60,4.57],[103.85,60,4.57],[105.45,60,4.57],[107.05,60,4.57],[108.66,60,4.57],[110.26,60,4.57],[111.86,60,4.57],[113.46,60,4.57],[115.07,60,4.57],[116.67,60,4.57],[118.27,60,4.57],[119.87,60,4.57],[121.48,60,4.57],[123.08,60,4.57],[124.68,60,4.57],[126.29,60,4.57],[127.89,60,4.57],[129.49,60,4.57],[131.09,60,4.57],[132.7,60,4.57],[134.3,60,4.57],[70.188,60,5.713],[71.791,60,5.713],[73.393,60,5.713],[74.996,60,5.713],[76.599,60,5.713],[78.202,60,5.713],[79.805,60,5.713],[81.407,60,5.713],[83.01,60,5.713],[84.613,60,5.713],[86.216,60,5.713],[87.819,60,5.713],[89.421,60,5.713],[91.024,60,5.713],[92.627,60,5.713],[94.23,60,5.713],[95.833,60,5.713],[97.435,60,5.713],[99.038,60,5.713],[100.64,60,5.713],[102.24,60,5.713],[103.85,60,5.713],[105.45,60,5.713],[107.05,60,5.713],[108.66,60,5.713],[110.26,60,5.713],[111.86,60,5.713],[113.46,60,5.713],[115.07,60,5.713],[116.67,60,5.713],[118.27,60,5.713],[119.87,60,5.713],[121.48,60,5.713],[123.08,60,5.713],[124.68,60,5.713],[126.29,60,5.713],[127.89,60,5.713],[129.49,60,5.713],[131.09,60,5.713],[132.7,60,5.713],[134.3,60,5.713],[70.188,60,6.856],[71.791,60,6.856],[73.393,60,6.856],[74.996,60,6.856],[76.599,60,6.856],[78.202,60,6.856],[79.805,60,6.856],[81.407,60,6.856],[83.01,60,6.856],[84.613,60,6.856],[86.216,60,6.856],[87.819,60,6.856],[89.421,60,6.856],[91.024,60,6.856],[92.627,60,6.856],[94.23,60,6.856],[95.833,60,6.856],[97.435,60,6.856],[99.038,60,6.856],[100.64,60,6.856],[102.24,60,6.856],[103.85,60,6.856],[105.45,60,6.856],[107.05,60,6.856],[108.66,60,6.856],[110.26,60,6.856],[111.86,60,6.856],[113.46,60,6.856],[115.07,60,6.856],[116.67,60,6.856],[118.27,60,6.856],[119.87,60,6.856],[121.48,60,6.856],[123.08,60,6.856],[124.68,60,6.856],[126.29,60,6.856],[127.89,60,6.856],[129.49,60,6.856],[131.09,60,6.856],[132.7,60,6.856],[134.3,60,6.856],[70.188,60,7.999],[71.791,60,7.999],[73.393,60,7.999],[74.996,60,7.999],[76.599,60,7.999],[78.202,60,7.999],[79.805,60,7.999],[81.407,60,7.999],[83.01,60,7.999],[84.613,60,7.999],[86.216,60,7.999],[87.819,60,7.999],[89.421,60,7.999],[91.024,60,7.999],[92.627,60,7.999],[94.23,60,7.999],[95.833,60,7.999],[97.435,60,7.999],[99.038,60,7.999],[100.64,60,7.999],[102.24,60,7.999],[103.85,60,7.999],[105.45,60,7.999],[107.05,60,7.999],[108.66,60,7.999],[110.26,60,7.999],[111.86,60,7.999],[113.46,60,7.999],[115.07,60,7.999],[116.67,60,7.999],[118.27,60,7.999],[119.87,60,7.999],[121.48,60,7.999],[123.08,60,7.999],[124.68,60,7.999],[126.29,60,7.999],[127.89,60,7.999],[129.49,60,7.999],[131.09,60,7.999],[132.7,60,7.999],[134.3,60,7.999],[70.188,60,9.142],[71.791,60,9.142],[73.393,60,9.142],[74.996,60,9.142],[76.599,60,9.142],[78.202,60,9.142],[79.805,60,9.142],[81.407,60,9.142],[83.01,60,9.142],[84.613,60,9.142],[86.216,60,9.142],[87.819,60,9.142],[89.421,60,9.142],[91.024,60,9.142],[92.627,60,9.142],[94.23,60,9.142],[95.833,60,9.142],[97.435,60,9.142],[99.038,60,9.142],[100.64,60,9.142],[102.24,60,9.142],[103.85,60,9.142],[105.45,60,9.142],[107.05,60,9.142],[108.66,60,9.142],[110.26,60,9.142],[111.86,60,9.142],[113.46,60,9.142],[115.07,60,9.142],[116.67,60,9.142],[118.27,60,9.142],[119.87,60,9.142],[121.48,60,9.142],[123.08,60,9.142],[124.68,60,9.142],[126.29,60,9.142],[127.89,60,9.142],[129.49,60,9.142],[131.09,60,9.142],[132.7,60,9.142],[134.3,60,9.142],[70.188,60,10.285],[71.791,60,10.285],[73.393,60,10.285],[74.996,60,10.285],[76.599,60,10.285],[78.202,60,10.285],[79.805,60,10.285],[81.407,60,10.285],[83.01,60,10.285],[84.613,60,10.285],[86.216,60,10.285],[87.819,60,10.285],[89.421,60,10.285],[91.024,60,10.285],[92.627,60,10.285],[94.23,60,10.285],[95.833,60,10.285],[97.435,60,10.285],[99.038,60,10.285],[100.64,60,10.285],[102.24,60,10.285],[103.85,60,10.285],[105.45,60,10.285],[107.05,60,10.285],[108.66,60,10.285],[110.26,60,10.285],[111.86,60,10.285],[113.46,60,10.285],[115.07,60,10.285],[116.67,60,10.285],[118.27,60,10.285],[119.87,60,10.285],[121.48,60,10.285],[123.08,60,10.285],[124.68,60,10.285],[126.29,60,10.285],[127.89,60,10.285],[129.49,60,10.285],[131.09,60,10.285],[132.7,60,10.285],[134.3,60,10.285],[70.188,60,11.428],[71.791,60,11.428],[73.393,60,11.428],[74.996,60,11.428],[76.599,60,11.428],[78.202,60,11.428],[79.805,60,11.428],[81.407,60,11.428],[83.01,60,11.428],[84.613,60,11.428],[86.216,60,11.428],[87.819,60,11.428],[89.421,60,11.428],[91.024,60,11.428],[92.627,60,11.428],[94.23,60,11.428],[95.833,60,11.428],[97.435,60,11.428],[99.038,60,11.428],[100.64,60,11.428],[102.24,60,11.428],[103.85,60,11.428],[105.45,60,11.428],[107.05,60,11.428],[108.66,60,11.428],[110.26,60,11.428],[111.86,60,11.428],[113.46,60,11.428],[115.07,60,11.428],[116.67,60,11.428],[118.27,60,11.428],[119.87,60,11.428],[121.48,60,11.428],[123.08,60,11.428],[124.68,60,11.428],[126.29,60,11.428],[127.89,60,11.428],[129.49,60,11.428],[131.09,60,11.428],[132.7,60,11.428],[134.3,60,11.428],[70.188,60,12.571],[71.791,60,12.571],[73.393,60,12.571],[74.996,60,12.571],[76.599,60,12.571],[78.202,60,12.571],[79.805,60,12.571],[81.407,60,12.571],[83.01,60,12.571],[84.613,60,12.571],[86.216,60,12.571],[87.819,60,12.571],[89.421,60,12.571],[91.024,60,12.571],[92.627,60,12.571],[94.23,60,12.571],[95.833,60,12.571],[97.435,60,12.571],[99.038,60,12.571],[100.64,60,12.571],[102.24,60,12.571],[103.85,60,12.571],[105.45,60,12.571],[107.05,60,12.571],[108.66,60,12.571],[110.26,60,12.571],[111.86,60,12.571],[113.46,60,12.571],[115.07,60,12.571],[116.67,60,12.571],[118.27,60,12.571],[119.87,60,12.571],[121.48,60,12.571],[123.08,60,12.571],[124.68,60,12.571],[126.29,60,12.571],[127.89,60,12.571],[129.49,60,12.571],[131.09,60,12.571],[132.7,60,12.571],[134.3,60,12.571],[70.188,60,13.714],[71.791,60,13.714],[73.393,60,13.714],[74.996,60,13.714],[76.599,60,13.714],[78.202,60,13.714],[79.805,60,13.714],[81.407,60,13.714],[83.01,60,13.714],[84.613,60,13.714],[86.216,60,13.714],[87.819,60,13.714],[89.421,60,13.714],[91.024,60,13.714],[92.627,60,13.714],[94.23,60,13.714],[95.833,60,13.714],[97.435,60,13.714],[99.038,60,13.714],[100.64,60,13.714],[102.24,60,13.714],[103.85,60,13.714],[105.45,60,13.714],[107.05,60,13.714],[108.66,60,13.714],[110.26,60,13.714],[111.86,60,13.714],[113.46,60,13.714],[115.07,60,13.714],[116.67,60,13.714],[118.27,60,13.714],[119.87,60,13.714],[121.48,60,13.714],[123.08,60,13.714],[124.68,60,13.714],[126.29,60,13.714],[127.89,60,13.714],[129.49,60,13.714],[131.09,60,13.714],[132.7,60,13.714],[134.3,60,13.714],[70.188,60,14.857],[71.791,60,14.857],[73.393,60,14.857],[74.996,60,14.857],[76.599,60,14.857],[78.202,60,14.857],[79.805,60,14.857],[81.407,60,14.857],[83.01,60,14.857],[84.613,60,14.857],[86.216,60,14.857],[87.819,60,14.857],[89.421,60,14.857],[91.024,60,14.857],[92.627,60,14.857],[94.23,60,14.857],[95.833,60,14.857],[97.435,60,14.857],[99.038,60,14.857],[100.64,60,14.857],[102.24,60,14.857],[103.85,60,14.857],[105.45,60,14.857],[107.05,60,14.857],[108.66,60,14.857],[110.26,60,14.857],[111.86,60,14.857],[113.46,60,14.857],[115.07,60,14.857],[116.67,60,14.857],[118.27,60,14.857],[119.87,60,14.857],[121.48,60,14.857],[123.08,60,14.857],[124.68,60,14.857],[126.29,60,14.857],[127.89,60,14.857],[129.49,60,14.857],[131.09,60,14.857],[132.7,60,14.857],[134.3,60,14.857],[70.188,60,16],[71.791,60,16],[73.393,60,16],[74.996,60,16],[76.599,60,16],[78.202,60,16],[79.805,60,16],[81.407,60,16],[83.01,60,16],[84.613,60,16],[86.216,60,16],[87.819,60,16],[89.421,60,16],[91.024,60,16],[92.627,60,16],[94.23,60,16],[95.833,60,16],[97.435,60,16],[99.038,60,16],[100.64,60,16],[102.24,60,16],[103.85,60,16],[105.45,60,16],[107.05,60,16],[108.66,60,16],[110.26,60,16],[111.86,60,16],[113.46,60,16],[115.07,60,16],[116.67,60,16],[118.27,60,16],[119.87,60,16],[121.48,60,16],[123.08,60,16],[124.68,60,16],[126.29,60,16],[127.89,60,16],[129.49,60,16],[131.09,60,16],[132.7,60,16],[134.3,60,16]],"vectors":[[0.56851,0.62783,-0.001017],[0.56851,0.62783,-0.001017],[0.56851,0.62783,-0.001017],[0.87909,0.62783,-0.001017],[0.56851,0.62783,-0.001017],[0.56851,0.62783,-0.001017],[0.56851,0.27732,-0.001017],[0.87909,-0.42369,-0.001017],[0.87909,-0.42369,-0.001017],[0.87909,0.27732,-0.001017],[0.87909,1.3288,-0.001017],[0.87909,1.3288,-0.001017],[0.56851,1.3288,-0.001017],[-0.36322,0.62783,-0.001017],[-0.6738,-0.42369,-0.001017],[-0.36322,-1.1247,-0.001017],[-0.36322,-1.1247,-0.001017],[0.25794,-1.1247,-0.001017],[-0.36322,-1.4752,-0.001017],[-0.98438,-1.8257,-0.001017],[-1.295,-2.1762,-0.001017],[-0.98438,-2.1762,-0.001017],[-0.98438,-2.5267,-0.001017],[-2.8479,-1.8257,-0.001017],[-2.2267,-3.2277,-0.001017],[-0.6738,-2.1762,-0.001017],[-0.98438,-2.1762,-0.001017],[-0.6738,-2.5267,-0.001017],[-0.6738,-3.2277,-0.001017],[-0.6738,-1.4752,-0.001017],[-1.6055,-0.073182,-0.001017],[-0.6738,1.6793,-0.001017],[-0.36322,2.0299,-0.001017],[-0.6738,2.7309,-0.001017],[-1.295,2.7309,-0.001017],[-2.2267,2.7309,-0.001017],[-2.8479,2.3804,-0.001017],[-2.2267,0.97833,-0.001017],[-0.6738,0.62783,-0.001017],[-0.6738,0.62783,-0.001017],[0.25794,0.97833,-0.001017],[-2.8479,-0.073181,-0.070537],[-2.5373,-0.073181,-0.024191],[-2.5373,-0.073181,-0.024191],[-2.5373,-0.42369,-0.024191],[-2.8479,-0.42369,-0.024191],[-2.8479,-0.42369,-0.024191],[-2.8479,-0.77419,-0.024191],[-2.8479,-1.1247,-0.024191],[-2.8479,-1.4752,-0.024191],[-2.8479,-1.1247,-0.024191],[-2.8479,-0.42369,-0.001017],[-2.8479,-0.42369,-0.001017],[-2.8479,-0.77419,0.010569],[-2.8479,-1.1247,-0.001017],[-2.5373,-1.8257,-0.024191],[-1.6055,-2.1762,-0.024191],[-0.98438,-2.1762,-0.024191],[0.56851,-3.2277,-0.012604],[1.1897,-3.5782,-0.012604],[0.56851,-3.2277,-0.012604],[0.25794,-1.8257,-0.035777],[-0.6738,-2.5267,-0.047364],[-0.98438,-2.5267,-0.001017],[-2.8479,-1.8257,-0.001017],[-2.8479,-3.5782,-0.035777],[-2.5373,-2.5267,-0.047364],[-2.5373,-2.5267,-0.024191],[-2.2267,-2.5267,-0.012604],[-1.6055,-2.5267,-0.012604],[-2.2267,-2.1762,-0.012604],[-2.5373,-1.4752,-0.001017],[-2.2267,-0.77419,0.033743],[-1.6055,0.27732,0.056916],[-1.6055,0.62783,0.10326],[-2.2267,0.97834,0.13802],[-2.5373,0.62783,0.11485],[-2.5373,0.97834,0.045329],[-2.2267,0.97834,-0.024191],[-1.295,0.97834,-0.024191],[-1.295,0.62783,-0.012604],[-1.295,0.97834,0.056916],[-5.6431,-0.073181,-0.17482],[-5.0219,-0.42369,-0.047364],[-4.7113,-0.42369,-0.047364],[-4.7113,-0.77419,-0.047364],[-4.7113,-0.42369,-0.047364],[-4.7113,-0.42369,-0.047364],[-4.4008,-0.77419,-0.047364],[-4.4008,-1.1247,-0.058951],[-4.4008,-1.4752,-0.058951],[-4.4008,-1.4752,-0.035777],[-4.4008,-1.1247,-0.012604],[-4.4008,-1.4752,-0.001017],[-3.7796,-1.4752,-0.001017],[-3.469,-1.8257,-0.024191],[-3.1584,-2.5267,-0.058951],[-2.5373,-2.5267,-0.058951],[-0.98438,-3.2277,-0.047364],[2.432,-4.2793,-0.035777],[3.6743,-4.6298,-0.035777],[3.3637,-3.9287,-0.035777],[3.6743,-1.8257,-0.058951],[3.0531,-0.77419,-0.1053],[-0.36322,-0.77419,-0.082124],[-4.7113,-1.1247,-0.047364],[-5.6431,-1.4752,-0.11688],[-6.8854,-1.8257,-0.1053],[-7.5065,-1.8257,-0.035777],[-7.5065,-2.1762,-0.012604],[-7.196,-2.1762,-0.024191],[-7.196,-2.1762,-0.024191],[-7.196,-2.1762,-0.001017],[-6.2642,-2.5267,0.045329],[-5.6431,-3.2277,0.10326],[-5.3325,-3.9287,0.17278],[-5.0219,-4.6298,0.2423],[-4.4008,-3.2277,0.20754],[-3.1584,0.27732,0.080089],[-2.2267,2.3804,-0.035777],[-1.6055,1.6793,-0.047364],[-1.295,-0.42369,-0.024191],[-0.6738,-1.4752,0.12644],[-2.5373,0.27732,-0.29068],[-2.2267,0.62783,-0.082124],[-1.6055,0.62783,-0.082124],[-1.295,0.62783,-0.082124],[-1.295,0.62783,-0.070537],[-1.295,0.62783,-0.058951],[-0.98438,0.27732,-0.058951],[-0.98438,-0.42369,-0.082124],[-0.98438,-0.77419,-0.082124],[-1.295,-0.77419,-0.058951],[-1.6055,-0.77419,-0.024191],[-1.6055,-1.1247,-0.024191],[-2.2267,-0.77419,-0.012604],[-2.2267,-1.1247,-0.047364],[-2.5373,-1.1247,-0.082124],[-2.2267,-1.1247,-0.082124],[-0.98438,-1.8257,-0.058951],[1.1897,-2.5267,-0.047364],[2.7426,-2.8772,-0.058951],[2.432,-2.5267,-0.058951],[2.7426,-0.77419,-0.082124],[1.5003,0.27732,-0.14006],[-1.295,-0.073181,-0.11688],[-6.2642,-0.42369,-0.093711],[-7.5065,-0.42369,-0.16323],[-9.0594,-1.1247,-0.14006],[-9.6806,-1.8257,-0.047364],[-10.302,-2.8772,-0.012604],[-9.6806,-3.5782,-0.024191],[-9.6806,-3.5782,-0.047364],[-9.0594,-3.5782,-0.012604],[-8.4383,-4.6298,0.045329],[-7.196,-5.3308,0.12644],[-6.5748,-7.0833,0.23072],[-5.6431,-8.4853,0.31182],[-4.7113,-7.0833,0.27706],[-3.1584,-2.5267,0.10326],[-2.2267,0.27732,-0.047364],[-0.98438,0.27732,-0.082124],[0.25794,-1.8257,-0.058951],[0.87909,-2.8772,0.18437],[0.25793,0.27732,-0.39496],[0.56851,0.97834,-0.1053],[0.56851,1.3288,-0.093711],[0.87909,1.6793,-0.093711],[0.87909,1.6793,-0.082124],[1.1897,1.6793,-0.070537],[1.1897,1.3288,-0.070537],[1.1897,0.62783,-0.093711],[0.87909,-0.073181,-0.093711],[0.56851,-0.42369,-0.082124],[0.25793,-0.42369,-0.035777],[-0.6738,-0.42369,-0.035777],[-0.98438,-0.42369,-0.024191],[-1.295,-0.073181,-0.058951],[-2.2267,0.27732,-0.1053],[-2.2267,0.27732,-0.093711],[-1.6055,-0.073181,-0.058951],[0.25793,-1.4752,-0.047364],[1.5003,-1.8257,-0.070537],[1.1897,-1.4752,-0.082124],[1.1897,0.27732,-0.1053],[0.56851,1.3288,-0.15164],[-1.295,0.97834,-0.14006],[-6.2642,0.97834,-0.14006],[-8.4383,1.3288,-0.20958],[-9.37,0.62783,-0.17482],[-10.612,-1.4752,-0.058951],[-10.612,-2.5267,-0.012604],[-10.612,-3.2277,-0.035777],[-10.302,-2.5267,-0.058951],[-9.0594,-3.2277,-0.035777],[-8.1277,-4.9803,0.045329],[-6.8854,-7.0833,0.13802],[-5.6431,-9.8873,0.25389],[-4.4008,-12.691,0.35817],[-2.5373,-11.64,0.32341],[-0.36322,-6.7328,0.10326],[0.56851,-2.1762,-0.082124],[0.87909,-1.8257,-0.11688],[1.5003,-4.2792,-0.1053],[2.1214,-5.3308,0.20754],[3.0531,0.97834,-0.49924],[3.0531,1.3288,-0.12847],[3.3637,2.0299,-0.11688],[3.3637,2.3804,-0.1053],[3.3637,2.7309,-0.082124],[3.3637,2.3804,-0.082124],[3.3637,1.6793,-0.070537],[3.3637,0.97834,-0.1053],[3.0531,0.27732,-0.1053],[2.432,-0.073181,-0.093711],[1.5003,-0.42369,-0.058951],[0.87909,-0.42369,-0.047364],[0.56851,-0.073181,-0.035777],[-0.36322,0.27732,-0.070537],[-0.98438,0.62783,-0.11688],[-1.295,0.97834,-0.093711],[-0.98438,0.62783,-0.058951],[0.25794,-0.77419,-0.035777],[1.1897,-0.77419,-0.070537],[1.1897,-0.42369,-0.082124],[0.87909,1.3288,-0.1053],[0.56851,2.3804,-0.12847],[-0.36322,1.6793,-0.12847],[-4.7113,1.6793,-0.11688],[-6.2642,2.3804,-0.20958],[-7.196,1.6793,-0.1864],[-8.1277,-1.4752,-0.047364],[-8.1277,-2.8772,-0.012604],[-7.5065,-3.5782,-0.047364],[-6.8854,-2.8772,-0.093711],[-6.2642,-2.8772,-0.058951],[-5.6431,-4.9803,0.022156],[-5.0219,-7.0833,0.13802],[-4.4008,-10.238,0.27706],[-2.5373,-13.392,0.39293],[-0.6738,-12.691,0.335],[2.1214,-7.4338,0.080089],[3.0531,-2.8772,-0.14006],[3.3637,-2.5267,-0.1864],[3.6743,-4.6298,-0.15164],[3.6743,-6.0318,0.23072],[6.7801,1.6793,-0.58035],[6.4695,2.3804,-0.14006],[6.4695,3.0814,-0.12847],[6.4695,3.4319,-0.1053],[6.4695,3.4319,-0.082124],[6.4695,3.0814,-0.070537],[6.1589,2.3804,-0.070537],[6.1589,1.6793,-0.1053],[5.5378,0.97834,-0.11688],[4.9166,0.62783,-0.1053],[4.2955,0.27732,-0.070537],[3.0531,0.27732,-0.058951],[2.7426,0.62783,-0.047364],[2.432,0.97834,-0.082124],[1.1897,1.3288,-0.11688],[0.87909,1.6793,-0.093711],[0.87909,0.97834,-0.047364],[2.1214,-0.073181,-0.024191],[2.7426,0.27732,-0.058951],[2.432,0.97834,-0.082124],[1.5003,2.7309,-0.093711],[1.5003,3.4319,-0.11688],[2.1214,2.3804,-0.11688],[-1.6055,2.3804,-0.12847],[-3.1584,3.4319,-0.22116],[-4.4008,2.0299,-0.19799],[-5.0219,-1.8257,-0.058951],[-4.7113,-3.9287,-0.012604],[-3.7796,-4.6298,-0.070537],[-3.469,-3.5782,-0.11688],[-2.8479,-3.5782,-0.082124],[-3.1584,-4.9803,0.010569],[-2.8479,-7.4338,0.12644],[-2.5373,-10.588,0.28865],[-0.6738,-14.093,0.4161],[1.5003,-12.691,0.35817],[4.606,-6.3823,0.045329],[6.1589,-1.8257,-0.20958],[6.7801,-1.8257,-0.24434],[7.4013,-3.5782,-0.22116],[8.333,-5.3308,0.23072],[10.507,2.7309,-0.63828],[10.196,3.4319,-0.16323],[9.5753,3.7824,-0.12847],[9.5753,3.7824,-0.1053],[9.2647,3.7824,-0.082124],[9.2647,3.4319,-0.070537],[9.2647,2.7309,-0.070537],[8.9541,2.3804,-0.1053],[8.333,1.6793,-0.11688],[7.4013,1.3288,-0.1053],[6.7801,0.97834,-0.082124],[6.1589,0.97834,-0.070537],[5.2272,1.3288,-0.058951],[4.9166,1.3288,-0.093711],[4.2955,1.6793,-0.11688],[3.6743,2.0299,-0.082124],[3.6743,1.6793,-0.024191],[4.606,0.62783,-0.001017],[4.9166,1.3288,-0.035777],[4.606,2.3804,-0.058951],[3.3637,4.1329,-0.082124],[3.0531,4.8339,-0.093711],[4.9166,3.4319,-0.11688],[1.5003,3.0814,-0.14006],[0.25794,4.1329,-0.23275],[-0.98438,2.3804,-0.20958],[-1.295,-2.1762,-0.058951],[-0.98438,-4.9803,-0.024191],[0.25794,-4.9803,-0.093711],[0.56851,-3.9287,-0.16323],[0.56851,-3.9287,-0.1053],[0.25794,-5.3308,-0.012604],[0.25794,-7.7843,0.12644],[0.25794,-11.289,0.28865],[1.5003,-14.794,0.45086],[4.2955,-13.042,0.38134],[7.0907,-6.0318,0.010569],[8.9541,-1.1247,-0.2791],[10.507,-0.77419,-0.32544],[11.439,-2.5267,-0.2791],[12.371,-4.6298,0.20754],[14.234,3.7824,-0.69622],[13.923,4.1329,-0.16323],[13.302,4.1329,-0.12847],[12.992,4.1329,-0.1053],[12.681,4.1329,-0.070537],[12.681,3.7824,-0.058951],[12.371,3.0814,-0.058951],[12.06,2.3804,-0.1053],[11.439,2.0299,-0.11688],[10.818,1.6793,-0.11688],[9.5753,1.6793,-0.082124],[8.9541,1.6793,-0.082124],[8.6436,1.6793,-0.070537],[8.333,1.6793,-0.093711],[7.4013,2.0299,-0.11688],[7.0907,2.0299,-0.082124],[7.0907,1.6793,-0.001017],[7.4013,0.97834,0.022156],[7.0907,2.0299,-0.001017],[6.7801,3.4319,-0.035777],[5.2272,5.5349,-0.047364],[5.2272,6.5864,-0.058951],[7.4013,4.4834,-0.1053],[4.9166,4.1329,-0.14006],[3.6743,4.8339,-0.24434],[2.7426,2.7309,-0.23275],[2.432,-2.1762,-0.070537],[2.7426,-5.3308,-0.035777],[4.2955,-4.9803,-0.12847],[4.606,-3.5782,-0.19799],[4.606,-3.5782,-0.14006],[3.6743,-5.6813,-0.024191],[3.3637,-8.1348,0.11485],[3.6743,-12.691,0.30024],[5.2272,-16.196,0.47404],[7.4013,-14.444,0.40452],[10.196,-6.0318,-0.024191],[12.371,-0.77419,-0.34862],[13.923,-0.073181,-0.39496],[14.855,-2.1762,-0.34862],[16.097,-4.6298,0.17278],[17.961,4.8339,-0.71939],[17.029,5.1844,-0.17482],[16.719,4.8339,-0.12847],[16.408,4.4834,-0.093711],[16.408,4.1329,-0.070537],[16.408,3.7824,-0.058951],[16.097,3.0814,-0.058951],[16.097,2.7309,-0.093711],[15.166,2.3804,-0.11688],[14.545,2.3804,-0.1053],[13.923,2.0299,-0.082124],[12.681,2.0299,-0.093711],[12.371,2.0299,-0.082124],[12.06,2.0299,-0.1053],[11.439,2.0299,-0.11688],[10.818,2.0299,-0.070537],[10.818,1.3288,0.022156],[10.818,0.62783,0.056916],[10.196,2.0299,0.033743],[8.6436,3.7824,0.010569],[6.7801,6.5864,-0.001017],[6.7801,7.2874,-0.012604],[10.196,4.8339,-0.082124],[8.6436,4.8339,-0.14006],[7.0907,6.2359,-0.25592],[6.1589,3.4319,-0.24434],[6.1589,-1.8257,-0.082124],[6.7801,-4.6298,-0.047364],[8.6436,-3.5782,-0.16323],[8.9541,-1.4752,-0.23275],[9.2647,-2.1762,-0.17482],[8.6436,-4.6298,-0.047364],[8.6436,-8.1348,0.10326],[9.2647,-13.392,0.31182],[11.128,-17.598,0.5088],[14.234,-15.846,0.4161],[17.029,-6.3823,-0.047364],[18.893,0.62783,-0.41814],[20.135,0.97834,-0.47607],[20.446,-1.4752,-0.41814],[20.756,-3.9287,0.10326],[21.377,6.5864,-0.71939],[21.067,6.2359,-0.17482],[20.756,5.5349,-0.12847],[20.446,4.8339,-0.093711],[20.446,4.4834,-0.058951],[20.446,4.1329,-0.047364],[20.446,3.7824,-0.047364],[20.446,3.4319,-0.082124],[19.824,3.0814,-0.1053],[18.893,2.7309,-0.1053],[18.272,2.7309,-0.082124],[17.029,2.7309,-0.093711],[16.719,2.7309,-0.082124],[16.408,2.3804,-0.1053],[15.476,2.3804,-0.11688],[15.166,2.0299,-0.058951],[14.855,0.97834,0.033743],[14.545,-0.073181,0.091676],[12.681,1.6793,0.080089],[10.818,3.4319,0.080089],[8.9541,6.9369,0.080089],[8.9541,7.6379,0.045329],[12.681,5.5349,-0.047364],[12.06,5.5349,-0.12847],[10.818,7.2874,-0.25592],[9.2647,4.4834,-0.25592],[8.6436,-1.4752,-0.093711],[9.5753,-4.2792,-0.070537],[11.439,-2.1762,-0.1864],[11.439,-0.073181,-0.25592],[12.06,-0.77419,-0.1864],[12.06,-3.9287,-0.058951],[12.371,-7.4338,0.10326],[12.992,-13.042,0.32341],[15.476,-18.299,0.53197],[19.203,-15.846,0.43928],[22.62,-4.2792,-0.070537],[24.173,3.7824,-0.47607],[24.483,4.1329,-0.54559],[24.483,0.97834,-0.47607],[24.794,-2.1762,0.022156],[24.483,7.6379,-0.68463],[23.862,7.2874,-0.16323],[23.862,6.2359,-0.11688],[23.862,5.1844,-0.082124],[23.862,4.8339,-0.047364],[24.173,4.1329,-0.035777],[24.173,3.7824,-0.035777],[24.173,3.4319,-0.070537],[23.241,3.4319,-0.093711],[22.62,3.0814,-0.093711],[21.998,3.0814,-0.082124],[20.756,3.0814,-0.093711],[20.135,3.0814,-0.093711],[19.824,2.7309,-0.1053],[18.893,2.3804,-0.11688],[18.582,1.6793,-0.058951],[17.961,-0.073181,0.045329],[17.029,-1.4752,0.10326],[15.166,0.27732,0.12644],[12.371,2.3804,0.11485],[10.507,6.5864,0.12644],[10.818,7.6379,0.10326],[14.855,5.5349,-0.012604],[14.545,6.5864,-0.1053],[13.302,8.339,-0.25592],[12.06,5.5349,-0.25592],[11.128,-0.77419,-0.093711],[11.439,-3.5782,-0.082124],[13.302,-1.4752,-0.19799],[12.992,1.6793,-0.26751],[13.923,0.62783,-0.19799],[13.923,-2.5267,-0.070537],[14.234,-7.4338,0.10326],[15.166,-13.743,0.335],[17.34,-19.702,0.55514],[21.377,-16.547,0.45086],[24.794,-2.5267,-0.082124],[26.347,6.9369,-0.52242],[26.347,7.6379,-0.60352],[26.657,3.0814,-0.534],[26.968,-0.77419,-0.082124],[26.036,8.339,-0.63828],[26.036,7.9885,-0.15164],[26.036,6.5864,-0.1053],[26.036,5.5349,-0.070537],[26.347,4.8339,-0.035777],[26.657,4.1329,-0.012604],[26.968,3.7824,-0.012604],[26.657,3.4319,-0.047364],[26.347,3.4319,-0.070537],[25.104,3.4319,-0.082124],[24.483,3.4319,-0.070537],[23.241,3.4319,-0.093711],[22.62,3.4319,-0.093711],[22.309,3.0814,-0.11688],[21.377,2.3804,-0.11688],[20.756,1.3288,-0.047364],[20.135,-1.1247,0.045329],[19.203,-3.2277,0.11485],[17.029,-1.4752,0.1612],[13.923,0.62783,0.17278],[11.439,4.4834,0.19596],[12.06,6.5864,0.17278],[16.408,5.1844,0.022156],[16.719,6.5864,-0.082124],[15.476,9.04,-0.24434],[13.923,6.9369,-0.25592],[12.681,-0.073181,-0.093711],[12.992,-2.5267,-0.082124],[14.545,-0.073181,-0.19799],[13.923,3.4319,-0.25592],[14.545,2.0299,-0.19799],[14.545,-2.1762,-0.070537],[14.855,-7.7843,0.11485],[15.476,-15.495,0.34658],[17.34,-22.506,0.56673],[21.067,-19,0.46245],[24.173,-2.5267,-0.093711],[25.725,9.04,-0.54559],[26.036,9.741,-0.64987],[26.657,5.1844,-0.58035],[27.278,0.62783,-0.1864],[24.483,7.9885,-0.60352],[24.173,7.6379,-0.14006],[24.483,6.5864,-0.093711],[24.483,5.1844,-0.058951],[24.483,4.4834,-0.024191],[24.794,3.7824,-0.012604],[24.483,3.0814,-0.001017],[24.173,2.7309,-0.035777],[23.862,2.7309,-0.058951],[22.93,2.7309,-0.070537],[22.309,3.0814,-0.070537],[21.377,3.7824,-0.093711],[21.067,3.7824,-0.093711],[20.446,3.4319,-0.11688],[20.135,2.7309,-0.11688],[19.203,1.3288,-0.047364],[18.582,-1.4752,0.045329],[18.582,-4.6298,0.11485],[17.029,-3.9287,0.17278],[14.545,-1.8257,0.19596],[13.302,0.62783,0.2423],[14.234,2.7309,0.20754],[17.961,3.0814,0.045329],[18.272,5.1844,-0.070537],[17.029,9.3905,-0.23275],[14.234,7.6379,-0.24434],[12.06,-0.42369,-0.082124],[11.128,-2.8772,-0.093711],[12.371,0.27732,-0.19799],[10.818,3.7824,-0.24434],[12.06,1.6793,-0.19799],[12.06,-2.5267,-0.070537],[12.371,-9.1863,0.11485],[12.371,-17.598,0.34658],[13.302,-26.361,0.56673],[16.719,-22.506,0.45086],[19.203,-2.1762,-0.093711],[20.756,12.545,-0.55718],[21.377,13.947,-0.67305],[22.309,9.3905,-0.60352],[23.241,3.7824,-0.25592],[21.377,7.2874,-0.56876],[21.377,6.9369,-0.12847],[21.377,6.2359,-0.093711],[21.377,4.8339,-0.058951],[21.377,3.7824,-0.024191],[21.067,3.0814,-0.001017],[20.446,2.3804,-0.001017],[20.135,1.6793,-0.035777],[19.203,1.3288,-0.058951],[18.893,2.0299,-0.058951],[18.582,2.7309,-0.058951],[18.272,3.4319,-0.082124],[17.961,4.1329,-0.082124],[17.34,3.7824,-0.11688],[17.029,3.0814,-0.11688],[16.408,1.3288,-0.047364],[16.097,-1.8257,0.033743],[16.719,-6.0318,0.10326],[16.408,-6.3823,0.18437],[15.166,-5.6813,0.21913],[15.166,-3.9287,0.27706],[16.408,-1.4752,0.2423],[19.203,0.62783,0.080089],[19.203,3.4319,-0.058951],[17.961,9.3905,-0.22116],[13.302,7.9885,-0.23275],[9.5753,-1.1247,-0.082124],[8.333,-3.5782,-0.093711],[8.333,-0.073181,-0.19799],[6.4695,3.4319,-0.23275],[7.4013,1.3288,-0.1864],[8.0224,-3.5782,-0.070537],[8.333,-10.588,0.11485],[8.333,-20.403,0.335],[8.333,-30.567,0.55514],[11.128,-25.66,0.43928],[12.992,-1.8257,-0.093711],[14.545,16.401,-0.55718],[15.166,19.205,-0.68463],[16.408,13.947,-0.61511],[17.961,7.9885,-0.30227],[0.56851,0.97833,-0.001017],[0.56851,0.97833,-0.001017],[0.56851,0.97833,-0.001017],[0.87909,1.3288,-0.001017],[0.56851,1.3288,-0.001017],[0.56851,0.62783,-0.001017],[0.25794,0.62783,-0.001017],[0.25794,0.97833,-0.001017],[1.1897,0.97833,-0.001017],[2.1214,0.97833,-0.001017],[1.5003,0.62783,-0.001017],[0.87909,-0.073182,-0.001017],[0.56851,-0.42369,-0.001017],[-0.98438,-0.073182,-0.001017],[-0.6738,-0.42369,-0.001017],[0.25794,-0.77419,-0.001017],[0.25794,-0.42369,-0.001017],[-0.36322,-0.77419,-0.001017],[-0.98438,-1.4752,-0.001017],[-0.98438,-2.1762,-0.001017],[-1.6055,-1.4752,-0.001017],[-0.6738,0.27732,-0.001017],[0.25794,3.4319,-0.001017],[-2.5373,0.97833,-0.001017],[-1.295,-1.4752,-0.001017],[-0.36322,-2.1762,-0.001017],[-0.36322,-1.8257,-0.001017],[-0.6738,-3.2277,-0.001017],[-1.295,-2.5267,-0.001017],[-0.6738,-1.8257,-0.001017],[-0.6738,-1.8257,-0.001017],[-0.98438,-0.77419,-0.001017],[-0.98438,0.27732,-0.001017],[-1.295,0.97833,-0.001017],[-2.2267,1.3288,-0.001017],[-1.6055,0.62783,-0.001017],[-2.8479,1.3288,-0.001017],[-1.6055,0.97833,-0.001017],[-0.98438,1.3288,-0.001017],[-1.6055,2.0299,-0.001017],[-1.295,2.3804,-0.001017],[-2.8479,0.27732,-0.058951],[-2.5373,0.27732,-0.012604],[-2.5373,0.27732,-0.012604],[-2.5373,0.27732,-0.012604],[-2.5373,0.27732,-0.012604],[-2.8479,-0.073181,-0.012604],[-3.1584,-0.073181,-0.012604],[-3.1584,-0.073181,-0.012604],[-2.5373,0.27732,-0.024191],[-2.2267,-0.073181,-0.012604],[-2.2267,-0.77419,-0.001017],[-2.5373,-1.4752,-0.001017],[-2.5373,-1.8257,0.010569],[-2.5373,-2.1762,-0.001017],[-1.6055,-1.8257,-0.012604],[-0.6738,-2.1762,-0.012604],[0.56851,-2.1762,-0.001017],[1.1897,-3.2277,-0.001017],[0.56851,-2.5267,-0.001017],[-0.36322,-2.5267,-0.001017],[-1.6055,-1.8257,-0.001017],[-0.6738,0.27732,-0.001017],[0.25794,3.4319,-0.001017],[-2.5373,0.97834,-0.001017],[-3.1584,-1.1247,-0.024191],[-2.8479,-1.1247,-0.024191],[-2.5373,-1.1247,-0.012604],[-2.5373,-1.8257,-0.001017],[-2.8479,-2.1762,-0.012604],[-1.6055,-2.5267,-0.001017],[-2.2267,-1.8257,-0.001017],[-2.8479,-1.8257,0.010569],[-2.8479,-1.4752,0.010569],[-2.5373,-1.4752,0.010569],[-2.5373,-1.1247,0.010569],[-3.1584,-1.1247,0.010569],[-2.8479,0.27732,-0.001017],[-1.6055,1.3288,-0.012604],[-1.295,1.6793,-0.012604],[-1.295,1.6793,-0.012604],[-0.98438,0.97834,0.045329],[-5.0219,-0.073181,-0.15164],[-4.7113,-0.42369,-0.012604],[-4.4008,-0.42369,-0.012604],[-4.4008,-0.42369,-0.012604],[-4.4008,-0.073181,-0.012604],[-4.7113,-0.42369,-0.012604],[-4.7113,-0.42369,-0.012604],[-5.0219,-0.42369,-0.024191],[-4.7113,-0.42369,-0.035777],[-4.4008,-0.77419,-0.012604],[-4.4008,-1.8257,0.010569],[-3.7796,-2.5267,0.010569],[-2.8479,-3.2277,0.022156],[-1.295,-2.5267,0.010569],[-0.6738,-2.5267,-0.024191],[0.56851,-3.2277,-0.012604],[2.7426,-4.9803,-0.012604],[4.2955,-6.3823,-0.001017],[3.6743,-4.6298,-0.001017],[2.7426,-3.9287,-0.012604],[1.1897,-1.8257,-0.012604],[2.1214,1.3288,-0.024191],[0.56851,4.4834,-0.012604],[-3.469,3.0814,-0.012604],[-5.3325,0.97834,-0.035777],[-7.196,-0.073181,-0.024191],[-7.5065,-0.77419,-0.012604],[-8.1277,-1.8257,-0.001017],[-8.1277,-2.5267,-0.012604],[-6.5748,-2.5267,-0.012604],[-5.6431,-3.2277,0.010569],[-6.2642,-3.9287,0.010569],[-5.6431,-4.6298,0.010569],[-5.0219,-6.0318,0.022156],[-4.7113,-6.7328,0.033743],[-4.7113,-5.6813,0.022156],[-3.469,-1.1247,-0.001017],[-1.6055,1.6793,-0.012604],[-0.6738,1.3288,-0.012604],[0.25793,-0.77419,-0.012604],[0.56851,-1.4752,0.12644],[-2.5373,0.27732,-0.24434],[-1.6055,0.27732,-0.012604],[-1.295,0.62783,-0.012604],[-0.98438,0.62783,-0.012604],[-0.6738,0.97834,-0.012604],[-0.6738,0.62783,-0.012604],[-0.6738,0.62783,-0.024191],[-0.98438,0.27732,-0.035777],[-1.295,-0.073181,-0.035777],[-1.295,-0.42369,-0.012604],[-1.295,-0.77419,0.010569],[-1.295,-1.4752,0.010569],[-0.36322,-1.8257,0.022156],[1.1897,-1.1247,0.010569],[1.1897,-1.1247,-0.024191],[1.1897,-1.4752,-0.024191],[3.0531,-3.5782,-0.012604],[3.6743,-4.9803,-0.001017],[3.0531,-2.8772,-0.001017],[2.1214,-2.1762,-0.012604],[0.56851,-1.1247,-0.012604],[0.56851,1.3288,-0.035777],[-0.36322,4.4834,-0.024191],[-5.0219,4.1329,-0.024191],[-6.8854,1.3288,-0.047364],[-8.1277,-0.073181,-0.035777],[-9.0594,-1.4752,-0.012604],[-9.37,-2.8772,-0.001017],[-9.37,-4.2793,-0.012604],[-8.4383,-4.2793,-0.012604],[-7.196,-4.2793,0.010569],[-6.8854,-5.3308,0.022156],[-6.2642,-6.7328,0.022156],[-5.0219,-8.4853,0.033743],[-4.7113,-10.238,0.045329],[-4.4008,-8.8358,0.033743],[-3.1584,-4.2793,-0.001017],[-0.98438,-0.42369,-0.024191],[0.87909,-0.42369,-0.024191],[2.432,-2.1762,-0.012604],[3.0531,-3.5782,0.19596],[0.25793,0.27732,-0.32544],[0.87909,0.62783,-0.012604],[1.1897,0.97834,-0.012604],[1.5003,1.3288,-0.012604],[2.1214,1.6793,-0.012604],[2.1214,1.3288,-0.012604],[2.1214,0.97834,-0.024191],[1.5003,0.62783,-0.035777],[0.87909,0.27732,-0.047364],[0.25793,-0.073181,-0.012604],[0.25793,-0.073181,0.010569],[-0.36322,-0.42369,0.010569],[1.1897,-0.42369,0.033743],[3.0531,0.27732,0.010569],[2.432,0.62783,-0.024191],[1.5003,-0.073181,-0.024191],[2.7426,-1.4752,-0.012604],[2.7426,-2.5267,-0.001017],[1.5003,-1.8257,-0.001017],[1.1897,-1.1247,-0.012604],[0.56851,0.27732,-0.012604],[0.25793,0.97834,-0.035777],[-0.36322,4.1329,-0.024191],[-5.0219,4.8339,-0.012604],[-7.196,2.3804,-0.047364],[-8.1277,0.97834,-0.035777],[-9.37,-1.4752,-0.012604],[-9.6806,-3.2277,-0.001017],[-9.37,-3.9287,-0.012604],[-8.4383,-3.9287,-0.001017],[-6.5748,-4.2792,0.022156],[-5.6431,-5.6813,0.022156],[-4.7113,-7.7843,0.022156],[-3.1584,-10.939,0.033743],[-2.2267,-14.093,0.045329],[-0.98438,-13.392,0.033743],[0.56851,-8.1348,-0.001017],[2.1214,-3.9287,-0.024191],[3.0531,-3.2277,-0.024191],[4.2955,-4.6298,-0.024191],[4.606,-5.6813,0.26548],[3.3637,0.62783,-0.40655],[3.6743,1.3288,-0.012604],[3.6743,1.6793,-0.012604],[4.2955,2.0299,-0.012604],[4.606,2.3804,-0.012604],[4.606,2.0299,-0.012604],[4.606,1.6793,-0.024191],[4.2955,0.97834,-0.035777],[3.0531,0.62783,-0.047364],[2.1214,0.27732,-0.012604],[1.5003,0.27732,0.010569],[1.5003,0.27732,0.010569],[2.7426,0.27732,0.033743],[4.9166,0.97834,0.010569],[3.6743,1.3288,-0.024191],[2.7426,0.97834,-0.024191],[3.0531,-0.77419,-0.012604],[2.432,-1.8257,-0.001017],[1.5003,-1.1247,-0.001017],[2.1214,-0.073181,-0.001017],[1.1897,1.3288,-0.012604],[1.1897,0.62783,-0.024191],[1.1897,3.7824,-0.024191],[-3.469,5.1844,-0.012604],[-5.0219,2.7309,-0.035777],[-5.0219,1.6793,-0.035777],[-6.5748,-1.4752,-0.012604],[-6.8854,-3.5782,-0.001017],[-6.5748,-4.2793,-0.001017],[-5.0219,-3.9287,-0.001017],[-3.469,-3.9287,0.022156],[-3.1584,-4.9803,0.022156],[-2.5373,-7.4338,0.022156],[-1.295,-10.939,0.033743],[-0.36322,-14.444,0.056916],[1.1897,-14.093,0.045329],[3.0531,-8.8358,-0.001017],[4.606,-4.6298,-0.024191],[6.1589,-3.9287,-0.024191],[6.7801,-5.6813,-0.024191],[7.0907,-6.7328,0.32341],[7.0907,1.3288,-0.46448],[7.0907,2.0299,-0.012604],[7.0907,2.7309,-0.012604],[7.4013,3.0814,-0.012604],[7.4013,3.0814,-0.012604],[7.4013,2.7309,-0.012604],[7.4013,2.3804,-0.024191],[7.0907,1.6793,-0.035777],[5.2272,1.3288,-0.047364],[4.2955,0.97834,-0.012604],[3.6743,0.97834,0.010569],[3.3637,0.97834,0.010569],[5.2272,0.97834,0.033743],[7.4013,1.3288,0.010569],[6.4695,1.6793,-0.024191],[5.2272,1.6793,-0.024191],[4.9166,0.27732,-0.012604],[3.6743,-0.77419,0.010569],[2.7426,-0.073181,-0.001017],[3.6743,1.3288,-0.001017],[3.3637,2.7309,-0.012604],[3.0531,1.3288,-0.024191],[3.6743,3.7824,-0.012604],[-0.36322,5.5349,-0.001017],[-1.6055,3.7824,-0.035777],[-0.98438,2.0299,-0.035777],[-2.8479,-1.8257,-0.012604],[-3.1584,-4.6298,-0.001017],[-2.8479,-4.9803,-0.001017],[-1.295,-3.9287,-0.012604],[0.25794,-3.5782,0.010569],[0.25794,-4.6298,0.022156],[0.56851,-7.0833,0.022156],[1.1897,-10.588,0.033743],[2.432,-14.444,0.056916],[3.6743,-13.743,0.045329],[6.1589,-8.1348,-0.001017],[8.333,-3.5782,-0.024191],[10.196,-2.5267,-0.024191],[11.128,-4.6298,-0.012604],[12.06,-6.0318,0.36976],[11.128,2.7309,-0.52242],[11.128,3.0814,-0.012604],[10.818,3.4319,-0.012604],[10.818,3.7824,-0.012604],[10.818,3.4319,-0.012604],[10.818,3.0814,-0.012604],[10.818,2.7309,-0.024191],[10.196,2.3804,-0.035777],[8.333,2.0299,-0.047364],[6.7801,1.6793,-0.012604],[6.4695,1.6793,0.010569],[6.4695,1.6793,0.010569],[8.0224,1.3288,0.022156],[10.507,1.6793,0.010569],[9.5753,2.0299,-0.024191],[8.333,2.0299,-0.024191],[7.4013,1.3288,-0.012604],[6.4695,0.62783,0.010569],[5.2272,1.3288,-0.001017],[6.4695,2.7309,-0.001017],[6.1589,4.4834,-0.012604],[5.5378,2.0299,-0.024191],[7.0907,3.7824,-0.012604],[3.3637,6.5864,-0.001017],[2.432,4.4834,-0.035777],[3.0531,2.3804,-0.024191],[1.1897,-2.1762,-0.012604],[0.87909,-5.3308,-0.001017],[1.1897,-5.3308,-0.012604],[2.7426,-4.2793,-0.012604],[4.2955,-3.5782,0.010569],[3.3637,-4.6298,0.022156],[3.3637,-7.0833,0.022156],[3.6743,-10.939,0.033743],[4.606,-15.145,0.045329],[6.1589,-13.743,0.033743],[8.333,-7.4338,-0.001017],[11.128,-2.1762,-0.024191],[13.923,-1.8257,-0.024191],[15.476,-3.5782,-0.024191],[16.719,-5.3308,0.39293],[15.476,3.7824,-0.55718],[15.166,4.1329,-0.012604],[14.855,4.1329,-0.012604],[14.855,4.1329,-0.012604],[14.545,3.7824,-0.012604],[14.545,3.4319,-0.012604],[14.234,3.0814,-0.024191],[13.302,2.7309,-0.035777],[11.439,2.3804,-0.047364],[10.196,2.3804,-0.012604],[9.2647,2.0299,0.010569],[9.2647,2.0299,0.010569],[11.128,1.6793,0.022156],[13.923,2.0299,0.010569],[13.302,2.3804,-0.024191],[12.06,2.0299,-0.024191],[11.128,1.6793,-0.012604],[9.5753,1.3288,0.010569],[8.333,2.3804,-0.001017],[9.2647,4.1329,-0.001017],[8.6436,6.2359,-0.012604],[8.9541,3.0814,-0.024191],[10.818,4.1329,-0.001017],[8.0224,6.9369,-0.001017],[6.7801,5.1844,-0.035777],[7.4013,2.7309,-0.024191],[5.5378,-2.5267,-0.001017],[4.9166,-6.0318,-0.001017],[5.2272,-5.6813,-0.012604],[7.4013,-3.9287,-0.012604],[8.6436,-3.5782,0.010569],[7.4013,-4.9803,0.022156],[7.0907,-7.4338,0.022156],[7.0907,-12.341,0.033743],[8.0224,-16.547,0.045329],[8.6436,-15.145,0.033743],[10.818,-7.7843,-0.012604],[14.234,-1.8257,-0.024191],[16.719,-1.4752,-0.024191],[18.893,-3.5782,-0.024191],[20.446,-5.3308,0.40452],[19.824,4.8339,-0.55718],[19.203,5.1844,-0.012604],[18.893,4.8339,-0.012604],[18.582,4.4834,-0.012604],[18.582,4.1329,-0.012604],[18.582,3.4319,-0.012604],[18.272,3.0814,-0.012604],[17.34,2.7309,-0.035777],[15.476,2.7309,-0.035777],[13.923,2.7309,-0.012604],[13.302,2.7309,0.010569],[13.302,2.3804,0.010569],[15.166,2.3804,0.022156],[17.961,2.3804,0.010569],[17.34,2.3804,-0.024191],[16.408,2.0299,-0.024191],[14.855,2.0299,-0.012604],[12.992,2.0299,0.010569],[11.128,3.0814,-0.001017],[11.439,4.4834,-0.001017],[10.818,6.5864,-0.001017],[11.128,3.4319,-0.024191],[14.234,3.4319,-0.001017],[12.06,6.9369,-0.001017],[10.818,6.2359,-0.035777],[11.439,3.4319,-0.024191],[9.5753,-1.8257,-0.001017],[9.2647,-5.3308,-0.001017],[10.507,-4.2793,-0.012604],[12.681,-2.1762,-0.012604],[14.234,-2.1762,0.010569],[12.681,-4.2793,0.022156],[12.371,-7.4338,0.010569],[12.992,-13.042,0.033743],[13.923,-18.299,0.045329],[14.855,-16.547,0.033743],[17.029,-8.1348,-0.012604],[20.446,-1.8257,-0.035777],[22.62,-0.42369,-0.035777],[24.483,-2.5267,-0.024191],[25.725,-4.9803,0.38134],[24.173,6.5864,-0.54559],[23.862,6.2359,-0.012604],[23.241,5.1844,-0.012604],[23.241,4.8339,-0.012604],[23.241,4.1329,-0.012604],[23.241,3.7824,-0.012604],[23.241,3.4319,-0.012604],[22.62,3.4319,-0.024191],[20.756,3.0814,-0.035777],[19.203,3.4319,-0.012604],[18.582,3.4319,0.010569],[18.582,3.0814,0.010569],[20.446,2.7309,0.022156],[22.93,2.7309,0.010569],[22.62,2.7309,-0.012604],[21.067,2.3804,-0.012604],[19.824,2.0299,-0.012604],[17.029,2.0299,0.010569],[14.545,3.4319,-0.001017],[14.234,4.4834,-0.001017],[12.992,6.9369,-0.001017],[13.923,3.7824,-0.012604],[17.029,3.4319,-0.001017],[15.476,7.2874,0.010569],[14.545,7.6379,-0.024191],[15.166,4.4834,-0.024191],[12.992,-1.4752,-0.001017],[12.371,-4.6298,-0.001017],[12.992,-3.2277,-0.012604],[15.476,-0.77419,-0.012604],[17.961,-1.1247,0.010569],[16.408,-3.2277,0.010569],[16.719,-6.7328,0.010569],[17.34,-12.691,0.022156],[18.582,-18.299,0.033743],[20.135,-16.196,0.033743],[22.62,-6.0318,-0.012604],[25.725,1.3288,-0.035777],[27.278,2.3804,-0.024191],[28.831,-0.42369,-0.024191],[29.763,-3.2277,0.335],[26.968,7.2874,-0.51083],[26.657,6.9369,-0.012604],[26.657,5.5349,-0.012604],[26.657,4.8339,-0.012604],[26.968,4.1329,-0.012604],[27.278,3.7824,-0.012604],[27.278,3.4319,-0.012604],[26.968,3.4319,-0.024191],[25.104,3.4319,-0.024191],[23.862,3.7824,-0.012604],[22.93,3.7824,0.010569],[22.93,3.7824,0.010569],[24.794,3.4319,0.022156],[27.278,3.0814,0.010569],[26.968,2.7309,-0.012604],[25.725,2.3804,-0.012604],[23.862,1.6793,-0.001017],[20.446,1.6793,0.010569],[17.029,2.7309,-0.001017],[16.097,4.1329,-0.001017],[14.855,6.2359,-0.001017],[16.097,3.4319,-0.012604],[19.203,3.0814,-0.001017],[18.582,7.2874,0.010569],[17.34,8.6895,-0.024191],[18.272,6.2359,-0.024191],[15.166,-0.42369,-0.001017],[14.234,-3.9287,-0.001017],[14.545,-1.8257,-0.012604],[17.34,0.62783,-0.012604],[19.824,0.27732,0.010569],[18.582,-1.8257,0.010569],[18.893,-6.3823,0.010569],[19.824,-13.042,0.022156],[20.446,-19.351,0.033743],[21.377,-16.547,0.022156],[24.173,-4.6298,-0.012604],[26.968,4.1329,-0.024191],[28.831,5.5349,-0.024191],[30.695,1.6793,-0.012604],[31.316,-1.8257,0.27706],[28.521,7.9885,-0.46448],[28.521,7.2874,-0.012604],[28.831,6.2359,-0.012604],[29.142,4.8339,-0.001017],[30.074,4.1329,-0.001017],[30.384,3.7824,-0.001017],[30.695,3.4319,-0.012604],[30.074,3.4319,-0.024191],[28.521,3.7824,-0.024191],[26.968,3.7824,-0.012604],[26.347,4.1329,0.010569],[26.036,4.1329,0.010569],[27.899,3.7824,0.010569],[30.384,3.4319,0.010569],[30.384,3.0814,-0.012604],[28.831,2.0299,-0.012604],[26.657,0.97834,-0.001017],[22.93,0.27732,0.010569],[19.203,1.6793,-0.001017],[17.34,2.7309,-0.001017],[16.097,4.4834,-0.001017],[17.029,2.3804,-0.012604],[20.446,2.0299,-0.001017],[20.135,6.9369,0.010569],[19.203,9.3905,-0.012604],[20.135,7.2874,-0.012604],[16.719,0.27732,-0.001017],[15.476,-2.5267,-0.001017],[15.476,-0.42369,-0.012604],[18.582,2.3804,-0.012604],[20.446,1.3288,0.010569],[19.203,-1.8257,0.010569],[19.203,-7.0833,-0.001017],[19.824,-14.444,0.010569],[19.203,-21.805,0.022156],[19.824,-18.299,0.010569],[21.377,-4.6298,-0.012604],[25.104,6.2359,-0.024191],[27.899,7.9885,-0.012604],[29.763,3.4319,-0.012604],[31.316,-0.77419,0.20754],[26.347,7.6379,-0.42973],[26.347,6.9369,-0.001017],[26.657,5.5349,-0.001017],[26.968,4.4834,-0.001017],[27.278,3.7824,-0.001017],[27.899,3.4319,-0.001017],[27.899,3.0814,-0.012604],[27.278,2.7309,-0.012604],[26.347,2.7309,-0.024191],[25.104,3.0814,-0.001017],[24.483,3.7824,0.010569],[24.483,3.7824,0.010569],[25.725,3.7824,0.010569],[27.278,3.7824,0.010569],[27.899,3.0814,-0.012604],[26.347,1.6793,-0.012604],[24.483,-0.073181,-0.001017],[21.377,-1.8257,-0.001017],[18.272,-1.1247,-0.001017],[17.029,-0.77419,-0.001017],[16.408,0.62783,-0.001017],[17.961,-0.42369,-0.012604],[20.446,0.62783,-0.001017],[20.135,5.5349,0.022156],[18.893,9.741,-0.012604],[19.824,8.339,-0.012604],[14.855,0.62783,-0.001017],[12.681,-2.5267,-0.001017],[12.371,-0.073181,-0.012604],[14.855,2.7309,-0.012604],[17.029,1.3288,-0.001017],[16.097,-1.8257,-0.001017],[16.408,-8.1348,-0.001017],[16.408,-16.196,-0.001017],[15.166,-24.609,-0.001017],[14.234,-20.403,-0.001017],[15.476,-4.2793,-0.012604],[19.203,9.04,-0.012604],[22.309,11.844,-0.012604],[25.104,7.2874,-0.012604],[26.968,2.3804,0.1612],[22.62,6.9369,-0.40655],[22.62,6.5864,-0.001017],[22.93,5.1844,-0.001017],[23.241,4.4834,-0.001017],[23.241,3.7824,-0.001017],[23.241,3.0814,-0.001017],[23.241,2.3804,-0.001017],[22.62,2.0299,-0.012604],[21.998,1.6793,-0.012604],[21.067,2.0299,-0.001017],[21.067,2.7309,0.010569],[21.067,3.7824,0.010569],[21.998,4.1329,0.010569],[22.62,3.7824,0.010569],[22.93,3.4319,-0.012604],[21.998,1.6793,-0.012604],[20.135,-1.4752,-0.001017],[18.272,-4.2793,-0.001017],[16.408,-4.6298,-0.001017],[16.408,-4.9803,-0.012604],[16.408,-4.6298,-0.001017],[18.272,-3.5782,-0.012604],[20.135,-0.77419,-0.001017],[19.824,3.7824,0.022156],[18.272,10.442,-0.001017],[18.582,9.3905,-0.001017],[12.06,0.97834,-0.001017],[8.6436,-2.1762,-0.001017],[8.0224,0.27732,-0.012604],[10.196,2.7309,-0.012604],[12.06,0.62783,-0.001017],[11.128,-2.8772,-0.001017],[12.06,-9.5368,-0.012604],[12.06,-18.299,-0.012604],[10.507,-27.413,-0.012604],[7.4013,-22.856,-0.012604],[8.0224,-3.5782,-0.012604],[12.371,12.545,-0.012604],[16.097,16.751,-0.001017],[18.893,11.494,-0.001017],[21.067,5.5349,0.12644],[0.56851,0.97833,-0.001017],[0.87909,0.97833,-0.001017],[0.87909,1.3288,-0.001017],[0.56851,1.3288,-0.001017],[0.25794,1.6793,-0.001017],[0.25794,1.6793,-0.001017],[0.56851,2.0299,-0.001017],[0.87909,2.0299,-0.001017],[0.87909,1.6793,-0.001017],[0.56851,0.27732,-0.001017],[-0.36322,-0.073182,-0.001017],[0.25794,-0.073182,-0.001017],[0.87909,-0.77419,-0.001017],[0.25794,-0.77419,-0.001017],[-0.98438,-0.42369,-0.001017],[0.25794,-0.42369,-0.001017],[0.56851,-1.4752,-0.001017],[-0.6738,-1.8257,-0.001017],[-1.295,-2.1762,-0.001017],[-0.6738,-1.8257,-0.001017],[-0.6738,-1.8257,-0.001017],[-0.36322,1.3288,-0.001017],[-0.98438,5.5349,-0.001017],[-3.469,1.3288,-0.001017],[-0.6738,-2.1762,-0.001017],[0.87909,-3.5782,-0.001017],[0.87909,-3.5782,-0.001017],[0.56851,-2.1762,-0.001017],[0.56851,-3.2277,-0.001017],[0.87909,-3.2277,-0.001017],[0.56851,-1.8257,-0.001017],[0.56851,-2.1762,-0.001017],[0.56851,-1.1247,-0.001017],[-0.6738,-0.77419,-0.001017],[-2.2267,-0.073182,-0.001017],[-2.2267,0.27732,-0.001017],[-2.8479,0.97833,-0.001017],[-2.5373,1.3288,-0.001017],[-1.295,1.6793,-0.001017],[-0.6738,1.3288,-0.001017],[-0.6738,1.3288,-0.001017],[-2.8479,0.27732,-0.058951],[-2.5373,0.27732,-0.012604],[-2.5373,0.62783,-0.012604],[-2.8479,0.62783,-0.012604],[-2.5373,0.97834,-0.012604],[-2.8479,0.97834,-0.012604],[-2.2267,0.97834,-0.012604],[-2.5373,0.97834,-0.001017],[-3.1584,0.97834,-0.001017],[-4.4008,-0.77419,0.010569],[-4.4008,-1.1247,-0.001017],[-3.1584,-1.4752,-0.024191],[-0.98438,-3.2277,-0.012604],[0.87909,-3.2277,-0.001017],[0.25794,-1.8257,-0.012604],[0.87909,-1.8257,-0.012604],[1.5003,-3.2277,-0.001017],[0.87909,-3.5782,-0.001017],[-0.36322,-2.5267,-0.012604],[-0.6738,-1.8257,-0.001017],[-0.6738,-1.8257,-0.001017],[-0.36322,1.3288,-0.001017],[-0.98438,5.5349,-0.001017],[-3.7796,1.6793,-0.001017],[-2.8479,1.6793,-0.024191],[-2.5373,-0.073181,-0.024191],[-1.6055,-1.1247,-0.012604],[-2.2267,-1.8257,-0.001017],[-2.5373,-1.8257,-0.012604],[-1.295,-2.5267,-0.012604],[-1.295,-2.5267,-0.001017],[-2.2267,-2.1762,0.010569],[-2.8479,-2.1762,0.010569],[-3.7796,-3.2277,0.010569],[-3.469,-1.8257,0.010569],[-4.4008,-1.1247,0.010569],[-4.4008,0.62783,-0.001017],[-2.8479,1.6793,-0.012604],[-2.2267,2.3804,-0.012604],[-0.98438,1.3288,-0.012604],[-0.6738,0.62783,0.080089],[-4.4008,-0.073181,-0.15164],[-3.7796,-0.42369,-0.012604],[-3.469,-0.073181,-0.012604],[-3.469,-0.073181,-0.012604],[-3.469,0.27732,-0.012604],[-3.7796,0.27732,-0.024191],[-3.469,0.62783,-0.024191],[-4.7113,0.62783,-0.001017],[-6.8854,0.27732,0.010569],[-8.7489,-1.4752,0.010569],[-7.5065,-2.1762,-0.012604],[-5.0219,-3.5782,-0.035777],[-0.6738,-6.0318,-0.024191],[4.606,-4.6298,-0.001017],[3.6743,-2.1762,-0.012604],[4.2955,-4.2793,-0.024191],[5.2272,-6.0318,-0.001017],[4.606,-5.6813,0.010569],[2.7426,-3.5782,-0.012604],[1.5003,-2.1762,-0.012604],[-0.36322,-1.8257,-0.001017],[-0.36322,1.6793,-0.001017],[-0.98438,6.9369,-0.001017],[-3.1584,5.5349,-0.001017],[-3.7796,3.7824,-0.047364],[-5.3325,1.3288,-0.035777],[-5.6431,-1.1247,-0.012604],[-6.5748,-2.1762,-0.001017],[-6.5748,-3.5782,-0.012604],[-5.3325,-4.2793,-0.012604],[-4.7113,-3.9287,0.010569],[-4.4008,-3.9287,0.010569],[-3.7796,-5.3308,0.022156],[-3.7796,-6.3823,0.033743],[-4.7113,-7.4338,0.033743],[-5.0219,-6.3823,0.022156],[-4.4008,-1.8257,-0.001017],[-1.6055,0.62783,-0.012604],[0.25793,0.62783,-0.012604],[1.1897,-1.1247,-0.012604],[2.1214,-1.8257,0.1612],[-1.6055,-0.073181,-0.23275],[-0.98438,-0.073181,-0.012604],[-0.6738,0.62783,-0.012604],[-0.36322,0.62783,-0.012604],[0.25794,0.97834,-0.012604],[0.25794,0.97834,-0.024191],[0.25794,1.3288,-0.024191],[-1.295,1.3288,-0.001017],[-4.7113,0.97834,0.010569],[-7.196,-0.42369,0.022156],[-5.3325,-1.1247,-0.012604],[-2.8479,-1.8257,-0.047364],[1.5003,-4.6298,-0.024191],[8.333,-2.1762,-0.001017],[6.7801,-0.42369,-0.024191],[6.4695,-1.8257,-0.035777],[6.4695,-3.9287,-0.001017],[4.9166,-2.8772,0.010569],[2.432,-1.8257,-0.012604],[0.87909,-1.4752,-0.024191],[-0.6738,-0.77419,-0.012604],[-0.36322,1.6793,-0.001017],[-1.6055,6.5864,0.010569],[-3.469,6.2359,-0.024191],[-4.7113,3.0814,-0.058951],[-5.6431,0.97834,-0.047364],[-6.8854,-1.4752,-0.012604],[-7.196,-3.5782,-0.001017],[-7.196,-4.9803,-0.012604],[-6.2642,-5.6813,-0.012604],[-5.0219,-5.3308,0.010569],[-4.4008,-5.6813,0.022156],[-3.469,-7.4338,0.022156],[-2.8479,-9.1863,0.045329],[-2.8479,-10.588,0.045329],[-2.8479,-9.5368,0.033743],[-2.2267,-5.3308,-0.001017],[0.25794,-1.8257,-0.024191],[2.7426,-1.4752,-0.024191],[4.2955,-2.5267,-0.012604],[5.2272,-3.5782,0.23072],[0.87909,-0.42369,-0.31386],[1.1897,0.27732,-0.012604],[2.1214,0.62783,-0.012604],[2.432,0.97834,-0.012604],[2.7426,1.3288,-0.012604],[3.0531,1.3288,-0.024191],[2.7426,1.3288,-0.035777],[0.87909,1.3288,-0.001017],[-3.7796,1.3288,0.022156],[-6.8854,0.27732,0.022156],[-4.4008,-0.073181,-0.012604],[-1.6055,-1.4752,-0.047364],[3.0531,-3.2277,-0.024191],[10.818,-1.1247,-0.001017],[9.2647,1.3288,-0.024191],[8.0224,-0.073181,-0.035777],[6.7801,-1.4752,-0.001017],[4.606,-0.77419,0.010569],[2.1214,-1.1247,-0.001017],[1.1897,-0.77419,-0.024191],[0.25793,0.62783,-0.012604],[0.56851,0.97834,0.010569],[-1.295,5.5349,0.010569],[-3.1584,6.5864,-0.024191],[-4.7113,2.3804,-0.058951],[-5.6431,1.3288,-0.047364],[-6.8854,-1.1247,-0.012604],[-7.196,-3.5782,0.010569],[-7.196,-5.3308,-0.012604],[-6.2642,-5.6813,-0.012604],[-4.4008,-4.9803,0.010569],[-2.8479,-6.0318,0.022156],[-1.6055,-8.4853,0.033743],[0.25793,-11.289,0.045329],[0.56851,-14.444,0.045329],[1.1897,-13.743,0.033743],[2.1214,-9.5368,-0.001017],[3.6743,-5.3308,-0.024191],[5.5378,-4.2792,-0.024191],[6.7801,-5.3308,-0.024191],[7.4013,-6.0318,0.30024],[3.6743,0.27732,-0.39496],[4.2955,0.97834,-0.012604],[4.606,1.3288,-0.012604],[4.9166,1.6793,-0.012604],[5.2272,2.0299,-0.012604],[5.5378,1.6793,-0.024191],[4.9166,1.6793,-0.035777],[2.7426,1.6793,-0.001017],[-2.8479,1.6793,0.022156],[-6.5748,0.97834,0.022156],[-3.7796,0.27732,-0.012604],[-0.6738,-1.1247,-0.047364],[4.606,-2.5267,-0.024191],[13.302,-0.42369,-0.001017],[11.439,2.3804,-0.024191],[9.2647,1.3288,-0.035777],[7.4013,0.27732,-0.012604],[5.2272,0.62783,-0.001017],[2.7426,-0.42369,-0.001017],[2.432,-0.42369,-0.012604],[2.1214,1.6793,-0.012604],[2.432,0.97834,0.010569],[0.56851,4.4834,0.010569],[-0.98438,6.2359,-0.012604],[-2.5373,2.0299,-0.058951],[-2.8479,1.3288,-0.047364],[-4.7113,-0.77419,-0.012604],[-4.7113,-3.9287,0.010569],[-4.7113,-5.3308,-0.001017],[-3.469,-5.3308,-0.001017],[-1.6055,-4.2793,0.022156],[-0.36322,-4.9803,0.022156],[1.1897,-7.7843,0.033743],[2.432,-10.939,0.045329],[3.0531,-14.444,0.056916],[3.6743,-14.794,0.033743],[4.9166,-10.588,-0.001017],[6.7801,-6.7328,-0.024191],[8.6436,-5.6813,-0.024191],[9.5753,-6.7328,-0.012604],[10.507,-7.0833,0.35817],[7.0907,1.3288,-0.4529],[7.4013,1.6793,-0.012604],[8.0224,2.3804,-0.012604],[8.333,2.7309,-0.012604],[8.6436,2.7309,-0.012604],[8.6436,2.3804,-0.024191],[8.0224,2.3804,-0.024191],[4.9166,2.3804,-0.001017],[-1.295,2.3804,0.022156],[-5.3325,1.6793,0.010569],[-2.8479,0.97834,-0.012604],[0.56851,-0.42369,-0.047364],[6.4695,-1.8257,-0.024191],[16.097,-0.073181,-0.001017],[14.545,3.0814,-0.024191],[11.439,2.3804,-0.024191],[9.5753,1.6793,-0.012604],[7.0907,2.0299,-0.001017],[4.606,0.27732,-0.001017],[4.9166,0.27732,-0.012604],[4.9166,3.0814,-0.012604],[5.5378,1.6793,0.010569],[3.3637,4.1329,0.022156],[2.1214,6.5864,-0.012604],[0.87909,2.0299,-0.047364],[0.87909,1.6793,-0.035777],[-0.98438,-0.42369,-0.012604],[-0.98438,-4.2793,0.010569],[-0.98438,-5.6813,-0.001017],[-0.36322,-5.3308,-0.001017],[1.5003,-3.5782,0.010569],[3.3637,-3.9287,0.022156],[4.606,-7.0833,0.033743],[5.2272,-10.588,0.045329],[5.5378,-14.093,0.056916],[6.7801,-14.093,0.033743],[8.333,-9.8873,-0.001017],[10.507,-5.6813,-0.024191],[12.992,-4.6298,-0.024191],[14.855,-5.6813,-0.024191],[16.097,-6.7328,0.39293],[11.439,2.3804,-0.51083],[11.439,3.0814,-0.012604],[11.439,3.0814,-0.012604],[11.439,3.4319,-0.012604],[12.06,3.0814,-0.012604],[12.06,3.0814,-0.024191],[10.818,2.7309,-0.024191],[7.4013,3.0814,-0.001017],[0.87909,3.0814,0.022156],[-3.7796,2.3804,0.010569],[-1.295,1.6793,-0.012604],[2.432,-0.073181,-0.047364],[8.6436,-1.8257,-0.024191],[18.893,0.27732,-0.001017],[18.272,3.0814,-0.024191],[14.855,3.0814,-0.024191],[12.681,2.7309,-0.012604],[9.5753,3.0814,-0.001017],[7.4013,1.3288,-0.001017],[8.333,1.3288,-0.012604],[8.6436,4.8339,-0.012604],[9.5753,2.3804,0.010569],[8.0224,4.4834,0.022156],[6.4695,7.2874,-0.001017],[5.2272,2.7309,-0.047364],[5.5378,2.0299,-0.035777],[3.3637,-0.42369,-0.012604],[3.0531,-4.9803,0.010569],[2.7426,-6.3823,-0.001017],[3.6743,-5.6813,-0.012604],[5.2272,-3.2277,0.010569],[6.7801,-3.2277,0.022156],[7.4013,-6.7328,0.022156],[8.0224,-10.588,0.045329],[8.333,-14.444,0.045329],[8.9541,-14.093,0.033743],[10.818,-9.1863,-0.012604],[13.923,-4.6298,-0.024191],[17.029,-3.5782,-0.024191],[19.824,-4.9803,-0.024191],[21.067,-6.0318,0.4161],[16.097,3.7824,-0.534],[15.476,4.1329,-0.012604],[15.476,4.1329,-0.012604],[15.476,3.7824,-0.012604],[15.476,3.4319,-0.012604],[15.476,3.0814,-0.024191],[14.545,3.0814,-0.024191],[10.818,3.4319,-0.001017],[3.3637,3.7824,0.010569],[-1.6055,3.0814,0.010569],[0.87909,2.3804,-0.012604],[4.606,0.27732,-0.035777],[11.128,-1.8257,-0.024191],[22.62,0.27732,-0.012604],[21.998,3.0814,-0.024191],[18.582,3.0814,-0.024191],[16.097,3.0814,-0.012604],[13.302,3.7824,-0.001017],[11.128,2.3804,-0.001017],[12.681,2.7309,-0.012604],[12.992,6.5864,-0.001017],[14.545,3.4319,0.010569],[12.681,4.4834,0.022156],[11.128,7.6379,-0.001017],[10.507,3.4319,-0.035777],[10.507,2.7309,-0.035777],[8.0224,-0.42369,-0.012604],[7.0907,-5.3308,0.010569],[6.7801,-6.7328,-0.012604],[8.0224,-6.0318,-0.012604],[9.2647,-2.5267,0.010569],[10.818,-2.8772,0.010569],[11.128,-7.0833,0.022156],[11.128,-11.64,0.033743],[11.128,-15.495,0.045329],[11.128,-15.145,0.022156],[12.992,-9.8873,-0.012604],[16.408,-4.6298,-0.024191],[20.135,-3.5782,-0.024191],[22.93,-4.9803,-0.024191],[24.794,-6.3823,0.40452],[20.446,4.8339,-0.54559],[20.135,4.8339,-0.012604],[20.135,4.4834,-0.012604],[20.135,4.1329,-0.012604],[20.135,3.7824,-0.012604],[19.824,3.4319,-0.024191],[18.582,3.4319,-0.024191],[14.545,3.7824,-0.001017],[6.7801,4.1329,0.010569],[2.1214,3.4319,0.010569],[3.6743,2.7309,-0.012604],[8.0224,0.97834,-0.035777],[14.855,-1.4752,-0.012604],[26.968,0.62783,-0.012604],[26.657,3.0814,-0.012604],[22.93,3.4319,-0.012604],[20.135,3.4319,-0.012604],[17.34,4.1329,-0.001017],[15.166,3.0814,-0.001017],[16.097,3.4319,-0.001017],[16.408,6.5864,-0.001017],[17.961,3.0814,0.010569],[16.097,3.4319,0.022156],[14.855,7.2874,-0.001017],[14.234,3.7824,-0.035777],[14.855,3.0814,-0.035777],[12.371,-0.073181,-0.012604],[12.06,-4.9803,0.010569],[11.439,-6.3823,-0.012604],[12.992,-5.3308,-0.012604],[14.855,-1.8257,0.010569],[16.097,-2.5267,0.010569],[16.408,-7.4338,0.022156],[17.029,-13.042,0.033743],[16.719,-17.248,0.033743],[16.719,-16.547,0.022156],[18.272,-10.588,-0.012604],[21.377,-4.6298,-0.024191],[25.104,-2.5267,-0.035777],[28.21,-4.6298,-0.024191],[30.074,-6.3823,0.38134],[25.104,6.5864,-0.52242],[24.794,6.2359,-0.012604],[24.794,5.1844,-0.012604],[24.794,4.4834,-0.012604],[24.794,3.7824,-0.012604],[24.794,3.4319,-0.012604],[23.862,3.4319,-0.012604],[20.135,4.1329,-0.001017],[12.06,4.4834,0.010569],[7.0907,4.1329,-0.001017],[8.9541,3.4319,-0.012604],[12.992,1.3288,-0.024191],[20.135,-0.77419,-0.012604],[32.248,0.97834,-0.012604],[32.248,3.4319,-0.012604],[28.521,3.7824,-0.012604],[25.104,4.1329,-0.012604],[22.309,4.8339,-0.001017],[20.135,4.1329,-0.001017],[20.446,4.1329,-0.001017],[20.135,7.2874,-0.001017],[21.377,3.0814,0.010569],[20.135,3.4319,0.022156],[18.893,7.6379,0.010569],[18.272,5.1844,-0.024191],[18.582,4.8339,-0.024191],[15.166,0.97834,-0.012604],[14.545,-3.9287,-0.001017],[14.545,-5.3308,-0.012604],[16.408,-4.2792,-0.012604],[18.893,-0.42369,0.010569],[20.446,-1.4752,0.010569],[21.067,-6.7328,0.022156],[21.998,-12.341,0.022156],[21.998,-16.897,0.033743],[21.377,-16.196,0.010569],[22.93,-8.8358,-0.012604],[26.347,-1.8257,-0.024191],[30.074,-0.42369,-0.035777],[32.248,-2.1762,-0.024191],[33.179,-4.6298,0.32341],[27.899,7.2874,-0.47607],[27.899,6.5864,-0.012604],[28.21,5.1844,-0.012604],[28.21,4.4834,-0.012604],[28.521,3.7824,-0.012604],[28.831,3.4319,-0.012604],[28.21,3.4319,-0.012604],[24.483,4.1329,-0.001017],[17.029,4.8339,0.010569],[12.06,4.4834,-0.001017],[13.923,4.1329,-0.012604],[17.34,2.0299,-0.024191],[24.483,-0.073181,-0.012604],[36.596,1.3288,-0.012604],[36.906,3.4319,-0.012604],[33.179,3.7824,-0.001017],[30.384,4.1329,-0.001017],[26.968,4.8339,-0.001017],[24.173,4.4834,-0.001017],[23.862,4.4834,-0.001017],[22.93,6.9369,-0.001017],[24.483,3.0814,-0.001017],[22.93,2.7309,0.010569],[21.998,7.6379,0.010569],[20.756,6.5864,-0.024191],[20.756,6.2359,-0.024191],[17.34,2.3804,-0.012604],[16.408,-2.5267,-0.001017],[16.097,-4.2793,-0.012604],[18.272,-2.5267,-0.012604],[21.067,0.97834,-0.001017],[22.62,-0.42369,0.010569],[22.93,-6.3823,0.010569],[23.862,-11.64,0.022156],[23.241,-17.248,0.022156],[22.62,-16.547,0.010569],[23.862,-7.7843,-0.012604],[27.278,0.62783,-0.024191],[30.695,2.3804,-0.024191],[32.869,-0.42369,-0.024191],[34.732,-2.8772,0.25389],[28.831,7.6379,-0.41814],[29.142,6.9369,-0.012604],[29.763,5.1844,-0.012604],[30.384,4.1329,-0.001017],[31.005,3.4319,-0.001017],[31.937,3.0814,-0.012604],[31.316,3.0814,-0.012604],[28.21,4.1329,-0.001017],[21.377,4.8339,-0.001017],[16.719,4.4834,-0.001017],[17.961,4.4834,-0.012604],[21.067,2.3804,-0.012604],[27.899,0.27732,-0.012604],[39.08,0.97834,-0.012604],[40.944,3.0814,-0.012604],[37.838,3.7824,-0.001017],[34.111,3.7824,-0.001017],[30.695,4.1329,-0.001017],[26.968,3.7824,-0.001017],[26.347,3.7824,-0.001017],[24.794,5.5349,-0.001017],[26.036,1.6793,-0.001017],[24.483,2.0299,0.010569],[23.241,7.2874,0.010569],[22.309,7.2874,-0.012604],[22.62,7.2874,-0.012604],[18.582,3.4319,-0.012604],[17.029,-1.8257,-0.001017],[16.719,-2.5267,-0.001017],[18.893,-1.4752,-0.012604],[21.377,2.3804,-0.001017],[22.93,0.27732,-0.001017],[22.93,-6.7328,0.010569],[22.93,-12.691,0.010569],[21.998,-18.299,0.010569],[20.135,-17.598,0.010569],[20.756,-7.7843,-0.012604],[24.483,2.0299,-0.012604],[28.521,4.1329,-0.012604],[31.937,0.97834,-0.012604],[33.8,-1.8257,0.17278],[26.036,7.2874,-0.38338],[26.347,6.5864,-0.001017],[26.657,4.8339,-0.001017],[27.899,3.7824,-0.001017],[28.521,3.0814,-0.001017],[29.142,2.7309,-0.001017],[28.831,2.7309,-0.001017],[26.657,3.4319,-0.001017],[21.377,3.7824,-0.001017],[18.272,3.7824,-0.001017],[18.893,3.7824,-0.001017],[21.377,2.7309,-0.001017],[26.347,1.6793,-0.001017],[34.111,2.0299,-0.012604],[35.664,3.0814,-0.001017],[32.869,3.4319,-0.001017],[30.695,2.3804,-0.001017],[27.899,1.3288,-0.001017],[24.794,0.27732,-0.001017],[24.173,-0.073181,-0.001017],[23.241,0.97834,-0.001017],[24.483,-0.77419,-0.012604],[22.93,0.62783,0.010569],[22.309,6.2359,0.010569],[20.756,7.2874,-0.012604],[20.756,8.6895,-0.012604],[15.476,5.1844,-0.001017],[13.923,-1.1247,-0.001017],[12.992,-1.8257,-0.001017],[15.476,-0.77419,-0.001017],[17.961,2.3804,-0.001017],[19.824,-0.77419,-0.001017],[19.824,-7.7843,-0.001017],[19.824,-14.093,-0.001017],[18.272,-20.052,-0.001017],[14.855,-18.65,-0.001017],[14.855,-7.0833,-0.012604],[18.272,4.4834,-0.012604],[22.93,7.9885,-0.012604],[26.968,4.1329,-0.012604],[29.763,0.27732,0.12644],[21.377,6.5864,-0.3602],[21.998,5.5349,-0.001017],[22.309,4.8339,-0.001017],[22.93,3.7824,-0.001017],[23.862,3.4319,-0.001017],[24.483,2.7309,-0.001017],[24.483,2.3804,-0.001017],[23.241,2.3804,-0.001017],[20.446,2.0299,-0.012604],[18.582,2.3804,-0.012604],[18.893,2.7309,-0.001017],[20.446,2.7309,-0.001017],[22.93,3.0814,-0.001017],[26.657,2.7309,-0.001017],[26.968,3.0814,-0.001017],[26.036,3.0814,-0.001017],[24.483,0.62783,-0.001017],[22.62,-1.8257,-0.001017],[20.446,-3.9287,-0.012604],[20.446,-4.9803,-0.012604],[20.446,-4.6298,-0.012604],[21.998,-3.9287,-0.012604],[20.446,-0.77419,-0.001017],[20.135,4.4834,0.010569],[18.272,7.2874,-0.001017],[18.582,10.442,-0.001017],[11.439,7.2874,-0.001017],[8.9541,-0.073181,-0.001017],[7.4013,-1.4752,-0.001017],[10.507,-0.073181,-0.001017],[12.681,2.0299,-0.012604],[14.855,-1.8257,-0.012604],[16.097,-9.5368,-0.012604],[16.097,-15.846,-0.012604],[13.302,-21.805,-0.012604],[8.6436,-19.351,-0.012604],[7.4013,-6.0318,-0.001017],[11.128,7.9885,-0.001017],[16.408,11.844,-0.001017],[20.756,7.9885,-0.001017],[23.862,3.4319,0.091676],[0.87909,0.97833,-0.001017],[0.87909,1.3288,-0.001017],[0.87909,1.6793,-0.001017],[0.87909,1.6793,-0.001017],[0.56851,1.6793,-0.001017],[0.56851,1.6793,-0.001017],[0.25794,1.3288,-0.001017],[-0.36322,0.27732,-0.001017],[-0.36322,-0.073182,-0.001017],[0.56851,-0.073182,-0.001017],[1.1897,0.62783,-0.001017],[0.25794,1.3288,-0.001017],[-0.36322,0.62783,-0.001017],[0.25794,0.27732,-0.001017],[-0.36322,0.97833,-0.001017],[-0.36322,0.27732,-0.001017],[-1.295,-1.4752,-0.001017],[-0.98438,-1.8257,-0.001017],[-0.6738,-1.8257,-0.001017],[0.87909,-0.42369,-0.001017],[2.1214,-0.77419,-0.001017],[0.56851,1.6793,-0.001017],[-2.5373,2.3804,-0.001017],[-2.5373,1.3288,-0.001017],[-2.2267,-1.1247,-0.001017],[-0.6738,-2.1762,-0.001017],[0.87909,-2.5267,-0.001017],[1.5003,-2.1762,-0.001017],[0.87909,-3.2277,-0.001017],[-0.36322,-3.2277,-0.001017],[-0.36322,-1.8257,-0.001017],[0.56851,-1.8257,-0.001017],[0.25794,-1.8257,-0.001017],[-0.36322,-1.8257,-0.001017],[-0.98438,-1.4752,-0.001017],[-2.8479,-1.4752,-0.001017],[-3.1584,0.27732,-0.001017],[-2.2267,0.97833,-0.001017],[-1.295,2.0299,-0.001017],[-0.6738,1.6793,-0.001017],[-0.6738,1.6793,-0.001017],[-2.2267,0.62783,-0.058951],[-1.6055,0.62783,-0.001017],[-1.6055,0.97834,-0.001017],[-1.6055,0.97834,-0.001017],[-1.6055,0.97834,-0.001017],[-2.2267,0.97834,0.010569],[-2.8479,0.97834,0.010569],[-3.469,0.27732,-0.001017],[-4.4008,0.27732,-0.001017],[-4.4008,-0.77419,-0.024191],[-1.6055,-1.1247,-0.012604],[-2.2267,-0.77419,-0.001017],[-0.98438,-2.5267,-0.035777],[2.1214,-2.1762,-0.024191],[3.6743,-1.4752,-0.012604],[2.432,-1.8257,-0.001017],[0.87909,-3.2277,-0.001017],[0.87909,-2.5267,-0.001017],[0.56851,-1.8257,-0.012604],[0.87909,-0.42369,-0.001017],[2.1214,-0.77419,-0.001017],[0.56851,1.6793,-0.001017],[-2.5373,2.3804,-0.001017],[-2.5373,4.1329,-0.001017],[-2.2267,3.7824,-0.024191],[-2.5373,1.6793,-0.024191],[-2.2267,0.27732,-0.024191],[-1.6055,-1.1247,-0.012604],[-2.5373,-1.8257,-0.001017],[-2.8479,-2.5267,-0.001017],[-2.8479,-2.5267,-0.012604],[-2.8479,-3.2277,-0.001017],[-3.1584,-3.2277,0.010569],[-4.4008,-3.9287,0.010569],[-4.7113,-3.9287,0.010569],[-5.3325,-3.2277,0.010569],[-5.0219,-0.77419,-0.001017],[-3.469,0.97834,-0.001017],[-2.2267,1.6793,-0.012604],[-0.98438,0.97834,-0.001017],[-0.6738,0.62783,0.091676],[-3.1584,-0.42369,-0.14006],[-2.8479,-0.073181,-0.012604],[-2.5373,0.27732,-0.012604],[-2.5373,0.27732,-0.001017],[-2.2267,0.27732,0.010569],[-2.2267,0.62783,0.010569],[-3.1584,1.3288,0.010569],[-5.3325,2.0299,0.010569],[-8.1277,2.3804,-0.001017],[-9.0594,-1.4752,-0.047364],[-4.4008,-4.9803,-0.012604],[-2.2267,-6.0318,-0.001017],[0.56851,-10.588,-0.058951],[8.0224,-6.7328,-0.047364],[10.196,-0.42369,-0.012604],[7.0907,-3.2277,0.010569],[4.9166,-4.9803,0.010569],[4.606,-4.2793,-0.012604],[3.3637,-2.5267,-0.012604],[2.432,-1.4752,-0.012604],[2.1214,-0.77419,-0.012604],[0.56851,2.0299,-0.001017],[0.56851,6.2359,0.010569],[0.25793,7.9885,-0.012604],[-1.6055,6.2359,-0.024191],[-3.469,2.7309,-0.024191],[-4.7113,-0.073181,-0.035777],[-5.0219,-1.8257,-0.012604],[-5.3325,-3.9287,0.010569],[-5.6431,-4.9803,0.010569],[-5.3325,-4.9803,-0.012604],[-3.469,-5.3308,-0.001017],[-3.469,-6.0318,0.022156],[-4.4008,-7.7843,0.022156],[-4.4008,-8.4853,0.022156],[-4.7113,-7.7843,0.022156],[-3.7796,-3.9287,0.010569],[-1.6055,-1.1247,-0.001017],[0.56851,-0.42369,-0.012604],[2.1214,-1.8257,-0.001017],[2.7426,-1.8257,0.19596],[-0.6738,-0.42369,-0.22116],[0.25794,-0.073181,-0.012604],[0.56851,0.27732,-0.012604],[0.87909,0.62783,-0.001017],[1.5003,0.62783,0.010569],[2.1214,0.97834,0.022156],[0.25794,2.0299,0.022156],[-2.5373,4.1329,0.010569],[-6.5748,5.1844,-0.001017],[-8.4383,-0.073181,-0.058951],[-2.5373,-4.6298,-0.024191],[0.56851,-5.6813,-0.001017],[3.3637,-10.588,-0.082124],[12.992,-5.6813,-0.058951],[14.545,1.6793,-0.012604],[10.196,-0.77419,0.010569],[7.0907,-1.8257,0.010569],[5.5378,-1.4752,-0.012604],[3.6743,-1.1247,-0.012604],[2.432,-0.42369,-0.012604],[1.5003,-0.073181,-0.012604],[0.56851,1.6793,-0.001017],[-0.36322,6.2359,0.010569],[0.25794,7.6379,-0.024191],[-1.6055,4.4834,-0.024191],[-3.7796,2.0299,-0.024191],[-5.0219,-0.77419,-0.035777],[-5.0219,-3.5782,-0.012604],[-5.0219,-5.6813,0.022156],[-5.0219,-6.7328,0.010569],[-4.4008,-6.3823,-0.012604],[-2.5373,-7.0833,-0.001017],[-1.6055,-8.8358,0.022156],[-0.98438,-10.588,0.022156],[-0.98438,-11.289,0.033743],[-0.98438,-10.588,0.033743],[-0.36322,-6.7328,0.010569],[1.5003,-3.5782,-0.001017],[3.6743,-2.5267,-0.012604],[5.5378,-3.5782,-0.012604],[6.7801,-3.9287,0.27706],[1.5003,-0.77419,-0.30227],[2.1214,-0.42369,-0.012604],[2.7426,0.27732,-0.012604],[3.3637,0.62783,-0.001017],[4.2955,0.97834,0.010569],[4.606,1.3288,0.022156],[2.432,2.7309,0.022156],[-0.98438,6.2359,0.010569],[-6.2642,7.6379,-0.001017],[-8.7489,0.62783,-0.058951],[-1.6055,-4.6298,-0.024191],[2.1214,-6.0318,-0.001017],[5.5378,-11.289,-0.082124],[16.719,-4.9803,-0.058951],[17.961,3.7824,-0.012604],[12.681,1.6793,-0.001017],[8.6436,0.62783,-0.001017],[6.7801,0.97834,-0.001017],[4.9166,0.27732,-0.001017],[2.7426,-0.073181,-0.001017],[1.5003,0.27732,-0.012604],[0.87909,1.3288,0.010569],[0.25793,5.5349,0.010569],[0.87909,7.2874,-0.024191],[-1.295,3.4319,-0.024191],[-3.469,1.6793,-0.024191],[-4.7113,-0.77419,-0.047364],[-4.7113,-3.9287,-0.012604],[-4.4008,-6.0318,0.022156],[-3.7796,-6.7328,0.010569],[-2.8479,-6.7328,-0.012604],[-0.6738,-7.7843,0.010569],[0.87909,-9.8873,0.033743],[2.7426,-12.691,0.033743],[3.0531,-14.444,0.033743],[3.6743,-14.093,0.033743],[4.606,-10.238,0.010569],[5.5378,-6.7328,-0.012604],[7.4013,-5.3308,-0.024191],[8.9541,-6.0318,-0.012604],[9.5753,-6.0318,0.34658],[4.2955,-0.073181,-0.37179],[4.606,0.62783,-0.012604],[5.2272,0.97834,-0.012604],[6.1589,1.3288,-0.001017],[6.7801,1.3288,0.010569],[7.0907,1.6793,0.022156],[4.2955,3.4319,0.022156],[0.25794,7.9885,0.010569],[-5.3325,9.04,-0.001017],[-8.4383,1.3288,-0.058951],[-1.295,-4.6298,-0.024191],[3.0531,-6.3823,-0.012604],[7.4013,-12.341,-0.082124],[19.824,-4.9803,-0.058951],[20.446,5.1844,-0.024191],[14.545,3.4319,-0.001017],[10.196,2.7309,-0.001017],[8.0224,2.7309,-0.001017],[5.5378,0.97834,-0.001017],[3.6743,-0.073181,-0.001017],[2.7426,0.62783,-0.001017],[2.7426,0.97834,0.010569],[1.1897,5.1844,0.010569],[3.0531,6.2359,-0.024191],[0.56851,2.3804,-0.012604],[-1.295,1.3288,-0.024191],[-2.5373,-0.77419,-0.047364],[-2.8479,-4.2793,-0.012604],[-2.2267,-5.6813,0.033743],[-1.6055,-6.3823,0.022156],[-0.6738,-6.0318,-0.012604],[1.5003,-6.7328,0.010569],[3.3637,-8.4853,0.033743],[5.2272,-11.289,0.033743],[6.1589,-14.794,0.033743],[6.7801,-15.145,0.033743],[8.0224,-12.341,0.010569],[9.2647,-8.8358,-0.012604],[11.128,-7.4338,-0.024191],[12.681,-7.4338,-0.012604],[13.302,-7.0833,0.40452],[7.4013,0.97834,-0.42972],[8.0224,1.3288,-0.012604],[8.333,1.6793,-0.012604],[8.9541,2.0299,-0.001017],[10.196,2.0299,0.010569],[10.196,2.3804,0.022156],[6.7801,4.1329,0.022156],[2.1214,9.3905,0.010569],[-3.7796,10.793,-0.001017],[-7.5065,2.3804,-0.058951],[-0.36322,-4.2793,-0.024191],[4.2955,-6.3823,-0.012604],[8.9541,-13.042,-0.082124],[22.62,-5.6813,-0.058951],[23.241,6.2359,-0.024191],[17.029,4.8339,-0.001017],[12.681,3.7824,-0.001017],[10.196,4.1329,-0.001017],[8.0224,1.6793,-0.001017],[6.1589,0.97834,-0.001017],[5.2272,1.6793,-0.001017],[6.4695,2.0299,0.010569],[4.606,5.5349,0.010569],[6.1589,6.2359,-0.024191],[3.6743,2.3804,-0.012604],[2.1214,1.6793,-0.024191],[0.56851,-0.77419,-0.035777],[0.56851,-4.2793,-0.012604],[0.87909,-5.3308,0.033743],[1.1897,-5.6813,0.022156],[2.432,-5.3308,-0.012604],[4.9166,-5.6813,0.010569],[6.7801,-7.0833,0.033743],[8.333,-9.8873,0.033743],[9.2647,-13.743,0.033743],[10.196,-14.093,0.033743],[11.128,-11.289,0.010569],[13.302,-8.1348,-0.012604],[16.097,-6.7328,-0.024191],[17.961,-7.0833,-0.012604],[18.893,-7.0833,0.43928],[11.439,2.0299,-0.47607],[12.06,2.7309,-0.012604],[12.06,2.7309,-0.012604],[12.681,2.7309,-0.001017],[13.302,2.7309,0.010569],[13.302,3.0814,0.022156],[9.2647,5.1844,0.022156],[4.2955,10.793,0.010569],[-2.2267,12.195,-0.001017],[-6.2642,3.4319,-0.047364],[1.1897,-3.9287,-0.024191],[5.5378,-6.3823,-0.012604],[11.128,-13.743,-0.082124],[25.725,-6.3823,-0.047364],[26.657,6.5864,-0.012604],[20.135,5.5349,-0.001017],[15.476,4.8339,-0.001017],[12.992,5.1844,-0.001017],[11.128,2.7309,-0.001017],[9.2647,1.6793,0.010569],[9.2647,3.0814,-0.001017],[10.507,3.0814,0.010569],[8.6436,6.9369,0.022156],[10.507,6.9369,-0.012604],[8.333,3.0814,-0.012604],[6.1589,2.3804,-0.012604],[4.606,-0.42369,-0.035777],[4.2955,-4.6298,-0.012604],[4.606,-5.6813,0.022156],[4.2955,-5.6813,0.010569],[5.5378,-4.9803,-0.012604],[8.333,-4.9803,0.010569],[10.196,-6.3823,0.033743],[11.128,-9.5368,0.033743],[12.06,-13.392,0.033743],[12.681,-13.743,0.033743],[14.234,-10.588,0.010569],[16.719,-7.4338,-0.012604],[20.135,-6.0318,-0.024191],[22.93,-6.7328,-0.012604],[24.483,-7.0833,0.45086],[16.097,3.4319,-0.49924],[16.097,3.7824,-0.012604],[16.408,3.7824,-0.012604],[16.719,3.4319,-0.001017],[17.34,3.0814,0.010569],[17.029,3.4319,0.022156],[12.681,6.2359,0.022156],[7.0907,11.844,0.010569],[0.25794,13.597,-0.001017],[-3.469,4.1329,-0.035777],[3.0531,-2.8772,-0.024191],[7.4013,-6.3823,-0.012604],[13.302,-14.444,-0.070537],[29.142,-7.0833,-0.047364],[30.384,6.5864,-0.012604],[23.862,6.5864,-0.001017],[18.893,5.5349,-0.001017],[16.408,6.2359,-0.001017],[14.545,3.4319,-0.001017],[13.302,2.3804,0.010569],[13.923,4.1329,-0.001017],[15.166,4.1329,0.010569],[13.302,7.6379,0.022156],[14.855,7.6379,-0.012604],[12.992,3.7824,-0.012604],[11.128,3.4319,-0.012604],[8.9541,-0.073181,-0.035777],[8.333,-4.9803,-0.012604],[8.333,-6.0318,0.022156],[8.0224,-6.0318,0.010569],[8.9541,-4.9803,-0.024191],[11.439,-4.9803,-0.001017],[12.992,-6.7328,0.022156],[14.234,-9.8873,0.022156],[14.545,-14.093,0.022156],[14.855,-14.444,0.022156],[16.408,-10.939,0.010569],[19.203,-7.4338,-0.012604],[23.241,-6.3823,-0.024191],[26.657,-6.7328,-0.024191],[28.831,-7.4338,0.43928],[20.756,4.8339,-0.49924],[20.756,4.8339,-0.012604],[20.756,4.4834,-0.012604],[21.067,3.7824,-0.001017],[21.998,3.4319,0.010569],[21.377,3.7824,0.010569],[16.719,6.5864,0.010569],[10.818,12.545,0.010569],[3.6743,14.298,-0.001017],[-0.6738,4.8339,-0.035777],[6.4695,-2.5267,-0.024191],[10.507,-6.3823,-0.012604],[16.719,-14.794,-0.058951],[33.179,-7.7843,-0.035777],[34.422,6.5864,-0.012604],[27.899,6.9369,-0.012604],[22.93,6.2359,-0.001017],[20.446,6.5864,-0.001017],[18.582,3.7824,-0.001017],[17.961,3.0814,-0.001017],[17.961,4.4834,0.010569],[19.824,3.7824,0.010569],[17.029,6.5864,0.022156],[18.582,7.2874,-0.012604],[17.029,4.4834,-0.012604],[15.166,3.7824,-0.012604],[13.302,0.27732,-0.035777],[12.681,-4.6298,-0.024191],[12.681,-5.6813,0.022156],[12.371,-5.6813,0.010569],[13.923,-4.6298,-0.024191],[16.719,-4.9803,-0.001017],[18.272,-7.4338,0.022156],[18.893,-11.289,0.022156],[19.203,-15.495,0.022156],[19.203,-15.846,0.010569],[20.756,-12.341,-0.001017],[23.862,-7.7843,-0.024191],[28.21,-6.0318,-0.024191],[31.316,-6.7328,-0.024191],[33.179,-7.4338,0.39293],[25.104,6.2359,-0.46448],[25.104,5.5349,-0.012604],[25.725,4.8339,-0.012604],[26.036,4.1329,-0.001017],[26.657,3.4319,-0.001017],[26.657,3.7824,0.010569],[21.377,6.5864,0.010569],[15.476,12.896,0.010569],[8.6436,15.349,-0.001017],[4.606,6.2359,-0.024191],[10.818,-1.8257,-0.012604],[15.166,-6.0318,-0.012604],[21.377,-14.794,-0.047364],[39.08,-7.7843,-0.024191],[40.323,6.9369,-0.012604],[32.869,7.6379,-0.012604],[28.21,6.5864,-0.001017],[25.725,7.2874,-0.001017],[23.862,5.1844,-0.001017],[22.62,4.4834,-0.001017],[22.93,5.1844,0.010569],[24.173,4.1329,0.010569],[21.067,6.5864,0.022156],[22.309,7.9885,-0.001017],[20.756,6.2359,-0.001017],[18.893,5.5349,-0.012604],[16.408,1.6793,-0.035777],[15.476,-3.5782,-0.024191],[15.476,-4.9803,0.010569],[15.476,-4.9803,0.010569],[17.34,-3.5782,-0.024191],[20.756,-3.5782,-0.001017],[22.62,-6.3823,0.010569],[24.173,-10.939,0.010569],[24.173,-15.145,0.010569],[24.173,-15.495,0.010569],[24.794,-10.588,-0.001017],[28.21,-5.6813,-0.024191],[32.248,-3.9287,-0.024191],[35.043,-4.9803,-0.024191],[36.906,-6.3823,0.32341],[27.899,6.9369,-0.41814],[28.21,6.2359,-0.012604],[28.521,4.8339,-0.012604],[29.142,3.7824,-0.001017],[30.384,3.0814,-0.001017],[30.384,3.4319,0.010569],[26.036,6.2359,0.010569],[20.446,12.896,-0.001017],[13.923,15.349,-0.001017],[9.5753,6.5864,-0.012604],[15.166,-1.1247,-0.012604],[19.203,-5.3308,-0.012604],[26.036,-14.093,-0.035777],[43.118,-8.1348,-0.012604],[44.671,6.2359,-0.012604],[38.459,7.9885,-0.012604],[33.179,6.9369,-0.001017],[30.695,7.6379,-0.001017],[28.521,6.2359,-0.001017],[27.278,5.1844,-0.001017],[26.968,6.2359,0.010569],[27.278,4.4834,0.010569],[24.173,6.2359,0.022156],[24.794,8.339,-0.001017],[23.241,7.2874,-0.001017],[21.067,7.2874,-0.012604],[17.961,3.0814,-0.024191],[17.029,-2.1762,-0.024191],[17.029,-3.5782,0.010569],[17.029,-3.5782,-0.001017],[18.893,-2.1762,-0.012604],[22.93,-2.1762,-0.001017],[24.794,-5.6813,0.010569],[26.036,-10.588,0.010569],[26.036,-15.495,0.010569],[25.104,-15.145,0.010569],[25.725,-9.5368,-0.012604],[28.831,-3.5782,-0.024191],[32.558,-1.8257,-0.024191],[35.664,-2.8772,-0.024191],[37.838,-5.3308,0.2423],[28.521,6.9369,-0.3602],[29.142,6.2359,-0.012604],[30.074,4.1329,-0.001017],[31.005,3.0814,-0.001017],[32.248,2.3804,-0.001017],[32.869,2.7309,-0.001017],[29.763,5.1844,-0.001017],[24.794,11.844,-0.001017],[18.893,14.298,-0.001017],[14.855,7.2874,-0.012604],[19.824,-0.073181,-0.012604],[22.93,-4.6298,-0.012604],[29.763,-12.691,-0.024191],[45.602,-8.4853,-0.012604],[47.777,4.4834,-0.012604],[43.118,7.6379,-0.012604],[38.77,6.9369,-0.012604],[35.664,7.6379,-0.001017],[32.869,6.5864,-0.001017],[31.005,5.5349,-0.001017],[30.384,5.5349,0.010569],[30.074,4.1329,0.010569],[26.036,5.5349,0.022156],[26.036,7.9885,-0.001017],[24.483,7.9885,-0.001017],[21.998,8.6895,-0.001017],[18.582,4.1329,-0.024191],[17.961,-1.4752,-0.012604],[17.34,-2.1762,0.010569],[17.34,-1.8257,-0.001017],[19.203,-1.1247,-0.012604],[22.93,-1.4752,-0.001017],[24.483,-5.3308,0.010569],[25.104,-11.289,-0.001017],[24.794,-16.196,-0.001017],[23.241,-15.846,-0.001017],[22.93,-9.1863,-0.012604],[25.725,-1.8257,-0.012604],[30.074,-0.073181,-0.012604],[33.179,-1.8257,-0.012604],[35.975,-4.2793,0.1612],[25.104,6.5864,-0.32544],[26.036,5.5349,-0.001017],[26.657,4.1329,-0.001017],[27.899,3.0814,-0.001017],[29.763,2.3804,-0.001017],[30.384,2.3804,-0.001017],[28.21,4.1329,-0.001017],[25.104,9.04,-0.001017],[21.067,10.792,-0.001017],[18.272,5.1844,-0.001017],[21.067,0.27732,-0.001017],[23.862,-2.1762,-0.012604],[28.21,-7.4338,-0.012604],[38.77,-4.6298,-0.001017],[39.701,3.7824,-0.001017],[37.217,5.5349,-0.012604],[34.732,4.1329,-0.001017],[32.248,3.7824,-0.001017],[30.074,2.3804,-0.001017],[27.899,1.3288,-0.012604],[26.657,1.3288,-0.001017],[26.657,0.97834,-0.001017],[23.241,3.4319,0.010569],[23.241,7.2874,0.010569],[21.377,8.6895,-0.001017],[18.582,10.442,-0.001017],[14.234,6.9369,-0.012604],[13.302,-0.073181,-0.012604],[13.302,-1.4752,-0.001017],[13.923,-1.4752,-0.001017],[16.097,-1.1247,-0.012604],[20.135,-1.8257,-0.001017],[21.377,-6.7328,-0.001017],[22.309,-12.691,-0.001017],[21.067,-17.248,-0.001017],[18.582,-15.495,-0.001017],[17.029,-7.7843,-0.012604],[19.824,0.27732,-0.012604],[24.483,2.7309,-0.012604],[28.831,0.62783,-0.012604],[31.937,-1.8257,0.11485],[20.135,6.2359,-0.29068],[20.756,4.8339,-0.001017],[21.998,3.7824,-0.001017],[22.93,3.0814,-0.001017],[24.483,2.3804,-0.001017],[26.036,2.3804,-0.012604],[25.104,2.7309,-0.012604],[24.173,4.8339,-0.001017],[22.309,6.2359,-0.001017],[20.446,3.4319,-0.001017],[21.998,0.62783,-0.001017],[23.241,-0.073181,-0.001017],[25.725,-1.4752,-0.001017],[29.763,0.27732,-0.001017],[28.21,3.7824,-0.001017],[27.899,3.7824,-0.001017],[27.899,1.3288,-0.001017],[26.347,-0.42369,-0.001017],[24.173,-2.1762,-0.012604],[21.998,-4.2793,-0.012604],[21.067,-4.2793,-0.001017],[21.067,-2.5267,-0.001017],[18.893,1.3288,0.010569],[19.203,5.5349,0.010569],[17.34,8.6895,-0.001017],[13.923,12.545,-0.001017],[8.0224,9.3905,-0.001017],[7.4013,1.6793,-0.001017],[8.0224,-0.073181,-0.012604],[8.333,-0.77419,-0.012604],[11.439,-1.1247,-0.001017],[16.097,-2.8772,-0.012604],[17.34,-8.1348,-0.012604],[18.272,-14.093,-0.012604],[16.719,-17.949,-0.012604],[12.992,-15.145,-0.012604],[10.507,-5.6813,-0.012604],[12.681,2.7309,-0.001017],[18.272,6.5864,-0.001017],[22.93,4.1329,-0.012604],[26.347,0.97834,0.080089],[1.1897,0.97833,-0.001017],[1.1897,1.3288,-0.001017],[0.87909,1.6793,-0.001017],[0.56851,0.62783,-0.001017],[0.25794,0.27732,-0.001017],[0.25794,-0.073182,-0.001017],[-0.36322,0.27732,-0.001017],[-0.36322,0.97833,-0.001017],[1.1897,1.3288,-0.001017],[1.1897,2.7309,-0.001017],[1.1897,1.6793,-0.001017],[0.56851,0.97833,-0.001017],[0.25794,3.7824,-0.001017],[0.25794,1.3288,-0.001017],[-1.6055,0.27732,-0.001017],[-1.295,-1.4752,-0.001017],[-1.6055,-2.5267,-0.001017],[-1.295,-2.1762,-0.001017],[-0.6738,-1.8257,-0.001017],[2.7426,-1.1247,-0.001017],[3.0531,0.27732,-0.001017],[0.25794,2.0299,-0.001017],[-3.469,3.0814,-0.001017],[-2.2267,0.97833,-0.001017],[-2.8479,0.27732,-0.001017],[0.25794,-1.1247,-0.001017],[2.7426,-1.1247,-0.001017],[2.7426,-2.1762,-0.001017],[2.1214,-3.2277,-0.001017],[1.5003,-3.2277,-0.001017],[0.25794,-2.5267,-0.001017],[0.25794,-1.8257,-0.001017],[0.56851,-2.1762,-0.001017],[0.56851,-3.5782,-0.001017],[-0.98438,-3.2277,-0.001017],[-0.98438,-1.1247,-0.001017],[-2.2267,-0.073182,-0.001017],[-1.295,0.97833,-0.001017],[-0.98438,1.6793,-0.001017],[-0.6738,1.3288,-0.001017],[-0.98438,1.3288,-0.001017],[-1.295,0.62783,-0.058951],[-0.98438,0.97834,-0.001017],[-0.6738,1.3288,-0.001017],[-0.98438,0.27732,0.010569],[-0.98438,0.27732,-0.001017],[-0.6738,0.27732,-0.001017],[-0.98438,0.62783,-0.001017],[-1.6055,1.6793,-0.024191],[-0.98438,1.6793,-0.024191],[-0.36322,0.97834,-0.012604],[-0.36322,-1.1247,-0.012604],[0.87909,-1.4752,-0.001017],[0.56851,-0.77419,-0.012604],[1.1897,-1.8257,-0.001017],[2.432,-1.4752,0.010569],[1.1897,-1.8257,-0.001017],[0.87909,-3.5782,-0.001017],[0.87909,-3.2277,-0.012604],[0.56851,-2.1762,-0.012604],[2.7426,-1.1247,-0.001017],[3.0531,0.27732,-0.001017],[0.25794,2.0299,-0.001017],[-2.8479,4.4834,-0.001017],[-1.295,6.2359,-0.024191],[-1.6055,4.4834,-0.024191],[-1.6055,2.7309,-0.024191],[-1.295,0.97834,-0.012604],[-1.295,-0.77419,-0.012604],[-1.6055,-1.8257,-0.012604],[-1.295,-3.5782,0.010569],[-2.8479,-2.5267,0.010569],[-3.469,-3.2277,-0.001017],[-3.469,-2.5267,-0.001017],[-3.469,-3.2277,-0.001017],[-3.7796,-3.2277,0.010569],[-5.0219,-2.5267,0.010569],[-4.7113,-0.77419,-0.001017],[-3.469,0.27732,-0.001017],[-2.5373,0.97834,-0.001017],[-1.295,0.27732,-0.001017],[-0.98438,-0.073181,0.10326],[-2.2267,-0.42369,-0.12847],[-1.6055,-0.42369,-0.001017],[-0.98438,-0.073181,0.010569],[-0.6738,-0.42369,0.010569],[0.56851,-0.77419,-0.012604],[1.1897,0.27732,-0.012604],[0.56851,2.3804,-0.012604],[-0.6738,4.1329,-0.035777],[-0.98438,4.1329,-0.035777],[-0.98438,-2.1762,-0.012604],[-0.6738,-7.4338,-0.024191],[4.2955,-6.7328,-0.001017],[3.3637,-11.289,-0.012604],[5.5378,-11.289,-0.001017],[8.0224,-0.42369,0.022156],[5.5378,0.62783,-0.001017],[4.606,-3.9287,-0.012604],[4.606,-4.2793,-0.012604],[4.606,-2.1762,-0.024191],[4.2955,-0.77419,-0.012604],[3.0531,0.27732,-0.001017],[0.56851,2.3804,-0.001017],[0.87909,6.2359,-0.012604],[2.432,9.04,-0.024191],[0.56851,7.9885,-0.024191],[-1.295,4.1329,-0.035777],[-2.8479,0.62783,-0.024191],[-3.1584,-1.8257,-0.012604],[-2.5373,-4.2793,-0.012604],[-2.5373,-5.6813,0.010569],[-3.7796,-4.9803,0.022156],[-3.7796,-5.6813,-0.001017],[-3.7796,-6.3823,-0.001017],[-3.7796,-7.7843,-0.001017],[-4.4008,-8.4853,0.010569],[-4.7113,-8.1348,0.010569],[-3.7796,-5.3308,-0.001017],[-2.2267,-3.2277,-0.001017],[-0.36322,-1.8257,-0.001017],[1.5003,-2.5267,-0.001017],[2.432,-2.5267,0.20754],[0.56851,-0.77419,-0.20958],[1.1897,-0.42369,-0.001017],[1.5003,-0.073181,0.010569],[2.7426,-0.42369,0.010569],[4.606,-0.42369,-0.012604],[5.5378,1.6793,-0.012604],[5.2272,4.1329,-0.012604],[3.3637,6.9369,-0.047364],[2.1214,6.9369,-0.047364],[1.1897,-2.5267,-0.024191],[1.5003,-8.1348,-0.024191],[8.6436,-5.6813,-0.001017],[7.4013,-13.392,-0.012604],[9.5753,-10.939,-0.001017],[12.681,3.0814,0.022156],[9.2647,4.1329,-0.012604],[7.4013,-0.77419,-0.012604],[6.7801,-1.4752,-0.012604],[6.1589,-0.073181,-0.024191],[4.606,0.27732,-0.012604],[3.0531,0.97834,0.010569],[0.56851,2.0299,-0.001017],[0.87909,4.8339,-0.024191],[2.432,7.9885,-0.035777],[0.87909,6.9369,-0.024191],[-0.98438,3.4319,-0.035777],[-2.2267,-0.42369,-0.024191],[-2.2267,-3.9287,-0.012604],[-0.36322,-6.0318,-0.012604],[-0.36322,-7.0833,0.022156],[-0.6738,-7.0833,0.033743],[-0.6738,-8.1348,-0.001017],[-0.36322,-9.5368,-0.001017],[0.56851,-10.939,-0.001017],[0.56851,-11.64,0.010569],[0.56851,-10.939,0.010569],[0.87909,-7.7843,-0.001017],[2.7426,-5.3308,-0.001017],[4.606,-4.2793,-0.012604],[6.4695,-4.2793,-0.001017],[7.0907,-4.2793,0.30024],[2.7426,-1.1247,-0.2791],[3.0531,-0.77419,-0.001017],[3.6743,-0.42369,0.010569],[5.2272,-0.42369,0.022156],[8.0224,-0.073181,-0.012604],[9.5753,2.3804,-0.012604],[8.9541,6.2359,-0.012604],[6.4695,8.339,-0.047364],[4.2955,8.6895,-0.058951],[2.7426,-3.2277,-0.024191],[3.3637,-9.1863,-0.024191],[12.06,-6.0318,-0.001017],[11.128,-15.846,-0.012604],[14.545,-12.341,-0.001017],[17.34,6.2359,0.022156],[12.681,8.6895,-0.012604],[10.196,3.0814,-0.012604],[8.9541,1.6793,-0.012604],[7.4013,1.6793,-0.024191],[4.9166,0.97834,-0.012604],[3.3637,1.3288,0.022156],[1.5003,1.6793,-0.001017],[1.5003,3.7824,-0.035777],[3.0531,6.5864,-0.035777],[1.5003,5.5349,-0.024191],[-0.6738,2.7309,-0.035777],[-2.2267,-0.77419,-0.024191],[-2.2267,-4.9803,-0.012604],[0.56851,-6.7328,-0.012604],[1.1897,-7.4338,0.033743],[1.1897,-8.1348,0.033743],[2.1214,-9.1863,-0.001017],[3.0531,-11.289,-0.001017],[4.606,-13.743,-0.001017],[5.2272,-14.794,0.022156],[5.5378,-14.093,0.010569],[6.1589,-10.588,-0.001017],[7.0907,-7.7843,-0.001017],[8.9541,-6.7328,-0.012604],[10.196,-6.3823,-0.001017],[11.128,-6.3823,0.38134],[4.9166,-0.42369,-0.33703],[5.2272,-0.073181,-0.012604],[6.4695,0.27732,0.010569],[8.333,0.27732,0.022156],[10.818,0.62783,-0.012604],[12.992,3.7824,-0.012604],[12.06,7.6379,-0.012604],[9.2647,10.091,-0.047364],[6.7801,10.091,-0.058951],[4.9166,-3.5782,-0.024191],[5.5378,-9.8873,-0.024191],[15.166,-6.3823,-0.001017],[14.234,-17.949,-0.024191],[17.34,-13.392,0.010569],[20.446,7.6379,0.022156],[15.166,10.793,-0.012604],[12.06,5.1844,-0.012604],[10.507,3.7824,-0.012604],[8.6436,2.7309,-0.012604],[5.5378,0.97834,-0.001017],[4.2955,1.3288,0.010569],[3.0531,1.3288,-0.001017],[3.0531,2.7309,-0.035777],[4.9166,4.8339,-0.035777],[3.0531,4.4834,-0.024191],[1.1897,2.3804,-0.035777],[-0.36322,-1.1247,-0.024191],[-0.6738,-5.3308,-0.012604],[1.5003,-6.0318,-0.012604],[2.7426,-6.3823,0.033743],[2.7426,-7.4338,0.045329],[3.6743,-8.1348,0.010569],[5.2272,-10.238,-0.001017],[7.4013,-13.042,-0.001017],[8.6436,-15.145,0.022156],[9.2647,-15.846,0.010569],[10.196,-13.392,-0.001017],[11.439,-9.8873,-0.001017],[13.302,-8.8358,-0.012604],[14.545,-7.7843,-0.012604],[15.476,-7.4338,0.42769],[8.333,0.62783,-0.39496],[8.6436,0.97834,-0.012604],[9.2647,1.3288,0.010569],[11.439,0.97834,0.010569],[14.545,1.3288,-0.012604],[16.408,4.8339,-0.012604],[15.166,9.3905,-0.012604],[12.371,11.494,-0.047364],[9.5753,11.143,-0.058951],[8.0224,-2.5267,-0.024191],[8.9541,-9.5368,-0.024191],[18.272,-6.3823,-0.001017],[17.029,-19.702,-0.024191],[20.756,-14.093,0.010569],[23.241,8.6895,0.022156],[18.272,11.844,-0.012604],[14.855,7.2874,-0.012604],[12.681,5.1844,-0.012604],[10.818,3.7824,-0.012604],[8.0224,2.0299,-0.001017],[6.7801,2.3804,0.010569],[5.5378,2.0299,-0.001017],[6.1589,2.7309,-0.024191],[8.333,4.4834,-0.024191],[6.4695,4.4834,-0.024191],[4.2955,2.7309,-0.035777],[2.7426,-0.42369,-0.024191],[2.1214,-4.9803,-0.001017],[4.2955,-5.6813,-0.012604],[4.9166,-5.6813,0.033743],[4.9166,-6.3823,0.045329],[6.4695,-6.7328,0.010569],[8.333,-8.4853,-0.012604],[10.507,-10.939,-0.001017],[11.439,-14.093,0.022156],[12.681,-14.444,0.010569],[14.234,-12.691,-0.001017],[16.408,-9.8873,-0.001017],[18.272,-8.8358,-0.012604],[20.135,-8.1348,-0.012604],[21.067,-7.7843,0.46245],[12.06,1.6793,-0.42972],[12.371,2.0299,-0.012604],[13.302,2.0299,0.010569],[15.166,2.0299,0.010569],[18.582,2.0299,-0.012604],[20.446,6.2359,-0.012604],[18.893,10.793,-0.012604],[15.476,12.896,-0.047364],[12.992,12.545,-0.047364],[11.128,-1.8257,-0.024191],[12.371,-8.8358,-0.024191],[21.377,-6.3823,-0.001017],[20.135,-21.104,-0.012604],[24.483,-15.145,0.010569],[26.657,9.04,0.022156],[21.067,12.896,-0.012604],[17.961,8.339,-0.012604],[15.476,6.9369,-0.012604],[13.923,4.8339,-0.001017],[10.818,3.0814,0.010569],[10.196,3.4319,0.010569],[9.5753,3.4319,-0.001017],[10.196,3.7824,-0.024191],[12.371,5.1844,-0.024191],[10.507,5.1844,-0.024191],[8.0224,3.7824,-0.035777],[6.4695,0.27732,-0.012604],[4.9166,-4.9803,-0.001017],[6.7801,-5.3308,-0.012604],[7.4013,-5.3308,0.022156],[8.0224,-5.6813,0.045329],[8.9541,-5.6813,-0.001017],[11.128,-7.0833,-0.012604],[12.992,-10.238,-0.001017],[14.545,-13.392,0.022156],[15.476,-13.743,0.010569],[17.34,-11.64,-0.001017],[20.135,-9.1863,-0.001017],[22.62,-8.8358,-0.012604],[25.104,-8.4853,-0.012604],[26.968,-8.1348,0.47404],[16.408,3.0814,-0.4529],[16.719,3.4319,-0.012604],[17.34,3.0814,0.010569],[19.824,2.7309,0.010569],[22.93,2.7309,-0.012604],[24.794,7.2874,-0.012604],[22.62,11.844,-0.012604],[19.203,13.947,-0.035777],[17.029,13.597,-0.047364],[14.855,-1.1247,-0.024191],[16.408,-8.1348,-0.024191],[24.794,-6.3823,-0.001017],[23.862,-22.506,-0.012604],[28.21,-16.196,0.010569],[30.384,9.3905,0.010569],[24.483,13.597,-0.012604],[20.756,9.04,-0.012604],[18.582,7.6379,-0.012604],[16.719,5.1844,-0.001017],[14.545,4.1329,-0.001017],[14.234,4.4834,0.010569],[14.234,4.1329,0.010569],[14.545,4.4834,-0.012604],[16.719,6.2359,-0.024191],[15.166,6.2359,-0.012604],[12.681,5.1844,-0.035777],[10.818,0.97834,-0.012604],[8.6436,-4.9803,-0.001017],[10.196,-5.3308,-0.012604],[10.818,-5.3308,0.022156],[10.818,-5.6813,0.033743],[12.371,-5.6813,-0.001017],[14.234,-7.4338,-0.012604],[15.476,-10.588,-0.001017],[16.719,-14.093,0.010569],[17.961,-14.444,0.010569],[20.135,-12.341,-0.001017],[22.93,-9.5368,-0.012604],[26.347,-9.1863,-0.012604],[29.763,-8.8358,-0.012604],[32.248,-8.4853,0.46245],[20.756,4.4834,-0.4529],[21.067,4.4834,-0.012604],[21.998,3.7824,0.010569],[24.173,3.0814,0.010569],[27.278,2.7309,-0.012604],[29.142,7.9885,-0.012604],[26.968,12.545,-0.012604],[23.862,14.999,-0.035777],[21.998,13.947,-0.035777],[19.824,-0.42369,-0.024191],[21.067,-7.4338,-0.012604],[28.831,-6.3823,-0.001017],[27.278,-23.207,-0.012604],[32.248,-16.897,0.010569],[34.111,9.741,0.010569],[28.521,13.947,-0.001017],[24.483,9.741,-0.001017],[21.998,7.9885,-0.012604],[20.135,6.2359,-0.012604],[17.961,4.4834,-0.001017],[17.961,4.8339,0.010569],[17.961,4.1329,0.010569],[18.272,4.1329,-0.012604],[20.446,5.5349,-0.012604],[19.203,6.5864,-0.012604],[17.029,6.2359,-0.024191],[14.855,1.3288,-0.012604],[12.681,-4.9803,-0.012604],[14.234,-5.3308,-0.012604],[14.855,-5.3308,0.010569],[14.855,-5.6813,0.022156],[16.408,-6.0318,-0.001017],[18.272,-8.1348,-0.012604],[19.824,-11.64,-0.001017],[20.756,-15.495,0.010569],[21.377,-15.495,0.010569],[23.862,-13.392,-0.001017],[26.657,-10.238,-0.012604],[30.384,-9.1863,-0.024191],[33.8,-9.1863,-0.012604],[36.285,-9.1863,0.40452],[25.104,5.1844,-0.41814],[26.036,5.1844,-0.012604],[26.657,4.1329,-0.001017],[28.831,3.0814,0.010569],[32.248,2.7309,-0.012604],[34.111,7.9885,-0.012604],[32.248,12.896,-0.012604],[28.831,15.349,-0.024191],[27.278,14.999,-0.035777],[25.104,0.62783,-0.024191],[26.657,-6.3823,-0.012604],[33.179,-6.0318,-0.001017],[32.248,-23.908,-0.024191],[37.217,-17.248,-0.001017],[38.77,10.091,-0.001017],[32.869,14.999,-0.001017],[28.831,10.442,-0.001017],[26.347,9.04,-0.001017],[24.483,7.2874,-0.012604],[22.62,5.5349,-0.001017],[22.62,5.5349,0.010569],[22.309,5.1844,0.010569],[22.309,4.8339,-0.001017],[24.173,6.2359,-0.012604],[22.62,7.6379,-0.012604],[20.446,7.9885,-0.024191],[18.272,2.7309,-0.012604],[15.166,-3.9287,-0.012604],[17.029,-4.6298,-0.012604],[17.961,-4.6298,0.010569],[18.272,-5.3308,0.022156],[20.135,-5.3308,-0.001017],[22.62,-7.7843,-0.012604],[24.173,-11.64,-0.001017],[25.104,-15.145,-0.001017],[26.036,-15.495,-0.001017],[27.899,-12.341,-0.012604],[30.695,-8.8358,-0.012604],[34.422,-7.7843,-0.024191],[37.217,-7.7843,-0.012604],[40.012,-8.1348,0.335],[27.899,6.2359,-0.3602],[28.521,5.1844,-0.012604],[29.763,3.7824,-0.001017],[31.937,2.7309,-0.001017],[35.664,2.0299,-0.001017],[37.838,7.2874,-0.012604],[35.975,12.195,-0.012604],[32.869,14.298,-0.024191],[32.248,14.298,-0.024191],[30.384,1.6793,-0.012604],[31.937,-4.9803,-0.012604],[36.906,-5.3308,-0.001017],[35.975,-23.207,-0.024191],[41.565,-16.897,-0.001017],[42.807,8.6895,-0.001017],[38.149,13.947,-0.001017],[34.111,10.792,-0.001017],[31.937,9.741,-0.001017],[29.763,8.339,-0.012604],[27.278,7.2874,-0.001017],[26.968,6.9369,-0.001017],[26.347,6.5864,0.010569],[25.725,5.5349,-0.001017],[26.657,6.9369,-0.001017],[24.794,8.6895,-0.012604],[22.62,9.741,-0.024191],[20.135,4.1329,-0.012604],[16.719,-2.8772,-0.001017],[18.272,-3.5782,-0.012604],[19.203,-3.5782,0.010569],[19.203,-4.2793,0.022156],[21.998,-4.2793,-0.001017],[24.483,-7.0833,-0.012604],[26.347,-11.289,-0.001017],[27.278,-15.145,-0.001017],[27.899,-15.145,-0.001017],[28.831,-11.289,-0.012604],[31.316,-7.0833,-0.012604],[34.732,-5.6813,-0.024191],[37.838,-6.3823,-0.012604],[40.323,-7.0833,0.2423],[27.899,5.5349,-0.30227],[28.831,4.8339,-0.012604],[30.384,3.0814,-0.001017],[32.558,1.6793,-0.001017],[36.906,1.3288,-0.001017],[39.701,5.5349,-0.001017],[38.77,10.792,-0.001017],[36.906,13.246,-0.012604],[36.596,13.597,-0.012604],[34.422,3.0814,-0.012604],[35.043,-3.2277,-0.012604],[40.012,-4.9803,-0.001017],[39.701,-21.805,-0.012604],[44.36,-15.495,-0.001017],[44.981,4.4834,-0.001017],[43.739,11.143,-0.001017],[40.012,10.792,-0.001017],[37.217,10.091,-0.001017],[34.732,9.3905,-0.012604],[32.248,7.9885,-0.001017],[31.005,7.2874,-0.001017],[29.763,6.9369,0.010569],[28.21,6.2359,0.010569],[28.21,7.2874,-0.001017],[26.036,9.741,-0.001017],[23.241,11.494,-0.012604],[20.446,5.5349,-0.012604],[16.408,-2.5267,-0.001017],[17.961,-2.1762,-0.012604],[18.893,-2.1762,0.010569],[18.893,-3.2277,0.010569],[21.377,-3.5782,-0.001017],[24.173,-6.7328,-0.012604],[26.036,-11.64,-0.001017],[26.347,-15.495,-0.001017],[26.347,-15.145,-0.001017],[26.657,-10.238,-0.012604],[28.521,-5.6813,-0.012604],[32.248,-4.2793,-0.012604],[35.043,-4.9803,-0.012604],[37.838,-6.0318,0.1612],[24.173,5.5349,-0.26751],[25.104,4.4834,-0.012604],[26.657,2.7309,-0.001017],[29.142,1.6793,-0.001017],[32.869,0.97834,-0.001017],[35.975,4.1329,-0.001017],[36.285,7.6379,-0.001017],[35.664,9.3905,-0.001017],[35.975,10.091,-0.001017],[34.422,2.7309,-0.012604],[34.422,-1.8257,-0.001017],[38.149,-2.1762,-0.001017],[37.838,-14.093,-0.012604],[40.323,-8.1348,-0.012604],[39.701,4.1329,-0.001017],[38.459,7.2874,-0.001017],[36.285,6.9369,-0.001017],[33.8,6.2359,-0.001017],[31.316,5.1844,-0.012604],[28.521,3.7824,-0.012604],[26.657,3.0814,-0.001017],[25.104,3.7824,-0.001017],[23.862,4.4834,0.010569],[23.241,6.9369,-0.001017],[21.377,10.792,-0.001017],[18.582,14.999,-0.012604],[15.476,8.6895,-0.001017],[10.818,-1.8257,-0.001017],[12.681,-1.1247,-0.001017],[14.855,-1.8257,-0.001017],[15.476,-2.8772,-0.001017],[18.582,-3.9287,-0.001017],[21.377,-7.7843,-0.001017],[22.62,-12.341,-0.001017],[22.93,-15.145,-0.001017],[21.998,-14.093,-0.001017],[21.377,-8.1348,-0.012604],[22.62,-2.5267,-0.012604],[26.657,-1.4752,-0.012604],[30.695,-2.1762,-0.012604],[32.869,-3.9287,0.11485],[18.893,5.1844,-0.23275],[20.135,4.1329,-0.001017],[21.377,2.7309,-0.012604],[24.173,1.6793,-0.012604],[27.278,0.97834,-0.001017],[30.695,2.3804,-0.001017],[32.248,3.7824,-0.001017],[32.869,4.4834,-0.001017],[33.8,5.1844,-0.001017],[32.558,2.0299,-0.001017],[32.248,-0.42369,-0.001017],[34.732,-0.073181,-0.001017],[34.111,-4.2793,-0.012604],[34.111,0.62783,-0.012604],[32.248,5.1844,-0.001017],[30.384,2.7309,-0.001017],[29.142,1.3288,-0.001017],[26.968,0.97834,-0.001017],[24.794,-0.073181,-0.012604],[21.377,-1.8257,-0.012604],[19.203,-2.1762,-0.012604],[17.961,-0.073181,-0.001017],[17.029,2.3804,0.010569],[16.719,6.2359,-0.001017],[15.166,11.494,-0.001017],[12.371,18.504,-0.001017],[8.9541,11.494,-0.001017],[3.6743,-0.77419,-0.001017],[6.4695,0.27732,-0.001017],[9.5753,-0.77419,-0.012604],[12.06,-3.5782,-0.012604],[14.855,-4.6298,-0.012604],[17.961,-8.8358,-0.001017],[18.893,-13.392,-0.001017],[18.582,-14.794,-0.012604],[16.408,-12.691,-0.012604],[14.855,-5.6813,-0.012604],[16.097,0.27732,-0.012604],[20.446,1.3288,-0.001017],[24.794,0.27732,-0.012604],[28.21,-1.4752,0.080089],[1.5003,0.97833,-0.001017],[1.5003,0.97833,-0.001017],[0.56851,0.62783,-0.001017],[0.25794,0.27732,-0.001017],[0.56851,2.0299,-0.001017],[0.56851,2.3804,-0.001017],[0.87909,2.0299,-0.001017],[0.87909,1.6793,-0.001017],[2.1214,2.0299,-0.001017],[2.1214,1.3288,-0.001017],[0.56851,3.0814,-0.001017],[2.7426,2.0299,-0.001017],[1.5003,1.3288,-0.001017],[-2.8479,0.27732,-0.001017],[-2.5373,-0.77419,-0.001017],[-2.2267,-1.1247,-0.001017],[-2.2267,-1.8257,-0.001017],[-0.6738,-1.8257,-0.001017],[2.432,-0.42369,-0.001017],[5.2272,-0.073182,-0.001017],[4.2955,1.3288,-0.001017],[1.1897,3.7824,-0.001017],[-3.7796,5.1844,-0.001017],[-2.2267,2.0299,-0.001017],[-3.1584,2.7309,-0.001017],[-0.6738,2.7309,-0.001017],[2.432,0.97833,-0.001017],[2.7426,-1.8257,-0.001017],[1.1897,-2.1762,-0.001017],[0.87909,-2.5267,-0.001017],[1.1897,-3.2277,-0.001017],[1.1897,-1.8257,-0.001017],[1.1897,-1.8257,-0.001017],[0.87909,-1.8257,-0.001017],[0.56851,-1.8257,-0.001017],[0.25794,-1.1247,-0.001017],[0.25794,-0.073182,-0.001017],[-0.36322,0.62783,-0.001017],[-0.6738,1.3288,-0.001017],[-0.6738,0.97833,-0.001017],[-0.98438,1.3288,-0.001017],[-0.36322,0.62783,-0.047364],[0.25794,0.62783,-0.001017],[-0.36322,0.62783,-0.001017],[0.56851,0.27732,-0.012604],[1.1897,1.6793,-0.024191],[1.5003,2.3804,-0.024191],[2.432,2.7309,-0.012604],[2.432,3.0814,-0.001017],[3.0531,2.3804,-0.012604],[3.6743,0.27732,0.010569],[1.5003,-0.073181,-0.012604],[4.2955,-2.1762,-0.001017],[2.432,-2.5267,0.080089],[-4.4008,-4.2793,0.033743],[-1.295,-3.2277,-0.012604],[0.25794,-1.4752,-0.024191],[1.1897,-2.1762,-0.024191],[1.5003,-2.1762,-0.024191],[2.432,-0.42369,-0.001017],[5.2272,-0.073181,-0.001017],[4.2955,1.3288,-0.001017],[1.1897,3.7824,-0.001017],[-2.8479,7.2874,-0.001017],[-2.5373,7.9885,-0.012604],[-2.5373,6.5864,-0.035777],[-1.6055,4.4834,-0.024191],[-1.295,2.0299,-0.012604],[-1.6055,-0.42369,-0.001017],[-2.2267,-1.4752,-0.012604],[-1.6055,-3.9287,-0.012604],[-2.8479,-3.9287,-0.001017],[-3.1584,-3.5782,-0.001017],[-3.469,-3.5782,-0.001017],[-3.469,-3.9287,0.010569],[-4.4008,-3.9287,-0.001017],[-4.4008,-3.2277,-0.001017],[-3.7796,-1.8257,-0.001017],[-3.469,-1.1247,-0.001017],[-3.1584,-0.42369,-0.001017],[-2.8479,-1.1247,-0.001017],[-2.2267,-0.77419,0.10326],[-0.98438,-0.77419,-0.11688],[-0.36322,-0.77419,0.010569],[0.56851,-1.1247,0.010569],[2.7426,-1.8257,-0.035777],[5.2272,-0.77419,-0.047364],[6.4695,0.97834,-0.035777],[7.0907,3.4319,-0.024191],[6.7801,5.5349,-0.001017],[7.4013,4.4834,-0.012604],[9.2647,-1.1247,0.033743],[4.9166,-8.8358,-0.012604],[8.9541,-9.5368,-0.001017],[5.5378,-10.939,0.12644],[-3.1584,-12.691,0.080089],[1.5003,-1.8257,-0.012604],[3.6743,1.3288,-0.035777],[5.2272,-3.2277,-0.035777],[5.2272,-3.5782,-0.035777],[6.1589,-2.1762,-0.035777],[6.4695,0.62783,-0.012604],[4.606,1.6793,-0.001017],[2.1214,4.1329,0.010569],[0.87909,7.2874,0.010569],[1.5003,9.741,-0.012604],[0.87909,9.3905,-0.047364],[-0.6738,6.5864,-0.035777],[-1.6055,1.6793,-0.024191],[-2.2267,-2.1762,-0.001017],[-2.2267,-4.2793,-0.012604],[-1.6055,-5.3308,-0.012604],[-2.8479,-5.3308,0.010569],[-3.469,-5.6813,-0.001017],[-3.7796,-6.3823,0.010569],[-3.7796,-7.7843,0.010569],[-4.4008,-8.8358,0.010569],[-3.7796,-8.4853,-0.001017],[-3.469,-6.3823,-0.001017],[-2.8479,-4.6298,0.010569],[-1.295,-3.5782,0.010569],[0.25793,-3.9287,-0.001017],[1.5003,-3.5782,0.21913],[1.5003,-1.1247,-0.1864],[2.432,-1.1247,0.010569],[3.6743,-1.4752,0.010569],[6.7801,-1.8257,-0.035777],[10.196,-1.8257,-0.058951],[11.439,0.62783,-0.047364],[12.681,4.4834,-0.035777],[12.371,8.339,-0.001017],[12.681,8.339,-0.012604],[14.234,0.97834,0.045329],[8.333,-10.939,-0.012604],[12.992,-10.238,-0.001017],[10.196,-10.238,0.1612],[-0.36322,-10.939,0.080089],[6.1589,2.0299,-0.024191],[8.333,4.4834,-0.047364],[9.2647,-0.77419,-0.047364],[8.6436,-0.77419,-0.047364],[8.333,0.62783,-0.058951],[7.4013,1.6793,-0.012604],[5.5378,2.3804,0.010569],[3.0531,3.7824,0.010569],[2.1214,5.5349,0.010569],[2.1214,7.9885,-0.012604],[2.1214,7.9885,-0.047364],[0.87909,4.8339,-0.047364],[0.25794,0.27732,-0.024191],[-0.36322,-5.3308,-0.001017],[1.5003,-7.4338,-0.012604],[2.432,-7.0833,-0.012604],[2.1214,-7.4338,0.022156],[1.1897,-8.1348,-0.001017],[1.1897,-9.8873,0.010569],[1.1897,-11.64,0.022156],[0.87909,-12.341,0.010569],[1.1897,-11.289,-0.012604],[1.5003,-8.8358,-0.001017],[2.432,-6.7328,0.010569],[3.3637,-5.3308,0.010569],[5.2272,-5.3308,-0.001017],[6.7801,-5.3308,0.32341],[3.6743,-1.4752,-0.24434],[4.606,-1.1247,0.010569],[6.4695,-1.4752,0.010569],[10.818,-2.1762,-0.047364],[15.166,-2.5267,-0.070537],[17.029,0.27732,-0.058951],[18.272,5.1844,-0.035777],[17.34,10.091,-0.001017],[17.029,10.442,-0.012604],[18.272,2.0299,0.045329],[12.06,-13.392,-0.012604],[17.961,-12.341,-0.001017],[14.545,-11.289,0.18437],[4.2955,-11.289,0.091676],[11.128,5.5349,-0.035777],[12.681,8.6895,-0.058951],[12.992,3.0814,-0.047364],[12.06,2.7309,-0.047364],[10.507,2.7309,-0.047364],[8.333,2.7309,-0.001017],[6.4695,2.3804,0.022156],[4.2955,2.7309,0.010569],[3.3637,3.7824,-0.001017],[3.0531,6.2359,-0.012604],[3.0531,6.2359,-0.047364],[1.5003,3.7824,-0.047364],[0.87909,-0.42369,-0.024191],[0.56851,-6.7328,0.010569],[3.3637,-9.5368,-0.001017],[4.9166,-7.7843,-0.012604],[5.2272,-8.4853,0.022156],[4.9166,-9.8873,0.010569],[4.9166,-12.341,0.022156],[5.5378,-14.444,0.022156],[6.1589,-14.794,0.010569],[6.7801,-14.093,-0.012604],[6.7801,-11.289,-0.001017],[7.4013,-8.4853,0.010569],[8.333,-7.0833,0.010569],[9.5753,-6.7328,-0.012604],[11.128,-6.7328,0.4161],[6.1589,-0.77419,-0.30227],[6.7801,-0.42369,0.010569],[8.9541,-0.77419,0.010569],[14.545,-2.1762,-0.047364],[19.203,-2.5267,-0.070537],[21.067,0.97834,-0.058951],[22.62,6.9369,-0.035777],[22.309,11.844,-0.001017],[21.998,12.195,-0.012604],[22.62,2.7309,0.045329],[16.408,-14.444,-0.012604],[22.309,-13.392,-0.001017],[18.582,-12.691,0.17278],[7.4013,-11.289,0.080089],[15.166,7.6379,-0.035777],[16.097,11.143,-0.058951],[15.166,5.5349,-0.047364],[13.302,4.8339,-0.035777],[11.439,4.4834,-0.024191],[8.9541,3.0814,-0.001017],[7.0907,2.7309,0.010569],[5.5378,2.0299,0.010569],[4.9166,2.0299,-0.001017],[4.9166,3.7824,-0.012604],[4.606,4.4834,-0.047364],[2.7426,2.7309,-0.047364],[2.1214,-0.42369,-0.024191],[1.5003,-6.7328,0.010569],[4.2955,-9.1863,-0.001017],[6.1589,-6.7328,-0.001017],[6.7801,-6.7328,0.022156],[6.4695,-9.1863,0.010569],[7.0907,-11.64,0.022156],[8.9541,-14.444,0.022156],[10.196,-16.196,0.010569],[11.128,-16.196,-0.024191],[11.439,-14.093,-0.012604],[12.681,-11.289,-0.001017],[13.923,-9.5368,-0.001017],[14.855,-8.4853,-0.012604],[16.408,-8.1348,0.47404],[8.9541,0.27732,-0.34862],[9.5753,0.27732,0.010569],[12.371,-0.073181,0.010569],[18.582,-1.8257,-0.047364],[23.862,-2.1762,-0.070537],[25.725,1.6793,-0.058951],[26.968,7.9885,-0.035777],[26.657,12.896,-0.001017],[26.657,13.246,-0.012604],[26.968,3.4319,0.045329],[20.756,-14.794,-0.012604],[26.968,-13.392,-0.001017],[22.93,-13.743,0.1612],[10.818,-12.341,0.080089],[18.893,8.6895,-0.035777],[18.893,12.545,-0.047364],[18.272,7.6379,-0.047364],[16.097,6.9369,-0.024191],[13.923,5.5349,-0.024191],[11.128,4.1329,-0.001017],[9.5753,3.4319,0.010569],[8.333,2.3804,0.010569],[8.0224,2.0299,-0.001017],[8.0224,3.7824,-0.012604],[7.0907,4.4834,-0.047364],[5.2272,3.0814,-0.047364],[4.606,0.27732,-0.024191],[3.3637,-5.6813,0.010569],[6.1589,-8.4853,0.010569],[8.0224,-5.3308,-0.001017],[8.6436,-4.9803,0.022156],[8.9541,-7.7843,0.010569],[10.196,-10.238,0.022156],[12.371,-12.691,0.022156],[13.923,-14.794,0.010569],[14.855,-15.846,-0.024191],[16.097,-14.444,-0.012604],[17.34,-11.64,-0.001017],[18.893,-10.238,-0.001017],[20.446,-9.5368,-0.024191],[22.309,-9.1863,0.52038],[12.681,1.3288,-0.38338],[13.302,1.3288,0.010569],[16.408,0.62783,0.010569],[22.93,-1.4752,-0.047364],[28.521,-1.8257,-0.058951],[30.384,2.3804,-0.047364],[31.937,9.3905,-0.035777],[31.316,13.947,-0.001017],[31.316,14.999,-0.012604],[31.937,4.1329,0.033743],[25.725,-14.093,-0.012604],[31.937,-13.042,0.010569],[27.278,-14.794,0.13802],[14.545,-13.042,0.056916],[22.62,9.3905,-0.035777],[22.62,13.947,-0.047364],[21.067,9.04,-0.035777],[18.893,8.339,-0.024191],[16.719,7.2874,-0.024191],[13.923,5.1844,-0.001017],[12.681,4.4834,0.010569],[12.06,3.4319,0.010569],[11.439,2.3804,0.010569],[12.06,4.1329,-0.012604],[10.818,5.5349,-0.035777],[8.9541,4.1329,-0.035777],[7.4013,1.6793,-0.024191],[6.1589,-4.9803,0.010569],[8.333,-7.7843,0.010569],[10.196,-4.6298,-0.001017],[11.128,-3.9287,0.022156],[11.439,-6.7328,0.010569],[12.992,-8.8358,0.022156],[15.166,-11.289,0.022156],[16.719,-13.743,0.010569],[17.961,-15.145,-0.024191],[19.203,-13.743,-0.012604],[21.377,-11.64,-0.001017],[24.173,-10.588,-0.001017],[26.036,-10.238,-0.024191],[28.521,-10.238,0.53197],[16.719,2.7309,-0.40655],[17.961,2.7309,-0.001017],[20.756,1.6793,0.010569],[27.899,-0.77419,-0.035777],[33.179,-1.8257,-0.047364],[34.732,3.4319,-0.047364],[36.285,10.442,-0.035777],[35.975,15.349,-0.001017],[36.285,15.7,-0.001017],[36.285,5.1844,0.033743],[30.384,-13.392,-0.012604],[36.285,-12.341,0.010569],[31.937,-15.846,0.12644],[17.961,-13.743,0.045329],[26.347,10.091,-0.035777],[26.036,15.349,-0.035777],[24.483,10.442,-0.035777],[21.998,9.3905,-0.024191],[19.824,7.9885,-0.012604],[17.029,6.2359,-0.001017],[16.408,5.1844,0.010569],[16.097,4.1329,0.010569],[16.097,3.0814,0.010569],[16.408,5.1844,-0.001017],[15.166,6.9369,-0.024191],[12.992,5.5349,-0.035777],[12.06,2.7309,-0.024191],[9.5753,-4.2793,0.010569],[11.439,-7.7843,0.010569],[12.992,-4.6298,-0.012604],[14.234,-3.9287,0.022156],[14.545,-6.7328,-0.001017],[16.097,-8.8358,0.010569],[18.272,-11.289,0.022156],[19.203,-14.093,0.010569],[20.446,-15.495,-0.012604],[22.62,-14.093,-0.012604],[25.104,-12.341,-0.001017],[28.521,-10.939,-0.012604],[31.005,-10.939,-0.024191],[34.111,-10.939,0.5088],[21.067,3.7824,-0.39496],[22.309,3.4319,-0.001017],[25.725,2.3804,-0.001017],[32.558,-0.77419,-0.035777],[38.459,-1.8257,-0.047364],[40.012,3.7824,-0.035777],[41.565,11.143,-0.024191],[41.565,15.7,-0.001017],[41.876,16.401,-0.001017],[41.565,5.5349,0.022156],[35.043,-12.341,-0.012604],[40.944,-10.939,-0.001017],[35.975,-16.547,0.091676],[21.377,-14.444,0.033743],[30.074,10.442,-0.024191],[29.142,16.05,-0.035777],[27.278,11.143,-0.024191],[24.483,9.741,-0.024191],[22.309,8.339,-0.012604],[20.135,6.5864,-0.001017],[19.824,5.5349,0.010569],[19.824,4.1329,0.010569],[20.135,3.0814,0.010569],[20.446,5.1844,-0.001017],[19.203,7.2874,-0.024191],[17.34,6.5864,-0.035777],[16.097,3.4319,-0.024191],[13.302,-3.9287,0.010569],[15.166,-8.1348,0.010569],[17.029,-4.9803,-0.012604],[18.272,-4.6298,0.010569],[18.272,-7.4338,-0.001017],[19.203,-9.5368,0.010569],[21.377,-12.691,0.022156],[22.309,-15.495,-0.001017],[23.862,-16.547,-0.024191],[26.036,-15.145,-0.012604],[28.831,-13.042,-0.001017],[32.248,-11.64,-0.012604],[35.043,-11.64,-0.024191],[38.77,-11.64,0.45086],[25.104,4.4834,-0.3602],[26.657,4.1329,-0.001017],[30.074,2.3804,-0.001017],[37.838,-0.77419,-0.024191],[44.05,-1.8257,-0.035777],[45.602,3.4319,-0.035777],[46.845,11.143,-0.024191],[46.845,15.7,-0.001017],[47.777,16.751,-0.001017],[46.845,6.5864,0.010569],[40.633,-10.588,-0.024191],[46.224,-9.5368,-0.001017],[40.323,-16.897,0.080089],[25.725,-14.794,0.010569],[33.8,11.143,-0.024191],[32.869,16.751,-0.024191],[31.005,11.844,-0.024191],[27.899,10.442,-0.012604],[25.725,9.04,-0.012604],[23.862,7.2874,-0.001017],[23.862,6.5864,0.010569],[23.862,4.8339,0.010569],[24.173,3.7824,0.010569],[24.173,5.5349,-0.001017],[22.93,8.339,-0.012604],[20.756,7.9885,-0.024191],[19.203,5.1844,-0.024191],[16.097,-2.5267,0.010569],[17.961,-7.7843,0.010569],[20.135,-4.2792,-0.012604],[21.377,-3.9287,0.010569],[21.998,-7.0833,-0.001017],[23.241,-9.8873,0.010569],[25.725,-13.042,0.010569],[26.347,-15.846,-0.001017],[28.21,-16.547,-0.024191],[30.074,-14.794,-0.012604],[32.558,-12.341,-0.001017],[36.285,-10.588,-0.012604],[39.08,-10.588,-0.012604],[42.186,-10.939,0.36976],[27.278,4.8339,-0.30227],[28.831,4.1329,-0.001017],[32.248,2.0299,-0.001017],[40.012,-1.4752,-0.012604],[46.534,-2.5267,-0.024191],[48.398,2.3804,-0.024191],[50.572,10.091,-0.012604],[50.882,14.298,-0.001017],[52.435,16.05,-0.001017],[51.503,6.9369,0.010569],[45.913,-8.4853,-0.024191],[49.951,-8.4853,-0.001017],[44.671,-16.897,0.045329],[31.005,-14.794,-0.001017],[38.149,9.3905,-0.012604],[37.838,15.7,-0.012604],[35.664,12.195,-0.012604],[32.248,11.494,-0.012604],[30.384,10.442,-0.012604],[28.521,8.6895,-0.001017],[28.21,7.6379,-0.001017],[27.899,6.2359,0.010569],[27.899,4.8339,0.010569],[27.278,7.2874,-0.001017],[25.104,9.741,-0.012604],[22.93,9.741,-0.024191],[21.067,7.2874,-0.024191],[17.029,-1.4752,0.010569],[18.582,-7.0833,0.010569],[20.756,-3.5782,-0.001017],[22.62,-2.5267,0.010569],[23.862,-6.7328,-0.001017],[25.725,-9.8873,-0.001017],[27.899,-13.042,0.010569],[28.21,-15.846,-0.001017],[29.763,-16.196,-0.012604],[31.005,-13.743,-0.012604],[33.8,-10.238,-0.001017],[37.217,-9.1863,-0.012604],[39.701,-9.1863,-0.012604],[42.497,-9.5368,0.27706],[26.968,4.4834,-0.24434],[28.831,3.4319,-0.012604],[32.248,1.3288,-0.001017],[39.701,-1.8257,-0.012604],[46.224,-3.5782,-0.012604],[48.708,0.97834,-0.012604],[51.814,7.6379,-0.012604],[53.367,12.195,-0.001017],[55.852,14.999,-0.001017],[54.299,7.6379,-0.001017],[49.951,-6.0318,-0.024191],[52.435,-7.7843,-0.012604],[48.398,-17.248,0.010569],[36.906,-14.093,-0.012604],[43.118,4.4834,-0.012604],[43.118,12.545,-0.001017],[41.565,12.195,-0.001017],[38.149,12.195,-0.012604],[35.975,11.844,-0.012604],[33.179,10.442,-0.001017],[32.558,9.04,-0.001017],[32.248,7.9885,-0.001017],[31.316,6.5864,0.010569],[30.074,9.04,0.010569],[26.968,11.494,-0.001017],[23.862,11.494,-0.012604],[21.998,9.3905,-0.012604],[16.408,-0.073181,0.010569],[17.34,-6.3823,0.010569],[19.824,-2.1762,-0.001017],[21.998,-1.8257,0.010569],[23.241,-6.3823,-0.001017],[25.725,-9.5368,-0.001017],[27.278,-13.392,-0.001017],[27.899,-15.846,-0.001017],[28.831,-15.495,-0.012604],[29.763,-11.64,-0.012604],[31.316,-8.1348,-0.001017],[34.422,-7.4338,-0.012604],[36.906,-7.4338,-0.012604],[39.701,-8.1348,0.18437],[23.241,4.4834,-0.20958],[24.794,3.0814,-0.012604],[28.21,0.97834,-0.001017],[34.422,-1.8257,-0.001017],[40.323,-3.5782,-0.001017],[43.739,-0.42369,-0.001017],[47.466,4.1329,-0.001017],[49.64,7.9885,-0.001017],[52.125,10.442,-0.001017],[51.503,6.5864,-0.001017],[48.087,-3.9287,-0.012604],[49.951,-4.9803,-0.012604],[46.534,-10.238,-0.012604],[38.149,-6.7328,-0.012604],[41.565,4.8339,-0.001017],[40.012,9.04,-0.001017],[37.217,8.6895,-0.001017],[34.422,8.6895,-0.001017],[32.248,8.339,-0.012604],[29.142,6.9369,-0.012604],[27.899,5.1844,-0.001017],[26.347,4.8339,-0.001017],[24.794,5.1844,-0.001017],[23.241,9.04,-0.001017],[20.446,12.545,-0.001017],[18.272,13.597,-0.012604],[17.34,12.896,-0.012604],[11.128,2.7309,-0.001017],[12.681,-5.3308,-0.001017],[16.097,-1.8257,-0.001017],[18.582,-1.8257,-0.001017],[20.446,-6.3823,-0.001017],[22.93,-9.8873,-0.001017],[24.483,-13.392,-0.001017],[24.173,-14.794,-0.001017],[24.483,-13.392,-0.012604],[24.483,-8.4853,-0.012604],[26.347,-5.3308,-0.012604],[29.763,-4.9803,-0.012604],[32.248,-4.9803,-0.001017],[34.732,-6.0318,0.12644],[18.272,4.1329,-0.17482],[20.135,2.7309,-0.012604],[22.62,0.97834,-0.012604],[28.21,-1.4752,-0.001017],[32.869,-2.5267,-0.001017],[36.906,-1.8257,-0.001017],[40.944,0.62783,-0.001017],[43.739,2.7309,-0.001017],[46.224,5.1844,-0.001017],[46.224,4.4834,-0.012604],[44.36,-1.8257,-0.012604],[45.602,-1.4752,-0.012604],[43.118,-1.8257,-0.035777],[37.217,2.3804,-0.024191],[37.217,7.2874,-0.001017],[33.8,4.8339,0.010569],[30.384,3.7824,-0.001017],[27.278,3.0814,-0.001017],[24.794,2.3804,-0.012604],[21.998,0.97834,-0.012604],[18.893,0.27732,-0.012604],[16.719,0.97834,-0.001017],[15.166,3.4319,-0.001017],[13.302,8.6895,-0.001017],[11.439,13.246,-0.001017],[10.196,16.401,-0.001017],[11.439,17.452,-0.001017],[4.2955,6.2359,-0.012604],[6.4695,-4.2793,-0.012604],[11.128,-1.8257,-0.001017],[14.234,-1.8257,-0.012604],[16.719,-6.7328,-0.012604],[19.203,-10.238,-0.012604],[20.446,-13.042,-0.012604],[19.824,-13.392,-0.012604],[18.893,-10.588,-0.001017],[17.961,-5.3308,-0.012604],[19.824,-1.8257,-0.012604],[23.862,-1.8257,-0.012604],[26.968,-2.1762,-0.001017],[29.763,-3.9287,0.091676],[1.5003,0.62783,-0.001017],[1.1897,0.27732,-0.001017],[0.87909,1.3288,-0.001017],[2.1214,3.0814,-0.001017],[1.5003,3.4319,-0.001017],[0.25794,2.3804,-0.001017],[-0.36322,1.6793,-0.001017],[0.56851,0.27732,-0.001017],[2.1214,1.6793,-0.001017],[3.6743,0.27732,-0.001017],[3.0531,0.97833,-0.001017],[-1.295,-0.42369,-0.001017],[-0.6738,-3.2277,-0.001017],[-2.5373,-1.8257,-0.001017],[-2.2267,-0.42369,-0.001017],[-2.2267,-0.42369,-0.001017],[-1.6055,-0.42369,-0.001017],[0.56851,-1.8257,-0.001017],[3.6743,-0.77419,-0.001017],[4.9166,0.27732,-0.001017],[3.0531,1.3288,-0.001017],[-0.36322,3.7824,-0.001017],[-4.7113,4.8339,-0.001017],[-3.7796,4.1329,-0.001017],[-2.8479,4.1329,-0.001017],[-0.36322,3.4319,-0.001017],[2.1214,2.0299,-0.001017],[2.7426,-1.8257,-0.001017],[0.87909,-1.4752,-0.001017],[1.1897,-2.1762,-0.001017],[2.1214,-3.2277,-0.001017],[2.432,-3.2277,-0.001017],[2.1214,-2.5267,-0.001017],[1.1897,-1.8257,-0.001017],[1.1897,-1.1247,-0.001017],[1.1897,-0.42369,-0.001017],[0.56851,-0.073182,-0.001017],[0.56851,0.27732,-0.001017],[-0.36322,0.97833,-0.001017],[-0.36322,1.3288,-0.001017],[-0.98438,1.6793,-0.001017],[0.56851,0.62783,-0.047364],[0.56851,0.27732,-0.001017],[1.5003,0.97834,-0.024191],[3.6743,2.3804,-0.024191],[4.9166,3.0814,0.010569],[3.0531,2.7309,0.022156],[2.7426,3.0814,-0.001017],[3.6743,2.3804,-0.012604],[5.5378,2.3804,-0.012604],[6.7801,-0.073181,-0.001017],[5.5378,-1.1247,0.045329],[-0.36322,-3.2277,0.022156],[0.87909,-5.6813,-0.012604],[-1.6055,-6.3823,-0.001017],[-0.6738,-4.9803,-0.012604],[3.0531,-1.1247,-0.012604],[3.6743,-1.4752,-0.012604],[1.1897,-1.8257,-0.012604],[3.6743,-0.77419,-0.001017],[4.9166,0.27732,-0.001017],[3.0531,1.3288,-0.001017],[-0.36322,3.7824,-0.001017],[-2.8479,7.6379,0.010569],[-2.8479,8.339,-0.012604],[-2.2267,7.9885,-0.035777],[-1.295,5.1844,-0.024191],[-1.295,2.3804,-0.024191],[-0.98438,-0.42369,-0.012604],[-1.295,-1.1247,-0.001017],[-1.6055,-1.8257,-0.012604],[-1.6055,-3.5782,-0.012604],[-2.2267,-3.9287,-0.001017],[-4.4008,-4.6298,0.010569],[-4.4008,-5.6813,-0.001017],[-4.7113,-5.3308,-0.001017],[-5.3325,-4.6298,-0.001017],[-6.2642,-3.5782,-0.001017],[-5.3325,-2.5267,-0.001017],[-3.7796,-1.8257,-0.012604],[-2.5373,-1.1247,-0.012604],[-2.2267,-0.42369,0.11485],[0.56851,-1.4752,-0.1053],[1.5003,-1.8257,-0.001017],[4.2955,-2.5267,-0.047364],[8.0224,-2.5267,-0.035777],[9.2647,-1.1247,0.022156],[8.9541,0.97834,0.045329],[9.5753,3.0814,0.010569],[11.439,4.1329,-0.024191],[14.545,1.6793,-0.024191],[14.855,-1.8257,-0.012604],[13.302,-7.0833,0.080089],[3.6743,-9.5368,0.045329],[5.5378,-7.7843,-0.012604],[-0.6738,-10.939,-0.001017],[2.1214,-6.3823,-0.024191],[8.6436,0.97834,-0.024191],[9.5753,-1.8257,-0.012604],[6.1589,-3.2277,-0.035777],[5.5378,-0.42369,-0.012604],[6.7801,0.97834,-0.001017],[5.2272,2.3804,-0.001017],[2.7426,4.4834,0.022156],[1.5003,7.6379,0.033743],[2.1214,9.741,-0.012604],[1.1897,10.792,-0.047364],[0.87909,7.6379,-0.035777],[0.25793,2.3804,-0.024191],[0.25793,-3.2277,-0.012604],[-0.98438,-4.9803,0.010569],[-1.6055,-4.9803,-0.012604],[-1.6055,-5.3308,-0.012604],[-2.8479,-5.3308,0.010569],[-4.4008,-6.7328,0.010569],[-3.469,-8.1348,0.010569],[-3.469,-8.1348,-0.001017],[-5.0219,-7.4338,0.010569],[-5.6431,-6.0318,-0.001017],[-5.0219,-5.3308,-0.001017],[-2.8479,-5.3308,-0.012604],[-0.36322,-4.9803,-0.012604],[0.87909,-4.6298,0.2423],[3.0531,-1.8257,-0.16323],[4.606,-2.1762,-0.001017],[8.333,-3.9287,-0.058951],[12.681,-4.9803,-0.047364],[13.923,-2.5267,0.033743],[13.302,0.62783,0.056916],[14.545,4.1329,0.010569],[17.029,6.9369,-0.035777],[20.135,4.4834,-0.024191],[20.446,0.27732,-0.012604],[18.272,-7.7843,0.10326],[7.0907,-8.8358,0.056916],[10.196,-3.5782,-0.012604],[2.7426,-8.8358,-0.001017],[7.0907,-3.9287,-0.024191],[13.923,3.4319,-0.024191],[14.545,-0.073181,-0.012604],[10.818,-0.42369,-0.047364],[9.5753,2.0299,-0.035777],[9.2647,2.7309,0.010569],[7.4013,3.4319,0.010569],[5.2272,4.4834,0.033743],[3.6743,6.2359,0.033743],[3.0531,7.9885,-0.012604],[3.0531,8.339,-0.058951],[3.3637,5.1844,-0.035777],[3.3637,0.62783,-0.035777],[3.6743,-6.3823,-0.001017],[4.2955,-9.1863,0.010569],[3.3637,-7.0833,-0.012604],[3.3637,-7.0833,-0.012604],[2.1214,-7.7843,0.010569],[1.1897,-10.238,0.022156],[1.5003,-12.341,0.010569],[1.1897,-12.341,-0.001017],[0.25794,-10.588,0.010569],[-0.36322,-8.1348,-0.001017],[0.56851,-7.0833,-0.001017],[2.7426,-6.3823,-0.012604],[5.2272,-6.3823,-0.012604],[6.4695,-6.0318,0.35817],[5.2272,-1.8257,-0.22116],[7.0907,-2.1762,-0.001017],[12.06,-5.3308,-0.058951],[17.34,-7.4338,-0.058951],[18.582,-4.9803,0.045329],[17.961,0.27732,0.080089],[19.203,5.1844,0.022156],[22.62,9.04,-0.035777],[25.104,6.5864,-0.024191],[25.725,2.0299,-0.012604],[22.93,-8.8358,0.11485],[12.06,-10.238,0.080089],[16.097,-0.77419,-0.012604],[7.0907,-8.1348,-0.012604],[13.923,-1.8257,-0.035777],[19.824,7.2874,-0.035777],[19.824,3.4319,-0.012604],[15.166,3.4319,-0.035777],[12.992,4.4834,-0.035777],[11.128,3.7824,0.010569],[9.2647,3.7824,0.010569],[7.4013,4.1329,0.033743],[6.1589,4.4834,0.022156],[4.9166,6.2359,-0.024191],[4.606,6.2359,-0.058951],[4.606,3.7824,-0.047364],[4.9166,-0.42369,-0.047364],[5.2272,-7.7843,-0.012604],[7.0907,-12.341,0.022156],[7.0907,-9.8873,-0.012604],[6.7801,-8.4853,-0.012604],[5.5378,-9.1863,0.022156],[5.5378,-12.691,0.022156],[6.4695,-14.444,0.010569],[6.4695,-14.444,-0.001017],[5.5378,-13.743,-0.001017],[5.2272,-10.238,-0.001017],[6.1589,-8.4853,-0.012604],[8.0224,-7.7843,-0.024191],[10.507,-7.4338,-0.012604],[11.439,-7.7843,0.43928],[7.4013,-1.1247,-0.26751],[9.2647,-1.8257,-0.001017],[15.166,-5.6813,-0.070537],[21.998,-8.8358,-0.058951],[22.62,-5.3308,0.045329],[21.998,0.62783,0.080089],[23.862,6.9369,0.022156],[27.278,11.143,-0.035777],[30.384,8.6895,-0.024191],[31.316,3.7824,-0.012604],[28.21,-8.8358,0.11485],[17.34,-9.8873,0.056916],[21.377,0.62783,-0.012604],[11.128,-7.7843,-0.012604],[19.203,-1.1247,-0.035777],[23.862,10.091,-0.035777],[22.62,6.5864,-0.012604],[17.961,6.2359,-0.024191],[14.855,6.2359,-0.024191],[12.371,4.4834,0.010569],[10.507,4.1329,0.010569],[8.6436,3.4319,0.022156],[7.4013,2.7309,0.022156],[6.7801,4.1329,-0.024191],[6.4695,4.4834,-0.070537],[5.5378,3.0814,-0.047364],[5.5378,-0.77419,-0.047364],[5.5378,-7.4338,-0.012604],[8.0224,-10.939,0.022156],[8.0224,-8.8358,-0.001017],[8.6436,-7.4338,-0.001017],[8.0224,-8.8358,0.022156],[8.333,-13.042,0.033743],[10.507,-15.495,0.010569],[11.128,-16.897,-0.012604],[11.128,-16.897,-0.001017],[11.439,-14.093,-0.001017],[12.371,-11.289,-0.012604],[13.923,-9.8873,-0.024191],[16.097,-9.1863,-0.024191],[16.719,-8.8358,0.49721],[10.196,-0.42369,-0.31386],[12.371,-1.1247,-0.012604],[19.203,-5.6813,-0.058951],[26.657,-9.1863,-0.047364],[26.968,-5.3308,0.033743],[26.036,1.3288,0.056916],[28.21,7.9885,0.010569],[32.248,12.195,-0.024191],[35.664,9.741,-0.024191],[36.596,4.4834,-0.012604],[32.869,-9.1863,0.10326],[22.62,-10.238,0.056916],[26.657,0.62783,-0.012604],[15.166,-8.1348,-0.024191],[23.862,-0.77419,-0.035777],[27.278,11.844,-0.035777],[25.725,8.6895,-0.012604],[20.756,8.339,-0.012604],[17.34,7.6379,-0.012604],[14.855,6.2359,0.010569],[12.992,4.8339,0.010569],[11.439,3.7824,0.022156],[10.196,2.3804,0.022156],[9.5753,3.7824,-0.024191],[8.9541,4.4834,-0.070537],[7.4013,3.4319,-0.047364],[7.0907,0.27732,-0.047364],[7.0907,-6.3823,-0.012604],[9.2647,-9.8873,0.022156],[9.5753,-7.7843,-0.001017],[11.128,-6.0318,-0.001017],[10.507,-7.4338,0.022156],[11.128,-10.939,0.033743],[14.234,-14.093,0.010569],[15.166,-16.196,-0.012604],[15.476,-16.897,-0.001017],[16.408,-15.145,-0.001017],[17.961,-13.042,-0.012604],[20.135,-11.64,-0.024191],[21.998,-11.289,-0.012604],[22.309,-10.588,0.53197],[13.302,0.62783,-0.34862],[16.408,-0.42369,-0.012604],[23.862,-5.6813,-0.058951],[31.316,-9.5368,-0.047364],[31.937,-4.9803,0.033743],[30.384,2.3804,0.045329],[32.248,9.04,0.010569],[36.596,12.896,-0.024191],[40.633,10.793,-0.024191],[42.186,5.5349,-0.012604],[38.149,-8.8358,0.080089],[28.21,-9.8873,0.045329],[31.937,0.62783,-0.001017],[19.824,-8.4853,-0.024191],[28.21,-0.42369,-0.035777],[31.005,13.597,-0.024191],[28.831,10.442,-0.024191],[23.862,10.091,-0.012604],[20.446,9.04,-0.012604],[17.961,7.2874,0.010569],[16.408,6.2359,0.010569],[14.855,4.4834,0.022156],[13.923,3.0814,0.022156],[13.302,4.1329,-0.024191],[12.371,5.1844,-0.070537],[10.507,4.4834,-0.047364],[9.5753,1.6793,-0.035777],[9.2647,-5.3308,-0.012604],[12.06,-8.4853,0.022156],[12.371,-6.7328,-0.001017],[13.923,-4.9803,-0.001017],[13.302,-6.0318,0.022156],[14.545,-9.5368,0.033743],[17.34,-12.691,0.010569],[18.893,-14.794,-0.012604],[19.824,-16.547,-0.001017],[20.756,-15.495,-0.001017],[22.93,-13.743,-0.012604],[25.725,-13.042,-0.024191],[27.899,-13.042,-0.012604],[28.21,-11.64,0.54356],[17.34,1.6793,-0.3602],[20.446,0.62783,-0.012604],[28.521,-4.9803,-0.047364],[36.596,-9.5368,-0.047364],[36.596,-4.6298,0.022156],[34.732,3.4319,0.045329],[36.596,10.091,0.010569],[41.565,13.597,-0.024191],[45.602,11.844,-0.024191],[47.777,6.9369,-0.012604],[42.807,-8.1348,0.080089],[33.179,-9.1863,0.033743],[36.596,0.97834,-0.001017],[23.862,-8.8358,-0.024191],[32.248,-0.073181,-0.035777],[34.422,15.349,-0.024191],[31.937,12.195,-0.024191],[26.657,11.494,-0.024191],[23.241,9.741,-0.012604],[20.756,7.9885,0.010569],[19.203,6.5864,0.010569],[18.893,4.8339,0.022156],[17.961,3.7824,0.022156],[17.34,4.8339,-0.012604],[16.097,6.9369,-0.058951],[13.923,6.2359,-0.035777],[13.302,3.4319,-0.035777],[12.992,-4.2793,-0.012604],[15.166,-7.7843,0.022156],[15.476,-6.7328,0.010569],[17.029,-4.6298,-0.001017],[16.719,-5.6813,0.022156],[17.961,-8.8358,0.022156],[20.756,-11.64,0.010569],[22.309,-14.794,-0.012604],[22.93,-16.897,-0.001017],[24.794,-15.846,-0.001017],[27.278,-14.444,-0.012604],[30.695,-13.392,-0.024191],[33.179,-14.093,-0.001017],[34.111,-12.691,0.52038],[21.998,2.7309,-0.3602],[24.794,1.3288,-0.001017],[33.179,-4.9803,-0.047364],[42.497,-9.5368,-0.035777],[42.186,-4.2793,0.022156],[40.012,4.1329,0.033743],[41.565,10.793,0.010569],[45.913,13.947,-0.012604],[50.261,12.545,-0.024191],[52.435,7.9885,-0.012604],[47.777,-7.0833,0.056916],[38.459,-8.1348,0.022156],[41.565,0.97834,-0.001017],[27.899,-8.8358,-0.024191],[35.664,-0.073181,-0.024191],[37.838,16.05,-0.024191],[34.422,13.246,-0.024191],[29.763,12.195,-0.024191],[26.347,10.442,-0.012604],[23.241,8.339,-0.001017],[22.62,6.5864,0.010569],[22.62,4.8339,0.022156],[21.998,4.1329,0.010569],[21.377,5.5349,-0.012604],[20.135,7.6379,-0.047364],[18.272,7.2874,-0.035777],[17.34,4.4834,-0.035777],[17.029,-3.9287,-0.012604],[19.824,-8.1348,0.010569],[20.135,-7.4338,-0.001017],[21.067,-5.3308,-0.001017],[20.756,-6.3823,0.010569],[21.067,-9.5368,0.022156],[24.173,-13.042,-0.001017],[25.725,-16.196,-0.012604],[26.347,-17.949,-0.001017],[28.21,-17.248,-0.012604],[31.316,-15.495,-0.012604],[34.732,-14.444,-0.024191],[37.217,-15.145,-0.001017],[38.459,-13.042,0.46245],[25.725,3.0814,-0.31386],[28.831,1.6793,-0.001017],[37.838,-5.3308,-0.035777],[47.777,-10.588,-0.024191],[47.777,-4.6298,0.010569],[44.981,3.7824,0.022156],[46.224,10.793,0.010569],[50.572,13.947,-0.012604],[54.92,12.896,-0.012604],[57.715,9.04,-0.012604],[52.125,-5.6813,0.033743],[43.739,-6.7328,0.010569],[45.913,1.6793,-0.001017],[30.695,-9.1863,-0.024191],[38.459,0.27732,-0.024191],[40.323,17.102,-0.024191],[36.596,13.947,-0.035777],[31.316,12.896,-0.024191],[28.521,10.793,-0.012604],[26.036,8.339,-0.001017],[25.104,6.9369,0.010569],[25.725,5.1844,0.022156],[25.725,4.1329,0.010569],[25.104,6.5864,-0.012604],[23.862,8.6895,-0.035777],[21.377,8.6895,-0.024191],[21.067,6.5864,-0.035777],[20.135,-2.1762,-0.012604],[22.62,-7.7843,0.010569],[23.241,-7.4338,-0.001017],[24.794,-5.6813,-0.001017],[24.483,-6.7328,0.010569],[25.725,-10.238,0.022156],[28.521,-13.042,-0.001017],[29.763,-16.547,-0.012604],[30.384,-18.65,-0.012604],[32.248,-16.897,-0.012604],[35.043,-15.145,-0.012604],[39.08,-14.093,-0.012604],[41.565,-14.093,-0.001017],[42.186,-12.341,0.36976],[27.278,3.4319,-0.26751],[30.695,1.6793,-0.001017],[39.08,-5.6813,-0.024191],[49.64,-10.939,-0.012604],[49.951,-5.6813,0.010569],[48.087,2.7309,0.010569],[49.64,9.3905,0.010569],[53.988,12.195,-0.001017],[58.647,12.896,-0.012604],[61.442,9.741,-0.012604],[55.852,-4.2793,0.022156],[48.398,-5.6813,-0.001017],[49.64,0.27732,-0.001017],[34.732,-9.8873,-0.024191],[42.186,-1.1247,-0.012604],[43.118,15.7,-0.012604],[40.012,14.298,-0.035777],[34.732,13.597,-0.024191],[31.937,11.844,-0.012604],[30.074,9.741,-0.001017],[29.142,7.9885,0.010569],[29.763,6.9369,0.010569],[29.142,5.5349,0.010569],[28.521,7.9885,-0.001017],[26.657,10.792,-0.024191],[23.862,10.792,-0.024191],[22.93,8.339,-0.024191],[21.377,-1.1247,-0.012604],[24.173,-7.0833,0.010569],[25.104,-6.7328,-0.001017],[26.657,-5.3308,-0.001017],[26.968,-6.7328,0.010569],[28.21,-10.238,0.010569],[30.695,-13.042,-0.001017],[31.937,-16.547,-0.012604],[32.248,-18.299,-0.012604],[33.179,-15.846,-0.012604],[36.285,-13.392,-0.012604],[40.012,-12.341,-0.012604],[41.876,-12.341,-0.001017],[42.497,-10.939,0.27706],[26.657,3.0814,-0.22116],[29.763,0.97834,-0.001017],[37.838,-6.0318,-0.012604],[47.466,-10.939,-0.012604],[48.708,-6.7328,-0.001017],[48.398,0.27732,0.010569],[50.572,6.2359,0.010569],[55.852,9.04,-0.001017],[61.442,12.195,-0.012604],[64.237,10.091,-0.012604],[59.268,-2.5267,-0.001017],[52.435,-5.6813,-0.012604],[52.746,-2.1762,0.010569],[40.323,-11.289,-0.024191],[46.534,-3.5782,-0.012604],[46.534,11.844,-0.001017],[44.36,13.947,-0.024191],[40.323,14.999,-0.024191],[36.906,13.597,-0.012604],[34.732,12.195,-0.001017],[33.8,10.091,-0.001017],[33.8,9.3905,0.010569],[32.869,8.6895,0.010569],[32.248,11.143,-0.001017],[29.142,13.947,-0.012604],[24.794,13.246,-0.012604],[23.862,9.741,-0.012604],[21.377,0.62783,-0.012604],[24.483,-6.0318,0.010569],[25.104,-6.3823,0.010569],[26.968,-4.9803,-0.001017],[27.899,-6.7328,0.010569],[29.142,-9.8873,0.010569],[31.005,-12.691,-0.001017],[31.316,-16.547,-0.012604],[31.316,-17.598,-0.012604],[32.248,-13.743,-0.012604],[34.422,-10.238,-0.012604],[37.217,-9.8873,-0.012604],[38.459,-9.8873,-0.001017],[40.012,-9.5368,0.18437],[22.93,3.0814,-0.1864],[26.036,0.97834,-0.001017],[32.558,-4.9803,-0.001017],[40.633,-9.5368,-0.001017],[43.118,-6.7328,-0.001017],[44.671,-1.8257,-0.001017],[47.777,2.0299,-0.001017],[52.435,4.8339,-0.001017],[57.715,8.339,-0.001017],[60.821,7.9885,-0.001017],[56.783,-1.4752,-0.012604],[51.814,-2.5267,-0.012604],[51.503,0.27732,-0.001017],[42.186,-4.6298,-0.012604],[44.981,0.62783,-0.001017],[42.497,10.091,-0.001017],[38.459,10.792,-0.012604],[35.975,10.792,-0.024191],[32.558,10.091,-0.001017],[30.384,8.6895,-0.001017],[28.521,7.2874,-0.001017],[26.968,7.2874,0.010569],[25.725,7.9885,0.010569],[24.173,11.494,-0.001017],[21.377,15.349,-0.001017],[17.961,15.349,-0.001017],[17.961,12.896,-0.012604],[17.029,3.7824,-0.001017],[21.377,-4.6298,-0.001017],[22.309,-5.3308,-0.001017],[24.173,-4.6298,-0.001017],[24.483,-6.7328,-0.001017],[26.347,-9.5368,-0.001017],[27.899,-11.64,-0.001017],[27.899,-14.794,-0.001017],[26.657,-14.794,-0.012604],[26.968,-9.8873,-0.012604],[29.763,-7.4338,-0.012604],[32.248,-7.4338,-0.012604],[33.179,-7.4338,-0.001017],[35.664,-7.7843,0.12644],[18.272,3.0814,-0.16323],[20.756,0.62783,-0.001017],[26.347,-3.9287,-0.001017],[32.558,-7.4338,-0.001017],[36.285,-6.7328,-0.012604],[39.08,-4.2793,-0.012604],[43.118,-1.8257,-0.001017],[47.777,0.27732,-0.001017],[52.125,3.4319,-0.001017],[55.852,4.4834,-0.001017],[53.678,-0.42369,-0.024191],[49.64,0.62783,-0.012604],[48.398,5.1844,-0.001017],[42.807,4.8339,-0.012604],[41.565,7.2874,-0.001017],[36.285,8.6895,-0.001017],[29.763,6.9369,-0.012604],[28.521,5.5349,-0.024191],[25.104,4.4834,-0.001017],[22.309,3.4319,-0.001017],[18.893,2.3804,-0.001017],[16.408,3.4319,-0.001017],[13.923,6.5864,-0.001017],[12.06,11.143,-0.001017],[10.196,16.05,-0.001017],[8.333,17.102,-0.001017],[10.196,16.751,-0.001017],[11.128,8.339,-0.012604],[17.029,-2.5267,-0.012604],[18.582,-4.2793,-0.012604],[19.824,-4.2793,-0.001017],[20.446,-6.7328,-0.012604],[22.309,-9.1863,-0.012604],[23.241,-10.588,-0.012604],[22.62,-12.341,-0.012604],[20.756,-10.588,-0.012604],[20.446,-5.6813,-0.012604],[22.93,-4.2793,-0.012604],[26.347,-4.6298,-0.001017],[27.899,-4.6298,-0.001017],[30.695,-6.0318,0.091676],[2.1214,0.62783,-0.001017],[2.1214,0.97833,-0.001017],[3.0531,3.0814,-0.001017],[2.432,2.3804,-0.001017],[0.87909,0.27732,-0.001017],[0.25794,-0.42369,-0.001017],[0.56851,0.62783,-0.001017],[2.1214,1.3288,-0.001017],[2.7426,0.27732,-0.001017],[2.1214,-0.42369,-0.001017],[2.1214,-2.1762,-0.001017],[-0.36322,-1.4752,-0.001017],[1.1897,2.3804,-0.001017],[-0.36322,0.97833,-0.001017],[-2.2267,-0.073182,-0.001017],[-2.5373,-1.1247,-0.001017],[0.56851,-1.8257,-0.001017],[3.6743,-0.073182,-0.001017],[5.2272,-0.42369,-0.001017],[3.0531,-0.073182,-0.001017],[0.56851,3.0814,-0.001017],[-2.5373,3.4319,-0.001017],[-4.7113,4.8339,-0.001017],[-5.0219,6.2359,-0.001017],[-2.8479,4.8339,-0.001017],[-0.6738,4.1329,-0.001017],[0.56851,3.7824,-0.001017],[2.432,-1.1247,-0.001017],[1.1897,-1.8257,-0.001017],[0.25794,-2.5267,-0.001017],[0.25794,-3.2277,-0.001017],[1.1897,-2.5267,-0.001017],[2.1214,-2.5267,-0.001017],[2.7426,-1.8257,-0.001017],[2.7426,-1.8257,-0.001017],[2.7426,-1.4752,-0.001017],[2.1214,-0.42369,-0.001017],[1.5003,0.62783,-0.001017],[1.1897,2.0299,-0.001017],[0.56851,1.6793,-0.001017],[-1.6055,1.3288,-0.001017],[2.1214,0.62783,-0.047364],[3.0531,0.62783,-0.024191],[4.9166,2.0299,-0.012604],[5.2272,1.3288,0.022156],[4.2955,0.27732,0.022156],[4.2955,0.62783,0.010569],[5.2272,2.3804,-0.012604],[7.0907,3.0814,-0.012604],[8.6436,2.3804,0.010569],[7.0907,1.3288,0.010569],[6.7801,-1.8257,0.022156],[2.432,-3.2277,-0.001017],[4.2955,-3.2277,-0.035777],[1.5003,-4.2793,-0.001017],[0.56851,-5.6813,-0.001017],[3.0531,-2.5267,-0.012604],[3.3637,-1.8257,-0.012604],[3.6743,-0.073181,-0.001017],[5.2272,-0.42369,-0.001017],[3.0531,-0.073181,-0.001017],[0.56851,3.0814,-0.001017],[-1.295,4.4834,0.010569],[-2.5373,7.6379,0.010569],[-2.2267,9.04,-0.012604],[-1.295,9.04,-0.035777],[-0.36322,6.5864,-0.024191],[-0.6738,3.4319,-0.012604],[-0.6738,0.27732,-0.012604],[-0.36322,-1.1247,-0.012604],[-1.295,-1.8257,-0.001017],[-2.8479,-3.2277,-0.012604],[-2.8479,-4.2793,-0.012604],[-3.1584,-4.9803,-0.012604],[-2.2267,-6.3823,-0.012604],[-2.5373,-5.3308,-0.012604],[-3.1584,-4.6298,-0.001017],[-4.4008,-3.5782,-0.012604],[-3.1584,-2.1762,-0.012604],[-2.2267,-1.1247,-0.012604],[-1.6055,-1.1247,-0.001017],[-3.469,-1.4752,0.11485],[2.432,-2.1762,-0.11688],[4.606,-3.9287,-0.035777],[8.6436,-4.6298,-0.012604],[10.196,-4.6298,0.045329],[10.507,-3.9287,0.056916],[12.06,-1.8257,0.010569],[14.855,0.62783,-0.024191],[17.961,2.7309,-0.012604],[19.824,2.7309,0.010569],[18.272,-0.77419,0.010569],[17.34,-4.2793,0.033743],[9.2647,-7.0833,-0.012604],[10.196,-6.7328,-0.058951],[4.2955,-7.0833,-0.001017],[4.2955,-9.5368,-0.001017],[8.333,-3.5782,-0.024191],[9.2647,0.27732,-0.035777],[7.0907,-0.42369,-0.035777],[7.4013,-0.42369,-0.001017],[6.7801,0.62783,0.010569],[5.5378,3.4319,0.010569],[3.6743,4.8339,0.033743],[2.7426,7.9885,0.022156],[3.3637,10.442,-0.012604],[2.7426,12.195,-0.047364],[3.0531,9.04,-0.035777],[2.1214,3.4319,-0.024191],[2.1214,-2.5267,-0.024191],[1.1897,-4.9803,-0.012604],[-0.98438,-4.9803,0.010569],[-2.8479,-4.6298,-0.012604],[-3.7796,-4.2793,-0.012604],[-3.1584,-6.7328,-0.024191],[-1.6055,-8.4853,-0.024191],[-1.6055,-7.0833,-0.012604],[-3.469,-6.3823,-0.001017],[-5.0219,-6.7328,-0.012604],[-3.469,-7.0833,-0.024191],[-1.6055,-6.7328,-0.012604],[-0.6738,-6.3823,0.010569],[-1.295,-4.2793,0.25389],[4.9166,-2.1762,-0.17482],[8.0224,-4.9803,-0.047364],[12.371,-7.4338,-0.012604],[12.992,-6.3823,0.056916],[12.681,-2.8772,0.080089],[15.166,-1.4752,0.022156],[19.824,0.62783,-0.024191],[24.173,3.4319,-0.012604],[26.347,5.1844,0.022156],[24.794,1.6793,0.022156],[23.862,-1.1247,0.045329],[13.302,-5.6813,-0.012604],[13.302,-5.3308,-0.070537],[7.4013,-6.3823,-0.001017],[8.6436,-7.7843,-0.001017],[14.545,-0.77419,-0.024191],[14.545,3.0814,-0.047364],[12.992,3.0814,-0.058951],[12.371,2.7309,0.010569],[10.818,2.7309,0.022156],[9.2647,4.1329,0.022156],[7.4013,4.8339,0.033743],[6.1589,7.2874,0.022156],[5.5378,8.6895,-0.012604],[6.1589,9.04,-0.058951],[6.7801,6.2359,-0.047364],[7.0907,0.97834,-0.024191],[8.0224,-6.3823,-0.035777],[7.4013,-8.1348,-0.012604],[5.2272,-6.7328,0.022156],[2.7426,-6.3823,-0.012604],[1.1897,-7.0833,-0.012604],[1.1897,-10.588,-0.024191],[2.432,-12.341,-0.035777],[2.1214,-10.238,-0.012604],[0.87909,-9.5368,-0.001017],[0.56851,-8.8358,-0.012604],[1.5003,-8.8358,-0.024191],[3.6743,-9.1863,-0.012604],[4.9166,-8.4853,0.010569],[3.6743,-5.3308,0.35817],[7.4013,-2.5267,-0.22116],[10.818,-6.3823,-0.047364],[16.408,-10.588,-0.024191],[16.408,-8.1348,0.080089],[15.166,-2.1762,0.080089],[17.961,-0.42369,0.033743],[23.862,0.62783,-0.024191],[29.142,3.7824,-0.012604],[32.248,6.9369,0.022156],[31.937,3.0814,0.022156],[30.695,0.62783,0.056916],[18.893,-6.3823,-0.012604],[19.824,-6.3823,-0.082124],[12.681,-7.4338,-0.001017],[15.166,-7.4338,-0.012604],[21.998,3.4319,-0.035777],[21.998,7.9885,-0.047364],[19.203,8.339,-0.047364],[16.408,6.2359,0.010569],[13.923,4.8339,0.022156],[12.371,4.4834,0.022156],[10.818,4.8339,0.033743],[9.2647,6.2359,0.022156],[8.6436,7.2874,-0.024191],[8.333,6.9369,-0.070537],[8.9541,3.7824,-0.058951],[9.2647,-0.77419,-0.035777],[10.818,-9.1863,-0.047364],[11.128,-11.289,-0.012604],[10.196,-8.8358,0.022156],[7.4013,-7.7843,-0.012604],[5.5378,-8.4853,-0.012604],[5.5378,-13.042,-0.035777],[6.4695,-14.794,-0.047364],[6.4695,-13.042,-0.024191],[5.5378,-12.341,-0.001017],[5.5378,-10.939,-0.012604],[7.0907,-10.588,-0.024191],[9.2647,-10.588,-0.012604],[10.507,-9.5368,0.010569],[9.2647,-6.0318,0.45086],[9.2647,-1.8257,-0.26751],[13.302,-6.7328,-0.047364],[19.824,-12.691,-0.024191],[19.203,-8.8358,0.080089],[17.34,-1.4752,0.080089],[20.756,0.97834,0.033743],[27.899,2.0299,-0.012604],[33.8,5.5349,-0.012604],[37.838,9.04,0.010569],[37.838,5.5349,0.022156],[36.596,3.0814,0.056916],[24.794,-5.3308,-0.012604],[25.725,-5.6813,-0.082124],[17.961,-6.7328,-0.001017],[21.998,-5.3308,-0.012604],[27.278,7.6379,-0.035777],[26.347,11.494,-0.035777],[22.93,11.494,-0.024191],[18.582,8.339,-0.001017],[16.097,6.9369,0.010569],[13.923,4.8339,0.022156],[12.371,4.4834,0.033743],[10.818,4.4834,0.022156],[10.507,4.8339,-0.024191],[10.196,4.8339,-0.082124],[10.196,2.7309,-0.070537],[10.196,-1.4752,-0.047364],[11.128,-8.8358,-0.047364],[12.371,-11.289,-0.024191],[12.06,-8.4853,0.033743],[10.196,-7.4338,-0.001017],[8.6436,-8.8358,-0.012604],[8.9541,-14.444,-0.035777],[10.507,-17.248,-0.047364],[11.128,-16.547,-0.024191],[11.128,-15.846,-0.001017],[11.128,-14.444,-0.024191],[12.681,-13.042,-0.024191],[14.545,-12.691,-0.012604],[14.855,-10.238,0.010569],[13.302,-6.3823,0.49721],[12.06,-1.8257,-0.30227],[16.719,-7.0833,-0.047364],[23.862,-14.093,-0.024191],[22.62,-9.5368,0.080089],[20.446,-0.42369,0.080089],[24.173,2.3804,0.022156],[31.937,2.7309,-0.012604],[38.459,5.5349,-0.012604],[43.118,9.3905,0.010569],[43.739,6.2359,0.010569],[42.497,3.4319,0.045329],[30.074,-6.0318,-0.012604],[31.316,-6.0318,-0.082124],[22.93,-7.7843,-0.012604],[26.968,-4.6298,-0.012604],[32.248,10.442,-0.035777],[30.074,14.298,-0.024191],[26.347,13.947,-0.024191],[21.377,10.091,-0.001017],[18.582,8.339,0.010569],[16.408,6.2359,0.022156],[14.855,4.8339,0.022156],[13.302,4.1329,0.010569],[12.992,4.1329,-0.035777],[12.681,4.4834,-0.082124],[11.439,3.0814,-0.082124],[11.439,-0.77419,-0.047364],[12.371,-8.1348,-0.047364],[13.923,-10.588,-0.024191],[14.234,-7.4338,0.033743],[12.681,-5.6813,-0.001017],[11.128,-7.4338,-0.012604],[12.06,-13.743,-0.024191],[14.234,-16.897,-0.047364],[15.166,-16.897,-0.024191],[16.097,-17.248,-0.001017],[17.029,-16.547,-0.024191],[18.582,-15.145,-0.024191],[20.446,-14.794,-0.012604],[20.446,-12.691,-0.001017],[18.272,-7.7843,0.53197],[15.166,-1.1247,-0.33703],[20.446,-6.7328,-0.047364],[28.521,-14.794,-0.024191],[26.968,-9.5368,0.056916],[24.483,0.62783,0.056916],[27.899,3.4319,0.022156],[35.664,3.4319,-0.012604],[43.118,6.2359,-0.012604],[48.398,9.3905,-0.001017],[49.019,6.5864,0.010569],[48.087,3.4319,0.033743],[35.043,-6.3823,-0.012604],[36.906,-6.3823,-0.070537],[28.21,-8.1348,-0.012604],[32.248,-4.2793,-0.012604],[36.285,12.896,-0.035777],[33.179,16.751,-0.024191],[29.763,16.05,-0.024191],[24.794,11.844,-0.001017],[21.377,9.3905,0.022156],[19.203,7.2874,0.022156],[18.272,5.5349,0.022156],[16.719,4.1329,0.010569],[16.097,4.1329,-0.035777],[15.476,4.8339,-0.082124],[13.923,3.7824,-0.070537],[13.923,0.62783,-0.047364],[14.545,-6.7328,-0.047364],[16.097,-9.8873,-0.024191],[17.029,-6.3823,0.033743],[16.097,-4.2793,0.010569],[14.545,-6.0318,-0.001017],[15.166,-11.64,-0.024191],[17.961,-15.495,-0.047364],[19.203,-16.196,-0.024191],[20.756,-17.248,-0.001017],[22.309,-17.248,-0.024191],[24.173,-16.547,-0.024191],[26.347,-16.196,-0.012604],[26.347,-14.444,-0.001017],[23.862,-8.8358,0.55514],[19.203,-0.42369,-0.34862],[24.794,-6.3823,-0.035777],[33.179,-14.794,-0.012604],[31.937,-9.1863,0.045329],[28.521,1.6793,0.045329],[31.937,4.8339,0.010569],[39.701,4.4834,-0.012604],[47.777,6.5864,-0.012604],[52.746,9.3905,-0.001017],[54.609,7.2874,-0.001017],[53.678,4.1329,0.033743],[40.944,-6.0318,-0.012604],[42.807,-5.6813,-0.058951],[34.111,-7.7843,-0.012604],[37.217,-2.8772,-0.012604],[40.633,15.349,-0.035777],[36.906,18.504,-0.035777],[32.558,17.452,-0.024191],[28.21,13.246,-0.001017],[24.483,10.442,0.022156],[22.62,7.9885,0.022156],[21.377,6.2359,0.022156],[20.446,4.4834,0.010569],[19.824,4.4834,-0.035777],[18.893,6.2359,-0.082124],[16.719,5.1844,-0.070537],[16.408,2.3804,-0.035777],[17.34,-6.0318,-0.047364],[19.203,-9.5368,-0.024191],[20.756,-5.3308,0.022156],[19.203,-3.5782,0.010569],[17.961,-5.3308,-0.001017],[18.582,-10.588,-0.024191],[21.377,-14.794,-0.035777],[22.93,-15.846,-0.024191],[25.104,-17.248,-0.001017],[26.968,-17.598,-0.024191],[29.142,-17.598,-0.024191],[31.316,-17.248,-0.001017],[32.248,-14.794,-0.001017],[29.763,-9.1863,0.54356],[23.241,0.27732,-0.33703],[29.142,-6.3823,-0.024191],[38.459,-15.495,-0.012604],[36.596,-9.5368,0.045329],[32.869,2.3804,0.045329],[35.664,5.5349,0.010569],[43.118,5.1844,-0.012604],[50.882,6.5864,-0.012604],[56.473,9.741,-0.001017],[58.647,8.339,-0.001017],[57.404,5.1844,0.022156],[45.913,-4.9803,-0.012604],[48.087,-4.6298,-0.058951],[39.701,-7.4338,-0.012604],[41.876,-2.1762,-0.012604],[44.36,16.401,-0.035777],[40.323,19.555,-0.035777],[35.975,18.153,-0.024191],[31.005,13.597,-0.001017],[27.278,10.793,0.010569],[26.036,7.9885,0.022156],[25.104,6.5864,0.022156],[24.483,4.8339,0.010569],[24.173,5.5349,-0.024191],[22.62,7.2874,-0.070537],[20.446,6.9369,-0.058951],[20.446,3.4319,-0.035777],[21.998,-5.6813,-0.035777],[24.173,-9.8873,-0.024191],[25.725,-5.3308,0.022156],[23.862,-3.9287,0.010569],[21.998,-6.0318,-0.001017],[22.309,-11.289,-0.024191],[25.104,-15.495,-0.035777],[26.968,-16.897,-0.024191],[29.142,-18.299,-0.001017],[31.316,-19,-0.024191],[33.8,-19,-0.012604],[35.664,-17.949,0.010569],[35.975,-15.495,-0.001017],[34.111,-10.238,0.49721],[26.657,0.97834,-0.29068],[32.869,-6.3823,-0.012604],[43.118,-16.547,-0.012604],[41.876,-10.238,0.033743],[37.838,2.3804,0.033743],[39.701,6.2359,0.010569],[46.534,5.1844,-0.001017],[54.299,6.5864,-0.012604],[59.579,9.741,-0.012604],[62.063,9.3905,-0.001017],[60.51,6.9369,0.010569],[49.951,-3.5782,-0.012604],[51.814,-3.5782,-0.047364],[43.118,-7.4338,-0.012604],[44.36,-1.8257,-0.012604],[46.224,17.452,-0.035777],[41.565,20.256,-0.035777],[36.596,18.504,-0.024191],[31.937,13.947,-0.001017],[28.21,10.442,0.010569],[26.968,7.6379,0.010569],[26.657,5.5349,0.022156],[26.657,4.4834,0.010569],[26.347,6.2359,-0.024191],[25.725,8.339,-0.058951],[24.173,7.9885,-0.047364],[24.483,5.1844,-0.024191],[25.725,-4.6298,-0.035777],[28.521,-10.238,-0.024191],[29.763,-6.0318,0.010569],[27.899,-4.6298,0.010569],[26.347,-7.0833,-0.001017],[26.968,-12.341,-0.012604],[29.763,-16.196,-0.035777],[31.316,-17.949,-0.024191],[33.179,-18.65,-0.001017],[35.975,-19.351,-0.024191],[38.149,-19,-0.012604],[39.08,-17.248,0.010569],[40.012,-14.093,-0.012604],[38.459,-10.238,0.42769],[28.21,0.97834,-0.24434],[34.111,-6.3823,0.010569],[44.36,-16.547,-0.012604],[44.05,-11.289,0.022156],[40.633,0.62783,0.022156],[42.497,4.4834,0.010569],[48.708,4.1329,-0.001017],[56.162,4.8339,-0.001017],[61.753,8.339,-0.012604],[65.169,9.741,-0.012604],[62.374,7.6379,0.010569],[53.367,-2.5267,-0.012604],[54.299,-3.5782,-0.035777],[46.534,-8.1348,-0.012604],[46.534,-1.8257,-0.012604],[46.845,16.401,-0.035777],[42.186,18.854,-0.035777],[38.459,18.504,-0.024191],[33.8,14.999,-0.001017],[30.695,11.494,0.010569],[29.763,8.6895,0.010569],[29.763,6.9369,0.022156],[29.763,6.2359,0.010569],[29.763,8.339,-0.012604],[28.521,10.792,-0.047364],[26.347,10.091,-0.035777],[26.657,7.2874,-0.024191],[27.899,-3.5782,-0.024191],[31.005,-10.238,-0.012604],[32.248,-5.6813,0.010569],[30.695,-4.6298,0.010569],[29.142,-7.4338,-0.001017],[30.074,-12.691,-0.012604],[32.248,-16.547,-0.024191],[34.111,-17.949,-0.012604],[35.664,-18.299,-0.001017],[37.217,-18.299,-0.024191],[39.701,-17.248,-0.012604],[40.012,-14.794,0.010569],[40.323,-12.341,-0.012604],[39.701,-10.238,0.35817],[26.657,0.97834,-0.19799],[32.558,-6.0318,0.022156],[42.186,-15.846,-0.012604],[43.118,-12.691,0.010569],[42.497,-2.5267,0.010569],[44.671,0.97834,0.010569],[50.261,1.6793,-0.001017],[57.404,2.3804,-0.001017],[62.374,5.5349,-0.001017],[66.722,9.741,-0.012604],[63.616,7.2874,-0.001017],[56.473,-3.5782,-0.012604],[56.473,-4.9803,-0.024191],[50.261,-9.8873,-0.012604],[48.708,-3.2277,-0.012604],[47.777,13.246,-0.024191],[42.807,15.7,-0.024191],[41.876,18.504,-0.024191],[37.838,17.102,-0.001017],[35.043,14.298,0.010569],[34.111,11.143,-0.001017],[33.8,10.091,0.010569],[33.8,9.741,0.010569],[33.179,12.195,-0.012604],[31.005,14.999,-0.024191],[27.278,13.246,-0.024191],[27.278,9.3905,-0.012604],[28.21,-2.1762,-0.012604],[32.248,-10.238,-0.012604],[33.179,-4.9803,0.010569],[32.248,-3.5782,0.010569],[30.695,-6.7328,0.010569],[31.937,-12.341,-0.012604],[33.179,-15.846,-0.012604],[35.043,-16.897,-0.012604],[35.043,-16.547,-0.001017],[36.285,-15.846,-0.012604],[37.838,-14.093,-0.001017],[36.906,-10.939,0.010569],[36.906,-9.8873,-0.012604],[37.838,-9.8873,0.27706],[23.241,0.97834,-0.17482],[28.521,-4.9803,0.033743],[36.285,-13.042,-0.001017],[38.459,-11.64,-0.001017],[40.012,-5.3308,-0.001017],[42.807,-2.1762,-0.001017],[47.777,-1.4752,-0.001017],[53.988,-0.42369,-0.001017],[58.647,2.3804,-0.001017],[63.305,6.9369,-0.012604],[60.821,6.5864,-0.001017],[55.852,-0.77419,-0.012604],[54.609,-0.42369,-0.012604],[49.64,-2.8772,-0.012604],[46.845,2.7309,-0.012604],[44.05,14.298,-0.012604],[38.459,12.545,-0.024191],[37.838,12.896,-0.012604],[33.8,12.896,-0.001017],[31.005,11.494,-0.001017],[28.831,9.3905,-0.001017],[26.968,9.04,0.010569],[26.036,9.741,-0.001017],[24.794,12.896,-0.001017],[22.93,16.751,-0.012604],[19.824,15.349,-0.012604],[20.756,12.195,-0.001017],[23.862,-0.42369,-0.012604],[30.384,-8.4853,-0.001017],[32.248,-2.1762,-0.001017],[30.074,-1.8257,-0.001017],[27.899,-6.0318,-0.001017],[28.521,-10.939,-0.001017],[30.384,-14.093,-0.012604],[31.316,-14.093,-0.012604],[31.005,-12.691,-0.012604],[31.937,-11.64,-0.012604],[32.869,-10.588,-0.001017],[32.248,-8.4853,-0.001017],[32.248,-7.7843,-0.012604],[33.8,-9.1863,0.2423],[19.203,0.97834,-0.16323],[23.862,-3.5782,0.033743],[30.074,-9.5368,-0.001017],[32.869,-10.238,-0.012604],[35.975,-7.4338,-0.012604],[39.08,-5.6813,-0.012604],[44.05,-4.6298,-0.001017],[49.019,-3.5782,-0.001017],[53.678,-1.1247,-0.001017],[57.404,3.4319,-0.001017],[57.404,5.1844,-0.012604],[53.367,3.0814,-0.012604],[51.503,6.2359,-0.001017],[47.466,6.9369,-0.012604],[43.118,11.143,-0.012604],[38.77,16.401,-0.012604],[32.558,9.741,-0.024191],[31.316,4.8339,-0.012604],[27.278,7.2874,-0.001017],[23.862,6.5864,-0.001017],[19.824,5.5349,-0.001017],[16.097,6.2359,-0.001017],[13.923,8.339,-0.001017],[12.06,12.545,-0.001017],[11.128,17.803,-0.001017],[8.9541,17.102,-0.001017],[11.439,15.7,-0.001017],[17.961,2.3804,-0.001017],[26.968,-6.3823,-0.001017],[29.763,0.27732,-0.012604],[26.657,-0.073181,-0.012604],[23.862,-5.6813,-0.001017],[23.241,-9.8873,-0.001017],[24.794,-11.64,-0.001017],[25.725,-10.238,-0.001017],[25.104,-7.7843,-0.012604],[26.036,-6.7328,-0.001017],[26.968,-7.7843,-0.001017],[26.036,-6.3823,-0.012604],[26.657,-5.6813,-0.012604],[29.142,-8.1348,0.21913],[3.0531,0.62783,-0.001017],[3.6743,1.6793,-0.001017],[3.0531,1.3288,-0.001017],[0.87909,-0.77419,-0.001017],[0.56851,-0.42369,-0.001017],[2.1214,0.27732,-0.001017],[2.432,0.97833,-0.001017],[0.87909,-0.77419,-0.001017],[0.87909,-1.4752,-0.001017],[2.1214,-2.1762,-0.001017],[3.3637,-1.8257,-0.001017],[3.0531,-0.42369,-0.001017],[0.87909,1.3288,-0.001017],[-2.2267,-1.1247,-0.001017],[-1.6055,-0.073182,-0.001017],[-1.6055,-1.8257,-0.001017],[1.1897,-0.073182,-0.001017],[5.5378,2.3804,-0.001017],[3.6743,-0.073182,-0.001017],[1.5003,0.97833,-0.001017],[-0.6738,2.7309,-0.001017],[-3.469,2.7309,-0.001017],[-3.7796,4.4834,-0.001017],[-3.469,5.5349,-0.001017],[-1.6055,4.8339,-0.001017],[-0.36322,4.8339,-0.001017],[-0.36322,4.1329,-0.001017],[0.87909,-0.42369,-0.001017],[-0.6738,-1.8257,-0.001017],[-0.6738,-2.1762,-0.001017],[0.56851,-2.5267,-0.001017],[2.432,-3.2277,-0.001017],[2.432,-1.4752,-0.001017],[3.0531,-1.1247,-0.001017],[2.432,-0.42369,-0.001017],[3.3637,-0.42369,-0.001017],[3.6743,0.97833,-0.001017],[3.6743,1.6793,-0.001017],[1.5003,2.0299,-0.001017],[-0.98438,1.3288,-0.001017],[-2.5373,1.6793,-0.001017],[3.3637,0.62783,-0.070537],[5.5378,0.62783,-0.001017],[5.5378,-0.073181,0.022156],[4.9166,-1.4752,0.022156],[6.1589,-0.77419,-0.012604],[7.4013,0.97834,-0.012604],[8.0224,1.6793,0.010569],[8.0224,-0.073181,0.010569],[9.2647,0.97834,-0.001017],[9.2647,-0.073181,-0.001017],[8.9541,-0.073181,-0.024191],[9.2647,-0.77419,0.010569],[4.2955,-1.4752,0.033743],[3.0531,-4.6298,-0.001017],[2.7426,-6.0318,-0.001017],[1.5003,-2.1762,-0.012604],[1.1897,-0.073181,-0.001017],[5.5378,2.3804,-0.001017],[3.6743,-0.073181,-0.001017],[1.5003,0.97834,-0.001017],[-0.36322,3.0814,-0.001017],[-1.6055,4.4834,0.010569],[-1.6055,6.5864,-0.001017],[-1.295,8.339,-0.012604],[-0.6738,11.844,-0.024191],[0.56851,7.6379,-0.012604],[-0.36322,3.4319,-0.012604],[0.25794,1.3288,-0.012604],[-0.6738,0.27732,-0.001017],[-1.295,-1.4752,-0.012604],[-2.2267,-2.1762,-0.024191],[-0.98438,-3.9287,-0.024191],[0.56851,-4.9803,-0.024191],[0.56851,-5.3308,-0.012604],[-0.98438,-3.9287,-0.012604],[-0.6738,-3.5782,-0.024191],[-0.36322,-1.8257,-0.012604],[-0.36322,-1.8257,-0.001017],[-2.5373,-1.8257,0.010569],[-3.7796,-1.1247,0.010569],[-4.4008,-0.073181,0.091676],[5.2272,-3.9287,-0.12847],[8.333,-6.0318,-0.001017],[10.196,-7.4338,0.056916],[10.818,-7.4338,0.033743],[13.302,-5.6813,-0.035777],[16.719,-3.5782,-0.035777],[17.961,-0.073181,0.022156],[18.582,0.97834,0.022156],[20.446,1.3288,-0.001017],[22.309,-1.8257,-0.001017],[22.93,-1.8257,-0.047364],[21.067,-3.2277,0.022156],[12.06,-0.77419,0.056916],[7.4013,-4.6298,-0.001017],[7.0907,-10.588,-0.001017],[5.2272,-2.5267,-0.024191],[5.2272,1.6793,-0.058951],[8.0224,2.3804,-0.012604],[7.0907,-1.1247,-0.001017],[7.0907,1.3288,0.010569],[5.5378,3.7824,0.022156],[3.6743,6.2359,0.022156],[4.2955,7.6379,-0.001017],[4.2955,10.442,-0.012604],[3.6743,12.896,-0.035777],[4.9166,10.442,-0.024191],[4.2955,4.4834,-0.012604],[3.3637,-1.8257,-0.012604],[1.1897,-3.9287,0.010569],[-0.36322,-3.2277,-0.012604],[-2.5373,-2.1762,-0.035777],[-1.295,-4.2793,-0.047364],[0.87909,-7.0833,-0.035777],[1.5003,-7.4338,-0.024191],[0.56851,-5.6813,-0.024191],[0.56851,-5.3308,-0.024191],[0.25793,-5.6813,-0.024191],[-0.6738,-6.7328,0.010569],[-3.1584,-7.4338,0.033743],[-5.0219,-6.3823,0.022156],[-4.4008,-3.9287,0.21913],[7.4013,-4.6298,-0.1864],[11.128,-8.1348,-0.001017],[12.371,-8.8358,0.080089],[11.439,-6.7328,0.045329],[14.234,-6.0318,-0.047364],[20.756,-6.3823,-0.047364],[26.036,-3.9287,0.022156],[29.142,-0.073181,0.022156],[32.248,2.7309,-0.001017],[32.248,0.62783,-0.001017],[30.695,1.3288,-0.047364],[26.036,-0.77419,0.033743],[14.855,3.0814,0.080089],[11.439,-2.8772,-0.001017],[10.196,-9.8873,-0.012604],[10.196,-1.1247,-0.047364],[9.5753,3.0814,-0.1053],[12.371,3.7824,-0.047364],[12.992,3.0814,0.010569],[12.681,3.7824,0.010569],[11.128,4.8339,0.033743],[8.9541,6.2359,0.033743],[8.6436,7.2874,-0.001017],[8.6436,9.04,-0.012604],[8.9541,9.3905,-0.047364],[10.196,7.2874,-0.035777],[10.507,1.3288,-0.024191],[10.818,-5.6813,-0.012604],[8.0224,-6.3823,0.022156],[6.4695,-4.6298,-0.012604],[3.3637,-4.6298,-0.047364],[2.7426,-7.0833,-0.058951],[4.2955,-10.939,-0.047364],[4.2955,-11.289,-0.024191],[3.3637,-9.5368,-0.024191],[3.6743,-8.8358,-0.024191],[3.6743,-8.4853,-0.024191],[3.3637,-9.8873,0.010569],[2.1214,-9.1863,0.033743],[0.25794,-7.0833,0.033743],[0.25794,-4.2793,0.335],[10.196,-4.9803,-0.23275],[13.923,-10.238,-0.001017],[14.545,-9.8873,0.080089],[12.371,-5.3308,0.056916],[14.545,-5.3308,-0.047364],[23.241,-7.7843,-0.047364],[31.005,-5.3308,0.022156],[35.975,0.62783,0.033743],[39.08,4.1329,0.010569],[40.633,2.3804,0.010569],[38.77,3.0814,-0.047364],[33.179,-1.1247,0.045329],[21.067,3.4319,0.080089],[18.272,-3.9287,-0.001017],[15.476,-11.289,-0.012604],[16.719,1.6793,-0.058951],[18.582,7.2874,-0.1053],[19.824,8.339,-0.047364],[19.824,8.339,0.010569],[17.34,6.5864,0.010569],[15.166,6.2359,0.033743],[13.923,6.2359,0.022156],[12.992,6.9369,-0.001017],[12.371,7.6379,-0.012604],[12.681,7.2874,-0.058951],[12.992,4.8339,-0.047364],[14.234,-0.77419,-0.035777],[15.166,-9.1863,-0.024191],[13.302,-10.588,0.022156],[12.681,-6.7328,-0.012604],[8.9541,-5.6813,-0.058951],[7.4013,-8.1348,-0.058951],[8.333,-13.743,-0.058951],[7.4013,-14.794,-0.035777],[7.0907,-13.392,-0.035777],[8.0224,-13.042,-0.035777],[8.333,-12.341,-0.035777],[8.6436,-12.341,0.010569],[7.4013,-10.588,0.033743],[5.5378,-7.7843,0.033743],[5.2272,-3.9287,0.43928],[12.06,-4.9803,-0.26751],[16.408,-11.64,-0.001017],[16.408,-10.939,0.080089],[13.302,-4.6298,0.056916],[16.097,-4.6298,-0.047364],[26.036,-7.4338,-0.047364],[35.043,-4.9803,0.022156],[41.565,2.3804,0.033743],[45.913,7.6379,0.010569],[47.777,6.5864,0.010569],[46.534,7.2874,-0.047364],[40.323,1.6793,0.045329],[27.278,6.9369,0.080089],[24.173,-1.8257,-0.001017],[22.62,-10.238,-0.012604],[23.862,6.5864,-0.058951],[25.104,11.143,-0.070537],[24.483,12.195,-0.035777],[22.93,11.494,0.010569],[20.135,8.6895,0.010569],[17.34,7.2874,0.022156],[15.476,6.5864,0.022156],[14.855,6.2359,-0.001017],[14.234,5.5349,-0.012604],[14.545,5.1844,-0.070537],[14.545,3.4319,-0.058951],[15.166,-1.8257,-0.047364],[16.408,-9.8873,-0.024191],[14.855,-11.64,0.022156],[15.166,-7.0833,-0.012604],[12.371,-6.0318,-0.058951],[11.128,-9.1863,-0.058951],[12.06,-16.196,-0.058951],[11.439,-18.299,-0.035777],[11.128,-17.598,-0.035777],[12.06,-16.897,-0.035777],[12.06,-14.794,-0.035777],[12.681,-13.743,-0.001017],[11.439,-11.289,0.033743],[9.2647,-7.4338,0.033743],[8.333,-3.5782,0.52038],[14.545,-4.9803,-0.29068],[19.203,-13.042,-0.001017],[19.203,-11.64,0.080089],[15.166,-3.5782,0.056916],[17.961,-3.9287,-0.047364],[29.142,-7.4338,-0.047364],[39.701,-4.9803,0.022156],[46.845,2.3804,0.033743],[51.814,7.2874,0.010569],[53.988,6.9369,0.010569],[52.746,7.2874,-0.035777],[46.224,0.62783,0.033743],[32.869,6.2359,0.056916],[28.831,-2.5267,-0.012604],[27.278,-10.588,-0.024191],[29.142,9.3905,-0.058951],[30.074,14.298,-0.058951],[28.521,15.349,-0.024191],[26.036,13.947,0.010569],[22.62,10.442,0.010569],[20.135,8.339,0.022156],[18.272,6.9369,0.022156],[17.029,5.1844,-0.001017],[16.719,4.4834,-0.024191],[16.719,4.1329,-0.070537],[16.097,3.0814,-0.070537],[16.408,-1.8257,-0.047364],[17.34,-9.5368,-0.035777],[16.408,-11.64,0.010569],[17.961,-6.7328,-0.012604],[15.166,-4.9803,-0.058951],[14.545,-8.1348,-0.058951],[15.166,-15.846,-0.058951],[15.166,-19,-0.035777],[15.476,-19,-0.035777],[16.719,-19,-0.035777],[17.029,-17.598,-0.035777],[18.272,-16.897,-0.001017],[17.029,-14.093,0.022156],[14.234,-8.8358,0.022156],[12.06,-4.2793,0.5899],[17.34,-4.9803,-0.31386],[22.93,-13.743,-0.001017],[22.62,-12.341,0.080089],[17.961,-2.5267,0.045329],[20.756,-2.5267,-0.035777],[32.248,-6.7328,-0.035777],[44.05,-4.9803,0.022156],[52.125,1.6793,0.022156],[57.404,6.5864,0.022156],[59.579,6.5864,0.010569],[58.647,6.9369,-0.035777],[52.125,-0.42369,0.033743],[38.77,4.8339,0.045329],[33.8,-3.5782,-0.012604],[32.248,-10.238,-0.024191],[33.8,11.844,-0.058951],[34.111,17.452,-0.058951],[32.248,17.803,-0.024191],[29.142,16.401,0.010569],[25.725,11.844,0.010569],[22.93,9.04,0.022156],[21.067,7.2874,0.022156],[20.135,5.1844,-0.012604],[19.203,4.1329,-0.024191],[18.893,4.1329,-0.070537],[17.961,3.4319,-0.070537],[17.961,-0.77419,-0.047364],[19.824,-8.8358,-0.035777],[18.582,-11.64,0.010569],[20.446,-6.0318,-0.012604],[18.272,-3.2277,-0.047364],[17.961,-6.7328,-0.047364],[18.582,-14.794,-0.058951],[19.203,-18.299,-0.035777],[20.135,-18.65,-0.035777],[21.998,-19.702,-0.035777],[22.62,-19.702,-0.035777],[24.173,-19.351,-0.001017],[22.93,-16.196,0.022156],[19.824,-10.588,0.010569],[16.719,-5.3308,0.64784],[21.067,-4.6298,-0.31386],[26.968,-14.093,-0.001017],[26.968,-12.341,0.056916],[21.067,-1.8257,0.033743],[24.173,-1.8257,-0.035777],[35.975,-5.6813,-0.035777],[48.087,-4.6298,0.010569],[56.162,1.6793,0.022156],[61.753,6.5864,0.022156],[64.237,6.9369,-0.001017],[64.237,7.2874,-0.035777],[57.715,-0.073181,0.022156],[44.981,5.1844,0.033743],[40.012,-2.5267,-0.012604],[38.149,-8.1348,-0.024191],[39.08,14.999,-0.058951],[38.77,19.906,-0.047364],[35.975,19.906,-0.012604],[32.248,18.153,0.010569],[28.521,13.246,0.010569],[26.036,9.741,0.022156],[24.483,7.6379,0.022156],[23.241,5.1844,-0.012604],[22.309,4.1329,-0.035777],[21.998,4.8339,-0.070537],[20.135,4.4834,-0.070537],[20.135,0.62783,-0.047364],[22.62,-8.1348,-0.024191],[21.998,-11.289,0.010569],[24.173,-5.3308,-0.012604],[22.309,-1.8257,-0.047364],[21.377,-5.3308,-0.035777],[21.998,-13.392,-0.047364],[22.93,-17.248,-0.024191],[24.173,-18.299,-0.024191],[26.347,-20.052,-0.024191],[27.278,-20.052,-0.024191],[29.763,-20.052,-0.001017],[28.831,-17.248,0.010569],[26.036,-11.64,0.010569],[22.62,-6.7328,0.69418],[24.794,-4.2793,-0.29068],[31.316,-14.444,-0.001017],[31.316,-13.042,0.045329],[25.104,-1.8257,0.033743],[27.278,-1.1247,-0.024191],[39.08,-4.6298,-0.024191],[50.882,-3.9287,0.010569],[59.268,1.6793,0.022156],[64.548,6.5864,0.022156],[67.654,7.6379,-0.001017],[67.654,7.9885,-0.024191],[62.063,0.62783,0.010569],[50.261,5.5349,0.022156],[45.602,-1.8257,-0.001017],[43.118,-6.3823,-0.024191],[43.739,16.751,-0.058951],[42.497,21.308,-0.047364],[39.701,20.957,-0.012604],[35.043,18.854,0.010569],[31.937,13.947,0.010569],[29.763,10.091,0.022156],[28.521,7.6379,0.022156],[28.21,5.5349,-0.001017],[26.347,4.8339,-0.024191],[25.725,5.5349,-0.058951],[23.241,5.1844,-0.058951],[23.862,1.3288,-0.035777],[27.278,-8.1348,-0.024191],[26.347,-12.341,0.010569],[28.831,-5.3308,-0.012604],[26.968,-1.8257,-0.047364],[26.036,-5.3308,-0.035777],[26.036,-13.743,-0.035777],[26.968,-17.949,-0.024191],[28.521,-19.702,-0.024191],[31.005,-21.805,-0.024191],[32.248,-21.805,-0.012604],[34.111,-20.403,-0.001017],[33.8,-17.598,0.010569],[31.937,-13.042,-0.001017],[28.521,-8.4853,0.69418],[28.21,-3.9287,-0.24434],[35.043,-15.145,-0.001017],[35.664,-14.093,0.033743],[28.831,-2.1762,0.022156],[30.695,-0.77419,-0.012604],[41.565,-3.9287,-0.012604],[52.746,-3.2277,0.010569],[60.51,1.6793,0.010569],[65.79,6.5864,0.010569],[69.206,8.6895,-0.001017],[69.517,9.04,-0.024191],[64.237,1.6793,0.010569],[53.678,6.2359,0.010569],[49.019,-1.1247,-0.012604],[45.913,-4.6298,-0.024191],[44.981,17.452,-0.058951],[43.739,22.009,-0.035777],[39.701,21.308,-0.012604],[35.043,18.854,0.010569],[31.937,13.246,0.010569],[30.074,9.3905,0.010569],[29.142,6.9369,0.022156],[29.763,4.8339,-0.001017],[28.21,5.1844,-0.024191],[28.21,7.2874,-0.047364],[26.968,6.9369,-0.047364],[28.21,2.7309,-0.035777],[32.248,-7.7843,-0.024191],[31.316,-13.042,0.010569],[33.8,-6.0318,-0.012604],[31.316,-3.2277,-0.035777],[30.384,-7.0833,-0.024191],[30.074,-15.145,-0.035777],[31.005,-19,-0.024191],[32.558,-21.104,-0.024191],[35.664,-22.856,-0.024191],[37.217,-22.506,-0.012604],[38.459,-19.702,-0.001017],[38.149,-15.846,-0.001017],[36.906,-13.042,-0.001017],[34.422,-9.8873,0.67101],[29.142,-3.9287,-0.1864],[36.285,-15.145,0.010569],[37.838,-15.145,0.022156],[32.248,-4.6298,0.022156],[34.111,-1.8257,-0.012604],[43.739,-4.2793,-0.012604],[53.988,-3.5782,-0.001017],[60.51,0.97834,0.010569],[65.48,5.1844,0.010569],[68.275,9.04,-0.001017],[69.206,9.3905,-0.012604],[65.169,1.3288,-0.001017],[55.541,4.1329,-0.001017],[51.503,-1.8257,-0.012604],[46.845,-3.5782,-0.024191],[45.602,16.751,-0.047364],[43.739,20.957,-0.024191],[39.701,20.957,-0.012604],[35.664,19.205,-0.001017],[32.558,14.298,-0.001017],[31.005,10.091,0.010569],[30.695,7.9885,0.010569],[32.248,6.9369,-0.001017],[30.384,7.9885,-0.024191],[30.384,10.091,-0.035777],[28.831,9.3905,-0.035777],[30.384,4.1329,-0.024191],[34.732,-7.4338,-0.012604],[34.422,-13.392,0.010569],[36.596,-6.0318,-0.012604],[34.111,-2.8772,-0.024191],[32.869,-7.4338,-0.012604],[32.558,-15.495,-0.024191],[33.8,-19.351,-0.012604],[35.043,-21.104,-0.012604],[37.838,-21.805,-0.012604],[39.08,-21.104,-0.001017],[39.701,-16.547,-0.001017],[39.08,-13.042,-0.012604],[39.08,-12.341,-0.001017],[37.217,-11.289,0.61308],[27.899,-3.2277,-0.12847],[34.732,-14.093,0.010569],[37.217,-15.846,0.010569],[35.043,-8.4853,0.010569],[37.838,-5.6813,-0.001017],[45.602,-5.3308,-0.001017],[53.988,-4.6298,-0.001017],[59.889,-1.1247,0.010569],[63.616,2.7309,0.010569],[66.411,8.339,-0.001017],[66.722,8.339,-0.012604],[63.927,-0.42369,-0.012604],[56.162,0.62783,-0.012604],[52.435,-5.3308,-0.012604],[46.845,-3.9287,-0.024191],[45.602,13.947,-0.035777],[43.739,18.153,-0.012604],[40.012,19.555,-0.001017],[36.906,20.256,-0.001017],[35.043,17.102,-0.001017],[34.422,12.896,-0.001017],[34.422,11.143,0.010569],[35.975,10.792,-0.012604],[33.179,12.195,-0.024191],[32.248,14.298,-0.024191],[29.142,12.195,-0.024191],[30.695,5.5349,-0.012604],[35.664,-7.0833,-0.012604],[35.043,-13.042,0.010569],[37.217,-5.3308,-0.012604],[35.043,-1.8257,-0.012604],[34.732,-6.0318,-0.012604],[34.732,-14.093,-0.012604],[35.664,-18.65,-0.012604],[36.596,-19.351,-0.012604],[37.838,-19,-0.012604],[38.149,-17.248,-0.001017],[37.217,-11.64,-0.001017],[37.217,-8.4853,-0.012604],[38.459,-10.588,-0.012604],[37.217,-12.341,0.55514],[24.794,-2.1762,-0.1053],[31.005,-11.289,0.010569],[34.111,-14.444,-0.001017],[34.111,-9.8873,-0.001017],[37.217,-7.7843,-0.001017],[43.739,-7.0833,-0.001017],[49.951,-6.3823,-0.001017],[54.92,-3.9287,-0.001017],[58.336,-0.073181,-0.001017],[61.442,5.1844,-0.001017],[62.374,7.2874,-0.001017],[59.889,2.3804,-0.012604],[53.988,3.7824,-0.012604],[50.572,1.3288,-0.012604],[44.981,3.4319,-0.012604],[42.807,15.349,-0.024191],[41.876,15.349,-0.012604],[37.217,14.298,-0.001017],[34.111,16.401,-0.001017],[32.248,13.947,-0.001017],[29.763,11.494,-0.001017],[28.21,10.792,-0.001017],[28.521,11.143,-0.001017],[25.725,13.246,-0.012604],[24.794,16.751,-0.012604],[21.998,14.999,-0.012604],[23.862,7.9885,-0.012604],[31.316,-5.6813,-0.001017],[32.248,-11.64,-0.001017],[35.664,-2.5267,-0.001017],[32.869,0.62783,-0.001017],[32.248,-4.2793,-0.001017],[31.005,-12.691,-0.001017],[31.316,-16.196,-0.001017],[32.248,-16.196,-0.012604],[33.8,-15.145,-0.012604],[34.422,-13.392,-0.001017],[33.179,-7.7843,-0.012604],[32.869,-5.6813,-0.012604],[34.422,-9.1863,-0.012604],[34.111,-12.341,0.5088],[21.067,-1.8257,-0.082124],[26.347,-8.8358,0.022156],[30.074,-12.341,-0.012604],[32.248,-10.939,-0.012604],[35.975,-9.8873,-0.001017],[40.012,-8.8358,-0.001017],[44.671,-8.4853,-0.012604],[49.019,-6.7328,-0.012604],[52.125,-2.5267,-0.001017],[54.92,2.0299,-0.001017],[56.783,6.2359,-0.001017],[55.541,6.5864,-0.012604],[50.572,9.741,-0.012604],[48.398,11.143,-0.012604],[42.497,13.246,-0.012604],[39.701,18.153,-0.001017],[38.77,12.545,-0.001017],[33.8,7.9885,0.010569],[30.074,10.442,-0.001017],[26.347,9.741,-0.001017],[21.998,9.04,-0.001017],[18.582,9.04,-0.001017],[17.029,9.741,-0.001017],[13.923,12.896,-0.001017],[13.302,18.153,-0.001017],[11.128,17.102,-0.001017],[14.234,10.442,-0.001017],[25.104,-3.9287,-0.001017],[28.21,-10.238,-0.012604],[32.869,-0.42369,-0.001017],[30.384,3.7824,-0.001017],[27.899,-1.8257,-0.001017],[24.794,-10.588,-0.001017],[25.725,-13.743,-0.001017],[26.657,-12.691,-0.001017],[28.831,-10.238,-0.001017],[30.384,-8.4853,-0.001017],[29.142,-4.6298,-0.012604],[28.21,-2.8772,-0.012604],[30.384,-7.7843,-0.012604],[30.384,-11.64,0.47404],[4.606,0.97833,-0.001017],[3.3637,0.27732,-0.001017],[2.1214,-0.77419,-0.001017],[2.432,-1.1247,-0.001017],[2.7426,0.97833,-0.001017],[2.432,0.97833,-0.001017],[0.56851,-0.42369,-0.001017],[0.87909,-0.77419,-0.001017],[2.1214,-1.8257,-0.001017],[0.87909,-2.1762,-0.001017],[3.0531,-1.8257,-0.001017],[3.0531,-1.8257,-0.001017],[2.1214,0.62783,-0.001017],[1.1897,-0.073182,-0.001017],[-0.6738,-0.42369,-0.001017],[-0.36322,-1.8257,-0.001017],[4.2955,1.6793,-0.001017],[6.1589,2.3804,-0.001017],[2.7426,0.97833,-0.001017],[0.56851,0.62783,-0.001017],[-2.2267,2.7309,-0.001017],[-2.8479,3.4319,-0.001017],[-3.1584,5.5349,-0.001017],[-2.2267,6.2359,-0.001017],[-1.295,5.5349,-0.001017],[-0.98438,3.7824,-0.001017],[-0.6738,4.1329,-0.001017],[-0.36322,1.3288,-0.001017],[-1.295,-1.8257,-0.001017],[-1.6055,-1.8257,-0.001017],[-0.36322,-1.4752,-0.001017],[3.3637,-1.8257,-0.001017],[2.7426,-0.77419,-0.001017],[3.0531,-0.42369,-0.001017],[3.3637,-0.073182,-0.001017],[4.606,-0.073182,-0.001017],[4.9166,0.97833,-0.001017],[3.6743,0.97833,-0.001017],[1.1897,1.3288,-0.001017],[-0.36322,0.97833,-0.001017],[-2.5373,1.3288,-0.001017],[6.1589,0.27732,-0.047364],[6.1589,-1.1247,0.022156],[6.1589,-2.1762,0.010569],[7.0907,-2.1762,-0.012604],[8.6436,0.27732,-0.012604],[9.2647,0.97834,0.010569],[8.6436,-0.77419,0.010569],[9.2647,-0.42369,-0.012604],[10.507,-0.073181,-0.001017],[10.818,-1.1247,-0.001017],[11.128,0.97834,-0.001017],[9.2647,-0.073181,0.010569],[8.333,-1.8257,-0.012604],[10.196,-3.5782,-0.012604],[6.1589,-5.3308,0.010569],[2.7426,-1.8257,-0.012604],[4.2955,1.6793,-0.001017],[6.1589,2.3804,-0.001017],[2.7426,0.97834,-0.001017],[0.56851,0.62783,-0.001017],[-1.295,3.4319,-0.001017],[-1.6055,4.8339,-0.001017],[-0.98438,6.9369,-0.001017],[0.25794,11.143,-0.012604],[0.56851,10.091,-0.012604],[0.87909,7.2874,-0.012604],[1.1897,4.8339,-0.024191],[1.1897,2.3804,-0.012604],[-0.36322,-0.073181,-0.001017],[-1.295,-0.77419,-0.024191],[-0.6738,-0.77419,-0.035777],[1.5003,-2.5267,-0.035777],[3.3637,-4.2793,-0.012604],[3.0531,-3.9287,-0.001017],[1.1897,-3.5782,-0.001017],[1.1897,-3.5782,-0.012604],[1.5003,-1.8257,-0.012604],[0.87909,-1.4752,-0.001017],[-0.6738,-0.77419,-0.001017],[-1.6055,-1.1247,-0.001017],[-3.1584,0.27732,0.10326],[8.6436,-5.3308,-0.093711],[10.196,-8.4853,0.033743],[10.818,-9.8873,0.022156],[13.923,-9.8873,-0.024191],[17.029,-7.0833,-0.024191],[18.893,-2.1762,0.010569],[18.893,-0.77419,0.022156],[20.135,0.27732,-0.012604],[21.377,1.6793,-0.001017],[21.998,-0.073181,-0.012604],[22.93,-0.77419,-0.001017],[23.862,0.62783,0.010569],[18.893,1.3288,-0.035777],[18.893,-3.9287,-0.024191],[11.439,-7.4338,0.033743],[6.7801,-0.77419,-0.024191],[7.0907,3.0814,-0.035777],[8.9541,2.3804,-0.001017],[8.333,-0.42369,-0.001017],[6.7801,0.62783,0.010569],[4.9166,5.1844,0.022156],[4.2955,6.9369,0.010569],[4.9166,8.6895,-0.001017],[4.606,10.442,-0.012604],[5.2272,13.947,-0.001017],[5.5378,10.442,-0.012604],[6.4695,6.2359,-0.024191],[4.9166,-1.1247,-0.001017],[1.5003,-3.5782,0.010569],[-0.36322,-1.8257,-0.035777],[0.25793,-0.77419,-0.058951],[3.0531,-4.9803,-0.058951],[4.9166,-6.3823,-0.035777],[4.2955,-5.6813,-0.001017],[2.7426,-4.6298,-0.001017],[3.0531,-5.6813,-0.012604],[2.1214,-4.9803,-0.001017],[-0.36322,-5.6813,0.010569],[-2.8479,-5.6813,0.010569],[-3.1584,-7.4338,0.010569],[-3.469,-5.6813,0.21913],[10.507,-6.7328,-0.12847],[11.439,-9.8873,0.056916],[11.128,-9.5368,0.022156],[13.302,-8.8358,-0.035777],[18.893,-10.588,-0.024191],[24.483,-11.289,0.010569],[28.21,-6.7328,0.022156],[31.316,-2.1762,-0.012604],[34.111,0.62783,-0.001017],[35.975,0.62783,-0.012604],[35.043,2.7309,-0.012604],[31.937,6.2359,0.022156],[22.93,6.9369,-0.035777],[21.998,-1.8257,-0.024191],[13.302,-5.3308,0.033743],[10.818,0.97834,-0.035777],[10.818,4.1329,-0.058951],[12.992,3.7824,-0.001017],[12.992,2.0299,-0.012604],[13.923,4.1329,0.022156],[12.371,6.5864,0.022156],[11.128,6.9369,0.010569],[11.128,7.9885,-0.001017],[10.818,8.6895,-0.012604],[11.128,9.3905,-0.012604],[12.371,7.6379,-0.012604],[13.923,2.0299,-0.035777],[12.06,-2.8772,-0.001017],[8.6436,-5.3308,0.022156],[7.0907,-2.8772,-0.035777],[6.1589,-1.8257,-0.082124],[7.0907,-7.7843,-0.082124],[8.0224,-10.238,-0.047364],[6.1589,-9.5368,-0.001017],[4.9166,-8.4853,-0.001017],[5.2272,-8.8358,-0.024191],[4.9166,-8.4853,-0.001017],[3.0531,-7.7843,0.022156],[0.87909,-6.3823,0.010569],[0.25794,-7.4338,0.022156],[0.25794,-5.6813,0.335],[12.371,-7.4338,-0.16323],[12.681,-10.238,0.056916],[11.128,-8.1348,0.033743],[12.992,-7.4338,-0.035777],[19.203,-13.042,-0.024191],[26.657,-15.846,0.010569],[33.8,-9.8873,0.022156],[39.08,-3.5782,-0.012604],[43.118,0.97834,-0.001017],[45.602,2.3804,-0.024191],[43.118,5.1844,-0.012604],[39.701,9.3905,0.045329],[30.074,8.6895,-0.024191],[28.521,-2.5267,-0.024191],[17.961,-6.0318,0.033743],[16.097,2.0299,-0.047364],[17.34,6.2359,-0.070537],[18.893,7.9885,-0.012604],[20.446,7.2874,-0.024191],[20.756,8.339,0.022156],[19.203,7.9885,0.022156],[17.961,7.2874,0.010569],[17.34,7.6379,-0.001017],[16.408,7.9885,-0.012604],[16.097,7.6379,-0.024191],[16.719,5.1844,-0.024191],[18.582,-1.1247,-0.058951],[18.272,-6.7328,-0.001017],[15.476,-8.4853,0.022156],[15.166,-5.3308,-0.035777],[12.992,-3.9287,-0.093711],[12.371,-8.8358,-0.093711],[11.128,-13.392,-0.058951],[8.9541,-13.743,-0.012604],[8.0224,-13.743,-0.001017],[8.6436,-13.392,-0.024191],[8.333,-13.042,-0.001017],[7.0907,-10.588,0.022156],[4.9166,-7.7843,0.010569],[3.6743,-7.4338,0.022156],[4.2955,-4.9803,0.43928],[13.923,-8.1348,-0.1864],[14.234,-10.939,0.056916],[11.439,-7.4338,0.033743],[13.302,-6.3823,-0.035777],[20.756,-13.743,-0.024191],[29.763,-17.248,0.010569],[38.459,-10.238,0.022156],[44.981,-2.5267,-0.001017],[50.261,2.7309,-0.001017],[53.678,4.8339,-0.012604],[52.125,9.04,-0.001017],[48.087,13.597,0.045329],[36.906,12.545,-0.024191],[35.664,-1.4752,-0.024191],[25.104,-4.6298,0.022156],[22.93,5.5349,-0.047364],[24.794,10.091,-0.047364],[24.794,12.195,-0.024191],[25.104,11.494,-0.024191],[24.173,11.143,0.010569],[21.998,9.3905,0.010569],[20.135,7.9885,-0.001017],[19.824,6.9369,-0.012604],[18.582,6.9369,-0.012604],[18.893,5.5349,-0.024191],[18.582,3.7824,-0.035777],[20.446,-2.5267,-0.070537],[20.756,-8.1348,-0.012604],[18.582,-9.8873,0.022156],[19.203,-7.0833,-0.035777],[17.34,-5.6813,-0.093711],[16.719,-11.289,-0.093711],[16.097,-16.547,-0.058951],[13.302,-17.598,-0.012604],[12.06,-17.598,-0.012604],[12.06,-16.897,-0.035777],[11.128,-15.145,-0.012604],[10.196,-11.64,0.010569],[8.0224,-7.4338,0.010569],[6.7801,-6.3823,0.022156],[6.4695,-3.9287,0.53197],[16.097,-8.4853,-0.20958],[16.408,-11.289,0.056916],[12.992,-7.0833,0.033743],[14.545,-5.3308,-0.024191],[22.62,-13.743,-0.024191],[32.248,-18.299,0.010569],[43.118,-10.939,0.022156],[50.882,-2.8772,-0.001017],[56.783,3.4319,0.010569],[60.51,5.5349,-0.001017],[59.579,9.741,-0.001017],[54.92,14.298,0.045329],[42.497,12.896,-0.024191],[40.944,-1.8257,-0.012604],[30.695,-4.6298,0.022156],[27.899,7.9885,-0.047364],[29.763,13.246,-0.047364],[29.142,16.401,-0.012604],[28.831,15.349,-0.012604],[26.657,13.246,0.010569],[24.173,10.442,0.010569],[22.309,8.339,-0.001017],[21.998,6.5864,-0.012604],[20.756,5.5349,-0.024191],[20.756,4.4834,-0.035777],[20.135,3.0814,-0.035777],[21.067,-3.5782,-0.070537],[22.309,-8.8358,-0.024191],[20.446,-10.588,0.022156],[21.998,-7.0833,-0.035777],[20.446,-5.3308,-0.093711],[20.446,-10.939,-0.082124],[20.446,-17.248,-0.058951],[17.961,-19,-0.012604],[16.719,-19.702,-0.012604],[17.34,-19.702,-0.035777],[16.408,-18.65,-0.012604],[14.545,-14.794,0.010569],[12.06,-8.8358,-0.001017],[10.196,-6.7328,0.010569],[9.2647,-3.5782,0.62466],[18.893,-8.8358,-0.22116],[19.203,-12.341,0.045329],[15.166,-6.7328,0.022156],[16.719,-4.6298,-0.024191],[25.104,-13.392,-0.024191],[35.975,-18.65,0.010569],[47.777,-11.64,0.010569],[56.162,-3.9287,0.010569],[62.684,3.0814,0.010569],[66.722,5.5349,-0.001017],[66.101,9.3905,-0.001017],[61.442,13.947,0.033743],[48.087,12.195,-0.024191],[45.913,-2.5267,-0.024191],[35.664,-4.2793,0.010569],[32.248,10.091,-0.047364],[33.8,16.401,-0.047364],[32.558,19.555,-0.012604],[32.248,18.153,-0.001017],[29.763,15.349,0.010569],[26.657,11.494,0.010569],[24.794,8.6895,-0.012604],[24.483,6.2359,-0.012604],[23.241,4.8339,-0.024191],[22.93,4.1329,-0.035777],[21.067,3.0814,-0.047364],[21.998,-3.5782,-0.070537],[23.862,-8.8358,-0.024191],[22.309,-10.588,0.022156],[24.173,-6.7328,-0.035777],[22.93,-4.6298,-0.082124],[24.173,-9.8873,-0.082124],[24.483,-16.897,-0.058951],[22.309,-18.65,-0.012604],[21.998,-20.403,-0.012604],[22.93,-21.454,-0.035777],[22.309,-21.805,-0.012604],[20.446,-17.598,-0.001017],[16.719,-10.939,-0.012604],[14.545,-7.7843,0.010569],[12.992,-4.2793,0.70577],[21.998,-8.8358,-0.22116],[22.62,-12.691,0.033743],[18.272,-6.3823,0.022156],[19.203,-3.5782,-0.024191],[27.899,-12.691,-0.012604],[39.08,-18.299,-0.001017],[51.814,-11.64,0.010569],[60.51,-4.2793,0.010569],[67.654,2.3804,0.010569],[71.691,5.1844,-0.001017],[71.691,9.04,-0.001017],[66.722,13.246,0.022156],[53.988,11.844,-0.012604],[51.503,-2.5267,-0.024191],[40.944,-2.5267,-0.001017],[38.149,12.896,-0.047364],[38.459,19.906,-0.035777],[36.906,22.71,-0.012604],[35.043,20.607,-0.001017],[32.248,16.751,0.010569],[29.763,12.195,0.010569],[28.21,8.6895,-0.012604],[27.278,5.5349,-0.024191],[26.036,4.8339,-0.024191],[25.725,4.4834,-0.035777],[22.62,3.4319,-0.035777],[23.862,-2.5267,-0.070537],[26.347,-8.8358,-0.024191],[24.794,-10.588,0.022156],[27.278,-6.3823,-0.024191],[26.347,-3.5782,-0.070537],[27.899,-8.4853,-0.070537],[28.21,-15.495,-0.047364],[26.347,-18.299,-0.012604],[26.347,-20.403,-0.001017],[28.21,-21.805,-0.024191],[27.899,-23.207,-0.001017],[26.347,-19.702,-0.001017],[22.62,-13.392,-0.012604],[19.824,-9.1863,-0.001017],[17.961,-4.9803,0.77529],[25.725,-8.8358,-0.19799],[26.347,-13.042,0.022156],[21.377,-6.3823,0.022156],[22.309,-2.8772,-0.012604],[30.695,-11.64,-0.012604],[41.876,-17.248,-0.001017],[54.299,-10.939,0.010569],[62.684,-3.9287,0.010569],[69.828,2.7309,0.010569],[74.486,5.5349,0.010569],[75.107,9.3905,-0.001017],[71.381,13.246,0.022156],[58.647,12.195,-0.012604],[56.783,-1.4752,-0.012604],[46.534,-0.77419,-0.012604],[43.118,15.7,-0.047364],[43.118,22.009,-0.035777],[40.633,24.813,-0.012604],[38.459,21.658,-0.001017],[35.664,17.452,0.010569],[32.869,12.195,0.010569],[32.248,7.9885,-0.012604],[31.937,5.5349,-0.012604],[29.763,5.1844,-0.024191],[28.831,4.8339,-0.024191],[25.725,4.1329,-0.024191],[26.968,-2.5267,-0.058951],[30.384,-9.5368,-0.012604],[29.142,-10.939,0.010569],[32.248,-6.0318,-0.024191],[31.316,-2.8772,-0.070537],[32.248,-7.4338,-0.058951],[32.248,-15.145,-0.035777],[31.316,-19.351,-0.012604],[31.316,-22.155,-0.001017],[32.869,-23.557,-0.012604],[32.558,-24.258,-0.001017],[32.248,-21.104,-0.001017],[28.521,-14.444,-0.012604],[26.036,-9.8873,-0.001017],[24.173,-5.6813,0.82164],[28.521,-9.1863,-0.15164],[30.074,-14.444,0.010569],[24.794,-7.4338,0.022156],[24.483,-3.2277,-0.012604],[32.248,-10.939,-0.012604],[42.807,-15.846,-0.001017],[54.609,-9.8873,0.010569],[62.684,-3.5782,0.010569],[69.206,3.0814,0.010569],[73.865,6.9369,0.010569],[75.107,10.442,-0.001017],[72.312,13.597,0.010569],[61.442,12.195,-0.012604],[59.579,-0.073181,-0.012604],[49.64,1.3288,-0.024191],[44.981,16.751,-0.047364],[44.05,23.06,-0.035777],[40.633,25.514,-0.001017],[38.149,21.658,0.010569],[34.732,16.751,0.010569],[32.558,11.494,0.010569],[32.558,6.9369,-0.012604],[33.179,5.5349,-0.012604],[31.316,6.5864,-0.024191],[31.316,6.9369,-0.024191],[29.763,5.5349,-0.024191],[31.937,-1.8257,-0.047364],[36.285,-9.1863,-0.012604],[35.043,-11.64,0.010569],[37.838,-7.0833,-0.012604],[36.596,-4.6298,-0.047364],[37.217,-8.8358,-0.035777],[35.975,-16.547,-0.024191],[34.732,-21.454,-0.001017],[35.043,-23.908,-0.001017],[36.906,-24.959,-0.012604],[36.906,-24.258,-0.001017],[36.906,-19.702,-0.001017],[34.422,-14.794,-0.012604],[32.558,-10.238,-0.001017],[31.316,-6.7328,0.82164],[29.763,-9.1863,-0.093711],[31.937,-15.145,-0.001017],[27.899,-9.5368,0.010569],[27.899,-5.3308,-0.001017],[34.422,-10.939,-0.001017],[44.05,-14.794,-0.001017],[54.609,-9.5368,0.010569],[61.442,-3.5782,0.010569],[66.722,2.3804,0.010569],[70.759,6.9369,-0.001017],[72.312,10.091,-0.001017],[70.138,11.143,0.010569],[61.442,9.741,-0.012604],[59.268,-0.42369,-0.012604],[48.708,2.0299,-0.024191],[44.36,15.7,-0.035777],[42.807,22.009,-0.024191],[39.08,25.163,-0.001017],[36.596,21.658,0.010569],[34.111,16.751,0.010569],[32.558,11.844,0.010569],[33.179,7.6379,-0.012604],[34.732,7.2874,-0.012604],[32.869,9.3905,-0.024191],[32.869,9.741,-0.024191],[31.316,8.339,-0.024191],[34.111,-1.1247,-0.035777],[40.012,-9.1863,-0.012604],[38.149,-12.341,0.010569],[40.633,-7.0833,-0.001017],[39.701,-4.6298,-0.035777],[40.012,-9.1863,-0.024191],[37.838,-16.196,-0.012604],[36.596,-21.104,-0.001017],[36.906,-23.207,0.010569],[38.149,-23.207,-0.012604],[38.149,-21.454,-0.001017],[38.149,-16.897,-0.012604],[36.906,-14.093,-0.012604],[36.596,-10.238,-0.001017],[35.975,-7.7843,0.7637],[28.831,-8.8358,-0.035777],[32.248,-15.495,-0.012604],[31.005,-13.042,0.010569],[32.248,-9.5368,-0.001017],[37.217,-12.691,-0.001017],[45.602,-13.743,-0.001017],[54.299,-9.1863,-0.001017],[59.889,-4.2793,0.010569],[63.616,0.62783,-0.001017],[66.411,6.5864,-0.001017],[68.275,8.339,-0.001017],[66.101,6.5864,-0.001017],[58.647,4.1329,-0.001017],[55.541,-2.5267,-0.012604],[45.913,1.3288,-0.024191],[41.565,12.195,-0.035777],[40.633,18.854,-0.012604],[36.596,23.06,-0.001017],[35.043,21.658,0.010569],[33.8,18.153,-0.001017],[33.179,13.947,-0.001017],[35.043,10.091,-0.012604],[36.596,10.792,-0.012604],[34.422,12.896,-0.012604],[34.111,13.597,-0.024191],[31.005,11.494,-0.024191],[33.8,-0.42369,-0.024191],[40.012,-9.5368,-0.012604],[37.838,-11.289,-0.001017],[40.323,-5.6813,-0.001017],[39.701,-3.2277,-0.024191],[40.944,-7.7843,-0.012604],[39.08,-14.093,-0.001017],[37.217,-18.65,-0.001017],[36.906,-19.702,-0.001017],[36.596,-19,-0.001017],[35.664,-15.846,-0.001017],[35.664,-12.691,-0.012604],[35.975,-11.64,-0.012604],[37.217,-9.5368,-0.012604],[37.838,-8.4853,0.70577],[26.347,-7.4338,-0.001017],[30.384,-14.093,-0.024191],[30.695,-13.743,-0.001017],[32.558,-11.64,-0.001017],[37.217,-13.042,-0.001017],[43.739,-12.691,-0.001017],[49.64,-9.8873,-0.001017],[53.678,-6.0318,-0.001017],[56.473,-1.4752,-0.001017],[58.336,3.7824,-0.001017],[58.647,7.6379,-0.001017],[56.473,7.2874,-0.001017],[52.125,6.9369,-0.001017],[49.951,3.7824,-0.012604],[43.118,7.6379,-0.024191],[39.701,13.597,-0.024191],[38.77,16.401,-0.012604],[34.732,18.854,0.010569],[33.179,17.803,0.010569],[32.248,16.05,-0.001017],[30.384,13.246,-0.001017],[30.384,10.091,-0.001017],[30.695,11.143,-0.012604],[27.899,13.947,-0.012604],[27.899,16.401,-0.012604],[24.173,14.298,-0.012604],[26.968,0.62783,-0.012604],[35.664,-8.4853,-0.001017],[34.111,-10.238,-0.001017],[37.217,-3.5782,-0.001017],[36.596,-0.42369,-0.012604],[37.217,-5.3308,-0.001017],[34.732,-12.341,-0.001017],[33.179,-16.897,-0.001017],[32.869,-17.248,-0.001017],[32.558,-15.495,-0.001017],[32.248,-11.289,-0.012604],[32.248,-8.8358,-0.012604],[32.558,-9.5368,-0.012604],[34.732,-8.4853,-0.012604],[35.664,-8.8358,0.65942],[23.241,-6.0318,0.022156],[26.968,-11.289,-0.035777],[29.142,-13.392,-0.012604],[32.248,-13.743,-0.001017],[36.285,-13.042,-0.001017],[40.323,-11.64,-0.012604],[43.118,-10.939,-0.012604],[45.913,-8.4853,-0.001017],[48.087,-3.5782,-0.001017],[48.398,1.3288,-0.001017],[48.087,6.5864,-0.001017],[45.913,10.091,-0.012604],[44.36,11.844,-0.001017],[44.05,13.947,-0.012604],[40.633,16.401,-0.012604],[37.838,16.751,-0.012604],[37.838,13.947,-0.001017],[33.179,12.896,0.010569],[32.248,12.195,0.010569],[29.763,12.545,-0.001017],[25.725,11.844,0.010569],[22.62,9.3905,-0.001017],[21.067,11.143,-0.001017],[17.961,13.597,-0.001017],[17.961,18.504,-0.001017],[14.855,17.102,-0.001017],[18.272,2.0299,-0.001017],[30.695,-7.4338,-0.001017],[30.074,-9.1863,-0.012604],[33.8,-1.1247,-0.001017],[32.869,2.7309,0.010569],[32.558,-1.8257,0.010569],[29.142,-9.8873,-0.001017],[27.899,-14.794,-0.001017],[28.21,-14.794,-0.012604],[28.21,-12.341,-0.001017],[28.831,-7.7843,-0.012604],[29.142,-5.3308,-0.012604],[28.831,-7.4338,-0.001017],[31.005,-7.7843,-0.012604],[32.248,-8.8358,0.61308],[4.606,-0.073182,-0.001017],[3.3637,-1.1247,-0.001017],[3.0531,-0.77419,-0.001017],[3.3637,-0.073182,-0.001017],[3.0531,0.27732,-0.001017],[0.56851,-0.073182,-0.001017],[0.56851,-0.42369,-0.001017],[0.56851,-0.77419,-0.001017],[0.25794,-1.1247,-0.001017],[2.1214,-3.5782,-0.001017],[2.1214,-3.5782,-0.001017],[4.606,-1.8257,-0.001017],[5.5378,3.4319,-0.001017],[0.56851,1.3288,-0.001017],[1.1897,-1.8257,-0.001017],[3.3637,-1.1247,-0.001017],[5.2272,2.3804,-0.001017],[5.5378,1.6793,-0.001017],[2.7426,2.7309,-0.001017],[-0.36322,1.6793,-0.001017],[-0.98438,3.0814,-0.001017],[-2.2267,3.7824,-0.001017],[-2.8479,5.5349,-0.001017],[-2.2267,6.5864,-0.001017],[-1.6055,5.5349,-0.001017],[-0.36322,2.0299,-0.001017],[-0.36322,3.7824,-0.001017],[-2.5373,1.3288,-0.001017],[-3.1584,0.27732,-0.001017],[0.25794,-0.073182,-0.001017],[1.5003,0.27732,-0.001017],[3.3637,-0.77419,-0.001017],[3.0531,-0.42369,-0.001017],[3.3637,-0.77419,-0.001017],[3.0531,0.27732,-0.001017],[5.5378,0.27732,-0.001017],[6.1589,2.3804,-0.001017],[4.2955,1.6793,-0.001017],[2.1214,2.3804,-0.001017],[-0.36322,2.0299,-0.001017],[-3.1584,1.3288,-0.001017],[7.4013,-1.4752,-0.035777],[7.0907,-2.5267,0.010569],[8.0224,-3.9287,-0.012604],[8.333,-2.1762,-0.012604],[9.2647,-1.1247,0.010569],[9.5753,-0.77419,0.010569],[10.507,-0.42369,-0.012604],[10.196,-1.4752,0.010569],[10.507,-1.4752,-0.001017],[12.06,-1.8257,-0.001017],[12.06,-1.8257,-0.001017],[11.439,1.6793,-0.024191],[12.06,1.3288,-0.001017],[12.06,-1.4752,-0.001017],[7.4013,-3.5782,-0.012604],[4.9166,-0.77419,-0.012604],[5.2272,2.3804,-0.001017],[5.5378,1.6793,-0.001017],[2.7426,2.7309,-0.001017],[-0.36322,1.6793,-0.001017],[0.25794,3.7824,-0.001017],[-0.98438,4.8339,-0.001017],[-0.98438,6.2359,-0.001017],[-0.36322,9.3905,-0.012604],[1.1897,10.091,-0.012604],[2.1214,9.741,-0.024191],[2.7426,6.9369,-0.001017],[0.56851,3.4319,-0.012604],[-0.36322,2.0299,-0.035777],[1.5003,1.6793,-0.035777],[2.432,-0.42369,-0.012604],[3.3637,-2.1762,-0.012604],[5.2272,-3.5782,-0.012604],[4.606,-3.9287,-0.001017],[3.0531,-3.5782,-0.012604],[3.3637,-2.5267,-0.024191],[3.6743,-1.1247,-0.012604],[3.0531,-0.77419,-0.001017],[2.432,0.27732,-0.001017],[0.87909,-0.073181,0.010569],[-2.5373,-0.073181,0.091676],[10.818,-7.0833,-0.047364],[11.439,-10.588,0.010569],[13.302,-11.64,-0.012604],[16.097,-11.289,-0.024191],[17.34,-8.8358,0.022156],[19.203,-4.2793,0.022156],[22.62,-1.1247,-0.024191],[21.377,-1.1247,0.010569],[21.067,0.97834,-0.001017],[22.309,-0.42369,0.010569],[20.446,0.62783,-0.001017],[23.862,0.62783,-0.047364],[26.657,4.4834,-0.012604],[22.93,1.6793,-0.001017],[14.234,-1.8257,-0.024191],[8.9541,0.97834,-0.024191],[8.9541,3.4319,-0.024191],[11.128,1.6793,-0.012604],[10.196,2.0299,0.010569],[6.7801,2.3804,-0.012604],[6.7801,5.5349,0.010569],[5.5378,7.2874,0.022156],[4.606,8.339,-0.001017],[3.6743,11.494,-0.012604],[5.5378,14.298,-0.024191],[7.0907,9.04,-0.035777],[8.0224,6.2359,-0.001017],[4.606,0.62783,-0.001017],[2.1214,-1.4752,-0.058951],[3.0531,-0.77419,-0.058951],[3.6743,-1.4752,-0.012604],[5.5378,-4.2793,-0.035777],[6.7801,-5.3308,-0.024191],[6.4695,-4.9803,0.010569],[5.2272,-4.6298,-0.001017],[5.5378,-4.2793,-0.035777],[3.6743,-3.9287,-0.001017],[1.5003,-4.9803,-0.001017],[0.87909,-6.3823,0.010569],[0.25793,-7.0833,0.022156],[-2.8479,-5.3308,0.20754],[11.439,-7.4338,-0.058951],[11.439,-10.238,0.022156],[12.681,-10.939,-0.024191],[16.719,-13.042,-0.035777],[21.998,-15.846,0.033743],[25.104,-15.846,0.033743],[29.142,-9.5368,-0.024191],[30.695,-4.2793,-0.001017],[31.316,-0.42369,-0.001017],[33.179,0.62783,-0.001017],[33.8,3.7824,-0.001017],[35.043,7.9885,-0.058951],[32.248,10.792,-0.012604],[26.657,5.5349,0.010569],[16.408,0.97834,-0.024191],[12.992,3.0814,-0.012604],[12.371,4.4834,-0.047364],[14.545,3.4319,-0.035777],[13.923,3.4319,-0.001017],[12.992,4.1329,-0.024191],[13.923,7.6379,0.010569],[13.302,8.339,0.022156],[12.681,8.6895,0.010569],[12.371,9.04,-0.024191],[13.302,9.741,-0.047364],[14.234,7.2874,-0.047364],[14.234,4.4834,-0.001017],[11.128,-0.77419,0.010569],[8.9541,-3.5782,-0.070537],[8.6436,-2.5267,-0.070537],[9.2647,-2.1762,-0.012604],[10.507,-6.7328,-0.047364],[9.2647,-7.7843,-0.035777],[8.0224,-7.7843,0.010569],[6.7801,-8.1348,-0.012604],[7.0907,-8.1348,-0.047364],[6.1589,-6.7328,-0.001017],[4.2955,-6.7328,0.010569],[3.3637,-6.7328,0.022156],[2.432,-6.7328,0.033743],[0.56851,-4.9803,0.31182],[12.371,-7.0833,-0.082124],[11.128,-9.1863,0.022156],[12.06,-9.5368,-0.024191],[17.029,-13.392,-0.035777],[23.862,-18.65,0.033743],[28.521,-21.454,0.045329],[34.111,-16.196,-0.024191],[40.012,-8.1348,-0.001017],[44.05,-1.8257,-0.012604],[45.913,1.6793,-0.001017],[44.05,7.9885,-0.012604],[42.807,12.896,-0.058951],[39.08,13.947,-0.001017],[32.869,6.5864,0.010569],[20.756,1.6793,-0.012604],[17.34,3.7824,-0.012604],[17.961,5.5349,-0.058951],[20.446,6.9369,-0.047364],[21.067,6.9369,-0.012604],[21.998,7.9885,-0.035777],[22.62,9.04,-0.001017],[21.067,8.6895,0.022156],[20.135,8.6895,0.010569],[19.203,8.339,-0.024191],[19.203,7.6379,-0.058951],[20.446,4.4834,-0.058951],[21.377,-0.42369,-0.001017],[19.824,-4.2792,0.010569],[17.961,-7.0833,-0.082124],[16.719,-4.9803,-0.070537],[17.029,-3.5782,-0.012604],[16.097,-8.4853,-0.058951],[12.371,-11.289,-0.047364],[10.196,-10.939,-0.001017],[9.2647,-13.392,-0.012604],[8.9541,-14.093,-0.047364],[8.0224,-10.939,-0.001017],[6.1589,-9.1863,0.022156],[4.9166,-7.7843,0.022156],[4.606,-6.7328,0.033743],[4.2955,-4.6298,0.4161],[12.992,-6.7328,-0.1053],[12.06,-8.4853,0.022156],[12.06,-8.8358,-0.024191],[17.961,-13.392,-0.035777],[26.036,-19.702,0.033743],[31.937,-23.908,0.045329],[38.149,-19,-0.024191],[45.602,-9.5368,-0.001017],[51.814,-2.5267,-0.001017],[54.92,2.0299,0.010569],[53.678,9.3905,-0.001017],[52.125,16.401,-0.047364],[47.777,16.751,-0.001017],[41.565,7.2874,0.010569],[28.521,3.0814,-0.012604],[24.483,7.2874,-0.012604],[25.104,8.6895,-0.058951],[27.899,11.494,-0.047364],[27.899,11.143,-0.024191],[27.899,11.494,-0.024191],[26.657,10.793,-0.001017],[24.483,9.3905,0.010569],[23.241,8.339,-0.001017],[22.62,7.6379,-0.035777],[22.93,6.5864,-0.070537],[23.862,3.7824,-0.082124],[24.483,-2.8772,-0.012604],[24.173,-6.7328,-0.001017],[22.62,-9.5368,-0.082124],[21.998,-7.4338,-0.070537],[22.62,-6.7328,-0.001017],[21.998,-11.289,-0.058951],[17.029,-14.444,-0.047364],[14.234,-14.444,-0.001017],[12.681,-16.547,-0.024191],[11.439,-16.196,-0.058951],[10.196,-13.042,-0.001017],[7.4013,-9.8873,0.022156],[6.4695,-7.4338,0.033743],[6.4695,-4.9803,0.022156],[6.7801,-3.5782,0.5088],[14.855,-7.0833,-0.14006],[12.992,-8.4853,0.022156],[12.992,-8.1348,-0.024191],[19.203,-13.042,-0.035777],[28.21,-20.403,0.033743],[34.422,-25.66,0.033743],[42.186,-21.454,-0.012604],[51.503,-10.238,0.010569],[58.647,-1.8257,0.010569],[63.305,3.4319,0.010569],[62.063,11.494,-0.001017],[59.889,19.205,-0.047364],[54.92,18.854,-0.001017],[48.087,8.339,0.010569],[33.8,4.1329,-0.012604],[30.074,9.3905,-0.024191],[30.074,11.844,-0.047364],[32.248,14.999,-0.047364],[32.248,14.298,-0.012604],[31.316,14.999,-0.012604],[29.142,12.195,-0.001017],[26.657,9.741,0.010569],[25.725,7.9885,-0.001017],[24.794,6.9369,-0.035777],[25.725,5.5349,-0.082124],[25.725,3.0814,-0.082124],[25.725,-4.9803,-0.012604],[26.036,-8.4853,-0.001017],[24.794,-10.939,-0.082124],[24.794,-8.8358,-0.070537],[26.036,-7.0833,-0.001017],[26.657,-12.341,-0.058951],[22.309,-16.196,-0.047364],[19.203,-16.547,-0.001017],[18.272,-19.351,-0.024191],[16.097,-19.702,-0.058951],[13.923,-15.495,-0.012604],[10.507,-11.289,0.022156],[8.6436,-7.7843,0.033743],[8.333,-4.6298,0.022156],[8.9541,-2.5267,0.5899],[17.029,-7.0833,-0.16323],[14.855,-8.4853,0.022156],[14.545,-7.4338,-0.024191],[21.067,-12.691,-0.024191],[30.695,-21.104,0.022156],[37.838,-26.361,0.033743],[46.534,-22.506,-0.012604],[56.783,-10.939,0.010569],[65.169,-2.1762,0.010569],[69.828,3.7824,0.010569],[69.206,12.195,-0.001017],[66.722,19.906,-0.035777],[60.821,19.205,-0.001017],[53.678,7.9885,-0.001017],[38.459,4.8339,-0.024191],[34.422,11.494,-0.024191],[34.111,14.999,-0.047364],[35.043,18.504,-0.035777],[35.043,18.153,-0.012604],[34.111,17.452,-0.001017],[31.937,13.597,0.010569],[28.521,9.741,0.010569],[26.968,7.6379,-0.012604],[26.657,5.5349,-0.047364],[26.968,5.5349,-0.082124],[26.657,3.0814,-0.082124],[26.657,-6.3823,-0.012604],[27.278,-9.5368,-0.001017],[26.657,-11.64,-0.070537],[26.657,-9.1863,-0.070537],[28.831,-6.7328,-0.001017],[30.695,-12.341,-0.058951],[26.968,-16.547,-0.047364],[24.483,-17.598,-0.001017],[23.241,-21.454,-0.024191],[21.998,-22.856,-0.058951],[18.893,-18.299,-0.012604],[14.855,-13.743,0.022156],[12.371,-9.1863,0.033743],[11.128,-5.3308,0.010569],[12.371,-3.5782,0.65942],[19.824,-7.0833,-0.17482],[17.34,-8.4853,0.010569],[16.719,-7.0833,-0.012604],[23.241,-11.64,-0.024191],[32.869,-20.403,0.022156],[40.633,-26.712,0.022156],[50.261,-23.207,-0.012604],[61.442,-11.64,0.010569],[69.828,-3.5782,0.010569],[75.418,2.3804,0.010569],[75.107,10.442,-0.001017],[72.312,18.153,-0.035777],[66.101,17.803,-0.001017],[58.026,7.2874,-0.012604],[43.118,5.5349,-0.024191],[39.08,14.298,-0.035777],[38.149,18.854,-0.047364],[39.08,22.009,-0.035777],[38.149,21.308,-0.001017],[36.596,19.906,0.010569],[34.111,14.298,0.010569],[31.005,9.741,0.010569],[29.142,6.9369,-0.012604],[28.521,4.8339,-0.047364],[28.831,5.5349,-0.082124],[28.21,3.4319,-0.082124],[28.521,-6.7328,-0.001017],[29.763,-10.238,-0.001017],[28.831,-12.341,-0.070537],[28.831,-9.1863,-0.058951],[31.316,-6.3823,-0.001017],[34.111,-11.64,-0.047364],[31.005,-15.495,-0.047364],[28.521,-17.598,-0.001017],[28.21,-22.506,-0.024191],[27.278,-24.609,-0.058951],[25.104,-21.104,-0.012604],[20.446,-15.846,0.022156],[17.029,-11.64,0.033743],[15.166,-7.4338,-0.001017],[16.408,-4.9803,0.74053],[22.93,-7.4338,-0.17482],[20.446,-8.4853,0.010569],[19.203,-6.7328,-0.012604],[25.725,-10.588,-0.012604],[35.664,-19.702,0.010569],[42.807,-25.66,0.010569],[52.435,-22.155,-0.001017],[62.684,-11.289,0.010569],[71.691,-2.8772,0.010569],[77.282,2.7309,0.010569],[78.213,10.442,0.010569],[76.35,18.153,-0.012604],[70.759,18.153,-0.001017],[63.616,8.339,-0.012604],[49.019,7.9885,-0.024191],[44.671,17.452,-0.035777],[42.497,22.009,-0.035777],[42.807,25.163,-0.024191],[41.876,23.411,0.010569],[40.323,20.607,0.022156],[38.149,13.947,0.010569],[35.664,8.6895,0.010569],[32.558,6.9369,-0.012604],[32.248,4.8339,-0.047364],[32.248,5.5349,-0.082124],[31.316,3.0814,-0.070537],[31.937,-7.7843,-0.001017],[33.179,-11.289,-0.001017],[33.179,-12.691,-0.058951],[33.8,-9.5368,-0.047364],[36.285,-6.3823,-0.001017],[38.459,-10.939,-0.035777],[35.664,-15.846,-0.035777],[33.179,-19,-0.001017],[33.179,-23.908,-0.012604],[32.869,-26.011,-0.035777],[31.005,-22.506,-0.012604],[26.657,-16.897,0.022156],[22.93,-12.691,0.033743],[21.067,-8.1348,-0.012604],[21.998,-5.6813,0.79846],[25.725,-8.1348,-0.15164],[23.241,-9.5368,-0.001017],[21.377,-7.0833,-0.001017],[26.968,-10.238,-0.012604],[35.975,-18.299,0.010569],[42.807,-24.258,0.010569],[51.503,-20.052,-0.001017],[60.51,-9.8873,0.010569],[68.275,-1.8257,0.010569],[73.865,3.7824,0.010569],[76.039,11.143,0.010569],[75.729,17.803,-0.012604],[71.691,17.803,-0.001017],[65.48,9.3905,-0.012604],[52.125,10.091,-0.035777],[46.534,19.555,-0.024191],[43.739,23.411,-0.024191],[42.807,26.565,-0.012604],[40.944,24.462,0.010569],[39.08,19.906,0.022156],[37.838,12.896,0.010569],[36.285,7.2874,0.010569],[34.422,6.9369,-0.024191],[34.111,6.5864,-0.047364],[34.732,7.6379,-0.070537],[35.664,5.1844,-0.058951],[37.217,-6.7328,-0.001017],[39.701,-11.289,-0.001017],[39.701,-13.042,-0.047364],[39.08,-10.238,-0.024191],[41.876,-7.4338,0.010569],[43.118,-11.64,-0.012604],[40.012,-16.897,-0.012604],[37.217,-21.104,0.010569],[37.838,-24.959,-0.001017],[37.217,-26.712,-0.024191],[35.975,-22.856,-0.012604],[32.558,-16.547,0.010569],[29.763,-12.691,0.033743],[28.21,-9.8873,-0.024191],[28.831,-7.4338,0.83322],[27.278,-8.8358,-0.12847],[26.036,-11.64,-0.001017],[24.794,-9.1863,-0.001017],[29.763,-11.289,-0.001017],[37.217,-17.949,-0.001017],[43.118,-22.155,0.010569],[50.882,-17.949,0.010569],[58.026,-8.8358,0.010569],[64.237,-1.8257,0.010569],[69.206,4.4834,-0.001017],[71.691,10.442,-0.001017],[71.691,14.999,-0.012604],[67.964,14.298,-0.001017],[62.374,8.339,-0.012604],[50.261,9.741,-0.024191],[44.671,18.854,-0.024191],[41.565,22.71,-0.024191],[40.323,25.864,-0.001017],[38.459,24.462,0.010569],[37.217,19.906,0.022156],[36.596,12.896,-0.001017],[35.975,7.2874,-0.001017],[34.732,7.9885,-0.024191],[35.043,9.04,-0.035777],[36.285,10.442,-0.058951],[37.838,8.339,-0.047364],[40.323,-6.3823,-0.001017],[42.807,-11.64,-0.001017],[42.186,-12.691,-0.035777],[40.944,-9.5368,-0.012604],[44.05,-7.4338,0.010569],[44.981,-10.588,-0.001017],[41.565,-15.145,-0.012604],[39.08,-19.702,0.010569],[39.08,-23.207,-0.001017],[38.459,-23.908,-0.012604],[36.906,-20.403,-0.012604],[35.664,-14.444,0.010569],[32.869,-11.289,0.022156],[32.248,-10.939,-0.024191],[33.8,-9.1863,0.83322],[28.21,-9.8873,-0.093711],[28.831,-14.444,-0.012604],[29.142,-13.392,-0.001017],[32.869,-14.093,-0.001017],[39.08,-17.598,-0.001017],[44.36,-19.702,-0.001017],[51.503,-15.495,0.010569],[56.783,-7.7843,-0.001017],[60.821,-1.8257,-0.001017],[63.927,4.1329,-0.001017],[66.722,8.339,-0.001017],[65.169,8.6895,-0.012604],[60.821,8.339,-0.001017],[54.609,4.4834,-0.012604],[44.36,7.6379,-0.024191],[39.08,15.349,-0.024191],[36.596,19.906,-0.012604],[35.975,23.411,-0.001017],[34.732,23.06,0.010569],[35.664,20.256,0.010569],[35.975,13.246,-0.001017],[35.975,8.6895,-0.012604],[34.732,10.792,-0.024191],[35.664,12.195,-0.024191],[36.596,13.947,-0.047364],[38.149,10.442,-0.035777],[39.701,-7.0833,-0.001017],[42.497,-12.691,-0.001017],[40.323,-11.64,-0.024191],[38.459,-7.4338,-0.012604],[42.807,-5.6813,0.010569],[44.05,-7.4338,-0.001017],[40.944,-10.939,-0.001017],[38.459,-16.196,-0.001017],[38.149,-17.598,-0.001017],[35.975,-17.598,-0.012604],[34.422,-15.495,-0.012604],[34.732,-10.939,-0.001017],[33.179,-10.238,0.010569],[33.179,-11.64,-0.024191],[36.285,-10.588,0.78688],[26.657,-9.1863,-0.070537],[28.21,-14.093,-0.024191],[30.074,-14.444,-0.001017],[32.869,-15.145,-0.001017],[37.217,-16.897,-0.012604],[41.876,-16.897,-0.001017],[46.224,-13.743,-0.001017],[49.64,-8.4853,-0.001017],[52.125,-2.5267,-0.001017],[52.746,4.1329,-0.001017],[53.678,8.6895,-0.001017],[51.503,9.741,-0.001017],[48.398,9.3905,-0.001017],[45.602,8.339,-0.012604],[40.012,11.494,-0.024191],[36.596,16.05,-0.024191],[34.732,17.803,-0.001017],[34.111,18.854,0.010569],[33.179,18.504,0.010569],[34.422,18.153,0.010569],[34.111,13.246,-0.001017],[32.558,9.04,-0.001017],[30.384,11.844,-0.012604],[30.384,13.246,-0.012604],[31.316,16.751,-0.024191],[32.869,13.246,-0.012604],[34.111,-6.3823,-0.001017],[38.149,-12.691,-0.001017],[36.596,-10.939,-0.001017],[34.732,-5.6813,-0.001017],[38.77,-2.5267,-0.001017],[39.701,-4.6298,-0.001017],[36.596,-9.1863,-0.001017],[34.422,-14.794,-0.001017],[34.422,-15.145,-0.001017],[32.558,-14.794,-0.001017],[31.937,-12.691,-0.012604],[32.248,-8.1348,-0.001017],[31.005,-8.4853,-0.001017],[31.937,-11.64,-0.024191],[34.422,-10.939,0.7637],[24.483,-8.1348,-0.058951],[26.657,-13.042,-0.035777],[29.142,-15.145,-0.001017],[32.248,-15.846,-0.001017],[34.422,-15.846,-0.012604],[37.217,-13.743,-0.012604],[39.08,-11.289,-0.012604],[40.633,-9.1863,-0.012604],[40.944,-2.8772,-0.001017],[40.012,3.4319,-0.012604],[38.149,9.741,-0.001017],[35.664,12.896,-0.001017],[34.111,12.896,-0.001017],[35.664,14.298,-0.012604],[36.285,17.803,-0.024191],[34.422,18.153,-0.024191],[33.8,15.349,0.010569],[32.869,13.597,0.022156],[32.558,12.896,-0.001017],[33.8,14.298,0.010569],[32.248,13.246,0.010569],[28.831,9.04,-0.001017],[23.862,12.195,-0.001017],[22.62,13.597,-0.001017],[23.862,18.504,0.010569],[26.036,16.751,-0.001017],[26.657,-4.9803,-0.001017],[32.248,-12.691,-0.001017],[32.248,-10.238,0.010569],[31.005,-3.9287,-0.001017],[34.422,0.62783,-0.001017],[33.8,-1.8257,-0.001017],[31.316,-8.1348,-0.001017],[29.763,-14.093,-0.001017],[30.384,-13.743,-0.012604],[29.142,-12.691,-0.001017],[28.21,-9.8873,-0.001017],[29.142,-5.6813,-0.012604],[27.278,-6.3823,-0.012604],[28.521,-10.939,-0.024191],[31.316,-10.939,0.74053],[4.9166,-1.1247,-0.001017],[4.2955,-0.77419,-0.001017],[4.2955,-0.42369,-0.001017],[3.3637,0.27732,-0.001017],[2.1214,-0.073182,-0.001017],[0.56851,-0.42369,-0.001017],[-0.6738,0.27732,-0.001017],[-0.36322,-1.8257,-0.001017],[-0.6738,-1.8257,-0.001017],[-0.36322,-2.5267,-0.001017],[1.1897,-4.2793,-0.001017],[6.4695,-1.1247,-0.001017],[6.7801,2.0299,-0.001017],[2.7426,0.97833,-0.001017],[4.9166,-1.1247,-0.001017],[7.0907,1.3288,-0.001017],[7.0907,3.7824,-0.001017],[5.2272,3.7824,-0.001017],[4.2955,2.7309,-0.001017],[1.5003,3.4319,-0.001017],[0.56851,2.3804,-0.001017],[-1.295,4.4834,-0.001017],[-2.5373,6.2359,-0.001017],[-0.6738,7.6379,-0.001017],[-1.295,5.5349,-0.001017],[-0.6738,4.8339,-0.001017],[-0.36322,3.7824,-0.001017],[-1.295,2.0299,-0.001017],[-0.98438,2.3804,-0.001017],[-1.6055,2.0299,-0.001017],[0.87909,-0.42369,-0.001017],[3.0531,-1.1247,-0.001017],[3.0531,-0.77419,-0.001017],[5.2272,-0.42369,-0.001017],[3.6743,0.27732,-0.001017],[6.4695,1.6793,-0.001017],[6.4695,2.7309,-0.001017],[4.9166,2.0299,-0.001017],[2.7426,2.7309,-0.001017],[-0.6738,1.6793,-0.001017],[-4.4008,2.0299,-0.001017],[9.2647,-3.9287,-0.035777],[8.6436,-3.9287,-0.001017],[9.2647,-2.5267,-0.012604],[9.2647,-2.1762,-0.001017],[8.9541,-4.2793,0.010569],[8.333,-2.5267,-0.001017],[10.196,-0.77419,-0.001017],[12.992,-1.8257,-0.012604],[12.681,-2.5267,-0.001017],[11.439,-3.2277,-0.001017],[12.371,-1.1247,-0.024191],[13.923,1.6793,-0.012604],[12.06,0.27732,0.010569],[12.992,-0.073181,-0.012604],[10.507,-0.77419,-0.012604],[7.0907,1.3288,-0.001017],[7.0907,3.7824,-0.001017],[5.2272,3.7824,-0.001017],[4.2955,2.7309,-0.001017],[2.432,4.1329,-0.001017],[2.432,3.4319,-0.001017],[0.25794,5.1844,0.010569],[-0.6738,8.339,-0.012604],[1.5003,10.442,-0.012604],[1.1897,12.896,-0.001017],[2.432,9.3905,-0.024191],[2.432,7.2874,-0.001017],[0.25794,5.5349,-0.012604],[0.25794,3.0814,-0.012604],[-0.36322,2.0299,-0.001017],[2.1214,-0.77419,-0.035777],[5.2272,-2.1762,-0.035777],[6.1589,-3.5782,-0.024191],[7.4013,-3.9287,-0.024191],[6.4695,-3.5782,-0.024191],[6.4695,-1.1247,-0.012604],[6.4695,0.27732,-0.001017],[5.2272,0.27732,-0.001017],[3.6743,0.27732,0.010569],[0.87909,-0.073181,0.022156],[-2.2267,-0.42369,0.10326],[13.302,-8.4853,-0.047364],[14.234,-11.289,-0.001017],[15.476,-12.691,-0.024191],[16.719,-11.64,0.010569],[17.34,-10.238,0.022156],[18.272,-9.1863,0.010569],[21.067,-1.8257,-0.001017],[21.998,2.0299,-0.012604],[22.93,-0.073181,0.010569],[20.756,-0.42369,-0.001017],[19.824,-0.073181,-0.024191],[21.377,0.27732,-0.035777],[26.347,3.0814,-0.001017],[25.725,5.5349,-0.024191],[18.272,4.4834,-0.024191],[12.681,3.7824,-0.024191],[12.371,4.8339,-0.012604],[12.371,3.4319,-0.024191],[12.681,3.7824,-0.001017],[10.507,4.8339,-0.012604],[10.196,6.5864,0.010569],[8.0224,8.339,0.033743],[4.9166,9.04,-0.024191],[5.5378,12.195,-0.001017],[5.5378,13.246,-0.001017],[7.4013,10.442,-0.035777],[7.4013,6.5864,0.010569],[3.6743,2.7309,-0.012604],[2.7426,-0.073181,-0.001017],[1.1897,-1.1247,-0.001017],[3.6743,-2.5267,-0.058951],[8.0224,-4.2793,-0.058951],[8.6436,-4.6298,-0.047364],[9.5753,-4.2793,-0.035777],[9.2647,-4.2793,-0.024191],[8.333,-4.6298,-0.012604],[6.4695,-3.5782,0.010569],[4.2955,-5.6813,0.010569],[3.0531,-6.3823,0.022156],[0.56851,-6.0318,0.045329],[-1.295,-6.0318,0.23072],[12.992,-7.7843,-0.047364],[13.302,-10.939,-0.012604],[15.476,-14.093,-0.024191],[20.135,-17.248,0.010569],[23.241,-19.351,0.022156],[25.725,-19,0.010569],[27.899,-11.64,-0.012604],[27.278,-1.1247,-0.012604],[28.831,1.3288,-0.001017],[28.521,2.7309,-0.001017],[28.831,3.7824,-0.035777],[32.869,7.6379,-0.070537],[34.422,12.195,-0.001017],[29.763,12.545,-0.001017],[19.824,9.04,-0.012604],[16.719,6.2359,-0.035777],[15.166,5.1844,-0.035777],[16.408,3.7824,-0.047364],[15.476,5.5349,-0.001017],[13.302,5.5349,-0.024191],[15.166,7.9885,-0.001017],[14.234,9.741,0.033743],[12.371,9.741,-0.035777],[12.992,10.091,-0.012604],[12.681,10.792,-0.001017],[12.992,9.741,-0.058951],[13.923,6.2359,0.010569],[10.818,1.3288,-0.012604],[8.9541,-1.8257,-0.001017],[5.5378,-3.5782,0.010569],[8.0224,-4.6298,-0.082124],[11.128,-6.0318,-0.093711],[10.818,-6.0318,-0.058951],[10.818,-6.3823,-0.047364],[10.507,-6.3823,-0.035777],[9.5753,-7.7843,-0.012604],[8.0224,-6.0318,0.022156],[5.5378,-6.3823,0.010569],[4.606,-6.7328,0.033743],[2.7426,-5.3308,0.056916],[2.432,-6.7328,0.34658],[12.992,-5.6813,-0.058951],[12.992,-9.5368,-0.012604],[15.476,-13.743,-0.035777],[21.067,-19,0.010569],[26.657,-23.557,0.022156],[30.384,-24.959,0.010569],[33.179,-21.104,-0.012604],[38.459,-12.341,-0.024191],[42.807,-4.9803,-0.012604],[44.36,0.97834,-0.012604],[43.118,7.9885,-0.047364],[40.633,14.298,-0.070537],[38.459,18.504,-0.001017],[34.111,16.401,-0.001017],[24.483,10.442,-0.001017],[19.824,6.9369,-0.035777],[19.203,4.8339,-0.058951],[21.377,5.1844,-0.070537],[22.309,7.6379,-0.012604],[22.309,7.2874,-0.035777],[24.173,9.3905,-0.012604],[22.93,10.091,0.033743],[21.377,9.3905,-0.035777],[21.067,8.339,-0.024191],[20.756,7.9885,-0.012604],[21.377,5.5349,-0.082124],[22.309,0.97834,0.010569],[19.824,-1.8257,-0.012604],[18.582,-5.3308,0.010569],[13.302,-4.9803,0.010569],[14.545,-5.3308,-0.093711],[15.476,-7.0833,-0.1053],[13.923,-8.4853,-0.070537],[12.371,-9.8873,-0.047364],[11.439,-11.289,-0.047364],[10.196,-12.691,-0.012604],[8.0224,-9.8873,0.022156],[6.1589,-8.8358,0.022156],[5.2272,-7.4338,0.033743],[4.606,-5.6813,0.056916],[6.4695,-7.7843,0.45086],[13.302,-5.3308,-0.082124],[13.302,-9.1863,-0.012604],[16.097,-13.392,-0.035777],[22.62,-20.052,0.010569],[29.142,-25.31,0.022156],[33.179,-27.763,0.010569],[36.596,-26.011,-0.001017],[43.118,-17.598,-0.012604],[50.261,-8.1348,-0.012604],[53.367,0.62783,-0.012604],[52.435,8.6895,-0.035777],[50.882,16.05,-0.047364],[48.398,19.906,-0.001017],[42.497,16.751,-0.001017],[31.316,11.844,-0.001017],[26.968,9.04,-0.035777],[26.347,7.2874,-0.058951],[28.521,9.04,-0.070537],[30.695,11.143,-0.012604],[30.695,9.741,-0.035777],[30.384,11.494,-0.012604],[28.21,11.143,0.033743],[26.657,9.3905,-0.035777],[26.347,7.9885,-0.024191],[25.725,6.5864,-0.024191],[26.968,3.7824,-0.1053],[26.968,-1.8257,-0.001017],[26.036,-5.3308,-0.024191],[24.173,-9.5368,0.010569],[19.203,-8.4853,0.022156],[19.824,-7.0833,-0.093711],[19.824,-9.1863,-0.1053],[18.272,-10.939,-0.082124],[16.097,-13.042,-0.058951],[14.855,-14.794,-0.047364],[12.06,-14.444,-0.024191],[8.6436,-10.939,0.022156],[6.4695,-8.8358,0.022156],[5.5378,-6.3823,0.045329],[6.1589,-4.6298,0.056916],[9.2647,-8.1348,0.54356],[14.545,-4.6298,-0.1053],[14.545,-8.8358,-0.012604],[17.029,-13.042,-0.024191],[24.483,-21.104,0.010569],[31.937,-26.361,0.022156],[36.596,-30.217,0.010569],[40.633,-28.464,-0.001017],[48.708,-19.702,-0.012604],[56.783,-8.1348,-0.012604],[61.753,2.7309,-0.012604],[61.442,12.545,-0.024191],[60.2,20.607,-0.047364],[56.783,24.112,-0.012604],[50.261,19.205,-0.012604],[37.838,14.298,-0.001017],[32.869,11.844,-0.035777],[32.248,10.091,-0.058951],[33.8,12.195,-0.070537],[35.664,13.947,-0.012604],[35.664,12.545,-0.012604],[33.8,13.597,-0.001017],[31.005,12.195,0.033743],[29.142,9.741,-0.035777],[29.142,6.9369,-0.035777],[28.831,4.4834,-0.024191],[30.074,2.0299,-0.11688],[29.142,-4.2793,-0.001017],[28.521,-7.7843,-0.024191],[26.347,-11.289,0.010569],[22.309,-10.238,0.022156],[23.862,-8.4853,-0.082124],[24.794,-10.238,-0.11688],[24.173,-13.042,-0.093711],[21.377,-15.495,-0.058951],[20.135,-17.598,-0.058951],[14.855,-16.897,-0.024191],[10.507,-12.341,0.010569],[7.0907,-8.8358,0.022156],[6.4695,-5.3308,0.033743],[7.4013,-2.8772,0.045329],[12.06,-7.7843,0.61308],[16.408,-4.6298,-0.12847],[16.408,-8.4853,-0.012604],[18.893,-12.691,-0.024191],[26.347,-21.104,0.010569],[34.111,-27.062,0.022156],[40.012,-31.268,0.010569],[44.36,-30.567,0.010569],[53.678,-21.104,-0.001017],[63.616,-8.4853,-0.001017],[68.585,3.4319,-0.001017],[68.585,13.947,-0.012604],[67.654,22.359,-0.035777],[63.616,25.864,-0.012604],[55.541,19.906,-0.012604],[42.497,15.7,-0.012604],[37.838,13.947,-0.035777],[36.285,13.246,-0.058951],[37.217,15.7,-0.058951],[38.77,17.452,-0.001017],[38.77,15.7,-0.001017],[36.596,16.05,0.010569],[32.869,13.246,0.045329],[31.005,9.3905,-0.035777],[30.695,5.5349,-0.047364],[31.005,3.0814,-0.035777],[32.248,0.62783,-0.11688],[31.005,-5.6813,-0.001017],[30.074,-9.1863,-0.012604],[28.21,-12.691,0.022156],[24.483,-11.289,0.022156],[26.657,-9.5368,-0.082124],[29.763,-11.64,-0.11688],[29.763,-14.093,-0.093711],[27.278,-17.248,-0.058951],[26.036,-20.403,-0.058951],[19.203,-20.052,-0.024191],[13.923,-14.444,0.010569],[9.2647,-9.8873,0.010569],[8.6436,-6.0318,0.022156],[10.196,-3.9287,0.033743],[14.855,-8.8358,0.6826],[18.582,-4.6298,-0.14006],[18.272,-8.4853,-0.012604],[20.756,-12.341,-0.024191],[28.521,-20.403,-0.001017],[36.596,-27.062,0.010569],[42.807,-31.969,0.010569],[47.777,-31.619,0.010569],[58.026,-22.506,-0.001017],[68.275,-10.238,-0.001017],[73.865,0.62783,-0.001017],[74.486,10.442,-0.012604],[72.623,19.205,-0.035777],[67.964,23.06,-0.001017],[59.268,17.452,-0.012604],[44.981,14.999,-0.024191],[41.565,16.05,-0.035777],[39.701,16.751,-0.058951],[40.323,19.555,-0.047364],[41.565,20.957,0.010569],[40.944,19.205,0.022156],[38.77,17.803,0.033743],[35.664,13.947,0.045329],[32.248,9.04,-0.047364],[31.937,4.1329,-0.047364],[32.248,1.6793,-0.035777],[34.111,-0.42369,-0.1053],[32.869,-6.3823,0.010569],[32.248,-9.8873,-0.012604],[30.384,-13.392,0.022156],[26.657,-12.341,0.022156],[29.142,-10.588,-0.070537],[32.869,-13.042,-0.1053],[34.111,-14.794,-0.093711],[32.248,-18.299,-0.047364],[31.937,-23.207,-0.058951],[25.725,-23.908,-0.024191],[18.582,-17.949,0.010569],[12.992,-12.341,-0.001017],[12.681,-8.4853,0.010569],[13.923,-6.3823,0.022156],[18.893,-11.289,0.74053],[21.067,-4.9803,-0.15164],[20.756,-8.1348,-0.012604],[22.93,-11.289,-0.012604],[30.695,-19.351,-0.001017],[38.77,-26.361,0.010569],[44.671,-30.918,0.010569],[49.64,-30.567,0.010569],[58.647,-21.104,-0.001017],[69.206,-9.8873,-0.001017],[75.107,0.27732,-0.001017],[77.282,10.091,-0.012604],[76.35,18.854,-0.024191],[72.623,23.06,-0.001017],[64.237,18.504,-0.012604],[50.882,17.452,-0.024191],[46.224,19.906,-0.035777],[43.739,20.957,-0.047364],[43.739,23.06,-0.035777],[44.671,24.112,0.010569],[44.36,20.607,0.033743],[43.118,17.452,0.033743],[40.012,13.597,0.045329],[36.285,8.6895,-0.047364],[34.732,3.4319,-0.047364],[35.975,0.97834,-0.035777],[38.149,-1.1247,-0.093711],[36.906,-7.0833,0.010569],[35.975,-10.939,-0.001017],[34.732,-14.093,0.022156],[31.005,-12.691,0.022156],[32.558,-10.939,-0.058951],[37.217,-14.093,-0.093711],[38.77,-15.495,-0.070537],[36.596,-19.702,-0.035777],[36.596,-25.31,-0.035777],[31.316,-26.011,-0.012604],[24.173,-19.702,0.010569],[18.582,-13.392,-0.001017],[18.272,-8.8358,-0.001017],[18.893,-7.0833,-0.001017],[23.862,-13.042,0.78688],[23.862,-5.6813,-0.14006],[22.93,-8.8358,-0.012604],[24.483,-11.289,-0.012604],[31.316,-18.65,-0.001017],[38.459,-24.609,0.010569],[42.807,-28.464,0.010569],[46.534,-27.062,0.010569],[54.92,-17.598,0.010569],[63.927,-7.7843,-0.001017],[69.517,1.3288,-0.001017],[72.623,10.442,-0.012604],[73.555,18.504,-0.024191],[71.691,22.359,-0.001017],[66.101,18.854,-0.012604],[53.678,19.205,-0.024191],[48.398,22.359,-0.035777],[44.36,23.411,-0.035777],[43.739,25.514,-0.024191],[43.739,25.514,0.022156],[43.739,20.607,0.033743],[43.118,16.401,0.033743],[41.876,12.545,0.045329],[37.838,8.339,-0.047364],[37.217,4.1329,-0.058951],[39.08,2.3804,-0.035777],[42.186,0.62783,-0.082124],[42.186,-5.6813,0.010569],[41.565,-10.588,-0.001017],[40.323,-13.743,0.022156],[35.664,-13.042,0.022156],[37.217,-10.939,-0.035777],[40.633,-14.093,-0.070537],[42.807,-16.196,-0.047364],[40.633,-21.454,-0.024191],[40.944,-26.712,-0.024191],[36.596,-26.361,-0.001017],[30.074,-20.403,0.022156],[24.794,-13.042,-0.001017],[24.794,-9.1863,-0.001017],[25.725,-8.8358,-0.012604],[29.763,-13.743,0.78688],[25.725,-7.4338,-0.11688],[25.725,-10.939,-0.012604],[26.968,-13.042,-0.001017],[32.869,-18.65,-0.001017],[38.77,-23.207,0.010569],[42.186,-26.011,0.010569],[44.981,-23.557,0.010569],[51.814,-14.444,0.010569],[58.647,-6.0318,-0.001017],[63.305,1.6793,-0.001017],[66.722,9.3905,-0.012604],[67.654,16.05,-0.012604],[66.101,18.854,-0.001017],[61.442,16.401,-0.012604],[50.572,18.153,-0.024191],[45.602,22.009,-0.024191],[41.565,23.06,-0.024191],[40.012,25.163,-0.012604],[40.323,25.163,0.022156],[41.565,19.906,0.033743],[42.186,15.349,0.022156],[41.876,12.195,0.022156],[38.149,9.04,-0.047364],[38.149,5.5349,-0.047364],[40.633,4.1329,-0.035777],[44.671,2.3804,-0.058951],[45.602,-4.9803,0.010569],[44.05,-10.238,-0.001017],[41.876,-12.341,0.022156],[35.664,-11.289,0.022156],[37.217,-9.5368,-0.024191],[40.944,-11.64,-0.047364],[44.36,-14.444,-0.035777],[42.186,-19.351,-0.012604],[42.186,-23.908,-0.012604],[38.149,-22.856,-0.001017],[32.248,-17.949,0.022156],[28.831,-11.64,-0.001017],[30.074,-8.8358,-0.012604],[31.005,-10.238,-0.024191],[34.111,-14.444,0.77529],[26.657,-10.238,-0.093711],[28.521,-14.794,-0.012604],[31.005,-16.196,-0.001017],[35.664,-19.351,-0.001017],[40.323,-21.805,-0.001017],[43.118,-22.856,0.010569],[46.224,-19,0.010569],[50.882,-11.289,0.010569],[54.609,-4.6298,-0.001017],[58.026,1.3288,-0.001017],[60.821,7.6379,-0.012604],[60.2,11.143,-0.012604],[56.783,12.545,-0.012604],[50.572,11.143,-0.012604],[42.807,13.947,-0.024191],[38.149,18.153,-0.024191],[34.732,19.906,-0.012604],[33.8,22.71,-0.001017],[35.664,23.06,0.010569],[38.459,19.205,0.022156],[40.323,14.999,0.010569],[40.944,12.896,0.010569],[36.906,10.091,-0.035777],[38.149,7.6379,-0.035777],[40.944,5.5349,-0.035777],[45.913,3.4319,-0.047364],[45.602,-5.6813,0.010569],[42.807,-10.588,-0.001017],[38.77,-9.1863,0.010569],[31.316,-7.7843,0.010569],[33.179,-6.3823,-0.024191],[37.217,-7.0833,-0.035777],[42.497,-9.1863,-0.024191],[40.323,-14.444,-0.001017],[39.701,-16.897,-0.012604],[36.285,-15.846,-0.001017],[32.248,-13.392,0.010569],[30.384,-9.1863,-0.001017],[32.558,-8.4853,-0.012604],[34.732,-12.341,-0.024191],[37.838,-15.145,0.72894],[26.036,-10.238,-0.082124],[28.21,-15.145,-0.012604],[31.005,-16.897,-0.001017],[33.8,-18.299,-0.001017],[36.596,-19,-0.001017],[38.77,-18.65,-0.001017],[41.565,-15.495,-0.001017],[44.05,-9.5368,-0.001017],[45.913,-3.5782,-0.001017],[46.845,3.0814,-0.001017],[47.777,9.04,-0.001017],[46.224,11.844,-0.012604],[43.739,12.195,-0.001017],[40.323,11.494,-0.012604],[36.596,15.7,-0.024191],[34.422,17.803,-0.012604],[32.558,17.102,-0.001017],[32.248,18.504,0.010569],[34.111,18.854,0.010569],[36.596,16.401,0.010569],[38.459,14.298,0.010569],[37.838,12.896,-0.001017],[33.8,11.143,-0.012604],[34.111,9.3905,-0.012604],[35.043,7.6379,-0.012604],[40.633,6.9369,-0.012604],[40.323,-4.6298,-0.001017],[37.838,-10.939,-0.001017],[34.111,-7.7843,-0.001017],[25.725,-6.3823,-0.001017],[28.831,-4.2793,-0.001017],[32.248,-4.9803,-0.012604],[38.149,-8.4853,-0.001017],[36.285,-14.444,-0.001017],[36.285,-15.495,-0.001017],[33.8,-13.392,-0.001017],[28.831,-10.939,-0.001017],[27.278,-7.0833,-0.012604],[30.695,-7.0833,-0.012604],[32.869,-12.691,-0.035777],[35.664,-15.145,0.69418],[24.483,-9.5368,-0.070537],[26.968,-14.444,-0.012604],[30.074,-16.547,-0.001017],[31.005,-16.897,-0.012604],[31.937,-16.196,-0.012604],[32.558,-14.444,-0.012604],[34.422,-12.341,-0.012604],[34.422,-8.1348,-0.012604],[34.732,-2.1762,-0.012604],[34.111,4.8339,-0.001017],[32.248,11.494,-0.001017],[30.384,14.298,-0.001017],[29.142,13.597,-0.001017],[30.074,13.246,-0.012604],[31.937,18.504,-0.024191],[32.248,18.153,-0.012604],[31.937,14.298,0.010569],[32.248,13.246,0.022156],[33.8,12.896,-0.001017],[35.043,12.195,0.010569],[36.906,13.597,0.010569],[33.8,12.545,-0.001017],[29.763,11.844,0.010569],[28.831,11.143,0.010569],[27.899,9.3905,-0.001017],[33.179,10.442,0.010569],[33.8,-3.5782,-0.001017],[31.937,-11.289,-0.001017],[28.831,-7.0833,-0.012604],[19.824,-5.3308,-0.012604],[24.173,-2.5267,0.010569],[26.657,-3.9287,0.010569],[32.558,-9.1863,0.010569],[31.316,-15.846,-0.001017],[32.248,-15.145,-0.001017],[31.005,-12.341,-0.012604],[24.794,-9.1863,-0.012604],[22.62,-4.9803,-0.012604],[26.657,-5.6813,-0.012604],[29.763,-12.341,-0.035777],[31.316,-14.444,0.65942],[4.9166,-0.42369,-0.001017],[4.9166,-0.42369,-0.001017],[4.606,0.27732,-0.001017],[3.0531,0.62783,-0.001017],[1.1897,-0.42369,-0.001017],[0.56851,-0.77419,-0.001017],[-0.6738,-0.42369,-0.001017],[-1.6055,-0.42369,-0.001017],[-0.98438,-1.4752,-0.001017],[-0.6738,-1.8257,-0.001017],[2.1214,-3.2277,-0.001017],[7.4013,-1.4752,-0.001017],[7.0907,3.0814,-0.001017],[4.2955,2.3804,-0.001017],[7.0907,0.97833,-0.001017],[11.128,5.1844,-0.001017],[9.2647,6.2359,-0.001017],[6.1589,6.5864,-0.001017],[6.7801,4.4834,-0.001017],[3.6743,4.4834,-0.001017],[1.5003,4.4834,-0.001017],[-0.6738,4.4834,-0.001017],[-0.36322,6.5864,-0.001017],[0.87909,7.2874,-0.001017],[-1.295,4.8339,-0.001017],[-0.36322,5.5349,-0.001017],[-0.6738,4.1329,-0.001017],[-0.6738,4.4834,-0.001017],[-1.295,2.0299,-0.001017],[-2.8479,-0.073182,-0.001017],[1.1897,2.3804,-0.001017],[2.1214,1.6793,-0.001017],[5.2272,1.6793,-0.001017],[6.1589,0.97833,-0.001017],[5.2272,2.3804,-0.001017],[8.0224,1.6793,-0.001017],[7.4013,2.3804,-0.001017],[6.4695,3.0814,-0.001017],[2.7426,3.7824,-0.001017],[0.56851,2.7309,-0.001017],[-3.469,2.3804,-0.001017],[10.507,-2.5267,-0.058951],[9.5753,-3.2277,-0.001017],[10.507,-3.2277,-0.001017],[10.507,-4.9803,0.010569],[8.333,-3.2277,-0.001017],[8.333,-2.5267,-0.001017],[8.9541,-3.2277,0.010569],[10.507,-3.2277,-0.012604],[13.302,-2.1762,-0.024191],[12.06,-2.5267,-0.012604],[12.681,-3.5782,-0.035777],[14.234,0.97834,-0.024191],[12.681,3.0814,-0.001017],[13.302,1.6793,-0.012604],[13.923,1.3288,-0.035777],[11.128,5.1844,-0.001017],[9.2647,6.2359,-0.001017],[6.1589,6.5864,-0.001017],[6.7801,4.4834,-0.001017],[3.6743,4.4834,-0.001017],[3.0531,5.5349,-0.001017],[1.5003,5.1844,-0.001017],[2.432,9.04,-0.012604],[3.6743,8.6895,0.010569],[2.432,11.844,0.010569],[2.7426,10.792,-0.012604],[2.1214,7.9885,-0.001017],[0.25794,5.5349,-0.001017],[-0.6738,1.3288,-0.001017],[0.56851,0.97834,-0.012604],[2.1214,0.27732,-0.024191],[4.9166,0.27732,-0.047364],[9.2647,-0.77419,-0.035777],[10.196,-1.8257,-0.012604],[8.6436,-1.4752,-0.012604],[8.9541,-1.1247,-0.001017],[8.333,0.27732,-0.001017],[7.4013,0.62783,0.010569],[4.606,0.97834,0.010569],[2.7426,-0.77419,0.010569],[1.5003,-0.073181,0.1612],[16.097,-8.4853,-0.070537],[16.097,-12.341,-0.012604],[17.34,-13.042,-0.001017],[17.961,-12.691,0.022156],[17.029,-10.939,0.010569],[17.029,-8.8358,-0.001017],[15.476,-4.6298,0.010569],[18.893,-1.8257,-0.012604],[21.377,2.0299,-0.024191],[21.067,2.3804,-0.024191],[19.824,0.27732,-0.047364],[18.272,1.3288,-0.024191],[22.309,2.0299,-0.012604],[26.347,8.6895,-0.024191],[23.862,10.091,-0.058951],[18.272,8.6895,-0.035777],[14.545,7.2874,-0.001017],[12.06,6.2359,-0.001017],[14.234,5.5349,-0.024191],[14.234,6.5864,0.010569],[12.06,8.6895,0.010569],[10.196,10.792,-0.012604],[8.9541,11.143,-0.012604],[8.333,11.844,0.022156],[7.4013,12.896,0.022156],[8.9541,10.792,-0.001017],[8.0224,8.339,-0.001017],[5.2272,4.4834,0.010569],[2.432,-0.42369,0.010569],[1.5003,-1.8257,-0.024191],[3.3637,-2.5267,-0.058951],[7.0907,-3.2277,-0.093711],[12.371,-3.9287,-0.070537],[13.302,-4.2793,-0.012604],[12.371,-3.2277,-0.012604],[11.128,-3.9287,0.010569],[8.9541,-3.2277,0.010569],[7.4013,-4.6298,0.022156],[4.606,-5.3308,0.033743],[3.6743,-5.6813,0.022156],[6.1589,-8.1348,0.27706],[15.166,-8.1348,-0.082124],[16.408,-12.341,-0.012604],[19.203,-16.547,-0.001017],[21.998,-20.052,0.022156],[23.862,-21.454,0.010569],[24.483,-19,-0.012604],[21.067,-10.238,0.010569],[24.794,-4.2793,-0.012604],[26.968,1.6793,-0.035777],[26.968,4.8339,-0.024191],[25.725,5.1844,-0.058951],[27.899,6.9369,-0.047364],[31.937,12.195,-0.035777],[32.248,18.504,-0.024191],[26.036,15.7,-0.047364],[22.309,10.442,-0.047364],[18.582,7.2874,-0.001017],[16.097,5.1844,-0.024191],[16.719,6.2359,-0.058951],[16.408,6.5864,-0.001017],[15.476,9.3905,0.010569],[15.476,12.195,-0.012604],[14.855,10.091,-0.024191],[16.097,10.792,0.022156],[14.234,11.143,0.022156],[14.545,9.741,-0.001017],[15.166,7.9885,-0.001017],[12.992,3.7824,0.022156],[8.6436,-0.42369,0.022156],[6.7801,-3.5782,-0.024191],[8.0224,-6.0318,-0.082124],[10.196,-6.0318,-0.14006],[14.234,-5.6813,-0.093711],[14.545,-6.0318,-0.012604],[13.923,-6.0318,-0.012604],[12.681,-6.0318,0.022156],[10.196,-4.6298,0.022156],[8.333,-5.3308,0.022156],[6.1589,-6.0318,0.045329],[6.4695,-5.6813,0.033743],[10.818,-9.5368,0.36976],[15.476,-6.7328,-0.093711],[17.029,-11.289,-0.012604],[20.135,-17.598,-0.001017],[24.173,-23.557,0.022156],[27.899,-27.062,0.010569],[30.384,-27.062,-0.024191],[32.248,-24.609,-0.001017],[36.285,-17.248,-0.024191],[38.459,-7.0833,-0.035777],[38.149,0.97834,-0.035777],[39.701,7.2874,-0.070537],[40.633,13.947,-0.058951],[37.217,20.607,-0.047364],[34.111,24.112,-0.001017],[30.384,18.153,-0.024191],[25.104,10.793,-0.035777],[20.756,6.9369,-0.012604],[20.135,4.8339,-0.035777],[21.067,6.9369,-0.058951],[21.998,6.9369,-0.012604],[22.62,9.741,-0.012604],[22.62,12.195,-0.012604],[21.998,9.741,-0.035777],[22.309,10.091,0.033743],[21.377,9.3905,0.022156],[22.62,6.2359,-0.012604],[24.173,2.7309,-0.001017],[22.62,0.62783,0.022156],[18.272,-0.42369,0.033743],[14.855,-3.2277,-0.024191],[14.234,-8.1348,-0.093711],[14.234,-9.5368,-0.16323],[16.719,-8.4853,-0.1053],[16.097,-8.8358,-0.012604],[14.545,-9.8873,-0.024191],[12.681,-8.8358,0.022156],[8.9541,-6.3823,0.033743],[7.4013,-6.3823,0.033743],[6.7801,-6.7328,0.056916],[8.9541,-7.0833,0.045329],[16.097,-12.341,0.43928],[16.097,-6.3823,-0.1053],[18.272,-10.939,-0.012604],[21.377,-17.949,-0.001017],[26.036,-25.31,0.022156],[30.384,-29.516,0.010569],[33.179,-31.619,-0.024191],[36.285,-31.268,-0.001017],[41.565,-24.959,-0.024191],[45.913,-13.392,-0.047364],[48.708,-1.4752,-0.047364],[50.261,8.6895,-0.070537],[48.087,17.102,-0.047364],[44.981,23.411,-0.035777],[40.633,25.864,-0.001017],[35.664,20.256,-0.035777],[31.005,11.844,-0.035777],[27.278,8.339,-0.024191],[27.278,6.9369,-0.035777],[28.831,9.3905,-0.047364],[30.695,9.3905,-0.024191],[30.384,11.143,-0.012604],[29.763,12.545,-0.001017],[28.831,9.04,-0.035777],[28.21,9.3905,0.022156],[26.657,7.6379,0.022156],[28.521,3.4319,-0.024191],[29.142,-0.77419,-0.012604],[28.21,-3.5782,0.010569],[23.241,-4.2793,0.033743],[19.824,-5.3308,-0.024191],[18.582,-10.939,-0.093711],[17.34,-13.392,-0.16323],[20.135,-11.64,-0.1053],[18.893,-11.64,-0.012604],[17.029,-13.042,-0.024191],[13.923,-10.588,0.022156],[8.6436,-7.0833,0.033743],[6.7801,-6.7328,0.033743],[7.4013,-6.7328,0.056916],[11.128,-6.7328,0.045329],[20.446,-12.691,0.46245],[17.029,-6.0318,-0.11688],[19.824,-10.588,-0.012604],[22.93,-17.949,-0.001017],[28.21,-26.712,0.022156],[32.869,-31.619,0.010569],[36.596,-34.423,-0.012604],[40.323,-34.423,-0.001017],[45.913,-28.114,-0.024191],[51.814,-15.495,-0.047364],[56.473,-1.4752,-0.047364],[58.336,11.494,-0.070537],[56.473,21.658,-0.035777],[53.678,27.967,-0.024191],[49.019,29.019,-0.012604],[42.807,23.411,-0.035777],[38.459,15.349,-0.024191],[34.111,10.793,-0.024191],[33.179,9.741,-0.035777],[35.043,11.494,-0.035777],[36.596,11.844,-0.024191],[35.043,13.246,-0.001017],[33.8,13.246,-0.001017],[32.869,9.3905,-0.035777],[32.248,8.339,0.022156],[30.695,6.2359,0.010569],[31.937,1.3288,-0.035777],[31.937,-3.5782,-0.024191],[30.695,-6.3823,0.010569],[26.347,-6.0318,0.045329],[23.241,-6.3823,-0.012604],[23.241,-13.392,-0.082124],[22.309,-15.846,-0.16323],[25.104,-14.444,-0.11688],[23.862,-14.444,-0.024191],[20.135,-14.444,-0.035777],[15.166,-11.289,0.033743],[8.9541,-6.7328,0.022156],[6.7801,-6.0318,0.033743],[8.333,-5.6813,0.056916],[12.992,-5.6813,0.045329],[23.862,-12.341,0.46245],[18.582,-6.0318,-0.12847],[21.998,-10.238,-0.012604],[25.104,-17.949,-0.001017],[30.384,-27.062,0.022156],[35.664,-32.67,0.010569],[40.012,-35.825,-0.012604],[44.05,-36.526,0.010569],[50.572,-30.918,-0.012604],[57.404,-17.248,-0.035777],[63.305,-1.8257,-0.024191],[65.79,12.195,-0.058951],[63.927,24.112,-0.035777],[60.821,29.72,-0.024191],[55.541,30.07,-0.012604],[48.087,25.163,-0.047364],[43.118,17.452,-0.024191],[39.08,13.597,-0.035777],[38.149,12.545,-0.035777],[39.701,14.999,-0.024191],[40.323,14.999,-0.012604],[38.77,16.05,0.022156],[36.906,14.999,0.022156],[36.285,10.091,-0.035777],[34.422,6.9369,0.022156],[33.179,4.1329,-0.001017],[34.111,-0.77419,-0.047364],[33.179,-5.3308,-0.024191],[32.558,-8.4853,-0.001017],[28.21,-7.0833,0.045329],[26.968,-7.4338,-0.012604],[27.899,-15.145,-0.082124],[27.899,-18.65,-0.15164],[31.316,-16.897,-0.11688],[29.763,-16.897,-0.012604],[24.794,-16.897,-0.035777],[18.582,-13.042,0.033743],[10.818,-7.7843,0.022156],[8.0224,-6.7328,0.022156],[9.5753,-6.3823,0.045329],[15.476,-6.3823,0.045329],[26.657,-13.042,0.45086],[20.756,-6.3823,-0.12847],[23.862,-10.238,-0.012604],[26.968,-17.598,-0.001017],[32.248,-27.062,0.010569],[38.149,-33.021,0.010569],[42.807,-36.526,-0.001017],[47.466,-37.577,0.010569],[54.299,-32.67,-0.001017],[62.063,-19.351,-0.012604],[68.275,-4.2793,-0.012604],[71.691,9.741,-0.035777],[69.517,21.308,-0.024191],[65.169,28.318,-0.012604],[58.647,28.318,-0.012604],[49.64,24.462,-0.047364],[44.671,18.153,-0.024191],[42.186,16.751,-0.047364],[40.944,16.401,-0.024191],[42.497,18.854,-0.001017],[43.118,18.854,-0.001017],[41.565,18.504,0.033743],[40.323,16.401,0.033743],[39.08,10.793,-0.024191],[36.285,5.1844,0.022156],[35.664,2.3804,-0.001017],[35.975,-1.8257,-0.047364],[35.664,-6.0318,-0.024191],[34.732,-9.8873,-0.001017],[30.695,-7.7843,0.045329],[30.695,-8.4853,-0.024191],[31.316,-17.248,-0.070537],[32.558,-22.155,-0.15164],[36.906,-19.702,-0.1053],[35.043,-19.351,-0.012604],[31.316,-20.403,-0.035777],[23.241,-15.495,0.022156],[14.545,-10.238,0.010569],[10.818,-9.8873,0.022156],[12.992,-9.1863,0.022156],[19.203,-8.8358,0.033743],[30.695,-15.495,0.40452],[22.93,-6.3823,-0.11688],[26.347,-9.8873,-0.012604],[29.142,-16.897,-0.001017],[34.422,-26.011,0.010569],[40.012,-31.969,-0.001017],[44.36,-34.773,-0.001017],[47.777,-35.825,0.010569],[53.988,-31.268,-0.001017],[60.821,-18.65,-0.001017],[67.343,-3.9287,-0.001017],[72.002,9.04,-0.035777],[72.002,20.256,-0.024191],[69.206,27.617,-0.012604],[63.305,28.668,-0.012604],[53.678,25.864,-0.047364],[48.708,22.009,-0.035777],[44.981,21.308,-0.047364],[43.118,20.607,-0.024191],[44.981,22.71,0.010569],[45.913,21.308,0.010569],[45.602,18.854,0.056916],[44.671,16.751,0.033743],[44.05,10.442,-0.024191],[40.012,4.4834,0.010569],[39.08,1.6793,-0.012604],[38.77,-2.8772,-0.047364],[38.459,-7.0833,-0.024191],[38.77,-10.939,-0.001017],[34.422,-8.1348,0.033743],[34.732,-8.8358,-0.024191],[35.043,-18.299,-0.070537],[36.596,-24.959,-0.12847],[40.944,-22.506,-0.082124],[40.012,-22.155,-0.001017],[36.285,-24.609,-0.024191],[28.831,-17.949,0.022156],[18.582,-11.64,0.010569],[14.545,-11.64,0.010569],[17.34,-10.939,0.010569],[23.862,-10.238,0.022156],[34.422,-16.897,0.335],[25.104,-7.4338,-0.093711],[28.21,-10.238,-0.012604],[30.384,-16.196,-0.001017],[34.732,-24.258,0.010569],[38.77,-28.815,-0.001017],[41.565,-31.268,0.010569],[43.118,-31.619,0.010569],[48.708,-26.712,0.010569],[55.852,-15.145,-0.001017],[60.821,-2.5267,-0.001017],[65.169,7.6379,-0.024191],[66.411,18.153,-0.024191],[66.101,25.864,-0.001017],[63.305,27.967,-0.012604],[54.92,27.266,-0.047364],[49.64,25.514,-0.024191],[44.981,25.163,-0.047364],[42.807,23.411,-0.012604],[44.36,24.813,0.022156],[44.981,22.009,0.022156],[45.913,17.452,0.045329],[46.845,16.401,0.022156],[46.224,9.741,-0.024191],[42.497,4.4834,-0.001017],[42.497,2.3804,-0.024191],[42.186,-2.1762,-0.047364],[42.497,-6.0318,-0.024191],[43.118,-10.238,-0.001017],[39.08,-7.0833,0.033743],[39.08,-8.4853,-0.012604],[38.77,-18.299,-0.058951],[40.012,-25.66,-0.1053],[45.602,-23.908,-0.058951],[44.05,-23.557,0.010569],[41.565,-26.361,-0.012604],[34.732,-18.299,0.022156],[24.794,-11.289,0.010569],[20.135,-11.64,-0.001017],[23.241,-12.341,-0.001017],[28.521,-11.289,0.022156],[37.838,-16.897,0.2423],[26.968,-9.5368,-0.070537],[30.074,-13.042,-0.012604],[32.248,-17.248,-0.001017],[35.664,-23.207,0.010569],[38.459,-26.361,-0.001017],[40.012,-27.062,0.010569],[40.944,-26.361,0.010569],[44.981,-21.104,0.010569],[50.572,-10.939,-0.001017],[54.299,-1.8257,-0.001017],[57.715,6.5864,-0.012604],[59.268,14.999,-0.012604],[59.268,21.658,-0.001017],[57.715,24.112,-0.012604],[50.572,25.163,-0.035777],[44.981,25.514,-0.024191],[40.944,24.813,-0.035777],[38.77,23.411,-0.012604],[40.633,24.462,0.033743],[42.807,20.957,0.022156],[44.05,16.05,0.033743],[46.534,16.05,0.010569],[46.224,9.741,-0.024191],[43.118,4.4834,-0.012604],[44.05,3.4319,-0.024191],[44.05,-1.4752,-0.035777],[44.36,-4.9803,-0.024191],[44.05,-9.1863,-0.001017],[39.701,-4.2793,0.022156],[39.08,-5.6813,-0.012604],[38.459,-16.196,-0.035777],[40.323,-23.557,-0.082124],[46.224,-21.454,-0.035777],[44.671,-20.403,0.022156],[42.497,-22.856,-0.001017],[37.217,-15.145,0.022156],[28.831,-9.5368,0.010569],[24.794,-11.289,-0.001017],[28.521,-13.042,-0.012604],[32.869,-13.392,0.022156],[40.012,-16.897,0.13802],[28.21,-13.042,-0.024191],[31.005,-17.248,-0.001017],[34.111,-19.702,-0.001017],[36.906,-22.506,-0.001017],[39.701,-23.557,-0.001017],[40.944,-22.856,0.010569],[41.876,-20.403,-0.001017],[43.739,-14.444,-0.001017],[46.845,-7.0833,-0.001017],[49.019,-1.1247,-0.001017],[50.882,5.5349,-0.012604],[52.125,11.494,-0.012604],[50.261,15.7,-0.001017],[47.466,17.452,-0.012604],[41.565,18.854,-0.035777],[36.596,21.308,-0.024191],[33.8,21.308,-0.024191],[31.937,20.607,-0.001017],[35.664,21.308,0.022156],[39.08,19.555,0.022156],[40.944,14.999,0.022156],[44.671,16.05,-0.001017],[44.981,10.442,-0.024191],[42.186,4.8339,-0.024191],[43.739,4.4834,-0.024191],[44.05,-0.073181,-0.024191],[43.739,-4.2793,-0.012604],[41.565,-7.7843,-0.001017],[35.043,0.27732,0.010569],[34.732,-1.1247,-0.012604],[34.422,-12.691,-0.024191],[36.906,-19,-0.047364],[43.739,-15.145,-0.012604],[42.186,-12.691,0.022156],[40.323,-14.794,-0.001017],[36.596,-8.8358,0.010569],[30.695,-6.7328,-0.001017],[28.521,-10.588,-0.012604],[32.558,-14.093,-0.024191],[37.217,-15.846,0.022156],[40.633,-16.196,0.022156],[27.278,-13.042,-0.012604],[29.763,-17.598,-0.001017],[32.248,-19,-0.001017],[34.111,-19.702,-0.001017],[35.664,-19.702,-0.001017],[35.975,-18.65,-0.001017],[36.285,-15.846,-0.001017],[36.906,-10.238,-0.001017],[38.77,-4.2793,-0.001017],[40.633,2.3804,-0.001017],[40.633,8.6895,-0.012604],[40.012,11.844,-0.001017],[38.77,13.597,-0.001017],[37.217,14.298,-0.012604],[33.8,16.751,-0.024191],[32.248,19.205,-0.024191],[30.695,18.153,-0.012604],[30.384,16.05,-0.001017],[33.8,17.452,0.022156],[36.285,16.05,0.010569],[38.459,13.246,0.010569],[40.633,14.999,-0.001017],[40.323,10.091,-0.012604],[36.596,6.9369,-0.012604],[37.217,6.2359,-0.012604],[38.77,2.0299,-0.012604],[38.149,-2.8772,-0.012604],[35.664,-7.7843,-0.001017],[28.831,2.3804,-0.001017],[29.142,0.27732,-0.001017],[29.142,-12.691,-0.012604],[32.248,-19,-0.012604],[40.012,-15.145,-0.001017],[38.459,-12.691,0.010569],[36.906,-14.093,-0.001017],[34.111,-6.0318,-0.001017],[26.968,-3.9287,-0.001017],[24.794,-9.8873,-0.012604],[30.384,-14.444,-0.012604],[34.732,-16.547,0.022156],[35.975,-15.495,-0.047364],[25.725,-11.64,0.010569],[26.968,-16.547,-0.001017],[29.142,-17.248,-0.012604],[29.763,-16.897,-0.012604],[30.074,-15.846,-0.012604],[29.763,-14.444,-0.012604],[29.763,-11.64,-0.012604],[29.142,-7.7843,-0.012604],[30.074,-1.8257,-0.001017],[31.316,6.9369,-0.001017],[29.763,13.246,-0.001017],[26.968,13.947,-0.001017],[26.968,12.545,0.010569],[28.21,13.246,-0.001017],[27.278,15.7,-0.024191],[28.831,18.153,-0.024191],[28.521,14.999,-0.012604],[30.384,10.442,0.010569],[32.869,12.896,0.010569],[33.179,11.844,0.010569],[36.285,11.844,-0.001017],[35.664,13.246,0.010569],[34.111,9.3905,0.010569],[30.074,9.3905,-0.001017],[29.142,7.9885,-0.001017],[32.248,4.8339,-0.001017],[31.937,-1.8257,-0.001017],[28.831,-7.7843,-0.001017],[21.377,4.1329,-0.012604],[22.62,0.97834,-0.001017],[23.241,-13.743,0.010569],[26.968,-21.104,0.022156],[36.285,-17.598,0.010569],[34.732,-15.145,-0.012604],[33.8,-16.196,-0.001017],[31.005,-4.6298,-0.012604],[21.377,-1.1247,-0.012604],[18.893,-8.4853,-0.012604],[25.104,-14.794,-0.012604],[30.074,-16.897,0.022156],[30.074,-14.794,-0.1053],[5.2272,-0.073182,-0.001017],[5.2272,-0.42369,-0.001017],[4.606,-0.073182,-0.001017],[3.0531,-0.073182,-0.001017],[1.1897,-0.42369,-0.001017],[0.56851,-0.77419,-0.001017],[-1.295,-0.42369,-0.001017],[-2.5373,-0.77419,-0.001017],[-3.1584,-0.42369,-0.001017],[-1.295,-1.1247,-0.001017],[3.3637,-2.1762,-0.001017],[8.333,-0.77419,-0.001017],[8.333,3.7824,-0.001017],[6.7801,2.7309,-0.001017],[10.818,3.7824,-0.001017],[12.681,10.091,-0.001017],[12.371,10.091,-0.001017],[12.681,6.9369,-0.001017],[9.5753,8.339,-0.001017],[5.2272,5.1844,-0.001017],[2.1214,4.4834,-0.001017],[-0.98438,4.1329,-0.001017],[-0.6738,7.6379,-0.001017],[0.56851,5.5349,-0.001017],[0.25794,5.1844,-0.001017],[0.56851,4.4834,-0.001017],[-0.36322,2.0299,-0.001017],[-0.98438,2.0299,-0.001017],[-2.8479,0.62783,-0.001017],[0.56851,2.3804,-0.001017],[2.7426,0.97833,-0.001017],[3.6743,2.0299,-0.001017],[2.7426,0.62783,-0.001017],[5.2272,0.97833,-0.001017],[4.9166,0.97833,-0.001017],[6.1589,0.97833,-0.001017],[9.2647,2.7309,-0.001017],[8.333,3.7824,-0.001017],[3.3637,3.7824,-0.001017],[-0.36322,3.0814,-0.001017],[-4.7113,3.0814,-0.001017],[13.923,-1.8257,-0.058951],[12.06,-2.5267,-0.001017],[11.128,-3.9287,-0.001017],[10.507,-3.9287,0.010569],[8.6436,-2.5267,-0.001017],[9.2647,-3.5782,-0.001017],[8.0224,-3.2277,-0.001017],[7.0907,-3.9287,-0.001017],[7.0907,-2.5267,-0.012604],[9.5753,-2.1762,-0.035777],[10.196,-1.8257,-0.035777],[12.371,2.0299,-0.012604],[12.992,3.7824,-0.001017],[12.371,0.62783,-0.024191],[15.166,5.1844,-0.012604],[12.681,10.091,-0.001017],[12.371,10.091,-0.001017],[12.681,6.9369,-0.001017],[9.5753,8.339,-0.001017],[5.2272,5.1844,-0.001017],[3.3637,6.2359,-0.001017],[2.432,9.741,-0.001017],[2.1214,7.9885,-0.012604],[3.3637,10.792,-0.012604],[3.6743,10.792,-0.012604],[4.606,9.3905,0.010569],[3.0531,10.792,0.010569],[0.87909,7.6379,0.022156],[-0.6738,3.4319,-0.024191],[1.5003,1.6793,-0.058951],[6.1589,0.62783,-0.024191],[7.4013,-0.073181,0.010569],[7.4013,-1.4752,-0.001017],[10.196,-1.8257,-0.012604],[9.2647,-1.1247,0.010569],[9.2647,-1.8257,-0.012604],[10.818,0.62783,-0.024191],[10.507,0.97834,0.022156],[6.4695,-1.1247,0.033743],[5.2272,-1.1247,0.022156],[3.3637,-1.1247,0.19596],[21.067,-7.0833,-0.047364],[19.203,-12.341,-0.012604],[18.582,-14.794,0.010569],[18.582,-12.691,0.022156],[17.029,-10.939,-0.001017],[15.166,-6.7328,-0.001017],[13.923,-3.9287,-0.001017],[13.923,-3.5782,0.010569],[13.923,-0.42369,-0.024191],[17.029,2.3804,-0.058951],[17.029,0.97834,-0.047364],[16.097,1.3288,-0.024191],[18.272,0.62783,-0.001017],[23.241,6.2359,-0.070537],[25.725,13.597,-0.047364],[18.582,15.7,-0.012604],[16.097,12.195,-0.012604],[16.097,7.2874,-0.001017],[15.166,7.9885,-0.012604],[13.923,7.9885,0.010569],[12.681,10.442,0.010569],[10.507,12.195,-0.001017],[9.2647,12.545,-0.001017],[8.333,11.844,-0.024191],[9.2647,13.597,-0.012604],[9.5753,10.442,0.010569],[8.0224,8.6895,0.033743],[4.9166,6.5864,0.033743],[2.432,1.6793,-0.058951],[3.0531,-0.073181,-0.1053],[7.0907,-1.8257,-0.047364],[8.9541,-3.2277,0.022156],[10.818,-5.3308,-0.001017],[14.234,-4.9803,-0.012604],[13.302,-3.2277,0.033743],[12.371,-4.6298,-0.024191],[12.06,-3.9287,-0.024191],[11.128,-3.9287,0.045329],[8.0224,-6.0318,0.080089],[8.6436,-10.238,0.033743],[10.818,-9.1863,0.32341],[19.203,-8.4853,-0.035777],[20.135,-14.444,-0.024191],[21.998,-19.351,0.010569],[23.241,-22.155,0.033743],[23.862,-22.155,0.010569],[20.756,-14.794,-0.012604],[19.203,-9.5368,-0.001017],[19.203,-6.0318,0.010569],[18.893,0.62783,-0.024191],[20.756,5.5349,-0.058951],[19.824,6.9369,-0.058951],[21.067,6.5864,-0.035777],[26.036,9.3905,-0.035777],[29.763,17.102,-0.082124],[29.142,20.957,-0.035777],[22.93,18.854,-0.012604],[21.067,13.246,-0.012604],[18.582,6.5864,0.010569],[17.029,6.2359,-0.024191],[15.166,7.9885,-0.001017],[14.545,10.442,0.010569],[15.476,10.442,-0.001017],[15.476,10.792,-0.001017],[14.545,9.741,-0.012604],[15.166,11.494,-0.012604],[16.097,9.04,0.010569],[16.097,7.2874,0.045329],[12.681,6.2359,0.056916],[9.2647,1.6793,-0.070537],[8.9541,-2.5267,-0.15164],[10.507,-4.9803,-0.070537],[12.371,-6.3823,0.022156],[13.302,-8.1348,-0.001017],[16.097,-6.3823,-0.024191],[16.408,-5.3308,0.045329],[14.855,-5.6813,-0.012604],[13.923,-4.2793,-0.024191],[12.371,-4.6298,0.080089],[10.196,-6.0318,0.091676],[12.371,-11.289,0.056916],[16.408,-11.64,0.40452],[19.203,-8.4853,-0.035777],[21.377,-14.444,-0.024191],[24.483,-20.403,0.010569],[26.657,-26.011,0.033743],[28.521,-28.815,0.010569],[29.763,-29.165,-0.024191],[30.384,-25.66,-0.001017],[30.074,-17.598,-0.001017],[28.21,-5.3308,-0.035777],[26.968,3.4319,-0.058951],[26.657,8.339,-0.058951],[31.937,13.246,-0.070537],[33.8,20.256,-0.035777],[32.558,24.462,-0.047364],[32.558,24.112,-0.012604],[26.347,18.504,-0.001017],[23.241,12.545,-0.012604],[20.446,6.9369,0.010569],[19.824,4.8339,-0.035777],[18.582,7.9885,-0.012604],[17.34,10.442,-0.001017],[19.824,10.091,-0.001017],[19.203,10.442,-0.012604],[18.272,10.442,-0.001017],[21.998,9.741,-0.024191],[23.241,6.9369,-0.001017],[23.862,4.4834,0.056916],[20.756,5.5349,0.080089],[18.272,1.3288,-0.070537],[16.719,-4.2792,-0.16323],[16.097,-7.0833,-0.093711],[16.097,-10.588,0.022156],[16.408,-11.289,-0.012604],[17.961,-8.1348,-0.035777],[17.961,-7.7843,0.056916],[15.166,-7.4338,-0.012604],[12.992,-4.6298,-0.024191],[12.371,-6.0318,0.080089],[12.371,-7.4338,0.10326],[16.719,-14.093,0.080089],[22.93,-14.093,0.46245],[19.824,-8.8358,-0.035777],[22.62,-14.794,-0.035777],[26.347,-21.104,0.010569],[28.831,-28.114,0.033743],[31.316,-33.021,0.010569],[32.558,-35.124,-0.024191],[34.732,-34.423,-0.001017],[36.596,-27.763,-0.012604],[38.459,-15.846,-0.047364],[39.08,-2.8772,-0.070537],[40.012,9.04,-0.070537],[40.012,19.906,-0.070537],[38.459,25.514,-0.035777],[38.149,28.668,-0.035777],[35.664,25.514,-0.012604],[30.074,18.504,-0.012604],[28.21,12.896,-0.012604],[26.347,7.9885,0.010569],[26.347,6.2359,-0.024191],[26.036,9.3905,-0.012604],[25.725,11.844,-0.001017],[26.347,11.143,-0.001017],[26.036,10.091,-0.001017],[24.483,10.091,0.010569],[26.347,7.2874,-0.035777],[27.278,3.4319,-0.012604],[28.21,0.62783,0.033743],[26.036,1.3288,0.080089],[23.862,-2.1762,-0.070537],[21.998,-7.7843,-0.15164],[20.446,-9.8873,-0.082124],[18.893,-14.794,0.033743],[18.893,-14.444,-0.012604],[20.446,-9.8873,-0.035777],[19.824,-9.1863,0.056916],[16.097,-7.0833,-0.012604],[12.681,-4.2793,-0.012604],[12.371,-6.7328,0.091676],[14.234,-8.4853,0.10326],[20.756,-15.846,0.091676],[28.831,-16.196,0.45086],[20.756,-9.5368,-0.047364],[24.483,-14.794,-0.024191],[28.521,-21.104,0.010569],[31.316,-29.516,0.033743],[34.111,-35.124,0.010569],[36.285,-38.979,-0.024191],[38.77,-38.979,-0.001017],[41.565,-33.371,-0.024191],[44.36,-21.805,-0.047364],[46.534,-7.4338,-0.058951],[48.398,9.04,-0.058951],[48.398,22.359,-0.070537],[46.534,29.019,-0.035777],[45.913,31.823,-0.035777],[42.497,27.617,-0.024191],[36.596,20.256,-0.024191],[34.732,16.05,-0.012604],[33.179,10.442,-0.001017],[33.179,8.339,-0.024191],[32.869,10.793,-0.012604],[32.248,12.896,0.010569],[31.316,11.844,0.010569],[31.005,9.741,0.010569],[29.142,9.741,0.022156],[30.384,6.2359,-0.035777],[31.005,1.6793,-0.012604],[31.316,-1.8257,0.022156],[29.142,-1.4752,0.080089],[27.278,-4.9803,-0.058951],[26.657,-9.5368,-0.14006],[26.036,-11.64,-0.070537],[23.862,-17.248,0.033743],[22.62,-16.547,-0.024191],[23.862,-11.289,-0.047364],[21.377,-10.238,0.045329],[17.029,-6.3823,-0.012604],[12.371,-2.8772,-0.012604],[12.371,-6.0318,0.080089],[15.166,-7.7843,0.10326],[23.862,-15.495,0.091676],[32.869,-16.547,0.40452],[22.309,-9.8873,-0.047364],[26.347,-14.794,-0.024191],[31.005,-21.104,0.010569],[33.8,-30.918,0.033743],[36.906,-36.876,0.010569],[39.701,-40.732,-0.012604],[42.497,-41.783,-0.001017],[45.602,-36.876,-0.012604],[48.708,-25.31,-0.035777],[52.435,-9.8873,-0.035777],[55.541,7.9885,-0.035777],[56.162,23.411,-0.058951],[53.988,31.122,-0.035777],[52.125,33.926,-0.035777],[48.398,29.369,-0.024191],[42.497,22.009,-0.024191],[40.323,18.854,-0.024191],[38.77,13.246,-0.001017],[38.77,10.793,-0.012604],[38.459,12.896,-0.001017],[37.217,14.999,0.033743],[35.975,13.246,0.022156],[35.043,10.091,0.022156],[33.179,9.3905,0.033743],[34.111,4.8339,-0.035777],[34.732,0.27732,-0.024191],[33.8,-3.9287,0.010569],[32.248,-3.2277,0.080089],[31.005,-6.3823,-0.058951],[31.937,-11.289,-0.12847],[31.937,-13.743,-0.070537],[29.763,-20.052,0.033743],[27.899,-19.351,-0.024191],[28.521,-13.743,-0.047364],[24.483,-12.341,0.045329],[18.582,-6.3823,-0.012604],[12.992,-3.2277,-0.001017],[12.992,-6.3823,0.080089],[17.029,-8.1348,0.091676],[26.968,-15.846,0.091676],[36.906,-17.248,0.335],[23.862,-10.588,-0.047364],[28.521,-14.794,-0.012604],[33.179,-20.403,0.010569],[36.285,-30.918,0.022156],[39.701,-37.227,0.010569],[42.497,-41.783,-0.012604],[45.913,-42.835,0.010569],[49.019,-38.979,-0.001017],[52.435,-27.413,-0.012604],[57.404,-10.939,-0.024191],[61.442,6.5864,-0.024191],[61.442,24.112,-0.047364],[58.647,32.173,-0.024191],[56.162,33.926,-0.035777],[51.814,29.369,-0.035777],[45.913,24.112,-0.035777],[43.118,20.957,-0.035777],[42.186,16.401,-0.001017],[42.186,13.947,-0.001017],[41.876,16.05,0.010569],[40.633,17.452,0.080089],[40.323,16.05,0.045329],[39.08,11.143,0.033743],[37.838,9.741,0.045329],[37.838,3.4319,-0.035777],[38.459,-1.1247,-0.024191],[36.596,-5.6813,-0.001017],[34.422,-4.9803,0.056916],[34.732,-7.7843,-0.058951],[36.596,-13.743,-0.11688],[36.906,-15.846,-0.058951],[35.975,-24.258,0.033743],[33.179,-23.207,-0.035777],[33.8,-16.547,-0.047364],[28.831,-15.145,0.045329],[20.756,-7.4338,-0.012604],[15.166,-5.3308,-0.001017],[15.166,-8.1348,0.056916],[20.135,-10.588,0.080089],[30.695,-18.299,0.080089],[40.633,-19,0.21913],[26.036,-10.939,-0.047364],[30.695,-14.444,-0.001017],[35.664,-19,0.010569],[38.459,-29.165,0.010569],[41.565,-35.474,-0.001017],[43.739,-39.33,-0.012604],[45.913,-40.031,0.010569],[46.845,-35.825,0.010569],[49.019,-24.959,-0.001017],[52.746,-9.5368,-0.012604],[57.715,4.8339,-0.012604],[61.442,20.957,-0.035777],[61.442,30.07,-0.024191],[58.647,32.874,-0.035777],[53.988,30.421,-0.035777],[48.087,26.916,-0.047364],[45.913,25.163,-0.035777],[43.118,20.607,-0.001017],[43.739,18.854,0.022156],[44.36,19.205,0.033743],[44.05,19.205,0.080089],[44.671,17.102,0.056916],[43.739,12.195,0.033743],[41.876,9.3905,0.033743],[42.497,2.0299,-0.047364],[42.497,-2.1762,-0.035777],[40.633,-7.4338,-0.012604],[38.459,-6.7328,0.045329],[39.08,-8.4853,-0.058951],[41.565,-15.495,-0.11688],[41.876,-17.598,-0.058951],[40.633,-28.114,0.033743],[36.906,-27.062,-0.024191],[37.838,-19.351,-0.035777],[32.869,-19,0.045329],[24.483,-9.5368,-0.001017],[18.272,-6.3823,-0.001017],[18.272,-9.5368,0.033743],[23.241,-13.042,0.045329],[34.422,-20.403,0.080089],[44.671,-21.454,0.080089],[28.21,-12.341,-0.024191],[32.558,-14.093,0.010569],[36.596,-17.949,0.010569],[38.459,-26.712,0.010569],[39.701,-31.969,-0.001017],[40.012,-34.072,-0.001017],[41.565,-34.072,0.022156],[43.118,-30.567,0.010569],[45.602,-20.052,-0.001017],[48.708,-7.4338,-0.012604],[52.435,3.0814,-0.024191],[55.541,16.05,-0.024191],[56.473,25.163,-0.024191],[56.783,30.771,-0.035777],[52.746,31.823,-0.035777],[46.845,30.771,-0.047364],[44.671,28.318,-0.035777],[42.186,24.112,0.010569],[42.807,21.658,0.033743],[43.739,20.256,0.033743],[44.36,18.854,0.080089],[46.845,16.401,0.045329],[46.534,12.896,0.022156],[44.36,9.741,0.010569],[46.224,1.6793,-0.047364],[46.224,-2.1762,-0.035777],[44.671,-7.4338,-0.012604],[42.497,-7.0833,0.033743],[42.807,-8.4853,-0.047364],[45.602,-15.145,-0.093711],[44.981,-17.949,-0.047364],[43.118,-29.516,0.033743],[39.701,-28.114,-0.024191],[40.944,-21.454,-0.024191],[37.217,-22.155,0.033743],[29.763,-10.238,-0.001017],[22.93,-5.3308,-0.012604],[22.62,-9.8873,0.010569],[27.278,-14.093,0.022156],[37.217,-20.403,0.056916],[46.224,-20.403,-0.11688],[30.384,-13.743,-0.001017],[33.179,-16.196,0.010569],[36.596,-18.65,0.010569],[37.838,-24.959,-0.001017],[38.149,-27.763,-0.001017],[38.149,-28.464,-0.001017],[38.459,-27.062,0.010569],[39.701,-22.856,0.010569],[41.876,-14.444,-0.001017],[44.36,-4.9803,-0.001017],[46.534,3.0814,-0.024191],[48.398,12.545,-0.012604],[49.64,20.256,-0.012604],[50.261,26.215,-0.024191],[47.466,29.369,-0.035777],[42.497,29.72,-0.047364],[40.323,27.266,-0.024191],[38.149,24.112,0.010569],[40.012,21.658,0.033743],[40.944,19.555,0.022156],[42.497,17.803,0.056916],[46.224,14.999,0.033743],[46.224,12.896,0.010569],[44.05,9.741,-0.001017],[46.534,0.97834,-0.047364],[46.845,-1.8257,-0.035777],[44.671,-6.3823,-0.012604],[41.876,-5.6813,0.022156],[42.497,-5.6813,-0.035777],[45.602,-12.691,-0.082124],[44.671,-15.495,-0.035777],[42.807,-27.413,0.033743],[39.08,-24.959,-0.012604],[40.944,-17.949,-0.012604],[38.77,-19.351,0.033743],[32.869,-8.1348,-0.001017],[26.968,-4.2793,-0.012604],[26.968,-10.238,-0.001017],[31.005,-15.495,0.010569],[39.08,-20.052,0.045329],[44.671,-18.299,-0.29068],[32.248,-15.495,0.045329],[33.179,-20.052,0.022156],[35.664,-21.805,-0.001017],[37.217,-23.908,-0.012604],[38.149,-24.258,-0.001017],[38.459,-22.856,-0.001017],[37.838,-19.351,-0.001017],[36.906,-14.444,-0.001017],[38.459,-8.8358,-0.001017],[39.701,-1.8257,-0.001017],[40.323,4.1329,-0.012604],[41.565,10.792,-0.001017],[40.944,16.05,-0.012604],[40.323,18.854,-0.024191],[37.838,22.71,-0.024191],[35.664,24.462,-0.035777],[33.179,22.009,-0.024191],[31.316,20.256,0.010569],[35.043,20.256,0.022156],[36.906,17.102,0.022156],[38.77,16.05,0.022156],[42.186,13.246,0.010569],[42.807,12.195,-0.001017],[40.944,9.3905,-0.012604],[44.36,0.27732,-0.035777],[44.671,-1.1247,-0.024191],[41.876,-4.9803,-0.012604],[36.906,-2.5267,0.010569],[37.217,-1.1247,-0.024191],[41.565,-8.8358,-0.047364],[40.944,-10.939,-0.012604],[39.701,-22.155,0.022156],[35.043,-17.248,-0.001017],[37.838,-9.5368,-0.001017],[36.906,-12.341,0.022156],[34.732,-3.9287,-0.001017],[30.384,-3.5782,-0.024191],[31.005,-11.289,-0.012604],[34.422,-17.598,-0.012604],[39.701,-19.351,0.033743],[40.633,-15.846,-0.44131],[30.695,-14.444,0.080089],[31.005,-19.702,0.010569],[32.248,-20.403,-0.001017],[32.558,-20.052,-0.012604],[33.8,-19.351,-0.001017],[33.8,-17.598,-0.001017],[32.248,-14.444,-0.001017],[31.005,-10.238,-0.001017],[32.248,-6.0318,-0.001017],[32.869,1.3288,-0.001017],[33.179,9.04,-0.012604],[33.179,12.545,-0.001017],[32.558,12.896,-0.001017],[32.869,14.999,-0.012604],[31.316,19.555,-0.035777],[30.074,20.607,-0.035777],[28.831,17.452,-0.012604],[28.21,14.999,-0.001017],[32.248,15.349,0.022156],[33.8,14.298,0.010569],[35.043,12.545,0.010569],[37.217,11.844,0.010569],[36.906,11.143,-0.001017],[34.111,8.6895,-0.012604],[35.975,1.3288,-0.012604],[36.906,0.97834,-0.012604],[35.043,-3.5782,-0.012604],[30.074,-1.8257,-0.001017],[31.005,0.27732,-0.012604],[35.664,-8.4853,-0.012604],[35.664,-11.289,-0.001017],[34.111,-23.207,0.010569],[31.005,-17.248,-0.001017],[34.422,-8.8358,-0.001017],[34.111,-11.289,-0.001017],[31.937,-0.77419,-0.001017],[26.657,-0.77419,-0.012604],[27.278,-11.64,-0.012604],[31.005,-19,-0.012604],[34.111,-19,0.033743],[34.111,-14.444,-0.52242],[28.21,-12.341,0.10326],[27.899,-17.248,-0.001017],[26.968,-17.949,-0.012604],[27.278,-16.547,-0.012604],[28.21,-14.794,-0.012604],[27.278,-12.691,-0.012604],[25.104,-9.8873,-0.012604],[23.862,-7.7843,-0.012604],[24.173,-3.9287,-0.001017],[26.347,5.1844,-0.001017],[26.036,15.349,-0.012604],[25.104,15.7,0.010569],[24.794,10.442,0.010569],[26.657,11.844,-0.012604],[25.104,17.102,-0.035777],[24.483,17.803,-0.035777],[24.483,12.545,-0.012604],[26.036,8.339,-0.012604],[30.384,9.04,0.022156],[30.384,11.494,0.010569],[31.937,9.04,-0.001017],[32.558,10.442,-0.001017],[30.695,9.3905,0.010569],[25.725,7.9885,-0.001017],[26.036,2.7309,0.010569],[28.21,3.4319,-0.001017],[28.21,-1.8257,-0.012604],[22.309,-1.4752,-0.012604],[24.173,0.27732,0.010569],[28.831,-9.1863,0.022156],[29.142,-13.042,0.010569],[28.21,-26.011,-0.012604],[26.347,-19.702,-0.001017],[31.005,-10.588,-0.001017],[30.384,-12.691,-0.012604],[26.968,1.6793,-0.001017],[20.446,2.3804,-0.001017],[21.377,-11.64,-0.012604],[24.794,-19.702,-0.012604],[27.278,-18.65,0.033743],[26.657,-13.743,-0.56876],[5.2272,0.27732,-0.001017],[5.5378,-0.073182,-0.001017],[4.606,-0.073182,-0.001017],[3.0531,-1.1247,-0.001017],[1.1897,-0.073182,-0.001017],[0.25794,-0.42369,-0.001017],[-1.6055,-0.42369,-0.001017],[-3.1584,-0.77419,-0.001017],[-2.8479,-0.42369,-0.001017],[0.25794,0.62783,-0.001017],[4.9166,-2.5267,-0.001017],[6.7801,-0.42369,-0.001017],[8.333,4.1329,-0.001017],[10.507,4.4834,-0.001017],[12.06,6.5864,-0.001017],[12.06,13.947,-0.001017],[12.681,10.442,-0.001017],[15.166,6.2359,-0.001017],[13.923,10.792,-0.001017],[6.1589,7.6379,-0.001017],[1.1897,5.5349,-0.001017],[-0.36322,4.4834,-0.001017],[-0.6738,7.9885,-0.001017],[1.1897,7.2874,-0.001017],[1.5003,6.5864,-0.001017],[-0.36322,4.1329,-0.001017],[-0.6738,2.0299,-0.001017],[-1.6055,2.0299,-0.001017],[0.25794,2.7309,-0.001017],[0.87909,2.3804,-0.001017],[2.7426,1.3288,-0.001017],[2.7426,0.97833,-0.001017],[3.0531,-0.42369,-0.001017],[4.9166,0.62783,-0.001017],[5.2272,-0.42369,-0.001017],[8.333,1.6793,-0.001017],[9.2647,3.4319,-0.001017],[8.0224,3.7824,-0.001017],[4.2955,3.0814,-0.001017],[1.1897,3.0814,-0.001017],[-4.7113,2.3804,-0.001017],[15.476,-1.1247,-0.082124],[16.408,-1.4752,-0.001017],[14.545,-3.2277,-0.001017],[10.818,-3.5782,0.010569],[8.9541,-1.8257,-0.001017],[8.6436,-2.5267,-0.001017],[6.7801,-2.1762,0.010569],[5.5378,-3.2277,-0.001017],[5.2272,-2.5267,-0.024191],[6.7801,-1.8257,-0.035777],[7.4013,-3.5782,-0.012604],[8.9541,-0.073181,-0.001017],[10.818,4.8339,-0.001017],[11.439,5.1844,-0.001017],[12.06,6.5864,-0.001017],[12.06,13.947,-0.001017],[12.681,10.442,-0.001017],[15.166,6.2359,-0.001017],[13.923,10.792,-0.001017],[6.1589,7.6379,-0.001017],[1.5003,7.2874,-0.001017],[2.432,9.3905,-0.001017],[2.1214,8.6895,-0.001017],[3.0531,11.143,-0.024191],[4.9166,10.442,-0.001017],[4.2955,11.844,0.010569],[3.0531,10.091,0.010569],[2.432,7.2874,-0.001017],[3.0531,7.2874,-0.024191],[4.606,4.4834,-0.024191],[5.5378,0.27732,-0.012604],[4.606,-1.4752,-0.001017],[5.2272,-2.1762,-0.012604],[8.6436,-1.4752,-0.001017],[8.6436,-1.8257,-0.035777],[12.992,-0.42369,-0.047364],[14.234,0.62783,0.010569],[12.681,-1.1247,0.022156],[10.196,-1.8257,0.022156],[11.439,-1.1247,0.033743],[4.2955,0.27732,0.2423],[25.725,-6.3823,-0.070537],[26.657,-8.1348,-0.012604],[23.862,-13.743,0.010569],[20.446,-14.093,0.022156],[17.34,-9.1863,0.010569],[14.234,-4.6298,-0.001017],[12.06,-3.2277,0.010569],[10.507,-2.1762,-0.001017],[10.196,-1.1247,-0.035777],[12.371,0.97834,-0.070537],[12.681,2.0299,-0.047364],[12.371,0.97834,-0.001017],[13.923,0.27732,-0.012604],[18.582,4.4834,-0.024191],[18.893,15.349,-0.001017],[16.719,21.308,0.022156],[16.097,12.896,-0.012604],[17.961,7.2874,-0.012604],[18.272,11.494,-0.001017],[13.302,10.091,0.022156],[11.128,11.494,-0.001017],[10.507,13.947,0.010569],[9.2647,13.947,0.010569],[8.333,11.844,-0.024191],[9.2647,13.246,-0.001017],[8.6436,11.494,0.010569],[7.0907,9.741,0.022156],[6.1589,7.2874,-0.012604],[5.5378,5.1844,-0.047364],[4.9166,1.6793,-0.024191],[6.7801,-1.8257,-0.012604],[7.4013,-5.3308,-0.001017],[8.9541,-7.0833,-0.035777],[12.371,-6.3823,-0.012604],[12.681,-5.3308,-0.047364],[15.476,-4.6298,-0.070537],[15.476,-3.2277,0.022156],[14.545,-4.9803,0.056916],[14.234,-8.8358,0.033743],[18.272,-14.093,0.056916],[13.923,-9.5368,0.40452],[24.794,-8.8358,-0.035777],[26.347,-14.093,-0.012604],[26.347,-20.403,0.010569],[26.036,-23.557,0.022156],[24.173,-19.702,-0.001017],[18.893,-11.289,-0.001017],[17.029,-8.4853,0.010569],[14.855,-3.9287,-0.001017],[12.681,0.62783,-0.047364],[13.923,4.4834,-0.070537],[14.545,6.9369,-0.058951],[14.234,4.8339,-0.024191],[19.824,8.339,-0.047364],[25.104,14.999,-0.024191],[22.309,26.215,0.045329],[22.309,25.163,0.056916],[21.998,14.298,-0.035777],[21.377,7.9885,-0.058951],[19.203,9.3905,0.010569],[14.545,9.741,0.022156],[14.545,11.143,-0.012604],[15.166,11.844,-0.001017],[15.476,12.896,-0.001017],[14.234,9.04,-0.035777],[14.855,10.442,-0.001017],[16.408,10.792,0.010569],[14.234,9.3905,0.033743],[12.992,6.9369,-0.012604],[12.371,3.4319,-0.047364],[10.507,-1.8257,-0.035777],[10.818,-6.3823,-0.024191],[11.128,-8.4853,-0.001017],[12.992,-8.4853,-0.058951],[16.408,-8.4853,-0.012604],[17.029,-6.7328,-0.058951],[17.961,-5.3308,-0.093711],[17.029,-4.2793,0.033743],[16.097,-4.6298,0.080089],[17.029,-8.8358,0.056916],[22.62,-15.846,0.091676],[20.135,-13.392,0.48562],[25.104,-9.5368,-0.012604],[26.657,-16.196,-0.012604],[28.21,-22.506,0.010569],[29.142,-27.062,0.022156],[29.142,-29.165,-0.012604],[28.521,-29.165,-0.001017],[27.278,-24.258,0.010569],[21.998,-10.588,-0.012604],[16.719,-0.77419,-0.058951],[16.408,4.8339,-0.082124],[17.961,8.339,-0.047364],[21.377,10.442,-0.058951],[27.278,17.803,-0.058951],[27.899,24.813,0.010569],[26.657,30.771,0.10326],[27.278,25.514,0.080089],[24.794,13.947,-0.047364],[21.377,8.339,-0.058951],[18.893,6.9369,0.010569],[16.408,8.6895,0.022156],[16.719,9.3905,-0.024191],[17.029,10.091,-0.024191],[17.029,10.091,-0.001017],[17.029,6.5864,-0.047364],[20.446,7.2874,-0.012604],[22.62,7.6379,0.022156],[21.067,8.6895,0.045329],[19.824,6.2359,-0.012604],[19.824,1.3288,-0.047364],[17.029,-4.6298,-0.035777],[16.719,-9.1863,-0.024191],[16.097,-10.588,-0.012604],[16.097,-10.588,-0.070537],[17.34,-10.939,-0.012604],[19.203,-7.7843,-0.058951],[18.272,-4.9803,-0.093711],[17.34,-4.6298,0.056916],[17.961,-5.3308,0.10326],[21.067,-9.8873,0.080089],[28.21,-17.248,0.11485],[27.278,-14.794,0.54356],[26.036,-10.588,-0.001017],[27.278,-17.949,-0.012604],[29.763,-23.908,0.010569],[31.316,-29.516,0.022156],[32.248,-34.423,-0.024191],[32.248,-36.876,-0.001017],[32.558,-35.124,-0.001017],[31.316,-27.062,-0.035777],[30.074,-14.794,-0.070537],[28.831,-2.5267,-0.082124],[27.899,7.9885,-0.047364],[31.316,17.452,-0.047364],[32.248,26.565,-0.024191],[30.695,29.72,0.022156],[32.248,33.575,0.080089],[31.005,24.813,0.045329],[28.521,13.947,-0.035777],[25.725,9.04,-0.024191],[22.93,7.6379,0.010569],[21.377,9.741,0.010569],[21.377,10.091,-0.024191],[21.377,10.442,-0.024191],[20.756,9.3905,0.022156],[20.756,6.5864,-0.035777],[22.93,4.8339,-0.024191],[24.794,3.4319,0.010569],[26.036,4.4834,0.045329],[24.173,2.7309,-0.001017],[24.794,-2.8772,-0.047364],[21.998,-8.8358,-0.012604],[20.135,-13.392,-0.012604],[18.893,-12.691,-0.012604],[18.582,-13.392,-0.082124],[20.135,-12.691,-0.024191],[21.067,-6.7328,-0.047364],[18.582,-3.9287,-0.1053],[17.961,-4.6298,0.056916],[18.893,-6.0318,0.10326],[24.173,-12.691,0.091676],[32.248,-20.403,0.11485],[34.111,-17.248,0.5088],[26.968,-11.64,0.022156],[28.831,-19.351,-0.012604],[31.937,-24.609,0.010569],[33.8,-31.268,0.022156],[35.043,-37.227,-0.024191],[35.664,-41.433,-0.012604],[36.596,-41.082,-0.001017],[35.975,-35.825,-0.035777],[35.664,-24.609,-0.082124],[35.043,-10.238,-0.093711],[35.043,5.1844,-0.047364],[38.459,20.607,-0.035777],[38.149,30.07,-0.012604],[37.838,33.926,0.010569],[39.08,35.678,0.045329],[37.217,26.215,0.022156],[34.111,16.751,-0.047364],[32.248,12.195,-0.024191],[30.384,9.741,0.010569],[28.21,11.143,0.010569],[26.968,10.793,-0.001017],[26.347,11.143,-0.012604],[25.725,9.04,0.033743],[25.725,6.5864,-0.024191],[26.657,3.7824,-0.024191],[28.521,0.97834,-0.001017],[29.763,1.6793,0.045329],[27.899,0.27732,-0.001017],[28.521,-6.0318,-0.035777],[26.347,-11.289,-0.001017],[24.483,-14.794,-0.001017],[22.309,-13.743,-0.012604],[21.067,-15.145,-0.082124],[22.309,-14.093,-0.035777],[22.309,-6.3823,-0.047364],[18.893,-2.8772,-0.093711],[18.272,-3.5782,0.056916],[20.135,-5.3308,0.10326],[26.657,-12.691,0.10326],[36.285,-21.104,0.11485],[39.701,-17.598,0.42769],[28.521,-12.691,0.045329],[30.384,-20.403,-0.001017],[33.8,-24.959,-0.001017],[36.596,-31.969,0.010569],[38.459,-38.979,-0.012604],[39.08,-43.886,-0.001017],[40.633,-44.587,-0.001017],[40.012,-41.082,-0.035777],[39.701,-30.567,-0.070537],[40.323,-15.145,-0.082124],[41.876,3.0814,-0.035777],[44.671,21.308,-0.012604],[44.05,31.823,-0.012604],[44.671,36.73,-0.001017],[45.602,37.08,0.010569],[43.739,27.967,-0.001017],[39.701,19.555,-0.047364],[38.149,15.349,-0.024191],[36.596,11.844,0.010569],[34.111,13.246,0.022156],[32.558,12.195,0.010569],[31.937,12.545,0.010569],[31.005,10.091,0.056916],[31.316,7.6379,-0.001017],[31.316,2.7309,-0.012604],[32.248,-0.42369,-0.001017],[32.869,0.27732,0.033743],[31.937,-1.8257,-0.001017],[32.558,-8.1348,-0.047364],[31.005,-12.691,0.010569],[30.074,-16.196,0.010569],[27.278,-15.846,-0.012604],[24.794,-17.248,-0.093711],[25.104,-16.547,-0.035777],[23.862,-6.7328,-0.035777],[20.446,-2.5267,-0.093711],[19.203,-3.2277,0.045329],[21.377,-5.3308,0.091676],[29.142,-13.392,0.091676],[40.012,-21.104,0.11485],[44.05,-17.248,0.30024],[30.074,-13.743,0.080089],[31.937,-21.454,-0.001017],[35.975,-24.959,-0.001017],[39.701,-31.619,0.010569],[41.565,-39.33,-0.012604],[42.186,-44.938,-0.001017],[44.05,-45.989,0.010569],[43.739,-42.484,-0.024191],[43.118,-32.32,-0.047364],[44.671,-16.547,-0.058951],[46.534,2.0299,-0.024191],[50.261,19.906,-0.001017],[49.64,33.575,-0.012604],[49.951,37.08,-0.012604],[50.261,37.781,-0.012604],[47.777,29.72,-0.024191],[43.739,21.658,-0.058951],[42.186,17.102,-0.024191],[40.944,13.947,0.010569],[39.701,16.05,0.045329],[38.149,15.349,0.045329],[37.217,15.7,0.022156],[36.906,12.545,0.080089],[37.838,9.04,0.010569],[36.285,2.0299,-0.012604],[37.217,-1.1247,-0.012604],[37.217,-0.77419,0.033743],[36.285,-3.5782,-0.001017],[38.149,-9.8873,-0.047364],[36.906,-14.093,0.010569],[36.596,-18.65,0.010569],[34.422,-18.65,-0.001017],[30.384,-20.052,-0.1053],[29.142,-19.351,-0.035777],[26.036,-8.1348,-0.024191],[22.309,-3.5782,-0.082124],[20.756,-3.5782,0.033743],[23.241,-7.7843,0.080089],[31.937,-16.547,0.080089],[42.807,-22.506,0.091676],[48.087,-18.299,0.13802],[31.937,-14.093,0.091676],[32.869,-21.104,-0.001017],[37.838,-23.908,-0.001017],[41.565,-29.165,0.010569],[43.118,-36.526,-0.012604],[43.118,-41.433,-0.001017],[43.118,-41.783,0.010569],[40.944,-37.227,-0.001017],[37.838,-27.413,-0.035777],[38.149,-13.743,-0.047364],[40.944,2.3804,-0.024191],[46.845,16.751,-0.001017],[49.951,30.07,-0.012604],[50.882,35.328,-0.024191],[50.882,37.08,-0.035777],[49.019,31.122,-0.047364],[45.913,24.462,-0.058951],[44.05,20.957,-0.012604],[43.118,19.205,0.022156],[43.118,20.957,0.056916],[42.807,19.555,0.056916],[42.497,18.854,0.033743],[42.186,15.349,0.080089],[44.05,10.091,0.022156],[42.186,0.97834,-0.001017],[42.807,-1.8257,-0.012604],[42.497,-1.8257,0.022156],[40.944,-5.6813,-0.012604],[43.118,-13.042,-0.058951],[42.807,-16.897,-0.001017],[42.807,-22.155,0.010569],[40.323,-22.856,0.010569],[35.664,-24.959,-0.093711],[32.869,-23.557,-0.035777],[29.763,-11.289,-0.012604],[25.104,-4.6298,-0.070537],[22.93,-3.5782,0.022156],[25.725,-9.8873,0.045329],[34.111,-19.702,0.056916],[46.224,-25.66,0.080089],[51.814,-20.052,-0.070537],[33.179,-14.444,0.13802],[34.422,-20.403,0.010569],[38.459,-22.155,-0.001017],[40.944,-25.66,0.010569],[40.944,-31.619,-0.012604],[40.323,-35.124,-0.001017],[40.323,-34.423,0.010569],[39.08,-30.567,0.010569],[37.217,-22.155,-0.024191],[37.217,-10.588,-0.035777],[38.77,0.97834,-0.024191],[43.118,11.844,-0.001017],[45.602,23.06,-0.012604],[47.777,30.771,-0.035777],[48.708,36.029,-0.035777],[48.398,33.225,-0.047364],[45.602,28.668,-0.047364],[43.118,25.163,-0.012604],[42.497,22.009,0.022156],[42.807,23.06,0.056916],[44.05,20.957,0.056916],[44.981,19.205,0.022156],[44.981,16.751,0.056916],[47.777,9.741,0.010569],[46.534,-0.073181,-0.012604],[47.466,-1.8257,-0.024191],[47.466,-2.1762,0.010569],[44.981,-6.7328,-0.012604],[46.224,-13.042,-0.058951],[45.602,-16.547,-0.001017],[44.671,-22.155,0.022156],[41.876,-22.506,0.010569],[36.285,-26.712,-0.082124],[35.664,-26.011,-0.035777],[32.869,-14.444,-0.001017],[28.521,-4.6298,-0.047364],[26.036,-2.1762,-0.001017],[27.899,-10.238,0.022156],[35.664,-20.403,0.033743],[46.534,-24.959,0.045329],[51.503,-18.65,-0.29068],[34.732,-15.495,0.18437],[35.664,-19.702,0.010569],[37.838,-21.454,-0.001017],[39.08,-24.258,0.010569],[38.459,-27.062,-0.001017],[37.217,-28.114,-0.001017],[36.596,-26.361,0.010569],[36.596,-22.506,0.010569],[35.664,-15.846,-0.012604],[35.664,-7.0833,-0.024191],[35.975,0.97834,-0.024191],[38.149,9.04,-0.001017],[39.08,17.803,-0.012604],[41.565,25.514,-0.024191],[42.807,31.823,-0.047364],[43.739,30.771,-0.047364],[42.186,28.668,-0.035777],[40.012,24.813,-0.001017],[40.012,22.009,0.022156],[40.633,22.359,0.045329],[42.186,19.555,0.045329],[43.118,18.153,0.010569],[43.118,16.751,0.033743],[46.534,8.6895,-0.001017],[45.913,-1.4752,-0.012604],[46.845,-1.8257,-0.024191],[46.534,-1.4752,-0.001017],[44.05,-4.9803,-0.012604],[44.981,-10.588,-0.047364],[44.36,-14.794,-0.001017],[42.807,-19,0.022156],[40.012,-18.65,0.010569],[34.422,-24.258,-0.058951],[35.664,-24.258,-0.024191],[34.422,-13.743,-0.001017],[31.937,-3.5782,-0.035777],[28.831,-1.8257,-0.012604],[30.384,-11.64,-0.001017],[36.285,-21.104,0.010569],[44.05,-22.856,0.022156],[47.777,-17.248,-0.48766],[35.975,-16.547,0.2423],[36.285,-19.702,0.010569],[35.975,-22.506,-0.001017],[35.975,-24.609,-0.001017],[36.285,-24.258,-0.001017],[35.043,-21.805,-0.001017],[33.179,-17.248,-0.001017],[32.558,-13.743,-0.001017],[31.937,-9.1863,-0.001017],[31.316,-2.5267,-0.024191],[30.695,3.0814,-0.012604],[32.248,9.04,0.010569],[32.869,14.298,-0.001017],[33.179,19.555,-0.024191],[32.869,25.163,-0.047364],[35.043,24.462,-0.047364],[36.596,22.71,-0.012604],[34.732,20.256,0.010569],[35.975,19.205,0.022156],[37.217,19.205,0.033743],[37.838,16.401,0.033743],[37.217,16.401,-0.001017],[36.906,14.999,0.010569],[41.876,7.2874,-0.001017],[40.012,-2.5267,-0.012604],[41.565,-1.8257,-0.024191],[40.633,0.97834,-0.001017],[37.838,-1.1247,-0.001017],[40.633,-7.0833,-0.035777],[40.012,-11.289,-0.001017],[38.77,-14.444,0.022156],[36.285,-12.691,0.010569],[30.695,-18.299,-0.035777],[32.558,-17.949,-0.012604],[33.179,-9.8873,0.010569],[33.8,-1.8257,-0.024191],[32.248,-2.5267,-0.024191],[32.558,-14.794,-0.012604],[35.975,-21.454,-0.001017],[39.701,-21.104,0.010569],[40.633,-15.846,-0.68463],[33.179,-14.794,0.28865],[33.8,-17.248,-0.001017],[32.248,-19.702,-0.001017],[32.248,-21.805,-0.001017],[31.937,-19.702,-0.001017],[31.316,-15.846,-0.012604],[28.831,-11.289,-0.001017],[26.968,-9.1863,-0.001017],[25.725,-6.3823,-0.001017],[25.104,0.97834,-0.012604],[25.725,7.9885,-0.012604],[27.278,11.143,0.010569],[28.21,11.844,-0.001017],[28.521,14.999,-0.024191],[26.968,20.957,-0.047364],[28.521,20.256,-0.035777],[30.695,18.854,-0.001017],[30.695,14.999,0.010569],[31.937,13.597,0.010569],[33.8,16.05,0.010569],[32.869,13.246,0.022156],[32.869,13.947,-0.001017],[31.316,12.545,-0.001017],[34.111,5.5349,-0.001017],[32.248,-1.8257,-0.012604],[33.179,-1.4752,-0.012604],[34.111,2.3804,-0.001017],[31.005,0.27732,-0.001017],[34.422,-6.0318,-0.012604],[33.179,-11.289,-0.001017],[32.248,-14.444,0.010569],[30.695,-12.341,-0.001017],[25.725,-18.299,-0.012604],[28.831,-17.248,-0.001017],[30.384,-8.1348,0.010569],[30.695,1.3288,-0.001017],[28.831,-0.77419,-0.024191],[28.831,-15.846,-0.012604],[30.695,-22.155,-0.012604],[32.248,-20.052,-0.001017],[32.869,-15.145,-0.76574],[29.763,-12.341,0.32341],[30.074,-14.444,-0.001017],[28.521,-16.196,-0.012604],[27.899,-17.598,-0.012604],[26.657,-15.145,-0.012604],[26.347,-10.238,-0.012604],[23.241,-6.7328,-0.012604],[20.446,-6.0318,-0.012604],[18.272,-4.2793,-0.001017],[18.272,4.4834,-0.001017],[20.446,13.246,-0.001017],[22.93,13.947,0.010569],[23.241,10.091,0.010569],[24.173,10.792,-0.024191],[22.309,17.803,-0.047364],[22.309,17.102,-0.035777],[23.862,15.349,-0.001017],[26.347,8.6895,0.010569],[26.968,7.2874,-0.001017],[29.763,11.844,-0.001017],[28.831,10.091,0.010569],[28.831,12.195,0.010569],[26.347,10.091,-0.001017],[26.036,4.1329,0.010569],[23.241,-1.1247,-0.001017],[24.794,-0.42369,-0.001017],[27.899,3.4319,-0.012604],[23.862,0.62783,-0.001017],[27.278,-6.3823,0.010569],[26.347,-12.691,-0.001017],[25.104,-15.495,-0.012604],[24.173,-13.743,-0.012604],[20.135,-19.702,0.022156],[24.483,-18.299,0.010569],[26.347,-7.0833,0.010569],[25.104,4.8339,0.010569],[23.241,1.6793,-0.012604],[22.62,-16.196,-0.012604],[23.241,-22.506,-0.012604],[24.173,-19.702,-0.001017],[24.794,-14.794,-0.82367],[5.2272,-0.073182,-0.001017],[4.9166,-0.073182,-0.001017],[4.2955,-0.42369,-0.001017],[3.0531,-0.42369,-0.001017],[1.5003,-0.77419,-0.001017],[-0.36322,-0.073182,-0.001017],[-2.2267,-0.073182,-0.001017],[-3.1584,-0.42369,-0.001017],[-2.2267,0.62783,-0.001017],[1.1897,0.27732,-0.001017],[6.4695,0.27732,-0.001017],[8.333,-1.8257,-0.001017],[8.0224,0.97833,-0.001017],[8.9541,4.1329,-0.001017],[11.128,6.2359,-0.001017],[15.476,9.04,-0.001017],[9.5753,10.442,-0.001017],[17.961,10.792,-0.001017],[17.029,12.896,-0.001017],[9.5753,10.792,-0.001017],[3.0531,8.6895,-0.001017],[-0.36322,5.5349,-0.001017],[1.1897,7.6379,-0.001017],[2.1214,6.9369,-0.001017],[1.1897,7.6379,-0.001017],[-0.6738,4.1329,-0.001017],[0.25794,2.3804,-0.001017],[0.56851,4.1329,-0.001017],[0.56851,4.4834,-0.001017],[-0.36322,2.7309,-0.001017],[0.87909,2.3804,-0.001017],[2.1214,2.0299,-0.001017],[3.0531,0.27732,-0.001017],[3.0531,-0.073182,-0.001017],[6.4695,1.6793,-0.001017],[8.333,3.4319,-0.001017],[8.6436,2.0299,-0.001017],[8.333,3.4319,-0.001017],[5.5378,1.6793,-0.001017],[1.1897,2.0299,-0.001017],[-3.469,-0.77419,-0.001017],[15.476,-2.5267,-0.1053],[17.34,-1.8257,-0.001017],[15.476,-1.8257,0.010569],[12.06,-1.4752,-0.001017],[10.196,-2.1762,0.010569],[7.4013,-1.4752,-0.001017],[5.5378,-1.8257,0.010569],[4.606,-1.8257,-0.012604],[4.606,-1.4752,-0.024191],[4.606,-0.77419,-0.024191],[6.4695,0.27732,-0.001017],[8.333,-1.8257,-0.001017],[8.0224,0.97834,-0.001017],[8.9541,4.1329,-0.001017],[11.128,6.2359,-0.001017],[15.476,9.04,-0.001017],[9.5753,10.442,-0.001017],[17.961,10.792,-0.001017],[17.029,12.896,-0.001017],[9.5753,10.792,-0.001017],[3.0531,8.6895,-0.001017],[2.432,10.091,-0.012604],[4.2955,8.6895,-0.001017],[3.6743,10.442,-0.001017],[3.6743,9.741,-0.001017],[3.3637,11.143,-0.001017],[5.2272,9.741,-0.012604],[6.1589,8.339,-0.001017],[4.9166,5.5349,0.010569],[3.0531,2.0299,-0.001017],[3.0531,1.3288,-0.024191],[4.2955,0.27732,-0.024191],[4.606,-1.1247,-0.012604],[4.9166,-2.1762,-0.024191],[9.2647,0.27732,-0.024191],[14.234,0.27732,-0.024191],[16.097,-1.4752,0.010569],[16.408,-1.1247,0.022156],[16.719,-2.1762,0.033743],[12.681,-2.1762,0.080089],[6.4695,0.27732,0.2423],[26.657,-10.588,-0.14006],[29.142,-9.8873,0.022156],[26.657,-9.1863,0.010569],[21.998,-8.1348,-0.001017],[16.408,-4.2793,0.010569],[12.681,-1.8257,0.010569],[10.196,-1.1247,0.010569],[8.6436,-1.4752,-0.024191],[8.6436,-0.073181,-0.035777],[8.0224,2.7309,-0.070537],[10.196,3.7824,-0.070537],[11.128,3.7824,-0.024191],[12.06,-0.42369,-0.012604],[12.992,2.7309,-0.012604],[16.408,12.195,-0.024191],[18.582,14.298,0.045329],[13.923,13.947,-0.001017],[19.824,11.844,-0.012604],[18.893,13.947,-0.001017],[15.476,13.947,0.010569],[12.371,14.298,-0.012604],[10.507,16.401,-0.024191],[10.818,14.999,-0.001017],[10.507,13.597,0.022156],[8.9541,14.298,-0.001017],[7.0907,12.195,0.010569],[8.333,10.091,-0.012604],[8.0224,10.091,-0.012604],[6.7801,6.2359,0.033743],[5.2272,0.97834,-0.001017],[5.5378,-1.1247,-0.058951],[7.0907,-3.9287,-0.058951],[8.0224,-6.3823,-0.047364],[8.9541,-7.0833,-0.047364],[12.681,-4.9803,-0.058951],[16.719,-4.6298,-0.047364],[18.893,-5.6813,0.022156],[20.446,-8.1348,0.022156],[23.241,-15.495,0.080089],[24.173,-14.794,0.091676],[17.34,-3.5782,0.40452],[30.074,-11.64,-0.12847],[31.316,-16.196,0.033743],[30.695,-19,0.010569],[27.899,-20.052,-0.001017],[21.067,-12.341,0.010569],[17.34,-9.1863,0.010569],[14.545,-5.6813,0.022156],[11.128,-0.77419,-0.035777],[9.5753,2.3804,-0.047364],[8.9541,4.8339,-0.070537],[10.818,6.9369,-0.1053],[12.681,4.8339,-0.047364],[15.166,3.4319,-0.024191],[17.961,13.246,-0.024191],[18.893,22.009,-0.001017],[22.62,20.957,0.12644],[21.998,19.205,-0.001017],[23.241,11.844,-0.093711],[20.135,11.143,0.022156],[16.097,11.143,0.010569],[15.476,11.494,-0.024191],[15.166,13.597,-0.047364],[16.719,13.597,-0.012604],[16.408,11.494,0.022156],[15.166,11.143,0.022156],[14.545,10.442,0.010569],[14.855,9.04,-0.012604],[13.923,7.6379,-0.001017],[12.681,3.7824,0.045329],[10.507,-1.4752,-0.001017],[8.9541,-4.9803,-0.082124],[10.507,-6.7328,-0.093711],[11.439,-9.5368,-0.070537],[13.923,-10.238,-0.082124],[16.719,-8.8358,-0.082124],[18.893,-7.0833,-0.058951],[20.135,-6.0318,0.045329],[22.309,-9.1863,0.045329],[26.968,-18.65,0.091676],[30.074,-19,0.11485],[24.794,-6.0318,0.48562],[32.248,-11.289,-0.093711],[32.869,-17.949,0.033743],[32.558,-22.506,0.010569],[31.937,-26.361,-0.001017],[30.074,-28.464,-0.001017],[27.899,-27.413,0.022156],[23.241,-17.949,0.010569],[14.855,-3.2277,-0.035777],[12.06,1.6793,-0.047364],[10.818,4.4834,-0.070537],[12.681,6.5864,-0.093711],[16.097,7.6379,-0.047364],[18.893,11.143,-0.024191],[21.377,24.112,0.010569],[20.756,29.369,0.033743],[27.899,25.514,0.14961],[26.657,19.555,-0.001017],[23.241,9.741,-0.082124],[20.135,8.6895,0.033743],[17.029,9.741,0.010569],[17.029,9.04,-0.035777],[16.719,9.741,-0.070537],[17.961,8.6895,-0.035777],[18.582,7.2874,0.010569],[20.135,6.9369,0.022156],[19.824,7.2874,0.022156],[20.135,7.2874,-0.001017],[18.893,5.1844,0.010569],[18.582,0.97834,0.056916],[16.408,-4.6298,0.022156],[14.234,-9.1863,-0.082124],[14.234,-11.64,-0.11688],[15.166,-14.794,-0.082124],[16.097,-13.042,-0.1053],[18.893,-10.939,-0.1053],[20.135,-6.7328,-0.070537],[20.756,-4.6298,0.080089],[24.483,-8.4853,0.080089],[31.937,-19,0.11485],[35.664,-21.104,0.12644],[32.558,-6.7328,0.53197],[34.111,-11.64,-0.047364],[34.422,-19,0.045329],[34.422,-24.959,0.010569],[34.422,-30.567,-0.012604],[33.179,-34.423,-0.001017],[32.248,-36.175,0.010569],[30.384,-32.32,-0.012604],[26.347,-23.207,-0.047364],[22.93,-11.289,-0.058951],[19.203,0.62783,-0.058951],[18.893,6.9369,-0.082124],[20.756,11.143,-0.024191],[24.173,22.71,-0.012604],[23.862,32.173,0.022156],[25.725,34.977,0.033743],[31.005,29.369,0.091676],[30.074,19.906,-0.001017],[26.347,10.793,-0.047364],[22.62,9.741,0.022156],[20.446,10.793,0.010569],[20.135,9.3905,-0.035777],[19.203,9.3905,-0.070537],[19.203,7.6379,-0.035777],[19.203,5.5349,-0.001017],[20.446,3.4319,0.022156],[21.067,3.4319,0.022156],[21.998,3.4319,0.010569],[22.93,1.6793,0.022156],[22.309,-2.1762,0.080089],[20.756,-7.7843,0.033743],[18.272,-11.289,-0.070537],[18.272,-13.743,-0.11688],[19.824,-15.495,-0.082124],[19.203,-12.691,-0.1053],[21.998,-9.8873,-0.1053],[21.998,-5.6813,-0.058951],[22.309,-3.9287,0.080089],[26.657,-10.238,0.091676],[35.975,-21.805,0.12644],[42.186,-23.557,0.12644],[40.633,-8.8358,0.47404],[36.285,-12.341,0.022156],[35.975,-20.052,0.033743],[36.596,-26.361,0.010569],[36.906,-33.021,-0.012604],[36.906,-38.278,-0.012604],[36.285,-41.783,0.010569],[35.043,-40.732,-0.012604],[32.248,-34.773,-0.047364],[28.831,-24.258,-0.070537],[26.347,-9.5368,-0.070537],[25.725,4.1329,-0.070537],[26.347,16.401,-0.012604],[28.21,30.07,-0.001017],[27.899,36.379,0.022156],[32.248,37.431,0.010569],[35.043,32.173,0.056916],[34.422,22.359,-0.001017],[31.316,13.597,-0.035777],[27.278,11.844,0.022156],[25.104,12.195,0.010569],[23.862,10.442,-0.024191],[22.93,9.741,-0.058951],[22.93,7.6379,-0.024191],[22.62,4.8339,-0.001017],[22.93,2.3804,0.022156],[24.173,0.97834,0.010569],[24.483,1.3288,0.010569],[26.347,-0.42369,0.022156],[25.104,-4.6298,0.080089],[23.241,-9.5368,0.045329],[20.756,-12.341,-0.058951],[21.377,-15.145,-0.11688],[22.62,-16.897,-0.082124],[21.067,-12.691,-0.1053],[23.241,-9.8873,-0.1053],[22.93,-5.3308,-0.035777],[23.862,-1.8257,0.080089],[29.142,-9.5368,0.10326],[40.012,-21.805,0.12644],[47.466,-24.258,0.11485],[46.845,-10.238,0.36976],[38.459,-12.691,0.091676],[37.838,-21.104,0.033743],[38.459,-27.413,0.010569],[40.012,-34.773,-0.012604],[40.323,-40.732,-0.012604],[40.012,-44.938,0.010569],[39.08,-45.639,-0.012604],[36.285,-41.433,-0.035777],[33.8,-32.67,-0.070537],[32.248,-18.299,-0.082124],[31.937,-0.073181,-0.070537],[31.937,18.854,-0.001017],[32.558,33.575,-0.001017],[33.8,37.781,0.010569],[38.459,38.482,-0.012604],[40.633,34.977,0.033743],[39.08,25.864,-0.012604],[35.975,16.751,-0.035777],[32.248,13.597,0.010569],[30.384,13.246,0.022156],[28.521,11.494,-0.012604],[28.21,11.143,-0.047364],[28.521,8.339,-0.001017],[28.521,5.5349,-0.001017],[28.521,2.0299,0.022156],[28.521,-0.42369,0.010569],[29.142,-0.073181,-0.001017],[31.005,-1.4752,0.022156],[29.763,-5.6813,0.080089],[27.899,-10.238,0.056916],[25.725,-12.691,-0.047364],[26.036,-17.248,-0.11688],[26.036,-19,-0.082124],[22.93,-13.743,-0.1053],[25.104,-10.939,-0.1053],[24.173,-5.6813,-0.024191],[25.725,-0.77419,0.056916],[31.316,-9.5368,0.10326],[42.807,-21.805,0.11485],[51.503,-24.959,0.091676],[51.814,-11.64,0.20754],[40.323,-13.392,0.17278],[39.08,-21.454,0.022156],[40.323,-28.114,0.010569],[42.186,-35.474,-0.012604],[43.118,-41.783,-0.012604],[43.739,-45.989,0.010569],[42.807,-47.391,-0.012604],[40.633,-43.536,-0.024191],[38.149,-35.124,-0.058951],[36.285,-21.454,-0.070537],[35.664,-4.6298,-0.058951],[35.975,17.102,0.010569],[38.149,33.225,-0.001017],[40.944,37.431,-0.012604],[43.118,38.833,-0.024191],[45.913,37.431,0.010569],[43.118,27.967,-0.024191],[40.012,18.504,-0.035777],[36.285,15.349,0.010569],[35.043,14.999,0.033743],[33.8,13.246,-0.001017],[34.111,13.246,-0.035777],[35.043,10.091,0.010569],[36.285,7.6379,0.010569],[35.664,2.7309,0.033743],[34.422,-1.4752,0.010569],[35.664,-1.1247,-0.012604],[37.217,-2.5267,0.022156],[36.906,-6.3823,0.080089],[35.975,-10.939,0.045329],[33.179,-13.743,-0.047364],[32.248,-20.403,-0.11688],[31.005,-22.506,-0.082124],[26.347,-15.846,-0.093711],[26.657,-13.042,-0.082124],[25.725,-6.7328,-0.001017],[26.968,-1.1247,0.045329],[32.869,-11.289,0.10326],[45.602,-23.557,0.10326],[53.988,-26.361,0.080089],[55.852,-13.743,0.010569],[41.876,-13.042,0.27706],[40.323,-21.104,0.010569],[41.876,-27.062,-0.001017],[44.05,-33.722,-0.012604],[44.981,-38.979,-0.012604],[44.671,-41.783,0.010569],[42.497,-41.783,-0.001017],[38.459,-36.175,-0.012604],[33.8,-27.763,-0.035777],[31.316,-16.196,-0.047364],[32.248,-2.5267,-0.035777],[33.8,14.999,0.010569],[36.906,27.967,-0.001017],[42.497,34.627,-0.012604],[44.671,37.08,-0.035777],[47.466,36.73,-0.012604],[45.602,29.019,-0.047364],[43.118,21.308,-0.035777],[40.944,19.906,0.010569],[40.944,20.607,0.033743],[40.944,19.906,-0.001017],[41.565,18.504,-0.012604],[42.497,14.298,0.033743],[44.36,11.143,0.022156],[43.118,3.7824,0.033743],[41.565,-1.8257,-0.001017],[42.497,-2.1762,-0.012604],[44.05,-5.3308,-0.001017],[44.05,-10.939,0.045329],[43.739,-15.495,0.033743],[41.565,-17.598,-0.035777],[39.701,-24.258,-0.1053],[36.906,-27.062,-0.058951],[29.142,-19,-0.070537],[28.521,-14.444,-0.058951],[27.899,-7.4338,0.010569],[28.521,-1.4752,0.033743],[34.732,-13.392,0.080089],[47.466,-26.361,0.080089],[55.541,-29.165,0.045329],[58.336,-17.949,-0.23275],[42.497,-13.392,0.39293],[40.944,-19.702,-0.001017],[41.876,-24.959,-0.001017],[43.118,-29.516,-0.001017],[43.118,-32.67,-0.012604],[42.186,-34.423,0.010569],[40.944,-33.722,-0.001017],[38.459,-28.464,-0.001017],[34.422,-21.805,-0.024191],[31.937,-12.341,-0.035777],[31.005,-2.1762,-0.012604],[31.937,10.091,0.010569],[34.422,20.957,-0.001017],[38.77,27.967,-0.024191],[43.118,33.575,-0.035777],[48.708,35.328,-0.024191],[47.777,30.07,-0.047364],[45.602,25.514,-0.024191],[42.186,22.71,-0.001017],[41.876,23.06,0.033743],[42.497,21.658,-0.001017],[43.739,19.555,-0.012604],[45.602,17.102,0.022156],[49.019,12.195,0.022156],[48.087,3.4319,0.022156],[46.845,-2.1762,-0.001017],[46.845,-3.2277,-0.024191],[47.777,-7.0833,-0.001017],[46.845,-12.691,0.033743],[44.36,-15.145,0.033743],[41.876,-16.196,-0.035777],[40.012,-23.557,-0.093711],[38.149,-28.815,-0.047364],[31.316,-21.805,-0.058951],[31.005,-15.846,-0.047364],[28.831,-6.3823,-0.001017],[29.763,0.62783,0.022156],[35.043,-13.042,0.056916],[46.534,-25.31,0.045329],[53.367,-27.763,0.010569],[54.92,-17.248,-0.49924],[41.565,-15.145,0.49721],[40.323,-19.351,-0.001017],[40.633,-22.856,-0.001017],[40.633,-25.66,-0.001017],[39.08,-27.413,-0.001017],[37.838,-27.062,-0.001017],[37.217,-24.609,-0.001017],[35.975,-20.403,-0.001017],[32.869,-15.495,-0.024191],[30.074,-8.1348,-0.035777],[28.831,-0.77419,-0.012604],[28.831,7.6379,0.010569],[31.005,15.7,-0.001017],[33.8,22.009,-0.024191],[38.77,28.318,-0.035777],[45.602,29.72,-0.035777],[45.602,27.266,-0.035777],[44.05,25.163,-0.012604],[40.633,22.71,-0.001017],[40.633,22.71,0.033743],[40.944,20.957,-0.001017],[41.565,18.504,-0.012604],[43.118,16.751,0.010569],[47.777,10.792,0.010569],[46.534,2.0299,0.010569],[45.913,-2.8772,-0.001017],[45.913,-2.1762,-0.012604],[46.845,-6.3823,-0.001017],[46.224,-11.289,0.022156],[43.118,-12.341,0.022156],[40.012,-12.691,-0.024191],[38.149,-20.052,-0.082124],[36.596,-27.062,-0.024191],[31.937,-21.454,-0.035777],[32.248,-16.196,-0.035777],[30.695,-5.3308,-0.001017],[31.316,0.27732,0.010569],[34.732,-13.042,0.033743],[42.807,-23.908,0.022156],[47.777,-25.31,-0.024191],[48.398,-16.196,-0.73098],[37.838,-18.299,0.60149],[38.459,-20.052,-0.012604],[38.149,-21.104,-0.001017],[36.285,-22.506,-0.001017],[33.179,-23.207,-0.001017],[32.248,-20.403,-0.001017],[32.248,-15.495,-0.001017],[30.695,-11.64,-0.001017],[27.899,-8.4853,-0.012604],[25.725,-3.5782,-0.024191],[24.794,1.6793,-0.001017],[25.104,7.6379,0.010569],[26.968,12.195,-0.001017],[28.21,18.504,-0.024191],[32.248,22.359,-0.035777],[37.838,20.256,-0.035777],[39.08,19.555,-0.024191],[40.012,20.256,0.010569],[37.838,19.555,0.010569],[39.08,19.906,0.022156],[38.149,18.504,-0.001017],[35.975,15.7,-0.012604],[36.596,13.597,-0.001017],[40.944,7.6379,-0.001017],[39.08,-0.073181,-0.001017],[38.77,-3.9287,-0.001017],[40.323,-1.1247,-0.012604],[42.497,-3.5782,-0.001017],[42.807,-8.1348,0.010569],[40.633,-7.4338,0.022156],[37.838,-7.7843,-0.012604],[34.732,-15.495,-0.047364],[33.179,-23.207,-0.012604],[30.695,-18.299,-0.024191],[32.248,-15.145,-0.024191],[32.248,-5.3308,-0.012604],[33.179,-1.8257,-0.001017],[34.422,-14.794,0.022156],[37.217,-23.207,-0.001017],[40.012,-23.207,-0.035777],[39.701,-15.846,-0.91636],[33.179,-16.897,0.64784],[34.422,-17.598,-0.012604],[33.8,-17.949,-0.001017],[32.248,-18.299,-0.001017],[30.074,-18.299,-0.001017],[28.521,-14.444,-0.012604],[27.278,-8.8358,-0.012604],[24.794,-6.3823,-0.001017],[21.377,-4.9803,-0.012604],[19.824,-0.42369,-0.012604],[20.135,5.1844,0.010569],[21.998,9.3905,0.010569],[24.173,10.091,-0.001017],[24.173,16.401,-0.024191],[26.036,19.906,-0.024191],[30.384,16.05,-0.035777],[31.005,13.947,-0.024191],[32.558,14.999,0.010569],[30.695,14.298,-0.001017],[33.8,16.401,0.022156],[33.8,16.05,0.010569],[31.316,12.545,-0.001017],[32.248,11.494,-0.001017],[34.732,6.5864,-0.001017],[32.869,-0.073181,-0.001017],[31.937,-3.9287,-0.001017],[34.111,-0.42369,-0.001017],[36.285,-1.8257,-0.001017],[36.285,-7.4338,-0.001017],[35.043,-6.3823,-0.001017],[31.937,-6.7328,-0.001017],[30.384,-14.794,-0.012604],[28.521,-23.207,-0.001017],[26.036,-17.949,-0.001017],[28.21,-13.392,-0.001017],[28.831,-1.8257,-0.001017],[30.384,-0.77419,-0.012604],[29.763,-14.794,-0.001017],[30.384,-22.506,-0.012604],[31.316,-21.805,-0.047364],[31.316,-15.145,-1.0206],[29.142,-13.392,0.6826],[29.763,-14.444,-0.001017],[29.142,-14.794,-0.012604],[28.521,-14.794,-0.012604],[26.347,-13.392,-0.012604],[25.104,-8.1348,-0.012604],[23.241,-2.8772,-0.012604],[19.203,-2.1762,-0.001017],[14.855,-1.8257,-0.001017],[13.302,2.7309,-0.012604],[15.166,9.04,0.010569],[18.582,11.494,0.010569],[21.377,8.6895,-0.001017],[20.446,13.947,-0.012604],[19.824,18.854,-0.012604],[22.62,13.246,-0.047364],[21.998,9.3905,-0.024191],[24.483,9.04,0.010569],[22.309,9.04,-0.012604],[26.657,12.896,0.010569],[29.142,12.896,0.022156],[27.278,9.741,0.022156],[27.899,9.04,-0.001017],[28.831,6.2359,-0.001017],[26.968,0.62783,-0.012604],[24.483,-3.5782,-0.001017],[28.21,-0.073181,-0.001017],[30.384,-0.77419,-0.001017],[29.142,-7.4338,-0.012604],[28.521,-6.7328,-0.012604],[24.173,-6.3823,-0.001017],[24.794,-15.145,0.022156],[22.93,-24.609,0.010569],[20.135,-18.65,0.022156],[22.93,-10.939,0.022156],[22.62,2.7309,0.010569],[24.794,1.3288,-0.012604],[22.93,-14.794,-0.024191],[21.998,-21.805,-0.024191],[22.93,-20.403,-0.047364],[22.62,-14.444,-1.0786],[5.5378,-0.42369,-0.001017],[4.9166,0.27732,-0.001017],[4.606,-0.42369,-0.001017],[2.432,0.27732,-0.001017],[1.1897,-0.77419,-0.001017],[0.56851,0.62783,-0.001017],[-2.5373,-0.42369,-0.001017],[-1.6055,1.3288,-0.001017],[-0.36322,1.3288,-0.001017],[2.1214,0.97833,-0.001017],[8.333,3.0814,-0.001017],[10.507,0.27732,-0.001017],[7.0907,2.0299,-0.001017],[9.5753,0.62783,-0.001017],[9.5753,6.2359,-0.001017],[8.9541,7.2874,-0.001017],[6.4695,8.6895,-0.001017],[18.272,16.05,-0.001017],[14.855,13.246,-0.001017],[6.4695,13.597,-0.001017],[1.5003,11.844,-0.001017],[1.1897,7.2874,-0.001017],[0.56851,6.5864,-0.001017],[1.5003,6.2359,-0.001017],[2.432,5.5349,-0.001017],[-0.36322,4.4834,-0.001017],[0.87909,4.1329,-0.001017],[0.25794,5.1844,-0.001017],[1.1897,2.3804,-0.001017],[1.5003,2.0299,-0.001017],[2.1214,1.6793,-0.001017],[2.1214,2.0299,-0.001017],[2.1214,1.6793,-0.001017],[6.1589,0.97833,-0.001017],[10.196,-1.8257,-0.001017],[8.0224,1.6793,-0.001017],[8.333,-0.073182,-0.001017],[10.196,0.27732,-0.001017],[5.5378,-1.4752,-0.001017],[2.1214,-2.1762,-0.001017],[-1.295,-1.4752,-0.001017],[17.029,-2.1762,-0.12847],[16.408,-3.9287,-0.001017],[13.302,-1.1247,0.010569],[12.681,0.27732,0.010569],[8.9541,-0.77419,-0.001017],[7.0907,-0.42369,0.010569],[4.2955,-1.8257,-0.001017],[4.2955,-0.42369,-0.012604],[3.3637,-0.42369,-0.012604],[2.432,0.97834,-0.001017],[8.333,3.0814,-0.001017],[10.507,0.27732,-0.001017],[7.0907,2.0299,-0.001017],[9.5753,0.62783,-0.001017],[9.5753,6.2359,-0.001017],[8.9541,7.2874,-0.001017],[6.4695,8.6895,-0.001017],[18.272,16.05,-0.001017],[14.855,13.246,-0.001017],[6.4695,13.597,-0.001017],[1.5003,11.844,-0.001017],[3.6743,12.195,-0.001017],[3.6743,8.339,-0.001017],[3.6743,7.9885,-0.012604],[6.1589,12.896,-0.001017],[4.606,10.792,-0.001017],[6.4695,9.741,-0.001017],[3.3637,6.9369,-0.001017],[3.6743,5.5349,-0.012604],[2.1214,7.9885,-0.012604],[2.432,4.1329,-0.012604],[3.3637,2.7309,-0.001017],[2.7426,1.3288,-0.024191],[8.333,0.27732,-0.047364],[14.234,-3.2277,0.010569],[14.234,-0.77419,0.022156],[17.961,-3.2277,-0.001017],[20.446,-2.5267,0.045329],[17.029,-5.3308,0.080089],[13.302,-2.5267,0.056916],[10.196,-1.8257,0.19596],[28.521,-10.588,-0.1864],[26.657,-10.238,-0.001017],[24.173,-6.7328,0.022156],[20.446,-4.2793,0.022156],[14.855,-0.42369,-0.001017],[11.439,0.27732,0.022156],[8.0224,-0.42369,0.010569],[7.0907,0.62783,-0.035777],[6.4695,1.3288,-0.012604],[5.2272,3.4319,-0.047364],[8.333,5.1844,-0.024191],[10.818,3.7824,-0.024191],[9.5753,1.6793,-0.012604],[12.681,2.3804,-0.001017],[12.681,10.091,0.010569],[11.439,11.143,0.033743],[8.6436,10.792,-0.001017],[18.272,16.05,-0.001017],[14.855,13.246,-0.001017],[11.439,15.349,0.010569],[10.507,17.452,-0.001017],[11.439,18.854,-0.001017],[10.196,17.102,-0.012604],[10.196,14.298,-0.001017],[9.5753,13.597,-0.001017],[8.0224,12.195,-0.001017],[8.9541,10.792,-0.001017],[7.4013,9.741,-0.001017],[8.6436,7.9885,-0.012604],[6.7801,3.4319,-0.035777],[5.2272,0.27732,-0.047364],[6.7801,-1.8257,-0.024191],[5.2272,-3.9287,-0.058951],[8.333,-6.3823,-0.1053],[14.545,-8.8358,0.010569],[17.34,-7.0833,0.045329],[21.067,-8.8358,-0.012604],[25.725,-13.042,0.056916],[27.899,-17.949,0.13802],[23.862,-10.588,0.10326],[21.998,-3.5782,0.32341],[33.8,-12.691,-0.17482],[33.8,-16.196,-0.001017],[32.248,-16.897,0.033743],[27.899,-15.145,0.033743],[20.135,-7.4338,0.010569],[16.408,-6.3823,0.033743],[11.128,-1.8257,0.022156],[8.6436,1.3288,-0.035777],[6.7801,3.0814,-0.001017],[6.1589,4.8339,-0.058951],[8.333,5.5349,-0.058951],[11.439,2.3804,-0.047364],[12.681,3.4319,-0.024191],[16.097,12.195,-0.001017],[17.029,19.555,0.080089],[12.992,18.504,0.10326],[19.824,19.205,0.022156],[22.62,16.05,-0.024191],[18.582,13.597,0.033743],[15.476,11.494,-0.001017],[14.545,12.195,-0.012604],[14.855,15.7,-0.001017],[14.855,15.349,-0.024191],[15.476,12.195,-0.012604],[15.166,11.143,0.022156],[14.234,10.091,-0.001017],[15.166,9.3905,-0.001017],[13.923,7.9885,0.010569],[13.302,4.4834,-0.024191],[12.371,-0.073181,-0.047364],[10.818,-4.6298,-0.058951],[10.818,-6.0318,-0.047364],[11.128,-8.1348,-0.093711],[13.302,-10.939,-0.16323],[18.272,-11.64,-0.001017],[20.135,-9.5368,0.045329],[22.93,-10.939,-0.012604],[27.899,-17.949,0.080089],[32.248,-22.155,0.1612],[30.695,-16.196,0.11485],[29.763,-6.0318,0.36976],[38.149,-12.341,-0.15164],[38.77,-16.897,-0.012604],[37.838,-21.104,0.033743],[34.111,-23.908,0.033743],[30.384,-25.66,0.022156],[26.036,-23.207,0.033743],[17.029,-6.7328,0.022156],[11.128,-0.073181,-0.035777],[8.9541,2.7309,0.010569],[8.9541,3.4319,-0.047364],[10.507,3.7824,-0.082124],[13.302,2.3804,-0.070537],[15.476,11.143,-0.035777],[19.203,21.308,0.045329],[16.408,26.215,0.13802],[20.446,25.514,0.11485],[26.036,20.957,0.033743],[24.483,14.298,0.010569],[20.446,12.545,0.033743],[18.272,9.3905,-0.035777],[16.719,8.339,-0.035777],[16.097,10.091,-0.012604],[16.719,9.3905,-0.035777],[17.961,7.9885,-0.024191],[17.961,6.9369,0.022156],[18.272,6.9369,0.010569],[18.582,4.8339,0.010569],[18.893,3.7824,0.022156],[18.582,0.62783,-0.012604],[16.719,-6.0318,-0.035777],[14.234,-12.341,-0.058951],[14.545,-12.691,-0.058951],[15.166,-13.042,-0.12847],[16.408,-15.145,-0.19799],[19.824,-13.392,-0.012604],[21.067,-9.8873,0.045329],[24.173,-9.5368,-0.012604],[29.763,-17.949,0.10326],[36.906,-23.557,0.17278],[37.217,-17.949,0.12644],[37.217,-7.4338,0.39293],[41.876,-13.042,-0.082124],[42.186,-18.299,-0.012604],[41.565,-24.258,0.033743],[38.459,-28.464,0.033743],[35.664,-32.32,0.022156],[32.558,-33.021,0.033743],[27.899,-27.062,0.010569],[22.93,-18.65,-0.035777],[17.961,-4.2793,-0.001017],[14.855,2.0299,-0.035777],[14.855,4.8339,-0.058951],[16.408,7.6379,-0.058951],[19.203,20.607,-0.012604],[18.582,30.771,0.080089],[20.756,31.823,0.11485],[26.657,30.07,0.080089],[29.763,21.308,0.033743],[26.347,14.999,0.022156],[22.309,13.597,0.022156],[20.446,10.091,-0.024191],[18.582,8.6895,-0.035777],[17.34,8.339,-0.012604],[17.961,6.5864,-0.047364],[17.961,6.2359,-0.035777],[17.961,3.7824,0.022156],[18.272,3.4319,0.022156],[19.203,2.0299,0.022156],[22.309,0.27732,0.033743],[22.309,-1.8257,0.010569],[20.756,-8.1348,-0.012604],[20.135,-15.495,-0.058951],[20.135,-16.196,-0.058951],[20.135,-15.145,-0.12847],[20.446,-16.547,-0.1864],[22.93,-11.289,-0.024191],[25.104,-7.4338,0.056916],[26.968,-7.7843,-0.012604],[33.179,-19,0.10326],[41.876,-25.31,0.1612],[43.739,-19,0.11485],[44.36,-7.4338,0.34658],[44.981,-13.392,0.010569],[45.602,-19,-0.012604],[44.981,-26.011,0.022156],[42.186,-31.969,0.033743],[40.012,-36.526,0.010569],[37.217,-39.68,0.022156],[34.111,-37.928,-0.001017],[30.074,-31.969,-0.047364],[24.794,-19,-0.024191],[20.756,-6.0318,-0.047364],[18.893,3.7824,-0.047364],[18.272,14.999,-0.058951],[20.756,28.668,0.010569],[21.998,36.379,0.080089],[25.725,36.029,0.080089],[31.005,33.575,0.056916],[32.558,24.462,0.022156],[29.763,18.153,0.022156],[25.104,16.751,0.022156],[22.93,12.896,-0.012604],[20.756,9.741,-0.024191],[20.135,7.9885,-0.012604],[20.446,6.2359,-0.047364],[19.203,5.5349,-0.035777],[19.203,2.7309,0.022156],[19.824,1.3288,0.022156],[20.756,0.27732,0.022156],[24.173,-1.1247,0.033743],[24.483,-2.5267,0.022156],[23.862,-8.4853,-0.001017],[23.241,-16.547,-0.047364],[23.862,-17.598,-0.058951],[23.241,-15.846,-0.12847],[22.62,-18.299,-0.1864],[25.104,-11.289,-0.024191],[26.968,-7.0833,0.080089],[29.763,-6.0318,-0.001017],[36.906,-18.65,0.10326],[46.224,-26.712,0.14961],[48.708,-21.805,0.10326],[50.261,-9.8873,0.23072],[47.777,-13.743,0.13802],[48.398,-19.702,-0.012604],[48.087,-27.413,0.022156],[45.602,-34.072,0.022156],[43.118,-40.031,0.010569],[41.565,-43.536,0.022156],[38.77,-44.237,-0.001017],[35.043,-40.381,-0.047364],[30.695,-31.619,-0.024191],[26.657,-15.846,-0.047364],[23.862,-0.42369,-0.035777],[21.067,17.803,-0.058951],[24.173,31.823,0.010569],[27.278,38.132,0.080089],[30.695,38.132,0.056916],[35.975,36.379,0.033743],[36.596,27.967,0.022156],[32.869,21.308,0.022156],[28.521,18.854,0.022156],[26.347,15.7,-0.012604],[23.862,11.143,-0.024191],[23.862,7.9885,-0.001017],[24.483,5.5349,-0.035777],[23.241,5.5349,-0.035777],[23.862,2.7309,0.010569],[23.862,-0.073181,0.022156],[24.483,-0.42369,0.022156],[28.21,-1.1247,0.033743],[28.521,-3.2277,0.022156],[27.899,-8.1348,0.010569],[27.899,-16.897,-0.035777],[28.21,-19,-0.047364],[26.657,-16.897,-0.12847],[24.794,-20.403,-0.16323],[27.278,-13.392,-0.024191],[28.521,-7.0833,0.080089],[31.937,-5.3308,0.010569],[40.012,-18.65,0.091676],[49.019,-27.763,0.13802],[53.678,-23.207,0.080089],[55.852,-11.64,0.080089],[49.64,-14.093,0.27706],[50.261,-20.403,-0.012604],[50.572,-28.114,0.010569],[48.398,-35.124,0.010569],[46.534,-41.433,-0.001017],[44.981,-45.288,0.010569],[42.807,-46.34,-0.001017],[39.701,-43.536,-0.035777],[35.664,-35.474,-0.024191],[31.937,-23.207,-0.047364],[28.521,-6.7328,-0.024191],[25.725,14.298,-0.047364],[29.763,29.369,0.010569],[33.179,36.379,0.056916],[35.975,38.482,0.033743],[41.565,38.833,0.022156],[40.944,32.173,0.010569],[36.596,24.112,0.010569],[32.248,20.607,0.022156],[30.384,17.452,-0.001017],[27.899,12.545,-0.012604],[28.831,9.04,-0.001017],[30.695,6.5864,-0.035777],[30.384,6.2359,-0.024191],[30.695,3.0814,0.010569],[30.695,-0.42369,0.010569],[32.248,-1.1247,0.022156],[35.664,-1.4752,0.033743],[35.664,-2.8772,0.022156],[34.732,-8.4853,0.010569],[34.422,-17.598,-0.035777],[34.111,-21.104,-0.047364],[31.005,-19.351,-0.11688],[27.278,-23.207,-0.14006],[30.074,-16.196,-0.012604],[29.763,-7.0833,0.080089],[32.869,-6.0318,0.010569],[42.497,-20.052,0.080089],[51.503,-28.815,0.12644],[57.404,-23.557,0.056916],[60.2,-11.64,-0.14006],[50.882,-14.093,0.43928],[51.814,-19.702,-0.012604],[52.125,-27.062,-0.001017],[50.261,-33.371,-0.001017],[48.398,-38.278,-0.001017],[46.534,-41.082,0.010569],[43.739,-39.68,-0.001017],[38.77,-34.423,-0.024191],[33.179,-25.31,-0.012604],[30.695,-15.846,-0.035777],[28.521,-4.2793,-0.012604],[27.278,11.494,-0.035777],[32.248,24.112,-0.001017],[36.906,32.173,0.045329],[39.08,35.678,0.010569],[44.05,37.431,0.010569],[44.05,33.926,0.010569],[40.012,25.864,-0.001017],[37.217,24.112,0.010569],[36.596,22.359,-0.001017],[35.975,19.555,-0.012604],[37.838,15.349,-0.001017],[39.701,12.195,-0.024191],[40.323,9.04,-0.012604],[40.323,5.5349,0.022156],[38.77,-0.42369,0.010569],[39.08,-2.8772,0.010569],[43.739,-4.6298,0.022156],[44.05,-6.3823,0.010569],[44.05,-11.64,-0.001017],[44.05,-21.454,-0.024191],[42.807,-25.31,-0.035777],[36.906,-23.908,-0.082124],[30.074,-24.609,-0.1053],[30.384,-16.547,-0.001017],[29.763,-2.8772,0.056916],[34.111,-5.3308,0.010569],[44.36,-21.104,0.056916],[52.125,-31.619,0.091676],[58.336,-26.712,0.022156],[59.889,-14.093,-0.40655],[50.572,-14.093,0.61308],[51.503,-18.65,-0.001017],[51.503,-24.959,-0.001017],[48.708,-29.165,-0.001017],[46.534,-32.32,-0.001017],[44.671,-33.021,0.010569],[42.497,-31.268,-0.001017],[39.08,-26.011,-0.012604],[34.422,-17.949,-0.012604],[30.695,-10.588,-0.035777],[28.521,-2.1762,-0.001017],[26.968,8.339,-0.012604],[29.763,17.102,-0.001017],[34.111,25.514,0.022156],[38.77,29.019,-0.001017],[44.981,33.225,-0.001017],[47.466,32.173,-0.001017],[43.118,27.617,-0.012604],[40.012,27.266,0.010569],[39.08,25.163,0.010569],[39.08,21.308,-0.012604],[40.323,17.803,-0.001017],[42.807,14.999,-0.012604],[45.913,10.442,-0.001017],[46.224,5.1844,0.022156],[44.671,-1.1247,0.022156],[44.05,-4.2792,0.010569],[47.777,-6.7328,0.010569],[46.534,-7.0833,-0.001017],[44.36,-10.588,-0.012604],[44.671,-21.104,-0.024191],[44.05,-24.959,-0.024191],[38.459,-23.557,-0.058951],[31.316,-24.959,-0.070537],[32.248,-15.846,0.010569],[29.142,-0.42369,0.033743],[33.8,-3.5782,0.010569],[42.497,-19.702,0.033743],[49.64,-29.516,0.045329],[53.988,-23.908,-0.001017],[53.367,-13.392,-0.67305],[46.845,-15.145,0.77529],[46.845,-19,-0.001017],[46.224,-22.506,-0.001017],[44.05,-24.609,-0.012604],[41.565,-25.66,-0.001017],[39.08,-25.66,-0.001017],[38.459,-23.207,-0.001017],[36.596,-17.949,-0.012604],[32.558,-11.64,-0.012604],[29.142,-6.3823,-0.035777],[27.278,-0.77419,-0.001017],[26.347,6.2359,-0.001017],[27.899,12.195,-0.001017],[31.005,19.205,0.010569],[36.596,21.658,-0.024191],[42.497,26.916,-0.012604],[45.602,27.967,-0.012604],[42.807,26.215,-0.012604],[40.012,25.864,0.010569],[38.77,24.462,0.010569],[38.459,20.607,-0.012604],[38.459,17.452,-0.001017],[40.633,14.298,-0.012604],[44.671,9.04,-0.001017],[45.913,4.1329,0.010569],[44.671,-1.8257,0.022156],[44.36,-4.2793,0.010569],[48.398,-6.0318,0.010569],[46.224,-6.0318,-0.001017],[42.807,-8.1348,-0.012604],[42.807,-17.949,-0.024191],[42.497,-22.155,-0.024191],[36.906,-21.805,-0.035777],[30.384,-24.959,-0.047364],[32.248,-16.196,0.022156],[28.831,-0.77419,0.010569],[32.558,-2.5267,-0.001017],[39.08,-17.248,0.022156],[44.36,-27.062,0.010569],[46.845,-22.155,-0.024191],[44.671,-12.691,-0.8816],[39.701,-17.949,0.91433],[38.149,-20.403,-0.001017],[37.838,-20.052,-0.012604],[36.596,-20.403,-0.012604],[34.111,-19.702,-0.001017],[31.937,-19,-0.012604],[31.005,-15.145,-0.012604],[30.384,-9.5368,-0.012604],[28.21,-6.3823,-0.012604],[26.347,-3.2277,-0.024191],[25.725,1.3288,0.010569],[25.104,6.2359,0.010569],[26.657,10.091,-0.001017],[29.142,14.999,-0.001017],[33.179,14.999,-0.035777],[36.906,19.205,-0.024191],[38.77,21.308,-0.012604],[38.77,20.607,-0.012604],[36.906,20.256,0.010569],[36.906,20.256,0.022156],[35.664,17.803,-0.001017],[34.422,15.7,-0.001017],[34.422,11.143,-0.012604],[38.459,5.5349,-0.001017],[40.012,2.3804,-0.001017],[39.08,-1.8257,0.010569],[41.565,-3.5782,0.010569],[45.913,-3.9287,-0.001017],[44.36,-4.2793,0.010569],[40.944,-4.9803,-0.001017],[40.323,-14.093,-0.012604],[40.012,-17.949,-0.012604],[33.8,-19,-0.012604],[26.657,-24.959,-0.012604],[29.763,-17.598,0.022156],[28.21,-3.9287,-0.001017],[31.937,-3.2277,-0.001017],[34.732,-14.093,-0.001017],[37.838,-24.258,-0.012604],[37.838,-22.506,-0.047364],[35.664,-12.691,-1.0322],[33.8,-16.196,0.97226],[32.248,-17.949,-0.001017],[32.248,-17.248,-0.012604],[31.316,-16.897,-0.012604],[29.763,-15.495,-0.012604],[27.278,-13.042,-0.012604],[26.657,-7.4338,-0.012604],[25.104,-2.8772,-0.012604],[21.998,-2.5267,-0.012604],[20.135,0.27732,-0.024191],[20.756,4.4834,0.010569],[20.756,7.2874,0.022156],[23.241,10.091,-0.001017],[26.347,13.597,-0.024191],[28.521,13.246,-0.047364],[29.763,16.751,-0.035777],[29.142,17.452,-0.035777],[28.831,16.401,-0.024191],[28.21,15.7,0.010569],[30.384,14.298,0.033743],[31.005,13.597,-0.001017],[30.384,12.896,-0.001017],[30.074,8.6895,-0.001017],[32.558,4.1329,-0.001017],[34.111,2.0299,-0.001017],[33.179,-1.8257,0.010569],[35.664,-2.8772,-0.001017],[40.633,-1.8257,-0.001017],[39.08,-2.8772,-0.001017],[36.906,-3.5782,-0.001017],[35.975,-11.64,-0.012604],[34.422,-16.547,-0.001017],[28.521,-17.248,-0.001017],[20.756,-23.908,0.010569],[23.862,-16.547,0.010569],[24.173,-2.1762,-0.012604],[27.899,-1.4752,-0.001017],[29.763,-11.64,-0.012604],[31.005,-22.506,-0.024191],[30.384,-21.454,-0.058951],[28.831,-12.691,-1.1133],[29.142,-12.691,1.007],[27.899,-14.093,-0.001017],[26.968,-14.444,-0.012604],[26.657,-13.743,-0.012604],[25.104,-10.939,-0.012604],[24.173,-7.0833,-0.012604],[22.93,-0.42369,-0.012604],[20.446,2.3804,-0.012604],[15.166,0.27732,-0.012604],[12.992,3.4319,-0.012604],[14.855,8.339,0.010569],[15.166,9.04,0.022156],[19.203,11.143,-0.001017],[22.62,13.947,-0.035777],[22.309,13.597,-0.047364],[21.998,16.05,-0.035777],[18.272,13.947,-0.058951],[16.719,11.844,-0.035777],[16.719,11.143,-0.001017],[21.067,8.339,0.033743],[26.036,9.3905,0.022156],[26.036,10.091,0.010569],[26.036,6.5864,0.010569],[27.278,3.0814,-0.001017],[28.521,1.6793,-0.012604],[27.278,-2.1762,-0.001017],[29.142,-2.5267,-0.001017],[34.732,-0.42369,-0.012604],[33.179,-2.1762,-0.001017],[32.248,-1.8257,-0.001017],[30.695,-10.588,-0.001017],[28.21,-15.846,-0.001017],[22.309,-15.846,0.010569],[14.855,-22.155,0.033743],[16.408,-15.145,-0.001017],[18.893,-0.073181,-0.012604],[22.93,1.3288,-0.012604],[23.241,-10.238,-0.024191],[23.862,-21.104,-0.024191],[23.241,-19.702,-0.058951],[22.309,-12.691,-1.1713],[6.1589,-0.073182,-0.001017],[4.606,0.27732,-0.001017],[4.606,-0.77419,-0.001017],[2.7426,-0.77419,-0.001017],[1.5003,0.27732,-0.001017],[-0.36322,0.27732,-0.001017],[-1.295,0.27732,-0.001017],[0.25794,1.3288,-0.001017],[0.87909,0.97833,-0.001017],[2.432,2.7309,-0.001017],[5.5378,3.0814,-0.001017],[8.6436,2.3804,-0.001017],[7.0907,1.3288,-0.001017],[9.5753,-1.8257,-0.001017],[9.5753,1.3288,-0.001017],[8.6436,4.8339,-0.001017],[4.606,1.6793,-0.001017],[13.923,15.7,-0.001017],[10.507,12.896,-0.001017],[3.0531,12.545,-0.001017],[0.56851,7.6379,-0.001017],[0.87909,5.1844,-0.001017],[0.56851,4.4834,-0.001017],[0.25794,6.5864,-0.001017],[1.5003,5.1844,-0.001017],[-0.36322,4.4834,-0.001017],[2.1214,5.1844,-0.001017],[0.87909,4.4834,-0.001017],[2.1214,2.0299,-0.001017],[2.432,1.3288,-0.001017],[3.6743,2.0299,-0.001017],[3.0531,3.0814,-0.001017],[4.9166,3.4319,-0.001017],[4.606,1.6793,-0.001017],[7.4013,-1.4752,-0.001017],[10.196,-2.5267,-0.001017],[9.5753,-2.5267,-0.001017],[10.818,-3.9287,-0.001017],[3.6743,-3.2277,-0.001017],[4.2955,-3.5782,-0.001017],[2.432,-1.1247,-0.001017],[20.135,-1.1247,-0.12847],[16.719,-1.4752,0.010569],[13.923,-1.1247,-0.001017],[11.439,-0.42369,0.010569],[8.9541,0.62783,-0.001017],[6.1589,-0.073181,0.022156],[3.6743,-0.77419,-0.012604],[3.3637,0.27732,-0.001017],[2.1214,-0.073181,-0.012604],[2.432,2.7309,-0.001017],[5.5378,3.0814,-0.001017],[8.6436,2.3804,-0.001017],[7.0907,1.3288,-0.001017],[9.5753,-1.8257,-0.001017],[9.5753,1.3288,-0.001017],[8.6436,4.8339,-0.001017],[4.606,1.6793,-0.001017],[13.923,15.7,-0.001017],[10.507,12.896,-0.001017],[3.0531,12.545,-0.001017],[0.56851,7.6379,-0.001017],[2.7426,9.741,-0.001017],[4.2955,12.896,-0.001017],[2.432,7.9885,-0.012604],[5.5378,12.195,-0.024191],[6.4695,11.143,-0.012604],[6.7801,8.339,0.010569],[3.3637,9.3905,-0.001017],[4.9166,8.339,-0.024191],[4.9166,7.9885,-0.001017],[5.5378,4.8339,0.010569],[4.2955,2.0299,-0.001017],[6.7801,0.27732,-0.001017],[7.0907,-2.1762,-0.001017],[12.06,-6.3823,-0.035777],[16.719,-6.7328,0.022156],[18.582,-6.0318,-0.001017],[21.067,-7.7843,0.056916],[18.272,-12.691,0.080089],[15.166,-7.4338,-0.001017],[15.476,-2.1762,0.14961],[33.8,-6.7328,-0.16323],[27.899,-6.0318,0.022156],[24.173,-5.6813,0.010569],[18.893,-1.1247,0.022156],[15.166,3.0814,0.022156],[11.128,3.0814,0.045329],[7.4013,1.3288,-0.012604],[6.1589,2.0299,0.010569],[4.2955,2.3804,-0.024191],[4.2955,4.8339,-0.012604],[6.1589,4.4834,-0.012604],[9.2647,4.1329,-0.001017],[8.333,1.3288,-0.001017],[11.439,-1.1247,-0.001017],[12.06,4.8339,0.022156],[11.439,7.6379,0.033743],[4.9166,3.0814,-0.001017],[13.923,15.7,-0.001017],[10.507,12.896,-0.001017],[8.6436,17.102,0.033743],[9.2647,16.401,0.022156],[10.196,18.153,0.033743],[8.6436,17.452,-0.001017],[9.2647,16.05,-0.024191],[9.5753,13.947,-0.035777],[10.507,13.947,-0.035777],[10.507,11.844,0.022156],[8.6436,11.143,0.010569],[10.196,9.3905,-0.047364],[8.0224,7.6379,-0.012604],[7.4013,2.7309,0.022156],[6.4695,-0.42369,0.010569],[9.5753,-3.5782,-0.012604],[10.196,-8.1348,-0.012604],[16.097,-12.691,-0.058951],[21.377,-11.289,0.033743],[26.036,-12.691,-0.001017],[29.142,-17.248,0.091676],[26.968,-18.299,0.10326],[25.725,-12.691,0.022156],[24.794,-4.9803,0.21913],[40.323,-10.939,-0.11688],[35.664,-13.042,0.022156],[32.248,-13.392,0.022156],[25.104,-7.4338,0.033743],[20.446,-4.2793,0.033743],[15.476,-1.8257,0.056916],[9.5753,1.3288,-0.001017],[7.0907,2.7309,0.022156],[4.9166,4.4834,-0.012604],[5.2272,5.5349,-0.012604],[6.7801,5.1844,-0.035777],[10.196,3.4319,-0.024191],[10.818,0.62783,-0.012604],[14.234,7.6379,0.010569],[16.097,18.504,0.091676],[12.06,13.246,0.12644],[14.234,14.298,0.033743],[18.582,17.102,-0.024191],[16.719,14.298,0.010569],[14.545,15.349,0.022156],[12.992,13.597,0.033743],[13.302,14.999,0.045329],[13.302,14.999,0.010569],[14.234,13.246,-0.035777],[14.855,11.494,-0.058951],[15.166,10.091,-0.047364],[14.855,9.741,0.033743],[13.302,6.9369,0.010569],[14.545,4.8339,-0.058951],[13.302,0.97834,-0.024191],[12.681,-2.5267,0.022156],[10.818,-5.3308,0.010569],[13.302,-7.4338,-0.012604],[13.302,-11.64,-0.024191],[18.272,-14.444,-0.093711],[23.862,-13.392,0.022156],[27.899,-14.444,-0.024191],[31.316,-21.805,0.10326],[32.248,-22.506,0.11485],[31.937,-15.846,0.033743],[31.937,-7.4338,0.23072],[45.602,-12.691,-0.058951],[41.876,-16.196,0.022156],[38.77,-17.598,0.010569],[35.664,-19.702,0.033743],[30.695,-21.104,0.045329],[24.173,-13.743,0.056916],[13.302,-0.42369,0.010569],[8.9541,2.3804,0.033743],[6.7801,4.4834,-0.001017],[8.0224,4.1329,-0.012604],[8.9541,3.0814,-0.070537],[12.06,2.3804,-0.058951],[13.302,6.2359,-0.024191],[16.097,18.854,0.033743],[14.545,26.215,0.17278],[15.476,20.256,0.17278],[23.241,21.658,0.045329],[22.62,17.452,-0.024191],[20.135,13.246,-0.012604],[17.961,10.793,-0.012604],[14.855,10.442,0.033743],[14.545,9.741,0.045329],[16.097,9.04,0.010569],[16.719,8.6895,-0.047364],[17.029,7.9885,-0.082124],[16.719,4.1329,-0.058951],[17.34,3.0814,0.045329],[18.893,2.0299,0.022156],[18.893,-2.1762,-0.058951],[18.272,-6.0318,-0.035777],[18.582,-9.1863,0.022156],[16.408,-10.588,-0.001017],[17.961,-13.392,-0.024191],[18.272,-16.196,-0.024191],[21.998,-16.547,-0.12847],[26.347,-13.042,-0.001017],[30.384,-13.743,-0.047364],[32.869,-23.557,0.10326],[37.838,-26.011,0.12644],[38.149,-19.351,0.022156],[39.08,-10.588,0.20754],[49.951,-14.444,0.045329],[47.466,-18.65,0.022156],[44.981,-20.403,0.010569],[42.186,-23.908,0.022156],[37.217,-27.763,0.045329],[32.248,-26.712,0.033743],[25.104,-21.104,0.022156],[18.893,-10.939,0.022156],[13.923,0.97834,-0.001017],[12.992,2.7309,-0.012604],[12.681,3.4319,-0.058951],[14.234,7.6379,-0.058951],[15.166,15.349,-0.001017],[14.545,28.318,0.056916],[16.408,33.225,0.14961],[21.998,27.617,0.11485],[27.899,25.514,0.033743],[24.794,19.205,-0.001017],[22.309,14.298,-0.012604],[19.203,11.143,-0.024191],[16.719,10.091,0.022156],[16.097,8.339,0.033743],[16.719,6.2359,-0.001017],[17.34,5.1844,-0.047364],[17.029,4.1329,-0.082124],[16.097,0.97834,-0.047364],[17.961,-1.8257,0.045329],[22.309,-1.8257,0.033743],[21.998,-4.6298,-0.047364],[23.241,-9.5368,-0.035777],[23.862,-14.093,0.010569],[21.998,-15.846,-0.012604],[22.93,-17.598,-0.024191],[22.93,-20.052,-0.024191],[26.657,-15.495,-0.11688],[30.384,-10.588,-0.001017],[34.111,-13.042,-0.035777],[36.285,-22.155,0.10326],[41.565,-25.31,0.12644],[42.497,-18.65,0.033743],[44.05,-11.289,0.12644],[53.988,-15.495,0.17278],[51.814,-20.403,0.010569],[50.261,-22.506,0.010569],[47.466,-26.712,0.022156],[42.497,-33.021,0.033743],[38.149,-34.773,0.022156],[32.558,-33.021,0.010569],[26.968,-25.31,-0.001017],[20.756,-13.042,-0.012604],[17.34,-2.5267,-0.024191],[15.476,4.4834,-0.058951],[14.234,12.545,-0.058951],[15.476,24.813,0.022156],[16.719,36.029,0.080089],[20.446,37.08,0.13802],[26.968,32.173,0.080089],[30.074,28.318,0.010569],[26.968,22.71,0.010569],[24.173,17.803,-0.001017],[20.756,13.246,-0.012604],[18.582,11.143,0.033743],[18.272,8.6895,0.033743],[18.582,6.2359,-0.001017],[18.582,4.8339,-0.035777],[17.961,3.0814,-0.070537],[17.029,0.27732,-0.047364],[18.893,-2.8772,0.033743],[23.241,-3.9287,0.033743],[24.173,-4.9803,-0.035777],[26.968,-10.588,-0.047364],[28.21,-15.846,0.010569],[26.347,-18.299,-0.012604],[27.278,-19,-0.024191],[26.968,-21.805,-0.024191],[30.074,-16.196,-0.093711],[32.869,-9.1863,-0.001017],[38.149,-13.042,-0.024191],[40.323,-22.856,0.091676],[45.602,-28.114,0.12644],[47.466,-21.454,0.033743],[49.64,-12.691,-0.001017],[56.783,-16.196,0.32341],[55.541,-22.155,0.010569],[53.988,-23.908,-0.001017],[50.882,-28.815,0.010569],[46.534,-36.526,0.022156],[42.807,-40.031,0.022156],[38.459,-40.381,0.010569],[33.179,-36.175,-0.012604],[27.899,-26.011,-0.024191],[22.93,-11.64,-0.024191],[18.893,1.6793,-0.058951],[15.476,14.298,-0.047364],[16.719,29.72,0.022156],[20.446,40.235,0.080089],[24.794,39.534,0.12644],[30.695,36.029,0.080089],[31.937,32.173,0.010569],[28.831,27.617,0.022156],[25.725,21.308,0.010569],[22.309,15.7,-0.001017],[21.067,12.545,0.033743],[21.067,9.04,0.022156],[21.377,6.2359,-0.001017],[21.067,4.4834,-0.012604],[20.756,2.7309,-0.070537],[20.446,0.27732,-0.035777],[21.998,-3.2277,0.033743],[26.347,-4.2793,0.033743],[27.899,-4.6298,-0.024191],[31.005,-10.588,-0.047364],[32.248,-15.846,0.010569],[30.695,-19.351,-0.012604],[31.005,-20.403,-0.024191],[30.074,-23.557,-0.012604],[32.248,-18.299,-0.070537],[35.975,-9.1863,-0.012604],[41.565,-13.743,-0.012604],[44.36,-23.207,0.091676],[48.708,-30.217,0.11485],[52.435,-24.609,0.033743],[54.92,-13.392,-0.1864],[59.268,-16.897,0.49721],[58.026,-22.856,-0.001017],[56.783,-24.959,-0.001017],[54.299,-30.217,0.010569],[49.951,-38.979,0.022156],[46.534,-42.484,0.010569],[42.807,-43.185,-0.001017],[38.459,-40.381,-0.024191],[32.558,-31.619,-0.035777],[28.831,-20.403,-0.035777],[22.62,-4.2793,-0.047364],[19.824,11.494,-0.047364],[20.446,27.967,0.010569],[24.483,39.534,0.045329],[29.142,40.235,0.10326],[32.869,38.833,0.056916],[33.8,37.781,-0.001017],[31.005,32.173,0.022156],[27.278,24.112,0.022156],[24.483,17.452,-0.001017],[24.483,13.246,0.033743],[25.725,9.04,0.022156],[26.036,5.1844,0.010569],[26.347,4.4834,-0.001017],[26.347,2.3804,-0.070537],[26.347,-0.073181,-0.047364],[27.899,-3.5782,0.022156],[32.248,-4.2793,0.033743],[33.179,-4.6298,-0.024191],[36.596,-10.238,-0.035777],[38.149,-15.846,0.010569],[35.664,-21.104,-0.012604],[34.422,-22.506,-0.024191],[32.248,-25.66,-0.012604],[33.179,-21.454,-0.035777],[38.459,-9.5368,-0.012604],[44.05,-14.444,0.010569],[48.398,-23.207,0.080089],[52.125,-29.165,0.10326],[57.404,-26.361,0.022156],[59.579,-13.042,-0.42972],[60.2,-16.547,0.69418],[59.268,-22.506,-0.001017],[58.336,-24.258,-0.001017],[55.852,-28.464,-0.001017],[51.814,-35.825,0.010569],[48.398,-37.928,0.010569],[44.05,-36.526,-0.001017],[38.459,-31.619,-0.024191],[32.869,-21.805,-0.035777],[30.695,-13.743,-0.035777],[26.347,-2.8772,-0.047364],[24.794,7.9885,-0.047364],[26.036,20.256,-0.001017],[31.005,33.575,0.022156],[34.422,38.482,0.080089],[36.285,38.482,0.045329],[36.906,38.833,-0.001017],[34.111,34.627,0.010569],[31.005,26.565,0.022156],[30.074,21.308,-0.001017],[31.316,18.153,0.022156],[33.179,13.947,0.010569],[34.422,9.04,0.010569],[35.664,7.2874,0.010569],[35.975,4.4834,-0.047364],[35.043,-0.42369,-0.035777],[35.975,-4.9803,0.022156],[39.08,-6.0318,0.022156],[42.186,-7.0833,-0.024191],[45.602,-13.392,-0.047364],[47.466,-18.65,0.010569],[44.05,-23.207,-0.001017],[40.012,-24.258,-0.012604],[34.422,-25.66,-0.001017],[34.732,-19.702,-0.012604],[38.77,-3.9287,-0.012604],[44.981,-11.64,0.010569],[49.951,-22.856,0.056916],[51.503,-28.464,0.080089],[56.162,-26.712,0.022156],[55.852,-11.289,-0.71939],[58.026,-16.196,0.92592],[57.404,-21.454,-0.001017],[55.852,-22.155,-0.001017],[53.367,-24.959,-0.001017],[48.708,-29.516,-0.001017],[45.913,-30.567,-0.001017],[42.497,-28.114,-0.001017],[37.838,-23.207,-0.024191],[33.8,-14.444,-0.035777],[31.937,-8.1348,-0.035777],[27.278,-1.4752,-0.035777],[26.036,4.8339,-0.035777],[26.036,14.298,-0.001017],[30.074,24.462,0.010569],[34.422,29.72,0.045329],[38.149,32.173,0.010569],[41.565,36.379,-0.012604],[38.77,34.977,0.010569],[35.664,28.318,0.022156],[34.732,23.411,0.010569],[35.664,20.957,0.022156],[36.285,17.102,0.010569],[38.459,11.143,0.022156],[40.633,8.339,0.022156],[41.565,5.5349,-0.035777],[40.012,-1.1247,-0.035777],[40.633,-7.0833,0.010569],[43.739,-7.4338,0.010569],[45.913,-8.1348,-0.024191],[48.398,-12.691,-0.047364],[50.261,-17.248,-0.001017],[46.534,-21.104,-0.001017],[42.186,-22.506,-0.001017],[36.285,-24.609,0.010569],[34.422,-17.248,0.010569],[36.285,-1.1247,-0.012604],[41.876,-10.588,0.010569],[45.602,-21.805,0.033743],[46.534,-25.66,0.033743],[49.64,-24.258,0.010569],[48.087,-10.939,-0.9743],[52.125,-15.846,1.0997],[50.572,-19.702,-0.001017],[48.708,-20.403,-0.001017],[46.224,-21.805,-0.012604],[42.807,-23.207,-0.012604],[40.633,-22.856,-0.001017],[37.838,-20.403,-0.001017],[34.732,-15.495,-0.024191],[32.248,-8.8358,-0.024191],[30.695,-4.9803,-0.035777],[26.968,-0.42369,-0.024191],[26.036,3.4319,-0.024191],[26.036,10.442,-0.001017],[28.831,18.504,0.010569],[33.179,22.009,0.022156],[36.906,25.514,-0.012604],[40.633,30.421,-0.024191],[39.701,31.122,0.010569],[36.906,26.916,0.033743],[36.285,22.009,0.022156],[36.285,20.957,0.022156],[36.285,17.803,0.010569],[37.838,11.143,0.022156],[40.323,6.9369,0.033743],[41.876,5.1844,-0.012604],[40.944,-1.4752,-0.024191],[41.565,-7.4338,0.010569],[44.671,-7.7843,-0.001017],[45.602,-7.4338,-0.024191],[48.087,-10.238,-0.035777],[49.64,-14.444,-0.012604],[44.981,-16.897,-0.001017],[40.012,-19,-0.001017],[33.179,-23.557,0.010569],[30.074,-15.846,0.022156],[31.316,-1.8257,0.010569],[35.975,-9.5368,0.022156],[39.08,-19.351,0.010569],[40.944,-23.908,0.010569],[41.565,-21.805,0.010569],[39.08,-10.588,-1.1481],[44.05,-15.495,1.2619],[39.701,-18.65,-0.001017],[37.838,-19.702,-0.001017],[36.285,-19.351,-0.012604],[34.422,-17.949,-0.012604],[32.869,-16.547,-0.012604],[30.695,-13.743,-0.012604],[29.763,-8.8358,-0.024191],[28.21,-4.6298,-0.024191],[27.899,-3.2277,-0.024191],[26.036,0.62783,-0.012604],[26.036,2.3804,-0.001017],[27.278,7.9885,-0.001017],[30.384,16.05,-0.001017],[32.869,17.102,-0.012604],[32.869,18.504,-0.035777],[34.422,21.308,-0.035777],[35.664,24.112,-0.001017],[34.422,21.658,0.045329],[34.111,18.153,0.033743],[34.422,18.504,0.022156],[34.111,17.102,-0.001017],[32.869,9.741,0.010569],[35.664,3.4319,0.022156],[37.838,3.4319,-0.001017],[38.459,-1.4752,-0.012604],[39.08,-6.3823,0.010569],[42.497,-6.7328,-0.001017],[42.807,-5.3308,-0.012604],[45.913,-6.7328,-0.024191],[46.534,-10.238,-0.012604],[40.633,-13.392,-0.001017],[34.111,-16.196,-0.001017],[26.036,-22.155,0.010569],[21.067,-16.547,0.033743],[24.794,-5.6813,0.022156],[29.763,-7.7843,0.022156],[33.179,-16.547,-0.001017],[35.664,-23.207,-0.012604],[32.558,-19.351,-0.001017],[30.695,-10.238,-1.2871],[36.596,-13.392,1.3315],[32.558,-15.846,-0.012604],[31.005,-16.897,-0.001017],[29.763,-15.846,-0.012604],[28.521,-14.093,-0.012604],[26.968,-10.939,-0.012604],[24.794,-7.0833,-0.012604],[24.483,-1.8257,-0.024191],[22.309,-0.073181,-0.024191],[20.756,-1.1247,-0.024191],[20.446,3.7824,0.010569],[20.135,5.1844,0.010569],[22.62,5.1844,-0.001017],[26.968,14.999,-0.012604],[29.142,19.205,-0.035777],[26.347,17.452,-0.047364],[25.725,19.555,-0.035777],[26.036,19.555,-0.012604],[26.036,16.05,0.045329],[26.968,12.545,0.033743],[28.831,13.597,0.010569],[29.763,13.947,-0.001017],[28.521,7.2874,-0.001017],[30.695,1.6793,0.010569],[32.248,1.6793,-0.001017],[32.869,-1.8257,-0.001017],[33.179,-6.0318,-0.001017],[36.906,-5.3308,-0.001017],[37.838,-2.8772,-0.001017],[40.633,-3.9287,-0.012604],[42.186,-6.7328,-0.012604],[35.975,-9.8873,-0.012604],[29.142,-13.743,-0.001017],[21.067,-19.702,-0.001017],[16.408,-15.495,0.022156],[20.446,-4.9803,0.010569],[25.104,-4.2793,0.010569],[28.521,-14.444,-0.012604],[29.763,-21.805,-0.024191],[26.657,-17.949,-0.001017],[25.104,-10.588,-1.3451],[30.384,-10.238,1.3894],[27.278,-12.691,-0.012604],[25.725,-13.392,-0.001017],[23.862,-12.341,-0.012604],[22.62,-10.238,-0.012604],[21.377,-6.3823,-0.012604],[20.135,-0.42369,-0.012604],[19.203,4.8339,-0.012604],[15.476,4.4834,-0.024191],[12.371,1.3288,-0.012604],[12.992,7.9885,0.022156],[12.06,10.091,0.022156],[16.097,2.3804,-0.001017],[22.62,13.947,-0.024191],[23.862,23.06,-0.070537],[18.582,18.854,-0.058951],[15.476,19.555,-0.047364],[14.545,16.751,-0.024191],[15.166,10.091,0.033743],[17.961,6.5864,0.022156],[21.998,8.339,-0.001017],[23.862,10.442,-0.012604],[23.241,4.8339,-0.012604],[24.794,0.62783,-0.001017],[26.036,0.27732,0.010569],[26.347,-2.5267,0.010569],[26.347,-6.0318,-0.012604],[30.695,-3.5782,-0.012604],[32.248,-1.1247,-0.001017],[35.043,-1.4752,-0.001017],[36.596,-3.5782,-0.012604],[31.005,-7.0833,-0.012604],[24.483,-11.289,-0.001017],[17.029,-17.598,-0.012604],[12.681,-14.093,0.010569],[16.719,-2.5267,-0.012604],[21.377,0.27732,-0.001017],[23.862,-12.341,-0.024191],[23.241,-19.702,-0.035777],[21.067,-16.897,-0.012604],[20.135,-10.588,-1.3914],[5.5378,-1.8257,-0.001017],[4.606,-1.4752,-0.001017],[3.6743,-0.77419,-0.001017],[3.0531,-0.42369,-0.001017],[2.1214,-0.073182,-0.001017],[0.25794,-0.42369,-0.001017],[-0.36322,0.97833,-0.001017],[2.1214,0.62783,-0.001017],[1.5003,1.6793,-0.001017],[3.6743,2.3804,-0.001017],[4.606,2.0299,-0.001017],[7.0907,0.27732,-0.001017],[7.4013,0.62783,-0.001017],[7.4013,-3.2277,-0.001017],[5.5378,-3.5782,-0.001017],[6.7801,4.4834,-0.001017],[2.7426,4.4834,-0.001017],[4.9166,9.04,-0.001017],[4.9166,11.143,-0.001017],[0.25794,7.6379,-0.001017],[0.25794,6.9369,-0.001017],[-0.36322,4.1329,-0.001017],[0.25794,4.8339,-0.001017],[1.5003,7.2874,-0.001017],[2.432,7.6379,-0.001017],[0.56851,6.9369,-0.001017],[3.0531,6.2359,-0.001017],[2.7426,3.0814,-0.001017],[3.6743,3.7824,-0.001017],[3.6743,3.4319,-0.001017],[5.2272,2.3804,-0.001017],[4.9166,1.6793,-0.001017],[4.606,0.62783,-0.001017],[6.4695,-0.77419,-0.001017],[6.7801,-0.42369,-0.001017],[9.5753,-4.2793,-0.001017],[10.818,-3.2277,-0.001017],[10.818,-4.6298,-0.001017],[9.5753,-6.0318,-0.001017],[6.1589,-2.5267,-0.001017],[1.1897,-3.2277,-0.001017],[19.824,-1.8257,-0.15164],[17.029,-1.1247,0.010569],[16.097,0.62783,-0.001017],[12.371,0.62783,-0.001017],[9.2647,0.62783,0.010569],[6.4695,-0.073181,0.010569],[4.2955,0.62783,-0.001017],[2.432,-0.073181,-0.001017],[2.1214,1.6793,-0.001017],[3.6743,2.3804,-0.001017],[4.606,2.0299,-0.001017],[7.0907,0.27732,-0.001017],[7.4013,0.62783,-0.001017],[7.4013,-3.2277,-0.001017],[5.5378,-3.5782,-0.001017],[6.7801,4.4834,-0.001017],[2.7426,4.4834,-0.001017],[4.9166,9.04,-0.001017],[4.9166,11.143,-0.001017],[0.25794,7.6379,-0.001017],[0.25794,6.9369,-0.001017],[0.56851,5.1844,-0.001017],[2.432,10.792,-0.001017],[3.6743,7.9885,-0.012604],[6.7801,14.298,-0.012604],[6.4695,11.844,-0.001017],[7.4013,7.9885,-0.012604],[6.1589,7.9885,-0.001017],[6.1589,9.3905,-0.001017],[6.1589,8.6895,-0.001017],[8.0224,1.3288,-0.012604],[8.9541,-1.4752,-0.001017],[10.818,-1.1247,-0.001017],[12.681,-3.9287,0.010569],[13.923,-7.0833,-0.012604],[18.272,-10.939,-0.012604],[22.309,-9.5368,-0.001017],[22.62,-13.392,0.010569],[19.824,-10.238,0.010569],[17.029,-4.2793,0.022156],[15.166,-3.2277,0.1612],[32.869,-4.2793,-0.1864],[30.074,-2.1762,0.022156],[25.104,-0.42369,0.010569],[20.446,2.7309,0.022156],[16.097,4.8339,0.022156],[11.128,4.1329,0.022156],[7.4013,3.7824,0.010569],[5.5378,3.0814,-0.001017],[4.606,3.7824,-0.035777],[5.5378,3.4319,-0.001017],[5.5378,3.4319,-0.001017],[8.333,2.0299,0.010569],[8.9541,0.27732,-0.001017],[8.9541,-1.8257,0.022156],[7.4013,-0.073181,0.022156],[8.6436,7.6379,-0.001017],[3.0531,5.1844,-0.012604],[4.9166,9.04,-0.001017],[4.9166,11.143,-0.001017],[5.2272,14.298,0.045329],[6.7801,14.999,0.033743],[6.7801,17.452,0.022156],[7.4013,17.102,-0.001017],[9.2647,16.401,-0.024191],[11.439,16.401,-0.012604],[9.5753,16.401,-0.001017],[11.128,11.844,-0.024191],[12.06,10.442,0.010569],[9.2647,12.545,-0.001017],[8.0224,9.04,0.010569],[9.2647,3.4319,-0.001017],[10.507,-3.2277,0.022156],[13.923,-7.4338,-0.001017],[16.408,-11.289,0.022156],[18.893,-16.196,-0.012604],[24.173,-15.846,-0.047364],[28.831,-13.743,-0.001017],[28.521,-19,0.033743],[26.968,-17.598,0.022156],[24.794,-11.289,0.022156],[22.62,-4.6298,0.21913],[40.633,-7.0833,-0.16323],[38.149,-7.0833,0.033743],[31.937,-5.3308,0.022156],[26.036,-2.5267,0.033743],[21.067,-1.1247,0.045329],[14.545,3.4319,0.033743],[10.196,4.8339,0.010569],[6.7801,3.7824,0.010569],[4.9166,4.4834,-0.035777],[6.4695,4.1329,0.010569],[6.7801,4.1329,0.022156],[9.2647,2.3804,0.010569],[10.507,1.3288,-0.001017],[10.507,5.5349,0.056916],[11.439,15.349,0.056916],[10.818,12.545,0.045329],[5.5378,11.143,-0.012604],[12.992,16.05,-0.001017],[13.302,16.05,0.045329],[12.371,16.751,0.080089],[11.128,13.597,0.033743],[11.439,15.349,0.033743],[11.128,13.597,-0.001017],[12.06,13.597,-0.047364],[13.923,13.246,-0.012604],[13.923,11.143,-0.001017],[14.545,9.04,-0.024191],[14.855,6.2359,0.022156],[16.097,4.8339,0.010569],[12.992,2.0299,0.022156],[12.371,-1.8257,-0.001017],[12.06,-6.0318,0.022156],[16.408,-10.238,0.022156],[18.582,-15.145,0.045329],[22.62,-18.299,-0.012604],[28.521,-17.598,-0.070537],[32.869,-16.196,-0.012604],[31.937,-21.104,0.033743],[31.937,-22.506,0.010569],[30.074,-13.743,0.022156],[28.21,-5.6813,0.23072],[46.534,-8.1348,-0.1053],[44.671,-10.588,0.033743],[40.633,-14.794,0.022156],[35.043,-14.794,0.033743],[30.384,-13.743,0.045329],[19.203,0.27732,0.033743],[12.681,4.1329,0.033743],[8.9541,4.8339,0.022156],[7.4013,4.4834,-0.024191],[8.0224,4.1329,0.010569],[8.9541,2.3804,0.022156],[11.128,1.6793,-0.001017],[11.439,6.2359,-0.001017],[12.06,17.102,0.080089],[12.06,21.308,0.091676],[13.302,19.555,0.091676],[15.476,19.906,-0.012604],[20.446,18.854,-0.047364],[19.824,14.999,0.022156],[17.34,14.298,0.080089],[14.855,11.494,0.022156],[14.855,10.793,0.022156],[14.234,9.04,-0.012604],[14.234,7.9885,-0.058951],[14.545,8.339,-0.024191],[16.408,4.8339,-0.001017],[17.961,2.3804,-0.012604],[18.893,-0.073181,0.022156],[19.203,-2.1762,0.022156],[19.824,-3.5782,0.022156],[18.893,-7.0833,-0.001017],[16.719,-9.8873,0.022156],[20.756,-12.691,0.033743],[22.62,-17.949,0.056916],[28.521,-21.454,-0.024191],[34.111,-19,-0.1053],[38.459,-19,-0.024191],[34.422,-24.609,0.033743],[35.043,-26.712,0.010569],[34.422,-17.949,0.022156],[34.111,-8.1348,0.18437],[52.125,-9.1863,-0.001017],[50.882,-13.042,0.033743],[47.777,-17.949,0.022156],[42.186,-19,0.033743],[37.217,-21.104,0.033743],[30.074,-18.299,0.033743],[22.93,-13.392,0.033743],[16.719,-1.4752,0.022156],[12.371,3.0814,-0.012604],[11.439,4.1329,0.010569],[12.371,3.0814,-0.001017],[12.992,5.5349,-0.001017],[12.371,15.7,-0.001017],[11.128,26.215,0.045329],[12.681,27.617,0.080089],[18.893,26.916,0.056916],[22.62,25.163,-0.012604],[24.173,19.906,-0.047364],[22.309,16.05,-0.001017],[19.203,13.947,0.056916],[16.719,11.143,0.022156],[16.719,9.04,0.010569],[16.408,5.5349,-0.012604],[15.476,3.0814,-0.058951],[15.476,3.0814,-0.035777],[16.408,0.27732,-0.012604],[18.272,-2.5267,-0.012604],[20.756,-3.9287,0.022156],[23.241,-6.3823,0.010569],[24.483,-9.1863,0.010569],[23.241,-13.042,-0.001017],[22.309,-15.145,0.022156],[24.794,-16.897,0.033743],[28.521,-22.155,0.045329],[32.248,-24.959,-0.024191],[36.285,-16.196,-0.093711],[39.08,-16.897,-0.001017],[36.906,-23.207,0.045329],[37.838,-27.763,-0.001017],[38.149,-21.805,0.010569],[38.77,-11.289,0.080089],[56.783,-10.238,0.13802],[56.162,-14.794,0.022156],[52.746,-21.104,0.022156],[48.087,-22.506,0.022156],[43.118,-26.361,0.033743],[37.838,-28.815,0.022156],[31.316,-25.66,0.022156],[24.483,-15.495,0.010569],[18.272,-6.7328,-0.012604],[16.097,1.3288,-0.001017],[15.166,6.2359,-0.012604],[13.302,13.246,-0.001017],[11.439,25.163,0.010569],[12.681,33.926,0.045329],[16.408,34.276,0.080089],[22.62,31.472,0.033743],[25.725,28.668,-0.012604],[25.725,23.411,-0.035777],[23.241,19.555,0.010569],[20.446,15.7,0.080089],[18.893,11.844,0.022156],[18.893,9.3905,0.010569],[18.893,5.1844,-0.001017],[17.961,2.3804,-0.047364],[17.029,1.6793,-0.047364],[17.34,-0.77419,-0.024191],[18.893,-4.6298,-0.024191],[21.377,-5.6813,0.022156],[26.036,-8.4853,0.010569],[27.899,-13.392,-0.001017],[27.899,-15.846,-0.012604],[27.278,-17.598,0.022156],[30.384,-17.598,0.022156],[34.111,-23.207,0.033743],[36.906,-26.361,-0.024191],[40.323,-15.495,-0.082124],[42.807,-16.897,0.010569],[40.633,-23.908,0.045329],[40.944,-30.217,-0.001017],[42.186,-24.258,0.022156],[43.118,-12.691,-0.070537],[60.821,-10.939,0.32341],[59.889,-16.547,0.022156],[56.783,-23.207,0.010569],[52.435,-25.31,0.022156],[48.087,-30.217,0.022156],[43.118,-34.773,0.022156],[37.838,-33.722,0.010569],[31.316,-27.763,-0.001017],[24.794,-18.65,-0.024191],[21.067,-5.6813,-0.012604],[17.34,4.8339,-0.012604],[14.234,17.803,-0.001017],[12.371,30.421,0.010569],[14.855,38.132,0.045329],[20.446,38.833,0.056916],[24.794,36.029,0.022156],[26.657,33.225,-0.001017],[26.347,28.668,-0.024191],[23.862,23.411,0.022156],[21.998,17.803,0.080089],[21.998,12.896,0.022156],[21.377,9.741,0.010569],[21.998,5.1844,-0.001017],[20.756,2.7309,-0.035777],[19.824,1.3288,-0.035777],[19.824,-1.1247,-0.024191],[20.756,-4.6298,-0.024191],[23.241,-6.0318,0.022156],[28.521,-9.1863,-0.001017],[31.005,-14.794,-0.001017],[32.248,-16.897,-0.012604],[32.248,-19,0.010569],[35.043,-17.949,0.010569],[39.701,-23.908,0.022156],[40.944,-28.464,-0.001017],[44.671,-16.897,-0.047364],[47.777,-18.299,0.022156],[44.981,-24.258,0.056916],[45.602,-31.619,-0.012604],[46.534,-26.361,0.022156],[46.534,-11.64,-0.25592],[63.616,-11.64,0.53197],[62.374,-17.598,0.010569],[59.889,-24.609,0.010569],[55.852,-26.712,0.010569],[51.503,-31.969,0.022156],[46.845,-37.577,0.010569],[42.186,-37.227,-0.001017],[36.285,-32.67,-0.012604],[31.316,-27.062,-0.035777],[26.968,-14.794,-0.024191],[20.446,-1.4752,-0.012604],[16.097,16.05,-0.001017],[14.855,29.369,-0.001017],[17.34,37.431,0.033743],[22.93,41.637,0.045329],[26.036,40.235,0.022156],[26.657,38.482,0.010569],[26.968,34.627,-0.001017],[24.483,26.916,0.033743],[23.862,19.555,0.080089],[24.794,14.298,0.022156],[24.483,10.091,0.010569],[26.036,5.1844,-0.001017],[24.794,2.3804,-0.024191],[24.173,0.62783,-0.035777],[23.862,-1.4752,-0.024191],[24.794,-4.9803,-0.012604],[27.278,-5.6813,0.022156],[32.558,-8.8358,-0.001017],[35.043,-14.794,-0.012604],[36.285,-16.897,-0.024191],[36.285,-20.403,0.010569],[39.701,-19.351,0.010569],[43.118,-25.66,0.010569],[43.739,-31.969,0.010569],[48.087,-18.65,-0.024191],[52.125,-19.702,0.033743],[49.64,-23.207,0.056916],[49.951,-31.268,-0.012604],[49.019,-27.763,0.022156],[47.777,-9.1863,-0.47607],[63.927,-12.341,0.77529],[63.305,-17.598,0.010569],[60.821,-23.908,-0.001017],[56.783,-25.66,0.010569],[52.435,-29.516,0.010569],[48.087,-34.072,-0.001017],[42.807,-31.969,-0.012604],[36.285,-26.361,-0.024191],[32.248,-21.104,-0.047364],[29.142,-9.5368,-0.024191],[25.104,-0.42369,-0.012604],[21.067,9.741,-0.012604],[19.824,19.205,-0.012604],[22.309,28.668,0.010569],[27.278,39.884,0.033743],[27.899,43.74,0.022156],[27.278,41.637,0.010569],[28.521,36.73,-0.001017],[26.657,29.369,0.033743],[26.968,22.009,0.056916],[29.142,17.803,0.010569],[30.384,12.545,-0.001017],[32.558,7.9885,-0.001017],[32.248,4.1329,-0.012604],[31.937,1.3288,-0.024191],[31.005,-1.8257,-0.024191],[31.937,-6.0318,-0.012604],[34.111,-7.0833,0.010569],[39.08,-10.588,-0.001017],[42.186,-16.897,-0.012604],[42.807,-19,-0.024191],[41.565,-22.155,0.022156],[42.807,-20.052,0.010569],[44.05,-24.258,0.022156],[44.05,-26.011,0.033743],[49.019,-11.64,-0.001017],[53.367,-14.794,0.022156],[48.398,-17.598,0.056916],[47.466,-27.062,-0.001017],[43.118,-27.062,0.022156],[41.565,-3.5782,-0.71939],[58.647,-13.392,1.0186],[58.336,-17.598,-0.001017],[55.541,-21.805,-0.001017],[51.814,-22.155,0.010569],[48.398,-24.609,0.010569],[44.36,-26.361,-0.001017],[40.012,-23.908,-0.012604],[34.732,-18.65,-0.024191],[31.005,-14.093,-0.047364],[28.521,-5.6813,-0.024191],[25.725,-0.073181,-0.012604],[22.93,5.5349,-0.012604],[20.756,13.246,-0.012604],[22.62,19.906,-0.001017],[26.657,30.07,0.022156],[30.384,35.328,0.022156],[32.558,36.379,0.010569],[34.111,36.379,-0.001017],[32.248,29.72,0.033743],[32.248,24.112,0.045329],[33.179,20.607,0.010569],[34.732,16.05,-0.001017],[36.285,10.442,0.010569],[36.596,5.1844,0.010569],[36.596,0.97834,-0.012604],[36.285,-3.2277,-0.012604],[36.596,-7.4338,-0.012604],[38.149,-8.4853,-0.001017],[42.497,-12.341,-0.012604],[44.981,-16.547,-0.024191],[45.602,-16.897,-0.024191],[43.118,-17.248,0.022156],[44.05,-15.846,0.022156],[43.118,-20.403,0.022156],[40.944,-21.104,0.045329],[44.36,-10.588,0.022156],[45.913,-13.392,0.022156],[41.876,-17.949,0.045329],[42.186,-26.361,0.022156],[38.149,-23.207,0.022156],[35.975,-5.6813,-0.91636],[52.125,-13.042,1.2156],[50.882,-16.547,-0.001017],[48.087,-19,-0.001017],[44.671,-19,-0.001017],[41.876,-19.702,-0.001017],[38.459,-19.351,-0.001017],[35.043,-16.547,-0.012604],[31.937,-12.341,-0.024191],[28.521,-8.8358,-0.047364],[26.657,-2.8772,-0.024191],[25.104,-0.42369,-0.001017],[23.241,2.7309,-0.012604],[21.377,9.3905,-0.012604],[22.93,14.298,-0.012604],[26.036,22.359,-0.001017],[30.384,27.266,-0.001017],[33.8,29.019,-0.001017],[35.043,31.472,0.010569],[34.422,27.266,0.033743],[33.8,22.359,0.045329],[35.043,20.957,0.010569],[35.664,17.803,-0.001017],[36.596,11.844,0.010569],[36.906,4.8339,0.022156],[37.838,0.62783,-0.001017],[37.838,-3.9287,-0.001017],[38.149,-7.4338,-0.001017],[38.77,-8.8358,-0.001017],[41.876,-11.64,-0.012604],[44.05,-15.145,-0.024191],[43.739,-14.093,-0.024191],[40.323,-12.341,0.010569],[39.701,-10.588,0.010569],[36.906,-15.846,0.022156],[33.179,-17.248,0.045329],[35.664,-10.588,0.045329],[36.596,-11.64,0.022156],[35.043,-17.949,0.022156],[35.664,-24.609,0.022156],[32.558,-19,0.022156],[30.384,-7.4338,-1.067],[44.36,-11.289,1.3778],[42.497,-14.093,-0.001017],[40.012,-16.897,-0.001017],[36.906,-17.248,-0.001017],[34.111,-16.196,-0.001017],[31.937,-14.093,-0.012604],[29.763,-10.939,-0.012604],[26.968,-7.0833,-0.024191],[24.794,-5.6813,-0.035777],[24.173,-1.8257,-0.012604],[24.173,-0.77419,-0.001017],[22.62,0.62783,-0.012604],[22.309,6.9369,-0.012604],[24.483,12.195,-0.012604],[26.036,19.205,-0.012604],[28.21,22.009,-0.024191],[29.763,20.957,-0.001017],[31.005,24.112,0.022156],[32.248,22.009,0.033743],[32.558,17.803,0.033743],[34.111,18.854,0.022156],[33.179,18.153,-0.001017],[34.111,11.494,0.010569],[34.111,4.1329,0.022156],[35.043,0.27732,0.010569],[35.664,-3.5782,-0.001017],[35.664,-6.3823,-0.001017],[35.975,-7.4338,-0.001017],[37.838,-10.238,-0.012604],[38.77,-13.392,-0.012604],[38.149,-10.939,-0.012604],[32.558,-7.7843,-0.001017],[31.005,-6.0318,0.010569],[26.036,-10.588,0.010569],[21.377,-15.145,0.033743],[23.862,-10.939,0.045329],[27.899,-9.5368,0.022156],[29.763,-16.196,0.010569],[28.831,-20.403,0.022156],[26.347,-15.846,0.010569],[24.173,-7.7843,-1.1713],[36.596,-9.5368,1.4705],[34.732,-11.289,-0.001017],[32.248,-13.743,-0.001017],[30.074,-14.093,-0.001017],[27.278,-12.691,-0.012604],[24.483,-8.8358,-0.012604],[22.93,-5.3308,-0.012604],[21.377,-1.4752,-0.024191],[20.135,0.27732,-0.024191],[18.582,0.27732,-0.012604],[17.029,2.0299,-0.012604],[16.408,2.3804,-0.012604],[16.719,3.7824,-0.001017],[19.203,10.442,-0.012604],[21.067,21.308,-0.024191],[22.309,24.112,-0.035777],[23.241,19.555,-0.001017],[24.794,19.555,0.022156],[25.104,17.452,0.033743],[26.036,12.896,0.022156],[28.831,15.7,0.010569],[27.278,16.05,-0.001017],[28.831,9.741,0.010569],[28.831,3.0814,0.010569],[30.074,-0.77419,0.010569],[29.763,-3.5782,-0.001017],[28.831,-5.6813,-0.001017],[28.521,-5.6813,-0.001017],[30.695,-7.4338,-0.012604],[32.248,-10.238,-0.012604],[32.248,-8.1348,-0.012604],[28.521,-4.9803,-0.012604],[26.968,-3.5782,-0.001017],[22.309,-9.1863,-0.001017],[17.961,-14.093,0.010569],[18.893,-7.7843,0.033743],[23.862,-6.3823,0.010569],[26.347,-13.743,-0.001017],[24.483,-17.949,-0.001017],[21.377,-14.794,-0.001017],[19.203,-8.4853,-1.2292],[28.831,-7.4338,1.5516],[27.278,-8.8358,-0.012604],[25.104,-9.8873,-0.001017],[22.62,-10.588,-0.012604],[20.446,-8.8358,-0.012604],[17.34,-3.9287,-0.012604],[16.408,0.27732,-0.012604],[15.476,4.1329,-0.024191],[15.166,7.9885,-0.012604],[11.439,3.0814,-0.012604],[8.333,6.2359,-0.012604],[8.333,5.5349,-0.012604],[8.6436,0.62783,-0.001017],[11.439,8.339,-0.024191],[14.855,25.864,-0.035777],[15.166,27.967,-0.047364],[16.719,19.555,-0.001017],[17.34,16.05,0.022156],[16.719,12.545,0.022156],[17.029,7.9885,-0.012604],[21.377,11.844,-0.001017],[20.135,12.545,-0.001017],[22.93,7.2874,-0.001017],[22.62,2.3804,-0.001017],[23.862,-1.8257,-0.001017],[22.309,-3.5782,-0.001017],[20.446,-4.6298,-0.001017],[18.893,-3.9287,-0.012604],[22.309,-3.9287,-0.012604],[24.794,-7.0833,-0.012604],[26.036,-5.6813,-0.012604],[24.794,-1.8257,-0.024191],[24.794,-1.4752,-0.024191],[21.067,-8.8358,-0.024191],[16.719,-13.042,-0.012604],[16.097,-3.9287,0.010569],[21.067,-2.1762,-0.001017],[23.241,-10.588,-0.012604],[20.446,-15.495,-0.012604],[17.029,-14.444,-0.024191],[15.166,-9.5368,-1.264],[3.3637,-0.77419,-0.001017],[4.2955,-0.77419,-0.001017],[3.3637,-1.4752,-0.001017],[2.1214,-0.77419,-0.001017],[-0.36322,-0.77419,-0.001017],[-0.36322,-0.42369,-0.001017],[0.25794,0.97833,-0.001017],[2.7426,1.3288,-0.001017],[2.7426,2.0299,-0.001017],[3.6743,2.3804,-0.001017],[3.0531,-0.073182,-0.001017],[4.9166,-2.5267,-0.001017],[5.5378,-1.8257,-0.001017],[5.5378,-4.9803,-0.001017],[3.0531,-6.0318,-0.001017],[3.3637,6.5864,-0.001017],[3.3637,7.9885,-0.001017],[-0.36322,4.4834,-0.001017],[1.5003,5.5349,-0.001017],[-0.36322,4.1329,-0.001017],[0.56851,3.7824,-0.001017],[1.5003,5.1844,-0.001017],[2.432,6.2359,-0.001017],[1.5003,7.9885,-0.001017],[0.56851,6.9369,-0.001017],[2.7426,7.2874,-0.001017],[3.0531,4.8339,-0.001017],[3.0531,3.4319,-0.001017],[4.2955,4.8339,-0.001017],[2.1214,4.1329,-0.001017],[2.1214,2.0299,-0.001017],[3.0531,0.27732,-0.001017],[5.5378,-1.1247,-0.001017],[7.4013,-2.1762,-0.001017],[8.333,-4.2793,-0.001017],[11.439,-4.9803,-0.001017],[14.545,-4.9803,-0.001017],[14.545,-5.3308,-0.001017],[12.681,-5.3308,-0.001017],[9.5753,-3.5782,-0.001017],[6.4695,-4.2793,-0.001017],[18.272,-1.8257,-0.17482],[17.029,-0.073181,-0.012604],[14.545,-0.073181,0.010569],[11.439,0.62783,0.010569],[10.196,5.1844,0.010569],[8.333,4.4834,-0.001017],[4.606,1.3288,-0.001017],[3.0531,0.97834,-0.012604],[2.7426,2.0299,-0.001017],[3.6743,2.3804,-0.001017],[3.0531,-0.073181,-0.001017],[4.9166,-2.5267,-0.001017],[5.5378,-1.8257,-0.001017],[5.5378,-4.9803,-0.001017],[3.0531,-6.0318,-0.001017],[3.3637,6.5864,-0.001017],[3.3637,7.9885,-0.001017],[-0.36322,4.4834,-0.001017],[1.5003,5.5349,-0.001017],[-0.36322,4.1329,-0.001017],[0.56851,3.7824,-0.001017],[2.432,7.2874,-0.012604],[4.2955,9.04,-0.001017],[3.3637,6.5864,-0.001017],[4.606,12.195,-0.001017],[5.5378,10.442,-0.001017],[6.7801,9.04,-0.001017],[6.1589,10.792,-0.012604],[7.4013,8.339,-0.001017],[7.0907,2.0299,-0.001017],[8.9541,-0.42369,-0.012604],[10.818,-1.8257,-0.001017],[12.681,-2.1762,-0.001017],[14.234,-7.4338,-0.001017],[13.923,-9.5368,-0.012604],[16.719,-8.8358,-0.047364],[21.067,-8.8358,-0.035777],[22.62,-9.1863,-0.012604],[19.824,-8.8358,0.022156],[16.097,-4.6298,0.045329],[13.302,-5.6813,0.091676],[27.899,-3.2277,-0.23275],[26.657,-0.42369,-0.012604],[23.862,2.7309,0.022156],[19.203,6.2359,0.022156],[14.545,7.9885,0.010569],[11.439,7.9885,-0.001017],[8.0224,6.2359,0.010569],[6.1589,4.8339,-0.035777],[5.5378,4.4834,-0.012604],[6.1589,3.4319,-0.001017],[4.9166,0.27732,0.010569],[6.4695,-1.1247,0.010569],[8.0224,-1.8257,0.022156],[8.0224,-4.2793,0.033743],[3.6743,-0.77419,0.010569],[4.2955,7.9885,-0.001017],[3.3637,8.6895,-0.001017],[-0.36322,4.4834,-0.001017],[2.7426,7.6379,-0.001017],[3.3637,11.143,0.010569],[5.2272,13.246,-0.001017],[5.2272,15.7,-0.024191],[7.4013,16.751,0.033743],[8.0224,15.349,-0.001017],[9.2647,14.298,0.022156],[10.196,13.246,-0.012604],[11.439,11.143,-0.012604],[12.371,11.143,-0.035777],[9.5753,11.844,0.033743],[9.5753,7.6379,0.045329],[11.439,0.97834,-0.001017],[13.302,-7.4338,-0.012604],[17.961,-13.042,-0.024191],[21.377,-16.897,-0.001017],[22.62,-20.403,-0.012604],[24.483,-19.351,-0.082124],[28.521,-17.598,-0.058951],[29.763,-18.299,-0.024191],[25.104,-16.547,0.056916],[20.756,-9.5368,0.080089],[18.582,-4.6298,0.10326],[34.422,-6.3823,-0.25592],[33.179,-3.9287,-0.012604],[30.074,-0.77419,0.033743],[25.104,1.6793,0.045329],[18.893,4.8339,0.022156],[13.923,7.9885,0.010569],[10.196,7.9885,0.022156],[7.0907,6.2359,-0.035777],[5.5378,4.8339,-0.001017],[6.4695,3.7824,0.010569],[6.1589,1.3288,0.045329],[8.333,0.97834,0.033743],[8.9541,-0.073181,0.045329],[8.333,3.7824,0.080089],[8.0224,16.05,0.045329],[8.333,14.999,-0.012604],[3.0531,9.04,0.022156],[6.7801,11.494,0.010569],[9.2647,13.246,0.033743],[10.507,16.05,0.056916],[10.818,16.05,0.022156],[10.196,16.401,-0.012604],[11.439,13.947,0.045329],[12.371,12.896,0.010569],[13.923,11.494,0.033743],[14.855,9.741,0.010569],[14.855,6.2359,-0.001017],[16.097,4.8339,-0.024191],[14.855,4.1329,0.056916],[13.302,2.3804,0.080089],[12.371,-1.4752,0.022156],[13.302,-8.4853,-0.001017],[20.135,-16.897,-0.035777],[25.104,-20.403,0.010569],[26.657,-23.557,-0.001017],[28.521,-21.104,-0.093711],[31.005,-17.248,-0.070537],[32.558,-19.351,-0.035777],[28.521,-19.351,0.056916],[24.173,-11.64,0.091676],[21.377,-4.9803,0.091676],[41.876,-10.238,-0.23275],[42.186,-10.939,-0.012604],[39.08,-8.8358,0.033743],[34.732,-7.7843,0.045329],[26.657,-1.1247,0.033743],[17.34,6.9369,0.033743],[12.681,7.6379,0.045329],[9.2647,6.9369,-0.024191],[7.4013,5.1844,0.010569],[7.4013,3.7824,0.022156],[8.0224,2.3804,0.056916],[9.5753,2.3804,0.033743],[9.5753,5.1844,0.080089],[10.196,20.607,0.091676],[10.196,24.112,0.056916],[8.9541,18.153,0.022156],[10.818,17.102,0.045329],[15.166,16.751,-0.012604],[16.719,16.401,-0.001017],[16.408,15.349,0.080089],[15.476,13.947,0.022156],[15.166,12.195,-0.001017],[14.855,10.793,0.033743],[14.855,9.3905,0.022156],[16.408,7.9885,0.033743],[18.893,4.1329,0.022156],[18.893,0.27732,0.010569],[19.203,-1.1247,-0.024191],[20.446,-1.4752,0.080089],[20.135,-1.8257,0.080089],[17.34,-4.9803,0.033743],[16.408,-11.64,-0.001017],[22.309,-19.702,-0.047364],[30.074,-21.805,0.010569],[32.558,-25.31,0.010569],[35.664,-24.609,-0.1053],[36.596,-20.052,-0.082124],[36.285,-23.908,-0.058951],[31.937,-23.557,0.045329],[28.21,-14.444,0.10326],[25.725,-5.3308,0.045329],[48.087,-11.64,-0.14006],[48.708,-13.392,-0.012604],[45.602,-11.289,0.033743],[41.876,-12.341,0.045329],[34.732,-13.392,0.022156],[27.278,-10.238,0.033743],[21.067,-4.2793,0.033743],[13.923,4.1329,-0.001017],[10.818,4.4834,0.010569],[9.5753,4.1329,0.010569],[10.507,4.1329,0.033743],[11.128,7.2874,0.022156],[10.507,16.401,0.045329],[11.128,29.72,0.080089],[10.507,28.318,0.033743],[14.234,24.813,0.022156],[18.582,22.71,0.022156],[22.309,19.555,-0.024191],[21.067,17.452,-0.012604],[19.203,15.7,0.056916],[17.961,12.896,0.010569],[17.961,9.04,-0.012604],[17.961,6.9369,0.022156],[17.029,5.1844,-0.001017],[17.34,4.8339,0.022156],[19.824,0.97834,0.010569],[20.756,-4.2793,0.010569],[22.309,-6.3823,-0.024191],[23.862,-6.7328,0.056916],[24.483,-7.4338,0.080089],[23.241,-10.238,0.033743],[23.862,-16.897,-0.012604],[28.21,-23.207,-0.047364],[35.043,-24.609,0.010569],[37.838,-26.712,0.022156],[39.08,-24.959,-0.082124],[40.012,-20.403,-0.070537],[39.701,-23.557,-0.047364],[32.248,-26.361,0.045329],[27.899,-21.104,0.091676],[27.278,-9.5368,-0.035777],[53.678,-13.392,-0.001017],[54.299,-15.495,-0.012604],[51.814,-14.093,0.022156],[48.087,-15.846,0.045329],[42.186,-21.104,0.022156],[35.043,-21.104,0.033743],[28.831,-16.196,0.022156],[21.067,-8.4853,-0.001017],[16.408,-2.5267,0.010569],[13.302,3.0814,0.010569],[12.992,8.6895,0.033743],[12.371,16.401,0.022156],[9.5753,25.864,0.022156],[11.439,33.926,0.056916],[13.923,32.874,0.022156],[19.203,29.369,0.010569],[22.93,26.215,0.022156],[25.104,23.06,-0.024191],[22.93,20.607,-0.001017],[21.067,17.452,0.056916],[20.446,12.896,0.010569],[20.756,8.6895,-0.012604],[21.067,6.2359,0.022156],[19.824,3.7824,-0.012604],[19.824,3.0814,-0.001017],[20.756,-0.77419,-0.001017],[21.377,-7.0833,-0.001017],[23.862,-9.5368,-0.035777],[26.347,-10.238,0.045329],[28.21,-11.289,0.080089],[28.21,-13.743,0.022156],[28.831,-19.351,-0.024191],[32.558,-24.609,-0.058951],[38.77,-25.31,-0.001017],[41.565,-26.361,0.022156],[41.565,-23.908,-0.058951],[42.497,-18.65,-0.047364],[42.186,-22.506,-0.024191],[35.975,-28.114,0.045329],[30.384,-23.557,0.091676],[29.142,-10.939,-0.14006],[58.026,-14.444,0.18437],[59.268,-17.248,-0.012604],[56.473,-15.846,0.022156],[52.746,-18.65,0.033743],[47.466,-25.66,0.022156],[41.565,-27.413,0.022156],[34.732,-25.66,-0.001017],[28.21,-21.104,-0.012604],[22.309,-12.341,-0.001017],[18.272,-1.8257,-0.001017],[15.166,9.741,0.022156],[12.992,22.009,0.010569],[10.196,31.472,0.022156],[12.681,37.08,0.056916],[17.029,36.73,-0.001017],[21.998,33.926,-0.001017],[24.794,30.421,0.022156],[26.036,27.967,-0.012604],[24.173,24.813,0.010569],[22.93,19.555,0.056916],[23.241,13.597,0.010569],[23.862,9.04,-0.012604],[24.483,5.5349,0.010569],[22.93,3.4319,-0.024191],[22.62,2.0299,-0.001017],[22.93,-1.4752,-0.001017],[22.93,-8.1348,-0.012604],[25.104,-10.939,-0.035777],[28.831,-12.341,0.033743],[31.937,-13.743,0.080089],[32.248,-15.495,0.010569],[32.869,-22.155,-0.024191],[36.906,-27.062,-0.058951],[43.118,-26.712,-0.012604],[44.671,-27.763,0.022156],[44.671,-24.609,-0.035777],[45.913,-17.949,-0.024191],[46.224,-21.454,-0.012604],[40.633,-29.165,0.045329],[32.869,-23.908,0.080089],[30.384,-9.1863,-0.25592],[60.51,-15.145,0.40452],[62.063,-18.299,-0.001017],[59.579,-17.248,0.022156],[55.852,-20.052,0.022156],[50.572,-28.114,0.010569],[44.671,-31.619,0.022156],[39.08,-30.567,-0.001017],[32.869,-26.011,-0.012604],[27.278,-19.702,-0.012604],[22.309,-9.5368,-0.001017],[17.961,6.2359,0.022156],[13.923,20.607,0.010569],[12.681,31.823,0.010569],[15.166,38.482,0.045329],[19.203,38.833,-0.001017],[22.62,37.781,-0.001017],[24.794,36.379,0.033743],[26.036,33.575,0.010569],[25.104,28.318,0.022156],[24.794,21.658,0.056916],[26.347,14.999,0.010569],[26.657,9.741,-0.012604],[27.899,5.1844,0.010569],[26.657,3.0814,-0.024191],[26.347,1.6793,-0.012604],[26.347,-1.8257,-0.001017],[26.036,-8.1348,-0.012604],[28.21,-10.588,-0.047364],[32.248,-12.341,0.022156],[34.732,-14.444,0.056916],[35.975,-16.547,-0.001017],[36.596,-23.908,-0.024191],[41.565,-30.918,-0.058951],[48.087,-29.516,-0.012604],[48.708,-31.619,0.010569],[49.019,-26.712,-0.012604],[50.572,-17.949,-0.001017],[50.261,-19.351,-0.012604],[44.671,-30.217,0.045329],[34.422,-23.557,0.080089],[30.695,-4.2793,-0.3602],[60.51,-15.145,0.64784],[61.753,-18.299,-0.001017],[59.268,-16.897,0.010569],[55.852,-19.351,0.010569],[50.572,-26.011,0.010569],[44.671,-28.464,0.010569],[38.77,-26.361,-0.012604],[32.558,-21.104,-0.024191],[26.968,-14.794,-0.035777],[22.93,-6.3823,-0.024191],[20.135,4.1329,0.010569],[17.029,13.597,-0.001017],[15.476,21.308,-0.001017],[16.719,30.771,0.022156],[20.135,37.781,-0.001017],[22.309,41.637,0.010569],[25.725,40.585,0.033743],[26.968,37.431,0.022156],[26.657,31.122,0.022156],[26.657,23.411,0.045329],[29.763,16.751,-0.001017],[30.384,11.494,-0.012604],[32.558,6.2359,-0.001017],[32.248,3.4319,-0.024191],[31.316,1.6793,-0.012604],[31.316,-2.1762,-0.001017],[31.316,-8.4853,-0.012604],[32.558,-11.289,-0.047364],[36.285,-13.743,0.010569],[39.08,-15.846,0.056916],[39.701,-17.949,-0.001017],[39.08,-24.959,-0.024191],[43.118,-31.268,-0.047364],[48.398,-27.413,-0.024191],[48.087,-26.011,0.010569],[49.019,-17.598,-0.012604],[49.951,-8.1348,0.010569],[46.224,-13.743,0.010569],[38.149,-28.114,0.045329],[29.763,-19.702,0.056916],[27.278,0.62783,-0.46448],[54.92,-15.145,0.90274],[54.92,-17.598,-0.001017],[52.435,-16.547,0.010569],[49.019,-17.598,0.010569],[44.671,-21.104,-0.001017],[39.701,-21.805,-0.001017],[34.732,-19,-0.012604],[30.695,-14.093,-0.024191],[26.347,-9.8873,-0.035777],[22.62,-4.6298,-0.024191],[21.067,3.0814,-0.001017],[18.893,9.3905,-0.001017],[17.34,14.298,-0.012604],[17.34,22.009,0.010569],[19.824,28.318,-0.001017],[23.241,32.173,-0.001017],[28.21,35.678,0.033743],[31.005,35.678,0.022156],[31.005,31.823,0.022156],[31.005,25.163,0.033743],[33.179,18.854,-0.001017],[34.732,13.947,-0.012604],[37.217,8.6895,-0.001017],[36.596,4.8339,-0.024191],[35.975,1.6793,-0.001017],[35.664,-3.2277,-0.001017],[34.732,-9.5368,-0.012604],[35.975,-12.691,-0.047364],[38.459,-14.444,-0.001017],[40.323,-15.495,0.045329],[40.012,-15.145,-0.001017],[40.012,-17.598,-0.012604],[42.497,-22.506,-0.035777],[44.981,-21.454,-0.024191],[44.05,-20.403,0.010569],[43.118,-14.093,0.010569],[42.807,-9.5368,0.022156],[40.944,-14.444,0.033743],[34.422,-24.609,0.045329],[28.21,-17.248,0.033743],[26.036,-1.8257,-0.55718],[48.087,-14.444,1.0997],[47.466,-16.196,-0.001017],[44.671,-15.495,-0.001017],[41.876,-15.145,0.010569],[37.838,-15.846,-0.001017],[33.8,-15.846,-0.001017],[30.384,-13.042,-0.012604],[27.899,-8.4853,-0.024191],[24.483,-6.7328,-0.035777],[21.998,-3.5782,-0.024191],[20.446,2.3804,-0.012604],[18.893,6.5864,-0.012604],[17.961,9.3905,-0.012604],[17.34,16.401,-0.001017],[18.582,21.308,-0.012604],[22.62,24.462,-0.012604],[28.21,28.318,0.022156],[31.316,30.07,0.022156],[32.248,28.668,0.022156],[32.248,23.06,0.022156],[34.422,19.205,-0.001017],[36.285,16.05,-0.012604],[38.459,9.741,-0.001017],[37.838,5.1844,-0.012604],[36.596,2.0299,-0.001017],[35.975,-2.8772,-0.001017],[34.732,-9.1863,-0.012604],[34.732,-11.64,-0.035777],[35.975,-13.743,-0.012604],[36.596,-13.743,0.033743],[35.043,-10.939,-0.001017],[34.422,-10.588,-0.001017],[36.285,-14.093,-0.024191],[36.596,-14.794,-0.012604],[35.664,-14.444,0.010569],[34.111,-10.939,0.022156],[34.422,-11.64,0.022156],[34.111,-15.145,0.033743],[29.763,-20.052,0.045329],[25.104,-14.444,0.010569],[22.93,-4.2793,-0.63828],[40.944,-13.042,1.2735],[40.633,-14.093,-0.001017],[38.149,-13.743,-0.001017],[34.732,-12.691,-0.001017],[31.316,-11.64,-0.001017],[28.21,-10.939,-0.001017],[25.725,-8.4853,-0.024191],[23.862,-4.9803,-0.024191],[21.998,-4.6298,-0.035777],[20.135,-2.5267,-0.012604],[19.203,2.0299,-0.012604],[17.34,4.1329,-0.012604],[16.408,5.5349,-0.024191],[16.719,13.947,-0.012604],[17.029,19.205,-0.024191],[20.446,20.256,-0.024191],[24.173,21.308,-0.001017],[27.278,21.658,0.022156],[30.074,21.658,0.022156],[31.316,18.504,0.022156],[32.869,17.452,0.010569],[34.111,16.401,-0.001017],[35.043,9.3905,-0.001017],[34.732,3.7824,-0.001017],[33.8,2.3804,-0.001017],[33.179,-1.8257,-0.001017],[31.937,-6.7328,-0.012604],[31.005,-9.5368,-0.024191],[30.384,-11.289,-0.012604],[28.831,-10.588,0.022156],[26.036,-7.0833,-0.001017],[23.241,-5.6813,-0.001017],[24.483,-8.4853,-0.012604],[24.794,-8.8358,-0.012604],[24.173,-8.1348,0.010569],[22.93,-7.4338,0.022156],[26.347,-12.341,0.022156],[26.347,-14.794,0.033743],[21.998,-15.495,0.033743],[19.824,-11.289,-0.001017],[17.961,-4.2793,-0.73098],[33.179,-10.238,1.3546],[32.558,-10.939,0.010569],[30.695,-10.939,-0.001017],[27.899,-9.8873,-0.001017],[24.483,-7.7843,-0.001017],[21.377,-6.7328,-0.012604],[20.135,-3.9287,-0.024191],[19.203,-0.77419,-0.024191],[18.893,-0.42369,-0.024191],[17.34,1.6793,-0.012604],[15.166,6.5864,-0.024191],[14.234,5.5349,-0.012604],[12.371,2.0299,-0.012604],[11.439,11.494,-0.024191],[12.06,19.906,-0.024191],[16.097,19.555,-0.024191],[20.446,18.153,-0.012604],[22.93,18.153,0.022156],[24.483,17.803,0.022156],[25.725,14.999,0.010569],[26.968,15.349,-0.001017],[28.21,15.7,-0.001017],[29.763,7.9885,-0.001017],[29.763,3.4319,-0.001017],[28.521,2.3804,-0.001017],[26.347,-0.77419,-0.001017],[23.241,-4.2793,-0.012604],[21.067,-6.7328,-0.012604],[20.756,-7.7843,-0.012604],[20.446,-7.0833,-0.001017],[18.272,-3.9287,-0.001017],[18.272,-2.5267,-0.001017],[20.446,-5.6813,-0.012604],[21.067,-6.3823,-0.012604],[20.135,-6.0318,-0.012604],[20.135,-6.3823,0.010569],[22.93,-9.1863,0.010569],[22.62,-12.341,0.022156],[18.893,-12.691,0.010569],[16.719,-9.5368,-0.024191],[14.855,-5.3308,-0.76574],[25.725,-7.4338,1.4241],[24.483,-7.7843,0.010569],[22.62,-8.1348,-0.001017],[20.135,-7.4338,-0.012604],[17.34,-4.6298,-0.012604],[14.855,-1.8257,-0.012604],[14.234,0.27732,-0.012604],[14.545,3.7824,-0.012604],[16.097,4.4834,-0.012604],[14.234,7.6379,-0.012604],[10.818,12.195,-0.024191],[10.196,8.339,-0.012604],[7.4013,-1.4752,-0.012604],[4.9166,8.6895,-0.024191],[5.2272,22.009,-0.024191],[10.818,19.906,-0.012604],[16.719,16.751,-0.012604],[18.582,16.05,0.010569],[17.34,15.349,0.022156],[18.272,11.844,-0.012604],[18.893,13.246,-0.001017],[20.756,13.947,-0.001017],[22.62,6.5864,-0.012604],[22.93,3.0814,-0.001017],[21.998,2.0299,-0.001017],[17.34,0.62783,-0.001017],[12.992,-1.8257,-0.001017],[9.5753,-2.8772,-0.001017],[10.507,-4.2793,-0.012604],[11.439,-3.5782,-0.024191],[11.128,-1.1247,-0.012604],[14.545,-1.1247,-0.012604],[18.893,-3.5782,-0.001017],[20.446,-4.9803,-0.012604],[18.893,-5.3308,-0.024191],[19.203,-6.0318,-0.001017],[21.377,-4.9803,0.010569],[20.446,-9.1863,-0.001017],[17.029,-10.588,-0.012604],[14.545,-8.1348,-0.035777],[12.371,-6.7328,-0.78891],[1.5003,-0.42369,-0.001017],[0.56851,-0.073182,-0.001017],[0.56851,-1.1247,-0.001017],[1.1897,-1.4752,-0.001017],[-0.36322,-1.1247,-0.001017],[-0.36322,-0.073182,-0.001017],[0.87909,0.27732,-0.001017],[3.3637,2.3804,-0.001017],[2.432,1.3288,-0.001017],[2.1214,1.3288,-0.001017],[0.56851,-1.4752,-0.001017],[1.5003,-4.2793,-0.001017],[3.3637,-7.4338,-0.001017],[2.7426,-5.6813,-0.001017],[2.7426,-7.4338,-0.001017],[2.432,4.8339,-0.001017],[3.3637,7.9885,-0.001017],[4.2955,7.6379,-0.001017],[0.87909,5.5349,-0.001017],[-0.6738,7.2874,-0.001017],[1.5003,7.2874,-0.001017],[1.5003,4.4834,-0.001017],[1.1897,5.5349,-0.001017],[0.56851,6.5864,-0.001017],[2.7426,7.2874,-0.001017],[4.606,6.2359,-0.001017],[3.3637,3.7824,-0.001017],[1.5003,6.9369,-0.001017],[0.56851,4.4834,-0.001017],[1.1897,1.3288,-0.001017],[3.3637,0.27732,-0.001017],[6.1589,-1.1247,-0.001017],[6.1589,-1.1247,-0.001017],[5.2272,-1.8257,-0.001017],[4.9166,-1.8257,-0.001017],[4.2955,-1.8257,-0.001017],[6.4695,-2.1762,-0.001017],[8.9541,-3.2277,-0.001017],[9.2647,-4.2793,-0.001017],[7.4013,-3.9287,-0.001017],[7.4013,-2.5267,-0.001017],[13.923,-0.77419,-0.15164],[12.06,0.27732,-0.001017],[12.06,3.7824,-0.012604],[10.507,4.4834,-0.001017],[8.6436,4.8339,0.010569],[7.0907,4.8339,-0.001017],[6.1589,4.1329,-0.012604],[4.2955,3.7824,-0.001017],[2.432,1.3288,-0.001017],[2.1214,1.3288,-0.001017],[0.56851,-1.4752,-0.001017],[1.5003,-4.2793,-0.001017],[3.3637,-7.4338,-0.001017],[2.7426,-5.6813,-0.001017],[2.7426,-7.4338,-0.001017],[2.432,4.8339,-0.001017],[3.3637,7.9885,-0.001017],[4.2955,7.6379,-0.001017],[0.87909,5.5349,-0.001017],[-0.6738,7.2874,-0.001017],[2.1214,8.6895,-0.012604],[1.1897,9.04,-0.012604],[3.0531,5.1844,-0.012604],[3.0531,10.442,-0.012604],[5.2272,10.091,-0.024191],[6.4695,10.792,-0.012604],[6.7801,9.741,-0.001017],[5.5378,10.792,-0.001017],[6.7801,4.4834,-0.012604],[8.333,2.0299,-0.012604],[9.5753,0.27732,-0.024191],[12.681,-2.1762,-0.012604],[12.681,-4.2793,0.010569],[13.302,-7.4338,-0.012604],[16.097,-9.1863,-0.024191],[16.719,-8.1348,-0.024191],[18.893,-7.0833,-0.047364],[20.756,-6.7328,-0.035777],[19.203,-9.8873,-0.001017],[14.545,-6.7328,0.010569],[12.371,-4.9803,-0.001017],[22.62,-1.4752,-0.22116],[20.135,2.0299,0.010569],[17.34,5.1844,-0.012604],[15.166,7.9885,-0.001017],[12.371,9.04,0.022156],[10.196,9.3905,0.010569],[8.0224,8.339,-0.012604],[6.1589,7.2874,-0.001017],[4.9166,4.1329,0.010569],[3.6743,2.3804,0.010569],[3.0531,-1.4752,-0.001017],[4.2955,-4.2793,-0.001017],[6.1589,-5.6813,0.010569],[4.606,-5.3308,0.010569],[3.0531,-2.5267,-0.001017],[2.432,4.8339,-0.001017],[4.2955,9.04,-0.001017],[4.2955,7.9885,-0.012604],[1.1897,7.2874,-0.001017],[1.5003,9.04,-0.012604],[3.6743,11.494,-0.024191],[3.6743,13.597,-0.001017],[6.1589,12.896,-0.001017],[6.7801,11.494,-0.024191],[9.5753,12.896,-0.035777],[12.06,11.844,-0.024191],[11.128,10.091,0.010569],[8.6436,12.195,0.022156],[9.5753,10.792,-0.001017],[11.128,2.7309,-0.012604],[14.545,-4.6298,-0.047364],[18.893,-13.042,-0.012604],[21.067,-15.145,0.033743],[23.241,-17.248,-0.035777],[24.794,-19.702,-0.058951],[24.173,-19.351,-0.082124],[25.725,-17.598,-0.1053],[23.862,-14.444,-0.058951],[21.377,-13.392,0.010569],[18.272,-9.1863,0.033743],[17.34,-5.3308,-0.035777],[29.142,-3.9287,-0.24434],[26.657,-1.1247,0.022156],[23.862,1.6793,-0.012604],[20.135,5.5349,0.010569],[15.476,9.3905,0.033743],[12.06,10.442,0.022156],[9.2647,9.741,0.010569],[7.0907,8.339,0.010569],[5.2272,5.1844,0.022156],[4.9166,3.4319,0.033743],[4.9166,-0.073181,0.010569],[6.7801,-1.4752,-0.001017],[7.4013,-0.77419,0.033743],[4.606,3.4319,0.022156],[6.7801,13.597,0.010569],[8.333,16.751,0.022156],[4.9166,9.3905,0.010569],[6.4695,9.3905,-0.001017],[6.4695,11.494,0.010569],[8.0224,11.494,-0.001017],[9.5753,13.246,-0.012604],[9.2647,12.545,0.010569],[10.196,11.844,0.010569],[12.681,9.741,-0.024191],[15.166,9.741,-0.035777],[17.34,7.2874,-0.012604],[16.719,4.8339,0.022156],[14.545,4.1329,0.045329],[12.681,3.7824,0.022156],[12.681,1.6793,-0.001017],[14.855,-4.2793,-0.035777],[20.135,-14.444,-0.012604],[23.862,-22.155,0.045329],[26.347,-23.207,-0.035777],[29.763,-23.557,-0.082124],[28.831,-21.805,-0.1053],[29.142,-20.403,-0.12847],[27.899,-18.299,-0.082124],[22.93,-13.392,-0.001017],[18.272,-8.4853,0.033743],[17.029,-3.9287,-0.082124],[37.838,-8.8358,-0.24434],[35.975,-8.1348,0.022156],[32.869,-5.3308,-0.012604],[28.521,0.97834,0.010569],[20.756,8.339,0.045329],[15.166,10.442,0.033743],[11.439,10.091,0.022156],[8.6436,9.04,0.033743],[6.7801,6.9369,0.045329],[6.7801,4.4834,0.033743],[7.4013,1.6793,-0.001017],[8.333,1.6793,-0.001017],[8.333,6.9369,0.045329],[7.4013,19.205,0.033743],[10.818,25.514,0.022156],[8.9541,18.854,0.056916],[9.2647,12.896,0.022156],[12.681,14.298,0.010569],[13.923,16.05,0.010569],[14.545,14.999,0.010569],[15.166,13.246,-0.001017],[14.545,11.143,0.022156],[15.166,10.793,0.022156],[16.408,8.339,-0.012604],[18.893,6.9369,-0.035777],[22.309,2.7309,-0.001017],[20.756,1.3288,0.033743],[18.893,-1.8257,0.056916],[18.272,-0.42369,0.033743],[17.961,-1.4752,0.022156],[18.582,-6.3823,-0.024191],[20.756,-16.196,-0.001017],[25.725,-26.361,0.045329],[30.074,-28.114,-0.047364],[33.8,-28.464,-0.082124],[32.248,-26.712,-0.1053],[31.937,-24.258,-0.11688],[31.316,-21.104,-0.093711],[24.483,-14.093,-0.012604],[19.203,-9.1863,0.033743],[17.961,-4.2792,-0.12847],[44.05,-10.238,-0.16323],[42.186,-10.588,0.022156],[39.701,-9.5368,-0.012604],[36.285,-6.3823,-0.001017],[30.695,-4.9803,0.045329],[23.241,-1.8257,0.033743],[16.408,7.2874,0.033743],[12.06,8.339,0.045329],[9.2647,7.6379,0.033743],[9.2647,5.5349,0.022156],[9.5753,3.7824,-0.001017],[9.5753,7.6379,-0.001017],[10.818,20.607,0.033743],[10.507,29.72,0.033743],[11.128,29.019,0.022156],[12.06,22.009,0.045329],[16.719,19.205,0.010569],[19.824,18.854,-0.001017],[20.135,18.504,-0.001017],[18.893,16.751,-0.001017],[18.893,13.246,-0.001017],[18.272,10.091,0.010569],[18.582,9.04,0.022156],[18.582,7.2874,-0.012604],[20.135,4.4834,-0.035777],[23.241,0.62783,-0.001017],[24.173,-2.1762,0.045329],[22.62,-6.0318,0.045329],[22.93,-5.3308,0.033743],[23.241,-6.7328,0.022156],[25.104,-9.1863,-0.012604],[26.968,-17.949,-0.001017],[30.695,-28.464,0.033743],[35.664,-30.918,-0.058951],[39.08,-30.567,-0.070537],[36.596,-28.464,-0.082124],[34.732,-26.712,-0.093711],[32.558,-23.908,-0.070537],[23.241,-17.598,0.010569],[15.166,-13.743,0.022156],[15.476,-8.1348,-0.16323],[49.951,-12.341,-0.035777],[48.398,-13.392,0.022156],[46.224,-13.042,-0.012604],[43.739,-10.939,-0.001017],[38.77,-12.341,0.045329],[31.005,-12.691,0.022156],[23.862,-6.0318,0.022156],[17.961,-1.8257,0.033743],[13.923,3.0814,0.022156],[11.439,5.1844,0.010569],[11.128,8.6895,-0.001017],[11.128,19.205,0.010569],[11.128,29.369,0.033743],[11.128,33.225,0.022156],[13.923,31.472,0.010569],[16.719,26.916,0.022156],[22.309,24.462,0.010569],[23.862,22.359,-0.001017],[22.62,21.308,0.010569],[21.998,18.504,0.010569],[22.309,13.246,-0.001017],[21.998,9.3905,0.010569],[21.998,7.9885,0.022156],[21.377,5.5349,-0.012604],[22.62,2.7309,-0.047364],[25.104,-0.77419,-0.012604],[26.347,-4.9803,0.033743],[25.104,-9.5368,0.033743],[26.657,-9.8873,0.022156],[28.521,-11.289,0.010569],[30.695,-13.392,-0.012604],[32.558,-20.403,-0.001017],[34.732,-28.464,0.022156],[38.149,-30.567,-0.058951],[39.701,-28.815,-0.058951],[36.906,-25.66,-0.070537],[36.285,-26.361,-0.070537],[34.111,-23.207,-0.035777],[24.794,-18.299,0.033743],[16.408,-15.495,0.022156],[14.855,-11.289,-0.1864],[54.92,-13.392,0.13802],[53.678,-15.495,0.010569],[51.503,-15.495,-0.012604],[49.64,-14.093,-0.001017],[44.671,-16.547,0.033743],[36.906,-20.052,0.010569],[30.695,-17.949,0.010569],[24.173,-11.64,0.022156],[18.272,-4.2793,0.010569],[13.923,2.7309,0.010569],[12.06,11.844,0.010569],[12.371,26.215,-0.001017],[12.06,33.575,0.033743],[12.371,35.328,0.022156],[16.719,34.627,0.010569],[20.446,31.122,0.010569],[24.794,29.019,0.010569],[25.725,26.916,0.010569],[24.483,25.163,0.022156],[24.483,20.607,0.010569],[25.725,13.597,-0.001017],[25.104,9.04,0.010569],[25.104,7.2874,0.022156],[24.794,4.8339,-0.012604],[26.036,1.6793,-0.047364],[27.278,-1.8257,-0.024191],[28.21,-6.3823,0.022156],[27.899,-12.341,0.022156],[30.074,-13.392,0.010569],[32.248,-14.794,-0.001017],[34.732,-16.547,-0.012604],[38.149,-24.258,-0.012604],[39.08,-30.217,0.010569],[40.633,-31.268,-0.058951],[41.565,-29.165,-0.047364],[39.08,-24.258,-0.070537],[39.08,-26.011,-0.047364],[38.149,-21.454,-0.012604],[29.142,-16.547,0.045329],[20.135,-14.794,0.022156],[17.34,-10.939,-0.1864],[58.026,-14.093,0.35817],[56.473,-16.547,0.010569],[54.299,-17.248,-0.012604],[52.746,-15.846,-0.001017],[48.087,-18.65,0.022156],[40.323,-23.908,0.010569],[35.043,-22.856,-0.001017],[28.521,-17.598,0.010569],[22.309,-12.341,-0.012604],[16.408,-1.4752,-0.001017],[12.992,11.844,-0.001017],[12.681,24.112,-0.001017],[14.234,33.225,0.022156],[14.855,37.08,0.010569],[18.582,36.73,-0.001017],[20.756,35.678,0.010569],[25.104,34.627,0.022156],[26.347,32.173,0.022156],[26.347,29.019,0.022156],[26.968,22.359,0.010569],[28.831,14.298,-0.001017],[28.521,9.04,-0.001017],[28.831,7.2874,0.010569],[28.521,4.1329,-0.012604],[29.142,0.62783,-0.047364],[30.384,-2.1762,-0.024191],[31.005,-7.0833,0.010569],[30.695,-13.392,0.010569],[32.869,-14.794,-0.001017],[35.664,-16.196,-0.012604],[38.459,-18.299,-0.024191],[42.186,-28.114,-0.012604],[43.118,-34.072,-0.001017],[44.05,-33.021,-0.058951],[45.913,-31.969,-0.047364],[44.05,-26.011,-0.058951],[43.739,-26.011,-0.035777],[43.739,-18.65,-0.001017],[35.043,-13.743,0.056916],[24.794,-10.939,0.033743],[22.309,-6.3823,-0.19799],[57.404,-14.444,0.60149],[55.852,-16.547,-0.001017],[53.367,-16.547,-0.012604],[51.503,-15.495,-0.001017],[46.534,-17.598,0.010569],[38.77,-21.454,0.010569],[32.558,-19.702,-0.001017],[26.347,-14.093,-0.012604],[21.067,-8.8358,-0.024191],[16.719,-1.4752,-0.012604],[14.855,7.9885,-0.012604],[14.234,16.05,-0.001017],[14.545,24.112,0.010569],[14.234,30.421,-0.001017],[17.029,35.678,-0.001017],[20.135,38.833,0.010569],[25.725,39.183,0.022156],[27.278,36.73,0.022156],[27.899,31.823,0.022156],[29.763,24.813,-0.001017],[31.937,16.401,-0.012604],[31.316,10.442,-0.001017],[32.248,7.9885,-0.001017],[32.248,4.4834,-0.024191],[33.179,0.62783,-0.047364],[34.732,-1.8257,-0.024191],[34.732,-6.7328,-0.001017],[34.111,-12.691,-0.001017],[36.596,-15.145,-0.012604],[38.459,-17.248,-0.012604],[40.633,-20.052,-0.012604],[43.118,-29.516,-0.012604],[43.118,-34.072,-0.012604],[42.497,-28.815,-0.047364],[42.497,-26.011,-0.058951],[40.633,-18.299,-0.047364],[39.701,-16.897,-0.012604],[39.701,-13.042,0.022156],[32.248,-10.939,0.045329],[23.241,-8.1348,0.033743],[22.62,-2.8772,-0.24434],[51.503,-14.093,0.8564],[49.019,-15.495,-0.001017],[46.534,-15.145,-0.001017],[43.739,-13.743,-0.001017],[39.701,-14.444,0.010569],[33.179,-15.846,-0.001017],[29.142,-14.444,-0.001017],[24.483,-9.8873,-0.012604],[20.756,-6.3823,-0.035777],[17.34,-1.4752,-0.024191],[16.097,5.5349,-0.012604],[15.476,10.793,-0.012604],[16.097,17.102,0.010569],[14.545,22.359,-0.001017],[16.408,27.617,-0.001017],[18.893,30.771,-0.001017],[24.794,33.575,0.022156],[28.21,34.627,0.022156],[30.074,31.823,0.022156],[31.937,25.864,-0.012604],[33.8,17.803,-0.012604],[34.732,11.494,-0.012604],[36.285,9.741,-0.012604],[36.596,5.1844,-0.024191],[37.217,0.27732,-0.035777],[38.459,-3.2277,-0.024191],[37.838,-7.7843,-0.001017],[35.975,-14.444,-0.012604],[36.596,-15.495,-0.012604],[37.838,-15.145,-0.012604],[38.459,-15.846,-0.012604],[40.633,-21.454,-0.012604],[40.944,-24.609,-0.012604],[39.701,-22.506,-0.035777],[38.77,-20.403,-0.047364],[37.217,-16.196,-0.035777],[35.975,-14.093,0.010569],[34.732,-12.691,0.033743],[29.142,-12.341,0.033743],[23.241,-8.8358,0.022156],[22.93,-4.2792,-0.31386],[44.36,-13.042,1.0534],[42.186,-14.093,-0.001017],[39.08,-13.042,-0.001017],[36.285,-11.289,-0.001017],[32.558,-10.588,-0.001017],[28.521,-10.588,-0.001017],[25.725,-9.5368,-0.012604],[22.62,-6.3823,-0.024191],[20.135,-4.6298,-0.035777],[17.34,-1.1247,-0.035777],[16.408,4.1329,-0.024191],[15.476,7.6379,-0.012604],[15.476,12.545,-0.001017],[13.302,17.452,-0.012604],[14.855,21.658,-0.012604],[17.029,23.06,-0.012604],[22.62,25.864,0.010569],[26.968,28.318,0.022156],[30.074,27.266,0.010569],[31.937,22.71,-0.024191],[33.179,16.751,-0.024191],[35.043,12.545,-0.012604],[36.906,10.442,-0.012604],[36.596,5.1844,-0.024191],[36.906,0.27732,-0.035777],[37.217,-2.1762,-0.024191],[35.975,-6.7328,-0.012604],[32.869,-13.743,-0.024191],[32.248,-14.093,-0.012604],[31.316,-11.289,-0.012604],[30.695,-10.588,-0.001017],[32.558,-13.392,-0.012604],[32.869,-15.846,-0.001017],[32.248,-15.846,-0.024191],[32.248,-15.495,-0.035777],[32.248,-14.444,-0.012604],[31.316,-12.691,0.022156],[30.074,-11.289,0.033743],[25.104,-11.289,0.022156],[21.067,-8.8358,0.010569],[20.446,-4.6298,-0.38338],[37.217,-10.939,1.204],[35.664,-11.289,-0.001017],[32.558,-10.238,-0.001017],[30.074,-8.8358,-0.001017],[26.968,-7.7843,-0.001017],[23.862,-7.4338,-0.001017],[21.998,-6.3823,-0.012604],[20.135,-3.9287,-0.024191],[18.582,-2.5267,-0.035777],[16.719,-0.77419,-0.035777],[16.097,2.7309,-0.024191],[14.545,5.1844,-0.012604],[13.302,9.741,-0.012604],[10.507,15.349,-0.012604],[12.681,19.205,-0.024191],[14.234,18.854,-0.024191],[18.582,19.205,-0.001017],[24.173,20.607,0.010569],[28.21,19.205,0.010569],[29.763,16.401,-0.012604],[30.695,13.947,-0.012604],[32.558,13.246,-0.012604],[34.111,9.741,-0.012604],[32.869,4.4834,-0.012604],[32.248,1.6793,-0.024191],[32.248,-0.073181,-0.024191],[30.074,-3.5782,-0.012604],[26.968,-9.5368,-0.012604],[22.62,-9.8873,-0.012604],[20.446,-7.4338,-0.012604],[18.272,-6.7328,-0.001017],[20.135,-8.1348,-0.001017],[20.135,-9.8873,-0.001017],[21.067,-9.8873,-0.012604],[22.309,-10.939,-0.024191],[24.173,-11.64,-0.001017],[24.794,-10.939,0.022156],[24.173,-8.4853,0.033743],[20.135,-8.4853,0.010569],[16.408,-7.0833,-0.001017],[16.097,-3.9287,-0.44131],[30.384,-8.1348,1.2851],[28.521,-8.8358,-0.012604],[26.036,-7.7843,-0.001017],[23.241,-6.7328,-0.001017],[20.756,-5.3308,-0.001017],[18.582,-4.2793,-0.001017],[17.029,-3.5782,-0.012604],[16.719,-1.8257,-0.024191],[16.719,-0.073181,-0.024191],[16.408,3.4319,-0.024191],[16.097,6.2359,-0.012604],[14.234,6.2359,-0.012604],[11.128,6.5864,-0.012604],[5.5378,12.545,-0.012604],[7.4013,18.153,-0.024191],[9.2647,16.401,-0.035777],[14.545,15.349,-0.001017],[20.135,17.452,0.010569],[22.93,15.7,0.010569],[24.483,13.947,-0.001017],[24.483,13.597,-0.001017],[26.657,13.246,-0.001017],[28.21,9.741,-0.001017],[26.347,4.4834,-0.001017],[25.104,2.3804,-0.012604],[22.93,2.0299,-0.012604],[20.135,-1.1247,-0.012604],[17.029,-7.0833,-0.012604],[13.302,-7.4338,-0.012604],[12.06,-4.2793,-0.012604],[11.128,-4.2793,-0.001017],[14.234,-5.6813,-0.012604],[14.855,-6.3823,-0.012604],[16.719,-7.4338,-0.001017],[18.582,-8.4853,-0.012604],[21.067,-8.8358,-0.001017],[22.309,-7.7843,0.010569],[20.756,-5.6813,0.010569],[17.961,-6.7328,-0.001017],[14.545,-6.3823,-0.012604],[13.302,-3.9287,-0.46448],[22.62,-5.6813,1.343],[20.756,-6.0318,-0.012604],[18.893,-5.3308,-0.001017],[16.408,-4.9803,-0.001017],[14.234,-2.5267,-0.012604],[12.992,-1.1247,-0.012604],[12.06,-0.77419,-0.012604],[12.992,-0.073181,-0.024191],[14.855,3.0814,-0.024191],[15.476,9.04,-0.012604],[16.097,10.792,-0.001017],[14.234,7.2874,-0.001017],[8.6436,3.4319,-0.024191],[0.25793,10.091,-0.012604],[1.5003,18.153,-0.024191],[4.2955,13.597,-0.035777],[10.507,11.844,-0.001017],[15.476,15.349,-0.001017],[17.029,13.597,0.010569],[17.961,13.246,0.010569],[17.029,14.298,0.010569],[18.893,13.246,-0.001017],[20.756,10.091,-0.001017],[18.582,4.4834,-0.001017],[17.029,2.7309,0.010569],[12.992,3.7824,-0.001017],[8.9541,0.97834,-0.012604],[6.1589,-4.9803,-0.012604],[4.606,-4.9803,-0.001017],[4.2955,-1.4752,-0.012604],[6.4695,-2.1762,-0.012604],[11.128,-3.5782,-0.012604],[12.681,-3.9287,-0.024191],[15.166,-5.6813,-0.012604],[17.34,-6.7328,-0.001017],[20.135,-6.0318,0.010569],[21.067,-3.5782,-0.001017],[18.582,-2.8772,-0.001017],[16.097,-4.9803,-0.012604],[13.923,-6.0318,-0.024191],[12.06,-4.2793,-0.47607],[0.87909,-1.1247,-0.001017],[1.5003,-1.1247,-0.001017],[0.87909,-0.77419,-0.001017],[0.87909,-0.77419,-0.001017],[0.56851,-0.77419,-0.001017],[0.56851,-0.073182,-0.001017],[-0.36322,0.97833,-0.001017],[3.3637,1.6793,-0.001017],[1.5003,0.97833,-0.001017],[0.87909,0.27732,-0.001017],[-0.6738,-1.4752,-0.001017],[-2.2267,-3.5782,-0.001017],[0.56851,-7.4338,-0.001017],[2.432,-6.7328,-0.001017],[1.5003,-7.0833,-0.001017],[3.0531,-0.073182,-0.001017],[3.0531,3.7824,-0.001017],[2.7426,6.5864,-0.001017],[2.432,8.339,-0.001017],[2.432,6.5864,-0.001017],[1.5003,6.5864,-0.001017],[0.87909,7.9885,-0.001017],[0.25794,7.2874,-0.001017],[3.6743,7.9885,-0.001017],[4.2955,7.2874,-0.001017],[1.5003,7.6379,-0.001017],[0.25794,7.6379,-0.001017],[-0.98438,5.5349,-0.001017],[-0.6738,2.7309,-0.001017],[1.5003,2.7309,-0.001017],[3.0531,0.62783,-0.001017],[2.7426,-1.4752,-0.001017],[2.432,-2.5267,-0.001017],[2.7426,-1.8257,-0.001017],[2.7426,-1.8257,-0.001017],[4.9166,-1.8257,-0.001017],[6.1589,-1.8257,-0.001017],[6.7801,-3.2277,-0.001017],[7.0907,-3.2277,-0.001017],[6.1589,-1.8257,-0.001017],[6.7801,-0.073182,-0.001017],[10.507,-0.073181,-0.15164],[9.5753,2.0299,-0.001017],[7.4013,3.7824,-0.001017],[6.7801,4.4834,-0.001017],[6.1589,4.8339,-0.012604],[5.5378,5.1844,-0.001017],[4.606,4.8339,-0.012604],[4.2955,4.1329,-0.001017],[1.5003,0.97834,-0.001017],[0.87909,0.27732,-0.001017],[-0.6738,-1.4752,-0.001017],[-2.2267,-3.5782,-0.001017],[0.56851,-7.4338,-0.001017],[2.432,-6.7328,-0.001017],[1.5003,-7.0833,-0.001017],[3.0531,-0.073181,-0.001017],[3.0531,3.7824,-0.001017],[2.7426,6.5864,-0.001017],[2.432,8.339,-0.001017],[2.432,6.5864,-0.001017],[2.1214,7.9885,-0.001017],[3.3637,8.339,-0.001017],[2.1214,10.442,-0.012604],[2.7426,9.741,-0.024191],[4.9166,10.792,-0.001017],[6.1589,10.442,0.010569],[5.2272,10.091,-0.001017],[4.9166,6.5864,0.010569],[3.6743,7.6379,-0.001017],[5.5378,3.7824,-0.024191],[8.333,0.97834,-0.012604],[10.507,-3.9287,-0.001017],[12.371,-7.7843,-0.001017],[14.234,-8.8358,0.010569],[11.439,-7.0833,-0.001017],[12.06,-3.9287,-0.024191],[12.681,-2.5267,-0.012604],[10.507,-3.5782,-0.012604],[14.855,-7.7843,-0.035777],[18.582,-4.9803,-0.035777],[16.408,-5.6813,-0.047364],[16.097,-0.42369,-0.25592],[14.855,3.0814,-0.001017],[12.06,7.2874,0.010569],[10.196,9.741,-0.001017],[8.6436,10.792,-0.001017],[7.4013,10.442,0.010569],[5.5378,9.04,-0.012604],[4.9166,7.6379,0.010569],[3.3637,4.8339,0.010569],[2.7426,2.0299,0.010569],[1.5003,-1.8257,0.010569],[0.25793,-4.6298,-0.024191],[2.1214,-6.0318,-0.035777],[3.3637,-6.3823,-0.001017],[2.1214,-5.3308,-0.001017],[3.0531,-0.073181,-0.001017],[4.9166,7.9885,0.010569],[5.2272,7.9885,0.010569],[2.7426,9.3905,-0.001017],[0.87909,8.339,0.010569],[1.5003,10.792,-0.001017],[3.0531,12.195,0.010569],[6.7801,10.792,-0.035777],[7.0907,11.143,-0.024191],[8.9541,9.741,-0.001017],[8.6436,13.597,0.022156],[8.333,13.947,-0.012604],[8.333,12.195,0.033743],[10.507,6.5864,-0.001017],[12.371,-1.8257,-0.035777],[16.097,-10.588,-0.024191],[19.824,-14.794,-0.024191],[20.756,-18.65,0.010569],[22.93,-21.104,0.010569],[24.173,-18.299,-0.024191],[25.104,-13.743,-0.070537],[24.483,-11.289,-0.035777],[22.309,-9.8873,-0.047364],[20.446,-10.939,-0.082124],[17.34,-8.8358,-0.047364],[17.029,-5.6813,-0.1053],[22.62,-2.1762,-0.30227],[20.756,0.27732,-0.001017],[17.029,4.8339,0.010569],[13.923,9.3905,-0.001017],[11.128,12.195,0.010569],[9.2647,12.545,0.022156],[7.4013,10.792,-0.001017],[6.1589,9.04,0.022156],[4.606,6.2359,0.022156],[4.2955,3.0814,0.022156],[3.3637,-0.42369,0.010569],[3.3637,-1.8257,-0.047364],[4.9166,-0.42369,-0.058951],[4.2955,2.3804,0.022156],[4.9166,10.091,-0.001017],[9.2647,15.7,0.056916],[8.0224,9.741,0.045329],[5.5378,6.5864,0.022156],[5.2272,10.442,0.022156],[6.7801,10.091,0.022156],[7.0907,11.143,0.010569],[8.6436,12.195,0.010569],[11.128,7.9885,-0.035777],[12.371,6.5864,-0.024191],[14.855,5.1844,0.010569],[15.476,4.4834,0.033743],[14.545,6.5864,-0.012604],[12.371,6.9369,0.045329],[12.371,2.7309,0.022156],[13.923,-2.5267,-0.024191],[18.272,-10.238,-0.035777],[23.241,-20.052,-0.024191],[24.794,-25.31,0.010569],[27.278,-25.66,0.010569],[29.142,-23.908,-0.047364],[28.521,-19.702,-0.1053],[26.036,-17.598,-0.047364],[21.998,-12.341,-0.058951],[18.582,-8.4853,-0.093711],[15.166,-6.3823,-0.058951],[14.545,-4.2793,-0.16323],[31.937,-7.0833,-0.32544],[30.074,-4.9803,-0.001017],[25.725,1.3288,0.010569],[19.824,8.339,0.010569],[15.476,12.896,0.022156],[12.681,13.246,0.033743],[9.2647,11.844,0.010569],[7.0907,10.442,0.045329],[6.1589,7.6379,0.033743],[6.1589,4.8339,0.022156],[6.1589,2.0299,0.010569],[5.5378,0.62783,-0.058951],[6.1589,6.9369,-0.047364],[6.7801,17.102,0.045329],[11.128,24.813,0.022156],[11.128,20.957,0.056916],[9.5753,11.143,0.045329],[10.196,10.793,0.033743],[11.128,13.947,0.022156],[14.234,13.246,0.033743],[15.166,12.545,0.033743],[14.545,11.143,0.010569],[16.408,7.2874,-0.035777],[18.272,4.1329,-0.024191],[19.824,1.6793,0.022156],[21.377,0.62783,0.033743],[19.824,1.3288,-0.012604],[16.408,1.6793,0.045329],[16.408,-1.8257,0.033743],[17.34,-5.6813,-0.012604],[20.756,-13.042,-0.035777],[26.347,-22.155,-0.024191],[28.831,-27.413,0.010569],[31.005,-31.619,-0.001017],[33.8,-31.969,-0.047364],[30.695,-27.413,-0.1053],[27.899,-24.959,-0.035777],[21.377,-17.949,-0.070537],[15.166,-10.939,-0.1053],[12.681,-8.1348,-0.058951],[12.681,-6.0318,-0.19799],[37.838,-8.8358,-0.26751],[35.975,-8.1348,-0.001017],[33.179,-5.6813,0.010569],[29.763,-1.8257,0.010569],[24.794,2.3804,0.022156],[19.203,8.339,0.033743],[13.923,11.143,0.022156],[10.196,11.844,0.045329],[8.6436,9.741,0.033743],[8.0224,6.9369,0.010569],[8.333,4.1329,-0.001017],[6.7801,6.5864,-0.047364],[8.333,17.803,-0.024191],[10.818,30.771,0.033743],[12.992,29.369,0.010569],[14.234,24.462,0.033743],[14.855,15.349,0.022156],[18.582,17.803,0.022156],[18.893,18.153,0.022156],[21.067,15.7,0.022156],[20.756,13.597,0.033743],[19.824,11.143,0.010569],[19.824,8.339,-0.024191],[20.446,4.4834,-0.012604],[21.377,0.97834,0.022156],[24.483,-0.77419,0.033743],[24.173,-1.1247,-0.001017],[21.377,-2.1762,0.045329],[21.998,-5.3308,0.033743],[22.93,-8.1348,-0.001017],[25.725,-14.794,-0.024191],[30.384,-23.557,-0.012604],[32.248,-29.516,0.010569],[33.179,-34.423,-0.012604],[37.217,-33.021,-0.058951],[33.179,-27.763,-0.093711],[28.831,-26.361,-0.024191],[21.067,-21.104,-0.058951],[11.128,-13.743,-0.082124],[6.4695,-11.289,-0.047364],[6.7801,-10.588,-0.1864],[44.36,-10.588,-0.15164],[42.497,-10.588,-0.001017],[40.323,-9.8873,0.010569],[36.596,-7.7843,0.010569],[32.248,-4.6298,0.010569],[25.725,-1.8257,0.022156],[18.582,0.62783,0.022156],[13.923,5.1844,0.045329],[10.818,8.339,0.022156],[9.5753,7.2874,-0.012604],[8.9541,8.339,-0.012604],[8.9541,17.452,-0.024191],[9.5753,28.668,-0.001017],[13.302,34.977,0.033743],[16.719,31.122,0.010569],[19.203,26.916,0.022156],[21.377,20.607,0.010569],[23.862,22.71,0.022156],[23.862,21.308,0.022156],[24.794,17.452,0.022156],[24.483,13.947,0.045329],[23.862,10.793,0.010569],[23.241,7.9885,-0.024191],[23.862,4.1329,-0.012604],[24.483,0.27732,0.010569],[26.968,-1.8257,0.010569],[27.278,-2.5267,-0.001017],[26.347,-6.7328,0.033743],[26.657,-10.238,0.033743],[28.521,-12.341,-0.001017],[30.695,-17.248,-0.024191],[34.111,-23.557,-0.012604],[35.975,-28.815,-0.001017],[37.217,-33.021,-0.024191],[37.838,-29.165,-0.058951],[32.869,-26.361,-0.070537],[27.899,-24.959,-0.001017],[19.824,-19,-0.035777],[9.5753,-13.743,-0.058951],[6.1589,-14.444,-0.035777],[4.9166,-14.093,-0.12847],[49.64,-12.691,0.010569],[47.777,-12.691,-0.001017],[45.602,-12.691,0.010569],[42.186,-11.289,-0.001017],[37.838,-9.5368,0.010569],[31.316,-10.939,0.010569],[24.173,-9.1863,0.022156],[17.961,-2.1762,0.033743],[13.302,3.0814,0.010569],[10.507,6.5864,-0.012604],[9.5753,11.844,-0.012604],[10.507,24.112,-0.012604],[11.439,34.977,-0.001017],[16.097,36.379,0.010569],[19.824,32.874,-0.001017],[22.62,29.019,0.010569],[25.725,25.864,0.022156],[26.347,27.266,0.033743],[26.968,25.163,0.022156],[27.899,19.205,0.022156],[28.21,14.298,0.033743],[27.899,10.793,0.010569],[27.278,7.6379,-0.024191],[27.899,3.4319,-0.012604],[28.21,-1.1247,0.010569],[30.074,-3.2277,-0.001017],[30.384,-4.9803,-0.012604],[30.384,-9.8873,0.022156],[31.316,-14.444,0.022156],[33.179,-15.846,-0.001017],[35.043,-20.403,-0.024191],[38.459,-25.31,-0.012604],[39.701,-29.516,-0.012604],[40.944,-33.021,-0.035777],[38.77,-28.464,-0.047364],[33.8,-26.011,-0.058951],[28.831,-22.856,-0.001017],[21.067,-16.196,-0.024191],[12.681,-11.64,-0.035777],[10.196,-14.794,-0.012604],[8.6436,-14.093,-0.082124],[52.125,-13.743,0.21913],[50.572,-13.743,-0.001017],[48.087,-14.093,-0.001017],[44.671,-13.743,-0.001017],[40.944,-12.341,0.010569],[34.732,-15.846,-0.001017],[28.21,-14.794,0.010569],[21.067,-7.7843,0.010569],[16.097,-2.8772,-0.001017],[10.818,4.1329,-0.024191],[10.196,13.597,-0.012604],[10.818,22.009,-0.001017],[13.302,34.627,-0.012604],[18.272,37.431,-0.001017],[21.067,34.977,-0.001017],[22.93,31.472,0.010569],[26.347,30.07,0.033743],[26.968,32.173,0.045329],[29.763,29.019,0.022156],[31.316,21.308,0.022156],[32.248,14.298,0.033743],[31.937,11.143,0.010569],[31.316,7.2874,-0.024191],[32.248,2.7309,-0.012604],[32.248,-2.1762,-0.001017],[32.869,-4.6298,-0.001017],[33.8,-6.7328,-0.024191],[33.8,-11.289,0.022156],[34.732,-17.248,0.010569],[37.217,-19,-0.012604],[39.701,-24.609,-0.024191],[42.807,-29.165,-0.012604],[42.497,-32.67,-0.024191],[42.807,-35.124,-0.047364],[40.633,-31.619,-0.035777],[35.975,-27.062,-0.035777],[32.248,-21.805,-0.001017],[26.036,-13.743,-0.001017],[18.893,-9.1863,-0.012604],[16.719,-10.939,0.010569],[16.719,-9.1863,-0.058951],[50.882,-13.743,0.45086],[49.019,-13.743,-0.001017],[45.913,-13.743,-0.001017],[42.186,-13.042,-0.001017],[37.838,-11.289,-0.001017],[32.248,-14.444,-0.001017],[25.104,-13.042,-0.001017],[18.893,-6.3823,-0.001017],[15.166,-2.5267,-0.012604],[12.371,2.0299,-0.024191],[12.371,10.091,-0.012604],[12.06,16.05,-0.001017],[12.992,25.163,-0.012604],[14.545,31.823,-0.012604],[17.34,33.575,-0.012604],[21.067,34.977,-0.001017],[26.347,35.678,0.045329],[28.21,36.73,0.045329],[31.937,32.874,0.022156],[33.8,24.813,0.010569],[35.043,17.452,0.022156],[34.732,13.246,-0.001017],[34.422,8.6895,-0.035777],[35.975,3.7824,-0.012604],[35.975,-1.4752,-0.001017],[37.838,-3.9287,-0.012604],[38.149,-5.6813,-0.024191],[36.906,-10.588,0.010569],[38.459,-17.949,0.010569],[40.633,-20.403,-0.012604],[41.565,-26.361,-0.012604],[42.807,-30.217,-0.024191],[40.633,-30.567,-0.035777],[38.459,-30.217,-0.047364],[35.664,-26.712,-0.035777],[31.316,-22.155,-0.012604],[29.142,-15.145,-0.001017],[25.725,-9.1863,0.010569],[21.377,-6.7328,-0.001017],[19.824,-6.7328,0.022156],[19.203,-3.9287,-0.093711],[45.602,-13.042,0.67101],[43.118,-13.042,-0.001017],[40.323,-12.341,-0.001017],[36.596,-10.588,-0.001017],[32.558,-8.4853,-0.001017],[28.21,-10.588,-0.001017],[22.93,-9.1863,-0.001017],[18.272,-4.2792,-0.001017],[15.476,-2.1762,-0.012604],[13.302,0.27732,-0.035777],[14.234,6.5864,-0.024191],[13.302,11.143,-0.001017],[13.923,18.153,-0.012604],[14.545,24.462,-0.024191],[16.097,26.916,-0.012604],[18.893,28.668,-0.001017],[22.93,30.07,0.045329],[26.347,33.225,0.033743],[30.695,31.122,0.010569],[33.8,24.462,-0.012604],[35.975,17.803,-0.001017],[36.285,13.597,-0.012604],[36.596,9.04,-0.035777],[38.77,3.4319,-0.024191],[38.77,-2.5267,-0.001017],[39.701,-5.3308,-0.012604],[39.701,-6.3823,-0.024191],[36.906,-10.939,-0.001017],[36.906,-16.547,-0.001017],[37.838,-17.248,-0.012604],[38.459,-18.65,-0.001017],[39.08,-21.805,-0.024191],[37.838,-23.557,-0.047364],[35.664,-24.609,-0.047364],[32.558,-21.805,-0.024191],[29.763,-17.598,-0.001017],[27.899,-13.042,-0.001017],[25.725,-9.5368,0.010569],[22.93,-7.7843,0.010569],[21.067,-6.7328,0.022156],[21.067,-4.6298,-0.16323],[39.08,-10.939,0.86798],[36.906,-10.939,-0.001017],[34.111,-9.8873,-0.001017],[30.695,-8.1348,-0.001017],[26.968,-6.0318,-0.001017],[24.173,-7.4338,-0.001017],[20.446,-6.3823,-0.001017],[17.029,-2.1762,-0.001017],[15.476,-1.8257,-0.012604],[13.923,-0.42369,-0.035777],[14.545,4.1329,-0.024191],[12.992,8.339,-0.012604],[12.681,14.298,-0.012604],[12.681,19.205,-0.024191],[13.923,21.308,-0.024191],[15.476,22.359,-0.001017],[18.582,22.359,0.033743],[22.93,25.864,0.022156],[27.278,26.215,-0.001017],[31.005,19.906,-0.012604],[32.558,15.7,-0.012604],[33.8,12.195,-0.024191],[35.043,7.9885,-0.035777],[36.906,3.4319,-0.024191],[36.285,-1.8257,-0.012604],[36.285,-3.9287,-0.012604],[35.664,-4.9803,-0.024191],[32.558,-8.8358,-0.001017],[30.695,-13.042,-0.001017],[30.074,-12.691,-0.001017],[30.384,-12.691,-0.001017],[31.316,-14.093,-0.012604],[30.384,-16.547,-0.035777],[29.142,-18.65,-0.035777],[27.278,-17.598,-0.012604],[26.036,-14.444,0.010569],[24.483,-11.289,-0.001017],[23.241,-8.4853,0.010569],[21.377,-7.4338,0.010569],[20.135,-6.3823,0.022156],[19.824,-4.6298,-0.23275],[32.869,-8.1348,1.007],[31.316,-8.4853,-0.001017],[28.21,-7.4338,-0.001017],[25.104,-6.0318,-0.001017],[21.998,-3.9287,-0.001017],[19.824,-4.9803,-0.012604],[17.029,-3.9287,-0.012604],[14.855,-1.4752,-0.012604],[14.545,-1.8257,-0.012604],[12.992,-0.42369,-0.035777],[13.302,3.4319,-0.024191],[11.128,7.2874,-0.012604],[9.5753,13.597,-0.012604],[8.6436,17.452,-0.035777],[10.196,18.153,-0.024191],[12.06,18.153,-0.012604],[13.923,15.349,0.010569],[18.582,17.102,0.010569],[22.93,17.803,-0.001017],[26.036,12.195,-0.024191],[26.657,10.792,-0.012604],[28.21,9.741,-0.024191],[30.074,5.5349,-0.035777],[30.695,4.1329,-0.024191],[29.763,1.3288,-0.012604],[28.831,0.62783,-0.024191],[27.278,-1.1247,-0.012604],[24.794,-4.2793,-0.001017],[20.135,-7.0833,-0.001017],[17.961,-7.7843,-0.001017],[17.961,-8.8358,-0.001017],[18.893,-8.8358,-0.001017],[17.961,-10.238,-0.012604],[18.582,-13.392,-0.024191],[19.203,-14.444,-0.001017],[19.824,-11.64,0.010569],[19.203,-9.5368,-0.001017],[18.582,-5.6813,-0.001017],[17.961,-4.6298,0.010569],[16.408,-3.9287,0.022156],[16.097,-2.1762,-0.30227],[26.657,-6.0318,1.0881],[24.794,-6.3823,-0.001017],[22.309,-5.3308,-0.001017],[19.824,-3.9287,-0.001017],[16.408,-2.1762,-0.001017],[15.166,-2.1762,-0.001017],[13.302,-1.8257,-0.012604],[12.371,-1.1247,-0.012604],[12.371,-1.8257,-0.012604],[12.371,-0.073181,-0.012604],[13.923,6.2359,-0.012604],[11.439,9.741,-0.001017],[8.333,12.545,-0.001017],[4.606,15.7,-0.024191],[5.5378,16.751,-0.024191],[7.4013,13.597,-0.012604],[10.196,9.04,-0.001017],[14.234,11.844,-0.001017],[18.272,15.349,-0.001017],[20.756,11.844,-0.012604],[21.067,10.792,-0.012604],[22.62,10.091,-0.012604],[23.862,6.9369,-0.012604],[23.862,4.4834,-0.012604],[21.998,2.7309,-0.012604],[20.756,2.3804,-0.012604],[18.582,0.97834,-0.012604],[15.476,-1.8257,-0.012604],[12.06,-3.9287,-0.001017],[10.818,-4.9803,-0.001017],[11.439,-6.0318,-0.001017],[12.681,-5.6813,-0.012604],[12.992,-6.3823,-0.012604],[14.855,-9.8873,-0.012604],[16.408,-12.691,-0.001017],[17.961,-10.588,0.010569],[18.582,-6.7328,-0.001017],[17.029,-3.5782,-0.001017],[16.097,-3.9287,0.010569],[14.545,-3.5782,0.010569],[13.923,-2.1762,-0.32544],[19.824,-3.5782,1.1461],[18.272,-3.9287,-0.001017],[16.097,-2.8772,-0.001017],[13.923,-1.8257,-0.001017],[11.128,-1.4752,-0.001017],[10.507,0.27732,-0.001017],[9.5753,0.27732,-0.012604],[8.9541,-1.1247,-0.012604],[9.5753,-1.4752,-0.012604],[12.371,0.97834,-0.001017],[14.855,10.091,-0.001017],[12.992,13.246,0.010569],[7.0907,11.494,-0.001017],[0.56851,13.597,-0.024191],[0.87909,15.349,-0.012604],[3.3637,9.741,-0.024191],[7.0907,3.0814,-0.012604],[9.2647,8.6895,-0.012604],[13.923,13.597,-0.001017],[15.476,13.597,-0.001017],[16.097,12.545,-0.001017],[17.34,11.143,0.010569],[17.34,9.04,0.010569],[16.719,4.8339,0.010569],[14.234,3.4319,-0.012604],[12.06,3.4319,-0.001017],[9.2647,2.3804,-0.001017],[6.4695,-0.42369,-0.012604],[4.9166,-1.1247,-0.012604],[4.9166,-2.5267,-0.001017],[7.4013,-3.5782,-0.012604],[8.6436,-2.5267,-0.012604],[10.818,-2.5267,-0.012604],[12.992,-7.4338,-0.001017],[15.166,-10.939,-0.001017],[17.029,-10.238,0.010569],[18.893,-3.5782,-0.012604],[16.719,-1.4752,-0.001017],[15.166,-3.9287,0.010569],[13.302,-3.9287,0.010569],[12.371,-2.5267,-0.33703],[0.25794,-0.77419,-0.001017],[0.87909,-0.77419,-0.001017],[1.1897,-2.5267,-0.001017],[1.1897,-2.5267,-0.001017],[0.25794,-1.4752,-0.001017],[0.87909,-0.42369,-0.001017],[0.25794,0.97833,-0.001017],[1.5003,1.6793,-0.001017],[1.1897,1.6793,-0.001017],[0.25794,0.27732,-0.001017],[-2.5373,-0.77419,-0.001017],[-3.469,-1.8257,-0.001017],[-2.8479,-5.6813,-0.001017],[-0.98438,-8.1348,-0.001017],[0.56851,-8.1348,-0.001017],[3.0531,-8.1348,-0.001017],[1.5003,-4.6298,-0.001017],[-0.36322,-0.77419,-0.001017],[1.5003,3.0814,-0.001017],[1.5003,3.7824,-0.001017],[1.5003,4.1329,-0.001017],[2.432,5.1844,-0.001017],[3.3637,4.8339,-0.001017],[1.5003,6.5864,-0.001017],[-1.295,5.5349,-0.001017],[-2.5373,6.2359,-0.001017],[-2.5373,4.1329,-0.001017],[-0.36322,2.3804,-0.001017],[2.432,1.6793,-0.001017],[3.0531,0.62783,-0.001017],[2.432,-1.8257,-0.001017],[3.6743,-3.2277,-0.001017],[4.2955,-4.2793,-0.001017],[2.7426,-4.2793,-0.001017],[1.1897,-3.2277,-0.001017],[2.1214,-2.1762,-0.001017],[2.432,-1.8257,-0.001017],[2.7426,-1.8257,-0.001017],[8.9541,-2.1762,-0.001017],[8.333,-0.42369,-0.001017],[6.7801,-0.42369,-0.001017],[5.2272,0.97834,-0.15164],[5.5378,3.0814,-0.012604],[4.9166,8.6895,-0.012604],[4.2955,8.339,-0.001017],[3.6743,4.4834,-0.012604],[4.606,4.8339,-0.012604],[3.6743,5.1844,-0.001017],[2.432,4.8339,-0.001017],[1.1897,2.7309,-0.001017],[0.25794,0.27732,-0.001017],[-2.5373,-0.77419,-0.001017],[-3.469,-1.8257,-0.001017],[-2.8479,-5.6813,-0.001017],[-0.98438,-8.1348,-0.001017],[0.56851,-8.1348,-0.001017],[3.0531,-8.1348,-0.001017],[1.5003,-4.6298,-0.001017],[-0.36322,-0.77419,-0.001017],[1.5003,3.0814,-0.001017],[2.1214,4.8339,-0.001017],[2.432,6.9369,0.010569],[1.5003,6.5864,-0.001017],[2.1214,10.792,-0.001017],[4.9166,8.339,0.022156],[4.606,7.6379,0.022156],[3.0531,9.3905,0.022156],[1.5003,11.143,0.010569],[1.1897,9.04,-0.001017],[2.432,5.5349,0.010569],[3.0531,2.3804,0.010569],[5.5378,-2.1762,-0.001017],[8.9541,-3.9287,-0.012604],[11.128,-8.1348,-0.001017],[10.507,-9.1863,0.010569],[10.196,-7.7843,-0.001017],[12.06,-4.9803,-0.012604],[13.302,-5.3308,-0.012604],[14.234,-6.0318,-0.024191],[15.166,-2.5267,-0.024191],[18.272,-1.4752,-0.012604],[17.029,-4.2793,-0.035777],[9.2647,0.97834,-0.25592],[8.6436,6.2359,-0.001017],[7.0907,9.3905,-0.012604],[5.5378,10.091,-0.012604],[4.606,10.442,-0.024191],[4.9166,11.143,-0.012604],[4.2955,10.792,0.010569],[2.7426,8.339,0.010569],[1.5003,4.8339,-0.001017],[0.87909,2.0299,0.010569],[-0.6738,-0.42369,0.010569],[-2.8479,-2.1762,-0.024191],[-2.2267,-5.3308,-0.024191],[-0.36322,-8.1348,-0.012604],[0.87909,-7.7843,-0.001017],[3.3637,-5.6813,0.010569],[4.9166,1.6793,0.080089],[4.606,7.2874,0.056916],[6.7801,7.9885,0.033743],[6.4695,8.6895,0.010569],[6.7801,9.04,0.033743],[8.0224,9.3905,0.022156],[8.9541,10.091,0.022156],[7.4013,11.494,0.010569],[7.0907,10.091,0.022156],[8.0224,12.545,0.045329],[8.9541,13.597,0.022156],[8.9541,10.442,-0.012604],[10.818,1.3288,0.022156],[12.371,-6.3823,0.022156],[14.855,-10.939,-0.012604],[16.408,-15.495,-0.024191],[18.582,-21.104,-0.001017],[19.824,-21.805,0.010569],[20.446,-16.897,-0.012604],[21.377,-11.289,-0.024191],[21.067,-9.5368,-0.024191],[23.241,-7.0833,-0.058951],[22.309,-7.4338,-0.058951],[20.135,-7.0833,-0.001017],[17.961,-6.7328,-0.12847],[14.545,-0.77419,-0.33703],[12.371,3.4319,-0.001017],[9.5753,8.339,-0.012604],[7.4013,10.792,-0.001017],[6.1589,12.545,-0.012604],[5.5378,12.545,-0.012604],[4.9166,12.195,0.022156],[3.3637,9.741,0.022156],[2.7426,6.2359,0.010569],[2.7426,3.4319,0.022156],[2.1214,1.6793,0.010569],[0.87909,-1.8257,-0.058951],[1.5003,-2.5267,-0.047364],[2.7426,-0.42369,-0.001017],[3.0531,6.2359,0.022156],[8.6436,11.143,0.10326],[9.5753,11.844,0.13802],[8.333,10.091,0.056916],[8.0224,8.6895,0.033743],[7.4013,7.2874,0.010569],[8.6436,7.9885,0.033743],[11.128,8.339,0.033743],[13.302,6.5864,0.033743],[12.992,5.5349,0.010569],[11.439,3.7824,0.022156],[11.439,5.1844,0.033743],[11.439,8.6895,0.033743],[12.371,6.5864,-0.001017],[14.234,-0.42369,0.033743],[16.719,-7.0833,0.022156],[19.203,-15.846,-0.012604],[21.377,-23.908,-0.035777],[23.241,-27.413,-0.012604],[24.794,-27.062,0.010569],[24.173,-23.557,-0.024191],[23.241,-17.949,-0.024191],[20.756,-13.743,-0.047364],[18.272,-6.7328,-0.082124],[15.166,-5.6813,-0.070537],[13.302,-6.3823,0.010569],[12.371,-5.6813,-0.17482],[23.241,-4.2792,-0.38338],[18.893,0.27732,-0.001017],[14.545,7.2874,-0.001017],[11.439,11.494,0.010569],[8.9541,13.597,-0.001017],[7.4013,13.947,-0.001017],[6.1589,13.597,0.033743],[4.606,11.143,0.022156],[4.606,7.9885,-0.001017],[4.606,5.5349,0.022156],[4.9166,4.1329,0.010569],[4.606,0.97834,-0.070537],[4.2955,3.4319,-0.035777],[5.5378,11.844,0.033743],[10.507,21.308,0.045329],[12.992,21.308,0.10326],[11.439,14.298,0.11485],[9.5753,12.195,0.033743],[11.128,11.494,0.033743],[12.992,10.091,0.022156],[13.302,10.442,0.033743],[17.029,8.6895,0.033743],[18.893,5.1844,0.033743],[19.824,2.7309,0.022156],[17.34,2.0299,0.022156],[16.097,2.3804,0.033743],[14.855,3.4319,0.022156],[14.855,2.0299,-0.001017],[16.719,-3.5782,0.045329],[18.582,-9.5368,0.022156],[21.067,-17.248,-0.012604],[25.725,-26.011,-0.035777],[28.21,-30.918,-0.012604],[29.763,-33.371,-0.001017],[28.831,-30.567,-0.024191],[25.725,-24.959,-0.035777],[20.446,-19.351,-0.058951],[14.545,-9.5368,-0.082124],[9.2647,-6.3823,-0.070537],[8.6436,-8.1348,0.010569],[8.6436,-6.3823,-0.19799],[31.005,-7.0833,-0.34862],[28.21,-6.0318,-0.001017],[24.794,-1.8257,-0.001017],[21.377,4.1329,0.010569],[17.029,9.3905,-0.001017],[12.681,13.947,0.010569],[9.5753,16.05,0.033743],[8.0224,14.999,0.022156],[6.7801,11.143,-0.001017],[6.4695,9.04,0.010569],[7.4013,6.9369,-0.001017],[6.7801,5.5349,-0.047364],[6.1589,12.896,-0.001017],[11.128,25.864,0.033743],[14.234,28.318,0.033743],[15.476,24.462,0.080089],[14.855,17.102,0.080089],[14.855,15.7,0.010569],[18.272,15.7,0.022156],[21.067,14.298,0.022156],[20.756,13.597,0.033743],[22.62,10.442,0.033743],[23.241,7.2874,0.022156],[24.173,4.1329,0.022156],[22.62,2.0299,0.033743],[21.998,1.3288,0.033743],[21.067,1.3288,0.010569],[19.824,-1.1247,-0.001017],[19.824,-6.0318,0.033743],[21.377,-12.341,0.022156],[24.173,-19.702,-0.012604],[28.21,-29.165,-0.035777],[30.384,-33.371,-0.012604],[32.248,-35.474,-0.012604],[32.248,-31.969,-0.035777],[28.521,-25.66,-0.024191],[21.377,-20.052,-0.047364],[13.923,-10.238,-0.070537],[6.4695,-8.1348,-0.058951],[3.6743,-12.341,0.010569],[3.6743,-10.588,-0.17482],[37.217,-8.8358,-0.25592],[34.732,-9.1863,-0.012604],[32.248,-6.7328,-0.001017],[28.521,-1.4752,-0.001017],[23.862,2.0299,-0.001017],[18.582,5.1844,0.010569],[13.302,8.339,0.022156],[10.507,11.143,0.022156],[8.6436,11.143,-0.001017],[7.4013,10.442,-0.001017],[8.333,9.741,-0.001017],[8.333,15.349,-0.024191],[8.6436,24.462,0.010569],[14.855,31.122,0.033743],[18.582,29.72,0.033743],[21.067,26.215,0.056916],[21.998,20.957,0.056916],[22.62,20.256,0.010569],[25.104,20.256,0.010569],[26.657,18.504,0.033743],[25.725,15.7,0.045329],[26.347,11.844,0.033743],[26.657,7.9885,0.022156],[27.278,5.1844,0.022156],[26.657,1.6793,0.033743],[26.657,-0.073181,0.022156],[26.347,-1.1247,0.010569],[26.036,-5.3308,-0.012604],[25.725,-9.5368,0.022156],[26.347,-14.093,0.022156],[28.521,-20.403,-0.012604],[32.248,-28.114,-0.035777],[34.422,-31.268,-0.001017],[35.664,-32.67,-0.012604],[33.8,-28.114,-0.035777],[29.142,-22.856,-0.001017],[21.377,-18.299,-0.035777],[13.302,-10.238,-0.058951],[6.4695,-10.238,-0.047364],[3.3637,-15.495,0.010569],[2.432,-14.444,-0.12847],[42.497,-10.238,-0.11688],[40.012,-10.939,-0.012604],[36.906,-9.5368,-0.001017],[32.869,-5.6813,-0.001017],[28.831,-3.9287,-0.001017],[24.173,-3.2277,0.010569],[17.34,-0.42369,0.010569],[12.992,4.1329,0.010569],[10.507,7.6379,-0.001017],[8.333,9.3905,-0.001017],[8.6436,12.195,-0.012604],[9.5753,21.658,-0.012604],[12.06,30.771,-0.001017],[18.582,33.575,0.010569],[22.93,31.472,0.022156],[25.725,28.668,0.045329],[26.657,25.163,0.045329],[28.21,25.514,0.010569],[30.074,24.112,0.010569],[30.384,21.308,0.033743],[29.763,17.102,0.045329],[30.384,12.195,0.033743],[30.384,7.6379,0.022156],[31.005,4.8339,0.022156],[30.695,0.97834,0.033743],[30.695,-1.8257,0.022156],[31.316,-3.9287,-0.001017],[31.937,-9.1863,-0.024191],[31.937,-13.743,0.010569],[31.316,-17.248,0.022156],[32.869,-22.506,-0.024191],[35.975,-28.114,-0.035777],[38.459,-30.567,-0.012604],[38.149,-30.918,-0.024191],[34.111,-26.011,-0.024191],[29.763,-21.104,0.010569],[21.998,-16.547,-0.024191],[14.545,-9.5368,-0.047364],[8.6436,-10.238,-0.024191],[6.1589,-15.145,0.010569],[4.9166,-14.093,-0.082124],[44.981,-11.64,0.056916],[42.807,-12.341,-0.012604],[40.012,-10.588,-0.001017],[35.975,-8.1348,-0.001017],[32.248,-7.0833,-0.012604],[27.899,-7.4338,-0.001017],[20.446,-4.9803,0.010569],[15.476,-1.8257,-0.001017],[12.371,0.97834,-0.001017],[8.9541,5.5349,-0.001017],[8.9541,13.947,-0.024191],[11.128,22.359,-0.012604],[15.476,30.07,-0.001017],[22.309,34.276,-0.001017],[25.104,33.926,0.010569],[26.968,31.472,0.033743],[27.899,29.72,0.033743],[29.142,30.421,0.022156],[31.937,27.266,0.022156],[32.869,23.06,0.033743],[33.179,17.803,0.045329],[34.732,11.844,0.022156],[34.732,6.9369,0.022156],[34.732,3.7824,0.010569],[34.111,-0.42369,0.022156],[34.732,-4.2793,0.010569],[35.664,-6.7328,-0.001017],[36.285,-11.64,-0.035777],[36.285,-17.248,-0.001017],[36.596,-21.454,0.010569],[37.838,-26.361,-0.024191],[38.77,-31.619,-0.047364],[39.701,-32.67,-0.024191],[38.149,-32.32,-0.024191],[34.422,-27.062,-0.012604],[29.142,-22.155,0.010569],[23.241,-16.547,-0.012604],[17.34,-8.4853,-0.024191],[12.371,-8.1348,-0.012604],[10.507,-10.939,0.010569],[10.196,-8.4853,-0.047364],[43.739,-11.64,0.26548],[40.944,-11.64,-0.012604],[37.838,-10.238,-0.001017],[33.179,-7.7843,-0.001017],[29.763,-7.0833,-0.001017],[25.104,-7.0833,-0.001017],[18.582,-4.6298,-0.001017],[14.855,-2.1762,-0.001017],[12.992,-0.42369,-0.001017],[11.128,3.0814,-0.001017],[11.439,10.091,-0.024191],[11.439,16.751,-0.024191],[12.681,22.009,-0.012604],[16.719,28.318,-0.012604],[20.135,31.472,0.010569],[23.862,32.874,0.022156],[26.968,33.926,0.033743],[30.384,34.627,0.022156],[33.8,30.771,0.010569],[36.596,26.565,0.033743],[36.906,20.607,0.022156],[38.77,14.999,0.010569],[39.08,8.339,0.010569],[39.08,5.5349,-0.001017],[38.77,1.3288,0.010569],[39.701,-3.9287,0.010569],[40.012,-6.3823,-0.001017],[40.633,-11.289,-0.035777],[40.323,-18.299,-0.001017],[40.633,-22.506,0.022156],[40.633,-27.062,-0.024191],[38.459,-29.516,-0.047364],[36.285,-28.114,-0.024191],[33.8,-26.712,-0.035777],[29.142,-22.155,-0.012604],[24.173,-17.598,0.010569],[20.135,-13.392,-0.001017],[17.961,-7.4338,-0.012604],[15.166,-6.3823,-0.001017],[14.234,-6.3823,0.010569],[13.923,-3.9287,-0.058951],[39.08,-10.939,0.45086],[36.596,-10.238,-0.001017],[33.179,-8.4853,-0.001017],[30.074,-6.0318,-0.001017],[26.347,-5.3308,-0.001017],[22.62,-5.3308,-0.001017],[17.34,-3.2277,-0.001017],[15.166,-1.8257,-0.012604],[14.545,-0.77419,-0.001017],[12.681,0.62783,-0.001017],[12.992,6.9369,-0.024191],[12.992,12.195,-0.024191],[13.302,16.05,-0.012604],[16.097,22.009,-0.012604],[18.272,25.864,-0.001017],[20.756,26.916,0.022156],[23.862,29.019,0.022156],[26.657,30.421,0.022156],[30.695,26.916,0.010569],[34.732,24.462,0.022156],[36.596,20.607,0.010569],[38.77,14.999,-0.001017],[39.08,7.9885,-0.001017],[40.323,4.4834,-0.001017],[39.701,-0.073181,0.010569],[39.08,-4.2792,0.010569],[38.77,-6.7328,-0.001017],[38.77,-10.939,-0.024191],[36.906,-15.846,-0.012604],[36.596,-17.598,0.022156],[37.217,-20.403,-0.012604],[35.975,-22.506,-0.047364],[33.179,-23.207,-0.024191],[30.695,-22.155,-0.035777],[26.968,-17.949,-0.012604],[23.241,-15.145,0.010569],[20.446,-11.289,-0.001017],[19.824,-7.4338,-0.012604],[17.961,-6.7328,-0.001017],[17.029,-6.0318,-0.001017],[16.719,-3.9287,-0.1053],[33.8,-9.5368,0.61308],[31.316,-8.4853,-0.001017],[28.831,-6.0318,-0.001017],[25.104,-3.9287,-0.001017],[22.309,-2.8772,-0.001017],[19.824,-3.5782,-0.001017],[16.097,-1.8257,-0.001017],[14.545,-1.1247,-0.012604],[14.545,-1.1247,-0.001017],[12.681,-0.77419,-0.001017],[12.992,4.4834,-0.024191],[12.371,9.741,-0.012604],[12.681,12.896,-0.024191],[14.234,18.153,-0.012604],[15.166,20.607,-0.001017],[17.029,21.308,0.010569],[18.582,23.06,0.022156],[20.446,24.462,0.022156],[24.794,20.607,-0.001017],[29.763,19.205,0.010569],[31.316,16.751,-0.001017],[33.179,11.844,-0.012604],[34.111,6.2359,-0.012604],[35.043,3.4319,-0.012604],[34.422,0.97834,-0.001017],[33.8,-1.8257,-0.001017],[33.179,-4.2793,-0.001017],[32.558,-7.7843,-0.024191],[30.074,-10.238,-0.012604],[29.142,-12.341,0.010569],[30.074,-14.093,-0.012604],[30.074,-15.846,-0.035777],[27.899,-18.299,-0.024191],[25.725,-17.949,-0.024191],[23.862,-15.145,-0.012604],[20.756,-13.042,0.010569],[18.893,-10.238,-0.001017],[18.582,-6.7328,-0.001017],[17.961,-6.0318,-0.001017],[17.029,-5.3308,-0.001017],[16.719,-3.5782,-0.15164],[28.21,-7.4338,0.74053],[26.036,-5.6813,-0.001017],[23.862,-3.5782,-0.001017],[20.446,-1.8257,-0.001017],[17.961,-1.4752,-0.001017],[16.097,-2.5267,-0.001017],[13.302,-1.4752,-0.001017],[12.681,-1.1247,-0.012604],[12.992,-1.4752,-0.001017],[11.128,-1.4752,-0.001017],[11.128,3.4319,-0.012604],[9.5753,9.3905,-0.012604],[8.9541,12.896,-0.024191],[10.196,16.751,-0.024191],[10.507,17.452,-0.012604],[12.371,17.803,0.010569],[12.681,18.854,0.010569],[12.992,17.803,0.010569],[16.719,13.597,-0.001017],[20.756,11.844,-0.001017],[21.377,9.741,-0.012604],[24.173,6.9369,-0.024191],[25.104,3.4319,-0.012604],[25.725,3.0814,-0.012604],[24.794,4.4834,-0.012604],[24.483,3.0814,-0.012604],[24.794,0.97834,-0.001017],[23.862,-1.8257,-0.012604],[20.446,-3.5782,-0.012604],[18.893,-6.3823,0.010569],[19.203,-9.1863,-0.001017],[20.135,-10.939,-0.012604],[18.893,-13.392,-0.012604],[18.582,-15.145,-0.012604],[18.272,-13.743,-0.012604],[15.476,-11.289,0.010569],[14.545,-8.4853,-0.001017],[14.855,-4.9803,-0.001017],[14.545,-3.9287,-0.001017],[14.234,-3.5782,-0.012604],[13.923,-1.8257,-0.19799],[22.62,-4.9803,0.82164],[20.756,-3.5782,-0.001017],[18.582,-1.8257,-0.001017],[16.097,-0.073181,-0.001017],[14.234,-0.073181,-0.001017],[12.371,-1.4752,-0.001017],[10.818,-0.42369,-0.012604],[10.196,-0.42369,-0.012604],[10.507,-1.1247,-0.001017],[8.9541,-1.8257,-0.001017],[9.5753,3.4319,-0.012604],[8.0224,10.442,-0.001017],[6.7801,13.246,-0.012604],[6.7801,15.349,-0.012604],[6.4695,14.298,-0.012604],[8.333,12.896,-0.001017],[8.9541,12.195,-0.001017],[8.9541,11.844,0.010569],[12.371,9.741,-0.001017],[15.476,10.091,-0.012604],[16.719,9.3905,-0.012604],[18.582,6.5864,-0.012604],[18.893,3.7824,-0.012604],[19.203,3.4319,-0.012604],[17.961,4.8339,-0.012604],[17.34,3.7824,-0.012604],[17.029,2.3804,-0.012604],[16.097,0.27732,-0.012604],[13.302,-0.77419,-0.012604],[12.681,-3.5782,-0.001017],[13.302,-5.6813,-0.012604],[14.855,-7.0833,-0.012604],[14.855,-9.5368,-0.001017],[16.408,-12.691,-0.012604],[16.719,-12.691,-0.012604],[14.234,-10.939,-0.001017],[12.992,-6.3823,-0.001017],[13.923,-2.5267,-0.001017],[13.302,-2.8772,-0.001017],[12.992,-2.8772,-0.012604],[12.681,-1.8257,-0.20958],[17.029,-2.1762,0.86798],[15.166,-1.8257,-0.001017],[14.234,-0.77419,-0.001017],[12.06,0.97834,-0.001017],[10.507,0.97834,-0.001017],[8.9541,-0.073181,-0.001017],[8.6436,0.62783,-0.012604],[8.0224,0.62783,-0.012604],[7.4013,-0.77419,-0.001017],[6.7801,-2.1762,-0.001017],[8.6436,3.4319,-0.001017],[6.1589,11.844,0.010569],[5.2272,13.947,0.010569],[3.3637,13.597,-0.012604],[3.0531,11.844,-0.012604],[4.9166,7.6379,-0.012604],[6.1589,5.1844,-0.012604],[6.1589,6.2359,-0.001017],[9.2647,6.5864,-0.001017],[12.06,9.741,-0.012604],[12.992,11.494,-0.012604],[14.545,7.9885,-0.012604],[14.234,4.4834,-0.012604],[14.234,4.4834,-0.001017],[11.439,4.1329,-0.012604],[11.128,2.7309,-0.012604],[9.5753,2.3804,-0.012604],[8.6436,1.3288,-0.001017],[7.4013,0.62783,-0.012604],[7.4013,-1.1247,-0.012604],[8.6436,-2.1762,-0.012604],[11.128,-2.8772,-0.001017],[12.681,-6.3823,-0.012604],[15.476,-10.238,-0.012604],[16.408,-11.64,-0.001017],[14.545,-11.289,-0.001017],[12.681,-3.9287,-0.001017],[13.923,-0.42369,-0.001017],[13.302,-3.5782,-0.001017],[12.371,-3.5782,-0.001017],[12.06,-2.5267,-0.20958],[-0.6738,-1.1247,-0.001017],[0.25794,-0.77419,-0.001017],[-0.6738,-1.8257,-0.001017],[1.1897,-2.1762,-0.001017],[0.56851,-3.2277,-0.001017],[0.56851,-0.77419,-0.001017],[0.25794,0.27732,-0.001017],[1.5003,1.3288,-0.001017],[1.5003,1.3288,-0.001017],[0.56851,0.62783,-0.001017],[-0.36322,-0.073182,-0.001017],[-1.6055,-0.42369,-0.001017],[-3.469,-3.2277,-0.001017],[-3.7796,-4.6298,-0.001017],[-3.1584,-8.1348,-0.001017],[-0.6738,-11.64,-0.001017],[-0.36322,-10.939,-0.001017],[2.432,-5.6813,-0.001017],[3.6743,-3.5782,-0.001017],[3.6743,-0.77419,-0.001017],[4.2955,0.97833,-0.001017],[0.56851,2.7309,-0.001017],[-1.295,2.3804,-0.001017],[-2.2267,0.97833,-0.001017],[-2.8479,1.6793,-0.001017],[-2.2267,0.97833,-0.001017],[0.56851,2.0299,-0.001017],[2.7426,0.97833,-0.001017],[3.0531,-1.1247,-0.001017],[3.6743,-3.2277,-0.001017],[6.1589,-4.9803,-0.001017],[5.5378,-4.6298,-0.001017],[3.3637,-4.9803,-0.001017],[0.87909,-3.2277,-0.001017],[0.25794,-3.2277,-0.001017],[0.87909,-3.2277,-0.001017],[2.1214,-2.1762,-0.001017],[2.7426,-1.8257,-0.001017],[5.5378,-1.8257,-0.001017],[8.6436,-1.8257,-0.001017],[6.1589,-0.77419,-0.001017],[1.5003,0.97834,-0.12847],[2.432,2.3804,-0.012604],[2.432,9.3905,-0.012604],[2.432,9.3905,-0.012604],[2.432,9.04,-0.012604],[3.0531,5.1844,-0.012604],[2.7426,4.8339,-0.012604],[2.7426,5.5349,-0.012604],[2.1214,3.4319,-0.001017],[0.56851,1.6793,-0.001017],[-0.6738,0.62783,-0.001017],[-2.2267,-0.42369,-0.001017],[-3.469,-3.2277,-0.001017],[-3.7796,-4.6298,-0.001017],[-3.1584,-8.1348,-0.001017],[-0.6738,-11.64,-0.001017],[-0.36322,-10.939,-0.001017],[2.432,-6.7328,-0.001017],[4.2955,-2.1762,0.010569],[3.6743,1.6793,0.010569],[4.9166,1.6793,0.022156],[3.0531,6.2359,0.022156],[3.6743,4.1329,0.033743],[1.5003,7.6379,0.033743],[-0.36322,9.04,0.033743],[-2.2267,8.339,0.022156],[-0.6738,8.6895,-0.001017],[1.5003,6.2359,-0.001017],[2.1214,2.7309,0.010569],[4.606,-0.77419,-0.001017],[7.0907,-3.5782,-0.001017],[8.333,-6.7328,0.010569],[8.6436,-10.238,0.010569],[8.333,-9.8873,-0.001017],[8.333,-7.7843,-0.001017],[9.5753,-5.3308,-0.012604],[11.439,-4.2793,-0.012604],[12.681,-3.2277,-0.024191],[14.545,-4.9803,-0.024191],[14.545,-3.5782,-0.001017],[16.097,-2.5267,-0.035777],[3.3637,1.3288,-0.24434],[3.3637,4.8339,-0.012604],[3.0531,10.091,-0.012604],[3.3637,12.545,-0.024191],[3.0531,11.143,-0.024191],[3.0531,10.442,-0.012604],[2.7426,10.442,-0.012604],[2.7426,9.3905,-0.012604],[2.1214,5.1844,0.010569],[1.1897,2.3804,-0.001017],[0.56851,0.97834,-0.001017],[-0.98438,-0.42369,-0.012604],[-3.1584,-4.2793,-0.012604],[-3.469,-5.6813,-0.024191],[-1.295,-7.4338,-0.035777],[2.1214,-8.4853,0.010569],[3.0531,-1.8257,0.045329],[5.2272,3.0814,0.033743],[7.4013,6.2359,0.056916],[8.0224,8.6895,0.033743],[8.9541,9.04,0.045329],[7.4013,7.9885,0.033743],[7.0907,9.04,0.033743],[7.0907,12.545,0.033743],[8.333,12.195,0.045329],[8.333,12.195,0.033743],[9.2647,11.143,0.010569],[10.196,7.2874,0.010569],[10.818,-0.42369,0.010569],[12.992,-5.6813,-0.001017],[12.681,-12.341,-0.012604],[13.923,-17.598,0.033743],[14.545,-22.155,0.033743],[14.545,-20.052,0.010569],[15.166,-17.598,-0.012604],[15.476,-12.691,-0.012604],[16.097,-8.4853,-0.001017],[17.34,-5.6813,-0.047364],[19.824,-4.6298,-0.047364],[18.582,-5.6813,-0.001017],[17.34,-7.4338,-0.12847],[6.4695,0.97834,-0.33703],[5.5378,4.8339,-0.012604],[4.2955,9.3905,-0.012604],[3.6743,12.195,-0.024191],[3.0531,12.545,-0.012604],[3.0531,12.545,-0.012604],[2.432,12.545,-0.012604],[2.7426,10.792,-0.012604],[2.432,6.9369,0.010569],[2.432,3.4319,-0.001017],[2.7426,1.6793,-0.001017],[2.1214,-0.073181,-0.024191],[0.56851,-2.1762,-0.024191],[1.1897,-2.1762,-0.047364],[2.7426,1.3288,-0.024191],[6.4695,7.2874,0.056916],[8.6436,12.195,0.10326],[11.128,10.091,0.045329],[13.302,9.3905,0.056916],[13.302,9.04,0.022156],[13.302,7.9885,0.045329],[13.923,6.9369,0.045329],[14.234,6.9369,0.033743],[13.923,7.6379,0.022156],[12.06,6.9369,0.033743],[12.06,7.6379,0.033743],[12.992,9.04,0.010569],[14.545,5.1844,0.022156],[16.408,-2.1762,0.010569],[18.272,-9.8873,-0.001017],[19.203,-19.351,-0.001017],[18.893,-26.011,0.033743],[19.824,-28.464,0.022156],[19.203,-26.011,-0.001017],[18.272,-22.506,-0.024191],[17.029,-16.897,-0.012604],[14.855,-9.8873,-0.012604],[12.06,-5.6813,-0.058951],[12.371,-4.2793,-0.058951],[11.128,-5.3308,-0.001017],[10.818,-6.7328,-0.17482],[12.371,0.27732,-0.41814],[9.5753,4.1329,-0.001017],[7.4013,8.6895,-0.012604],[5.2272,12.545,-0.024191],[4.2955,14.298,-0.012604],[3.3637,14.298,-0.012604],[2.7426,14.999,-0.012604],[3.0531,12.195,-0.012604],[3.0531,8.6895,-0.001017],[4.2955,4.8339,-0.001017],[5.5378,3.4319,-0.012604],[5.5378,1.3288,-0.035777],[4.9166,0.97834,-0.024191],[5.2272,7.6379,-0.024191],[8.0224,14.298,0.010569],[12.06,19.555,0.080089],[13.302,17.803,0.080089],[12.992,13.246,0.022156],[13.302,11.494,0.045329],[14.855,9.741,-0.001017],[15.476,9.04,0.033743],[17.961,6.5864,0.045329],[18.272,7.2874,0.033743],[17.029,6.2359,0.010569],[15.166,4.1329,0.033743],[14.855,3.4319,0.022156],[14.855,4.8339,-0.001017],[16.097,2.0299,0.010569],[17.961,-3.9287,-0.001017],[19.824,-10.238,-0.001017],[22.309,-19.702,-0.001017],[23.862,-28.815,0.022156],[25.104,-34.072,0.010569],[24.794,-33.021,-0.024191],[22.93,-27.413,-0.035777],[19.824,-21.454,-0.024191],[15.476,-14.444,-0.024191],[10.818,-7.0833,-0.058951],[10.818,-5.3308,-0.058951],[8.6436,-6.0318,-0.001017],[8.0224,-6.0318,-0.19799],[22.62,-3.9287,-0.42972],[19.824,-1.4752,-0.001017],[16.097,1.6793,-0.012604],[12.371,8.339,-0.024191],[8.6436,14.298,-0.012604],[6.7801,16.751,-0.001017],[5.2272,18.153,-0.001017],[5.5378,15.7,-0.001017],[5.2272,11.494,-0.001017],[6.7801,7.6379,-0.012604],[8.0224,6.2359,-0.012604],[8.6436,5.5349,-0.024191],[8.0224,9.741,-0.012604],[10.818,19.906,0.010569],[12.992,24.462,0.033743],[15.166,25.163,0.056916],[15.166,20.607,0.056916],[16.097,16.401,0.010569],[17.34,14.298,0.022156],[20.135,12.545,-0.012604],[21.377,11.143,0.022156],[24.173,7.9885,0.033743],[24.483,6.9369,0.033743],[23.241,5.1844,0.010569],[22.309,2.0299,0.022156],[21.377,1.6793,0.022156],[19.824,2.7309,-0.001017],[18.582,0.27732,0.010569],[19.203,-5.3308,-0.001017],[20.446,-13.392,-0.012604],[22.93,-23.557,-0.012604],[26.036,-33.722,-0.001017],[27.899,-36.876,-0.001017],[28.831,-35.474,-0.035777],[27.278,-28.815,-0.047364],[23.862,-21.104,-0.024191],[17.961,-14.794,-0.024191],[12.371,-8.1348,-0.047364],[10.818,-7.0833,-0.047364],[7.0907,-8.4853,-0.001017],[5.5378,-9.5368,-0.17482],[29.763,-6.0318,-0.37179],[26.657,-4.6298,-0.012604],[22.62,-2.1762,-0.012604],[18.893,2.0299,-0.024191],[15.166,7.2874,-0.012604],[11.439,10.442,-0.001017],[8.6436,13.246,-0.001017],[8.333,14.999,-0.001017],[7.4013,11.844,-0.001017],[8.333,9.3905,-0.001017],[8.9541,9.3905,-0.012604],[10.507,12.896,-0.012604],[10.818,21.658,0.010569],[13.923,27.967,0.033743],[17.34,28.668,0.033743],[20.135,27.617,0.033743],[21.067,23.411,0.033743],[22.93,19.906,-0.001017],[24.794,18.504,0.022156],[26.657,17.102,-0.012604],[26.968,14.298,0.022156],[28.831,11.143,0.033743],[29.142,8.339,0.033743],[28.521,6.2359,0.010569],[28.21,2.0299,0.022156],[27.899,0.27732,0.022156],[26.657,-0.42369,-0.001017],[25.725,-3.5782,0.010569],[24.794,-7.7843,-0.012604],[24.794,-14.444,-0.012604],[26.968,-23.207,-0.024191],[30.384,-31.969,-0.024191],[32.248,-34.072,-0.001017],[32.248,-32.32,-0.035777],[29.142,-26.011,-0.047364],[25.725,-17.949,-0.024191],[18.893,-13.392,-0.024191],[12.681,-8.4853,-0.035777],[11.128,-8.4853,-0.024191],[7.4013,-11.289,-0.012604],[5.5378,-13.392,-0.14006],[34.732,-7.0833,-0.25592],[31.937,-6.7328,-0.012604],[27.899,-5.3308,-0.012604],[24.483,-2.5267,-0.024191],[21.067,-0.073181,-0.012604],[17.029,2.7309,-0.001017],[12.681,6.2359,-0.012604],[10.818,9.3905,-0.012604],[9.2647,9.3905,-0.001017],[8.9541,9.3905,-0.001017],[9.5753,11.844,-0.012604],[12.371,18.504,-0.012604],[14.855,28.668,0.022156],[18.582,32.173,0.033743],[22.309,31.122,0.022156],[25.725,30.07,0.022156],[26.968,26.916,0.022156],[28.521,24.462,-0.001017],[30.384,22.71,0.022156],[31.316,20.607,-0.001017],[31.316,17.102,0.022156],[32.558,13.246,0.033743],[33.179,9.04,0.045329],[32.869,6.2359,0.010569],[32.558,1.3288,0.010569],[32.869,-1.8257,0.010569],[32.869,-3.9287,-0.001017],[32.558,-7.7843,-0.001017],[31.316,-11.64,-0.012604],[30.695,-17.248,-0.024191],[32.248,-24.609,-0.047364],[34.111,-30.918,-0.035777],[34.732,-31.619,-0.012604],[34.111,-29.516,-0.035777],[30.074,-23.557,-0.035777],[26.036,-16.196,-0.012604],[19.203,-11.64,-0.012604],[13.302,-7.7843,-0.024191],[12.371,-8.1348,-0.012604],[8.9541,-11.289,-0.012604],[7.0907,-13.042,-0.11688],[38.149,-8.4853,-0.1053],[34.732,-8.4853,-0.012604],[31.937,-6.7328,-0.012604],[28.521,-4.9803,-0.012604],[25.104,-3.5782,-0.012604],[21.067,-1.8257,-0.001017],[16.097,-0.073181,-0.012604],[13.302,0.97834,-0.012604],[10.818,4.4834,-0.001017],[10.507,7.9885,0.010569],[10.818,12.896,-0.012604],[14.234,19.906,-0.012604],[18.893,27.266,0.022156],[24.483,32.173,0.022156],[27.278,33.225,-0.001017],[29.142,32.874,0.010569],[30.384,30.421,0.010569],[31.005,28.668,-0.001017],[32.248,26.215,0.022156],[33.8,22.71,-0.001017],[34.422,18.153,0.022156],[36.285,13.597,0.033743],[37.217,9.04,0.033743],[36.906,4.8339,0.010569],[36.906,-0.073181,0.010569],[37.838,-4.2793,0.010569],[38.149,-6.7328,-0.001017],[38.149,-11.289,-0.001017],[37.838,-16.196,-0.012604],[36.596,-22.155,-0.024191],[36.596,-28.464,-0.058951],[35.664,-31.619,-0.047364],[34.732,-31.619,-0.012604],[33.179,-29.516,-0.024191],[28.831,-23.557,-0.024191],[24.794,-16.547,-0.001017],[19.203,-11.289,-0.001017],[14.545,-7.0833,-0.001017],[12.992,-5.6813,-0.012604],[10.818,-7.4338,-0.024191],[8.9541,-7.7843,-0.1053],[36.596,-8.4853,0.080089],[33.179,-8.1348,-0.012604],[30.384,-6.7328,-0.012604],[26.657,-4.6298,-0.012604],[23.862,-2.8772,-0.012604],[19.824,-1.8257,-0.001017],[15.166,-0.77419,-0.012604],[13.302,-0.42369,-0.012604],[12.371,2.0299,-0.001017],[12.992,4.4834,-0.001017],[12.992,9.3905,-0.012604],[14.234,15.349,-0.012604],[15.476,20.607,0.010569],[18.582,25.864,0.010569],[21.067,29.019,-0.001017],[24.794,31.122,0.010569],[28.831,32.874,-0.001017],[31.937,31.823,-0.001017],[33.8,29.019,0.022156],[36.285,25.163,0.010569],[37.838,19.906,0.010569],[40.323,16.401,0.022156],[41.565,11.143,0.033743],[41.565,6.2359,0.010569],[41.876,0.62783,-0.001017],[42.807,-4.2793,-0.001017],[42.807,-7.4338,-0.001017],[43.118,-12.341,-0.012604],[42.497,-16.897,-0.012604],[40.633,-22.155,-0.024191],[38.77,-27.413,-0.058951],[33.8,-28.114,-0.047364],[31.937,-25.66,-0.012604],[29.142,-24.258,-0.012604],[24.173,-18.299,-0.024191],[20.446,-13.392,-0.012604],[15.476,-10.939,-0.001017],[13.923,-7.4338,-0.001017],[12.992,-4.6298,-0.001017],[12.06,-4.6298,-0.024191],[11.128,-3.5782,-0.093711],[32.869,-8.1348,0.2423],[30.074,-7.7843,-0.012604],[27.278,-5.3308,-0.012604],[24.483,-3.2277,-0.012604],[21.377,-1.8257,-0.001017],[18.272,-1.1247,-0.001017],[15.166,-0.42369,-0.012604],[14.234,-1.1247,-0.012604],[13.923,0.62783,-0.001017],[14.545,2.0299,-0.001017],[14.545,5.5349,-0.012604],[14.855,10.793,-0.012604],[15.166,16.05,-0.001017],[17.34,20.957,-0.001017],[18.893,24.112,-0.001017],[21.998,25.864,-0.001017],[24.794,26.916,-0.001017],[28.21,26.916,-0.001017],[30.695,24.462,0.022156],[33.179,21.658,0.010569],[35.664,18.854,0.010569],[38.459,15.349,0.010569],[39.08,10.442,0.022156],[39.08,4.8339,0.010569],[40.012,-0.42369,-0.001017],[40.012,-4.9803,-0.001017],[39.08,-7.0833,-0.001017],[38.77,-10.238,-0.012604],[37.838,-13.743,-0.024191],[36.285,-17.598,-0.024191],[35.043,-21.805,-0.035777],[32.248,-22.155,-0.035777],[30.074,-20.052,-0.012604],[27.278,-19.702,-0.012604],[23.862,-15.495,-0.012604],[20.446,-10.588,-0.012604],[17.029,-9.8873,-0.001017],[16.408,-7.4338,0.010569],[15.166,-4.9803,-0.001017],[14.234,-4.2792,-0.024191],[13.302,-2.5267,-0.11688],[28.21,-7.0833,0.38134],[25.725,-6.3823,-0.012604],[23.241,-3.5782,-0.012604],[21.067,-1.4752,-0.012604],[18.893,-0.77419,-0.001017],[16.408,-0.42369,-0.001017],[13.923,-0.42369,-0.001017],[13.302,-1.4752,-0.012604],[13.302,-0.073181,-0.012604],[13.923,0.97834,-0.001017],[13.923,3.7824,-0.012604],[13.923,8.6895,-0.012604],[14.234,13.597,-0.001017],[14.855,18.504,-0.001017],[15.476,20.256,-0.001017],[17.34,21.308,-0.001017],[18.582,21.658,-0.001017],[21.067,21.308,0.010569],[23.241,18.504,0.022156],[26.036,17.102,0.010569],[28.21,15.349,-0.001017],[30.384,11.844,-0.001017],[31.005,7.9885,0.010569],[31.316,4.1329,0.010569],[32.248,0.97834,-0.001017],[32.248,-1.8257,-0.001017],[31.937,-3.9287,-0.001017],[31.316,-6.3823,-0.012604],[29.763,-8.4853,-0.024191],[28.831,-11.64,-0.012604],[29.142,-15.846,-0.024191],[27.899,-16.547,-0.024191],[26.657,-15.495,-0.012604],[24.483,-17.248,-0.001017],[21.998,-13.743,-0.012604],[19.203,-8.8358,-0.001017],[16.719,-9.1863,-0.001017],[16.097,-7.0833,-0.001017],[14.855,-4.2793,-0.001017],[14.545,-3.5782,-0.024191],[13.923,-2.1762,-0.14006],[22.62,-5.3308,0.48562],[20.446,-4.2793,-0.012604],[18.893,-1.4752,-0.012604],[17.029,0.27732,-0.001017],[16.097,0.27732,-0.001017],[13.923,0.27732,-0.001017],[11.128,-0.073181,-0.001017],[11.439,-1.8257,-0.001017],[12.06,-0.42369,-0.012604],[11.439,0.97834,-0.001017],[10.818,3.4319,-0.001017],[10.818,9.04,-0.001017],[10.507,13.597,-0.012604],[10.818,17.803,-0.001017],[10.507,18.504,-0.001017],[10.818,18.504,-0.001017],[11.128,18.854,-0.001017],[12.371,17.102,0.010569],[13.923,13.246,0.010569],[14.855,11.844,-0.001017],[16.408,9.04,-0.001017],[16.719,6.5864,-0.001017],[17.961,5.1844,-0.001017],[18.582,4.4834,-0.001017],[19.203,4.8339,-0.012604],[21.067,3.4319,-0.001017],[21.998,2.0299,-0.001017],[22.309,-0.77419,-0.012604],[20.446,-2.5267,-0.024191],[20.135,-6.0318,-0.012604],[21.998,-11.289,-0.012604],[21.067,-12.691,-0.012604],[21.377,-11.64,-0.001017],[20.135,-16.196,-0.001017],[17.961,-12.341,-0.001017],[15.166,-7.4338,-0.001017],[12.681,-8.8358,-0.001017],[12.371,-6.0318,-0.001017],[11.439,-3.2277,-0.001017],[12.06,-2.1762,-0.024191],[12.06,-1.4752,-0.16323],[18.272,-2.8772,0.53197],[16.719,-2.1762,-0.012604],[15.166,-0.42369,-0.001017],[13.923,0.97834,-0.001017],[12.992,1.3288,-0.001017],[11.128,1.3288,-0.001017],[9.2647,0.62783,-0.001017],[9.5753,-1.4752,-0.001017],[10.196,-0.77419,-0.012604],[9.5753,0.62783,-0.001017],[8.6436,5.1844,-0.001017],[8.0224,10.442,-0.001017],[7.4013,12.195,-0.012604],[7.4013,15.7,-0.001017],[7.0907,15.349,-0.001017],[7.0907,13.246,-0.001017],[7.0907,12.195,-0.001017],[8.333,10.792,0.010569],[9.2647,8.6895,-0.001017],[9.5753,8.6895,-0.001017],[11.439,7.9885,-0.012604],[12.371,6.2359,-0.012604],[12.371,4.8339,-0.001017],[12.371,4.4834,-0.001017],[12.992,4.4834,-0.012604],[14.234,3.4319,-0.012604],[14.545,2.7309,-0.001017],[14.855,0.62783,-0.012604],[14.234,-0.42369,-0.012604],[14.234,-2.5267,-0.012604],[16.719,-7.7843,-0.012604],[17.34,-8.4853,-0.012604],[18.893,-8.4853,-0.012604],[18.893,-14.093,-0.001017],[17.029,-11.289,-0.001017],[14.234,-6.3823,-0.001017],[10.818,-6.7328,-0.001017],[11.439,-5.3308,-0.001017],[12.06,-3.5782,-0.001017],[12.06,-2.8772,-0.024191],[11.439,-2.1762,-0.16323],[14.234,-1.1247,0.56673],[12.992,-0.77419,-0.012604],[12.06,0.62783,-0.001017],[10.818,1.6793,-0.001017],[10.507,2.0299,-0.001017],[8.9541,2.3804,-0.001017],[7.4013,1.6793,-0.001017],[8.0224,-0.42369,-0.001017],[8.333,-1.1247,-0.001017],[8.0224,0.27732,-0.001017],[6.4695,7.9885,-0.001017],[4.606,12.896,-0.001017],[4.9166,10.442,-0.001017],[4.606,12.545,-0.001017],[4.2955,11.494,-0.001017],[3.6743,7.9885,-0.012604],[4.2955,4.4834,-0.001017],[5.5378,3.7824,-0.001017],[6.4695,3.4319,-0.001017],[6.4695,6.2359,-0.001017],[9.2647,8.339,-0.012604],[10.507,6.9369,-0.012604],[9.5753,5.5349,-0.012604],[8.6436,4.4834,-0.001017],[8.333,3.0814,-0.012604],[8.333,1.6793,-0.012604],[8.6436,2.0299,-0.001017],[8.333,0.97834,-0.012604],[8.333,0.97834,-0.012604],[8.9541,-0.42369,-0.012604],[12.681,-4.6298,-0.012604],[14.855,-4.9803,-0.012604],[17.34,-5.3308,-0.012604],[18.582,-11.64,-0.001017],[17.34,-10.939,-0.001017],[13.923,-5.3308,-0.001017],[10.196,-3.9287,-0.001017],[12.06,-4.2793,-0.001017],[12.992,-4.2793,-0.001017],[12.681,-4.6298,-0.012604],[12.06,-3.9287,-0.16323],[-2.2267,-0.42369,-0.001017],[-1.6055,-0.42369,-0.001017],[-1.6055,-0.77419,-0.001017],[0.56851,-1.8257,-0.001017],[0.25794,-2.5267,-0.001017],[0.87909,-0.073182,-0.001017],[0.25794,2.3804,-0.001017],[0.56851,2.7309,-0.001017],[2.1214,2.0299,-0.001017],[1.1897,1.3288,-0.001017],[-0.36322,0.27732,-0.001017],[0.25794,0.97833,-0.001017],[-0.6738,-1.4752,-0.001017],[-1.295,-2.1762,-0.001017],[-0.6738,-3.9287,-0.001017],[0.56851,-4.9803,-0.001017],[-0.36322,-7.4338,-0.001017],[0.25794,-6.3823,-0.001017],[0.25794,-6.7328,-0.001017],[-0.36322,-6.0318,-0.001017],[-1.295,-4.6298,-0.001017],[-3.1584,-3.2277,-0.001017],[-3.469,-1.4752,-0.001017],[-4.4008,-0.77419,-0.001017],[-1.295,-1.4752,-0.001017],[1.5003,-1.8257,-0.001017],[2.7426,-1.1247,-0.001017],[4.9166,-3.2277,-0.001017],[8.0224,-4.2793,-0.001017],[8.6436,-4.6298,-0.001017],[6.7801,-4.9803,-0.001017],[3.0531,-5.3308,-0.001017],[0.87909,-5.6813,-0.001017],[-0.6738,-4.6298,-0.001017],[-1.295,-4.6298,-0.001017],[-0.6738,-4.6298,-0.001017],[0.56851,-3.2277,-0.001017],[2.432,-1.8257,-0.001017],[3.0531,-1.1247,-0.001017],[6.4695,-1.8257,-0.001017],[8.0224,-1.4752,-0.001017],[-3.1584,1.3288,-0.11688],[-2.8479,5.1844,-0.012604],[-2.5373,8.6895,-0.012604],[-0.36322,9.3905,-0.024191],[0.56851,9.04,-0.012604],[2.1214,5.5349,-0.012604],[2.1214,6.5864,-0.012604],[2.7426,6.2359,-0.012604],[2.7426,4.1329,-0.012604],[2.1214,2.3804,-0.001017],[0.25794,1.3288,-0.001017],[0.25794,1.3288,-0.001017],[-0.6738,-1.4752,-0.001017],[-1.295,-2.1762,-0.001017],[-0.6738,-3.9287,-0.001017],[0.56851,-4.9803,-0.001017],[-0.6738,-9.8873,-0.012604],[0.56851,-7.7843,-0.012604],[-0.36322,-7.0833,-0.001017],[-1.295,-1.8257,0.010569],[-0.6738,0.27732,0.010569],[-2.2267,1.6793,0.022156],[-2.5373,3.0814,0.022156],[-4.7113,4.8339,0.022156],[-3.1584,3.0814,-0.012604],[0.25794,3.7824,-0.001017],[2.1214,4.1329,-0.001017],[4.606,3.4319,0.010569],[6.7801,0.62783,0.010569],[8.9541,-3.5782,0.010569],[10.196,-6.0318,0.022156],[9.2647,-9.8873,0.022156],[7.4013,-10.238,0.022156],[6.1589,-9.5368,0.022156],[6.1589,-8.8358,-0.001017],[6.7801,-7.0833,-0.012604],[8.9541,-7.7843,-0.012604],[11.128,-4.2793,-0.012604],[12.06,-3.2277,-0.012604],[11.439,-1.1247,-0.012604],[13.302,-4.2793,-0.012604],[-2.5373,0.97834,-0.24434],[-2.5373,5.5349,-0.024191],[-2.2267,10.091,-0.024191],[0.56851,12.545,-0.024191],[1.1897,11.143,-0.024191],[2.432,10.792,-0.024191],[2.1214,10.792,-0.024191],[2.7426,9.3905,-0.012604],[2.7426,6.2359,-0.012604],[2.432,3.4319,0.010569],[0.87909,2.3804,-0.001017],[1.1897,2.0299,-0.012604],[0.25793,-1.1247,-0.024191],[-0.6738,-3.2277,-0.024191],[0.25793,-6.0318,-0.047364],[2.1214,-7.0833,-0.035777],[2.7426,-5.6813,-0.024191],[3.6743,-0.77419,0.010569],[5.5378,3.0814,0.033743],[6.7801,7.6379,0.056916],[5.5378,8.6895,0.045329],[6.4695,9.04,0.056916],[6.7801,11.494,0.045329],[5.2272,13.597,0.045329],[6.1589,11.494,0.010569],[10.196,10.091,-0.001017],[11.439,10.091,0.022156],[13.923,6.2359,0.022156],[14.234,-0.073181,0.022156],[14.234,-6.3823,0.022156],[14.855,-13.743,0.045329],[12.992,-17.598,0.080089],[11.128,-21.805,0.045329],[10.507,-20.052,0.022156],[10.507,-16.547,-0.001017],[10.818,-11.64,-0.024191],[12.06,-9.1863,-0.024191],[12.992,-7.0833,-0.001017],[14.545,-4.9803,-0.024191],[15.476,-4.9803,-0.024191],[14.855,-5.6813,-0.1053],[-0.36322,0.97834,-0.3602],[-0.98438,5.5349,-0.024191],[-1.295,9.741,-0.024191],[0.25794,12.195,-0.024191],[0.87909,12.195,-0.024191],[1.5003,13.246,-0.024191],[1.1897,11.844,-0.024191],[2.432,10.091,-0.024191],[2.7426,6.9369,-0.012604],[3.0531,4.1329,0.010569],[2.432,3.0814,-0.012604],[3.0531,2.3804,-0.024191],[2.432,-0.073181,-0.047364],[2.432,-1.8257,-0.058951],[4.2955,-2.5267,-0.058951],[7.0907,2.0299,-0.024191],[10.196,8.6895,0.010569],[8.9541,10.091,0.033743],[10.818,9.741,0.033743],[13.302,9.741,0.056916],[12.992,9.04,0.045329],[13.923,7.6379,0.045329],[12.681,8.6895,0.022156],[9.5753,10.442,0.033743],[11.439,8.339,-0.012604],[16.097,7.2874,-0.001017],[18.582,7.9885,0.022156],[20.446,3.4319,0.022156],[20.756,-4.6298,0.033743],[21.067,-12.691,0.022156],[20.756,-19,0.045329],[18.272,-23.908,0.080089],[16.719,-27.062,0.056916],[14.545,-24.609,0.022156],[12.992,-19.702,-0.012604],[12.371,-13.743,-0.047364],[11.439,-7.0833,-0.024191],[9.5753,-6.0318,-0.001017],[9.5753,-5.6813,-0.024191],[10.196,-4.9803,-0.024191],[10.196,-6.3823,-0.14006],[3.6743,0.97834,-0.47607],[2.1214,5.5349,-0.024191],[0.56851,9.741,-0.024191],[0.56851,12.896,-0.024191],[0.87909,14.298,-0.024191],[1.1897,15.349,-0.024191],[1.5003,13.597,-0.024191],[2.7426,11.844,-0.024191],[3.3637,9.04,-0.012604],[4.9166,4.8339,-0.001017],[4.9166,3.4319,-0.012604],[5.5378,2.3804,-0.035777],[6.1589,1.6793,-0.070537],[6.7801,2.3804,-0.070537],[8.6436,9.04,-0.047364],[12.06,16.05,-0.012604],[14.855,17.803,0.022156],[16.097,13.947,0.033743],[15.166,12.195,0.022156],[15.476,11.143,0.045329],[16.719,9.3905,0.045329],[18.582,7.6379,0.045329],[17.961,9.04,0.022156],[15.166,9.04,0.022156],[15.166,5.5349,-0.024191],[18.582,4.1329,-0.012604],[20.756,6.9369,0.010569],[22.93,2.7309,0.022156],[24.483,-4.6298,0.033743],[25.104,-13.042,0.022156],[24.794,-19.702,0.045329],[22.309,-26.361,0.080089],[21.998,-31.969,0.045329],[20.135,-29.516,0.022156],[17.34,-23.557,-0.024191],[15.166,-15.846,-0.058951],[12.992,-7.4338,-0.035777],[10.507,-4.6298,-0.012604],[10.818,-5.3308,-0.024191],[9.5753,-4.2792,-0.024191],[9.2647,-6.0318,-0.16323],[12.992,-2.5267,-0.52242],[10.196,1.6793,-0.024191],[6.7801,6.2359,-0.012604],[3.6743,12.195,-0.024191],[3.0531,16.401,-0.024191],[3.0531,17.452,-0.024191],[3.0531,16.401,-0.012604],[4.606,13.947,-0.012604],[5.5378,11.143,-0.024191],[7.0907,6.9369,-0.001017],[7.4013,4.8339,-0.012604],[8.6436,4.8339,-0.035777],[8.9541,8.339,-0.058951],[10.818,13.246,-0.047364],[14.234,19.555,-0.012604],[16.408,22.71,0.010569],[17.961,20.957,0.010569],[17.029,16.401,0.022156],[17.029,14.298,0.010569],[18.582,12.545,0.022156],[20.756,10.442,0.022156],[23.241,7.6379,0.033743],[22.93,7.9885,0.010569],[20.756,7.6379,0.010569],[19.824,4.4834,-0.024191],[21.377,3.4319,-0.012604],[22.93,4.8339,-0.012604],[23.862,0.27732,-0.001017],[25.725,-7.0833,0.022156],[26.036,-15.846,0.022156],[26.347,-23.557,0.022156],[24.173,-30.567,0.045329],[24.483,-35.124,0.022156],[23.241,-33.371,-0.001017],[21.998,-26.011,-0.047364],[19.824,-17.248,-0.070537],[17.029,-8.1348,-0.035777],[12.681,-5.6813,-0.012604],[12.681,-7.0833,-0.035777],[10.196,-6.7328,-0.024191],[8.9541,-8.8358,-0.16323],[20.135,-4.6298,-0.51083],[17.029,-1.1247,-0.024191],[13.923,1.6793,-0.012604],[10.507,6.2359,-0.024191],[8.6436,10.442,-0.012604],[7.0907,13.246,-0.024191],[6.1589,14.999,-0.012604],[6.7801,13.947,-0.012604],[8.0224,11.494,-0.024191],[8.6436,8.6895,-0.012604],[8.9541,7.6379,-0.012604],[10.818,10.442,-0.024191],[12.371,17.102,-0.024191],[14.234,22.71,-0.012604],[17.34,26.215,0.010569],[20.446,26.916,0.010569],[22.309,24.112,0.010569],[22.309,19.555,0.010569],[24.173,17.452,-0.001017],[26.036,16.05,-0.001017],[27.278,13.947,0.022156],[29.142,10.091,0.033743],[29.142,8.339,0.010569],[27.899,7.2874,-0.001017],[27.278,3.4319,-0.012604],[30.074,1.3288,-0.012604],[30.695,0.62783,-0.012604],[29.763,-2.1762,-0.012604],[29.763,-7.7843,0.010569],[30.074,-15.846,0.010569],[30.074,-23.207,0.010569],[27.899,-30.217,0.022156],[28.521,-34.423,-0.001017],[27.278,-32.32,-0.024191],[24.794,-24.258,-0.047364],[22.62,-15.145,-0.070537],[19.203,-7.4338,-0.024191],[14.855,-6.7328,-0.012604],[13.923,-8.8358,-0.024191],[11.128,-8.8358,-0.012604],[9.5753,-11.289,-0.17482],[25.725,-5.6813,-0.4529],[22.62,-3.5782,-0.012604],[19.824,-1.8257,-0.012604],[17.029,0.27732,-0.024191],[14.855,3.7824,-0.012604],[12.06,7.6379,-0.012604],[9.5753,9.741,-0.012604],[9.2647,10.442,-0.012604],[9.2647,9.741,-0.024191],[9.5753,8.6895,-0.012604],[10.196,10.091,-0.012604],[13.302,15.349,-0.012604],[16.408,23.411,-0.012604],[19.203,29.019,-0.001017],[22.93,30.07,0.010569],[26.036,30.07,0.010569],[27.899,27.266,-0.001017],[28.521,23.411,-0.001017],[30.384,20.957,-0.012604],[31.937,19.205,-0.001017],[32.869,17.102,0.022156],[34.111,12.195,0.033743],[34.422,9.04,0.010569],[33.8,6.2359,-0.001017],[34.422,1.6793,-0.012604],[37.838,-1.4752,-0.001017],[38.77,-3.5782,-0.012604],[36.596,-6.0318,-0.012604],[35.975,-10.238,-0.001017],[35.664,-17.598,-0.012604],[34.422,-23.908,-0.001017],[31.316,-29.165,-0.001017],[31.937,-32.67,-0.012604],[30.074,-29.516,-0.024191],[26.347,-21.805,-0.047364],[23.241,-13.042,-0.058951],[19.824,-6.3823,-0.024191],[16.408,-6.7328,-0.012604],[14.234,-8.8358,-0.024191],[12.371,-8.8358,-0.012604],[10.196,-10.939,-0.19799],[29.763,-6.3823,-0.33703],[26.968,-4.9803,-0.012604],[24.173,-3.5782,-0.012604],[21.377,-1.8257,-0.024191],[19.203,-0.073181,-0.012604],[16.408,2.0299,-0.012604],[14.234,2.7309,-0.012604],[12.371,3.0814,-0.012604],[10.818,4.8339,-0.024191],[11.128,7.2874,-0.012604],[11.439,11.143,-0.012604],[15.476,17.102,-0.012604],[20.446,25.163,-0.001017],[25.104,30.421,0.010569],[29.763,31.472,0.010569],[32.248,31.823,0.010569],[33.179,30.421,-0.001017],[32.558,27.967,-0.001017],[33.179,25.163,-0.012604],[34.422,21.658,-0.001017],[35.975,18.504,0.022156],[37.217,13.246,0.033743],[38.77,9.04,0.010569],[38.77,4.8339,-0.001017],[40.012,-0.073181,-0.001017],[43.739,-4.2793,-0.001017],[44.981,-6.7328,-0.001017],[44.05,-10.238,-0.012604],[43.118,-15.145,-0.012604],[42.186,-21.805,-0.024191],[39.08,-26.011,-0.012604],[34.111,-29.516,-0.024191],[32.248,-30.567,-0.024191],[29.142,-27.413,-0.012604],[25.104,-19.351,-0.035777],[21.998,-11.64,-0.047364],[18.893,-6.0318,-0.012604],[16.097,-5.3308,-0.001017],[13.923,-7.0833,-0.012604],[12.06,-6.3823,-0.012604],[10.196,-6.7328,-0.20958],[29.763,-5.6813,-0.19799],[26.347,-5.3308,-0.012604],[23.241,-3.9287,-0.012604],[20.756,-1.8257,-0.012604],[18.582,-0.073181,-0.012604],[16.097,1.3288,-0.012604],[14.234,0.97834,-0.012604],[13.302,0.27732,-0.012604],[12.371,2.0299,-0.012604],[13.302,4.1329,-0.012604],[13.302,8.6895,-0.012604],[14.855,13.597,-0.012604],[16.719,19.205,-0.012604],[19.203,23.411,-0.001017],[22.62,25.864,-0.001017],[26.347,27.967,-0.001017],[30.695,30.421,-0.012604],[32.248,30.07,-0.001017],[34.422,27.617,-0.012604],[36.596,23.411,-0.001017],[38.77,20.256,0.022156],[40.633,15.7,0.022156],[42.807,11.143,0.010569],[43.118,5.5349,-0.001017],[44.671,-0.073181,-0.001017],[48.398,-4.6298,0.010569],[49.951,-7.7843,-0.001017],[48.708,-11.64,-0.001017],[47.777,-16.196,-0.024191],[45.602,-21.454,-0.024191],[40.012,-24.258,-0.012604],[32.248,-25.66,-0.024191],[29.142,-24.609,-0.024191],[26.036,-21.104,-0.012604],[21.067,-15.145,-0.024191],[18.272,-9.5368,-0.035777],[15.166,-7.4338,-0.012604],[12.681,-6.0318,-0.001017],[11.128,-5.3308,-0.001017],[10.196,-4.2793,-0.001017],[9.2647,-2.5267,-0.20958],[26.968,-5.3308,-0.058951],[24.173,-4.9803,-0.012604],[21.377,-3.2277,-0.012604],[19.203,-1.4752,-0.012604],[17.961,0.27732,-0.012604],[15.476,1.6793,-0.012604],[14.234,0.62783,-0.012604],[13.923,-1.1247,-0.012604],[12.992,-0.073181,-0.012604],[14.545,0.97834,-0.012604],[13.923,5.1844,-0.012604],[14.855,10.442,-0.012604],[15.166,14.999,-0.001017],[17.029,18.854,-0.001017],[19.824,20.957,-0.001017],[22.309,22.359,-0.001017],[25.725,24.112,-0.012604],[27.899,23.411,-0.001017],[29.763,22.009,-0.012604],[31.316,19.906,-0.001017],[34.111,17.803,0.010569],[35.975,13.947,0.010569],[36.906,10.091,0.010569],[37.217,4.4834,0.010569],[38.459,-0.42369,0.010569],[40.944,-4.2792,0.010569],[41.565,-6.7328,-0.001017],[40.633,-9.1863,-0.012604],[40.012,-12.691,-0.024191],[38.149,-17.248,-0.024191],[35.043,-20.052,-0.012604],[30.384,-20.403,-0.024191],[27.899,-19.351,-0.024191],[25.104,-16.897,-0.012604],[21.067,-12.691,-0.024191],[18.893,-8.4853,-0.035777],[16.408,-7.0833,-0.012604],[14.234,-5.3308,0.010569],[12.992,-4.2792,0.010569],[12.06,-3.9287,-0.001017],[10.818,-1.8257,-0.20958],[22.93,-4.2793,0.045329],[20.756,-3.9287,-0.012604],[18.582,-1.8257,-0.012604],[17.029,-0.42369,-0.012604],[15.476,1.3288,-0.001017],[14.234,2.0299,-0.012604],[12.992,0.27732,-0.012604],[12.992,-1.8257,-0.001017],[12.371,-1.4752,-0.012604],[13.923,-0.42369,-0.012604],[12.992,3.4319,-0.012604],[13.923,9.3905,-0.012604],[13.302,13.597,-0.001017],[14.545,17.452,0.010569],[16.097,18.854,-0.001017],[17.34,19.205,-0.001017],[18.893,19.205,-0.001017],[20.446,18.504,-0.001017],[21.998,17.452,-0.001017],[22.309,15.7,-0.001017],[24.794,13.947,0.010569],[26.036,11.494,0.010569],[26.657,7.9885,-0.001017],[27.278,3.7824,-0.001017],[28.521,0.62783,-0.001017],[30.384,-1.8257,-0.001017],[30.695,-3.5782,-0.001017],[30.695,-5.3308,-0.012604],[30.384,-8.1348,-0.024191],[30.074,-13.392,-0.024191],[29.763,-16.196,-0.012604],[26.657,-16.196,-0.024191],[25.725,-15.846,-0.024191],[23.241,-14.444,-0.012604],[19.824,-10.939,-0.012604],[18.272,-7.7843,-0.024191],[16.097,-6.3823,-0.012604],[14.234,-4.2793,0.010569],[13.302,-3.5782,0.010569],[12.06,-3.9287,-0.001017],[11.128,-1.8257,-0.22116],[18.272,-3.2277,0.13802],[16.408,-1.8257,-0.012604],[14.545,-0.42369,-0.001017],[13.302,0.97834,-0.001017],[12.992,2.0299,-0.001017],[12.06,2.3804,-0.001017],[10.818,0.62783,-0.001017],[10.818,-1.8257,-0.001017],[10.507,-1.4752,-0.012604],[12.06,-0.42369,-0.012604],[10.818,3.7824,-0.012604],[11.439,10.091,-0.012604],[10.507,14.999,-0.001017],[10.818,18.504,0.010569],[10.818,18.854,-0.001017],[10.818,18.153,-0.001017],[10.818,18.504,-0.001017],[11.439,17.452,-0.001017],[12.371,15.7,-0.001017],[11.439,12.195,-0.001017],[12.992,10.091,-0.001017],[12.371,7.9885,-0.001017],[13.302,4.8339,-0.001017],[14.855,4.1329,-0.001017],[16.719,3.0814,-0.001017],[18.893,2.7309,-0.001017],[20.446,1.6793,-0.001017],[21.377,-0.77419,-0.012604],[21.377,-3.9287,-0.024191],[22.93,-9.5368,-0.024191],[23.862,-13.042,-0.012604],[21.377,-13.392,-0.024191],[22.309,-14.093,-0.012604],[20.446,-13.392,-0.012604],[16.719,-9.8873,-0.012604],[15.166,-7.0833,-0.024191],[12.681,-5.6813,-0.012604],[11.439,-3.2277,-0.001017],[11.128,-3.2277,-0.001017],[10.196,-3.5782,-0.001017],[9.5753,-1.8257,-0.22116],[14.855,-1.8257,0.17278],[13.302,-1.1247,-0.012604],[12.06,0.27732,-0.001017],[11.128,1.6793,-0.001017],[10.818,2.7309,-0.001017],[10.196,3.0814,-0.001017],[9.5753,1.3288,-0.001017],[9.5753,-1.4752,-0.001017],[9.5753,-1.8257,-0.012604],[10.507,-1.1247,-0.012604],[9.2647,5.1844,-0.012604],[10.196,11.844,-0.001017],[8.6436,13.597,-0.001017],[8.6436,16.401,0.010569],[8.6436,16.05,-0.001017],[8.0224,13.947,-0.001017],[7.4013,12.545,-0.001017],[8.0224,11.143,-0.001017],[8.333,10.091,-0.001017],[7.4013,8.339,-0.001017],[8.6436,7.6379,-0.001017],[8.333,6.9369,-0.001017],[8.6436,4.8339,-0.001017],[9.2647,3.7824,-0.001017],[10.818,3.0814,-0.001017],[12.371,2.7309,-0.001017],[13.923,2.0299,-0.001017],[15.166,0.62783,-0.012604],[16.097,-1.4752,-0.012604],[18.272,-7.0833,-0.012604],[19.824,-10.238,-0.012604],[18.582,-10.238,-0.024191],[20.446,-10.939,-0.012604],[19.824,-10.939,-0.012604],[16.097,-8.4853,-0.012604],[14.855,-5.3308,-0.012604],[13.302,-5.3308,-0.001017],[12.681,-4.6298,-0.001017],[12.371,-4.2793,-0.001017],[10.818,-3.9287,-0.001017],[10.507,-1.8257,-0.22116],[12.06,-0.42369,0.20754],[10.818,0.27732,-0.012604],[9.5753,1.3288,-0.001017],[8.9541,2.3804,-0.001017],[8.9541,3.0814,-0.001017],[8.6436,3.4319,-0.001017],[8.6436,2.0299,-0.001017],[8.9541,-0.77419,-0.001017],[8.9541,-1.8257,-0.001017],[9.2647,-1.8257,-0.001017],[8.333,7.2874,-0.001017],[8.9541,13.947,-0.001017],[7.4013,11.844,-0.001017],[7.0907,13.246,0.010569],[6.7801,11.844,0.010569],[6.1589,9.04,-0.001017],[5.2272,4.8339,-0.001017],[5.5378,3.0814,-0.001017],[6.4695,3.7824,-0.001017],[5.5378,3.4319,-0.001017],[7.0907,5.1844,-0.012604],[7.4013,6.5864,-0.012604],[6.7801,5.1844,-0.001017],[6.1589,3.4319,-0.001017],[6.7801,2.0299,-0.001017],[8.0224,1.3288,-0.001017],[8.6436,0.97834,-0.001017],[9.5753,0.97834,-0.012604],[11.128,-0.073181,-0.001017],[14.234,-4.9803,-0.012604],[16.408,-7.4338,-0.012604],[16.408,-7.4338,-0.024191],[18.893,-8.1348,-0.012604],[19.203,-8.8358,-0.012604],[16.719,-6.7328,-0.001017],[15.166,-2.8772,0.010569],[14.855,-4.6298,-0.001017],[14.855,-6.3823,-0.001017],[14.545,-5.6813,-0.001017],[12.681,-4.6298,-0.001017],[11.439,-2.5267,-0.20958],[-3.1584,-0.073182,-0.001017],[-2.5373,0.27732,-0.001017],[-2.2267,0.27732,-0.001017],[-0.98438,0.27732,-0.001017],[0.25794,-1.1247,-0.001017],[0.87909,0.62783,-0.001017],[-0.36322,3.7824,-0.001017],[0.87909,3.4319,-0.001017],[2.432,3.4319,-0.001017],[2.7426,2.7309,-0.001017],[1.5003,1.6793,-0.001017],[1.5003,1.6793,-0.001017],[0.87909,0.97833,-0.001017],[0.87909,-0.42369,-0.001017],[1.1897,-1.8257,-0.001017],[2.1214,-1.1247,-0.001017],[0.56851,-1.4752,-0.001017],[0.25794,-1.8257,-0.001017],[-1.6055,-1.8257,-0.001017],[-2.5373,-2.1762,-0.001017],[-2.8479,-1.8257,-0.001017],[-3.7796,-1.8257,-0.001017],[-4.7113,-1.4752,-0.001017],[-3.1584,-2.5267,-0.001017],[0.25794,-3.9287,-0.001017],[5.2272,-4.9803,-0.001017],[8.6436,-4.9803,-0.001017],[10.818,-6.0318,-0.001017],[10.196,-6.7328,-0.001017],[6.7801,-8.1348,-0.001017],[5.5378,-8.4853,-0.001017],[3.6743,-8.1348,-0.001017],[1.5003,-7.4338,-0.001017],[0.25794,-6.3823,-0.001017],[-0.98438,-5.6813,-0.001017],[-0.6738,-4.9803,-0.001017],[0.25794,-5.3308,-0.001017],[0.56851,-3.2277,-0.001017],[2.432,-1.8257,-0.001017],[4.2955,-1.8257,-0.001017],[6.4695,-1.8257,-0.001017],[-5.6431,3.0814,-0.1053],[-5.3325,5.1844,-0.012604],[-4.7113,7.2874,-0.012604],[-3.1584,8.339,-0.024191],[-2.2267,9.04,-0.024191],[0.87909,6.2359,-0.024191],[1.5003,6.5864,-0.024191],[2.432,5.5349,-0.012604],[2.7426,4.4834,-0.012604],[2.7426,2.7309,-0.001017],[1.5003,1.6793,-0.001017],[1.5003,1.6793,-0.001017],[0.87909,0.97834,-0.001017],[0.87909,-0.42369,-0.001017],[1.1897,-1.8257,-0.001017],[2.1214,-2.1762,-0.012604],[0.56851,-3.2277,-0.012604],[-0.6738,-5.6813,-0.012604],[-2.5373,-6.0318,-0.012604],[-3.7796,-5.3308,-0.012604],[-5.0219,-2.5267,-0.001017],[-5.6431,-1.8257,-0.001017],[-7.5065,0.62783,-0.001017],[-6.5748,2.7309,-0.024191],[-2.2267,1.6793,-0.035777],[2.7426,1.3288,-0.024191],[6.4695,0.62783,-0.001017],[8.9541,-1.4752,-0.001017],[11.128,-4.9803,0.010569],[11.128,-7.4338,0.033743],[11.439,-10.588,0.022156],[10.196,-11.64,0.033743],[7.0907,-11.64,0.033743],[5.2272,-10.939,0.022156],[3.6743,-8.4853,0.010569],[4.2955,-5.6813,-0.001017],[6.1589,-5.3308,-0.012604],[8.0224,-5.6813,-0.012604],[9.5753,-7.0833,-0.012604],[10.507,-3.9287,-0.012604],[10.196,-2.5267,-0.012604],[-5.3325,3.4319,-0.22116],[-5.3325,6.2359,-0.012604],[-4.7113,8.339,-0.024191],[-3.1584,10.442,-0.024191],[-1.6055,11.143,-0.035777],[0.87909,10.792,-0.047364],[2.1214,11.143,-0.035777],[2.7426,9.3905,-0.024191],[3.0531,7.2874,-0.012604],[3.3637,4.4834,-0.012604],[2.7426,3.0814,-0.001017],[3.0531,2.3804,-0.001017],[2.432,0.97834,-0.012604],[3.0531,-0.77419,-0.024191],[3.3637,-4.2793,-0.035777],[4.606,-6.3823,-0.024191],[4.606,-4.6298,-0.035777],[4.606,-4.2793,-0.024191],[3.0531,-0.42369,0.010569],[4.606,6.2359,0.022156],[6.4695,9.04,0.033743],[4.606,10.442,0.045329],[1.5003,16.401,0.045329],[2.1214,15.349,-0.012604],[5.2272,9.04,-0.058951],[8.333,6.2359,-0.035777],[12.06,6.9369,0.010569],[13.923,3.4319,0.022156],[15.166,-1.8257,0.033743],[16.097,-8.8358,0.056916],[15.476,-12.341,0.080089],[13.923,-17.598,0.080089],[11.128,-22.155,0.080089],[8.9541,-21.454,0.045329],[7.4013,-17.598,0.010569],[8.333,-12.691,-0.012604],[9.2647,-9.1863,-0.035777],[8.9541,-5.6813,-0.024191],[10.196,-5.3308,-0.012604],[11.128,-5.6813,-0.012604],[12.06,-6.3823,-0.070537],[-3.7796,3.4319,-0.33703],[-4.4008,6.2359,-0.024191],[-4.4008,8.339,-0.024191],[-3.1584,10.442,-0.024191],[-1.6055,11.844,-0.047364],[0.25794,12.896,-0.047364],[1.1897,11.844,-0.024191],[2.432,9.741,-0.012604],[2.7426,6.9369,-0.012604],[3.3637,5.1844,-0.012604],[3.0531,3.4319,-0.012604],[4.606,2.3804,-0.001017],[4.9166,0.62783,-0.035777],[6.1589,-1.1247,-0.047364],[6.7801,-3.5782,-0.058951],[8.9541,-2.8772,-0.035777],[11.128,2.7309,-0.024191],[12.992,9.04,-0.001017],[10.507,10.091,0.045329],[9.5753,9.741,0.033743],[9.5753,7.9885,0.033743],[9.5753,6.9369,0.045329],[9.2647,13.246,0.045329],[10.507,13.246,-0.035777],[13.923,4.1329,-0.082124],[14.855,2.3804,-0.047364],[17.961,5.1844,0.010569],[19.203,1.6793,0.033743],[20.446,-4.2793,0.045329],[21.067,-10.939,0.080089],[20.756,-15.495,0.080089],[18.893,-21.454,0.091676],[15.166,-24.609,0.080089],[12.371,-22.856,0.056916],[10.196,-18.299,0.010569],[8.9541,-13.042,-0.024191],[8.9541,-6.7328,-0.047364],[9.2647,-4.6298,-0.035777],[8.9541,-5.6813,-0.012604],[8.9541,-6.0318,-0.012604],[9.5753,-6.3823,-0.093711],[-1.6055,3.4319,-0.4529],[-2.8479,6.5864,-0.024191],[-3.1584,8.6895,-0.024191],[-2.8479,11.143,-0.024191],[-2.2267,12.896,-0.047364],[-0.36322,14.298,-0.047364],[0.87909,13.246,-0.024191],[2.432,11.143,-0.012604],[3.3637,8.6895,-0.012604],[4.606,6.5864,-0.012604],[4.606,3.4319,-0.012604],[6.4695,2.0299,-0.012604],[7.0907,1.3288,-0.047364],[8.9541,0.97834,-0.070537],[10.818,2.0299,-0.058951],[12.371,9.04,-0.012604],[14.855,15.7,-0.012604],[16.719,16.751,0.010569],[17.961,13.947,0.045329],[17.961,12.545,0.033743],[17.961,9.741,0.022156],[17.029,7.9885,0.045329],[15.476,12.545,0.022156],[15.166,11.844,-0.047364],[17.34,0.97834,-0.082124],[17.029,-0.073181,-0.058951],[21.067,5.5349,0.010569],[22.93,3.0814,0.033743],[23.862,-3.9287,0.033743],[23.862,-9.8873,0.056916],[23.241,-15.495,0.080089],[22.93,-23.207,0.10326],[20.756,-28.114,0.091676],[16.719,-24.609,0.056916],[13.923,-19,-0.001017],[12.06,-13.743,-0.024191],[11.128,-6.7328,-0.047364],[12.06,-2.5267,-0.035777],[10.818,-4.6298,-0.012604],[10.507,-5.3308,-0.012604],[10.507,-5.3308,-0.12847],[3.6743,1.3288,-0.54559],[1.1897,4.8339,-0.024191],[-0.36322,8.339,-0.024191],[-0.98438,11.494,-0.024191],[-0.6738,13.947,-0.047364],[0.87909,16.05,-0.047364],[1.5003,14.999,-0.024191],[3.3637,12.545,-0.012604],[4.9166,9.741,-0.012604],[6.1589,7.6379,-0.012604],[6.4695,4.1329,-0.012604],[8.6436,2.0299,-0.001017],[9.2647,4.8339,-0.035777],[11.128,8.6895,-0.058951],[13.923,11.494,-0.035777],[17.029,17.452,0.010569],[20.446,20.957,-0.001017],[20.135,19.906,-0.001017],[18.272,16.401,0.033743],[18.893,14.298,0.022156],[19.824,9.741,0.010569],[18.582,8.339,0.033743],[18.582,11.494,0.022156],[18.582,12.195,-0.047364],[20.135,0.62783,-0.070537],[18.272,-1.8257,-0.047364],[21.067,4.1329,-0.001017],[23.862,1.3288,0.022156],[25.104,-5.3308,0.022156],[26.036,-11.64,0.033743],[25.725,-17.248,0.045329],[25.104,-24.959,0.080089],[23.862,-30.918,0.080089],[20.135,-27.413,0.033743],[17.34,-22.506,-0.012604],[16.097,-16.196,-0.047364],[14.855,-8.1348,-0.047364],[14.545,-3.9287,-0.035777],[12.992,-5.6813,-0.012604],[12.371,-6.7328,-0.012604],[11.439,-7.0833,-0.15164],[10.507,-0.77419,-0.58035],[8.333,1.6793,-0.012604],[6.1589,4.1329,-0.024191],[4.606,7.2874,-0.024191],[3.6743,10.442,-0.035777],[3.6743,13.597,-0.035777],[3.6743,14.298,-0.024191],[5.2272,13.246,-0.012604],[6.7801,10.793,-0.012604],[8.0224,8.6895,-0.012604],[8.0224,6.9369,-0.012604],[9.5753,5.1844,-0.001017],[12.06,11.494,-0.012604],[14.234,16.05,-0.024191],[16.719,19.555,-0.012604],[20.446,22.71,0.022156],[23.862,24.813,-0.001017],[23.862,22.359,-0.001017],[22.62,18.153,0.010569],[24.173,16.05,-0.001017],[25.104,11.844,0.010569],[26.036,10.442,0.022156],[26.036,10.793,0.010569],[25.725,9.04,-0.035777],[27.278,-1.8257,-0.058951],[26.036,-4.9803,-0.035777],[27.278,0.27732,-0.001017],[27.278,-0.77419,-0.001017],[27.899,-5.6813,-0.001017],[28.21,-12.341,0.010569],[27.899,-17.949,0.022156],[27.899,-25.31,0.045329],[26.968,-31.268,0.033743],[23.862,-27.763,0.010569],[21.377,-22.506,-0.035777],[19.203,-15.846,-0.058951],[18.272,-7.4338,-0.035777],[17.34,-4.2793,-0.024191],[15.166,-6.7328,-0.024191],[13.923,-7.7843,-0.012604],[12.371,-8.4853,-0.19799],[17.029,-2.1762,-0.56876],[14.855,-1.1247,-0.012604],[12.681,0.62783,-0.024191],[10.818,2.3804,-0.024191],[9.2647,5.1844,-0.035777],[8.333,9.04,-0.035777],[7.4013,10.442,-0.024191],[8.0224,10.442,-0.012604],[8.6436,9.3905,-0.012604],[9.2647,9.04,-0.012604],[9.5753,8.339,-0.012604],[12.06,9.741,-0.001017],[15.476,17.803,-0.001017],[18.893,22.359,-0.001017],[21.998,25.864,0.010569],[25.725,27.617,0.022156],[28.831,28.318,-0.001017],[29.142,25.514,-0.012604],[28.521,20.607,-0.001017],[30.074,18.153,-0.001017],[31.005,14.999,0.010569],[32.558,12.545,0.022156],[32.869,10.091,0.010569],[32.869,5.5349,-0.024191],[35.664,-4.6298,-0.047364],[35.043,-8.4853,-0.024191],[36.285,-4.2793,-0.001017],[34.422,-4.6298,-0.012604],[33.179,-8.1348,-0.012604],[32.248,-14.093,-0.012604],[31.316,-17.949,-0.001017],[30.695,-24.258,0.010569],[29.763,-29.516,0.010569],[26.036,-26.011,-0.001017],[22.93,-21.104,-0.035777],[20.135,-14.444,-0.058951],[18.893,-6.3823,-0.035777],[18.582,-4.2793,-0.012604],[16.408,-6.7328,-0.012604],[13.923,-7.0833,-0.012604],[12.06,-8.1348,-0.24434],[21.377,-3.9287,-0.51083],[19.203,-2.5267,-0.012604],[17.34,-1.4752,-0.012604],[15.476,-0.77419,-0.012604],[14.234,1.3288,-0.024191],[12.992,3.4319,-0.035777],[11.439,3.7824,-0.024191],[10.818,4.1329,-0.012604],[10.196,5.1844,-0.012604],[10.196,7.2874,-0.012604],[11.439,8.6895,-0.012604],[14.855,13.246,-0.001017],[19.203,21.308,-0.001017],[23.241,26.565,0.010569],[28.21,29.369,0.010569],[31.316,30.771,0.010569],[34.732,31.122,-0.001017],[35.043,28.318,-0.012604],[34.111,24.462,-0.012604],[34.422,21.308,-0.001017],[35.664,18.153,0.010569],[37.217,13.947,0.010569],[38.459,9.741,0.010569],[39.701,4.1329,-0.012604],[42.497,-6.3823,-0.035777],[43.739,-10.939,-0.024191],[44.981,-8.4853,-0.001017],[43.739,-10.238,-0.001017],[41.876,-13.392,-0.024191],[39.08,-16.897,-0.024191],[35.975,-17.949,-0.024191],[32.869,-22.155,-0.012604],[30.384,-26.361,-0.001017],[25.725,-22.506,-0.012604],[22.309,-17.949,-0.035777],[18.582,-12.691,-0.047364],[16.719,-5.6813,-0.024191],[17.029,-3.5782,-0.012604],[14.855,-5.3308,-0.012604],[12.371,-5.3308,-0.001017],[10.507,-4.9803,-0.2791],[21.998,-3.9287,-0.41814],[19.824,-2.5267,-0.012604],[17.34,-1.4752,-0.012604],[15.476,-0.77419,-0.012604],[14.234,0.62783,-0.024191],[12.992,2.3804,-0.024191],[12.371,2.0299,-0.024191],[11.439,1.3288,-0.012604],[11.128,2.0299,-0.012604],[11.439,4.8339,-0.012604],[11.439,7.6379,-0.012604],[13.302,11.494,-0.012604],[15.476,16.401,-0.001017],[18.272,19.555,0.010569],[21.377,22.71,0.010569],[25.725,25.514,-0.001017],[29.763,27.967,-0.001017],[32.869,29.369,-0.012604],[34.422,25.864,-0.012604],[36.285,22.71,-0.012604],[38.459,19.205,-0.001017],[40.323,15.7,0.010569],[42.186,10.442,-0.001017],[44.36,4.1329,-0.001017],[47.466,-6.7328,-0.012604],[48.398,-10.588,-0.012604],[49.951,-8.4853,-0.001017],[48.708,-10.939,-0.001017],[46.224,-13.042,-0.024191],[41.565,-15.846,-0.024191],[35.043,-15.846,-0.024191],[31.005,-18.299,-0.012604],[26.968,-20.052,-0.012604],[22.93,-16.547,-0.024191],[18.893,-13.392,-0.024191],[16.097,-9.1863,-0.035777],[13.923,-6.3823,-0.024191],[12.992,-4.9803,-0.012604],[11.128,-4.2793,-0.001017],[9.2647,-2.8772,0.010569],[8.333,-2.1762,-0.2791],[20.756,-3.5782,-0.31386],[18.582,-2.1762,-0.012604],[16.408,-1.1247,-0.012604],[14.855,-0.42369,-0.012604],[13.923,0.97834,-0.024191],[12.992,2.0299,-0.024191],[12.371,0.62783,-0.012604],[12.06,-0.77419,-0.012604],[11.128,-0.77419,-0.012604],[11.439,2.3804,-0.012604],[11.128,4.8339,-0.012604],[12.371,9.04,-0.012604],[13.302,13.246,-0.001017],[15.476,16.05,0.010569],[18.272,18.504,-0.001017],[21.067,20.607,-0.001017],[23.862,20.957,-0.001017],[26.347,21.658,-0.012604],[27.899,19.906,-0.024191],[29.142,17.452,-0.012604],[31.316,15.7,-0.001017],[32.869,13.597,-0.001017],[34.732,9.3905,-0.001017],[35.664,3.7824,-0.001017],[37.217,-4.6298,-0.001017],[37.217,-7.0833,-0.012604],[37.838,-6.3823,-0.001017],[37.217,-8.1348,-0.001017],[36.285,-10.939,-0.012604],[34.732,-14.093,-0.012604],[31.005,-14.444,-0.012604],[28.21,-15.495,-0.024191],[25.104,-16.547,-0.012604],[21.998,-13.392,-0.024191],[18.582,-10.238,-0.024191],[16.097,-7.4338,-0.024191],[14.234,-5.6813,-0.012604],[12.992,-4.2792,-0.001017],[12.06,-2.5267,-0.001017],[10.507,-1.8257,0.010569],[8.9541,-1.4752,-0.2791],[17.961,-2.5267,-0.22116],[16.097,-1.8257,-0.001017],[14.545,-0.42369,-0.012604],[12.992,0.27732,-0.012604],[12.681,1.3288,-0.012604],[12.06,2.0299,-0.012604],[11.439,0.27732,-0.012604],[11.128,-1.4752,-0.012604],[10.507,-1.8257,-0.012604],[10.818,0.97834,-0.012604],[10.507,3.7824,-0.012604],[10.818,8.339,-0.012604],[11.128,12.896,-0.001017],[12.681,15.7,0.010569],[14.545,17.452,-0.001017],[16.408,18.504,-0.012604],[17.34,17.452,-0.001017],[18.893,16.751,-0.012604],[19.824,15.7,-0.012604],[20.446,13.246,-0.012604],[22.309,12.195,-0.001017],[23.241,11.494,-0.001017],[24.483,7.6379,-0.001017],[24.794,3.4319,0.010569],[26.036,-1.4752,-0.001017],[26.036,-2.8772,-0.001017],[26.657,-2.8772,-0.001017],[26.968,-5.3308,-0.012604],[27.278,-8.8358,-0.012604],[28.21,-12.341,-0.012604],[26.657,-12.691,-0.012604],[24.483,-13.743,-0.024191],[22.93,-14.093,-0.024191],[20.446,-11.289,-0.024191],[17.34,-8.8358,-0.024191],[15.166,-7.0833,-0.012604],[13.923,-5.3308,-0.012604],[12.681,-3.9287,-0.001017],[12.06,-1.8257,-0.001017],[10.507,-1.4752,0.010569],[9.2647,-1.4752,-0.2791],[14.234,-1.8257,-0.16323],[12.681,-0.77419,-0.001017],[11.439,0.62783,-0.001017],[10.818,0.97834,-0.001017],[10.507,2.0299,-0.001017],[10.507,2.3804,-0.012604],[10.196,0.27732,-0.012604],[9.5753,-1.8257,-0.012604],[8.9541,-1.8257,-0.012604],[9.2647,0.62783,-0.012604],[8.9541,4.1329,-0.012604],[8.6436,9.3905,-0.012604],[8.9541,14.999,-0.001017],[9.2647,17.803,0.010569],[10.196,18.854,-0.001017],[10.196,19.205,-0.012604],[10.818,17.803,-0.001017],[11.439,16.751,-0.001017],[12.06,14.999,-0.012604],[12.371,12.195,-0.001017],[12.992,11.143,-0.001017],[13.302,9.741,-0.001017],[13.923,5.1844,-0.001017],[14.234,3.0814,0.010569],[16.097,1.3288,0.010569],[17.34,0.62783,-0.001017],[19.203,-0.42369,-0.001017],[20.756,-2.1762,-0.012604],[21.377,-7.0833,-0.012604],[23.241,-10.588,-0.012604],[22.62,-10.939,-0.012604],[21.377,-12.341,-0.024191],[20.446,-13.042,-0.024191],[17.961,-10.588,-0.024191],[14.855,-8.4853,-0.012604],[12.992,-6.7328,-0.012604],[11.128,-5.6813,-0.012604],[10.507,-4.2793,-0.001017],[10.196,-1.4752,-0.001017],[8.9541,-1.4752,0.010569],[8.333,-1.8257,-0.2791],[12.06,-0.42369,-0.12847],[10.818,0.27732,-0.001017],[9.5753,1.3288,-0.001017],[9.2647,1.6793,-0.001017],[9.2647,2.3804,-0.001017],[9.2647,2.3804,-0.001017],[9.2647,0.62783,-0.012604],[9.5753,-1.4752,-0.012604],[8.9541,-2.1762,-0.012604],[8.9541,-0.073181,-0.001017],[8.333,5.5349,-0.012604],[8.333,11.143,-0.012604],[8.333,13.597,-0.001017],[8.6436,16.05,0.010569],[8.9541,16.401,-0.001017],[8.6436,15.7,-0.001017],[8.6436,12.896,-0.001017],[8.9541,11.143,-0.001017],[8.9541,9.741,-0.012604],[8.9541,8.339,-0.001017],[9.2647,8.6895,-0.001017],[9.2647,8.339,-0.001017],[9.5753,4.8339,-0.001017],[9.5753,3.0814,0.010569],[10.818,0.97834,0.010569],[12.681,0.27732,-0.001017],[14.545,0.27732,-0.001017],[16.408,-1.4752,-0.012604],[17.34,-5.6813,-0.012604],[20.135,-8.8358,-0.012604],[19.203,-8.4853,-0.012604],[18.893,-9.5368,-0.024191],[18.582,-10.588,-0.024191],[16.719,-9.1863,-0.024191],[14.234,-8.1348,-0.012604],[12.992,-6.7328,-0.001017],[12.371,-5.6813,-0.001017],[11.439,-4.2793,-0.001017],[10.818,-1.4752,-0.001017],[9.5753,-1.8257,-0.001017],[8.9541,-1.8257,-0.2791],[10.196,0.97834,-0.1053],[9.2647,1.3288,-0.001017],[8.6436,2.0299,-0.001017],[8.333,2.3804,-0.001017],[8.333,3.0814,-0.001017],[8.6436,2.7309,-0.001017],[9.2647,0.97834,-0.012604],[9.5753,-1.4752,-0.012604],[9.5753,-2.5267,-0.012604],[9.2647,-1.1247,-0.001017],[8.0224,7.6379,-0.001017],[8.0224,12.896,-0.012604],[8.0224,11.844,-0.001017],[8.9541,12.545,0.010569],[8.9541,12.195,0.010569],[8.333,10.442,-0.001017],[8.0224,7.2874,-0.001017],[8.0224,4.1329,-0.001017],[7.0907,3.0814,-0.012604],[7.4013,2.7309,-0.001017],[7.0907,5.5349,-0.001017],[7.4013,7.6379,-0.012604],[7.4013,4.8339,-0.001017],[7.0907,3.0814,0.010569],[8.0224,-0.073181,0.010569],[8.9541,-1.4752,0.010569],[10.507,-0.073181,-0.001017],[12.371,-1.1247,-0.012604],[14.234,-3.9287,-0.012604],[16.719,-6.7328,-0.012604],[16.719,-5.6813,-0.012604],[16.719,-6.7328,-0.024191],[16.719,-8.1348,-0.024191],[16.097,-7.4338,-0.024191],[14.545,-7.7843,-0.012604],[14.234,-6.3823,-0.001017],[14.545,-5.6813,-0.001017],[13.923,-4.2793,-0.001017],[12.681,-1.4752,-0.001017],[11.128,-1.8257,-0.001017],[10.507,-2.5267,-0.26751],[-3.7796,0.62783,-0.001017],[-2.8479,1.3288,-0.001017],[-2.5373,1.3288,-0.001017],[-0.98438,0.97833,-0.001017],[-0.6738,0.97833,-0.001017],[-0.98438,3.4319,-0.001017],[-1.295,5.5349,-0.001017],[1.5003,4.8339,-0.001017],[2.7426,4.1329,-0.001017],[2.432,3.7824,-0.001017],[2.7426,2.7309,-0.001017],[3.3637,2.7309,-0.001017],[2.432,1.6793,-0.001017],[2.1214,0.62783,-0.001017],[0.25794,-0.77419,-0.001017],[0.56851,-1.8257,-0.001017],[-0.36322,-2.1762,-0.001017],[-0.36322,-2.1762,-0.001017],[-0.6738,-3.2277,-0.001017],[-2.2267,-2.1762,-0.001017],[-3.1584,-3.2277,-0.001017],[-3.469,-2.5267,-0.001017],[-1.295,-3.9287,-0.001017],[2.1214,-3.5782,-0.001017],[4.9166,-4.2793,-0.001017],[6.1589,-4.6298,-0.001017],[8.333,-6.0318,-0.001017],[9.5753,-7.4338,-0.001017],[8.9541,-8.8358,-0.001017],[7.4013,-9.8873,-0.001017],[6.4695,-8.8358,-0.001017],[5.5378,-7.4338,-0.001017],[2.7426,-5.3308,-0.001017],[1.1897,-4.9803,-0.001017],[0.87909,-3.2277,-0.001017],[0.25794,-3.2277,-0.001017],[0.25794,-4.9803,-0.001017],[0.56851,-5.3308,-0.001017],[0.25794,-3.2277,-0.001017],[2.432,-1.8257,-0.001017],[5.2272,-2.1762,-0.001017],[-5.6431,3.4319,-0.082124],[-5.6431,5.5349,-0.012604],[-5.6431,7.2874,-0.012604],[-4.7113,8.339,-0.012604],[-3.7796,7.6379,-0.012604],[-2.5373,8.339,-0.012604],[-0.98438,8.6895,-0.012604],[2.1214,6.2359,-0.012604],[2.7426,4.1329,-0.001017],[2.432,3.7824,-0.001017],[2.7426,2.7309,-0.001017],[3.3637,2.7309,-0.001017],[2.432,1.6793,-0.001017],[2.1214,0.62783,-0.001017],[0.56851,-0.77419,-0.001017],[0.25794,-1.1247,-0.001017],[-0.98438,-1.8257,-0.001017],[-0.98438,-1.1247,-0.012604],[-0.98438,-1.8257,-0.001017],[-2.8479,-0.77419,-0.001017],[-5.3325,-0.77419,-0.001017],[-5.6431,0.97834,-0.001017],[-5.0219,2.0299,-0.012604],[-2.5373,3.0814,-0.024191],[0.87909,2.3804,-0.012604],[2.7426,-0.073181,-0.001017],[6.1589,-3.2277,-0.012604],[10.196,-6.0318,-0.001017],[12.371,-8.1348,0.010569],[12.681,-10.238,0.022156],[12.371,-12.691,0.010569],[10.818,-14.444,0.022156],[7.0907,-17.248,0.033743],[4.606,-15.495,0.010569],[4.2955,-12.341,0.010569],[4.2955,-11.289,0.010569],[4.2955,-7.7843,-0.001017],[6.1589,-4.2793,-0.001017],[7.4013,-5.3308,-0.012604],[8.6436,-3.5782,-0.012604],[7.4013,-1.8257,-0.024191],[-5.6431,4.1329,-0.17482],[-6.2642,6.5864,-0.012604],[-6.2642,9.04,-0.024191],[-4.7113,10.442,-0.024191],[-3.7796,9.3905,-0.024191],[-1.6055,10.091,-0.035777],[0.25793,10.442,-0.047364],[2.7426,9.04,-0.035777],[4.2955,7.2874,-0.012604],[4.2955,5.5349,-0.012604],[4.2955,3.7824,-0.012604],[4.606,3.0814,-0.001017],[4.2955,1.3288,-0.001017],[4.9166,-1.4752,-0.001017],[5.2272,-3.5782,-0.012604],[5.2272,-5.3308,-0.012604],[4.9166,-4.9803,-0.012604],[5.5378,-1.1247,-0.047364],[4.2955,-1.1247,-0.012604],[2.432,1.6793,0.010569],[0.56851,6.5864,0.010569],[0.56851,10.792,-0.001017],[1.1897,11.494,-0.001017],[4.2955,10.091,-0.035777],[6.7801,4.4834,-0.012604],[5.5378,3.7824,0.010569],[8.6436,2.0299,-0.012604],[12.681,-0.073181,-0.001017],[14.545,-5.3308,0.033743],[15.166,-10.939,0.045329],[14.855,-15.145,0.022156],[14.545,-19.702,0.056916],[11.128,-21.454,0.056916],[8.9541,-20.052,0.045329],[8.6436,-16.547,0.022156],[8.333,-13.743,0.022156],[6.7801,-9.1863,0.010569],[8.0224,-6.0318,-0.012604],[8.333,-4.9803,-0.012604],[8.333,-6.0318,-0.001017],[8.333,-6.7328,-0.047364],[-5.0219,4.1329,-0.2791],[-5.3325,6.5864,-0.024191],[-5.3325,9.04,-0.024191],[-4.7113,10.442,-0.024191],[-3.469,9.741,-0.024191],[-2.2267,10.442,-0.047364],[-0.36322,10.792,-0.047364],[2.1214,9.3905,-0.035777],[3.0531,7.6379,-0.012604],[3.6743,4.8339,-0.012604],[4.9166,3.4319,-0.012604],[5.5378,2.3804,0.010569],[6.4695,0.27732,-0.001017],[8.0224,-1.8257,-0.001017],[8.9541,-2.8772,-0.024191],[9.5753,-3.9287,-0.024191],[12.06,-0.77419,-0.012604],[13.923,6.2359,-0.047364],[14.234,10.442,-0.001017],[14.545,11.494,0.022156],[12.992,11.844,0.022156],[11.439,12.195,0.010569],[11.439,13.246,0.010569],[12.992,10.792,-0.035777],[12.992,6.5864,-0.012604],[11.128,4.4834,0.010569],[12.371,2.7309,-0.024191],[16.097,0.62783,-0.001017],[17.34,-4.6298,0.045329],[18.272,-11.289,0.056916],[17.961,-15.145,0.033743],[17.34,-19.351,0.080089],[14.234,-20.403,0.091676],[11.128,-18.65,0.056916],[9.2647,-15.846,0.033743],[8.333,-11.289,0.033743],[7.4013,-7.7843,0.022156],[8.9541,-6.0318,-0.012604],[8.333,-4.9803,-0.012604],[7.4013,-5.6813,-0.001017],[7.0907,-6.3823,-0.058951],[-3.469,4.4834,-0.37179],[-4.4008,6.9369,-0.024191],[-4.7113,9.3905,-0.035777],[-4.4008,11.143,-0.024191],[-3.7796,10.793,-0.024191],[-2.2267,11.494,-0.035777],[-0.36322,11.844,-0.047364],[2.1214,10.442,-0.035777],[3.3637,8.339,-0.012604],[4.2955,5.5349,-0.012604],[5.5378,2.7309,-0.024191],[6.7801,1.3288,0.022156],[8.6436,-0.073181,-0.012604],[10.507,-1.1247,-0.024191],[12.371,-0.77419,-0.035777],[13.923,3.0814,-0.012604],[16.097,10.793,-0.001017],[16.719,14.999,-0.047364],[18.582,15.349,-0.001017],[19.203,12.195,0.010569],[17.34,12.195,0.022156],[14.855,11.494,-0.001017],[15.166,10.793,0.010569],[17.961,5.1844,-0.035777],[17.029,1.6793,-0.012604],[14.545,1.3288,0.010569],[14.545,2.0299,-0.024191],[17.34,1.3288,-0.012604],[18.582,-4.6298,0.045329],[19.203,-9.8873,0.045329],[19.203,-14.794,0.033743],[18.893,-19,0.080089],[16.408,-21.104,0.10326],[13.302,-17.598,0.056916],[11.439,-15.145,0.033743],[10.507,-9.8873,0.033743],[9.5753,-6.0318,0.010569],[10.818,-4.6298,-0.012604],[10.196,-3.5782,-0.012604],[8.9541,-4.2792,-0.001017],[8.6436,-4.9803,-0.070537],[-0.98438,3.7824,-0.4529],[-2.2267,6.5864,-0.024191],[-3.1584,9.3905,-0.035777],[-3.469,11.494,-0.024191],[-3.1584,12.195,-0.024191],[-1.295,13.246,-0.035777],[0.25794,13.246,-0.035777],[2.7426,11.143,-0.024191],[4.2955,9.04,-0.012604],[5.2272,6.5864,-0.024191],[6.7801,3.0814,-0.024191],[8.333,1.3288,0.010569],[10.507,2.0299,-0.012604],[11.439,3.7824,-0.012604],[13.302,7.2874,-0.024191],[15.476,12.545,-0.001017],[20.446,16.751,0.010569],[22.62,19.555,-0.024191],[22.93,19.205,-0.001017],[22.62,14.999,0.010569],[20.446,13.947,0.022156],[18.582,12.195,-0.001017],[18.272,12.195,0.010569],[20.756,5.5349,-0.035777],[18.893,2.0299,-0.012604],[14.855,-0.073181,0.010569],[14.545,0.97834,-0.012604],[17.961,1.3288,-0.012604],[18.893,-4.2793,0.022156],[20.446,-9.5368,0.033743],[20.446,-15.145,0.022156],[20.446,-19.702,0.056916],[18.272,-22.506,0.080089],[15.476,-19.702,0.033743],[13.923,-17.598,0.022156],[12.681,-11.64,0.022156],[12.06,-7.7843,0.010569],[12.681,-6.0318,-0.012604],[12.371,-4.6298,-0.012604],[11.128,-5.3308,-0.001017],[10.196,-6.3823,-0.093711],[4.606,1.3288,-0.51083],[3.0531,3.0814,-0.024191],[2.1214,5.5349,-0.035777],[0.56851,8.339,-0.024191],[-0.36322,10.091,-0.024191],[0.56851,12.195,-0.035777],[1.5003,12.896,-0.035777],[3.6743,11.143,-0.024191],[5.2272,9.3905,-0.012604],[6.1589,7.2874,-0.024191],[7.4013,4.8339,-0.012604],[8.6436,4.1329,0.010569],[11.128,7.2874,-0.001017],[13.302,10.442,-0.001017],[16.097,14.298,-0.012604],[18.272,19.205,-0.001017],[22.93,20.957,0.010569],[25.725,23.06,-0.024191],[25.104,21.658,-0.001017],[25.725,16.401,0.010569],[23.241,14.298,0.010569],[23.862,11.494,-0.001017],[24.173,10.442,0.010569],[26.036,3.0814,-0.024191],[22.93,-0.073181,-0.012604],[17.961,-1.4752,0.010569],[17.029,-0.77419,-0.012604],[19.203,0.27732,-0.024191],[20.135,-4.6298,0.010569],[21.067,-10.588,0.022156],[21.377,-16.897,-0.001017],[21.377,-21.454,0.022156],[20.135,-23.557,0.033743],[18.272,-21.454,0.010569],[16.719,-18.299,-0.001017],[15.476,-11.64,-0.001017],[14.545,-7.7843,-0.001017],[14.855,-6.0318,-0.001017],[14.234,-5.3308,-0.012604],[12.681,-6.0318,-0.012604],[11.128,-7.0833,-0.12847],[10.196,-1.1247,-0.52242],[8.9541,0.27732,-0.024191],[7.4013,2.0299,-0.024191],[5.5378,3.7824,-0.024191],[4.2955,6.2359,-0.024191],[3.6743,8.6895,-0.024191],[4.2955,10.091,-0.024191],[5.5378,9.04,-0.012604],[6.7801,8.339,-0.012604],[6.7801,7.6379,-0.024191],[8.333,6.5864,-0.012604],[10.196,8.339,-0.001017],[12.992,13.246,0.010569],[16.408,16.751,0.010569],[20.135,20.607,-0.001017],[22.93,24.813,-0.001017],[26.657,25.163,0.010569],[29.763,26.565,-0.012604],[29.142,24.462,-0.001017],[29.763,18.153,-0.001017],[28.521,15.349,-0.001017],[30.074,11.494,-0.012604],[31.005,9.04,0.010569],[32.248,0.27732,-0.012604],[30.384,-3.5782,-0.001017],[25.104,-4.6298,0.010569],[23.862,-4.2793,-0.024191],[24.483,-2.5267,-0.035777],[24.173,-7.0833,-0.012604],[24.483,-12.691,-0.001017],[24.173,-17.949,-0.024191],[24.483,-22.155,-0.001017],[22.62,-23.207,0.010569],[20.446,-20.403,-0.012604],[18.582,-17.248,-0.012604],[16.719,-10.939,-0.012604],[15.476,-7.0833,-0.001017],[16.097,-5.6813,-0.001017],[14.545,-4.9803,-0.012604],[12.681,-5.3308,-0.012604],[10.507,-6.0318,-0.17482],[14.545,-1.8257,-0.48766],[12.992,-1.4752,-0.024191],[12.06,-0.073181,-0.024191],[10.507,0.97834,-0.024191],[9.2647,2.0299,-0.012604],[8.9541,3.7824,-0.024191],[8.333,4.4834,-0.024191],[8.333,4.4834,-0.012604],[8.0224,5.1844,-0.012604],[8.0224,6.5864,-0.024191],[9.5753,7.2874,-0.012604],[12.681,11.494,-0.001017],[16.097,17.803,0.010569],[19.824,21.658,0.010569],[23.862,25.514,0.010569],[28.21,27.617,-0.001017],[32.248,27.617,-0.001017],[34.732,29.019,-0.012604],[35.043,26.565,-0.001017],[34.732,20.957,-0.001017],[34.732,17.452,-0.012604],[36.596,12.896,-0.012604],[38.459,8.339,-0.001017],[40.323,-1.8257,-0.012604],[39.701,-7.4338,-0.001017],[35.664,-8.8358,-0.001017],[34.422,-8.8358,-0.024191],[32.869,-8.1348,-0.035777],[31.005,-10.588,-0.012604],[29.142,-14.093,-0.012604],[27.899,-17.949,-0.035777],[27.899,-20.403,-0.024191],[24.794,-20.052,-0.012604],[21.998,-16.897,-0.024191],[18.582,-14.093,-0.024191],[16.097,-9.5368,-0.012604],[14.234,-6.0318,-0.001017],[14.545,-4.6298,-0.001017],[12.992,-3.9287,-0.012604],[10.818,-3.5782,-0.012604],[8.6436,-3.5782,-0.20958],[15.166,-1.8257,-0.42972],[13.302,-1.4752,-0.012604],[11.439,-0.42369,-0.024191],[10.507,0.27732,-0.012604],[9.2647,0.97834,-0.012604],[8.9541,2.0299,-0.024191],[8.6436,2.3804,-0.024191],[8.6436,1.6793,-0.012604],[8.6436,2.3804,-0.012604],[8.333,3.7824,-0.024191],[9.5753,6.5864,-0.012604],[10.507,10.091,-0.001017],[12.992,13.947,0.010569],[15.476,17.102,0.010569],[18.893,19.555,0.010569],[22.309,22.359,-0.001017],[26.347,23.06,-0.001017],[30.695,25.864,-0.001017],[34.111,26.565,-0.001017],[36.285,21.658,-0.012604],[37.838,18.504,-0.012604],[40.323,13.597,-0.012604],[42.807,9.04,-0.001017],[45.602,-1.4752,-0.012604],[44.671,-7.0833,-0.001017],[41.876,-8.8358,-0.001017],[40.633,-8.1348,-0.012604],[37.217,-8.4853,-0.024191],[33.179,-10.588,-0.012604],[31.005,-13.392,-0.012604],[28.21,-15.495,-0.035777],[26.036,-16.547,-0.024191],[22.62,-15.495,-0.024191],[19.824,-11.64,-0.024191],[16.719,-9.5368,-0.012604],[14.234,-7.7843,-0.012604],[12.371,-5.6813,-0.012604],[11.128,-4.2793,-0.001017],[9.5753,-2.5267,-0.012604],[8.333,-2.1762,-0.012604],[6.7801,-1.8257,-0.20958],[14.545,-1.8257,-0.3602],[12.681,-1.4752,-0.012604],[11.439,-0.073181,-0.012604],[10.507,0.62783,-0.012604],[9.2647,0.62783,-0.012604],[8.9541,1.6793,-0.012604],[8.6436,1.3288,-0.024191],[8.6436,-0.42369,-0.012604],[8.0224,-0.42369,-0.012604],[7.0907,0.62783,-0.012604],[8.333,4.1329,-0.012604],[8.6436,8.6895,-0.012604],[10.507,11.844,-0.001017],[12.681,14.298,0.010569],[15.476,16.401,-0.001017],[18.582,18.504,-0.012604],[21.377,18.504,-0.012604],[24.173,18.854,-0.001017],[26.968,19.205,-0.012604],[28.521,15.7,-0.012604],[30.074,13.597,-0.012604],[31.937,11.494,-0.012604],[33.179,7.9885,-0.001017],[34.422,0.62783,-0.012604],[33.8,-4.6298,-0.001017],[32.248,-6.3823,-0.001017],[31.937,-6.3823,-0.012604],[30.384,-7.0833,-0.012604],[28.831,-9.8873,-0.001017],[27.278,-12.691,-0.012604],[25.725,-13.392,-0.024191],[23.862,-14.093,-0.024191],[21.067,-13.042,-0.024191],[18.893,-9.5368,-0.024191],[16.408,-7.4338,-0.012604],[14.234,-6.0318,-0.012604],[12.371,-4.6298,-0.012604],[10.818,-2.5267,-0.001017],[9.5753,-1.8257,-0.012604],[8.9541,-1.1247,-0.012604],[8.0224,-0.42369,-0.20958],[12.992,-1.8257,-0.30227],[11.439,-0.77419,-0.012604],[10.507,0.27732,-0.012604],[9.5753,0.97834,-0.012604],[8.9541,0.97834,-0.012604],[8.6436,1.6793,-0.012604],[8.333,0.62783,-0.024191],[8.0224,-1.1247,-0.012604],[7.0907,-1.4752,-0.012604],[6.1589,-0.77419,-0.012604],[6.7801,3.4319,-0.012604],[6.7801,8.6895,-0.012604],[8.333,12.195,-0.001017],[10.196,14.999,-0.001017],[12.371,16.05,-0.001017],[14.545,17.102,-0.012604],[16.408,16.05,-0.012604],[17.961,15.349,-0.001017],[19.203,14.298,-0.001017],[20.446,11.494,-0.012604],[21.377,10.442,-0.012604],[22.62,9.3905,-0.012604],[23.862,6.5864,-0.001017],[23.241,2.0299,-0.001017],[23.241,-2.1762,-0.001017],[22.93,-3.9287,-0.001017],[22.93,-4.2793,-0.001017],[23.862,-5.3308,-0.001017],[24.173,-8.8358,-0.001017],[23.862,-12.341,-0.012604],[22.62,-12.341,-0.024191],[21.377,-12.691,-0.024191],[19.824,-10.939,-0.024191],[17.34,-8.1348,-0.024191],[15.166,-6.3823,-0.012604],[12.992,-5.3308,-0.012604],[11.439,-4.2793,-0.012604],[10.196,-2.1762,-0.001017],[9.2647,-1.4752,-0.012604],[8.9541,-0.77419,-0.012604],[8.0224,-0.073181,-0.20958],[10.818,-0.77419,-0.26751],[9.5753,-0.073181,-0.001017],[8.9541,0.62783,-0.001017],[8.333,1.3288,-0.001017],[8.0224,1.3288,-0.001017],[8.0224,2.0299,-0.012604],[7.4013,0.62783,-0.012604],[7.0907,-1.4752,-0.012604],[6.1589,-1.1247,-0.001017],[4.9166,-0.42369,-0.001017],[5.5378,4.1329,-0.001017],[5.2272,10.091,-0.012604],[6.1589,14.298,-0.001017],[7.0907,17.102,-0.001017],[8.333,17.803,-0.001017],[9.2647,17.452,-0.012604],[11.128,16.05,-0.012604],[12.371,15.349,-0.001017],[13.923,14.298,-0.001017],[14.545,11.494,-0.012604],[14.855,9.741,-0.012604],[16.097,8.339,-0.001017],[16.097,4.8339,-0.001017],[15.476,2.0299,-0.001017],[16.408,-0.42369,-0.001017],[17.34,-1.4752,-0.001017],[18.893,-1.8257,-0.001017],[20.446,-3.9287,-0.001017],[21.377,-8.4853,-0.001017],[21.067,-11.64,-0.012604],[20.446,-10.939,-0.024191],[19.203,-11.64,-0.024191],[17.34,-10.238,-0.024191],[15.476,-7.4338,-0.024191],[13.302,-5.6813,-0.012604],[10.507,-4.9803,-0.012604],[8.9541,-4.2793,-0.012604],[8.0224,-3.2277,-0.001017],[7.4013,-1.8257,-0.012604],[8.0224,-1.4752,-0.012604],[7.0907,-0.77419,-0.20958],[9.2647,-0.073181,-0.24434],[8.6436,0.62783,-0.001017],[8.333,1.3288,-0.001017],[8.0224,1.6793,-0.001017],[7.4013,1.6793,-0.001017],[8.0224,2.0299,-0.012604],[8.0224,0.27732,-0.012604],[8.0224,-1.4752,-0.001017],[7.0907,-1.4752,-0.001017],[5.2272,-0.42369,-0.001017],[5.5378,6.2359,-0.001017],[5.5378,11.494,-0.012604],[6.4695,13.597,-0.001017],[7.0907,15.7,-0.001017],[8.333,15.7,-0.001017],[8.6436,14.298,-0.012604],[10.196,12.195,-0.001017],[10.818,10.792,-0.001017],[11.128,10.091,-0.001017],[12.06,7.9885,-0.001017],[11.128,7.9885,-0.001017],[12.371,7.2874,-0.001017],[12.371,4.8339,-0.001017],[12.371,2.0299,-0.001017],[12.992,-0.073181,-0.001017],[13.923,-1.1247,-0.001017],[15.166,-1.8257,-0.001017],[17.029,-2.5267,-0.001017],[18.272,-7.4338,-0.012604],[18.272,-9.8873,-0.012604],[17.961,-9.1863,-0.012604],[17.34,-9.5368,-0.024191],[16.097,-8.8358,-0.024191],[14.545,-6.7328,-0.012604],[12.371,-5.6813,-0.012604],[10.196,-4.9803,-0.012604],[8.9541,-4.6298,-0.012604],[8.0224,-3.5782,-0.001017],[8.0224,-2.1762,-0.012604],[8.6436,-1.8257,-0.001017],[8.0224,-1.1247,-0.20958],[8.0224,0.97834,-0.22116],[8.0224,1.3288,-0.001017],[8.0224,2.0299,-0.001017],[7.4013,2.0299,-0.001017],[7.4013,2.0299,-0.001017],[8.333,1.6793,-0.001017],[8.9541,-0.073181,-0.012604],[8.9541,-1.4752,-0.001017],[8.333,-1.8257,-0.001017],[6.4695,-1.1247,-0.001017],[5.5378,7.9885,-0.001017],[6.4695,12.896,-0.012604],[7.4013,11.494,-0.001017],[8.333,12.545,0.010569],[9.2647,11.844,-0.001017],[9.2647,10.442,-0.001017],[10.196,7.2874,-0.001017],[10.196,5.1844,0.010569],[10.196,4.1329,-0.001017],[9.5753,3.0814,-0.001017],[8.6436,5.1844,-0.001017],[9.2647,6.5864,-0.001017],[10.196,5.1844,-0.001017],[10.507,2.0299,0.010569],[10.818,-0.77419,-0.001017],[10.507,-1.8257,-0.001017],[11.439,-1.8257,-0.001017],[13.302,-1.8257,-0.001017],[14.855,-5.6813,-0.012604],[15.166,-7.7843,-0.012604],[14.855,-6.7328,-0.012604],[15.166,-7.4338,-0.012604],[14.234,-7.4338,-0.024191],[13.302,-5.6813,-0.012604],[12.06,-5.3308,-0.012604],[10.196,-4.9803,-0.012604],[9.2647,-4.2793,-0.012604],[8.6436,-3.9287,-0.001017],[8.9541,-2.5267,-0.001017],[9.5753,-2.1762,-0.001017],[8.9541,-1.8257,-0.20958],[-4.4008,1.3288,-0.001017],[-2.8479,1.6793,-0.001017],[-2.5373,1.6793,-0.001017],[-0.98438,1.6793,-0.001017],[-0.6738,2.0299,-0.001017],[-2.5373,5.5349,-0.001017],[-1.295,6.5864,-0.001017],[0.56851,6.9369,-0.001017],[0.56851,5.5349,-0.001017],[1.1897,5.1844,-0.001017],[1.5003,4.1329,-0.001017],[2.7426,2.7309,-0.001017],[-0.6738,2.0299,-0.001017],[0.25794,-1.1247,-0.001017],[-0.98438,-1.8257,-0.001017],[-1.295,-2.1762,-0.001017],[-3.1584,-2.1762,-0.001017],[-3.7796,-1.8257,-0.001017],[-3.469,-2.1762,-0.001017],[-3.469,-2.1762,-0.001017],[-2.8479,-2.5267,-0.001017],[-1.295,-3.2277,-0.001017],[-0.36322,-3.9287,-0.001017],[0.25794,-4.6298,-0.001017],[2.1214,-6.3823,-0.001017],[5.2272,-7.4338,-0.001017],[7.4013,-7.7843,-0.001017],[8.9541,-8.4853,-0.001017],[8.9541,-9.5368,-0.001017],[8.6436,-9.5368,-0.001017],[7.0907,-8.4853,-0.001017],[5.2272,-8.8358,-0.001017],[3.6743,-9.1863,-0.001017],[2.1214,-8.1348,-0.001017],[1.1897,-7.0833,-0.001017],[1.1897,-5.6813,-0.001017],[0.56851,-3.2277,-0.001017],[0.56851,-7.0833,-0.001017],[0.25794,-6.0318,-0.001017],[1.5003,-2.5267,-0.001017],[5.2272,-2.1762,-0.001017],[-6.8854,5.1844,-0.070537],[-6.2642,6.5864,-0.012604],[-6.5748,6.9369,-0.012604],[-5.0219,7.6379,-0.012604],[-3.7796,7.6379,-0.012604],[-3.1584,7.6379,-0.001017],[-1.295,6.5864,-0.001017],[0.56851,6.9369,-0.001017],[0.56851,5.5349,-0.001017],[1.1897,5.1844,-0.001017],[1.5003,4.1329,-0.001017],[2.7426,2.7309,-0.001017],[-0.6738,2.0299,-0.001017],[0.25794,-1.1247,-0.001017],[-0.36322,-1.8257,-0.001017],[-0.36322,-1.8257,-0.001017],[-1.6055,-2.1762,-0.001017],[-3.1584,-1.8257,-0.001017],[-3.7796,-1.4752,-0.012604],[-4.4008,-1.1247,-0.012604],[-5.3325,-0.77419,-0.012604],[-4.7113,-0.42369,-0.024191],[-2.5373,0.62783,-0.012604],[-2.5373,1.6793,-0.012604],[0.56851,-1.8257,-0.035777],[5.2272,-4.2793,-0.035777],[9.2647,-5.3308,-0.024191],[12.681,-7.4338,-0.012604],[13.923,-9.8873,-0.001017],[14.234,-13.042,0.010569],[12.371,-14.093,0.022156],[10.507,-15.846,0.022156],[8.6436,-14.093,0.022156],[6.7801,-17.598,0.022156],[5.5378,-16.196,0.022156],[4.606,-9.1863,0.010569],[4.606,-11.289,0.010569],[4.606,-7.7843,0.010569],[7.0907,-4.6298,-0.012604],[8.333,-9.5368,-0.001017],[6.7801,-2.1762,-0.024191],[-6.8854,5.5349,-0.16323],[-6.5748,7.9885,-0.024191],[-6.8854,8.6895,-0.024191],[-5.3325,9.3905,-0.024191],[-4.4008,9.3905,-0.012604],[-2.8479,9.3905,-0.012604],[-0.98438,9.04,-0.012604],[2.432,7.9885,-0.024191],[3.0531,7.2874,-0.012604],[3.6743,5.5349,-0.012604],[3.6743,4.1329,-0.012604],[4.2955,2.0299,-0.001017],[4.2955,0.27732,0.010569],[5.2272,-1.4752,0.022156],[5.5378,-2.5267,0.010569],[6.1589,-3.2277,-0.001017],[4.2955,-2.1762,0.010569],[3.0531,-0.073181,0.010569],[3.3637,1.6793,-0.035777],[2.1214,5.5349,-0.024191],[0.25793,6.2359,-0.035777],[0.56851,4.8339,-0.035777],[2.1214,7.2874,-0.012604],[3.3637,6.9369,-0.001017],[3.6743,4.1329,-0.058951],[6.7801,1.3288,-0.070537],[10.196,-1.8257,-0.047364],[13.302,-4.6298,-0.024191],[15.476,-8.4853,0.010569],[16.408,-13.743,0.022156],[15.476,-17.248,0.045329],[14.234,-20.052,0.056916],[12.371,-22.506,0.045329],[10.818,-20.403,0.033743],[9.5753,-17.598,0.045329],[9.2647,-14.093,0.033743],[8.0224,-10.238,0.010569],[7.0907,-7.0833,0.010569],[7.4013,-4.9803,-0.001017],[6.1589,-5.6813,0.010569],[6.4695,-6.0318,-0.047364],[-6.2642,5.1844,-0.24434],[-6.2642,7.2874,-0.024191],[-6.2642,8.339,-0.024191],[-4.7113,9.04,-0.035777],[-3.469,9.3905,-0.024191],[-2.5373,9.3905,-0.024191],[-0.6738,9.04,-0.024191],[2.432,7.6379,-0.024191],[3.0531,6.5864,-0.024191],[4.2955,4.4834,-0.012604],[4.606,2.7309,-0.001017],[5.5378,0.97834,0.010569],[6.7801,-1.4752,0.010569],[8.6436,-2.5267,-0.001017],[9.5753,-3.9287,-0.012604],[11.128,-3.5782,-0.012604],[10.818,-1.4752,0.010569],[11.439,3.4319,-0.001017],[12.681,7.9885,-0.047364],[12.06,12.896,-0.024191],[10.507,13.597,-0.035777],[10.507,11.844,-0.024191],[10.507,11.494,0.010569],[11.128,11.143,0.022156],[10.196,7.6379,-0.058951],[11.128,3.0814,-0.093711],[12.371,-1.1247,-0.058951],[15.166,-3.5782,-0.024191],[17.029,-6.3823,0.010569],[18.272,-11.289,0.033743],[17.029,-15.145,0.080089],[15.476,-17.949,0.080089],[13.302,-19.351,0.056916],[11.128,-17.598,0.045329],[9.5753,-15.495,0.056916],[8.6436,-10.939,0.045329],[8.9541,-7.7843,0.022156],[8.9541,-5.6813,0.022156],[8.333,-4.6298,0.010569],[6.1589,-4.9803,-0.001017],[5.2272,-5.3308,-0.058951],[-4.7113,5.5349,-0.32544],[-5.0219,7.6379,-0.024191],[-5.3325,8.6895,-0.024191],[-4.7113,9.741,-0.035777],[-3.469,10.091,-0.024191],[-2.8479,10.442,-0.024191],[-0.98438,9.3905,-0.035777],[1.5003,7.6379,-0.024191],[2.7426,7.2874,-0.024191],[4.2955,4.8339,-0.012604],[5.2272,2.0299,0.010569],[6.7801,-0.073181,0.010569],[8.6436,-1.8257,-0.001017],[10.507,-2.5267,-0.024191],[12.371,-2.1762,-0.024191],[14.855,-0.073181,-0.024191],[15.476,6.5864,0.022156],[17.029,11.844,-0.001017],[18.272,13.246,-0.035777],[16.719,15.349,-0.012604],[15.166,14.298,-0.035777],[13.923,10.091,-0.024191],[13.923,8.6895,0.010569],[16.719,8.339,0.022156],[14.855,6.5864,-0.058951],[13.923,3.4319,-0.082124],[12.992,-0.073181,-0.058951],[14.545,-1.8257,-0.024191],[16.097,-3.9287,0.022156],[16.719,-8.8358,0.033743],[16.097,-12.691,0.080089],[14.855,-15.495,0.091676],[12.992,-16.196,0.080089],[11.128,-14.794,0.056916],[10.196,-13.042,0.056916],[10.196,-8.8358,0.045329],[10.818,-5.3308,0.033743],[10.507,-3.5782,0.022156],[10.196,-2.5267,0.022156],[8.0224,-3.2277,0.010569],[6.7801,-3.9287,-0.058951],[-3.1584,5.1844,-0.40655],[-3.7796,7.6379,-0.024191],[-4.7113,9.3905,-0.024191],[-4.4008,10.793,-0.035777],[-3.469,11.494,-0.024191],[-2.8479,11.844,-0.012604],[-0.98438,10.091,-0.024191],[1.1897,7.9885,-0.024191],[3.0531,7.9885,-0.024191],[4.9166,5.1844,-0.012604],[7.0907,1.3288,-0.001017],[8.333,-0.42369,-0.001017],[10.818,-0.42369,-0.012604],[11.439,0.97834,-0.012604],[12.681,3.4319,-0.024191],[14.855,7.9885,-0.024191],[18.272,12.545,0.022156],[21.998,16.05,-0.001017],[24.173,16.751,-0.024191],[23.241,18.504,-0.012604],[21.067,17.102,-0.035777],[18.582,11.844,-0.024191],[18.272,10.091,0.010569],[18.893,7.9885,0.022156],[16.408,5.5349,-0.047364],[13.923,2.7309,-0.070537],[11.439,-0.77419,-0.047364],[12.992,-1.1247,-0.024191],[14.545,-2.5267,0.010569],[15.476,-7.7843,0.033743],[15.166,-11.64,0.080089],[14.545,-14.794,0.080089],[12.681,-16.547,0.056916],[11.439,-15.846,0.045329],[11.128,-14.444,0.045329],[11.128,-9.8873,0.033743],[12.371,-6.3823,0.022156],[12.06,-4.2793,0.022156],[11.439,-2.8772,0.022156],[10.196,-3.5782,0.010569],[8.6436,-3.9287,-0.082124],[0.56851,2.0299,-0.46448],[-0.6738,4.1329,-0.024191],[-1.6055,6.5864,-0.024191],[-2.5373,8.339,-0.035777],[-2.8479,9.741,-0.012604],[-2.2267,10.793,-0.012604],[-0.6738,9.741,-0.024191],[1.1897,7.9885,-0.024191],[2.7426,8.339,-0.012604],[4.9166,6.2359,-0.012604],[7.0907,2.0299,-0.001017],[8.0224,1.6793,-0.001017],[10.818,3.4319,-0.001017],[12.681,6.9369,-0.012604],[14.855,9.741,-0.012604],[17.029,14.298,-0.012604],[20.446,18.153,0.010569],[23.862,19.205,-0.001017],[26.347,19.555,-0.024191],[26.036,20.256,-0.012604],[23.241,17.803,-0.024191],[20.756,12.195,-0.012604],[20.446,10.091,0.010569],[21.067,7.2874,0.022156],[17.961,4.4834,-0.035777],[14.855,1.6793,-0.058951],[12.06,-1.8257,-0.035777],[12.992,-2.5267,-0.024191],[14.234,-4.2793,-0.001017],[15.476,-8.8358,0.022156],[15.476,-13.392,0.045329],[14.855,-16.196,0.056916],[13.923,-17.949,0.033743],[12.992,-17.598,0.022156],[12.681,-15.495,0.022156],[12.681,-10.238,0.022156],[14.234,-6.3823,0.022156],[13.302,-4.2793,0.010569],[13.302,-2.5267,0.010569],[11.439,-2.8772,-0.001017],[9.5753,-2.8772,-0.11688],[4.9166,-0.42369,-0.47607],[3.6743,0.97834,-0.024191],[2.432,2.7309,-0.012604],[1.1897,4.4834,-0.024191],[0.25794,6.5864,-0.012604],[0.56851,7.9885,-0.012604],[1.5003,7.9885,-0.024191],[2.7426,6.9369,-0.024191],[3.3637,7.6379,-0.012604],[5.2272,6.2359,-0.012604],[6.7801,3.4319,-0.001017],[8.333,4.8339,-0.001017],[11.128,9.04,-0.001017],[14.545,12.896,-0.001017],[18.272,16.401,-0.001017],[20.756,19.906,-0.001017],[24.483,22.359,0.010569],[26.968,22.71,-0.001017],[29.142,22.009,-0.012604],[29.142,21.658,-0.001017],[26.968,17.803,-0.012604],[25.104,11.494,-0.012604],[25.104,8.339,-0.001017],[26.347,4.8339,0.010569],[22.62,2.0299,-0.012604],[19.203,-0.77419,-0.035777],[16.097,-3.9287,-0.035777],[16.408,-5.3308,-0.024191],[16.719,-6.3823,-0.001017],[17.961,-10.588,0.010569],[17.029,-14.794,0.022156],[16.719,-16.897,0.022156],[16.097,-18.299,0.010569],[15.166,-17.598,-0.001017],[14.234,-14.794,0.010569],[14.234,-9.5368,0.010569],[14.855,-5.6813,0.010569],[14.234,-3.5782,-0.001017],[13.923,-2.1762,-0.001017],[11.439,-1.8257,-0.012604],[9.2647,-1.8257,-0.16323],[8.9541,-1.4752,-0.47607],[8.0224,-0.42369,-0.012604],[6.7801,0.62783,-0.012604],[6.1589,1.3288,-0.012604],[5.2272,2.3804,-0.012604],[4.9166,3.4319,-0.001017],[4.9166,3.7824,-0.012604],[4.9166,4.1329,-0.012604],[5.2272,5.1844,-0.012604],[6.1589,5.5349,-0.012604],[7.0907,5.5349,-0.001017],[9.2647,8.6895,-0.001017],[12.992,13.947,0.010569],[16.719,18.153,-0.001017],[20.446,20.957,-0.001017],[24.794,23.411,-0.001017],[28.21,25.163,0.010569],[31.005,25.514,-0.001017],[33.179,24.813,-0.012604],[33.8,22.71,-0.001017],[33.179,17.452,-0.001017],[32.869,10.091,-0.012604],[33.8,5.5349,-0.001017],[34.111,1.3288,0.010569],[31.005,-1.8257,-0.001017],[27.278,-4.9803,-0.024191],[23.862,-7.0833,-0.024191],[22.93,-7.7843,-0.012604],[21.377,-8.4853,-0.001017],[20.756,-11.64,-0.001017],[20.135,-14.794,-0.001017],[19.824,-15.846,-0.001017],[18.272,-16.547,-0.012604],[16.408,-14.444,-0.012604],[14.855,-11.64,-0.012604],[13.923,-7.4338,-0.001017],[13.923,-4.2793,-0.001017],[12.992,-2.5267,-0.001017],[12.06,-1.8257,-0.012604],[10.196,-1.4752,-0.012604],[7.4013,-0.77419,-0.19799],[9.5753,-1.1247,-0.42972],[8.333,-0.42369,-0.012604],[7.0907,0.27732,-0.012604],[6.1589,0.62783,-0.012604],[5.2272,1.3288,-0.001017],[5.2272,2.0299,-0.001017],[5.2272,1.6793,-0.012604],[5.5378,1.3288,-0.012604],[5.5378,2.7309,-0.012604],[6.4695,3.0814,-0.001017],[6.7801,4.4834,-0.012604],[7.4013,8.6895,-0.001017],[9.5753,11.143,0.010569],[12.371,13.246,-0.001017],[15.476,16.401,-0.001017],[18.582,19.205,-0.001017],[22.309,20.256,-0.001017],[26.347,20.607,-0.001017],[30.695,21.308,-0.012604],[33.179,21.658,-0.001017],[35.975,17.102,-0.001017],[36.906,10.091,-0.012604],[38.459,6.2359,-0.001017],[40.012,0.97834,-0.001017],[36.906,-2.5267,-0.001017],[33.179,-5.6813,-0.012604],[28.831,-7.7843,-0.012604],[26.036,-7.7843,-0.012604],[24.173,-8.4853,-0.001017],[22.62,-10.588,-0.001017],[21.067,-12.691,-0.012604],[19.203,-13.392,-0.012604],[17.34,-12.691,-0.012604],[15.476,-10.238,-0.024191],[14.234,-7.7843,-0.012604],[12.681,-5.3308,-0.001017],[11.439,-3.5782,-0.012604],[10.196,-2.1762,-0.012604],[8.9541,-1.8257,-0.012604],[8.0224,-1.1247,-0.012604],[6.4695,-0.073181,-0.22116],[9.5753,-0.77419,-0.39496],[8.6436,-0.073181,-0.012604],[7.4013,0.27732,-0.012604],[6.4695,0.62783,-0.012604],[5.5378,1.3288,-0.001017],[5.2272,1.6793,-0.001017],[5.5378,0.62783,-0.012604],[5.2272,-0.42369,-0.012604],[5.2272,0.62783,-0.012604],[5.2272,0.27732,-0.001017],[5.2272,3.0814,-0.012604],[5.5378,7.9885,-0.001017],[7.0907,9.741,-0.001017],[9.2647,11.143,-0.001017],[12.371,13.597,-0.001017],[14.855,16.05,-0.001017],[18.582,16.401,-0.012604],[21.377,15.7,-0.012604],[24.483,15.349,-0.001017],[26.657,14.298,-0.001017],[28.521,12.195,-0.001017],[29.142,9.04,-0.001017],[30.384,6.5864,-0.001017],[31.005,2.0299,-0.001017],[29.142,-2.1762,0.010569],[27.278,-4.6298,-0.001017],[25.104,-6.3823,-0.001017],[24.173,-7.0833,-0.001017],[22.93,-8.1348,-0.001017],[21.377,-10.238,-0.001017],[20.446,-11.289,-0.012604],[18.582,-11.289,-0.012604],[16.719,-10.588,-0.012604],[14.855,-8.1348,-0.024191],[13.923,-5.6813,-0.024191],[12.371,-3.9287,-0.012604],[10.818,-2.1762,-0.012604],[9.2647,-1.4752,-0.012604],[8.6436,-0.77419,-0.012604],[7.4013,-0.073181,-0.012604],[6.7801,0.62783,-0.23275],[8.9541,-0.42369,-0.34862],[8.0224,0.27732,-0.012604],[7.0907,0.62783,-0.001017],[6.4695,0.97834,-0.001017],[5.5378,1.3288,-0.001017],[5.5378,1.3288,-0.001017],[5.5378,-0.073181,-0.012604],[4.9166,-1.1247,-0.012604],[4.606,-0.42369,-0.001017],[4.2955,-0.42369,-0.001017],[3.6743,2.7309,-0.012604],[4.2955,7.9885,-0.012604],[5.2272,10.442,-0.001017],[7.0907,12.195,-0.001017],[9.5753,13.947,-0.001017],[12.371,14.298,-0.012604],[14.855,13.947,-0.012604],[17.029,12.896,-0.001017],[18.893,11.844,-0.001017],[20.446,10.442,-0.001017],[21.067,9.3905,-0.001017],[21.377,7.9885,-0.001017],[21.998,6.5864,-0.001017],[22.309,2.3804,-0.001017],[21.377,-1.4752,0.010569],[21.067,-3.5782,0.010569],[21.067,-4.9803,-0.001017],[21.377,-6.3823,-0.001017],[21.377,-8.1348,-0.001017],[20.135,-9.8873,-0.012604],[18.893,-10.588,-0.012604],[17.34,-10.588,-0.024191],[15.166,-9.5368,-0.024191],[13.923,-6.7328,-0.024191],[12.371,-4.2793,-0.024191],[10.818,-2.8772,-0.012604],[9.2647,-2.1762,-0.012604],[8.333,-1.4752,-0.012604],[7.4013,-0.77419,-0.012604],[7.4013,-0.073181,-0.012604],[6.7801,0.62783,-0.23275],[7.4013,-0.073181,-0.31386],[7.0907,0.62783,-0.012604],[6.4695,0.97834,-0.001017],[6.1589,1.3288,-0.001017],[5.2272,1.6793,-0.001017],[5.2272,1.6793,-0.001017],[5.2272,0.27732,-0.001017],[4.606,-0.77419,-0.001017],[3.6743,0.27732,-0.001017],[3.0531,0.62783,-0.001017],[2.7426,3.7824,-0.012604],[3.0531,9.3905,-0.012604],[4.2955,12.896,-0.001017],[5.5378,15.7,-0.001017],[7.0907,16.401,-0.001017],[9.2647,14.999,-0.012604],[11.128,13.246,-0.012604],[12.681,12.896,-0.001017],[14.545,11.844,-0.001017],[16.097,10.442,-0.001017],[16.719,9.3905,0.010569],[17.029,7.9885,-0.001017],[17.34,5.1844,-0.001017],[17.34,1.6793,-0.001017],[17.34,-0.42369,-0.001017],[17.961,-2.1762,-0.001017],[18.893,-4.2793,-0.001017],[20.135,-6.0318,-0.001017],[20.446,-8.1348,-0.001017],[18.893,-9.5368,-0.012604],[17.029,-10.238,-0.012604],[15.476,-9.8873,-0.024191],[13.302,-8.4853,-0.024191],[12.06,-6.0318,-0.024191],[10.507,-3.5782,-0.012604],[8.6436,-2.5267,-0.012604],[7.0907,-2.5267,-0.012604],[6.4695,-2.1762,-0.012604],[6.1589,-1.8257,-0.012604],[6.4695,-1.1247,-0.001017],[6.4695,-0.42369,-0.24434],[6.4695,0.27732,-0.30227],[6.1589,0.97834,-0.001017],[6.1589,1.3288,-0.001017],[6.1589,1.6793,-0.001017],[5.5378,1.6793,-0.001017],[6.1589,0.97834,-0.001017],[6.4695,-0.42369,-0.001017],[5.2272,-0.77419,-0.001017],[4.2955,-0.073181,-0.001017],[3.0531,0.97834,-0.001017],[2.432,5.5349,-0.012604],[3.6743,10.792,-0.012604],[4.9166,12.195,-0.001017],[6.1589,13.947,-0.001017],[7.4013,14.298,-0.001017],[9.2647,12.195,-0.001017],[10.818,10.442,-0.012604],[12.06,9.741,-0.001017],[12.992,8.6895,-0.001017],[13.923,8.339,-0.001017],[13.923,7.6379,0.010569],[14.234,6.5864,0.010569],[14.545,4.8339,-0.001017],[14.855,2.0299,-0.001017],[14.855,-0.073181,-0.001017],[14.855,-1.8257,-0.001017],[16.097,-3.9287,-0.001017],[17.029,-5.3308,-0.001017],[17.961,-7.0833,-0.012604],[16.408,-8.4853,-0.012604],[14.855,-8.8358,-0.012604],[13.923,-8.4853,-0.012604],[11.439,-7.4338,-0.012604],[10.196,-5.6813,-0.012604],[8.9541,-2.8772,-0.012604],[7.4013,-2.5267,-0.012604],[6.4695,-2.8772,-0.012604],[5.5378,-2.8772,-0.012604],[5.5378,-2.5267,-0.012604],[6.4695,-1.8257,-0.001017],[6.1589,-1.1247,-0.25592],[5.2272,0.62783,-0.29068],[5.5378,1.3288,-0.001017],[6.1589,2.0299,-0.001017],[6.4695,2.0299,-0.001017],[6.4695,1.3288,-0.001017],[7.0907,-0.073181,-0.001017],[7.4013,-1.1247,-0.001017],[6.4695,-1.1247,-0.001017],[5.2272,-0.073181,-0.001017],[3.3637,1.3288,-0.012604],[2.7426,7.6379,-0.012604],[4.9166,11.844,-0.012604],[6.4695,10.442,0.010569],[7.0907,10.792,0.010569],[8.9541,11.143,-0.001017],[10.507,9.04,-0.001017],[11.128,6.9369,-0.001017],[11.439,4.8339,-0.001017],[12.371,4.1329,0.010569],[12.371,4.8339,-0.001017],[11.128,5.5349,0.010569],[12.06,4.8339,0.010569],[12.681,4.4834,-0.001017],[12.992,2.0299,-0.001017],[12.681,-0.073181,-0.001017],[12.371,-1.8257,0.010569],[12.681,-3.9287,-0.001017],[13.923,-4.6298,-0.001017],[14.545,-6.0318,-0.012604],[13.923,-7.0833,-0.012604],[12.681,-6.7328,-0.024191],[11.439,-6.7328,-0.012604],[9.5753,-6.7328,-0.012604],[8.6436,-5.6813,-0.012604],[8.0224,-3.5782,-0.012604],[6.7801,-2.8772,-0.012604],[5.5378,-3.5782,-0.012604],[5.5378,-3.5782,-0.012604],[6.1589,-3.9287,-0.012604],[6.4695,-2.5267,-0.001017],[6.4695,-1.4752,-0.25592],[-4.7113,2.0299,-0.001017],[-3.469,2.3804,-0.001017],[-2.2267,2.3804,-0.001017],[0.25794,1.6793,-0.001017],[-1.295,3.7824,-0.001017],[-2.2267,5.5349,-0.001017],[-1.6055,5.1844,-0.001017],[-0.36322,3.0814,-0.001017],[-0.36322,2.7309,-0.001017],[-0.98438,4.8339,-0.001017],[-1.6055,4.4834,-0.001017],[-2.5373,2.7309,-0.001017],[-3.7796,-0.073182,-0.001017],[-5.0219,-1.8257,-0.001017],[-5.0219,-1.8257,-0.001017],[-5.6431,-0.77419,-0.001017],[-6.8854,-0.77419,-0.001017],[-7.196,-0.42369,-0.001017],[-8.4383,-0.073182,-0.001017],[-9.0594,0.62783,-0.001017],[-6.8854,-0.073182,-0.001017],[-5.6431,-0.073182,-0.001017],[-5.0219,-1.1247,-0.001017],[-3.7796,-1.8257,-0.001017],[-0.6738,-1.8257,-0.001017],[2.1214,-1.8257,-0.001017],[5.2272,-4.2793,-0.001017],[6.7801,-6.0318,-0.001017],[8.0224,-7.4338,-0.001017],[8.333,-8.8358,-0.001017],[7.4013,-10.939,-0.001017],[6.4695,-10.939,-0.001017],[4.2955,-10.939,-0.001017],[2.7426,-10.939,-0.001017],[1.5003,-10.238,-0.001017],[2.1214,-7.7843,-0.001017],[2.1214,-6.3823,-0.001017],[2.1214,-8.4853,-0.001017],[1.1897,-7.7843,-0.001017],[3.6743,-3.9287,-0.001017],[4.606,-1.8257,-0.001017],[-8.4383,4.8339,-0.070537],[-6.8854,6.9369,-0.012604],[-5.6431,7.2874,-0.012604],[-4.4008,7.2874,-0.012604],[-3.469,7.2874,-0.012604],[-2.5373,7.2874,-0.001017],[-1.6055,5.1844,-0.001017],[-0.36322,3.4319,-0.001017],[-0.36322,2.7309,-0.001017],[-0.98438,4.8339,-0.001017],[-1.6055,4.4834,-0.001017],[-2.5373,2.7309,-0.001017],[-3.7796,-0.073181,-0.001017],[-6.2642,-1.8257,-0.001017],[-6.2642,-1.8257,-0.001017],[-6.8854,-1.8257,-0.001017],[-9.0594,-1.4752,-0.001017],[-9.6806,-1.1247,-0.012604],[-10.612,-0.42369,-0.012604],[-10.302,0.62783,-0.024191],[-6.8854,0.27732,-0.035777],[-5.0219,1.3288,-0.035777],[-3.7796,0.97834,-0.024191],[-2.2267,0.27732,-0.047364],[2.432,-0.77419,-0.058951],[6.1589,-1.4752,-0.047364],[9.5753,-4.9803,-0.035777],[12.371,-8.4853,-0.024191],[13.923,-12.691,-0.012604],[14.234,-14.444,-0.012604],[13.302,-15.145,-0.001017],[12.681,-19.351,0.010569],[11.128,-18.299,0.022156],[9.5753,-16.897,0.022156],[8.0224,-16.547,0.022156],[7.0907,-16.196,0.010569],[6.4695,-12.691,0.010569],[5.5378,-8.1348,-0.001017],[8.9541,-5.6813,-0.012604],[10.196,-9.5368,-0.012604],[5.5378,-2.5267,-0.001017],[-8.4383,4.8339,-0.15164],[-7.196,7.6379,-0.024191],[-6.2642,9.04,-0.024191],[-4.7113,9.04,-0.012604],[-3.469,9.04,-0.024191],[-2.8479,9.04,-0.012604],[-1.6055,7.2874,0.010569],[-0.98438,6.9369,0.010569],[0.25793,7.2874,-0.012604],[1.5003,6.2359,-0.012604],[1.1897,3.4319,-0.001017],[1.5003,1.3288,0.010569],[0.25793,0.27732,0.033743],[2.1214,-1.1247,0.010569],[3.0531,-1.4752,-0.001017],[1.1897,-0.77419,0.010569],[0.56851,0.62783,0.010569],[-0.6738,3.4319,0.010569],[-1.6055,7.2874,0.010569],[-3.1584,9.741,-0.035777],[-0.98438,11.143,-0.070537],[-0.6738,9.04,-0.058951],[0.56851,7.6379,-0.047364],[2.432,6.5864,-0.082124],[5.5378,4.4834,-0.11688],[8.6436,1.3288,-0.1053],[11.439,-2.1762,-0.070537],[13.923,-6.3823,-0.035777],[16.097,-10.588,-0.012604],[16.719,-15.145,-0.001017],[16.719,-19,0.022156],[15.476,-21.454,0.033743],[14.545,-22.506,0.045329],[12.681,-19.702,0.045329],[11.128,-16.897,0.045329],[10.507,-14.093,0.045329],[9.5753,-11.289,0.010569],[8.333,-7.7843,-0.001017],[8.333,-5.3308,-0.001017],[7.0907,-4.2793,-0.001017],[5.5378,-3.9287,-0.001017],[-7.196,4.4834,-0.23275],[-6.2642,6.9369,-0.024191],[-5.3325,8.339,-0.024191],[-3.7796,8.339,-0.024191],[-2.8479,8.6895,-0.035777],[-2.5373,8.339,-0.024191],[-1.295,6.5864,0.010569],[0.25794,5.1844,-0.001017],[1.1897,6.5864,-0.024191],[2.7426,4.4834,-0.012604],[3.0531,1.6793,0.010569],[4.2955,-0.42369,0.022156],[5.2272,-2.5267,0.033743],[8.0224,-3.5782,-0.012604],[8.9541,-4.2793,-0.001017],[8.9541,-2.8772,0.010569],[8.333,-0.42369,-0.001017],[8.333,3.0814,0.010569],[7.4013,7.2874,0.022156],[7.0907,10.792,-0.035777],[8.9541,12.896,-0.093711],[8.333,10.792,-0.070537],[8.6436,8.339,-0.047364],[9.5753,6.2359,-0.082124],[11.439,4.1329,-0.14006],[12.992,0.62783,-0.12847],[14.545,-2.5267,-0.082124],[15.476,-6.3823,-0.035777],[17.029,-9.5368,-0.012604],[17.34,-13.042,-0.001017],[16.719,-15.145,0.022156],[15.166,-16.897,0.045329],[13.302,-17.598,0.056916],[11.439,-15.846,0.056916],[9.5753,-14.444,0.056916],[8.6436,-11.289,0.056916],[9.2647,-8.4853,0.033743],[9.2647,-6.0318,0.010569],[8.6436,-2.8772,0.010569],[6.7801,-2.5267,0.010569],[4.606,-3.5782,-0.012604],[-6.2642,5.1844,-0.31386],[-5.3325,7.2874,-0.024191],[-4.7113,8.339,-0.035777],[-3.7796,8.6895,-0.024191],[-3.469,9.04,-0.035777],[-3.1584,9.04,-0.024191],[-2.5373,7.6379,0.010569],[-0.6738,6.2359,-0.012604],[0.56851,5.5349,-0.024191],[2.432,3.0814,-0.001017],[3.3637,0.97834,0.010569],[4.9166,-1.4752,0.022156],[7.0907,-3.5782,0.022156],[8.9541,-4.2792,-0.024191],[11.128,-4.2792,-0.012604],[12.992,-1.1247,-0.001017],[14.545,4.1329,-0.001017],[14.545,10.442,0.022156],[15.166,14.298,0.022156],[16.408,16.751,-0.035777],[17.34,17.102,-0.093711],[15.166,13.597,-0.070537],[15.166,10.793,-0.058951],[16.408,7.9885,-0.082124],[15.476,5.5349,-0.14006],[14.855,2.0299,-0.12847],[14.234,-1.1247,-0.082124],[13.923,-3.5782,-0.035777],[14.234,-6.7328,-0.012604],[14.855,-9.1863,-0.001017],[13.923,-10.588,0.033743],[12.681,-12.341,0.045329],[10.818,-13.392,0.056916],[9.2647,-11.64,0.080089],[8.6436,-10.588,0.080089],[8.333,-8.8358,0.056916],[10.196,-6.7328,0.033743],[10.196,-3.9287,0.010569],[9.5753,-1.8257,0.022156],[8.333,-1.4752,0.022156],[6.1589,-1.8257,-0.012604],[-4.7113,5.5349,-0.38338],[-4.7113,7.6379,-0.024191],[-4.7113,9.04,-0.024191],[-4.4008,9.3905,-0.024191],[-3.7796,9.741,-0.024191],[-3.469,9.3905,-0.012604],[-2.5373,7.9885,-0.001017],[-0.6738,6.5864,-0.012604],[0.87909,4.8339,-0.024191],[3.0531,2.3804,-0.001017],[4.9166,0.97834,0.010569],[7.0907,-1.4752,0.010569],[9.2647,-2.5267,0.010569],[10.507,-1.8257,-0.024191],[11.128,-0.073181,-0.012604],[13.302,4.8339,-0.012604],[14.855,9.741,-0.001017],[17.961,13.597,0.022156],[20.756,16.401,0.022156],[21.377,17.803,-0.035777],[21.998,17.803,-0.082124],[18.582,14.298,-0.070537],[17.34,10.091,-0.058951],[18.582,6.5864,-0.070537],[16.719,3.4319,-0.11688],[14.545,0.62783,-0.1053],[12.992,-1.8257,-0.070537],[12.06,-2.1762,-0.035777],[12.681,-4.9803,-0.001017],[12.681,-7.7843,0.010569],[11.128,-8.4853,0.022156],[10.507,-10.939,0.045329],[8.9541,-12.691,0.056916],[8.0224,-12.341,0.056916],[7.4013,-10.939,0.056916],[8.0224,-9.1863,0.045329],[10.507,-6.7328,0.033743],[10.507,-3.5782,0.010569],[10.507,-1.4752,0.022156],[9.5753,-1.1247,0.010569],[8.0224,-1.8257,-0.035777],[-2.2267,3.0814,-0.42972],[-3.1584,4.8339,-0.024191],[-3.7796,6.5864,-0.024191],[-4.4008,7.6379,-0.012604],[-3.7796,8.339,-0.012604],[-3.1584,8.6895,-0.012604],[-2.2267,7.9885,-0.001017],[-0.6738,6.9369,-0.012604],[0.56851,4.4834,-0.012604],[2.7426,2.3804,-0.001017],[4.606,1.3288,-0.001017],[6.1589,-0.073181,-0.001017],[8.333,-0.42369,-0.001017],[10.818,2.3804,-0.012604],[12.992,6.5864,-0.001017],[15.476,10.793,-0.012604],[17.961,14.999,-0.001017],[20.756,17.452,0.010569],[22.93,18.854,0.010569],[24.173,19.205,-0.024191],[24.173,18.504,-0.047364],[20.446,14.298,-0.047364],[19.203,9.741,-0.047364],[19.824,5.5349,-0.058951],[17.34,2.7309,-0.082124],[14.855,-0.073181,-0.070537],[12.681,-1.8257,-0.058951],[11.128,-2.8772,-0.024191],[12.06,-6.3823,-0.001017],[12.371,-9.1863,0.010569],[10.818,-9.5368,0.022156],[10.196,-12.691,0.033743],[9.2647,-14.444,0.033743],[8.333,-13.743,0.045329],[8.333,-11.64,0.045329],[8.9541,-9.5368,0.033743],[11.439,-6.3823,0.022156],[11.439,-2.1762,0.010569],[11.439,-0.073181,0.010569],[10.818,0.27732,-0.001017],[8.6436,0.27732,-0.082124],[1.1897,0.62783,-0.46448],[0.25794,2.0299,-0.024191],[-0.98438,3.4319,-0.024191],[-1.6055,4.8339,-0.012604],[-2.2267,5.5349,-0.012604],[-1.295,6.5864,-0.001017],[-0.36322,6.5864,-0.001017],[0.25794,5.5349,-0.012604],[0.87909,4.1329,-0.012604],[2.7426,3.0814,-0.001017],[3.6743,3.0814,-0.001017],[5.2272,2.7309,-0.001017],[8.0224,3.7824,0.010569],[11.439,8.339,-0.001017],[16.097,12.545,-0.001017],[18.582,16.401,-0.012604],[21.377,19.906,-0.001017],[24.173,21.308,0.010569],[25.725,21.308,0.010569],[26.657,20.607,-0.012604],[26.968,18.504,-0.024191],[23.862,13.597,-0.024191],[22.309,8.6895,-0.035777],[22.309,4.1329,-0.035777],[20.135,1.3288,-0.047364],[17.029,-1.1247,-0.047364],[14.545,-3.5782,-0.035777],[12.681,-4.9803,-0.024191],[12.681,-7.7843,-0.001017],[12.992,-10.588,0.010569],[12.06,-11.289,0.010569],[11.128,-14.093,0.022156],[10.507,-15.145,0.022156],[9.2647,-13.392,0.022156],[9.2647,-10.939,0.022156],[10.196,-8.8358,0.010569],[12.371,-5.3308,0.010569],[12.371,-1.8257,-0.001017],[11.439,0.62783,-0.001017],[10.818,1.3288,-0.001017],[8.333,1.6793,-0.14006],[4.9166,-0.42369,-0.46448],[4.2955,0.62783,-0.012604],[3.3637,1.3288,-0.024191],[2.7426,2.0299,-0.012604],[2.432,2.7309,-0.001017],[2.432,3.4319,-0.001017],[2.432,3.7824,-0.001017],[2.7426,3.7824,-0.012604],[2.7426,3.4319,-0.012604],[3.3637,4.1329,-0.001017],[4.2955,5.5349,-0.001017],[6.1589,6.9369,-0.001017],[8.9541,9.741,0.010569],[13.302,13.597,0.010569],[17.961,16.751,-0.012604],[20.446,19.555,-0.012604],[23.862,22.71,-0.001017],[26.657,23.411,0.010569],[28.831,22.71,0.010569],[30.074,21.308,-0.001017],[31.005,17.452,-0.001017],[28.521,11.494,-0.012604],[27.278,6.5864,-0.024191],[26.657,1.6793,-0.024191],[24.483,-1.4752,-0.024191],[21.377,-2.8772,-0.012604],[18.582,-5.3308,-0.024191],[16.097,-6.7328,-0.012604],[14.855,-8.4853,-0.001017],[14.855,-10.588,-0.001017],[13.923,-12.341,0.010569],[12.992,-13.743,0.010569],[12.06,-13.392,-0.001017],[10.818,-10.939,-0.001017],[10.507,-8.4853,-0.001017],[10.818,-6.7328,-0.001017],[12.371,-3.9287,-0.001017],[11.439,-1.4752,-0.001017],[10.818,0.27732,-0.012604],[9.2647,1.3288,-0.012604],[6.7801,2.3804,-0.1864],[4.9166,-0.42369,-0.44131],[4.606,0.27732,-0.012604],[4.2955,0.97834,-0.012604],[3.3637,1.3288,-0.012604],[3.0531,1.6793,-0.001017],[3.0531,2.0299,-0.001017],[3.0531,1.3288,-0.001017],[3.0531,0.62783,-0.012604],[3.3637,0.97834,-0.012604],[3.6743,2.0299,-0.001017],[4.2955,4.8339,-0.001017],[5.2272,7.6379,-0.001017],[7.4013,9.3905,-0.001017],[9.2647,10.442,0.010569],[12.06,12.545,-0.001017],[15.166,15.7,-0.012604],[18.582,16.751,-0.001017],[21.998,17.452,-0.001017],[25.104,17.803,-0.001017],[28.21,17.452,0.010569],[31.005,14.298,-0.001017],[31.005,9.741,-0.001017],[31.005,5.1844,-0.024191],[30.384,1.6793,-0.012604],[27.278,-1.1247,-0.001017],[24.173,-3.5782,-0.001017],[21.067,-5.3308,-0.012604],[18.582,-6.3823,-0.012604],[17.34,-7.4338,-0.001017],[16.719,-9.1863,-0.001017],[15.166,-10.238,-0.001017],[13.923,-10.588,-0.001017],[12.681,-10.238,-0.012604],[11.439,-8.1348,-0.001017],[10.818,-5.6813,-0.012604],[10.507,-3.9287,-0.012604],[10.507,-1.8257,-0.001017],[9.5753,-0.77419,-0.012604],[8.9541,-0.42369,-0.012604],[7.4013,0.27732,-0.024191],[6.1589,1.6793,-0.22116],[5.2272,-0.42369,-0.41814],[4.9166,0.27732,-0.012604],[4.9166,0.97834,-0.012604],[4.2955,1.3288,-0.001017],[3.6743,1.6793,-0.001017],[3.6743,1.6793,-0.001017],[3.6743,0.27732,-0.001017],[3.3637,-0.77419,-0.012604],[3.3637,-0.77419,-0.001017],[3.3637,0.27732,-0.001017],[3.0531,3.7824,-0.001017],[4.2955,7.2874,-0.012604],[6.1589,9.04,-0.001017],[7.0907,9.04,-0.001017],[9.2647,10.793,-0.012604],[12.371,12.896,-0.001017],[15.476,12.545,-0.001017],[18.893,12.545,-0.001017],[21.377,12.896,-0.001017],[23.862,12.195,-0.001017],[25.104,10.442,0.010569],[26.036,7.9885,-0.001017],[26.036,5.1844,-0.012604],[25.725,2.3804,-0.001017],[23.862,-0.77419,0.010569],[22.309,-3.5782,0.010569],[20.446,-4.9803,-0.001017],[18.893,-6.0318,-0.001017],[18.272,-7.4338,-0.001017],[17.34,-8.8358,-0.001017],[16.097,-9.5368,-0.001017],[14.545,-9.1863,-0.012604],[12.992,-8.1348,-0.012604],[11.128,-6.3823,-0.012604],[10.196,-3.9287,-0.012604],[9.5753,-1.8257,-0.012604],[8.9541,-1.1247,-0.012604],[8.333,-0.77419,-0.012604],[8.0224,-0.42369,-0.012604],[6.7801,0.27732,-0.024191],[6.1589,1.6793,-0.24434],[4.9166,-0.073181,-0.39496],[4.9166,0.62783,-0.001017],[4.9166,1.3288,-0.012604],[4.606,1.6793,-0.001017],[4.2955,1.6793,-0.001017],[4.2955,1.3288,-0.001017],[4.2955,0.27732,-0.001017],[3.3637,-1.1247,-0.012604],[3.0531,-1.1247,-0.001017],[2.7426,-0.073181,-0.001017],[2.1214,4.1329,-0.001017],[3.0531,7.6379,-0.012604],[4.9166,9.741,-0.001017],[6.1589,10.442,-0.001017],[8.333,10.792,-0.012604],[10.818,11.844,-0.001017],[13.302,11.143,-0.012604],[16.097,10.442,-0.012604],[18.272,10.091,-0.001017],[19.203,9.3905,-0.001017],[20.135,8.339,0.010569],[20.756,7.2874,0.010569],[20.756,5.1844,-0.012604],[20.756,2.3804,-0.001017],[20.135,-0.42369,0.010569],[19.824,-2.8772,0.010569],[18.893,-4.9803,-0.001017],[18.582,-6.0318,-0.001017],[17.961,-7.4338,-0.001017],[17.029,-8.8358,-0.001017],[15.476,-8.8358,-0.012604],[14.234,-8.4853,-0.012604],[12.06,-7.0833,-0.012604],[10.507,-4.9803,-0.012604],[8.9541,-2.8772,-0.012604],[8.333,-1.4752,-0.012604],[7.4013,-1.1247,-0.012604],[7.0907,-1.1247,-0.012604],[6.7801,-1.1247,-0.012604],[6.4695,-0.073181,-0.012604],[6.1589,1.3288,-0.26751],[4.606,-0.073181,-0.37179],[4.606,0.62783,-0.001017],[4.9166,1.3288,-0.001017],[4.606,1.6793,-0.001017],[4.2955,1.6793,-0.001017],[4.606,1.6793,0.010569],[4.606,0.62783,-0.001017],[3.3637,-0.42369,-0.001017],[2.432,-0.42369,-0.001017],[2.1214,0.97834,-0.001017],[1.1897,5.1844,-0.012604],[2.432,8.6895,-0.012604],[3.6743,10.792,-0.001017],[5.5378,13.246,-0.001017],[8.333,12.896,-0.012604],[9.5753,12.195,-0.001017],[11.128,11.494,-0.001017],[12.992,10.442,-0.012604],[14.855,9.741,-0.001017],[16.408,9.3905,-0.001017],[17.029,8.339,0.010569],[17.961,7.2874,0.010569],[18.272,5.1844,-0.001017],[18.272,2.0299,-0.001017],[18.272,-0.073181,0.010569],[18.272,-2.5267,0.010569],[17.961,-4.9803,-0.001017],[17.961,-6.0318,-0.001017],[17.029,-7.4338,-0.001017],[16.408,-8.4853,-0.012604],[14.855,-8.1348,-0.012604],[12.992,-7.7843,-0.012604],[10.507,-6.0318,-0.012604],[8.6436,-4.2793,-0.012604],[7.0907,-2.1762,-0.012604],[6.7801,-1.4752,-0.012604],[5.5378,-1.4752,-0.012604],[5.5378,-1.8257,-0.012604],[5.5378,-2.1762,-0.012604],[5.2272,-1.4752,-0.012604],[5.2272,-0.073181,-0.30227],[3.3637,0.27732,-0.3602],[3.6743,0.27732,-0.001017],[4.606,0.97834,-0.001017],[4.606,1.6793,-0.001017],[4.9166,1.6793,-0.001017],[5.2272,0.97834,-0.001017],[4.9166,0.62783,-0.001017],[3.6743,0.27732,-0.001017],[2.432,0.97834,-0.001017],[1.5003,2.3804,-0.012604],[1.1897,5.5349,-0.012604],[3.0531,9.04,-0.012604],[4.9166,10.442,-0.001017],[6.1589,11.844,-0.001017],[8.6436,11.143,-0.001017],[10.196,10.442,-0.001017],[11.128,9.3905,-0.001017],[12.371,7.9885,-0.012604],[13.302,7.6379,-0.001017],[14.545,7.2874,-0.001017],[14.855,6.9369,0.010569],[15.476,6.2359,0.010569],[16.097,4.4834,-0.001017],[16.097,1.6793,0.010569],[16.097,-0.42369,0.010569],[15.476,-2.5267,0.010569],[15.476,-4.9803,0.010569],[15.476,-5.6813,-0.001017],[14.855,-6.3823,-0.001017],[13.923,-7.0833,-0.012604],[12.681,-6.7328,-0.012604],[10.818,-6.3823,-0.012604],[8.6436,-5.3308,-0.012604],[6.7801,-4.2793,-0.012604],[5.5378,-2.5267,-0.012604],[5.2272,-1.8257,-0.012604],[4.606,-1.8257,-0.012604],[4.606,-2.8772,-0.012604],[4.606,-3.5782,-0.012604],[4.606,-2.1762,-0.012604],[4.606,-0.77419,-0.31386],[2.7426,0.62783,-0.34862],[3.0531,0.27732,-0.001017],[4.2955,0.62783,-0.001017],[4.9166,1.6793,-0.001017],[5.5378,1.3288,-0.001017],[5.5378,0.62783,-0.001017],[5.2272,0.62783,-0.012604],[3.6743,0.62783,-0.001017],[2.7426,2.0299,-0.001017],[2.1214,3.7824,-0.012604],[2.1214,6.2359,-0.012604],[4.606,9.04,-0.012604],[6.7801,9.741,-0.001017],[7.0907,9.3905,-0.001017],[9.2647,8.339,-0.001017],[11.128,7.6379,-0.001017],[12.06,6.5864,-0.001017],[12.371,4.8339,-0.012604],[12.681,4.1329,-0.012604],[12.992,4.8339,0.010569],[13.302,5.1844,0.022156],[13.302,4.8339,0.010569],[13.923,4.1329,0.010569],[13.923,1.6793,0.010569],[13.923,-0.42369,0.010569],[12.992,-2.1762,0.010569],[12.681,-4.6298,0.010569],[12.681,-4.9803,-0.001017],[12.371,-5.3308,-0.001017],[11.128,-5.3308,-0.012604],[10.196,-4.6298,-0.012604],[8.6436,-4.9803,-0.012604],[7.0907,-4.2793,-0.012604],[5.2272,-4.2793,-0.012604],[4.2955,-3.5782,-0.012604],[3.6743,-1.8257,-0.012604],[3.3637,-2.5267,-0.012604],[3.3637,-3.9287,-0.012604],[3.3637,-4.2793,-0.012604],[3.3637,-2.8772,-0.012604],[3.3637,-1.4752,-0.32544],[-3.7796,2.0299,-0.001017],[-2.8479,2.3804,-0.001017],[-1.295,1.6793,-0.001017],[-0.6738,2.3804,-0.001017],[-0.98438,4.1329,-0.001017],[-0.6738,4.1329,-0.001017],[0.25794,1.6793,-0.001017],[-0.98438,2.0299,-0.001017],[-3.469,4.4834,-0.001017],[-4.4008,3.7824,-0.001017],[-3.7796,1.3288,-0.001017],[-5.0219,-0.073182,-0.001017],[-5.3325,-0.77419,-0.001017],[-6.2642,0.27732,-0.001017],[-6.8854,-0.073182,-0.001017],[-8.7489,0.97833,-0.001017],[-10.302,1.6793,-0.001017],[-10.302,1.6793,-0.001017],[-9.6806,0.62783,-0.001017],[-8.7489,0.27732,-0.001017],[-6.8854,-0.77419,-0.001017],[-3.7796,-1.4752,-0.001017],[-2.2267,-2.1762,-0.001017],[-0.98438,-2.1762,-0.001017],[0.25794,-1.8257,-0.001017],[2.432,-3.9287,-0.001017],[4.606,-5.6813,-0.001017],[6.4695,-7.4338,-0.001017],[7.0907,-9.1863,-0.001017],[6.7801,-10.238,-0.001017],[6.1589,-10.939,-0.001017],[5.2272,-11.289,-0.001017],[4.2955,-11.64,-0.001017],[3.6743,-12.341,-0.001017],[2.432,-10.588,-0.001017],[2.7426,-8.8358,-0.001017],[2.7426,-7.7843,-0.001017],[2.432,-9.5368,-0.001017],[1.5003,-8.4853,-0.001017],[3.0531,-4.2793,-0.001017],[2.7426,-1.8257,-0.001017],[-8.1277,4.4834,-0.047364],[-6.8854,5.5349,-0.012604],[-5.6431,5.5349,-0.012604],[-4.7113,6.2359,-0.012604],[-3.7796,8.6895,-0.001017],[-1.6055,6.2359,-0.001017],[-0.36322,2.7309,-0.001017],[-1.6055,3.7824,-0.001017],[-3.469,4.4834,-0.001017],[-4.4008,3.7824,-0.001017],[-3.7796,1.3288,-0.001017],[-5.0219,-0.073181,-0.001017],[-6.5748,-0.77419,-0.001017],[-7.5065,-0.42369,-0.001017],[-9.0594,-1.1247,-0.001017],[-10.612,-0.42369,-0.001017],[-11.233,-0.42369,-0.012604],[-12.165,0.27732,-0.012604],[-12.165,0.97834,-0.012604],[-12.786,2.3804,-0.012604],[-12.476,3.7824,-0.035777],[-8.4383,4.4834,-0.047364],[-5.6431,3.0814,-0.035777],[-2.8479,2.0299,-0.035777],[0.56851,0.27732,-0.035777],[4.606,-2.1762,-0.047364],[8.333,-5.3308,-0.035777],[11.128,-9.1863,-0.035777],[12.992,-12.341,-0.024191],[13.302,-14.794,-0.012604],[12.992,-16.547,-0.012604],[12.681,-17.598,-0.001017],[12.371,-18.299,-0.001017],[12.06,-21.805,0.010569],[10.818,-22.506,0.010569],[8.9541,-16.547,0.010569],[8.333,-13.392,0.010569],[7.4013,-10.238,-0.001017],[10.507,-6.3823,-0.012604],[8.9541,-6.7328,-0.012604],[5.2272,-3.5782,-0.001017],[-8.4383,4.8339,-0.12847],[-7.5065,6.2359,-0.012604],[-6.5748,7.2874,-0.012604],[-5.0219,8.339,-0.024191],[-3.7796,9.04,-0.012604],[-2.8479,8.339,-0.001017],[-2.5373,6.9369,-0.001017],[-2.8479,6.2359,0.010569],[-2.5373,5.5349,0.010569],[-1.295,4.4834,0.010569],[-1.6055,2.7309,0.033743],[-1.6055,1.3288,0.022156],[-2.2267,0.27732,0.022156],[-1.6055,-1.1247,0.010569],[-2.8479,-1.4752,0.010569],[-3.469,-0.42369,0.010569],[-4.4008,0.27732,-0.001017],[-5.0219,2.7309,-0.012604],[-6.5748,6.2359,-0.012604],[-6.5748,8.6895,-0.001017],[-6.2642,11.143,-0.058951],[-3.469,11.143,-0.082124],[-1.295,7.6379,-0.070537],[1.1897,5.5349,-0.070537],[4.2955,3.0814,-0.082124],[8.333,-0.42369,-0.082124],[12.06,-4.6298,-0.082124],[14.855,-8.8358,-0.058951],[16.719,-12.691,-0.047364],[16.719,-15.145,-0.012604],[16.097,-17.248,-0.012604],[15.476,-20.052,-0.012604],[14.545,-21.454,0.010569],[12.992,-19.351,0.033743],[12.06,-17.248,0.022156],[10.818,-14.444,0.033743],[10.196,-11.64,0.022156],[8.6436,-8.4853,-0.001017],[8.6436,-5.6813,-0.001017],[7.4013,-3.5782,-0.001017],[5.2272,-1.4752,-0.012604],[-6.8854,4.4834,-0.20958],[-6.2642,5.1844,-0.012604],[-5.0219,6.2359,-0.024191],[-3.7796,7.2874,-0.024191],[-2.8479,8.339,-0.024191],[-2.2267,8.339,-0.012604],[-1.6055,6.2359,-0.001017],[-1.295,4.4834,0.010569],[-0.6738,3.7824,-0.001017],[0.87909,3.0814,0.010569],[1.1897,0.97834,0.033743],[3.0531,-1.8257,0.033743],[4.2955,-3.5782,0.033743],[5.5378,-4.6298,0.022156],[6.4695,-4.2793,0.022156],[4.9166,-1.1247,0.010569],[4.9166,1.3288,-0.001017],[4.2955,3.7824,-0.001017],[3.6743,6.9369,-0.001017],[3.6743,8.6895,-0.001017],[5.2272,10.792,-0.070537],[6.7801,10.792,-0.1053],[8.333,6.5864,-0.093711],[9.5753,4.1329,-0.093711],[11.128,2.3804,-0.1053],[13.302,-1.1247,-0.1053],[15.476,-4.6298,-0.1053],[17.029,-7.4338,-0.082124],[17.34,-10.588,-0.047364],[17.029,-12.691,-0.012604],[16.097,-14.093,-0.012604],[14.545,-15.846,-0.012604],[12.681,-15.846,0.010569],[10.507,-14.794,0.045329],[9.2647,-13.392,0.033743],[8.6436,-11.64,0.045329],[8.333,-9.5368,0.033743],[8.6436,-6.0318,0.010569],[8.0224,-2.8772,0.010569],[6.4695,-1.4752,0.010569],[3.6743,-0.42369,-0.012604],[-5.6431,4.8339,-0.2791],[-5.3325,6.2359,-0.012604],[-4.4008,6.9369,-0.024191],[-3.7796,7.9885,-0.024191],[-3.469,9.3905,-0.024191],[-3.469,9.04,-0.012604],[-3.1584,7.2874,-0.012604],[-2.5373,4.8339,0.010569],[-1.295,3.7824,-0.001017],[0.25793,2.0299,0.010569],[1.1897,-0.42369,0.022156],[3.6743,-3.5782,0.022156],[5.2272,-4.2792,0.010569],[7.4013,-5.6813,0.010569],[9.5753,-5.3308,0.010569],[11.128,-1.4752,-0.001017],[12.371,3.4319,-0.012604],[13.302,8.339,-0.001017],[14.234,13.246,0.010569],[15.166,14.298,-0.001017],[17.961,16.05,-0.082124],[18.272,14.298,-0.11688],[17.961,9.741,-0.1053],[17.34,7.2874,-0.1053],[16.719,4.1329,-0.11688],[16.408,0.97834,-0.11688],[16.097,-1.8257,-0.11688],[15.166,-4.2792,-0.093711],[14.545,-6.7328,-0.047364],[14.234,-8.8358,-0.012604],[12.992,-9.5368,-0.012604],[11.439,-10.588,-0.012604],[9.2647,-10.588,0.010569],[8.0224,-10.238,0.045329],[7.0907,-9.5368,0.045329],[7.0907,-9.1863,0.056916],[8.0224,-7.4338,0.045329],[8.333,-3.9287,0.010569],[8.0224,-1.4752,0.022156],[7.0907,0.62783,0.022156],[5.2272,1.3288,-0.012604],[-4.7113,5.5349,-0.32544],[-4.7113,6.9369,-0.012604],[-4.4008,7.6379,-0.024191],[-4.4008,7.9885,-0.024191],[-3.7796,9.04,-0.024191],[-3.7796,8.6895,-0.012604],[-3.469,6.9369,-0.012604],[-1.6055,4.8339,-0.001017],[0.25794,3.0814,-0.001017],[1.5003,0.97834,-0.001017],[3.0531,-1.4752,-0.001017],[6.1589,-3.9287,0.010569],[8.333,-4.2793,0.010569],[9.5753,-4.6298,0.010569],[11.128,-1.8257,-0.001017],[12.06,3.4319,-0.001017],[13.302,7.6379,-0.012604],[14.545,10.793,-0.001017],[17.34,14.999,0.010569],[20.446,14.298,0.010569],[22.93,14.999,-0.070537],[21.998,12.545,-0.093711],[21.067,6.5864,-0.082124],[20.446,3.4319,-0.082124],[18.893,1.3288,-0.093711],[17.029,-0.77419,-0.1053],[15.166,-2.5267,-0.093711],[13.302,-3.9287,-0.082124],[12.371,-5.6813,-0.047364],[11.439,-7.0833,-0.001017],[10.818,-7.7843,-0.001017],[8.9541,-9.5368,-0.001017],[6.4695,-9.1863,0.010569],[5.2272,-9.8873,0.045329],[4.9166,-9.5368,0.045329],[5.2272,-9.1863,0.056916],[6.7801,-7.0833,0.033743],[8.0224,-2.5267,0.010569],[8.333,-0.42369,0.022156],[8.0224,1.6793,0.022156],[6.4695,3.0814,-0.047364],[-3.469,3.7824,-0.38338],[-4.4008,5.1844,-0.012604],[-4.4008,6.5864,-0.024191],[-4.4008,7.2874,-0.024191],[-3.7796,7.6379,-0.012604],[-3.7796,7.2874,-0.001017],[-2.8479,6.2359,-0.001017],[-0.98438,4.1329,-0.001017],[0.25794,2.7309,-0.001017],[1.5003,0.27732,-0.001017],[3.0531,-1.4752,-0.001017],[5.2272,-2.5267,-0.001017],[7.0907,-2.5267,-0.001017],[8.9541,-1.8257,0.010569],[12.371,3.0814,0.010569],[14.234,8.6895,-0.001017],[16.719,11.844,-0.001017],[18.582,14.999,-0.001017],[21.067,17.803,0.010569],[24.173,16.05,0.010569],[26.036,15.7,-0.047364],[24.173,12.896,-0.070537],[22.93,6.5864,-0.058951],[21.377,3.0814,-0.058951],[19.824,0.97834,-0.070537],[17.34,-1.4752,-0.070537],[15.166,-3.5782,-0.070537],[12.681,-4.2793,-0.058951],[11.128,-6.3823,-0.035777],[10.196,-7.7843,-0.001017],[9.2647,-8.4853,-0.001017],[8.333,-10.588,0.010569],[5.5378,-10.238,0.010569],[4.606,-10.939,0.033743],[4.606,-9.8873,0.033743],[5.5378,-9.1863,0.033743],[7.4013,-6.3823,0.022156],[8.9541,-1.8257,0.010569],[8.9541,1.3288,0.010569],[8.6436,3.7824,0.010569],[6.7801,6.2359,-0.093711],[-1.295,1.3288,-0.41814],[-2.2267,3.0814,-0.012604],[-2.5373,4.1329,-0.012604],[-2.5373,4.8339,-0.012604],[-2.5373,5.1844,-0.012604],[-2.5373,5.1844,-0.001017],[-1.6055,5.1844,-0.001017],[-0.6738,4.1329,-0.001017],[0.25794,3.0814,-0.001017],[0.87909,1.6793,-0.001017],[2.432,0.62783,-0.001017],[4.2955,0.27732,-0.001017],[5.5378,0.62783,-0.001017],[8.9541,2.3804,0.010569],[13.923,8.339,0.010569],[16.719,13.597,-0.001017],[19.824,16.401,-0.001017],[22.309,19.205,-0.001017],[24.483,20.607,0.010569],[26.968,17.803,-0.001017],[28.521,16.751,-0.024191],[26.036,13.246,-0.035777],[24.794,6.5864,-0.035777],[23.241,3.0814,-0.035777],[21.067,0.62783,-0.047364],[18.582,-1.8257,-0.047364],[15.476,-3.9287,-0.047364],[12.992,-5.3308,-0.047364],[11.128,-7.4338,-0.024191],[10.196,-8.8358,-0.001017],[9.2647,-9.5368,-0.001017],[8.0224,-11.289,0.010569],[6.4695,-11.289,0.010569],[5.2272,-10.939,0.022156],[5.2272,-9.5368,0.022156],[6.4695,-8.8358,0.022156],[8.333,-5.3308,0.010569],[9.2647,-0.77419,0.010569],[9.2647,2.3804,0.010569],[8.6436,4.8339,0.010569],[6.4695,8.339,-0.15164],[2.1214,-0.073181,-0.42972],[1.5003,0.62783,-0.012604],[1.1897,1.6793,-0.012604],[0.87909,2.7309,-0.012604],[0.25794,3.0814,-0.012604],[-0.36322,3.4319,-0.001017],[-0.36322,4.1329,-0.001017],[0.25794,4.1329,-0.001017],[0.56851,3.7824,-0.001017],[0.56851,3.7824,-0.001017],[2.1214,4.4834,-0.001017],[3.6743,5.1844,-0.001017],[6.1589,6.5864,-0.001017],[9.5753,7.2874,-0.001017],[14.855,12.545,0.010569],[17.34,16.751,-0.001017],[20.756,19.205,-0.001017],[23.862,21.308,-0.001017],[26.036,21.658,0.010569],[28.521,18.504,-0.001017],[30.074,16.05,-0.012604],[28.21,12.545,-0.012604],[26.657,5.5349,-0.024191],[24.794,2.3804,-0.024191],[22.93,-0.42369,-0.024191],[20.135,-2.1762,-0.024191],[17.029,-4.6298,-0.024191],[13.923,-6.0318,-0.024191],[12.06,-7.7843,-0.012604],[10.818,-8.8358,-0.001017],[9.5753,-9.5368,-0.001017],[8.333,-10.238,-0.001017],[7.4013,-10.939,0.010569],[6.1589,-9.1863,0.010569],[6.7801,-8.1348,0.010569],[7.4013,-6.7328,-0.001017],[8.6436,-3.9287,-0.001017],[9.2647,-0.073181,-0.001017],[8.9541,2.0299,-0.001017],[7.4013,4.8339,-0.001017],[5.5378,7.9885,-0.19799],[2.432,-0.77419,-0.42972],[2.1214,-0.77419,-0.001017],[2.1214,0.27732,-0.012604],[1.5003,1.6793,-0.012604],[1.1897,1.6793,-0.012604],[1.1897,1.6793,-0.001017],[1.1897,2.0299,-0.001017],[0.87909,1.3288,-0.001017],[1.1897,1.3288,-0.001017],[0.87909,2.7309,-0.001017],[2.1214,3.7824,-0.001017],[3.3637,4.8339,-0.001017],[5.2272,7.2874,-0.012604],[7.4013,9.04,-0.001017],[9.2647,9.741,0.010569],[12.681,11.143,-0.001017],[15.476,13.246,-0.001017],[18.582,14.999,-0.001017],[21.067,15.7,-0.001017],[24.173,14.298,-0.001017],[26.347,12.195,-0.001017],[26.036,9.3905,-0.001017],[25.104,4.4834,-0.012604],[23.862,2.3804,-0.012604],[21.998,0.27732,-0.012604],[19.824,-1.8257,-0.001017],[17.34,-3.9287,-0.001017],[15.166,-5.3308,-0.012604],[13.302,-6.7328,-0.012604],[12.371,-7.0833,-0.001017],[11.128,-7.7843,-0.001017],[10.196,-8.4853,-0.001017],[8.9541,-8.1348,-0.001017],[8.0224,-6.7328,-0.001017],[7.4013,-4.9803,-0.001017],[8.0224,-3.5782,-0.012604],[8.0224,-1.4752,-0.012604],[8.333,0.27732,-0.001017],[8.0224,0.97834,-0.001017],[6.4695,2.7309,-0.001017],[5.2272,4.8339,-0.24434],[3.0531,-0.77419,-0.41814],[3.0531,-0.77419,-0.001017],[2.7426,0.27732,-0.012604],[2.7426,1.6793,-0.012604],[2.432,1.3288,-0.012604],[2.432,1.3288,-0.001017],[2.1214,1.3288,-0.001017],[1.5003,-0.073181,-0.001017],[1.5003,-0.073181,-0.001017],[0.87909,1.6793,-0.001017],[1.1897,3.0814,-0.001017],[3.0531,4.1329,-0.012604],[4.9166,7.2874,-0.012604],[6.4695,9.3905,-0.001017],[7.4013,8.339,-0.001017],[10.818,8.6895,-0.001017],[13.302,9.741,-0.001017],[16.097,10.442,-0.001017],[18.272,11.143,-0.001017],[20.446,11.143,-0.001017],[21.998,9.04,-0.001017],[22.62,7.2874,-0.001017],[21.998,4.4834,-0.001017],[21.377,2.3804,-0.001017],[20.446,-0.073181,-0.001017],[19.203,-1.8257,0.010569],[17.961,-4.2792,0.010569],[16.408,-6.0318,-0.001017],[15.166,-6.7328,-0.001017],[14.234,-7.0833,-0.001017],[12.681,-7.4338,-0.012604],[11.128,-7.0833,-0.001017],[10.196,-6.0318,-0.001017],[8.333,-4.2792,-0.001017],[7.4013,-3.2277,-0.001017],[7.4013,-1.8257,-0.012604],[7.0907,-0.42369,-0.012604],[7.0907,0.27732,-0.001017],[6.7801,0.27732,-0.001017],[6.1589,1.6793,-0.012604],[5.2272,3.4319,-0.2791],[3.3637,-0.77419,-0.40655],[3.3637,-0.77419,-0.001017],[3.3637,0.27732,-0.001017],[3.0531,1.6793,-0.001017],[3.0531,1.3288,-0.001017],[3.0531,0.97834,-0.001017],[2.7426,1.3288,-0.001017],[2.1214,-0.073181,-0.001017],[1.5003,0.27732,-0.001017],[0.56851,1.6793,-0.001017],[0.87909,3.4319,-0.001017],[2.432,4.4834,-0.012604],[4.2955,7.9885,-0.012604],[6.1589,9.741,-0.012604],[7.4013,9.04,-0.001017],[10.196,8.6895,-0.001017],[12.371,8.339,-0.001017],[14.234,8.339,-0.001017],[16.097,8.6895,-0.001017],[17.34,9.04,-0.001017],[18.582,7.6379,-0.001017],[19.824,6.2359,0.010569],[19.824,4.4834,-0.001017],[19.824,2.3804,-0.001017],[19.203,-0.073181,-0.001017],[18.582,-1.8257,0.010569],[17.34,-4.2793,0.010569],[16.408,-6.0318,-0.001017],[15.476,-6.7328,-0.001017],[14.545,-7.4338,-0.012604],[13.302,-7.0833,-0.012604],[11.439,-6.0318,-0.012604],[9.5753,-4.6298,-0.001017],[8.0224,-2.8772,-0.001017],[6.7801,-1.8257,-0.012604],[6.4695,-1.1247,-0.012604],[6.4695,-0.42369,-0.012604],[6.1589,-0.77419,-0.001017],[5.5378,-0.42369,-0.001017],[5.2272,0.27732,-0.012604],[5.2272,1.6793,-0.31386],[3.0531,-0.77419,-0.38338],[3.3637,-0.77419,-0.001017],[3.3637,0.27732,-0.001017],[3.3637,1.6793,-0.001017],[3.3637,1.3288,-0.001017],[3.6743,1.3288,-0.001017],[3.3637,1.6793,-0.001017],[2.432,0.97834,-0.001017],[2.1214,1.3288,-0.001017],[0.56851,3.0814,-0.001017],[0.87909,4.8339,-0.001017],[2.1214,6.2359,-0.012604],[3.3637,8.6895,-0.012604],[5.5378,9.741,-0.012604],[8.6436,10.442,-0.001017],[9.2647,10.792,-0.012604],[11.128,9.3905,-0.001017],[12.681,8.339,-0.001017],[14.234,7.9885,-0.001017],[15.166,7.6379,-0.001017],[16.408,6.9369,-0.001017],[17.961,5.5349,0.010569],[18.272,4.1329,-0.001017],[18.582,2.3804,-0.001017],[18.272,0.27732,0.010569],[17.34,-1.8257,0.010569],[16.408,-4.2793,0.010569],[15.476,-6.0318,-0.001017],[14.855,-6.3823,-0.001017],[13.923,-7.0833,-0.012604],[12.681,-6.7328,-0.012604],[10.507,-5.3308,-0.012604],[8.333,-3.9287,-0.012604],[6.4695,-2.1762,-0.001017],[5.2272,-1.4752,-0.012604],[5.2272,-1.1247,-0.012604],[4.9166,-1.1247,-0.012604],[4.9166,-1.8257,-0.012604],[4.9166,-1.8257,-0.012604],[4.606,-1.1247,-0.012604],[4.606,0.27732,-0.34862],[2.432,-0.42369,-0.37179],[2.7426,-0.42369,-0.001017],[3.0531,-0.073181,-0.001017],[3.0531,0.97834,-0.001017],[3.3637,1.3288,-0.001017],[3.6743,1.6793,-0.001017],[3.6743,2.0299,-0.001017],[2.7426,1.6793,-0.001017],[2.1214,2.3804,-0.001017],[1.1897,3.4319,-0.012604],[1.5003,4.8339,-0.012604],[3.0531,6.2359,-0.012604],[4.606,8.6895,-0.012604],[6.4695,9.3905,-0.012604],[8.9541,9.04,-0.012604],[10.196,9.3905,-0.012604],[11.128,7.9885,-0.001017],[12.371,6.9369,-0.001017],[12.992,6.5864,-0.001017],[13.923,6.2359,-0.001017],[14.855,5.5349,0.010569],[15.476,5.1844,0.010569],[16.408,3.4319,0.010569],[16.719,1.6793,0.010569],[16.408,-0.073181,0.010569],[15.476,-1.8257,0.010569],[14.234,-4.2793,0.010569],[13.302,-5.6813,-0.001017],[12.681,-5.3308,-0.001017],[11.439,-5.6813,-0.012604],[10.507,-5.3308,-0.012604],[8.6436,-4.2793,-0.012604],[6.7801,-2.8772,-0.012604],[4.9166,-1.8257,-0.012604],[3.6743,-1.8257,-0.012604],[3.6743,-1.4752,-0.012604],[3.6743,-1.8257,-0.012604],[3.3637,-2.5267,-0.012604],[3.3637,-2.8772,-0.012604],[3.0531,-1.8257,-0.012604],[3.0531,-0.77419,-0.37179],[1.5003,-0.073181,-0.37179],[2.1214,-0.42369,-0.001017],[2.432,-0.42369,-0.001017],[2.7426,0.62783,-0.001017],[3.3637,1.6793,-0.001017],[4.2955,2.0299,-0.001017],[3.6743,2.3804,-0.001017],[2.7426,2.3804,-0.001017],[2.1214,3.4319,-0.001017],[2.1214,3.7824,-0.012604],[2.432,4.8339,-0.012604],[4.2955,5.5349,-0.012604],[5.5378,8.339,-0.012604],[7.4013,8.339,-0.012604],[9.5753,6.5864,-0.012604],[10.818,6.9369,-0.012604],[12.06,5.5349,-0.001017],[12.371,4.8339,-0.001017],[12.681,4.4834,-0.001017],[12.992,4.1329,-0.001017],[13.923,4.1329,0.010569],[13.923,4.4834,0.010569],[14.234,2.7309,0.010569],[14.545,0.97834,0.010569],[14.234,-0.77419,0.010569],[12.992,-2.1762,0.010569],[12.06,-4.2793,0.010569],[10.818,-4.9803,0.010569],[10.196,-4.2793,-0.001017],[8.9541,-4.2793,-0.001017],[8.333,-3.9287,-0.001017],[6.7801,-2.8772,-0.001017],[5.2272,-2.1762,-0.012604],[3.3637,-1.8257,-0.012604],[2.432,-1.8257,-0.012604],[2.1214,-1.8257,-0.012604],[2.432,-2.5267,-0.012604],[2.1214,-3.9287,-0.012604],[1.5003,-3.9287,-0.012604],[1.1897,-2.8772,-0.024191],[1.1897,-1.8257,-0.39496],[-2.5373,0.97833,-0.001017],[-1.295,0.97833,-0.001017],[-0.98438,1.6793,-0.001017],[-0.6738,2.0299,-0.001017],[-0.36322,2.3804,-0.001017],[0.25794,2.0299,-0.001017],[-0.36322,2.0299,-0.001017],[-1.295,3.0814,-0.001017],[-2.5373,1.3288,-0.001017],[-3.1584,-0.42369,-0.001017],[-3.7796,-0.77419,-0.001017],[-4.7113,-0.42369,-0.001017],[-5.6431,-0.073182,-0.001017],[-7.196,0.62783,-0.001017],[-9.6806,2.3804,-0.001017],[-9.37,1.3288,-0.001017],[-8.4383,0.27732,-0.001017],[-8.1277,-0.073182,-0.001017],[-8.4383,0.27732,-0.001017],[-7.196,-0.073182,-0.001017],[-5.6431,-0.42369,-0.001017],[-2.8479,-1.1247,-0.001017],[-0.98438,-1.8257,-0.001017],[-0.36322,-2.5267,-0.001017],[1.1897,-3.5782,-0.001017],[2.432,-4.2793,-0.001017],[4.2955,-5.6813,-0.001017],[4.9166,-7.0833,-0.001017],[5.5378,-8.4853,-0.001017],[6.4695,-9.8873,-0.001017],[6.7801,-10.238,-0.001017],[5.5378,-11.289,-0.001017],[5.5378,-11.64,-0.001017],[6.1589,-12.691,-0.001017],[4.2955,-10.939,-0.001017],[4.606,-10.238,-0.001017],[3.6743,-9.1863,-0.001017],[3.3637,-10.238,-0.001017],[1.1897,-8.1348,-0.001017],[2.432,-2.1762,-0.001017],[2.7426,-1.8257,-0.001017],[-7.196,4.1329,-0.047364],[-6.2642,4.8339,-0.001017],[-5.6431,5.5349,-0.012604],[-4.7113,7.2874,-0.001017],[-1.295,4.4834,-0.001017],[0.25794,2.7309,-0.001017],[-0.6738,3.0814,-0.001017],[-2.2267,4.8339,-0.001017],[-2.8479,1.6793,-0.001017],[-3.7796,0.27732,-0.001017],[-5.0219,-0.77419,-0.001017],[-6.8854,-0.42369,-0.001017],[-8.1277,-0.42369,-0.001017],[-9.0594,-0.073181,-0.001017],[-10.302,-0.073181,-0.001017],[-10.923,0.97834,-0.001017],[-12.165,1.6793,-0.001017],[-12.786,2.3804,-0.001017],[-13.408,3.4319,-0.012604],[-13.408,4.4834,-0.012604],[-13.718,6.2359,-0.024191],[-10.923,6.9369,-0.035777],[-8.4383,5.1844,-0.024191],[-4.7113,3.0814,-0.024191],[-0.6738,1.3288,-0.024191],[2.432,-1.4752,-0.024191],[6.1589,-4.2793,-0.035777],[8.6436,-6.7328,-0.024191],[10.818,-9.5368,-0.035777],[12.681,-13.042,-0.024191],[14.234,-15.495,-0.012604],[13.302,-18.65,-0.012604],[13.302,-20.403,-0.024191],[13.923,-22.856,-0.012604],[12.06,-17.598,0.010569],[10.818,-19.702,0.010569],[10.196,-15.495,0.010569],[9.2647,-11.289,-0.001017],[9.5753,-8.1348,-0.012604],[6.7801,-2.1762,-0.001017],[3.3637,-1.1247,-0.001017],[-7.5065,4.4834,-0.11688],[-6.8854,5.5349,-0.001017],[-6.2642,6.9369,-0.012604],[-5.0219,7.6379,-0.012604],[-3.7796,9.04,-0.012604],[-2.8479,8.339,-0.012604],[-2.5373,7.6379,-0.012604],[-1.6055,6.2359,0.010569],[-2.8479,6.2359,0.022156],[-2.8479,3.4319,0.022156],[-3.1584,2.3804,0.033743],[-3.1584,0.62783,0.033743],[-3.7796,-0.42369,0.022156],[-4.4008,-1.4752,0.022156],[-5.3325,-1.8257,0.010569],[-5.6431,-0.77419,-0.001017],[-6.5748,0.97834,-0.001017],[-6.8854,3.4319,-0.001017],[-7.5065,6.5864,-0.012604],[-7.196,7.9885,-0.012604],[-6.8854,9.741,-0.047364],[-3.469,9.3905,-0.070537],[-1.295,6.2359,-0.047364],[1.5003,3.4319,-0.058951],[5.5378,0.62783,-0.058951],[8.9541,-2.5267,-0.058951],[12.371,-6.3823,-0.070537],[14.545,-8.8358,-0.058951],[16.097,-12.341,-0.058951],[16.719,-14.794,-0.047364],[16.719,-16.547,-0.024191],[15.166,-18.299,-0.024191],[14.545,-18.65,-0.035777],[13.923,-18.65,-0.024191],[12.681,-17.248,0.010569],[11.128,-14.794,0.010569],[9.5753,-12.341,0.033743],[8.9541,-8.4853,0.010569],[7.4013,-4.9803,0.010569],[6.7801,-1.8257,0.010569],[5.2272,0.27732,-0.012604],[-5.6431,4.1329,-0.17482],[-5.0219,4.8339,-0.012604],[-4.7113,5.5349,-0.024191],[-3.469,6.2359,-0.024191],[-2.8479,7.6379,-0.024191],[-1.295,7.6379,-0.012604],[-0.36322,6.5864,-0.012604],[0.25794,4.4834,0.010569],[-0.6738,3.0814,0.022156],[1.1897,1.6793,0.022156],[2.1214,-0.073181,0.033743],[3.0531,-1.8257,0.033743],[3.0531,-3.5782,0.033743],[3.0531,-4.6298,0.033743],[3.0531,-2.1762,0.010569],[3.0531,0.27732,0.010569],[2.432,2.3804,0.010569],[2.7426,5.5349,-0.012604],[3.0531,9.04,-0.012604],[3.6743,10.091,-0.012604],[4.2955,11.494,-0.047364],[6.7801,10.442,-0.082124],[8.333,6.9369,-0.058951],[10.507,3.7824,-0.082124],[12.992,0.97834,-0.082124],[15.166,-2.1762,-0.093711],[16.719,-5.3308,-0.093711],[17.34,-7.4338,-0.082124],[17.961,-9.8873,-0.082124],[17.029,-11.64,-0.058951],[16.097,-13.042,-0.035777],[14.234,-14.093,-0.024191],[12.371,-14.093,-0.047364],[11.128,-13.743,-0.024191],[10.196,-13.392,0.022156],[8.9541,-11.64,0.033743],[8.0224,-9.5368,0.045329],[8.0224,-6.7328,0.022156],[6.7801,-2.5267,0.022156],[5.5378,-0.073181,0.022156],[3.6743,1.6793,-0.024191],[-4.4008,4.4834,-0.23275],[-3.469,5.5349,-0.012604],[-3.469,6.5864,-0.024191],[-3.1584,6.9369,-0.024191],[-3.1584,8.6895,-0.024191],[-2.5373,8.339,-0.012604],[-1.6055,6.2359,-0.024191],[-1.295,4.1329,0.010569],[-1.295,2.7309,0.010569],[0.56851,0.97834,0.010569],[2.1214,-1.4752,0.022156],[3.6743,-3.9287,0.033743],[4.9166,-5.3308,0.033743],[6.4695,-7.0833,0.022156],[8.0224,-5.3308,-0.001017],[8.9541,-1.8257,-0.001017],[10.196,1.6793,0.010569],[10.818,6.2359,-0.001017],[12.06,9.04,-0.012604],[13.923,11.143,-0.012604],[14.545,12.896,-0.047364],[16.097,11.494,-0.093711],[16.719,7.9885,-0.070537],[17.961,5.1844,-0.082124],[18.893,2.3804,-0.093711],[18.893,-0.77419,-0.1053],[18.582,-3.2277,-0.11688],[17.34,-5.3308,-0.093711],[16.719,-7.4338,-0.082124],[14.855,-8.8358,-0.070537],[13.923,-9.1863,-0.035777],[11.439,-9.5368,-0.024191],[9.5753,-9.5368,-0.047364],[8.0224,-8.8358,-0.024191],[7.0907,-9.5368,0.033743],[6.7801,-8.8358,0.045329],[6.1589,-7.4338,0.056916],[6.7801,-4.9803,0.033743],[6.7801,-0.77419,0.033743],[6.1589,2.0299,0.022156],[4.606,3.7824,-0.024191],[-3.7796,5.1844,-0.2791],[-3.469,6.2359,-0.012604],[-3.1584,6.9369,-0.012604],[-3.469,7.2874,-0.024191],[-3.1584,8.339,-0.012604],[-2.5373,7.6379,-0.012604],[-1.6055,4.8339,-0.012604],[-0.98438,3.4319,-0.001017],[0.56851,1.6793,0.010569],[2.7426,-0.073181,-0.001017],[4.606,-1.8257,0.010569],[6.4695,-4.6298,0.010569],[8.0224,-5.6813,0.022156],[10.196,-6.7328,0.022156],[10.818,-3.9287,-0.001017],[11.128,1.6793,-0.001017],[12.681,5.1844,0.010569],[15.166,9.3905,-0.001017],[17.34,10.793,-0.001017],[20.135,10.793,-0.001017],[22.309,11.143,-0.035777],[23.241,9.3905,-0.082124],[22.93,4.4834,-0.047364],[23.241,0.97834,-0.070537],[23.241,-0.77419,-0.082124],[21.377,-2.1762,-0.093711],[19.824,-4.2793,-0.093711],[17.34,-5.3308,-0.082124],[15.476,-7.0833,-0.070537],[13.302,-7.4338,-0.058951],[11.439,-7.7843,-0.024191],[9.2647,-8.1348,-0.012604],[7.0907,-8.1348,-0.035777],[4.606,-7.7843,-0.012604],[4.2955,-8.4853,0.033743],[4.2955,-8.1348,0.045329],[4.606,-6.7328,0.045329],[5.5378,-3.9287,0.033743],[6.4695,0.62783,0.022156],[6.4695,3.7824,0.022156],[5.2272,6.5864,-0.047364],[-3.469,3.7824,-0.32544],[-3.469,5.1844,-0.001017],[-3.469,5.5349,-0.012604],[-3.1584,6.5864,-0.012604],[-2.8479,7.2874,-0.012604],[-2.2267,6.5864,-0.012604],[-1.6055,3.7824,-0.012604],[-0.98438,2.7309,-0.001017],[0.56851,0.97834,-0.001017],[2.432,-0.77419,-0.001017],[4.2955,-2.1762,0.010569],[5.5378,-4.2793,0.010569],[7.0907,-4.6298,0.010569],[9.2647,-4.9803,0.010569],[11.128,-0.77419,-0.001017],[13.302,5.1844,0.010569],[16.408,9.3905,0.010569],[18.893,12.545,-0.012604],[22.309,13.947,-0.001017],[25.104,13.246,-0.001017],[26.968,12.896,-0.024191],[27.278,10.442,-0.058951],[26.347,4.8339,-0.035777],[26.036,0.97834,-0.058951],[24.794,-0.77419,-0.058951],[22.309,-2.5267,-0.070537],[19.824,-4.6298,-0.070537],[17.029,-5.6813,-0.058951],[14.545,-7.4338,-0.047364],[11.439,-8.1348,-0.035777],[9.5753,-8.4853,-0.012604],[8.0224,-8.8358,-0.012604],[5.5378,-8.8358,-0.012604],[3.3637,-8.1348,-0.001017],[3.3637,-8.8358,0.033743],[3.6743,-8.1348,0.033743],[4.606,-6.0318,0.033743],[6.1589,-2.1762,0.022156],[6.7801,2.7309,0.022156],[6.7801,6.5864,0.010569],[5.5378,9.741,-0.093711],[-2.2267,2.0299,-0.3602],[-2.5373,3.0814,-0.001017],[-2.5373,4.1329,-0.012604],[-2.5373,4.8339,-0.012604],[-2.2267,5.1844,-0.012604],[-1.6055,5.1844,-0.012604],[-1.6055,3.4319,-0.012604],[-0.98438,3.0814,-0.001017],[0.25794,1.6793,-0.001017],[1.5003,0.27732,-0.012604],[3.0531,-0.77419,-0.001017],[4.606,-1.4752,-0.001017],[5.5378,-1.1247,-0.001017],[8.0224,-1.1247,0.010569],[10.818,3.0814,0.010569],[14.855,9.3905,0.010569],[18.582,12.896,-0.001017],[21.998,16.05,-0.012604],[25.104,17.102,-0.001017],[28.521,16.05,-0.001017],[30.074,15.349,-0.012604],[30.074,12.195,-0.035777],[27.899,6.2359,-0.024191],[26.968,2.0299,-0.035777],[25.725,-0.073181,-0.035777],[22.62,-2.1762,-0.047364],[19.203,-4.2793,-0.047364],[16.097,-5.6813,-0.035777],[13.923,-7.7843,-0.024191],[10.507,-8.4853,-0.024191],[8.6436,-8.8358,-0.001017],[6.7801,-9.5368,-0.001017],[5.2272,-9.5368,-0.001017],[3.3637,-8.4853,-0.001017],[3.6743,-8.8358,0.022156],[4.606,-7.4338,0.022156],[4.9166,-5.3308,0.022156],[6.7801,-1.1247,0.010569],[7.0907,4.1329,0.010569],[6.7801,8.339,0.010569],[5.5378,11.494,-0.12847],[0.87909,0.27732,-0.39496],[0.56851,1.3288,-0.001017],[0.25794,2.0299,-0.012604],[-0.6738,2.7309,-0.012604],[-0.98438,3.4319,-0.012604],[-1.295,3.7824,-0.012604],[-1.295,4.1329,-0.012604],[-0.98438,3.7824,-0.001017],[-0.6738,3.0814,-0.012604],[0.56851,2.3804,-0.012604],[2.1214,2.3804,-0.001017],[3.3637,3.4319,-0.001017],[5.2272,4.4834,-0.001017],[7.4013,4.8339,-0.001017],[10.196,7.2874,0.010569],[14.545,12.195,0.010569],[18.893,15.349,-0.001017],[22.309,17.803,-0.012604],[25.725,18.153,-0.001017],[28.521,16.751,-0.001017],[30.074,15.7,-0.001017],[30.074,12.545,-0.012604],[27.899,6.9369,-0.012604],[26.657,2.3804,-0.012604],[25.104,0.27732,-0.012604],[22.309,-1.8257,-0.024191],[18.893,-4.2793,-0.024191],[15.166,-5.3308,-0.012604],[12.992,-7.0833,-0.012604],[9.5753,-7.4338,-0.012604],[8.0224,-7.7843,-0.001017],[6.4695,-8.8358,-0.001017],[5.2272,-8.8358,-0.001017],[4.2955,-7.7843,-0.001017],[4.606,-7.4338,0.010569],[5.2272,-6.0318,0.010569],[5.5378,-3.9287,-0.001017],[6.7801,-0.42369,-0.001017],[7.0907,4.1329,-0.001017],[6.1589,7.9885,-0.001017],[4.9166,10.793,-0.17482],[2.1214,-0.42369,-0.39496],[1.5003,-0.073181,-0.001017],[0.87909,0.62783,-0.001017],[0.56851,1.3288,-0.012604],[0.56851,1.3288,-0.012604],[-0.36322,2.0299,-0.012604],[0.25794,2.0299,-0.012604],[0.25794,1.3288,-0.001017],[-0.36322,1.3288,-0.012604],[0.56851,1.6793,-0.012604],[1.1897,2.3804,-0.001017],[2.7426,3.7824,-0.001017],[3.6743,4.8339,-0.001017],[6.1589,6.5864,-0.001017],[8.0224,7.2874,-0.001017],[10.507,8.6895,-0.001017],[12.992,10.442,-0.001017],[15.476,11.844,-0.001017],[18.272,12.545,-0.001017],[20.756,11.844,-0.001017],[22.62,10.793,-0.001017],[23.241,9.741,-0.001017],[22.62,6.2359,-0.012604],[21.377,2.7309,-0.012604],[20.756,1.3288,-0.001017],[18.893,-1.1247,-0.012604],[16.719,-2.1762,-0.012604],[14.545,-3.5782,-0.001017],[12.371,-5.3308,-0.001017],[10.507,-5.6813,-0.001017],[8.9541,-6.3823,-0.001017],[8.333,-7.0833,-0.001017],[7.0907,-6.3823,-0.001017],[6.4695,-4.9803,-0.012604],[6.1589,-4.2793,-0.001017],[6.1589,-2.5267,-0.001017],[6.1589,-1.8257,-0.001017],[6.4695,0.27732,-0.001017],[6.4695,2.7309,-0.001017],[5.2272,4.8339,-0.001017],[4.9166,6.9369,-0.20958],[2.7426,-0.77419,-0.38338],[2.7426,-0.073181,-0.001017],[2.1214,0.62783,-0.001017],[2.1214,1.3288,-0.012604],[1.5003,1.3288,-0.012604],[1.1897,1.6793,-0.012604],[0.87909,1.6793,-0.012604],[0.87909,0.62783,-0.001017],[0.25794,0.27732,-0.012604],[0.56851,1.3288,-0.012604],[0.87909,2.0299,-0.001017],[2.1214,3.4319,-0.001017],[3.0531,5.1844,-0.001017],[4.9166,6.9369,-0.001017],[7.0907,6.9369,-0.001017],[8.6436,7.2874,-0.001017],[10.507,7.9885,-0.001017],[12.371,8.339,-0.012604],[14.545,8.6895,-0.001017],[16.719,8.6895,-0.001017],[18.272,7.6379,-0.001017],[19.824,6.9369,-0.001017],[20.135,4.8339,-0.001017],[20.135,2.3804,-0.001017],[19.203,0.27732,-0.001017],[17.961,-1.4752,-0.001017],[16.719,-2.5267,-0.001017],[15.166,-4.2792,-0.001017],[13.923,-5.6813,-0.001017],[12.371,-6.0318,-0.001017],[10.818,-5.6813,-0.001017],[9.2647,-5.3308,-0.001017],[8.0224,-3.9287,-0.001017],[7.0907,-2.1762,-0.012604],[6.4695,-1.8257,-0.012604],[6.1589,-1.1247,-0.012604],[6.1589,-0.42369,-0.012604],[6.1589,0.62783,-0.001017],[5.5378,1.6793,-0.001017],[4.9166,3.0814,-0.001017],[4.9166,4.4834,-0.25592],[3.3637,-0.77419,-0.37179],[3.0531,-0.073181,-0.001017],[2.7426,0.62783,-0.001017],[2.7426,0.97834,-0.001017],[2.432,0.97834,-0.001017],[2.1214,1.6793,-0.012604],[1.5003,1.6793,-0.012604],[1.1897,0.62783,-0.001017],[0.56851,0.62783,-0.012604],[0.56851,1.6793,-0.012604],[0.87909,2.3804,-0.001017],[1.5003,4.1329,-0.001017],[2.7426,5.5349,-0.001017],[4.606,6.9369,-0.001017],[6.4695,7.2874,-0.001017],[8.333,7.2874,-0.012604],[9.5753,6.9369,-0.001017],[11.128,6.5864,-0.012604],[12.992,6.5864,-0.001017],[14.545,6.5864,-0.001017],[16.097,5.5349,-0.001017],[17.029,4.8339,-0.001017],[18.272,3.7824,-0.001017],[18.582,2.0299,-0.001017],[18.272,-0.073181,0.010569],[17.029,-1.4752,-0.001017],[16.408,-2.8772,-0.001017],[15.166,-4.9803,-0.001017],[14.234,-6.0318,-0.001017],[12.681,-6.0318,-0.001017],[11.128,-5.3308,-0.001017],[8.9541,-3.9287,-0.001017],[7.4013,-1.8257,-0.001017],[6.7801,-1.1247,-0.012604],[6.1589,-1.1247,-0.012604],[5.5378,-0.77419,-0.012604],[5.5378,-0.42369,-0.012604],[5.2272,-0.073181,-0.012604],[4.9166,0.62783,-0.001017],[4.606,1.3288,-0.012604],[4.606,2.7309,-0.29068],[3.3637,-0.77419,-0.3602],[3.3637,-0.073181,-0.001017],[3.0531,0.27732,-0.001017],[2.7426,0.97834,-0.001017],[2.7426,0.62783,-0.001017],[2.432,1.3288,-0.012604],[2.1214,2.0299,-0.012604],[1.5003,1.6793,-0.001017],[1.1897,2.0299,-0.012604],[0.87909,3.0814,-0.012604],[1.1897,4.1329,-0.001017],[2.1214,5.5349,-0.001017],[2.7426,7.2874,-0.012604],[4.606,7.2874,-0.012604],[6.4695,8.339,-0.012604],[8.333,9.04,-0.012604],[9.5753,7.2874,-0.001017],[11.128,6.5864,-0.012604],[12.371,6.2359,-0.001017],[13.302,5.5349,-0.001017],[14.855,4.4834,-0.001017],[15.476,4.1329,-0.001017],[16.719,3.4319,-0.001017],[17.34,2.0299,-0.001017],[16.719,0.62783,0.010569],[15.476,-0.42369,-0.001017],[15.166,-2.1762,-0.001017],[14.234,-4.9803,-0.001017],[12.992,-5.6813,-0.001017],[12.06,-6.0318,-0.001017],[10.196,-4.9803,-0.001017],[7.4013,-2.5267,-0.001017],[6.4695,-1.1247,-0.001017],[5.2272,-0.42369,-0.012604],[4.9166,-1.1247,-0.012604],[4.9166,-1.1247,-0.012604],[4.9166,-1.1247,-0.012604],[4.606,-1.4752,-0.012604],[4.2955,-1.1247,-0.012604],[4.2955,-0.073181,-0.012604],[4.2955,0.97834,-0.33703],[2.7426,-0.42369,-0.34862],[2.7426,-0.073181,-0.001017],[2.432,0.27732,-0.001017],[2.432,0.62783,-0.001017],[2.432,0.27732,-0.001017],[2.432,1.3288,-0.001017],[2.432,2.0299,-0.001017],[2.1214,2.3804,-0.012604],[1.5003,3.0814,-0.012604],[1.5003,3.7824,-0.012604],[2.1214,4.4834,-0.012604],[2.7426,6.2359,-0.012604],[3.3637,6.9369,-0.012604],[5.2272,6.5864,-0.012604],[7.0907,7.2874,-0.012604],[8.9541,7.9885,-0.012604],[10.196,6.5864,-0.001017],[11.128,5.5349,-0.001017],[12.371,4.8339,-0.001017],[12.992,4.8339,-0.001017],[13.923,3.7824,-0.001017],[14.545,3.4319,0.010569],[15.166,2.7309,-0.001017],[15.476,1.6793,0.010569],[14.855,0.27732,0.010569],[13.923,-0.42369,0.010569],[12.992,-2.1762,0.010569],[12.06,-4.6298,-0.001017],[10.818,-4.9803,-0.001017],[10.196,-5.3308,-0.001017],[8.333,-3.9287,-0.001017],[6.1589,-1.8257,-0.001017],[4.9166,-0.77419,-0.001017],[4.2955,-0.42369,-0.012604],[3.6743,-1.4752,-0.012604],[3.6743,-1.4752,-0.012604],[3.6743,-1.8257,-0.012604],[3.0531,-2.1762,-0.012604],[2.7426,-1.8257,-0.012604],[2.432,-1.4752,-0.012604],[2.432,-0.42369,-0.3602],[2.1214,-0.073181,-0.33703],[2.1214,-0.073181,-0.001017],[2.1214,0.27732,-0.001017],[1.5003,0.62783,-0.001017],[2.1214,0.27732,-0.001017],[2.7426,1.3288,-0.001017],[2.7426,2.0299,-0.001017],[2.7426,3.0814,-0.012604],[2.432,3.7824,-0.012604],[2.7426,4.1329,-0.012604],[3.0531,4.4834,-0.012604],[3.3637,5.5349,-0.012604],[4.2955,6.2359,-0.012604],[6.4695,5.1844,-0.012604],[8.333,5.1844,-0.012604],[9.5753,6.2359,-0.012604],[10.818,4.8339,-0.012604],[11.439,4.1329,-0.001017],[12.371,4.1329,-0.001017],[12.371,4.1329,-0.001017],[12.681,3.0814,0.010569],[13.302,2.7309,0.010569],[13.923,2.3804,0.010569],[13.923,0.97834,0.010569],[12.992,-0.42369,0.010569],[12.06,-1.4752,0.010569],[10.818,-2.5267,0.010569],[9.5753,-4.2793,0.010569],[8.6436,-3.9287,0.010569],[8.0224,-4.2793,-0.001017],[6.4695,-2.5267,-0.001017],[4.606,-1.4752,-0.001017],[3.6743,-0.77419,-0.001017],[3.0531,-0.42369,-0.001017],[2.7426,-1.8257,-0.012604],[2.432,-1.8257,-0.012604],[2.432,-2.5267,-0.012604],[1.5003,-2.8772,-0.012604],[0.87909,-3.5782,-0.012604],[0.56851,-2.5267,-0.012604],[-0.36322,-1.4752,-0.38338],[-1.295,-0.073182,-0.001017],[-0.6738,0.62783,-0.001017],[-0.98438,1.6793,-0.001017],[-0.36322,2.0299,-0.001017],[-0.98438,3.0814,-0.001017],[-1.6055,5.5349,-0.001017],[-1.295,3.0814,-0.001017],[-1.6055,0.97833,-0.001017],[-2.8479,0.27732,-0.001017],[-3.1584,-0.42369,-0.001017],[-3.469,-0.77419,-0.001017],[-4.4008,-0.42369,-0.001017],[-6.5748,0.62783,-0.001017],[-8.7489,2.0299,-0.001017],[-8.1277,0.27732,-0.001017],[-7.196,-0.77419,-0.001017],[-6.5748,-1.4752,-0.001017],[-6.2642,-1.1247,-0.001017],[-6.5748,-0.42369,-0.001017],[-6.2642,0.27732,-0.001017],[-4.7113,0.27732,-0.001017],[-2.5373,-0.073182,-0.001017],[-0.98438,-1.8257,-0.001017],[0.25794,-2.1762,-0.001017],[2.1214,-3.5782,-0.001017],[3.3637,-4.2793,-0.001017],[4.2955,-4.9803,-0.001017],[5.5378,-6.3823,-0.001017],[6.1589,-7.4338,-0.001017],[6.7801,-8.1348,-0.001017],[6.7801,-10.238,-0.001017],[6.4695,-10.939,-0.001017],[6.1589,-11.64,-0.001017],[5.2272,-12.691,-0.001017],[4.9166,-11.289,-0.001017],[4.606,-11.289,-0.001017],[4.2955,-10.588,-0.001017],[3.0531,-10.939,-0.001017],[0.87909,-7.7843,-0.001017],[2.432,-2.1762,-0.001017],[2.7426,-1.8257,-0.001017],[-6.2642,3.0814,-0.035777],[-4.4008,3.4319,-0.001017],[-3.469,4.8339,-0.012604],[-0.98438,3.0814,-0.001017],[-0.98438,3.0814,-0.001017],[-1.6055,5.5349,-0.001017],[-1.295,3.0814,-0.001017],[-2.2267,1.6793,-0.001017],[-3.1584,0.62783,-0.001017],[-5.0219,0.27732,-0.001017],[-5.6431,-0.77419,-0.001017],[-7.196,-0.073181,-0.001017],[-8.1277,-0.42369,-0.001017],[-8.4383,-0.073181,-0.001017],[-10.302,0.62783,-0.001017],[-10.923,1.6793,-0.001017],[-11.544,2.3804,-0.001017],[-12.476,3.4319,-0.001017],[-12.786,4.4834,-0.001017],[-12.476,6.2359,-0.012604],[-11.544,6.9369,-0.024191],[-9.6806,7.9885,-0.024191],[-7.5065,4.8339,-0.024191],[-5.0219,3.0814,-0.024191],[-1.295,1.3288,-0.035777],[1.5003,-1.8257,-0.024191],[3.6743,-4.6298,-0.024191],[7.0907,-7.7843,-0.035777],[8.9541,-11.289,-0.024191],[10.818,-14.794,-0.024191],[11.128,-13.042,-0.012604],[12.06,-14.794,-0.024191],[12.06,-16.547,-0.024191],[11.439,-17.248,-0.024191],[12.06,-20.052,-0.001017],[8.9541,-14.093,0.010569],[10.196,-16.897,0.010569],[8.6436,-10.238,-0.001017],[7.0907,-6.0318,-0.012604],[5.2272,-2.5267,-0.001017],[2.7426,-0.77419,0.010569],[-6.5748,3.4319,-0.1053],[-5.3325,4.4834,-0.012604],[-4.7113,6.5864,-0.024191],[-3.7796,7.6379,-0.012604],[-2.8479,8.339,-0.012604],[-2.2267,8.339,-0.012604],[-1.6055,8.339,0.010569],[-1.295,7.2874,0.022156],[-2.8479,5.5349,0.033743],[-3.1584,4.1329,0.022156],[-3.469,2.3804,0.010569],[-3.7796,0.27732,0.022156],[-4.7113,-0.77419,0.022156],[-5.0219,-1.4752,0.022156],[-6.8854,-1.4752,0.010569],[-7.5065,-0.42369,-0.012604],[-8.4383,0.97834,-0.012604],[-8.4383,3.4319,-0.012604],[-8.1277,5.5349,-0.001017],[-7.196,6.9369,-0.012604],[-5.6431,7.6379,-0.035777],[-2.5373,7.2874,-0.047364],[-0.6738,3.4319,-0.047364],[1.5003,-0.42369,-0.058951],[6.4695,-2.1762,-0.070537],[9.5753,-3.5782,-0.058951],[11.439,-6.0318,-0.070537],[14.234,-8.8358,-0.070537],[15.166,-10.939,-0.058951],[15.476,-13.042,-0.047364],[14.855,-14.794,-0.035777],[14.545,-16.196,-0.035777],[13.923,-17.248,-0.047364],[12.992,-17.248,-0.035777],[12.992,-16.897,0.010569],[10.818,-15.145,0.010569],[9.2647,-12.341,0.010569],[8.333,-8.8358,0.022156],[6.7801,-4.6298,0.010569],[6.1589,-0.77419,0.022156],[4.606,2.0299,0.010569],[-4.7113,3.0814,-0.17482],[-3.469,4.1329,-0.012604],[-2.8479,4.8339,-0.024191],[-2.2267,5.5349,-0.024191],[-1.295,6.9369,-0.024191],[-0.36322,6.5864,-0.012604],[-0.36322,6.5864,0.010569],[0.87909,6.2359,0.022156],[0.87909,3.7824,0.045329],[1.5003,0.97834,0.022156],[2.432,-0.42369,0.022156],[2.7426,-1.8257,0.022156],[2.432,-2.8772,0.022156],[2.1214,-3.9287,0.033743],[0.56851,-2.1762,0.022156],[0.56851,-0.073181,-0.012604],[0.56851,1.6793,-0.012604],[0.87909,4.4834,-0.001017],[1.1897,6.9369,0.010569],[2.1214,8.339,-0.001017],[3.3637,8.6895,-0.035777],[6.4695,7.9885,-0.047364],[8.333,3.7824,-0.047364],[10.196,-0.42369,-0.070537],[14.855,-1.4752,-0.093711],[17.029,-2.1762,-0.082124],[17.34,-4.9803,-0.093711],[18.582,-7.0833,-0.093711],[18.582,-8.8358,-0.070537],[17.961,-9.8873,-0.058951],[15.476,-10.588,-0.047364],[14.545,-11.64,-0.047364],[12.992,-13.042,-0.047364],[11.439,-13.392,-0.058951],[10.818,-12.691,0.010569],[9.2647,-11.289,0.022156],[8.333,-9.1863,0.022156],[7.0907,-6.7328,0.033743],[6.1589,-2.1762,0.022156],[4.9166,1.3288,0.022156],[3.0531,3.7824,-0.001017],[-2.8479,3.7824,-0.22116],[-2.5373,4.8339,-0.012604],[-2.2267,6.2359,-0.024191],[-2.2267,6.9369,-0.024191],[-2.2267,7.2874,-0.012604],[-1.295,7.2874,-0.012604],[-0.6738,6.2359,0.022156],[-0.36322,5.1844,0.022156],[0.87909,2.3804,0.033743],[2.1214,-0.42369,0.022156],[3.3637,-1.8257,0.010569],[4.606,-4.2792,0.022156],[5.5378,-5.6813,0.022156],[7.0907,-7.4338,0.033743],[7.0907,-6.0318,0.022156],[8.333,-1.8257,-0.012604],[8.6436,0.27732,-0.012604],[9.5753,3.0814,0.010569],[10.818,5.5349,0.022156],[12.06,6.9369,0.010569],[13.302,7.9885,-0.024191],[15.166,7.2874,-0.047364],[16.719,3.0814,-0.047364],[18.272,-1.1247,-0.070537],[21.377,-1.4752,-0.1053],[22.62,-1.8257,-0.093711],[21.377,-4.2792,-0.1053],[20.756,-6.0318,-0.1053],[19.824,-7.0833,-0.082124],[17.34,-7.4338,-0.070537],[14.855,-7.4338,-0.047364],[13.302,-8.1348,-0.047364],[11.439,-9.1863,-0.047364],[9.5753,-9.5368,-0.058951],[8.333,-8.8358,0.010569],[7.0907,-8.4853,0.033743],[6.4695,-6.7328,0.033743],[5.5378,-4.2792,0.045329],[5.5378,-0.42369,0.033743],[5.2272,3.4319,0.033743],[3.6743,6.2359,-0.001017],[-2.5373,4.1329,-0.25592],[-2.2267,5.1844,-0.012604],[-2.2267,6.2359,-0.012604],[-2.2267,6.5864,-0.012604],[-1.6055,6.5864,-0.012604],[-0.98438,6.5864,-0.012604],[0.25794,4.4834,0.010569],[0.87909,3.0814,0.010569],[3.0531,0.62783,0.022156],[4.606,-1.8257,0.010569],[6.1589,-3.5782,-0.001017],[7.4013,-5.3308,0.010569],[8.9541,-6.0318,0.010569],[10.818,-7.0833,0.022156],[11.128,-4.9803,0.010569],[12.06,-0.42369,-0.012604],[12.992,3.0814,-0.001017],[15.166,6.2359,0.010569],[18.272,8.6895,0.022156],[21.067,8.6895,-0.001017],[23.862,8.6895,-0.012604],[24.794,7.6379,-0.035777],[25.725,2.7309,-0.047364],[26.657,-2.1762,-0.070537],[28.521,-2.5267,-0.093711],[27.899,-2.5267,-0.082124],[25.104,-4.6298,-0.093711],[22.62,-5.6813,-0.093711],[20.446,-6.7328,-0.070537],[17.34,-7.0833,-0.058951],[13.923,-6.3823,-0.035777],[12.06,-7.0833,-0.035777],[9.5753,-8.1348,-0.035777],[7.4013,-8.4853,-0.035777],[5.2272,-7.7843,0.022156],[4.9166,-7.4338,0.033743],[4.606,-5.6813,0.033743],[4.606,-2.5267,0.045329],[4.9166,1.3288,0.033743],[5.2272,6.2359,0.033743],[4.2955,9.3905,-0.024191],[-2.5373,3.4319,-0.29068],[-2.2267,4.4834,-0.012604],[-2.2267,5.1844,-0.012604],[-1.6055,5.5349,-0.012604],[-1.295,5.5349,-0.012604],[-0.36322,6.2359,-0.012604],[0.87909,4.1329,-0.001017],[1.1897,2.0299,0.010569],[3.3637,-0.073181,0.010569],[4.9166,-2.1762,-0.001017],[6.1589,-4.2793,-0.001017],[7.0907,-5.3308,-0.001017],[8.6436,-5.6813,-0.001017],[10.196,-6.0318,0.010569],[11.128,-2.8772,0.010569],[13.302,1.6793,-0.001017],[16.097,6.2359,-0.001017],[19.824,9.04,0.010569],[23.241,10.793,0.010569],[26.657,10.091,-0.012604],[28.831,10.091,-0.012604],[29.763,9.04,-0.024191],[29.763,4.1329,-0.047364],[29.763,-1.4752,-0.058951],[30.384,-1.8257,-0.070537],[28.831,-2.1762,-0.058951],[25.725,-4.2793,-0.070537],[21.998,-5.6813,-0.070537],[19.203,-7.0833,-0.047364],[15.476,-7.0833,-0.035777],[12.06,-6.7328,-0.024191],[10.196,-7.7843,-0.024191],[8.333,-8.8358,-0.024191],[6.4695,-8.8358,-0.024191],[4.2955,-7.4338,0.022156],[4.2955,-6.7328,0.033743],[4.2955,-4.9803,0.033743],[4.606,-1.4752,0.033743],[5.2272,3.7824,0.022156],[5.5378,9.04,0.022156],[4.9166,12.545,-0.058951],[-1.6055,2.0299,-0.31386],[-1.295,3.0814,-0.012604],[-1.295,4.1329,-0.012604],[-1.295,4.4834,-0.012604],[-0.98438,4.8339,-0.012604],[-0.36322,5.1844,-0.012604],[0.25794,3.7824,-0.012604],[0.87909,2.3804,-0.001017],[2.7426,0.62783,0.010569],[3.6743,-1.4752,-0.001017],[4.9166,-2.1762,-0.001017],[6.1589,-2.5267,-0.001017],[7.0907,-2.1762,-0.001017],[8.9541,-2.1762,-0.001017],[10.196,-0.073181,0.010569],[12.992,4.1329,-0.001017],[16.719,8.339,-0.001017],[21.377,10.793,0.010569],[26.036,12.545,-0.001017],[29.142,11.844,-0.012604],[31.005,11.844,-0.012604],[31.005,10.793,-0.024191],[30.384,6.2359,-0.035777],[29.763,-0.073181,-0.035777],[30.074,-1.1247,-0.047364],[27.899,-1.4752,-0.035777],[23.862,-3.5782,-0.047364],[20.135,-4.6298,-0.047364],[16.719,-6.3823,-0.024191],[13.302,-6.7328,-0.024191],[10.196,-7.0833,-0.012604],[8.9541,-8.1348,-0.012604],[7.0907,-9.1863,-0.012604],[5.5378,-8.8358,-0.012604],[4.2955,-7.4338,0.010569],[4.606,-6.3823,0.022156],[4.606,-3.9287,0.022156],[4.9166,-0.073181,0.022156],[5.5378,5.1844,0.010569],[6.1589,10.793,0.010569],[5.2272,14.298,-0.093711],[0.56851,0.62783,-0.34862],[0.25794,1.3288,-0.012604],[-0.36322,2.3804,-0.012604],[-0.6738,3.0814,-0.012604],[-0.98438,3.7824,-0.012604],[-0.98438,4.1329,-0.012604],[-0.6738,3.7824,-0.024191],[-0.36322,3.4319,-0.001017],[1.1897,2.0299,-0.001017],[2.1214,0.97834,-0.001017],[3.0531,0.97834,-0.001017],[4.2955,1.6793,-0.012604],[5.5378,2.3804,-0.001017],[8.0224,2.3804,-0.001017],[9.2647,4.1329,-0.001017],[11.439,7.2874,-0.001017],[14.855,9.741,-0.001017],[19.203,11.844,-0.001017],[24.794,13.597,-0.001017],[28.21,12.896,-0.012604],[30.384,12.545,-0.012604],[29.763,11.844,-0.001017],[28.831,7.2874,-0.012604],[27.899,0.97834,-0.024191],[27.278,-0.073181,-0.024191],[25.104,-0.42369,-0.012604],[21.067,-1.8257,-0.024191],[17.029,-2.8772,-0.024191],[14.234,-4.2793,-0.012604],[11.128,-4.9803,-0.001017],[9.2647,-6.0318,-0.001017],[8.333,-7.7843,-0.001017],[6.7801,-8.1348,-0.012604],[5.5378,-7.7843,-0.001017],[4.9166,-6.7328,0.010569],[4.9166,-4.9803,0.010569],[4.9166,-2.5267,0.010569],[5.2272,0.62783,0.010569],[5.5378,4.8339,-0.001017],[5.5378,9.741,-0.001017],[4.9166,13.246,-0.14006],[2.1214,-0.42369,-0.34862],[1.5003,0.27732,-0.001017],[0.87909,0.97834,-0.012604],[0.87909,1.6793,-0.012604],[0.56851,2.0299,-0.001017],[0.25794,2.0299,-0.012604],[0.25794,2.0299,-0.024191],[0.25794,2.0299,-0.012604],[0.56851,1.3288,-0.001017],[0.87909,0.97834,-0.001017],[1.5003,1.6793,-0.001017],[2.432,2.3804,-0.012604],[3.3637,3.4319,-0.001017],[5.2272,4.1329,-0.001017],[7.0907,5.5349,-0.001017],[8.6436,6.5864,-0.001017],[10.818,7.6379,-0.001017],[13.302,8.6895,-0.001017],[16.097,9.3905,-0.012604],[18.582,9.04,-0.012604],[20.135,8.6895,-0.001017],[20.135,8.6895,-0.001017],[20.446,7.2874,-0.012604],[20.446,2.7309,-0.012604],[20.446,1.3288,-0.001017],[19.203,1.3288,-0.012604],[17.34,-0.073181,-0.012604],[14.855,-1.4752,-0.012604],[12.992,-2.1762,-0.012604],[11.128,-3.5782,-0.001017],[10.196,-5.3308,-0.001017],[9.2647,-6.0318,-0.001017],[8.0224,-4.9803,-0.012604],[7.0907,-4.2793,-0.001017],[6.4695,-2.8772,-0.001017],[6.1589,-1.8257,-0.001017],[5.5378,-0.42369,-0.001017],[5.2272,1.3288,-0.001017],[5.2272,3.4319,-0.001017],[5.2272,6.2359,-0.001017],[4.9166,7.9885,-0.17482],[2.7426,-0.77419,-0.34862],[2.432,-0.073181,-0.001017],[2.1214,0.62783,-0.012604],[2.1214,1.3288,-0.001017],[1.5003,1.6793,-0.001017],[0.87909,1.3288,-0.012604],[0.87909,1.3288,-0.024191],[0.87909,1.6793,-0.012604],[0.87909,0.97834,-0.001017],[0.87909,0.97834,-0.001017],[1.1897,1.6793,-0.001017],[1.5003,2.7309,-0.012604],[2.432,3.7824,-0.001017],[3.6743,4.8339,-0.001017],[5.5378,5.5349,-0.001017],[7.0907,5.5349,-0.001017],[8.6436,6.2359,-0.001017],[10.196,6.2359,-0.012604],[12.06,6.2359,-0.012604],[14.234,6.2359,-0.012604],[15.476,5.5349,-0.001017],[16.408,4.4834,-0.001017],[17.34,3.4319,-0.012604],[18.272,2.0299,-0.001017],[18.272,1.3288,-0.001017],[17.34,-0.073181,-0.012604],[16.408,-1.8257,-0.001017],[14.855,-2.5267,-0.001017],[13.302,-3.5782,-0.012604],[12.06,-3.9287,-0.001017],[10.196,-3.5782,0.010569],[8.9541,-3.2277,-0.001017],[8.0224,-2.5267,-0.012604],[7.4013,-1.8257,-0.001017],[6.7801,-1.1247,-0.001017],[6.1589,-0.42369,-0.001017],[5.5378,0.62783,-0.001017],[5.2272,1.3288,-0.001017],[4.9166,2.3804,-0.001017],[4.9166,3.7824,-0.012604],[4.606,5.1844,-0.22116],[3.0531,-0.77419,-0.32544],[3.0531,-0.073181,-0.001017],[2.7426,0.62783,-0.001017],[2.432,1.3288,-0.001017],[2.1214,1.6793,-0.001017],[1.5003,1.3288,-0.012604],[1.1897,1.3288,-0.012604],[1.1897,1.6793,-0.012604],[1.1897,1.3288,-0.012604],[1.1897,1.3288,-0.012604],[1.1897,2.3804,-0.012604],[1.5003,3.4319,-0.012604],[2.432,4.4834,-0.001017],[3.3637,5.1844,-0.001017],[4.9166,5.5349,-0.001017],[6.4695,5.5349,-0.001017],[8.0224,5.1844,-0.012604],[9.2647,4.4834,-0.012604],[10.507,4.4834,-0.012604],[12.06,4.4834,-0.012604],[13.302,3.7824,-0.001017],[14.855,2.7309,-0.001017],[16.097,1.3288,-0.001017],[16.719,1.6793,-0.001017],[16.408,1.6793,0.010569],[16.097,-0.77419,-0.012604],[15.166,-2.5267,-0.001017],[14.545,-3.9287,-0.001017],[13.302,-4.6298,-0.001017],[11.439,-3.9287,-0.001017],[8.9541,-1.8257,-0.001017],[8.0224,-1.4752,-0.001017],[7.0907,-1.8257,-0.012604],[6.7801,-1.1247,-0.001017],[6.4695,-0.42369,-0.001017],[6.1589,0.27732,-0.012604],[5.5378,0.62783,-0.012604],[5.2272,0.97834,-0.012604],[4.9166,0.97834,-0.001017],[4.606,2.0299,-0.012604],[4.606,3.4319,-0.25592],[3.3637,-0.42369,-0.31386],[3.3637,-0.073181,-0.001017],[3.0531,0.62783,-0.001017],[2.7426,0.97834,-0.001017],[2.432,1.3288,-0.001017],[1.5003,0.97834,-0.012604],[1.5003,1.6793,-0.012604],[1.5003,2.3804,-0.012604],[1.5003,2.3804,-0.012604],[1.5003,2.7309,-0.012604],[1.5003,4.1329,-0.012604],[2.1214,5.1844,-0.012604],[2.7426,6.2359,-0.012604],[3.6743,5.5349,-0.012604],[4.9166,5.5349,-0.012604],[6.7801,6.2359,-0.001017],[8.0224,5.5349,-0.012604],[9.2647,4.1329,-0.012604],[10.507,3.7824,-0.012604],[11.439,4.1329,-0.012604],[12.681,3.4319,-0.001017],[13.923,2.3804,-0.001017],[14.545,1.6793,-0.001017],[14.855,2.7309,-0.001017],[14.545,2.3804,0.010569],[14.545,-0.42369,-0.001017],[13.923,-2.5267,-0.001017],[13.302,-3.9287,-0.001017],[12.06,-4.2793,-0.001017],[10.196,-3.5782,-0.001017],[7.4013,-1.1247,-0.001017],[6.4695,-0.42369,-0.001017],[6.1589,-1.4752,-0.012604],[5.5378,-1.1247,-0.001017],[5.5378,-0.42369,-0.001017],[5.2272,-0.42369,-0.012604],[5.2272,-0.42369,-0.012604],[4.9166,-0.42369,-0.012604],[4.606,-0.42369,-0.012604],[4.2955,0.27732,-0.012604],[4.2955,1.6793,-0.30227],[2.7426,-0.073181,-0.30227],[2.7426,0.27732,-0.001017],[2.7426,0.62783,-0.001017],[2.432,0.97834,-0.001017],[2.1214,0.97834,-0.001017],[1.5003,0.97834,-0.001017],[1.5003,1.6793,-0.012604],[2.1214,3.0814,-0.012604],[2.432,3.0814,-0.012604],[2.432,3.4319,-0.012604],[2.7426,4.8339,-0.012604],[2.7426,5.5349,-0.012604],[3.3637,6.2359,-0.012604],[4.9166,4.8339,-0.012604],[5.5378,4.4834,-0.012604],[7.0907,5.1844,-0.001017],[8.6436,5.1844,-0.001017],[9.5753,3.7824,-0.012604],[10.507,3.4319,-0.012604],[11.439,3.7824,-0.001017],[12.06,3.0814,-0.001017],[12.992,2.0299,-0.001017],[13.923,1.3288,-0.001017],[13.923,2.0299,-0.001017],[12.992,1.6793,0.010569],[12.681,-0.77419,-0.001017],[12.371,-2.5267,-0.001017],[11.439,-3.5782,0.010569],[10.196,-3.9287,-0.001017],[8.6436,-2.8772,-0.001017],[6.1589,-0.77419,-0.001017],[5.2272,-0.073181,-0.001017],[4.9166,-1.4752,-0.001017],[4.9166,-1.1247,-0.001017],[4.9166,-1.1247,-0.001017],[4.606,-1.1247,-0.012604],[4.2955,-1.4752,-0.012604],[3.6743,-1.4752,-0.012604],[3.0531,-1.4752,-0.012604],[2.7426,-1.1247,-0.012604],[2.432,0.27732,-0.32544],[2.1214,0.27732,-0.30227],[2.1214,0.27732,-0.001017],[2.1214,0.62783,-0.001017],[2.1214,0.62783,-0.001017],[1.5003,0.62783,-0.001017],[1.5003,0.27732,-0.001017],[1.5003,1.3288,-0.012604],[2.432,3.4319,-0.012604],[3.0531,3.7824,-0.012604],[3.3637,4.1329,-0.012604],[3.3637,5.1844,-0.012604],[3.6743,5.5349,-0.012604],[4.606,5.5349,-0.012604],[5.5378,4.1329,-0.012604],[6.7801,3.4319,-0.012604],[8.0224,4.1329,-0.001017],[8.9541,4.1329,-0.001017],[10.196,3.0814,-0.001017],[10.818,3.4319,-0.001017],[11.439,3.4319,-0.001017],[11.439,2.7309,-0.001017],[12.681,1.3288,-0.001017],[12.992,0.97834,-0.001017],[12.681,1.3288,0.010569],[12.06,0.62783,0.010569],[11.128,-1.1247,0.010569],[10.196,-2.1762,0.010569],[9.2647,-2.8772,0.010569],[8.333,-2.8772,-0.001017],[6.7801,-2.1762,-0.001017],[4.9166,-0.42369,-0.001017],[4.2955,-0.073181,-0.001017],[4.2955,-1.4752,-0.001017],[4.2955,-1.4752,-0.001017],[3.6743,-1.4752,-0.012604],[3.3637,-1.8257,-0.012604],[3.0531,-1.8257,-0.012604],[2.432,-2.1762,-0.012604],[1.5003,-2.1762,-0.012604],[0.87909,-1.8257,-0.012604],[0.25793,-1.1247,-0.34862],[-0.98438,-0.42369,-0.001017],[-2.2267,0.97833,-0.001017],[-3.1584,3.4319,-0.001017],[-1.6055,2.3804,-0.001017],[-2.5373,5.5349,-0.001017],[-1.6055,3.7824,-0.001017],[-2.8479,4.4834,-0.001017],[-2.5373,0.97833,-0.001017],[-1.6055,-1.1247,-0.001017],[-2.2267,-1.1247,-0.001017],[-3.469,-0.42369,-0.001017],[-5.6431,0.97833,-0.001017],[-7.196,1.3288,-0.001017],[-6.8854,0.27732,-0.001017],[-6.2642,-1.1247,-0.001017],[-5.6431,-1.1247,-0.001017],[-6.2642,-0.42369,-0.001017],[-5.3325,-0.073182,-0.001017],[-5.0219,-0.073182,-0.001017],[-4.4008,0.27732,-0.001017],[-3.469,0.27732,-0.001017],[-2.8479,-0.42369,-0.001017],[-1.295,-0.77419,-0.001017],[0.87909,-1.8257,-0.001017],[2.1214,-2.1762,-0.001017],[4.2955,-2.5267,-0.001017],[4.9166,-2.1762,-0.001017],[5.5378,-2.5267,-0.001017],[6.7801,-4.6298,-0.001017],[7.0907,-6.0318,-0.001017],[8.0224,-8.1348,-0.001017],[8.333,-8.4853,-0.001017],[7.0907,-10.238,-0.001017],[6.1589,-10.238,-0.001017],[5.2272,-10.939,-0.001017],[5.2272,-11.289,-0.001017],[4.2955,-10.939,-0.001017],[3.0531,-10.588,-0.001017],[1.1897,-8.1348,-0.001017],[2.1214,-2.1762,-0.001017],[2.432,-1.8257,-0.001017],[-4.7113,1.6793,-0.012604],[-3.1584,2.0299,-0.001017],[-3.1584,3.4319,-0.001017],[-1.6055,2.3804,-0.001017],[-2.5373,5.5349,-0.001017],[-1.6055,3.7824,-0.001017],[-2.8479,4.4834,-0.001017],[-3.1584,2.0299,-0.001017],[-3.1584,0.27732,-0.001017],[-3.469,-0.77419,-0.001017],[-5.0219,-0.073181,-0.001017],[-5.6431,-1.1247,0.010569],[-6.5748,-1.1247,0.010569],[-7.5065,-0.073181,-0.001017],[-8.7489,1.3288,-0.001017],[-9.6806,3.0814,-0.001017],[-10.612,3.7824,-0.001017],[-10.612,4.4834,-0.012604],[-10.612,5.5349,-0.012604],[-9.0594,5.5349,-0.012604],[-8.7489,6.9369,-0.001017],[-8.4383,6.9369,-0.001017],[-6.2642,5.5349,-0.024191],[-2.8479,2.0299,-0.024191],[-0.98438,0.62783,-0.024191],[1.1897,-0.42369,-0.035777],[4.2955,-1.8257,-0.024191],[5.2272,-3.5782,-0.035777],[7.4013,-6.0318,-0.035777],[8.333,-8.4853,-0.024191],[10.196,-13.743,-0.035777],[11.128,-18.299,-0.024191],[10.818,-14.444,-0.012604],[11.439,-22.155,-0.024191],[10.818,-20.052,-0.024191],[9.2647,-15.846,0.010569],[8.0224,-16.196,0.010569],[7.0907,-9.5368,-0.001017],[5.5378,-6.0318,-0.001017],[4.606,-2.1762,-0.001017],[2.7426,-0.42369,0.010569],[-6.2642,2.7309,-0.093711],[-5.3325,4.4834,-0.012604],[-4.7113,6.9369,-0.001017],[-3.1584,7.6379,-0.012604],[-2.5373,8.6895,-0.001017],[-1.295,8.6895,0.010569],[-0.98438,7.6379,0.022156],[-2.2267,6.9369,0.033743],[-1.6055,5.5349,0.010569],[-2.8479,4.1329,0.022156],[-3.469,2.0299,0.022156],[-3.7796,-0.073181,0.022156],[-4.7113,-1.4752,0.010569],[-5.3325,-1.4752,0.010569],[-6.5748,-0.42369,0.010569],[-7.5065,1.3288,0.010569],[-8.1277,2.7309,-0.012604],[-8.1277,4.1329,-0.012604],[-7.196,5.1844,-0.012604],[-5.3325,6.2359,-0.012604],[-3.469,5.5349,0.010569],[-2.8479,5.1844,-0.001017],[-0.6738,3.0814,-0.047364],[3.6743,-2.1762,-0.035777],[5.2272,-4.9803,-0.047364],[8.333,-4.9803,-0.058951],[11.128,-7.4338,-0.047364],[12.681,-9.5368,-0.058951],[14.234,-11.289,-0.058951],[13.923,-12.341,-0.047364],[14.234,-12.691,-0.047364],[14.234,-14.093,-0.047364],[13.302,-15.145,-0.024191],[12.992,-15.145,-0.035777],[12.371,-15.145,-0.035777],[10.818,-14.444,0.022156],[8.6436,-11.64,0.010569],[7.4013,-8.1348,0.010569],[6.1589,-4.6298,0.010569],[5.2272,0.27732,0.010569],[4.606,3.7824,0.010569],[-3.469,2.0299,-0.16323],[-2.8479,3.0814,-0.012604],[-2.2267,4.4834,-0.012604],[-1.295,5.5349,-0.012604],[-0.98438,6.9369,-0.001017],[-0.36322,7.2874,0.010569],[0.25794,6.5864,0.033743],[1.1897,4.4834,0.045329],[1.5003,3.4319,0.022156],[1.5003,2.0299,0.033743],[2.432,-0.073181,0.033743],[2.1214,-1.1247,0.022156],[1.5003,-2.5267,0.022156],[1.1897,-2.1762,0.022156],[0.56851,-1.1247,0.022156],[0.25794,-0.073181,0.010569],[0.25794,1.6793,-0.012604],[0.56851,3.4319,-0.001017],[1.5003,5.1844,-0.012604],[3.3637,6.2359,-0.001017],[5.2272,4.8339,0.010569],[6.4695,3.7824,0.010569],[8.333,2.0299,-0.047364],[12.371,-4.2793,-0.047364],[14.234,-6.0318,-0.058951],[16.097,-3.5782,-0.082124],[17.961,-4.9803,-0.070537],[18.582,-6.7328,-0.082124],[18.582,-7.7843,-0.082124],[17.029,-7.0833,-0.058951],[16.408,-8.8358,-0.070537],[16.097,-10.588,-0.058951],[14.545,-10.939,-0.035777],[12.992,-11.289,-0.058951],[11.439,-10.588,-0.047364],[10.196,-10.238,0.033743],[8.333,-8.4853,0.022156],[6.7801,-6.0318,0.022156],[5.5378,-2.1762,0.022156],[4.9166,2.3804,0.022156],[3.6743,6.2359,-0.001017],[-2.2267,3.0814,-0.20958],[-1.6055,4.4834,-0.012604],[-1.6055,5.5349,-0.012604],[-1.295,6.5864,-0.001017],[-0.98438,6.9369,0.010569],[-0.36322,6.9369,0.010569],[0.25793,6.5864,0.022156],[1.1897,3.7824,0.033743],[2.7426,1.3288,0.010569],[3.6743,-0.42369,0.022156],[5.2272,-1.8257,0.022156],[6.4695,-4.2792,0.022156],[7.0907,-6.7328,0.022156],[8.0224,-6.7328,0.022156],[7.4013,-4.6298,0.022156],[8.0224,-3.2277,0.010569],[8.333,-1.1247,-0.012604],[8.6436,0.97834,-0.001017],[10.196,3.4319,-0.012604],[12.06,4.4834,0.010569],[13.923,3.4319,0.022156],[16.097,2.7309,0.022156],[17.961,0.27732,-0.047364],[21.377,-6.7328,-0.058951],[23.241,-8.1348,-0.070537],[24.483,-3.9287,-0.093711],[24.483,-4.2792,-0.082124],[23.241,-6.3823,-0.093711],[21.998,-6.3823,-0.093711],[19.203,-5.3308,-0.070537],[17.961,-6.7328,-0.082124],[16.719,-8.4853,-0.058951],[14.855,-8.1348,-0.035777],[12.681,-8.1348,-0.058951],[10.196,-7.0833,-0.047364],[8.6436,-7.0833,0.033743],[7.0907,-5.6813,0.033743],[6.1589,-3.5782,0.033743],[5.2272,-0.073181,0.033743],[5.2272,4.8339,0.022156],[4.606,9.04,-0.012604],[-1.295,3.7824,-0.22116],[-1.295,4.4834,-0.012604],[-0.98438,5.1844,-0.012604],[-0.98438,5.5349,-0.001017],[-0.36322,6.2359,-0.001017],[0.56851,5.5349,-0.001017],[1.5003,5.1844,0.010569],[3.6743,2.3804,0.010569],[5.2272,-0.42369,-0.001017],[6.4695,-2.1762,0.010569],[7.4013,-4.2793,0.010569],[8.9541,-5.6813,0.010569],[10.196,-7.4338,0.010569],[11.128,-7.0833,0.010569],[11.128,-4.6298,0.010569],[12.371,-2.1762,0.010569],[13.923,-0.42369,-0.001017],[15.476,2.3804,0.010569],[17.961,5.1844,-0.001017],[20.135,6.9369,0.010569],[22.62,6.9369,0.022156],[25.725,5.1844,0.022156],[28.21,0.97834,-0.035777],[31.005,-6.3823,-0.058951],[32.558,-8.8358,-0.070537],[32.869,-4.2793,-0.082124],[31.937,-4.2793,-0.070537],[28.831,-6.3823,-0.082124],[24.794,-6.0318,-0.082124],[20.446,-4.6298,-0.058951],[17.961,-6.0318,-0.070537],[16.719,-7.7843,-0.047364],[14.234,-7.0833,-0.024191],[11.128,-7.0833,-0.035777],[7.4013,-6.0318,-0.035777],[6.4695,-5.6813,0.033743],[5.2272,-4.2793,0.033743],[4.9166,-1.8257,0.033743],[4.9166,2.0299,0.033743],[5.2272,8.339,0.022156],[4.606,12.896,-0.035777],[-0.98438,3.0814,-0.24434],[-0.98438,4.1329,-0.012604],[-0.6738,4.8339,-0.012604],[0.25794,5.1844,-0.001017],[0.87909,5.1844,-0.001017],[1.5003,4.8339,-0.001017],[3.0531,4.4834,-0.001017],[4.9166,1.6793,-0.001017],[6.4695,-1.4752,-0.001017],[7.4013,-2.8772,-0.001017],[8.6436,-4.9803,-0.001017],[9.2647,-6.0318,-0.001017],[10.507,-7.0833,-0.001017],[11.439,-6.3823,-0.001017],[12.06,-3.5782,0.010569],[13.923,-1.4752,0.010569],[16.408,0.97834,-0.001017],[19.824,3.7824,0.010569],[23.241,6.9369,-0.001017],[26.347,8.339,0.010569],[28.831,9.3905,0.010569],[30.695,7.9885,0.010569],[32.248,2.0299,-0.024191],[34.422,-5.3308,-0.047364],[34.732,-7.4338,-0.058951],[34.422,-2.8772,-0.070537],[32.248,-3.5782,-0.047364],[28.21,-5.6813,-0.058951],[23.241,-5.6813,-0.058951],[18.582,-4.2793,-0.035777],[16.097,-6.3823,-0.047364],[14.855,-8.4853,-0.035777],[12.681,-7.4338,-0.012604],[10.196,-7.0833,-0.024191],[6.7801,-5.6813,-0.012604],[5.5378,-5.3308,0.022156],[5.2272,-2.8772,0.022156],[5.2272,-0.073181,0.022156],[5.2272,4.4834,0.022156],[6.1589,11.143,0.022156],[5.5378,16.751,-0.070537],[-0.6738,2.0299,-0.26751],[-0.6738,3.0814,-0.012604],[-0.36322,3.7824,-0.012604],[0.25794,4.4834,-0.012604],[0.87909,4.4834,-0.012604],[1.5003,4.4834,-0.001017],[3.0531,4.1329,-0.001017],[4.2955,2.0299,-0.012604],[5.5378,-0.42369,-0.012604],[6.4695,-1.8257,-0.001017],[7.4013,-3.2277,-0.001017],[8.333,-3.9287,-0.001017],[8.9541,-4.6298,-0.001017],[10.196,-3.9287,-0.001017],[10.818,-1.1247,0.010569],[12.992,0.62783,0.010569],[16.408,3.0814,-0.001017],[20.135,5.5349,0.010569],[24.173,7.9885,-0.001017],[27.899,9.04,0.010569],[30.695,11.494,-0.001017],[30.074,10.442,0.010569],[31.316,3.4319,-0.001017],[32.558,-3.2277,-0.035777],[32.248,-4.9803,-0.047364],[31.005,-1.4752,-0.035777],[30.074,-1.8257,-0.035777],[24.794,-3.9287,-0.035777],[20.135,-4.6298,-0.035777],[16.097,-4.2793,-0.024191],[14.234,-6.7328,-0.035777],[13.302,-8.4853,-0.024191],[11.439,-7.4338,-0.001017],[9.2647,-7.0833,-0.001017],[6.4695,-5.6813,-0.012604],[5.5378,-4.6298,0.022156],[5.5378,-2.1762,0.010569],[5.2272,0.97834,0.010569],[5.5378,5.5349,0.010569],[6.4695,12.545,0.010569],[6.4695,18.153,-0.11688],[0.56851,0.62783,-0.29068],[0.25794,1.3288,-0.012604],[0.25794,2.3804,-0.012604],[0.25794,3.0814,-0.012604],[0.25794,3.7824,-0.012604],[0.56851,3.7824,-0.001017],[0.87909,3.4319,-0.012604],[2.1214,2.3804,-0.012604],[3.0531,1.3288,-0.012604],[3.6743,0.62783,-0.001017],[4.606,-0.073181,-0.001017],[5.2272,0.27732,-0.001017],[6.4695,-0.42369,-0.001017],[8.333,0.62783,-0.001017],[9.2647,2.7309,-0.001017],[11.128,4.1329,-0.001017],[13.923,5.5349,-0.001017],[16.719,6.9369,-0.001017],[20.135,7.6379,-0.001017],[23.241,8.6895,-0.001017],[26.968,13.246,-0.001017],[23.862,12.545,0.010569],[25.725,5.1844,0.010569],[26.968,-0.77419,-0.024191],[25.725,-1.8257,-0.035777],[25.104,0.62783,-0.024191],[26.036,0.62783,-0.012604],[20.756,-1.1247,-0.012604],[16.719,-2.1762,-0.012604],[14.545,-3.9287,-0.012604],[13.302,-6.0318,-0.024191],[12.371,-7.0833,-0.012604],[10.507,-6.7328,-0.001017],[8.6436,-6.3823,-0.001017],[6.4695,-4.9803,-0.001017],[5.5378,-3.5782,0.010569],[5.2272,-1.4752,-0.001017],[5.2272,1.6793,-0.001017],[5.2272,5.5349,-0.001017],[5.5378,11.494,0.010569],[5.5378,16.401,-0.17482],[2.1214,-0.77419,-0.30227],[1.5003,-0.073181,-0.012604],[1.1897,0.97834,-0.012604],[1.1897,1.6793,-0.012604],[0.87909,2.0299,-0.012604],[0.87909,2.3804,-0.001017],[0.87909,1.6793,-0.012604],[1.1897,1.3288,-0.024191],[1.5003,1.3288,-0.012604],[2.1214,0.97834,-0.012604],[2.432,0.97834,-0.012604],[3.0531,1.3288,-0.012604],[4.2955,1.6793,-0.012604],[5.2272,2.7309,-0.001017],[6.7801,3.7824,-0.001017],[8.6436,4.1329,-0.001017],[10.507,5.1844,-0.001017],[12.681,6.2359,-0.001017],[14.855,6.2359,-0.001017],[17.34,6.5864,-0.001017],[18.893,9.04,-0.012604],[18.272,9.741,-0.001017],[19.824,5.1844,0.010569],[21.067,1.6793,-0.012604],[20.135,0.27732,-0.024191],[20.446,1.6793,-0.012604],[21.998,1.6793,-0.012604],[18.272,0.62783,-0.012604],[15.476,-1.1247,-0.001017],[14.545,-3.5782,-0.001017],[13.302,-4.6298,-0.012604],[12.06,-4.2793,-0.012604],[10.507,-2.8772,-0.001017],[8.9541,-2.1762,0.010569],[8.0224,-1.4752,-0.001017],[6.7801,-0.77419,-0.001017],[6.4695,0.62783,-0.001017],[5.5378,2.3804,-0.001017],[5.5378,4.1329,-0.001017],[5.2272,7.2874,0.010569],[5.2272,9.3905,-0.22116],[2.7426,-1.1247,-0.30227],[2.432,-0.073181,-0.001017],[2.432,0.62783,-0.012604],[2.1214,1.3288,-0.012604],[2.1214,1.6793,-0.012604],[1.5003,2.0299,-0.001017],[1.1897,1.3288,-0.012604],[1.5003,0.97834,-0.024191],[1.5003,1.3288,-0.012604],[1.1897,0.97834,-0.012604],[1.5003,1.3288,-0.012604],[2.1214,2.0299,-0.012604],[2.7426,2.7309,-0.012604],[3.6743,3.4319,-0.001017],[5.2272,4.1329,-0.001017],[6.7801,4.1329,-0.001017],[8.0224,4.4834,-0.001017],[9.5753,4.4834,-0.001017],[11.128,3.7824,-0.001017],[12.992,3.7824,-0.001017],[14.545,4.1329,-0.024191],[14.855,4.1329,-0.012604],[16.408,2.3804,0.010569],[17.029,0.97834,-0.001017],[17.029,-0.073181,-0.012604],[17.34,-0.073181,-0.001017],[17.34,-0.42369,-0.012604],[16.097,-1.4752,-0.012604],[14.234,-1.8257,0.010569],[12.681,-1.8257,0.010569],[11.128,-1.8257,-0.012604],[10.507,-2.1762,-0.012604],[9.5753,-1.4752,-0.001017],[8.6436,-0.42369,0.010569],[8.0224,0.27732,-0.001017],[7.0907,0.97834,-0.001017],[6.4695,1.6793,-0.001017],[6.1589,2.3804,-0.001017],[5.5378,3.4319,-0.001017],[5.2272,4.4834,0.010569],[4.9166,6.2359,-0.26751],[3.0531,-0.77419,-0.29068],[2.7426,-0.073181,-0.001017],[2.7426,0.62783,-0.001017],[2.432,1.3288,-0.001017],[2.432,1.6793,-0.012604],[2.1214,2.0299,-0.001017],[1.5003,1.3288,-0.012604],[1.5003,0.97834,-0.012604],[1.5003,1.6793,-0.012604],[1.1897,1.6793,-0.012604],[1.5003,2.3804,-0.012604],[2.1214,3.0814,-0.012604],[2.7426,3.4319,-0.012604],[3.3637,3.7824,-0.012604],[4.606,4.1329,-0.001017],[5.5378,4.1329,-0.001017],[6.7801,3.7824,-0.001017],[8.0224,3.4319,-0.001017],[8.9541,2.7309,-0.001017],[10.196,2.7309,-0.012604],[11.128,1.6793,-0.024191],[12.992,0.97834,-0.012604],[14.234,0.62783,0.010569],[14.234,0.62783,-0.001017],[14.855,-0.073181,-0.012604],[15.166,-0.77419,-0.001017],[14.234,-1.8257,-0.001017],[13.923,-2.8772,-0.012604],[12.371,-2.5267,0.010569],[10.196,-0.42369,0.010569],[8.9541,-0.42369,-0.012604],[8.9541,-1.8257,-0.012604],[8.6436,-0.77419,-0.001017],[8.0224,0.27732,-0.001017],[7.0907,0.62783,-0.001017],[6.7801,0.97834,-0.001017],[6.4695,1.3288,-0.012604],[6.1589,1.6793,-0.012604],[5.2272,2.3804,-0.001017],[4.9166,2.7309,0.010569],[4.606,3.7824,-0.30227],[3.3637,-0.42369,-0.2791],[3.0531,0.27732,-0.001017],[2.7426,0.97834,-0.001017],[2.7426,1.3288,-0.001017],[2.432,1.6793,-0.001017],[2.1214,1.6793,-0.001017],[1.5003,1.3288,-0.012604],[2.1214,1.6793,-0.012604],[2.1214,2.7309,-0.012604],[2.1214,3.0814,-0.012604],[2.1214,3.7824,-0.012604],[2.432,4.4834,-0.012604],[3.0531,4.4834,-0.012604],[4.2955,4.4834,-0.012604],[4.606,4.8339,-0.001017],[5.5378,4.4834,-0.001017],[6.4695,3.4319,-0.001017],[7.0907,2.7309,-0.001017],[8.0224,2.3804,-0.001017],[8.333,2.3804,-0.012604],[8.9541,1.6793,-0.024191],[11.128,0.97834,-0.012604],[12.371,1.3288,0.010569],[12.06,2.3804,-0.001017],[12.992,1.3288,-0.001017],[13.302,-0.42369,0.010569],[11.439,-1.8257,-0.001017],[11.439,-3.2277,-0.001017],[10.507,-2.1762,0.010569],[7.4013,0.62783,0.010569],[6.7801,0.27732,-0.001017],[7.4013,-1.8257,-0.001017],[7.4013,-0.77419,-0.001017],[7.0907,-0.073181,-0.001017],[6.7801,0.27732,-0.001017],[6.4695,0.27732,-0.012604],[6.1589,0.27732,-0.012604],[5.5378,0.62783,-0.012604],[5.2272,0.97834,-0.012604],[4.606,0.97834,-0.001017],[4.606,1.6793,-0.33703],[3.0531,-0.073181,-0.2791],[2.7426,0.62783,-0.001017],[2.7426,0.97834,-0.001017],[2.432,1.3288,-0.001017],[2.432,1.3288,-0.001017],[2.1214,1.6793,-0.001017],[1.5003,1.3288,-0.012604],[2.1214,2.0299,-0.012604],[2.7426,3.4319,-0.012604],[2.7426,3.7824,-0.012604],[2.7426,4.4834,-0.012604],[3.3637,4.8339,-0.012604],[3.6743,4.4834,-0.012604],[4.9166,4.1329,-0.012604],[5.2272,4.4834,-0.012604],[6.1589,4.1329,-0.012604],[7.0907,2.7309,-0.001017],[7.4013,2.3804,-0.001017],[8.0224,2.3804,-0.001017],[8.333,2.3804,-0.001017],[8.9541,1.6793,-0.012604],[10.818,0.97834,-0.012604],[11.439,1.3288,-0.001017],[11.128,2.0299,-0.001017],[11.439,1.3288,-0.001017],[11.439,-0.42369,0.010569],[9.5753,-1.4752,-0.001017],[9.5753,-2.5267,-0.001017],[8.9541,-1.8257,0.010569],[6.4695,0.62783,-0.001017],[5.5378,0.27732,-0.001017],[6.7801,-1.4752,-0.001017],[6.7801,-1.1247,-0.001017],[6.4695,-0.77419,-0.001017],[6.1589,-0.42369,-0.001017],[6.1589,-0.77419,-0.012604],[5.2272,-0.77419,-0.012604],[4.9166,-0.77419,-0.012604],[4.2955,-0.42369,-0.012604],[3.3637,-0.073181,-0.001017],[2.7426,0.62783,-0.3602],[2.7426,0.62783,-0.2791],[2.432,0.97834,-0.001017],[2.432,0.97834,-0.001017],[2.432,1.3288,-0.001017],[2.1214,1.3288,-0.001017],[2.1214,1.3288,-0.001017],[1.5003,0.97834,-0.012604],[2.1214,2.0299,-0.012604],[3.0531,3.7824,-0.012604],[3.3637,4.4834,-0.012604],[3.6743,4.8339,-0.012604],[4.2955,5.1844,-0.012604],[4.9166,4.1329,-0.012604],[6.1589,3.4319,-0.012604],[6.4695,3.7824,-0.012604],[7.0907,3.4319,-0.012604],[7.4013,2.3804,-0.001017],[8.333,2.0299,-0.001017],[8.6436,2.7309,-0.001017],[8.9541,2.7309,-0.001017],[9.2647,1.3288,-0.001017],[10.818,0.62783,-0.012604],[10.818,1.3288,-0.001017],[10.507,1.6793,-0.001017],[10.507,0.62783,-0.001017],[10.196,-0.42369,0.010569],[8.0224,-1.4752,-0.001017],[8.333,-2.1762,0.010569],[7.0907,-1.8257,-0.001017],[5.5378,0.27732,-0.001017],[5.2272,0.27732,-0.001017],[6.1589,-1.4752,-0.001017],[6.1589,-1.4752,-0.001017],[5.5378,-1.1247,-0.001017],[5.5378,-1.1247,-0.001017],[5.2272,-1.4752,-0.012604],[4.606,-1.8257,-0.012604],[3.6743,-1.8257,-0.012604],[3.0531,-1.4752,-0.012604],[2.1214,-1.1247,-0.001017],[0.87909,-0.42369,-0.37179],[-1.295,-1.4752,-0.001017],[-2.8479,0.62783,-0.001017],[-2.8479,1.3288,-0.001017],[-2.2267,0.27732,-0.001017],[-3.469,3.0814,-0.001017],[-3.1584,1.3288,-0.001017],[-3.1584,0.97833,-0.001017],[-0.98438,-1.4752,-0.001017],[-1.295,-1.4752,-0.001017],[-2.5373,-0.77419,-0.001017],[-4.4008,0.62783,-0.001017],[-5.0219,0.62783,-0.001017],[-5.0219,-0.42369,-0.001017],[-4.4008,-1.8257,-0.001017],[-3.469,-2.5267,-0.001017],[-3.469,-2.1762,-0.001017],[-4.4008,-1.1247,-0.001017],[-3.7796,-0.42369,-0.001017],[-3.7796,-0.42369,-0.001017],[-3.1584,-0.42369,-0.001017],[-2.2267,-0.77419,-0.001017],[-0.6738,-1.4752,-0.001017],[0.56851,-1.8257,-0.001017],[2.432,-2.5267,-0.001017],[3.3637,-2.1762,-0.001017],[2.432,-0.42369,-0.001017],[3.6743,0.27732,-0.001017],[4.606,0.97833,-0.001017],[3.3637,0.97833,-0.001017],[4.2955,-0.42369,-0.001017],[5.2272,-0.42369,-0.001017],[5.2272,-2.1762,-0.001017],[5.5378,-5.3308,-0.001017],[5.5378,-8.8358,-0.001017],[4.2955,-8.8358,-0.001017],[3.0531,-9.5368,-0.001017],[3.3637,-9.1863,-0.001017],[2.7426,-9.8873,-0.001017],[1.1897,-8.1348,-0.001017],[0.56851,-3.2277,-0.001017],[2.432,-1.8257,-0.001017],[-3.1584,-0.77419,-0.001017],[-3.7796,1.3288,-0.001017],[-2.8479,1.3288,-0.001017],[-2.2267,0.27732,-0.001017],[-3.469,3.0814,-0.001017],[-3.1584,1.3288,-0.001017],[-3.469,1.3288,-0.001017],[-2.8479,0.27732,-0.001017],[-3.469,1.6793,-0.001017],[-3.469,0.27732,-0.001017],[-3.469,-1.4752,0.010569],[-3.7796,-1.4752,0.010569],[-5.0219,-1.1247,0.010569],[-6.5748,0.27732,-0.001017],[-7.196,1.6793,-0.001017],[-7.5065,2.3804,-0.001017],[-8.1277,3.4319,-0.001017],[-7.5065,3.7824,-0.012604],[-8.1277,4.8339,-0.012604],[-6.8854,4.8339,-0.012604],[-5.6431,5.5349,-0.012604],[-3.7796,5.1844,-0.012604],[-2.5373,2.7309,-0.012604],[0.25794,0.62783,-0.012604],[0.56851,-0.073181,-0.001017],[2.1214,-5.6813,-0.012604],[5.2272,-6.7328,-0.024191],[6.4695,-7.0833,-0.012604],[5.5378,-9.5368,-0.024191],[6.7801,-13.392,-0.035777],[8.0224,-15.846,-0.035777],[8.0224,-10.939,-0.024191],[8.333,-17.949,-0.024191],[7.4013,-16.196,-0.024191],[7.0907,-16.897,-0.035777],[6.7801,-15.145,-0.024191],[6.1589,-14.444,-0.001017],[4.606,-9.5368,-0.001017],[3.6743,-5.6813,0.010569],[2.432,-2.1762,-0.001017],[2.7426,0.62783,-0.001017],[-5.0219,2.0299,-0.082124],[-3.7796,2.7309,0.010569],[-3.469,4.4834,-0.001017],[-2.8479,5.1844,0.010569],[-2.2267,6.5864,0.010569],[-2.5373,7.2874,0.010569],[-2.2267,7.2874,0.022156],[-2.2267,6.5864,0.022156],[-2.8479,4.8339,0.022156],[-2.5373,3.7824,0.010569],[-2.5373,1.6793,0.022156],[-2.8479,-0.073181,0.022156],[-3.469,-1.1247,0.022156],[-4.7113,-0.77419,0.010569],[-5.3325,0.62783,-0.001017],[-5.6431,1.3288,-0.001017],[-6.2642,2.3804,-0.001017],[-5.6431,2.7309,-0.001017],[-5.0219,3.0814,-0.001017],[-3.469,3.0814,-0.012604],[-1.6055,3.7824,-0.012604],[0.56851,2.7309,-0.001017],[2.1214,-2.5267,-0.001017],[3.6743,-6.0318,-0.012604],[5.2272,-5.3308,0.022156],[7.0907,-7.0833,-0.024191],[10.818,-8.1348,-0.035777],[12.06,-8.1348,-0.024191],[11.128,-9.8873,-0.035777],[12.06,-10.939,-0.058951],[12.681,-11.289,-0.047364],[12.371,-12.341,-0.035777],[11.439,-11.64,-0.047364],[10.507,-13.042,-0.035777],[9.5753,-12.341,-0.058951],[8.9541,-12.341,-0.035777],[8.0224,-9.8873,-0.012604],[6.4695,-7.0833,-0.001017],[5.2272,-3.5782,0.010569],[3.6743,0.27732,-0.001017],[4.2955,4.8339,-0.001017],[-2.8479,1.3288,-0.15164],[-2.2267,2.3804,-0.001017],[-1.6055,3.7824,-0.001017],[-1.295,4.4834,-0.001017],[-0.6738,5.5349,0.010569],[0.25794,6.5864,0.022156],[1.1897,6.2359,0.022156],[2.1214,5.1844,0.033743],[2.1214,3.7824,0.033743],[2.432,2.0299,0.022156],[2.7426,0.27732,0.022156],[2.7426,-0.77419,0.022156],[2.1214,-1.8257,0.033743],[1.5003,-1.8257,0.022156],[1.1897,-1.1247,0.010569],[1.1897,-0.42369,0.010569],[1.1897,0.62783,-0.001017],[1.5003,1.3288,-0.001017],[2.432,1.6793,-0.001017],[4.2955,1.6793,-0.012604],[6.1589,2.3804,-0.012604],[8.0224,1.6793,-0.001017],[8.333,-4.9803,0.010569],[10.196,-8.8358,-0.001017],[12.681,-6.3823,0.033743],[14.855,-5.6813,-0.035777],[17.34,-4.9803,-0.058951],[18.272,-4.9803,-0.035777],[16.097,-4.2793,-0.047364],[16.719,-5.3308,-0.082124],[17.34,-8.4853,-0.058951],[16.408,-9.1863,-0.047364],[14.545,-8.4853,-0.058951],[12.681,-9.1863,-0.058951],[11.128,-9.1863,-0.070537],[9.5753,-8.1348,-0.047364],[8.333,-6.7328,-0.012604],[6.7801,-4.2793,0.010569],[5.5378,-1.4752,0.022156],[4.606,2.3804,0.010569],[4.2955,7.6379,-0.012604],[-1.6055,2.3804,-0.19799],[-1.295,3.7824,-0.001017],[-1.295,4.8339,-0.001017],[-0.98438,5.5349,-0.001017],[-0.36322,6.5864,0.010569],[0.56851,6.5864,0.010569],[1.5003,5.5349,0.010569],[2.432,4.1329,0.033743],[3.6743,1.3288,0.022156],[5.2272,-0.77419,0.010569],[6.7801,-2.1762,0.022156],[8.0224,-4.2792,0.022156],[8.333,-6.0318,0.022156],[8.6436,-6.0318,0.022156],[8.6436,-4.9803,0.010569],[8.6436,-3.5782,0.010569],[8.9541,-1.8257,0.010569],[9.2647,-0.77419,0.010569],[10.507,0.27732,0.010569],[12.681,0.27732,-0.001017],[14.545,1.6793,-0.012604],[16.408,0.62783,0.010569],[16.408,-7.0833,0.010569],[18.582,-11.289,-0.001017],[21.377,-8.1348,0.033743],[23.862,-6.3823,-0.035777],[24.794,-4.9803,-0.070537],[25.104,-4.6298,-0.035777],[21.998,-3.2277,-0.058951],[20.756,-4.2792,-0.1053],[20.756,-7.7843,-0.070537],[19.824,-7.7843,-0.047364],[17.34,-6.3823,-0.058951],[15.166,-6.7328,-0.058951],[12.371,-7.0833,-0.070537],[9.5753,-4.9803,-0.047364],[8.333,-3.9287,-0.001017],[6.7801,-1.8257,0.010569],[6.1589,0.97834,0.022156],[5.2272,5.1844,0.010569],[5.2272,11.143,-0.024191],[-0.98438,3.0814,-0.19799],[-0.98438,4.1329,-0.001017],[-0.6738,4.8339,-0.001017],[0.25794,5.1844,-0.001017],[0.87909,5.1844,-0.001017],[2.1214,4.8339,-0.001017],[3.0531,3.4319,0.010569],[4.9166,2.0299,0.010569],[6.4695,-0.77419,0.010569],[8.0224,-2.8772,-0.001017],[8.9541,-4.6298,0.010569],[10.196,-5.6813,0.010569],[10.818,-7.0833,0.010569],[11.128,-6.7328,0.010569],[12.06,-5.6813,0.010569],[12.681,-4.2793,0.010569],[13.923,-2.1762,0.010569],[14.855,-0.77419,0.022156],[16.719,0.62783,0.010569],[19.203,0.97834,-0.001017],[22.309,3.4319,-0.012604],[26.036,2.7309,0.010569],[27.899,-6.3823,-0.001017],[31.316,-10.939,-0.012604],[33.8,-8.1348,0.022156],[35.975,-7.4338,-0.047364],[34.732,-4.6298,-0.070537],[33.179,-2.8772,-0.035777],[27.278,-1.8257,-0.058951],[24.173,-3.5782,-0.093711],[22.93,-8.1348,-0.058951],[21.067,-7.7843,-0.035777],[18.272,-5.6813,-0.035777],[15.166,-5.6813,-0.047364],[12.06,-5.6813,-0.058951],[8.6436,-3.5782,-0.035777],[7.0907,-1.8257,-0.001017],[6.1589,0.27732,0.010569],[5.2272,3.4319,0.022156],[5.2272,8.339,0.010569],[5.5378,15.7,-0.047364],[-0.36322,3.0814,-0.22116],[0.25794,3.7824,-0.001017],[0.56851,4.4834,-0.001017],[1.1897,4.4834,-0.001017],[2.432,4.8339,-0.001017],[3.6743,4.1329,-0.001017],[5.2272,2.3804,-0.001017],[7.4013,0.97834,-0.001017],[8.9541,-1.4752,-0.001017],[10.196,-4.2793,-0.012604],[10.818,-5.3308,-0.001017],[11.439,-6.3823,-0.001017],[12.06,-7.0833,0.010569],[12.06,-6.3823,0.010569],[12.681,-4.9803,-0.001017],[14.234,-2.8772,0.010569],[16.097,-1.8257,0.010569],[18.582,0.27732,0.010569],[21.377,2.0299,0.010569],[25.104,2.7309,-0.001017],[28.831,6.5864,-0.001017],[32.248,5.5349,-0.001017],[34.422,-4.6298,-0.001017],[36.285,-8.4853,-0.024191],[36.596,-6.3823,0.022156],[37.217,-6.7328,-0.035777],[36.285,-2.8772,-0.058951],[32.869,-1.1247,-0.024191],[26.347,-1.4752,-0.035777],[22.62,-3.5782,-0.070537],[21.067,-8.4853,-0.047364],[19.824,-8.1348,-0.024191],[17.029,-6.0318,-0.024191],[14.545,-5.6813,-0.024191],[11.439,-4.9803,-0.035777],[8.6436,-2.5267,-0.024191],[7.0907,-1.1247,-0.001017],[6.4695,1.6793,0.010569],[6.1589,6.2359,0.010569],[6.4695,11.143,0.010569],[6.7801,19.205,-0.082124],[0.25794,2.0299,-0.24434],[0.56851,3.0814,-0.001017],[0.87909,3.7824,-0.001017],[1.5003,4.1329,-0.012604],[2.7426,4.1329,-0.001017],[3.6743,3.4319,-0.012604],[5.2272,2.0299,-0.012604],[7.0907,0.97834,-0.001017],[8.6436,-1.1247,-0.012604],[9.2647,-3.2277,-0.012604],[10.196,-3.9287,-0.012604],[10.507,-4.6298,-0.001017],[10.818,-5.3308,-0.001017],[10.818,-4.2793,-0.001017],[12.06,-2.1762,-0.001017],[13.302,-1.1247,0.010569],[15.476,-0.073181,0.010569],[18.582,2.0299,0.010569],[22.309,3.0814,0.010569],[26.036,4.1329,-0.001017],[29.763,10.442,-0.001017],[32.869,10.091,-0.001017],[35.043,-1.8257,-0.012604],[35.664,-4.9803,-0.024191],[32.869,-3.2277,0.010569],[32.869,-6.0318,-0.035777],[33.8,-1.1247,-0.035777],[30.384,2.3804,-0.001017],[23.241,-0.77419,-0.012604],[20.446,-3.5782,-0.047364],[18.893,-8.1348,-0.024191],[17.961,-7.7843,-0.012604],[15.476,-6.0318,-0.012604],[13.302,-5.6813,-0.012604],[10.507,-4.6298,-0.012604],[8.333,-2.1762,-0.012604],[7.0907,-0.42369,-0.001017],[6.7801,2.7309,0.010569],[6.4695,7.2874,0.010569],[6.7801,12.195,-0.001017],[7.0907,20.256,-0.12847],[0.56851,0.62783,-0.26751],[0.56851,1.6793,-0.001017],[0.56851,2.3804,-0.012604],[0.56851,3.0814,-0.012604],[1.1897,3.4319,-0.012604],[2.1214,3.0814,-0.012604],[2.7426,2.3804,-0.012604],[3.6743,1.3288,-0.012604],[4.9166,0.27732,-0.012604],[5.5378,-0.42369,-0.024191],[6.1589,-0.77419,-0.012604],[6.7801,-0.77419,-0.012604],[7.4013,-1.4752,-0.001017],[8.0224,-0.77419,-0.001017],[8.9541,0.97834,-0.001017],[10.818,1.6793,-0.001017],[12.681,2.3804,-0.001017],[15.166,3.0814,-0.001017],[17.961,3.7824,-0.001017],[20.446,5.1844,-0.012604],[23.862,14.298,-0.001017],[28.21,14.298,-0.001017],[30.695,1.3288,-0.012604],[31.005,-0.42369,-0.024191],[26.347,0.27732,0.010569],[26.347,-5.6813,-0.024191],[29.763,0.97834,-0.012604],[27.278,7.6379,0.022156],[21.377,-0.42369,-0.001017],[18.893,-3.5782,-0.035777],[17.34,-6.0318,-0.012604],[16.097,-6.0318,-0.001017],[14.234,-4.6298,-0.001017],[12.06,-4.2793,-0.001017],[9.5753,-3.5782,-0.001017],[7.4013,-1.8257,-0.001017],[6.7801,0.27732,-0.001017],[6.1589,3.0814,-0.001017],[5.5378,6.9369,-0.001017],[5.5378,11.143,-0.001017],[6.4695,17.803,-0.17482],[2.1214,-0.42369,-0.2791],[2.1214,0.27732,-0.001017],[1.5003,0.97834,-0.012604],[1.5003,1.6793,-0.012604],[1.5003,2.0299,-0.012604],[2.1214,2.0299,-0.012604],[2.432,1.6793,-0.012604],[2.432,0.97834,-0.012604],[2.7426,0.62783,-0.012604],[3.0531,0.62783,-0.024191],[3.3637,0.62783,-0.012604],[4.2955,0.62783,-0.012604],[4.9166,0.97834,-0.001017],[5.5378,1.3288,-0.001017],[6.7801,2.0299,-0.012604],[8.333,2.3804,-0.001017],[9.5753,2.3804,-0.001017],[12.06,2.3804,-0.001017],[14.234,2.7309,-0.001017],[16.097,3.7824,-0.012604],[18.272,9.3905,-0.001017],[21.998,10.793,-0.001017],[24.794,2.0299,-0.024191],[25.104,0.97834,-0.024191],[21.998,1.3288,-0.001017],[21.377,-4.2793,-0.024191],[23.241,0.97834,-0.001017],[23.862,7.6379,0.033743],[20.135,-0.77419,0.010569],[17.961,-2.5267,-0.024191],[15.476,-2.8772,-0.012604],[14.545,-2.1762,0.010569],[12.681,-1.1247,-0.001017],[11.128,-0.77419,0.010569],[9.5753,-0.073181,0.010569],[8.333,0.97834,-0.001017],[7.4013,2.0299,-0.001017],[6.7801,3.4319,-0.001017],[6.4695,5.1844,-0.001017],[6.1589,7.6379,-0.001017],[6.1589,10.442,-0.22116],[2.432,-1.1247,-0.29068],[2.432,-0.073181,-0.001017],[2.1214,0.62783,-0.001017],[2.1214,0.97834,-0.012604],[2.432,1.6793,-0.012604],[2.432,1.6793,-0.012604],[2.432,1.3288,-0.012604],[2.1214,0.97834,-0.012604],[2.1214,0.62783,-0.012604],[2.432,0.97834,-0.024191],[2.432,0.97834,-0.012604],[2.7426,1.3288,-0.012604],[3.3637,2.0299,-0.001017],[4.2955,2.3804,-0.001017],[5.2272,2.7309,-0.012604],[6.4695,2.7309,-0.001017],[7.4013,2.3804,-0.001017],[8.9541,2.0299,-0.001017],[10.507,2.0299,-0.012604],[12.06,2.3804,-0.012604],[12.992,3.4319,-0.001017],[15.476,3.4319,-0.001017],[17.961,0.62783,-0.012604],[18.272,-0.073181,-0.012604],[17.029,-0.42369,-0.001017],[16.719,-1.8257,-0.012604],[16.719,-0.42369,-0.001017],[17.029,1.3288,0.033743],[14.855,0.27732,0.010569],[12.992,-0.42369,-0.024191],[12.681,-1.8257,-0.001017],[12.06,-1.4752,0.010569],[10.818,0.27732,0.010569],[9.5753,0.97834,0.010569],[8.9541,1.3288,0.010569],[8.333,2.3804,-0.001017],[7.4013,2.7309,-0.001017],[6.7801,3.4319,-0.001017],[6.4695,4.4834,-0.001017],[5.5378,5.5349,-0.001017],[5.2272,6.9369,-0.25592],[2.7426,-0.77419,-0.29068],[2.7426,-0.073181,-0.001017],[2.432,0.62783,-0.001017],[2.432,1.3288,-0.001017],[2.432,1.6793,-0.001017],[2.432,1.6793,-0.012604],[2.432,1.3288,-0.012604],[2.1214,1.3288,-0.012604],[2.1214,1.3288,-0.012604],[2.1214,1.6793,-0.012604],[2.432,2.0299,-0.012604],[2.7426,2.3804,-0.012604],[3.0531,2.7309,-0.001017],[3.6743,3.0814,-0.001017],[4.606,3.0814,-0.012604],[5.2272,3.0814,-0.001017],[6.1589,2.7309,-0.001017],[6.7801,2.0299,-0.001017],[8.0224,2.0299,-0.012604],[8.6436,1.6793,-0.012604],[9.2647,-0.42369,-0.012604],[10.507,-1.1247,-0.001017],[12.371,-0.073181,-0.012604],[12.992,-0.073181,-0.012604],[13.302,-1.4752,-0.001017],[13.302,-0.073181,-0.012604],[12.371,-1.4752,-0.001017],[12.06,-2.5267,0.033743],[10.507,0.97834,0.022156],[9.2647,1.6793,-0.012604],[10.196,-1.8257,-0.001017],[10.196,-1.1247,0.010569],[9.2647,0.27732,0.010569],[8.9541,0.97834,0.010569],[8.333,1.6793,0.010569],[8.0224,2.0299,-0.001017],[7.0907,2.3804,-0.001017],[6.7801,2.7309,-0.001017],[6.4695,3.4319,-0.001017],[5.5378,4.1329,-0.001017],[4.9166,4.4834,-0.2791],[3.0531,-0.073181,-0.29068],[3.0531,0.62783,-0.001017],[2.7426,0.97834,-0.001017],[2.432,1.3288,-0.001017],[2.432,1.6793,-0.001017],[2.432,1.6793,-0.001017],[2.432,1.6793,-0.012604],[2.1214,1.3288,-0.012604],[2.1214,2.0299,-0.012604],[2.432,2.7309,-0.012604],[2.432,3.4319,-0.012604],[3.0531,3.7824,-0.012604],[3.3637,3.7824,-0.001017],[3.6743,3.7824,-0.012604],[4.606,3.7824,-0.012604],[4.9166,3.4319,-0.001017],[5.5378,3.0814,-0.001017],[6.1589,2.7309,-0.001017],[6.4695,2.7309,-0.012604],[6.4695,2.3804,-0.012604],[6.7801,-1.8257,-0.012604],[7.0907,-2.5267,-0.012604],[8.9541,1.3288,-0.012604],[9.5753,1.6793,-0.012604],[11.128,-0.42369,-0.001017],[11.128,1.6793,-0.012604],[9.2647,-1.1247,-0.012604],[8.6436,-4.6298,0.033743],[7.4013,2.0299,0.022156],[7.0907,2.3804,-0.012604],[8.333,-1.8257,-0.001017],[8.6436,-1.8257,0.010569],[8.333,-0.073181,0.010569],[8.0224,0.27732,0.010569],[8.0224,0.62783,0.010569],[7.4013,0.97834,-0.001017],[7.0907,1.3288,-0.001017],[6.7801,1.6793,-0.001017],[6.1589,2.0299,-0.001017],[5.5378,2.7309,-0.001017],[4.9166,2.7309,-0.31386],[3.3637,0.27732,-0.29068],[3.0531,0.97834,-0.001017],[2.7426,1.3288,-0.001017],[2.7426,1.3288,-0.001017],[2.432,1.6793,-0.001017],[2.432,1.6793,-0.001017],[2.432,1.6793,-0.001017],[2.1214,1.3288,-0.001017],[2.432,2.3804,-0.012604],[2.7426,3.4319,-0.012604],[3.0531,4.1329,-0.012604],[3.6743,4.4834,-0.012604],[4.2955,4.1329,-0.001017],[4.606,3.7824,-0.012604],[4.9166,3.7824,-0.012604],[5.5378,3.4319,-0.001017],[6.1589,3.0814,-0.001017],[6.1589,2.7309,-0.001017],[6.4695,3.0814,-0.012604],[6.4695,2.7309,-0.012604],[6.4695,-1.4752,-0.012604],[6.7801,-2.1762,-0.012604],[8.0224,2.0299,-0.012604],[8.333,2.0299,-0.012604],[9.5753,-0.073181,-0.001017],[9.2647,2.3804,-0.012604],[8.0224,-0.77419,-0.012604],[7.0907,-4.2793,0.033743],[6.4695,1.6793,0.022156],[6.1589,1.6793,-0.012604],[7.4013,-1.8257,-0.001017],[8.0224,-1.8257,0.010569],[8.0224,-0.77419,0.010569],[7.4013,-0.42369,0.010569],[7.4013,-0.42369,0.010569],[7.0907,-0.073181,-0.001017],[6.7801,-0.073181,-0.001017],[6.1589,0.27732,-0.001017],[5.2272,0.97834,-0.001017],[4.606,1.3288,-0.001017],[3.6743,1.3288,-0.32544],[3.3637,0.97834,-0.29068],[3.3637,1.3288,-0.001017],[3.0531,1.3288,-0.001017],[2.7426,1.6793,-0.001017],[2.7426,1.6793,-0.001017],[2.7426,1.6793,-0.001017],[2.432,1.3288,-0.001017],[2.1214,1.3288,-0.001017],[2.432,2.3804,-0.012604],[3.0531,4.1329,-0.012604],[3.6743,4.4834,-0.012604],[4.606,4.4834,-0.012604],[5.2272,3.7824,-0.001017],[5.5378,3.4319,-0.012604],[6.1589,3.0814,-0.012604],[6.4695,3.0814,-0.012604],[6.7801,2.7309,-0.001017],[6.7801,2.7309,-0.001017],[7.0907,3.0814,-0.012604],[7.0907,3.0814,-0.012604],[7.0907,-0.77419,-0.012604],[6.7801,-1.4752,-0.012604],[7.0907,2.0299,-0.012604],[7.4013,1.6793,-0.012604],[8.6436,0.27732,-0.001017],[8.333,2.3804,-0.012604],[6.7801,-0.42369,-0.012604],[6.1589,-3.5782,0.022156],[5.5378,0.62783,0.022156],[5.5378,0.97834,-0.012604],[6.7801,-1.8257,-0.001017],[7.0907,-1.8257,0.010569],[7.0907,-1.1247,-0.001017],[7.0907,-1.1247,-0.001017],[7.0907,-1.1247,0.010569],[6.7801,-1.1247,-0.001017],[6.4695,-1.1247,-0.001017],[5.2272,-0.77419,-0.001017],[4.2955,-0.42369,-0.001017],[3.3637,0.27732,-0.001017],[2.432,0.62783,-0.34862],[-2.5373,-1.4752,-0.001017],[-2.8479,-0.77419,-0.001017],[-4.4008,1.6793,-0.001017],[-4.4008,0.62783,-0.001017],[-3.7796,0.27732,-0.001017],[-2.8479,-0.42369,-0.001017],[-1.6055,-1.1247,-0.001017],[-0.6738,-1.4752,-0.001017],[-2.2267,-0.42369,-0.001017],[-3.1584,-0.42369,-0.001017],[-4.7113,0.62783,-0.001017],[-3.469,-1.4752,-0.001017],[-3.469,-1.8257,-0.001017],[-3.1584,-2.5267,-0.001017],[-3.1584,-2.1762,-0.001017],[-3.469,-1.4752,-0.001017],[-3.7796,-0.073182,-0.001017],[-3.7796,0.97833,-0.001017],[-3.1584,0.62783,-0.001017],[-2.5373,0.27732,-0.001017],[-1.295,-0.77419,-0.001017],[0.56851,-2.1762,-0.001017],[2.1214,-3.5782,-0.001017],[2.432,-4.2793,-0.001017],[3.0531,-2.5267,-0.001017],[2.7426,0.27732,-0.001017],[1.1897,2.7309,-0.001017],[1.5003,4.4834,-0.001017],[0.56851,3.4319,-0.001017],[1.5003,3.7824,-0.001017],[2.1214,2.3804,-0.001017],[2.7426,1.6793,-0.001017],[3.0531,-0.073182,-0.001017],[3.6743,-1.8257,-0.001017],[5.2272,-7.7843,-0.001017],[3.0531,-7.4338,-0.001017],[2.1214,-7.7843,-0.001017],[2.432,-8.4853,-0.001017],[1.1897,-8.1348,-0.001017],[0.25794,-5.6813,-0.001017],[0.87909,-3.2277,-0.001017],[-2.8479,-1.4752,-0.001017],[-2.8479,-0.77419,-0.001017],[-4.4008,1.6793,-0.001017],[-5.0219,0.62783,-0.001017],[-5.0219,2.0299,-0.001017],[-3.469,0.62783,-0.001017],[-3.1584,-0.073181,0.010569],[-2.8479,0.97834,0.010569],[-2.5373,-0.77419,0.010569],[-2.2267,-1.8257,0.010569],[-2.8479,-1.8257,0.010569],[-3.1584,-1.8257,0.010569],[-4.4008,-1.1247,-0.001017],[-5.6431,0.62783,-0.001017],[-6.2642,1.6793,-0.012604],[-6.2642,2.3804,-0.024191],[-5.6431,3.0814,-0.024191],[-5.6431,3.7824,-0.035777],[-5.3325,4.4834,-0.024191],[-5.0219,4.4834,-0.035777],[-3.7796,4.1329,-0.035777],[-1.6055,3.7824,-0.024191],[-0.36322,1.3288,0.010569],[-0.6738,-1.1247,-0.001017],[1.1897,-6.7328,0.010569],[3.6743,-8.1348,0.010569],[4.2955,-8.4853,-0.001017],[6.1589,-6.7328,0.022156],[4.606,-8.1348,0.022156],[4.9166,-9.5368,-0.047364],[5.2272,-12.341,-0.024191],[5.5378,-15.145,-0.012604],[4.9166,-9.8873,-0.001017],[5.5378,-18.65,0.033743],[4.606,-11.64,0.033743],[4.2955,-17.598,0.045329],[3.3637,-12.691,0.045329],[2.432,-8.4853,0.056916],[2.1214,-5.6813,0.080089],[1.1897,-2.1762,0.045329],[1.1897,0.27732,0.056916],[-4.7113,0.97834,-0.070537],[-3.7796,2.3804,0.022156],[-3.469,3.7824,-0.001017],[-3.1584,4.4834,-0.001017],[-2.5373,5.5349,-0.024191],[-1.6055,6.2359,-0.012604],[-2.2267,6.5864,0.010569],[-1.295,5.1844,-0.001017],[-1.6055,3.7824,0.010569],[-1.6055,2.0299,0.022156],[-2.2267,0.62783,0.022156],[-2.5373,-0.42369,0.033743],[-3.1584,-0.77419,0.022156],[-3.7796,-0.073181,-0.012604],[-4.7113,0.97834,-0.035777],[-4.7113,1.6793,-0.047364],[-4.7113,2.0299,-0.047364],[-3.7796,2.0299,-0.058951],[-3.1584,1.6793,-0.047364],[-2.5373,0.97834,-0.058951],[-0.6738,-0.073181,-0.058951],[2.432,-0.42369,-0.035777],[3.6743,-3.5782,0.022156],[2.7426,-9.5368,0.022156],[3.0531,-11.289,0.080089],[6.7801,-11.289,0.056916],[8.0224,-11.289,0.045329],[9.5753,-7.4338,0.080089],[8.6436,-8.4853,0.091676],[9.5753,-11.64,-0.024191],[10.196,-13.042,0.022156],[9.5753,-10.238,0.080089],[8.9541,-9.8873,0.022156],[8.6436,-9.5368,0.12644],[8.0224,-9.5368,0.080089],[6.7801,-8.4853,0.12644],[5.5378,-8.4853,0.11485],[4.606,-5.6813,0.11485],[4.2955,-2.1762,0.12644],[3.0531,0.97834,0.091676],[3.0531,4.8339,0.11485],[-2.8479,1.3288,-0.15164],[-2.2267,2.3804,0.010569],[-1.295,3.7824,-0.024191],[-0.98438,4.4834,-0.035777],[0.25794,5.5349,-0.058951],[0.87909,5.5349,-0.047364],[2.1214,6.2359,-0.024191],[2.432,4.8339,-0.035777],[2.7426,3.0814,-0.012604],[2.7426,1.6793,0.010569],[2.7426,0.62783,0.022156],[2.432,-0.77419,0.033743],[2.1214,-1.4752,0.033743],[1.5003,-1.8257,-0.012604],[1.5003,-1.1247,-0.035777],[1.5003,-0.77419,-0.058951],[1.5003,-0.42369,-0.058951],[1.5003,-0.073181,-0.058951],[2.432,-0.77419,-0.047364],[3.3637,-1.1247,-0.047364],[5.2272,-1.8257,-0.047364],[7.4013,-0.42369,-0.047364],[8.0224,-2.1762,0.045329],[6.4695,-13.042,0.14961],[6.7801,-15.846,0.19596],[11.439,-9.8873,0.10326],[14.234,-7.4338,0.091676],[15.476,-2.1762,0.12644],[14.545,-1.8257,0.13802],[15.166,-6.3823,0.010569],[15.166,-7.4338,0.056916],[14.545,-7.0833,0.091676],[13.923,-6.7328,0.056916],[12.06,-6.3823,0.14961],[10.507,-6.7328,0.12644],[8.6436,-6.0318,0.1612],[7.4013,-5.3308,0.1612],[6.1589,-2.5267,0.14961],[5.2272,-0.073181,0.1612],[4.2955,3.4319,0.11485],[3.6743,7.6379,0.12644],[-1.6055,2.3804,-0.20958],[-1.295,3.4319,-0.012604],[-0.98438,4.4834,-0.047364],[-0.36322,4.8339,-0.070537],[0.56851,5.1844,-0.1053],[1.1897,5.1844,-0.093711],[2.7426,4.4834,-0.070537],[4.2955,3.0814,-0.070537],[5.2272,0.62783,-0.024191],[6.4695,-1.4752,-0.001017],[7.4013,-2.1762,0.010569],[8.333,-4.2792,0.045329],[8.6436,-5.3308,0.045329],[8.6436,-5.3308,-0.001017],[8.9541,-4.9803,-0.012604],[8.9541,-3.9287,-0.047364],[8.6436,-2.5267,-0.047364],[8.6436,-1.8257,-0.047364],[9.2647,-1.8257,-0.024191],[10.818,-2.1762,-0.024191],[12.681,-2.1762,-0.035777],[14.855,0.27732,-0.058951],[14.234,-1.8257,0.045329],[12.371,-14.794,0.28865],[13.923,-16.547,0.335],[18.582,-8.1348,0.13802],[21.067,-6.0318,0.11485],[22.309,-1.1247,0.13802],[21.998,-0.42369,0.14961],[21.377,-5.6813,0.022156],[20.446,-7.4338,0.080089],[19.203,-6.3823,0.11485],[17.961,-4.9803,0.091676],[15.476,-4.6298,0.18437],[13.302,-4.6298,0.1612],[11.128,-4.2792,0.19596],[9.2647,-2.5267,0.20754],[7.4013,-0.42369,0.18437],[6.1589,2.7309,0.18437],[5.2272,6.2359,0.12644],[4.9166,10.793,0.10326],[-0.98438,3.0814,-0.22116],[-0.98438,4.1329,-0.024191],[-0.36322,4.4834,-0.070537],[0.56851,4.1329,-0.082124],[1.5003,4.1329,-0.11688],[2.7426,3.4319,-0.1053],[3.6743,2.3804,-0.093711],[5.2272,0.97834,-0.082124],[6.7801,-1.1247,-0.035777],[8.0224,-2.5267,0.010569],[8.6436,-4.2793,0.022156],[9.5753,-4.9803,0.080089],[10.507,-6.0318,0.080089],[10.818,-6.7328,0.033743],[12.06,-6.3823,0.022156],[12.371,-5.3308,-0.001017],[12.992,-4.6298,-0.001017],[13.923,-3.5782,-0.012604],[14.855,-2.5267,0.010569],[16.719,-2.8772,0.010569],[18.893,-2.8772,0.010569],[22.309,-0.42369,-0.058951],[21.998,-2.1762,0.045329],[21.377,-13.392,0.39293],[27.278,-13.743,0.43928],[31.937,-7.7843,0.14961],[31.937,-5.6813,0.13802],[32.248,1.3288,0.12644],[30.074,2.0299,0.14961],[27.278,-6.0318,0.080089],[24.483,-8.1348,0.12644],[22.62,-7.0833,0.14961],[20.446,-4.6298,0.12644],[17.34,-3.9287,0.21913],[14.234,-3.5782,0.19596],[12.06,-2.8772,0.2423],[9.2647,-1.1247,0.2423],[7.0907,1.6793,0.18437],[5.5378,5.5349,0.17278],[4.9166,9.3905,0.091676],[4.9166,14.999,0.056916],[-0.36322,2.7309,-0.26751],[0.56851,3.7824,-0.047364],[1.1897,4.1329,-0.093711],[2.432,3.7824,-0.1053],[3.3637,3.4319,-0.14006],[4.9166,2.3804,-0.11688],[6.4695,0.97834,-0.1053],[8.333,-0.42369,-0.082124],[9.5753,-2.1762,-0.024191],[10.507,-3.9287,0.022156],[11.128,-4.9803,0.056916],[11.439,-5.6813,0.10326],[12.371,-6.3823,0.11485],[12.371,-6.7328,0.091676],[12.992,-5.6813,0.080089],[13.923,-4.9803,0.045329],[14.855,-3.9287,0.033743],[16.719,-2.1762,0.022156],[19.203,-1.4752,0.033743],[22.309,-1.8257,0.045329],[25.104,-1.8257,0.045329],[29.763,0.27732,-0.058951],[30.695,-1.8257,0.033743],[30.384,-8.4853,0.47404],[32.248,-7.7843,0.5088],[33.8,-6.7328,0.17278],[32.869,-4.9803,0.17278],[32.869,4.1329,0.10326],[29.763,4.1329,0.14961],[26.347,-5.6813,0.14961],[23.241,-8.4853,0.19596],[21.998,-7.7843,0.20754],[19.824,-4.9803,0.17278],[16.719,-3.9287,0.26548],[13.923,-2.8772,0.23072],[12.06,-2.1762,0.27706],[9.5753,-0.073181,0.26548],[8.0224,3.4319,0.18437],[6.4695,7.9885,0.13802],[6.1589,12.195,0.045329],[6.1589,18.153,-0.035777],[0.25794,2.0299,-0.31386],[0.87909,3.0814,-0.070537],[1.5003,3.4319,-0.11688],[2.7426,3.0814,-0.12847],[3.6743,2.7309,-0.15164],[5.2272,1.6793,-0.14006],[6.7801,0.62783,-0.1053],[8.333,-0.77419,-0.082124],[9.2647,-1.8257,-0.012604],[10.196,-3.5782,0.045329],[10.818,-4.2793,0.091676],[11.128,-4.2793,0.13802],[11.128,-4.6298,0.1612],[11.128,-4.9803,0.13802],[11.439,-3.9287,0.11485],[12.681,-2.5267,0.080089],[14.234,-1.8257,0.056916],[16.719,-0.77419,0.033743],[19.203,0.27732,0.045329],[22.309,0.27732,0.056916],[26.036,0.62783,0.080089],[31.937,1.3288,-0.058951],[33.8,-0.073181,0.022156],[33.8,-0.42369,0.49721],[32.558,0.27732,0.54356],[31.937,-6.3823,0.23072],[30.384,-4.9803,0.23072],[30.695,7.2874,0.056916],[27.278,6.5864,0.11485],[23.862,-4.6298,0.21913],[21.067,-7.7843,0.26548],[19.824,-7.0833,0.26548],[17.961,-4.6298,0.21913],[15.166,-3.5782,0.31182],[12.992,-2.5267,0.26548],[11.128,-1.8257,0.31182],[9.2647,0.62783,0.27706],[7.4013,4.1329,0.18437],[6.7801,8.6895,0.10326],[6.4695,12.896,-0.012604],[6.4695,19.205,-0.15164],[0.25794,0.62783,-0.34862],[0.56851,1.6793,-0.093711],[0.87909,2.3804,-0.12847],[1.1897,2.0299,-0.15164],[2.1214,2.0299,-0.17482],[2.7426,1.6793,-0.14006],[3.3637,0.97834,-0.11688],[4.606,0.27732,-0.070537],[5.2272,-0.77419,0.010569],[6.1589,-1.4752,0.080089],[6.4695,-1.4752,0.11485],[6.7801,-1.4752,0.17278],[7.0907,-1.4752,0.19596],[7.4013,-1.1247,0.17278],[8.333,-0.42369,0.14961],[9.2647,-0.073181,0.10326],[10.818,0.27732,0.080089],[12.681,0.62783,0.033743],[14.545,1.6793,0.045329],[16.719,1.6793,0.056916],[19.824,2.3804,0.091676],[26.347,2.3804,-0.058951],[29.763,1.3288,-0.012604],[30.384,8.339,0.45086],[30.074,9.741,0.49721],[28.21,-6.7328,0.30024],[26.036,-5.6813,0.31182],[27.278,9.3905,-0.012604],[25.725,8.339,0.056916],[21.377,-2.1762,0.27706],[18.893,-5.3308,0.31182],[17.961,-5.3308,0.31182],[16.097,-2.8772,0.25389],[13.923,-2.1762,0.34658],[11.128,-1.8257,0.28865],[9.2647,-0.77419,0.34658],[8.0224,1.3288,0.28865],[6.4695,4.1329,0.1612],[5.5378,7.9885,0.056916],[5.5378,11.494,-0.082124],[5.5378,16.751,-0.26751],[2.1214,-0.77419,-0.3602],[2.1214,0.62783,-0.093711],[2.1214,0.97834,-0.14006],[2.432,0.97834,-0.15164],[2.432,1.3288,-0.17482],[2.7426,1.3288,-0.14006],[3.0531,0.97834,-0.11688],[3.3637,0.62783,-0.070537],[3.3637,-0.073181,0.022156],[3.6743,-0.42369,0.091676],[4.2955,-0.42369,0.13802],[4.606,-0.073181,0.19596],[5.2272,0.27732,0.21913],[5.5378,0.62783,0.19596],[6.4695,0.62783,0.1612],[7.4013,0.97834,0.11485],[8.6436,0.62783,0.080089],[10.196,0.27732,0.045329],[11.439,0.62783,0.045329],[12.992,0.97834,0.056916],[15.166,1.3288,0.10326],[19.203,0.27732,-0.047364],[21.998,-0.42369,-0.035777],[22.93,6.5864,0.335],[24.794,8.6895,0.38134],[23.241,-5.3308,0.39293],[20.135,-4.2793,0.40452],[21.377,5.1844,-0.070537],[21.377,6.2359,-0.012604],[18.272,0.27732,0.28865],[16.097,-1.8257,0.34658],[14.855,-1.4752,0.335],[13.302,0.62783,0.26548],[12.06,1.3288,0.35817],[10.507,1.6793,0.30024],[8.9541,2.0299,0.34658],[8.0224,3.0814,0.27706],[7.0907,4.8339,0.14961],[6.7801,6.5864,0.022156],[6.4695,8.6895,-0.14006],[6.1589,10.793,-0.37179],[2.432,-1.1247,-0.3602],[2.432,-0.073181,-0.082124],[2.432,0.62783,-0.12847],[2.432,0.62783,-0.15164],[2.7426,0.97834,-0.17482],[2.7426,0.97834,-0.14006],[3.0531,0.97834,-0.1053],[3.0531,0.97834,-0.058951],[2.7426,0.62783,0.033743],[3.0531,0.27732,0.10326],[3.0531,0.62783,0.14961],[3.3637,0.97834,0.20754],[3.6743,1.3288,0.23072],[4.2955,1.3288,0.20754],[4.9166,1.6793,0.1612],[5.5378,1.6793,0.12644],[6.4695,1.3288,0.091676],[7.4013,0.27732,0.056916],[8.6436,0.27732,0.056916],[9.5753,0.62783,0.080089],[10.818,-0.073181,0.12644],[12.681,-1.8257,-0.012604],[14.855,-2.5267,-0.024191],[16.097,1.3288,0.26548],[17.029,2.7309,0.30024],[15.476,-1.8257,0.46245],[14.234,-1.4752,0.47404],[14.545,2.3804,-0.093711],[14.234,3.0814,-0.070537],[13.302,-0.073181,0.28865],[12.371,-1.1247,0.34658],[12.06,-0.42369,0.32341],[10.818,1.6793,0.26548],[10.196,2.3804,0.34658],[9.2647,2.7309,0.28865],[8.333,3.0814,0.335],[8.0224,3.7824,0.25389],[7.0907,4.4834,0.11485],[6.4695,5.5349,-0.012604],[6.1589,6.9369,-0.17482],[5.5378,7.9885,-0.44131],[2.432,-1.1247,-0.34862],[2.432,0.27732,-0.070537],[2.7426,0.62783,-0.12847],[2.7426,0.62783,-0.14006],[2.7426,0.97834,-0.16323],[2.7426,0.97834,-0.14006],[2.7426,1.3288,-0.1053],[2.7426,1.3288,-0.058951],[2.432,0.97834,0.033743],[2.7426,0.97834,0.11485],[2.7426,1.3288,0.17278],[3.0531,2.0299,0.21913],[3.0531,2.3804,0.2423],[3.3637,2.3804,0.20754],[4.2955,2.3804,0.17278],[4.606,2.3804,0.12644],[5.2272,1.6793,0.091676],[6.1589,0.97834,0.056916],[6.7801,0.62783,0.080089],[7.4013,0.97834,0.091676],[8.0224,-0.073181,0.14961],[8.0224,-2.5267,0.010569],[9.5753,-3.5782,-0.001017],[10.818,-1.4752,0.2423],[11.439,-0.77419,0.27706],[10.196,0.97834,0.49721],[10.196,0.97834,0.49721],[9.2647,0.27732,-0.11688],[8.6436,0.97834,-0.093711],[9.5753,-0.77419,0.28865],[9.5753,-1.8257,0.34658],[9.5753,-0.77419,0.32341],[9.2647,1.3288,0.2423],[8.6436,2.0299,0.335],[8.333,2.3804,0.27706],[8.0224,2.7309,0.31182],[7.4013,3.0814,0.2423],[6.7801,3.7824,0.091676],[6.4695,4.4834,-0.047364],[6.1589,5.1844,-0.20958],[5.2272,6.2359,-0.51083],[2.7426,-0.073181,-0.34862],[2.7426,0.97834,-0.070537],[2.7426,1.3288,-0.11688],[2.7426,0.97834,-0.12847],[2.7426,1.3288,-0.15164],[2.7426,1.3288,-0.12847],[2.7426,1.3288,-0.093711],[2.432,1.3288,-0.047364],[2.1214,1.3288,0.045329],[2.432,1.6793,0.11485],[2.7426,2.3804,0.17278],[3.0531,3.0814,0.23072],[3.3637,3.4319,0.25389],[3.3637,3.0814,0.21913],[3.6743,3.0814,0.17278],[4.2955,2.7309,0.12644],[4.606,2.3804,0.10326],[5.2272,1.6793,0.080089],[5.5378,1.6793,0.080089],[6.1589,2.0299,0.091676],[6.4695,0.97834,0.1612],[5.2272,-1.8257,0.033743],[6.4695,-2.1762,0.033743],[8.0224,-1.8257,0.2423],[8.6436,-1.4752,0.28865],[7.0907,3.0814,0.5088],[8.0224,2.3804,0.48562],[6.7801,-0.073181,-0.14006],[6.1589,-0.073181,-0.1053],[8.0224,-1.4752,0.30024],[8.333,-2.1762,0.34658],[8.6436,-1.8257,0.32341],[8.333,0.27732,0.23072],[8.333,0.97834,0.31182],[8.0224,1.3288,0.25389],[8.0224,1.6793,0.30024],[7.4013,2.0299,0.21913],[6.7801,2.7309,0.080089],[6.4695,3.4319,-0.070537],[5.5378,4.1329,-0.23275],[5.2272,4.1329,-0.56876],[3.3637,0.62783,-0.34862],[3.3637,1.6793,-0.070537],[3.0531,2.0299,-0.11688],[3.0531,1.3288,-0.12847],[3.0531,1.3288,-0.15164],[3.0531,1.6793,-0.12847],[2.7426,1.6793,-0.093711],[2.432,1.6793,-0.047364],[2.1214,1.6793,0.045329],[2.7426,2.0299,0.12644],[3.0531,2.7309,0.18437],[3.3637,3.4319,0.23072],[4.2955,3.7824,0.25389],[4.2955,3.4319,0.21913],[4.2955,3.0814,0.17278],[4.606,2.7309,0.12644],[4.9166,2.7309,0.10326],[5.2272,2.3804,0.080089],[5.5378,2.3804,0.080089],[6.1589,2.7309,0.10326],[6.1589,1.6793,0.14961],[4.606,-0.77419,0.045329],[5.5378,-1.1247,0.056916],[6.7801,-1.1247,0.26548],[6.7801,-1.1247,0.30024],[5.5378,3.4319,0.5088],[6.7801,2.7309,0.46245],[5.5378,-0.77419,-0.16323],[5.2272,-0.77419,-0.1053],[7.0907,-1.4752,0.31182],[7.4013,-2.1762,0.34658],[8.0224,-1.8257,0.31182],[8.0224,-0.42369,0.23072],[8.0224,0.27732,0.31182],[8.0224,0.27732,0.2423],[7.4013,0.62783,0.28865],[7.0907,0.97834,0.20754],[6.4695,1.3288,0.056916],[5.5378,2.0299,-0.082124],[5.2272,2.7309,-0.25592],[4.606,2.7309,-0.59194],[4.2955,1.6793,-0.34862],[3.6743,2.0299,-0.070537],[3.6743,2.0299,-0.11688],[3.6743,1.6793,-0.11688],[3.3637,1.6793,-0.14006],[3.3637,1.6793,-0.11688],[3.0531,1.6793,-0.082124],[2.7426,2.0299,-0.047364],[2.432,2.0299,0.045329],[3.0531,2.3804,0.12644],[3.6743,3.0814,0.18437],[4.2955,3.7824,0.23072],[4.9166,3.7824,0.25389],[4.9166,3.0814,0.21913],[4.9166,3.0814,0.17278],[5.2272,2.7309,0.12644],[5.5378,2.3804,0.10326],[5.5378,2.7309,0.080089],[6.1589,3.0814,0.080089],[6.4695,3.0814,0.10326],[6.1589,2.3804,0.13802],[4.606,0.62783,0.045329],[5.2272,0.27732,0.080089],[5.5378,-0.77419,0.28865],[5.5378,-0.42369,0.32341],[4.9166,3.4319,0.49721],[6.1589,2.3804,0.43928],[5.2272,-1.1247,-0.17482],[5.2272,-1.1247,-0.1053],[6.7801,-1.4752,0.32341],[7.0907,-1.8257,0.34658],[7.4013,-1.8257,0.31182],[7.4013,-0.77419,0.21913],[7.4013,-0.42369,0.30024],[7.4013,-0.42369,0.23072],[7.0907,-0.42369,0.27706],[6.7801,-0.073181,0.19596],[6.1589,0.27732,0.045329],[4.9166,0.97834,-0.093711],[4.2955,1.3288,-0.25592],[3.3637,1.6793,-0.61511]]}; |
|
},{}],7:[function(require,module,exports){ |
|
|
|
var meshgridCoords = function(xs) { |
|
if (typeof xs === 'number') { |
|
return {start: xs, end: xs, step: 1}; |
|
|
|
} else if (xs instanceof Array) { |
|
var obj = {start: xs[0], end: xs[0], step: 1}; |
|
if (xs.length === 2) { |
|
obj.end = xs[1]; |
|
} |
|
if (xs.length === 3) { |
|
obj.step = xs[1] || 1; // Force non-zero step |
|
obj.end = xs[2]; |
|
} |
|
return obj; |
|
} |
|
|
|
var parsed = {start: xs.start, end: xs.end, step: xs.step}; |
|
if (!parsed.step) { // Force non-zero step |
|
parsed.step = 1; |
|
} |
|
if (parsed.end === undefined) { |
|
parsed.end = parsed.start; |
|
} |
|
return parsed; |
|
}; |
|
|
|
var meshgridExpand = function(xs) { |
|
var res = []; |
|
var step = xs.step; |
|
if (xs.start > xs.end && step > 0) { |
|
step = -step; // Use negative step when start is larger than end. |
|
} |
|
var count = (xs.end - xs.start) / step; |
|
|
|
res.push(xs.start); // Include start |
|
for (var i = 1; i < count; i++) { |
|
res.push(xs.start + i * step); // Interpolate values without accumulating error |
|
} |
|
if (xs.start !== xs.end) { |
|
res.push(xs.end); // Include end if it differs from start |
|
} |
|
|
|
return res; |
|
} |
|
|
|
var meshgrid = function(xs, ys, zs) { |
|
xs = meshgridCoords(xs); |
|
ys = meshgridCoords(ys); |
|
zs = meshgridCoords(zs); |
|
return [ |
|
meshgridExpand(xs), |
|
meshgridExpand(ys), |
|
meshgridExpand(zs) |
|
]; |
|
}; |
|
|
|
meshgrid.getBounds = function(mg) { |
|
return [ |
|
mg.map(function(m) { return m[0]; }), |
|
mg.map(function(m) { return m[m.length-1]; }) |
|
]; |
|
}; |
|
|
|
meshgrid.toPoints = function(mg) { |
|
var res = []; |
|
for (var z=0; z<mg[2].length; z++) { |
|
var mz = mg[2][z]; |
|
for (var y=0; y<mg[1].length; y++) { |
|
var my = mg[1][y]; |
|
for (var x=0; x<mg[0].length; x++) { |
|
var mx = mg[0][x]; |
|
res.push([mx, my, mz]); |
|
} |
|
} |
|
} |
|
return res; |
|
}; |
|
|
|
module.exports = meshgrid; |
|
},{}],8:[function(require,module,exports){ |
|
var createStreamTubes = require('../streamtube'); |
|
var wind = require('./dataset-wind'); |
|
var meshgrid = require('./meshgrid'); |
|
|
|
var createCamera = require('3d-view-controls') |
|
var perspective = require('gl-mat4/perspective') |
|
var createAxes = require('gl-axes3d') |
|
var createSpikes = require('gl-spikes3d') |
|
var createSelect = require('gl-select-static') |
|
var getBounds = require('bound-points') |
|
var mouseChange = require('mouse-change') |
|
var createMesh = createStreamTubes.createTubeMesh; |
|
var vec3 = require('gl-vec3'); |
|
|
|
var canvas = document.createElement('canvas') |
|
document.body.appendChild(canvas) |
|
window.addEventListener('resize', require('canvas-fit')(canvas)) |
|
var gl = canvas.getContext('webgl') |
|
|
|
var pvecs = []; |
|
for (var i=0; i<wind.positions.length; i++) { |
|
pvecs.push({position: wind.positions[i], vector: wind.vectors[i]}); |
|
} |
|
var cmpZYX = function(a, b) { |
|
if (a.position[2] !== b.position[2]) return a.position[2] - b.position[2]; |
|
if (a.position[1] !== b.position[1]) return a.position[1] - b.position[1]; |
|
return a.position[0] - b.position[0]; |
|
}; |
|
pvecs.sort(cmpZYX); |
|
|
|
var positions = pvecs.map(function(p) { return p.position; }); |
|
var vectors = pvecs.map(function(p) { return p.vector; }); |
|
|
|
var windBounds = getBounds(positions); |
|
|
|
|
|
var startingPositions = meshgrid.toPoints(meshgrid(80, [20, 10, 50], [0, 5, 15])); // {start: 20, step: 10, end: 50}, {start:0, step: 5, end: 15}); |
|
|
|
var mg = [[],[],[]] |
|
var mgi =[{},{},{}]; |
|
positions.forEach(function(p) { |
|
var x = p[0]; |
|
var y = p[1]; |
|
var z = p[2]; |
|
if (!mgi[0][x]) { mgi[0][x] = true; mg[0].push(x); } |
|
if (!mgi[1][y]) { mgi[1][y] = true; mg[1].push(y); } |
|
if (!mgi[2][z]) { mgi[2][z] = true; mg[2].push(z); } |
|
}) |
|
|
|
var bounds = meshgrid.getBounds(mg); |
|
|
|
var camera = createCamera(canvas, { |
|
eye: [0,0,50], |
|
center: [0.5*(bounds[0][0]+bounds[1][0]), |
|
0.5*(bounds[0][1]+bounds[1][1]), |
|
0.5*(bounds[0][2]+bounds[1][2])], |
|
zoomMax: 500 |
|
}) |
|
|
|
var streams = createStreamTubes({ |
|
startingPositions: startingPositions, |
|
maxLength: 3000, |
|
tubeSize: 1, |
|
//absoluteTubeSize: 0.1, |
|
meshgrid: mg, |
|
vectors: vectors, |
|
colormap: 'portland' |
|
}, bounds); |
|
|
|
var mesh = createMesh(gl, streams); |
|
var select = createSelect(gl, [canvas.width, canvas.height]) |
|
var tickSpacing = 5; |
|
var ticks = bounds[0].map(function(v,i) { |
|
var arr = []; |
|
var firstTick = Math.ceil(bounds[0][i] / tickSpacing) * tickSpacing; |
|
var lastTick = Math.floor(bounds[1][i] / tickSpacing) * tickSpacing; |
|
for (var tick = firstTick; tick <= lastTick; tick += tickSpacing) { |
|
if (tick === -0) tick = 0; |
|
arr.push({x: tick, text: tick.toString()}); |
|
} |
|
return arr; |
|
}); |
|
var axes = createAxes(gl, { bounds: bounds, ticks: ticks }) |
|
var spikes = createSpikes(gl, { |
|
bounds: bounds |
|
}) |
|
var spikeChanged = false |
|
|
|
mouseChange(canvas, function(buttons, x, y) { |
|
var pickData = select.query(x, canvas.height - y, 10) |
|
var pickResult = mesh.pick(pickData) |
|
if(pickResult) { |
|
spikes.update({ |
|
position: pickResult.position, |
|
enabled: [true, true, true] |
|
}) |
|
spikeChanged = true |
|
} else { |
|
spikeChanged = spikes.enabled[0] |
|
spikes.update({ |
|
enabled: [false, false, false] |
|
}) |
|
} |
|
}) |
|
|
|
function render() { |
|
requestAnimationFrame(render) |
|
|
|
gl.enable(gl.DEPTH_TEST) |
|
|
|
var needsUpdate = camera.tick() |
|
var cameraParams = { |
|
projection: perspective([], Math.PI/4, canvas.width/canvas.height, 0.01, 1000), |
|
view: camera.matrix |
|
} |
|
|
|
if(needsUpdate || spikeChanged) { |
|
gl.bindFramebuffer(gl.FRAMEBUFFER, null) |
|
gl.viewport(0, 0, canvas.width, canvas.height) |
|
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) |
|
axes.draw(cameraParams) |
|
spikes.draw(cameraParams) |
|
mesh.draw(cameraParams) |
|
spikeChanged = false |
|
} |
|
|
|
if(needsUpdate) { |
|
select.shape = [canvas.width, canvas.height] |
|
select.begin() |
|
mesh.drawPick(cameraParams) |
|
select.end() |
|
} |
|
} |
|
render() |
|
},{"../streamtube":267,"./dataset-wind":6,"./meshgrid":7,"3d-view-controls":12,"bound-points":38,"canvas-fit":46,"gl-axes3d":76,"gl-mat4/perspective":97,"gl-select-static":106,"gl-spikes3d":115,"gl-vec3":132,"mouse-change":200}],9:[function(require,module,exports){ |
|
'use strict' |
|
|
|
var barycentric = require('barycentric') |
|
var closestPointToTriangle = require('polytope-closest-point/lib/closest_point_2d.js') |
|
|
|
module.exports = closestPointToPickLocation |
|
|
|
function xformMatrix(m, v) { |
|
var out = [0,0,0,0] |
|
for(var i=0; i<4; ++i) { |
|
for(var j=0; j<4; ++j) { |
|
out[j] += m[4*i + j] * v[i] |
|
} |
|
} |
|
return out |
|
} |
|
|
|
function projectVertex(v, model, view, projection, resolution) { |
|
var p = xformMatrix(projection, |
|
xformMatrix(view, |
|
xformMatrix(model, [v[0], v[1], v[2], 1]))) |
|
for(var i=0; i<3; ++i) { |
|
p[i] /= p[3] |
|
} |
|
return [ 0.5 * resolution[0] * (1.0+p[0]), 0.5 * resolution[1] * (1.0-p[1]) ] |
|
} |
|
|
|
function barycentricCoord(simplex, point) { |
|
if(simplex.length === 2) { |
|
var d0 = 0.0 |
|
var d1 = 0.0 |
|
for(var i=0; i<2; ++i) { |
|
d0 += Math.pow(point[i] - simplex[0][i], 2) |
|
d1 += Math.pow(point[i] - simplex[1][i], 2) |
|
} |
|
d0 = Math.sqrt(d0) |
|
d1 = Math.sqrt(d1) |
|
if(d0+d1 < 1e-6) { |
|
return [1,0] |
|
} |
|
return [d1/(d0+d1),d0/(d1+d0)] |
|
} else if(simplex.length === 3) { |
|
var closestPoint = [0,0] |
|
closestPointToTriangle(simplex[0], simplex[1], simplex[2], point, closestPoint) |
|
return barycentric(simplex, closestPoint) |
|
} |
|
return [] |
|
} |
|
|
|
function interpolate(simplex, weights) { |
|
var result = [0,0,0] |
|
for(var i=0; i<simplex.length; ++i) { |
|
var p = simplex[i] |
|
var w = weights[i] |
|
for(var j=0; j<3; ++j) { |
|
result[j] += w * p[j] |
|
} |
|
} |
|
return result |
|
} |
|
|
|
function closestPointToPickLocation(simplex, pixelCoord, model, view, projection, resolution) { |
|
if(simplex.length === 1) { |
|
return [0, simplex[0].slice()] |
|
} |
|
var simplex2D = new Array(simplex.length) |
|
for(var i=0; i<simplex.length; ++i) { |
|
simplex2D[i] = projectVertex(simplex[i], model, view, projection, resolution); |
|
} |
|
|
|
var closestIndex = 0 |
|
var closestDist = Infinity |
|
for(var i=0; i<simplex2D.length; ++i) { |
|
var d2 = 0.0 |
|
for(var j=0; j<2; ++j) { |
|
d2 += Math.pow(simplex2D[i][j] - pixelCoord[j], 2) |
|
} |
|
if(d2 < closestDist) { |
|
closestDist = d2 |
|
closestIndex = i |
|
} |
|
} |
|
|
|
var weights = barycentricCoord(simplex2D, pixelCoord) |
|
var s = 0.0 |
|
for(var i=0; i<3; ++i) { |
|
if(weights[i] < -0.001 || |
|
weights[i] > 1.0001) { |
|
return null |
|
} |
|
s += weights[i] |
|
} |
|
if(Math.abs(s - 1.0) > 0.001) { |
|
return null |
|
} |
|
return [closestIndex, interpolate(simplex, weights), weights] |
|
} |
|
},{"barycentric":18,"polytope-closest-point/lib/closest_point_2d.js":221}],10:[function(require,module,exports){ |
|
|
|
|
|
var triVertSrc = "precision mediump float;\n#define GLSLIFY 1\n\nfloat inverse_1_0(float m) {\n return 1.0 / m;\n}\n\nmat2 inverse_1_0(mat2 m) {\n return mat2(m[1][1],-m[0][1],\n -m[1][0], m[0][0]) / (m[0][0]*m[1][1] - m[0][1]*m[1][0]);\n}\n\nmat3 inverse_1_0(mat3 m) {\n float a00 = m[0][0], a01 = m[0][1], a02 = m[0][2];\n float a10 = m[1][0], a11 = m[1][1], a12 = m[1][2];\n float a20 = m[2][0], a21 = m[2][1], a22 = m[2][2];\n\n float b01 = a22 * a11 - a12 * a21;\n float b11 = -a22 * a10 + a12 * a20;\n float b21 = a21 * a10 - a11 * a20;\n\n float det = a00 * b01 + a01 * b11 + a02 * b21;\n\n return mat3(b01, (-a22 * a01 + a02 * a21), (a12 * a01 - a02 * a11),\n b11, (a22 * a00 - a02 * a20), (-a12 * a00 + a02 * a10),\n b21, (-a21 * a00 + a01 * a20), (a11 * a00 - a01 * a10)) / det;\n}\n\nmat4 inverse_1_0(mat4 m) {\n float\n a00 = m[0][0], a01 = m[0][1], a02 = m[0][2], a03 = m[0][3],\n a10 = m[1][0], a11 = m[1][1], a12 = m[1][2], a13 = m[1][3],\n a20 = m[2][0], a21 = m[2][1], a22 = m[2][2], a23 = m[2][3],\n a30 = m[3][0], a31 = m[3][1], a32 = m[3][2], a33 = m[3][3],\n\n b00 = a00 * a11 - a01 * a10,\n b01 = a00 * a12 - a02 * a10,\n b02 = a00 * a13 - a03 * a10,\n b03 = a01 * a12 - a02 * a11,\n b04 = a01 * a13 - a03 * a11,\n b05 = a02 * a13 - a03 * a12,\n b06 = a20 * a31 - a21 * a30,\n b07 = a20 * a32 - a22 * a30,\n b08 = a20 * a33 - a23 * a30,\n b09 = a21 * a32 - a22 * a31,\n b10 = a21 * a33 - a23 * a31,\n b11 = a22 * a33 - a23 * a32,\n\n det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n return mat4(\n a11 * b11 - a12 * b10 + a13 * b09,\n a02 * b10 - a01 * b11 - a03 * b09,\n a31 * b05 - a32 * b04 + a33 * b03,\n a22 * b04 - a21 * b05 - a23 * b03,\n a12 * b08 - a10 * b11 - a13 * b07,\n a00 * b11 - a02 * b08 + a03 * b07,\n a32 * b02 - a30 * b05 - a33 * b01,\n a20 * b05 - a22 * b02 + a23 * b01,\n a10 * b10 - a11 * b08 + a13 * b06,\n a01 * b08 - a00 * b10 - a03 * b06,\n a30 * b04 - a31 * b02 + a33 * b00,\n a21 * b02 - a20 * b04 - a23 * b00,\n a11 * b07 - a10 * b09 - a12 * b06,\n a00 * b09 - a01 * b07 + a02 * b06,\n a31 * b01 - a30 * b03 - a32 * b00,\n a20 * b03 - a21 * b01 + a22 * b00) / det;\n}\n\n\n\nattribute vec3 vector;\nattribute vec4 color, position;\nattribute vec2 uv;\nuniform float tubeScale;\n\nuniform mat4 model\n , view\n , projection;\nuniform vec3 eyePosition\n , lightPosition;\n\nvarying vec3 f_normal\n , f_lightDirection\n , f_eyeDirection\n , f_data;\nvarying vec4 f_color;\nvarying vec2 f_uv;\n\n\nvec3 getOrthogonalVector(vec3 v) {\n // Return up-vector for only-z vector.\n // Return ax + by + cz = 0, a point that lies on the plane that has v as a normal and that isn't (0,0,0).\n // From the above if-statement we have ||a|| > 0 U ||b|| > 0.\n // Assign z = 0, x = -b, y = a:\n // a*-b + b*a + c*0 = -ba + ba + 0 = 0\n if (v.x*v.x > v.z*v.z || v.y*v.y > v.z*v.z) {\n return normalize(vec3(-v.y, v.x, 0.0)); \n } else {\n return normalize(vec3(0.0, v.z, -v.y));\n }\n}\n\n// Calculate the tube vertex and normal at the given index.\n//\n// The returned vertex is for a tube ring with its center at origin, radius of length(d), pointing in the direction of d.\n//\n// Each tube segment is made up of a ring of vertices.\n// These vertices are used to make up the triangles of the tube by connecting them together in the vertex array.\n// The indexes of tube segments run from 0 to 8.\n//\nvec3 getTubePosition(vec3 d, float index, out vec3 normal) {\n float segmentCount = 8.0;\n\n float angle = 2.0 * 3.14159 * (index / segmentCount);\n\n vec3 u = getOrthogonalVector(d);\n vec3 v = normalize(cross(u, d));\n\n vec3 x = u * cos(angle) * length(d);\n vec3 y = v * sin(angle) * length(d);\n vec3 v3 = x + y;\n\n normal = normalize(v3);\n\n return v3;\n}\n\nvoid main() {\n // Scale the vector magnitude to stay constant with\n // model & view changes.\n vec3 normal;\n vec4 tubePosition = model * vec4(position.xyz, 1.0) + vec4(getTubePosition(mat3(model) * (tubeScale * vector), position.w, normal), 0.0);\n normal = normalize(normal * inverse_1_0(mat3(model)));\n\n vec4 t_position = view * tubePosition;\n gl_Position = projection * t_position;\n f_color = color;\n f_normal = normal;\n f_data = tubePosition.xyz;\n f_eyeDirection = eyePosition - tubePosition.xyz;\n f_lightDirection = lightPosition - tubePosition.xyz;\n f_uv = uv;\n}" |
|
var triFragSrc = "precision mediump float;\n#define GLSLIFY 1\n\nfloat beckmannDistribution_2_0(float x, float roughness) {\n float NdotH = max(x, 0.0001);\n float cos2Alpha = NdotH * NdotH;\n float tan2Alpha = (cos2Alpha - 1.0) / cos2Alpha;\n float roughness2 = roughness * roughness;\n float denom = 3.141592653589793 * roughness2 * cos2Alpha * cos2Alpha;\n return exp(tan2Alpha / roughness2) / denom;\n}\n\n\n\nfloat cookTorranceSpecular_1_1(\n vec3 lightDirection,\n vec3 viewDirection,\n vec3 surfaceNormal,\n float roughness,\n float fresnel) {\n\n float VdotN = max(dot(viewDirection, surfaceNormal), 0.0);\n float LdotN = max(dot(lightDirection, surfaceNormal), 0.0);\n\n //Half angle vector\n vec3 H = normalize(lightDirection + viewDirection);\n\n //Geometric term\n float NdotH = max(dot(surfaceNormal, H), 0.0);\n float VdotH = max(dot(viewDirection, H), 0.000001);\n float LdotH = max(dot(lightDirection, H), 0.000001);\n float G1 = (2.0 * NdotH * VdotN) / VdotH;\n float G2 = (2.0 * NdotH * LdotN) / LdotH;\n float G = min(1.0, min(G1, G2));\n \n //Distribution term\n float D = beckmannDistribution_2_0(NdotH, roughness);\n\n //Fresnel term\n float F = pow(1.0 - VdotN, fresnel);\n\n //Multiply terms and done\n return G * F * D / max(3.14159265 * VdotN, 0.000001);\n}\n\n\n\nuniform vec3 clipBounds[2];\nuniform float roughness\n , fresnel\n , kambient\n , kdiffuse\n , kspecular\n , opacity;\nuniform sampler2D texture;\n\nvarying vec3 f_normal\n , f_lightDirection\n , f_eyeDirection\n , f_data;\nvarying vec4 f_color;\nvarying vec2 f_uv;\n\nvoid main() {\n vec3 N = normalize(f_normal);\n vec3 L = normalize(f_lightDirection);\n vec3 V = normalize(f_eyeDirection);\n \n if(!gl_FrontFacing) {\n N = -N;\n }\n\n float specular = cookTorranceSpecular_1_1(L, V, N, roughness, fresnel);\n float diffuse = min(kambient + kdiffuse * max(dot(N, L), 0.0), 1.0);\n\n vec4 surfaceColor = texture2D(texture, f_uv);\n vec4 litColor = surfaceColor.a * vec4(diffuse * surfaceColor.rgb + kspecular * vec3(1,1,1) * specular, 1.0);\n\n gl_FragColor = litColor * opacity;\n}" |
|
var pickVertSrc = "precision mediump float;\n#define GLSLIFY 1\n\nattribute vec3 position;\nattribute vec4 id;\n\nuniform mat4 model, view, projection;\n\nvarying vec3 f_position;\nvarying vec4 f_id;\n\nvoid main() {\n gl_Position = projection * view * model * vec4(position, 1.0);\n f_id = id;\n f_position = position;\n}" |
|
var pickFragSrc = "precision mediump float;\n#define GLSLIFY 1\n\nuniform vec3 clipBounds[2];\nuniform float pickId;\n\nvarying vec3 f_position;\nvarying vec4 f_id;\n\nvoid main() {\n gl_FragColor = vec4(pickId, f_id.xyz);\n}" |
|
|
|
exports.meshShader = { |
|
vertex: triVertSrc, |
|
fragment: triFragSrc, |
|
attributes: [ |
|
{name: 'position', type: 'vec4'}, |
|
{name: 'normal', type: 'vec3'}, |
|
{name: 'color', type: 'vec4'}, |
|
{name: 'uv', type: 'vec2'}, |
|
{name: 'vector', type: 'vec3'} |
|
] |
|
} |
|
exports.pickShader = { |
|
vertex: pickVertSrc, |
|
fragment: pickFragSrc, |
|
attributes: [ |
|
{name: 'position', type: 'vec3'}, |
|
{name: 'id', type: 'vec4'} |
|
] |
|
} |
|
|
|
},{}],11:[function(require,module,exports){ |
|
'use strict' |
|
|
|
var DEFAULT_VERTEX_NORMALS_EPSILON = 1e-6; // may be too large if triangles are very small |
|
var DEFAULT_FACE_NORMALS_EPSILON = 1e-6; |
|
|
|
var createShader = require('gl-shader') |
|
var createBuffer = require('gl-buffer') |
|
var createVAO = require('gl-vao') |
|
var createTexture = require('gl-texture2d') |
|
var normals = require('normals') |
|
var multiply = require('gl-mat4/multiply') |
|
var invert = require('gl-mat4/invert') |
|
var ndarray = require('ndarray') |
|
var colormap = require('colormap') |
|
var getContour = require('simplicial-complex-contour') |
|
var pool = require('typedarray-pool') |
|
var shaders = require('./shaders') |
|
var closestPoint = require('./closest-point') |
|
|
|
var meshShader = shaders.meshShader |
|
var pickShader = shaders.pickShader |
|
|
|
var identityMatrix = [ |
|
1,0,0,0, |
|
0,1,0,0, |
|
0,0,1,0, |
|
0,0,0,1] |
|
|
|
function SimplicialMesh(gl |
|
, texture |
|
, triShader |
|
, lineShader |
|
, pointShader |
|
, pickShader |
|
, pointPickShader |
|
, contourShader |
|
, trianglePositions |
|
, triangleVectors |
|
, triangleIds |
|
, triangleColors |
|
, triangleUVs |
|
, triangleNormals |
|
, triangleVAO |
|
, edgePositions |
|
, edgeIds |
|
, edgeColors |
|
, edgeUVs |
|
, edgeVAO |
|
, pointPositions |
|
, pointIds |
|
, pointColors |
|
, pointUVs |
|
, pointSizes |
|
, pointVAO |
|
, contourPositions |
|
, contourVAO) { |
|
|
|
this.gl = gl |
|
this.cells = [] |
|
this.positions = [] |
|
this.intensity = [] |
|
this.texture = texture |
|
this.dirty = true |
|
|
|
this.triShader = triShader |
|
this.lineShader = lineShader |
|
this.pointShader = pointShader |
|
this.pickShader = pickShader |
|
this.pointPickShader = pointPickShader |
|
this.contourShader = contourShader |
|
|
|
this.trianglePositions = trianglePositions |
|
this.triangleVectors = triangleVectors |
|
this.triangleColors = triangleColors |
|
this.triangleNormals = triangleNormals |
|
this.triangleUVs = triangleUVs |
|
this.triangleIds = triangleIds |
|
this.triangleVAO = triangleVAO |
|
this.triangleCount = 0 |
|
|
|
this.lineWidth = 1 |
|
this.edgePositions = edgePositions |
|
this.edgeColors = edgeColors |
|
this.edgeUVs = edgeUVs |
|
this.edgeIds = edgeIds |
|
this.edgeVAO = edgeVAO |
|
this.edgeCount = 0 |
|
|
|
this.pointPositions = pointPositions |
|
this.pointColors = pointColors |
|
this.pointUVs = pointUVs |
|
this.pointSizes = pointSizes |
|
this.pointIds = pointIds |
|
this.pointVAO = pointVAO |
|
this.pointCount = 0 |
|
|
|
this.contourLineWidth = 1 |
|
this.contourPositions = contourPositions |
|
this.contourVAO = contourVAO |
|
this.contourCount = 0 |
|
this.contourColor = [0,0,0] |
|
this.contourEnable = true |
|
|
|
this.pickId = 1 |
|
this.bounds = [ |
|
[ Infinity, Infinity, Infinity], |
|
[-Infinity,-Infinity,-Infinity] ] |
|
this.clipBounds = [ |
|
[-Infinity,-Infinity,-Infinity], |
|
[ Infinity, Infinity, Infinity] ] |
|
|
|
this.lightPosition = [1e5, 1e5, 0] |
|
this.ambientLight = 0.8 |
|
this.diffuseLight = 0.8 |
|
this.specularLight = 2.0 |
|
this.roughness = 0.5 |
|
this.fresnel = 1.5 |
|
|
|
this.opacity = 1.0 |
|
|
|
this.tubeScale = 1.0 |
|
|
|
this._model = identityMatrix |
|
this._view = identityMatrix |
|
this._projection = identityMatrix |
|
this._resolution = [1,1] |
|
} |
|
|
|
var proto = SimplicialMesh.prototype |
|
|
|
proto.isOpaque = function() { |
|
return this.opacity >= 1 |
|
} |
|
|
|
proto.isTransparent = function() { |
|
return this.opacity < 1 |
|
} |
|
|
|
proto.pickSlots = 1 |
|
|
|
proto.setPickBase = function(id) { |
|
this.pickId = id |
|
} |
|
|
|
function genColormap(param) { |
|
var colors = colormap({ |
|
colormap: param |
|
, nshades: 256 |
|
, format: 'rgba' |
|
}) |
|
|
|
var result = new Uint8Array(256*4) |
|
for(var i=0; i<256; ++i) { |
|
var c = colors[i] |
|
for(var j=0; j<3; ++j) { |
|
result[4*i+j] = c[j] |
|
} |
|
result[4*i+3] = c[3]*255 |
|
} |
|
|
|
return ndarray(result, [256,256,4], [4,0,1]) |
|
} |
|
|
|
function unpackIntensity(cells, numVerts, cellIntensity) { |
|
var result = new Array(numVerts) |
|
for(var i=0; i<numVerts; ++i) { |
|
result[i] = 0 |
|
} |
|
var numCells = cells.length |
|
for(var i=0; i<numCells; ++i) { |
|
var c = cells[i] |
|
for(var j=0; j<c.length; ++j) { |
|
result[c[j]] = cellIntensity[i] |
|
} |
|
} |
|
return result |
|
} |
|
|
|
function takeZComponent(array) { |
|
var n = array.length |
|
var result = new Array(n) |
|
for(var i=0; i<n; ++i) { |
|
result[i] = array[i][2] |
|
} |
|
return result |
|
} |
|
|
|
proto.highlight = function(selection) { |
|
if(!selection || !this.contourEnable) { |
|
this.contourCount = 0 |
|
return |
|
} |
|
var level = getContour(this.cells, this.intensity, selection.intensity) |
|
var cells = level.cells |
|
var vertexIds = level.vertexIds |
|
var vertexWeights = level.vertexWeights |
|
var numCells = cells.length |
|
var result = pool.mallocFloat32(2 * 3 * numCells) |
|
var ptr = 0 |
|
for(var i=0; i<numCells; ++i) { |
|
var c = cells[i] |
|
for(var j=0; j<2; ++j) { |
|
var v = c[0] |
|
if(c.length === 2) { |
|
v = c[j] |
|
} |
|
var a = vertexIds[v][0] |
|
var b = vertexIds[v][1] |
|
var w = vertexWeights[v] |
|
var wi = 1.0 - w |
|
var pa = this.positions[a] |
|
var pb = this.positions[b] |
|
for(var k=0; k<3; ++k) { |
|
result[ptr++] = w * pa[k] + wi * pb[k] |
|
} |
|
} |
|
} |
|
this.contourCount = (ptr / 3)|0 |
|
this.contourPositions.update(result.subarray(0, ptr)) |
|
pool.free(result) |
|
} |
|
|
|
proto.update = function(params) { |
|
params = params || {} |
|
var gl = this.gl |
|
|
|
this.dirty = true |
|
|
|
if('contourEnable' in params) { |
|
this.contourEnable = params.contourEnable |
|
} |
|
if('contourColor' in params) { |
|
this.contourColor = params.contourColor |
|
} |
|
if('lineWidth' in params) { |
|
this.lineWidth = params.lineWidth |
|
} |
|
if('lightPosition' in params) { |
|
this.lightPosition = params.lightPosition |
|
} |
|
if('opacity' in params) { |
|
this.opacity = params.opacity |
|
} |
|
if('ambient' in params) { |
|
this.ambientLight = params.ambient |
|
} |
|
if('diffuse' in params) { |
|
this.diffuseLight = params.diffuse |
|
} |
|
if('specular' in params) { |
|
this.specularLight = params.specular |
|
} |
|
if('roughness' in params) { |
|
this.roughness = params.roughness |
|
} |
|
if('fresnel' in params) { |
|
this.fresnel = params.fresnel |
|
} |
|
|
|
if(params.texture) { |
|
this.texture.dispose() |
|
this.texture = createTexture(gl, params.texture) |
|
} else if (params.colormap) { |
|
this.texture.shape = [256,256] |
|
this.texture.minFilter = gl.LINEAR_MIPMAP_LINEAR |
|
this.texture.magFilter = gl.LINEAR |
|
this.texture.setPixels(genColormap(params.colormap)) |
|
this.texture.generateMipmap() |
|
} |
|
|
|
var cells = params.cells |
|
var positions = params.positions |
|
var vectors = params.vectors |
|
|
|
if(!positions || !cells || !vectors) { |
|
return |
|
} |
|
|
|
if (params.tubeScale !== undefined) { |
|
this.tubeScale = params.tubeScale; |
|
} |
|
|
|
var tPos = [] |
|
var tVec = [] |
|
var tCol = [] |
|
var tNor = [] |
|
var tUVs = [] |
|
var tIds = [] |
|
|
|
var ePos = [] |
|
var eCol = [] |
|
var eUVs = [] |
|
var eIds = [] |
|
|
|
var pPos = [] |
|
var pCol = [] |
|
var pUVs = [] |
|
var pSiz = [] |
|
var pIds = [] |
|
|
|
//Save geometry data for picking calculations |
|
this.cells = cells |
|
this.positions = positions |
|
|
|
//Compute normals |
|
var vertexNormals = params.vertexNormals |
|
var cellNormals = params.cellNormals |
|
var vertexNormalsEpsilon = params.vertexNormalsEpsilon === void(0) ? DEFAULT_VERTEX_NORMALS_EPSILON : params.vertexNormalsEpsilon |
|
var faceNormalsEpsilon = params.faceNormalsEpsilon === void(0) ? DEFAULT_FACE_NORMALS_EPSILON : params.faceNormalsEpsilon |
|
if(params.useFacetNormals && !cellNormals) { |
|
cellNormals = normals.faceNormals(cells, positions, faceNormalsEpsilon) |
|
} |
|
if(!cellNormals && !vertexNormals) { |
|
vertexNormals = normals.vertexNormals(cells, positions, vertexNormalsEpsilon) |
|
} |
|
|
|
//Compute colors |
|
var vertexColors = params.vertexColors |
|
var cellColors = params.cellColors |
|
var meshColor = params.meshColor || [1,1,1,1] |
|
|
|
//UVs |
|
var vertexUVs = params.vertexUVs |
|
var vertexIntensity = params.vertexIntensity |
|
var cellUVs = params.cellUVs |
|
var cellIntensity = params.cellIntensity |
|
|
|
var intensityLo = Infinity |
|
var intensityHi = -Infinity |
|
if(!vertexUVs && !cellUVs) { |
|
if(vertexIntensity) { |
|
if(params.vertexIntensityBounds) { |
|
intensityLo = +params.vertexIntensityBounds[0] |
|
intensityHi = +params.vertexIntensityBounds[1] |
|
} else { |
|
for(var i=0; i<vertexIntensity.length; ++i) { |
|
var f = vertexIntensity[i] |
|
intensityLo = Math.min(intensityLo, f) |
|
intensityHi = Math.max(intensityHi, f) |
|
} |
|
} |
|
} else if(cellIntensity) { |
|
for(var i=0; i<cellIntensity.length; ++i) { |
|
var f = cellIntensity[i] |
|
intensityLo = Math.min(intensityLo, f) |
|
intensityHi = Math.max(intensityHi, f) |
|
} |
|
} else { |
|
for(var i=0; i<positions.length; ++i) { |
|
var f = positions[i][2] |
|
intensityLo = Math.min(intensityLo, f) |
|
intensityHi = Math.max(intensityHi, f) |
|
} |
|
} |
|
} |
|
|
|
if(vertexIntensity) { |
|
this.intensity = vertexIntensity |
|
} else if(cellIntensity) { |
|
this.intensity = unpackIntensity(cells, positions.length, cellIntensity) |
|
} else { |
|
this.intensity = takeZComponent(positions) |
|
} |
|
|
|
//Point size |
|
var pointSizes = params.pointSizes |
|
var meshPointSize = params.pointSize || 1.0 |
|
|
|
//Update bounds |
|
this.bounds = [[Infinity,Infinity,Infinity], [-Infinity,-Infinity,-Infinity]] |
|
for(var i=0; i<positions.length; ++i) { |
|
var p = positions[i] |
|
for(var j=0; j<3; ++j) { |
|
if(isNaN(p[j]) || !isFinite(p[j])) { |
|
continue |
|
} |
|
this.bounds[0][j] = Math.min(this.bounds[0][j], p[j]) |
|
this.bounds[1][j] = Math.max(this.bounds[1][j], p[j]) |
|
} |
|
} |
|
|
|
//Pack cells into buffers |
|
var triangleCount = 0 |
|
var edgeCount = 0 |
|
var pointCount = 0 |
|
|
|
fill_loop: |
|
for(var i=0; i<cells.length; ++i) { |
|
var cell = cells[i] |
|
switch(cell.length) { |
|
case 1: |
|
|
|
var v = cell[0] |
|
var p = positions[v] |
|
|
|
//Check NaNs |
|
for(var j=0; j<3; ++j) { |
|
if(isNaN(p[j]) || !isFinite(p[j])) { |
|
continue fill_loop |
|
} |
|
} |
|
|
|
pPos.push(p[0], p[1], p[2], p[3]) |
|
|
|
var c |
|
if(vertexColors) { |
|
c = vertexColors[v] |
|
} else if(cellColors) { |
|
c = cellColors[i] |
|
} else { |
|
c = meshColor |
|
} |
|
if(c.length === 3) { |
|
pCol.push(c[0], c[1], c[2], 1) |
|
} else { |
|
pCol.push(c[0], c[1], c[2], c[3]) |
|
} |
|
|
|
var uv |
|
if(vertexUVs) { |
|
uv = vertexUVs[v] |
|
} else if(vertexIntensity) { |
|
uv = [ |
|
(vertexIntensity[v] - intensityLo) / |
|
(intensityHi - intensityLo), 0] |
|
} else if(cellUVs) { |
|
uv = cellUVs[i] |
|
} else if(cellIntensity) { |
|
uv = [ |
|
(cellIntensity[i] - intensityLo) / |
|
(intensityHi - intensityLo), 0] |
|
} else { |
|
uv = [ |
|
(p[2] - intensityLo) / |
|
(intensityHi - intensityLo), 0] |
|
} |
|
pUVs.push(uv[0], uv[1]) |
|
|
|
if(pointSizes) { |
|
pSiz.push(pointSizes[v]) |
|
} else { |
|
pSiz.push(meshPointSize) |
|
} |
|
|
|
pIds.push(i) |
|
|
|
pointCount += 1 |
|
break |
|
|
|
case 2: |
|
|
|
//Check NaNs |
|
for(var j=0; j<2; ++j) { |
|
var v = cell[j] |
|
var p = positions[v] |
|
for(var k=0; k<3; ++k) { |
|
if(isNaN(p[k]) || !isFinite(p[k])) { |
|
continue fill_loop |
|
} |
|
} |
|
} |
|
|
|
for(var j=0; j<2; ++j) { |
|
var v = cell[j] |
|
var p = positions[v] |
|
|
|
ePos.push(p[0], p[1], p[2]) |
|
|
|
var c |
|
if(vertexColors) { |
|
c = vertexColors[v] |
|
} else if(cellColors) { |
|
c = cellColors[i] |
|
} else { |
|
c = meshColor |
|
} |
|
if(c.length === 3) { |
|
eCol.push(c[0], c[1], c[2], 1) |
|
} else { |
|
eCol.push(c[0], c[1], c[2], c[3]) |
|
} |
|
|
|
var uv |
|
if(vertexUVs) { |
|
uv = vertexUVs[v] |
|
} else if(vertexIntensity) { |
|
uv = [ |
|
(vertexIntensity[v] - intensityLo) / |
|
(intensityHi - intensityLo), 0] |
|
} else if(cellUVs) { |
|
uv = cellUVs[i] |
|
} else if(cellIntensity) { |
|
uv = [ |
|
(cellIntensity[i] - intensityLo) / |
|
(intensityHi - intensityLo), 0] |
|
} else { |
|
uv = [ |
|
(p[2] - intensityLo) / |
|
(intensityHi - intensityLo), 0] |
|
} |
|
eUVs.push(uv[0], uv[1]) |
|
|
|
eIds.push(i) |
|
} |
|
edgeCount += 1 |
|
break |
|
|
|
case 3: |
|
//Check NaNs |
|
for(var j=0; j<3; ++j) { |
|
var v = cell[j] |
|
var p = positions[v] |
|
for(var k=0; k<3; ++k) { |
|
if(isNaN(p[k]) || !isFinite(p[k])) { |
|
continue fill_loop |
|
} |
|
} |
|
} |
|
|
|
for(var j=0; j<3; ++j) { |
|
var v = cell[j] |
|
|
|
var p = positions[v] |
|
tPos.push(p[0], p[1], p[2], p[3]) |
|
|
|
var w = vectors[v] |
|
tVec.push(w[0], w[1], w[2]); |
|
|
|
var c |
|
if(vertexColors) { |
|
c = vertexColors[v] |
|
} else if(cellColors) { |
|
c = cellColors[i] |
|
} else { |
|
c = meshColor |
|
} |
|
if(c.length === 3) { |
|
tCol.push(c[0], c[1], c[2], 1) |
|
} else { |
|
tCol.push(c[0], c[1], c[2], c[3]) |
|
} |
|
|
|
var uv |
|
if(vertexUVs) { |
|
uv = vertexUVs[v] |
|
} else if(vertexIntensity) { |
|
uv = [ |
|
(vertexIntensity[v] - intensityLo) / |
|
(intensityHi - intensityLo), 0] |
|
} else if(cellUVs) { |
|
uv = cellUVs[i] |
|
} else if(cellIntensity) { |
|
uv = [ |
|
(cellIntensity[i] - intensityLo) / |
|
(intensityHi - intensityLo), 0] |
|
} else { |
|
uv = [ |
|
(p[2] - intensityLo) / |
|
(intensityHi - intensityLo), 0] |
|
} |
|
tUVs.push(uv[0], uv[1]) |
|
|
|
var q |
|
if(vertexNormals) { |
|
q = vertexNormals[v] |
|
} else { |
|
q = cellNormals[i] |
|
} |
|
tNor.push(q[0], q[1], q[2]) |
|
|
|
tIds.push(i) |
|
} |
|
triangleCount += 1 |
|
break |
|
|
|
default: |
|
break |
|
} |
|
} |
|
|
|
this.pointCount = pointCount |
|
this.edgeCount = edgeCount |
|
this.triangleCount = triangleCount |
|
|
|
this.pointPositions.update(pPos) |
|
this.pointColors.update(pCol) |
|
this.pointUVs.update(pUVs) |
|
this.pointSizes.update(pSiz) |
|
this.pointIds.update(new Uint32Array(pIds)) |
|
|
|
this.edgePositions.update(ePos) |
|
this.edgeColors.update(eCol) |
|
this.edgeUVs.update(eUVs) |
|
this.edgeIds.update(new Uint32Array(eIds)) |
|
|
|
this.trianglePositions.update(tPos) |
|
this.triangleVectors.update(tVec) |
|
this.triangleColors.update(tCol) |
|
this.triangleUVs.update(tUVs) |
|
this.triangleNormals.update(tNor) |
|
this.triangleIds.update(new Uint32Array(tIds)) |
|
} |
|
|
|
proto.drawTransparent = proto.draw = function(params) { |
|
params = params || {} |
|
var gl = this.gl |
|
var model = params.model || identityMatrix |
|
var view = params.view || identityMatrix |
|
var projection = params.projection || identityMatrix |
|
|
|
var clipBounds = [[-1e6,-1e6,-1e6],[1e6,1e6,1e6]] |
|
for(var i=0; i<3; ++i) { |
|
clipBounds[0][i] = Math.max(clipBounds[0][i], this.clipBounds[0][i]) |
|
clipBounds[1][i] = Math.min(clipBounds[1][i], this.clipBounds[1][i]) |
|
} |
|
|
|
var uniforms = { |
|
model: model, |
|
view: view, |
|
projection: projection, |
|
|
|
clipBounds: clipBounds, |
|
|
|
kambient: this.ambientLight, |
|
kdiffuse: this.diffuseLight, |
|
kspecular: this.specularLight, |
|
roughness: this.roughness, |
|
fresnel: this.fresnel, |
|
|
|
eyePosition: [0,0,0], |
|
lightPosition: [0,0,0], |
|
|
|
opacity: this.opacity, |
|
|
|
tubeScale: this.tubeScale, |
|
|
|
contourColor: this.contourColor, |
|
|
|
texture: 0 |
|
} |
|
|
|
this.texture.bind(0) |
|
|
|
var invCameraMatrix = new Array(16) |
|
multiply(invCameraMatrix, uniforms.view, uniforms.model) |
|
multiply(invCameraMatrix, uniforms.projection, invCameraMatrix) |
|
invert(invCameraMatrix, invCameraMatrix) |
|
|
|
for(var i=0; i<3; ++i) { |
|
uniforms.eyePosition[i] = invCameraMatrix[12+i] / invCameraMatrix[15] |
|
} |
|
|
|
var w = invCameraMatrix[15] |
|
for(var i=0; i<3; ++i) { |
|
w += this.lightPosition[i] * invCameraMatrix[4*i+3] |
|
} |
|
for(var i=0; i<3; ++i) { |
|
var s = invCameraMatrix[12+i] |
|
for(var j=0; j<3; ++j) { |
|
s += invCameraMatrix[4*j+i] * this.lightPosition[j] |
|
} |
|
uniforms.lightPosition[i] = s / w |
|
} |
|
|
|
if(this.triangleCount > 0) { |
|
var shader = this.triShader |
|
shader.bind() |
|
shader.uniforms = uniforms |
|
|
|
this.triangleVAO.bind() |
|
gl.drawArrays(gl.TRIANGLES, 0, this.triangleCount*3) |
|
this.triangleVAO.unbind() |
|
} |
|
|
|
if(this.edgeCount > 0 && this.lineWidth > 0) { |
|
var shader = this.lineShader |
|
shader.bind() |
|
shader.uniforms = uniforms |
|
|
|
this.edgeVAO.bind() |
|
gl.lineWidth(this.lineWidth) |
|
gl.drawArrays(gl.LINES, 0, this.edgeCount*2) |
|
this.edgeVAO.unbind() |
|
} |
|
|
|
if(this.pointCount > 0) { |
|
var shader = this.pointShader |
|
shader.bind() |
|
shader.uniforms = uniforms |
|
|
|
this.pointVAO.bind() |
|
gl.drawArrays(gl.POINTS, 0, this.pointCount) |
|
this.pointVAO.unbind() |
|
} |
|
|
|
if(this.contourEnable && this.contourCount > 0 && this.contourLineWidth > 0) { |
|
var shader = this.contourShader |
|
shader.bind() |
|
shader.uniforms = uniforms |
|
|
|
this.contourVAO.bind() |
|
gl.drawArrays(gl.LINES, 0, this.contourCount) |
|
this.contourVAO.unbind() |
|
} |
|
} |
|
|
|
proto.drawPick = function(params) { |
|
params = params || {} |
|
|
|
var gl = this.gl |
|
|
|
var model = params.model || identityMatrix |
|
var view = params.view || identityMatrix |
|
var projection = params.projection || identityMatrix |
|
|
|
var clipBounds = [[-1e6,-1e6,-1e6],[1e6,1e6,1e6]] |
|
for(var i=0; i<3; ++i) { |
|
clipBounds[0][i] = Math.max(clipBounds[0][i], this.clipBounds[0][i]) |
|
clipBounds[1][i] = Math.min(clipBounds[1][i], this.clipBounds[1][i]) |
|
} |
|
|
|
//Save camera parameters |
|
this._model = [].slice.call(model) |
|
this._view = [].slice.call(view) |
|
this._projection = [].slice.call(projection) |
|
this._resolution = [gl.drawingBufferWidth, gl.drawingBufferHeight] |
|
|
|
var uniforms = { |
|
model: model, |
|
view: view, |
|
projection: projection, |
|
clipBounds: clipBounds, |
|
|
|
tubeScale: this.tubeScale, |
|
|
|
pickId: this.pickId / 255.0, |
|
} |
|
|
|
var shader = this.pickShader |
|
shader.bind() |
|
shader.uniforms = uniforms |
|
|
|
if(this.triangleCount > 0) { |
|
this.triangleVAO.bind() |
|
gl.drawArrays(gl.TRIANGLES, 0, this.triangleCount*3) |
|
this.triangleVAO.unbind() |
|
} |
|
|
|
if(this.edgeCount > 0) { |
|
this.edgeVAO.bind() |
|
gl.lineWidth(this.lineWidth) |
|
gl.drawArrays(gl.LINES, 0, this.edgeCount*2) |
|
this.edgeVAO.unbind() |
|
} |
|
|
|
if(this.pointCount > 0) { |
|
var shader = this.pointPickShader |
|
shader.bind() |
|
shader.uniforms = uniforms |
|
|
|
this.pointVAO.bind() |
|
gl.drawArrays(gl.POINTS, 0, this.pointCount) |
|
this.pointVAO.unbind() |
|
} |
|
} |
|
|
|
|
|
proto.pick = function(pickData) { |
|
if(!pickData) { |
|
return null |
|
} |
|
if(pickData.id !== this.pickId) { |
|
return null |
|
} |
|
|
|
var cellId = pickData.value[0] + 256*pickData.value[1] + 65536*pickData.value[2] |
|
var cell = this.cells[cellId] |
|
var positions = this.positions |
|
|
|
var simplex = new Array(cell.length) |
|
for(var i=0; i<cell.length; ++i) { |
|
simplex[i] = positions[cell[i]] |
|
} |
|
|
|
var data = closestPoint( |
|
simplex, |
|
[pickData.coord[0], this._resolution[1]-pickData.coord[1]], |
|
this._model, |
|
this._view, |
|
this._projection, |
|
this._resolution) |
|
|
|
if(!data) { |
|
return null |
|
} |
|
|
|
var weights = data[2] |
|
var interpIntensity = 0.0 |
|
for(var i=0; i<cell.length; ++i) { |
|
interpIntensity += weights[i] * this.intensity[cell[i]] |
|
} |
|
|
|
return { |
|
position: data[1], |
|
index: cell[data[0]], |
|
cell: cell, |
|
cellId: cellId, |
|
intensity: interpIntensity, |
|
|
|
tubeScale: this.tubeScale, |
|
|
|
dataCoordinate: this.positions[cell[data[0]]] |
|
} |
|
} |
|
|
|
|
|
proto.dispose = function() { |
|
this.texture.dispose() |
|
|
|
this.triShader.dispose() |
|
// this.lineShader.dispose() |
|
// this.pointShader.dispose() |
|
this.pickShader.dispose() |
|
// this.pointPickShader.dispose() |
|
|
|
this.triangleVAO.dispose() |
|
this.trianglePositions.dispose() |
|
this.triangleVectors.dispose() |
|
this.triangleColors.dispose() |
|
this.triangleUVs.dispose() |
|
this.triangleNormals.dispose() |
|
this.triangleIds.dispose() |
|
|
|
this.edgeVAO.dispose() |
|
this.edgePositions.dispose() |
|
this.edgeColors.dispose() |
|
this.edgeUVs.dispose() |
|
this.edgeIds.dispose() |
|
|
|
this.pointVAO.dispose() |
|
this.pointPositions.dispose() |
|
this.pointColors.dispose() |
|
this.pointUVs.dispose() |
|
this.pointSizes.dispose() |
|
this.pointIds.dispose() |
|
|
|
this.contourVAO.dispose() |
|
this.contourPositions.dispose() |
|
// this.contourShader.dispose() |
|
} |
|
|
|
function createMeshShader(gl) { |
|
var shader = createShader(gl, meshShader.vertex, meshShader.fragment, null, meshShader.attributes) |
|
shader.attributes.position.location = 0 |
|
shader.attributes.color.location = 2 |
|
shader.attributes.uv.location = 3 |
|
shader.attributes.vector.location = 5 |
|
return shader |
|
} |
|
|
|
function createWireShader(gl) { |
|
var shader = createShader(gl, wireShader.vertex, wireShader.fragment) |
|
shader.attributes.position.location = 0 |
|
shader.attributes.color.location = 2 |
|
shader.attributes.uv.location = 3 |
|
return shader |
|
} |
|
|
|
function createPointShader(gl) { |
|
var shader = createShader(gl, pointShader.vertex, pointShader.fragment) |
|
shader.attributes.position.location = 0 |
|
shader.attributes.color.location = 2 |
|
shader.attributes.uv.location = 3 |
|
shader.attributes.pointSize.location = 4 |
|
return shader |
|
} |
|
|
|
function createPickShader(gl) { |
|
var shader = createShader(gl, pickShader.vertex, pickShader.fragment) |
|
shader.attributes.position.location = 0 |
|
shader.attributes.id.location = 1 |
|
return shader |
|
} |
|
|
|
function createPointPickShader(gl) { |
|
var shader = createShader(gl, pointPickShader.vertex, pointPickShader.fragment) |
|
shader.attributes.position.location = 0 |
|
shader.attributes.id.location = 1 |
|
shader.attributes.pointSize.location = 4 |
|
return shader |
|
} |
|
|
|
function createContourShader(gl) { |
|
var shader = createShader(gl, contourShader.vertex, contourShader.fragment) |
|
shader.attributes.position.location = 0 |
|
return shader |
|
} |
|
|
|
function createSimplicialMesh(gl, params) { |
|
if (arguments.length === 1) { |
|
params = gl; |
|
gl = params.gl; |
|
} |
|
|
|
var triShader = params.triShader || createMeshShader(gl) |
|
var lineShader = null; //createWireShader(gl) |
|
var pointShader = null; //createPointShader(gl) |
|
var pickShader = createPickShader(gl) |
|
var pointPickShader = null; //createPointPickShader(gl) |
|
var contourShader = null; //createContourShader(gl) |
|
|
|
var meshTexture = createTexture(gl, |
|
ndarray(new Uint8Array([255,255,255,255]), [1,1,4])) |
|
meshTexture.generateMipmap() |
|
meshTexture.minFilter = gl.LINEAR_MIPMAP_LINEAR |
|
meshTexture.magFilter = gl.LINEAR |
|
|
|
var trianglePositions = createBuffer(gl) |
|
var triangleVectors = createBuffer(gl) |
|
var triangleColors = createBuffer(gl) |
|
var triangleUVs = createBuffer(gl) |
|
var triangleNormals = createBuffer(gl) |
|
var triangleIds = createBuffer(gl) |
|
var triangleVAO = createVAO(gl, [ |
|
{ buffer: trianglePositions, |
|
type: gl.FLOAT, |
|
size: 4 |
|
}, |
|
{ buffer: triangleIds, |
|
type: gl.UNSIGNED_BYTE, |
|
size: 4, |
|
normalized: true |
|
}, |
|
{ buffer: triangleColors, |
|
type: gl.FLOAT, |
|
size: 4 |
|
}, |
|
{ buffer: triangleUVs, |
|
type: gl.FLOAT, |
|
size: 2 |
|
}, |
|
{ buffer: triangleNormals, |
|
type: gl.FLOAT, |
|
size: 3 |
|
}, |
|
{ buffer: triangleVectors, |
|
type: gl.FLOAT, |
|
size: 3 |
|
} |
|
]) |
|
|
|
var edgePositions = createBuffer(gl) |
|
var edgeColors = createBuffer(gl) |
|
var edgeUVs = createBuffer(gl) |
|
var edgeIds = createBuffer(gl) |
|
var edgeVAO = createVAO(gl, [ |
|
{ buffer: edgePositions, |
|
type: gl.FLOAT, |
|
size: 3 |
|
}, |
|
{ buffer: edgeIds, |
|
type: gl.UNSIGNED_BYTE, |
|
size: 4, |
|
normalized: true |
|
}, |
|
{ buffer: edgeColors, |
|
type: gl.FLOAT, |
|
size: 4 |
|
}, |
|
{ buffer: edgeUVs, |
|
type: gl.FLOAT, |
|
size: 2 |
|
} |
|
]) |
|
|
|
var pointPositions = createBuffer(gl) |
|
var pointColors = createBuffer(gl) |
|
var pointUVs = createBuffer(gl) |
|
var pointSizes = createBuffer(gl) |
|
var pointIds = createBuffer(gl) |
|
var pointVAO = createVAO(gl, [ |
|
{ buffer: pointPositions, |
|
type: gl.FLOAT, |
|
size: 3 |
|
}, |
|
{ buffer: pointIds, |
|
type: gl.UNSIGNED_BYTE, |
|
size: 4, |
|
normalized: true |
|
}, |
|
{ buffer: pointColors, |
|
type: gl.FLOAT, |
|
size: 4 |
|
}, |
|
{ buffer: pointUVs, |
|
type: gl.FLOAT, |
|
size: 2 |
|
}, |
|
{ buffer: pointSizes, |
|
type: gl.FLOAT, |
|
size: 1 |
|
} |
|
]) |
|
|
|
var contourPositions = createBuffer(gl) |
|
var contourVAO = createVAO(gl, [ |
|
{ buffer: contourPositions, |
|
type: gl.FLOAT, |
|
size: 3 |
|
}]) |
|
|
|
var mesh = new SimplicialMesh(gl |
|
, meshTexture |
|
, triShader |
|
, lineShader |
|
, pointShader |
|
, pickShader |
|
, pointPickShader |
|
, contourShader |
|
, trianglePositions |
|
, triangleVectors |
|
, triangleIds |
|
, triangleColors |
|
, triangleUVs |
|
, triangleNormals |
|
, triangleVAO |
|
, edgePositions |
|
, edgeIds |
|
, edgeColors |
|
, edgeUVs |
|
, edgeVAO |
|
, pointPositions |
|
, pointIds |
|
, pointColors |
|
, pointUVs |
|
, pointSizes |
|
, pointVAO |
|
, contourPositions |
|
, contourVAO) |
|
|
|
mesh.update(params) |
|
|
|
return mesh |
|
} |
|
|
|
module.exports = createSimplicialMesh |
|
|
|
},{"./closest-point":9,"./shaders":10,"colormap":57,"gl-buffer":83,"gl-mat4/invert":94,"gl-mat4/multiply":96,"gl-shader":107,"gl-texture2d":116,"gl-vao":120,"ndarray":208,"normals":210,"simplicial-complex-contour":240,"typedarray-pool":257}],12:[function(require,module,exports){ |
|
'use strict' |
|
|
|
module.exports = createCamera |
|
|
|
var now = require('right-now') |
|
var createView = require('3d-view') |
|
var mouseChange = require('mouse-change') |
|
var mouseWheel = require('mouse-wheel') |
|
var mouseOffset = require('mouse-event-offset') |
|
|
|
function createCamera(element, options) { |
|
element = element || document.body |
|
options = options || {} |
|
|
|
var limits = [ 0.01, Infinity ] |
|
if('distanceLimits' in options) { |
|
limits[0] = options.distanceLimits[0] |
|
limits[1] = options.distanceLimits[1] |
|
} |
|
if('zoomMin' in options) { |
|
limits[0] = options.zoomMin |
|
} |
|
if('zoomMax' in options) { |
|
limits[1] = options.zoomMax |
|
} |
|
|
|
var view = createView({ |
|
center: options.center || [0,0,0], |
|
up: options.up || [0,1,0], |
|
eye: options.eye || [0,0,10], |
|
mode: options.mode || 'orbit', |
|
distanceLimits: limits |
|
}) |
|
|
|
var pmatrix = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] |
|
var distance = 0.0 |
|
var width = element.clientWidth |
|
var height = element.clientHeight |
|
|
|
var camera = { |
|
view: view, |
|
element: element, |
|
delay: options.delay || 16, |
|
rotateSpeed: options.rotateSpeed || 1, |
|
zoomSpeed: options.zoomSpeed || 1, |
|
translateSpeed: options.translateSpeed || 1, |
|
flipX: !!options.flipX, |
|
flipY: !!options.flipY, |
|
modes: view.modes, |
|
tick: function() { |
|
var t = now() |
|
var delay = this.delay |
|
view.idle(t-delay) |
|
view.flush(t-(100+delay*2)) |
|
var ctime = t - 2 * delay |
|
view.recalcMatrix(ctime) |
|
var allEqual = true |
|
var matrix = view.computedMatrix |
|
for(var i=0; i<16; ++i) { |
|
allEqual = allEqual && (pmatrix[i] === matrix[i]) |
|
pmatrix[i] = matrix[i] |
|
} |
|
var sizeChanged = |
|
element.clientWidth === width && |
|
element.clientHeight === height |
|
width = element.clientWidth |
|
height = element.clientHeight |
|
if(allEqual) { |
|
return !sizeChanged |
|
} |
|
distance = Math.exp(view.computedRadius[0]) |
|
return true |
|
}, |
|
lookAt: function(center, eye, up) { |
|
view.lookAt(view.lastT(), center, eye, up) |
|
}, |
|
rotate: function(pitch, yaw, roll) { |
|
view.rotate(view.lastT(), pitch, yaw, roll) |
|
}, |
|
pan: function(dx, dy, dz) { |
|
view.pan(view.lastT(), dx, dy, dz) |
|
}, |
|
translate: function(dx, dy, dz) { |
|
view.translate(view.lastT(), dx, dy, dz) |
|
} |
|
} |
|
|
|
Object.defineProperties(camera, { |
|
matrix: { |
|
get: function() { |
|
return view.computedMatrix |
|
}, |
|
set: function(mat) { |
|
view.setMatrix(view.lastT(), mat) |
|
return view.computedMatrix |
|
}, |
|
enumerable: true |
|
}, |
|
mode: { |
|
get: function() { |
|
return view.getMode() |
|
}, |
|
set: function(mode) { |
|
view.setMode(mode) |
|
return view.getMode() |
|
}, |
|
enumerable: true |
|
}, |
|
center: { |
|
get: function() { |
|
return view.computedCenter |
|
}, |
|
set: function(ncenter) { |
|
view.lookAt(view.lastT(), ncenter) |
|
return view.computedCenter |
|
}, |
|
enumerable: true |
|
}, |
|
eye: { |
|
get: function() { |
|
return view.computedEye |
|
}, |
|
set: function(neye) { |
|
view.lookAt(view.lastT(), null, neye) |
|
return view.computedEye |
|
}, |
|
enumerable: true |
|
}, |
|
up: { |
|
get: function() { |
|
return view.computedUp |
|
}, |
|
set: function(nup) { |
|
view.lookAt(view.lastT(), null, null, nup) |
|
return view.computedUp |
|
}, |
|
enumerable: true |
|
}, |
|
distance: { |
|
get: function() { |
|
return distance |
|
}, |
|
set: function(d) { |
|
view.setDistance(view.lastT(), d) |
|
return d |
|
}, |
|
enumerable: true |
|
}, |
|
distanceLimits: { |
|
get: function() { |
|
return view.getDistanceLimits(limits) |
|
}, |
|
set: function(v) { |
|
view.setDistanceLimits(v) |
|
return v |
|
}, |
|
enumerable: true |
|
} |
|
}) |
|
|
|
element.addEventListener('contextmenu', function(ev) { |
|
ev.preventDefault() |
|
return false |
|
}) |
|
|
|
var lastX = 0, lastY = 0, lastMods = {shift: false, control: false, alt: false, meta: false} |
|
mouseChange(element, handleInteraction) |
|
|
|
//enable simple touch interactions |
|
element.addEventListener('touchstart', function (ev) { |
|
var xy = mouseOffset(ev.changedTouches[0], element) |
|
handleInteraction(0, xy[0], xy[1], lastMods) |
|
handleInteraction(1, xy[0], xy[1], lastMods) |
|
}) |
|
element.addEventListener('touchmove', function (ev) { |
|
var xy = mouseOffset(ev.changedTouches[0], element) |
|
handleInteraction(1, xy[0], xy[1], lastMods) |
|
}) |
|
element.addEventListener('touchend', function (ev) { |
|
var xy = mouseOffset(ev.changedTouches[0], element) |
|
handleInteraction(0, lastX, lastY, lastMods) |
|
}) |
|
|
|
function handleInteraction (buttons, x, y, mods) { |
|
var scale = 1.0 / element.clientHeight |
|
var dx = scale * (x - lastX) |
|
var dy = scale * (y - lastY) |
|
|
|
var flipX = camera.flipX ? 1 : -1 |
|
var flipY = camera.flipY ? 1 : -1 |
|
|
|
var drot = Math.PI * camera.rotateSpeed |
|
|
|
var t = now() |
|
|
|
if(buttons & 1) { |
|
if(mods.shift) { |
|
view.rotate(t, 0, 0, -dx * drot) |
|
} else { |
|
view.rotate(t, flipX * drot * dx, -flipY * drot * dy, 0) |
|
} |
|
} else if(buttons & 2) { |
|
view.pan(t, -camera.translateSpeed * dx * distance, camera.translateSpeed * dy * distance, 0) |
|
} else if(buttons & 4) { |
|
var kzoom = camera.zoomSpeed * dy / window.innerHeight * (t - view.lastT()) * 50.0 |
|
view.pan(t, 0, 0, distance * (Math.exp(kzoom) - 1)) |
|
} |
|
|
|
lastX = x |
|
lastY = y |
|
lastMods = mods |
|
} |
|
|
|
mouseWheel(element, function(dx, dy, dz) { |
|
var flipX = camera.flipX ? 1 : -1 |
|
var flipY = camera.flipY ? 1 : -1 |
|
var t = now() |
|
if(Math.abs(dx) > Math.abs(dy)) { |
|
view.rotate(t, 0, 0, -dx * flipX * Math.PI * camera.rotateSpeed / window.innerWidth) |
|
} else { |
|
var kzoom = camera.zoomSpeed * flipY * dy / window.innerHeight * (t - view.lastT()) / 100.0 |
|
view.pan(t, 0, 0, distance * (Math.exp(kzoom) - 1)) |
|
} |
|
}, true) |
|
|
|
return camera |
|
} |
|
|
|
},{"3d-view":13,"mouse-change":200,"mouse-event-offset":201,"mouse-wheel":203,"right-now":228}],13:[function(require,module,exports){ |
|
'use strict' |
|
|
|
module.exports = createViewController |
|
|
|
var createTurntable = require('turntable-camera-controller') |
|
var createOrbit = require('orbit-camera-controller') |
|
var createMatrix = require('matrix-camera-controller') |
|
|
|
function ViewController(controllers, mode) { |
|
this._controllerNames = Object.keys(controllers) |
|
this._controllerList = this._controllerNames.map(function(n) { |
|
return controllers[n] |
|
}) |
|
this._mode = mode |
|
this._active = controllers[mode] |
|
if(!this._active) { |
|
this._mode = 'turntable' |
|
this._active = controllers.turntable |
|
} |
|
this.modes = this._controllerNames |
|
this.computedMatrix = this._active.computedMatrix |
|
this.computedEye = this._active.computedEye |
|
this.computedUp = this._active.computedUp |
|
this.computedCenter = this._active.computedCenter |
|
this.computedRadius = this._active.computedRadius |
|
} |
|
|
|
var proto = ViewController.prototype |
|
|
|
var COMMON_METHODS = [ |
|
['flush', 1], |
|
['idle', 1], |
|
['lookAt', 4], |
|
['rotate', 4], |
|
['pan', 4], |
|
['translate', 4], |
|
['setMatrix', 2], |
|
['setDistanceLimits', 2], |
|
['setDistance', 2] |
|
] |
|
|
|
COMMON_METHODS.forEach(function(method) { |
|
var name = method[0] |
|
var argNames = [] |
|
for(var i=0; i<method[1]; ++i) { |
|
argNames.push('a'+i) |
|
} |
|
var code = 'var cc=this._controllerList;for(var i=0;i<cc.length;++i){cc[i].'+method[0]+'('+argNames.join()+')}' |
|
proto[name] = Function.apply(null, argNames.concat(code)) |
|
}) |
|
|
|
proto.recalcMatrix = function(t) { |
|
this._active.recalcMatrix(t) |
|
} |
|
|
|
proto.getDistance = function(t) { |
|
return this._active.getDistance(t) |
|
} |
|
proto.getDistanceLimits = function(out) { |
|
return this._active.getDistanceLimits(out) |
|
} |
|
|
|
proto.lastT = function() { |
|
return this._active.lastT() |
|
} |
|
|
|
proto.setMode = function(mode) { |
|
if(mode === this._mode) { |
|
return |
|
} |
|
var idx = this._controllerNames.indexOf(mode) |
|
if(idx < 0) { |
|
return |
|
} |
|
var prev = this._active |
|
var next = this._controllerList[idx] |
|
var lastT = Math.max(prev.lastT(), next.lastT()) |
|
|
|
prev.recalcMatrix(lastT) |
|
next.setMatrix(lastT, prev.computedMatrix) |
|
|
|
this._active = next |
|
this._mode = mode |
|
|
|
//Update matrix properties |
|
this.computedMatrix = this._active.computedMatrix |
|
this.computedEye = this._active.computedEye |
|
this.computedUp = this._active.computedUp |
|
this.computedCenter = this._active.computedCenter |
|
this.computedRadius = this._active.computedRadius |
|
} |
|
|
|
proto.getMode = function() { |
|
return this._mode |
|
} |
|
|
|
function createViewController(options) { |
|
options = options || {} |
|
|
|
var eye = options.eye || [0,0,1] |
|
var center = options.center || [0,0,0] |
|
var up = options.up || [0,1,0] |
|
var limits = options.distanceLimits || [0, Infinity] |
|
var mode = options.mode || 'turntable' |
|
|
|
var turntable = createTurntable() |
|
var orbit = createOrbit() |
|
var matrix = createMatrix() |
|
|
|
turntable.setDistanceLimits(limits[0], limits[1]) |
|
turntable.lookAt(0, eye, center, up) |
|
orbit.setDistanceLimits(limits[0], limits[1]) |
|
orbit.lookAt(0, eye, center, up) |
|
matrix.setDistanceLimits(limits[0], limits[1]) |
|
matrix.lookAt(0, eye, center, up) |
|
|
|
return new ViewController({ |
|
turntable: turntable, |
|
orbit: orbit, |
|
matrix: matrix |
|
}, mode) |
|
} |
|
},{"matrix-camera-controller":198,"orbit-camera-controller":212,"turntable-camera-controller":254}],14:[function(require,module,exports){ |
|
var padLeft = require('pad-left') |
|
|
|
module.exports = addLineNumbers |
|
function addLineNumbers (string, start, delim) { |
|
start = typeof start === 'number' ? start : 1 |
|
delim = delim || ': ' |
|
|
|
var lines = string.split(/\r?\n/) |
|
var totalDigits = String(lines.length + start - 1).length |
|
return lines.map(function (line, i) { |
|
var c = i + start |
|
var digits = String(c).length |
|
var prefix = padLeft(c, totalDigits - digits) |
|
return prefix + delim + line |
|
}).join('\n') |
|
} |
|
|
|
},{"pad-left":213}],15:[function(require,module,exports){ |
|
'use strict' |
|
|
|
module.exports = affineHull |
|
|
|
var orient = require('robust-orientation') |
|
|
|
function linearlyIndependent(points, d) { |
|
var nhull = new Array(d+1) |
|
for(var i=0; i<points.length; ++i) { |
|
nhull[i] = points[i] |
|
} |
|
for(var i=0; i<=points.length; ++i) { |
|
for(var j=points.length; j<=d; ++j) { |
|
var x = new Array(d) |
|
for(var k=0; k<d; ++k) { |
|
x[k] = Math.pow(j+1-i, k) |
|
} |
|
nhull[j] = x |
|
} |
|
var o = orient.apply(void 0, nhull) |
|
if(o) { |
|
return true |
|
} |
|
} |
|
return false |
|
} |
|
|
|
function affineHull(points) { |
|
var n = points.length |
|
if(n === 0) { |
|
return [] |
|
} |
|
if(n === 1) { |
|
return [0] |
|
} |
|
var d = points[0].length |
|
var frame = [ points[0] ] |
|
var index = [ 0 ] |
|
for(var i=1; i<n; ++i) { |
|
frame.push(points[i]) |
|
if(!linearlyIndependent(frame, d)) { |
|
frame.pop() |
|
continue |
|
} |
|
index.push(i) |
|
if(index.length === d+1) { |
|
return index |
|
} |
|
} |
|
return index |
|
} |
|
},{"robust-orientation":234}],16:[function(require,module,exports){ |
|
'use strict'; |
|
|
|
var arraytools = function () { |
|
|
|
var that = {}; |
|
|
|
var RGB_REGEX = /^rgba?\(\s*\d{1,3}\s*,\s*\d{1,3}\s*,\s*\d{1,3}\s*(,.*)?\)$/; |
|
var RGB_GROUP_REGEX = /^rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,?\s*(.*)?\)$/; |
|
|
|
function isPlainObject (v) { |
|
return !Array.isArray(v) && v !== null && typeof v === 'object'; |
|
} |
|
|
|
function linspace (start, end, num) { |
|
var inc = (end - start) / Math.max(num - 1, 1); |
|
var a = []; |
|
for( var ii = 0; ii < num; ii++) |
|
a.push(start + ii*inc); |
|
return a; |
|
} |
|
|
|
function zip () { |
|
var arrays = [].slice.call(arguments); |
|
var lengths = arrays.map(function (a) {return a.length;}); |
|
var len = Math.min.apply(null, lengths); |
|
var zipped = []; |
|
for (var i = 0; i < len; i++) { |
|
zipped[i] = []; |
|
for (var j = 0; j < arrays.length; ++j) { |
|
zipped[i][j] = arrays[j][i]; |
|
} |
|
} |
|
return zipped; |
|
} |
|
|
|
function zip3 (a, b, c) { |
|
var len = Math.min.apply(null, [a.length, b.length, c.length]); |
|
var result = []; |
|
for (var n = 0; n < len; n++) { |
|
result.push([a[n], b[n], c[n]]); |
|
} |
|
return result; |
|
} |
|
|
|
function sum (A) { |
|
var acc = 0; |
|
accumulate(A, acc); |
|
function accumulate(x) { |
|
for (var i = 0; i < x.length; i++) { |
|
if (Array.isArray(x[i])) |
|
accumulate(x[i], acc); |
|
else |
|
acc += x[i]; |
|
} |
|
} |
|
return acc; |
|
} |
|
|
|
function copy2D (arr) { |
|
var carr = []; |
|
for (var i = 0; i < arr.length; ++i) { |
|
carr[i] = []; |
|
for (var j = 0; j < arr[i].length; ++j) { |
|
carr[i][j] = arr[i][j]; |
|
} |
|
} |
|
|
|
return carr; |
|
} |
|
|
|
|
|
function copy1D (arr) { |
|
var carr = []; |
|
for (var i = 0; i < arr.length; ++i) { |
|
carr[i] = arr[i]; |
|
} |
|
|
|
return carr; |
|
} |
|
|
|
|
|
function isEqual(arr1, arr2) { |
|
if(arr1.length !== arr2.length) |
|
return false; |
|
for(var i = arr1.length; i--;) { |
|
if(arr1[i] !== arr2[i]) |
|
return false; |
|
} |
|
|
|
return true; |
|
} |
|
|
|
|
|
function str2RgbArray(str, twoFiftySix) { |
|
// convert hex or rbg strings to 0->1 or 0->255 rgb array |
|
var rgb, |
|
match; |
|
|
|
if (typeof str !== 'string') return str; |
|
|
|
rgb = []; |
|
// hex notation |
|
if (str[0] === '#') { |
|
str = str.substr(1) // remove hash |
|
if (str.length === 3) str += str // fff -> ffffff |
|
match = parseInt(str, 16); |
|
rgb[0] = ((match >> 16) & 255); |
|
rgb[1] = ((match >> 8) & 255); |
|
rgb[2] = (match & 255); |
|
} |
|
|
|
// rgb(34, 34, 127) or rgba(34, 34, 127, 0.1) notation |
|
else if (RGB_REGEX.test(str)) { |
|
match = str.match(RGB_GROUP_REGEX); |
|
rgb[0] = parseInt(match[1]); |
|
rgb[1] = parseInt(match[2]); |
|
rgb[2] = parseInt(match[3]); |
|
} |
|
|
|
if (!twoFiftySix) { |
|
for (var j=0; j<3; ++j) rgb[j] = rgb[j]/255 |
|
} |
|
|
|
|
|
return rgb; |
|
} |
|
|
|
|
|
function str2RgbaArray(str, twoFiftySix) { |
|
// convert hex or rbg strings to 0->1 or 0->255 rgb array |
|
var rgb, |
|
match; |
|
|
|
if (typeof str !== 'string') return str; |
|
|
|
rgb = []; |
|
// hex notation |
|
if (str[0] === '#') { |
|
str = str.substr(1) // remove hash |
|
if (str.length === 3) str += str // fff -> ffffff |
|
match = parseInt(str, 16); |
|
rgb[0] = ((match >> 16) & 255); |
|
rgb[1] = ((match >> 8) & 255); |
|
rgb[2] = (match & 255); |
|
} |
|
|
|
// rgb(34, 34, 127) or rgba(34, 34, 127, 0.1) notation |
|
else if (RGB_REGEX.test(str)) { |
|
match = str.match(RGB_GROUP_REGEX); |
|
rgb[0] = parseInt(match[1]); |
|
rgb[1] = parseInt(match[2]); |
|
rgb[2] = parseInt(match[3]); |
|
if (match[4]) rgb[3] = parseFloat(match[4]); |
|
else rgb[3] = 1.0; |
|
} |
|
|
|
|
|
|
|
if (!twoFiftySix) { |
|
for (var j=0; j<3; ++j) rgb[j] = rgb[j]/255 |
|
} |
|
|
|
|
|
return rgb; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
that.isPlainObject = isPlainObject; |
|
that.linspace = linspace; |
|
that.zip3 = zip3; |
|
that.sum = sum; |
|
that.zip = zip; |
|
that.isEqual = isEqual; |
|
that.copy2D = copy2D; |
|
that.copy1D = copy1D; |
|
that.str2RgbArray = str2RgbArray; |
|
that.str2RgbaArray = str2RgbaArray; |
|
|
|
return that |
|
|
|
} |
|
|
|
|
|
module.exports = arraytools(); |
|
|
|
},{}],17:[function(require,module,exports){ |
|
module.exports = function _atob(str) { |
|
return atob(str) |
|
} |
|
|
|
},{}],18:[function(require,module,exports){ |
|
'use strict' |
|
|
|
module.exports = barycentric |
|
|
|
var solve = require('robust-linear-solve') |
|
|
|
function reduce(x) { |
|
var r = 0 |
|
for(var i=0; i<x.length; ++i) { |
|
r += x[i] |
|
} |
|
return r |
|
} |
|
|
|
function barycentric(simplex, point) { |
|
var d = point.length |
|
var A = new Array(d+1) |
|
for(var i=0; i<d; ++i) { |
|
var row = new Array(d+1) |
|
for(var j=0; j<=d; ++j) { |
|
row[j] = simplex[j][i] |
|
} |
|
A[i] = row |
|
} |
|
A[d] = new Array(d+1) |
|
for(var i=0; i<=d; ++i) { |
|
A[d][i] = 1 |
|
} |
|
|
|
var b = new Array(d+1) |
|
for(var i=0; i<d; ++i) { |
|
b[i] = point[i] |
|
} |
|
b[d] = 1.0 |
|
|
|
var x = solve(A, b) |
|
var w = reduce(x[d+1]) |
|
|
|
if(w === 0) { |
|
w = 1.0 |
|
} |
|
var y = new Array(d+1) |
|
for(var i=0; i<=d; ++i) { |
|
y[i] = reduce(x[i]) / w |
|
} |
|
return y |
|
} |
|
},{"robust-linear-solve":233}],19:[function(require,module,exports){ |
|
'use strict' |
|
|
|
var rationalize = require('./lib/rationalize') |
|
|
|
module.exports = add |
|
|
|
function add(a, b) { |
|
return rationalize( |
|
a[0].mul(b[1]).add(b[0].mul(a[1])), |
|
a[1].mul(b[1])) |
|
} |
|
|
|
},{"./lib/rationalize":29}],20:[function(require,module,exports){ |
|
'use strict' |
|
|
|
module.exports = cmp |
|
|
|
function cmp(a, b) { |
|
return a[0].mul(b[1]).cmp(b[0].mul(a[1])) |
|
} |
|
|
|
},{}],21:[function(require,module,exports){ |
|
'use strict' |
|
|
|
var rationalize = require('./lib/rationalize') |
|
|
|
module.exports = div |
|
|
|
function div(a, b) { |
|
return rationalize(a[0].mul(b[1]), a[1].mul(b[0])) |
|
} |
|
|
|
},{"./lib/rationalize":29}],22:[function(require,module,exports){ |
|
'use strict' |
|
|
|
var isRat = require('./is-rat') |
|
var isBN = require('./lib/is-bn') |
|
var num2bn = require('./lib/num-to-bn') |
|
var str2bn = require('./lib/str-to-bn') |
|
var rationalize = require('./lib/rationalize') |
|
var div = require('./div') |
|
|
|
module.exports = makeRational |
|
|
|
function makeRational(numer, denom) { |
|
if(isRat(numer)) { |
|
if(denom) { |
|
return div(numer, makeRational(denom)) |
|
} |
|
return [numer[0].clone(), numer[1].clone()] |
|
} |
|
var shift = 0 |
|
var a, b |
|
if(isBN(numer)) { |
|
a = numer.clone() |
|
} else if(typeof numer === 'string') { |
|
a = str2bn(numer) |
|
} else if(numer === 0) { |
|
return [num2bn(0), num2bn(1)] |
|
} else if(numer === Math.floor(numer)) { |
|
a = num2bn(numer) |
|
} else { |
|
while(numer !== Math.floor(numer)) { |
|
numer = numer * Math.pow(2, 256) |
|
shift -= 256 |
|
} |
|
a = num2bn(numer) |
|
} |
|
if(isRat(denom)) { |
|
a.mul(denom[1]) |
|
b = denom[0].clone() |
|
} else if(isBN(denom)) { |
|
b = denom.clone() |
|
} else if(typeof denom === 'string') { |
|
b = str2bn(denom) |
|
} else if(!denom) { |
|
b = num2bn(1) |
|
} else if(denom === Math.floor(denom)) { |
|
b = num2bn(denom) |
|
} else { |
|
while(denom !== Math.floor(denom)) { |
|
denom = denom * Math.pow(2, 256) |
|
shift += 256 |
|
} |
|
b = num2bn(denom) |
|
} |
|
if(shift > 0) { |
|
a = a.ushln(shift) |
|
} else if(shift < 0) { |
|
b = b.ushln(-shift) |
|
} |
|
return rationalize(a, b) |
|
} |
|
|
|
},{"./div":21,"./is-rat":23,"./lib/is-bn":27,"./lib/num-to-bn":28,"./lib/rationalize":29,"./lib/str-to-bn":30}],23:[function(require,module,exports){ |
|
'use strict' |
|
|
|
var isBN = require('./lib/is-bn') |
|
|
|
module.exports = isRat |
|
|
|
function isRat(x) { |
|
return Array.isArray(x) && x.length === 2 && isBN(x[0]) && isBN(x[1]) |
|
} |
|
|
|
},{"./lib/is-bn":27}],24:[function(require,module,exports){ |
|
'use strict' |
|
|
|
var BN = require('bn.js') |
|
|
|
module.exports = sign |
|
|
|
function sign (x) { |
|
return x.cmp(new BN(0)) |
|
} |
|
|
|
},{"bn.js":37}],25:[function(require,module,exports){ |
|
'use strict' |
|
|
|
var sign = require('./bn-sign') |
|
|
|
module.exports = bn2num |
|
|
|
//TODO: Make this better |
|
function bn2num(b) { |
|
var l = b.length |
|
var words = b.words |
|
var out = 0 |
|
if (l === 1) { |
|
out = words[0] |
|
} else if (l === 2) { |
|
out = words[0] + (words[1] * 0x4000000) |
|
} else { |
|
for (var i = 0; i < l; i++) { |
|
var w = words[i] |
|
out += w * Math.pow(0x4000000, i) |
|
} |
|
} |
|
return sign(b) * out |
|
} |
|
|
|
},{"./bn-sign":24}],26:[function(require,module,exports){ |
|
'use strict' |
|
|
|
var db = require('double-bits') |
|
var ctz = require('bit-twiddle').countTrailingZeros |
|
|
|
module.exports = ctzNumber |
|
|
|
//Counts the number of trailing zeros |
|
function ctzNumber(x) { |
|
var l = ctz(db.lo(x)) |
|
if(l < 32) { |
|
return l |
|
} |
|
var h = ctz(db.hi(x)) |
|
if(h > 20) { |
|
return 52 |
|
} |
|
return h + 32 |
|
} |
|
|
|
},{"bit-twiddle":36,"double-bits":69}],27:[function(require,module,exports){ |
|
'use strict' |
|
|
|
var BN = require('bn.js') |
|
|
|
module.exports = isBN |
|
|
|
//Test if x is a bignumber |
|
//FIXME: obviously this is the wrong way to do it |
|
function isBN(x) { |
|
return x && typeof x === 'object' && Boolean(x.words) |
|
} |
|
|
|
},{"bn.js":37}],28:[function(require,module,exports){ |
|
'use strict' |
|
|
|
var BN = require('bn.js') |
|
var db = require('double-bits') |
|
|
|
module.exports = num2bn |
|
|
|
function num2bn(x) { |
|
var e = db.exponent(x) |
|
if(e < 52) { |
|
return new BN(x) |
|
} else { |
|
return (new BN(x * Math.pow(2, 52-e))).ushln(e-52) |
|
} |
|
} |
|
|
|
},{"bn.js":37,"double-bits":69}],29:[function(require,module,exports){ |
|
'use strict' |
|
|
|
var num2bn = require('./num-to-bn') |
|
var sign = require('./bn-sign') |
|
|
|
module.exports = rationalize |
|
|
|
function rationalize(numer, denom) { |
|
var snumer = sign(numer) |
|
var sdenom = sign(denom) |
|
if(snumer === 0) { |
|
return [num2bn(0), num2bn(1)] |
|
} |
|
if(sdenom === 0) { |
|
return [num2bn(0), num2bn(0)] |
|
} |
|
if(sdenom < 0) { |
|
numer = numer.neg() |
|
denom = denom.neg() |
|
} |
|
var d = numer.gcd(denom) |
|
if(d.cmpn(1)) { |
|
return [ numer.div(d), denom.div(d) ] |
|
} |
|
return [ numer, denom ] |
|
} |
|
|
|
},{"./bn-sign":24,"./num-to-bn":28}],30:[function(require,module,exports){ |
|
'use strict' |
|
|
|
var BN = require('bn.js') |
|
|
|
module.exports = str2BN |
|
|
|
function str2BN(x) { |
|
return new BN(x) |
|
} |
|
|
|
},{"bn.js":37}],31:[function(require,module,exports){ |
|
'use strict' |
|
|
|
var rationalize = require('./lib/rationalize') |
|
|
|
module.exports = mul |
|
|
|
function mul(a, b) { |
|
return rationalize(a[0].mul(b[0]), a[1].mul(b[1])) |
|
} |
|
|
|
},{"./lib/rationalize":29}],32:[function(require,module,exports){ |
|
'use strict' |
|
|
|
var bnsign = require('./lib/bn-sign') |
|
|
|
module.exports = sign |
|
|
|
function sign(x) { |
|
return bnsign(x[0]) * bnsign(x[1]) |
|
} |
|
|
|
},{"./lib/bn-sign":24}],33:[function(require,module,exports){ |
|
'use strict' |
|
|
|
var rationalize = require('./lib/rationalize') |
|
|
|
module.exports = sub |
|
|
|
function sub(a, b) { |
|
return rationalize(a[0].mul(b[1]).sub(a[1].mul(b[0])), a[1].mul(b[1])) |
|
} |
|
|
|
},{"./lib/rationalize":29}],34:[function(require,module,exports){ |
|
'use strict' |
|
|
|
var bn2num = require('./lib/bn-to-num') |
|
var ctz = require('./lib/ctz') |
|
|
|
module.exports = roundRat |
|
|
|
// Round a rational to the closest float |
|
function roundRat (f) { |
|
var a = f[0] |
|
var b = f[1] |
|
if (a.cmpn(0) === 0) { |
|
return 0 |
|
} |
|
var h = a.abs().divmod(b.abs()) |
|
var iv = h.div |
|
var x = bn2num(iv) |
|
var ir = h.mod |
|
var sgn = (a.negative !== b.negative) ? -1 : 1 |
|
if (ir.cmpn(0) === 0) { |
|
return sgn * x |
|
} |
|
if (x) { |
|
var s = ctz(x) + 4 |
|
var y = bn2num(ir.ushln(s).divRound(b)) |
|
return sgn * (x + y * Math.pow(2, -s)) |
|
} else { |
|
var ybits = b.bitLength() - ir.bitLength() + 53 |
|
var y = bn2num(ir.ushln(ybits).divRound(b)) |
|
if (ybits < 1023) { |
|
return sgn * y * Math.pow(2, -ybits) |
|
} |
|
y *= Math.pow(2, -1023) |
|
return sgn * y * Math.pow(2, 1023 - ybits) |
|
} |
|
} |
|
|
|
},{"./lib/bn-to-num":25,"./lib/ctz":26}],35:[function(require,module,exports){ |
|
"use strict" |
|
|
|
function compileSearch(funcName, predicate, reversed, extraArgs, useNdarray, earlyOut) { |
|
var code = [ |
|
"function ", funcName, "(a,l,h,", extraArgs.join(","), "){", |
|
earlyOut ? "" : "var i=", (reversed ? "l-1" : "h+1"), |
|
";while(l<=h){\ |
|
var m=(l+h)>>>1,x=a", useNdarray ? ".get(m)" : "[m]"] |
|
if(earlyOut) { |
|
if(predicate.indexOf("c") < 0) { |
|
code.push(";if(x===y){return m}else if(x<=y){") |
|
} else { |
|
code.push(";var p=c(x,y);if(p===0){return m}else if(p<=0){") |
|
} |
|
} else { |
|
code.push(";if(", predicate, "){i=m;") |
|
} |
|
if(reversed) { |
|
code.push("l=m+1}else{h=m-1}") |
|
} else { |
|
code.push("h=m-1}else{l=m+1}") |
|
} |
|
code.push("}") |
|
if(earlyOut) { |
|
code.push("return -1};") |
|
} else { |
|
code.push("return i};") |
|
} |
|
return code.join("") |
|
} |
|
|
|
function compileBoundsSearch(predicate, reversed, suffix, earlyOut) { |
|
var result = new Function([ |
|
compileSearch("A", "x" + predicate + "y", reversed, ["y"], false, earlyOut), |
|
compileSearch("B", "x" + predicate + "y", reversed, ["y"], true, earlyOut), |
|
compileSearch("P", "c(x,y)" + predicate + "0", reversed, ["y", "c"], false, earlyOut), |
|
compileSearch("Q", "c(x,y)" + predicate + "0", reversed, ["y", "c"], true, earlyOut), |
|
"function dispatchBsearch", suffix, "(a,y,c,l,h){\ |
|
if(a.shape){\ |
|
if(typeof(c)==='function'){\ |
|
return Q(a,(l===undefined)?0:l|0,(h===undefined)?a.shape[0]-1:h|0,y,c)\ |
|
}else{\ |
|
return B(a,(c===undefined)?0:c|0,(l===undefined)?a.shape[0]-1:l|0,y)\ |
|
}}else{\ |
|
if(typeof(c)==='function'){\ |
|
return P(a,(l===undefined)?0:l|0,(h===undefined)?a.length-1:h|0,y,c)\ |
|
}else{\ |
|
return A(a,(c===undefined)?0:c|0,(l===undefined)?a.length-1:l|0,y)\ |
|
}}}\ |
|
return dispatchBsearch", suffix].join("")) |
|
return result() |
|
} |
|
|
|
module.exports = { |
|
ge: compileBoundsSearch(">=", false, "GE"), |
|
gt: compileBoundsSearch(">", false, "GT"), |
|
lt: compileBoundsSearch("<", true, "LT"), |
|
le: compileBoundsSearch("<=", true, "LE"), |
|
eq: compileBoundsSearch("-", true, "EQ", true) |
|
} |
|
|
|
},{}],36:[function(require,module,exports){ |
|
/** |
|
* Bit twiddling hacks for JavaScript. |
|
* |
|
* Author: Mikola Lysenko |
|
* |
|
* Ported from Stanford bit twiddling hack library: |
|
* http://graphics.stanford.edu/~seander/bithacks.html |
|
*/ |
|
|
|
"use strict"; "use restrict"; |
|
|
|
//Number of bits in an integer |
|
var INT_BITS = 32; |
|
|
|
//Constants |
|
exports.INT_BITS = INT_BITS; |
|
exports.INT_MAX = 0x7fffffff; |
|
exports.INT_MIN = -1<<(INT_BITS-1); |
|
|
|
//Returns -1, 0, +1 depending on sign of x |
|
exports.sign = function(v) { |
|
return (v > 0) - (v < 0); |
|
} |
|
|
|
//Computes absolute value of integer |
|
exports.abs = function(v) { |
|
var mask = v >> (INT_BITS-1); |
|
return (v ^ mask) - mask; |
|
} |
|
|
|
//Computes minimum of integers x and y |
|
exports.min = function(x, y) { |
|
return y ^ ((x ^ y) & -(x < y)); |
|
} |
|
|
|
//Computes maximum of integers x and y |
|
exports.max = function(x, y) { |
|
return x ^ ((x ^ y) & -(x < y)); |
|
} |
|
|
|
//Checks if a number is a power of two |
|
exports.isPow2 = function(v) { |
|
return !(v & (v-1)) && (!!v); |
|
} |
|
|
|
//Computes log base 2 of v |
|
exports.log2 = function(v) { |
|
var r, shift; |
|
r = (v > 0xFFFF) << 4; v >>>= r; |
|
shift = (v > 0xFF ) << 3; v >>>= shift; r |= shift; |
|
shift = (v > 0xF ) << 2; v >>>= shift; r |= shift; |
|
shift = (v > 0x3 ) << 1; v >>>= shift; r |= shift; |
|
return r | (v >> 1); |
|
} |
|
|
|
//Computes log base 10 of v |
|
exports.log10 = function(v) { |
|
return (v >= 1000000000) ? 9 : (v >= 100000000) ? 8 : (v >= 10000000) ? 7 : |
|
(v >= 1000000) ? 6 : (v >= 100000) ? 5 : (v >= 10000) ? 4 : |
|
(v >= 1000) ? 3 : (v >= 100) ? 2 : (v >= 10) ? 1 : 0; |
|
} |
|
|
|
//Counts number of bits |
|
exports.popCount = function(v) { |
|
v = v - ((v >>> 1) & 0x55555555); |
|
v = (v & 0x33333333) + ((v >>> 2) & 0x33333333); |
|
return ((v + (v >>> 4) & 0xF0F0F0F) * 0x1010101) >>> 24; |
|
} |
|
|
|
//Counts number of trailing zeros |
|
function countTrailingZeros(v) { |
|
var c = 32; |
|
v &= -v; |
|
if (v) c--; |
|
if (v & 0x0000FFFF) c -= 16; |
|
if (v & 0x00FF00FF) c -= 8; |
|
if (v & 0x0F0F0F0F) c -= 4; |
|
if (v & 0x33333333) c -= 2; |
|
if (v & 0x55555555) c -= 1; |
|
return c; |
|
} |
|
exports.countTrailingZeros = countTrailingZeros; |
|
|
|
//Rounds to next power of 2 |
|
exports.nextPow2 = function(v) { |
|
v += v === 0; |
|
--v; |
|
v |= v >>> 1; |
|
v |= v >>> 2; |
|
v |= v >>> 4; |
|
v |= v >>> 8; |
|
v |= v >>> 16; |
|
return v + 1; |
|
} |
|
|
|
//Rounds down to previous power of 2 |
|
exports.prevPow2 = function(v) { |
|
v |= v >>> 1; |
|
v |= v >>> 2; |
|
v |= v >>> 4; |
|
v |= v >>> 8; |
|
v |= v >>> 16; |
|
return v - (v>>>1); |
|
} |
|
|
|
//Computes parity of word |
|
exports.parity = function(v) { |
|
v ^= v >>> 16; |
|
v ^= v >>> 8; |
|
v ^= v >>> 4; |
|
v &= 0xf; |
|
return (0x6996 >>> v) & 1; |
|
} |
|
|
|
var REVERSE_TABLE = new Array(256); |
|
|
|
(function(tab) { |
|
for(var i=0; i<256; ++i) { |
|
var v = i, r = i, s = 7; |
|
for (v >>>= 1; v; v >>>= 1) { |
|
r <<= 1; |
|
r |= v & 1; |
|
--s; |
|
} |
|
tab[i] = (r << s) & 0xff; |
|
} |
|
})(REVERSE_TABLE); |
|
|
|
//Reverse bits in a 32 bit word |
|
exports.reverse = function(v) { |
|
return (REVERSE_TABLE[ v & 0xff] << 24) | |
|
(REVERSE_TABLE[(v >>> 8) & 0xff] << 16) | |
|
(REVERSE_TABLE[(v >>> 16) & 0xff] << 8) | |
|
REVERSE_TABLE[(v >>> 24) & 0xff]; |
|
} |
|
|
|
//Interleave bits of 2 coordinates with 16 bits. Useful for fast quadtree codes |
|
exports.interleave2 = function(x, y) { |
|
x &= 0xFFFF; |
|
x = (x | (x << 8)) & 0x00FF00FF; |
|
x = (x | (x << 4)) & 0x0F0F0F0F; |
|
x = (x | (x << 2)) & 0x33333333; |
|
x = (x | (x << 1)) & 0x55555555; |
|
|
|
y &= 0xFFFF; |
|
y = (y | (y << 8)) & 0x00FF00FF; |
|
y = (y | (y << 4)) & 0x0F0F0F0F; |
|
y = (y | (y << 2)) & 0x33333333; |
|
y = (y | (y << 1)) & 0x55555555; |
|
|
|
return x | (y << 1); |
|
} |
|
|
|
//Extracts the nth interleaved component |
|
exports.deinterleave2 = function(v, n) { |
|
v = (v >>> n) & 0x55555555; |
|
v = (v | (v >>> 1)) & 0x33333333; |
|
v = (v | (v >>> 2)) & 0x0F0F0F0F; |
|
v = (v | (v >>> 4)) & 0x00FF00FF; |
|
v = (v | (v >>> 16)) & 0x000FFFF; |
|
return (v << 16) >> 16; |
|
} |
|
|
|
|
|
//Interleave bits of 3 coordinates, each with 10 bits. Useful for fast octree codes |
|
exports.interleave3 = function(x, y, z) { |
|
x &= 0x3FF; |
|
x = (x | (x<<16)) & 4278190335; |
|
x = (x | (x<<8)) & 251719695; |
|
x = (x | (x<<4)) & 3272356035; |
|
x = (x | (x<<2)) & 1227133513; |
|
|
|
y &= 0x3FF; |
|
y = (y | (y<<16)) & 4278190335; |
|
y = (y | (y<<8)) & 251719695; |
|
y = (y | (y<<4)) & 3272356035; |
|
y = (y | (y<<2)) & 1227133513; |
|
x |= (y << 1); |
|
|
|
z &= 0x3FF; |
|
z = (z | (z<<16)) & 4278190335; |
|
z = (z | (z<<8)) & 251719695; |
|
z = (z | (z<<4)) & 3272356035; |
|
z = (z | (z<<2)) & 1227133513; |
|
|
|
return x | (z << 2); |
|
} |
|
|
|
//Extracts nth interleaved component of a 3-tuple |
|
exports.deinterleave3 = function(v, n) { |
|
v = (v >>> n) & 1227133513; |
|
v = (v | (v>>>2)) & 3272356035; |
|
v = (v | (v>>>4)) & 251719695; |
|
v = (v | (v>>>8)) & 4278190335; |
|
v = (v | (v>>>16)) & 0x3FF; |
|
return (v<<22)>>22; |
|
} |
|
|
|
//Computes next combination in colexicographic order (this is mistakenly called nextPermutation on the bit twiddling hacks page) |
|
exports.nextCombination = function(v) { |
|
var t = v | (v - 1); |
|
return (t + 1) | (((~t & -~t) - 1) >>> (countTrailingZeros(v) + 1)); |
|
} |
|
|
|
|
|
},{}],37:[function(require,module,exports){ |
|
(function (module, exports) { |
|
'use strict'; |
|
|
|
// Utils |
|
function assert (val, msg) { |
|
if (!val) throw new Error(msg || 'Assertion failed'); |
|
} |
|
|
|
// Could use `inherits` module, but don't want to move from single file |
|
// architecture yet. |
|
function inherits (ctor, superCtor) { |
|
ctor.super_ = superCtor; |
|
var TempCtor = function () {}; |
|
TempCtor.prototype = superCtor.prototype; |
|
ctor.prototype = new TempCtor(); |
|
ctor.prototype.constructor = ctor; |
|
} |
|
|
|
// BN |
|
|
|
function BN (number, base, endian) { |
|
if (BN.isBN(number)) { |
|
return number; |
|
} |
|
|
|
this.negative = 0; |
|
this.words = null; |
|
this.length = 0; |
|
|
|
// Reduction context |
|
this.red = null; |
|
|
|
if (number !== null) { |
|
if (base === 'le' || base === 'be') { |
|
endian = base; |
|
base = 10; |
|
} |
|
|
|
this._init(number || 0, base || 10, endian || 'be'); |
|
} |
|
} |
|
if (typeof module === 'object') { |
|
module.exports = BN; |
|
} else { |
|
exports.BN = BN; |
|
} |
|
|
|
BN.BN = BN; |
|
BN.wordSize = 26; |
|
|
|
var Buffer; |
|
try { |
|
Buffer = require('buffer').Buffer; |
|
} catch (e) { |
|
} |
|
|
|
BN.isBN = function isBN (num) { |
|
if (num instanceof BN) { |
|
return true; |
|
} |
|
|
|
return num !== null && typeof num === 'object' && |
|
num.constructor.wordSize === BN.wordSize && Array.isArray(num.words); |
|
}; |
|
|
|
BN.max = function max (left, right) { |
|
if (left.cmp(right) > 0) return left; |
|
return right; |
|
}; |
|
|
|
BN.min = function min (left, right) { |
|
if (left.cmp(right) < 0) return left; |
|
return right; |
|
}; |
|
|
|
BN.prototype._init = function init (number, base, endian) { |
|
if (typeof number === 'number') { |
|
return this._initNumber(number, base, endian); |
|
} |
|
|
|
if (typeof number === 'object') { |
|
return this._initArray(number, base, endian); |
|
} |
|
|
|
if (base === 'hex') { |
|
base = 16; |
|
} |
|
assert(base === (base | 0) && base >= 2 && base <= 36); |
|
|
|
number = number.toString().replace(/\s+/g, ''); |
|
var start = 0; |
|
if (number[0] === '-') { |
|
start++; |
|
} |
|
|
|
if (base === 16) { |
|
this._parseHex(number, start); |
|
} else { |
|
this._parseBase(number, base, start); |
|
} |
|
|
|
if (number[0] === '-') { |
|
this.negative = 1; |
|
} |
|
|
|
this.strip(); |
|
|
|
if (endian !== 'le') return; |
|
|
|
this._initArray(this.toArray(), base, endian); |
|
}; |
|
|
|
BN.prototype._initNumber = function _initNumber (number, base, endian) { |
|
if (number < 0) { |
|
this.negative = 1; |
|
number = -number; |
|
} |
|
if (number < 0x4000000) { |
|
this.words = [ number & 0x3ffffff ]; |
|
this.length = 1; |
|
} else if (number < 0x10000000000000) { |
|
this.words = [ |
|
number & 0x3ffffff, |
|
(number / 0x4000000) & 0x3ffffff |
|
]; |
|
this.length = 2; |
|
} else { |
|
assert(number < 0x20000000000000); // 2 ^ 53 (unsafe) |
|
this.words = [ |
|
number & 0x3ffffff, |
|
(number / 0x4000000) & 0x3ffffff, |
|
1 |
|
]; |
|
this.length = 3; |
|
} |
|
|
|
if (endian !== 'le') return; |
|
|
|
// Reverse the bytes |
|
this._initArray(this.toArray(), base, endian); |
|
}; |
|
|
|
BN.prototype._initArray = function _initArray (number, base, endian) { |
|
// Perhaps a Uint8Array |
|
assert(typeof number.length === 'number'); |
|
if (number.length <= 0) { |
|
this.words = [ 0 ]; |
|
this.length = 1; |
|
return this; |
|
} |
|
|
|
this.length = Math.ceil(number.length / 3); |
|
this.words = new Array(this.length); |
|
for (var i = 0; i < this.length; i++) { |
|
this.words[i] = 0; |
|
} |
|
|
|
var j, w; |
|
var off = 0; |
|
if (endian === 'be') { |
|
for (i = number.length - 1, j = 0; i >= 0; i -= 3) { |
|
w = number[i] | (number[i - 1] << 8) | (number[i - 2] << 16); |
|
this.words[j] |= (w << off) & 0x3ffffff; |
|
this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff; |
|
off += 24; |
|
if (off >= 26) { |
|
off -= 26; |
|
j++; |
|
} |
|
} |
|
} else if (endian === 'le') { |
|
for (i = 0, j = 0; i < number.length; i += 3) { |
|
w = number[i] | (number[i + 1] << 8) | (number[i + 2] << 16); |
|
this.words[j] |= (w << off) & 0x3ffffff; |
|
this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff; |
|
off += 24; |
|
if (off >= 26) { |
|
off -= 26; |
|
j++; |
|
} |
|
} |
|
} |
|
return this.strip(); |
|
}; |
|
|
|
function parseHex (str, start, end) { |
|
var r = 0; |
|
var len = Math.min(str.length, end); |
|
for (var i = start; i < len; i++) { |
|
var c = str.charCodeAt(i) - 48; |
|
|
|
r <<= 4; |
|
|
|
// 'a' - 'f' |
|
if (c >= 49 && c <= 54) { |
|
r |= c - 49 + 0xa; |
|
|
|
// 'A' - 'F' |
|
} else if (c >= 17 && c <= 22) { |
|
r |= c - 17 + 0xa; |
|
|
|
// '0' - '9' |
|
} else { |
|
r |= c & 0xf; |
|
} |
|
} |
|
return r; |
|
} |
|
|
|
BN.prototype._parseHex = function _parseHex (number, start) { |
|
// Create possibly bigger array to ensure that it fits the number |
|
this.length = Math.ceil((number.length - start) / 6); |
|
this.words = new Array(this.length); |
|
for (var i = 0; i < this.length; i++) { |
|
this.words[i] = 0; |
|
} |
|
|
|
var j, w; |
|
// Scan 24-bit chunks and add them to the number |
|
var off = 0; |
|
for (i = number.length - 6, j = 0; i >= start; i -= 6) { |
|
w = parseHex(number, i, i + 6); |
|
this.words[j] |= (w << off) & 0x3ffffff; |
|
// NOTE: `0x3fffff` is intentional here, 26bits max shift + 24bit hex limb |
|
this.words[j + 1] |= w >>> (26 - off) & 0x3fffff; |
|
off += 24; |
|
if (off >= 26) { |
|
off -= 26; |
|
j++; |
|
} |
|
} |
|
if (i + 6 !== start) { |
|
w = parseHex(number, start, i + 6); |
|
this.words[j] |= (w << off) & 0x3ffffff; |
|
this.words[j + 1] |= w >>> (26 - off) & 0x3fffff; |
|
} |
|
this.strip(); |
|
}; |
|
|
|
function parseBase (str, start, end, mul) { |
|
var r = 0; |
|
var len = Math.min(str.length, end); |
|
for (var i = start; i < len; i++) { |
|
var c = str.charCodeAt(i) - 48; |
|
|
|
r *= mul; |
|
|
|
// 'a' |
|
if (c >= 49) { |
|
r += c - 49 + 0xa; |
|
|
|
// 'A' |
|
} else if (c >= 17) { |
|
r += c - 17 + 0xa; |
|
|
|
// '0' - '9' |
|
} else { |
|
r += c; |
|
} |
|
} |
|
return r; |
|
} |
|
|
|
BN.prototype._parseBase = function _parseBase (number, base, start) { |
|
// Initialize as zero |
|
this.words = [ 0 ]; |
|
this.length = 1; |
|
|
|
// Find length of limb in base |
|
for (var limbLen = 0, limbPow = 1; limbPow <= 0x3ffffff; limbPow *= base) { |
|
limbLen++; |
|
} |
|
limbLen--; |
|
limbPow = (limbPow / base) | 0; |
|
|
|
var total = number.length - start; |
|
var mod = total % limbLen; |
|
var end = Math.min(total, total - mod) + start; |
|
|
|
var word = 0; |
|
for (var i = start; i < end; i += limbLen) { |
|
word = parseBase(number, i, i + limbLen, base); |
|
|
|
this.imuln(limbPow); |
|
if (this.words[0] + word < 0x4000000) { |
|
this.words[0] += word; |
|
} else { |
|
this._iaddn(word); |
|
} |
|
} |
|
|
|
if (mod !== 0) { |
|
var pow = 1; |
|
word = parseBase(number, i, number.length, base); |
|
|
|
for (i = 0; i < mod; i++) { |
|
pow *= base; |
|
} |
|
|
|
this.imuln(pow); |
|
if (this.words[0] + word < 0x4000000) { |
|
this.words[0] += word; |
|
} else { |
|
this._iaddn(word); |
|
} |
|
} |
|
}; |
|
|
|
BN.prototype.copy = function copy (dest) { |
|
dest.words = new Array(this.length); |
|
for (var i = 0; i < this.length; i++) { |
|
dest.words[i] = this.words[i]; |
|
} |
|
dest.length = this.length; |
|
dest.negative = this.negative; |
|
dest.red = this.red; |
|
}; |
|
|
|
BN.prototype.clone = function clone () { |
|
var r = new BN(null); |
|
this.copy(r); |
|
return r; |
|
}; |
|
|
|
BN.prototype._expand = function _expand (size) { |
|
while (this.length < size) { |
|
this.words[this.length++] = 0; |
|
} |
|
return this; |
|
}; |
|
|
|
// Remove leading `0` from `this` |
|
BN.prototype.strip = function strip () { |
|
while (this.length > 1 && this.words[this.length - 1] === 0) { |
|
this.length--; |
|
} |
|
return this._normSign(); |
|
}; |
|
|
|
BN.prototype._normSign = function _normSign () { |
|
// -0 = 0 |
|
if (this.length === 1 && this.words[0] === 0) { |
|
this.negative = 0; |
|
} |
|
return this; |
|
}; |
|
|
|
BN.prototype.inspect = function inspect () { |
|
return (this.red ? '<BN-R: ' : '<BN: ') + this.toString(16) + '>'; |
|
}; |
|
|
|
/* |
|
|
|
var zeros = []; |
|
var groupSizes = []; |
|
var groupBases = []; |
|
|
|
var s = ''; |
|
var i = -1; |
|
while (++i < BN.wordSize) { |
|
zeros[i] = s; |
|
s += '0'; |
|
} |
|
groupSizes[0] = 0; |
|
groupSizes[1] = 0; |
|
groupBases[0] = 0; |
|
groupBases[1] = 0; |
|
var base = 2 - 1; |
|
while (++base < 36 + 1) { |
|
var groupSize = 0; |
|
var groupBase = 1; |
|
while (groupBase < (1 << BN.wordSize) / base) { |
|
groupBase *= base; |
|
groupSize += 1; |
|
} |
|
groupSizes[base] = groupSize; |
|
groupBases[base] = groupBase; |
|
} |
|
|
|
*/ |
|
|
|
var zeros = [ |
|
'', |
|
'0', |
|
'00', |
|
'000', |
|
'0000', |
|
'00000', |
|
'000000', |
|
'0000000', |
|
'00000000', |
|
'000000000', |
|
'0000000000', |
|
'00000000000', |
|
'000000000000', |
|
'0000000000000', |
|
'00000000000000', |
|
'000000000000000', |
|
'0000000000000000', |
|
'00000000000000000', |
|
'000000000000000000', |
|
'0000000000000000000', |
|
'00000000000000000000', |
|
'000000000000000000000', |
|
'0000000000000000000000', |
|
'00000000000000000000000', |
|
'000000000000000000000000', |
|
'0000000000000000000000000' |
|
]; |
|
|
|
var groupSizes = [ |
|
0, 0, |
|
25, 16, 12, 11, 10, 9, 8, |
|
8, 7, 7, 7, 7, 6, 6, |
|
6, 6, 6, 6, 6, 5, 5, |
|
5, 5, 5, 5, 5, 5, 5, |
|
5, 5, 5, 5, 5, 5, 5 |
|
]; |
|
|
|
var groupBases = [ |
|
0, 0, |
|
33554432, 43046721, 16777216, 48828125, 60466176, 40353607, 16777216, |
|
43046721, 10000000, 19487171, 35831808, 62748517, 7529536, 11390625, |
|
16777216, 24137569, 34012224, 47045881, 64000000, 4084101, 5153632, |
|
6436343, 7962624, 9765625, 11881376, 14348907, 17210368, 20511149, |
|
24300000, 28629151, 33554432, 39135393, 45435424, 52521875, 60466176 |
|
]; |
|
|
|
BN.prototype.toString = function toString (base, padding) { |
|
base = base || 10; |
|
padding = padding | 0 || 1; |
|
|
|
var out; |
|
if (base === 16 || base === 'hex') { |
|
out = ''; |
|
var off = 0; |
|
var carry = 0; |
|
for (var i = 0; i < this.length; i++) { |
|
var w = this.words[i]; |
|
var word = (((w << off) | carry) & 0xffffff).toString(16); |
|
carry = (w >>> (24 - off)) & 0xffffff; |
|
if (carry !== 0 || i !== this.length - 1) { |
|
out = zeros[6 - word.length] + word + out; |
|
} else { |
|
out = word + out; |
|
} |
|
off += 2; |
|
if (off >= 26) { |
|
off -= 26; |
|
i--; |
|
} |
|
} |
|
if (carry !== 0) { |
|
out = carry.toString(16) + out; |
|
} |
|
while (out.length % padding !== 0) { |
|
out = '0' + out; |
|
} |
|
if (this.negative !== 0) { |
|
out = '-' + out; |
|
} |
|
return out; |
|
} |
|
|
|
if (base === (base | 0) && base >= 2 && base <= 36) { |
|
// var groupSize = Math.floor(BN.wordSize * Math.LN2 / Math.log(base)); |
|
var groupSize = groupSizes[base]; |
|
// var groupBase = Math.pow(base, groupSize); |
|
var groupBase = groupBases[base]; |
|
out = ''; |
|
var c = this.clone(); |
|
c.negative = 0; |
|
while (!c.isZero()) { |
|
var r = c.modn(groupBase).toString(base); |
|
c = c.idivn(groupBase); |
|
|
|
if (!c.isZero()) { |
|
out = zeros[groupSize - r.length] + r + out; |
|
} else { |
|
out = r + out; |
|
} |
|
} |
|
if (this.isZero()) { |
|
out = '0' + out; |
|
} |
|
while (out.length % padding !== 0) { |
|
out = '0' + out; |
|
} |
|
if (this.negative !== 0) { |
|
out = '-' + out; |
|
} |
|
return out; |
|
} |
|
|
|
assert(false, 'Base should be between 2 and 36'); |
|
}; |
|
|
|
BN.prototype.toNumber = function toNumber () { |
|
var ret = this.words[0]; |
|
if (this.length === 2) { |
|
ret += this.words[1] * 0x4000000; |
|
} else if (this.length === 3 && this.words[2] === 0x01) { |
|
// NOTE: at this stage it is known that the top bit is set |
|
ret += 0x10000000000000 + (this.words[1] * 0x4000000); |
|
} else if (this.length > 2) { |
|
assert(false, 'Number can only safely store up to 53 bits'); |
|
} |
|
return (this.negative !== 0) ? -ret : ret; |
|
}; |
|
|
|
BN.prototype.toJSON = function toJSON () { |
|
return this.toString(16); |
|
}; |
|
|
|
BN.prototype.toBuffer = function toBuffer (endian, length) { |
|
assert(typeof Buffer !== 'undefined'); |
|
return this.toArrayLike(Buffer, endian, length); |
|
}; |
|
|
|
BN.prototype.toArray = function toArray (endian, length) { |
|
return this.toArrayLike(Array, endian, length); |
|
}; |
|
|
|
BN.prototype.toArrayLike = function toArrayLike (ArrayType, endian, length) { |
|
var byteLength = this.byteLength(); |
|
var reqLength = length || Math.max(1, byteLength); |
|
assert(byteLength <= reqLength, 'byte array longer than desired length'); |
|
assert(reqLength > 0, 'Requested array length <= 0'); |
|
|
|
this.strip(); |
|
var littleEndian = endian === 'le'; |
|
var res = new ArrayType(reqLength); |
|
|
|
var b, i; |
|
var q = this.clone(); |
|
if (!littleEndian) { |
|
// Assume big-endian |
|
for (i = 0; i < reqLength - byteLength; i++) { |
|
res[i] = 0; |
|
} |
|
|
|
for (i = 0; !q.isZero(); i++) { |
|
b = q.andln(0xff); |
|
q.iushrn(8); |
|
|
|
res[reqLength - i - 1] = b; |
|
} |
|
} else { |
|
for (i = 0; !q.isZero(); i++) { |
|
b = q.andln(0xff); |
|
q.iushrn(8); |
|
|
|
res[i] = b; |
|
} |
|
|
|
for (; i < reqLength; i++) { |
|
res[i] = 0; |
|
} |
|
} |
|
|
|
return res; |
|
}; |
|
|
|
if (Math.clz32) { |
|
BN.prototype._countBits = function _countBits (w) { |
|
return 32 - Math.clz32(w); |
|
}; |
|
} else { |
|
BN.prototype._countBits = function _countBits (w) { |
|
var t = w; |
|
var r = 0; |
|
if (t >= 0x1000) { |
|
r += 13; |
|
t >>>= 13; |
|
} |
|
if (t >= 0x40) { |
|
r += 7; |
|
t >>>= 7; |
|
} |
|
if (t >= 0x8) { |
|
r += 4; |
|
t >>>= 4; |
|
} |
|
if (t >= 0x02) { |
|
r += 2; |
|
t >>>= 2; |
|
} |
|
return r + t; |
|
}; |
|
} |
|
|
|
BN.prototype._zeroBits = function _zeroBits (w) { |
|
// Short-cut |
|
if (w === 0) return 26; |
|
|
|
var t = w; |
|
var r = 0; |
|
if ((t & 0x1fff) === 0) { |
|
r += 13; |
|
t >>>= 13; |
|
} |
|
if ((t & 0x7f) === 0) { |
|
r += 7; |
|
t >>>= 7; |
|
} |
|
if ((t & 0xf) === 0) { |
|
r += 4; |
|
t >>>= 4; |
|
} |
|
if ((t & 0x3) === 0) { |
|
r += 2; |
|
t >>>= 2; |
|
} |
|
if ((t & 0x1) === 0) { |
|
r++; |
|
} |
|
return r; |
|
}; |
|
|
|
// Return number of used bits in a BN |
|
BN.prototype.bitLength = function bitLength () { |
|
var w = this.words[this.length - 1]; |
|
var hi = this._countBits(w); |
|
return (this.length - 1) * 26 + hi; |
|
}; |
|
|
|
function toBitArray (num) { |
|
var w = new Array(num.bitLength()); |
|
|
|
for (var bit = 0; bit < w.length; bit++) { |
|
var off = (bit / 26) | 0; |
|
var wbit = bit % 26; |
|
|
|
w[bit] = (num.words[off] & (1 << wbit)) >>> wbit; |
|
} |
|
|
|
return w; |
|
} |
|
|
|
// Number of trailing zero bits |
|
BN.prototype.zeroBits = function zeroBits () { |
|
if (this.isZero()) return 0; |
|
|
|
var r = 0; |
|
for (var i = 0; i < this.length; i++) { |
|
var b = this._zeroBits(this.words[i]); |
|
r += b; |
|
if (b !== 26) break; |
|
} |
|
return r; |
|
}; |
|
|
|
BN.prototype.byteLength = function byteLength () { |
|
return Math.ceil(this.bitLength() / 8); |
|
}; |
|
|
|
BN.prototype.toTwos = function toTwos (width) { |
|
if (this.negative !== 0) { |
|
return this.abs().inotn(width).iaddn(1); |
|
} |
|
return this.clone(); |
|
}; |
|
|
|
BN.prototype.fromTwos = function fromTwos (width) { |
|
if (this.testn(width - 1)) { |
|
return this.notn(width).iaddn(1).ineg(); |
|
} |
|
return this.clone(); |
|
}; |
|
|
|
BN.prototype.isNeg = function isNeg () { |
|
return this.negative !== 0; |
|
}; |
|
|
|
// Return negative clone of `this` |
|
BN.prototype.neg = function neg () { |
|
return this.clone().ineg(); |
|
}; |
|
|
|
BN.prototype.ineg = function ineg () { |
|
if (!this.isZero()) { |
|
this.negative ^= 1; |
|
} |
|
|
|
return this; |
|
}; |
|
|
|
// Or `num` with `this` in-place |
|
BN.prototype.iuor = function iuor (num) { |
|
while (this.length < num.length) { |
|
this.words[this.length++] = 0; |
|
} |
|
|
|
for (var i = 0; i < num.length; i++) { |
|
this.words[i] = this.words[i] | num.words[i]; |
|
} |
|
|
|
return this.strip(); |
|
}; |
|
|
|
BN.prototype.ior = function ior (num) { |
|
assert((this.negative | num.negative) === 0); |
|
return this.iuor(num); |
|
}; |
|
|
|
// Or `num` with `this` |
|
BN.prototype.or = function or (num) { |
|
if (this.length > num.length) return this.clone().ior(num); |
|
return num.clone().ior(this); |
|
}; |
|
|
|
BN.prototype.uor = function uor (num) { |
|
if (this.length > num.length) return this.clone().iuor(num); |
|
return num.clone().iuor(this); |
|
}; |
|
|
|
// And `num` with `this` in-place |
|
BN.prototype.iuand = function iuand (num) { |
|
// b = min-length(num, this) |
|
var b; |
|
if (this.length > num.length) { |
|
b = num; |
|
} else { |
|
b = this; |
|
} |
|
|
|
for (var i = 0; i < b.length; i++) { |
|
this.words[i] = this.words[i] & num.words[i]; |
|
} |
|
|
|
this.length = b.length; |
|
|
|
return this.strip(); |
|
}; |
|
|
|
BN.prototype.iand = function iand (num) { |
|
assert((this.negative | num.negative) === 0); |
|
return this.iuand(num); |
|
}; |
|
|
|
// And `num` with `this` |
|
BN.prototype.and = function and (num) { |
|
if (this.length > num.length) return this.clone().iand(num); |
|
return num.clone().iand(this); |
|
}; |
|
|
|
BN.prototype.uand = function uand (num) { |
|
if (this.length > num.length) return this.clone().iuand(num); |
|
return num.clone().iuand(this); |
|
}; |
|
|
|
// Xor `num` with `this` in-place |
|
BN.prototype.iuxor = function iuxor (num) { |
|
// a.length > b.length |
|
var a; |
|
var b; |
|
if (this.length > num.length) { |
|
a = this; |
|
b = num; |
|
} else { |
|
a = num; |
|
b = this; |
|
} |
|
|
|
for (var i = 0; i < b.length; i++) { |
|
this.words[i] = a.words[i] ^ b.words[i]; |
|
} |
|
|
|
if (this !== a) { |
|
for (; i < a.length; i++) { |
|
this.words[i] = a.words[i]; |
|
} |
|
} |
|
|
|
this.length = a.length; |
|
|
|
return this.strip(); |
|
}; |
|
|
|
BN.prototype.ixor = function ixor (num) { |
|
assert((this.negative | num.negative) === 0); |
|
return this.iuxor(num); |
|
}; |
|
|
|
// Xor `num` with `this` |
|
BN.prototype.xor = function xor (num) { |
|
if (this.length > num.length) return this.clone().ixor(num); |
|
return num.clone().ixor(this); |
|
}; |
|
|
|
BN.prototype.uxor = function uxor (num) { |
|
if (this.length > num.length) return this.clone().iuxor(num); |
|
return num.clone().iuxor(this); |
|
}; |
|
|
|
// Not ``this`` with ``width`` bitwidth |
|
BN.prototype.inotn = function inotn (width) { |
|
assert(typeof width === 'number' && width >= 0); |
|
|
|
var bytesNeeded = Math.ceil(width / 26) | 0; |
|
var bitsLeft = width % 26; |
|
|
|
// Extend the buffer with leading zeroes |
|
this._expand(bytesNeeded); |
|
|
|
if (bitsLeft > 0) { |
|
bytesNeeded--; |
|
} |
|
|
|
// Handle complete words |
|
for (var i = 0; i < bytesNeeded; i++) { |
|
this.words[i] = ~this.words[i] & 0x3ffffff; |
|
} |
|
|
|
// Handle the residue |
|
if (bitsLeft > 0) { |
|
this.words[i] = ~this.words[i] & (0x3ffffff >> (26 - bitsLeft)); |
|
} |
|
|
|
// And remove leading zeroes |
|
return this.strip(); |
|
}; |
|
|
|
BN.prototype.notn = function notn (width) { |
|
return this.clone().inotn(width); |
|
}; |
|
|
|
// Set `bit` of `this` |
|
BN.prototype.setn = function setn (bit, val) { |
|
assert(typeof bit === 'number' && bit >= 0); |
|
|
|
var off = (bit / 26) | 0; |
|
var wbit = bit % 26; |
|
|
|
this._expand(off + 1); |
|
|
|
if (val) { |
|
this.words[off] = this.words[off] | (1 << wbit); |
|
} else { |
|
this.words[off] = this.words[off] & ~(1 << wbit); |
|
} |
|
|
|
return this.strip(); |
|
}; |
|
|
|
// Add `num` to `this` in-place |
|
BN.prototype.iadd = function iadd (num) { |
|
var r; |
|
|
|
// negative + positive |
|
if (this.negative !== 0 && num.negative === 0) { |
|
this.negative = 0; |
|
r = this.isub(num); |
|
this.negative ^= 1; |
|
return this._normSign(); |
|
|
|
// positive + negative |
|
} else if (this.negative === 0 && num.negative !== 0) { |
|
num.negative = 0; |
|
r = this.isub(num); |
|
num.negative = 1; |
|
return r._normSign(); |
|
} |
|
|
|
// a.length > b.length |
|
var a, b; |
|
if (this.length > num.length) { |
|
a = this; |
|
b = num; |
|
} else { |
|
a = num; |
|
b = this; |
|
} |
|
|
|
var carry = 0; |
|
for (var i = 0; i < b.length; i++) { |
|
r = (a.words[i] | 0) + (b.words[i] | 0) + carry; |
|
this.words[i] = r & 0x3ffffff; |
|
carry = r >>> 26; |
|
} |
|
for (; carry !== 0 && i < a.length; i++) { |
|
r = (a.words[i] | 0) + carry; |
|
this.words[i] = r & 0x3ffffff; |
|
carry = r >>> 26; |
|
} |
|
|
|
this.length = a.length; |
|
if (carry !== 0) { |
|
this.words[this.length] = carry; |
|
this.length++; |
|
// Copy the rest of the words |
|
} else if (a !== this) { |
|
for (; i < a.length; i++) { |
|
this.words[i] = a.words[i]; |
|
} |
|
} |
|
|
|
return this; |
|
}; |
|
|
|
// Add `num` to `this` |
|
BN.prototype.add = function add (num) { |
|
var res; |
|
if (num.negative !== 0 && this.negative === 0) { |
|
num.negative = 0; |
|
res = this.sub(num); |
|
num.negative ^= 1; |
|
return res; |
|
} else if (num.negative === 0 && this.negative !== 0) { |
|
this.negative = 0; |
|
res = num.sub(this); |
|
this.negative = 1; |
|
return res; |
|
} |
|
|
|
if (this.length > num.length) return this.clone().iadd(num); |
|
|
|
return num.clone().iadd(this); |
|
}; |
|
|
|
// Subtract `num` from `this` in-place |
|
BN.prototype.isub = function isub (num) { |
|
// this - (-num) = this + num |
|
if (num.negative !== 0) { |
|
num.negative = 0; |
|
var r = this.iadd(num); |
|
num.negative = 1; |
|
return r._normSign(); |
|
|
|
// -this - num = -(this + num) |
|
} else if (this.negative !== 0) { |
|
this.negative = 0; |
|
this.iadd(num); |
|
this.negative = 1; |
|
return this._normSign(); |
|
} |
|
|
|
// At this point both numbers are positive |
|
var cmp = this.cmp(num); |
|
|
|
// Optimization - zeroify |
|
if (cmp === 0) { |
|
this.negative = 0; |
|
this.length = 1; |
|
this.words[0] = 0; |
|
return this; |
|
} |
|
|
|
// a > b |
|
var a, b; |
|
if (cmp > 0) { |
|
a = this; |
|
b = num; |
|
} else { |
|
a = num; |
|
b = this; |
|
} |
|
|
|
var carry = 0; |
|
for (var i = 0; i < b.length; i++) { |
|
r = (a.words[i] | 0) - (b.words[i] | 0) + carry; |
|
carry = r >> 26; |
|
this.words[i] = r & 0x3ffffff; |
|
} |
|
for (; carry !== 0 && i < a.length; i++) { |
|
r = (a.words[i] | 0) + carry; |
|
carry = r >> 26; |
|
this.words[i] = r & 0x3ffffff; |
|
} |
|
|
|
// Copy rest of the words |
|
if (carry === 0 && i < a.length && a !== this) { |
|
for (; i < a.length; i++) { |
|
this.words[i] = a.words[i]; |
|
} |
|
} |
|
|
|
this.length = Math.max(this.length, i); |
|
|
|
if (a !== this) { |
|
this.negative = 1; |
|
} |
|
|
|
return this.strip(); |
|
}; |
|
|
|
// Subtract `num` from `this` |
|
BN.prototype.sub = function sub (num) { |
|
return this.clone().isub(num); |
|
}; |
|
|
|
function smallMulTo (self, num, out) { |
|
out.negative = num.negative ^ self.negative; |
|
var len = (self.length + num.length) | 0; |
|
out.length = len; |
|
len = (len - 1) | 0; |
|
|
|
// Peel one iteration (compiler can't do it, because of code complexity) |
|
var a = self.words[0] | 0; |
|
var b = num.words[0] | 0; |
|
var r = a * b; |
|
|
|
var lo = r & 0x3ffffff; |
|
var carry = (r / 0x4000000) | 0; |
|
out.words[0] = lo; |
|
|
|
for (var k = 1; k < len; k++) { |
|
// Sum all words with the same `i + j = k` and accumulate `ncarry`, |
|
// note that ncarry could be >= 0x3ffffff |
|
var ncarry = carry >>> 26; |
|
var rword = carry & 0x3ffffff; |
|
var maxJ = Math.min(k, num.length - 1); |
|
for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) { |
|
var i = (k - j) | 0; |
|
a = self.words[i] | 0; |
|
b = num.words[j] | 0; |
|
r = a * b + rword; |
|
ncarry += (r / 0x4000000) | 0; |
|
rword = r & 0x3ffffff; |
|
} |
|
out.words[k] = rword | 0; |
|
carry = ncarry | 0; |
|
} |
|
if (carry !== 0) { |
|
out.words[k] = carry | 0; |
|
} else { |
|
out.length--; |
|
} |
|
|
|
return out.strip(); |
|
} |
|
|
|
// TODO(indutny): it may be reasonable to omit it for users who don't need |
|
// to work with 256-bit numbers, otherwise it gives 20% improvement for 256-bit |
|
// multiplication (like elliptic secp256k1). |
|
var comb10MulTo = function comb10MulTo (self, num, out) { |
|
var a = self.words; |
|
var b = num.words; |
|
var o = out.words; |
|
var c = 0; |
|
var lo; |
|
var mid; |
|
var hi; |
|
var a0 = a[0] | 0; |
|
var al0 = a0 & 0x1fff; |
|
var ah0 = a0 >>> 13; |
|
var a1 = a[1] | 0; |
|
var al1 = a1 & 0x1fff; |
|
var ah1 = a1 >>> 13; |
|
var a2 = a[2] | 0; |
|
var al2 = a2 & 0x1fff; |
|
var ah2 = a2 >>> 13; |
|
var a3 = a[3] | 0; |
|
var al3 = a3 & 0x1fff; |
|
var ah3 = a3 >>> 13; |
|
var a4 = a[4] | 0; |
|
var al4 = a4 & 0x1fff; |
|
var ah4 = a4 >>> 13; |
|
var a5 = a[5] | 0; |
|
var al5 = a5 & 0x1fff; |
|
var ah5 = a5 >>> 13; |
|
var a6 = a[6] | 0; |
|
var al6 = a6 & 0x1fff; |
|
var ah6 = a6 >>> 13; |
|
var a7 = a[7] | 0; |
|
var al7 = a7 & 0x1fff; |
|
var ah7 = a7 >>> 13; |
|
var a8 = a[8] | 0; |
|
var al8 = a8 & 0x1fff; |
|
var ah8 = a8 >>> 13; |
|
var a9 = a[9] | 0; |
|
var al9 = a9 & 0x1fff; |
|
var ah9 = a9 >>> 13; |
|
var b0 = b[0] | 0; |
|
var bl0 = b0 & 0x1fff; |
|
var bh0 = b0 >>> 13; |
|
var b1 = b[1] | 0; |
|
var bl1 = b1 & 0x1fff; |
|
var bh1 = b1 >>> 13; |
|
var b2 = b[2] | 0; |
|
var bl2 = b2 & 0x1fff; |
|
var bh2 = b2 >>> 13; |
|
var b3 = b[3] | 0; |
|
var bl3 = b3 & 0x1fff; |
|
var bh3 = b3 >>> 13; |
|
var b4 = b[4] | 0; |
|
var bl4 = b4 & 0x1fff; |
|
var bh4 = b4 >>> 13; |
|
var b5 = b[5] | 0; |
|
var bl5 = b5 & 0x1fff; |
|
var bh5 = b5 >>> 13; |
|
var b6 = b[6] | 0; |
|
var bl6 = b6 & 0x1fff; |
|
var bh6 = b6 >>> 13; |
|
var b7 = b[7] | 0; |
|
var bl7 = b7 & 0x1fff; |
|
var bh7 = b7 >>> 13; |
|
var b8 = b[8] | 0; |
|
var bl8 = b8 & 0x1fff; |
|
var bh8 = b8 >>> 13; |
|
var b9 = b[9] | 0; |
|
var bl9 = b9 & 0x1fff; |
|
var bh9 = b9 >>> 13; |
|
|
|
out.negative = self.negative ^ num.negative; |
|
out.length = 19; |
|
/* k = 0 */ |
|
lo = Math.imul(al0, bl0); |
|
mid = Math.imul(al0, bh0); |
|
mid = (mid + Math.imul(ah0, bl0)) | 0; |
|
hi = Math.imul(ah0, bh0); |
|
var w0 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; |
|
c = (((hi + (mid >>> 13)) | 0) + (w0 >>> 26)) | 0; |
|
w0 &= 0x3ffffff; |
|
/* k = 1 */ |
|
lo = Math.imul(al1, bl0); |
|
mid = Math.imul(al1, bh0); |
|
mid = (mid + Math.imul(ah1, bl0)) | 0; |
|
hi = Math.imul(ah1, bh0); |
|
lo = (lo + Math.imul(al0, bl1)) | 0; |
|
mid = (mid + Math.imul(al0, bh1)) | 0; |
|
mid = (mid + Math.imul(ah0, bl1)) | 0; |
|
hi = (hi + Math.imul(ah0, bh1)) | 0; |
|
var w1 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; |
|
c = (((hi + (mid >>> 13)) | 0) + (w1 >>> 26)) | 0; |
|
w1 &= 0x3ffffff; |
|
/* k = 2 */ |
|
lo = Math.imul(al2, bl0); |
|
mid = Math.imul(al2, bh0); |
|
mid = (mid + Math.imul(ah2, bl0)) | 0; |
|
hi = Math.imul(ah2, bh0); |
|
lo = (lo + Math.imul(al1, bl1)) | 0; |
|
mid = (mid + Math.imul(al1, bh1)) | 0; |
|
mid = (mid + Math.imul(ah1, bl1)) | 0; |
|
hi = (hi + Math.imul(ah1, bh1)) | 0; |
|
lo = (lo + Math.imul(al0, bl2)) | 0; |
|
mid = (mid + Math.imul(al0, bh2)) | 0; |
|
mid = (mid + Math.imul(ah0, bl2)) | 0; |
|
hi = (hi + Math.imul(ah0, bh2)) | 0; |
|
var w2 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; |
|
c = (((hi + (mid >>> 13)) | 0) + (w2 >>> 26)) | 0; |
|
w2 &= 0x3ffffff; |
|
/* k = 3 */ |
|
lo = Math.imul(al3, bl0); |
|
mid = Math.imul(al3, bh0); |
|
mid = (mid + Math.imul(ah3, bl0)) | 0; |
|
hi = Math.imul(ah3, bh0); |
|
lo = (lo + Math.imul(al2, bl1)) | 0; |
|
mid = (mid + Math.imul(al2, bh1)) | 0; |
|
mid = (mid + Math.imul(ah2, bl1)) | 0; |
|
hi = (hi + Math.imul(ah2, bh1)) | 0; |
|
lo = (lo + Math.imul(al1, bl2)) | 0; |
|
mid = (mid + Math.imul(al1, bh2)) | 0; |
|
mid = (mid + Math.imul(ah1, bl2)) | 0; |
|
hi = (hi + Math.imul(ah1, bh2)) | 0; |
|
lo = (lo + Math.imul(al0, bl3)) | 0; |
|
mid = (mid + Math.imul(al0, bh3)) | 0; |
|
mid = (mid + Math.imul(ah0, bl3)) | 0; |
|
hi = (hi + Math.imul(ah0, bh3)) | 0; |
|
var w3 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; |
|
c = (((hi + (mid >>> 13)) | 0) + (w3 >>> 26)) | 0; |
|
w3 &= 0x3ffffff; |
|
/* k = 4 */ |
|
lo = Math.imul(al4, bl0); |
|
mid = Math.imul(al4, bh0); |
|
mid = (mid + Math.imul(ah4, bl0)) | 0; |
|
hi = Math.imul(ah4, bh0); |
|
lo = (lo + Math.imul(al3, bl1)) | 0; |
|
mid = (mid + Math.imul(al3, bh1)) | 0; |
|
mid = (mid + Math.imul(ah3, bl1)) | 0; |
|
hi = (hi + Math.imul(ah3, bh1)) | 0; |
|
lo = (lo + Math.imul(al2, bl2)) | 0; |
|
mid = (mid + Math.imul(al2, bh2)) | 0; |
|
mid = (mid + Math.imul(ah2, bl2)) | 0; |
|
hi = (hi + Math.imul(ah2, bh2)) | 0; |
|
lo = (lo + Math.imul(al1, bl3)) | 0; |
|
mid = (mid + Math.imul(al1, bh3)) | 0; |
|
mid = (mid + Math.imul(ah1, bl3)) | 0; |
|
hi = (hi + Math.imul(ah1, bh3)) | 0; |
|
lo = (lo + Math.imul(al0, bl4)) | 0; |
|
mid = (mid + Math.imul(al0, bh4)) | 0; |
|
mid = (mid + Math.imul(ah0, bl4)) | 0; |
|
hi = (hi + Math.imul(ah0, bh4)) | 0; |
|
var w4 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; |
|
c = (((hi + (mid >>> 13)) | 0) + (w4 >>> 26)) | 0; |
|
w4 &= 0x3ffffff; |
|
/* k = 5 */ |
|
lo = Math.imul(al5, bl0); |
|
mid = Math.imul(al5, bh0); |
|
mid = (mid + Math.imul(ah5, bl0)) | 0; |
|
hi = Math.imul(ah5, bh0); |
|
lo = (lo + Math.imul(al4, bl1)) | 0; |
|
mid = (mid + Math.imul(al4, bh1)) | 0; |
|
mid = (mid + Math.imul(ah4, bl1)) | 0; |
|
hi = (hi + Math.imul(ah4, bh1)) | 0; |
|
lo = (lo + Math.imul(al3, bl2)) | 0; |
|
mid = (mid + Math.imul(al3, bh2)) | 0; |
|
mid = (mid + Math.imul(ah3, bl2)) | 0; |
|
hi = (hi + Math.imul(ah3, bh2)) | 0; |
|
lo = (lo + Math.imul(al2, bl3)) | 0; |
|
mid = (mid + Math.imul(al2, bh3)) | 0; |
|
mid = (mid + Math.imul(ah2, bl3)) | 0; |
|
hi = (hi + Math.imul(ah2, bh3)) | 0; |
|
lo = (lo + Math.imul(al1, bl4)) | 0; |
|
mid = (mid + Math.imul(al1, bh4)) | 0; |
|
mid = (mid + Math.imul(ah1, bl4)) | 0; |
|
hi = (hi + Math.imul(ah1, bh4)) | 0; |
|
lo = (lo + Math.imul(al0, bl5)) | 0; |
|
mid = (mid + Math.imul(al0, bh5)) | 0; |
|
mid = (mid + Math.imul(ah0, bl5)) | 0; |
|
hi = (hi + Math.imul(ah0, bh5)) | 0; |
|
var w5 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; |
|
c = (((hi + (mid >>> 13)) | 0) + (w5 >>> 26)) | 0; |
|
w5 &= 0x3ffffff; |
|
/* k = 6 */ |
|
lo = Math.imul(al6, bl0); |
|
mid = Math.imul(al6, bh0); |
|
mid = (mid + Math.imul(ah6, bl0)) | 0; |
|
hi = Math.imul(ah6, bh0); |
|
lo = (lo + Math.imul(al5, bl1)) | 0; |
|
mid = (mid + Math.imul(al5, bh1)) | 0; |
|
mid = (mid + Math.imul(ah5, bl1)) | 0; |
|
hi = (hi + Math.imul(ah5, bh1)) | 0; |
|
lo = (lo + Math.imul(al4, bl2)) | 0; |
|
mid = (mid + Math.imul(al4, bh2)) | 0; |
|
mid = (mid + Math.imul(ah4, bl2)) | 0; |
|
hi = (hi + Math.imul(ah4, bh2)) | 0; |
|
lo = (lo + Math.imul(al3, bl3)) | 0; |
|
mid = (mid + Math.imul(al3, bh3)) | 0; |
|
mid = (mid + Math.imul(ah3, bl3)) | 0; |
|
hi = (hi + Math.imul(ah3, bh3)) | 0; |
|
lo = (lo + Math.imul(al2, bl4)) | 0; |
|
mid = (mid + Math.imul(al2, bh4)) | 0; |
|
mid = (mid + Math.imul(ah2, bl4)) | 0; |
|
hi = (hi + Math.imul(ah2, bh4)) | 0; |
|
lo = (lo + Math.imul(al1, bl5)) | 0; |
|
mid = (mid + Math.imul(al1, bh5)) | 0; |
|
mid = (mid + Math.imul(ah1, bl5)) | 0; |
|
hi = (hi + Math.imul(ah1, bh5)) | 0; |
|
lo = (lo + Math.imul(al0, bl6)) | 0; |
|
mid = (mid + Math.imul(al0, bh6)) | 0; |
|
mid = (mid + Math.imul(ah0, bl6)) | 0; |
|
hi = (hi + Math.imul(ah0, bh6)) | 0; |
|
var w6 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; |
|
c = (((hi + (mid >>> 13)) | 0) + (w6 >>> 26)) | 0; |
|
w6 &= 0x3ffffff; |
|
/* k = 7 */ |
|
lo = Math.imul(al7, bl0); |
|
mid = Math.imul(al7, bh0); |
|
mid = (mid + Math.imul(ah7, bl0)) | 0; |
|
hi = Math.imul(ah7, bh0); |
|
lo = (lo + Math.imul(al6, bl1)) | 0; |
|
mid = (mid + Math.imul(al6, bh1)) | 0; |
|
mid = (mid + Math.imul(ah6, bl1)) | 0; |
|
hi = (hi + Math.imul(ah6, bh1)) | 0; |
|
lo = (lo + Math.imul(al5, bl2)) | 0; |
|
mid = (mid + Math.imul(al5, bh2)) | 0; |
|
mid = (mid + Math.imul(ah5, bl2)) | 0; |
|
hi = (hi + Math.imul(ah5, bh2)) | 0; |
|
lo = (lo + Math.imul(al4, bl3)) | 0; |
|
mid = (mid + Math.imul(al4, bh3)) | 0; |
|
mid = (mid + Math.imul(ah4, bl3)) | 0; |
|
hi = (hi + Math.imul(ah4, bh3)) | 0; |
|
lo = (lo + Math.imul(al3, bl4)) | 0; |
|
mid = (mid + Math.imul(al3, bh4)) | 0; |
|
mid = (mid + Math.imul(ah3, bl4)) | 0; |
|
hi = (hi + Math.imul(ah3, bh4)) | 0; |
|
lo = (lo + Math.imul(al2, bl5)) | 0; |
|
mid = (mid + Math.imul(al2, bh5)) | 0; |
|
mid = (mid + Math.imul(ah2, bl5)) | 0; |
|
hi = (hi + Math.imul(ah2, bh5)) | 0; |
|
lo = (lo + Math.imul(al1, bl6)) | 0; |
|
mid = (mid + Math.imul(al1, bh6)) | 0; |
|
mid = (mid + Math.imul(ah1, bl6)) | 0; |
|
hi = (hi + Math.imul(ah1, bh6)) | 0; |
|
lo = (lo + Math.imul(al0, bl7)) | 0; |
|
mid = (mid + Math.imul(al0, bh7)) | 0; |
|
mid = (mid + Math.imul(ah0, bl7)) | 0; |
|
hi = (hi + Math.imul(ah0, bh7)) | 0; |
|
var w7 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; |
|
c = (((hi + (mid >>> 13)) | 0) + (w7 >>> 26)) | 0; |
|
w7 &= 0x3ffffff; |
|
/* k = 8 */ |
|
lo = Math.imul(al8, bl0); |
|
mid = Math.imul(al8, bh0); |
|
mid = (mid + Math.imul(ah8, bl0)) | 0; |
|
hi = Math.imul(ah8, bh0); |
|
lo = (lo + Math.imul(al7, bl1)) | 0; |
|
mid = (mid + Math.imul(al7, bh1)) | 0; |
|
mid = (mid + Math.imul(ah7, bl1)) | 0; |
|
hi = (hi + Math.imul(ah7, bh1)) | 0; |
|
lo = (lo + Math.imul(al6, bl2)) | 0; |
|
mid = (mid + Math.imul(al6, bh2)) | 0; |
|
mid = (mid + Math.imul(ah6, bl2)) | 0; |
|
hi = (hi + Math.imul(ah6, bh2)) | 0; |
|
lo = (lo + Math.imul(al5, bl3)) | 0; |
|
mid = (mid + Math.imul(al5, bh3)) | 0; |
|
mid = (mid + Math.imul(ah5, bl3)) | 0; |
|
hi = (hi + Math.imul(ah5, bh3)) | 0; |
|
lo = (lo + Math.imul(al4, bl4)) | 0; |
|
mid = (mid + Math.imul(al4, bh4)) | 0; |
|
mid = (mid + Math.imul(ah4, bl4)) | 0; |
|
hi = (hi + Math.imul(ah4, bh4)) | 0; |
|
lo = (lo + Math.imul(al3, bl5)) | 0; |
|
mid = (mid + Math.imul(al3, bh5)) | 0; |
|
mid = (mid + Math.imul(ah3, bl5)) | 0; |
|
hi = (hi + Math.imul(ah3, bh5)) | 0; |
|
lo = (lo + Math.imul(al2, bl6)) | 0; |
|
mid = (mid + Math.imul(al2, bh6)) | 0; |
|
mid = (mid + Math.imul(ah2, bl6)) | 0; |
|
hi = (hi + Math.imul(ah2, bh6)) | 0; |
|
lo = (lo + Math.imul(al1, bl7)) | 0; |
|
mid = (mid + Math.imul(al1, bh7)) | 0; |
|
mid = (mid + Math.imul(ah1, bl7)) | 0; |
|
hi = (hi + Math.imul(ah1, bh7)) | 0; |
|
lo = (lo + Math.imul(al0, bl8)) | 0; |
|
mid = (mid + Math.imul(al0, bh8)) | 0; |
|
mid = (mid + Math.imul(ah0, bl8)) | 0; |
|
hi = (hi + Math.imul(ah0, bh8)) | 0; |
|
var w8 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; |
|
c = (((hi + (mid >>> 13)) | 0) + (w8 >>> 26)) | 0; |
|
w8 &= 0x3ffffff; |
|
/* k = 9 */ |
|
lo = Math.imul(al9, bl0); |
|
mid = Math.imul(al9, bh0); |
|
mid = (mid + Math.imul(ah9, bl0)) | 0; |
|
hi = Math.imul(ah9, bh0); |
|
lo = (lo + Math.imul(al8, bl1)) | 0; |
|
mid = (mid + Math.imul(al8, bh1)) | 0; |
|
mid = (mid + Math.imul(ah8, bl1)) | 0; |
|
hi = (hi + Math.imul(ah8, bh1)) | 0; |
|
lo = (lo + Math.imul(al7, bl2)) | 0; |
|
mid = (mid + Math.imul(al7, bh2)) | 0; |
|
mid = (mid + Math.imul(ah7, bl2)) | 0; |
|
hi = (hi + Math.imul(ah7, bh2)) | 0; |
|
lo = (lo + Math.imul(al6, bl3)) | 0; |
|
mid = (mid + Math.imul(al6, bh3)) | 0; |
|
mid = (mid + Math.imul(ah6, bl3)) | 0; |
|
hi = (hi + Math.imul(ah6, bh3)) | 0; |
|
lo = (lo + Math.imul(al5, bl4)) | 0; |
|
mid = (mid + Math.imul(al5, bh4)) | 0; |
|
mid = (mid + Math.imul(ah5, bl4)) | 0; |
|
hi = (hi + Math.imul(ah5, bh4)) | 0; |
|
lo = (lo + Math.imul(al4, bl5)) | 0; |
|
mid = (mid + Math.imul(al4, bh5)) | 0; |
|
mid = (mid + Math.imul(ah4, bl5)) | 0; |
|
hi = (hi + Math.imul(ah4, bh5)) | 0; |
|
lo = (lo + Math.imul(al3, bl6)) | 0; |
|
mid = (mid + Math.imul(al3, bh6)) | 0; |
|
mid = (mid + Math.imul(ah3, bl6)) | 0; |
|
hi = (hi + Math.imul(ah3, bh6)) | 0; |
|
lo = (lo + Math.imul(al2, bl7)) | 0; |
|
mid = (mid + Math.imul(al2, bh7)) | 0; |
|
mid = (mid + Math.imul(ah2, bl7)) | 0; |
|
hi = (hi + Math.imul(ah2, bh7)) | 0; |
|
lo = (lo + Math.imul(al1, bl8)) | 0; |
|
mid = (mid + Math.imul(al1, bh8)) | 0; |
|
mid = (mid + Math.imul(ah1, bl8)) | 0; |
|
hi = (hi + Math.imul(ah1, bh8)) | 0; |
|
lo = (lo + Math.imul(al0, bl9)) | 0; |
|
mid = (mid + Math.imul(al0, bh9)) | 0; |
|
mid = (mid + Math.imul(ah0, bl9)) | 0; |
|
hi = (hi + Math.imul(ah0, bh9)) | 0; |
|
var w9 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; |
|
c = (((hi + (mid >>> 13)) | 0) + (w9 >>> 26)) | 0; |
|
w9 &= 0x3ffffff; |
|
/* k = 10 */ |
|
lo = Math.imul(al9, bl1); |
|
mid = Math.imul(al9, bh1); |
|
mid = (mid + Math.imul(ah9, bl1)) | 0; |
|
hi = Math.imul(ah9, bh1); |
|
lo = (lo + Math.imul(al8, bl2)) | 0; |
|
mid = (mid + Math.imul(al8, bh2)) | 0; |
|
mid = (mid + Math.imul(ah8, bl2)) | 0; |
|
hi = (hi + Math.imul(ah8, bh2)) | 0; |
|
lo = (lo + Math.imul(al7, bl3)) | 0; |
|
mid = (mid + Math.imul(al7, bh3)) | 0; |
|
mid = (mid + Math.imul(ah7, bl3)) | 0; |
|
hi = (hi + Math.imul(ah7, bh3)) | 0; |
|
lo = (lo + Math.imul(al6, bl4)) | 0; |
|
mid = (mid + Math.imul(al6, bh4)) | 0; |
|
mid = (mid + Math.imul(ah6, bl4)) | 0; |
|
hi = (hi + Math.imul(ah6, bh4)) | 0; |
|
lo = (lo + Math.imul(al5, bl5)) | 0; |
|
mid = (mid + Math.imul(al5, bh5)) | 0; |
|
mid = (mid + Math.imul(ah5, bl5)) | 0; |
|
hi = (hi + Math.imul(ah5, bh5)) | 0; |
|
lo = (lo + Math.imul(al4, bl6)) | 0; |
|
mid = (mid + Math.imul(al4, bh6)) | 0; |
|
mid = (mid + Math.imul(ah4, bl6)) | 0; |
|
hi = (hi + Math.imul(ah4, bh6)) | 0; |
|
lo = (lo + Math.imul(al3, bl7)) | 0; |
|
mid = (mid + Math.imul(al3, bh7)) | 0; |
|
mid = (mid + Math.imul(ah3, bl7)) | 0; |
|
hi = (hi + Math.imul(ah3, bh7)) | 0; |
|
lo = (lo + Math.imul(al2, bl8)) | 0; |
|
mid = (mid + Math.imul(al2, bh8)) | 0; |
|
mid = (mid + Math.imul(ah2, bl8)) | 0; |
|
hi = (hi + Math.imul(ah2, bh8)) | 0; |
|
lo = (lo + Math.imul(al1, bl9)) | 0; |
|
mid = (mid + Math.imul(al1, bh9)) | 0; |
|
mid = (mid + Math.imul(ah1, bl9)) | 0; |
|
hi = (hi + Math.imul(ah1, bh9)) | 0; |
|
var w10 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; |
|
c = (((hi + (mid >>> 13)) | 0) + (w10 >>> 26)) | 0; |
|
w10 &= 0x3ffffff; |
|
/* k = 11 */ |
|
lo = Math.imul(al9, bl2); |
|
mid = Math.imul(al9, bh2); |
|
mid = (mid + Math.imul(ah9, bl2)) | 0; |
|
hi = Math.imul(ah9, bh2); |
|
lo = (lo + Math.imul(al8, bl3)) | 0; |
|
mid = (mid + Math.imul(al8, bh3)) | 0; |
|
mid = (mid + Math.imul(ah8, bl3)) | 0; |
|
hi = (hi + Math.imul(ah8, bh3)) | 0; |
|
lo = (lo + Math.imul(al7, bl4)) | 0; |
|
mid = (mid + Math.imul(al7, bh4)) | 0; |
|
mid = (mid + Math.imul(ah7, bl4)) | 0; |
|
hi = (hi + Math.imul(ah7, bh4)) | 0; |
|
lo = (lo + Math.imul(al6, bl5)) | 0; |
|
mid = (mid + Math.imul(al6, bh5)) | 0; |
|
mid = (mid + Math.imul(ah6, bl5)) | 0; |
|
hi = (hi + Math.imul(ah6, bh5)) | 0; |
|
lo = (lo + Math.imul(al5, bl6)) | 0; |
|
mid = (mid + Math.imul(al5, bh6)) | 0; |
|
mid = (mid + Math.imul(ah5, bl6)) | 0; |
|
hi = (hi + Math.imul(ah5, bh6)) | 0; |
|
lo = (lo + Math.imul(al4, bl7)) | 0; |
|
mid = (mid + Math.imul(al4, bh7)) | 0; |
|
mid = (mid + Math.imul(ah4, bl7)) | 0; |
|
hi = (hi + Math.imul(ah4, bh7)) | 0; |
|
lo = (lo + Math.imul(al3, bl8)) | 0; |
|
mid = (mid + Math.imul(al3, bh8)) | 0; |
|
mid = (mid + Math.imul(ah3, bl8)) | 0; |
|
hi = (hi + Math.imul(ah3, bh8)) | 0; |
|
lo = (lo + Math.imul(al2, bl9)) | 0; |
|
mid = (mid + Math.imul(al2, bh9)) | 0; |
|
mid = (mid + Math.imul(ah2, bl9)) | 0; |
|
hi = (hi + Math.imul(ah2, bh9)) | 0; |
|
var w11 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; |
|
c = (((hi + (mid >>> 13)) | 0) + (w11 >>> 26)) | 0; |
|
w11 &= 0x3ffffff; |
|
/* k = 12 */ |
|
lo = Math.imul(al9, bl3); |
|
mid = Math.imul(al9, bh3); |
|
mid = (mid + Math.imul(ah9, bl3)) | 0; |
|
hi = Math.imul(ah9, bh3); |
|
lo = (lo + Math.imul(al8, bl4)) | 0; |
|
mid = (mid + Math.imul(al8, bh4)) | 0; |
|
mid = (mid + Math.imul(ah8, bl4)) | 0; |
|
hi = (hi + Math.imul(ah8, bh4)) | 0; |
|
lo = (lo + Math.imul(al7, bl5)) | 0; |
|
mid = (mid + Math.imul(al7, bh5)) | 0; |
|
mid = (mid + Math.imul(ah7, bl5)) | 0; |
|
hi = (hi + Math.imul(ah7, bh5)) | 0; |
|
lo = (lo + Math.imul(al6, bl6)) | 0; |
|
mid = (mid + Math.imul(al6, bh6)) | 0; |
|
mid = (mid + Math.imul(ah6, bl6)) | 0; |
|
hi = (hi + Math.imul(ah6, bh6)) | 0; |
|
lo = (lo + Math.imul(al5, bl7)) | 0; |
|
mid = (mid + Math.imul(al5, bh7)) | 0; |
|
mid = (mid + Math.imul(ah5, bl7)) | 0; |
|
hi = (hi + Math.imul(ah5, bh7)) | 0; |
|
lo = (lo + Math.imul(al4, bl8)) | 0; |
|
mid = (mid + Math.imul(al4, bh8)) | 0; |
|
mid = (mid + Math.imul(ah4, bl8)) | 0; |
|
hi = (hi + Math.imul(ah4, bh8)) | 0; |
|
lo = (lo + Math.imul(al3, bl9)) | 0; |
|
mid = (mid + Math.imul(al3, bh9)) | 0; |
|
mid = (mid + Math.imul(ah3, bl9)) | 0; |
|
hi = (hi + Math.imul(ah3, bh9)) | 0; |
|
var w12 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; |
|
c = (((hi + (mid >>> 13)) | 0) + (w12 >>> 26)) | 0; |
|
w12 &= 0x3ffffff; |
|
/* k = 13 */ |
|
lo = Math.imul(al9, bl4); |
|
mid = Math.imul(al9, bh4); |
|
mid = (mid + Math.imul(ah9, bl4)) | 0; |
|
hi = Math.imul(ah9, bh4); |
|
lo = (lo + Math.imul(al8, bl5)) | 0; |
|
mid = (mid + Math.imul(al8, bh5)) | 0; |
|
mid = (mid + Math.imul(ah8, bl5)) | 0; |
|
hi = (hi + Math.imul(ah8, bh5)) | 0; |
|
lo = (lo + Math.imul(al7, bl6)) | 0; |
|
mid = (mid + Math.imul(al7, bh6)) | 0; |
|
mid = (mid + Math.imul(ah7, bl6)) | 0; |
|
hi = (hi + Math.imul(ah7, bh6)) | 0; |
|
lo = (lo + Math.imul(al6, bl7)) | 0; |
|
mid = (mid + Math.imul(al6, bh7)) | 0; |
|
mid = (mid + Math.imul(ah6, bl7)) | 0; |
|
hi = (hi + Math.imul(ah6, bh7)) | 0; |
|
lo = (lo + Math.imul(al5, bl8)) | 0; |
|
mid = (mid + Math.imul(al5, bh8)) | 0; |
|
mid = (mid + Math.imul(ah5, bl8)) | 0; |
|
hi = (hi + Math.imul(ah5, bh8)) | 0; |
|
lo = (lo + Math.imul(al4, bl9)) | 0; |
|
mid = (mid + Math.imul(al4, bh9)) | 0; |
|
mid = (mid + Math.imul(ah4, bl9)) | 0; |
|
hi = (hi + Math.imul(ah4, bh9)) | 0; |
|
var w13 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; |
|
c = (((hi + (mid >>> 13)) | 0) + (w13 >>> 26)) | 0; |
|
w13 &= 0x3ffffff; |
|
/* k = 14 */ |
|
lo = Math.imul(al9, bl5); |
|
mid = Math.imul(al9, bh5); |
|
mid = (mid + Math.imul(ah9, bl5)) | 0; |
|
hi = Math.imul(ah9, bh5); |
|
lo = (lo + Math.imul(al8, bl6)) | 0; |
|
mid = (mid + Math.imul(al8, bh6)) | 0; |
|
mid = (mid + Math.imul(ah8, bl6)) | 0; |
|
hi = (hi + Math.imul(ah8, bh6)) | 0; |
|
lo = (lo + Math.imul(al7, bl7)) | 0; |
|
mid = (mid + Math.imul(al7, bh7)) | 0; |
|
mid = (mid + Math.imul(ah7, bl7)) | 0; |
|
hi = (hi + Math.imul(ah7, bh7)) | 0; |
|
lo = (lo + Math.imul(al6, bl8)) | 0; |
|
mid = (mid + Math.imul(al6, bh8)) | 0; |
|
mid = (mid + Math.imul(ah6, bl8)) | 0; |
|
hi = (hi + Math.imul(ah6, bh8)) | 0; |
|
lo = (lo + Math.imul(al5, bl9)) | 0; |
|
mid = (mid + Math.imul(al5, bh9)) | 0; |
|
mid = (mid + Math.imul(ah5, bl9)) | 0; |
|
hi = (hi + Math.imul(ah5, bh9)) | 0; |
|
var w14 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; |
|
c = (((hi + (mid >>> 13)) | 0) + (w14 >>> 26)) | 0; |
|
w14 &= 0x3ffffff; |
|
/* k = 15 */ |
|
lo = Math.imul(al9, bl6); |
|
mid = Math.imul(al9, bh6); |
|
mid = (mid + Math.imul(ah9, bl6)) | 0; |
|
hi = Math.imul(ah9, bh6); |
|
lo = (lo + Math.imul(al8, bl7)) | 0; |
|
mid = (mid + Math.imul(al8, bh7)) | 0; |
|
mid = (mid + Math.imul(ah8, bl7)) | 0; |
|
hi = (hi + Math.imul(ah8, bh7)) | 0; |
|
lo = (lo + Math.imul(al7, bl8)) | 0; |
|
mid = (mid + Math.imul(al7, bh8)) | 0; |
|
mid = (mid + Math.imul(ah7, bl8)) | 0; |
|
hi = (hi + Math.imul(ah7, bh8)) | 0; |
|
lo = (lo + Math.imul(al6, bl9)) | 0; |
|
mid = (mid + Math.imul(al6, bh9)) | 0; |
|
mid = (mid + Math.imul(ah6, bl9)) | 0; |
|
hi = (hi + Math.imul(ah6, bh9)) | 0; |
|
var w15 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; |
|
c = (((hi + (mid >>> 13)) | 0) + (w15 >>> 26)) | 0; |
|
w15 &= 0x3ffffff; |
|
/* k = 16 */ |
|
lo = Math.imul(al9, bl7); |
|
mid = Math.imul(al9, bh7); |
|
mid = (mid + Math.imul(ah9, bl7)) | 0; |
|
hi = Math.imul(ah9, bh7); |
|
lo = (lo + Math.imul(al8, bl8)) | 0; |
|
mid = (mid + Math.imul(al8, bh8)) | 0; |
|
mid = (mid + Math.imul(ah8, bl8)) | 0; |
|
hi = (hi + Math.imul(ah8, bh8)) | 0; |
|
lo = (lo + Math.imul(al7, bl9)) | 0; |
|
mid = (mid + Math.imul(al7, bh9)) | 0; |
|
mid = (mid + Math.imul(ah7, bl9)) | 0; |
|
hi = (hi + Math.imul(ah7, bh9)) | 0; |
|
var w16 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; |
|
c = (((hi + (mid >>> 13)) | 0) + (w16 >>> 26)) | 0; |
|
w16 &= 0x3ffffff; |
|
/* k = 17 */ |
|
lo = Math.imul(al9, bl8); |
|
mid = Math.imul(al9, bh8); |
|
mid = (mid + Math.imul(ah9, bl8)) | 0; |
|
hi = Math.imul(ah9, bh8); |
|
lo = (lo + Math.imul(al8, bl9)) | 0; |
|
mid = (mid + Math.imul(al8, bh9)) | 0; |
|
mid = (mid + Math.imul(ah8, bl9)) | 0; |
|
hi = (hi + Math.imul(ah8, bh9)) | 0; |
|
var w17 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; |
|
c = (((hi + (mid >>> 13)) | 0) + (w17 >>> 26)) | 0; |
|
w17 &= 0x3ffffff; |
|
/* k = 18 */ |
|
lo = Math.imul(al9, bl9); |
|
mid = Math.imul(al9, bh9); |
|
mid = (mid + Math.imul(ah9, bl9)) | 0; |
|
hi = Math.imul(ah9, bh9); |
|
var w18 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; |
|
c = (((hi + (mid >>> 13)) | 0) + (w18 >>> 26)) | 0; |
|
w18 &= 0x3ffffff; |
|
o[0] = w0; |
|
o[1] = w1; |
|
o[2] = w2; |
|
o[3] = w3; |
|
o[4] = w4; |
|
o[5] = w5; |
|
o[6] = w6; |
|
o[7] = w7; |
|
o[8] = w8; |
|
o[9] = w9; |
|
o[10] = w10; |
|
o[11] = w11; |
|
o[12] = w12; |
|
o[13] = w13; |
|
o[14] = w14; |
|
o[15] = w15; |
|
o[16] = w16; |
|
o[17] = w17; |
|
o[18] = w18; |
|
if (c !== 0) { |
|
o[19] = c; |
|
out.length++; |
|
} |
|
return out; |
|
}; |
|
|
|
// Polyfill comb |
|
if (!Math.imul) { |
|
comb10MulTo = smallMulTo; |
|
} |
|
|
|
function bigMulTo (self, num, out) { |
|
out.negative = num.negative ^ self.negative; |
|
out.length = self.length + num.length; |
|
|
|
var carry = 0; |
|
var hncarry = 0; |
|
for (var k = 0; k < out.length - 1; k++) { |
|
// Sum all words with the same `i + j = k` and accumulate `ncarry`, |
|
// note that ncarry could be >= 0x3ffffff |
|
var ncarry = hncarry; |
|
hncarry = 0; |
|
var rword = carry & 0x3ffffff; |
|
var maxJ = Math.min(k, num.length - 1); |
|
for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) { |
|
var i = k - j; |
|
var a = self.words[i] | 0; |
|
var b = num.words[j] | 0; |
|
var r = a * b; |
|
|
|
var lo = r & 0x3ffffff; |
|
ncarry = (ncarry + ((r / 0x4000000) | 0)) | 0; |
|
lo = (lo + rword) | 0; |
|
rword = lo & 0x3ffffff; |
|
ncarry = (ncarry + (lo >>> 26)) | 0; |
|
|
|
hncarry += ncarry >>> 26; |
|
ncarry &= 0x3ffffff; |
|
} |
|
out.words[k] = rword; |
|
carry = ncarry; |
|
ncarry = hncarry; |
|
} |
|
if (carry !== 0) { |
|
out.words[k] = carry; |
|
} else { |
|
out.length--; |
|
} |
|
|
|
return out.strip(); |
|
} |
|
|
|
function jumboMulTo (self, num, out) { |
|
var fftm = new FFTM(); |
|
return fftm.mulp(self, num, out); |
|
} |
|
|
|
BN.prototype.mulTo = function mulTo (num, out) { |
|
var res; |
|
var len = this.length + num.length; |
|
if (this.length === 10 && num.length === 10) { |
|
res = comb10MulTo(this, num, out); |
|
} else if (len < 63) { |
|
res = smallMulTo(this, num, out); |
|
} else if (len < 1024) { |
|
res = bigMulTo(this, num, out); |
|
} else { |
|
res = jumboMulTo(this, num, out); |
|
} |
|
|
|
return res; |
|
}; |
|
|
|
// Cooley-Tukey algorithm for FFT |
|
// slightly revisited to rely on looping instead of recursion |
|
|
|
function FFTM (x, y) { |
|
this.x = x; |
|
this.y = y; |
|
} |
|
|
|
FFTM.prototype.makeRBT = function makeRBT (N) { |
|
var t = new Array(N); |
|
var l = BN.prototype._countBits(N) - 1; |
|
for (var i = 0; i < N; i++) { |
|
t[i] = this.revBin(i, l, N); |
|
} |
|
|
|
return t; |
|
}; |
|
|
|
// Returns binary-reversed representation of `x` |
|
FFTM.prototype.revBin = function revBin (x, l, N) { |
|
if (x === 0 || x === N - 1) return x; |
|
|
|
var rb = 0; |
|
for (var i = 0; i < l; i++) { |
|
rb |= (x & 1) << (l - i - 1); |
|
x >>= 1; |
|
} |
|
|
|
return rb; |
|
}; |
|
|
|
// Performs "tweedling" phase, therefore 'emulating' |
|
// behaviour of the recursive algorithm |
|
FFTM.prototype.permute = function permute (rbt, rws, iws, rtws, itws, N) { |
|
for (var i = 0; i < N; i++) { |
|
rtws[i] = rws[rbt[i]]; |
|
itws[i] = iws[rbt[i]]; |
|
} |
|
}; |
|
|
|
FFTM.prototype.transform = function transform (rws, iws, rtws, itws, N, rbt) { |
|
this.permute(rbt, rws, iws, rtws, itws, N); |
|
|
|
for (var s = 1; s < N; s <<= 1) { |
|
var l = s << 1; |
|
|
|
var rtwdf = Math.cos(2 * Math.PI / l); |
|
var itwdf = Math.sin(2 * Math.PI / l); |
|
|
|
for (var p = 0; p < N; p += l) { |
|
var rtwdf_ = rtwdf; |
|
var itwdf_ = itwdf; |
|
|
|
for (var j = 0; j < s; j++) { |
|
var re = rtws[p + j]; |
|
var ie = itws[p + j]; |
|
|
|
var ro = rtws[p + j + s]; |
|
var io = itws[p + j + s]; |
|
|
|
var rx = rtwdf_ * ro - itwdf_ * io; |
|
|
|
io = rtwdf_ * io + itwdf_ * ro; |
|
ro = rx; |
|
|
|
rtws[p + j] = re + ro; |
|
itws[p + j] = ie + io; |
|
|
|
rtws[p + j + s] = re - ro; |
|
itws[p + j + s] = ie - io; |
|
|
|
/* jshint maxdepth : false */ |
|
if (j !== l) { |
|
rx = rtwdf * rtwdf_ - itwdf * itwdf_; |
|
|
|
itwdf_ = rtwdf * itwdf_ + itwdf * rtwdf_; |
|
rtwdf_ = rx; |
|
} |
|
} |
|
} |
|
} |
|
}; |
|
|
|
FFTM.prototype.guessLen13b = function guessLen13b (n, m) { |
|
var N = Math.max(m, n) | 1; |
|
var odd = N & 1; |
|
var i = 0; |
|
for (N = N / 2 | 0; N; N = N >>> 1) { |
|
i++; |
|
} |
|
|
|
return 1 << i + 1 + odd; |
|
}; |
|
|
|
FFTM.prototype.conjugate = function conjugate (rws, iws, N) { |
|
if (N <= 1) return; |
|
|
|
for (var i = 0; i < N / 2; i++) { |
|
var t = rws[i]; |
|
|
|
rws[i] = rws[N - i - 1]; |
|
rws[N - i - 1] = t; |
|
|
|
t = iws[i]; |
|
|
|
iws[i] = -iws[N - i - 1]; |
|
iws[N - i - 1] = -t; |
|
} |
|
}; |
|
|
|
FFTM.prototype.normalize13b = function normalize13b (ws, N) { |
|
var carry = 0; |
|
for (var i = 0; i < N / 2; i++) { |
|
var w = Math.round(ws[2 * i + 1] / N) * 0x2000 + |
|
Math.round(ws[2 * i] / N) + |
|
carry; |
|
|
|
ws[i] = w & 0x3ffffff; |
|
|
|
if (w < 0x4000000) { |
|
carry = 0; |
|
} else { |
|
carry = w / 0x4000000 | 0; |
|
} |
|
} |
|
|
|
return ws; |
|
}; |
|
|
|
FFTM.prototype.convert13b = function convert13b (ws, len, rws, N) { |
|
var carry = 0; |
|
for (var i = 0; i < len; i++) { |
|
carry = carry + (ws[i] | 0); |
|
|
|
rws[2 * i] = carry & 0x1fff; carry = carry >>> 13; |
|
rws[2 * i + 1] = carry & 0x1fff; carry = carry >>> 13; |
|
} |
|
|
|
// Pad with zeroes |
|
for (i = 2 * len; i < N; ++i) { |
|
rws[i] = 0; |
|
} |
|
|
|
assert(carry === 0); |
|
assert((carry & ~0x1fff) === 0); |
|
}; |
|
|
|
FFTM.prototype.stub = function stub (N) { |
|
var ph = new Array(N); |
|
for (var i = 0; i < N; i++) { |
|
ph[i] = 0; |
|
} |
|
|
|
return ph; |
|
}; |
|
|
|
FFTM.prototype.mulp = function mulp (x, y, out) { |
|
var N = 2 * this.guessLen13b(x.length, y.length); |
|
|
|
var rbt = this.makeRBT(N); |
|
|
|
var _ = this.stub(N); |
|
|
|
var rws = new Array(N); |
|
var rwst = new Array(N); |
|
var iwst = new Array(N); |
|
|
|
var nrws = new Array(N); |
|
var nrwst = new Array(N); |
|
var niwst = new Array(N); |
|
|
|
var rmws = out.words; |
|
rmws.length = N; |
|
|
|
this.convert13b(x.words, x.length, rws, N); |
|
this.convert13b(y.words, y.length, nrws, N); |
|
|
|
this.transform(rws, _, rwst, iwst, N, rbt); |
|
this.transform(nrws, _, nrwst, niwst, N, rbt); |
|
|
|
for (var i = 0; i < N; i++) { |
|
var rx = rwst[i] * nrwst[i] - iwst[i] * niwst[i]; |
|
iwst[i] = rwst[i] * niwst[i] + iwst[i] * nrwst[i]; |
|
rwst[i] = rx; |
|
} |
|
|
|
this.conjugate(rwst, iwst, N); |
|
this.transform(rwst, iwst, rmws, _, N, rbt); |
|
this.conjugate(rmws, _, N); |
|
this.normalize13b(rmws, N); |
|
|
|
out.negative = x.negative ^ y.negative; |
|
out.length = x.length + y.length; |
|
return out.strip(); |
|
}; |
|
|
|
// Multiply `this` by `num` |
|
BN.prototype.mul = function mul (num) { |
|
var out = new BN(null); |
|
out.words = new Array(this.length + num.length); |
|
return this.mulTo(num, out); |
|
}; |
|
|
|
// Multiply employing FFT |
|
BN.prototype.mulf = function mulf (num) { |
|
var out = new BN(null); |
|
out.words = new Array(this.length + num.length); |
|
return jumboMulTo(this, num, out); |
|
}; |
|
|
|
// In-place Multiplication |
|
BN.prototype.imul = function imul (num) { |
|
return this.clone().mulTo(num, this); |
|
}; |
|
|
|
BN.prototype.imuln = function imuln (num) { |
|
assert(typeof num === 'number'); |
|
assert(num < 0x4000000); |
|
|
|
// Carry |
|
var carry = 0; |
|
for (var i = 0; i < this.length; i++) { |
|
var w = (this.words[i] | 0) * num; |
|
var lo = (w & 0x3ffffff) + (carry & 0x3ffffff); |
|
carry >>= 26; |
|
carry += (w / 0x4000000) | 0; |
|
// NOTE: lo is 27bit maximum |
|
carry += lo >>> 26; |
|
this.words[i] = lo & 0x3ffffff; |
|
} |
|
|
|
if (carry !== 0) { |
|
this.words[i] = carry; |
|
this.length++; |
|
} |
|
|
|
return this; |
|
}; |
|
|
|
BN.prototype.muln = function muln (num) { |
|
return this.clone().imuln(num); |
|
}; |
|
|
|
// `this` * `this` |
|
BN.prototype.sqr = function sqr () { |
|
return this.mul(this); |
|
}; |
|
|
|
// `this` * `this` in-place |
|
BN.prototype.isqr = function isqr () { |
|
return this.imul(this.clone()); |
|
}; |
|
|
|
// Math.pow(`this`, `num`) |
|
BN.prototype.pow = function pow (num) { |
|
var w = toBitArray(num); |
|
if (w.length === 0) return new BN(1); |
|
|
|
// Skip leading zeroes |
|
var res = this; |
|
for (var i = 0; i < w.length; i++, res = res.sqr()) { |
|
if (w[i] !== 0) break; |
|
} |
|
|
|
if (++i < w.length) { |
|
for (var q = res.sqr(); i < w.length; i++, q = q.sqr()) { |
|
if (w[i] === 0) continue; |
|
|
|
res = res.mul(q); |
|
} |
|
} |
|
|
|
return res; |
|
}; |
|
|
|
// Shift-left in-place |
|
BN.prototype.iushln = function iushln (bits) { |
|
assert(typeof bits === 'number' && bits >= 0); |
|
var r = bits % 26; |
|
var s = (bits - r) / 26; |
|
var carryMask = (0x3ffffff >>> (26 - r)) << (26 - r); |
|
var i; |
|
|
|
if (r !== 0) { |
|
var carry = 0; |
|
|
|
for (i = 0; i < this.length; i++) { |
|
var newCarry = this.words[i] & carryMask; |
|
var c = ((this.words[i] | 0) - newCarry) << r; |
|
this.words[i] = c | carry; |
|
carry = newCarry >>> (26 - r); |
|
} |
|
|
|
if (carry) { |
|
this.words[i] = carry; |
|
this.length++; |
|
} |
|
} |
|
|
|
if (s !== 0) { |
|
for (i = this.length - 1; i >= 0; i--) { |
|
this.words[i + s] = this.words[i]; |
|
} |
|
|
|
for (i = 0; i < s; i++) { |
|
this.words[i] = 0; |
|
} |
|
|
|
this.length += s; |
|
} |
|
|
|
return this.strip(); |
|
}; |
|
|
|
BN.prototype.ishln = function ishln (bits) { |
|
// TODO(indutny): implement me |
|
assert(this.negative === 0); |
|
return this.iushln(bits); |
|
}; |
|
|
|
// Shift-right in-place |
|
// NOTE: `hint` is a lowest bit before trailing zeroes |
|
// NOTE: if `extended` is present - it will be filled with destroyed bits |
|
BN.prototype.iushrn = function iushrn (bits, hint, extended) { |
|
assert(typeof bits === 'number' && bits >= 0); |
|
var h; |
|
if (hint) { |
|
h = (hint - (hint % 26)) / 26; |
|
} else { |
|
h = 0; |
|
} |
|
|
|
var r = bits % 26; |
|
var s = Math.min((bits - r) / 26, this.length); |
|
var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r); |
|
var maskedWords = extended; |
|
|
|
h -= s; |
|
h = Math.max(0, h); |
|
|
|
// Extended mode, copy masked part |
|
if (maskedWords) { |
|
for (var i = 0; i < s; i++) { |
|
maskedWords.words[i] = this.words[i]; |
|
} |
|
maskedWords.length = s; |
|
} |
|
|
|
if (s === 0) { |
|
// No-op, we should not move anything at all |
|
} else if (this.length > s) { |
|
this.length -= s; |
|
for (i = 0; i < this.length; i++) { |
|
this.words[i] = this.words[i + s]; |
|
} |
|
} else { |
|
this.words[0] = 0; |
|
this.length = 1; |
|
} |
|
|
|
var carry = 0; |
|
for (i = this.length - 1; i >= 0 && (carry !== 0 || i >= h); i--) { |
|
var word = this.words[i] | 0; |
|
this.words[i] = (carry << (26 - r)) | (word >>> r); |
|
carry = word & mask; |
|
} |
|
|
|
// Push carried bits as a mask |
|
if (maskedWords && carry !== 0) { |
|
maskedWords.words[maskedWords.length++] = carry; |
|
} |
|
|
|
if (this.length === 0) { |
|
this.words[0] = 0; |
|
this.length = 1; |
|
} |
|
|
|
return this.strip(); |
|
}; |
|
|
|
BN.prototype.ishrn = function ishrn (bits, hint, extended) { |
|
// TODO(indutny): implement me |
|
assert(this.negative === 0); |
|
return this.iushrn(bits, hint, extended); |
|
}; |
|
|
|
// Shift-left |
|
BN.prototype.shln = function shln (bits) { |
|
return this.clone().ishln(bits); |
|
}; |
|
|
|
BN.prototype.ushln = function ushln (bits) { |
|
return this.clone().iushln(bits); |
|
}; |
|
|
|
// Shift-right |
|
BN.prototype.shrn = function shrn (bits) { |
|
return this.clone().ishrn(bits); |
|
}; |
|
|
|
BN.prototype.ushrn = function ushrn (bits) { |
|
return this.clone().iushrn(bits); |
|
}; |
|
|
|
// Test if n bit is set |
|
BN.prototype.testn = function testn (bit) { |
|
assert(typeof bit === 'number' && bit >= 0); |
|
var r = bit % 26; |
|
var s = (bit - r) / 26; |
|
var q = 1 << r; |
|
|
|
// Fast case: bit is much higher than all existing words |
|
if (this.length <= s) return false; |
|
|
|
// Check bit and return |
|
var w = this.words[s]; |
|
|
|
return !!(w & q); |
|
}; |
|
|
|
// Return only lowers bits of number (in-place) |
|
BN.prototype.imaskn = function imaskn (bits) { |
|
assert(typeof bits === 'number' && bits >= 0); |
|
var r = bits % 26; |
|
var s = (bits - r) / 26; |
|
|
|
assert(this.negative === 0, 'imaskn works only with positive numbers'); |
|
|
|
if (this.length <= s) { |
|
return this; |
|
} |
|
|
|
if (r !== 0) { |
|
s++; |
|
} |
|
this.length = Math.min(s, this.length); |
|
|
|
if (r !== 0) { |
|
var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r); |
|
this.words[this.length - 1] &= mask; |
|
} |
|
|
|
return this.strip(); |
|
}; |
|
|
|
// Return only lowers bits of number |
|
BN.prototype.maskn = function maskn (bits) { |
|
return this.clone().imaskn(bits); |
|
}; |
|
|
|
// Add plain number `num` to `this` |
|
BN.prototype.iaddn = function iaddn (num) { |
|
assert(typeof num === 'number'); |
|
assert(num < 0x4000000); |
|
if (num < 0) return this.isubn(-num); |
|
|
|
// Possible sign change |
|
if (this.negative !== 0) { |
|
if (this.length === 1 && (this.words[0] | 0) < num) { |
|
this.words[0] = num - (this.words[0] | 0); |
|
this.negative = 0; |
|
return this; |
|
} |
|
|
|
this.negative = 0; |
|
this.isubn(num); |
|
this.negative = 1; |
|
return this; |
|
} |
|
|
|
// Add without checks |
|
return this._iaddn(num); |
|
}; |
|
|
|
BN.prototype._iaddn = function _iaddn (num) { |
|
this.words[0] += num; |
|
|
|
// Carry |
|
for (var i = 0; i < this.length && this.words[i] >= 0x4000000; i++) { |
|
this.words[i] -= 0x4000000; |
|
if (i === this.length - 1) { |
|
this.words[i + 1] = 1; |
|
} else { |
|
this.words[i + 1]++; |
|
} |
|
} |
|
this.length = Math.max(this.length, i + 1); |
|
|
|
return this; |
|
}; |
|
|
|
// Subtract plain number `num` from `this` |
|
BN.prototype.isubn = function isubn (num) { |
|
assert(typeof num === 'number'); |
|
assert(num < 0x4000000); |
|
if (num < 0) return this.iaddn(-num); |
|
|
|
if (this.negative !== 0) { |
|
this.negative = 0; |
|
this.iaddn(num); |
|
this.negative = 1; |
|
return this; |
|
} |
|
|
|
this.words[0] -= num; |
|
|
|
if (this.length === 1 && this.words[0] < 0) { |
|
this.words[0] = -this.words[0]; |
|
this.negative = 1; |
|
} else { |
|
// Carry |
|
for (var i = 0; i < this.length && this.words[i] < 0; i++) { |
|
this.words[i] += 0x4000000; |
|
this.words[i + 1] -= 1; |
|
} |
|
} |
|
|
|
return this.strip(); |
|
}; |
|
|
|
BN.prototype.addn = function addn (num) { |
|
return this.clone().iaddn(num); |
|
}; |
|
|
|
BN.prototype.subn = function subn (num) { |
|
return this.clone().isubn(num); |
|
}; |
|
|
|
BN.prototype.iabs = function iabs () { |
|
this.negative = 0; |
|
|
|
return this; |
|
}; |
|
|
|
BN.prototype.abs = function abs () { |
|
return this.clone().iabs(); |
|
}; |
|
|
|
BN.prototype._ishlnsubmul = function _ishlnsubmul (num, mul, shift) { |
|
var len = num.length + shift; |
|
var i; |
|
|
|
this._expand(len); |
|
|
|
var w; |
|
var carry = 0; |
|
for (i = 0; i < num.length; i++) { |
|
w = (this.words[i + shift] | 0) + carry; |
|
var right = (num.words[i] | 0) * mul; |
|
w -= right & 0x3ffffff; |
|
carry = (w >> 26) - ((right / 0x4000000) | 0); |
|
this.words[i + shift] = w & 0x3ffffff; |
|
} |
|
for (; i < this.length - shift; i++) { |
|
w = (this.words[i + shift] | 0) + carry; |
|
carry = w >> 26; |
|
this.words[i + shift] = w & 0x3ffffff; |
|
} |
|
|
|
if (carry === 0) return this.strip(); |
|
|
|
// Subtraction overflow |
|
assert(carry === -1); |
|
carry = 0; |
|
for (i = 0; i < this.length; i++) { |
|
w = -(this.words[i] | 0) + carry; |
|
carry = w >> 26; |
|
this.words[i] = w & 0x3ffffff; |
|
} |
|
this.negative = 1; |
|
|
|
return this.strip(); |
|
}; |
|
|
|
BN.prototype._wordDiv = function _wordDiv (num, mode) { |
|
var shift = this.length - num.length; |
|
|
|
var a = this.clone(); |
|
var b = num; |
|
|
|
// Normalize |
|
var bhi = b.words[b.length - 1] | 0; |
|
var bhiBits = this._countBits(bhi); |
|
shift = 26 - bhiBits; |
|
if (shift !== 0) { |
|
b = b.ushln(shift); |
|
a.iushln(shift); |
|
bhi = b.words[b.length - 1] | 0; |
|
} |
|
|
|
// Initialize quotient |
|
var m = a.length - b.length; |
|
var q; |
|
|
|
if (mode !== 'mod') { |
|
q = new BN(null); |
|
q.length = m + 1; |
|
q.words = new Array(q.length); |
|
for (var i = 0; i < q.length; i++) { |
|
q.words[i] = 0; |
|
} |
|
} |
|
|
|
var diff = a.clone()._ishlnsubmul(b, 1, m); |
|
if (diff.negative === 0) { |
|
a = diff; |
|
if (q) { |
|
q.words[m] = 1; |
|
} |
|
} |
|
|
|
for (var j = m - 1; j >= 0; j--) { |
|
var qj = (a.words[b.length + j] | 0) * 0x4000000 + |
|
(a.words[b.length + j - 1] | 0); |
|
|
|
// NOTE: (qj / bhi) is (0x3ffffff * 0x4000000 + 0x3ffffff) / 0x2000000 max |
|
// (0x7ffffff) |
|
qj = Math.min((qj / bhi) | 0, 0x3ffffff); |
|
|
|
a._ishlnsubmul(b, qj, j); |
|
while (a.negative !== 0) { |
|
qj--; |
|
a.negative = 0; |
|
a._ishlnsubmul(b, 1, j); |
|
if (!a.isZero()) { |
|
a.negative ^= 1; |
|
} |
|
} |
|
if (q) { |
|
q.words[j] = qj; |
|
} |
|
} |
|
if (q) { |
|
q.strip(); |
|
} |
|
a.strip(); |
|
|
|
// Denormalize |
|
if (mode !== 'div' && shift !== 0) { |
|
a.iushrn(shift); |
|
} |
|
|
|
return { |
|
div: q || null, |
|
mod: a |
|
}; |
|
}; |
|
|
|
// NOTE: 1) `mode` can be set to `mod` to request mod only, |
|
// to `div` to request div only, or be absent to |
|
// request both div & mod |
|
// 2) `positive` is true if unsigned mod is requested |
|
BN.prototype.divmod = function divmod (num, mode, positive) { |
|
assert(!num.isZero()); |
|
|
|
if (this.isZero()) { |
|
return { |
|
div: new BN(0), |
|
mod: new BN(0) |
|
}; |
|
} |
|
|
|
var div, mod, res; |
|
if (this.negative !== 0 && num.negative === 0) { |
|
res = this.neg().divmod(num, mode); |
|
|
|
if (mode !== 'mod') { |
|
div = res.div.neg(); |
|
} |
|
|
|
if (mode !== 'div') { |
|
mod = res.mod.neg(); |
|
if (positive && mod.negative !== 0) { |
|
mod.iadd(num); |
|
} |
|
} |
|
|
|
return { |
|
div: div, |
|
mod: mod |
|
}; |
|
} |
|
|
|
if (this.negative === 0 && num.negative !== 0) { |
|
res = this.divmod(num.neg(), mode); |
|
|
|
if (mode !== 'mod') { |
|
div = res.div.neg(); |
|
} |
|
|
|
return { |
|
div: div, |
|
mod: res.mod |
|
}; |
|
} |
|
|
|
if ((this.negative & num.negative) !== 0) { |
|
res = this.neg().divmod(num.neg(), mode); |
|
|
|
if (mode !== 'div') { |
|
mod = res.mod.neg(); |
|
if (positive && mod.negative !== 0) { |
|
mod.isub(num); |
|
} |
|
} |
|
|
|
return { |
|
div: res.div, |
|
mod: mod |
|
}; |
|
} |
|
|
|
// Both numbers are positive at this point |
|
|
|
// Strip both numbers to approximate shift value |
|
if (num.length > this.length || this.cmp(num) < 0) { |
|
return { |
|
div: new BN(0), |
|
mod: this |
|
}; |
|
} |
|
|
|
// Very short reduction |
|
if (num.length === 1) { |
|
if (mode === 'div') { |
|
return { |
|
div: this.divn(num.words[0]), |
|
mod: null |
|
}; |
|
} |
|
|
|
if (mode === 'mod') { |
|
return { |
|
div: null, |
|
mod: new BN(this.modn(num.words[0])) |
|
}; |
|
} |
|
|
|
return { |
|
div: this.divn(num.words[0]), |
|
mod: new BN(this.modn(num.words[0])) |
|
}; |
|
} |
|
|
|
return this._wordDiv(num, mode); |
|
}; |
|
|
|
// Find `this` / `num` |
|
BN.prototype.div = function div (num) { |
|
return this.divmod(num, 'div', false).div; |
|
}; |
|
|
|
// Find `this` % `num` |
|
BN.prototype.mod = function mod (num) { |
|
return this.divmod(num, 'mod', false).mod; |
|
}; |
|
|
|
BN.prototype.umod = function umod (num) { |
|
return this.divmod(num, 'mod', true).mod; |
|
}; |
|
|
|
// Find Round(`this` / `num`) |
|
BN.prototype.divRound = function divRound (num) { |
|
var dm = this.divmod(num); |
|
|
|
// Fast case - exact division |
|
if (dm.mod.isZero()) return dm.div; |
|
|
|
var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod; |
|
|
|
var half = num.ushrn(1); |
|
var r2 = num.andln(1); |
|
var cmp = mod.cmp(half); |
|
|
|
// Round down |
|
if (cmp < 0 || r2 === 1 && cmp === 0) return dm.div; |
|
|
|
// Round up |
|
return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1); |
|
}; |
|
|
|
BN.prototype.modn = function modn (num) { |
|
assert(num <= 0x3ffffff); |
|
var p = (1 << 26) % num; |
|
|
|
var acc = 0; |
|
for (var i = this.length - 1; i >= 0; i--) { |
|
acc = (p * acc + (this.words[i] | 0)) % num; |
|
} |
|
|
|
return acc; |
|
}; |
|
|
|
// In-place division by number |
|
BN.prototype.idivn = function idivn (num) { |
|
assert(num <= 0x3ffffff); |
|
|
|
var carry = 0; |
|
for (var i = this.length - 1; i >= 0; i--) { |
|
var w = (this.words[i] | 0) + carry * 0x4000000; |
|
this.words[i] = (w / num) | 0; |
|
carry = w % num; |
|
} |
|
|
|
return this.strip(); |
|
}; |
|
|
|
BN.prototype.divn = function divn (num) { |
|
return this.clone().idivn(num); |
|
}; |
|
|
|
BN.prototype.egcd = function egcd (p) { |
|
assert(p.negative === 0); |
|
assert(!p.isZero()); |
|
|
|
var x = this; |
|
var y = p.clone(); |
|
|
|
if (x.negative !== 0) { |
|
x = x.umod(p); |
|
} else { |
|
x = x.clone(); |
|
} |
|
|
|
// A * x + B * y = x |
|
var A = new BN(1); |
|
var B = new BN(0); |
|
|
|
// C * x + D * y = y |
|
var C = new BN(0); |
|
var D = new BN(1); |
|
|
|
var g = 0; |
|
|
|
while (x.isEven() && y.isEven()) { |
|
x.iushrn(1); |
|
y.iushrn(1); |
|
++g; |
|
} |
|
|
|
var yp = y.clone(); |
|
var xp = x.clone(); |
|
|
|
while (!x.isZero()) { |
|
for (var i = 0, im = 1; (x.words[0] & im) === 0 && i < 26; ++i, im <<= 1); |
|
if (i > 0) { |
|
x.iushrn(i); |
|
while (i-- > 0) { |
|
if (A.isOdd() || B.isOdd()) { |
|
A.iadd(yp); |
|
B.isub(xp); |
|
} |
|
|
|
A.iushrn(1); |
|
B.iushrn(1); |
|
} |
|
} |
|
|
|
for (var j = 0, jm = 1; (y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1); |
|
if (j > 0) { |
|
y.iushrn(j); |
|
while (j-- > 0) { |
|
if (C.isOdd() || D.isOdd()) { |
|
C.iadd(yp); |
|
D.isub(xp); |
|
} |
|
|
|
C.iushrn(1); |
|
D.iushrn(1); |
|
} |
|
} |
|
|
|
if (x.cmp(y) >= 0) { |
|
x.isub(y); |
|
A.isub(C); |
|
B.isub(D); |
|
} else { |
|
y.isub(x); |
|
C.isub(A); |
|
D.isub(B); |
|
} |
|
} |
|
|
|
return { |
|
a: C, |
|
b: D, |
|
gcd: y.iushln(g) |
|
}; |
|
}; |
|
|
|
// This is reduced incarnation of the binary EEA |
|
// above, designated to invert members of the |
|
// _prime_ fields F(p) at a maximal speed |
|
BN.prototype._invmp = function _invmp (p) { |
|
assert(p.negative === 0); |
|
assert(!p.isZero()); |
|
|
|
var a = this; |
|
var b = p.clone(); |
|
|
|
if (a.negative !== 0) { |
|
a = a.umod(p); |
|
} else { |
|
a = a.clone(); |
|
} |
|
|
|
var x1 = new BN(1); |
|
var x2 = new BN(0); |
|
|
|
var delta = b.clone(); |
|
|
|
while (a.cmpn(1) > 0 && b.cmpn(1) > 0) { |
|
for (var i = 0, im = 1; (a.words[0] & im) === 0 && i < 26; ++i, im <<= 1); |
|
if (i > 0) { |
|
a.iushrn(i); |
|
while (i-- > 0) { |
|
if (x1.isOdd()) { |
|
x1.iadd(delta); |
|
} |
|
|
|
x1.iushrn(1); |
|
} |
|
} |
|
|
|
for (var j = 0, jm = 1; (b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1); |
|
if (j > 0) { |
|
b.iushrn(j); |
|
while (j-- > 0) { |
|
if (x2.isOdd()) { |
|
x2.iadd(delta); |
|
} |
|
|
|
x2.iushrn(1); |
|
} |
|
} |
|
|
|
if (a.cmp(b) >= 0) { |
|
a.isub(b); |
|
x1.isub(x2); |
|
} else { |
|
b.isub(a); |
|
x2.isub(x1); |
|
} |
|
} |
|
|
|
var res; |
|
if (a.cmpn(1) === 0) { |
|
res = x1; |
|
} else { |
|
res = x2; |
|
} |
|
|
|
if (res.cmpn(0) < 0) { |
|
res.iadd(p); |
|
} |
|
|
|
return res; |
|
}; |
|
|
|
BN.prototype.gcd = function gcd (num) { |
|
if (this.isZero()) return num.abs(); |
|
if (num.isZero()) return this.abs(); |
|
|
|
var a = this.clone(); |
|
var b = num.clone(); |
|
a.negative = 0; |
|
b.negative = 0; |
|
|
|
// Remove common factor of two |
|
for (var shift = 0; a.isEven() && b.isEven(); shift++) { |
|
a.iushrn(1); |
|
b.iushrn(1); |
|
} |
|
|
|
do { |
|
while (a.isEven()) { |
|
a.iushrn(1); |
|
} |
|
while (b.isEven()) { |
|
b.iushrn(1); |
|
} |
|
|
|
var r = a.cmp(b); |
|
if (r < 0) { |
|
// Swap `a` and `b` to make `a` always bigger than `b` |
|
var t = a; |
|
a = b; |
|
b = t; |
|
} else if (r === 0 || b.cmpn(1) === 0) { |
|
break; |
|
} |
|
|
|
a.isub(b); |
|
} while (true); |
|
|
|
return b.iushln(shift); |
|
}; |
|
|
|
// Invert number in the field F(num) |
|
BN.prototype.invm = function invm (num) { |
|
return this.egcd(num).a.umod(num); |
|
}; |
|
|
|
BN.prototype.isEven = function isEven () { |
|
return (this.words[0] & 1) === 0; |
|
}; |
|
|
|
BN.prototype.isOdd = function isOdd () { |
|
return (this.words[0] & 1) === 1; |
|
}; |
|
|
|
// And first word and num |
|
BN.prototype.andln = function andln (num) { |
|
return this.words[0] & num; |
|
}; |
|
|
|
// Increment at the bit position in-line |
|
BN.prototype.bincn = function bincn (bit) { |
|
assert(typeof bit === 'number'); |
|
var r = bit % 26; |
|
var s = (bit - r) / 26; |
|
var q = 1 << r; |
|
|
|
// Fast case: bit is much higher than all existing words |
|
if (this.length <= s) { |
|
this._expand(s + 1); |
|
this.words[s] |= q; |
|
return this; |
|
} |
|
|
|
// Add bit and propagate, if needed |
|
var carry = q; |
|
for (var i = s; carry !== 0 && i < this.length; i++) { |
|
var w = this.words[i] | 0; |
|
w += carry; |
|
carry = w >>> 26; |
|
w &= 0x3ffffff; |
|
this.words[i] = w; |
|
} |
|
if (carry !== 0) { |
|
this.words[i] = carry; |
|
this.length++; |
|
} |
|
return this; |
|
}; |
|
|
|
BN.prototype.isZero = function isZero () { |
|
return this.length === 1 && this.words[0] === 0; |
|
}; |
|
|
|
BN.prototype.cmpn = function cmpn (num) { |
|
var negative = num < 0; |
|
|
|
if (this.negative !== 0 && !negative) return -1; |
|
if (this.negative === 0 && negative) return 1; |
|
|
|
this.strip(); |
|
|
|
var res; |
|
if (this.length > 1) { |
|
res = 1; |
|
} else { |
|
if (negative) { |
|
num = -num; |
|
} |
|
|
|
assert(num <= 0x3ffffff, 'Number is too big'); |
|
|
|
var w = this.words[0] | 0; |
|
res = w === num ? 0 : w < num ? -1 : 1; |
|
} |
|
if (this.negative !== 0) return -res | 0; |
|
return res; |
|
}; |
|
|
|
// Compare two numbers and return: |
|
// 1 - if `this` > `num` |
|
// 0 - if `this` == `num` |
|
// -1 - if `this` < `num` |
|
BN.prototype.cmp = function cmp (num) { |
|
if (this.negative !== 0 && num.negative === 0) return -1; |
|
if (this.negative === 0 && num.negative !== 0) return 1; |
|
|
|
var res = this.ucmp(num); |
|
if (this.negative !== 0) return -res | 0; |
|
return res; |
|
}; |
|
|
|
// Unsigned comparison |
|
BN.prototype.ucmp = function ucmp (num) { |
|
// At this point both numbers have the same sign |
|
if (this.length > num.length) return 1; |
|
if (this.length < num.length) return -1; |
|
|
|
var res = 0; |
|
for (var i = this.length - 1; i >= 0; i--) { |
|
var a = this.words[i] | 0; |
|
var b = num.words[i] | 0; |
|
|
|
if (a === b) continue; |
|
if (a < b) { |
|
res = -1; |
|
} else if (a > b) { |
|
res = 1; |
|
} |
|
break; |
|
} |
|
return res; |
|
}; |
|
|
|
BN.prototype.gtn = function gtn (num) { |
|
return this.cmpn(num) === 1; |
|
}; |
|
|
|
BN.prototype.gt = function gt (num) { |
|
return this.cmp(num) === 1; |
|
}; |
|
|
|
BN.prototype.gten = function gten (num) { |
|
return this.cmpn(num) >= 0; |
|
}; |
|
|
|
BN.prototype.gte = function gte (num) { |
|
return this.cmp(num) >= 0; |
|
}; |
|
|
|
BN.prototype.ltn = function ltn (num) { |
|
return this.cmpn(num) === -1; |
|
}; |
|
|
|
BN.prototype.lt = function lt (num) { |
|
return this.cmp(num) === -1; |
|
}; |
|
|
|
BN.prototype.lten = function lten (num) { |
|
return this.cmpn(num) <= 0; |
|
}; |
|
|
|
BN.prototype.lte = function lte (num) { |
|
return this.cmp(num) <= 0; |
|
}; |
|
|
|
BN.prototype.eqn = function eqn (num) { |
|
return this.cmpn(num) === 0; |
|
}; |
|
|
|
BN.prototype.eq = function eq (num) { |
|
return this.cmp(num) === 0; |
|
}; |
|
|
|
// |
|
// A reduce context, could be using montgomery or something better, depending |
|
// on the `m` itself. |
|
// |
|
BN.red = function red (num) { |
|
return new Red(num); |
|
}; |
|
|
|
BN.prototype.toRed = function toRed (ctx) { |
|
assert(!this.red, 'Already a number in reduction context'); |
|
assert(this.negative === 0, 'red works only with positives'); |
|
return ctx.convertTo(this)._forceRed(ctx); |
|
}; |
|
|
|
BN.prototype.fromRed = function fromRed () { |
|
assert(this.red, 'fromRed works only with numbers in reduction context'); |
|
return this.red.convertFrom(this); |
|
}; |
|
|
|
BN.prototype._forceRed = function _forceRed (ctx) { |
|
this.red = ctx; |
|
return this; |
|
}; |
|
|
|
BN.prototype.forceRed = function forceRed (ctx) { |
|
assert(!this.red, 'Already a number in reduction context'); |
|
return this._forceRed(ctx); |
|
}; |
|
|
|
BN.prototype.redAdd = function redAdd (num) { |
|
assert(this.red, 'redAdd works only with red numbers'); |
|
return this.red.add(this, num); |
|
}; |
|
|
|
BN.prototype.redIAdd = function redIAdd (num) { |
|
assert(this.red, 'redIAdd works only with red numbers'); |
|
return this.red.iadd(this, num); |
|
}; |
|
|
|
BN.prototype.redSub = function redSub (num) { |
|
assert(this.red, 'redSub works only with red numbers'); |
|
return this.red.sub(this, num); |
|
}; |
|
|
|
BN.prototype.redISub = function redISub (num) { |
|
assert(this.red, 'redISub works only with red numbers'); |
|
return this.red.isub(this, num); |
|
}; |
|
|
|
BN.prototype.redShl = function redShl (num) { |
|
assert(this.red, 'redShl works only with red numbers'); |
|
return this.red.shl(this, num); |
|
}; |
|
|
|
BN.prototype.redMul = function redMul (num) { |
|
assert(this.red, 'redMul works only with red numbers'); |
|
this.red._verify2(this, num); |
|
return this.red.mul(this, num); |
|
}; |
|
|
|
BN.prototype.redIMul = function redIMul (num) { |
|
assert(this.red, 'redMul works only with red numbers'); |
|
this.red._verify2(this, num); |
|
return this.red.imul(this, num); |
|
}; |
|
|
|
BN.prototype.redSqr = function redSqr () { |
|
assert(this.red, 'redSqr works only with red numbers'); |
|
this.red._verify1(this); |
|
return this.red.sqr(this); |
|
}; |
|
|
|
BN.prototype.redISqr = function redISqr () { |
|
assert(this.red, 'redISqr works only with red numbers'); |
|
this.red._verify1(this); |
|
return this.red.isqr(this); |
|
}; |
|
|
|
// Square root over p |
|
BN.prototype.redSqrt = function redSqrt () { |
|
assert(this.red, 'redSqrt works only with red numbers'); |
|
this.red._verify1(this); |
|
return this.red.sqrt(this); |
|
}; |
|
|
|
BN.prototype.redInvm = function redInvm () { |
|
assert(this.red, 'redInvm works only with red numbers'); |
|
this.red._verify1(this); |
|
return this.red.invm(this); |
|
}; |
|
|
|
// Return negative clone of `this` % `red modulo` |
|
BN.prototype.redNeg = function redNeg () { |
|
assert(this.red, 'redNeg works only with red numbers'); |
|
this.red._verify1(this); |
|
return this.red.neg(this); |
|
}; |
|
|
|
BN.prototype.redPow = function redPow (num) { |
|
assert(this.red && !num.red, 'redPow(normalNum)'); |
|
this.red._verify1(this); |
|
return this.red.pow(this, num); |
|
}; |
|
|
|
// Prime numbers with efficient reduction |
|
var primes = { |
|
k256: null, |
|
p224: null, |
|
p192: null, |
|
p25519: null |
|
}; |
|
|
|
// Pseudo-Mersenne prime |
|
function MPrime (name, p) { |
|
// P = 2 ^ N - K |
|
this.name = name; |
|
this.p = new BN(p, 16); |
|
this.n = this.p.bitLength(); |
|
this.k = new BN(1).iushln(this.n).isub(this.p); |
|
|
|
this.tmp = this._tmp(); |
|
} |
|
|
|
MPrime.prototype._tmp = function _tmp () { |
|
var tmp = new BN(null); |
|
tmp.words = new Array(Math.ceil(this.n / 13)); |
|
return tmp; |
|
}; |
|
|
|
MPrime.prototype.ireduce = function ireduce (num) { |
|
// Assumes that `num` is less than `P^2` |
|
// num = HI * (2 ^ N - K) + HI * K + LO = HI * K + LO (mod P) |
|
var r = num; |
|
var rlen; |
|
|
|
do { |
|
this.split(r, this.tmp); |
|
r = this.imulK(r); |
|
r = r.iadd(this.tmp); |
|
rlen = r.bitLength(); |
|
} while (rlen > this.n); |
|
|
|
var cmp = rlen < this.n ? -1 : r.ucmp(this.p); |
|
if (cmp === 0) { |
|
r.words[0] = 0; |
|
r.length = 1; |
|
} else if (cmp > 0) { |
|
r.isub(this.p); |
|
} else { |
|
r.strip(); |
|
} |
|
|
|
return r; |
|
}; |
|
|
|
MPrime.prototype.split = function split (input, out) { |
|
input.iushrn(this.n, 0, out); |
|
}; |
|
|
|
MPrime.prototype.imulK = function imulK (num) { |
|
return num.imul(this.k); |
|
}; |
|
|
|
function K256 () { |
|
MPrime.call( |
|
this, |
|
'k256', |
|
'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f'); |
|
} |
|
inherits(K256, MPrime); |
|
|
|
K256.prototype.split = function split (input, output) { |
|
// 256 = 9 * 26 + 22 |
|
var mask = 0x3fffff; |
|
|
|
var outLen = Math.min(input.length, 9); |
|
for (var i = 0; i < outLen; i++) { |
|
output.words[i] = input.words[i]; |
|
} |
|
output.length = outLen; |
|
|
|
if (input.length <= 9) { |
|
input.words[0] = 0; |
|
input.length = 1; |
|
return; |
|
} |
|
|
|
// Shift by 9 limbs |
|
var prev = input.words[9]; |
|
output.words[output.length++] = prev & mask; |
|
|
|
for (i = 10; i < input.length; i++) { |
|
var next = input.words[i] | 0; |
|
input.words[i - 10] = ((next & mask) << 4) | (prev >>> 22); |
|
prev = next; |
|
} |
|
prev >>>= 22; |
|
input.words[i - 10] = prev; |
|
if (prev === 0 && input.length > 10) { |
|
input.length -= 10; |
|
} else { |
|
input.length -= 9; |
|
} |
|
}; |
|
|
|
K256.prototype.imulK = function imulK (num) { |
|
// K = 0x1000003d1 = [ 0x40, 0x3d1 ] |
|
num.words[num.length] = 0; |
|
num.words[num.length + 1] = 0; |
|
num.length += 2; |
|
|
|
// bounded at: 0x40 * 0x3ffffff + 0x3d0 = 0x100000390 |
|
var lo = 0; |
|
for (var i = 0; i < num.length; i++) { |
|
var w = num.words[i] | 0; |
|
lo += w * 0x3d1; |
|
num.words[i] = lo & 0x3ffffff; |
|
lo = w * 0x40 + ((lo / 0x4000000) | 0); |
|
} |
|
|
|
// Fast length reduction |
|
if (num.words[num.length - 1] === 0) { |
|
num.length--; |
|
if (num.words[num.length - 1] === 0) { |
|
num.length--; |
|
} |
|
} |
|
return num; |
|
}; |
|
|
|
function P224 () { |
|
MPrime.call( |
|
this, |
|
'p224', |
|
'ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001'); |
|
} |
|
inherits(P224, MPrime); |
|
|
|
function P192 () { |
|
MPrime.call( |
|
this, |
|
'p192', |
|
'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff'); |
|
} |
|
inherits(P192, MPrime); |
|
|
|
function P25519 () { |
|
// 2 ^ 255 - 19 |
|
MPrime.call( |
|
this, |
|
'25519', |
|
'7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed'); |
|
} |
|
inherits(P25519, MPrime); |
|
|
|
P25519.prototype.imulK = function imulK (num) { |
|
// K = 0x13 |
|
var carry = 0; |
|
for (var i = 0; i < num.length; i++) { |
|
var hi = (num.words[i] | 0) * 0x13 + carry; |
|
var lo = hi & 0x3ffffff; |
|
hi >>>= 26; |
|
|
|
num.words[i] = lo; |
|
carry = hi; |
|
} |
|
if (carry !== 0) { |
|
num.words[num.length++] = carry; |
|
} |
|
return num; |
|
}; |
|
|
|
// Exported mostly for testing purposes, use plain name instead |
|
BN._prime = function prime (name) { |
|
// Cached version of prime |
|
if (primes[name]) return primes[name]; |
|
|
|
var prime; |
|
if (name === 'k256') { |
|
prime = new K256(); |
|
} else if (name === 'p224') { |
|
prime = new P224(); |
|
} else if (name === 'p192') { |
|
prime = new P192(); |
|
} else if (name === 'p25519') { |
|
prime = new P25519(); |
|
} else { |
|
throw new Error('Unknown prime ' + name); |
|
} |
|
primes[name] = prime; |
|
|
|
return prime; |
|
}; |
|
|
|
// |
|
// Base reduction engine |
|
// |
|
function Red (m) { |
|
if (typeof m === 'string') { |
|
var prime = BN._prime(m); |
|
this.m = prime.p; |
|
this.prime = prime; |
|
} else { |
|
assert(m.gtn(1), 'modulus must be greater than 1'); |
|
this.m = m; |
|
this.prime = null; |
|
} |
|
} |
|
|
|
Red.prototype._verify1 = function _verify1 (a) { |
|
assert(a.negative === 0, 'red works only with positives'); |
|
assert(a.red, 'red works only with red numbers'); |
|
}; |
|
|
|
Red.prototype._verify2 = function _verify2 (a, b) { |
|
assert((a.negative | b.negative) === 0, 'red works only with positives'); |
|
assert(a.red && a.red === b.red, |
|
'red works only with red numbers'); |
|
}; |
|
|
|
Red.prototype.imod = function imod (a) { |
|
if (this.prime) return this.prime.ireduce(a)._forceRed(this); |
|
return a.umod(this.m)._forceRed(this); |
|
}; |
|
|
|
Red.prototype.neg = function neg (a) { |
|
if (a.isZero()) { |
|
return a.clone(); |
|
} |
|
|
|
return this.m.sub(a)._forceRed(this); |
|
}; |
|
|
|
Red.prototype.add = function add (a, b) { |
|
this._verify2(a, b); |
|
|
|
var res = a.add(b); |
|
if (res.cmp(this.m) >= 0) { |
|
res.isub(this.m); |
|
} |
|
return res._forceRed(this); |
|
}; |
|
|
|
Red.prototype.iadd = function iadd (a, b) { |
|
this._verify2(a, b); |
|
|
|
var res = a.iadd(b); |
|
if (res.cmp(this.m) >= 0) { |
|
res.isub(this.m); |
|
} |
|
return res; |
|
}; |
|
|
|
Red.prototype.sub = function sub (a, b) { |
|
this._verify2(a, b); |
|
|
|
var res = a.sub(b); |
|
if (res.cmpn(0) < 0) { |
|
res.iadd(this.m); |
|
} |
|
return res._forceRed(this); |
|
}; |
|
|
|
Red.prototype.isub = function isub (a, b) { |
|
this._verify2(a, b); |
|
|
|
var res = a.isub(b); |
|
if (res.cmpn(0) < 0) { |
|
res.iadd(this.m); |
|
} |
|
return res; |
|
}; |
|
|
|
Red.prototype.shl = function shl (a, num) { |
|
this._verify1(a); |
|
return this.imod(a.ushln(num)); |
|
}; |
|
|
|
Red.prototype.imul = function imul (a, b) { |
|
this._verify2(a, b); |
|
return this.imod(a.imul(b)); |
|
}; |
|
|
|
Red.prototype.mul = function mul (a, b) { |
|
this._verify2(a, b); |
|
return this.imod(a.mul(b)); |
|
}; |
|
|
|
Red.prototype.isqr = function isqr (a) { |
|
return this.imul(a, a.clone()); |
|
}; |
|
|
|
Red.prototype.sqr = function sqr (a) { |
|
return this.mul(a, a); |
|
}; |
|
|
|
Red.prototype.sqrt = function sqrt (a) { |
|
if (a.isZero()) return a.clone(); |
|
|
|
var mod3 = this.m.andln(3); |
|
assert(mod3 % 2 === 1); |
|
|
|
// Fast case |
|
if (mod3 === 3) { |
|
var pow = this.m.add(new BN(1)).iushrn(2); |
|
return this.pow(a, pow); |
|
} |
|
|
|
// Tonelli-Shanks algorithm (Totally unoptimized and slow) |
|
// |
|
// Find Q and S, that Q * 2 ^ S = (P - 1) |
|
var q = this.m.subn(1); |
|
var s = 0; |
|
while (!q.isZero() && q.andln(1) === 0) { |
|
s++; |
|
q.iushrn(1); |
|
} |
|
assert(!q.isZero()); |
|
|
|
var one = new BN(1).toRed(this); |
|
var nOne = one.redNeg(); |
|
|
|
// Find quadratic non-residue |
|
// NOTE: Max is such because of generalized Riemann hypothesis. |
|
var lpow = this.m.subn(1).iushrn(1); |
|
var z = this.m.bitLength(); |
|
z = new BN(2 * z * z).toRed(this); |
|
|
|
while (this.pow(z, lpow).cmp(nOne) !== 0) { |
|
z.redIAdd(nOne); |
|
} |
|
|
|
var c = this.pow(z, q); |
|
var r = this.pow(a, q.addn(1).iushrn(1)); |
|
var t = this.pow(a, q); |
|
var m = s; |
|
while (t.cmp(one) !== 0) { |
|
var tmp = t; |
|
for (var i = 0; tmp.cmp(one) !== 0; i++) { |
|
tmp = tmp.redSqr(); |
|
} |
|
assert(i < m); |
|
var b = this.pow(c, new BN(1).iushln(m - i - 1)); |
|
|
|
r = r.redMul(b); |
|
c = b.redSqr(); |
|
t = t.redMul(c); |
|
m = i; |
|
} |
|
|
|
return r; |
|
}; |
|
|
|
Red.prototype.invm = function invm (a) { |
|
var inv = a._invmp(this.m); |
|
if (inv.negative !== 0) { |
|
inv.negative = 0; |
|
return this.imod(inv).redNeg(); |
|
} else { |
|
return this.imod(inv); |
|
} |
|
}; |
|
|
|
Red.prototype.pow = function pow (a, num) { |
|
if (num.isZero()) return new BN(1).toRed(this); |
|
if (num.cmpn(1) === 0) return a.clone(); |
|
|
|
var windowSize = 4; |
|
var wnd = new Array(1 << windowSize); |
|
wnd[0] = new BN(1).toRed(this); |
|
wnd[1] = a; |
|
for (var i = 2; i < wnd.length; i++) { |
|
wnd[i] = this.mul(wnd[i - 1], a); |
|
} |
|
|
|
var res = wnd[0]; |
|
var current = 0; |
|
var currentLen = 0; |
|
var start = num.bitLength() % 26; |
|
if (start === 0) { |
|
start = 26; |
|
} |
|
|
|
for (i = num.length - 1; i >= 0; i--) { |
|
var word = num.words[i]; |
|
for (var j = start - 1; j >= 0; j--) { |
|
var bit = (word >> j) & 1; |
|
if (res !== wnd[0]) { |
|
res = this.sqr(res); |
|
} |
|
|
|
if (bit === 0 && current === 0) { |
|
currentLen = 0; |
|
continue; |
|
} |
|
|
|
current <<= 1; |
|
current |= bit; |
|
currentLen++; |
|
if (currentLen !== windowSize && (i !== 0 || j !== 0)) continue; |
|
|
|
res = this.mul(res, wnd[current]); |
|
currentLen = 0; |
|
current = 0; |
|
} |
|
start = 26; |
|
} |
|
|
|
return res; |
|
}; |
|
|
|
Red.prototype.convertTo = function convertTo (num) { |
|
var r = num.umod(this.m); |
|
|
|
return r === num ? r.clone() : r; |
|
}; |
|
|
|
Red.prototype.convertFrom = function convertFrom (num) { |
|
var res = num.clone(); |
|
res.red = null; |
|
return res; |
|
}; |
|
|
|
// |
|
// Montgomery method engine |
|
// |
|
|
|
BN.mont = function mont (num) { |
|
return new Mont(num); |
|
}; |
|
|
|
function Mont (m) { |
|
Red.call(this, m); |
|
|
|
this.shift = this.m.bitLength(); |
|
if (this.shift % 26 !== 0) { |
|
this.shift += 26 - (this.shift % 26); |
|
} |
|
|
|
this.r = new BN(1).iushln(this.shift); |
|
this.r2 = this.imod(this.r.sqr()); |
|
this.rinv = this.r._invmp(this.m); |
|
|
|
this.minv = this.rinv.mul(this.r).isubn(1).div(this.m); |
|
this.minv = this.minv.umod(this.r); |
|
this.minv = this.r.sub(this.minv); |
|
} |
|
inherits(Mont, Red); |
|
|
|
Mont.prototype.convertTo = function convertTo (num) { |
|
return this.imod(num.ushln(this.shift)); |
|
}; |
|
|
|
Mont.prototype.convertFrom = function convertFrom (num) { |
|
var r = this.imod(num.mul(this.rinv)); |
|
r.red = null; |
|
return r; |
|
}; |
|
|
|
Mont.prototype.imul = function imul (a, b) { |
|
if (a.isZero() || b.isZero()) { |
|
a.words[0] = 0; |
|
a.length = 1; |
|
return a; |
|
} |
|
|
|
var t = a.imul(b); |
|
var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m); |
|
var u = t.isub(c).iushrn(this.shift); |
|
var res = u; |
|
|
|
if (u.cmp(this.m) >= 0) { |
|
res = u.isub(this.m); |
|
} else if (u.cmpn(0) < 0) { |
|
res = u.iadd(this.m); |
|
} |
|
|
|
return res._forceRed(this); |
|
}; |
|
|
|
Mont.prototype.mul = function mul (a, b) { |
|
if (a.isZero() || b.isZero()) return new BN(0)._forceRed(this); |
|
|
|
var t = a.mul(b); |
|
var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m); |
|
var u = t.isub(c).iushrn(this.shift); |
|
var res = u; |
|
if (u.cmp(this.m) >= 0) { |
|
res = u.isub(this.m); |
|
} else if (u.cmpn(0) < 0) { |
|
res = u.iadd(this.m); |
|
} |
|
|
|
return res._forceRed(this); |
|
}; |
|
|
|
Mont.prototype.invm = function invm (a) { |
|
// (AR)^-1 * R^2 = (A^-1 * R^-1) * R^2 = A^-1 * R |
|
var res = this.imod(a._invmp(this.m).mul(this.r2)); |
|
return res._forceRed(this); |
|
}; |
|
})(typeof module === 'undefined' || module, this); |
|
|
|
},{"buffer":2}],38:[function(require,module,exports){ |
|
'use strict' |
|
|
|
module.exports = findBounds |
|
|
|
function findBounds(points) { |
|
var n = points.length |
|
if(n === 0) { |
|
return [[], []] |
|
} |
|
var d = points[0].length |
|
var lo = points[0].slice() |
|
var hi = points[0].slice() |
|
for(var i=1; i<n; ++i) { |
|
var p = points[i] |
|
for(var j=0; j<d; ++j) { |
|
var x = p[j] |
|
lo[j] = Math.min(lo[j], x) |
|
hi[j] = Math.max(hi[j], x) |
|
} |
|
} |
|
return [lo, hi] |
|
} |
|
},{}],39:[function(require,module,exports){ |
|
'use strict' |
|
|
|
module.exports = boxIntersectWrapper |
|
|
|
var pool = require('typedarray-pool') |
|
var sweep = require('./lib/sweep') |
|
var boxIntersectIter = require('./lib/intersect') |
|
|
|
function boxEmpty(d, box) { |
|
for(var j=0; j<d; ++j) { |
|
if(!(box[j] <= box[j+d])) { |
|
return true |
|
} |
|
} |
|
return false |
|
} |
|
|
|
//Unpack boxes into a flat typed array, remove empty boxes |
|
function convertBoxes(boxes, d, data, ids) { |
|
var ptr = 0 |
|
var count = 0 |
|
for(var i=0, n=boxes.length; i<n; ++i) { |
|
var b = boxes[i] |
|
if(boxEmpty(d, b)) { |
|
continue |
|
} |
|
for(var j=0; j<2*d; ++j) { |
|
data[ptr++] = b[j] |
|
} |
|
ids[count++] = i |
|
} |
|
return count |
|
} |
|
|
|
//Perform type conversions, check bounds |
|
function boxIntersect(red, blue, visit, full) { |
|
var n = red.length |
|
var m = blue.length |
|
|
|
//If either array is empty, then we can skip this whole thing |
|
if(n <= 0 || m <= 0) { |
|
return |
|
} |
|
|
|
//Compute dimension, if it is 0 then we skip |
|
var d = (red[0].length)>>>1 |
|
if(d <= 0) { |
|
return |
|
} |
|
|
|
var retval |
|
|
|
//Convert red boxes |
|
var redList = pool.mallocDouble(2*d*n) |
|
var redIds = pool.mallocInt32(n) |
|
n = convertBoxes(red, d, redList, redIds) |
|
|
|
if(n > 0) { |
|
if(d === 1 && full) { |
|
//Special case: 1d complete |
|
sweep.init(n) |
|
retval = sweep.sweepComplete( |
|
d, visit, |
|
0, n, redList, redIds, |
|
0, n, redList, redIds) |
|
} else { |
|
|
|
//Convert blue boxes |
|
var blueList = pool.mallocDouble(2*d*m) |
|
var blueIds = pool.mallocInt32(m) |
|
m = convertBoxes(blue, d, blueList, blueIds) |
|
|
|
if(m > 0) { |
|
sweep.init(n+m) |
|
|
|
if(d === 1) { |
|
//Special case: 1d bipartite |
|
retval = sweep.sweepBipartite( |
|
d, visit, |
|
0, n, redList, redIds, |
|
0, m, blueList, blueIds) |
|
} else { |
|
//General case: d>1 |
|
retval = boxIntersectIter( |
|
d, visit, full, |
|
n, redList, redIds, |
|
m, blueList, blueIds) |
|
} |
|
|
|
pool.free(blueList) |
|
pool.free(blueIds) |
|
} |
|
} |
|
|
|
pool.free(redList) |
|
pool.free(redIds) |
|
} |
|
|
|
return retval |
|
} |
|
|
|
|
|
var RESULT |
|
|
|
function appendItem(i,j) { |
|
RESULT.push([i,j]) |
|
} |
|
|
|
function intersectFullArray(x) { |
|
RESULT = [] |
|
boxIntersect(x, x, appendItem, true) |
|
return RESULT |
|
} |
|
|
|
function intersectBipartiteArray(x, y) { |
|
RESULT = [] |
|
boxIntersect(x, y, appendItem, false) |
|
return RESULT |
|
} |
|
|
|
//User-friendly wrapper, handle full input and no-visitor cases |
|
function boxIntersectWrapper(arg0, arg1, arg2) { |
|
var result |
|
switch(arguments.length) { |
|
case 1: |
|
return intersectFullArray(arg0) |
|
case 2: |
|
if(typeof arg1 === 'function') { |
|
return boxIntersect(arg0, arg0, arg1, true) |
|
} else { |
|
return intersectBipartiteArray(arg0, arg1) |
|
} |
|
case 3: |
|
return boxIntersect(arg0, arg1, arg2, false) |
|
default: |
|
throw new Error('box-intersect: Invalid arguments') |
|
} |
|
} |
|
},{"./lib/intersect":41,"./lib/sweep":45,"typedarray-pool":257}],40:[function(require,module,exports){ |
|
'use strict' |
|
|
|
var DIMENSION = 'd' |
|
var AXIS = 'ax' |
|
var VISIT = 'vv' |
|
var FLIP = 'fp' |
|
|
|
var ELEM_SIZE = 'es' |
|
|
|
var RED_START = 'rs' |
|
var RED_END = 're' |
|
var RED_BOXES = 'rb' |
|
var RED_INDEX = 'ri' |
|
var RED_PTR = 'rp' |
|
|
|
var BLUE_START = 'bs' |
|
var BLUE_END = 'be' |
|
var BLUE_BOXES = 'bb' |
|
var BLUE_INDEX = 'bi' |
|
var BLUE_PTR = 'bp' |
|
|
|
var RETVAL = 'rv' |
|
|
|
var INNER_LABEL = 'Q' |
|
|
|
var ARGS = [ |
|
DIMENSION, |
|
AXIS, |
|
VISIT, |
|
RED_START, |
|
RED_END, |
|
RED_BOXES, |
|
RED_INDEX, |
|
BLUE_START, |
|
BLUE_END, |
|
BLUE_BOXES, |
|
BLUE_INDEX |
|
] |
|
|
|
function generateBruteForce(redMajor, flip, full) { |
|
var funcName = 'bruteForce' + |
|
(redMajor ? 'Red' : 'Blue') + |
|
(flip ? 'Flip' : '') + |
|
(full ? 'Full' : '') |
|
|
|
var code = ['function ', funcName, '(', ARGS.join(), '){', |
|
'var ', ELEM_SIZE, '=2*', DIMENSION, ';'] |
|
|
|
var redLoop = |
|
'for(var i=' + RED_START + ',' + RED_PTR + '=' + ELEM_SIZE + '*' + RED_START + ';' + |
|
'i<' + RED_END +';' + |
|
'++i,' + RED_PTR + '+=' + ELEM_SIZE + '){' + |
|
'var x0=' + RED_BOXES + '[' + AXIS + '+' + RED_PTR + '],' + |
|
'x1=' + RED_BOXES + '[' + AXIS + '+' + RED_PTR + '+' + DIMENSION + '],' + |
|
'xi=' + RED_INDEX + '[i];' |
|
|
|
var blueLoop = |
|
'for(var j=' + BLUE_START + ',' + BLUE_PTR + '=' + ELEM_SIZE + '*' + BLUE_START + ';' + |
|
'j<' + BLUE_END + ';' + |
|
'++j,' + BLUE_PTR + '+=' + ELEM_SIZE + '){' + |
|
'var y0=' + BLUE_BOXES + '[' + AXIS + '+' + BLUE_PTR + '],' + |
|
(full ? 'y1=' + BLUE_BOXES + '[' + AXIS + '+' + BLUE_PTR + '+' + DIMENSION + '],' : '') + |
|
'yi=' + BLUE_INDEX + '[j];' |
|
|
|
if(redMajor) { |
|
code.push(redLoop, INNER_LABEL, ':', blueLoop) |
|
} else { |
|
code.push(blueLoop, INNER_LABEL, ':', redLoop) |
|
} |
|
|
|
if(full) { |
|
code.push('if(y1<x0||x1<y0)continue;') |
|
} else if(flip) { |
|
code.push('if(y0<=x0||x1<y0)continue;') |
|
} else { |
|
code.push('if(y0<x0||x1<y0)continue;') |
|
} |
|
|
|
code.push('for(var k='+AXIS+'+1;k<'+DIMENSION+';++k){'+ |
|
'var r0='+RED_BOXES+'[k+'+RED_PTR+'],'+ |
|
'r1='+RED_BOXES+'[k+'+DIMENSION+'+'+RED_PTR+'],'+ |
|
'b0='+BLUE_BOXES+'[k+'+BLUE_PTR+'],'+ |
|
'b1='+BLUE_BOXES+'[k+'+DIMENSION+'+'+BLUE_PTR+'];'+ |
|
'if(r1<b0||b1<r0)continue ' + INNER_LABEL + ';}' + |
|
'var ' + RETVAL + '=' + VISIT + '(') |
|
|
|
if(flip) { |
|
code.push('yi,xi') |
|
} else { |
|
code.push('xi,yi') |
|
} |
|
|
|
code.push(');if(' + RETVAL + '!==void 0)return ' + RETVAL + ';}}}') |
|
|
|
return { |
|
name: funcName, |
|
code: code.join('') |
|
} |
|
} |
|
|
|
function bruteForcePlanner(full) { |
|
var funcName = 'bruteForce' + (full ? 'Full' : 'Partial') |
|
var prefix = [] |
|
var fargs = ARGS.slice() |
|
if(!full) { |
|
fargs.splice(3, 0, FLIP) |
|
} |
|
|
|
var code = ['function ' + funcName + '(' + fargs.join() + '){'] |
|
|
|
function invoke(redMajor, flip) { |
|
var res = generateBruteForce(redMajor, flip, full) |
|
prefix.push(res.code) |
|
code.push('return ' + res.name + '(' + ARGS.join() + ');') |
|
} |
|
|
|
code.push('if(' + RED_END + '-' + RED_START + '>' + |
|
BLUE_END + '-' + BLUE_START + '){') |
|
|
|
if(full) { |
|
invoke(true, false) |
|
code.push('}else{') |
|
invoke(false, false) |
|
} else { |
|
code.push('if(' + FLIP + '){') |
|
invoke(true, true) |
|
code.push('}else{') |
|
invoke(true, false) |
|
code.push('}}else{if(' + FLIP + '){') |
|
invoke(false, true) |
|
code.push('}else{') |
|
invoke(false, false) |
|
code.push('}') |
|
} |
|
code.push('}}return ' + funcName) |
|
|
|
var codeStr = prefix.join('') + code.join('') |
|
var proc = new Function(codeStr) |
|
return proc() |
|
} |
|
|
|
|
|
exports.partial = bruteForcePlanner(false) |
|
exports.full = bruteForcePlanner(true) |
|
},{}],41:[function(require,module,exports){ |
|
'use strict' |
|
|
|
module.exports = boxIntersectIter |
|
|
|
var pool = require('typedarray-pool') |
|
var bits = require('bit-twiddle') |
|
var bruteForce = require('./brute') |
|
var bruteForcePartial = bruteForce.partial |
|
var bruteForceFull = bruteForce.full |
|
var sweep = require('./sweep') |
|
var findMedian = require('./median') |
|
var genPartition = require('./partition') |
|
|
|
//Twiddle parameters |
|
var BRUTE_FORCE_CUTOFF = 128 //Cut off for brute force search |
|
var SCAN_CUTOFF = (1<<22) //Cut off for two way scan |
|
var SCAN_COMPLETE_CUTOFF = (1<<22) |
|
|
|
//Partition functions |
|
var partitionInteriorContainsInterval = genPartition( |
|
'!(lo>=p0)&&!(p1>=hi)', |
|
['p0', 'p1']) |
|
|
|
var partitionStartEqual = genPartition( |
|
'lo===p0', |
|
['p0']) |
|
|
|
var partitionStartLessThan = genPartition( |
|
'lo<p0', |
|
['p0']) |
|
|
|
var partitionEndLessThanEqual = genPartition( |
|
'hi<=p0', |
|
['p0']) |
|
|
|
var partitionContainsPoint = genPartition( |
|
'lo<=p0&&p0<=hi', |
|
['p0']) |
|
|
|
var partitionContainsPointProper = genPartition( |
|
'lo<p0&&p0<=hi', |
|
['p0']) |
|
|
|
//Frame size for iterative loop |
|
var IFRAME_SIZE = 6 |
|
var DFRAME_SIZE = 2 |
|
|
|
//Data for box statck |
|
var INIT_CAPACITY = 1024 |
|
var BOX_ISTACK = pool.mallocInt32(INIT_CAPACITY) |
|
var BOX_DSTACK = pool.mallocDouble(INIT_CAPACITY) |
|
|
|
//Initialize iterative loop queue |
|
function iterInit(d, count) { |
|
var levels = (8 * bits.log2(count+1) * (d+1))|0 |
|
var maxInts = bits.nextPow2(IFRAME_SIZE*levels) |
|
if(BOX_ISTACK.length < maxInts) { |
|
pool.free(BOX_ISTACK) |
|
BOX_ISTACK = pool.mallocInt32(maxInts) |
|
} |
|
var maxDoubles = bits.nextPow2(DFRAME_SIZE*levels) |
|
if(BOX_DSTACK < maxDoubles) { |
|
pool.free(BOX_DSTACK) |
|
BOX_DSTACK = pool.mallocDouble(maxDoubles) |
|
} |
|
} |
|
|
|
//Append item to queue |
|
function iterPush(ptr, |
|
axis, |
|
redStart, redEnd, |
|
blueStart, blueEnd, |
|
state, |
|
lo, hi) { |
|
|
|
var iptr = IFRAME_SIZE * ptr |
|
BOX_ISTACK[iptr] = axis |
|
BOX_ISTACK[iptr+1] = redStart |
|
BOX_ISTACK[iptr+2] = redEnd |
|
BOX_ISTACK[iptr+3] = blueStart |
|
BOX_ISTACK[iptr+4] = blueEnd |
|
BOX_ISTACK[iptr+5] = state |
|
|
|
var dptr = DFRAME_SIZE * ptr |
|
BOX_DSTACK[dptr] = lo |
|
BOX_DSTACK[dptr+1] = hi |
|
} |
|
|
|
//Special case: Intersect single point with list of intervals |
|
function onePointPartial( |
|
d, axis, visit, flip, |
|
redStart, redEnd, red, redIndex, |
|
blueOffset, blue, blueId) { |
|
|
|
var elemSize = 2 * d |
|
var bluePtr = blueOffset * elemSize |
|
var blueX = blue[bluePtr + axis] |
|
|
|
red_loop: |
|
for(var i=redStart, redPtr=redStart*elemSize; i<redEnd; ++i, redPtr+=elemSize) { |
|
var r0 = red[redPtr+axis] |
|
var r1 = red[redPtr+axis+d] |
|
if(blueX < r0 || r1 < blueX) { |
|
continue |
|
} |
|
if(flip && blueX === r0) { |
|
continue |
|
} |
|
var redId = redIndex[i] |
|
for(var j=axis+1; j<d; ++j) { |
|
var r0 = red[redPtr+j] |
|
var r1 = red[redPtr+j+d] |
|
var b0 = blue[bluePtr+j] |
|
var b1 = blue[bluePtr+j+d] |
|
if(r1 < b0 || b1 < r0) { |
|
continue red_loop |
|
} |
|
} |
|
var retval |
|
if(flip) { |
|
retval = visit(blueId, redId) |
|
} else { |
|
retval = visit(redId, blueId) |
|
} |
|
if(retval !== void 0) { |
|
return retval |
|
} |
|
} |
|
} |
|
|
|
//Special case: Intersect one point with list of intervals |
|
function onePointFull( |
|
d, axis, visit, |
|
redStart, redEnd, red, redIndex, |
|
blueOffset, blue, blueId) { |
|
|
|
var elemSize = 2 * d |
|
var bluePtr = blueOffset * elemSize |
|
var blueX = blue[bluePtr + axis] |
|
|
|
red_loop: |
|
for(var i=redStart, redPtr=redStart*elemSize; i<redEnd; ++i, redPtr+=elemSize) { |
|
var redId = redIndex[i] |
|
if(redId === blueId) { |
|
continue |
|
} |
|
var r0 = red[redPtr+axis] |
|
var r1 = red[redPtr+axis+d] |
|
if(blueX < r0 || r1 < blueX) { |
|
continue |
|
} |
|
for(var j=axis+1; j<d; ++j) { |
|
var r0 = red[redPtr+j] |
|
var r1 = red[redPtr+j+d] |
|
var b0 = blue[bluePtr+j] |
|
var b1 = blue[bluePtr+j+d] |
|
if(r1 < b0 || b1 < r0) { |
|
continue red_loop |
|
} |
|
} |
|
var retval = visit(redId, blueId) |
|
if(retval !== void 0) { |
|
return retval |
|
} |
|
} |
|
} |
|
|
|
//The main box intersection routine |
|
function boxIntersectIter( |
|
d, visit, initFull, |
|
xSize, xBoxes, xIndex, |
|
ySize, yBoxes, yIndex) { |
|
|
|
//Reserve memory for stack |
|
iterInit(d, xSize + ySize) |
|
|
|
var top = 0 |
|
var elemSize = 2 * d |
|
var retval |
|
|
|
iterPush(top++, |
|
0, |
|
0, xSize, |
|
0, ySize, |
|
initFull ? 16 : 0, |
|
-Infinity, Infinity) |
|
if(!initFull) { |
|
iterPush(top++, |
|
0, |
|
0, ySize, |
|
0, xSize, |
|
1, |
|
-Infinity, Infinity) |
|
} |
|
|
|
while(top > 0) { |
|
top -= 1 |
|
|
|
var iptr = top * IFRAME_SIZE |
|
var axis = BOX_ISTACK[iptr] |
|
var redStart = BOX_ISTACK[iptr+1] |
|
var redEnd = BOX_ISTACK[iptr+2] |
|
var blueStart = BOX_ISTACK[iptr+3] |
|
var blueEnd = BOX_ISTACK[iptr+4] |
|
var state = BOX_ISTACK[iptr+5] |
|
|
|
var dptr = top * DFRAME_SIZE |
|
var lo = BOX_DSTACK[dptr] |
|
var hi = BOX_DSTACK[dptr+1] |
|
|
|
//Unpack state info |
|
var flip = (state & 1) |
|
var full = !!(state & 16) |
|
|
|
//Unpack indices |
|
var red = xBoxes |
|
var redIndex = xIndex |
|
var blue = yBoxes |
|
var blueIndex = yIndex |
|
if(flip) { |
|
red = yBoxes |
|
redIndex = yIndex |
|
blue = xBoxes |
|
blueIndex = xIndex |
|
} |
|
|
|
if(state & 2) { |
|
redEnd = partitionStartLessThan( |
|
d, axis, |
|
redStart, redEnd, red, redIndex, |
|
hi) |
|
if(redStart >= redEnd) { |
|
continue |
|
} |
|
} |
|
if(state & 4) { |
|
redStart = partitionEndLessThanEqual( |
|
d, axis, |
|
redStart, redEnd, red, redIndex, |
|
lo) |
|
if(redStart >= redEnd) { |
|
continue |
|
} |
|
} |
|
|
|
var redCount = redEnd - redStart |
|
var blueCount = blueEnd - blueStart |
|
|
|
if(full) { |
|
if(d * redCount * (redCount + blueCount) < SCAN_COMPLETE_CUTOFF) { |
|
retval = sweep.scanComplete( |
|
d, axis, visit, |
|
redStart, redEnd, red, redIndex, |
|
blueStart, blueEnd, blue, blueIndex) |
|
if(retval !== void 0) { |
|
return retval |
|
} |
|
continue |
|
} |
|
} else { |
|
if(d * Math.min(redCount, blueCount) < BRUTE_FORCE_CUTOFF) { |
|
//If input small, then use brute force |
|
retval = bruteForcePartial( |
|
d, axis, visit, flip, |
|
redStart, redEnd, red, redIndex, |
|
blueStart, blueEnd, blue, blueIndex) |
|
if(retval !== void 0) { |
|
return retval |
|
} |
|
continue |
|
} else if(d * redCount * blueCount < SCAN_CUTOFF) { |
|
//If input medium sized, then use sweep and prune |
|
retval = sweep.scanBipartite( |
|
d, axis, visit, flip, |
|
redStart, redEnd, red, redIndex, |
|
blueStart, blueEnd, blue, blueIndex) |
|
if(retval !== void 0) { |
|
return retval |
|
} |
|
continue |
|
} |
|
} |
|
|
|
//First, find all red intervals whose interior contains (lo,hi) |
|
var red0 = partitionInteriorContainsInterval( |
|
d, axis, |
|
redStart, redEnd, red, redIndex, |
|
lo, hi) |
|
|
|
//Lower dimensional case |
|
if(redStart < red0) { |
|
|
|
if(d * (red0 - redStart) < BRUTE_FORCE_CUTOFF) { |
|
//Special case for small inputs: use brute force |
|
retval = bruteForceFull( |
|
d, axis+1, visit, |
|
redStart, red0, red, redIndex, |
|
blueStart, blueEnd, blue, blueIndex) |
|
if(retval !== void 0) { |
|
return retval |
|
} |
|
} else if(axis === d-2) { |
|
if(flip) { |
|
retval = sweep.sweepBipartite( |
|
d, visit, |
|
blueStart, blueEnd, blue, blueIndex, |
|
redStart, red0, red, redIndex) |
|
} else { |
|
retval = sweep.sweepBipartite( |
|
d, visit, |
|
redStart, red0, red, redIndex, |
|
blueStart, blueEnd, blue, blueIndex) |
|
} |
|
if(retval !== void 0) { |
|
return retval |
|
} |
|
} else { |
|
iterPush(top++, |
|
axis+1, |
|
redStart, red0, |
|
blueStart, blueEnd, |
|
flip, |
|
-Infinity, Infinity) |
|
iterPush(top++, |
|
axis+1, |
|
blueStart, blueEnd, |
|
redStart, red0, |
|
flip^1, |
|
-Infinity, Infinity) |
|
} |
|
} |
|
|
|
//Divide and conquer phase |
|
if(red0 < redEnd) { |
|
|
|
//Cut blue into 3 parts: |
|
// |
|
// Points < mid point |
|
// Points = mid point |
|
// Points > mid point |
|
// |
|
var blue0 = findMedian( |
|
d, axis, |
|
blueStart, blueEnd, blue, blueIndex) |
|
var mid = blue[elemSize * blue0 + axis] |
|
var blue1 = partitionStartEqual( |
|
d, axis, |
|
blue0, blueEnd, blue, blueIndex, |
|
mid) |
|
|
|
//Right case |
|
if(blue1 < blueEnd) { |
|
iterPush(top++, |
|
axis, |
|
red0, redEnd, |
|
blue1, blueEnd, |
|
(flip|4) + (full ? 16 : 0), |
|
mid, hi) |
|
} |
|
|
|
//Left case |
|
if(blueStart < blue0) { |
|
iterPush(top++, |
|
axis, |
|
red0, redEnd, |
|
blueStart, blue0, |
|
(flip|2) + (full ? 16 : 0), |
|
lo, mid) |
|
} |
|
|
|
//Center case (the hard part) |
|
if(blue0 + 1 === blue1) { |
|
//Optimization: Range with exactly 1 point, use a brute force scan |
|
if(full) { |
|
retval = onePointFull( |
|
d, axis, visit, |
|
red0, redEnd, red, redIndex, |
|
blue0, blue, blueIndex[blue0]) |
|
} else { |
|
retval = onePointPartial( |
|
d, axis, visit, flip, |
|
red0, redEnd, red, redIndex, |
|
blue0, blue, blueIndex[blue0]) |
|
} |
|
if(retval !== void 0) { |
|
return retval |
|
} |
|
} else if(blue0 < blue1) { |
|
var red1 |
|
if(full) { |
|
//If full intersection, need to handle special case |
|
red1 = partitionContainsPoint( |
|
d, axis, |
|
red0, redEnd, red, redIndex, |
|
mid) |
|
if(red0 < red1) { |
|
var redX = partitionStartEqual( |
|
d, axis, |
|
red0, red1, red, redIndex, |
|
mid) |
|
if(axis === d-2) { |
|
//Degenerate sweep intersection: |
|
// [red0, redX] with [blue0, blue1] |
|
if(red0 < redX) { |
|
retval = sweep.sweepComplete( |
|
d, visit, |
|
red0, redX, red, redIndex, |
|
blue0, blue1, blue, blueIndex) |
|
if(retval !== void 0) { |
|
return retval |
|
} |
|
} |
|
|
|
//Normal sweep intersection: |
|
// [redX, red1] with [blue0, blue1] |
|
if(redX < red1) { |
|
retval = sweep.sweepBipartite( |
|
d, visit, |
|
redX, red1, red, redIndex, |
|
blue0, blue1, blue, blueIndex) |
|
if(retval !== void 0) { |
|
return retval |
|
} |
|
} |
|
} else { |
|
if(red0 < redX) { |
|
iterPush(top++, |
|
axis+1, |
|
red0, redX, |
|
blue0, blue1, |
|
16, |
|
-Infinity, Infinity) |
|
} |
|
if(redX < red1) { |
|
iterPush(top++, |
|
axis+1, |
|
redX, red1, |
|
blue0, blue1, |
|
0, |
|
-Infinity, Infinity) |
|
iterPush(top++, |
|
axis+1, |
|
blue0, blue1, |
|
redX, red1, |
|
1, |
|
-Infinity, Infinity) |
|
} |
|
} |
|
} |
|
} else { |
|
if(flip) { |
|
red1 = partitionContainsPointProper( |
|
d, axis, |
|
red0, redEnd, red, redIndex, |
|
mid) |
|
} else { |
|
red1 = partitionContainsPoint( |
|
d, axis, |
|
red0, redEnd, red, redIndex, |
|
mid) |
|
} |
|
if(red0 < red1) { |
|
if(axis === d-2) { |
|
if(flip) { |
|
retval = sweep.sweepBipartite( |
|
d, visit, |
|
blue0, blue1, blue, blueIndex, |
|
red0, red1, red, redIndex) |
|
} else { |
|
retval = sweep.sweepBipartite( |
|
d, visit, |
|
red0, red1, red, redIndex, |
|
blue0, blue1, blue, blueIndex) |
|
} |
|
} else { |
|
iterPush(top++, |
|
axis+1, |
|
red0, red1, |
|
blue0, blue1, |
|
flip, |
|
-Infinity, Infinity) |
|
iterPush(top++, |
|
axis+1, |
|
blue0, blue1, |
|
red0, red1, |
|
flip^1, |
|
-Infinity, Infinity) |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
},{"./brute":40,"./median":42,"./partition":43,"./sweep":45,"bit-twiddle":36,"typedarray-pool":257}],42:[function(require,module,exports){ |
|
'use strict' |
|
|
|
module.exports = findMedian |
|
|
|
var genPartition = require('./partition') |
|
|
|
var partitionStartLessThan = genPartition('lo<p0', ['p0']) |
|
|
|
var PARTITION_THRESHOLD = 8 //Cut off for using insertion sort in findMedian |
|
|
|
//Base case for median finding: Use insertion sort |
|
function insertionSort(d, axis, start, end, boxes, ids) { |
|
var elemSize = 2 * d |
|
var boxPtr = elemSize * (start+1) + axis |
|
for(var i=start+1; i<end; ++i, boxPtr+=elemSize) { |
|
var x = boxes[boxPtr] |
|
for(var j=i, ptr=elemSize*(i-1); |
|
j>start && boxes[ptr+axis] > x; |
|
--j, ptr-=elemSize) { |
|
//Swap |
|
var aPtr = ptr |
|
var bPtr = ptr+elemSize |
|
for(var k=0; k<elemSize; ++k, ++aPtr, ++bPtr) { |
|
var y = boxes[aPtr] |
|
boxes[aPtr] = boxes[bPtr] |
|
boxes[bPtr] = y |
|
} |
|
var tmp = ids[j] |
|
ids[j] = ids[j-1] |
|
ids[j-1] = tmp |
|
} |
|
} |
|
} |
|
|
|
//Find median using quick select algorithm |
|
// takes O(n) time with high probability |
|
function findMedian(d, axis, start, end, boxes, ids) { |
|
if(end <= start+1) { |
|
return start |
|
} |
|
|
|
var lo = start |
|
var hi = end |
|
var mid = ((end + start) >>> 1) |
|
var elemSize = 2*d |
|
var pivot = mid |
|
var value = boxes[elemSize*mid+axis] |
|
|
|
while(lo < hi) { |
|
if(hi - lo < PARTITION_THRESHOLD) { |
|
insertionSort(d, axis, lo, hi, boxes, ids) |
|
value = boxes[elemSize*mid+axis] |
|
break |
|
} |
|
|
|
//Select pivot using median-of-3 |
|
var count = hi - lo |
|
var pivot0 = (Math.random()*count+lo)|0 |
|
var value0 = boxes[elemSize*pivot0 + axis] |
|
var pivot1 = (Math.random()*count+lo)|0 |
|
var value1 = boxes[elemSize*pivot1 + axis] |
|
var pivot2 = (Math.random()*count+lo)|0 |
|
var value2 = boxes[elemSize*pivot2 + axis] |
|
if(value0 <= value1) { |
|
if(value2 >= value1) { |
|
pivot = pivot1 |
|
value = value1 |
|
} else if(value0 >= value2) { |
|
pivot = pivot0 |
|
value = value0 |
|
} else { |
|
pivot = pivot2 |
|
value = value2 |
|
} |
|
} else { |
|
if(value1 >= value2) { |
|
pivot = pivot1 |
|
value = value1 |
|
} else if(value2 >= value0) { |
|
pivot = pivot0 |
|
value = value0 |
|
} else { |
|
pivot = pivot2 |
|
value = value2 |
|
} |
|
} |
|
|
|
//Swap pivot to end of array |
|
var aPtr = elemSize * (hi-1) |
|
var bPtr = elemSize * pivot |
|
for(var i=0; i<elemSize; ++i, ++aPtr, ++bPtr) { |
|
var x = boxes[aPtr] |
|
boxes[aPtr] = boxes[bPtr] |
|
boxes[bPtr] = x |
|
} |
|
var y = ids[hi-1] |
|
ids[hi-1] = ids[pivot] |
|
ids[pivot] = y |
|
|
|
//Partition using pivot |
|
pivot = partitionStartLessThan( |
|
d, axis, |
|
lo, hi-1, boxes, ids, |
|
value) |
|
|
|
//Swap pivot back |
|
var aPtr = elemSize * (hi-1) |
|
var bPtr = elemSize * pivot |
|
for(var i=0; i<elemSize; ++i, ++aPtr, ++bPtr) { |
|
var x = boxes[aPtr] |
|
boxes[aPtr] = boxes[bPtr] |
|
boxes[bPtr] = x |
|
} |
|
var y = ids[hi-1] |
|
ids[hi-1] = ids[pivot] |
|
ids[pivot] = y |
|
|
|
//Swap pivot to last pivot |
|
if(mid < pivot) { |
|
hi = pivot-1 |
|
while(lo < hi && |
|
boxes[elemSize*(hi-1)+axis] === value) { |
|
hi -= 1 |
|
} |
|
hi += 1 |
|
} else if(pivot < mid) { |
|
lo = pivot + 1 |
|
while(lo < hi && |
|
boxes[elemSize*lo+axis] === value) { |
|
lo += 1 |
|
} |
|
} else { |
|
break |
|
} |
|
} |
|
|
|
//Make sure pivot is at start |
|
return partitionStartLessThan( |
|
d, axis, |
|
start, mid, boxes, ids, |
|
boxes[elemSize*mid+axis]) |
|
} |
|
},{"./partition":43}],43:[function(require,module,exports){ |
|
'use strict' |
|
|
|
module.exports = genPartition |
|
|
|
var code = 'for(var j=2*a,k=j*c,l=k,m=c,n=b,o=a+b,p=c;d>p;++p,k+=j){var _;if($)if(m===p)m+=1,l+=j;else{for(var s=0;j>s;++s){var t=e[k+s];e[k+s]=e[l],e[l++]=t}var u=f[p];f[p]=f[m],f[m++]=u}}return m' |
|
|
|
function genPartition(predicate, args) { |
|
var fargs ='abcdef'.split('').concat(args) |
|
var reads = [] |
|
if(predicate.indexOf('lo') >= 0) { |
|
reads.push('lo=e[k+n]') |
|
} |
|
if(predicate.indexOf('hi') >= 0) { |
|
reads.push('hi=e[k+o]') |
|
} |
|
fargs.push( |
|
code.replace('_', reads.join()) |
|
.replace('$', predicate)) |
|
return Function.apply(void 0, fargs) |
|
} |
|
},{}],44:[function(require,module,exports){ |
|
'use strict'; |
|
|
|
//This code is extracted from ndarray-sort |
|
//It is inlined here as a temporary workaround |
|
|
|
module.exports = wrapper; |
|
|
|
var INSERT_SORT_CUTOFF = 32 |
|
|
|
function wrapper(data, n0) { |
|
if (n0 <= 4*INSERT_SORT_CUTOFF) { |
|
insertionSort(0, n0 - 1, data); |
|
} else { |
|
quickSort(0, n0 - 1, data); |
|
} |
|
} |
|
|
|
function insertionSort(left, right, data) { |
|
var ptr = 2*(left+1) |
|
for(var i=left+1; i<=right; ++i) { |
|
var a = data[ptr++] |
|
var b = data[ptr++] |
|
var j = i |
|
var jptr = ptr-2 |
|
while(j-- > left) { |
|
var x = data[jptr-2] |
|
var y = data[jptr-1] |
|
if(x < a) { |
|
break |
|
} else if(x === a && y < b) { |
|
break |
|
} |
|
data[jptr] = x |
|
data[jptr+1] = y |
|
jptr -= 2 |
|
} |
|
data[jptr] = a |
|
data[jptr+1] = b |
|
} |
|
} |
|
|
|
function swap(i, j, data) { |
|
i *= 2 |
|
j *= 2 |
|
var x = data[i] |
|
var y = data[i+1] |
|
data[i] = data[j] |
|
data[i+1] = data[j+1] |
|
data[j] = x |
|
data[j+1] = y |
|
} |
|
|
|
function move(i, j, data) { |
|
i *= 2 |
|
j *= 2 |
|
data[i] = data[j] |
|
data[i+1] = data[j+1] |
|
} |
|
|
|
function rotate(i, j, k, data) { |
|
i *= 2 |
|
j *= 2 |
|
k *= 2 |
|
var x = data[i] |
|
var y = data[i+1] |
|
data[i] = data[j] |
|
data[i+1] = data[j+1] |
|
data[j] = data[k] |
|
data[j+1] = data[k+1] |
|
data[k] = x |
|
data[k+1] = y |
|
} |
|
|
|
function shufflePivot(i, j, px, py, data) { |
|
i *= 2 |
|
j *= 2 |
|
data[i] = data[j] |
|
data[j] = px |
|
data[i+1] = data[j+1] |
|
data[j+1] = py |
|
} |
|
|
|
function compare(i, j, data) { |
|
i *= 2 |
|
j *= 2 |
|
var x = data[i], |
|
y = data[j] |
|
if(x < y) { |
|
return false |
|
} else if(x === y) { |
|
return data[i+1] > data[j+1] |
|
} |
|
return true |
|
} |
|
|
|
function comparePivot(i, y, b, data) { |
|
i *= 2 |
|
var x = data[i] |
|
if(x < y) { |
|
return true |
|
} else if(x === y) { |
|
return data[i+1] < b |
|
} |
|
return false |
|
} |
|
|
|
function quickSort(left, right, data) { |
|
var sixth = (right - left + 1) / 6 | 0, |
|
index1 = left + sixth, |
|
index5 = right - sixth, |
|
index3 = left + right >> 1, |
|
index2 = index3 - sixth, |
|
index4 = index3 + sixth, |
|
el1 = index1, |
|
el2 = index2, |
|
el3 = index3, |
|
el4 = index4, |
|
el5 = index5, |
|
less = left + 1, |
|
great = right - 1, |
|
tmp = 0 |
|
if(compare(el1, el2, data)) { |
|
tmp = el1 |
|
el1 = el2 |
|
el2 = tmp |
|
} |
|
if(compare(el4, el5, data)) { |
|
tmp = el4 |
|
el4 = el5 |
|
el5 = tmp |
|
} |
|
if(compare(el1, el3, data)) { |
|
tmp = el1 |
|
el1 = el3 |
|
el3 = tmp |
|
} |
|
if(compare(el2, el3, data)) { |
|
tmp = el2 |
|
el2 = el3 |
|
el3 = tmp |
|
} |
|
if(compare(el1, el4, data)) { |
|
tmp = el1 |
|
el1 = el4 |
|
el4 = tmp |
|
} |
|
if(compare(el3, el4, data)) { |
|
tmp = el3 |
|
el3 = el4 |
|
el4 = tmp |
|
} |
|
if(compare(el2, el5, data)) { |
|
tmp = el2 |
|
el2 = el5 |
|
el5 = tmp |
|
} |
|
if(compare(el2, el3, data)) { |
|
tmp = el2 |
|
el2 = el3 |
|
el3 = tmp |
|
} |
|
if(compare(el4, el5, data)) { |
|
tmp = el4 |
|
el4 = el5 |
|
el5 = tmp |
|
} |
|
|
|
var pivot1X = data[2*el2] |
|
var pivot1Y = data[2*el2+1] |
|
var pivot2X = data[2*el4] |
|
var pivot2Y = data[2*el4+1] |
|
|
|
var ptr0 = 2 * el1; |
|
var ptr2 = 2 * el3; |
|
var ptr4 = 2 * el5; |
|
var ptr5 = 2 * index1; |
|
var ptr6 = 2 * index3; |
|
var ptr7 = 2 * index5; |
|
for (var i1 = 0; i1 < 2; ++i1) { |
|
var x = data[ptr0+i1]; |
|
var y = data[ptr2+i1]; |
|
var z = data[ptr4+i1]; |
|
data[ptr5+i1] = x; |
|
data[ptr6+i1] = y; |
|
data[ptr7+i1] = z; |
|
} |
|
|
|
move(index2, left, data) |
|
move(index4, right, data) |
|
for (var k = less; k <= great; ++k) { |
|
if (comparePivot(k, pivot1X, pivot1Y, data)) { |
|
if (k !== less) { |
|
swap(k, less, data) |
|
} |
|
++less; |
|
} else { |
|
if (!comparePivot(k, pivot2X, pivot2Y, data)) { |
|
while (true) { |
|
if (!comparePivot(great, pivot2X, pivot2Y, data)) { |
|
if (--great < k) { |
|
break; |
|
} |
|
continue; |
|
} else { |
|
if (comparePivot(great, pivot1X, pivot1Y, data)) { |
|
rotate(k, less, great, data) |
|
++less; |
|
--great; |
|
} else { |
|
swap(k, great, data) |
|
--great; |
|
} |
|
break; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
shufflePivot(left, less-1, pivot1X, pivot1Y, data) |
|
shufflePivot(right, great+1, pivot2X, pivot2Y, data) |
|
if (less - 2 - left <= INSERT_SORT_CUTOFF) { |
|
insertionSort(left, less - 2, data); |
|
} else { |
|
quickSort(left, less - 2, data); |
|
} |
|
if (right - (great + 2) <= INSERT_SORT_CUTOFF) { |
|
insertionSort(great + 2, right, data); |
|
} else { |
|
quickSort(great + 2, right, data); |
|
} |
|
if (great - less <= INSERT_SORT_CUTOFF) { |
|
insertionSort(less, great, data); |
|
} else { |
|
quickSort(less, great, data); |
|
} |
|
} |
|
},{}],45:[function(require,module,exports){ |
|
'use strict' |
|
|
|
module.exports = { |
|
init: sqInit, |
|
sweepBipartite: sweepBipartite, |
|
sweepComplete: sweepComplete, |
|
scanBipartite: scanBipartite, |
|
scanComplete: scanComplete |
|
} |
|
|
|
var pool = require('typedarray-pool') |
|
var bits = require('bit-twiddle') |
|
var isort = require('./sort') |
|
|
|
//Flag for blue |
|
var BLUE_FLAG = (1<<28) |
|
|
|
//1D sweep event queue stuff (use pool to save space) |
|
var INIT_CAPACITY = 1024 |
|
var RED_SWEEP_QUEUE = pool.mallocInt32(INIT_CAPACITY) |
|
var RED_SWEEP_INDEX = pool.mallocInt32(INIT_CAPACITY) |
|
var BLUE_SWEEP_QUEUE = pool.mallocInt32(INIT_CAPACITY) |
|
var BLUE_SWEEP_INDEX = pool.mallocInt32(INIT_CAPACITY) |
|
var COMMON_SWEEP_QUEUE = pool.mallocInt32(INIT_CAPACITY) |
|
var COMMON_SWEEP_INDEX = pool.mallocInt32(INIT_CAPACITY) |
|
var SWEEP_EVENTS = pool.mallocDouble(INIT_CAPACITY * 8) |
|
|
|
//Reserves memory for the 1D sweep data structures |
|
function sqInit(count) { |
|
var rcount = bits.nextPow2(count) |
|
if(RED_SWEEP_QUEUE.length < rcount) { |
|
pool.free(RED_SWEEP_QUEUE) |
|
RED_SWEEP_QUEUE = pool.mallocInt32(rcount) |
|
} |
|
if(RED_SWEEP_INDEX.length < rcount) { |
|
pool.free(RED_SWEEP_INDEX) |
|
RED_SWEEP_INDEX = pool.mallocInt32(rcount) |
|
} |
|
if(BLUE_SWEEP_QUEUE.length < rcount) { |
|
pool.free(BLUE_SWEEP_QUEUE) |
|
BLUE_SWEEP_QUEUE = pool.mallocInt32(rcount) |
|
} |
|
if(BLUE_SWEEP_INDEX.length < rcount) { |
|
pool.free(BLUE_SWEEP_INDEX) |
|
BLUE_SWEEP_INDEX = pool.mallocInt32(rcount) |
|
} |
|
if(COMMON_SWEEP_QUEUE.length < rcount) { |
|
pool.free(COMMON_SWEEP_QUEUE) |
|
COMMON_SWEEP_QUEUE = pool.mallocInt32(rcount) |
|
} |
|
if(COMMON_SWEEP_INDEX.length < rcount) { |
|
pool.free(COMMON_SWEEP_INDEX) |
|
COMMON_SWEEP_INDEX = pool.mallocInt32(rcount) |
|
} |
|
var eventLength = 8 * rcount |
|
if(SWEEP_EVENTS.length < eventLength) { |
|
pool.free(SWEEP_EVENTS) |
|
SWEEP_EVENTS = pool.mallocDouble(eventLength) |
|
} |
|
} |
|
|
|
//Remove an item from the active queue in O(1) |
|
function sqPop(queue, index, count, item) { |
|
var idx = index[item] |
|
var top = queue[count-1] |
|
queue[idx] = top |
|
index[top] = idx |
|
} |
|
|
|
//Insert an item into the active queue in O(1) |
|
function sqPush(queue, index, count, item) { |
|
queue[count] = item |
|
index[item] = count |
|
} |
|
|
|
//Recursion base case: use 1D sweep algorithm |
|
function sweepBipartite( |
|
d, visit, |
|
redStart, redEnd, red, redIndex, |
|
blueStart, blueEnd, blue, blueIndex) { |
|
|
|
//store events as pairs [coordinate, idx] |
|
// |
|
// red create: -(idx+1) |
|
// red destroy: idx |
|
// blue create: -(idx+BLUE_FLAG) |
|
// blue destroy: idx+BLUE_FLAG |
|
// |
|
var ptr = 0 |
|
var elemSize = 2*d |
|
var istart = d-1 |
|
var iend = elemSize-1 |
|
|
|
for(var i=redStart; i<redEnd; ++i) { |
|
var idx = redIndex[i] |
|
var redOffset = elemSize*i |
|
SWEEP_EVENTS[ptr++] = red[redOffset+istart] |
|
SWEEP_EVENTS[ptr++] = -(idx+1) |
|
SWEEP_EVENTS[ptr++] = red[redOffset+iend] |
|
SWEEP_EVENTS[ptr++] = idx |
|
} |
|
|
|
for(var i=blueStart; i<blueEnd; ++i) { |
|
var idx = blueIndex[i]+BLUE_FLAG |
|
var blueOffset = elemSize*i |
|
SWEEP_EVENTS[ptr++] = blue[blueOffset+istart] |
|
SWEEP_EVENTS[ptr++] = -idx |
|
SWEEP_EVENTS[ptr++] = blue[blueOffset+iend] |
|
SWEEP_EVENTS[ptr++] = idx |
|
} |
|
|
|
//process events from left->right |
|
var n = ptr >>> 1 |
|
isort(SWEEP_EVENTS, n) |
|
|
|
var redActive = 0 |
|
var blueActive = 0 |
|
for(var i=0; i<n; ++i) { |
|
var e = SWEEP_EVENTS[2*i+1]|0 |
|
if(e >= BLUE_FLAG) { |
|
//blue destroy event |
|
e = (e-BLUE_FLAG)|0 |
|
sqPop(BLUE_SWEEP_QUEUE, BLUE_SWEEP_INDEX, blueActive--, e) |
|
} else if(e >= 0) { |
|
//red destroy event |
|
sqPop(RED_SWEEP_QUEUE, RED_SWEEP_INDEX, redActive--, e) |
|
} else if(e <= -BLUE_FLAG) { |
|
//blue create event |
|
e = (-e-BLUE_FLAG)|0 |
|
for(var j=0; j<redActive; ++j) { |
|
var retval = visit(RED_SWEEP_QUEUE[j], e) |
|
if(retval !== void 0) { |
|
return retval |
|
} |
|
} |
|
sqPush(BLUE_SWEEP_QUEUE, BLUE_SWEEP_INDEX, blueActive++, e) |
|
} else { |
|
//red create event |
|
e = (-e-1)|0 |
|
for(var j=0; j<blueActive; ++j) { |
|
var retval = visit(e, BLUE_SWEEP_QUEUE[j]) |
|
if(retval !== void 0) { |
|
return retval |
|
} |
|
} |
|
sqPush(RED_SWEEP_QUEUE, RED_SWEEP_INDEX, redActive++, e) |
|
} |
|
} |
|
} |
|
|
|
//Complete sweep |
|
function sweepComplete(d, visit, |
|
redStart, redEnd, red, redIndex, |
|
blueStart, blueEnd, blue, blueIndex) { |
|
|
|
var ptr = 0 |
|
var elemSize = 2*d |
|
var istart = d-1 |
|
var iend = elemSize-1 |
|
|
|
for(var i=redStart; i<redEnd; ++i) { |
|
var idx = (redIndex[i]+1)<<1 |
|
var redOffset = elemSize*i |
|
SWEEP_EVENTS[ptr++] = red[redOffset+istart] |
|
SWEEP_EVENTS[ptr++] = -idx |
|
SWEEP_EVENTS[ptr++] = red[redOffset+iend] |
|
SWEEP_EVENTS[ptr++] = idx |
|
} |
|
|
|
for(var i=blueStart; i<blueEnd; ++i) { |
|
var idx = (blueIndex[i]+1)<<1 |
|
var blueOffset = elemSize*i |
|
SWEEP_EVENTS[ptr++] = blue[blueOffset+istart] |
|
SWEEP_EVENTS[ptr++] = (-idx)|1 |
|
SWEEP_EVENTS[ptr++] = blue[blueOffset+iend] |
|
SWEEP_EVENTS[ptr++] = idx|1 |
|
} |
|
|
|
//process events from left->right |
|
var n = ptr >>> 1 |
|
isort(SWEEP_EVENTS, n) |
|
|
|
var redActive = 0 |
|
var blueActive = 0 |
|
var commonActive = 0 |
|
for(var i=0; i<n; ++i) { |
|
var e = SWEEP_EVENTS[2*i+1]|0 |
|
var color = e&1 |
|
if(i < n-1 && (e>>1) === (SWEEP_EVENTS[2*i+3]>>1)) { |
|
color = 2 |
|
i += 1 |
|
} |
|
|
|
if(e < 0) { |
|
//Create event |
|
var id = -(e>>1) - 1 |
|
|
|
//Intersect with common |
|
for(var j=0; j<commonActive; ++j) { |
|
var retval = visit(COMMON_SWEEP_QUEUE[j], id) |
|
if(retval !== void 0) { |
|
return retval |
|
} |
|
} |
|
|
|
if(color !== 0) { |
|
//Intersect with red |
|
for(var j=0; j<redActive; ++j) { |
|
var retval = visit(RED_SWEEP_QUEUE[j], id) |
|
if(retval !== void 0) { |
|
return retval |
|
} |
|
} |
|
} |
|
|
|
if(color !== 1) { |
|
//Intersect with blue |
|
for(var j=0; j<blueActive; ++j) { |
|
var retval = visit(BLUE_SWEEP_QUEUE[j], id) |
|
if(retval !== void 0) { |
|
return retval |
|
} |
|
} |
|
} |
|
|
|
if(color === 0) { |
|
//Red |
|
sqPush(RED_SWEEP_QUEUE, RED_SWEEP_INDEX, redActive++, id) |
|
} else if(color === 1) { |
|
//Blue |
|
sqPush(BLUE_SWEEP_QUEUE, BLUE_SWEEP_INDEX, blueActive++, id) |
|
} else if(color === 2) { |
|
//Both |
|
sqPush(COMMON_SWEEP_QUEUE, COMMON_SWEEP_INDEX, commonActive++, id) |
|
} |
|
} else { |
|
//Destroy event |
|
var id = (e>>1) - 1 |
|
if(color === 0) { |
|
//Red |
|
sqPop(RED_SWEEP_QUEUE, RED_SWEEP_INDEX, redActive--, id) |
|
} else if(color === 1) { |
|
//Blue |
|
sqPop(BLUE_SWEEP_QUEUE, BLUE_SWEEP_INDEX, blueActive--, id) |
|
} else if(color === 2) { |
|
//Both |
|
sqPop(COMMON_SWEEP_QUEUE, COMMON_SWEEP_INDEX, commonActive--, id) |
|
} |
|
} |
|
} |
|
} |
|
|
|
//Sweep and prune/scanline algorithm: |
|
// Scan along axis, detect intersections |
|
// Brute force all boxes along axis |
|
function scanBipartite( |
|
d, axis, visit, flip, |
|
redStart, redEnd, red, redIndex, |
|
blueStart, blueEnd, blue, blueIndex) { |
|
|
|
var ptr = 0 |
|
var elemSize = 2*d |
|
var istart = axis |
|
var iend = axis+d |
|
|
|
var redShift = 1 |
|
var blueShift = 1 |
|
if(flip) { |
|
blueShift = BLUE_FLAG |
|
} else { |
|
redShift = BLUE_FLAG |
|
} |
|
|
|
for(var i=redStart; i<redEnd; ++i) { |
|
var idx = i + redShift |
|
var redOffset = elemSize*i |
|
SWEEP_EVENTS[ptr++] = red[redOffset+istart] |
|
SWEEP_EVENTS[ptr++] = -idx |
|
SWEEP_EVENTS[ptr++] = red[redOffset+iend] |
|
SWEEP_EVENTS[ptr++] = idx |
|
} |
|
for(var i=blueStart; i<blueEnd; ++i) { |
|
var idx = i + blueShift |
|
var blueOffset = elemSize*i |
|
SWEEP_EVENTS[ptr++] = blue[blueOffset+istart] |
|
SWEEP_EVENTS[ptr++] = -idx |
|
} |
|
|
|
//process events from left->right |
|
var n = ptr >>> 1 |
|
isort(SWEEP_EVENTS, n) |
|
|
|
var redActive = 0 |
|
for(var i=0; i<n; ++i) { |
|
var e = SWEEP_EVENTS[2*i+1]|0 |
|
if(e < 0) { |
|
var idx = -e |
|
var isRed = false |
|
if(idx >= BLUE_FLAG) { |
|
isRed = !flip |
|
idx -= BLUE_FLAG |
|
} else { |
|
isRed = !!flip |
|
idx -= 1 |
|
} |
|
if(isRed) { |
|
sqPush(RED_SWEEP_QUEUE, RED_SWEEP_INDEX, redActive++, idx) |
|
} else { |
|
var blueId = blueIndex[idx] |
|
var bluePtr = elemSize * idx |
|
|
|
var b0 = blue[bluePtr+axis+1] |
|
var b1 = blue[bluePtr+axis+1+d] |
|
|
|
red_loop: |
|
for(var j=0; j<redActive; ++j) { |
|
var oidx = RED_SWEEP_QUEUE[j] |
|
var redPtr = elemSize * oidx |
|
|
|
if(b1 < red[redPtr+axis+1] || |
|
red[redPtr+axis+1+d] < b0) { |
|
continue |
|
} |
|
|
|
for(var k=axis+2; k<d; ++k) { |
|
if(blue[bluePtr + k + d] < red[redPtr + k] || |
|
red[redPtr + k + d] < blue[bluePtr + k]) { |
|
continue red_loop |
|
} |
|
} |
|
|
|
var redId = redIndex[oidx] |
|
var retval |
|
if(flip) { |
|
retval = visit(blueId, redId) |
|
} else { |
|
retval = visit(redId, blueId) |
|
} |
|
if(retval !== void 0) { |
|
return retval |
|
} |
|
} |
|
} |
|
} else { |
|
sqPop(RED_SWEEP_QUEUE, RED_SWEEP_INDEX, redActive--, e - redShift) |
|
} |
|
} |
|
} |
|
|
|
function scanComplete( |
|
d, axis, visit, |
|
redStart, redEnd, red, redIndex, |
|
blueStart, blueEnd, blue, blueIndex) { |
|
|
|
var ptr = 0 |
|
var elemSize = 2*d |
|
var istart = axis |
|
var iend = axis+d |
|
|
|
for(var i=redStart; i<redEnd; ++i) { |
|
var idx = i + BLUE_FLAG |
|
var redOffset = elemSize*i |
|
SWEEP_EVENTS[ptr++] = red[redOffset+istart] |
|
SWEEP_EVENTS[ptr++] = -idx |
|
SWEEP_EVENTS[ptr++] = red[redOffset+iend] |
|
SWEEP_EVENTS[ptr++] = idx |
|
} |
|
for(var i=blueStart; i<blueEnd; ++i) { |
|
var idx = i + 1 |
|
var blueOffset = elemSize*i |
|
SWEEP_EVENTS[ptr++] = blue[blueOffset+istart] |
|
SWEEP_EVENTS[ptr++] = -idx |
|
} |
|
|
|
//process events from left->right |
|
var n = ptr >>> 1 |
|
isort(SWEEP_EVENTS, n) |
|
|
|
var redActive = 0 |
|
for(var i=0; i<n; ++i) { |
|
var e = SWEEP_EVENTS[2*i+1]|0 |
|
if(e < 0) { |
|
var idx = -e |
|
if(idx >= BLUE_FLAG) { |
|
RED_SWEEP_QUEUE[redActive++] = idx - BLUE_FLAG |
|
} else { |
|
idx -= 1 |
|
var blueId = blueIndex[idx] |
|
var bluePtr = elemSize * idx |
|
|
|
var b0 = blue[bluePtr+axis+1] |
|
var b1 = blue[bluePtr+axis+1+d] |
|
|
|
red_loop: |
|
for(var j=0; j<redActive; ++j) { |
|
var oidx = RED_SWEEP_QUEUE[j] |
|
var redId = redIndex[oidx] |
|
|
|
if(redId === blueId) { |
|
break |
|
} |
|
|
|
var redPtr = elemSize * oidx |
|
if(b1 < red[redPtr+axis+1] || |
|
red[redPtr+axis+1+d] < b0) { |
|
continue |
|
} |
|
for(var k=axis+2; k<d; ++k) { |
|
if(blue[bluePtr + k + d] < red[redPtr + k] || |
|
red[redPtr + k + d] < blue[bluePtr + k]) { |
|
continue red_loop |
|
} |
|
} |
|
|
|
var retval = visit(redId, blueId) |
|
if(retval !== void 0) { |
|
return retval |
|
} |
|
} |
|
} |
|
} else { |
|
var idx = e - BLUE_FLAG |
|
for(var j=redActive-1; j>=0; --j) { |
|
if(RED_SWEEP_QUEUE[j] === idx) { |
|
for(var k=j+1; k<redActive; ++k) { |
|
RED_SWEEP_QUEUE[k-1] = RED_SWEEP_QUEUE[k] |
|
} |
|
break |
|
} |
|
} |
|
--redActive |
|
} |
|
} |
|
} |
|
},{"./sort":44,"bit-twiddle":36,"typedarray-pool":257}],46:[function(require,module,exports){ |
|
var size = require('element-size') |
|
|
|
module.exports = fit |
|
|
|
var scratch = new Float32Array(2) |
|
|
|
function fit(canvas, parent, scale) { |
|
var isSVG = canvas.nodeName.toUpperCase() === 'SVG' |
|
|
|
canvas.style.position = canvas.style.position || 'absolute' |
|
canvas.style.top = 0 |
|
canvas.style.left = 0 |
|
|
|
resize.scale = parseFloat(scale || 1) |
|
resize.parent = parent |
|
|
|
return resize() |
|
|
|
function resize() { |
|
var p = resize.parent || canvas.parentNode |
|
if (typeof p === 'function') { |
|
var dims = p(scratch) || scratch |
|
var width = dims[0] |
|
var height = dims[1] |
|
} else |
|
if (p && p !== document.body) { |
|
var psize = size(p) |
|
var width = psize[0]|0 |
|
var height = psize[1]|0 |
|
} else { |
|
var width = window.innerWidth |
|
var height = window.innerHeight |
|
} |
|
|
|
if (isSVG) { |
|
canvas.setAttribute('width', width * resize.scale + 'px') |
|
canvas.setAttribute('height', height * resize.scale + 'px') |
|
} else { |
|
canvas.width = width * resize.scale |
|
canvas.height = height * resize.scale |
|
} |
|
|
|
canvas.style.width = width + 'px' |
|
canvas.style.height = height + 'px' |
|
|
|
return resize |
|
} |
|
} |
|
|
|
},{"element-size":72}],47:[function(require,module,exports){ |
|
'use strict' |
|
|
|
var monotoneTriangulate = require('./lib/monotone') |
|
var makeIndex = require('./lib/triangulation') |
|
var delaunayFlip = require('./lib/delaunay') |
|
var filterTriangulation = require('./lib/filter') |
|
|
|
module.exports = cdt2d |
|
|
|
function canonicalizeEdge(e) { |
|
return [Math.min(e[0], e[1]), Math.max(e[0], e[1])] |
|
} |
|
|
|
function compareEdge(a, b) { |
|
return a[0]-b[0] || a[1]-b[1] |
|
} |
|
|
|
function canonicalizeEdges(edges) { |
|
return edges.map(canonicalizeEdge).sort(compareEdge) |
|
} |
|
|
|
function getDefault(options, property, dflt) { |
|
if(property in options) { |
|
return options[property] |
|
} |
|
return dflt |
|
} |
|
|
|
function cdt2d(points, edges, options) { |
|
|
|
if(!Array.isArray(edges)) { |
|
options = edges || {} |
|
edges = [] |
|
} else { |
|
options = options || {} |
|
edges = edges || [] |
|
} |
|
|
|
//Parse out options |
|
var delaunay = !!getDefault(options, 'delaunay', true) |
|
var interior = !!getDefault(options, 'interior', true) |
|
var exterior = !!getDefault(options, 'exterior', true) |
|
var infinity = !!getDefault(options, 'infinity', false) |
|
|
|
//Handle trivial case |
|
if((!interior && !exterior) || points.length === 0) { |
|
return [] |
|
} |
|
|
|
//Construct initial triangulation |
|
var cells = monotoneTriangulate(points, edges) |
|
|
|
//If delaunay refinement needed, then improve quality by edge flipping |
|
if(delaunay || interior !== exterior || infinity) { |
|
|
|
//Index all of the cells to support fast neighborhood queries |
|
var triangulation = makeIndex(points.length, canonicalizeEdges(edges)) |
|
for(var i=0; i<cells.length; ++i) { |
|
var f = cells[i] |
|
triangulation.addTriangle(f[0], f[1], f[2]) |
|
} |
|
|
|
//Run edge flipping |
|
if(delaunay) { |
|
delaunayFlip(points, triangulation) |
|
} |
|
|
|
//Filter points |
|
if(!exterior) { |
|
return filterTriangulation(triangulation, -1) |
|
} else if(!interior) { |
|
return filterTriangulation(triangulation, 1, infinity) |
|
} else if(infinity) { |
|
return filterTriangulation(triangulation, 0, infinity) |
|
} else { |
|
return triangulation.cells() |
|
} |
|
|
|
} else { |
|
return cells |
|
} |
|
} |
|
|
|
},{"./lib/delaunay":48,"./lib/filter":49,"./lib/monotone":50,"./lib/triangulation":51}],48:[function(require,module,exports){ |
|
'use strict' |
|
|
|
var inCircle = require('robust-in-sphere')[4] |
|
var bsearch = require('binary-search-bounds') |
|
|
|
module.exports = delaunayRefine |
|
|
|
function testFlip(points, triangulation, stack, a, b, x) { |
|
var y = triangulation.opposite(a, b) |
|
|
|
//Test boundary edge |
|
if(y < 0) { |
|
return |
|
} |
|
|
|
//Swap edge if order flipped |
|
if(b < a) { |
|
var tmp = a |
|
a = b |
|
b = tmp |
|
tmp = x |
|
x = y |
|
y = tmp |
|
} |
|
|
|
//Test if edge is constrained |
|
if(triangulation.isConstraint(a, b)) { |
|
return |
|
} |
|
|
|
//Test if edge is delaunay |
|
if(inCircle(points[a], points[b], points[x], points[y]) < 0) { |
|
stack.push(a, b) |
|
} |
|
} |
|
|
|
//Assume edges are sorted lexicographically |
|
function delaunayRefine(points, triangulation) { |
|
var stack = [] |
|
|
|
var numPoints = points.length |
|
var stars = triangulation.stars |
|
for(var a=0; a<numPoints; ++a) { |
|
var star = stars[a] |
|
for(var j=1; j<star.length; j+=2) { |
|
var b = star[j] |
|
|
|
//If order is not consistent, then skip edge |
|
if(b < a) { |
|
continue |
|
} |
|
|
|
//Check if edge is constrained |
|
if(triangulation.isConstraint(a, b)) { |
|
continue |
|
} |
|
|
|
//Find opposite edge |
|
var x = star[j-1], y = -1 |
|
for(var k=1; k<star.length; k+=2) { |
|
if(star[k-1] === b) { |
|
y = star[k] |
|
break |
|
} |
|
} |
|
|
|
//If this is a boundary edge, don't flip it |
|
if(y < 0) { |
|
continue |
|
} |
|
|
|
//If edge is in circle, flip it |
|
if(inCircle(points[a], points[b], points[x], points[y]) < 0) { |
|
stack.push(a, b) |
|
} |
|
} |
|
} |
|
|
|
while(stack.length > 0) { |
|
var b = stack.pop() |
|
var a = stack.pop() |
|
|
|
//Find opposite pairs |
|
var x = -1, y = -1 |
|
var star = stars[a] |
|
for(var i=1; i<star.length; i+=2) { |
|
var s = star[i-1] |
|
var t = star[i] |
|
if(s === b) { |
|
y = t |
|
} else if(t === b) { |
|
x = s |
|
} |
|
} |
|
|
|
//If x/y are both valid then skip edge |
|
if(x < 0 || y < 0) { |
|
continue |
|
} |
|
|
|
//If edge is now delaunay, then don't flip it |
|
if(inCircle(points[a], points[b], points[x], points[y]) >= 0) { |
|
continue |
|
} |
|
|
|
//Flip the edge |
|
triangulation.flip(a, b) |
|
|
|
//Test flipping neighboring edges |
|
testFlip(points, triangulation, stack, x, a, y) |
|
testFlip(points, triangulation, stack, a, y, x) |
|
testFlip(points, triangulation, stack, y, b, x) |
|
testFlip(points, triangulation, stack, b, x, y) |
|
} |
|
} |
|
|
|
},{"binary-search-bounds":52,"robust-in-sphere":232}],49:[function(require,module,exports){ |
|
'use strict' |
|
|
|
var bsearch = require('binary-search-bounds') |
|
|
|
module.exports = classifyFaces |
|
|
|
function FaceIndex(cells, neighbor, constraint, flags, active, next, boundary) { |
|
this.cells = cells |
|
this.neighbor = neighbor |
|
this.flags = flags |
|
this.constraint = constraint |
|
this.active = active |
|
this.next = next |
|
this.boundary = boundary |
|
} |
|
|
|
var proto = FaceIndex.prototype |
|
|
|
function compareCell(a, b) { |
|
return a[0] - b[0] || |
|
a[1] - b[1] || |
|
a[2] - b[2] |
|
} |
|
|
|
proto.locate = (function() { |
|
var key = [0,0,0] |
|
return function(a, b, c) { |
|
var x = a, y = b, z = c |
|
if(b < c) { |
|
if(b < a) { |
|
x = b |
|
y = c |
|
z = a |
|
} |
|
} else if(c < a) { |
|
x = c |
|
y = a |
|
z = b |
|
} |
|
if(x < 0) { |
|
return -1 |
|
} |
|
key[0] = x |
|
key[1] = y |
|
key[2] = z |
|
return bsearch.eq(this.cells, key, compareCell) |
|
} |
|
})() |
|
|
|
function indexCells(triangulation, infinity) { |
|
//First get cells and canonicalize |
|
var cells = triangulation.cells() |
|
var nc = cells.length |
|
for(var i=0; i<nc; ++i) { |
|
var c = cells[i] |
|
var x = c[0], y = c[1], z = c[2] |
|
if(y < z) { |
|
if(y < x) { |
|
c[0] = y |
|
c[1] = z |
|
c[2] = x |
|
} |
|
} else if(z < x) { |
|
c[0] = z |
|
c[1] = x |
|
c[2] = y |
|
} |
|
} |
|
cells.sort(compareCell) |
|
|
|
//Initialize flag array |
|
var flags = new Array(nc) |
|
for(var i=0; i<flags.length; ++i) { |
|
flags[i] = 0 |
|
} |
|
|
|
//Build neighbor index, initialize queues |
|
var active = [] |
|
var next = [] |
|
var neighbor = new Array(3*nc) |
|
var constraint = new Array(3*nc) |
|
var boundary = null |
|
if(infinity) { |
|
boundary = [] |
|
} |
|
var index = new FaceIndex( |
|
cells, |
|
neighbor, |
|
constraint, |
|
flags, |
|
active, |
|
next, |
|
boundary) |
|
for(var i=0; i<nc; ++i) { |
|
var c = cells[i] |
|
for(var j=0; j<3; ++j) { |
|
var x = c[j], y = c[(j+1)%3] |
|
var a = neighbor[3*i+j] = index.locate(y, x, triangulation.opposite(y, x)) |
|
var b = constraint[3*i+j] = triangulation.isConstraint(x, y) |
|
if(a < 0) { |
|
if(b) { |
|
next.push(i) |
|
} else { |
|
active.push(i) |
|
flags[i] = 1 |
|
} |
|
if(infinity) { |
|
boundary.push([y, x, -1]) |
|
} |
|
} |
|
} |
|
} |
|
return index |
|
} |
|
|
|
function filterCells(cells, flags, target) { |
|
var ptr = 0 |
|
for(var i=0; i<cells.length; ++i) { |
|
if(flags[i] === target) { |
|
cells[ptr++] = cells[i] |
|
} |
|
} |
|
cells.length = ptr |
|
return cells |
|
} |
|
|
|
function classifyFaces(triangulation, target, infinity) { |
|
var index = indexCells(triangulation, infinity) |
|
|
|
if(target === 0) { |
|
if(infinity) { |
|
return index.cells.concat(index.boundary) |
|
} else { |
|
return index.cells |
|
} |
|
} |
|
|
|
var side = 1 |
|
var active = index.active |
|
var next = index.next |
|
var flags = index.flags |
|
var cells = index.cells |
|
var constraint = index.constraint |
|
var neighbor = index.neighbor |
|
|
|
while(active.length > 0 || next.length > 0) { |
|
while(active.length > 0) { |
|
var t = active.pop() |
|
if(flags[t] === -side) { |
|
continue |
|
} |
|
flags[t] = side |
|
var c = cells[t] |
|
for(var j=0; j<3; ++j) { |
|
var f = neighbor[3*t+j] |
|
if(f >= 0 && flags[f] === 0) { |
|
if(constraint[3*t+j]) { |
|
next.push(f) |
|
} else { |
|
active.push(f) |
|
flags[f] = side |
|
} |
|
} |
|
} |
|
} |
|
|
|
//Swap arrays and loop |
|
var tmp = next |
|
next = active |
|
active = tmp |
|
next.length = 0 |
|
side = -side |
|
} |
|
|
|
var result = filterCells(cells, flags, target) |
|
if(infinity) { |
|
return result.concat(index.boundary) |
|
} |
|
return result |
|
} |
|
|
|
},{"binary-search-bounds":52}],50:[function(require,module,exports){ |
|
'use strict' |
|
|
|
var bsearch = require('binary-search-bounds') |
|
var orient = require('robust-orientation')[3] |
|
|
|
var EVENT_POINT = 0 |
|
var EVENT_END = 1 |
|
var EVENT_START = 2 |
|
|
|
module.exports = monotoneTriangulate |
|
|
|
//A partial convex hull fragment, made of two unimonotone polygons |
|
function PartialHull(a, b, idx, lowerIds, upperIds) { |
|
this.a = a |
|
this.b = b |
|
this.idx = idx |
|
this.lowerIds = lowerIds |
|
this.upperIds = upperIds |
|
} |
|
|
|
//An event in the sweep line procedure |
|
function Event(a, b, type, idx) { |
|
this.a = a |
|
this.b = b |
|
this.type = type |
|
this.idx = idx |
|
} |
|
|
|
//This is used to compare events for the sweep line procedure |
|
// Points are: |
|
// 1. sorted lexicographically |
|
// 2. sorted by type (point < end < start) |
|
// 3. segments sorted by winding order |
|
// 4. sorted by index |
|
function compareEvent(a, b) { |
|
var d = |
|
(a.a[0] - b.a[0]) || |
|
(a.a[1] - b.a[1]) || |
|
(a.type - b.type) |
|
if(d) { return d } |
|
if(a.type !== EVENT_POINT) { |
|
d = orient(a.a, a.b, b.b) |
|
if(d) { return d } |
|
} |
|
return a.idx - b.idx |
|
} |
|
|
|
function testPoint(hull, p) { |
|
return orient(hull.a, hull.b, p) |
|
} |
|
|
|
function addPoint(cells, hulls, points, p, idx) { |
|
var lo = bsearch.lt(hulls, p, testPoint) |
|
var hi = bsearch.gt(hulls, p, testPoint) |
|
for(var i=lo; i<hi; ++i) { |
|
var hull = hulls[i] |
|
|
|
//Insert p into lower hull |
|
var lowerIds = hull.lowerIds |
|
var m = lowerIds.length |
|
while(m > 1 && orient( |
|
points[lowerIds[m-2]], |
|
points[lowerIds[m-1]], |
|
p) > 0) { |
|
cells.push( |
|
[lowerIds[m-1], |
|
lowerIds[m-2], |
|
idx]) |
|
m -= 1 |
|
} |
|
lowerIds.length = m |
|
lowerIds.push(idx) |
|
|
|
//Insert p into upper hull |
|
var upperIds = hull.upperIds |
|
var m = upperIds.length |
|
while(m > 1 && orient( |
|
points[upperIds[m-2]], |
|
points[upperIds[m-1]], |
|
p) < 0) { |
|
cells.push( |
|
[upperIds[m-2], |
|
upperIds[m-1], |
|
idx]) |
|
m -= 1 |
|
} |
|
upperIds.length = m |
|
upperIds.push(idx) |
|
} |
|
} |
|
|
|
function findSplit(hull, edge) { |
|
var d |
|
if(hull.a[0] < edge.a[0]) { |
|
d = orient(hull.a, hull.b, edge.a) |
|
} else { |
|
d = orient(edge.b, edge.a, hull.a) |
|
} |
|
if(d) { return d } |
|
if(edge.b[0] < hull.b[0]) { |
|
d = orient(hull.a, hull.b, edge.b) |
|
} else { |
|
d = orient(edge.b, edge.a, hull.b) |
|
} |
|
return d || hull.idx - edge.idx |
|
} |
|
|
|
function splitHulls(hulls, points, event) { |
|
var splitIdx = bsearch.le(hulls, event, findSplit) |
|
var hull = hulls[splitIdx] |
|
var upperIds = hull.upperIds |
|
var x = upperIds[upperIds.length-1] |
|
hull.upperIds = [x] |
|
hulls.splice(splitIdx+1, 0, |
|
new PartialHull(event.a, event.b, event.idx, [x], upperIds)) |
|
} |
|
|
|
|
|
function mergeHulls(hulls, points, event) { |
|
//Swap pointers for merge search |
|
var tmp = event.a |
|
event.a = event.b |
|
event.b = tmp |
|
var mergeIdx = bsearch.eq(hulls, event, findSplit) |
|
var upper = hulls[mergeIdx] |
|
var lower = hulls[mergeIdx-1] |
|
lower.upperIds = upper.upperIds |
|
hulls.splice(mergeIdx, 1) |
|
} |
|
|
|
|
|
function monotoneTriangulate(points, edges) { |
|
|
|
var numPoints = points.length |
|
var numEdges = edges.length |
|
|
|
var events = [] |
|
|
|
//Create point events |
|
for(var i=0; i<numPoints; ++i) { |
|
events.push(new Event( |
|
points[i], |
|
null, |
|
EVENT_POINT, |
|
i)) |
|
} |
|
|
|
//Create edge events |
|
for(var i=0; i<numEdges; ++i) { |
|
var e = edges[i] |
|
var a = points[e[0]] |
|
var b = points[e[1]] |
|
if(a[0] < b[0]) { |
|
events.push( |
|
new Event(a, b, EVENT_START, i), |
|
new Event(b, a, EVENT_END, i)) |
|
} else if(a[0] > b[0]) { |
|
events.push( |
|
new Event(b, a, EVENT_START, i), |
|
new Event(a, b, EVENT_END, i)) |
|
} |
|
} |
|
|
|
//Sort events |
|
events.sort(compareEvent) |
|
|
|
//Initialize hull |
|
var minX = events[0].a[0] - (1 + Math.abs(events[0].a[0])) * Math.pow(2, -52) |
|
var hull = [ new PartialHull([minX, 1], [minX, 0], -1, [], [], [], []) ] |
|
|
|
//Process events in order |
|
var cells = [] |
|
for(var i=0, numEvents=events.length; i<numEvents; ++i) { |
|
var event = events[i] |
|
var type = event.type |
|
if(type === EVENT_POINT) { |
|
addPoint(cells, hull, points, event.a, event.idx) |
|
} else if(type === EVENT_START) { |
|
splitHulls(hull, points, event) |
|
} else { |
|
mergeHulls(hull, points, event) |
|
} |
|
} |
|
|
|
//Return triangulation |
|
return cells |
|
} |
|
|
|
},{"binary-search-bounds":52,"robust-orientation":234}],51:[function(require,module,exports){ |
|
'use strict' |
|
|
|
var bsearch = require('binary-search-bounds') |
|
|
|
module.exports = createTriangulation |
|
|
|
function Triangulation(stars, edges) { |
|
this.stars = stars |
|
this.edges = edges |
|
} |
|
|
|
var proto = Triangulation.prototype |
|
|
|
function removePair(list, j, k) { |
|
for(var i=1, n=list.length; i<n; i+=2) { |
|
if(list[i-1] === j && list[i] === k) { |
|
list[i-1] = list[n-2] |
|
list[i] = list[n-1] |
|
list.length = n - 2 |
|
return |
|
} |
|
} |
|
} |
|
|
|
proto.isConstraint = (function() { |
|
var e = [0,0] |
|
function compareLex(a, b) { |
|
return a[0] - b[0] || a[1] - b[1] |
|
} |
|
return function(i, j) { |
|
e[0] = Math.min(i,j) |
|
e[1] = Math.max(i,j) |
|
return bsearch.eq(this.edges, e, compareLex) >= 0 |
|
} |
|
})() |
|
|
|
proto.removeTriangle = function(i, j, k) { |
|
var stars = this.stars |
|
removePair(stars[i], j, k) |
|
removePair(stars[j], k, i) |
|
removePair(stars[k], i, j) |
|
} |
|
|
|
proto.addTriangle = function(i, j, k) { |
|
var stars = this.stars |
|
stars[i].push(j, k) |
|
stars[j].push(k, i) |
|
stars[k].push(i, j) |
|
} |
|
|
|
proto.opposite = function(j, i) { |
|
var list = this.stars[i] |
|
for(var k=1, n=list.length; k<n; k+=2) { |
|
if(list[k] === j) { |
|
return list[k-1] |
|
} |
|
} |
|
return -1 |
|
} |
|
|
|
proto.flip = function(i, j) { |
|
var a = this.opposite(i, j) |
|
var b = this.opposite(j, i) |
|
this.removeTriangle(i, j, a) |
|
this.removeTriangle(j, i, b) |
|
this.addTriangle(i, b, a) |
|
this.addTriangle(j, a, b) |
|
} |
|
|
|
proto.edges = function() { |
|
var stars = this.stars |
|
var result = [] |
|
for(var i=0, n=stars.length; i<n; ++i) { |
|
var list = stars[i] |
|
for(var j=0, m=list.length; j<m; j+=2) { |
|
result.push([list[j], list[j+1]]) |
|
} |
|
} |
|
return result |
|
} |
|
|
|
proto.cells = function() { |
|
var stars = this.stars |
|
var result = [] |
|
for(var i=0, n=stars.length; i<n; ++i) { |
|
var list = stars[i] |
|
for(var j=0, m=list.length; j<m; j+=2) { |
|
var s = list[j] |
|
var t = list[j+1] |
|
if(i < Math.min(s, t)) { |
|
result.push([i, s, t]) |
|
} |
|
} |
|
} |
|
return result |
|
} |
|
|
|
function createTriangulation(numVerts, edges) { |
|
var stars = new Array(numVerts) |
|
for(var i=0; i<numVerts; ++i) { |
|
stars[i] = [] |
|
} |
|
return new Triangulation(stars, edges) |
|
} |
|
|
|
},{"binary-search-bounds":52}],52:[function(require,module,exports){ |
|
"use strict" |
|
|
|
function compileSearch(funcName, predicate, reversed, extraArgs, earlyOut) { |
|
var code = [ |
|
"function ", funcName, "(a,l,h,", extraArgs.join(","), "){", |
|
earlyOut ? "" : "var i=", (reversed ? "l-1" : "h+1"), |
|
";while(l<=h){\ |
|
var m=(l+h)>>>1,x=a[m]"] |
|
if(earlyOut) { |
|
if(predicate.indexOf("c") < 0) { |
|
code.push(";if(x===y){return m}else if(x<=y){") |
|
} else { |
|
code.push(";var p=c(x,y);if(p===0){return m}else if(p<=0){") |
|
} |
|
} else { |
|
code.push(";if(", predicate, "){i=m;") |
|
} |
|
if(reversed) { |
|
code.push("l=m+1}else{h=m-1}") |
|
} else { |
|
code.push("h=m-1}else{l=m+1}") |
|
} |
|
code.push("}") |
|
if(earlyOut) { |
|
code.push("return -1};") |
|
} else { |
|
code.push("return i};") |
|
} |
|
return code.join("") |
|
} |
|
|
|
function compileBoundsSearch(predicate, reversed, suffix, earlyOut) { |
|
var result = new Function([ |
|
compileSearch("A", "x" + predicate + "y", reversed, ["y"], earlyOut), |
|
compileSearch("P", "c(x,y)" + predicate + "0", reversed, ["y", "c"], earlyOut), |
|
"function dispatchBsearch", suffix, "(a,y,c,l,h){\ |
|
if(typeof(c)==='function'){\ |
|
return P(a,(l===void 0)?0:l|0,(h===void 0)?a.length-1:h|0,y,c)\ |
|
}else{\ |
|
return A(a,(c===void 0)?0:c|0,(l===void 0)?a.length-1:l|0,y)\ |
|
}}\ |
|
return dispatchBsearch", suffix].join("")) |
|
return result() |
|
} |
|
|
|
module.exports = { |
|
ge: compileBoundsSearch(">=", false, "GE"), |
|
gt: compileBoundsSearch(">", false, "GT"), |
|
lt: compileBoundsSearch("<", true, "LT"), |
|
le: compileBoundsSearch("<=", true, "LE"), |
|
eq: compileBoundsSearch("-", true, "EQ", true) |
|
} |
|
|
|
},{}],53:[function(require,module,exports){ |
|
'use strict' |
|
|
|
module.exports = cleanPSLG |
|
|
|
var UnionFind = require('union-find') |
|
var boxIntersect = require('box-intersect') |
|
var segseg = require('robust-segment-intersect') |
|
var rat = require('big-rat') |
|
var ratCmp = require('big-rat/cmp') |
|
var ratToFloat = require('big-rat/to-float') |
|
var ratVec = require('rat-vec') |
|
var nextafter = require('nextafter') |
|
|
|
var solveIntersection = require('./lib/rat-seg-intersect') |
|
|
|
// Bounds on a rational number when rounded to a float |
|
function boundRat (r) { |
|
var f = ratToFloat(r) |
|
return [ |
|
nextafter(f, -Infinity), |
|
nextafter(f, Infinity) |
|
] |
|
} |
|
|
|
// Convert a list of edges in a pslg to bounding boxes |
|
function boundEdges (points, edges) { |
|
var bounds = new Array(edges.length) |
|
for (var i = 0; i < edges.length; ++i) { |
|
var e = edges[i] |
|
var a = points[e[0]] |
|
var b = points[e[1]] |
|
bounds[i] = [ |
|
nextafter(Math.min(a[0], b[0]), -Infinity), |
|
nextafter(Math.min(a[1], b[1]), -Infinity), |
|
nextafter(Math.max(a[0], b[0]), Infinity), |
|
nextafter(Math.max(a[1], b[1]), Infinity) |
|
] |
|
} |
|
return bounds |
|
} |
|
|
|
// Convert a list of points into bounding boxes by duplicating coords |
|
function boundPoints (points) { |
|
var bounds = new Array(points.length) |
|
for (var i = 0; i < points.length; ++i) { |
|
var p = points[i] |
|
bounds[i] = [ |
|
nextafter(p[0], -Infinity), |
|
nextafter(p[1], -Infinity), |
|
nextafter(p[0], Infinity), |
|
nextafter(p[1], Infinity) |
|
] |
|
} |
|
return bounds |
|
} |
|
|
|
// Find all pairs of crossing edges in a pslg (given edge bounds) |
|
function getCrossings (points, edges, edgeBounds) { |
|
var result = [] |
|
boxIntersect(edgeBounds, function (i, j) { |
|
var e = edges[i] |
|
var f = edges[j] |
|
if (e[0] === f[0] || e[0] === f[1] || |
|
e[1] === f[0] || e[1] === f[1]) { |
|
return |
|
} |
|
var a = points[e[0]] |
|
var b = points[e[1]] |
|
var c = points[f[0]] |
|
var d = points[f[1]] |
|
if (segseg(a, b, c, d)) { |
|
result.push([i, j]) |
|
} |
|
}) |
|
return result |
|
} |
|
|
|
// Find all pairs of crossing vertices in a pslg (given edge/vert bounds) |
|
function getTJunctions (points, edges, edgeBounds, vertBounds) { |
|
var result = [] |
|
boxIntersect(edgeBounds, vertBounds, function (i, v) { |
|
var e = edges[i] |
|
if (e[0] === v || e[1] === v) { |
|
return |
|
} |
|
var p = points[v] |
|
var a = points[e[0]] |
|
var b = points[e[1]] |
|
if (segseg(a, b, p, p)) { |
|
result.push([i, v]) |
|
} |
|
}) |
|
return result |
|
} |
|
|
|
// Cut edges along crossings/tjunctions |
|
function cutEdges (floatPoints, edges, crossings, junctions, useColor) { |
|
var i, e |
|
|
|
// Convert crossings into tjunctions by constructing rational points |
|
var ratPoints = floatPoints.map(function(p) { |
|
return [ |
|
rat(p[0]), |
|
rat(p[1]) |
|
] |
|
}) |
|
for (i = 0; i < crossings.length; ++i) { |
|
var crossing = crossings[i] |
|
e = crossing[0] |
|
var f = crossing[1] |
|
var ee = edges[e] |
|
var ef = edges[f] |
|
var x = solveIntersection( |
|
ratVec(floatPoints[ee[0]]), |
|
ratVec(floatPoints[ee[1]]), |
|
ratVec(floatPoints[ef[0]]), |
|
ratVec(floatPoints[ef[1]])) |
|
if (!x) { |
|
// Segments are parallel, should already be handled by t-junctions |
|
continue |
|
} |
|
var idx = floatPoints.length |
|
floatPoints.push([ratToFloat(x[0]), ratToFloat(x[1])]) |
|
ratPoints.push(x) |
|
junctions.push([e, idx], [f, idx]) |
|
} |
|
|
|
// Sort tjunctions |
|
junctions.sort(function (a, b) { |
|
if (a[0] !== b[0]) { |
|
return a[0] - b[0] |
|
} |
|
var u = ratPoints[a[1]] |
|
var v = ratPoints[b[1]] |
|
return ratCmp(u[0], v[0]) || ratCmp(u[1], v[1]) |
|
}) |
|
|
|
// Split edges along junctions |
|
for (i = junctions.length - 1; i >= 0; --i) { |
|
var junction = junctions[i] |
|
e = junction[0] |
|
|
|
var edge = edges[e] |
|
var s = edge[0] |
|
var t = edge[1] |
|
|
|
// Check if edge is not lexicographically sorted |
|
var a = floatPoints[s] |
|
var b = floatPoints[t] |
|
if (((a[0] - b[0]) || (a[1] - b[1])) < 0) { |
|
var tmp = s |
|
s = t |
|
t = tmp |
|
} |
|
|
|
// Split leading edge |
|
edge[0] = s |
|
var last = edge[1] = junction[1] |
|
|
|
// If we are grouping edges by color, remember to track data |
|
var color |
|
if (useColor) { |
|
color = edge[2] |
|
} |
|
|
|
// Split other edges |
|
while (i > 0 && junctions[i - 1][0] === e) { |
|
var junction = junctions[--i] |
|
var next = junction[1] |
|
if (useColor) { |
|
edges.push([last, next, color]) |
|
} else { |
|
edges.push([last, next]) |
|
} |
|
last = next |
|
} |
|
|
|
// Add final edge |
|
if (useColor) { |
|
edges.push([last, t, color]) |
|
} else { |
|
edges.push([last, t]) |
|
} |
|
} |
|
|
|
// Return constructed rational points |
|
return ratPoints |
|
} |
|
|
|
// Merge overlapping points |
|
function dedupPoints (floatPoints, ratPoints, floatBounds) { |
|
var numPoints = ratPoints.length |
|
var uf = new UnionFind(numPoints) |
|
|
|
// Compute rational bounds |
|
var bounds = [] |
|
for (var i = 0; i < ratPoints.length; ++i) { |
|
var p = ratPoints[i] |
|
var xb = boundRat(p[0]) |
|
var yb = boundRat(p[1]) |
|
bounds.push([ |
|
nextafter(xb[0], -Infinity), |
|
nextafter(yb[0], -Infinity), |
|
nextafter(xb[1], Infinity), |
|
nextafter(yb[1], Infinity) |
|
]) |
|
} |
|
|
|
// Link all points with over lapping boxes |
|
boxIntersect(bounds, function (i, j) { |
|
uf.link(i, j) |
|
}) |
|
|
|
// Do 1 pass over points to combine points in label sets |
|
var noDupes = true |
|
var labels = new Array(numPoints) |
|
for (var i = 0; i < numPoints; ++i) { |
|
var j = uf.find(i) |
|
if (j !== i) { |
|
// Clear no-dupes flag, zero out label |
|
noDupes = false |
|
// Make each point the top-left point from its cell |
|
floatPoints[j] = [ |
|
Math.min(floatPoints[i][0], floatPoints[j][0]), |
|
Math.min(floatPoints[i][1], floatPoints[j][1]) |
|
] |
|
} |
|
} |
|
|
|
// If no duplicates, return null to signal termination |
|
if (noDupes) { |
|
return null |
|
} |
|
|
|
var ptr = 0 |
|
for (var i = 0; i < numPoints; ++i) { |
|
var j = uf.find(i) |
|
if (j === i) { |
|
labels[i] = ptr |
|
floatPoints[ptr++] = floatPoints[i] |
|
} else { |
|
labels[i] = -1 |
|
} |
|
} |
|
|
|
floatPoints.length = ptr |
|
|
|
// Do a second pass to fix up missing labels |
|
for (var i = 0; i < numPoints; ++i) { |
|
if (labels[i] < 0) { |
|
labels[i] = labels[uf.find(i)] |
|
} |
|
} |
|
|
|
// Return resulting union-find data structure |
|
return labels |
|
} |
|
|
|
function compareLex2 (a, b) { return (a[0] - b[0]) || (a[1] - b[1]) } |
|
function compareLex3 (a, b) { |
|
var d = (a[0] - b[0]) || (a[1] - b[1]) |
|
if (d) { |
|
return d |
|
} |
|
if (a[2] < b[2]) { |
|
return -1 |
|
} else if (a[2] > b[2]) { |
|
return 1 |
|
} |
|
return 0 |
|
} |
|
|
|
// Remove duplicate edge labels |
|
function dedupEdges (edges, labels, useColor) { |
|
if (edges.length === 0) { |
|
return |
|
} |
|
if (labels) { |
|
for (var i = 0; i < edges.length; ++i) { |
|
var e = edges[i] |
|
var a = labels[e[0]] |
|
var b = labels[e[1]] |
|
e[0] = Math.min(a, b) |
|
e[1] = Math.max(a, b) |
|
} |
|
} else { |
|
for (var i = 0; i < edges.length; ++i) { |
|
var e = edges[i] |
|
var a = e[0] |
|
var b = e[1] |
|
e[0] = Math.min(a, b) |
|
e[1] = Math.max(a, b) |
|
} |
|
} |
|
if (useColor) { |
|
edges.sort(compareLex3) |
|
} else { |
|
edges.sort(compareLex2) |
|
} |
|
var ptr = 1 |
|
for (var i = 1; i < edges.length; ++i) { |
|
var prev = edges[i - 1] |
|
var next = edges[i] |
|
if (next[0] === prev[0] && next[1] === prev[1] && |
|
(!useColor || next[2] === prev[2])) { |
|
continue |
|
} |
|
edges[ptr++] = next |
|
} |
|
edges.length = ptr |
|
} |
|
|
|
function preRound (points, edges, useColor) { |
|
var labels = dedupPoints(points, [], boundPoints(points)) |
|
dedupEdges(edges, labels, useColor) |
|
return !!labels |
|
} |
|
|
|
// Repeat until convergence |
|
function snapRound (points, edges, useColor) { |
|
// 1. find edge crossings |
|
var edgeBounds = boundEdges(points, edges) |
|
var crossings = getCrossings(points, edges, edgeBounds) |
|
|
|
// 2. find t-junctions |
|
var vertBounds = boundPoints(points) |
|
var tjunctions = getTJunctions(points, edges, edgeBounds, vertBounds) |
|
|
|
// 3. cut edges, construct rational points |
|
var ratPoints = cutEdges(points, edges, crossings, tjunctions, useColor) |
|
|
|
// 4. dedupe verts |
|
var labels = dedupPoints(points, ratPoints, vertBounds) |
|
|
|
// 5. dedupe edges |
|
dedupEdges(edges, labels, useColor) |
|
|
|
// 6. check termination |
|
if (!labels) { |
|
return (crossings.length > 0 || tjunctions.length > 0) |
|
} |
|
|
|
// More iterations necessary |
|
return true |
|
} |
|
|
|
// Main loop, runs PSLG clean up until completion |
|
function cleanPSLG (points, edges, colors) { |
|
// If using colors, augment edges with color data |
|
var prevEdges |
|
if (colors) { |
|
prevEdges = edges |
|
var augEdges = new Array(edges.length) |
|
for (var i = 0; i < edges.length; ++i) { |
|
var e = edges[i] |
|
augEdges[i] = [e[0], e[1], colors[i]] |
|
} |
|
edges = augEdges |
|
} |
|
|
|
// First round: remove duplicate edges and points |
|
var modified = preRound(points, edges, !!colors) |
|
|
|
// Run snap rounding until convergence |
|
while (snapRound(points, edges, !!colors)) { |
|
modified = true |
|
} |
|
|
|
// Strip color tags |
|
if (!!colors && modified) { |
|
prevEdges.length = 0 |
|
colors.length = 0 |
|
for (var i = 0; i < edges.length; ++i) { |
|
var e = edges[i] |
|
prevEdges.push([e[0], e[1]]) |
|
colors.push(e[2]) |
|
} |
|
} |
|
|
|
return modified |
|
} |
|
|
|
},{"./lib/rat-seg-intersect":54,"big-rat":22,"big-rat/cmp":20,"big-rat/to-float":34,"box-intersect":39,"nextafter":209,"rat-vec":224,"robust-segment-intersect":237,"union-find":258}],54:[function(require,module,exports){ |
|
'use strict' |
|
|
|
module.exports = solveIntersection |
|
|
|
var ratMul = require('big-rat/mul') |
|
var ratDiv = require('big-rat/div') |
|
var ratSub = require('big-rat/sub') |
|
var ratSign = require('big-rat/sign') |
|
var rvSub = require('rat-vec/sub') |
|
var rvAdd = require('rat-vec/add') |
|
var rvMuls = require('rat-vec/muls') |
|
|
|
function ratPerp (a, b) { |
|
return ratSub(ratMul(a[0], b[1]), ratMul(a[1], b[0])) |
|
} |
|
|
|
// Solve for intersection |
|
// x = a + t (b-a) |
|
// (x - c) ^ (d-c) = 0 |
|
// (t * (b-a) + (a-c) ) ^ (d-c) = 0 |
|
// t * (b-a)^(d-c) = (d-c)^(a-c) |
|
// t = (d-c)^(a-c) / (b-a)^(d-c) |
|
|
|
function solveIntersection (a, b, c, d) { |
|
var ba = rvSub(b, a) |
|
var dc = rvSub(d, c) |
|
|
|
var baXdc = ratPerp(ba, dc) |
|
|
|
if (ratSign(baXdc) === 0) { |
|
return null |
|
} |
|
|
|
var ac = rvSub(a, c) |
|
var dcXac = ratPerp(dc, ac) |
|
|
|
var t = ratDiv(dcXac, baXdc) |
|
var s = rvMuls(ba, t) |
|
var r = rvAdd(a, s) |
|
|
|
return r |
|
} |
|
|
|
},{"big-rat/div":21,"big-rat/mul":31,"big-rat/sign":32,"big-rat/sub":33,"rat-vec/add":223,"rat-vec/muls":225,"rat-vec/sub":226}],55:[function(require,module,exports){ |
|
(function (Buffer){ |
|
var clone = (function() { |
|
'use strict'; |
|
|
|
/** |
|
* Clones (copies) an Object using deep copying. |
|
* |
|
* This function supports circular references by default, but if you are certain |
|
* there are no circular references in your object, you can save some CPU time |
|
* by calling clone(obj, false). |
|
* |
|
* Caution: if `circular` is false and `parent` contains circular references, |
|
* your program may enter an infinite loop and crash. |
|
* |
|
* @param `parent` - the object to be cloned |
|
* @param `circular` - set to true if the object to be cloned may contain |
|
* circular references. (optional - true by default) |
|
* @param `depth` - set to a number if the object is only to be cloned to |
|
* a particular depth. (optional - defaults to Infinity) |
|
* @param `prototype` - sets the prototype to be used when cloning an object. |
|
* (optional - defaults to parent prototype). |
|
*/ |
|
function clone(parent, circular, depth, prototype) { |
|
var filter; |
|
if (typeof circular === 'object') { |
|
depth = circular.depth; |
|
prototype = circular.prototype; |
|
filter = circular.filter; |
|
circular = circular.circular |
|
} |
|
// maintain two arrays for circular references, where corresponding parents |
|
// and children have the same index |
|
var allParents = []; |
|
var allChildren = []; |
|
|
|
var useBuffer = typeof Buffer != 'undefined'; |
|
|
|
if (typeof circular == 'undefined') |
|
circular = true; |
|
|
|
if (typeof depth == 'undefined') |
|
depth = Infinity; |
|
|
|
// recurse this function so we don't reset allParents and allChildren |
|
function _clone(parent, depth) { |
|
// cloning null always returns null |
|
if (parent === null) |
|
return null; |
|
|
|
if (depth == 0) |
|
return parent; |
|
|
|
var child; |
|
var proto; |
|
if (typeof parent != 'object') { |
|
return parent; |
|
} |
|
|
|
if (clone.__isArray(parent)) { |
|
child = []; |
|
} else if (clone.__isRegExp(parent)) { |
|
child = new RegExp(parent.source, __getRegExpFlags(parent)); |
|
if (parent.lastIndex) child.lastIndex = parent.lastIndex; |
|
} else if (clone.__isDate(parent)) { |
|
child = new Date(parent.getTime()); |
|
} else if (useBuffer && Buffer.isBuffer(parent)) { |
|
child = new Buffer(parent.length); |
|
parent.copy(child); |
|
return child; |
|
} else { |
|
if (typeof prototype == 'undefined') { |
|
proto = Object.getPrototypeOf(parent); |
|
child = Object.create(proto); |
|
} |
|
else { |
|
child = Object.create(prototype); |
|
proto = prototype; |
|
} |
|
} |
|
|
|
if (circular) { |
|
var index = allParents.indexOf(parent); |
|
|
|
if (index != -1) { |
|
return allChildren[index]; |
|
} |
|
allParents.push(parent); |
|
allChildren.push(child); |
|
} |
|
|
|
for (var i in parent) { |
|
var attrs; |
|
if (proto) { |
|
attrs = Object.getOwnPropertyDescriptor(proto, i); |
|
} |
|
|
|
if (attrs && attrs.set == null) { |
|
continue; |
|
} |
|
child[i] = _clone(parent[i], depth - 1); |
|
} |
|
|
|
return child; |
|
} |
|
|
|
return _clone(parent, depth); |
|
} |
|
|
|
/** |
|
* Simple flat clone using prototype, accepts only objects, usefull for property |
|
* override on FLAT configuration object (no nested props). |
|
* |
|
* USE WITH CAUTION! This may not behave as you wish if you do not know how this |
|
* works. |
|
*/ |
|
clone.clonePrototype = function clonePrototype(parent) { |
|
if (parent === null) |
|
return null; |
|
|
|
var c = function () {}; |
|
c.prototype = parent; |
|
return new c(); |
|
}; |
|
|
|
// private utility functions |
|
|
|
function __objToStr(o) { |
|
return Object.prototype.toString.call(o); |
|
}; |
|
clone.__objToStr = __objToStr; |
|
|
|
function __isDate(o) { |
|
return typeof o === 'object' && __objToStr(o) === '[object Date]'; |
|
}; |
|
clone.__isDate = __isDate; |
|
|
|
function __isArray(o) { |
|
return typeof o === 'object' && __objToStr(o) === '[object Array]'; |
|
}; |
|
clone.__isArray = __isArray; |
|
|
|
function __isRegExp(o) { |
|
return typeof o === 'object' && __objToStr(o) === '[object RegExp]'; |
|
}; |
|
clone.__isRegExp = __isRegExp; |
|
|
|
function __getRegExpFlags(re) { |
|
var flags = ''; |
|
if (re.global) flags += 'g'; |
|
if (re.ignoreCase) flags += 'i'; |
|
if (re.multiline) flags += 'm'; |
|
return flags; |
|
}; |
|
clone.__getRegExpFlags = __getRegExpFlags; |
|
|
|
return clone; |
|
})(); |
|
|
|
if (typeof module === 'object' && module.exports) { |
|
module.exports = clone; |
|
} |
|
|
|
}).call(this,require("buffer").Buffer) |
|
},{"buffer":3}],56:[function(require,module,exports){ |
|
module.exports={ |
|
"jet":[{"index":0,"rgb":[0,0,131]},{"index":0.125,"rgb":[0,60,170]},{"index":0.375,"rgb":[5,255,255]},{"index":0.625,"rgb":[255,255,0]},{"index":0.875,"rgb":[250,0,0]},{"index":1,"rgb":[128,0,0]}], |
|
|
|
"hsv":[{"index":0,"rgb":[255,0,0]},{"index":0.169,"rgb":[253,255,2]},{"index":0.173,"rgb":[247,255,2]},{"index":0.337,"rgb":[0,252,4]},{"index":0.341,"rgb":[0,252,10]},{"index":0.506,"rgb":[1,249,255]},{"index":0.671,"rgb":[2,0,253]},{"index":0.675,"rgb":[8,0,253]},{"index":0.839,"rgb":[255,0,251]},{"index":0.843,"rgb":[255,0,245]},{"index":1,"rgb":[255,0,6]}], |
|
|
|
"hot":[{"index":0,"rgb":[0,0,0]},{"index":0.3,"rgb":[230,0,0]},{"index":0.6,"rgb":[255,210,0]},{"index":1,"rgb":[255,255,255]}], |
|
|
|
"cool":[{"index":0,"rgb":[0,255,255]},{"index":1,"rgb":[255,0,255]}], |
|
|
|
"spring":[{"index":0,"rgb":[255,0,255]},{"index":1,"rgb":[255,255,0]}], |
|
|
|
"summer":[{"index":0,"rgb":[0,128,102]},{"index":1,"rgb":[255,255,102]}], |
|
|
|
"autumn":[{"index":0,"rgb":[255,0,0]},{"index":1,"rgb":[255,255,0]}], |
|
|
|
"winter":[{"index":0,"rgb":[0,0,255]},{"index":1,"rgb":[0,255,128]}], |
|
|
|
"bone":[{"index":0,"rgb":[0,0,0]},{"index":0.376,"rgb":[84,84,116]},{"index":0.753,"rgb":[169,200,200]},{"index":1,"rgb":[255,255,255]}], |
|
|
|
"copper":[{"index":0,"rgb":[0,0,0]},{"index":0.804,"rgb":[255,160,102]},{"index":1,"rgb":[255,199,127]}], |
|
|
|
"greys":[{"index":0,"rgb":[0,0,0]},{"index":1,"rgb":[255,255,255]}], |
|
|
|
"yignbu":[{"index":0,"rgb":[8,29,88]},{"index":0.125,"rgb":[37,52,148]},{"index":0.25,"rgb":[34,94,168]},{"index":0.375,"rgb":[29,145,192]},{"index":0.5,"rgb":[65,182,196]},{"index":0.625,"rgb":[127,205,187]},{"index":0.75,"rgb":[199,233,180]},{"index":0.875,"rgb":[237,248,217]},{"index":1,"rgb":[255,255,217]}], |
|
|
|
"greens":[{"index":0,"rgb":[0,68,27]},{"index":0.125,"rgb":[0,109,44]},{"index":0.25,"rgb":[35,139,69]},{"index":0.375,"rgb":[65,171,93]},{"index":0.5,"rgb":[116,196,118]},{"index":0.625,"rgb":[161,217,155]},{"index":0.75,"rgb":[199,233,192]},{"index":0.875,"rgb":[229,245,224]},{"index":1,"rgb":[247,252,245]}], |
|
|
|
"yiorrd":[{"index":0,"rgb":[128,0,38]},{"index":0.125,"rgb":[189,0,38]},{"index":0.25,"rgb":[227,26,28]},{"index":0.375,"rgb":[252,78,42]},{"index":0.5,"rgb":[253,141,60]},{"index":0.625,"rgb":[254,178,76]},{"index":0.75,"rgb":[254,217,118]},{"index":0.875,"rgb":[255,237,160]},{"index":1,"rgb":[255,255,204]}], |
|
|
|
"bluered":[{"index":0,"rgb":[0,0,255]},{"index":1,"rgb":[255,0,0]}], |
|
|
|
"rdbu":[{"index":0,"rgb":[5,10,172]},{"index":0.35,"rgb":[106,137,247]},{"index":0.5,"rgb":[190,190,190]},{"index":0.6,"rgb":[220,170,132]},{"index":0.7,"rgb":[230,145,90]},{"index":1,"rgb":[178,10,28]}], |
|
|
|
"picnic":[{"index":0,"rgb":[0,0,255]},{"index":0.1,"rgb":[51,153,255]},{"index":0.2,"rgb":[102,204,255]},{"index":0.3,"rgb":[153,204,255]},{"index":0.4,"rgb":[204,204,255]},{"index":0.5,"rgb":[255,255,255]},{"index":0.6,"rgb":[255,204,255]},{"index":0.7,"rgb":[255,153,255]},{"index":0.8,"rgb":[255,102,204]},{"index":0.9,"rgb":[255,102,102]},{"index":1,"rgb":[255,0,0]}], |
|
|
|
"rainbow":[{"index":0,"rgb":[150,0,90]},{"index":0.125,"rgb":[0,0,200]},{"index":0.25,"rgb":[0,25,255]},{"index":0.375,"rgb":[0,152,255]},{"index":0.5,"rgb":[44,255,150]},{"index":0.625,"rgb":[151,255,0]},{"index":0.75,"rgb":[255,234,0]},{"index":0.875,"rgb":[255,111,0]},{"index":1,"rgb":[255,0,0]}], |
|
|
|
"portland":[{"index":0,"rgb":[12,51,131]},{"index":0.25,"rgb":[10,136,186]},{"index":0.5,"rgb":[242,211,56]},{"index":0.75,"rgb":[242,143,56]},{"index":1,"rgb":[217,30,30]}], |
|
|
|
"blackbody":[{"index":0,"rgb":[0,0,0]},{"index":0.2,"rgb":[230,0,0]},{"index":0.4,"rgb":[230,210,0]},{"index":0.7,"rgb":[255,255,255]},{"index":1,"rgb":[160,200,255]}], |
|
|
|
"earth":[{"index":0,"rgb":[0,0,130]},{"index":0.1,"rgb":[0,180,180]},{"index":0.2,"rgb":[40,210,40]},{"index":0.4,"rgb":[230,230,50]},{"index":0.6,"rgb":[120,70,20]},{"index":1,"rgb":[255,255,255]}], |
|
|
|
"electric":[{"index":0,"rgb":[0,0,0]},{"index":0.15,"rgb":[30,0,100]},{"index":0.4,"rgb":[120,0,100]},{"index":0.6,"rgb":[160,90,0]},{"index":0.8,"rgb":[230,200,0]},{"index":1,"rgb":[255,250,220]}], |
|
|
|
"alpha": [{"index":0, "rgb": [255,255,255,0]},{"index":0, "rgb": [255,255,255,1]}], |
|
|
|
"viridis": [{"index":0,"rgb":[68,1,84]},{"index":0.13,"rgb":[71,44,122]},{"index":0.25,"rgb":[59,81,139]},{"index":0.38,"rgb":[44,113,142]},{"index":0.5,"rgb":[33,144,141]},{"index":0.63,"rgb":[39,173,129]},{"index":0.75,"rgb":[92,200,99]},{"index":0.88,"rgb":[170,220,50]},{"index":1,"rgb":[253,231,37]}], |
|
|
|
"inferno": [{"index":0,"rgb":[0,0,4]},{"index":0.13,"rgb":[31,12,72]},{"index":0.25,"rgb":[85,15,109]},{"index":0.38,"rgb":[136,34,106]},{"index":0.5,"rgb":[186,54,85]},{"index":0.63,"rgb":[227,89,51]},{"index":0.75,"rgb":[249,140,10]},{"index":0.88,"rgb":[249,201,50]},{"index":1,"rgb":[252,255,164]}], |
|
|
|
"magma": [{"index":0,"rgb":[0,0,4]},{"index":0.13,"rgb":[28,16,68]},{"index":0.25,"rgb":[79,18,123]},{"index":0.38,"rgb":[129,37,129]},{"index":0.5,"rgb":[181,54,122]},{"index":0.63,"rgb":[229,80,100]},{"index":0.75,"rgb":[251,135,97]},{"index":0.88,"rgb":[254,194,135]},{"index":1,"rgb":[252,253,191]}], |
|
|
|
"plasma": [{"index":0,"rgb":[13,8,135]},{"index":0.13,"rgb":[75,3,161]},{"index":0.25,"rgb":[125,3,168]},{"index":0.38,"rgb":[168,34,150]},{"index":0.5,"rgb":[203,70,121]},{"index":0.63,"rgb":[229,107,93]},{"index":0.75,"rgb":[248,148,65]},{"index":0.88,"rgb":[253,195,40]},{"index":1,"rgb":[240,249,33]}], |
|
|
|
"warm": [{"index":0,"rgb":[125,0,179]},{"index":0.13,"rgb":[172,0,187]},{"index":0.25,"rgb":[219,0,170]},{"index":0.38,"rgb":[255,0,130]},{"index":0.5,"rgb":[255,63,74]},{"index":0.63,"rgb":[255,123,0]},{"index":0.75,"rgb":[234,176,0]},{"index":0.88,"rgb":[190,228,0]},{"index":1,"rgb":[147,255,0]}], |
|
|
|
"cool": [{"index":0,"rgb":[125,0,179]},{"index":0.13,"rgb":[116,0,218]},{"index":0.25,"rgb":[98,74,237]},{"index":0.38,"rgb":[68,146,231]},{"index":0.5,"rgb":[0,204,197]},{"index":0.63,"rgb":[0,247,146]},{"index":0.75,"rgb":[0,255,88]},{"index":0.88,"rgb":[40,255,8]},{"index":1,"rgb":[147,255,0]}], |
|
|
|
"rainbow-soft": [{"index":0,"rgb":[125,0,179]},{"index":0.1,"rgb":[199,0,180]},{"index":0.2,"rgb":[255,0,121]},{"index":0.3,"rgb":[255,108,0]},{"index":0.4,"rgb":[222,194,0]},{"index":0.5,"rgb":[150,255,0]},{"index":0.6,"rgb":[0,255,55]},{"index":0.7,"rgb":[0,246,150]},{"index":0.8,"rgb":[50,167,222]},{"index":0.9,"rgb":[103,51,235]},{"index":1,"rgb":[124,0,186]}], |
|
|
|
"bathymetry": [{"index":0,"rgb":[40,26,44]},{"index":0.13,"rgb":[59,49,90]},{"index":0.25,"rgb":[64,76,139]},{"index":0.38,"rgb":[63,110,151]},{"index":0.5,"rgb":[72,142,158]},{"index":0.63,"rgb":[85,174,163]},{"index":0.75,"rgb":[120,206,163]},{"index":0.88,"rgb":[187,230,172]},{"index":1,"rgb":[253,254,204]}], |
|
|
|
"cdom": [{"index":0,"rgb":[47,15,62]},{"index":0.13,"rgb":[87,23,86]},{"index":0.25,"rgb":[130,28,99]},{"index":0.38,"rgb":[171,41,96]},{"index":0.5,"rgb":[206,67,86]},{"index":0.63,"rgb":[230,106,84]},{"index":0.75,"rgb":[242,149,103]},{"index":0.88,"rgb":[249,193,135]},{"index":1,"rgb":[254,237,176]}], |
|
|
|
"chlorophyll": [{"index":0,"rgb":[18,36,20]},{"index":0.13,"rgb":[25,63,41]},{"index":0.25,"rgb":[24,91,59]},{"index":0.38,"rgb":[13,119,72]},{"index":0.5,"rgb":[18,148,80]},{"index":0.63,"rgb":[80,173,89]},{"index":0.75,"rgb":[132,196,122]},{"index":0.88,"rgb":[175,221,162]},{"index":1,"rgb":[215,249,208]}], |
|
|
|
"density": [{"index":0,"rgb":[54,14,36]},{"index":0.13,"rgb":[89,23,80]},{"index":0.25,"rgb":[110,45,132]},{"index":0.38,"rgb":[120,77,178]},{"index":0.5,"rgb":[120,113,213]},{"index":0.63,"rgb":[115,151,228]},{"index":0.75,"rgb":[134,185,227]},{"index":0.88,"rgb":[177,214,227]},{"index":1,"rgb":[230,241,241]}], |
|
|
|
"freesurface-blue": [{"index":0,"rgb":[30,4,110]},{"index":0.13,"rgb":[47,14,176]},{"index":0.25,"rgb":[41,45,236]},{"index":0.38,"rgb":[25,99,212]},{"index":0.5,"rgb":[68,131,200]},{"index":0.63,"rgb":[114,156,197]},{"index":0.75,"rgb":[157,181,203]},{"index":0.88,"rgb":[200,208,216]},{"index":1,"rgb":[241,237,236]}], |
|
|
|
"freesurface-red": [{"index":0,"rgb":[60,9,18]},{"index":0.13,"rgb":[100,17,27]},{"index":0.25,"rgb":[142,20,29]},{"index":0.38,"rgb":[177,43,27]},{"index":0.5,"rgb":[192,87,63]},{"index":0.63,"rgb":[205,125,105]},{"index":0.75,"rgb":[216,162,148]},{"index":0.88,"rgb":[227,199,193]},{"index":1,"rgb":[241,237,236]}], |
|
|
|
"oxygen": [{"index":0,"rgb":[64,5,5]},{"index":0.13,"rgb":[106,6,15]},{"index":0.25,"rgb":[144,26,7]},{"index":0.38,"rgb":[168,64,3]},{"index":0.5,"rgb":[188,100,4]},{"index":0.63,"rgb":[206,136,11]},{"index":0.75,"rgb":[220,174,25]},{"index":0.88,"rgb":[231,215,44]},{"index":1,"rgb":[248,254,105]}], |
|
|
|
"par": [{"index":0,"rgb":[51,20,24]},{"index":0.13,"rgb":[90,32,35]},{"index":0.25,"rgb":[129,44,34]},{"index":0.38,"rgb":[159,68,25]},{"index":0.5,"rgb":[182,99,19]},{"index":0.63,"rgb":[199,134,22]},{"index":0.75,"rgb":[212,171,35]},{"index":0.88,"rgb":[221,210,54]},{"index":1,"rgb":[225,253,75]}], |
|
|
|
"phase": [{"index":0,"rgb":[145,105,18]},{"index":0.13,"rgb":[184,71,38]},{"index":0.25,"rgb":[186,58,115]},{"index":0.38,"rgb":[160,71,185]},{"index":0.5,"rgb":[110,97,218]},{"index":0.63,"rgb":[50,123,164]},{"index":0.75,"rgb":[31,131,110]},{"index":0.88,"rgb":[77,129,34]},{"index":1,"rgb":[145,105,18]}], |
|
|
|
"salinity": [{"index":0,"rgb":[42,24,108]},{"index":0.13,"rgb":[33,50,162]},{"index":0.25,"rgb":[15,90,145]},{"index":0.38,"rgb":[40,118,137]},{"index":0.5,"rgb":[59,146,135]},{"index":0.63,"rgb":[79,175,126]},{"index":0.75,"rgb":[120,203,104]},{"index":0.88,"rgb":[193,221,100]},{"index":1,"rgb":[253,239,154]}], |
|
|
|
"temperature": [{"index":0,"rgb":[4,35,51]},{"index":0.13,"rgb":[23,51,122]},{"index":0.25,"rgb":[85,59,157]},{"index":0.38,"rgb":[129,79,143]},{"index":0.5,"rgb":[175,95,130]},{"index":0.63,"rgb":[222,112,101]},{"index":0.75,"rgb":[249,146,66]},{"index":0.88,"rgb":[249,196,65]},{"index":1,"rgb":[232,250,91]}], |
|
|
|
"turbidity": [{"index":0,"rgb":[34,31,27]},{"index":0.13,"rgb":[65,50,41]},{"index":0.25,"rgb":[98,69,52]},{"index":0.38,"rgb":[131,89,57]},{"index":0.5,"rgb":[161,112,59]},{"index":0.63,"rgb":[185,140,66]},{"index":0.75,"rgb":[202,174,88]},{"index":0.88,"rgb":[216,209,126]},{"index":1,"rgb":[233,246,171]}], |
|
|
|
"velocity-blue": [{"index":0,"rgb":[17,32,64]},{"index":0.13,"rgb":[35,52,116]},{"index":0.25,"rgb":[29,81,156]},{"index":0.38,"rgb":[31,113,162]},{"index":0.5,"rgb":[50,144,169]},{"index":0.63,"rgb":[87,173,176]},{"index":0.75,"rgb":[149,196,189]},{"index":0.88,"rgb":[203,221,211]},{"index":1,"rgb":[254,251,230]}], |
|
|
|
"velocity-green": [{"index":0,"rgb":[23,35,19]},{"index":0.13,"rgb":[24,64,38]},{"index":0.25,"rgb":[11,95,45]},{"index":0.38,"rgb":[39,123,35]},{"index":0.5,"rgb":[95,146,12]},{"index":0.63,"rgb":[152,165,18]},{"index":0.75,"rgb":[201,186,69]},{"index":0.88,"rgb":[233,216,137]},{"index":1,"rgb":[255,253,205]}], |
|
|
|
"cubehelix": [{"index":0,"rgb":[0,0,0]},{"index":0.07,"rgb":[22,5,59]},{"index":0.13,"rgb":[60,4,105]},{"index":0.2,"rgb":[109,1,135]},{"index":0.27,"rgb":[161,0,147]},{"index":0.33,"rgb":[210,2,142]},{"index":0.4,"rgb":[251,11,123]},{"index":0.47,"rgb":[255,29,97]},{"index":0.53,"rgb":[255,54,69]},{"index":0.6,"rgb":[255,85,46]},{"index":0.67,"rgb":[255,120,34]},{"index":0.73,"rgb":[255,157,37]},{"index":0.8,"rgb":[241,191,57]},{"index":0.87,"rgb":[224,220,93]},{"index":0.93,"rgb":[218,241,142]},{"index":1,"rgb":[227,253,198]}] |
|
}; |
|
|
|
},{}],57:[function(require,module,exports){ |
|
/* |
|
* Ben Postlethwaite |
|
* January 2013 |
|
* License MIT |
|
*/ |
|
'use strict'; |
|
|
|
var at = require('arraytools'); |
|
var clone = require('clone'); |
|
var colorScale = require('./colorScales'); |
|
|
|
module.exports = createColormap; |
|
|
|
function createColormap (spec) { |
|
/* |
|
* Default Options |
|
*/ |
|
var indicies, rgba, fromrgba, torgba, |
|
nsteps, cmap, colormap, format, |
|
nshades, colors, alpha, index, i, |
|
r = [], |
|
g = [], |
|
b = [], |
|
a = []; |
|
|
|
if ( !at.isPlainObject(spec) ) spec = {}; |
|
|
|
nshades = spec.nshades || 72; |
|
format = spec.format || 'hex'; |
|
|
|
colormap = spec.colormap; |
|
if (!colormap) colormap = 'jet'; |
|
|
|
if (typeof colormap === 'string') { |
|
colormap = colormap.toLowerCase(); |
|
|
|
if (!colorScale[colormap]) { |
|
throw Error(colormap + ' not a supported colorscale'); |
|
} |
|
|
|
cmap = clone(colorScale[colormap]); |
|
|
|
} else if (Array.isArray(colormap)) { |
|
cmap = clone(colormap); |
|
|
|
} else { |
|
throw Error('unsupported colormap option', colormap); |
|
} |
|
|
|
if (cmap.length > nshades) { |
|
throw new Error( |
|
colormap+' map requires nshades to be at least size '+cmap.length |
|
); |
|
} |
|
|
|
if (!Array.isArray(spec.alpha)) { |
|
|
|
if (typeof spec.alpha === 'number') { |
|
alpha = [spec.alpha, spec.alpha]; |
|
|
|
} else { |
|
alpha = [1, 1]; |
|
} |
|
|
|
} else if (spec.alpha.length !== 2) { |
|
alpha = [1, 1]; |
|
|
|
} else { |
|
alpha = clone(spec.alpha); |
|
} |
|
|
|
/* |
|
* map index points from 0->1 to 0 -> n-1 |
|
*/ |
|
indicies = cmap.map(function(c) { |
|
return Math.round(c.index * nshades); |
|
}); |
|
|
|
/* |
|
* Add alpha channel to the map |
|
*/ |
|
if (alpha[0] < 0) alpha[0] = 0; |
|
if (alpha[1] < 0) alpha[0] = 0; |
|
if (alpha[0] > 1) alpha[0] = 1; |
|
if (alpha[1] > 1) alpha[0] = 1; |
|
|
|
for (i = 0; i < indicies.length; ++i) { |
|
index = cmap[i].index; |
|
rgba = cmap[i].rgb; |
|
|
|
// if user supplies their own map use it |
|
if (rgba.length === 4 && rgba[3] >= 0 && rgba[3] <= 1) continue; |
|
rgba[3] = alpha[0] + (alpha[1] - alpha[0])*index; |
|
} |
|
|
|
/* |
|
* map increasing linear values between indicies to |
|
* linear steps in colorvalues |
|
*/ |
|
for (i = 0; i < indicies.length-1; ++i) { |
|
nsteps = indicies[i+1] - indicies[i]; |
|
fromrgba = cmap[i].rgb; |
|
torgba = cmap[i+1].rgb; |
|
r = r.concat(at.linspace(fromrgba[0], torgba[0], nsteps ) ); |
|
g = g.concat(at.linspace(fromrgba[1], torgba[1], nsteps ) ); |
|
b = b.concat(at.linspace(fromrgba[2], torgba[2], nsteps ) ); |
|
a = a.concat(at.linspace(fromrgba[3], torgba[3], nsteps ) ); |
|
} |
|
|
|
r = r.map( Math.round ); |
|
g = g.map( Math.round ); |
|
b = b.map( Math.round ); |
|
|
|
colors = at.zip(r, g, b, a); |
|
|
|
if (format === 'hex') colors = colors.map( rgb2hex ); |
|
if (format === 'rgbaString') colors = colors.map( rgbaStr ); |
|
|
|
return colors; |
|
}; |
|
|
|
|
|
function rgb2hex (rgba) { |
|
var dig, hex = '#'; |
|
for (var i = 0; i < 3; ++i) { |
|
dig = rgba[i]; |
|
dig = dig.toString(16); |
|
hex += ('00' + dig).substr( dig.length ); |
|
} |
|
return hex; |
|
} |
|
|
|
function rgbaStr (rgba) { |
|
return 'rgba(' + rgba.join(',') + ')'; |
|
} |
|
|
|
},{"./colorScales":56,"arraytools":16,"clone":55}],58:[function(require,module,exports){ |
|
"use strict" |
|
|
|
module.exports = compareAngle |
|
|
|
var orient = require("robust-orientation") |
|
var sgn = require("signum") |
|
var twoSum = require("two-sum") |
|
var robustProduct = require("robust-product") |
|
var robustSum = require("robust-sum") |
|
|
|
function testInterior(a, b, c) { |
|
var x0 = twoSum(a[0], -b[0]) |
|
var y0 = twoSum(a[1], -b[1]) |
|
var x1 = twoSum(c[0], -b[0]) |
|
var y1 = twoSum(c[1], -b[1]) |
|
|
|
var d = robustSum( |
|
robustProduct(x0, x1), |
|
robustProduct(y0, y1)) |
|
|
|
return d[d.length-1] >= 0 |
|
} |
|
|
|
function compareAngle(a, b, c, d) { |
|
var bcd = orient(b, c, d) |
|
if(bcd === 0) { |
|
//Handle degenerate cases |
|
var sabc = sgn(orient(a, b, c)) |
|
var sabd = sgn(orient(a, b, d)) |
|
if(sabc === sabd) { |
|
if(sabc === 0) { |
|
var ic = testInterior(a, b, c) |
|
var id = testInterior(a, b, d) |
|
if(ic === id) { |
|
return 0 |
|
} else if(ic) { |
|
return 1 |
|
} else { |
|
return -1 |
|
} |
|
} |
|
return 0 |
|
} else if(sabd === 0) { |
|
if(sabc > 0) { |
|
return -1 |
|
} else if(testInterior(a, b, d)) { |
|
return -1 |
|
} else { |
|
return 1 |
|
} |
|
} else if(sabc === 0) { |
|
if(sabd > 0) { |
|
return 1 |
|
} else if(testInterior(a, b, c)) { |
|
return 1 |
|
} else { |
|
return -1 |
|
} |
|
} |
|
return sgn(sabd - sabc) |
|
} |
|
var abc = orient(a, b, c) |
|
if(abc > 0) { |
|
if(bcd > 0 && orient(a, b, d) > 0) { |
|
return 1 |
|
} |
|
return -1 |
|
} else if(abc < 0) { |
|
if(bcd > 0 || orient(a, b, d) > 0) { |
|
return 1 |
|
} |
|
return -1 |
|
} else { |
|
var abd = orient(a, b, d) |
|
if(abd > 0) { |
|
return 1 |
|
} else { |
|
if(testInterior(a, b, c)) { |
|
return 1 |
|
} else { |
|
return -1 |
|
} |
|
} |
|
} |
|
} |
|
},{"robust-orientation":234,"robust-product":235,"robust-sum":239,"signum":59,"two-sum":256}],59:[function(require,module,exports){ |
|
"use strict" |
|
|
|
module.exports = function signum(x) { |
|
if(x < 0) { return -1 } |
|
if(x > 0) { return 1 } |
|
return 0.0 |
|
} |
|
},{}],60:[function(require,module,exports){ |
|
"use strict" |
|
|
|
var convexHull1d = require('./lib/ch1d') |
|
var convexHull2d = require('./lib/ch2d') |
|
var convexHullnd = require('./lib/chnd') |
|
|
|
module.exports = convexHull |
|
|
|
function convexHull(points) { |
|
var n = points.length |
|
if(n === 0) { |
|
return [] |
|
} else if(n === 1) { |
|
return [[0]] |
|
} |
|
var d = points[0].length |
|
if(d === 0) { |
|
return [] |
|
} else if(d === 1) { |
|
return convexHull1d(points) |
|
} else if(d === 2) { |
|
return convexHull2d(points) |
|
} |
|
return convexHullnd(points, d) |
|
} |
|
},{"./lib/ch1d":61,"./lib/ch2d":62,"./lib/chnd":63}],61:[function(require,module,exports){ |
|
"use strict" |
|
|
|
module.exports = convexHull1d |
|
|
|
function convexHull1d(points) { |
|
var lo = 0 |
|
var hi = 0 |
|
for(var i=1; i<points.length; ++i) { |
|
if(points[i][0] < points[lo][0]) { |
|
lo = i |
|
} |
|
if(points[i][0] > points[hi][0]) { |
|
hi = i |
|
} |
|
} |
|
if(lo < hi) { |
|
return [[lo], [hi]] |
|
} else if(lo > hi) { |
|
return [[hi], [lo]] |
|
} else { |
|
return [[lo]] |
|
} |
|
} |
|
},{}],62:[function(require,module,exports){ |
|
'use strict' |
|
|
|
module.exports = convexHull2D |
|
|
|
var monotoneHull = require('monotone-convex-hull-2d') |
|
|
|
function convexHull2D(points) { |
|
var hull = monotoneHull(points) |
|
var h = hull.length |
|
if(h <= 2) { |
|
return [] |
|
} |
|
var edges = new Array(h) |
|
var a = hull[h-1] |
|
for(var i=0; i<h; ++i) { |
|
var b = hull[i] |
|
edges[i] = [a,b] |
|
a = b |
|
} |
|
return edges |
|
} |
|
|
|
},{"monotone-convex-hull-2d":199}],63:[function(require,module,exports){ |
|
'use strict' |
|
|
|
module.exports = convexHullnD |
|
|
|
var ich = require('incremental-convex-hull') |
|
var aff = require('affine-hull') |
|
|
|
function permute(points, front) { |
|
var n = points.length |
|
var npoints = new Array(n) |
|
for(var i=0; i<front.length; ++i) { |
|
npoints[i] = points[front[i]] |
|
} |
|
var ptr = front.length |
|
for(var i=0; i<n; ++i) { |
|
if(front.indexOf(i) < 0) { |
|
npoints[ptr++] = points[i] |
|
} |
|
} |
|
return npoints |
|
} |
|
|
|
function invPermute(cells, front) { |
|
var nc = cells.length |
|
var nf = front.length |
|
for(var i=0; i<nc; ++i) { |
|
var c = cells[i] |
|
for(var j=0; j<c.length; ++j) { |
|
var x = c[j] |
|
if(x < nf) { |
|
c[j] = front[x] |
|
} else { |
|
x = x - nf |
|
for(var k=0; k<nf; ++k) { |
|
if(x >= front[k]) { |
|
x += 1 |
|
} |
|
} |
|
c[j] = x |
|
} |
|
} |
|
} |
|
return cells |
|
} |
|
|
|
function convexHullnD(points, d) { |
|
try { |
|
return ich(points, true) |
|
} catch(e) { |
|
//If point set is degenerate, try to find a basis and rerun it |
|
var ah = aff(points) |
|
if(ah.length <= d) { |
|
//No basis, no try |
|
return [] |
|
} |
|
var npoints = permute(points, ah) |
|
var nhull = ich(npoints, true) |
|
return invPermute(nhull, ah) |
|
} |
|
} |
|
},{"affine-hull":15,"incremental-convex-hull":188}],64:[function(require,module,exports){ |
|
"use strict" |
|
|
|
function dcubicHermite(p0, v0, p1, v1, t, f) { |
|
var dh00 = 6*t*t-6*t, |
|
dh10 = 3*t*t-4*t + 1, |
|
dh01 = -6*t*t+6*t, |
|
dh11 = 3*t*t-2*t |
|
if(p0.length) { |
|
if(!f) { |
|
f = new Array(p0.length) |
|
} |
|
for(var i=p0.length-1; i>=0; --i) { |
|
f[i] = dh00*p0[i] + dh10*v0[i] + dh01*p1[i] + dh11*v1[i] |
|
} |
|
return f |
|
} |
|
return dh00*p0 + dh10*v0 + dh01*p1[i] + dh11*v1 |
|
} |
|
|
|
function cubicHermite(p0, v0, p1, v1, t, f) { |
|
var ti = (t-1), t2 = t*t, ti2 = ti*ti, |
|
h00 = (1+2*t)*ti2, |
|
h10 = t*ti2, |
|
h01 = t2*(3-2*t), |
|
h11 = t2*ti |
|
if(p0.length) { |
|
if(!f) { |
|
f = new Array(p0.length) |
|
} |
|
for(var i=p0.length-1; i>=0; --i) { |
|
f[i] = h00*p0[i] + h10*v0[i] + h01*p1[i] + h11*v1[i] |
|
} |
|
return f |
|
} |
|
return h00*p0 + h10*v0 + h01*p1 + h11*v1 |
|
} |
|
|
|
module.exports = cubicHermite |
|
module.exports.derivative = dcubicHermite |
|
},{}],65:[function(require,module,exports){ |
|
"use strict" |
|
|
|
var createThunk = require("./lib/thunk.js") |
|
|
|
function Procedure() { |
|
this.argTypes = [] |
|
this.shimArgs = [] |
|
this.arrayArgs = [] |
|
this.arrayBlockIndices = [] |
|
this.scalarArgs = [] |
|
this.offsetArgs = [] |
|
this.offsetArgIndex = [] |
|
this.indexArgs = [] |
|
this.shapeArgs = [] |
|
this.funcName = "" |
|
this.pre = null |
|
this.body = null |
|
this.post = null |
|
this.debug = false |
|
} |
|
|
|
function compileCwise(user_args) { |
|
//Create procedure |
|
var proc = new Procedure() |
|
|
|
//Parse blocks |
|
proc.pre = user_args.pre |
|
proc.body = user_args.body |
|
proc.post = user_args.post |
|
|
|
//Parse arguments |
|
var proc_args = user_args.args.slice(0) |
|
proc.argTypes = proc_args |
|
for(var i=0; i<proc_args.length; ++i) { |
|
var arg_type = proc_args[i] |
|
if(arg_type === "array" || (typeof arg_type === "object" && arg_type.blockIndices)) { |
|
proc.argTypes[i] = "array" |
|
proc.arrayArgs.push(i) |
|
proc.arrayBlockIndices.push(arg_type.blockIndices ? arg_type.blockIndices : 0) |
|
proc.shimArgs.push("array" + i) |
|
if(i < proc.pre.args.length && proc.pre.args[i].count>0) { |
|
throw new Error("cwise: pre() block may not reference array args") |
|
} |
|
if(i < proc.post.args.length && proc.post.args[i].count>0) { |
|
throw new Error("cwise: post() block may not reference array args") |
|
} |
|
} else if(arg_type === "scalar") { |
|
proc.scalarArgs.push(i) |
|
proc.shimArgs.push("scalar" + i) |
|
} else if(arg_type === "index") { |
|
proc.indexArgs.push(i) |
|
if(i < proc.pre.args.length && proc.pre.args[i].count > 0) { |
|
throw new Error("cwise: pre() block may not reference array index") |
|
} |
|
if(i < proc.body.args.length && proc.body.args[i].lvalue) { |
|
throw new Error("cwise: body() block may not write to array index") |
|
} |
|
if(i < proc.post.args.length && proc.post.args[i].count > 0) { |
|
throw new Error("cwise: post() block may not reference array index") |
|
} |
|
} else if(arg_type === "shape") { |
|
proc.shapeArgs.push(i) |
|
if(i < proc.pre.args.length && proc.pre.args[i].lvalue) { |
|
throw new Error("cwise: pre() block may not write to array shape") |
|
} |
|
if(i < proc.body.args.length && proc.body.args[i].lvalue) { |
|
throw new Error("cwise: body() block may not write to array shape") |
|
} |
|
if(i < proc.post.args.length && proc.post.args[i].lvalue) { |
|
throw new Error("cwise: post() block may not write to array shape") |
|
} |
|
} else if(typeof arg_type === "object" && arg_type.offset) { |
|
proc.argTypes[i] = "offset" |
|
proc.offsetArgs.push({ array: arg_type.array, offset:arg_type.offset }) |
|
proc.offsetArgIndex.push(i) |
|
} else { |
|
throw new Error("cwise: Unknown argument type " + proc_args[i]) |
|
} |
|
} |
|
|
|
//Make sure at least one array argument was specified |
|
if(proc.arrayArgs.length <= 0) { |
|
throw new Error("cwise: No array arguments specified") |
|
} |
|
|
|
//Make sure arguments are correct |
|
if(proc.pre.args.length > proc_args.length) { |
|
throw new Error("cwise: Too many arguments in pre() block") |
|
} |
|
if(proc.body.args.length > proc_args.length) { |
|
throw new Error("cwise: Too many arguments in body() block") |
|
} |
|
if(proc.post.args.length > proc_args.length) { |
|
throw new Error("cwise: Too many arguments in post() block") |
|
} |
|
|
|
//Check debug flag |
|
proc.debug = !!user_args.printCode || !!user_args.debug |
|
|
|
//Retrieve name |
|
proc.funcName = user_args.funcName || "cwise" |
|
|
|
//Read in block size |
|
proc.blockSize = user_args.blockSize || 64 |
|
|
|
return createThunk(proc) |
|
} |
|
|
|
module.exports = compileCwise |
|
|
|
},{"./lib/thunk.js":67}],66:[function(require,module,exports){ |
|
"use strict" |
|
|
|
var uniq = require("uniq") |
|
|
|
// This function generates very simple loops analogous to how you typically traverse arrays (the outermost loop corresponds to the slowest changing index, the innermost loop to the fastest changing index) |
|
// TODO: If two arrays have the same strides (and offsets) there is potential for decreasing the number of "pointers" and related variables. The drawback is that the type signature would become more specific and that there would thus be less potential for caching, but it might still be worth it, especially when dealing with large numbers of arguments. |
|
function innerFill(order, proc, body) { |
|
var dimension = order.length |
|
, nargs = proc.arrayArgs.length |
|
, has_index = proc.indexArgs.length>0 |
|
, code = [] |
|
, vars = [] |
|
, idx=0, pidx=0, i, j |
|
for(i=0; i<dimension; ++i) { // Iteration variables |
|
vars.push(["i",i,"=0"].join("")) |
|
} |
|
//Compute scan deltas |
|
for(j=0; j<nargs; ++j) { |
|
for(i=0; i<dimension; ++i) { |
|
pidx = idx |
|
idx = order[i] |
|
if(i === 0) { // The innermost/fastest dimension's delta is simply its stride |
|
vars.push(["d",j,"s",i,"=t",j,"p",idx].join("")) |
|
} else { // For other dimensions the delta is basically the stride minus something which essentially "rewinds" the previous (more inner) dimension |
|
vars.push(["d",j,"s",i,"=(t",j,"p",idx,"-s",pidx,"*t",j,"p",pidx,")"].join("")) |
|
} |
|
} |
|
} |
|
if (vars.length > 0) { |
|
code.push("var " + vars.join(",")) |
|
} |
|
//Scan loop |
|
for(i=dimension-1; i>=0; --i) { // Start at largest stride and work your way inwards |
|
idx = order[i] |
|
code.push(["for(i",i,"=0;i",i,"<s",idx,";++i",i,"){"].join("")) |
|
} |
|
//Push body of inner loop |
|
code.push(body) |
|
//Advance scan pointers |
|
for(i=0; i<dimension; ++i) { |
|
pidx = idx |
|
idx = order[i] |
|
for(j=0; j<nargs; ++j) { |
|
code.push(["p",j,"+=d",j,"s",i].join("")) |
|
} |
|
if(has_index) { |
|
if(i > 0) { |
|
code.push(["index[",pidx,"]-=s",pidx].join("")) |
|
} |
|
code.push(["++index[",idx,"]"].join("")) |
|
} |
|
code.push("}") |
|
} |
|
return code.join("\n") |
|
} |
|
|
|
// Generate "outer" loops that loop over blocks of data, applying "inner" loops to the blocks by manipulating the local variables in such a way that the inner loop only "sees" the current block. |
|
// TODO: If this is used, then the previous declaration (done by generateCwiseOp) of s* is essentially unnecessary. |
|
// I believe the s* are not used elsewhere (in particular, I don't think they're used in the pre/post parts and "shape" is defined independently), so it would be possible to make defining the s* dependent on what loop method is being used. |
|
function outerFill(matched, order, proc, body) { |
|
var dimension = order.length |
|
, nargs = proc.arrayArgs.length |
|
, blockSize = proc.blockSize |
|
, has_index = proc.indexArgs.length > 0 |
|
, code = [] |
|
for(var i=0; i<nargs; ++i) { |
|
code.push(["var offset",i,"=p",i].join("")) |
|
} |
|
//Generate loops for unmatched dimensions |
|
// The order in which these dimensions are traversed is fairly arbitrary (from small stride to large stride, for the first argument) |
|
// TODO: It would be nice if the order in which these loops are placed would also be somehow "optimal" (at the very least we should check that it really doesn't hurt us if they're not). |
|
for(var i=matched; i<dimension; ++i) { |
|
code.push(["for(var j"+i+"=SS[", order[i], "]|0;j", i, ">0;){"].join("")) // Iterate back to front |
|
code.push(["if(j",i,"<",blockSize,"){"].join("")) // Either decrease j by blockSize (s = blockSize), or set it to zero (after setting s = j). |
|
code.push(["s",order[i],"=j",i].join("")) |
|
code.push(["j",i,"=0"].join("")) |
|
code.push(["}else{s",order[i],"=",blockSize].join("")) |
|
code.push(["j",i,"-=",blockSize,"}"].join("")) |
|
if(has_index) { |
|
code.push(["index[",order[i],"]=j",i].join("")) |
|
} |
|
} |
|
for(var i=0; i<nargs; ++i) { |
|
var indexStr = ["offset"+i] |
|
for(var j=matched; j<dimension; ++j) { |
|
indexStr.push(["j",j,"*t",i,"p",order[j]].join("")) |
|
} |
|
code.push(["p",i,"=(",indexStr.join("+"),")"].join("")) |
|
} |
|
code.push(innerFill(order, proc, body)) |
|
for(var i=matched; i<dimension; ++i) { |
|
code.push("}") |
|
} |
|
return code.join("\n") |
|
} |
|
|
|
//Count the number of compatible inner orders |
|
// This is the length of the longest common prefix of the arrays in orders. |
|
// Each array in orders lists the dimensions of the correspond ndarray in order of increasing stride. |
|
// This is thus the maximum number of dimensions that can be efficiently traversed by simple nested loops for all arrays. |
|
function countMatches(orders) { |
|
var matched = 0, dimension = orders[0].length |
|
while(matched < dimension) { |
|
for(var j=1; j<orders.length; ++j) { |
|
if(orders[j][matched] !== orders[0][matched]) { |
|
return matched |
|
} |
|
} |
|
++matched |
|
} |
|
return matched |
|
} |
|
|
|
//Processes a block according to the given data types |
|
// Replaces variable names by different ones, either "local" ones (that are then ferried in and out of the given array) or ones matching the arguments that the function performing the ultimate loop will accept. |
|
function processBlock(block, proc, dtypes) { |
|
var code = block.body |
|
var pre = [] |
|
var post = [] |
|
for(var i=0; i<block.args.length; ++i) { |
|
var carg = block.args[i] |
|
if(carg.count <= 0) { |
|
continue |
|
} |
|
var re = new RegExp(carg.name, "g") |
|
var ptrStr = "" |
|
var arrNum = proc.arrayArgs.indexOf(i) |
|
switch(proc.argTypes[i]) { |
|
case "offset": |
|
var offArgIndex = proc.offsetArgIndex.indexOf(i) |
|
var offArg = proc.offsetArgs[offArgIndex] |
|
arrNum = offArg.array |
|
ptrStr = "+q" + offArgIndex // Adds offset to the "pointer" in the array |
|
case "array": |
|
ptrStr = "p" + arrNum + ptrStr |
|
var localStr = "l" + i |
|
var arrStr = "a" + arrNum |
|
if (proc.arrayBlockIndices[arrNum] === 0) { // Argument to body is just a single value from this array |
|
if(carg.count === 1) { // Argument/array used only once(?) |
|
if(dtypes[arrNum] === "generic") { |
|
if(carg.lvalue) { |
|
pre.push(["var ", localStr, "=", arrStr, ".get(", ptrStr, ")"].join("")) // Is this necessary if the argument is ONLY used as an lvalue? (keep in mind that we can have a += something, so we would actually need to check carg.rvalue) |
|
code = code.replace(re, localStr) |
|
post.push([arrStr, ".set(", ptrStr, ",", localStr,")"].join("")) |
|
} else { |
|
code = code.replace(re, [arrStr, ".get(", ptrStr, ")"].join("")) |
|
} |
|
} else { |
|
code = code.replace(re, [arrStr, "[", ptrStr, "]"].join("")) |
|
} |
|
} else if(dtypes[arrNum] === "generic") { |
|
pre.push(["var ", localStr, "=", arrStr, ".get(", ptrStr, ")"].join("")) // TODO: Could we optimize by checking for carg.rvalue? |
|
code = code.replace(re, localStr) |
|
if(carg.lvalue) { |
|
post.push([arrStr, ".set(", ptrStr, ",", localStr,")"].join("")) |
|
} |
|
} else { |
|
pre.push(["var ", localStr, "=", arrStr, "[", ptrStr, "]"].join("")) // TODO: Could we optimize by checking for carg.rvalue? |
|
code = code.replace(re, localStr) |
|
if(carg.lvalue) { |
|
post.push([arrStr, "[", ptrStr, "]=", localStr].join("")) |
|
} |
|
} |
|
} else { // Argument to body is a "block" |
|
var reStrArr = [carg.name], ptrStrArr = [ptrStr] |
|
for(var j=0; j<Math.abs(proc.arrayBlockIndices[arrNum]); j++) { |
|
reStrArr.push("\\s*\\[([^\\]]+)\\]") |
|
ptrStrArr.push("$" + (j+1) + "*t" + arrNum + "b" + j) // Matched index times stride |
|
} |
|
re = new RegExp(reStrArr.join(""), "g") |
|
ptrStr = ptrStrArr.join("+") |
|
if(dtypes[arrNum] === "generic") { |
|
/*if(carg.lvalue) { |
|
pre.push(["var ", localStr, "=", arrStr, ".get(", ptrStr, ")"].join("")) // Is this necessary if the argument is ONLY used as an lvalue? (keep in mind that we can have a += something, so we would actually need to check carg.rvalue) |
|
code = code.replace(re, localStr) |
|
post.push([arrStr, ".set(", ptrStr, ",", localStr,")"].join("")) |
|
} else { |
|
code = code.replace(re, [arrStr, ".get(", ptrStr, ")"].join("")) |
|
}*/ |
|
throw new Error("cwise: Generic arrays not supported in combination with blocks!") |
|
} else { |
|
// This does not produce any local variables, even if variables are used multiple times. It would be possible to do so, but it would complicate things quite a bit. |
|
code = code.replace(re, [arrStr, "[", ptrStr, "]"].join("")) |
|
} |
|
} |
|
break |
|
case "scalar": |
|
code = code.replace(re, "Y" + proc.scalarArgs.indexOf(i)) |
|
break |
|
case "index": |
|
code = code.replace(re, "index") |
|
break |
|
case "shape": |
|
code = code.replace(re, "shape") |
|
break |
|
} |
|
} |
|
return [pre.join("\n"), code, post.join("\n")].join("\n").trim() |
|
} |
|
|
|
function typeSummary(dtypes) { |
|
var summary = new Array(dtypes.length) |
|
var allEqual = true |
|
for(var i=0; i<dtypes.length; ++i) { |
|
var t = dtypes[i] |
|
var digits = t.match(/\d+/) |
|
if(!digits) { |
|
digits = "" |
|
} else { |
|
digits = digits[0] |
|
} |
|
if(t.charAt(0) === 0) { |
|
summary[i] = "u" + t.charAt(1) + digits |
|
} else { |
|
summary[i] = t.charAt(0) + digits |
|
} |
|
if(i > 0) { |
|
allEqual = allEqual && summary[i] === summary[i-1] |
|
} |
|
} |
|
if(allEqual) { |
|
return summary[0] |
|
} |
|
return summary.join("") |
|
} |
|
|
|
//Generates a cwise operator |
|
function generateCWiseOp(proc, typesig) { |
|
|
|
//Compute dimension |
|
// Arrays get put first in typesig, and there are two entries per array (dtype and order), so this gets the number of dimensions in the first array arg. |
|
var dimension = (typesig[1].length - Math.abs(proc.arrayBlockIndices[0]))|0 |
|
var orders = new Array(proc.arrayArgs.length) |
|
var dtypes = new Array(proc.arrayArgs.length) |
|
for(var i=0; i<proc.arrayArgs.length; ++i) { |
|
dtypes[i] = typesig[2*i] |
|
orders[i] = typesig[2*i+1] |
|
} |
|
|
|
//Determine where block and loop indices start and end |
|
var blockBegin = [], blockEnd = [] // These indices are exposed as blocks |
|
var loopBegin = [], loopEnd = [] // These indices are iterated over |
|
var loopOrders = [] // orders restricted to the loop indices |
|
for(var i=0; i<proc.arrayArgs.length; ++i) { |
|
if (proc.arrayBlockIndices[i]<0) { |
|
loopBegin.push(0) |
|
loopEnd.push(dimension) |
|
blockBegin.push(dimension) |
|
blockEnd.push(dimension+proc.arrayBlockIndices[i]) |
|
} else { |
|
loopBegin.push(proc.arrayBlockIndices[i]) // Non-negative |
|
loopEnd.push(proc.arrayBlockIndices[i]+dimension) |
|
blockBegin.push(0) |
|
blockEnd.push(proc.arrayBlockIndices[i]) |
|
} |
|
var newOrder = [] |
|
for(var j=0; j<orders[i].length; j++) { |
|
if (loopBegin[i]<=orders[i][j] && orders[i][j]<loopEnd[i]) { |
|
newOrder.push(orders[i][j]-loopBegin[i]) // If this is a loop index, put it in newOrder, subtracting loopBegin, to make sure that all loopOrders are using a common set of indices. |
|
} |
|
} |
|
loopOrders.push(newOrder) |
|
} |
|
|
|
//First create arguments for procedure |
|
var arglist = ["SS"] // SS is the overall shape over which we iterate |
|
var code = ["'use strict'"] |
|
var vars = [] |
|
|
|
for(var j=0; j<dimension; ++j) { |
|
vars.push(["s", j, "=SS[", j, "]"].join("")) // The limits for each dimension. |
|
} |
|
for(var i=0; i<proc.arrayArgs.length; ++i) { |
|
arglist.push("a"+i) // Actual data array |
|
arglist.push("t"+i) // Strides |
|
arglist.push("p"+i) // Offset in the array at which the data starts (also used for iterating over the data) |
|
|
|
for(var j=0; j<dimension; ++j) { // Unpack the strides into vars for looping |
|
vars.push(["t",i,"p",j,"=t",i,"[",loopBegin[i]+j,"]"].join("")) |
|
} |
|
|
|
for(var j=0; j<Math.abs(proc.arrayBlockIndices[i]); ++j) { // Unpack the strides into vars for block iteration |
|
vars.push(["t",i,"b",j,"=t",i,"[",blockBegin[i]+j,"]"].join("")) |
|
} |
|
} |
|
for(var i=0; i<proc.scalarArgs.length; ++i) { |
|
arglist.push("Y" + i) |
|
} |
|
if(proc.shapeArgs.length > 0) { |
|
vars.push("shape=SS.slice(0)") // Makes the shape over which we iterate available to the user defined functions (so you can use width/height for example) |
|
} |
|
if(proc.indexArgs.length > 0) { |
|
// Prepare an array to keep track of the (logical) indices, initialized to dimension zeroes. |
|
var zeros = new Array(dimension) |
|
for(var i=0; i<dimension; ++i) { |
|
zeros[i] = "0" |
|
} |
|
vars.push(["index=[", zeros.join(","), "]"].join("")) |
|
} |
|
for(var i=0; i<proc.offsetArgs.length; ++i) { // Offset arguments used for stencil operations |
|
var off_arg = proc.offsetArgs[i] |
|
var init_string = [] |
|
for(var j=0; j<off_arg.offset.length; ++j) { |
|
if(off_arg.offset[j] === 0) { |
|
continue |
|
} else if(off_arg.offset[j] === 1) { |
|
init_string.push(["t", off_arg.array, "p", j].join("")) |
|
} else { |
|
init_string.push([off_arg.offset[j], "*t", off_arg.array, "p", j].join("")) |
|
} |
|
} |
|
if(init_string.length === 0) { |
|
vars.push("q" + i + "=0") |
|
} else { |
|
vars.push(["q", i, "=", init_string.join("+")].join("")) |
|
} |
|
} |
|
|
|
//Prepare this variables |
|
var thisVars = uniq([].concat(proc.pre.thisVars) |
|
.concat(proc.body.thisVars) |
|
.concat(proc.post.thisVars)) |
|
vars = vars.concat(thisVars) |
|
if (vars.length > 0) { |
|
code.push("var " + vars.join(",")) |
|
} |
|
for(var i=0; i<proc.arrayArgs.length; ++i) { |
|
code.push("p"+i+"|=0") |
|
} |
|
|
|
//Inline prelude |
|
if(proc.pre.body.length > 3) { |
|
code.push(processBlock(proc.pre, proc, dtypes)) |
|
} |
|
|
|
//Process body |
|
var body = processBlock(proc.body, proc, dtypes) |
|
var matched = countMatches(loopOrders) |
|
if(matched < dimension) { |
|
code.push(outerFill(matched, loopOrders[0], proc, body)) // TODO: Rather than passing loopOrders[0], it might be interesting to look at passing an order that represents the majority of the arguments for example. |
|
} else { |
|
code.push(innerFill(loopOrders[0], proc, body)) |
|
} |
|
|
|
//Inline epilog |
|
if(proc.post.body.length > 3) { |
|
code.push(processBlock(proc.post, proc, dtypes)) |
|
} |
|
|
|
if(proc.debug) { |
|
console.log("-----Generated cwise routine for ", typesig, ":\n" + code.join("\n") + "\n----------") |
|
} |
|
|
|
var loopName = [(proc.funcName||"unnamed"), "_cwise_loop_", orders[0].join("s"),"m",matched,typeSummary(dtypes)].join("") |
|
var f = new Function(["function ",loopName,"(", arglist.join(","),"){", code.join("\n"),"} return ", loopName].join("")) |
|
return f() |
|
} |
|
module.exports = generateCWiseOp |
|
|
|
},{"uniq":259}],67:[function(require,module,exports){ |
|
"use strict" |
|
|
|
// The function below is called when constructing a cwise function object, and does the following: |
|
// A function object is constructed which accepts as argument a compilation function and returns another function. |
|
// It is this other function that is eventually returned by createThunk, and this function is the one that actually |
|
// checks whether a certain pattern of arguments has already been used before and compiles new loops as needed. |
|
// The compilation passed to the first function object is used for compiling new functions. |
|
// Once this function object is created, it is called with compile as argument, where the first argument of compile |
|
// is bound to "proc" (essentially containing a preprocessed version of the user arguments to cwise). |
|
// So createThunk roughly works like this: |
|
// function createThunk(proc) { |
|
// var thunk = function(compileBound) { |
|
// var CACHED = {} |
|
// return function(arrays and scalars) { |
|
// if (dtype and order of arrays in CACHED) { |
|
// var func = CACHED[dtype and order of arrays] |
|
// } else { |
|
// var func = CACHED[dtype and order of arrays] = compileBound(dtype and order of arrays) |
|
// } |
|
// return func(arrays and scalars) |
|
// } |
|
// } |
|
// return thunk(compile.bind1(proc)) |
|
// } |
|
|
|
var compile = require("./compile.js") |
|
|
|
function createThunk(proc) { |
|
var code = ["'use strict'", "var CACHED={}"] |
|
var vars = [] |
|
var thunkName = proc.funcName + "_cwise_thunk" |
|
|
|
//Build thunk |
|
code.push(["return function ", thunkName, "(", proc.shimArgs.join(","), "){"].join("")) |
|
var typesig = [] |
|
var string_typesig = [] |
|
var proc_args = [["array",proc.arrayArgs[0],".shape.slice(", // Slice shape so that we only retain the shape over which we iterate (which gets passed to the cwise operator as SS). |
|
Math.max(0,proc.arrayBlockIndices[0]),proc.arrayBlockIndices[0]<0?(","+proc.arrayBlockIndices[0]+")"):")"].join("")] |
|
var shapeLengthConditions = [], shapeConditions = [] |
|
// Process array arguments |
|
for(var i=0; i<proc.arrayArgs.length; ++i) { |
|
var j = proc.arrayArgs[i] |
|
vars.push(["t", j, "=array", j, ".dtype,", |
|
"r", j, "=array", j, ".order"].join("")) |
|
typesig.push("t" + j) |
|
typesig.push("r" + j) |
|
string_typesig.push("t"+j) |
|
string_typesig.push("r"+j+".join()") |
|
proc_args.push("array" + j + ".data") |
|
proc_args.push("array" + j + ".stride") |
|
proc_args.push("array" + j + ".offset|0") |
|
if (i>0) { // Gather conditions to check for shape equality (ignoring block indices) |
|
shapeLengthConditions.push("array" + proc.arrayArgs[0] + ".shape.length===array" + j + ".shape.length+" + (Math.abs(proc.arrayBlockIndices[0])-Math.abs(proc.arrayBlockIndices[i]))) |
|
shapeConditions.push("array" + proc.arrayArgs[0] + ".shape[shapeIndex+" + Math.max(0,proc.arrayBlockIndices[0]) + "]===array" + j + ".shape[shapeIndex+" + Math.max(0,proc.arrayBlockIndices[i]) + "]") |
|
} |
|
} |
|
// Check for shape equality |
|
if (proc.arrayArgs.length > 1) { |
|
code.push("if (!(" + shapeLengthConditions.join(" && ") + ")) throw new Error('cwise: Arrays do not all have the same dimensionality!')") |
|
code.push("for(var shapeIndex=array" + proc.arrayArgs[0] + ".shape.length-" + Math.abs(proc.arrayBlockIndices[0]) + "; shapeIndex-->0;) {") |
|
code.push("if (!(" + shapeConditions.join(" && ") + ")) throw new Error('cwise: Arrays do not all have the same shape!')") |
|
code.push("}") |
|
} |
|
// Process scalar arguments |
|
for(var i=0; i<proc.scalarArgs.length; ++i) { |
|
proc_args.push("scalar" + proc.scalarArgs[i]) |
|
} |
|
// Check for cached function (and if not present, generate it) |
|
vars.push(["type=[", string_typesig.join(","), "].join()"].join("")) |
|
vars.push("proc=CACHED[type]") |
|
code.push("var " + vars.join(",")) |
|
|
|
code.push(["if(!proc){", |
|
"CACHED[type]=proc=compile([", typesig.join(","), "])}", |
|
"return proc(", proc_args.join(","), ")}"].join("")) |
|
|
|
if(proc.debug) { |
|
console.log("-----Generated thunk:\n" + code.join("\n") + "\n----------") |
|
} |
|
|
|
//Compile thunk |
|
var thunk = new Function("compile", code.join("\n")) |
|
return thunk(compile.bind(undefined, proc)) |
|
} |
|
|
|
module.exports = createThunk |
|
|
|
},{"./compile.js":66}],68:[function(require,module,exports){ |
|
module.exports = require("cwise-compiler") |
|
},{"cwise-compiler":65}],69:[function(require,module,exports){ |
|
(function (Buffer){ |
|
var hasTypedArrays = false |
|
if(typeof Float64Array !== "undefined") { |
|
var DOUBLE_VIEW = new Float64Array(1) |
|
, UINT_VIEW = new Uint32Array(DOUBLE_VIEW.buffer) |
|
DOUBLE_VIEW[0] = 1.0 |
|
hasTypedArrays = true |
|
if(UINT_VIEW[1] === 0x3ff00000) { |
|
//Use little endian |
|
module.exports = function doubleBitsLE(n) { |
|
DOUBLE_VIEW[0] = n |
|
return [ UINT_VIEW[0], UINT_VIEW[1] ] |
|
} |
|
function toDoubleLE(lo, hi) { |
|
UINT_VIEW[0] = lo |
|
UINT_VIEW[1] = hi |
|
return DOUBLE_VIEW[0] |
|
} |
|
module.exports.pack = toDoubleLE |
|
function lowUintLE(n) { |
|
DOUBLE_VIEW[0] = n |
|
return UINT_VIEW[0] |
|
} |
|
module.exports.lo = lowUintLE |
|
function highUintLE(n) { |
|
DOUBLE_VIEW[0] = n |
|
return UINT_VIEW[1] |
|
} |
|
module.exports.hi = highUintLE |
|
} else if(UINT_VIEW[0] === 0x3ff00000) { |
|
//Use big endian |
|
module.exports = function doubleBitsBE(n) { |
|
DOUBLE_VIEW[0] = n |
|
return [ UINT_VIEW[1], UINT_VIEW[0] ] |
|
} |
|
function toDoubleBE(lo, hi) { |
|
UINT_VIEW[1] = lo |
|
UINT_VIEW[0] = hi |
|
return DOUBLE_VIEW[0] |
|
} |
|
module.exports.pack = toDoubleBE |
|
function lowUintBE(n) { |
|
DOUBLE_VIEW[0] = n |
|
return UINT_VIEW[1] |
|
} |
|
module.exports.lo = lowUintBE |
|
function highUintBE(n) { |
|
DOUBLE_VIEW[0] = n |
|
return UINT_VIEW[0] |
|
} |
|
module.exports.hi = highUintBE |
|
} else { |
|
hasTypedArrays = false |
|
} |
|
} |
|
if(!hasTypedArrays) { |
|
var buffer = new Buffer(8) |
|
module.exports = function doubleBits(n) { |
|
buffer.writeDoubleLE(n, 0, true) |
|
return [ buffer.readUInt32LE(0, true), buffer.readUInt32LE(4, true) ] |
|
} |
|
function toDouble(lo, hi) { |
|
buffer.writeUInt32LE(lo, 0, true) |
|
buffer.writeUInt32LE(hi, 4, true) |
|
return buffer.readDoubleLE(0, true) |
|
} |
|
module.exports.pack = toDouble |
|
function lowUint(n) { |
|
buffer.writeDoubleLE(n, 0, true) |
|
return buffer.readUInt32LE(0, true) |
|
} |
|
module.exports.lo = lowUint |
|
function highUint(n) { |
|
buffer.writeDoubleLE(n, 0, true) |
|
return buffer.readUInt32LE(4, true) |
|
} |
|
module.exports.hi = highUint |
|
} |
|
|
|
module.exports.sign = function(n) { |
|
return module.exports.hi(n) >>> 31 |
|
} |
|
|
|
module.exports.exponent = function(n) { |
|
var b = module.exports.hi(n) |
|
return ((b<<1) >>> 21) - 1023 |
|
} |
|
|
|
module.exports.fraction = function(n) { |
|
var lo = module.exports.lo(n) |
|
var hi = module.exports.hi(n) |
|
var b = hi & ((1<<20) - 1) |
|
if(hi & 0x7ff00000) { |
|
b += (1<<20) |
|
} |
|
return [lo, b] |
|
} |
|
|
|
module.exports.denormalized = function(n) { |
|
var hi = module.exports.hi(n) |
|
return !(hi & 0x7ff00000) |
|
} |
|
}).call(this,require("buffer").Buffer) |
|
},{"buffer":3}],70:[function(require,module,exports){ |
|
"use strict" |
|
|
|
function dupe_array(count, value, i) { |
|
var c = count[i]|0 |
|
if(c <= 0) { |
|
return [] |
|
} |
|
var result = new Array(c), j |
|
if(i === count.length-1) { |
|
for(j=0; j<c; ++j) { |
|
result[j] = value |
|
} |
|
} else { |
|
for(j=0; j<c; ++j) { |
|
result[j] = dupe_array(count, value, i+1) |
|
} |
|
} |
|
return result |
|
} |
|
|
|
function dupe_number(count, value) { |
|
var result, i |
|
result = new Array(count) |
|
for(i=0; i<count; ++i) { |
|
result[i] = value |
|
} |
|
return result |
|
} |
|
|
|
function dupe(count, value) { |
|
if(typeof value === "undefined") { |
|
value = 0 |
|
} |
|
switch(typeof count) { |
|
case "number": |
|
if(count > 0) { |
|
return dupe_number(count|0, value) |
|
} |
|
break |
|
case "object": |
|
if(typeof (count.length) === "number") { |
|
return dupe_array(count, value, 0) |
|
} |
|
break |
|
} |
|
return [] |
|
} |
|
|
|
module.exports = dupe |
|
},{}],71:[function(require,module,exports){ |
|
"use strict" |
|
|
|
module.exports = edgeToAdjacency |
|
|
|
var uniq = require("uniq") |
|
|
|
function edgeToAdjacency(edges, numVertices) { |
|
var numEdges = edges.length |
|
if(typeof numVertices !== "number") { |
|
numVertices = 0 |
|
for(var i=0; i<numEdges; ++i) { |
|
var e = edges[i] |
|
numVertices = Math.max(numVertices, e[0], e[1]) |
|
} |
|
numVertices = (numVertices|0) + 1 |
|
} |
|
numVertices = numVertices|0 |
|
var adj = new Array(numVertices) |
|
for(var i=0; i<numVertices; ++i) { |
|
adj[i] = [] |
|
} |
|
for(var i=0; i<numEdges; ++i) { |
|
var e = edges[i] |
|
adj[e[0]].push(e[1]) |
|
adj[e[1]].push(e[0]) |
|
} |
|
for(var j=0; j<numVertices; ++j) { |
|
uniq(adj[j], function(a, b) { |
|
return a - b |
|
}) |
|
} |
|
return adj |
|
} |
|
},{"uniq":259}],72:[function(require,module,exports){ |
|
module.exports = getSize |
|
|
|
function getSize(element) { |
|
// Handle cases where the element is not already |
|
// attached to the DOM by briefly appending it |
|
// to document.body, and removing it again later. |
|
if (element === window || element === document.body) { |
|
return [window.innerWidth, window.innerHeight] |
|
} |
|
|
|
if (!element.parentNode) { |
|
var temporary = true |
|
document.body.appendChild(element) |
|
} |
|
|
|
var bounds = element.getBoundingClientRect() |
|
var styles = getComputedStyle(element) |
|
var height = (bounds.height|0) |
|
+ parse(styles.getPropertyValue('margin-top')) |
|
+ parse(styles.getPropertyValue('margin-bottom')) |
|
var width = (bounds.width|0) |
|
+ parse(styles.getPropertyValue('margin-left')) |
|
+ parse(styles.getPropertyValue('margin-right')) |
|
|
|
if (temporary) { |
|
document.body.removeChild(element) |
|
} |
|
|
|
return [width, height] |
|
} |
|
|
|
function parse(prop) { |
|
return parseFloat(prop) || 0 |
|
} |
|
|
|
},{}],73:[function(require,module,exports){ |
|
'use strict' |
|
|
|
module.exports = createFilteredVector |
|
|
|
var cubicHermite = require('cubic-hermite') |
|
var bsearch = require('binary-search-bounds') |
|
|
|
function clamp(lo, hi, x) { |
|
return Math.min(hi, Math.max(lo, x)) |
|
} |
|
|
|
function FilteredVector(state0, velocity0, t0) { |
|
this.dimension = state0.length |
|
this.bounds = [ new Array(this.dimension), new Array(this.dimension) ] |
|
for(var i=0; i<this.dimension; ++i) { |
|
this.bounds[0][i] = -Infinity |
|
this.bounds[1][i] = Infinity |
|
} |
|
this._state = state0.slice().reverse() |
|
this._velocity = velocity0.slice().reverse() |
|
this._time = [ t0 ] |
|
this._scratch = [ state0.slice(), state0.slice(), state0.slice(), state0.slice(), state0.slice() ] |
|
} |
|
|
|
var proto = FilteredVector.prototype |
|
|
|
proto.flush = function(t) { |
|
var idx = bsearch.gt(this._time, t) - 1 |
|
if(idx <= 0) { |
|
return |
|
} |
|
this._time.splice(0, idx) |
|
this._state.splice(0, idx * this.dimension) |
|
this._velocity.splice(0, idx * this.dimension) |
|
} |
|
|
|
proto.curve = function(t) { |
|
var time = this._time |
|
var n = time.length |
|
var idx = bsearch.le(time, t) |
|
var result = this._scratch[0] |
|
var state = this._state |
|
var velocity = this._velocity |
|
var d = this.dimension |
|
var bounds = this.bounds |
|
if(idx < 0) { |
|
var ptr = d-1 |
|
for(var i=0; i<d; ++i, --ptr) { |
|
result[i] = state[ptr] |
|
} |
|
} else if(idx >= n-1) { |
|
var ptr = state.length-1 |
|
var tf = t - time[n-1] |
|
for(var i=0; i<d; ++i, --ptr) { |
|
result[i] = state[ptr] + tf * velocity[ptr] |
|
} |
|
} else { |
|
var ptr = d * (idx+1) - 1 |
|
var t0 = time[idx] |
|
var t1 = time[idx+1] |
|
var dt = (t1 - t0) || 1.0 |
|
var x0 = this._scratch[1] |
|
var x1 = this._scratch[2] |
|
var v0 = this._scratch[3] |
|
var v1 = this._scratch[4] |
|
var steady = true |
|
for(var i=0; i<d; ++i, --ptr) { |
|
x0[i] = state[ptr] |
|
v0[i] = velocity[ptr] * dt |
|
x1[i] = state[ptr+d] |
|
v1[i] = velocity[ptr+d] * dt |
|
steady = steady && (x0[i] === x1[i] && v0[i] === v1[i] && v0[i] === 0.0) |
|
} |
|
if(steady) { |
|
for(var i=0; i<d; ++i) { |
|
result[i] = x0[i] |
|
} |
|
} else { |
|
cubicHermite(x0, v0, x1, v1, (t-t0)/dt, result) |
|
} |
|
} |
|
var lo = bounds[0] |
|
var hi = bounds[1] |
|
for(var i=0; i<d; ++i) { |
|
result[i] = clamp(lo[i], hi[i], result[i]) |
|
} |
|
return result |
|
} |
|
|
|
proto.dcurve = function(t) { |
|
var time = this._time |
|
var n = time.length |
|
var idx = bsearch.le(time, t) |
|
var result = this._scratch[0] |
|
var state = this._state |
|
var velocity = this._velocity |
|
var d = this.dimension |
|
if(idx >= n-1) { |
|
var ptr = state.length-1 |
|
var tf = t - time[n-1] |
|
for(var i=0; i<d; ++i, --ptr) { |
|
result[i] = velocity[ptr] |
|
} |
|
} else { |
|
var ptr = d * (idx+1) - 1 |
|
var t0 = time[idx] |
|
var t1 = time[idx+1] |
|
var dt = (t1 - t0) || 1.0 |
|
var x0 = this._scratch[1] |
|
var x1 = this._scratch[2] |
|
var v0 = this._scratch[3] |
|
var v1 = this._scratch[4] |
|
var steady = true |
|
for(var i=0; i<d; ++i, --ptr) { |
|
x0[i] = state[ptr] |
|
v0[i] = velocity[ptr] * dt |
|
x1[i] = state[ptr+d] |
|
v1[i] = velocity[ptr+d] * dt |
|
steady = steady && (x0[i] === x1[i] && v0[i] === v1[i] && v0[i] === 0.0) |
|
} |
|
if(steady) { |
|
for(var i=0; i<d; ++i) { |
|
result[i] = 0.0 |
|
} |
|
} else { |
|
cubicHermite.derivative(x0, v0, x1, v1, (t-t0)/dt, result) |
|
for(var i=0; i<d; ++i) { |
|
result[i] /= dt |
|
} |
|
} |
|
} |
|
return result |
|
} |
|
|
|
proto.lastT = function() { |
|
var time = this._time |
|
return time[time.length-1] |
|
} |
|
|
|
proto.stable = function() { |
|
var velocity = this._velocity |
|
var ptr = velocity.length |
|
for(var i=this.dimension-1; i>=0; --i) { |
|
if(velocity[--ptr]) { |
|
return false |
|
} |
|
} |
|
return true |
|
} |
|
|
|
proto.jump = function(t) { |
|
var t0 = this.lastT() |
|
var d = this.dimension |
|
if(t < t0 || arguments.length !== d+1) { |
|
return |
|
} |
|
var state = this._state |
|
var velocity = this._velocity |
|
var ptr = state.length-this.dimension |
|
var bounds = this.bounds |
|
var lo = bounds[0] |
|
var hi = bounds[1] |
|
this._time.push(t0, t) |
|
for(var j=0; j<2; ++j) { |
|
for(var i=0; i<d; ++i) { |
|
state.push(state[ptr++]) |
|
velocity.push(0) |
|
} |
|
} |
|
this._time.push(t) |
|
for(var i=d; i>0; --i) { |
|
state.push(clamp(lo[i-1], hi[i-1], arguments[i])) |
|
velocity.push(0) |
|
} |
|
} |
|
|
|
proto.push = function(t) { |
|
var t0 = this.lastT() |
|
var d = this.dimension |
|
if(t < t0 || arguments.length !== d+1) { |
|
return |
|
} |
|
var state = this._state |
|
var velocity = this._velocity |
|
var ptr = state.length-this.dimension |
|
var dt = t - t0 |
|
var bounds = this.bounds |
|
var lo = bounds[0] |
|
var hi = bounds[1] |
|
var sf = (dt > 1e-6) ? 1/dt : 0 |
|
this._time.push(t) |
|
for(var i=d; i>0; --i) { |
|
var xc = clamp(lo[i-1], hi[i-1], arguments[i]) |
|
state.push(xc) |
|
velocity.push((xc - state[ptr++]) * sf) |
|
} |
|
} |
|
|
|
proto.set = function(t) { |
|
var d = this.dimension |
|
if(t < this.lastT() || arguments.length !== d+1) { |
|
return |
|
} |
|
var state = this._state |
|
var velocity = this._velocity |
|
var bounds = this.bounds |
|
var lo = bounds[0] |
|
var hi = bounds[1] |
|
this._time.push(t) |
|
for(var i=d; i>0; --i) { |
|
state.push(clamp(lo[i-1], hi[i-1], arguments[i])) |
|
velocity.push(0) |
|
} |
|
} |
|
|
|
proto.move = function(t) { |
|
var t0 = this.lastT() |
|
var d = this.dimension |
|
if(t <= t0 || arguments.length !== d+1) { |
|
return |
|
} |
|
var state = this._state |
|
var velocity = this._velocity |
|
var statePtr = state.length - this.dimension |
|
var bounds = this.bounds |
|
var lo = bounds[0] |
|
var hi = bounds[1] |
|
var dt = t - t0 |
|
var sf = (dt > 1e-6) ? 1/dt : 0.0 |
|
this._time.push(t) |
|
for(var i=d; i>0; --i) { |
|
var dx = arguments[i] |
|
state.push(clamp(lo[i-1], hi[i-1], state[statePtr++] + dx)) |
|
velocity.push(dx * sf) |
|
} |
|
} |
|
|
|
proto.idle = function(t) { |
|
var t0 = this.lastT() |
|
if(t < t0) { |
|
return |
|
} |
|
var d = this.dimension |
|
var state = this._state |
|
var velocity = this._velocity |
|
var statePtr = state.length-d |
|
var bounds = this.bounds |
|
var lo = bounds[0] |
|
var hi = bounds[1] |
|
var dt = t - t0 |
|
this._time.push(t) |
|
for(var i=d-1; i>=0; --i) { |
|
state.push(clamp(lo[i], hi[i], state[statePtr] + dt * velocity[statePtr])) |
|
velocity.push(0) |
|
statePtr += 1 |
|
} |
|
} |
|
|
|
function getZero(d) { |
|
var result = new Array(d) |
|
for(var i=0; i<d; ++i) { |
|
result[i] = 0.0 |
|
} |
|
return result |
|
} |
|
|
|
function createFilteredVector(initState, initVelocity, initTime) { |
|
switch(arguments.length) { |
|
case 0: |
|
return new FilteredVector([0], [0], 0) |
|
case 1: |
|
if(typeof initState === 'number') { |
|
var zero = getZero(initState) |
|
return new FilteredVector(zero, zero, 0) |
|
} else { |
|
return new FilteredVector(initState, getZero(initState.length), 0) |
|
} |
|
case 2: |
|
if(typeof initVelocity === 'number') { |
|
var zero = getZero(initState.length) |
|
return new FilteredVector(initState, zero, +initVelocity) |
|
} else { |
|
initTime = 0 |
|
} |
|
case 3: |
|
if(initState.length !== initVelocity.length) { |
|
throw new Error('state and velocity lengths must match') |
|
} |
|
return new FilteredVector(initState, initVelocity, initTime) |
|
} |
|
} |
|
|
|
},{"binary-search-bounds":35,"cubic-hermite":64}],74:[function(require,module,exports){ |
|
"use strict" |
|
|
|
module.exports = createRBTree |
|
|
|
var RED = 0 |
|
var BLACK = 1 |
|
|
|
function RBNode(color, key, value, left, right, count) { |
|
this._color = color |
|
this.key = key |
|
this.value = value |
|
this.left = left |
|
this.right = right |
|
this._count = count |
|
} |
|
|
|
function cloneNode(node) { |
|
return new RBNode(node._color, node.key, node.value, node.left, node.right, node._count) |
|
} |
|
|
|
function repaint(color, node) { |
|
return new RBNode(color, node.key, node.value, node.left, node.right, node._count) |
|
} |
|
|
|
function recount(node) { |
|
node._count = 1 + (node.left ? node.left._count : 0) + (node.right ? node.right._count : 0) |
|
} |
|
|
|
function RedBlackTree(compare, root) { |
|
this._compare = compare |
|
this.root = root |
|
} |
|
|
|
var proto = RedBlackTree.prototype |
|
|
|
Object.defineProperty(proto, "keys", { |
|
get: function() { |
|
var result = [] |
|
this.forEach(function(k,v) { |
|
result.push(k) |
|
}) |
|
return result |
|
} |
|
}) |
|
|
|
Object.defineProperty(proto, "values", { |
|
get: function() { |
|
var result = [] |
|
this.forEach(function(k,v) { |
|
result.push(v) |
|
}) |
|
return result |
|
} |
|
}) |
|
|
|
//Returns the number of nodes in the tree |
|
Object.defineProperty(proto, "length", { |
|
get: function() { |
|
if(this.root) { |
|
return this.root._count |
|
} |
|
return 0 |
|
} |
|
}) |
|
|
|
//Insert a new item into the tree |
|
proto.insert = function(key, value) { |
|
var cmp = this._compare |
|
//Find point to insert new node at |
|
var n = this.root |
|
var n_stack = [] |
|
var d_stack = [] |
|
while(n) { |
|
var d = cmp(key, n.key) |
|
n_stack.push(n) |
|
d_stack.push(d) |
|
if(d <= 0) { |
|
n = n.left |
|
} else { |
|
n = n.right |
|
} |
|
} |
|
//Rebuild path to leaf node |
|
n_stack.push(new RBNode(RED, key, value, null, null, 1)) |
|
for(var s=n_stack.length-2; s>=0; --s) { |
|
var n = n_stack[s] |
|
if(d_stack[s] <= 0) { |
|
n_stack[s] = new RBNode(n._color, n.key, n.value, n_stack[s+1], n.right, n._count+1) |
|
} else { |
|
n_stack[s] = new RBNode(n._color, n.key, n.value, n.left, n_stack[s+1], n._count+1) |
|
} |
|
} |
|
//Rebalance tree using rotations |
|
//console.log("start insert", key, d_stack) |
|
for(var s=n_stack.length-1; s>1; --s) { |
|
var p = n_stack[s-1] |
|
var n = n_stack[s] |
|
if(p._color === BLACK || n._color === BLACK) { |
|
break |
|
} |
|
var pp = n_stack[s-2] |
|
if(pp.left === p) { |
|
if(p.left === n) { |
|
var y = pp.right |
|
if(y && y._color === RED) { |
|
//console.log("LLr") |
|
p._color = BLACK |
|
pp.right = repaint(BLACK, y) |
|
pp._color = RED |
|
s -= 1 |
|
} else { |
|
//console.log("LLb") |
|
pp._color = RED |
|
pp.left = p.right |
|
p._color = BLACK |
|
p.right = pp |
|
n_stack[s-2] = p |
|
n_stack[s-1] = n |
|
recount(pp) |
|
recount(p) |
|
if(s >= 3) { |
|
var ppp = n_stack[s-3] |
|
if(ppp.left === pp) { |
|
ppp.left = p |
|
} else { |
|
ppp.right = p |
|
} |
|
} |
|
break |
|
} |
|
} else { |
|
var y = pp.right |
|
if(y && y._color === RED) { |
|
//console.log("LRr") |
|
p._color = BLACK |
|
pp.right = repaint(BLACK, y) |
|
pp._color = RED |
|
s -= 1 |
|
} else { |
|
//console.log("LRb") |
|
p.right = n.left |
|
pp._color = RED |
|
pp.left = n.right |
|
n._color = BLACK |
|
n.left = p |
|
n.right = pp |
|
n_stack[s-2] = n |
|
n_stack[s-1] = p |
|
recount(pp) |
|
recount(p) |
|
recount(n) |
|
if(s >= 3) { |
|
var ppp = n_stack[s-3] |
|
if(ppp.left === pp) { |
|
ppp.left = n |
|
} else { |
|
ppp.right = n |
|
} |
|
} |
|
break |
|
} |
|
} |
|
} else { |
|
if(p.right === n) { |
|
var y = pp.left |
|
if(y && y._color === RED) { |
|
//console.log("RRr", y.key) |
|
p._color = BLACK |
|
pp.left = repaint(BLACK, y) |
|
pp._color = RED |
|
s -= 1 |
|
} else { |
|
//console.log("RRb") |
|
pp._color = RED |
|
pp.right = p.left |
|
p._color = BLACK |
|
p.left = pp |
|
n_stack[s-2] = p |
|
n_stack[s-1] = n |
|
recount(pp) |
|
recount(p) |
|
if(s >= 3) { |
|
var ppp = n_stack[s-3] |
|
if(ppp.right === pp) { |
|
ppp.right = p |
|
} else { |
|
ppp.left = p |
|
} |
|
} |
|
break |
|
} |
|
} else { |
|
var y = pp.left |
|
if(y && y._color === RED) { |
|
//console.log("RLr") |
|
p._color = BLACK |
|
pp.left = repaint(BLACK, y) |
|
pp._color = RED |
|
s -= 1 |
|
} else { |
|
//console.log("RLb") |
|
p.left = n.right |
|
pp._color = RED |
|
pp.right = n.left |
|
n._color = BLACK |
|
n.right = p |
|
n.left = pp |
|
n_stack[s-2] = n |
|
n_stack[s-1] = p |
|
recount(pp) |
|
recount(p) |
|
recount(n) |
|
if(s >= 3) { |
|
var ppp = n_stack[s-3] |
|
if(ppp.right === pp) { |
|
ppp.right = n |
|
} else { |
|
ppp.left = n |
|
} |
|
} |
|
break |
|
} |
|
} |
|
} |
|
} |
|
//Return new tree |
|
n_stack[0]._color = BLACK |
|
return new RedBlackTree(cmp, n_stack[0]) |
|
} |
|
|
|
|
|
//Visit all nodes inorder |
|
function doVisitFull(visit, node) { |
|
if(node.left) { |
|
var v = doVisitFull(visit, node.left) |
|
if(v) { return v } |
|
} |
|
var v = visit(node.key, node.value) |
|
if(v) { return v } |
|
if(node.right) { |
|
return doVisitFull(visit, node.right) |
|
} |
|
} |
|
|
|
//Visit half nodes in order |
|
function doVisitHalf(lo, compare, visit, node) { |
|
var l = compare(lo, node.key) |
|
if(l <= 0) { |
|
if(node.left) { |
|
var v = doVisitHalf(lo, compare, visit, node.left) |
|
if(v) { return v } |
|
} |
|
var v = visit(node.key, node.value) |
|
if(v) { return v } |
|
} |
|
if(node.right) { |
|
return doVisitHalf(lo, compare, visit, node.right) |
|
} |
|
} |
|
|
|
//Visit all nodes within a range |
|
function doVisit(lo, hi, compare, visit, node) { |
|
var l = compare(lo, node.key) |
|
var h = compare(hi, node.key) |
|
var v |
|
if(l <= 0) { |
|
if(node.left) { |
|
v = doVisit(lo, hi, compare, visit, node.left) |
|
if(v) { return v } |
|
} |
|
if(h > 0) { |
|
v = visit(node.key, node.value) |
|
if(v) { return v } |
|
} |
|
} |
|
if(h > 0 && node.right) { |
|
return doVisit(lo, hi, compare, visit, node.right) |
|
} |
|
} |
|
|
|
|
|
proto.forEach = function rbTreeForEach(visit, lo, hi) { |
|
if(!this.root) { |
|
return |
|
} |
|
switch(arguments.length) { |
|
case 1: |
|
return doVisitFull(visit, this.root) |
|
break |
|
|
|
case 2: |
|
return doVisitHalf(lo, this._compare, visit, this.root) |
|
break |
|
|
|
case 3: |
|
if(this._compare(lo, hi) >= 0) { |
|
return |
|
} |
|
return doVisit(lo, hi, this._compare, visit, this.root) |
|
break |
|
} |
|
} |
|
|
|
//First item in list |
|
Object.defineProperty(proto, "begin", { |
|
get: function() { |
|
var stack = [] |
|
var n = this.root |
|
while(n) { |
|
stack.push(n) |
|
n = n.left |
|
} |
|
return new RedBlackTreeIterator(this, stack) |
|
} |
|
}) |
|
|
|
//Last item in list |
|
Object.defineProperty(proto, "end", { |
|
get: function() { |
|
var stack = [] |
|
var n = this.root |
|
while(n) { |
|
stack.push(n) |
|
n = n.right |
|
} |
|
return new RedBlackTreeIterator(this, stack) |
|
} |
|
}) |
|
|
|
//Find the ith item in the tree |
|
proto.at = function(idx) { |
|
if(idx < 0) { |
|
return new RedBlackTreeIterator(this, []) |
|
} |
|
var n = this.root |
|
var stack = [] |
|
while(true) { |
|
stack.push(n) |
|
if(n.left) { |
|
if(idx < n.left._count) { |
|
n = n.left |
|
continue |
|
} |
|
idx -= n.left._count |
|
} |
|
if(!idx) { |
|
return new RedBlackTreeIterator(this, stack) |
|
} |
|
idx -= 1 |
|
if(n.right) { |
|
if(idx >= n.right._count) { |
|
break |
|
} |
|
n = n.right |
|
} else { |
|
break |
|
} |
|
} |
|
return new RedBlackTreeIterator(this, []) |
|
} |
|
|
|
proto.ge = function(key) { |
|
var cmp = this._compare |
|
var n = this.root |
|
var stack = [] |
|
var last_ptr = 0 |
|
while(n) { |
|
var d = cmp(key, n.key) |
|
stack.push(n) |
|
if(d <= 0) { |
|
last_ptr = stack.length |
|
} |
|
if(d <= 0) { |
|
n = n.left |
|
} else { |
|
n = n.right |
|
} |
|
} |
|
stack.length = last_ptr |
|
return new RedBlackTreeIterator(this, stack) |
|
} |
|
|
|
proto.gt = function(key) { |
|
var cmp = this._compare |
|
var n = this.root |
|
var stack = [] |
|
var last_ptr = 0 |
|
while(n) { |
|
var d = cmp(key, n.key) |
|
stack.push(n) |
|
if(d < 0) { |
|
last_ptr = stack.length |
|
} |
|
if(d < 0) { |
|
n = n.left |
|
} else { |
|
n = n.right |
|
} |
|
} |
|
stack.length = last_ptr |
|
return new RedBlackTreeIterator(this, stack) |
|
} |
|
|
|
proto.lt = function(key) { |
|
var cmp = this._compare |
|
var n = this.root |
|
var stack = [] |
|
var last_ptr = 0 |
|
while(n) { |
|
var d = cmp(key, n.key) |
|
stack.push(n) |
|
if(d > 0) { |
|
last_ptr = stack.length |
|
} |
|
if(d <= 0) { |
|
n = n.left |
|
} else { |
|
n = n.right |
|
} |
|
} |
|
stack.length = last_ptr |
|
return new RedBlackTreeIterator(this, stack) |
|
} |
|
|
|
proto.le = function(key) { |
|
var cmp = this._compare |
|
var n = this.root |
|
var stack = [] |
|
var last_ptr = 0 |
|
while(n) { |
|
var d = cmp(key, n.key) |
|
stack.push(n) |
|
if(d >= 0) { |
|
last_ptr = stack.length |
|
} |
|
if(d < 0) { |
|
n = n.left |
|
} else { |
|
n = n.right |
|
} |
|
} |
|
stack.length = last_ptr |
|
return new RedBlackTreeIterator(this, stack) |
|
} |
|
|
|
//Finds the item with key if it exists |
|
proto.find = function(key) { |
|
var cmp = this._compare |
|
var n = this.root |
|
var stack = [] |
|
while(n) { |
|
var d = cmp(key, n.key) |
|
stack.push(n) |
|
if(d === 0) { |
|
return new RedBlackTreeIterator(this, stack) |
|
} |
|
if(d <= 0) { |
|
n = n.left |
|
} else { |
|
n = n.right |
|
} |
|
} |
|
return new RedBlackTreeIterator(this, []) |
|
} |
|
|
|
//Removes item with key from tree |
|
proto.remove = function(key) { |
|
var iter = this.find(key) |
|
if(iter) { |
|
return iter.remove() |
|
} |
|
return this |
|
} |
|
|
|
//Returns the item at `key` |
|
proto.get = function(key) { |
|
var cmp = this._compare |
|
var n = this.root |
|
while(n) { |
|
var d = cmp(key, n.key) |
|
if(d === 0) { |
|
return n.value |
|
} |
|
if(d <= 0) { |
|
n = n.left |
|
} else { |
|
n = n.right |
|
} |
|
} |
|
return |
|
} |
|
|
|
//Iterator for red black tree |
|
function RedBlackTreeIterator(tree, stack) { |
|
this.tree = tree |
|
this._stack = stack |
|
} |
|
|
|
var iproto = RedBlackTreeIterator.prototype |
|
|
|
//Test if iterator is valid |
|
Object.defineProperty(iproto, "valid", { |
|
get: function() { |
|
return this._stack.length > 0 |
|
} |
|
}) |
|
|
|
//Node of the iterator |
|
Object.defineProperty(iproto, "node", { |
|
get: function() { |
|
if(this._stack.length > 0) { |
|
return this._stack[this._stack.length-1] |
|
} |
|
return null |
|
}, |
|
enumerable: true |
|
}) |
|
|
|
//Makes a copy of an iterator |
|
iproto.clone = function() { |
|
return new RedBlackTreeIterator(this.tree, this._stack.slice()) |
|
} |
|
|
|
//Swaps two nodes |
|
function swapNode(n, v) { |
|
n.key = v.key |
|
n.value = v.value |
|
n.left = v.left |
|
n.right = v.right |
|
n._color = v._color |
|
n._count = v._count |
|
} |
|
|
|
//Fix up a double black node in a tree |
|
function fixDoubleBlack(stack) { |
|
var n, p, s, z |
|
for(var i=stack.length-1; i>=0; --i) { |
|
n = stack[i] |
|
if(i === 0) { |
|
n._color = BLACK |
|
return |
|
} |
|
//console.log("visit node:", n.key, i, stack[i].key, stack[i-1].key) |
|
p = stack[i-1] |
|
if(p.left === n) { |
|
//console.log("left child") |
|
s = p.right |
|
if(s.right && s.right._color === RED) { |
|
//console.log("case 1: right sibling child red") |
|
s = p.right = cloneNode(s) |
|
z = s.right = cloneNode(s.right) |
|
p.right = s.left |
|
s.left = p |
|
s.right = z |
|
s._color = p._color |
|
n._color = BLACK |
|
p._color = BLACK |
|
z._color = BLACK |
|
recount(p) |
|
recount(s) |
|
if(i > 1) { |
|
var pp = stack[i-2] |
|
if(pp.left === p) { |
|
pp.left = s |
|
} else { |
|
pp.right = s |
|
} |
|
} |
|
stack[i-1] = s |
|
return |
|
} else if(s.left && s.left._color === RED) { |
|
//console.log("case 1: left sibling child red") |
|
s = p.right = cloneNode(s) |
|
z = s.left = cloneNode(s.left) |
|
p.right = z.left |
|
s.left = z.right |
|
z.left = p |
|
z.right = s |
|
z._color = p._color |
|
p._color = BLACK |
|
s._color = BLACK |
|
n._color = BLACK |
|
recount(p) |
|
recount(s) |
|
recount(z) |
|
if(i > 1) { |
|
var pp = stack[i-2] |
|
if(pp.left === p) { |
|
pp.left = z |
|
} else { |
|
pp.right = z |
|
} |
|
} |
|
stack[i-1] = z |
|
return |
|
} |
|
if(s._color === BLACK) { |
|
if(p._color === RED) { |
|
//console.log("case 2: black sibling, red parent", p.right.value) |
|
p._color = BLACK |
|
p.right = repaint(RED, s) |
|
return |
|
} else { |
|
//console.log("case 2: black sibling, black parent", p.right.value) |
|
p.right = repaint(RED, s) |
|
continue |
|
} |
|
} else { |
|
//console.log("case 3: red sibling") |
|
s = cloneNode(s) |
|
p.right = s.left |
|
s.left = p |
|
s._color = p._color |
|
p._color = RED |
|
recount(p) |
|
recount(s) |
|
if(i > 1) { |
|
var pp = stack[i-2] |
|
if(pp.left === p) { |
|
pp.left = s |
|
} else { |
|
pp.right = s |
|
} |
|
} |
|
stack[i-1] = s |
|
stack[i] = p |
|
if(i+1 < stack.length) { |
|
stack[i+1] = n |
|
} else { |
|
stack.push(n) |
|
} |
|
i = i+2 |
|
} |
|
} else { |
|
//console.log("right child") |
|
s = p.left |
|
if(s.left && s.left._color === RED) { |
|
//console.log("case 1: left sibling child red", p.value, p._color) |
|
s = p.left = cloneNode(s) |
|
z = s.left = cloneNode(s.left) |
|
p.left = s.right |
|
s.right = p |
|
s.left = z |
|
s._color = p._color |
|
n._color = BLACK |
|
p._color = BLACK |
|
z._color = BLACK |
|
recount(p) |
|
recount(s) |
|
if(i > 1) { |
|
var pp = stack[i-2] |
|
if(pp.right === p) { |
|
pp.right = s |
|
} else { |
|
pp.left = s |
|
} |
|
} |
|
stack[i-1] = s |
|
return |
|
} else if(s.right && s.right._color === RED) { |
|
//console.log("case 1: right sibling child red") |
|
s = p.left = cloneNode(s) |
|
z = s.right = cloneNode(s.right) |
|
p.left = z.right |
|
s.right = z.left |
|
z.right = p |
|
z.left = s |
|
z._color = p._color |
|
p._color = BLACK |
|
s._color = BLACK |
|
n._color = BLACK |
|
recount(p) |
|
recount(s) |
|
recount(z) |
|
if(i > 1) { |
|
var pp = stack[i-2] |
|
if(pp.right === p) { |
|
pp.right = z |
|
} else { |
|
pp.left = z |
|
} |
|
} |
|
stack[i-1] = z |
|
return |
|
} |
|
if(s._color === BLACK) { |
|
if(p._color === RED) { |
|
//console.log("case 2: black sibling, red parent") |
|
p._color = BLACK |
|
p.left = repaint(RED, s) |
|
return |
|
} else { |
|
//console.log("case 2: black sibling, black parent") |
|
p.left = repaint(RED, s) |
|
continue |
|
} |
|
} else { |
|
//console.log("case 3: red sibling") |
|
s = cloneNode(s) |
|
p.left = s.right |
|
s.right = p |
|
s._color = p._color |
|
p._color = RED |
|
recount(p) |
|
recount(s) |
|
if(i > 1) { |
|
var pp = stack[i-2] |
|
if(pp.right === p) { |
|
pp.right = s |
|
} else { |
|
pp.left = s |
|
} |
|
} |
|
stack[i-1] = s |
|
stack[i] = p |
|
if(i+1 < stack.length) { |
|
stack[i+1] = n |
|
} else { |
|
stack.push(n) |
|
} |
|
i = i+2 |
|
} |
|
} |
|
} |
|
} |
|
|
|
//Removes item at iterator from tree |
|
iproto.remove = function() { |
|
var stack = this._stack |
|
if(stack.length === 0) { |
|
return this.tree |
|
} |
|
//First copy path to node |
|
var cstack = new Array(stack.length) |
|
var n = stack[stack.length-1] |
|
cstack[cstack.length-1] = new RBNode(n._color, n.key, n.value, n.left, n.right, n._count) |
|
for(var i=stack.length-2; i>=0; --i) { |
|
var n = stack[i] |
|
if(n.left === stack[i+1]) { |
|
cstack[i] = new RBNode(n._color, n.key, n.value, cstack[i+1], n.right, n._count) |
|
} else { |
|
cstack[i] = new RBNode(n._color, n.key, n.value, n.left, cstack[i+1], n._count) |
|
} |
|
} |
|
|
|
//Get node |
|
n = cstack[cstack.length-1] |
|
//console.log("start remove: ", n.value) |
|
|
|
//If not leaf, then swap with previous node |
|
if(n.left && n.right) { |
|
//console.log("moving to leaf") |
|
|
|
//First walk to previous leaf |
|
var split = cstack.length |
|
n = n.left |
|
while(n.right) { |
|
cstack.push(n) |
|
n = n.right |
|
} |
|
//Copy path to leaf |
|
var v = cstack[split-1] |
|
cstack.push(new RBNode(n._color, v.key, v.value, n.left, n.right, n._count)) |
|
cstack[split-1].key = n.key |
|
cstack[split-1].value = n.value |
|
|
|
//Fix up stack |
|
for(var i=cstack.length-2; i>=split; --i) { |
|
n = cstack[i] |
|
cstack[i] = new RBNode(n._color, n.key, n.value, n.left, cstack[i+1], n._count) |
|
} |
|
cstack[split-1].left = cstack[split] |
|
} |
|
//console.log("stack=", cstack.map(function(v) { return v.value })) |
|
|
|
//Remove leaf node |
|
n = cstack[cstack.length-1] |
|
if(n._color === RED) { |
|
//Easy case: removing red leaf |
|
//console.log("RED leaf") |
|
var p = cstack[cstack.length-2] |
|
if(p.left === n) { |
|
p.left = null |
|
} else if(p.right === n) { |
|
p.right = null |
|
} |
|
cstack.pop() |
|
for(var i=0; i<cstack.length; ++i) { |
|
cstack[i]._count-- |
|
} |
|
return new RedBlackTree(this.tree._compare, cstack[0]) |
|
} else { |
|
if(n.left || n.right) { |
|
//Second easy case: Single child black parent |
|
//console.log("BLACK single child") |
|
if(n.left) { |
|
swapNode(n, n.left) |
|
} else if(n.right) { |
|
swapNode(n, n.right) |
|
} |
|
//Child must be red, so repaint it black to balance color |
|
n._color = BLACK |
|
for(var i=0; i<cstack.length-1; ++i) { |
|
cstack[i]._count-- |
|
} |
|
return new RedBlackTree(this.tree._compare, cstack[0]) |
|
} else if(cstack.length === 1) { |
|
//Third easy case: root |
|
//console.log("ROOT") |
|
return new RedBlackTree(this.tree._compare, null) |
|
} else { |
|
//Hard case: Repaint n, and then do some nasty stuff |
|
//console.log("BLACK leaf no children") |
|
for(var i=0; i<cstack.length; ++i) { |
|
cstack[i]._count-- |
|
} |
|
var parent = cstack[cstack.length-2] |
|
fixDoubleBlack(cstack) |
|
//Fix up links |
|
if(parent.left === n) { |
|
parent.left = null |
|
} else { |
|
parent.right = null |
|
} |
|
} |
|
} |
|
return new RedBlackTree(this.tree._compare, cstack[0]) |
|
} |
|
|
|
//Returns key |
|
Object.defineProperty(iproto, "key", { |
|
get: function() { |
|
if(this._stack.length > 0) { |
|
return this._stack[this._stack.length-1].key |
|
} |
|
return |
|
}, |
|
enumerable: true |
|
}) |
|
|
|
//Returns value |
|
Object.defineProperty(iproto, "value", { |
|
get: function() { |
|
if(this._stack.length > 0) { |
|
return this._stack[this._stack.length-1].value |
|
} |
|
return |
|
}, |
|
enumerable: true |
|
}) |
|
|
|
|
|
//Returns the position of this iterator in the sorted list |
|
Object.defineProperty(iproto, "index", { |
|
get: function() { |
|
var idx = 0 |
|
var stack = this._stack |
|
if(stack.length === 0) { |
|
var r = this.tree.root |
|
if(r) { |
|
return r._count |
|
} |
|
return 0 |
|
} else if(stack[stack.length-1].left) { |
|
idx = stack[stack.length-1].left._count |
|
} |
|
for(var s=stack.length-2; s>=0; --s) { |
|
if(stack[s+1] === stack[s].right) { |
|
++idx |
|
if(stack[s].left) { |
|
idx += stack[s].left._count |
|
} |
|
} |
|
} |
|
return idx |
|
}, |
|
enumerable: true |
|
}) |
|
|
|
//Advances iterator to next element in list |
|
iproto.next = function() { |
|
var stack = this._stack |
|
if(stack.length === 0) { |
|
return |
|
} |
|
var n = stack[stack.length-1] |
|
if(n.right) { |
|
n = n.right |
|
while(n) { |
|
stack.push(n) |
|
n = n.left |
|
} |
|
} else { |
|
stack.pop() |
|
while(stack.length > 0 && stack[stack.length-1].right === n) { |
|
n = stack[stack.length-1] |
|
stack.pop() |
|
} |
|
} |
|
} |
|
|
|
//Checks if iterator is at end of tree |
|
Object.defineProperty(iproto, "hasNext", { |
|
get: function() { |
|
var stack = this._stack |
|
if(stack.length === 0) { |
|
return false |
|
} |
|
if(stack[stack.length-1].right) { |
|
return true |
|
} |
|
for(var s=stack.length-1; s>0; --s) { |
|
if(stack[s-1].left === stack[s]) { |
|
return true |
|
} |
|
} |
|
return false |
|
} |
|
}) |
|
|
|
//Update value |
|
iproto.update = function(value) { |
|
var stack = this._stack |
|
if(stack.length === 0) { |
|
throw new Error("Can't update empty node!") |
|
} |
|
var cstack = new Array(stack.length) |
|
var n = stack[stack.length-1] |
|
cstack[cstack.length-1] = new RBNode(n._color, n.key, value, n.left, n.right, n._count) |
|
for(var i=stack.length-2; i>=0; --i) { |
|
n = stack[i] |
|
if(n.left === stack[i+1]) { |
|
cstack[i] = new RBNode(n._color, n.key, n.value, cstack[i+1], n.right, n._count) |
|
} else { |
|
cstack[i] = new RBNode(n._color, n.key, n.value, n.left, cstack[i+1], n._count) |
|
} |
|
} |
|
return new RedBlackTree(this.tree._compare, cstack[0]) |
|
} |
|
|
|
//Moves iterator backward one element |
|
iproto.prev = function() { |
|
var stack = this._stack |
|
if(stack.length === 0) { |
|
return |
|
} |
|
var n = stack[stack.length-1] |
|
if(n.left) { |
|
n = n.left |
|
while(n) { |
|
stack.push(n) |
|
n = n.right |
|
} |
|
} else { |
|
stack.pop() |
|
while(stack.length > 0 && stack[stack.length-1].left === n) { |
|
n = stack[stack.length-1] |
|
stack.pop() |
|
} |
|
} |
|
} |
|
|
|
//Checks if iterator is at start of tree |
|
Object.defineProperty(iproto, "hasPrev", { |
|
get: function() { |
|
var stack = this._stack |
|
if(stack.length === 0) { |
|
return false |
|
} |
|
if(stack[stack.length-1].left) { |
|
return true |
|
} |
|
for(var s=stack.length-1; s>0; --s) { |
|
if(stack[s-1].right === stack[s]) { |
|
return true |
|
} |
|
} |
|
return false |
|
} |
|
}) |
|
|
|
//Default comparison function |
|
function defaultCompare(a, b) { |
|
if(a < b) { |
|
return -1 |
|
} |
|
if(a > b) { |
|
return 1 |
|
} |
|
return 0 |
|
} |
|
|
|
//Build a tree |
|
function createRBTree(compare) { |
|
return new RedBlackTree(compare || defaultCompare, null) |
|
} |
|
},{}],75:[function(require,module,exports){ |
|
// transliterated from the python snippet here: |
|
// http://en.wikipedia.org/wiki/Lanczos_approximation |
|
|
|
var g = 7; |
|
var p = [ |
|
0.99999999999980993, |
|
676.5203681218851, |
|
-1259.1392167224028, |
|
771.32342877765313, |
|
-176.61502916214059, |
|
12.507343278686905, |
|
-0.13857109526572012, |
|
9.9843695780195716e-6, |
|
1.5056327351493116e-7 |
|
]; |
|
|
|
var g_ln = 607/128; |
|
var p_ln = [ |
|
0.99999999999999709182, |
|
57.156235665862923517, |
|
-59.597960355475491248, |
|
14.136097974741747174, |
|
-0.49191381609762019978, |
|
0.33994649984811888699e-4, |
|
0.46523628927048575665e-4, |
|
-0.98374475304879564677e-4, |
|
0.15808870322491248884e-3, |
|
-0.21026444172410488319e-3, |
|
0.21743961811521264320e-3, |
|
-0.16431810653676389022e-3, |
|
0.84418223983852743293e-4, |
|
-0.26190838401581408670e-4, |
|
0.36899182659531622704e-5 |
|
]; |
|
|
|
// Spouge approximation (suitable for large arguments) |
|
function lngamma(z) { |
|
|
|
if(z < 0) return Number('0/0'); |
|
var x = p_ln[0]; |
|
for(var i = p_ln.length - 1; i > 0; --i) x += p_ln[i] / (z + i); |
|
var t = z + g_ln + 0.5; |
|
return .5*Math.log(2*Math.PI)+(z+.5)*Math.log(t)-t+Math.log(x)-Math.log(z); |
|
} |
|
|
|
module.exports = function gamma (z) { |
|
if (z < 0.5) { |
|
return Math.PI / (Math.sin(Math.PI * z) * gamma(1 - z)); |
|
} |
|
else if(z > 100) return Math.exp(lngamma(z)); |
|
else { |
|
z -= 1; |
|
var x = p[0]; |
|
for (var i = 1; i < g + 2; i++) { |
|
x += p[i] / (z + i); |
|
} |
|
var t = z + g + 0.5; |
|
|
|
return Math.sqrt(2 * Math.PI) |
|
* Math.pow(t, z + 0.5) |
|
* Math.exp(-t) |
|
* x |
|
; |
|
} |
|
}; |
|
|
|
module.exports.log = lngamma; |
|
|
|
},{}],76:[function(require,module,exports){ |
|
'use strict' |
|
|
|
module.exports = createAxes |
|
|
|
var createText = require('./lib/text.js') |
|
var createLines = require('./lib/lines.js') |
|
var createBackground = require('./lib/background.js') |
|
var getCubeProperties = require('./lib/cube.js') |
|
var Ticks = require('./lib/ticks.js') |
|
|
|
var identity = new Float32Array([ |
|
1, 0, 0, 0, |
|
0, 1, 0, 0, |
|
0, 0, 1, 0, |
|
0, 0, 0, 1]) |
|
|
|
function copyVec3(a, b) { |
|
a[0] = b[0] |
|
a[1] = b[1] |
|
a[2] = b[2] |
|
return a |
|
} |
|
|
|
function Axes(gl) { |
|
this.gl = gl |
|
|
|
this.pixelRatio = 1 |
|
|
|
this.bounds = [ [-10, -10, -10], |
|
[ 10, 10, 10] ] |
|
this.ticks = [ [], [], [] ] |
|
this.autoTicks = true |
|
this.tickSpacing = [ 1, 1, 1 ] |
|
|
|
this.tickEnable = [ true, true, true ] |
|
this.tickFont = [ 'sans-serif', 'sans-serif', 'sans-serif' ] |
|
this.tickSize = [ 12, 12, 12 ] |
|
this.tickAngle = [ 0, 0, 0 ] |
|
this.tickColor = [ [0,0,0,1], [0,0,0,1], [0,0,0,1] ] |
|
this.tickPad = [ 10, 10, 10 ] |
|
|
|
this.lastCubeProps = { |
|
cubeEdges: [0,0,0], |
|
axis: [0,0,0] |
|
} |
|
|
|
this.labels = [ 'x', 'y', 'z' ] |
|
this.labelEnable = [ true, true, true ] |
|
this.labelFont = 'sans-serif' |
|
this.labelSize = [ 20, 20, 20 ] |
|
this.labelAngle = [ 0, 0, 0 ] |
|
this.labelColor = [ [0,0,0,1], [0,0,0,1], [0,0,0,1] ] |
|
this.labelPad = [ 10, 10, 10 ] |
|
|
|
this.lineEnable = [ true, true, true ] |
|
this.lineMirror = [ false, false, false ] |
|
this.lineWidth = [ 1, 1, 1 ] |
|
this.lineColor = [ [0,0,0,1], [0,0,0,1], [0,0,0,1] ] |
|
|
|
this.lineTickEnable = [ true, true, true ] |
|
this.lineTickMirror = [ false, false, false ] |
|
this.lineTickLength = [ 0, 0, 0 ] |
|
this.lineTickWidth = [ 1, 1, 1 ] |
|
this.lineTickColor = [ [0,0,0,1], [0,0,0,1], [0,0,0,1] ] |
|
|
|
this.gridEnable = [ true, true, true ] |
|
this.gridWidth = [ 1, 1, 1 ] |
|
this.gridColor = [ [0,0,0,1], [0,0,0,1], [0,0,0,1] ] |
|
|
|
this.zeroEnable = [ true, true, true ] |
|
this.zeroLineColor = [ [0,0,0,1], [0,0,0,1], [0,0,0,1] ] |
|
this.zeroLineWidth = [ 2, 2, 2 ] |
|
|
|
this.backgroundEnable = [ false, false, false ] |
|
this.backgroundColor = [ [0.8, 0.8, 0.8, 0.5], |
|
[0.8, 0.8, 0.8, 0.5], |
|
[0.8, 0.8, 0.8, 0.5] ] |
|
|
|
this._firstInit = true |
|
this._text = null |
|
this._lines = null |
|
this._background = createBackground(gl) |
|
} |
|
|
|
var proto = Axes.prototype |
|
|
|
proto.update = function(options) { |
|
options = options || {} |
|
|
|
//Option parsing helper functions |
|
function parseOption(nest, cons, name) { |
|
if(name in options) { |
|
var opt = options[name] |
|
var prev = this[name] |
|
var next |
|
if(nest ? (Array.isArray(opt) && Array.isArray(opt[0])) : |
|
Array.isArray(opt) ) { |
|
this[name] = next = [ cons(opt[0]), cons(opt[1]), cons(opt[2]) ] |
|
} else { |
|
this[name] = next = [ cons(opt), cons(opt), cons(opt) ] |
|
} |
|
for(var i=0; i<3; ++i) { |
|
if(next[i] !== prev[i]) { |
|
return true |
|
} |
|
} |
|
} |
|
return false |
|
} |
|
|
|
var NUMBER = parseOption.bind(this, false, Number) |
|
var BOOLEAN = parseOption.bind(this, false, Boolean) |
|
var STRING = parseOption.bind(this, false, String) |
|
var COLOR = parseOption.bind(this, true, function(v) { |
|
if(Array.isArray(v)) { |
|
if(v.length === 3) { |
|
return [ +v[0], +v[1], +v[2], 1.0 ] |
|
} else if(v.length === 4) { |
|
return [ +v[0], +v[1], +v[2], +v[3] ] |
|
} |
|
} |
|
return [ 0, 0, 0, 1 ] |
|
}) |
|
|
|
//Tick marks and bounds |
|
var nextTicks |
|
var ticksUpdate = false |
|
var boundsChanged = false |
|
if('bounds' in options) { |
|
var bounds = options.bounds |
|
i_loop: |
|
for(var i=0; i<2; ++i) { |
|
for(var j=0; j<3; ++j) { |
|
if(bounds[i][j] !== this.bounds[i][j]) { |
|
boundsChanged = true |
|
} |
|
this.bounds[i][j] = bounds[i][j] |
|
} |
|
} |
|
} |
|
if('ticks' in options) { |
|
nextTicks = options.ticks |
|
ticksUpdate = true |
|
this.autoTicks = false |
|
for(var i=0; i<3; ++i) { |
|
this.tickSpacing[i] = 0.0 |
|
} |
|
} else if(NUMBER('tickSpacing')) { |
|
this.autoTicks = true |
|
boundsChanged = true |
|
} |
|
|
|
if(this._firstInit) { |
|
if(!('ticks' in options || 'tickSpacing' in options)) { |
|
this.autoTicks = true |
|
} |
|
|
|
//Force tick recomputation on first update |
|
boundsChanged = true |
|
ticksUpdate = true |
|
this._firstInit = false |
|
} |
|
|
|
if(boundsChanged && this.autoTicks) { |
|
nextTicks = Ticks.create(this.bounds, this.tickSpacing) |
|
ticksUpdate = true |
|
} |
|
|
|
//Compare next ticks to previous ticks, only update if needed |
|
if(ticksUpdate) { |
|
for(var i=0; i<3; ++i) { |
|
nextTicks[i].sort(function(a,b) { |
|
return a.x-b.x |
|
}) |
|
} |
|
if(Ticks.equal(nextTicks, this.ticks)) { |
|
ticksUpdate = false |
|
} else { |
|
this.ticks = nextTicks |
|
} |
|
} |
|
|
|
//Parse tick properties |
|
BOOLEAN('tickEnable') |
|
if(STRING('tickFont')) { |
|
ticksUpdate = true //If font changes, must rebuild vbo |
|
} |
|
NUMBER('tickSize') |
|
NUMBER('tickAngle') |
|
NUMBER('tickPad') |
|
COLOR('tickColor') |
|
|
|
//Axis labels |
|
var labelUpdate = STRING('labels') |
|
if(STRING('labelFont')) { |
|
labelUpdate = true |
|
} |
|
BOOLEAN('labelEnable') |
|
NUMBER('labelSize') |
|
NUMBER('labelPad') |
|
COLOR('labelColor') |
|
|
|
//Axis lines |
|
BOOLEAN('lineEnable') |
|
BOOLEAN('lineMirror') |
|
NUMBER('lineWidth') |
|
COLOR('lineColor') |
|
|
|
//Axis line ticks |
|
BOOLEAN('lineTickEnable') |
|
BOOLEAN('lineTickMirror') |
|
NUMBER('lineTickLength') |
|
NUMBER('lineTickWidth') |
|
COLOR('lineTickColor') |
|
|
|
//Grid lines |
|
BOOLEAN('gridEnable') |
|
NUMBER('gridWidth') |
|
COLOR('gridColor') |
|
|
|
//Zero line |
|
BOOLEAN('zeroEnable') |
|
COLOR('zeroLineColor') |
|
NUMBER('zeroLineWidth') |
|
|
|
//Background |
|
BOOLEAN('backgroundEnable') |
|
COLOR('backgroundColor') |
|
|
|
//Update text if necessary |
|
if(!this._text) { |
|
this._text = createText( |
|
this.gl, |
|
this.bounds, |
|
this.labels, |
|
this.labelFont, |
|
this.ticks, |
|
this.tickFont) |
|
} else if(this._text && (labelUpdate || ticksUpdate)) { |
|
this._text.update( |
|
this.bounds, |
|
this.labels, |
|
this.labelFont, |
|
this.ticks, |
|
this.tickFont) |
|
} |
|
|
|
//Update lines if necessary |
|
if(this._lines && ticksUpdate) { |
|
this._lines.dispose() |
|
this._lines = null |
|
} |
|
if(!this._lines) { |
|
this._lines = createLines(this.gl, this.bounds, this.ticks) |
|
} |
|
} |
|
|
|
function OffsetInfo() { |
|
this.primalOffset = [0,0,0] |
|
this.primalMinor = [0,0,0] |
|
this.mirrorOffset = [0,0,0] |
|
this.mirrorMinor = [0,0,0] |
|
} |
|
|
|
var LINE_OFFSET = [ new OffsetInfo(), new OffsetInfo(), new OffsetInfo() ] |
|
|
|
function computeLineOffset(result, i, bounds, cubeEdges, cubeAxis) { |
|
var primalOffset = result.primalOffset |
|
var primalMinor = result.primalMinor |
|
var dualOffset = result.mirrorOffset |
|
var dualMinor = result.mirrorMinor |
|
var e = cubeEdges[i] |
|
|
|
//Calculate offsets |
|
for(var j=0; j<3; ++j) { |
|
if(i === j) { |
|
continue |
|
} |
|
var a = primalOffset, |
|
b = dualOffset, |
|
c = primalMinor, |
|
d = dualMinor |
|
if(e & (1<<j)) { |
|
a = dualOffset |
|
b = primalOffset |
|
c = dualMinor |
|
d = primalMinor |
|
} |
|
a[j] = bounds[0][j] |
|
b[j] = bounds[1][j] |
|
if(cubeAxis[j] > 0) { |
|
c[j] = -1 |
|
d[j] = 0 |
|
} else { |
|
c[j] = 0 |
|
d[j] = +1 |
|
} |
|
} |
|
} |
|
|
|
var CUBE_ENABLE = [0,0,0] |
|
var DEFAULT_PARAMS = { |
|
model: identity, |
|
view: identity, |
|
projection: identity |
|
} |
|
|
|
proto.isOpaque = function() { |
|
return true |
|
} |
|
|
|
proto.isTransparent = function() { |
|
return false |
|
} |
|
|
|
proto.drawTransparent = function(params) {} |
|
|
|
|
|
var PRIMAL_MINOR = [0,0,0] |
|
var MIRROR_MINOR = [0,0,0] |
|
var PRIMAL_OFFSET = [0,0,0] |
|
|
|
proto.draw = function(params) { |
|
params = params || DEFAULT_PARAMS |
|
|
|
var gl = this.gl |
|
|
|
//Geometry for camera and axes |
|
var model = params.model || identity |
|
var view = params.view || identity |
|
var projection = params.projection || identity |
|
var bounds = this.bounds |
|
|
|
//Unpack axis info |
|
var cubeParams = getCubeProperties(model, view, projection, bounds) |
|
var cubeEdges = cubeParams.cubeEdges |
|
var cubeAxis = cubeParams.axis |
|
|
|
var cx = view[12] |
|
var cy = view[13] |
|
var cz = view[14] |
|
var cw = view[15] |
|
|
|
var pixelScaleF = this.pixelRatio * (projection[3]*cx + projection[7]*cy + projection[11]*cz + projection[15]*cw) / gl.drawingBufferHeight |
|
|
|
for(var i=0; i<3; ++i) { |
|
this.lastCubeProps.cubeEdges[i] = cubeEdges[i] |
|
this.lastCubeProps.axis[i] = cubeAxis[i] |
|
} |
|
|
|
//Compute axis info |
|
var lineOffset = LINE_OFFSET |
|
for(var i=0; i<3; ++i) { |
|
computeLineOffset( |
|
LINE_OFFSET[i], |
|
i, |
|
this.bounds, |
|
cubeEdges, |
|
cubeAxis) |
|
} |
|
|
|
//Set up state parameters |
|
var gl = this.gl |
|
|
|
//Draw background first |
|
var cubeEnable = CUBE_ENABLE |
|
for(var i=0; i<3; ++i) { |
|
if(this.backgroundEnable[i]) { |
|
cubeEnable[i] = cubeAxis[i] |
|
} else { |
|
cubeEnable[i] = 0 |
|
} |
|
} |
|
|
|
this._background.draw( |
|
model, |
|
view, |
|
projection, |
|
bounds, |
|
cubeEnable, |
|
this.backgroundColor) |
|
|
|
//Draw lines |
|
this._lines.bind( |
|
model, |
|
view, |
|
projection, |
|
this) |
|
|
|
//First draw grid lines and zero lines |
|
for(var i=0; i<3; ++i) { |
|
var x = [0,0,0] |
|
if(cubeAxis[i] > 0) { |
|
x[i] = bounds[1][i] |
|
} else { |
|
x[i] = bounds[0][i] |
|
} |
|
|
|
//Draw grid lines |
|
for(var j=0; j<2; ++j) { |
|
var u = (i + 1 + j) % 3 |
|
var v = (i + 1 + (j^1)) % 3 |
|
if(this.gridEnable[u]) { |
|
this._lines.drawGrid(u, v, this.bounds, x, this.gridColor[u], this.gridWidth[u]*this.pixelRatio) |
|
} |
|
} |
|
|
|
//Draw zero lines (need to do this AFTER all grid lines are drawn) |
|
for(var j=0; j<2; ++j) { |
|
var u = (i + 1 + j) % 3 |
|
var v = (i + 1 + (j^1)) % 3 |
|
if(this.zeroEnable[v]) { |
|
//Check if zero line in bounds |
|
if(bounds[0][v] <= 0 && bounds[1][v] >= 0) { |
|
this._lines.drawZero(u, v, this.bounds, x, this.zeroLineColor[v], this.zeroLineWidth[v]*this.pixelRatio) |
|
} |
|
} |
|
} |
|
} |
|
|
|
//Then draw axis lines and tick marks |
|
for(var i=0; i<3; ++i) { |
|
|
|
//Draw axis lines |
|
if(this.lineEnable[i]) { |
|
this._lines.drawAxisLine(i, this.bounds, lineOffset[i].primalOffset, this.lineColor[i], this.lineWidth[i]*this.pixelRatio) |
|
} |
|
if(this.lineMirror[i]) { |
|
this._lines.drawAxisLine(i, this.bounds, lineOffset[i].mirrorOffset, this.lineColor[i], this.lineWidth[i]*this.pixelRatio) |
|
} |
|
|
|
//Compute minor axes |
|
var primalMinor = copyVec3(PRIMAL_MINOR, lineOffset[i].primalMinor) |
|
var mirrorMinor = copyVec3(MIRROR_MINOR, lineOffset[i].mirrorMinor) |
|
var tickLength = this.lineTickLength |
|
var op = 0 |
|
for(var j=0; j<3; ++j) { |
|
var scaleFactor = pixelScaleF / model[5*j] |
|
primalMinor[j] *= tickLength[j] * scaleFactor |
|
mirrorMinor[j] *= tickLength[j] * scaleFactor |
|
} |
|
|
|
//Draw axis line ticks |
|
if(this.lineTickEnable[i]) { |
|
this._lines.drawAxisTicks(i, lineOffset[i].primalOffset, primalMinor, this.lineTickColor[i], this.lineTickWidth[i]*this.pixelRatio) |
|
} |
|
if(this.lineTickMirror[i]) { |
|
this._lines.drawAxisTicks(i, lineOffset[i].mirrorOffset, mirrorMinor, this.lineTickColor[i], this.lineTickWidth[i]*this.pixelRatio) |
|
} |
|
} |
|
|
|
//Draw text sprites |
|
this._text.bind( |
|
model, |
|
view, |
|
projection, |
|
this.pixelRatio) |
|
|
|
for(var i=0; i<3; ++i) { |
|
|
|
var minor = lineOffset[i].primalMinor |
|
var offset = copyVec3(PRIMAL_OFFSET, lineOffset[i].primalOffset) |
|
|
|
for(var j=0; j<3; ++j) { |
|
if(this.lineTickEnable[i]) { |
|
offset[j] += pixelScaleF * minor[j] * Math.max(this.lineTickLength[j], 0) / model[5*j] |
|
} |
|
} |
|
|
|
//Draw tick text |
|
if(this.tickEnable[i]) { |
|
|
|
//Add tick padding |
|
for(var j=0; j<3; ++j) { |
|
offset[j] += pixelScaleF * minor[j] * this.tickPad[j] / model[5*j] |
|
} |
|
|
|
//Draw axis |
|
this._text.drawTicks( |
|
i, |
|
this.tickSize[i], |
|
this.tickAngle[i], |
|
offset, |
|
this.tickColor[i]) |
|
} |
|
|
|
//Draw labels |
|
if(this.labelEnable[i]) { |
|
|
|
//Add label padding |
|
for(var j=0; j<3; ++j) { |
|
offset[j] += pixelScaleF * minor[j] * this.labelPad[j] / model[5*j] |
|
} |
|
offset[i] += 0.5 * (bounds[0][i] + bounds[1][i]) |
|
|
|
//Draw axis |
|
this._text.drawLabel( |
|
i, |
|
this.labelSize[i], |
|
this.labelAngle[i], |
|
offset, |
|
this.labelColor[i]) |
|
} |
|
} |
|
} |
|
|
|
proto.dispose = function() { |
|
this._text.dispose() |
|
this._lines.dispose() |
|
this._background.dispose() |
|
this._lines = null |
|
this._text = null |
|
this._background = null |
|
this.gl = null |
|
} |
|
|
|
function createAxes(gl, options) { |
|
var axes = new Axes(gl) |
|
axes.update(options) |
|
return axes |
|
} |
|
|
|
},{"./lib/background.js":77,"./lib/cube.js":78,"./lib/lines.js":79,"./lib/text.js":81,"./lib/ticks.js":82}],77:[function(require,module,exports){ |
|
'use strict' |
|
|
|
module.exports = createBackgroundCube |
|
|
|
var createBuffer = require('gl-buffer') |
|
var createVAO = require('gl-vao') |
|
var createShader = require('./shaders').bg |
|
|
|
function BackgroundCube(gl, buffer, vao, shader) { |
|
this.gl = gl |
|
this.buffer = buffer |
|
this.vao = vao |
|
this.shader = shader |
|
} |
|
|
|
var proto = BackgroundCube.prototype |
|
|
|
proto.draw = function(model, view, projection, bounds, enable, colors) { |
|
var needsBG = false |
|
for(var i=0; i<3; ++i) { |
|
needsBG = needsBG || enable[i] |
|
} |
|
if(!needsBG) { |
|
return |
|
} |
|
|
|
var gl = this.gl |
|
|
|
gl.enable(gl.POLYGON_OFFSET_FILL) |
|
gl.polygonOffset(1, 2) |
|
|
|
this.shader.bind() |
|
this.shader.uniforms = { |
|
model: model, |
|
view: view, |
|
projection: projection, |
|
bounds: bounds, |
|
enable: enable, |
|
colors: colors |
|
} |
|
this.vao.bind() |
|
this.vao.draw(this.gl.TRIANGLES, 36) |
|
|
|
gl.disable(gl.POLYGON_OFFSET_FILL) |
|
} |
|
|
|
proto.dispose = function() { |
|
this.vao.dispose() |
|
this.buffer.dispose() |
|
this.shader.dispose() |
|
} |
|
|
|
function createBackgroundCube(gl) { |
|
//Create cube vertices |
|
var vertices = [] |
|
var indices = [] |
|
var ptr = 0 |
|
for(var d=0; d<3; ++d) { |
|
var u = (d+1) % 3 |
|
var v = (d+2) % 3 |
|
var x = [0,0,0] |
|
var c = [0,0,0] |
|
for(var s=-1; s<=1; s+=2) { |
|
indices.push(ptr, ptr+2, ptr+1, |
|
ptr+1, ptr+2, ptr+3) |
|
x[d] = s |
|
c[d] = s |
|
for(var i=-1; i<=1; i+=2) { |
|
x[u] = i |
|
for(var j=-1; j<=1; j+=2) { |
|
x[v] = j |
|
vertices.push(x[0], x[1], x[2], |
|
c[0], c[1], c[2]) |
|
ptr += 1 |
|
} |
|
} |
|
//Swap u and v |
|
var tt = u |
|
u = v |
|
v = tt |
|
} |
|
} |
|
|
|
//Allocate buffer and vertex array |
|
var buffer = createBuffer(gl, new Float32Array(vertices)) |
|
var elements = createBuffer(gl, new Uint16Array(indices), gl.ELEMENT_ARRAY_BUFFER) |
|
var vao = createVAO(gl, [ |
|
{ |
|
buffer: buffer, |
|
type: gl.FLOAT, |
|
size: 3, |
|
offset: 0, |
|
stride: 24 |
|
}, |
|
{ |
|
buffer: buffer, |
|
type: gl.FLOAT, |
|
size: 3, |
|
offset: 12, |
|
stride: 24 |
|
} |
|
], elements) |
|
|
|
//Create shader object |
|
var shader = createShader(gl) |
|
shader.attributes.position.location = 0 |
|
shader.attributes.normal.location = 1 |
|
|
|
return new BackgroundCube(gl, buffer, vao, shader) |
|
} |
|
|
|
},{"./shaders":80,"gl-buffer":83,"gl-vao":120}],78:[function(require,module,exports){ |
|
"use strict" |
|
|
|
module.exports = getCubeEdges |
|
|
|
var bits = require('bit-twiddle') |
|
var multiply = require('gl-mat4/multiply') |
|
var invert = require('gl-mat4/invert') |
|
var splitPoly = require('split-polygon') |
|
var orient = require('robust-orientation') |
|
|
|
var mvp = new Array(16) |
|
var imvp = new Array(16) |
|
var pCubeVerts = new Array(8) |
|
var cubeVerts = new Array(8) |
|
var x = new Array(3) |
|
var zero3 = [0,0,0] |
|
|
|
;(function() { |
|
for(var i=0; i<8; ++i) { |
|
pCubeVerts[i] =[1,1,1,1] |
|
cubeVerts[i] = [1,1,1] |
|
} |
|
})() |
|
|
|
|
|
function transformHg(result, x, mat) { |
|
for(var i=0; i<4; ++i) { |
|
result[i] = mat[12+i] |
|
for(var j=0; j<3; ++j) { |
|
result[i] += x[j]*mat[4*j+i] |
|
} |
|
} |
|
} |
|
|
|
var FRUSTUM_PLANES = [ |
|
[ 0, 0, 1, 0, 0], |
|
[ 0, 0,-1, 1, 0], |
|
[ 0,-1, 0, 1, 0], |
|
[ 0, 1, 0, 1, 0], |
|
[-1, 0, 0, 1, 0], |
|
[ 1, 0, 0, 1, 0] |
|
] |
|
|
|
function polygonArea(p) { |
|
for(var i=0; i<FRUSTUM_PLANES.length; ++i) { |
|
p = splitPoly.positive(p, FRUSTUM_PLANES[i]) |
|
if(p.length < 3) { |
|
return 0 |
|
} |
|
} |
|
|
|
var base = p[0] |
|
var ax = base[0] / base[3] |
|
var ay = base[1] / base[3] |
|
var area = 0.0 |
|
for(var i=1; i+1<p.length; ++i) { |
|
var b = p[i] |
|
var c = p[i+1] |
|
|
|
var bx = b[0]/b[3] |
|
var by = b[1]/b[3] |
|
var cx = c[0]/c[3] |
|
var cy = c[1]/c[3] |
|
|
|
var ux = bx - ax |
|
var uy = by - ay |
|
|
|
var vx = cx - ax |
|
var vy = cy - ay |
|
|
|
area += Math.abs(ux * vy - uy * vx) |
|
} |
|
|
|
return area |
|
} |
|
|
|
var CUBE_EDGES = [1,1,1] |
|
var CUBE_AXIS = [0,0,0] |
|
var CUBE_RESULT = { |
|
cubeEdges: CUBE_EDGES, |
|
axis: CUBE_AXIS |
|
} |
|
|
|
function getCubeEdges(model, view, projection, bounds) { |
|
|
|
//Concatenate matrices |
|
multiply(mvp, view, model) |
|
multiply(mvp, projection, mvp) |
|
|
|
//First project cube vertices |
|
var ptr = 0 |
|
for(var i=0; i<2; ++i) { |
|
x[2] = bounds[i][2] |
|
for(var j=0; j<2; ++j) { |
|
x[1] = bounds[j][1] |
|
for(var k=0; k<2; ++k) { |
|
x[0] = bounds[k][0] |
|
transformHg(pCubeVerts[ptr], x, mvp) |
|
ptr += 1 |
|
} |
|
} |
|
} |
|
|
|
//Classify camera against cube faces |
|
var closest = -1 |
|
|
|
for(var i=0; i<8; ++i) { |
|
var w = pCubeVerts[i][3] |
|
for(var l=0; l<3; ++l) { |
|
cubeVerts[i][l] = pCubeVerts[i][l] / w |
|
} |
|
if(w < 0) { |
|
if(closest < 0) { |
|
closest = i |
|
} else if(cubeVerts[i][2] < cubeVerts[closest][2]) { |
|
closest = i |
|
} |
|
} |
|
} |
|
|
|
if(closest < 0) { |
|
closest = 0 |
|
for(var d=0; d<3; ++d) { |
|
var u = (d+2) % 3 |
|
var v = (d+1) % 3 |
|
var o0 = -1 |
|
var o1 = -1 |
|
for(var s=0; s<2; ++s) { |
|
var f0 = (s<<d) |
|
var f1 = f0 + (s << u) + ((1-s) << v) |
|
var f2 = f0 + ((1-s) << u) + (s << v) |
|
if(orient(cubeVerts[f0], cubeVerts[f1], cubeVerts[f2], zero3) < 0) { |
|
continue |
|
} |
|
if(s) { |
|
o0 = 1 |
|
} else { |
|
o1 = 1 |
|
} |
|
} |
|
if(o0 < 0 || o1 < 0) { |
|
if(o1 > o0) { |
|
closest |= 1<<d |
|
} |
|
continue |
|
} |
|
for(var s=0; s<2; ++s) { |
|
var f0 = (s<<d) |
|
var f1 = f0 + (s << u) + ((1-s) << v) |
|
var f2 = f0 + ((1-s) << u) + (s << v) |
|
var o = polygonArea([ |
|
pCubeVerts[f0], |
|
pCubeVerts[f1], |
|
pCubeVerts[f2], |
|
pCubeVerts[f0+(1<<u)+(1<<v)]]) |
|
if(s) { |
|
o0 = o |
|
} else { |
|
o1 = o |
|
} |
|
} |
|
if(o1 > o0) { |
|
closest |= 1<<d |
|
continue |
|
} |
|
} |
|
} |
|
|
|
var farthest = 7^closest |
|
|
|
//Find lowest vertex which is not closest closest |
|
var bottom = -1 |
|
for(var i=0; i<8; ++i) { |
|
if(i === closest || i === farthest) { |
|
continue |
|
} |
|
if(bottom < 0) { |
|
bottom = i |
|
} else if(cubeVerts[bottom][1] > cubeVerts[i][1]) { |
|
bottom = i |
|
} |
|
} |
|
|
|
//Find left/right neighbors of bottom vertex |
|
var left = -1 |
|
for(var i=0; i<3; ++i) { |
|
var idx = bottom ^ (1<<i) |
|
if(idx === closest || idx === farthest) { |
|
continue |
|
} |
|
if(left < 0) { |
|
left = idx |
|
} |
|
var v = cubeVerts[idx] |
|
if(v[0] < cubeVerts[left][0]) { |
|
left = idx |
|
} |
|
} |
|
var right = -1 |
|
for(var i=0; i<3; ++i) { |
|
var idx = bottom ^ (1<<i) |
|
if(idx === closest || idx === farthest || idx === left) { |
|
continue |
|
} |
|
if(right < 0) { |
|
right = idx |
|
} |
|
var v = cubeVerts[idx] |
|
if(v[0] > cubeVerts[right][0]) { |
|
right = idx |
|
} |
|
} |
|
|
|
//Determine edge axis coordinates |
|
var cubeEdges = CUBE_EDGES |
|
cubeEdges[0] = cubeEdges[1] = cubeEdges[2] = 0 |
|
cubeEdges[bits.log2(left^bottom)] = bottom&left |
|
cubeEdges[bits.log2(bottom^right)] = bottom&right |
|
var top = right ^ 7 |
|
if(top === closest || top === farthest) { |
|
top = left ^ 7 |
|
cubeEdges[bits.log2(right^top)] = top&right |
|
} else { |
|
cubeEdges[bits.log2(left^top)] = top&left |
|
} |
|
|
|
//Determine visible faces |
|
var axis = CUBE_AXIS |
|
var cutCorner = closest |
|
for(var d=0; d<3; ++d) { |
|
if(cutCorner & (1<<d)) { |
|
axis[d] = -1 |
|
} else { |
|
axis[d] = 1 |
|
} |
|
} |
|
|
|
//Return result |
|
return CUBE_RESULT |
|
} |
|
},{"bit-twiddle":36,"gl-mat4/invert":94,"gl-mat4/multiply":96,"robust-orientation":234,"split-polygon":249}],79:[function(require,module,exports){ |
|
'use strict' |
|
|
|
module.exports = createLines |
|
|
|
var createBuffer = require('gl-buffer') |
|
var createVAO = require('gl-vao') |
|
var createShader = require('./shaders').line |
|
|
|
var MAJOR_AXIS = [0,0,0] |
|
var MINOR_AXIS = [0,0,0] |
|
var SCREEN_AXIS = [0,0,0] |
|
var OFFSET_VEC = [0,0,0] |
|
var SHAPE = [1,1] |
|
|
|
function zeroVec(a) { |
|
a[0] = a[1] = a[2] = 0 |
|
return a |
|
} |
|
|
|
function copyVec(a,b) { |
|
a[0] = b[0] |
|
a[1] = b[1] |
|
a[2] = b[2] |
|
return a |
|
} |
|
|
|
function Lines(gl, vertBuffer, vao, shader, tickCount, tickOffset, gridCount, gridOffset) { |
|
this.gl = gl |
|
this.vertBuffer = vertBuffer |
|
this.vao = vao |
|
this.shader = shader |
|
this.tickCount = tickCount |
|
this.tickOffset = tickOffset |
|
this.gridCount = gridCount |
|
this.gridOffset = gridOffset |
|
} |
|
|
|
var proto = Lines.prototype |
|
|
|
proto.bind = function(model, view, projection) { |
|
this.shader.bind() |
|
this.shader.uniforms.model = model |
|
this.shader.uniforms.view = view |
|
this.shader.uniforms.projection = projection |
|
|
|
SHAPE[0] = this.gl.drawingBufferWidth |
|
SHAPE[1] = this.gl.drawingBufferHeight |
|
|
|
this.shader.uniforms.screenShape = SHAPE |
|
this.vao.bind() |
|
} |
|
|
|
proto.drawAxisLine = function(j, bounds, offset, color, lineWidth) { |
|
var minorAxis = zeroVec(MINOR_AXIS) |
|
this.shader.uniforms.majorAxis = MINOR_AXIS |
|
|
|
minorAxis[j] = bounds[1][j] - bounds[0][j] |
|
this.shader.uniforms.minorAxis = minorAxis |
|
|
|
var noffset = copyVec(OFFSET_VEC, offset) |
|
noffset[j] += bounds[0][j] |
|
this.shader.uniforms.offset = noffset |
|
|
|
this.shader.uniforms.lineWidth = lineWidth |
|
|
|
this.shader.uniforms.color = color |
|
|
|
var screenAxis = zeroVec(SCREEN_AXIS) |
|
screenAxis[(j+2)%3] = 1 |
|
this.shader.uniforms.screenAxis = screenAxis |
|
this.vao.draw(this.gl.TRIANGLES, 6) |
|
|
|
var screenAxis = zeroVec(SCREEN_AXIS) |
|
screenAxis[(j+1)%3] = 1 |
|
this.shader.uniforms.screenAxis = screenAxis |
|
this.vao.draw(this.gl.TRIANGLES, 6) |
|
} |
|
|
|
proto.drawAxisTicks = function(j, offset, minorAxis, color, lineWidth) { |
|
if(!this.tickCount[j]) { |
|
return |
|
} |
|
|
|
var majorAxis = zeroVec(MAJOR_AXIS) |
|
majorAxis[j] = 1 |
|
this.shader.uniforms.majorAxis = majorAxis |
|
this.shader.uniforms.offset = offset |
|
this.shader.uniforms.minorAxis = minorAxis |
|
this.shader.uniforms.color = color |
|
this.shader.uniforms.lineWidth = lineWidth |
|
|
|
var screenAxis = zeroVec(SCREEN_AXIS) |
|
screenAxis[j] = 1 |
|
this.shader.uniforms.screenAxis = screenAxis |
|
this.vao.draw(this.gl.TRIANGLES, this.tickCount[j], this.tickOffset[j]) |
|
} |
|
|
|
|
|
proto.drawGrid = function(i, j, bounds, offset, color, lineWidth) { |
|
if(!this.gridCount[i]) { |
|
return |
|
} |
|
|
|
var minorAxis = zeroVec(MINOR_AXIS) |
|
minorAxis[j] = bounds[1][j] - bounds[0][j] |
|
this.shader.uniforms.minorAxis = minorAxis |
|
|
|
var noffset = copyVec(OFFSET_VEC, offset) |
|
noffset[j] += bounds[0][j] |
|
this.shader.uniforms.offset = noffset |
|
|
|
var majorAxis = zeroVec(MAJOR_AXIS) |
|
majorAxis[i] = 1 |
|
this.shader.uniforms.majorAxis = majorAxis |
|
|
|
var screenAxis = zeroVec(SCREEN_AXIS) |
|
screenAxis[i] = 1 |
|
this.shader.uniforms.screenAxis = screenAxis |
|
this.shader.uniforms.lineWidth = lineWidth |
|
|
|
this.shader.uniforms.color = color |
|
this.vao.draw(this.gl.TRIANGLES, this.gridCount[i], this.gridOffset[i]) |
|
} |
|
|
|
proto.drawZero = function(j, i, bounds, offset, color, lineWidth) { |
|
var minorAxis = zeroVec(MINOR_AXIS) |
|
this.shader.uniforms.majorAxis = minorAxis |
|
|
|
minorAxis[j] = bounds[1][j] - bounds[0][j] |
|
this.shader.uniforms.minorAxis = minorAxis |
|
|
|
var noffset = copyVec(OFFSET_VEC, offset) |
|
noffset[j] += bounds[0][j] |
|
this.shader.uniforms.offset = noffset |
|
|
|
var screenAxis = zeroVec(SCREEN_AXIS) |
|
screenAxis[i] = 1 |
|
this.shader.uniforms.screenAxis = screenAxis |
|
this.shader.uniforms.lineWidth = lineWidth |
|
|
|
this.shader.uniforms.color = color |
|
this.vao.draw(this.gl.TRIANGLES, 6) |
|
} |
|
|
|
proto.dispose = function() { |
|
this.vao.dispose() |
|
this.vertBuffer.dispose() |
|
this.shader.dispose() |
|
} |
|
|
|
function createLines(gl, bounds, ticks) { |
|
var vertices = [] |
|
var tickOffset = [0,0,0] |
|
var tickCount = [0,0,0] |
|
|
|
//Create grid lines for each axis/direction |
|
var gridOffset = [0,0,0] |
|
var gridCount = [0,0,0] |
|
|
|
//Add zero line |
|
vertices.push( |
|
0,0,1, 0,1,1, 0,0,-1, |
|
0,0,-1, 0,1,1, 0,1,-1) |
|
|
|
for(var i=0; i<3; ++i) { |
|
//Axis tick marks |
|
var start = ((vertices.length / 3)|0) |
|
for(var j=0; j<ticks[i].length; ++j) { |
|
var x = +ticks[i][j].x |
|
vertices.push( |
|
x,0,1, x,1,1, x,0,-1, |
|
x,0,-1, x,1,1, x,1,-1) |
|
} |
|
var end = ((vertices.length / 3)|0) |
|
tickOffset[i] = start |
|
tickCount[i] = end - start |
|
|
|
//Grid lines |
|
var start = ((vertices.length / 3)|0) |
|
for(var k=0; k<ticks[i].length; ++k) { |
|
var x = +ticks[i][k].x |
|
vertices.push( |
|
x,0,1, x,1,1, x,0,-1, |
|
x,0,-1, x,1,1, x,1,-1) |
|
} |
|
var end = ((vertices.length / 3)|0) |
|
gridOffset[i] = start |
|
gridCount[i] = end - start |
|
} |
|
|
|
//Create cube VAO |
|
var vertBuf = createBuffer(gl, new Float32Array(vertices)) |
|
var vao = createVAO(gl, [ |
|
{ "buffer": vertBuf, |
|
"type": gl.FLOAT, |
|
"size": 3, |
|
"stride": 0, |
|
"offset": 0 |
|
} |
|
]) |
|
var shader = createShader(gl) |
|
shader.attributes.position.location = 0 |
|
return new Lines(gl, vertBuf, vao, shader, tickCount, tickOffset, gridCount, gridOffset) |
|
} |
|
|
|
},{"./shaders":80,"gl-buffer":83,"gl-vao":120}],80:[function(require,module,exports){ |
|
'use strict' |
|
|
|
|
|
var createShader = require('gl-shader') |
|
|
|
var lineVert = "#define GLSLIFY 1\nattribute vec3 position;\n\nuniform mat4 model, view, projection;\nuniform vec3 offset, majorAxis, minorAxis, screenAxis;\nuniform float lineWidth;\nuniform vec2 screenShape;\n\nvec3 project(vec3 p) {\n vec4 pp = projection * view * model * vec4(p, 1.0);\n return pp.xyz / max(pp.w, 0.0001);\n}\n\nvoid main() {\n vec3 major = position.x * majorAxis;\n vec3 minor = position.y * minorAxis;\n\n vec3 vPosition = major + minor + offset;\n vec3 pPosition = project(vPosition);\n vec3 offset = project(vPosition + screenAxis * position.z);\n\n vec2 screen = normalize((offset - pPosition).xy * screenShape) / screenShape;\n\n gl_Position = vec4(pPosition + vec3(0.5 * screen * lineWidth, 0), 1.0);\n}\n" |
|
var lineFrag = "precision mediump float;\n#define GLSLIFY 1\nuniform vec4 color;\nvoid main() {\n gl_FragColor = color;\n}" |
|
exports.line = function(gl) { |
|
return createShader(gl, lineVert, lineFrag, null, [ |
|
{name: 'position', type: 'vec3'} |
|
]) |
|
} |
|
|
|
var textVert = "#define GLSLIFY 1\nattribute vec3 position;\n\nuniform mat4 model, view, projection;\nuniform vec3 offset, axis;\nuniform float scale, angle, pixelScale;\nuniform vec2 resolution;\n\nvoid main() { \n //Compute plane offset\n vec2 planeCoord = position.xy * pixelScale;\n mat2 planeXform = scale * mat2(cos(angle), sin(angle),\n -sin(angle), cos(angle));\n vec2 viewOffset = 2.0 * planeXform * planeCoord / resolution;\n\n //Compute world offset\n float axisDistance = position.z;\n vec3 dataPosition = axisDistance * axis + offset;\n vec4 worldPosition = model * vec4(dataPosition, 1);\n \n //Compute clip position\n vec4 viewPosition = view * worldPosition;\n vec4 clipPosition = projection * viewPosition;\n clipPosition /= clipPosition.w;\n\n //Apply text offset in clip coordinates\n clipPosition += vec4(viewOffset, 0, 0);\n\n //Done\n gl_Position = clipPosition;\n}" |
|
var textFrag = "precision mediump float;\n#define GLSLIFY 1\nuniform vec4 color;\nvoid main() {\n gl_FragColor = color;\n}" |
|
exports.text = function(gl) { |
|
return createShader(gl, textVert, textFrag, null, [ |
|
{name: 'position', type: 'vec3'} |
|
]) |
|
} |
|
|
|
var bgVert = "#define GLSLIFY 1\nattribute vec3 position;\nattribute vec3 normal;\n\nuniform mat4 model, view, projection;\nuniform vec3 enable;\nuniform vec3 bounds[2];\n\nvarying vec3 colorChannel;\n\nvoid main() {\n if(dot(normal, enable) > 0.0) {\n vec3 nPosition = mix(bounds[0], bounds[1], 0.5 * (position + 1.0));\n gl_Position = projection * view * model * vec4(nPosition, 1.0);\n } else {\n gl_Position = vec4(0,0,0,0);\n }\n colorChannel = abs(normal);\n}" |
|
var bgFrag = "precision mediump float;\n#define GLSLIFY 1\n\nuniform vec4 colors[3];\n\nvarying vec3 colorChannel;\n\nvoid main() {\n gl_FragColor = colorChannel.x * colors[0] + \n colorChannel.y * colors[1] +\n colorChannel.z * colors[2];\n}" |
|
exports.bg = function(gl) { |
|
return createShader(gl, bgVert, bgFrag, null, [ |
|
{name: 'position', type: 'vec3'}, |
|
{name: 'normal', type: 'vec3'} |
|
]) |
|
} |
|
|
|
},{"gl-shader":107}],81:[function(require,module,exports){ |
|
(function (process){ |
|
"use strict" |
|
|
|
module.exports = createTextSprites |
|
|
|
var createBuffer = require('gl-buffer') |
|
var createVAO = require('gl-vao') |
|
var vectorizeText = require('vectorize-text') |
|
var createShader = require('./shaders').text |
|
|
|
var globals = window || process.global || {} |
|
var __TEXT_CACHE = globals.__TEXT_CACHE || {} |
|
globals.__TEXT_CACHE = {} |
|
|
|
//Vertex buffer format for text is: |
|
// |
|
/// [x,y,z] = Spatial coordinate |
|
// |
|
|
|
var VERTEX_SIZE = 3 |
|
var VERTEX_STRIDE = VERTEX_SIZE * 4 |
|
|
|
function TextSprites( |
|
gl, |
|
shader, |
|
buffer, |
|
vao) { |
|
this.gl = gl |
|
this.shader = shader |
|
this.buffer = buffer |
|
this.vao = vao |
|
this.tickOffset = |
|
this.tickCount = |
|
this.labelOffset = |
|
this.labelCount = null |
|
} |
|
|
|
var proto = TextSprites.prototype |
|
|
|
//Bind textures for rendering |
|
var SHAPE = [0,0] |
|
proto.bind = function(model, view, projection, pixelScale) { |
|
this.vao.bind() |
|
this.shader.bind() |
|
var uniforms = this.shader.uniforms |
|
uniforms.model = model |
|
uniforms.view = view |
|
uniforms.projection = projection |
|
uniforms.pixelScale = pixelScale |
|
SHAPE[0] = this.gl.drawingBufferWidth |
|
SHAPE[1] = this.gl.drawingBufferHeight |
|
this.shader.uniforms.resolution = SHAPE |
|
} |
|
|
|
proto.update = function(bounds, labels, labelFont, ticks, tickFont) { |
|
var gl = this.gl |
|
var data = [] |
|
|
|
function addItem(t, text, font, size) { |
|
var fontcache = __TEXT_CACHE[font] |
|
if(!fontcache) { |
|
fontcache = __TEXT_CACHE[font] = {} |
|
} |
|
var mesh = fontcache[text] |
|
if(!mesh) { |
|
mesh = fontcache[text] = tryVectorizeText(text, { |
|
triangles: true, |
|
font: font, |
|
textAlign: 'center', |
|
textBaseline: 'middle' |
|
}) |
|
} |
|
var scale = (size || 12) / 12 |
|
var positions = mesh.positions |
|
var cells = mesh.cells |
|
var lo = [ Infinity, Infinity] |
|
var hi = [-Infinity,-Infinity] |
|
for(var i=0, nc=cells.length; i<nc; ++i) { |
|
var c = cells[i] |
|
for(var j=2; j>=0; --j) { |
|
var p = positions[c[j]] |
|
data.push(scale*p[0], -scale*p[1], t) |
|
} |
|
} |
|
} |
|
|
|
//Generate sprites for all 3 axes, store data in texture atlases |
|
var tickOffset = [0,0,0] |
|
var tickCount = [0,0,0] |
|
var labelOffset = [0,0,0] |
|
var labelCount = [0,0,0] |
|
for(var d=0; d<3; ++d) { |
|
|
|
//Generate label |
|
labelOffset[d] = (data.length/VERTEX_SIZE)|0 |
|
addItem(0.5*(bounds[0][d]+bounds[1][d]), labels[d], labelFont) |
|
labelCount[d] = ((data.length/VERTEX_SIZE)|0) - labelOffset[d] |
|
|
|
//Generate sprites for tick marks |
|
tickOffset[d] = (data.length/VERTEX_SIZE)|0 |
|
for(var i=0; i<ticks[d].length; ++i) { |
|
if(!ticks[d][i].text) { |
|
continue |
|
} |
|
addItem( |
|
ticks[d][i].x, |
|
ticks[d][i].text, |
|
ticks[d][i].font || tickFont, |
|
ticks[d][i].fontSize || 12) |
|
} |
|
tickCount[d] = ((data.length/VERTEX_SIZE)|0) - tickOffset[d] |
|
} |
|
|
|
this.buffer.update(data) |
|
this.tickOffset = tickOffset |
|
this.tickCount = tickCount |
|
this.labelOffset = labelOffset |
|
this.labelCount = labelCount |
|
} |
|
|
|
//Draws the tick marks for an axis |
|
var AXIS = [0,0,0] |
|
proto.drawTicks = function(d, scale, angle, offset, color) { |
|
if(!this.tickCount[d]) { |
|
return |
|
} |
|
|
|
var v = AXIS |
|
v[0] = v[1] = v[2] = 0 |
|
v[d] = 1 |
|
this.shader.uniforms.axis = v |
|
this.shader.uniforms.color = color |
|
this.shader.uniforms.angle = angle |
|
this.shader.uniforms.scale = scale |
|
this.shader.uniforms.offset = offset |
|
this.vao.draw(this.gl.TRIANGLES, this.tickCount[d], this.tickOffset[d]) |
|
} |
|
|
|
//Draws the text label for an axis |
|
var ZERO = [0,0,0] |
|
proto.drawLabel = function(d, scale, angle, offset, color) { |
|
if(!this.labelCount[d]) { |
|
return |
|
} |
|
this.shader.uniforms.axis = ZERO |
|
this.shader.uniforms.color = color |
|
this.shader.uniforms.angle = angle |
|
this.shader.uniforms.scale = scale |
|
this.shader.uniforms.offset = offset |
|
this.vao.draw(this.gl.TRIANGLES, this.labelCount[d], this.labelOffset[d]) |
|
} |
|
|
|
//Releases all resources attached to this object |
|
proto.dispose = function() { |
|
this.shader.dispose() |
|
this.vao.dispose() |
|
this.buffer.dispose() |
|
} |
|
|
|
function tryVectorizeText(text, options) { |
|
try { |
|
return vectorizeText(text, options) |
|
} catch(e) { |
|
console.warn('error vectorizing text:', e) |
|
return { |
|
cells: [], |
|
positions: [] |
|
} |
|
} |
|
} |
|
|
|
function createTextSprites( |
|
gl, |
|
bounds, |
|
labels, |
|
labelFont, |
|
ticks, |
|
tickFont) { |
|
|
|
var buffer = createBuffer(gl) |
|
var vao = createVAO(gl, [ |
|
{ "buffer": buffer, |
|
"size": 3 |
|
} |
|
]) |
|
|
|
var shader = createShader(gl) |
|
shader.attributes.position.location = 0 |
|
|
|
var result = new TextSprites( |
|
gl, |
|
shader, |
|
buffer, |
|
vao) |
|
|
|
result.update(bounds, labels, labelFont, ticks, tickFont) |
|
|
|
return result |
|
} |
|
|
|
}).call(this,require('_process')) |
|
},{"./shaders":80,"_process":5,"gl-buffer":83,"gl-vao":120,"vectorize-text":260}],82:[function(require,module,exports){ |
|
'use strict' |
|
|
|
exports.create = defaultTicks |
|
exports.equal = ticksEqual |
|
|
|
function prettyPrint(spacing, i) { |
|
var stepStr = spacing + "" |
|
var u = stepStr.indexOf(".") |
|
var sigFigs = 0 |
|
if(u >= 0) { |
|
sigFigs = stepStr.length - u - 1 |
|
} |
|
var shift = Math.pow(10, sigFigs) |
|
var x = Math.round(spacing * i * shift) |
|
var xstr = x + "" |
|
if(xstr.indexOf("e") >= 0) { |
|
return xstr |
|
} |
|
var xi = x / shift, xf = x % shift |
|
if(x < 0) { |
|
xi = -Math.ceil(xi)|0 |
|
xf = (-xf)|0 |
|
} else { |
|
xi = Math.floor(xi)|0 |
|
xf = xf|0 |
|
} |
|
var xis = "" + xi |
|
if(x < 0) { |
|
xis = "-" + xis |
|
} |
|
if(sigFigs) { |
|
var xs = "" + xf |
|
while(xs.length < sigFigs) { |
|
xs = "0" + xs |
|
} |
|
return xis + "." + xs |
|
} else { |
|
return xis |
|
} |
|
} |
|
|
|
function defaultTicks(bounds, tickSpacing) { |
|
var array = [] |
|
for(var d=0; d<3; ++d) { |
|
var ticks = [] |
|
var m = 0.5*(bounds[0][d]+bounds[1][d]) |
|
for(var t=0; t*tickSpacing[d]<=bounds[1][d]; ++t) { |
|
ticks.push({x: t*tickSpacing[d], text: prettyPrint(tickSpacing[d], t)}) |
|
} |
|
for(var t=-1; t*tickSpacing[d]>=bounds[0][d]; --t) { |
|
ticks.push({x: t*tickSpacing[d], text: prettyPrint(tickSpacing[d], t)}) |
|
} |
|
array.push(ticks) |
|
} |
|
return array |
|
} |
|
|
|
function ticksEqual(ticksA, ticksB) { |
|
for(var i=0; i<3; ++i) { |
|
if(ticksA[i].length !== ticksB[i].length) { |
|
return false |
|
} |
|
for(var j=0; j<ticksA[i].length; ++j) { |
|
var a = ticksA[i][j] |
|
var b = ticksB[i][j] |
|
if( |
|
a.x !== b.x || |
|
a.text !== b.text || |
|
a.font !== b.font || |
|
a.fontColor !== b.fontColor || |
|
a.fontSize !== b.fontSize || |
|
a.dx !== b.dx || |
|
a.dy !== b.dy |
|
) { |
|
return false |
|
} |
|
} |
|
} |
|
return true |
|
} |
|
},{}],83:[function(require,module,exports){ |
|
"use strict" |
|
|
|
var pool = require("typedarray-pool") |
|
var ops = require("ndarray-ops") |
|
var ndarray = require("ndarray") |
|
|
|
var SUPPORTED_TYPES = [ |
|
"uint8", |
|
"uint8_clamped", |
|
"uint16", |
|
"uint32", |
|
"int8", |
|
"int16", |
|
"int32", |
|
"float32" ] |
|
|
|
function GLBuffer(gl, type, handle, length, usage) { |
|
this.gl = gl |
|
this.type = type |
|
this.handle = handle |
|
this.length = length |
|
this.usage = usage |
|
} |
|
|
|
var proto = GLBuffer.prototype |
|
|
|
proto.bind = function() { |
|
this.gl.bindBuffer(this.type, this.handle) |
|
} |
|
|
|
proto.unbind = function() { |
|
this.gl.bindBuffer(this.type, null) |
|
} |
|
|
|
proto.dispose = function() { |
|
this.gl.deleteBuffer(this.handle) |
|
} |
|
|
|
function updateTypeArray(gl, type, len, usage, data, offset) { |
|
var dataLen = data.length * data.BYTES_PER_ELEMENT |
|
if(offset < 0) { |
|
gl.bufferData(type, data, usage) |
|
return dataLen |
|
} |
|
if(dataLen + offset > len) { |
|
throw new Error("gl-buffer: If resizing buffer, must not specify offset") |
|
} |
|
gl.bufferSubData(type, offset, data) |
|
return len |
|
} |
|
|
|
function makeScratchTypeArray(array, dtype) { |
|
var res = pool.malloc(array.length, dtype) |
|
var n = array.length |
|
for(var i=0; i<n; ++i) { |
|
res[i] = array[i] |
|
} |
|
return res |
|
} |
|
|
|
function isPacked(shape, stride) { |
|
var n = 1 |
|
for(var i=stride.length-1; i>=0; --i) { |
|
if(stride[i] !== n) { |
|
return false |
|
} |
|
n *= shape[i] |
|
} |
|
return true |
|
} |
|
|
|
proto.update = function(array, offset) { |
|
if(typeof offset !== "number") { |
|
offset = -1 |
|
} |
|
this.bind() |
|
if(typeof array === "object" && typeof array.shape !== "undefined") { //ndarray |
|
var dtype = array.dtype |
|
if(SUPPORTED_TYPES.indexOf(dtype) < 0) { |
|
dtype = "float32" |
|
} |
|
if(this.type === this.gl.ELEMENT_ARRAY_BUFFER) { |
|
var ext = gl.getExtension('OES_element_index_uint') |
|
if(ext && dtype !== "uint16") { |
|
dtype = "uint32" |
|
} else { |
|
dtype = "uint16" |
|
} |
|
} |
|
if(dtype === array.dtype && isPacked(array.shape, array.stride)) { |
|
if(array.offset === 0 && array.data.length === array.shape[0]) { |
|
this.length = updateTypeArray(this.gl, this.type, this.length, this.usage, array.data, offset) |
|
} else { |
|
this.length = updateTypeArray(this.gl, this.type, this.length, this.usage, array.data.subarray(array.offset, array.shape[0]), offset) |
|
} |
|
} else { |
|
var tmp = pool.malloc(array.size, dtype) |
|
var ndt = ndarray(tmp, array.shape) |
|
ops.assign(ndt, array) |
|
if(offset < 0) { |
|
this.length = updateTypeArray(this.gl, this.type, this.length, this.usage, tmp, offset) |
|
} else { |
|
this.length = updateTypeArray(this.gl, this.type, this.length, this.usage, tmp.subarray(0, array.size), offset) |
|
} |
|
pool.free(tmp) |
|
} |
|
} else if(Array.isArray(array)) { //Vanilla array |
|
var t |
|
if(this.type === this.gl.ELEMENT_ARRAY_BUFFER) { |
|
t = makeScratchTypeArray(array, "uint16") |
|
} else { |
|
t = makeScratchTypeArray(array, "float32") |
|
} |
|
if(offset < 0) { |
|
this.length = updateTypeArray(this.gl, this.type, this.length, this.usage, t, offset) |
|
} else { |
|
this.length = updateTypeArray(this.gl, this.type, this.length, this.usage, t.subarray(0, array.length), offset) |
|
} |
|
pool.free(t) |
|
} else if(typeof array === "object" && typeof array.length === "number") { //Typed array |
|
this.length = updateTypeArray(this.gl, this.type, this.length, this.usage, array, offset) |
|
} else if(typeof array === "number" || array === undefined) { //Number/default |
|
if(offset >= 0) { |
|
throw new Error("gl-buffer: Cannot specify offset when resizing buffer") |
|
} |
|
array = array | 0 |
|
if(array <= 0) { |
|
array = 1 |
|
} |
|
this.gl.bufferData(this.type, array|0, this.usage) |
|
this.length = array |
|
} else { //Error, case should not happen |
|
throw new Error("gl-buffer: Invalid data type") |
|
} |
|
} |
|
|
|
function createBuffer(gl, data, type, usage) { |
|
type = type || gl.ARRAY_BUFFER |
|
usage = usage || gl.DYNAMIC_DRAW |
|
if(type !== gl.ARRAY_BUFFER && type !== gl.ELEMENT_ARRAY_BUFFER) { |
|
throw new Error("gl-buffer: Invalid type for webgl buffer, must be either gl.ARRAY_BUFFER or gl.ELEMENT_ARRAY_BUFFER") |
|
} |
|
if(usage !== gl.DYNAMIC_DRAW && usage !== gl.STATIC_DRAW && usage !== gl.STREAM_DRAW) { |
|
throw new Error("gl-buffer: Invalid usage for buffer, must be either gl.DYNAMIC_DRAW, gl.STATIC_DRAW or gl.STREAM_DRAW") |
|
} |
|
var handle = gl.createBuffer() |
|
var result = new GLBuffer(gl, type, handle, 0, usage) |
|
result.update(data) |
|
return result |
|
} |
|
|
|
module.exports = createBuffer |
|
|
|
},{"ndarray":208,"ndarray-ops":205,"typedarray-pool":257}],84:[function(require,module,exports){ |
|
module.exports = { |
|
0: 'NONE', |
|
1: 'ONE', |
|
2: 'LINE_LOOP', |
|
3: 'LINE_STRIP', |
|
4: 'TRIANGLES', |
|
5: 'TRIANGLE_STRIP', |
|
6: 'TRIANGLE_FAN', |
|
256: 'DEPTH_BUFFER_BIT', |
|
512: 'NEVER', |
|
513: 'LESS', |
|
514: 'EQUAL', |
|
515: 'LEQUAL', |
|
516: 'GREATER', |
|
517: 'NOTEQUAL', |
|
518: 'GEQUAL', |
|
519: 'ALWAYS', |
|
768: 'SRC_COLOR', |
|
769: 'ONE_MINUS_SRC_COLOR', |
|
770: 'SRC_ALPHA', |
|
771: 'ONE_MINUS_SRC_ALPHA', |
|
772: 'DST_ALPHA', |
|
773: 'ONE_MINUS_DST_ALPHA', |
|
774: 'DST_COLOR', |
|
775: 'ONE_MINUS_DST_COLOR', |
|
776: 'SRC_ALPHA_SATURATE', |
|
1024: 'STENCIL_BUFFER_BIT', |
|
1028: 'FRONT', |
|
1029: 'BACK', |
|
1032: 'FRONT_AND_BACK', |
|
1280: 'INVALID_ENUM', |
|
1281: 'INVALID_VALUE', |
|
1282: 'INVALID_OPERATION', |
|
1285: 'OUT_OF_MEMORY', |
|
1286: 'INVALID_FRAMEBUFFER_OPERATION', |
|
2304: 'CW', |
|
2305: 'CCW', |
|
2849: 'LINE_WIDTH', |
|
2884: 'CULL_FACE', |
|
2885: 'CULL_FACE_MODE', |
|
2886: 'FRONT_FACE', |
|
2928: 'DEPTH_RANGE', |
|
2929: 'DEPTH_TEST', |
|
2930: 'DEPTH_WRITEMASK', |
|
2931: 'DEPTH_CLEAR_VALUE', |
|
2932: 'DEPTH_FUNC', |
|
2960: 'STENCIL_TEST', |
|
2961: 'STENCIL_CLEAR_VALUE', |
|
2962: 'STENCIL_FUNC', |
|
2963: 'STENCIL_VALUE_MASK', |
|
2964: 'STENCIL_FAIL', |
|
2965: 'STENCIL_PASS_DEPTH_FAIL', |
|
2966: 'STENCIL_PASS_DEPTH_PASS', |
|
2967: 'STENCIL_REF', |
|
2968: 'STENCIL_WRITEMASK', |
|
2978: 'VIEWPORT', |
|
3024: 'DITHER', |
|
3042: 'BLEND', |
|
3088: 'SCISSOR_BOX', |
|
3089: 'SCISSOR_TEST', |
|
3106: 'COLOR_CLEAR_VALUE', |
|
3107: 'COLOR_WRITEMASK', |
|
3317: 'UNPACK_ALIGNMENT', |
|
3333: 'PACK_ALIGNMENT', |
|
3379: 'MAX_TEXTURE_SIZE', |
|
3386: 'MAX_VIEWPORT_DIMS', |
|
3408: 'SUBPIXEL_BITS', |
|
3410: 'RED_BITS', |
|
3411: 'GREEN_BITS', |
|
3412: 'BLUE_BITS', |
|
3413: 'ALPHA_BITS', |
|
3414: 'DEPTH_BITS', |
|
3415: 'STENCIL_BITS', |
|
3553: 'TEXTURE_2D', |
|
4352: 'DONT_CARE', |
|
4353: 'FASTEST', |
|
4354: 'NICEST', |
|
5120: 'BYTE', |
|
5121: 'UNSIGNED_BYTE', |
|
5122: 'SHORT', |
|
5123: 'UNSIGNED_SHORT', |
|
5124: 'INT', |
|
5125: 'UNSIGNED_INT', |
|
5126: 'FLOAT', |
|
5386: 'INVERT', |
|
5890: 'TEXTURE', |
|
6401: 'STENCIL_INDEX', |
|
6402: 'DEPTH_COMPONENT', |
|
6406: 'ALPHA', |
|
6407: 'RGB', |
|
6408: 'RGBA', |
|
6409: 'LUMINANCE', |
|
6410: 'LUMINANCE_ALPHA', |
|
7680: 'KEEP', |
|
7681: 'REPLACE', |
|
7682: 'INCR', |
|
7683: 'DECR', |
|
7936: 'VENDOR', |
|
7937: 'RENDERER', |
|
7938: 'VERSION', |
|
9728: 'NEAREST', |
|
9729: 'LINEAR', |
|
9984: 'NEAREST_MIPMAP_NEAREST', |
|
9985: 'LINEAR_MIPMAP_NEAREST', |
|
9986: 'NEAREST_MIPMAP_LINEAR', |
|
9987: 'LINEAR_MIPMAP_LINEAR', |
|
10240: 'TEXTURE_MAG_FILTER', |
|
10241: 'TEXTURE_MIN_FILTER', |
|
10242: 'TEXTURE_WRAP_S', |
|
10243: 'TEXTURE_WRAP_T', |
|
10497: 'REPEAT', |
|
10752: 'POLYGON_OFFSET_UNITS', |
|
16384: 'COLOR_BUFFER_BIT', |
|
32769: 'CONSTANT_COLOR', |
|
32770: 'ONE_MINUS_CONSTANT_COLOR', |
|
32771: 'CONSTANT_ALPHA', |
|
32772: 'ONE_MINUS_CONSTANT_ALPHA', |
|
32773: 'BLEND_COLOR', |
|
32774: 'FUNC_ADD', |
|
32777: 'BLEND_EQUATION_RGB', |
|
32778: 'FUNC_SUBTRACT', |
|
32779: 'FUNC_REVERSE_SUBTRACT', |
|
32819: 'UNSIGNED_SHORT_4_4_4_4', |
|
32820: 'UNSIGNED_SHORT_5_5_5_1', |
|
32823: 'POLYGON_OFFSET_FILL', |
|
32824: 'POLYGON_OFFSET_FACTOR', |
|
32854: 'RGBA4', |
|
32855: 'RGB5_A1', |
|
32873: 'TEXTURE_BINDING_2D', |
|
32926: 'SAMPLE_ALPHA_TO_COVERAGE', |
|
32928: 'SAMPLE_COVERAGE', |
|
32936: 'SAMPLE_BUFFERS', |
|
32937: 'SAMPLES', |
|
32938: 'SAMPLE_COVERAGE_VALUE', |
|
32939: 'SAMPLE_COVERAGE_INVERT', |
|
32968: 'BLEND_DST_RGB', |
|
32969: 'BLEND_SRC_RGB', |
|
32970: 'BLEND_DST_ALPHA', |
|
32971: 'BLEND_SRC_ALPHA', |
|
33071: 'CLAMP_TO_EDGE', |
|
33170: 'GENERATE_MIPMAP_HINT', |
|
33189: 'DEPTH_COMPONENT16', |
|
33306: 'DEPTH_STENCIL_ATTACHMENT', |
|
33635: 'UNSIGNED_SHORT_5_6_5', |
|
33648: 'MIRRORED_REPEAT', |
|
33901: 'ALIASED_POINT_SIZE_RANGE', |
|
33902: 'ALIASED_LINE_WIDTH_RANGE', |
|
33984: 'TEXTURE0', |
|
33985: 'TEXTURE1', |
|
33986: 'TEXTURE2', |
|
33987: 'TEXTURE3', |
|
33988: 'TEXTURE4', |
|
33989: 'TEXTURE5', |
|
33990: 'TEXTURE6', |
|
33991: 'TEXTURE7', |
|
33992: 'TEXTURE8', |
|
33993: 'TEXTURE9', |
|
33994: 'TEXTURE10', |
|
33995: 'TEXTURE11', |
|
33996: 'TEXTURE12', |
|
33997: 'TEXTURE13', |
|
33998: 'TEXTURE14', |
|
33999: 'TEXTURE15', |
|
34000: 'TEXTURE16', |
|
34001: 'TEXTURE17', |
|
34002: 'TEXTURE18', |
|
34003: 'TEXTURE19', |
|
34004: 'TEXTURE20', |
|
34005: 'TEXTURE21', |
|
34006: 'TEXTURE22', |
|
34007: 'TEXTURE23', |
|
34008: 'TEXTURE24', |
|
34009: 'TEXTURE25', |
|
34010: 'TEXTURE26', |
|
34011: 'TEXTURE27', |
|
34012: 'TEXTURE28', |
|
34013: 'TEXTURE29', |
|
34014: 'TEXTURE30', |
|
34015: 'TEXTURE31', |
|
34016: 'ACTIVE_TEXTURE', |
|
34024: 'MAX_RENDERBUFFER_SIZE', |
|
34041: 'DEPTH_STENCIL', |
|
34055: 'INCR_WRAP', |
|
34056: 'DECR_WRAP', |
|
34067: 'TEXTURE_CUBE_MAP', |
|
34068: 'TEXTURE_BINDING_CUBE_MAP', |
|
34069: 'TEXTURE_CUBE_MAP_POSITIVE_X', |
|
34070: 'TEXTURE_CUBE_MAP_NEGATIVE_X', |
|
34071: 'TEXTURE_CUBE_MAP_POSITIVE_Y', |
|
34072: 'TEXTURE_CUBE_MAP_NEGATIVE_Y', |
|
34073: 'TEXTURE_CUBE_MAP_POSITIVE_Z', |
|
34074: 'TEXTURE_CUBE_MAP_NEGATIVE_Z', |
|
34076: 'MAX_CUBE_MAP_TEXTURE_SIZE', |
|
34338: 'VERTEX_ATTRIB_ARRAY_ENABLED', |
|
34339: 'VERTEX_ATTRIB_ARRAY_SIZE', |
|
34340: 'VERTEX_ATTRIB_ARRAY_STRIDE', |
|
34341: 'VERTEX_ATTRIB_ARRAY_TYPE', |
|
34342: 'CURRENT_VERTEX_ATTRIB', |
|
34373: 'VERTEX_ATTRIB_ARRAY_POINTER', |
|
34466: 'NUM_COMPRESSED_TEXTURE_FORMATS', |
|
34467: 'COMPRESSED_TEXTURE_FORMATS', |
|
34660: 'BUFFER_SIZE', |
|
34661: 'BUFFER_USAGE', |
|
34816: 'STENCIL_BACK_FUNC', |
|
34817: 'STENCIL_BACK_FAIL', |
|
34818: 'STENCIL_BACK_PASS_DEPTH_FAIL', |
|
34819: 'STENCIL_BACK_PASS_DEPTH_PASS', |
|
34877: 'BLEND_EQUATION_ALPHA', |
|
34921: 'MAX_VERTEX_ATTRIBS', |
|
34922: 'VERTEX_ATTRIB_ARRAY_NORMALIZED', |
|
34930: 'MAX_TEXTURE_IMAGE_UNITS', |
|
34962: 'ARRAY_BUFFER', |
|
34963: 'ELEMENT_ARRAY_BUFFER', |
|
34964: 'ARRAY_BUFFER_BINDING', |
|
34965: 'ELEMENT_ARRAY_BUFFER_BINDING', |
|
34975: 'VERTEX_ATTRIB_ARRAY_BUFFER_BINDING', |
|
35040: 'STREAM_DRAW', |
|
35044: 'STATIC_DRAW', |
|
35048: 'DYNAMIC_DRAW', |
|
35632: 'FRAGMENT_SHADER', |
|
35633: 'VERTEX_SHADER', |
|
35660: 'MAX_VERTEX_TEXTURE_IMAGE_UNITS', |
|
35661: 'MAX_COMBINED_TEXTURE_IMAGE_UNITS', |
|
35663: 'SHADER_TYPE', |
|
35664: 'FLOAT_VEC2', |
|
35665: 'FLOAT_VEC3', |
|
35666: 'FLOAT_VEC4', |
|
35667: 'INT_VEC2', |
|
35668: 'INT_VEC3', |
|
35669: 'INT_VEC4', |
|
35670: 'BOOL', |
|
35671: 'BOOL_VEC2', |
|
35672: 'BOOL_VEC3', |
|
35673: 'BOOL_VEC4', |
|
35674: 'FLOAT_MAT2', |
|
35675: 'FLOAT_MAT3', |
|
35676: 'FLOAT_MAT4', |
|
35678: 'SAMPLER_2D', |
|
35680: 'SAMPLER_CUBE', |
|
35712: 'DELETE_STATUS', |
|
35713: 'COMPILE_STATUS', |
|
35714: 'LINK_STATUS', |
|
35715: 'VALIDATE_STATUS', |
|
35716: 'INFO_LOG_LENGTH', |
|
35717: 'ATTACHED_SHADERS', |
|
35718: 'ACTIVE_UNIFORMS', |
|
35719: 'ACTIVE_UNIFORM_MAX_LENGTH', |
|
35720: 'SHADER_SOURCE_LENGTH', |
|
35721: 'ACTIVE_ATTRIBUTES', |
|
35722: 'ACTIVE_ATTRIBUTE_MAX_LENGTH', |
|
35724: 'SHADING_LANGUAGE_VERSION', |
|
35725: 'CURRENT_PROGRAM', |
|
36003: 'STENCIL_BACK_REF', |
|
36004: 'STENCIL_BACK_VALUE_MASK', |
|
36005: 'STENCIL_BACK_WRITEMASK', |
|
36006: 'FRAMEBUFFER_BINDING', |
|
36007: 'RENDERBUFFER_BINDING', |
|
36048: 'FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE', |
|
36049: 'FRAMEBUFFER_ATTACHMENT_OBJECT_NAME', |
|
36050: 'FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL', |
|
36051: 'FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE', |
|
36053: 'FRAMEBUFFER_COMPLETE', |
|
36054: 'FRAMEBUFFER_INCOMPLETE_ATTACHMENT', |
|
36055: 'FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT', |
|
36057: 'FRAMEBUFFER_INCOMPLETE_DIMENSIONS', |
|
36061: 'FRAMEBUFFER_UNSUPPORTED', |
|
36064: 'COLOR_ATTACHMENT0', |
|
36096: 'DEPTH_ATTACHMENT', |
|
36128: 'STENCIL_ATTACHMENT', |
|
36160: 'FRAMEBUFFER', |
|
36161: 'RENDERBUFFER', |
|
36162: 'RENDERBUFFER_WIDTH', |
|
36163: 'RENDERBUFFER_HEIGHT', |
|
36164: 'RENDERBUFFER_INTERNAL_FORMAT', |
|
36168: 'STENCIL_INDEX8', |
|
36176: 'RENDERBUFFER_RED_SIZE', |
|
36177: 'RENDERBUFFER_GREEN_SIZE', |
|
36178: 'RENDERBUFFER_BLUE_SIZE', |
|
36179: 'RENDERBUFFER_ALPHA_SIZE', |
|
36180: 'RENDERBUFFER_DEPTH_SIZE', |
|
36181: 'RENDERBUFFER_STENCIL_SIZE', |
|
36194: 'RGB565', |
|
36336: 'LOW_FLOAT', |
|
36337: 'MEDIUM_FLOAT', |
|
36338: 'HIGH_FLOAT', |
|
36339: 'LOW_INT', |
|
36340: 'MEDIUM_INT', |
|
36341: 'HIGH_INT', |
|
36346: 'SHADER_COMPILER', |
|
36347: 'MAX_VERTEX_UNIFORM_VECTORS', |
|
36348: 'MAX_VARYING_VECTORS', |
|
36349: 'MAX_FRAGMENT_UNIFORM_VECTORS', |
|
37440: 'UNPACK_FLIP_Y_WEBGL', |
|
37441: 'UNPACK_PREMULTIPLY_ALPHA_WEBGL', |
|
37442: 'CONTEXT_LOST_WEBGL', |
|
37443: 'UNPACK_COLORSPACE_CONVERSION_WEBGL', |
|
37444: 'BROWSER_DEFAULT_WEBGL' |
|
} |
|
|
|
},{}],85:[function(require,module,exports){ |
|
var gl10 = require('./1.0/numbers') |
|
|
|
module.exports = function lookupConstant (number) { |
|
return gl10[number] |
|
} |
|
|
|
},{"./1.0/numbers":84}],86:[function(require,module,exports){ |
|
'use strict' |
|
|
|
var createTexture = require('gl-texture2d') |
|
|
|
module.exports = createFBO |
|
|
|
var colorAttachmentArrays = null |
|
var FRAMEBUFFER_UNSUPPORTED |
|
var FRAMEBUFFER_INCOMPLETE_ATTACHMENT |
|
var FRAMEBUFFER_INCOMPLETE_DIMENSIONS |
|
var FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT |
|
|
|
function saveFBOState(gl) { |
|
var fbo = gl.getParameter(gl.FRAMEBUFFER_BINDING) |
|
var rbo = gl.getParameter(gl.RENDERBUFFER_BINDING) |
|
var tex = gl.getParameter(gl.TEXTURE_BINDING_2D) |
|
return [fbo, rbo, tex] |
|
} |
|
|
|
function restoreFBOState(gl, data) { |
|
gl.bindFramebuffer(gl.FRAMEBUFFER, data[0]) |
|
gl.bindRenderbuffer(gl.RENDERBUFFER, data[1]) |
|
gl.bindTexture(gl.TEXTURE_2D, data[2]) |
|
} |
|
|
|
function lazyInitColorAttachments(gl, ext) { |
|
var maxColorAttachments = gl.getParameter(ext.MAX_COLOR_ATTACHMENTS_WEBGL) |
|
colorAttachmentArrays = new Array(maxColorAttachments + 1) |
|
for(var i=0; i<=maxColorAttachments; ++i) { |
|
var x = new Array(maxColorAttachments) |
|
for(var j=0; j<i; ++j) { |
|
x[j] = gl.COLOR_ATTACHMENT0 + j |
|
} |
|
for(var j=i; j<maxColorAttachments; ++j) { |
|
x[j] = gl.NONE |
|
} |
|
colorAttachmentArrays[i] = x |
|
} |
|
} |
|
|
|
//Throw an appropriate error |
|
function throwFBOError(status) { |
|
switch(status){ |
|
case FRAMEBUFFER_UNSUPPORTED: |
|
throw new Error('gl-fbo: Framebuffer unsupported') |
|
case FRAMEBUFFER_INCOMPLETE_ATTACHMENT: |
|
throw new Error('gl-fbo: Framebuffer incomplete attachment') |
|
case FRAMEBUFFER_INCOMPLETE_DIMENSIONS: |
|
throw new Error('gl-fbo: Framebuffer incomplete dimensions') |
|
case FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: |
|
throw new Error('gl-fbo: Framebuffer incomplete missing attachment') |
|
default: |
|
throw new Error('gl-fbo: Framebuffer failed for unspecified reason') |
|
} |
|
} |
|
|
|
//Initialize a texture object |
|
function initTexture(gl, width, height, type, format, attachment) { |
|
if(!type) { |
|
return null |
|
} |
|
var result = createTexture(gl, width, height, format, type) |
|
result.magFilter = gl.NEAREST |
|
result.minFilter = gl.NEAREST |
|
result.mipSamples = 1 |
|
result.bind() |
|
gl.framebufferTexture2D(gl.FRAMEBUFFER, attachment, gl.TEXTURE_2D, result.handle, 0) |
|
return result |
|
} |
|
|
|
//Initialize a render buffer object |
|
function initRenderBuffer(gl, width, height, component, attachment) { |
|
var result = gl.createRenderbuffer() |
|
gl.bindRenderbuffer(gl.RENDERBUFFER, result) |
|
gl.renderbufferStorage(gl.RENDERBUFFER, component, width, height) |
|
gl.framebufferRenderbuffer(gl.FRAMEBUFFER, attachment, gl.RENDERBUFFER, result) |
|
return result |
|
} |
|
|
|
//Rebuild the frame buffer |
|
function rebuildFBO(fbo) { |
|
|
|
//Save FBO state |
|
var state = saveFBOState(fbo.gl) |
|
|
|
var gl = fbo.gl |
|
var handle = fbo.handle = gl.createFramebuffer() |
|
var width = fbo._shape[0] |
|
var height = fbo._shape[1] |
|
var numColors = fbo.color.length |
|
var ext = fbo._ext |
|
var useStencil = fbo._useStencil |
|
var useDepth = fbo._useDepth |
|
var colorType = fbo._colorType |
|
|
|
//Bind the fbo |
|
gl.bindFramebuffer(gl.FRAMEBUFFER, handle) |
|
|
|
//Allocate color buffers |
|
for(var i=0; i<numColors; ++i) { |
|
fbo.color[i] = initTexture(gl, width, height, colorType, gl.RGBA, gl.COLOR_ATTACHMENT0 + i) |
|
} |
|
if(numColors === 0) { |
|
fbo._color_rb = initRenderBuffer(gl, width, height, gl.RGBA4, gl.COLOR_ATTACHMENT0) |
|
if(ext) { |
|
ext.drawBuffersWEBGL(colorAttachmentArrays[0]) |
|
} |
|
} else if(numColors > 1) { |
|
ext.drawBuffersWEBGL(colorAttachmentArrays[numColors]) |
|
} |
|
|
|
//Allocate depth/stencil buffers |
|
var WEBGL_depth_texture = gl.getExtension('WEBGL_depth_texture') |
|
if(WEBGL_depth_texture) { |
|
if(useStencil) { |
|
fbo.depth = initTexture(gl, width, height, |
|
WEBGL_depth_texture.UNSIGNED_INT_24_8_WEBGL, |
|
gl.DEPTH_STENCIL, |
|
gl.DEPTH_STENCIL_ATTACHMENT) |
|
} else if(useDepth) { |
|
fbo.depth = initTexture(gl, width, height, |
|
gl.UNSIGNED_SHORT, |
|
gl.DEPTH_COMPONENT, |
|
gl.DEPTH_ATTACHMENT) |
|
} |
|
} else { |
|
if(useDepth && useStencil) { |
|
fbo._depth_rb = initRenderBuffer(gl, width, height, gl.DEPTH_STENCIL, gl.DEPTH_STENCIL_ATTACHMENT) |
|
} else if(useDepth) { |
|
fbo._depth_rb = initRenderBuffer(gl, width, height, gl.DEPTH_COMPONENT16, gl.DEPTH_ATTACHMENT) |
|
} else if(useStencil) { |
|
fbo._depth_rb = initRenderBuffer(gl, width, height, gl.STENCIL_INDEX, gl.STENCIL_ATTACHMENT) |
|
} |
|
} |
|
|
|
//Check frame buffer state |
|
var status = gl.checkFramebufferStatus(gl.FRAMEBUFFER) |
|
if(status !== gl.FRAMEBUFFER_COMPLETE) { |
|
|
|
//Release all partially allocated resources |
|
fbo._destroyed = true |
|
|
|
//Release all resources |
|
gl.bindFramebuffer(gl.FRAMEBUFFER, null) |
|
gl.deleteFramebuffer(fbo.handle) |
|
fbo.handle = null |
|
if(fbo.depth) { |
|
fbo.depth.dispose() |
|
fbo.depth = null |
|
} |
|
if(fbo._depth_rb) { |
|
gl.deleteRenderbuffer(fbo._depth_rb) |
|
fbo._depth_rb = null |
|
} |
|
for(var i=0; i<fbo.color.length; ++i) { |
|
fbo.color[i].dispose() |
|
fbo.color[i] = null |
|
} |
|
if(fbo._color_rb) { |
|
gl.deleteRenderbuffer(fbo._color_rb) |
|
fbo._color_rb = null |
|
} |
|
|
|
restoreFBOState(gl, state) |
|
|
|
//Throw the frame buffer error |
|
throwFBOError(status) |
|
} |
|
|
|
//Everything ok, let's get on with life |
|
restoreFBOState(gl, state) |
|
} |
|
|
|
function Framebuffer(gl, width, height, colorType, numColors, useDepth, useStencil, ext) { |
|
|
|
//Handle and set properties |
|
this.gl = gl |
|
this._shape = [width|0, height|0] |
|
this._destroyed = false |
|
this._ext = ext |
|
|
|
//Allocate buffers |
|
this.color = new Array(numColors) |
|
for(var i=0; i<numColors; ++i) { |
|
this.color[i] = null |
|
} |
|
this._color_rb = null |
|
this.depth = null |
|
this._depth_rb = null |
|
|
|
//Save depth and stencil flags |
|
this._colorType = colorType |
|
this._useDepth = useDepth |
|
this._useStencil = useStencil |
|
|
|
//Shape vector for resizing |
|
var parent = this |
|
var shapeVector = [width|0, height|0] |
|
Object.defineProperties(shapeVector, { |
|
0: { |
|
get: function() { |
|
return parent._shape[0] |
|
}, |
|
set: function(w) { |
|
return parent.width = w |
|
} |
|
}, |
|
1: { |
|
get: function() { |
|
return parent._shape[1] |
|
}, |
|
set: function(h) { |
|
return parent.height = h |
|
} |
|
} |
|
}) |
|
this._shapeVector = shapeVector |
|
|
|
//Initialize all attachments |
|
rebuildFBO(this) |
|
} |
|
|
|
var proto = Framebuffer.prototype |
|
|
|
function reshapeFBO(fbo, w, h) { |
|
//If fbo is invalid, just skip this |
|
if(fbo._destroyed) { |
|
throw new Error('gl-fbo: Can\'t resize destroyed FBO') |
|
} |
|
|
|
//Don't resize if no change in shape |
|
if( (fbo._shape[0] === w) && |
|
(fbo._shape[1] === h) ) { |
|
return |
|
} |
|
|
|
var gl = fbo.gl |
|
|
|
//Check parameter ranges |
|
var maxFBOSize = gl.getParameter(gl.MAX_RENDERBUFFER_SIZE) |
|
if( w < 0 || w > maxFBOSize || |
|
h < 0 || h > maxFBOSize) { |
|
throw new Error('gl-fbo: Can\'t resize FBO, invalid dimensions') |
|
} |
|
|
|
//Update shape |
|
fbo._shape[0] = w |
|
fbo._shape[1] = h |
|
|
|
//Save framebuffer state |
|
var state = saveFBOState(gl) |
|
|
|
//Resize framebuffer attachments |
|
for(var i=0; i<fbo.color.length; ++i) { |
|
fbo.color[i].shape = fbo._shape |
|
} |
|
if(fbo._color_rb) { |
|
gl.bindRenderbuffer(gl.RENDERBUFFER, fbo._color_rb) |
|
gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA4, fbo._shape[0], fbo._shape[1]) |
|
} |
|
if(fbo.depth) { |
|
fbo.depth.shape = fbo._shape |
|
} |
|
if(fbo._depth_rb) { |
|
gl.bindRenderbuffer(gl.RENDERBUFFER, fbo._depth_rb) |
|
if(fbo._useDepth && fbo._useStencil) { |
|
gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_STENCIL, fbo._shape[0], fbo._shape[1]) |
|
} else if(fbo._useDepth) { |
|
gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, fbo._shape[0], fbo._shape[1]) |
|
} else if(fbo._useStencil) { |
|
gl.renderbufferStorage(gl.RENDERBUFFER, gl.STENCIL_INDEX, fbo._shape[0], fbo._shape[1]) |
|
} |
|
} |
|
|
|
//Check FBO status after resize, if something broke then die in a fire |
|
gl.bindFramebuffer(gl.FRAMEBUFFER, fbo.handle) |
|
var status = gl.checkFramebufferStatus(gl.FRAMEBUFFER) |
|
if(status !== gl.FRAMEBUFFER_COMPLETE) { |
|
fbo.dispose() |
|
restoreFBOState(gl, state) |
|
throwFBOError(status) |
|
} |
|
|
|
//Restore framebuffer state |
|
restoreFBOState(gl, state) |
|
} |
|
|
|
Object.defineProperties(proto, { |
|
'shape': { |
|
get: function() { |
|
if(this._destroyed) { |
|
return [0,0] |
|
} |
|
return this._shapeVector |
|
}, |
|
set: function(x) { |
|
if(!Array.isArray(x)) { |
|
x = [x|0, x|0] |
|
} |
|
if(x.length !== 2) { |
|
throw new Error('gl-fbo: Shape vector must be length 2') |
|
} |
|
|
|
var w = x[0]|0 |
|
var h = x[1]|0 |
|
reshapeFBO(this, w, h) |
|
|
|
return [w, h] |
|
}, |
|
enumerable: false |
|
}, |
|
'width': { |
|
get: function() { |
|
if(this._destroyed) { |
|
return 0 |
|
} |
|
return this._shape[0] |
|
}, |
|
set: function(w) { |
|
w = w|0 |
|
reshapeFBO(this, w, this._shape[1]) |
|
return w |
|
}, |
|
enumerable: false |
|
}, |
|
'height': { |
|
get: function() { |
|
if(this._destroyed) { |
|
return 0 |
|
} |
|
return this._shape[1] |
|
}, |
|
set: function(h) { |
|
h = h|0 |
|
reshapeFBO(this, this._shape[0], h) |
|
return h |
|
}, |
|
enumerable: false |
|
} |
|
}) |
|
|
|
proto.bind = function() { |
|
if(this._destroyed) { |
|
return |
|
} |
|
var gl = this.gl |
|
gl.bindFramebuffer(gl.FRAMEBUFFER, this.handle) |
|
gl.viewport(0, 0, this._shape[0], this._shape[1]) |
|
} |
|
|
|
proto.dispose = function() { |
|
if(this._destroyed) { |
|
return |
|
} |
|
this._destroyed = true |
|
var gl = this.gl |
|
gl.deleteFramebuffer(this.handle) |
|
this.handle = null |
|
if(this.depth) { |
|
this.depth.dispose() |
|
this.depth = null |
|
} |
|
if(this._depth_rb) { |
|
gl.deleteRenderbuffer(this._depth_rb) |
|
this._depth_rb = null |
|
} |
|
for(var i=0; i<this.color.length; ++i) { |
|
this.color[i].dispose() |
|
this.color[i] = null |
|
} |
|
if(this._color_rb) { |
|
gl.deleteRenderbuffer(this._color_rb) |
|
this._color_rb = null |
|
} |
|
} |
|
|
|
function createFBO(gl, width, height, options) { |
|
|
|
//Update frame buffer error code values |
|
if(!FRAMEBUFFER_UNSUPPORTED) { |
|
FRAMEBUFFER_UNSUPPORTED = gl.FRAMEBUFFER_UNSUPPORTED |
|
FRAMEBUFFER_INCOMPLETE_ATTACHMENT = gl.FRAMEBUFFER_INCOMPLETE_ATTACHMENT |
|
FRAMEBUFFER_INCOMPLETE_DIMENSIONS = gl.FRAMEBUFFER_INCOMPLETE_DIMENSIONS |
|
FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = gl.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT |
|
} |
|
|
|
//Lazily initialize color attachment arrays |
|
var WEBGL_draw_buffers = gl.getExtension('WEBGL_draw_buffers') |
|
if(!colorAttachmentArrays && WEBGL_draw_buffers) { |
|
lazyInitColorAttachments(gl, WEBGL_draw_buffers) |
|
} |
|
|
|
//Special case: Can accept an array as argument |
|
if(Array.isArray(width)) { |
|
options = height |
|
height = width[1]|0 |
|
width = width[0]|0 |
|
} |
|
|
|
if(typeof width !== 'number') { |
|
throw new Error('gl-fbo: Missing shape parameter') |
|
} |
|
|
|
//Validate width/height properties |
|
var maxFBOSize = gl.getParameter(gl.MAX_RENDERBUFFER_SIZE) |
|
if(width < 0 || width > maxFBOSize || height < 0 || height > maxFBOSize) { |
|
throw new Error('gl-fbo: Parameters are too large for FBO') |
|
} |
|
|
|
//Handle each option type |
|
options = options || {} |
|
|
|
//Figure out number of color buffers to use |
|
var numColors = 1 |
|
if('color' in options) { |
|
numColors = Math.max(options.color|0, 0) |
|
if(numColors < 0) { |
|
throw new Error('gl-fbo: Must specify a nonnegative number of colors') |
|
} |
|
if(numColors > 1) { |
|
//Check if multiple render targets supported |
|
if(!WEBGL_draw_buffers) { |
|
throw new Error('gl-fbo: Multiple draw buffer extension not supported') |
|
} else if(numColors > gl.getParameter(WEBGL_draw_buffers.MAX_COLOR_ATTACHMENTS_WEBGL)) { |
|
throw new Error('gl-fbo: Context does not support ' + numColors + ' draw buffers') |
|
} |
|
} |
|
} |
|
|
|
//Determine whether to use floating point textures |
|
var colorType = gl.UNSIGNED_BYTE |
|
var OES_texture_float = gl.getExtension('OES_texture_float') |
|
if(options.float && numColors > 0) { |
|
if(!OES_texture_float) { |
|
throw new Error('gl-fbo: Context does not support floating point textures') |
|
} |
|
colorType = gl.FLOAT |
|
} else if(options.preferFloat && numColors > 0) { |
|
if(OES_texture_float) { |
|
colorType = gl.FLOAT |
|
} |
|
} |
|
|
|
//Check if we should use depth buffer |
|
var useDepth = true |
|
if('depth' in options) { |
|
useDepth = !!options.depth |
|
} |
|
|
|
//Check if we should use a stencil buffer |
|
var useStencil = false |
|
if('stencil' in options) { |
|
useStencil = !!options.stencil |
|
} |
|
|
|
return new Framebuffer( |
|
gl, |
|
width, |
|
height, |
|
colorType, |
|
numColors, |
|
useDepth, |
|
useStencil, |
|
WEBGL_draw_buffers) |
|
} |
|
|
|
},{"gl-texture2d":116}],87:[function(require,module,exports){ |
|
|
|
var sprintf = require('sprintf-js').sprintf; |
|
var glConstants = require('gl-constants/lookup'); |
|
var shaderName = require('glsl-shader-name'); |
|
var addLineNumbers = require('add-line-numbers'); |
|
|
|
module.exports = formatCompilerError; |
|
|
|
function formatCompilerError(errLog, src, type) { |
|
"use strict"; |
|
|
|
var name = shaderName(src) || 'of unknown name (see npm glsl-shader-name)'; |
|
|
|
var typeName = 'unknown type'; |
|
if (type !== undefined) { |
|
typeName = type === glConstants.FRAGMENT_SHADER ? 'fragment' : 'vertex' |
|
} |
|
|
|
var longForm = sprintf('Error compiling %s shader %s:\n', typeName, name); |
|
var shortForm = sprintf("%s%s", longForm, errLog); |
|
|
|
var errorStrings = errLog.split('\n'); |
|
var errors = {}; |
|
|
|
for (var i = 0; i < errorStrings.length; i++) { |
|
var errorString = errorStrings[i]; |
|
if (errorString === '') continue; |
|
var lineNo = parseInt(errorString.split(':')[2]); |
|
if (isNaN(lineNo)) { |
|
throw new Error(sprintf('Could not parse error: %s', errorString)); |
|
} |
|
errors[lineNo] = errorString; |
|
} |
|
|
|
var lines = addLineNumbers(src).split('\n'); |
|
|
|
for (var i = 0; i < lines.length; i++) { |
|
if (!errors[i+3] && !errors[i+2] && !errors[i+1]) continue; |
|
var line = lines[i]; |
|
longForm += line + '\n'; |
|
if (errors[i+1]) { |
|
var e = errors[i+1]; |
|
e = e.substr(e.split(':', 3).join(':').length + 1).trim(); |
|
longForm += sprintf('^^^ %s\n\n', e); |
|
} |
|
} |
|
|
|
return { |
|
long: longForm.trim(), |
|
short: shortForm.trim() |
|
}; |
|
} |
|
|
|
|
|
},{"add-line-numbers":14,"gl-constants/lookup":85,"glsl-shader-name":180,"sprintf-js":250}],88:[function(require,module,exports){ |
|
module.exports = clone; |
|
|
|
/** |
|
* Creates a new mat4 initialized with values from an existing matrix |
|
* |
|
* @param {mat4} a matrix to clone |
|
* @returns {mat4} a new 4x4 matrix |
|
*/ |
|
function clone(a) { |
|
var out = new Float32Array(16); |
|
out[0] = a[0]; |
|
out[1] = a[1]; |
|
out[2] = a[2]; |
|
out[3] = a[3]; |
|
out[4] = a[4]; |
|
out[5] = a[5]; |
|
out[6] = a[6]; |
|
out[7] = a[7]; |
|
out[8] = a[8]; |
|
out[9] = a[9]; |
|
out[10] = a[10]; |
|
out[11] = a[11]; |
|
out[12] = a[12]; |
|
out[13] = a[13]; |
|
out[14] = a[14]; |
|
out[15] = a[15]; |
|
return out; |
|
}; |
|
},{}],89:[function(require,module,exports){ |
|
module.exports = create; |
|
|
|
/** |
|
* Creates a new identity mat4 |
|
* |
|
* @returns {mat4} a new 4x4 matrix |
|
*/ |
|
function create() { |
|
var out = new Float32Array(16); |
|
out[0] = 1; |
|
out[1] = 0; |
|
out[2] = 0; |
|
out[3] = 0; |
|
out[4] = 0; |
|
out[5] = 1; |
|
out[6] = 0; |
|
out[7] = 0; |
|
out[8] = 0; |
|
out[9] = 0; |
|
out[10] = 1; |
|
out[11] = 0; |
|
out[12] = 0; |
|
out[13] = 0; |
|
out[14] = 0; |
|
out[15] = 1; |
|
return out; |
|
}; |
|
},{}],90:[function(require,module,exports){ |
|
module.exports = determinant; |
|
|
|
/** |
|
* Calculates the determinant of a mat4 |
|
* |
|
* @param {mat4} a the source matrix |
|
* @returns {Number} determinant of a |
|
*/ |
|
function determinant(a) { |
|
var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3], |
|
a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7], |
|
a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11], |
|
a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15], |
|
|
|
b00 = a00 * a11 - a01 * a10, |
|
b01 = a00 * a12 - a02 * a10, |
|
b02 = a00 * a13 - a03 * a10, |
|
b03 = a01 * a12 - a02 * a11, |
|
b04 = a01 * a13 - a03 * a11, |
|
b05 = a02 * a13 - a03 * a12, |
|
b06 = a20 * a31 - a21 * a30, |
|
b07 = a20 * a32 - a22 * a30, |
|
b08 = a20 * a33 - a23 * a30, |
|
b09 = a21 * a32 - a22 * a31, |
|
b10 = a21 * a33 - a23 * a31, |
|
b11 = a22 * a33 - a23 * a32; |
|
|
|
// Calculate the determinant |
|
return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; |
|
}; |
|
},{}],91:[function(require,module,exports){ |
|
module.exports = fromQuat; |
|
|
|
/** |
|
* Creates a matrix from a quaternion rotation. |
|
* |
|
* @param {mat4} out mat4 receiving operation result |
|
* @param {quat4} q Rotation quaternion |
|
* @returns {mat4} out |
|
*/ |
|
function fromQuat(out, q) { |
|
var x = q[0], y = q[1], z = q[2], w = q[3], |
|
x2 = x + x, |
|
y2 = y + y, |
|
z2 = z + z, |
|
|
|
xx = x * x2, |
|
yx = y * x2, |
|
yy = y * y2, |
|
zx = z * x2, |
|
zy = z * y2, |
|
zz = z * z2, |
|
wx = w * x2, |
|
wy = w * y2, |
|
wz = w * z2; |
|
|
|
out[0] = 1 - yy - zz; |
|
out[1] = yx + wz; |
|
out[2] = zx - wy; |
|
out[3] = 0; |
|
|
|
out[4] = yx - wz; |
|
out[5] = 1 - xx - zz; |
|
out[6] = zy + wx; |
|
out[7] = 0; |
|
|
|
out[8] = zx + wy; |
|
out[9] = zy - wx; |
|
out[10] = 1 - xx - yy; |
|
out[11] = 0; |
|
|
|
out[12] = 0; |
|
out[13] = 0; |
|
out[14] = 0; |
|
out[15] = 1; |
|
|
|
return out; |
|
}; |
|
},{}],92:[function(require,module,exports){ |
|
module.exports = fromRotationTranslation; |
|
|
|
/** |
|
* Creates a matrix from a quaternion rotation and vector translation |
|
* This is equivalent to (but much faster than): |
|
* |
|
* mat4.identity(dest); |
|
* mat4.translate(dest, vec); |
|
* var quatMat = mat4.create(); |
|
* quat4.toMat4(quat, quatMat); |
|
* mat4.multiply(dest, quatMat); |
|
* |
|
* @param {mat4} out mat4 receiving operation result |
|
* @param {quat4} q Rotation quaternion |
|
* @param {vec3} v Translation vector |
|
* @returns {mat4} out |
|
*/ |
|
function fromRotationTranslation(out, q, v) { |
|
// Quaternion math |
|
var x = q[0], y = q[1], z = q[2], w = q[3], |
|
x2 = x + x, |
|
y2 = y + y, |
|
z2 = z + z, |
|
|
|
xx = x * x2, |
|
xy = x * y2, |
|
xz = x * z2, |
|
yy = y * y2, |
|
yz = y * z2, |
|
zz = z * z2, |
|
wx = w * x2, |
|
wy = w * y2, |
|
wz = w * z2; |
|
|
|
out[0] = 1 - (yy + zz); |
|
out[1] = xy + wz; |
|
out[2] = xz - wy; |
|
out[3] = 0; |
|
out[4] = xy - wz; |
|
out[5] = 1 - (xx + zz); |
|
out[6] = yz + wx; |
|
out[7] = 0; |
|
out[8] = xz + wy; |
|
out[9] = yz - wx; |
|
out[10] = 1 - (xx + yy); |
|
out[11] = 0; |
|
out[12] = v[0]; |
|
out[13] = v[1]; |
|
out[14] = v[2]; |
|
out[15] = 1; |
|
|
|
return out; |
|
}; |
|
},{}],93:[function(require,module,exports){ |
|
module.exports = identity; |
|
|
|
/** |
|
* Set a mat4 to the identity matrix |
|
* |
|
* @param {mat4} out the receiving matrix |
|
* @returns {mat4} out |
|
*/ |
|
function identity(out) { |
|
out[0] = 1; |
|
out[1] = 0; |
|
out[2] = 0; |
|
out[3] = 0; |
|
out[4] = 0; |
|
out[5] = 1; |
|
out[6] = 0; |
|
out[7] = 0; |
|
out[8] = 0; |
|
out[9] = 0; |
|
out[10] = 1; |
|
out[11] = 0; |
|
out[12] = 0; |
|
out[13] = 0; |
|
out[14] = 0; |
|
out[15] = 1; |
|
return out; |
|
}; |
|
},{}],94:[function(require,module,exports){ |
|
module.exports = invert; |
|
|
|
/** |
|
* Inverts a mat4 |
|
* |
|
* @param {mat4} out the receiving matrix |
|
* @param {mat4} a the source matrix |
|
* @returns {mat4} out |
|
*/ |
|
function invert(out, a) { |
|
var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3], |
|
a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7], |
|
a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11], |
|
a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15], |
|
|
|
b00 = a00 * a11 - a01 * a10, |
|
b01 = a00 * a12 - a02 * a10, |
|
b02 = a00 * a13 - a03 * a10, |
|
b03 = a01 * a12 - a02 * a11, |
|
b04 = a01 * a13 - a03 * a11, |
|
b05 = a02 * a13 - a03 * a12, |
|
b06 = a20 * a31 - a21 * a30, |
|
b07 = a20 * a32 - a22 * a30, |
|
b08 = a20 * a33 - a23 * a30, |
|
b09 = a21 * a32 - a22 * a31, |
|
b10 = a21 * a33 - a23 * a31, |
|
b11 = a22 * a33 - a23 * a32, |
|
|
|
// Calculate the determinant |
|
det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; |
|
|
|
if (!det) { |
|
return null; |
|
} |
|
det = 1.0 / det; |
|
|
|
out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det; |
|
out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det; |
|
out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det; |
|
out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det; |
|
out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det; |
|
out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det; |
|
out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det; |
|
out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det; |
|
out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det; |
|
out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det; |
|
out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det; |
|
out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det; |
|
out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det; |
|
out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det; |
|
out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det; |
|
out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det; |
|
|
|
return out; |
|
}; |
|
},{}],95:[function(require,module,exports){ |
|
var identity = require('./identity'); |
|
|
|
module.exports = lookAt; |
|
|
|
/** |
|
* Generates a look-at matrix with the given eye position, focal point, and up axis |
|
* |
|
* @param {mat4} out mat4 frustum matrix will be written into |
|
* @param {vec3} eye Position of the viewer |
|
* @param {vec3} center Point the viewer is looking at |
|
* @param {vec3} up vec3 pointing up |
|
* @returns {mat4} out |
|
*/ |
|
function lookAt(out, eye, center, up) { |
|
var x0, x1, x2, y0, y1, y2, z0, z1, z2, len, |
|
eyex = eye[0], |
|
eyey = eye[1], |
|
eyez = eye[2], |
|
upx = up[0], |
|
upy = up[1], |
|
upz = up[2], |
|
centerx = center[0], |
|
centery = center[1], |
|
centerz = center[2]; |
|
|
|
if (Math.abs(eyex - centerx) < 0.000001 && |
|
Math.abs(eyey - centery) < 0.000001 && |
|
Math.abs(eyez - centerz) < 0.000001) { |
|
return identity(out); |
|
} |
|
|
|
z0 = eyex - centerx; |
|
z1 = eyey - centery; |
|
z2 = eyez - centerz; |
|
|
|
len = 1 / Math.sqrt(z0 * z0 + z1 * z1 + z2 * z2); |
|
z0 *= len; |
|
z1 *= len; |
|
z2 *= len; |
|
|
|
x0 = upy * z2 - upz * z1; |
|
x1 = upz * z0 - upx * z2; |
|
x2 = upx * z1 - upy * z0; |
|
len = Math.sqrt(x0 * x0 + x1 * x1 + x2 * x2); |
|
if (!len) { |
|
x0 = 0; |
|
x1 = 0; |
|
x2 = 0; |
|
} else { |
|
len = 1 / len; |
|
x0 *= len; |
|
x1 *= len; |
|
x2 *= len; |
|
} |
|
|
|
y0 = z1 * x2 - z2 * x1; |
|
y1 = z2 * x0 - z0 * x2; |
|
y2 = z0 * x1 - z1 * x0; |
|
|
|
len = Math.sqrt(y0 * y0 + y1 * y1 + y2 * y2); |
|
if (!len) { |
|
y0 = 0; |
|
y1 = 0; |
|
y2 = 0; |
|
} else { |
|
len = 1 / len; |
|
y0 *= len; |
|
y1 *= len; |
|
y2 *= len; |
|
} |
|
|
|
out[0] = x0; |
|
out[1] = y0; |
|
out[2] = z0; |
|
out[3] = 0; |
|
out[4] = x1; |
|
out[5] = y1; |
|
out[6] = z1; |
|
out[7] = 0; |
|
out[8] = x2; |
|
out[9] = y2; |
|
out[10] = z2; |
|
out[11] = 0; |
|
out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez); |
|
out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez); |
|
out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez); |
|
out[15] = 1; |
|
|
|
return out; |
|
}; |
|
},{"./identity":93}],96:[function(require,module,exports){ |
|
module.exports = multiply; |
|
|
|
/** |
|
* Multiplies two mat4's |
|
* |
|
* @param {mat4} out the receiving matrix |
|
* @param {mat4} a the first operand |
|
* @param {mat4} b the second operand |
|
* @returns {mat4} out |
|
*/ |
|
function multiply(out, a, b) { |
|
var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3], |
|
a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7], |
|
a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11], |
|
a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15]; |
|
|
|
// Cache only the current line of the second matrix |
|
var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3]; |
|
out[0] = b0*a00 + b1*a10 + b2*a20 + b3*a30; |
|
out[1] = b0*a01 + b1*a11 + b2*a21 + b3*a31; |
|
out[2] = b0*a02 + b1*a12 + b2*a22 + b3*a32; |
|
out[3] = b0*a03 + b1*a13 + b2*a23 + b3*a33; |
|
|
|
b0 = b[4]; b1 = b[5]; b2 = b[6]; b3 = b[7]; |
|
out[4] = b0*a00 + b1*a10 + b2*a20 + b3*a30; |
|
out[5] = b0*a01 + b1*a11 + b2*a21 + b3*a31; |
|
out[6] = b0*a02 + b1*a12 + b2*a22 + b3*a32; |
|
out[7] = b0*a03 + b1*a13 + b2*a23 + b3*a33; |
|
|
|
b0 = b[8]; b1 = b[9]; b2 = b[10]; b3 = b[11]; |
|
out[8] = b0*a00 + b1*a10 + b2*a20 + b3*a30; |
|
out[9] = b0*a01 + b1*a11 + b2*a21 + b3*a31; |
|
out[10] = b0*a02 + b1*a12 + b2*a22 + b3*a32; |
|
out[11] = b0*a03 + b1*a13 + b2*a23 + b3*a33; |
|
|
|
b0 = b[12]; b1 = b[13]; b2 = b[14]; b3 = b[15]; |
|
out[12] = b0*a00 + b1*a10 + b2*a20 + b3*a30; |
|
out[13] = b0*a01 + b1*a11 + b2*a21 + b3*a31; |
|
out[14] = b0*a02 + b1*a12 + b2*a22 + b3*a32; |
|
out[15] = b0*a03 + b1*a13 + b2*a23 + b3*a33; |
|
return out; |
|
}; |
|
},{}],97:[function(require,module,exports){ |
|
module.exports = perspective; |
|
|
|
/** |
|
* Generates a perspective projection matrix with the given bounds |
|
* |
|
* @param {mat4} out mat4 frustum matrix will be written into |
|
* @param {number} fovy Vertical field of view in radians |
|
* @param {number} aspect Aspect ratio. typically viewport width/height |
|
* @param {number} near Near bound of the frustum |
|
* @param {number} far Far bound of the frustum |
|
* @returns {mat4} out |
|
*/ |
|
function perspective(out, fovy, aspect, near, far) { |
|
var f = 1.0 / Math.tan(fovy / 2), |
|
nf = 1 / (near - far); |
|
out[0] = f / aspect; |
|
out[1] = 0; |
|
out[2] = 0; |
|
out[3] = 0; |
|
out[4] = 0; |
|
out[5] = f; |
|
out[6] = 0; |
|
out[7] = 0; |
|
out[8] = 0; |
|
out[9] = 0; |
|
out[10] = (far + near) * nf; |
|
out[11] = -1; |
|
out[12] = 0; |
|
out[13] = 0; |
|
out[14] = (2 * far * near) * nf; |
|
out[15] = 0; |
|
return out; |
|
}; |
|
},{}],98:[function(require,module,exports){ |
|
module.exports = rotate; |
|
|
|
/** |
|
* Rotates a mat4 by the given angle |
|
* |
|
* @param {mat4} out the receiving matrix |
|
* @param {mat4} a the matrix to rotate |
|
* @param {Number} rad the angle to rotate the matrix by |
|
* @param {vec3} axis the axis to rotate around |
|
* @returns {mat4} out |
|
*/ |
|
function rotate(out, a, rad, axis) { |
|
var x = axis[0], y = axis[1], z = axis[2], |
|
len = Math.sqrt(x * x + y * y + z * z), |
|
s, c, t, |
|
a00, a01, a02, a03, |
|
a10, a11, a12, a13, |
|
a20, a21, a22, a23, |
|
b00, b01, b02, |
|
b10, b11, b12, |
|
b20, b21, b22; |
|
|
|
if (Math.abs(len) < 0.000001) { return null; } |
|
|
|
len = 1 / len; |
|
x *= len; |
|
y *= len; |
|
z *= len; |
|
|
|
s = Math.sin(rad); |
|
c = Math.cos(rad); |
|
t = 1 - c; |
|
|
|
a00 = a[0]; a01 = a[1]; a02 = a[2]; a03 = a[3]; |
|
a10 = a[4]; a11 = a[5]; a12 = a[6]; a13 = a[7]; |
|
a20 = a[8]; a21 = a[9]; a22 = a[10]; a23 = a[11]; |
|
|
|
// Construct the elements of the rotation matrix |
|
b00 = x * x * t + c; b01 = y * x * t + z * s; b02 = z * x * t - y * s; |
|
b10 = x * y * t - z * s; b11 = y * y * t + c; b12 = z * y * t + x * s; |
|
b20 = x * z * t + y * s; b21 = y * z * t - x * s; b22 = z * z * t + c; |
|
|
|
// Perform rotation-specific matrix multiplication |
|
out[0] = a00 * b00 + a10 * b01 + a20 * b02; |
|
out[1] = a01 * b00 + a11 * b01 + a21 * b02; |
|
out[2] = a02 * b00 + a12 * b01 + a22 * b02; |
|
out[3] = a03 * b00 + a13 * b01 + a23 * b02; |
|
out[4] = a00 * b10 + a10 * b11 + a20 * b12; |
|
out[5] = a01 * b10 + a11 * b11 + a21 * b12; |
|
out[6] = a02 * b10 + a12 * b11 + a22 * b12; |
|
out[7] = a03 * b10 + a13 * b11 + a23 * b12; |
|
out[8] = a00 * b20 + a10 * b21 + a20 * b22; |
|
out[9] = a01 * b20 + a11 * b21 + a21 * b22; |
|
out[10] = a02 * b20 + a12 * b21 + a22 * b22; |
|
out[11] = a03 * b20 + a13 * b21 + a23 * b22; |
|
|
|
if (a !== out) { // If the source and destination differ, copy the unchanged last row |
|
out[12] = a[12]; |
|
out[13] = a[13]; |
|
out[14] = a[14]; |
|
out[15] = a[15]; |
|
} |
|
return out; |
|
}; |
|
},{}],99:[function(require,module,exports){ |
|
module.exports = rotateX; |
|
|
|
/** |
|
* Rotates a matrix by the given angle around the X axis |
|
* |
|
* @param {mat4} out the receiving matrix |
|
* @param {mat4} a the matrix to rotate |
|
* @param {Number} rad the angle to rotate the matrix by |
|
* @returns {mat4} out |
|
*/ |
|
function rotateX(out, a, rad) { |
|
var s = Math.sin(rad), |
|
c = Math.cos(rad), |
|
a10 = a[4], |
|
a11 = a[5], |
|
a12 = a[6], |
|
a13 = a[7], |
|
a20 = a[8], |
|
a21 = a[9], |
|
a22 = a[10], |
|
a23 = a[11]; |
|
|
|
if (a !== out) { // If the source and destination differ, copy the unchanged rows |
|
out[0] = a[0]; |
|
out[1] = a[1]; |
|
out[2] = a[2]; |
|
out[3] = a[3]; |
|
out[12] = a[12]; |
|
out[13] = a[13]; |
|
out[14] = a[14]; |
|
out[15] = a[15]; |
|
} |
|
|
|
// Perform axis-specific matrix multiplication |
|
out[4] = a10 * c + a20 * s; |
|
out[5] = a11 * c + a21 * s; |
|
out[6] = a12 * c + a22 * s; |
|
out[7] = a13 * c + a23 * s; |
|
out[8] = a20 * c - a10 * s; |
|
out[9] = a21 * c - a11 * s; |
|
out[10] = a22 * c - a12 * s; |
|
out[11] = a23 * c - a13 * s; |
|
return out; |
|
}; |
|
},{}],100:[function(require,module,exports){ |
|
module.exports = rotateY; |
|
|
|
/** |
|
* Rotates a matrix by the given angle around the Y axis |
|
* |
|
* @param {mat4} out the receiving matrix |
|
* @param {mat4} a the matrix to rotate |
|
* @param {Number} rad the angle to rotate the matrix by |
|
* @returns {mat4} out |
|
*/ |
|
function rotateY(out, a, rad) { |
|
var s = Math.sin(rad), |
|
c = Math.cos(rad), |
|
a00 = a[0], |
|
a01 = a[1], |
|
a02 = a[2], |
|
a03 = a[3], |
|
a20 = a[8], |
|
a21 = a[9], |
|
a22 = a[10], |
|
a23 = a[11]; |
|
|
|
if (a !== out) { // If the source and destination differ, copy the unchanged rows |
|
out[4] = a[4]; |
|
out[5] = a[5]; |
|
out[6] = a[6]; |
|
out[7] = a[7]; |
|
out[12] = a[12]; |
|
out[13] = a[13]; |
|
out[14] = a[14]; |
|
out[15] = a[15]; |
|
} |
|
|
|
// Perform axis-specific matrix multiplication |
|
out[0] = a00 * c - a20 * s; |
|
out[1] = a01 * c - a21 * s; |
|
out[2] = a02 * c - a22 * s; |
|
out[3] = a03 * c - a23 * s; |
|
out[8] = a00 * s + a20 * c; |
|
out[9] = a01 * s + a21 * c; |
|
out[10] = a02 * s + a22 * c; |
|
out[11] = a03 * s + a23 * c; |
|
return out; |
|
}; |
|
},{}],101:[function(require,module,exports){ |
|
module.exports = rotateZ; |
|
|
|
/** |
|
* Rotates a matrix by the given angle around the Z axis |
|
* |
|
* @param {mat4} out the receiving matrix |
|
* @param {mat4} a the matrix to rotate |
|
* @param {Number} rad the angle to rotate the matrix by |
|
* @returns {mat4} out |
|
*/ |
|
function rotateZ(out, a, rad) { |
|
var s = Math.sin(rad), |
|
c = Math.cos(rad), |
|
a00 = a[0], |
|
a01 = a[1], |
|
a02 = a[2], |
|
a03 = a[3], |
|
a10 = a[4], |
|
a11 = a[5], |
|
a12 = a[6], |
|
a13 = a[7]; |
|
|
|
if (a !== out) { // If the source and destination differ, copy the unchanged last row |
|
out[8] = a[8]; |
|
out[9] = a[9]; |
|
out[10] = a[10]; |
|
out[11] = a[11]; |
|
out[12] = a[12]; |
|
out[13] = a[13]; |
|
out[14] = a[14]; |
|
out[15] = a[15]; |
|
} |
|
|
|
// Perform axis-specific matrix multiplication |
|
out[0] = a00 * c + a10 * s; |
|
out[1] = a01 * c + a11 * s; |
|
out[2] = a02 * c + a12 * s; |
|
out[3] = a03 * c + a13 * s; |
|
out[4] = a10 * c - a00 * s; |
|
out[5] = a11 * c - a01 * s; |
|
out[6] = a12 * c - a02 * s; |
|
out[7] = a13 * c - a03 * s; |
|
return out; |
|
}; |
|
},{}],102:[function(require,module,exports){ |
|
module.exports = scale; |
|
|
|
/** |
|
* Scales the mat4 by the dimensions in the given vec3 |
|
* |
|
* @param {mat4} out the receiving matrix |
|
* @param {mat4} a the matrix to scale |
|
* @param {vec3} v the vec3 to scale the matrix by |
|
* @returns {mat4} out |
|
**/ |
|
function scale(out, a, v) { |
|
var x = v[0], y = v[1], z = v[2]; |
|
|
|
out[0] = a[0] * x; |
|
out[1] = a[1] * x; |
|
out[2] = a[2] * x; |
|
out[3] = a[3] * x; |
|
out[4] = a[4] * y; |
|
out[5] = a[5] * y; |
|
out[6] = a[6] * y; |
|
out[7] = a[7] * y; |
|
out[8] = a[8] * z; |
|
out[9] = a[9] * z; |
|
out[10] = a[10] * z; |
|
out[11] = a[11] * z; |
|
out[12] = a[12]; |
|
out[13] = a[13]; |
|
out[14] = a[14]; |
|
out[15] = a[15]; |
|
return out; |
|
}; |
|
},{}],103:[function(require,module,exports){ |
|
module.exports = translate; |
|
|
|
/** |
|
* Translate a mat4 by the given vector |
|
* |
|
* @param {mat4} out the receiving matrix |
|
* @param {mat4} a the matrix to translate |
|
* @param {vec3} v vector to translate by |
|
* @returns {mat4} out |
|
*/ |
|
function translate(out, a, v) { |
|
var x = v[0], y = v[1], z = v[2], |
|
a00, a01, a02, a03, |
|
a10, a11, a12, a13, |
|
a20, a21, a22, a23; |
|
|
|
if (a === out) { |
|
out[12] = a[0] * x + a[4] * y + a[8] * z + a[12]; |
|
out[13] = a[1] * x + a[5] * y + a[9] * z + a[13]; |
|
out[14] = a[2] * x + a[6] * y + a[10] * z + a[14]; |
|
out[15] = a[3] * x + a[7] * y + a[11] * z + a[15]; |
|
} else { |
|
a00 = a[0]; a01 = a[1]; a02 = a[2]; a03 = a[3]; |
|
a10 = a[4]; a11 = a[5]; a12 = a[6]; a13 = a[7]; |
|
a20 = a[8]; a21 = a[9]; a22 = a[10]; a23 = a[11]; |
|
|
|
out[0] = a00; out[1] = a01; out[2] = a02; out[3] = a03; |
|
out[4] = a10; out[5] = a11; out[6] = a12; out[7] = a13; |
|
out[8] = a20; out[9] = a21; out[10] = a22; out[11] = a23; |
|
|
|
out[12] = a00 * x + a10 * y + a20 * z + a[12]; |
|
out[13] = a01 * x + a11 * y + a21 * z + a[13]; |
|
out[14] = a02 * x + a12 * y + a22 * z + a[14]; |
|
out[15] = a03 * x + a13 * y + a23 * z + a[15]; |
|
} |
|
|
|
return out; |
|
}; |
|
},{}],104:[function(require,module,exports){ |
|
module.exports = transpose; |
|
|
|
/** |
|
* Transpose the values of a mat4 |
|
* |
|
* @param {mat4} out the receiving matrix |
|
* @param {mat4} a the source matrix |
|
* @returns {mat4} out |
|
*/ |
|
function transpose(out, a) { |
|
// If we are transposing ourselves we can skip a few steps but have to cache some values |
|
if (out === a) { |
|
var a01 = a[1], a02 = a[2], a03 = a[3], |
|
a12 = a[6], a13 = a[7], |
|
a23 = a[11]; |
|
|
|
out[1] = a[4]; |
|
out[2] = a[8]; |
|
out[3] = a[12]; |
|
out[4] = a01; |
|
out[6] = a[9]; |
|
out[7] = a[13]; |
|
out[8] = a02; |
|
out[9] = a12; |
|
out[11] = a[14]; |
|
out[12] = a03; |
|
out[13] = a13; |
|
out[14] = a23; |
|
} else { |
|
out[0] = a[0]; |
|
out[1] = a[4]; |
|
out[2] = a[8]; |
|
out[3] = a[12]; |
|
out[4] = a[1]; |
|
out[5] = a[5]; |
|
out[6] = a[9]; |
|
out[7] = a[13]; |
|
out[8] = a[2]; |
|
out[9] = a[6]; |
|
out[10] = a[10]; |
|
out[11] = a[14]; |
|
out[12] = a[3]; |
|
out[13] = a[7]; |
|
out[14] = a[11]; |
|
out[15] = a[15]; |
|
} |
|
|
|
return out; |
|
}; |
|
},{}],105:[function(require,module,exports){ |
|
module.exports = slerp |
|
|
|
/** |
|
* Performs a spherical linear interpolation between two quat |
|
* |
|
* @param {quat} out the receiving quaternion |
|
* @param {quat} a the first operand |
|
* @param {quat} b the second operand |
|
* @param {Number} t interpolation amount between the two inputs |
|
* @returns {quat} out |
|
*/ |
|
function slerp (out, a, b, t) { |
|
// benchmarks: |
|
// http://jsperf.com/quaternion-slerp-implementations |
|
|
|
var ax = a[0], ay = a[1], az = a[2], aw = a[3], |
|
bx = b[0], by = b[1], bz = b[2], bw = b[3] |
|
|
|
var omega, cosom, sinom, scale0, scale1 |
|
|
|
// calc cosine |
|
cosom = ax * bx + ay * by + az * bz + aw * bw |
|
// adjust signs (if necessary) |
|
if (cosom < 0.0) { |
|
cosom = -cosom |
|
bx = -bx |
|
by = -by |
|
bz = -bz |
|
bw = -bw |
|
} |
|
// calculate coefficients |
|
if ((1.0 - cosom) > 0.000001) { |
|
// standard case (slerp) |
|
omega = Math.acos(cosom) |
|
sinom = Math.sin(omega) |
|
scale0 = Math.sin((1.0 - t) * omega) / sinom |
|
scale1 = Math.sin(t * omega) / sinom |
|
} else { |
|
// "from" and "to" quaternions are very close |
|
// ... so we can do a linear interpolation |
|
scale0 = 1.0 - t |
|
scale1 = t |
|
} |
|
// calculate final values |
|
out[0] = scale0 * ax + scale1 * bx |
|
out[1] = scale0 * ay + scale1 * by |
|
out[2] = scale0 * az + scale1 * bz |
|
out[3] = scale0 * aw + scale1 * bw |
|
|
|
return out |
|
} |
|
|
|
},{}],106:[function(require,module,exports){ |
|
'use strict' |
|
|
|
module.exports = createSelectBuffer |
|
|
|
var createFBO = require('gl-fbo') |
|
var pool = require('typedarray-pool') |
|
var ndarray = require('ndarray') |
|
|
|
var nextPow2 = require('bit-twiddle').nextPow2 |
|
|
|
var selectRange = require('cwise/lib/wrapper')({"args":["array",{"offset":[0,0,1],"array":0},{"offset":[0,0,2],"array":0},{"offset":[0,0,3],"array":0},"scalar","scalar","index"],"pre":{"body":"{this_closestD2=1e8,this_closestX=-1,this_closestY=-1}","args":[],"thisVars":["this_closestD2","this_closestX","this_closestY"],"localVars":[]},"body":{"body":"{if(_inline_1_arg0_<255||_inline_1_arg1_<255||_inline_1_arg2_<255||_inline_1_arg3_<255){var _inline_1_l=_inline_1_arg4_-_inline_1_arg6_[0],_inline_1_a=_inline_1_arg5_-_inline_1_arg6_[1],_inline_1_f=_inline_1_l*_inline_1_l+_inline_1_a*_inline_1_a;_inline_1_f<this_closestD2&&(this_closestD2=_inline_1_f,this_closestX=_inline_1_arg6_[0],this_closestY=_inline_1_arg6_[1])}}","args":[{"name":"_inline_1_arg0_","lvalue":false,"rvalue":true,"count":1},{"name":"_inline_1_arg1_","lvalue":false,"rvalue":true,"count":1},{"name":"_inline_1_arg2_","lvalue":false,"rvalue":true,"count":1},{"name":"_inline_1_arg3_","lvalue":false,"rvalue":true,"count":1},{"name":"_inline_1_arg4_","lvalue":false,"rvalue":true,"count":1},{"name":"_inline_1_arg5_","lvalue":false,"rvalue":true,"count":1},{"name":"_inline_1_arg6_","lvalue":false,"rvalue":true,"count":4}],"thisVars":["this_closestD2","this_closestX","this_closestY"],"localVars":["_inline_1_a","_inline_1_f","_inline_1_l"]},"post":{"body":"{return[this_closestX,this_closestY,this_closestD2]}","args":[],"thisVars":["this_closestD2","this_closestX","this_closestY"],"localVars":[]},"debug":false,"funcName":"cwise","blockSize":64}) |
|
|
|
function SelectResult(x, y, id, value, distance) { |
|
this.coord = [x, y] |
|
this.id = id |
|
this.value = value |
|
this.distance = distance |
|
} |
|
|
|
function SelectBuffer(gl, fbo, buffer) { |
|
this.gl = gl |
|
this.fbo = fbo |
|
this.buffer = buffer |
|
this._readTimeout = null |
|
var self = this |
|
|
|
this._readCallback = function() { |
|
if(!self.gl) { |
|
return |
|
} |
|
fbo.bind() |
|
gl.readPixels(0,0,fbo.shape[0],fbo.shape[1],gl.RGBA,gl.UNSIGNED_BYTE,self.buffer) |
|
self._readTimeout = null |
|
} |
|
} |
|
|
|
var proto = SelectBuffer.prototype |
|
|
|
Object.defineProperty(proto, 'shape', { |
|
get: function() { |
|
if(!this.gl) { |
|
return [0,0] |
|
} |
|
return this.fbo.shape.slice() |
|
}, |
|
set: function(v) { |
|
if(!this.gl) { |
|
return |
|
} |
|
this.fbo.shape = v |
|
var c = this.fbo.shape[0] |
|
var r = this.fbo.shape[1] |
|
if(r*c*4 > this.buffer.length) { |
|
pool.free(this.buffer) |
|
var buffer = this.buffer = pool.mallocUint8(nextPow2(r*c*4)) |
|
for(var i=0; i<r*c*4; ++i) { |
|
buffer[i] = 0xff |
|
} |
|
} |
|
return v |
|
} |
|
}) |
|
|
|
proto.begin = function() { |
|
var gl = this.gl |
|
var shape = this.shape |
|
if(!gl) { |
|
return |
|
} |
|
|
|
this.fbo.bind() |
|
gl.clearColor(1,1,1,1) |
|
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) |
|
} |
|
|
|
proto.end = function() { |
|
var gl = this.gl |
|
if(!gl) { |
|
return |
|
} |
|
gl.bindFramebuffer(gl.FRAMEBUFFER, null) |
|
if(!this._readTimeout) { |
|
clearTimeout(this._readTimeout) |
|
} |
|
this._readTimeout = setTimeout(this._readCallback, 1) |
|
} |
|
|
|
proto.query = function(x, y, radius) { |
|
if(!this.gl) { |
|
return null |
|
} |
|
|
|
var shape = this.fbo.shape.slice() |
|
|
|
x = x|0 |
|
y = y|0 |
|
if(typeof radius !== 'number') { |
|
radius = 1.0 |
|
} |
|
|
|
var x0 = Math.min(Math.max(x - radius, 0), shape[0])|0 |
|
var x1 = Math.min(Math.max(x + radius, 0), shape[0])|0 |
|
var y0 = Math.min(Math.max(y - radius, 0), shape[1])|0 |
|
var y1 = Math.min(Math.max(y + radius, 0), shape[1])|0 |
|
|
|
if(x1 <= x0 || y1 <= y0) { |
|
return null |
|
} |
|
|
|
var dims = [x1-x0,y1-y0] |
|
var region = ndarray( |
|
this.buffer, |
|
[dims[0], dims[1], 4], |
|
[4, shape[0]*4, 1], |
|
4*(x0 + shape[0]*y0)); |
|
|
|
var closest = selectRange(region.hi(dims[0],dims[1],1), radius, radius) |
|
var dx = closest[0] |
|
var dy = closest[1] |
|
if(dx < 0 || Math.pow(this.radius, 2) < closest[2]) { |
|
return null |
|
} |
|
|
|
var c0 = region.get(dx, dy, 0) |
|
var c1 = region.get(dx, dy, 1) |
|
var c2 = region.get(dx, dy, 2) |
|
var c3 = region.get(dx, dy, 3) |
|
|
|
return new SelectResult( |
|
(dx + x0)|0, |
|
(dy + y0)|0, |
|
c0, |
|
[c1, c2, c3], |
|
Math.sqrt(closest[2])) |
|
} |
|
|
|
proto.dispose = function() { |
|
if(!this.gl) { |
|
return |
|
} |
|
this.fbo.dispose() |
|
pool.free(this.buffer) |
|
this.gl = null |
|
if(this._readTimeout) { |
|
clearTimeout(this._readTimeout) |
|
} |
|
} |
|
|
|
function createSelectBuffer(gl, shape) { |
|
var fbo = createFBO(gl, shape) |
|
var buffer = pool.mallocUint8(shape[0]*shape[1]*4) |
|
return new SelectBuffer(gl, fbo, buffer) |
|
} |
|
|
|
},{"bit-twiddle":36,"cwise/lib/wrapper":68,"gl-fbo":86,"ndarray":208,"typedarray-pool":257}],107:[function(require,module,exports){ |
|
'use strict' |
|
|
|
var createUniformWrapper = require('./lib/create-uniforms') |
|
var createAttributeWrapper = require('./lib/create-attributes') |
|
var makeReflect = require('./lib/reflect') |
|
var shaderCache = require('./lib/shader-cache') |
|
var runtime = require('./lib/runtime-reflect') |
|
var GLError = require("./lib/GLError") |
|
|
|
//Shader object |
|
function Shader(gl) { |
|
this.gl = gl |
|
this.gl.lastAttribCount = 0 // fixme where else should we store info, safe but not nice on the gl object |
|
|
|
//Default initialize these to null |
|
this._vref = |
|
this._fref = |
|
this._relink = |
|
this.vertShader = |
|
this.fragShader = |
|
this.program = |
|
this.attributes = |
|
this.uniforms = |
|
this.types = null |
|
} |
|
|
|
var proto = Shader.prototype |
|
|
|
proto.bind = function() { |
|
if(!this.program) { |
|
this._relink() |
|
} |
|
|
|
// ensuring that we have the right number of enabled vertex attributes |
|
var i |
|
var newAttribCount = this.gl.getProgramParameter(this.program, this.gl.ACTIVE_ATTRIBUTES) // more robust approach |
|
//var newAttribCount = Object.keys(this.attributes).length // avoids the probably immaterial introspection slowdown |
|
var oldAttribCount = this.gl.lastAttribCount |
|
if(newAttribCount > oldAttribCount) { |
|
for(i = oldAttribCount; i < newAttribCount; i++) { |
|
this.gl.enableVertexAttribArray(i) |
|
} |
|
} else if(oldAttribCount > newAttribCount) { |
|
for(i = newAttribCount; i < oldAttribCount; i++) { |
|
this.gl.disableVertexAttribArray(i) |
|
} |
|
} |
|
|
|
this.gl.lastAttribCount = newAttribCount |
|
|
|
this.gl.useProgram(this.program) |
|
} |
|
|
|
proto.dispose = function() { |
|
|
|
// disabling vertex attributes so new shader starts with zero |
|
// and it's also useful if all shaders are disposed but the |
|
// gl context is reused for subsequent replotting |
|
var oldAttribCount = this.gl.lastAttribCount |
|
for (var i = 0; i < oldAttribCount; i++) { |
|
this.gl.disableVertexAttribArray(i) |
|
} |
|
this.gl.lastAttribCount = 0 |
|
|
|
if(this._fref) { |
|
this._fref.dispose() |
|
} |
|
if(this._vref) { |
|
this._vref.dispose() |
|
} |
|
this.attributes = |
|
this.types = |
|
this.vertShader = |
|
this.fragShader = |
|
this.program = |
|
this._relink = |
|
this._fref = |
|
this._vref = null |
|
} |
|
|
|
function compareAttributes(a, b) { |
|
if(a.name < b.name) { |
|
return -1 |
|
} |
|
return 1 |
|
} |
|
|
|
//Update export hook for glslify-live |
|
proto.update = function( |
|
vertSource |
|
, fragSource |
|
, uniforms |
|
, attributes) { |
|
|
|
//If only one object passed, assume glslify style output |
|
if(!fragSource || arguments.length === 1) { |
|
var obj = vertSource |
|
vertSource = obj.vertex |
|
fragSource = obj.fragment |
|
uniforms = obj.uniforms |
|
attributes = obj.attributes |
|
} |
|
|
|
var wrapper = this |
|
var gl = wrapper.gl |
|
|
|
//Compile vertex and fragment shaders |
|
var pvref = wrapper._vref |
|
wrapper._vref = shaderCache.shader(gl, gl.VERTEX_SHADER, vertSource) |
|
if(pvref) { |
|
pvref.dispose() |
|
} |
|
wrapper.vertShader = wrapper._vref.shader |
|
var pfref = this._fref |
|
wrapper._fref = shaderCache.shader(gl, gl.FRAGMENT_SHADER, fragSource) |
|
if(pfref) { |
|
pfref.dispose() |
|
} |
|
wrapper.fragShader = wrapper._fref.shader |
|
|
|
//If uniforms/attributes is not specified, use RT reflection |
|
if(!uniforms || !attributes) { |
|
|
|
//Create initial test program |
|
var testProgram = gl.createProgram() |
|
gl.attachShader(testProgram, wrapper.fragShader) |
|
gl.attachShader(testProgram, wrapper.vertShader) |
|
gl.linkProgram(testProgram) |
|
if(!gl.getProgramParameter(testProgram, gl.LINK_STATUS)) { |
|
var errLog = gl.getProgramInfoLog(testProgram) |
|
throw new GLError(errLog, 'Error linking program:' + errLog) |
|
} |
|
|
|
//Load data from runtime |
|
uniforms = uniforms || runtime.uniforms(gl, testProgram) |
|
attributes = attributes || runtime.attributes(gl, testProgram) |
|
|
|
//Release test program |
|
gl.deleteProgram(testProgram) |
|
} |
|
|
|
//Sort attributes lexicographically |
|
// overrides undefined WebGL behavior for attribute locations |
|
attributes = attributes.slice() |
|
attributes.sort(compareAttributes) |
|
|
|
//Convert attribute types, read out locations |
|
var attributeUnpacked = [] |
|
var attributeNames = [] |
|
var attributeLocations = [] |
|
var i |
|
for(i=0; i<attributes.length; ++i) { |
|
var attr = attributes[i] |
|
if(attr.type.indexOf('mat') >= 0) { |
|
var size = attr.type.charAt(attr.type.length-1)|0 |
|
var locVector = new Array(size) |
|
for(var j=0; j<size; ++j) { |
|
locVector[j] = attributeLocations.length |
|
attributeNames.push(attr.name + '[' + j + ']') |
|
if(typeof attr.location === 'number') { |
|
attributeLocations.push(attr.location + j) |
|
} else if(Array.isArray(attr.location) && |
|
attr.location.length === size && |
|
typeof attr.location[j] === 'number') { |
|
attributeLocations.push(attr.location[j]|0) |
|
} else { |
|
attributeLocations.push(-1) |
|
} |
|
} |
|
attributeUnpacked.push({ |
|
name: attr.name, |
|
type: attr.type, |
|
locations: locVector |
|
}) |
|
} else { |
|
attributeUnpacked.push({ |
|
name: attr.name, |
|
type: attr.type, |
|
locations: [ attributeLocations.length ] |
|
}) |
|
attributeNames.push(attr.name) |
|
if(typeof attr.location === 'number') { |
|
attributeLocations.push(attr.location|0) |
|
} else { |
|
attributeLocations.push(-1) |
|
} |
|
} |
|
} |
|
|
|
//For all unspecified attributes, assign them lexicographically min attribute |
|
var curLocation = 0 |
|
for(i=0; i<attributeLocations.length; ++i) { |
|
if(attributeLocations[i] < 0) { |
|
while(attributeLocations.indexOf(curLocation) >= 0) { |
|
curLocation += 1 |
|
} |
|
attributeLocations[i] = curLocation |
|
} |
|
} |
|
|
|
//Rebuild program and recompute all uniform locations |
|
var uniformLocations = new Array(uniforms.length) |
|
function relink() { |
|
wrapper.program = shaderCache.program( |
|
gl |
|
, wrapper._vref |
|
, wrapper._fref |
|
, attributeNames |
|
, attributeLocations) |
|
|
|
for(var i=0; i<uniforms.length; ++i) { |
|
uniformLocations[i] = gl.getUniformLocation( |
|
wrapper.program |
|
, uniforms[i].name) |
|
} |
|
} |
|
|
|
//Perform initial linking, reuse program used for reflection |
|
relink() |
|
|
|
//Save relinking procedure, defer until runtime |
|
wrapper._relink = relink |
|
|
|
//Generate type info |
|
wrapper.types = { |
|
uniforms: makeReflect(uniforms), |
|
attributes: makeReflect(attributes) |
|
} |
|
|
|
//Generate attribute wrappers |
|
wrapper.attributes = createAttributeWrapper( |
|
gl |
|
, wrapper |
|
, attributeUnpacked |
|
, attributeLocations) |
|
|
|
//Generate uniform wrappers |
|
Object.defineProperty(wrapper, 'uniforms', createUniformWrapper( |
|
gl |
|
, wrapper |
|
, uniforms |
|
, uniformLocations)) |
|
} |
|
|
|
//Compiles and links a shader program with the given attribute and vertex list |
|
function createShader( |
|
gl |
|
, vertSource |
|
, fragSource |
|
, uniforms |
|
, attributes) { |
|
|
|
var shader = new Shader(gl) |
|
|
|
shader.update( |
|
vertSource |
|
, fragSource |
|
, uniforms |
|
, attributes) |
|
|
|
return shader |
|
} |
|
|
|
module.exports = createShader |
|
|
|
},{"./lib/GLError":108,"./lib/create-attributes":109,"./lib/create-uniforms":110,"./lib/reflect":111,"./lib/runtime-reflect":112,"./lib/shader-cache":113}],108:[function(require,module,exports){ |
|
function GLError (rawError, shortMessage, longMessage) { |
|
this.shortMessage = shortMessage || '' |
|
this.longMessage = longMessage || '' |
|
this.rawError = rawError || '' |
|
this.message = |
|
'gl-shader: ' + (shortMessage || rawError || '') + |
|
(longMessage ? '\n'+longMessage : '') |
|
this.stack = (new Error()).stack |
|
} |
|
GLError.prototype = new Error |
|
GLError.prototype.name = 'GLError' |
|
GLError.prototype.constructor = GLError |
|
module.exports = GLError |
|
|
|
},{}],109:[function(require,module,exports){ |
|
'use strict' |
|
|
|
module.exports = createAttributeWrapper |
|
|
|
var GLError = require("./GLError") |
|
|
|
function ShaderAttribute( |
|
gl |
|
, wrapper |
|
, index |
|
, locations |
|
, dimension |
|
, constFunc) { |
|
this._gl = gl |
|
this._wrapper = wrapper |
|
this._index = index |
|
this._locations = locations |
|
this._dimension = dimension |
|
this._constFunc = constFunc |
|
} |
|
|
|
var proto = ShaderAttribute.prototype |
|
|
|
proto.pointer = function setAttribPointer( |
|
type |
|
, normalized |
|
, stride |
|
, offset) { |
|
|
|
var self = this |
|
var gl = self._gl |
|
var location = self._locations[self._index] |
|
|
|
gl.vertexAttribPointer( |
|
location |
|
, self._dimension |
|
, type || gl.FLOAT |
|
, !!normalized |
|
, stride || 0 |
|
, offset || 0) |
|
gl.enableVertexAttribArray(location) |
|
} |
|
|
|
proto.set = function(x0, x1, x2, x3) { |
|
return this._constFunc(this._locations[this._index], x0, x1, x2, x3) |
|
} |
|
|
|
Object.defineProperty(proto, 'location', { |
|
get: function() { |
|
return this._locations[this._index] |
|
} |
|
, set: function(v) { |
|
if(v !== this._locations[this._index]) { |
|
this._locations[this._index] = v|0 |
|
this._wrapper.program = null |
|
} |
|
return v|0 |
|
} |
|
}) |
|
|
|
//Adds a vector attribute to obj |
|
function addVectorAttribute( |
|
gl |
|
, wrapper |
|
, index |
|
, locations |
|
, dimension |
|
, obj |
|
, name) { |
|
|
|
//Construct constant function |
|
var constFuncArgs = [ 'gl', 'v' ] |
|
var varNames = [] |
|
for(var i=0; i<dimension; ++i) { |
|
constFuncArgs.push('x'+i) |
|
varNames.push('x'+i) |
|
} |
|
constFuncArgs.push( |
|
'if(x0.length===void 0){return gl.vertexAttrib' + |
|
dimension + 'f(v,' + |
|
varNames.join() + |
|
')}else{return gl.vertexAttrib' + |
|
dimension + |
|
'fv(v,x0)}') |
|
var constFunc = Function.apply(null, constFuncArgs) |
|
|
|
//Create attribute wrapper |
|
var attr = new ShaderAttribute( |
|
gl |
|
, wrapper |
|
, index |
|
, locations |
|
, dimension |
|
, constFunc) |
|
|
|
//Create accessor |
|
Object.defineProperty(obj, name, { |
|
set: function(x) { |
|
gl.disableVertexAttribArray(locations[index]) |
|
constFunc(gl, locations[index], x) |
|
return x |
|
} |
|
, get: function() { |
|
return attr |
|
} |
|
, enumerable: true |
|
}) |
|
} |
|
|
|
function addMatrixAttribute( |
|
gl |
|
, wrapper |
|
, index |
|
, locations |
|
, dimension |
|
, obj |
|
, name) { |
|
|
|
var parts = new Array(dimension) |
|
var attrs = new Array(dimension) |
|
for(var i=0; i<dimension; ++i) { |
|
addVectorAttribute( |
|
gl |
|
, wrapper |
|
, index[i] |
|
, locations |
|
, dimension |
|
, parts |
|
, i) |
|
attrs[i] = parts[i] |
|
} |
|
|
|
Object.defineProperty(parts, 'location', { |
|
set: function(v) { |
|
if(Array.isArray(v)) { |
|
for(var i=0; i<dimension; ++i) { |
|
attrs[i].location = v[i] |
|
} |
|
} else { |
|
for(var i=0; i<dimension; ++i) { |
|
attrs[i].location = v + i |
|
} |
|
} |
|
return v |
|
} |
|
, get: function() { |
|
var result = new Array(dimension) |
|
for(var i=0; i<dimension; ++i) { |
|
result[i] = locations[index[i]] |
|
} |
|
return result |
|
} |
|
, enumerable: true |
|
}) |
|
|
|
parts.pointer = function(type, normalized, stride, offset) { |
|
type = type || gl.FLOAT |
|
normalized = !!normalized |
|
stride = stride || (dimension * dimension) |
|
offset = offset || 0 |
|
for(var i=0; i<dimension; ++i) { |
|
var location = locations[index[i]] |
|
gl.vertexAttribPointer( |
|
location |
|
, dimension |
|
, type |
|
, normalized |
|
, stride |
|
, offset + i * dimension) |
|
gl.enableVertexAttribArray(location) |
|
} |
|
} |
|
|
|
var scratch = new Array(dimension) |
|
var vertexAttrib = gl['vertexAttrib' + dimension + 'fv'] |
|
|
|
Object.defineProperty(obj, name, { |
|
set: function(x) { |
|
for(var i=0; i<dimension; ++i) { |
|
var loc = locations[index[i]] |
|
gl.disableVertexAttribArray(loc) |
|
if(Array.isArray(x[0])) { |
|
vertexAttrib.call(gl, loc, x[i]) |
|
} else { |
|
for(var j=0; j<dimension; ++j) { |
|
scratch[j] = x[dimension*i + j] |
|
} |
|
vertexAttrib.call(gl, loc, scratch) |
|
} |
|
} |
|
return x |
|
} |
|
, get: function() { |
|
return parts |
|
} |
|
, enumerable: true |
|
}) |
|
} |
|
|
|
//Create shims for attributes |
|
function createAttributeWrapper( |
|
gl |
|
, wrapper |
|
, attributes |
|
, locations) { |
|
|
|
var obj = {} |
|
for(var i=0, n=attributes.length; i<n; ++i) { |
|
|
|
var a = attributes[i] |
|
var name = a.name |
|
var type = a.type |
|
var locs = a.locations |
|
|
|
switch(type) { |
|
case 'bool': |
|
case 'int': |
|
case 'float': |
|
addVectorAttribute( |
|
gl |
|
, wrapper |
|
, locs[0] |
|
, locations |
|
, 1 |
|
, obj |
|
, name) |
|
break |
|
|
|
default: |
|
if(type.indexOf('vec') >= 0) { |
|
var d = type.charCodeAt(type.length-1) - 48 |
|
if(d < 2 || d > 4) { |
|
throw new GLError('', 'Invalid data type for attribute ' + name + ': ' + type) |
|
} |
|
addVectorAttribute( |
|
gl |
|
, wrapper |
|
, locs[0] |
|
, locations |
|
, d |
|
, obj |
|
, name) |
|
} else if(type.indexOf('mat') >= 0) { |
|
var d = type.charCodeAt(type.length-1) - 48 |
|
if(d < 2 || d > 4) { |
|
throw new GLError('', 'Invalid data type for attribute ' + name + ': ' + type) |
|
} |
|
addMatrixAttribute( |
|
gl |
|
, wrapper |
|
, locs |
|
, locations |
|
, d |
|
, obj |
|
, name) |
|
} else { |
|
throw new GLError('', 'Unknown data type for attribute ' + name + ': ' + type) |
|
} |
|
break |
|
} |
|
} |
|
return obj |
|
} |
|
|
|
},{"./GLError":108}],110:[function(require,module,exports){ |
|
'use strict' |
|
|
|
var coallesceUniforms = require('./reflect') |
|
var GLError = require("./GLError") |
|
|
|
module.exports = createUniformWrapper |
|
|
|
//Binds a function and returns a value |
|
function identity(x) { |
|
var c = new Function('y', 'return function(){return y}') |
|
return c(x) |
|
} |
|
|
|
function makeVector(length, fill) { |
|
var result = new Array(length) |
|
for(var i=0; i<length; ++i) { |
|
result[i] = fill |
|
} |
|
return result |
|
} |
|
|
|
//Create shims for uniforms |
|
function createUniformWrapper(gl, wrapper, uniforms, locations) { |
|
|
|
function makeGetter(index) { |
|
var proc = new Function( |
|
'gl' |
|
, 'wrapper' |
|
, 'locations' |
|
, 'return function(){return gl.getUniform(wrapper.program,locations[' + index + '])}') |
|
return proc(gl, wrapper, locations) |
|
} |
|
|
|
function makePropSetter(path, index, type) { |
|
switch(type) { |
|
case 'bool': |
|
case 'int': |
|
case 'sampler2D': |
|
case 'samplerCube': |
|
return 'gl.uniform1i(locations[' + index + '],obj' + path + ')' |
|
case 'float': |
|
return 'gl.uniform1f(locations[' + index + '],obj' + path + ')' |
|
default: |
|
var vidx = type.indexOf('vec') |
|
if(0 <= vidx && vidx <= 1 && type.length === 4 + vidx) { |
|
var d = type.charCodeAt(type.length-1) - 48 |
|
if(d < 2 || d > 4) { |
|
throw new GLError('', 'Invalid data type') |
|
} |
|
switch(type.charAt(0)) { |
|
case 'b': |
|
case 'i': |
|
return 'gl.uniform' + d + 'iv(locations[' + index + '],obj' + path + ')' |
|
case 'v': |
|
return 'gl.uniform' + d + 'fv(locations[' + index + '],obj' + path + ')' |
|
default: |
|
throw new GLError('', 'Unrecognized data type for vector ' + name + ': ' + type) |
|
} |
|
} else if(type.indexOf('mat') === 0 && type.length === 4) { |
|
var d = type.charCodeAt(type.length-1) - 48 |
|
if(d < 2 || d > 4) { |
|
throw new GLError('', 'Invalid uniform dimension type for matrix ' + name + ': ' + type) |
|
} |
|
return 'gl.uniformMatrix' + d + 'fv(locations[' + index + '],false,obj' + path + ')' |
|
} else { |
|
throw new GLError('', 'Unknown uniform data type for ' + name + ': ' + type) |
|
} |
|
break |
|
} |
|
} |
|
|
|
function enumerateIndices(prefix, type) { |
|
if(typeof type !== 'object') { |
|
return [ [prefix, type] ] |
|
} |
|
var indices = [] |
|
for(var id in type) { |
|
var prop = type[id] |
|
var tprefix = prefix |
|
if(parseInt(id) + '' === id) { |
|
tprefix += '[' + id + ']' |
|
} else { |
|
tprefix += '.' + id |
|
} |
|
if(typeof prop === 'object') { |
|
indices.push.apply(indices, enumerateIndices(tprefix, prop)) |
|
} else { |
|
indices.push([tprefix, prop]) |
|
} |
|
} |
|
return indices |
|
} |
|
|
|
function makeSetter(type) { |
|
var code = [ 'return function updateProperty(obj){' ] |
|
var indices = enumerateIndices('', type) |
|
for(var i=0; i<indices.length; ++i) { |
|
var item = indices[i] |
|
var path = item[0] |
|
var idx = item[1] |
|
if(locations[idx]) { |
|
code.push(makePropSetter(path, idx, uniforms[idx].type)) |
|
} |
|
} |
|
code.push('return obj}') |
|
var proc = new Function('gl', 'locations', code.join('\n')) |
|
return proc(gl, locations) |
|
} |
|
|
|
function defaultValue(type) { |
|
switch(type) { |
|
case 'bool': |
|
return false |
|
case 'int': |
|
case 'sampler2D': |
|
case 'samplerCube': |
|
return 0 |
|
case 'float': |
|
return 0.0 |
|
default: |
|
var vidx = type.indexOf('vec') |
|
if(0 <= vidx && vidx <= 1 && type.length === 4 + vidx) { |
|
var d = type.charCodeAt(type.length-1) - 48 |
|
if(d < 2 || d > 4) { |
|
throw new GLError('', 'Invalid data type') |
|
} |
|
if(type.charAt(0) === 'b') { |
|
return makeVector(d, false) |
|
} |
|
return makeVector(d, 0) |
|
} else if(type.indexOf('mat') === 0 && type.length === 4) { |
|
var d = type.charCodeAt(type.length-1) - 48 |
|
if(d < 2 || d > 4) { |
|
throw new GLError('', 'Invalid uniform dimension type for matrix ' + name + ': ' + type) |
|
} |
|
return makeVector(d*d, 0) |
|
} else { |
|
throw new GLError('', 'Unknown uniform data type for ' + name + ': ' + type) |
|
} |
|
break |
|
} |
|
} |
|
|
|
function storeProperty(obj, prop, type) { |
|
if(typeof type === 'object') { |
|
var child = processObject(type) |
|
Object.defineProperty(obj, prop, { |
|
get: identity(child), |
|
set: makeSetter(type), |
|
enumerable: true, |
|
configurable: false |
|
}) |
|
} else { |
|
if(locations[type]) { |
|
Object.defineProperty(obj, prop, { |
|
get: makeGetter(type), |
|
set: makeSetter(type), |
|
enumerable: true, |
|
configurable: false |
|
}) |
|
} else { |
|
obj[prop] = defaultValue(uniforms[type].type) |
|
} |
|
} |
|
} |
|
|
|
function processObject(obj) { |
|
var result |
|
if(Array.isArray(obj)) { |
|
result = new Array(obj.length) |
|
for(var i=0; i<obj.length; ++i) { |
|
storeProperty(result, i, obj[i]) |
|
} |
|
} else { |
|
result = {} |
|
for(var id in obj) { |
|
storeProperty(result, id, obj[id]) |
|
} |
|
} |
|
return result |
|
} |
|
|
|
//Return data |
|
var coallesced = coallesceUniforms(uniforms, true) |
|
return { |
|
get: identity(processObject(coallesced)), |
|
set: makeSetter(coallesced), |
|
enumerable: true, |
|
configurable: true |
|
} |
|
} |
|
|
|
},{"./GLError":108,"./reflect":111}],111:[function(require,module,exports){ |
|
'use strict' |
|
|
|
module.exports = makeReflectTypes |
|
|
|
//Construct type info for reflection. |
|
// |
|
// This iterates over the flattened list of uniform type values and smashes them into a JSON object. |
|
// |
|
// The leaves of the resulting object are either indices or type strings representing primitive glslify types |
|
function makeReflectTypes(uniforms, useIndex) { |
|
var obj = {} |
|
for(var i=0; i<uniforms.length; ++i) { |
|
var n = uniforms[i].name |
|
var parts = n.split(".") |
|
var o = obj |
|
for(var j=0; j<parts.length; ++j) { |
|
var x = parts[j].split("[") |
|
if(x.length > 1) { |
|
if(!(x[0] in o)) { |
|
o[x[0]] = [] |
|
} |
|
o = o[x[0]] |
|
for(var k=1; k<x.length; ++k) { |
|
var y = parseInt(x[k]) |
|
if(k<x.length-1 || j<parts.length-1) { |
|
if(!(y in o)) { |
|
if(k < x.length-1) { |
|
o[y] = [] |
|
} else { |
|
o[y] = {} |
|
} |
|
} |
|
o = o[y] |
|
} else { |
|
if(useIndex) { |
|
o[y] = i |
|
} else { |
|
o[y] = uniforms[i].type |
|
} |
|
} |
|
} |
|
} else if(j < parts.length-1) { |
|
if(!(x[0] in o)) { |
|
o[x[0]] = {} |
|
} |
|
o = o[x[0]] |
|
} else { |
|
if(useIndex) { |
|
o[x[0]] = i |
|
} else { |
|
o[x[0]] = uniforms[i].type |
|
} |
|
} |
|
} |
|
} |
|
return obj |
|
} |
|
},{}],112:[function(require,module,exports){ |
|
'use strict' |
|
|
|
exports.uniforms = runtimeUniforms |
|
exports.attributes = runtimeAttributes |
|
|
|
var GL_TO_GLSL_TYPES = { |
|
'FLOAT': 'float', |
|
'FLOAT_VEC2': 'vec2', |
|
'FLOAT_VEC3': 'vec3', |
|
'FLOAT_VEC4': 'vec4', |
|
'INT': 'int', |
|
'INT_VEC2': 'ivec2', |
|
'INT_VEC3': 'ivec3', |
|
'INT_VEC4': 'ivec4', |
|
'BOOL': 'bool', |
|
'BOOL_VEC2': 'bvec2', |
|
'BOOL_VEC3': 'bvec3', |
|
'BOOL_VEC4': 'bvec4', |
|
'FLOAT_MAT2': 'mat2', |
|
'FLOAT_MAT3': 'mat3', |
|
'FLOAT_MAT4': 'mat4', |
|
'SAMPLER_2D': 'sampler2D', |
|
'SAMPLER_CUBE':'samplerCube' |
|
} |
|
|
|
var GL_TABLE = null |
|
|
|
function getType(gl, type) { |
|
if(!GL_TABLE) { |
|
var typeNames = Object.keys(GL_TO_GLSL_TYPES) |
|
GL_TABLE = {} |
|
for(var i=0; i<typeNames.length; ++i) { |
|
var tn = typeNames[i] |
|
GL_TABLE[gl[tn]] = GL_TO_GLSL_TYPES[tn] |
|
} |
|
} |
|
return GL_TABLE[type] |
|
} |
|
|
|
function runtimeUniforms(gl, program) { |
|
var numUniforms = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS) |
|
var result = [] |
|
for(var i=0; i<numUniforms; ++i) { |
|
var info = gl.getActiveUniform(program, i) |
|
if(info) { |
|
var type = getType(gl, info.type) |
|
if(info.size > 1) { |
|
for(var j=0; j<info.size; ++j) { |
|
result.push({ |
|
name: info.name.replace('[0]', '[' + j + ']'), |
|
type: type |
|
}) |
|
} |
|
} else { |
|
result.push({ |
|
name: info.name, |
|
type: type |
|
}) |
|
} |
|
} |
|
} |
|
return result |
|
} |
|
|
|
function runtimeAttributes(gl, program) { |
|
var numAttributes = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES) |
|
var result = [] |
|
for(var i=0; i<numAttributes; ++i) { |
|
var info = gl.getActiveAttrib(program, i) |
|
if(info) { |
|
result.push({ |
|
name: info.name, |
|
type: getType(gl, info.type) |
|
}) |
|
} |
|
} |
|
return result |
|
} |
|
|
|
},{}],113:[function(require,module,exports){ |
|
'use strict' |
|
|
|
exports.shader = getShaderReference |
|
exports.program = createProgram |
|
|
|
var GLError = require("./GLError") |
|
var formatCompilerError = require('gl-format-compiler-error'); |
|
|
|
var weakMap = typeof WeakMap === 'undefined' ? require('weakmap-shim') : WeakMap |
|
var CACHE = new weakMap() |
|
|
|
var SHADER_COUNTER = 0 |
|
|
|
function ShaderReference(id, src, type, shader, programs, count, cache) { |
|
this.id = id |
|
this.src = src |
|
this.type = type |
|
this.shader = shader |
|
this.count = count |
|
this.programs = [] |
|
this.cache = cache |
|
} |
|
|
|
ShaderReference.prototype.dispose = function() { |
|
if(--this.count === 0) { |
|
var cache = this.cache |
|
var gl = cache.gl |
|
|
|
//Remove program references |
|
var programs = this.programs |
|
for(var i=0, n=programs.length; i<n; ++i) { |
|
var p = cache.programs[programs[i]] |
|
if(p) { |
|
delete cache.programs[i] |
|
gl.deleteProgram(p) |
|
} |
|
} |
|
|
|
//Remove shader reference |
|
gl.deleteShader(this.shader) |
|
delete cache.shaders[(this.type === gl.FRAGMENT_SHADER)|0][this.src] |
|
} |
|
} |
|
|
|
function ContextCache(gl) { |
|
this.gl = gl |
|
this.shaders = [{}, {}] |
|
this.programs = {} |
|
} |
|
|
|
var proto = ContextCache.prototype |
|
|
|
function compileShader(gl, type, src) { |
|
var shader = gl.createShader(type) |
|
gl.shaderSource(shader, src) |
|
gl.compileShader(shader) |
|
if(!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { |
|
var errLog = gl.getShaderInfoLog(shader) |
|
try { |
|
var fmt = formatCompilerError(errLog, src, type); |
|
} catch (e){ |
|
console.warn('Failed to format compiler error: ' + e); |
|
throw new GLError(errLog, 'Error compiling shader:\n' + errLog) |
|
} |
|
throw new GLError(errLog, fmt.short, fmt.long) |
|
} |
|
return shader |
|
} |
|
|
|
proto.getShaderReference = function(type, src) { |
|
var gl = this.gl |
|
var shaders = this.shaders[(type === gl.FRAGMENT_SHADER)|0] |
|
var shader = shaders[src] |
|
if(!shader || !gl.isShader(shader.shader)) { |
|
var shaderObj = compileShader(gl, type, src) |
|
shader = shaders[src] = new ShaderReference( |
|
SHADER_COUNTER++, |
|
src, |
|
type, |
|
shaderObj, |
|
[], |
|
1, |
|
this) |
|
} else { |
|
shader.count += 1 |
|
} |
|
return shader |
|
} |
|
|
|
function linkProgram(gl, vshader, fshader, attribs, locations) { |
|
var program = gl.createProgram() |
|
gl.attachShader(program, vshader) |
|
gl.attachShader(program, fshader) |
|
for(var i=0; i<attribs.length; ++i) { |
|
gl.bindAttribLocation(program, locations[i], attribs[i]) |
|
} |
|
gl.linkProgram(program) |
|
if(!gl.getProgramParameter(program, gl.LINK_STATUS)) { |
|
var errLog = gl.getProgramInfoLog(program) |
|
throw new GLError(errLog, 'Error linking program: ' + errLog) |
|
} |
|
return program |
|
} |
|
|
|
proto.getProgram = function(vref, fref, attribs, locations) { |
|
var token = [vref.id, fref.id, attribs.join(':'), locations.join(':')].join('@') |
|
var prog = this.programs[token] |
|
if(!prog || !this.gl.isProgram(prog)) { |
|
this.programs[token] = prog = linkProgram( |
|
this.gl, |
|
vref.shader, |
|
fref.shader, |
|
attribs, |
|
locations) |
|
vref.programs.push(token) |
|
fref.programs.push(token) |
|
} |
|
return prog |
|
} |
|
|
|
function getCache(gl) { |
|
var ctxCache = CACHE.get(gl) |
|
if(!ctxCache) { |
|
ctxCache = new ContextCache(gl) |
|
CACHE.set(gl, ctxCache) |
|
} |
|
return ctxCache |
|
} |
|
|
|
function getShaderReference(gl, type, src) { |
|
return getCache(gl).getShaderReference(type, src) |
|
} |
|
|
|
function createProgram(gl, vref, fref, attribs, locations) { |
|
return getCache(gl).getProgram(vref, fref, attribs, locations) |
|
} |
|
|
|
},{"./GLError":108,"gl-format-compiler-error":87,"weakmap-shim":264}],114:[function(require,module,exports){ |
|
'use strict' |
|
|
|
|
|
var createShader = require('gl-shader') |
|
|
|
var vertSrc = "precision mediump float;\n#define GLSLIFY 1\n\nattribute vec3 position, color;\nattribute float weight;\n\nuniform mat4 model, view, projection;\nuniform vec3 coordinates[3];\nuniform vec4 colors[3];\nuniform vec2 screenShape;\nuniform float lineWidth;\n\nvarying vec4 fragColor;\n\nvoid main() {\n vec3 vertexPosition = mix(coordinates[0],\n mix(coordinates[2], coordinates[1], 0.5 * (position + 1.0)), abs(position));\n\n vec4 clipPos = projection * view * model * vec4(vertexPosition, 1.0);\n vec2 clipOffset = (projection * view * model * vec4(color, 0.0)).xy;\n vec2 delta = weight * clipOffset * screenShape;\n vec2 lineOffset = normalize(vec2(delta.y, -delta.x)) / screenShape;\n\n gl_Position = vec4(clipPos.xy + clipPos.w * 0.5 * lineWidth * lineOffset, clipPos.z, clipPos.w);\n fragColor = color.x * colors[0] + color.y * colors[1] + color.z * colors[2];\n}\n" |
|
var fragSrc = "precision mediump float;\n#define GLSLIFY 1\n\nvarying vec4 fragColor;\n\nvoid main() {\n gl_FragColor = fragColor;\n}" |
|
|
|
module.exports = function(gl) { |
|
return createShader(gl, vertSrc, fragSrc, null, [ |
|
{name: 'position', type: 'vec3'}, |
|
{name: 'color', type: 'vec3'}, |
|
{name: 'weight', type: 'float'} |
|
]) |
|
} |
|
|
|
},{"gl-shader":107}],115:[function(require,module,exports){ |
|
'use strict' |
|
|
|
var createBuffer = require('gl-buffer') |
|
var createVAO = require('gl-vao') |
|
var createShader = require('./shaders/index') |
|
|
|
module.exports = createSpikes |
|
|
|
var identity = [1,0,0,0, |
|
0,1,0,0, |
|
0,0,1,0, |
|
0,0,0,1] |
|
|
|
function AxisSpikes(gl, buffer, vao, shader) { |
|
this.gl = gl |
|
this.buffer = buffer |
|
this.vao = vao |
|
this.shader = shader |
|
this.pixelRatio = 1 |
|
this.bounds = [[-1000,-1000,-1000], [1000,1000,1000]] |
|
this.position = [0,0,0] |
|
this.lineWidth = [2,2,2] |
|
this.colors = [[0,0,0,1], [0,0,0,1], [0,0,0,1]] |
|
this.enabled = [true,true,true] |
|
this.drawSides = [true,true,true] |
|
this.axes = null |
|
} |
|
|
|
var proto = AxisSpikes.prototype |
|
|
|
var OUTER_FACE = [0,0,0] |
|
var INNER_FACE = [0,0,0] |
|
|
|
var SHAPE = [0,0] |
|
|
|
proto.isTransparent = function() { |
|
return false |
|
} |
|
|
|
proto.drawTransparent = function(camera) {} |
|
|
|
proto.draw = function(camera) { |
|
var gl = this.gl |
|
var vao = this.vao |
|
var shader = this.shader |
|
|
|
vao.bind() |
|
shader.bind() |
|
|
|
var model = camera.model || identity |
|
var view = camera.view || identity |
|
var projection = camera.projection || identity |
|
|
|
var axis |
|
if(this.axes) { |
|
axis = this.axes.lastCubeProps.axis |
|
} |
|
|
|
var outerFace = OUTER_FACE |
|
var innerFace = INNER_FACE |
|
for(var i=0; i<3; ++i) { |
|
if(axis && axis[i] < 0) { |
|
outerFace[i] = this.bounds[0][i] |
|
innerFace[i] = this.bounds[1][i] |
|
} else { |
|
outerFace[i] = this.bounds[1][i] |
|
innerFace[i] = this.bounds[0][i] |
|
} |
|
} |
|
|
|
SHAPE[0] = gl.drawingBufferWidth |
|
SHAPE[1] = gl.drawingBufferHeight |
|
|
|
shader.uniforms.model = model |
|
shader.uniforms.view = view |
|
shader.uniforms.projection = projection |
|
shader.uniforms.coordinates = [this.position, outerFace, innerFace] |
|
shader.uniforms.colors = this.colors |
|
shader.uniforms.screenShape = SHAPE |
|
|
|
for(var i=0; i<3; ++i) { |
|
shader.uniforms.lineWidth = this.lineWidth[i] * this.pixelRatio |
|
if(this.enabled[i]) { |
|
vao.draw(gl.TRIANGLES, 6, 6*i) |
|
if(this.drawSides[i]) { |
|
vao.draw(gl.TRIANGLES, 12, 18+12*i) |
|
} |
|
} |
|
} |
|
|
|
vao.unbind() |
|
} |
|
|
|
proto.update = function(options) { |
|
if(!options) { |
|
return |
|
} |
|
if("bounds" in options) { |
|
this.bounds = options.bounds |
|
} |
|
if("position" in options) { |
|
this.position = options.position |
|
} |
|
if("lineWidth" in options) { |
|
this.lineWidth = options.lineWidth |
|
} |
|
if("colors" in options) { |
|
this.colors = options.colors |
|
} |
|
if("enabled" in options) { |
|
this.enabled = options.enabled |
|
} |
|
if("drawSides" in options) { |
|
this.drawSides = options.drawSides |
|
} |
|
} |
|
|
|
proto.dispose = function() { |
|
this.vao.dispose() |
|
this.buffer.dispose() |
|
this.shader.dispose() |
|
} |
|
|
|
|
|
|
|
function createSpikes(gl, options) { |
|
//Create buffers |
|
var data = [ ] |
|
|
|
function line(x,y,z,i,l,h) { |
|
var row = [x,y,z, 0,0,0, 1] |
|
row[i+3] = 1 |
|
row[i] = l |
|
data.push.apply(data, row) |
|
row[6] = -1 |
|
data.push.apply(data, row) |
|
row[i] = h |
|
data.push.apply(data, row) |
|
data.push.apply(data, row) |
|
row[6] = 1 |
|
data.push.apply(data, row) |
|
row[i] = l |
|
data.push.apply(data, row) |
|
} |
|
|
|
line(0,0,0, 0, 0, 1) |
|
line(0,0,0, 1, 0, 1) |
|
line(0,0,0, 2, 0, 1) |
|
|
|
line(1,0,0, 1, -1,1) |
|
line(1,0,0, 2, -1,1) |
|
|
|
line(0,1,0, 0, -1,1) |
|
line(0,1,0, 2, -1,1) |
|
|
|
line(0,0,1, 0, -1,1) |
|
line(0,0,1, 1, -1,1) |
|
|
|
var buffer = createBuffer(gl, data) |
|
var vao = createVAO(gl, [{ |
|
type: gl.FLOAT, |
|
buffer: buffer, |
|
size: 3, |
|
offset: 0, |
|
stride: 28 |
|
}, { |
|
type: gl.FLOAT, |
|
buffer: buffer, |
|
size: 3, |
|
offset: 12, |
|
stride: 28 |
|
}, { |
|
type: gl.FLOAT, |
|
buffer: buffer, |
|
size: 1, |
|
offset: 24, |
|
stride: 28 |
|
}]) |
|
|
|
//Create shader |
|
var shader = createShader(gl) |
|
shader.attributes.position.location = 0 |
|
shader.attributes.color.location = 1 |
|
shader.attributes.weight.location = 2 |
|
|
|
//Create spike object |
|
var spikes = new AxisSpikes(gl, buffer, vao, shader) |
|
|
|
//Set parameters |
|
spikes.update(options) |
|
|
|
//Return resulting object |
|
return spikes |
|
} |
|
|
|
},{"./shaders/index":114,"gl-buffer":83,"gl-vao":120}],116:[function(require,module,exports){ |
|
'use strict' |
|
|
|
var ndarray = require('ndarray') |
|
var ops = require('ndarray-ops') |
|
var pool = require('typedarray-pool') |
|
|
|
module.exports = createTexture2D |
|
|
|
var linearTypes = null |
|
var filterTypes = null |
|
var wrapTypes = null |
|
|
|
function lazyInitLinearTypes(gl) { |
|
linearTypes = [ |
|
gl.LINEAR, |
|
gl.NEAREST_MIPMAP_LINEAR, |
|
gl.LINEAR_MIPMAP_NEAREST, |
|
gl.LINEAR_MIPMAP_NEAREST |
|
] |
|
filterTypes = [ |
|
gl.NEAREST, |
|
gl.LINEAR, |
|
gl.NEAREST_MIPMAP_NEAREST, |
|
gl.NEAREST_MIPMAP_LINEAR, |
|
gl.LINEAR_MIPMAP_NEAREST, |
|
gl.LINEAR_MIPMAP_LINEAR |
|
] |
|
wrapTypes = [ |
|
gl.REPEAT, |
|
gl.CLAMP_TO_EDGE, |
|
gl.MIRRORED_REPEAT |
|
] |
|
} |
|
|
|
function acceptTextureDOM (obj) { |
|
return ( |
|
('undefined' != typeof HTMLCanvasElement && obj instanceof HTMLCanvasElement) || |
|
('undefined' != typeof HTMLImageElement && obj instanceof HTMLImageElement) || |
|
('undefined' != typeof HTMLVideoElement && obj instanceof HTMLVideoElement) || |
|
('undefined' != typeof ImageData && obj instanceof ImageData)) |
|
} |
|
|
|
var convertFloatToUint8 = function(out, inp) { |
|
ops.muls(out, inp, 255.0) |
|
} |
|
|
|
function reshapeTexture(tex, w, h) { |
|
var gl = tex.gl |
|
var maxSize = gl.getParameter(gl.MAX_TEXTURE_SIZE) |
|
if(w < 0 || w > maxSize || h < 0 || h > maxSize) { |
|
throw new Error('gl-texture2d: Invalid texture size') |
|
} |
|
tex._shape = [w, h] |
|
tex.bind() |
|
gl.texImage2D(gl.TEXTURE_2D, 0, tex.format, w, h, 0, tex.format, tex.type, null) |
|
tex._mipLevels = [0] |
|
return tex |
|
} |
|
|
|
function Texture2D(gl, handle, width, height, format, type) { |
|
this.gl = gl |
|
this.handle = handle |
|
this.format = format |
|
this.type = type |
|
this._shape = [width, height] |
|
this._mipLevels = [0] |
|
this._magFilter = gl.NEAREST |
|
this._minFilter = gl.NEAREST |
|
this._wrapS = gl.CLAMP_TO_EDGE |
|
this._wrapT = gl.CLAMP_TO_EDGE |
|
this._anisoSamples = 1 |
|
|
|
var parent = this |
|
var wrapVector = [this._wrapS, this._wrapT] |
|
Object.defineProperties(wrapVector, [ |
|
{ |
|
get: function() { |
|
return parent._wrapS |
|
}, |
|
set: function(v) { |
|
return parent.wrapS = v |
|
} |
|
}, |
|
{ |
|
get: function() { |
|
return parent._wrapT |
|
}, |
|
set: function(v) { |
|
return parent.wrapT = v |
|
} |
|
} |
|
]) |
|
this._wrapVector = wrapVector |
|
|
|
var shapeVector = [this._shape[0], this._shape[1]] |
|
Object.defineProperties(shapeVector, [ |
|
{ |
|
get: function() { |
|
return parent._shape[0] |
|
}, |
|
set: function(v) { |
|
return parent.width = v |
|
} |
|
}, |
|
{ |
|
get: function() { |
|
return parent._shape[1] |
|
}, |
|
set: function(v) { |
|
return parent.height = v |
|
} |
|
} |
|
]) |
|
this._shapeVector = shapeVector |
|
} |
|
|
|
var proto = Texture2D.prototype |
|
|
|
Object.defineProperties(proto, { |
|
minFilter: { |
|
get: function() { |
|
return this._minFilter |
|
}, |
|
set: function(v) { |
|
this.bind() |
|
var gl = this.gl |
|
if(this.type === gl.FLOAT && linearTypes.indexOf(v) >= 0) { |
|
if(!gl.getExtension('OES_texture_float_linear')) { |
|
v = gl.NEAREST |
|
} |
|
} |
|
if(filterTypes.indexOf(v) < 0) { |
|
throw new Error('gl-texture2d: Unknown filter mode ' + v) |
|
} |
|
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, v) |
|
return this._minFilter = v |
|
} |
|
}, |
|
magFilter: { |
|
get: function() { |
|
return this._magFilter |
|
}, |
|
set: function(v) { |
|
this.bind() |
|
var gl = this.gl |
|
if(this.type === gl.FLOAT && linearTypes.indexOf(v) >= 0) { |
|
if(!gl.getExtension('OES_texture_float_linear')) { |
|
v = gl.NEAREST |
|
} |
|
} |
|
if(filterTypes.indexOf(v) < 0) { |
|
throw new Error('gl-texture2d: Unknown filter mode ' + v) |
|
} |
|
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, v) |
|
return this._magFilter = v |
|
} |
|
}, |
|
mipSamples: { |
|
get: function() { |
|
return this._anisoSamples |
|
}, |
|
set: function(i) { |
|
var psamples = this._anisoSamples |
|
this._anisoSamples = Math.max(i, 1)|0 |
|
if(psamples !== this._anisoSamples) { |
|
var ext = this.gl.getExtension('EXT_texture_filter_anisotropic') |
|
if(ext) { |
|
this.gl.texParameterf(this.gl.TEXTURE_2D, ext.TEXTURE_MAX_ANISOTROPY_EXT, this._anisoSamples) |
|
} |
|
} |
|
return this._anisoSamples |
|
} |
|
}, |
|
wrapS: { |
|
get: function() { |
|
return this._wrapS |
|
}, |
|
set: function(v) { |
|
this.bind() |
|
if(wrapTypes.indexOf(v) < 0) { |
|
throw new Error('gl-texture2d: Unknown wrap mode ' + v) |
|
} |
|
this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_S, v) |
|
return this._wrapS = v |
|
} |
|
}, |
|
wrapT: { |
|
get: function() { |
|
return this._wrapT |
|
}, |
|
set: function(v) { |
|
this.bind() |
|
if(wrapTypes.indexOf(v) < 0) { |
|
throw new Error('gl-texture2d: Unknown wrap mode ' + v) |
|
} |
|
this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_T, v) |
|
return this._wrapT = v |
|
} |
|
}, |
|
wrap: { |
|
get: function() { |
|
return this._wrapVector |
|
}, |
|
set: function(v) { |
|
if(!Array.isArray(v)) { |
|
v = [v,v] |
|
} |
|
if(v.length !== 2) { |
|
throw new Error('gl-texture2d: Must specify wrap mode for rows and columns') |
|
} |
|
for(var i=0; i<2; ++i) { |
|
if(wrapTypes.indexOf(v[i]) < 0) { |
|
throw new Error('gl-texture2d: Unknown wrap mode ' + v) |
|
} |
|
} |
|
this._wrapS = v[0] |
|
this._wrapT = v[1] |
|
|
|
var gl = this.gl |
|
this.bind() |
|
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, this._wrapS) |
|
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, this._wrapT) |
|
|
|
return v |
|
} |
|
}, |
|
shape: { |
|
get: function() { |
|
return this._shapeVector |
|
}, |
|
set: function(x) { |
|
if(!Array.isArray(x)) { |
|
x = [x|0,x|0] |
|
} else { |
|
if(x.length !== 2) { |
|
throw new Error('gl-texture2d: Invalid texture shape') |
|
} |
|
} |
|
reshapeTexture(this, x[0]|0, x[1]|0) |
|
return [x[0]|0, x[1]|0] |
|
} |
|
}, |
|
width: { |
|
get: function() { |
|
return this._shape[0] |
|
}, |
|
set: function(w) { |
|
w = w|0 |
|
reshapeTexture(this, w, this._shape[1]) |
|
return w |
|
} |
|
}, |
|
height: { |
|
get: function() { |
|
return this._shape[1] |
|
}, |
|
set: function(h) { |
|
h = h|0 |
|
reshapeTexture(this, this._shape[0], h) |
|
return h |
|
} |
|
} |
|
}) |
|
|
|
proto.bind = function(unit) { |
|
var gl = this.gl |
|
if(unit !== undefined) { |
|
gl.activeTexture(gl.TEXTURE0 + (unit|0)) |
|
} |
|
gl.bindTexture(gl.TEXTURE_2D, this.handle) |
|
if(unit !== undefined) { |
|
return (unit|0) |
|
} |
|
return gl.getParameter(gl.ACTIVE_TEXTURE) - gl.TEXTURE0 |
|
} |
|
|
|
proto.dispose = function() { |
|
this.gl.deleteTexture(this.handle) |
|
} |
|
|
|
proto.generateMipmap = function() { |
|
this.bind() |
|
this.gl.generateMipmap(this.gl.TEXTURE_2D) |
|
|
|
//Update mip levels |
|
var l = Math.min(this._shape[0], this._shape[1]) |
|
for(var i=0; l>0; ++i, l>>>=1) { |
|
if(this._mipLevels.indexOf(i) < 0) { |
|
this._mipLevels.push(i) |
|
} |
|
} |
|
} |
|
|
|
proto.setPixels = function(data, x_off, y_off, mip_level) { |
|
var gl = this.gl |
|
this.bind() |
|
if(Array.isArray(x_off)) { |
|
mip_level = y_off |
|
y_off = x_off[1]|0 |
|
x_off = x_off[0]|0 |
|
} else { |
|
x_off = x_off || 0 |
|
y_off = y_off || 0 |
|
} |
|
mip_level = mip_level || 0 |
|
var directData = acceptTextureDOM(data) ? data : data.raw |
|
if(directData) { |
|
var needsMip = this._mipLevels.indexOf(mip_level) < 0 |
|
if(needsMip) { |
|
gl.texImage2D(gl.TEXTURE_2D, 0, this.format, this.format, this.type, directData) |
|
this._mipLevels.push(mip_level) |
|
} else { |
|
gl.texSubImage2D(gl.TEXTURE_2D, mip_level, x_off, y_off, this.format, this.type, directData) |
|
} |
|
} else if(data.shape && data.stride && data.data) { |
|
if(data.shape.length < 2 || |
|
x_off + data.shape[1] > this._shape[1]>>>mip_level || |
|
y_off + data.shape[0] > this._shape[0]>>>mip_level || |
|
x_off < 0 || |
|
y_off < 0) { |
|
throw new Error('gl-texture2d: Texture dimensions are out of bounds') |
|
} |
|
texSubImageArray(gl, x_off, y_off, mip_level, this.format, this.type, this._mipLevels, data) |
|
} else { |
|
throw new Error('gl-texture2d: Unsupported data type') |
|
} |
|
} |
|
|
|
|
|
function isPacked(shape, stride) { |
|
if(shape.length === 3) { |
|
return (stride[2] === 1) && |
|
(stride[1] === shape[0]*shape[2]) && |
|
(stride[0] === shape[2]) |
|
} |
|
return (stride[0] === 1) && |
|
(stride[1] === shape[0]) |
|
} |
|
|
|
function texSubImageArray(gl, x_off, y_off, mip_level, cformat, ctype, mipLevels, array) { |
|
var dtype = array.dtype |
|
var shape = array.shape.slice() |
|
if(shape.length < 2 || shape.length > 3) { |
|
throw new Error('gl-texture2d: Invalid ndarray, must be 2d or 3d') |
|
} |
|
var type = 0, format = 0 |
|
var packed = isPacked(shape, array.stride.slice()) |
|
if(dtype === 'float32') { |
|
type = gl.FLOAT |
|
} else if(dtype === 'float64') { |
|
type = gl.FLOAT |
|
packed = false |
|
dtype = 'float32' |
|
} else if(dtype === 'uint8') { |
|
type = gl.UNSIGNED_BYTE |
|
} else { |
|
type = gl.UNSIGNED_BYTE |
|
packed = false |
|
dtype = 'uint8' |
|
} |
|
var channels = 1 |
|
if(shape.length === 2) { |
|
format = gl.LUMINANCE |
|
shape = [shape[0], shape[1], 1] |
|
array = ndarray(array.data, shape, [array.stride[0], array.stride[1], 1], array.offset) |
|
} else if(shape.length === 3) { |
|
if(shape[2] === 1) { |
|
format = gl.ALPHA |
|
} else if(shape[2] === 2) { |
|
format = gl.LUMINANCE_ALPHA |
|
} else if(shape[2] === 3) { |
|
format = gl.RGB |
|
} else if(shape[2] === 4) { |
|
format = gl.RGBA |
|
} else { |
|
throw new Error('gl-texture2d: Invalid shape for pixel coords') |
|
} |
|
channels = shape[2] |
|
} else { |
|
throw new Error('gl-texture2d: Invalid shape for texture') |
|
} |
|
//For 1-channel textures allow conversion between formats |
|
if((format === gl.LUMINANCE || format === gl.ALPHA) && |
|
(cformat === gl.LUMINANCE || cformat === gl.ALPHA)) { |
|
format = cformat |
|
} |
|
if(format !== cformat) { |
|
throw new Error('gl-texture2d: Incompatible texture format for setPixels') |
|
} |
|
var size = array.size |
|
var needsMip = mipLevels.indexOf(mip_level) < 0 |
|
if(needsMip) { |
|
mipLevels.push(mip_level) |
|
} |
|
if(type === ctype && packed) { |
|
//Array data types are compatible, can directly copy into texture |
|
if(array.offset === 0 && array.data.length === size) { |
|
if(needsMip) { |
|
gl.texImage2D(gl.TEXTURE_2D, mip_level, cformat, shape[0], shape[1], 0, cformat, ctype, array.data) |
|
} else { |
|
gl.texSubImage2D(gl.TEXTURE_2D, mip_level, x_off, y_off, shape[0], shape[1], cformat, ctype, array.data) |
|
} |
|
} else { |
|
if(needsMip) { |
|
gl.texImage2D(gl.TEXTURE_2D, mip_level, cformat, shape[0], shape[1], 0, cformat, ctype, array.data.subarray(array.offset, array.offset+size)) |
|
} else { |
|
gl.texSubImage2D(gl.TEXTURE_2D, mip_level, x_off, y_off, shape[0], shape[1], cformat, ctype, array.data.subarray(array.offset, array.offset+size)) |
|
} |
|
} |
|
} else { |
|
//Need to do type conversion to pack data into buffer |
|
var pack_buffer |
|
if(ctype === gl.FLOAT) { |
|
pack_buffer = pool.mallocFloat32(size) |
|
} else { |
|
pack_buffer = pool.mallocUint8(size) |
|
} |
|
var pack_view = ndarray(pack_buffer, shape, [shape[2], shape[2]*shape[0], 1]) |
|
if(type === gl.FLOAT && ctype === gl.UNSIGNED_BYTE) { |
|
convertFloatToUint8(pack_view, array) |
|
} else { |
|
ops.assign(pack_view, array) |
|
} |
|
if(needsMip) { |
|
gl.texImage2D(gl.TEXTURE_2D, mip_level, cformat, shape[0], shape[1], 0, cformat, ctype, pack_buffer.subarray(0, size)) |
|
} else { |
|
gl.texSubImage2D(gl.TEXTURE_2D, mip_level, x_off, y_off, shape[0], shape[1], cformat, ctype, pack_buffer.subarray(0, size)) |
|
} |
|
if(ctype === gl.FLOAT) { |
|
pool.freeFloat32(pack_buffer) |
|
} else { |
|
pool.freeUint8(pack_buffer) |
|
} |
|
} |
|
} |
|
|
|
function initTexture(gl) { |
|
var tex = gl.createTexture() |
|
gl.bindTexture(gl.TEXTURE_2D, tex) |
|
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST) |
|
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST) |
|
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE) |
|
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE) |
|
return tex |
|
} |
|
|
|
function createTextureShape(gl, width, height, format, type) { |
|
var maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE) |
|
if(width < 0 || width > maxTextureSize || height < 0 || height > maxTextureSize) { |
|
throw new Error('gl-texture2d: Invalid texture shape') |
|
} |
|
if(type === gl.FLOAT && !gl.getExtension('OES_texture_float')) { |
|
throw new Error('gl-texture2d: Floating point textures not supported on this platform') |
|
} |
|
var tex = initTexture(gl) |
|
gl.texImage2D(gl.TEXTURE_2D, 0, format, width, height, 0, format, type, null) |
|
return new Texture2D(gl, tex, width, height, format, type) |
|
} |
|
|
|
function createTextureDOM(gl, directData, width, height, format, type) { |
|
var tex = initTexture(gl) |
|
gl.texImage2D(gl.TEXTURE_2D, 0, format, format, type, directData) |
|
return new Texture2D(gl, tex, width, height, format, type) |
|
} |
|
|
|
//Creates a texture from an ndarray |
|
function createTextureArray(gl, array) { |
|
var dtype = array.dtype |
|
var shape = array.shape.slice() |
|
var maxSize = gl.getParameter(gl.MAX_TEXTURE_SIZE) |
|
if(shape[0] < 0 || shape[0] > maxSize || shape[1] < 0 || shape[1] > maxSize) { |
|
throw new Error('gl-texture2d: Invalid texture size') |
|
} |
|
var packed = isPacked(shape, array.stride.slice()) |
|
var type = 0 |
|
if(dtype === 'float32') { |
|
type = gl.FLOAT |
|
} else if(dtype === 'float64') { |
|
type = gl.FLOAT |
|
packed = false |
|
dtype = 'float32' |
|
} else if(dtype === 'uint8') { |
|
type = gl.UNSIGNED_BYTE |
|
} else { |
|
type = gl.UNSIGNED_BYTE |
|
packed = false |
|
dtype = 'uint8' |
|
} |
|
var format = 0 |
|
if(shape.length === 2) { |
|
format = gl.LUMINANCE |
|
shape = [shape[0], shape[1], 1] |
|
array = ndarray(array.data, shape, [array.stride[0], array.stride[1], 1], array.offset) |
|
} else if(shape.length === 3) { |
|
if(shape[2] === 1) { |
|
format = gl.ALPHA |
|
} else if(shape[2] === 2) { |
|
format = gl.LUMINANCE_ALPHA |
|
} else if(shape[2] === 3) { |
|
format = gl.RGB |
|
} else if(shape[2] === 4) { |
|
format = gl.RGBA |
|
} else { |
|
throw new Error('gl-texture2d: Invalid shape for pixel coords') |
|
} |
|
} else { |
|
throw new Error('gl-texture2d: Invalid shape for texture') |
|
} |
|
if(type === gl.FLOAT && !gl.getExtension('OES_texture_float')) { |
|
type = gl.UNSIGNED_BYTE |
|
packed = false |
|
} |
|
var buffer, buf_store |
|
var size = array.size |
|
if(!packed) { |
|
var stride = [shape[2], shape[2]*shape[0], 1] |
|
buf_store = pool.malloc(size, dtype) |
|
var buf_array = ndarray(buf_store, shape, stride, 0) |
|
if((dtype === 'float32' || dtype === 'float64') && type === gl.UNSIGNED_BYTE) { |
|
convertFloatToUint8(buf_array, array) |
|
} else { |
|
ops.assign(buf_array, array) |
|
} |
|
buffer = buf_store.subarray(0, size) |
|
} else if (array.offset === 0 && array.data.length === size) { |
|
buffer = array.data |
|
} else { |
|
buffer = array.data.subarray(array.offset, array.offset + size) |
|
} |
|
var tex = initTexture(gl) |
|
gl.texImage2D(gl.TEXTURE_2D, 0, format, shape[0], shape[1], 0, format, type, buffer) |
|
if(!packed) { |
|
pool.free(buf_store) |
|
} |
|
return new Texture2D(gl, tex, shape[0], shape[1], format, type) |
|
} |
|
|
|
function createTexture2D(gl) { |
|
if(arguments.length <= 1) { |
|
throw new Error('gl-texture2d: Missing arguments for texture2d constructor') |
|
} |
|
if(!linearTypes) { |
|
lazyInitLinearTypes(gl) |
|
} |
|
if(typeof arguments[1] === 'number') { |
|
return createTextureShape(gl, arguments[1], arguments[2], arguments[3]||gl.RGBA, arguments[4]||gl.UNSIGNED_BYTE) |
|
} |
|
if(Array.isArray(arguments[1])) { |
|
return createTextureShape(gl, arguments[1][0]|0, arguments[1][1]|0, arguments[2]||gl.RGBA, arguments[3]||gl.UNSIGNED_BYTE) |
|
} |
|
if(typeof arguments[1] === 'object') { |
|
var obj = arguments[1] |
|
var directData = acceptTextureDOM(obj) ? obj : obj.raw |
|
if (directData) { |
|
return createTextureDOM(gl, directData, obj.width|0, obj.height|0, arguments[2]||gl.RGBA, arguments[3]||gl.UNSIGNED_BYTE) |
|
} else if(obj.shape && obj.data && obj.stride) { |
|
return createTextureArray(gl, obj) |
|
} |
|
} |
|
throw new Error('gl-texture2d: Invalid arguments for texture2d constructor') |
|
} |
|
|
|
},{"ndarray":208,"ndarray-ops":205,"typedarray-pool":257}],117:[function(require,module,exports){ |
|
"use strict" |
|
|
|
function doBind(gl, elements, attributes) { |
|
if(elements) { |
|
elements.bind() |
|
} else { |
|
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null) |
|
} |
|
var nattribs = gl.getParameter(gl.MAX_VERTEX_ATTRIBS)|0 |
|
if(attributes) { |
|
if(attributes.length > nattribs) { |
|
throw new Error("gl-vao: Too many vertex attributes") |
|
} |
|
for(var i=0; i<attributes.length; ++i) { |
|
var attrib = attributes[i] |
|
if(attrib.buffer) { |
|
var buffer = attrib.buffer |
|
var size = attrib.size || 4 |
|
var type = attrib.type || gl.FLOAT |
|
var normalized = !!attrib.normalized |
|
var stride = attrib.stride || 0 |
|
var offset = attrib.offset || 0 |
|
buffer.bind() |
|
gl.enableVertexAttribArray(i) |
|
gl.vertexAttribPointer(i, size, type, normalized, stride, offset) |
|
} else { |
|
if(typeof attrib === "number") { |
|
gl.vertexAttrib1f(i, attrib) |
|
} else if(attrib.length === 1) { |
|
gl.vertexAttrib1f(i, attrib[0]) |
|
} else if(attrib.length === 2) { |
|
gl.vertexAttrib2f(i, attrib[0], attrib[1]) |
|
} else if(attrib.length === 3) { |
|
gl.vertexAttrib3f(i, attrib[0], attrib[1], attrib[2]) |
|
} else if(attrib.length === 4) { |
|
gl.vertexAttrib4f(i, attrib[0], attrib[1], attrib[2], attrib[3]) |
|
} else { |
|
throw new Error("gl-vao: Invalid vertex attribute") |
|
} |
|
gl.disableVertexAttribArray(i) |
|
} |
|
} |
|
for(; i<nattribs; ++i) { |
|
gl.disableVertexAttribArray(i) |
|
} |
|
} else { |
|
gl.bindBuffer(gl.ARRAY_BUFFER, null) |
|
for(var i=0; i<nattribs; ++i) { |
|
gl.disableVertexAttribArray(i) |
|
} |
|
} |
|
} |
|
|
|
module.exports = doBind |
|
},{}],118:[function(require,module,exports){ |
|
"use strict" |
|
|
|
var bindAttribs = require("./do-bind.js") |
|
|
|
function VAOEmulated(gl) { |
|
this.gl = gl |
|
this._elements = null |
|
this._attributes = null |
|
this._elementsType = gl.UNSIGNED_SHORT |
|
} |
|
|
|
VAOEmulated.prototype.bind = function() { |
|
bindAttribs(this.gl, this._elements, this._attributes) |
|
} |
|
|
|
VAOEmulated.prototype.update = function(attributes, elements, elementsType) { |
|
this._elements = elements |
|
this._attributes = attributes |
|
this._elementsType = elementsType || this.gl.UNSIGNED_SHORT |
|
} |
|
|
|
VAOEmulated.prototype.dispose = function() { } |
|
VAOEmulated.prototype.unbind = function() { } |
|
|
|
VAOEmulated.prototype.draw = function(mode, count, offset) { |
|
offset = offset || 0 |
|
var gl = this.gl |
|
if(this._elements) { |
|
gl.drawElements(mode, count, this._elementsType, offset) |
|
} else { |
|
gl.drawArrays(mode, offset, count) |
|
} |
|
} |
|
|
|
function createVAOEmulated(gl) { |
|
return new VAOEmulated(gl) |
|
} |
|
|
|
module.exports = createVAOEmulated |
|
},{"./do-bind.js":117}],119:[function(require,module,exports){ |
|
"use strict" |
|
|
|
var bindAttribs = require("./do-bind.js") |
|
|
|
function VertexAttribute(location, dimension, a, b, c, d) { |
|
this.location = location |
|
this.dimension = dimension |
|
this.a = a |
|
this.b = b |
|
this.c = c |
|
this.d = d |
|
} |
|
|
|
VertexAttribute.prototype.bind = function(gl) { |
|
switch(this.dimension) { |
|
case 1: |
|
gl.vertexAttrib1f(this.location, this.a) |
|
break |
|
case 2: |
|
gl.vertexAttrib2f(this.location, this.a, this.b) |
|
break |
|
case 3: |
|
gl.vertexAttrib3f(this.location, this.a, this.b, this.c) |
|
break |
|
case 4: |
|
gl.vertexAttrib4f(this.location, this.a, this.b, this.c, this.d) |
|
break |
|
} |
|
} |
|
|
|
function VAONative(gl, ext, handle) { |
|
this.gl = gl |
|
this._ext = ext |
|
this.handle = handle |
|
this._attribs = [] |
|
this._useElements = false |
|
this._elementsType = gl.UNSIGNED_SHORT |
|
} |
|
|
|
VAONative.prototype.bind = function() { |
|
this._ext.bindVertexArrayOES(this.handle) |
|
for(var i=0; i<this._attribs.length; ++i) { |
|
this._attribs[i].bind(this.gl) |
|
} |
|
} |
|
|
|
VAONative.prototype.unbind = function() { |
|
this._ext.bindVertexArrayOES(null) |
|
} |
|
|
|
VAONative.prototype.dispose = function() { |
|
this._ext.deleteVertexArrayOES(this.handle) |
|
} |
|
|
|
VAONative.prototype.update = function(attributes, elements, elementsType) { |
|
this.bind() |
|
bindAttribs(this.gl, elements, attributes) |
|
this.unbind() |
|
this._attribs.length = 0 |
|
if(attributes) |
|
for(var i=0; i<attributes.length; ++i) { |
|
var a = attributes[i] |
|
if(typeof a === "number") { |
|
this._attribs.push(new VertexAttribute(i, 1, a)) |
|
} else if(Array.isArray(a)) { |
|
this._attribs.push(new VertexAttribute(i, a.length, a[0], a[1], a[2], a[3])) |
|
} |
|
} |
|
this._useElements = !!elements |
|
this._elementsType = elementsType || this.gl.UNSIGNED_SHORT |
|
} |
|
|
|
VAONative.prototype.draw = function(mode, count, offset) { |
|
offset = offset || 0 |
|
var gl = this.gl |
|
if(this._useElements) { |
|
gl.drawElements(mode, count, this._elementsType, offset) |
|
} else { |
|
gl.drawArrays(mode, offset, count) |
|
} |
|
} |
|
|
|
function createVAONative(gl, ext) { |
|
return new VAONative(gl, ext, ext.createVertexArrayOES()) |
|
} |
|
|
|
module.exports = createVAONative |
|
},{"./do-bind.js":117}],120:[function(require,module,exports){ |
|
"use strict" |
|
|
|
var createVAONative = require("./lib/vao-native.js") |
|
var createVAOEmulated = require("./lib/vao-emulated.js") |
|
|
|
function ExtensionShim (gl) { |
|
this.bindVertexArrayOES = gl.bindVertexArray.bind(gl) |
|
this.createVertexArrayOES = gl.createVertexArray.bind(gl) |
|
this.deleteVertexArrayOES = gl.deleteVertexArray.bind(gl) |
|
} |
|
|
|
function createVAO(gl, attributes, elements, elementsType) { |
|
var ext = gl.createVertexArray |
|
? new ExtensionShim(gl) |
|
: gl.getExtension('OES_vertex_array_object') |
|
var vao |
|
|
|
if(ext) { |
|
vao = createVAONative(gl, ext) |
|
} else { |
|
vao = createVAOEmulated(gl) |
|
} |
|
vao.update(attributes, elements, elementsType) |
|
return vao |
|
} |
|
|
|
module.exports = createVAO |
|
|
|
},{"./lib/vao-emulated.js":118,"./lib/vao-native.js":119}],121:[function(require,module,exports){ |
|
module.exports = add; |
|
|
|
/** |
|
* Adds two vec3's |
|
* |
|
* @param {vec3} out the receiving vector |
|
* @param {vec3} a the first operand |
|
* @param {vec3} b the second operand |
|
* @returns {vec3} out |
|
*/ |
|
function add(out, a, b) { |
|
out[0] = a[0] + b[0] |
|
out[1] = a[1] + b[1] |
|
out[2] = a[2] + b[2] |
|
return out |
|
} |
|
},{}],122:[function(require,module,exports){ |
|
module.exports = angle |
|
|
|
var fromValues = require('./fromValues') |
|
var normalize = require('./normalize') |
|
var dot = require('./dot') |
|
|
|
/** |
|
* Get the angle between two 3D vectors |
|
* @param {vec3} a The first operand |
|
* @param {vec3} b The second operand |
|
* @returns {Number} The angle in radians |
|
*/ |
|
function angle(a, b) { |
|
var tempA = fromValues(a[0], a[1], a[2]) |
|
var tempB = fromValues(b[0], b[1], b[2]) |
|
|
|
normalize(tempA, tempA) |
|
normalize(tempB, tempB) |
|
|
|
var cosine = dot(tempA, tempB) |
|
|
|
if(cosine > 1.0){ |
|
return 0 |
|
} else { |
|
return Math.acos(cosine) |
|
} |
|
} |
|
|
|
},{"./dot":129,"./fromValues":131,"./normalize":140}],123:[function(require,module,exports){ |
|
module.exports = clone; |
|
|
|
/** |
|
* Creates a new vec3 initialized with values from an existing vector |
|
* |
|
* @param {vec3} a vector to clone |
|
* @returns {vec3} a new 3D vector |
|
*/ |
|
function clone(a) { |
|
var out = new Float32Array(3) |
|
out[0] = a[0] |
|
out[1] = a[1] |
|
out[2] = a[2] |
|
return out |
|
} |
|
},{}],124:[function(require,module,exports){ |
|
module.exports = copy; |
|
|
|
/** |
|
* Copy the values from one vec3 to another |
|
* |
|
* @param {vec3} out the receiving vector |
|
* @param {vec3} a the source vector |
|
* @returns {vec3} out |
|
*/ |
|
function copy(out, a) { |
|
out[0] = a[0] |
|
out[1] = a[1] |
|
out[2] = a[2] |
|
return out |
|
} |
|
},{}],125:[function(require,module,exports){ |
|
module.exports = create; |
|
|
|
/** |
|
* Creates a new, empty vec3 |
|
* |
|
* @returns {vec3} a new 3D vector |
|
*/ |
|
function create() { |
|
var out = new Float32Array(3) |
|
out[0] = 0 |
|
out[1] = 0 |
|
out[2] = 0 |
|
return out |
|
} |
|
},{}],126:[function(require,module,exports){ |
|
module.exports = cross; |
|
|
|
/** |
|
* Computes the cross product of two vec3's |
|
* |
|
* @param {vec3} out the receiving vector |
|
* @param {vec3} a the first operand |
|
* @param {vec3} b the second operand |
|
* @returns {vec3} out |
|
*/ |
|
function cross(out, a, b) { |
|
var ax = a[0], ay = a[1], az = a[2], |
|
bx = b[0], by = b[1], bz = b[2] |
|
|
|
out[0] = ay * bz - az * by |
|
out[1] = az * bx - ax * bz |
|
out[2] = ax * by - ay * bx |
|
return out |
|
} |
|
},{}],127:[function(require,module,exports){ |
|
module.exports = distance; |
|
|
|
/** |
|
* Calculates the euclidian distance between two vec3's |
|
* |
|
* @param {vec3} a the first operand |
|
* @param {vec3} b the second operand |
|
* @returns {Number} distance between a and b |
|
*/ |
|
function distance(a, b) { |
|
var x = b[0] - a[0], |
|
y = b[1] - a[1], |
|
z = b[2] - a[2] |
|
return Math.sqrt(x*x + y*y + z*z) |
|
} |
|
},{}],128:[function(require,module,exports){ |
|
module.exports = divide; |
|
|
|
/** |
|
* Divides two vec3's |
|
* |
|
* @param {vec3} out the receiving vector |
|
* @param {vec3} a the first operand |
|
* @param {vec3} b the second operand |
|
* @returns {vec3} out |
|
*/ |
|
function divide(out, a, b) { |
|
out[0] = a[0] / b[0] |
|
out[1] = a[1] / b[1] |
|
out[2] = a[2] / b[2] |
|
return out |
|
} |
|
},{}],129:[function(require,module,exports){ |
|
module.exports = dot; |
|
|
|
/** |
|
* Calculates the dot product of two vec3's |
|
* |
|
* @param {vec3} a the first operand |
|
* @param {vec3} b the second operand |
|
* @returns {Number} dot product of a and b |
|
*/ |
|
function dot(a, b) { |
|
return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] |
|
} |
|
},{}],130:[function(require,module,exports){ |
|
module.exports = forEach; |
|
|
|
var vec = require('./create')() |
|
|
|
/** |
|
* Perform some operation over an array of vec3s. |
|
* |
|
* @param {Array} a the array of vectors to iterate over |
|
* @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed |
|
* @param {Number} offset Number of elements to skip at the beginning of the array |
|
* @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array |
|
* @param {Function} fn Function to call for each vector in the array |
|
* @param {Object} [arg] additional argument to pass to fn |
|
* @returns {Array} a |
|
* @function |
|
*/ |
|
function forEach(a, stride, offset, count, fn, arg) { |
|
var i, l |
|
if(!stride) { |
|
stride = 3 |
|
} |
|
|
|
if(!offset) { |
|
offset = 0 |
|
} |
|
|
|
if(count) { |
|
l = Math.min((count * stride) + offset, a.length) |
|
} else { |
|
l = a.length |
|
} |
|
|
|
for(i = offset; i < l; i += stride) { |
|
vec[0] = a[i] |
|
vec[1] = a[i+1] |
|
vec[2] = a[i+2] |
|
fn(vec, vec, arg) |
|
a[i] = vec[0] |
|
a[i+1] = vec[1] |
|
a[i+2] = vec[2] |
|
} |
|
|
|
return a |
|
} |
|
},{"./create":125}],131:[function(require,module,exports){ |
|
module.exports = fromValues; |
|
|
|
/** |
|
* Creates a new vec3 initialized with the given values |
|
* |
|
* @param {Number} x X component |
|
* @param {Number} y Y component |
|
* @param {Number} z Z component |
|
* @returns {vec3} a new 3D vector |
|
*/ |
|
function fromValues(x, y, z) { |
|
var out = new Float32Array(3) |
|
out[0] = x |
|
out[1] = y |
|
out[2] = z |
|
return out |
|
} |
|
},{}],132:[function(require,module,exports){ |
|
module.exports = { |
|
create: require('./create') |
|
, clone: require('./clone') |
|
, angle: require('./angle') |
|
, fromValues: require('./fromValues') |
|
, copy: require('./copy') |
|
, set: require('./set') |
|
, add: require('./add') |
|
, subtract: require('./subtract') |
|
, multiply: require('./multiply') |
|
, divide: require('./divide') |
|
, min: require('./min') |
|
, max: require('./max') |
|
, scale: require('./scale') |
|
, scaleAndAdd: require('./scaleAndAdd') |
|
, distance: require('./distance') |
|
, squaredDistance: require('./squaredDistance') |
|
, length: require('./length') |
|
, squaredLength: require('./squaredLength') |
|
, negate: require('./negate') |
|
, inverse: require('./inverse') |
|
, normalize: require('./normalize') |
|
, dot: require('./dot') |
|
, cross: require('./cross') |
|
, lerp: require('./lerp') |
|
, random: require('./random') |
|
, transformMat4: require('./transformMat4') |
|
, transformMat3: require('./transformMat3') |
|
, transformQuat: require('./transformQuat') |
|
, rotateX: require('./rotateX') |
|
, rotateY: require('./rotateY') |
|
, rotateZ: require('./rotateZ') |
|
, forEach: require('./forEach') |
|
} |
|
},{"./add":121,"./angle":122,"./clone":123,"./copy":124,"./create":125,"./cross":126,"./distance":127,"./divide":128,"./dot":129,"./forEach":130,"./fromValues":131,"./inverse":133,"./length":134,"./lerp":135,"./max":136,"./min":137,"./multiply":138,"./negate":139,"./normalize":140,"./random":141,"./rotateX":142,"./rotateY":143,"./rotateZ":144,"./scale":145,"./scaleAndAdd":146,"./set":147,"./squaredDistance":148,"./squaredLength":149,"./subtract":150,"./transformMat3":151,"./transformMat4":152,"./transformQuat":153}],133:[function(require,module,exports){ |
|
module.exports = inverse; |
|
|
|
/** |
|
* Returns the inverse of the components of a vec3 |
|
* |
|
* @param {vec3} out the receiving vector |
|
* @param {vec3} a vector to invert |
|
* @returns {vec3} out |
|
*/ |
|
function inverse(out, a) { |
|
out[0] = 1.0 / a[0] |
|
out[1] = 1.0 / a[1] |
|
out[2] = 1.0 / a[2] |
|
return out |
|
} |
|
},{}],134:[function(require,module,exports){ |
|
module.exports = length; |
|
|
|
/** |
|
* Calculates the length of a vec3 |
|
* |
|
* @param {vec3} a vector to calculate length of |
|
* @returns {Number} length of a |
|
*/ |
|
function length(a) { |
|
var x = a[0], |
|
y = a[1], |
|
z = a[2] |
|
return Math.sqrt(x*x + y*y + z*z) |
|
} |
|
},{}],135:[function(require,module,exports){ |
|
module.exports = lerp; |
|
|
|
/** |
|
* Performs a linear interpolation between two vec3's |
|
* |
|
* @param {vec3} out the receiving vector |
|
* @param {vec3} a the first operand |
|
* @param {vec3} b the second operand |
|
* @param {Number} t interpolation amount between the two inputs |
|
* @returns {vec3} out |
|
*/ |
|
function lerp(out, a, b, t) { |
|
var ax = a[0], |
|
ay = a[1], |
|
az = a[2] |
|
out[0] = ax + t * (b[0] - ax) |
|
out[1] = ay + t * (b[1] - ay) |
|
out[2] = az + t * (b[2] - az) |
|
return out |
|
} |
|
},{}],136:[function(require,module,exports){ |
|
module.exports = max; |
|
|
|
/** |
|
* Returns the maximum of two vec3's |
|
* |
|
* @param {vec3} out the receiving vector |
|
* @param {vec3} a the first operand |
|
* @param {vec3} b the second operand |
|
* @returns {vec3} out |
|
*/ |
|
function max(out, a, b) { |
|
out[0] = Math.max(a[0], b[0]) |
|
out[1] = Math.max(a[1], b[1]) |
|
out[2] = Math.max(a[2], b[2]) |
|
return out |
|
} |
|
},{}],137:[function(require,module,exports){ |
|
module.exports = min; |
|
|
|
/** |
|
* Returns the minimum of two vec3's |
|
* |
|
* @param {vec3} out the receiving vector |
|
* @param {vec3} a the first operand |
|
* @param {vec3} b the second operand |
|
* @returns {vec3} out |
|
*/ |
|
function min(out, a, b) { |
|
out[0] = Math.min(a[0], b[0]) |
|
out[1] = Math.min(a[1], b[1]) |
|
out[2] = Math.min(a[2], b[2]) |
|
return out |
|
} |
|
},{}],138:[function(require,module,exports){ |
|
module.exports = multiply; |
|
|
|
/** |
|
* Multiplies two vec3's |
|
* |
|
* @param {vec3} out the receiving vector |
|
* @param {vec3} a the first operand |
|
* @param {vec3} b the second operand |
|
* @returns {vec3} out |
|
*/ |
|
function multiply(out, a, b) { |
|
out[0] = a[0] * b[0] |
|
out[1] = a[1] * b[1] |
|
out[2] = a[2] * b[2] |
|
return out |
|
} |
|
},{}],139:[function(require,module,exports){ |
|
module.exports = negate; |
|
|
|
/** |
|
* Negates the components of a vec3 |
|
* |
|
* @param {vec3} out the receiving vector |
|
* @param {vec3} a vector to negate |
|
* @returns {vec3} out |
|
*/ |
|
function negate(out, a) { |
|
out[0] = -a[0] |
|
out[1] = -a[1] |
|
out[2] = -a[2] |
|
return out |
|
} |
|
},{}],140:[function(require,module,exports){ |
|
module.exports = normalize; |
|
|
|
/** |
|
* Normalize a vec3 |
|
* |
|
* @param {vec3} out the receiving vector |
|
* @param {vec3} a vector to normalize |
|
* @returns {vec3} out |
|
*/ |
|
function normalize(out, a) { |
|
var x = a[0], |
|
y = a[1], |
|
z = a[2] |
|
var len = x*x + y*y + z*z |
|
if (len > 0) { |
|
//TODO: evaluate use of glm_invsqrt here? |
|
len = 1 / Math.sqrt(len) |
|
out[0] = a[0] * len |
|
out[1] = a[1] * len |
|
out[2] = a[2] * len |
|
} |
|
return out |
|
} |
|
},{}],141:[function(require,module,exports){ |
|
module.exports = random; |
|
|
|
/** |
|
* Generates a random vector with the given scale |
|
* |
|
* @param {vec3} out the receiving vector |
|
* @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned |
|
* @returns {vec3} out |
|
*/ |
|
function random(out, scale) { |
|
scale = scale || 1.0 |
|
|
|
var r = Math.random() * 2.0 * Math.PI |
|
var z = (Math.random() * 2.0) - 1.0 |
|
var zScale = Math.sqrt(1.0-z*z) * scale |
|
|
|
out[0] = Math.cos(r) * zScale |
|
out[1] = Math.sin(r) * zScale |
|
out[2] = z * scale |
|
return out |
|
} |
|
},{}],142:[function(require,module,exports){ |
|
module.exports = rotateX; |
|
|
|
/** |
|
* Rotate a 3D vector around the x-axis |
|
* @param {vec3} out The receiving vec3 |
|
* @param {vec3} a The vec3 point to rotate |
|
* @param {vec3} b The origin of the rotation |
|
* @param {Number} c The angle of rotation |
|
* @returns {vec3} out |
|
*/ |
|
function rotateX(out, a, b, c){ |
|
var p = [], r=[] |
|
//Translate point to the origin |
|
p[0] = a[0] - b[0] |
|
p[1] = a[1] - b[1] |
|
p[2] = a[2] - b[2] |
|
|
|
//perform rotation |
|
r[0] = p[0] |
|
r[1] = p[1]*Math.cos(c) - p[2]*Math.sin(c) |
|
r[2] = p[1]*Math.sin(c) + p[2]*Math.cos(c) |
|
|
|
//translate to correct position |
|
out[0] = r[0] + b[0] |
|
out[1] = r[1] + b[1] |
|
out[2] = r[2] + b[2] |
|
|
|
return out |
|
} |
|
},{}],143:[function(require,module,exports){ |
|
module.exports = rotateY; |
|
|
|
/** |
|
* Rotate a 3D vector around the y-axis |
|
* @param {vec3} out The receiving vec3 |
|
* @param {vec3} a The vec3 point to rotate |
|
* @param {vec3} b The origin of the rotation |
|
* @param {Number} c The angle of rotation |
|
* @returns {vec3} out |
|
*/ |
|
function rotateY(out, a, b, c){ |
|
var p = [], r=[] |
|
//Translate point to the origin |
|
p[0] = a[0] - b[0] |
|
p[1] = a[1] - b[1] |
|
p[2] = a[2] - b[2] |
|
|
|
//perform rotation |
|
r[0] = p[2]*Math.sin(c) + p[0]*Math.cos(c) |
|
r[1] = p[1] |
|
r[2] = p[2]*Math.cos(c) - p[0]*Math.sin(c) |
|
|
|
//translate to correct position |
|
out[0] = r[0] + b[0] |
|
out[1] = r[1] + b[1] |
|
out[2] = r[2] + b[2] |
|
|
|
return out |
|
} |
|
},{}],144:[function(require,module,exports){ |
|
module.exports = rotateZ; |
|
|
|
/** |
|
* Rotate a 3D vector around the z-axis |
|
* @param {vec3} out The receiving vec3 |
|
* @param {vec3} a The vec3 point to rotate |
|
* @param {vec3} b The origin of the rotation |
|
* @param {Number} c The angle of rotation |
|
* @returns {vec3} out |
|
*/ |
|
function rotateZ(out, a, b, c){ |
|
var p = [], r=[] |
|
//Translate point to the origin |
|
p[0] = a[0] - b[0] |
|
p[1] = a[1] - b[1] |
|
p[2] = a[2] - b[2] |
|
|
|
//perform rotation |
|
r[0] = p[0]*Math.cos(c) - p[1]*Math.sin(c) |
|
r[1] = p[0]*Math.sin(c) + p[1]*Math.cos(c) |
|
r[2] = p[2] |
|
|
|
//translate to correct position |
|
out[0] = r[0] + b[0] |
|
out[1] = r[1] + b[1] |
|
out[2] = r[2] + b[2] |
|
|
|
return out |
|
} |
|
},{}],145:[function(require,module,exports){ |
|
module.exports = scale; |
|
|
|
/** |
|
* Scales a vec3 by a scalar number |
|
* |
|
* @param {vec3} out the receiving vector |
|
* @param {vec3} a the vector to scale |
|
* @param {Number} b amount to scale the vector by |
|
* @returns {vec3} out |
|
*/ |
|
function scale(out, a, b) { |
|
out[0] = a[0] * b |
|
out[1] = a[1] * b |
|
out[2] = a[2] * b |
|
return out |
|
} |
|
},{}],146:[function(require,module,exports){ |
|
module.exports = scaleAndAdd; |
|
|
|
/** |
|
* Adds two vec3's after scaling the second operand by a scalar value |
|
* |
|
* @param {vec3} out the receiving vector |
|
* @param {vec3} a the first operand |
|
* @param {vec3} b the second operand |
|
* @param {Number} scale the amount to scale b by before adding |
|
* @returns {vec3} out |
|
*/ |
|
function scaleAndAdd(out, a, b, scale) { |
|
out[0] = a[0] + (b[0] * scale) |
|
out[1] = a[1] + (b[1] * scale) |
|
out[2] = a[2] + (b[2] * scale) |
|
return out |
|
} |
|
},{}],147:[function(require,module,exports){ |
|
module.exports = set; |
|
|
|
/** |
|
* Set the components of a vec3 to the given values |
|
* |
|
* @param {vec3} out the receiving vector |
|
* @param {Number} x X component |
|
* @param {Number} y Y component |
|
* @param {Number} z Z component |
|
* @returns {vec3} out |
|
*/ |
|
function set(out, x, y, z) { |
|
out[0] = x |
|
out[1] = y |
|
out[2] = z |
|
return out |
|
} |
|
},{}],148:[function(require,module,exports){ |
|
module.exports = squaredDistance; |
|
|
|
/** |
|
* Calculates the squared euclidian distance between two vec3's |
|
* |
|
* @param {vec3} a the first operand |
|
* @param {vec3} b the second operand |
|
* @returns {Number} squared distance between a and b |
|
*/ |
|
function squaredDistance(a, b) { |
|
var x = b[0] - a[0], |
|
y = b[1] - a[1], |
|
z = b[2] - a[2] |
|
return x*x + y*y + z*z |
|
} |
|
},{}],149:[function(require,module,exports){ |
|
module.exports = squaredLength; |
|
|
|
/** |
|
* Calculates the squared length of a vec3 |
|
* |
|
* @param {vec3} a vector to calculate squared length of |
|
* @returns {Number} squared length of a |
|
*/ |
|
function squaredLength(a) { |
|
var x = a[0], |
|
y = a[1], |
|
z = a[2] |
|
return x*x + y*y + z*z |
|
} |
|
},{}],150:[function(require,module,exports){ |
|
module.exports = subtract; |
|
|
|
/** |
|
* Subtracts vector b from vector a |
|
* |
|
* @param {vec3} out the receiving vector |
|
* @param {vec3} a the first operand |
|
* @param {vec3} b the second operand |
|
* @returns {vec3} out |
|
*/ |
|
function subtract(out, a, b) { |
|
out[0] = a[0] - b[0] |
|
out[1] = a[1] - b[1] |
|
out[2] = a[2] - b[2] |
|
return out |
|
} |
|
},{}],151:[function(require,module,exports){ |
|
module.exports = transformMat3; |
|
|
|
/** |
|
* Transforms the vec3 with a mat3. |
|
* |
|
* @param {vec3} out the receiving vector |
|
* @param {vec3} a the vector to transform |
|
* @param {mat4} m the 3x3 matrix to transform with |
|
* @returns {vec3} out |
|
*/ |
|
function transformMat3(out, a, m) { |
|
var x = a[0], y = a[1], z = a[2] |
|
out[0] = x * m[0] + y * m[3] + z * m[6] |
|
out[1] = x * m[1] + y * m[4] + z * m[7] |
|
out[2] = x * m[2] + y * m[5] + z * m[8] |
|
return out |
|
} |
|
},{}],152:[function(require,module,exports){ |
|
module.exports = transformMat4; |
|
|
|
/** |
|
* Transforms the vec3 with a mat4. |
|
* 4th vector component is implicitly '1' |
|
* |
|
* @param {vec3} out the receiving vector |
|
* @param {vec3} a the vector to transform |
|
* @param {mat4} m matrix to transform with |
|
* @returns {vec3} out |
|
*/ |
|
function transformMat4(out, a, m) { |
|
var x = a[0], y = a[1], z = a[2], |
|
w = m[3] * x + m[7] * y + m[11] * z + m[15] |
|
w = w || 1.0 |
|
out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w |
|
out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w |
|
out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w |
|
return out |
|
} |
|
},{}],153:[function(require,module,exports){ |
|
module.exports = transformQuat; |
|
|
|
/** |
|
* Transforms the vec3 with a quat |
|
* |
|
* @param {vec3} out the receiving vector |
|
* @param {vec3} a the vector to transform |
|
* @param {quat} q quaternion to transform with |
|
* @returns {vec3} out |
|
*/ |
|
function transformQuat(out, a, q) { |
|
// benchmarks: http://jsperf.com/quaternion-transform-vec3-implementations |
|
|
|
var x = a[0], y = a[1], z = a[2], |
|
qx = q[0], qy = q[1], qz = q[2], qw = q[3], |
|
|
|
// calculate quat * vec |
|
ix = qw * x + qy * z - qz * y, |
|
iy = qw * y + qz * x - qx * z, |
|
iz = qw * z + qx * y - qy * x, |
|
iw = -qx * x - qy * y - qz * z |
|
|
|
// calculate result * inverse quat |
|
out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy |
|
out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz |
|
out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx |
|
return out |
|
} |
|
},{}],154:[function(require,module,exports){ |
|
module.exports = add |
|
|
|
/** |
|
* Adds two vec4's |
|
* |
|
* @param {vec4} out the receiving vector |
|
* @param {vec4} a the first operand |
|
* @param {vec4} b the second operand |
|
* @returns {vec4} out |
|
*/ |
|
function add (out, a, b) { |
|
out[0] = a[0] + b[0] |
|
out[1] = a[1] + b[1] |
|
out[2] = a[2] + b[2] |
|
out[3] = a[3] + b[3] |
|
return out |
|
} |
|
|
|
},{}],155:[function(require,module,exports){ |
|
module.exports = clone |
|
|
|
/** |
|
* Creates a new vec4 initialized with values from an existing vector |
|
* |
|
* @param {vec4} a vector to clone |
|
* @returns {vec4} a new 4D vector |
|
*/ |
|
function clone (a) { |
|
var out = new Float32Array(4) |
|
out[0] = a[0] |
|
out[1] = a[1] |
|
out[2] = a[2] |
|
out[3] = a[3] |
|
return out |
|
} |
|
|
|
},{}],156:[function(require,module,exports){ |
|
module.exports = copy |
|
|
|
/** |
|
* Copy the values from one vec4 to another |
|
* |
|
* @param {vec4} out the receiving vector |
|
* @param {vec4} a the source vector |
|
* @returns {vec4} out |
|
*/ |
|
function copy (out, a) { |
|
out[0] = a[0] |
|
out[1] = a[1] |
|
out[2] = a[2] |
|
out[3] = a[3] |
|
return out |
|
} |
|
|
|
},{}],157:[function(require,module,exports){ |
|
module.exports = create |
|
|
|
/** |
|
* Creates a new, empty vec4 |
|
* |
|
* @returns {vec4} a new 4D vector |
|
*/ |
|
function create () { |
|
var out = new Float32Array(4) |
|
out[0] = 0 |
|
out[1] = 0 |
|
out[2] = 0 |
|
out[3] = 0 |
|
return out |
|
} |
|
|
|
},{}],158:[function(require,module,exports){ |
|
module.exports = distance |
|
|
|
/** |
|
* Calculates the euclidian distance between two vec4's |
|
* |
|
* @param {vec4} a the first operand |
|
* @param {vec4} b the second operand |
|
* @returns {Number} distance between a and b |
|
*/ |
|
function distance (a, b) { |
|
var x = b[0] - a[0], |
|
y = b[1] - a[1], |
|
z = b[2] - a[2], |
|
w = b[3] - a[3] |
|
return Math.sqrt(x * x + y * y + z * z + w * w) |
|
} |
|
|
|
},{}],159:[function(require,module,exports){ |
|
module.exports = divide |
|
|
|
/** |
|
* Divides two vec4's |
|
* |
|
* @param {vec4} out the receiving vector |
|
* @param {vec4} a the first operand |
|
* @param {vec4} b the second operand |
|
* @returns {vec4} out |
|
*/ |
|
function divide (out, a, b) { |
|
out[0] = a[0] / b[0] |
|
out[1] = a[1] / b[1] |
|
out[2] = a[2] / b[2] |
|
out[3] = a[3] / b[3] |
|
return out |
|
} |
|
|
|
},{}],160:[function(require,module,exports){ |
|
module.exports = dot |
|
|
|
/** |
|
* Calculates the dot product of two vec4's |
|
* |
|
* @param {vec4} a the first operand |
|
* @param {vec4} b the second operand |
|
* @returns {Number} dot product of a and b |
|
*/ |
|
function dot (a, b) { |
|
return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3] |
|
} |
|
|
|
},{}],161:[function(require,module,exports){ |
|
module.exports = fromValues |
|
|
|
/** |
|
* Creates a new vec4 initialized with the given values |
|
* |
|
* @param {Number} x X component |
|
* @param {Number} y Y component |
|
* @param {Number} z Z component |
|
* @param {Number} w W component |
|
* @returns {vec4} a new 4D vector |
|
*/ |
|
function fromValues (x, y, z, w) { |
|
var out = new Float32Array(4) |
|
out[0] = x |
|
out[1] = y |
|
out[2] = z |
|
out[3] = w |
|
return out |
|
} |
|
|
|
},{}],162:[function(require,module,exports){ |
|
module.exports = { |
|
create: require('./create'), |
|
clone: require('./clone'), |
|
fromValues: require('./fromValues'), |
|
copy: require('./copy'), |
|
set: require('./set'), |
|
add: require('./add'), |
|
subtract: require('./subtract'), |
|
multiply: require('./multiply'), |
|
divide: require('./divide'), |
|
min: require('./min'), |
|
max: require('./max'), |
|
scale: require('./scale'), |
|
scaleAndAdd: require('./scaleAndAdd'), |
|
distance: require('./distance'), |
|
squaredDistance: require('./squaredDistance'), |
|
length: require('./length'), |
|
squaredLength: require('./squaredLength'), |
|
negate: require('./negate'), |
|
inverse: require('./inverse'), |
|
normalize: require('./normalize'), |
|
dot: require('./dot'), |
|
lerp: require('./lerp'), |
|
random: require('./random'), |
|
transformMat4: require('./transformMat4'), |
|
transformQuat: require('./transformQuat') |
|
} |
|
|
|
},{"./add":154,"./clone":155,"./copy":156,"./create":157,"./distance":158,"./divide":159,"./dot":160,"./fromValues":161,"./inverse":163,"./length":164,"./lerp":165,"./max":166,"./min":167,"./multiply":168,"./negate":169,"./normalize":170,"./random":171,"./scale":172,"./scaleAndAdd":173,"./set":174,"./squaredDistance":175,"./squaredLength":176,"./subtract":177,"./transformMat4":178,"./transformQuat":179}],163:[function(require,module,exports){ |
|
module.exports = inverse |
|
|
|
/** |
|
* Returns the inverse of the components of a vec4 |
|
* |
|
* @param {vec4} out the receiving vector |
|
* @param {vec4} a vector to invert |
|
* @returns {vec4} out |
|
*/ |
|
function inverse (out, a) { |
|
out[0] = 1.0 / a[0] |
|
out[1] = 1.0 / a[1] |
|
out[2] = 1.0 / a[2] |
|
out[3] = 1.0 / a[3] |
|
return out |
|
} |
|
|
|
},{}],164:[function(require,module,exports){ |
|
module.exports = length |
|
|
|
/** |
|
* Calculates the length of a vec4 |
|
* |
|
* @param {vec4} a vector to calculate length of |
|
* @returns {Number} length of a |
|
*/ |
|
function length (a) { |
|
var x = a[0], |
|
y = a[1], |
|
z = a[2], |
|
w = a[3] |
|
return Math.sqrt(x * x + y * y + z * z + w * w) |
|
} |
|
|
|
},{}],165:[function(require,module,exports){ |
|
module.exports = lerp |
|
|
|
/** |
|
* Performs a linear interpolation between two vec4's |
|
* |
|
* @param {vec4} out the receiving vector |
|
* @param {vec4} a the first operand |
|
* @param {vec4} b the second operand |
|
* @param {Number} t interpolation amount between the two inputs |
|
* @returns {vec4} out |
|
*/ |
|
function lerp (out, a, b, t) { |
|
var ax = a[0], |
|
ay = a[1], |
|
az = a[2], |
|
aw = a[3] |
|
out[0] = ax + t * (b[0] - ax) |
|
out[1] = ay + t * (b[1] - ay) |
|
out[2] = az + t * (b[2] - az) |
|
out[3] = aw + t * (b[3] - aw) |
|
return out |
|
} |
|
|
|
},{}],166:[function(require,module,exports){ |
|
module.exports = max |
|
|
|
/** |
|
* Returns the maximum of two vec4's |
|
* |
|
* @param {vec4} out the receiving vector |
|
* @param {vec4} a the first operand |
|
* @param {vec4} b the second operand |
|
* @returns {vec4} out |
|
*/ |
|
function max (out, a, b) { |
|
out[0] = Math.max(a[0], b[0]) |
|
out[1] = Math.max(a[1], b[1]) |
|
out[2] = Math.max(a[2], b[2]) |
|
out[3] = Math.max(a[3], b[3]) |
|
return out |
|
} |
|
|
|
},{}],167:[function(require,module,exports){ |
|
module.exports = min |
|
|
|
/** |
|
* Returns the minimum of two vec4's |
|
* |
|
* @param {vec4} out the receiving vector |
|
* @param {vec4} a the first operand |
|
* @param {vec4} b the second operand |
|
* @returns {vec4} out |
|
*/ |
|
function min (out, a, b) { |
|
out[0] = Math.min(a[0], b[0]) |
|
out[1] = Math.min(a[1], b[1]) |
|
out[2] = Math.min(a[2], b[2]) |
|
out[3] = Math.min(a[3], b[3]) |
|
return out |
|
} |
|
|
|
},{}],168:[function(require,module,exports){ |
|
module.exports = multiply |
|
|
|
/** |
|
* Multiplies two vec4's |
|
* |
|
* @param {vec4} out the receiving vector |
|
* @param {vec4} a the first operand |
|
* @param {vec4} b the second operand |
|
* @returns {vec4} out |
|
*/ |
|
function multiply (out, a, b) { |
|
out[0] = a[0] * b[0] |
|
out[1] = a[1] * b[1] |
|
out[2] = a[2] * b[2] |
|
out[3] = a[3] * b[3] |
|
return out |
|
} |
|
|
|
},{}],169:[function(require,module,exports){ |
|
module.exports = negate |
|
|
|
/** |
|
* Negates the components of a vec4 |
|
* |
|
* @param {vec4} out the receiving vector |
|
* @param {vec4} a vector to negate |
|
* @returns {vec4} out |
|
*/ |
|
function negate (out, a) { |
|
out[0] = -a[0] |
|
out[1] = -a[1] |
|
out[2] = -a[2] |
|
out[3] = -a[3] |
|
return out |
|
} |
|
|
|
},{}],170:[function(require,module,exports){ |
|
module.exports = normalize |
|
|
|
/** |
|
* Normalize a vec4 |
|
* |
|
* @param {vec4} out the receiving vector |
|
* @param {vec4} a vector to normalize |
|
* @returns {vec4} out |
|
*/ |
|
function normalize (out, a) { |
|
var x = a[0], |
|
y = a[1], |
|
z = a[2], |
|
w = a[3] |
|
var len = x * x + y * y + z * z + w * w |
|
if (len > 0) { |
|
len = 1 / Math.sqrt(len) |
|
out[0] = x * len |
|
out[1] = y * len |
|
out[2] = z * len |
|
out[3] = w * len |
|
} |
|
return out |
|
} |
|
|
|
},{}],171:[function(require,module,exports){ |
|
var vecNormalize = require('./normalize') |
|
var vecScale = require('./scale') |
|
|
|
module.exports = random |
|
|
|
/** |
|
* Generates a random vector with the given scale |
|
* |
|
* @param {vec4} out the receiving vector |
|
* @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned |
|
* @returns {vec4} out |
|
*/ |
|
function random (out, scale) { |
|
scale = scale || 1.0 |
|
|
|
// TODO: This is a pretty awful way of doing this. Find something better. |
|
out[0] = Math.random() |
|
out[1] = Math.random() |
|
out[2] = Math.random() |
|
out[3] = Math.random() |
|
vecNormalize(out, out) |
|
vecScale(out, out, scale) |
|
return out |
|
} |
|
|
|
},{"./normalize":170,"./scale":172}],172:[function(require,module,exports){ |
|
module.exports = scale |
|
|
|
/** |
|
* Scales a vec4 by a scalar number |
|
* |
|
* @param {vec4} out the receiving vector |
|
* @param {vec4} a the vector to scale |
|
* @param {Number} b amount to scale the vector by |
|
* @returns {vec4} out |
|
*/ |
|
function scale (out, a, b) { |
|
out[0] = a[0] * b |
|
out[1] = a[1] * b |
|
out[2] = a[2] * b |
|
out[3] = a[3] * b |
|
return out |
|
} |
|
|
|
},{}],173:[function(require,module,exports){ |
|
module.exports = scaleAndAdd |
|
|
|
/** |
|
* Adds two vec4's after scaling the second operand by a scalar value |
|
* |
|
* @param {vec4} out the receiving vector |
|
* @param {vec4} a the first operand |
|
* @param {vec4} b the second operand |
|
* @param {Number} scale the amount to scale b by before adding |
|
* @returns {vec4} out |
|
*/ |
|
function scaleAndAdd (out, a, b, scale) { |
|
out[0] = a[0] + (b[0] * scale) |
|
out[1] = a[1] + (b[1] * scale) |
|
out[2] = a[2] + (b[2] * scale) |
|
out[3] = a[3] + (b[3] * scale) |
|
return out |
|
} |
|
|
|
},{}],174:[function(require,module,exports){ |
|
module.exports = set |
|
|
|
/** |
|
* Set the components of a vec4 to the given values |
|
* |
|
* @param {vec4} out the receiving vector |
|
* @param {Number} x X component |
|
* @param {Number} y Y component |
|
* @param {Number} z Z component |
|
* @param {Number} w W component |
|
* @returns {vec4} out |
|
*/ |
|
function set (out, x, y, z, w) { |
|
out[0] = x |
|
out[1] = y |
|
out[2] = z |
|
out[3] = w |
|
return out |
|
} |
|
|
|
},{}],175:[function(require,module,exports){ |
|
module.exports = squaredDistance |
|
|
|
/** |
|
* Calculates the squared euclidian distance between two vec4's |
|
* |
|
* @param {vec4} a the first operand |
|
* @param {vec4} b the second operand |
|
* @returns {Number} squared distance between a and b |
|
*/ |
|
function squaredDistance (a, b) { |
|
var x = b[0] - a[0], |
|
y = b[1] - a[1], |
|
z = b[2] - a[2], |
|
w = b[3] - a[3] |
|
return x * x + y * y + z * z + w * w |
|
} |
|
|
|
},{}],176:[function(require,module,exports){ |
|
module.exports = squaredLength |
|
|
|
/** |
|
* Calculates the squared length of a vec4 |
|
* |
|
* @param {vec4} a vector to calculate squared length of |
|
* @returns {Number} squared length of a |
|
*/ |
|
function squaredLength (a) { |
|
var x = a[0], |
|
y = a[1], |
|
z = a[2], |
|
w = a[3] |
|
return x * x + y * y + z * z + w * w |
|
} |
|
|
|
},{}],177:[function(require,module,exports){ |
|
module.exports = subtract |
|
|
|
/** |
|
* Subtracts vector b from vector a |
|
* |
|
* @param {vec4} out the receiving vector |
|
* @param {vec4} a the first operand |
|
* @param {vec4} b the second operand |
|
* @returns {vec4} out |
|
*/ |
|
function subtract (out, a, b) { |
|
out[0] = a[0] - b[0] |
|
out[1] = a[1] - b[1] |
|
out[2] = a[2] - b[2] |
|
out[3] = a[3] - b[3] |
|
return out |
|
} |
|
|
|
},{}],178:[function(require,module,exports){ |
|
module.exports = transformMat4 |
|
|
|
/** |
|
* Transforms the vec4 with a mat4. |
|
* |
|
* @param {vec4} out the receiving vector |
|
* @param {vec4} a the vector to transform |
|
* @param {mat4} m matrix to transform with |
|
* @returns {vec4} out |
|
*/ |
|
function transformMat4 (out, a, m) { |
|
var x = a[0], y = a[1], z = a[2], w = a[3] |
|
out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w |
|
out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w |
|
out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w |
|
out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w |
|
return out |
|
} |
|
|
|
},{}],179:[function(require,module,exports){ |
|
module.exports = transformQuat |
|
|
|
/** |
|
* Transforms the vec4 with a quat |
|
* |
|
* @param {vec4} out the receiving vector |
|
* @param {vec4} a the vector to transform |
|
* @param {quat} q quaternion to transform with |
|
* @returns {vec4} out |
|
*/ |
|
function transformQuat (out, a, q) { |
|
var x = a[0], y = a[1], z = a[2], |
|
qx = q[0], qy = q[1], qz = q[2], qw = q[3], |
|
|
|
// calculate quat * vec |
|
ix = qw * x + qy * z - qz * y, |
|
iy = qw * y + qz * x - qx * z, |
|
iz = qw * z + qx * y - qy * x, |
|
iw = -qx * x - qy * y - qz * z |
|
|
|
// calculate result * inverse quat |
|
out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy |
|
out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz |
|
out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx |
|
out[3] = a[3] |
|
return out |
|
} |
|
|
|
},{}],180:[function(require,module,exports){ |
|
var tokenize = require('glsl-tokenizer') |
|
var atob = require('atob-lite') |
|
|
|
module.exports = getName |
|
|
|
function getName(src) { |
|
var tokens = Array.isArray(src) |
|
? src |
|
: tokenize(src) |
|
|
|
for (var i = 0; i < tokens.length; i++) { |
|
var token = tokens[i] |
|
if (token.type !== 'preprocessor') continue |
|
var match = token.data.match(/\#define\s+SHADER_NAME(_B64)?\s+(.+)$/) |
|
if (!match) continue |
|
if (!match[2]) continue |
|
|
|
var b64 = match[1] |
|
var name = match[2] |
|
|
|
return (b64 ? atob(name) : name).trim() |
|
} |
|
} |
|
|
|
},{"atob-lite":17,"glsl-tokenizer":187}],181:[function(require,module,exports){ |
|
module.exports = tokenize |
|
|
|
var literals100 = require('./lib/literals') |
|
, operators = require('./lib/operators') |
|
, builtins100 = require('./lib/builtins') |
|
, literals300es = require('./lib/literals-300es') |
|
, builtins300es = require('./lib/builtins-300es') |
|
|
|
var NORMAL = 999 // <-- never emitted |
|
, TOKEN = 9999 // <-- never emitted |
|
, BLOCK_COMMENT = 0 |
|
, LINE_COMMENT = 1 |
|
, PREPROCESSOR = 2 |
|
, OPERATOR = 3 |
|
, INTEGER = 4 |
|
, FLOAT = 5 |
|
, IDENT = 6 |
|
, BUILTIN = 7 |
|
, KEYWORD = 8 |
|
, WHITESPACE = 9 |
|
, EOF = 10 |
|
, HEX = 11 |
|
|
|
var map = [ |
|
'block-comment' |
|
, 'line-comment' |
|
, 'preprocessor' |
|
, 'operator' |
|
, 'integer' |
|
, 'float' |
|
, 'ident' |
|
, 'builtin' |
|
, 'keyword' |
|
, 'whitespace' |
|
, 'eof' |
|
, 'integer' |
|
] |
|
|
|
function tokenize(opt) { |
|
var i = 0 |
|
, total = 0 |
|
, mode = NORMAL |
|
, c |
|
, last |
|
, content = [] |
|
, tokens = [] |
|
, token_idx = 0 |
|
, token_offs = 0 |
|
, line = 1 |
|
, col = 0 |
|
, start = 0 |
|
, isnum = false |
|
, isoperator = false |
|
, input = '' |
|
, len |
|
|
|
opt = opt || {} |
|
var allBuiltins = builtins100 |
|
var allLiterals = literals100 |
|
if (opt.version === '300 es') { |
|
allBuiltins = builtins300es |
|
allLiterals = literals300es |
|
} |
|
|
|
return function(data) { |
|
tokens = [] |
|
if (data !== null) return write(data.replace ? data.replace(/\r\n/g, '\n') : data) |
|
return end() |
|
} |
|
|
|
function token(data) { |
|
if (data.length) { |
|
tokens.push({ |
|
type: map[mode] |
|
, data: data |
|
, position: start |
|
, line: line |
|
, column: col |
|
}) |
|
} |
|
} |
|
|
|
function write(chunk) { |
|
i = 0 |
|
input += chunk |
|
len = input.length |
|
|
|
var last |
|
|
|
while(c = input[i], i < len) { |
|
last = i |
|
|
|
switch(mode) { |
|
case BLOCK_COMMENT: i = block_comment(); break |
|
case LINE_COMMENT: i = line_comment(); break |
|
case PREPROCESSOR: i = preprocessor(); break |
|
case OPERATOR: i = operator(); break |
|
case INTEGER: i = integer(); break |
|
case HEX: i = hex(); break |
|
case FLOAT: i = decimal(); break |
|
case TOKEN: i = readtoken(); break |
|
case WHITESPACE: i = whitespace(); break |
|
case NORMAL: i = normal(); break |
|
} |
|
|
|
if(last !== i) { |
|
switch(input[last]) { |
|
case '\n': col = 0; ++line; break |
|
default: ++col; break |
|
} |
|
} |
|
} |
|
|
|
total += i |
|
input = input.slice(i) |
|
return tokens |
|
} |
|
|
|
function end(chunk) { |
|
if(content.length) { |
|
token(content.join('')) |
|
} |
|
|
|
mode = EOF |
|
token('(eof)') |
|
return tokens |
|
} |
|
|
|
function normal() { |
|
content = content.length ? [] : content |
|
|
|
if(last === '/' && c === '*') { |
|
start = total + i - 1 |
|
mode = BLOCK_COMMENT |
|
last = c |
|
return i + 1 |
|
} |
|
|
|
if(last === '/' && c === '/') { |
|
start = total + i - 1 |
|
mode = LINE_COMMENT |
|
last = c |
|
return i + 1 |
|
} |
|
|
|
if(c === '#') { |
|
mode = PREPROCESSOR |
|
start = total + i |
|
return i |
|
} |
|
|
|
if(/\s/.test(c)) { |
|
mode = WHITESPACE |
|
start = total + i |
|
return i |
|
} |
|
|
|
isnum = /\d/.test(c) |
|
isoperator = /[^\w_]/.test(c) |
|
|
|
start = total + i |
|
mode = isnum ? INTEGER : isoperator ? OPERATOR : TOKEN |
|
return i |
|
} |
|
|
|
function whitespace() { |
|
if(/[^\s]/g.test(c)) { |
|
token(content.join('')) |
|
mode = NORMAL |
|
return i |
|
} |
|
content.push(c) |
|
last = c |
|
return i + 1 |
|
} |
|
|
|
function preprocessor() { |
|
if((c === '\r' || c === '\n') && last !== '\\') { |
|
token(content.join('')) |
|
mode = NORMAL |
|
return i |
|
} |
|
content.push(c) |
|
last = c |
|
return i + 1 |
|
} |
|
|
|
function line_comment() { |
|
return preprocessor() |
|
} |
|
|
|
function block_comment() { |
|
if(c === '/' && last === '*') { |
|
content.push(c) |
|
token(content.join('')) |
|
mode = NORMAL |
|
return i + 1 |
|
} |
|
|
|
content.push(c) |
|
last = c |
|
return i + 1 |
|
} |
|
|
|
function operator() { |
|
if(last === '.' && /\d/.test(c)) { |
|
mode = FLOAT |
|
return i |
|
} |
|
|
|
if(last === '/' && c === '*') { |
|
mode = BLOCK_COMMENT |
|
return i |
|
} |
|
|
|
if(last === '/' && c === '/') { |
|
mode = LINE_COMMENT |
|
return i |
|
} |
|
|
|
if(c === '.' && content.length) { |
|
while(determine_operator(content)); |
|
|
|
mode = FLOAT |
|
return i |
|
} |
|
|
|
if(c === ';' || c === ')' || c === '(') { |
|
if(content.length) while(determine_operator(content)); |
|
token(c) |
|
mode = NORMAL |
|
return i + 1 |
|
} |
|
|
|
var is_composite_operator = content.length === 2 && c !== '=' |
|
if(/[\w_\d\s]/.test(c) || is_composite_operator) { |
|
while(determine_operator(content)); |
|
mode = NORMAL |
|
return i |
|
} |
|
|
|
content.push(c) |
|
last = c |
|
return i + 1 |
|
} |
|
|
|
function determine_operator(buf) { |
|
var j = 0 |
|
, idx |
|
, res |
|
|
|
do { |
|
idx = operators.indexOf(buf.slice(0, buf.length + j).join('')) |
|
res = operators[idx] |
|
|
|
if(idx === -1) { |
|
if(j-- + buf.length > 0) continue |
|
res = buf.slice(0, 1).join('') |
|
} |
|
|
|
token(res) |
|
|
|
start += res.length |
|
content = content.slice(res.length) |
|
return content.length |
|
} while(1) |
|
} |
|
|
|
function hex() { |
|
if(/[^a-fA-F0-9]/.test(c)) { |
|
token(content.join('')) |
|
mode = NORMAL |
|
return i |
|
} |
|
|
|
content.push(c) |
|
last = c |
|
return i + 1 |
|
} |
|
|
|
function integer() { |
|
if(c === '.') { |
|
content.push(c) |
|
mode = FLOAT |
|
last = c |
|
return i + 1 |
|
} |
|
|
|
if(/[eE]/.test(c)) { |
|
content.push(c) |
|
mode = FLOAT |
|
last = c |
|
return i + 1 |
|
} |
|
|
|
if(c === 'x' && content.length === 1 && content[0] === '0') { |
|
mode = HEX |
|
content.push(c) |
|
last = c |
|
return i + 1 |
|
} |
|
|
|
if(/[^\d]/.test(c)) { |
|
token(content.join('')) |
|
mode = NORMAL |
|
return i |
|
} |
|
|
|
content.push(c) |
|
last = c |
|
return i + 1 |
|
} |
|
|
|
function decimal() { |
|
if(c === 'f') { |
|
content.push(c) |
|
last = c |
|
i += 1 |
|
} |
|
|
|
if(/[eE]/.test(c)) { |
|
content.push(c) |
|
last = c |
|
return i + 1 |
|
} |
|
|
|
if (c === '-' && /[eE]/.test(last)) { |
|
content.push(c) |
|
last = c |
|
return i + 1 |
|
} |
|
|
|
if(/[^\d]/.test(c)) { |
|
token(content.join('')) |
|
mode = NORMAL |
|
return i |
|
} |
|
|
|
content.push(c) |
|
last = c |
|
return i + 1 |
|
} |
|
|
|
function readtoken() { |
|
if(/[^\d\w_]/.test(c)) { |
|
var contentstr = content.join('') |
|
if(allLiterals.indexOf(contentstr) > -1) { |
|
mode = KEYWORD |
|
} else if(allBuiltins.indexOf(contentstr) > -1) { |
|
mode = BUILTIN |
|
} else { |
|
mode = IDENT |
|
} |
|
token(content.join('')) |
|
mode = NORMAL |
|
return i |
|
} |
|
content.push(c) |
|
last = c |
|
return i + 1 |
|
} |
|
} |
|
|
|
},{"./lib/builtins":183,"./lib/builtins-300es":182,"./lib/literals":185,"./lib/literals-300es":184,"./lib/operators":186}],182:[function(require,module,exports){ |
|
// 300es builtins/reserved words that were previously valid in v100 |
|
var v100 = require('./builtins') |
|
|
|
// The texture2D|Cube functions have been removed |
|
// And the gl_ features are updated |
|
v100 = v100.slice().filter(function (b) { |
|
return !/^(gl\_|texture)/.test(b) |
|
}) |
|
|
|
module.exports = v100.concat([ |
|
// the updated gl_ constants |
|
'gl_VertexID' |
|
, 'gl_InstanceID' |
|
, 'gl_Position' |
|
, 'gl_PointSize' |
|
, 'gl_FragCoord' |
|
, 'gl_FrontFacing' |
|
, 'gl_FragDepth' |
|
, 'gl_PointCoord' |
|
, 'gl_MaxVertexAttribs' |
|
, 'gl_MaxVertexUniformVectors' |
|
, 'gl_MaxVertexOutputVectors' |
|
, 'gl_MaxFragmentInputVectors' |
|
, 'gl_MaxVertexTextureImageUnits' |
|
, 'gl_MaxCombinedTextureImageUnits' |
|
, 'gl_MaxTextureImageUnits' |
|
, 'gl_MaxFragmentUniformVectors' |
|
, 'gl_MaxDrawBuffers' |
|
, 'gl_MinProgramTexelOffset' |
|
, 'gl_MaxProgramTexelOffset' |
|
, 'gl_DepthRangeParameters' |
|
, 'gl_DepthRange' |
|
|
|
// other builtins |
|
, 'trunc' |
|
, 'round' |
|
, 'roundEven' |
|
, 'isnan' |
|
, 'isinf' |
|
, 'floatBitsToInt' |
|
, 'floatBitsToUint' |
|
, 'intBitsToFloat' |
|
, 'uintBitsToFloat' |
|
, 'packSnorm2x16' |
|
, 'unpackSnorm2x16' |
|
, 'packUnorm2x16' |
|
, 'unpackUnorm2x16' |
|
, 'packHalf2x16' |
|
, 'unpackHalf2x16' |
|
, 'outerProduct' |
|
, 'transpose' |
|
, 'determinant' |
|
, 'inverse' |
|
, 'texture' |
|
, 'textureSize' |
|
, 'textureProj' |
|
, 'textureLod' |
|
, 'textureOffset' |
|
, 'texelFetch' |
|
, 'texelFetchOffset' |
|
, 'textureProjOffset' |
|
, 'textureLodOffset' |
|
, 'textureProjLod' |
|
, 'textureProjLodOffset' |
|
, 'textureGrad' |
|
, 'textureGradOffset' |
|
, 'textureProjGrad' |
|
, 'textureProjGradOffset' |
|
]) |
|
|
|
},{"./builtins":183}],183:[function(require,module,exports){ |
|
module.exports = [ |
|
// Keep this list sorted |
|
'abs' |
|
, 'acos' |
|
, 'all' |
|
, 'any' |
|
, 'asin' |
|
, 'atan' |
|
, 'ceil' |
|
, 'clamp' |
|
, 'cos' |
|
, 'cross' |
|
, 'dFdx' |
|
, 'dFdy' |
|
, 'degrees' |
|
, 'distance' |
|
, 'dot' |
|
, 'equal' |
|
, 'exp' |
|
, 'exp2' |
|
, 'faceforward' |
|
, 'floor' |
|
, 'fract' |
|
, 'gl_BackColor' |
|
, 'gl_BackLightModelProduct' |
|
, 'gl_BackLightProduct' |
|
, 'gl_BackMaterial' |
|
, 'gl_BackSecondaryColor' |
|
, 'gl_ClipPlane' |
|
, 'gl_ClipVertex' |
|
, 'gl_Color' |
|
, 'gl_DepthRange' |
|
, 'gl_DepthRangeParameters' |
|
, 'gl_EyePlaneQ' |
|
, 'gl_EyePlaneR' |
|
, 'gl_EyePlaneS' |
|
, 'gl_EyePlaneT' |
|
, 'gl_Fog' |
|
, 'gl_FogCoord' |
|
, 'gl_FogFragCoord' |
|
, 'gl_FogParameters' |
|
, 'gl_FragColor' |
|
, 'gl_FragCoord' |
|
, 'gl_FragData' |
|
, 'gl_FragDepth' |
|
, 'gl_FragDepthEXT' |
|
, 'gl_FrontColor' |
|
, 'gl_FrontFacing' |
|
, 'gl_FrontLightModelProduct' |
|
, 'gl_FrontLightProduct' |
|
, 'gl_FrontMaterial' |
|
, 'gl_FrontSecondaryColor' |
|
, 'gl_LightModel' |
|
, 'gl_LightModelParameters' |
|
, 'gl_LightModelProducts' |
|
, 'gl_LightProducts' |
|
, 'gl_LightSource' |
|
, 'gl_LightSourceParameters' |
|
, 'gl_MaterialParameters' |
|
, 'gl_MaxClipPlanes' |
|
, 'gl_MaxCombinedTextureImageUnits' |
|
, 'gl_MaxDrawBuffers' |
|
, 'gl_MaxFragmentUniformComponents' |
|
, 'gl_MaxLights' |
|
, 'gl_MaxTextureCoords' |
|
, 'gl_MaxTextureImageUnits' |
|
, 'gl_MaxTextureUnits' |
|
, 'gl_MaxVaryingFloats' |
|
, 'gl_MaxVertexAttribs' |
|
, 'gl_MaxVertexTextureImageUnits' |
|
, 'gl_MaxVertexUniformComponents' |
|
, 'gl_ModelViewMatrix' |
|
, 'gl_ModelViewMatrixInverse' |
|
, 'gl_ModelViewMatrixInverseTranspose' |
|
, 'gl_ModelViewMatrixTranspose' |
|
, 'gl_ModelViewProjectionMatrix' |
|
, 'gl_ModelViewProjectionMatrixInverse' |
|
, 'gl_ModelViewProjectionMatrixInverseTranspose' |
|
, 'gl_ModelViewProjectionMatrixTranspose' |
|
, 'gl_MultiTexCoord0' |
|
, 'gl_MultiTexCoord1' |
|
, 'gl_MultiTexCoord2' |
|
, 'gl_MultiTexCoord3' |
|
, 'gl_MultiTexCoord4' |
|
, 'gl_MultiTexCoord5' |
|
, 'gl_MultiTexCoord6' |
|
, 'gl_MultiTexCoord7' |
|
, 'gl_Normal' |
|
, 'gl_NormalMatrix' |
|
, 'gl_NormalScale' |
|
, 'gl_ObjectPlaneQ' |
|
, 'gl_ObjectPlaneR' |
|
, 'gl_ObjectPlaneS' |
|
, 'gl_ObjectPlaneT' |
|
, 'gl_Point' |
|
, 'gl_PointCoord' |
|
, 'gl_PointParameters' |
|
, 'gl_PointSize' |
|
, 'gl_Position' |
|
, 'gl_ProjectionMatrix' |
|
, 'gl_ProjectionMatrixInverse' |
|
, 'gl_ProjectionMatrixInverseTranspose' |
|
, 'gl_ProjectionMatrixTranspose' |
|
, 'gl_SecondaryColor' |
|
, 'gl_TexCoord' |
|
, 'gl_TextureEnvColor' |
|
, 'gl_TextureMatrix' |
|
, 'gl_TextureMatrixInverse' |
|
, 'gl_TextureMatrixInverseTranspose' |
|
, 'gl_TextureMatrixTranspose' |
|
, 'gl_Vertex' |
|
, 'greaterThan' |
|
, 'greaterThanEqual' |
|
, 'inversesqrt' |
|
, 'length' |
|
, 'lessThan' |
|
, 'lessThanEqual' |
|
, 'log' |
|
, 'log2' |
|
, 'matrixCompMult' |
|
, 'max' |
|
, 'min' |
|
, 'mix' |
|
, 'mod' |
|
, 'normalize' |
|
, 'not' |
|
, 'notEqual' |
|
, 'pow' |
|
, 'radians' |
|
, 'reflect' |
|
, 'refract' |
|
, 'sign' |
|
, 'sin' |
|
, 'smoothstep' |
|
, 'sqrt' |
|
, 'step' |
|
, 'tan' |
|
, 'texture2D' |
|
, 'texture2DLod' |
|
, 'texture2DProj' |
|
, 'texture2DProjLod' |
|
, 'textureCube' |
|
, 'textureCubeLod' |
|
, 'texture2DLodEXT' |
|
, 'texture2DProjLodEXT' |
|
, 'textureCubeLodEXT' |
|
, 'texture2DGradEXT' |
|
, 'texture2DProjGradEXT' |
|
, 'textureCubeGradEXT' |
|
] |
|
|
|
},{}],184:[function(require,module,exports){ |
|
var v100 = require('./literals') |
|
|
|
module.exports = v100.slice().concat([ |
|
'layout' |
|
, 'centroid' |
|
, 'smooth' |
|
, 'case' |
|
, 'mat2x2' |
|
, 'mat2x3' |
|
, 'mat2x4' |
|
, 'mat3x2' |
|
, 'mat3x3' |
|
, 'mat3x4' |
|
, 'mat4x2' |
|
, 'mat4x3' |
|
, 'mat4x4' |
|
, 'uint' |
|
, 'uvec2' |
|
, 'uvec3' |
|
, 'uvec4' |
|
, 'samplerCubeShadow' |
|
, 'sampler2DArray' |
|
, 'sampler2DArrayShadow' |
|
, 'isampler2D' |
|
, 'isampler3D' |
|
, 'isamplerCube' |
|
, 'isampler2DArray' |
|
, 'usampler2D' |
|
, 'usampler3D' |
|
, 'usamplerCube' |
|
, 'usampler2DArray' |
|
, 'coherent' |
|
, 'restrict' |
|
, 'readonly' |
|
, 'writeonly' |
|
, 'resource' |
|
, 'atomic_uint' |
|
, 'noperspective' |
|
, 'patch' |
|
, 'sample' |
|
, 'subroutine' |
|
, 'common' |
|
, 'partition' |
|
, 'active' |
|
, 'filter' |
|
, 'image1D' |
|
, 'image2D' |
|
, 'image3D' |
|
, 'imageCube' |
|
, 'iimage1D' |
|
, 'iimage2D' |
|
, 'iimage3D' |
|
, 'iimageCube' |
|
, 'uimage1D' |
|
, 'uimage2D' |
|
, 'uimage3D' |
|
, 'uimageCube' |
|
, 'image1DArray' |
|
, 'image2DArray' |
|
, 'iimage1DArray' |
|
, 'iimage2DArray' |
|
, 'uimage1DArray' |
|
, 'uimage2DArray' |
|
, 'image1DShadow' |
|
, 'image2DShadow' |
|
, 'image1DArrayShadow' |
|
, 'image2DArrayShadow' |
|
, 'imageBuffer' |
|
, 'iimageBuffer' |
|
, 'uimageBuffer' |
|
, 'sampler1DArray' |
|
, 'sampler1DArrayShadow' |
|
, 'isampler1D' |
|
, 'isampler1DArray' |
|
, 'usampler1D' |
|
, 'usampler1DArray' |
|
, 'isampler2DRect' |
|
, 'usampler2DRect' |
|
, 'samplerBuffer' |
|
, 'isamplerBuffer' |
|
, 'usamplerBuffer' |
|
, 'sampler2DMS' |
|
, 'isampler2DMS' |
|
, 'usampler2DMS' |
|
, 'sampler2DMSArray' |
|
, 'isampler2DMSArray' |
|
, 'usampler2DMSArray' |
|
]) |
|
|
|
},{"./literals":185}],185:[function(require,module,exports){ |
|
module.exports = [ |
|
// current |
|
'precision' |
|
, 'highp' |
|
, 'mediump' |
|
, 'lowp' |
|
, 'attribute' |
|
, 'const' |
|
, 'uniform' |
|
, 'varying' |
|
, 'break' |
|
, 'continue' |
|
, 'do' |
|
, 'for' |
|
, 'while' |
|
, 'if' |
|
, 'else' |
|
, 'in' |
|
, 'out' |
|
, 'inout' |
|
, 'float' |
|
, 'int' |
|
, 'void' |
|
, 'bool' |
|
, 'true' |
|
, 'false' |
|
, 'discard' |
|
, 'return' |
|
, 'mat2' |
|
, 'mat3' |
|
, 'mat4' |
|
, 'vec2' |
|
, 'vec3' |
|
, 'vec4' |
|
, 'ivec2' |
|
, 'ivec3' |
|
, 'ivec4' |
|
, 'bvec2' |
|
, 'bvec3' |
|
, 'bvec4' |
|
, 'sampler1D' |
|
, 'sampler2D' |
|
, 'sampler3D' |
|
, 'samplerCube' |
|
, 'sampler1DShadow' |
|
, 'sampler2DShadow' |
|
, 'struct' |
|
|
|
// future |
|
, 'asm' |
|
, 'class' |
|
, 'union' |
|
, 'enum' |
|
, 'typedef' |
|
, 'template' |
|
, 'this' |
|
, 'packed' |
|
, 'goto' |
|
, 'switch' |
|
, 'default' |
|
, 'inline' |
|
, 'noinline' |
|
, 'volatile' |
|
, 'public' |
|
, 'static' |
|
, 'extern' |
|
, 'external' |
|
, 'interface' |
|
, 'long' |
|
, 'short' |
|
, 'double' |
|
, 'half' |
|
, 'fixed' |
|
, 'unsigned' |
|
, 'input' |
|
, 'output' |
|
, 'hvec2' |
|
, 'hvec3' |
|
, 'hvec4' |
|
, 'dvec2' |
|
, 'dvec3' |
|
, 'dvec4' |
|
, 'fvec2' |
|
, 'fvec3' |
|
, 'fvec4' |
|
, 'sampler2DRect' |
|
, 'sampler3DRect' |
|
, 'sampler2DRectShadow' |
|
, 'sizeof' |
|
, 'cast' |
|
, 'namespace' |
|
, 'using' |
|
] |
|
|
|
},{}],186:[function(require,module,exports){ |
|
module.exports = [ |
|
'<<=' |
|
, '>>=' |
|
, '++' |
|
, '--' |
|
, '<<' |
|
, '>>' |
|
, '<=' |
|
, '>=' |
|
, '==' |
|
, '!=' |
|
, '&&' |
|
, '||' |
|
, '+=' |
|
, '-=' |
|
, '*=' |
|
, '/=' |
|
, '%=' |
|
, '&=' |
|
, '^^' |
|
, '^=' |
|
, '|=' |
|
, '(' |
|
, ')' |
|
, '[' |
|
, ']' |
|
, '.' |
|
, '!' |
|
, '~' |
|
, '*' |
|
, '/' |
|
, '%' |
|
, '+' |
|
, '-' |
|
, '<' |
|
, '>' |
|
, '&' |
|
, '^' |
|
, '|' |
|
, '?' |
|
, ':' |
|
, '=' |
|
, ',' |
|
, ';' |
|
, '{' |
|
, '}' |
|
] |
|
|
|
},{}],187:[function(require,module,exports){ |
|
var tokenize = require('./index') |
|
|
|
module.exports = tokenizeString |
|
|
|
function tokenizeString(str, opt) { |
|
var generator = tokenize(opt) |
|
var tokens = [] |
|
|
|
tokens = tokens.concat(generator(str)) |
|
tokens = tokens.concat(generator(null)) |
|
|
|
return tokens |
|
} |
|
|
|
},{"./index":181}],188:[function(require,module,exports){ |
|
"use strict" |
|
|
|
//High level idea: |
|
// 1. Use Clarkson's incremental construction to find convex hull |
|
// 2. Point location in triangulation by jump and walk |
|
|
|
module.exports = incrementalConvexHull |
|
|
|
var orient = require("robust-orientation") |
|
var compareCell = require("simplicial-complex").compareCells |
|
|
|
function compareInt(a, b) { |
|
return a - b |
|
} |
|
|
|
function Simplex(vertices, adjacent, boundary) { |
|
this.vertices = vertices |
|
this.adjacent = adjacent |
|
this.boundary = boundary |
|
this.lastVisited = -1 |
|
} |
|
|
|
Simplex.prototype.flip = function() { |
|
var t = this.vertices[0] |
|
this.vertices[0] = this.vertices[1] |
|
this.vertices[1] = t |
|
var u = this.adjacent[0] |
|
this.adjacent[0] = this.adjacent[1] |
|
this.adjacent[1] = u |
|
} |
|
|
|
function GlueFacet(vertices, cell, index) { |
|
this.vertices = vertices |
|
this.cell = cell |
|
this.index = index |
|
} |
|
|
|
function compareGlue(a, b) { |
|
return compareCell(a.vertices, b.vertices) |
|
} |
|
|
|
function bakeOrient(d) { |
|
var code = ["function orient(){var tuple=this.tuple;return test("] |
|
for(var i=0; i<=d; ++i) { |
|
if(i > 0) { |
|
code.push(",") |
|
} |
|
code.push("tuple[", i, "]") |
|
} |
|
code.push(")}return orient") |
|
var proc = new Function("test", code.join("")) |
|
var test = orient[d+1] |
|
if(!test) { |
|
test = orient |
|
} |
|
return proc(test) |
|
} |
|
|
|
var BAKED = [] |
|
|
|
function Triangulation(dimension, vertices, simplices) { |
|
this.dimension = dimension |
|
this.vertices = vertices |
|
this.simplices = simplices |
|
this.interior = simplices.filter(function(c) { |
|
return !c.boundary |
|
}) |
|
|
|
this.tuple = new Array(dimension+1) |
|
for(var i=0; i<=dimension; ++i) { |
|
this.tuple[i] = this.vertices[i] |
|
} |
|
|
|
var o = BAKED[dimension] |
|
if(!o) { |
|
o = BAKED[dimension] = bakeOrient(dimension) |
|
} |
|
this.orient = o |
|
} |
|
|
|
var proto = Triangulation.prototype |
|
|
|
//Degenerate situation where we are on boundary, but coplanar to face |
|
proto.handleBoundaryDegeneracy = function(cell, point) { |
|
var d = this.dimension |
|
var n = this.vertices.length - 1 |
|
var tuple = this.tuple |
|
var verts = this.vertices |
|
|
|
//Dumb solution: Just do dfs from boundary cell until we find any peak, or terminate |
|
var toVisit = [ cell ] |
|
cell.lastVisited = -n |
|
while(toVisit.length > 0) { |
|
cell = toVisit.pop() |
|
var cellVerts = cell.vertices |
|
var cellAdj = cell.adjacent |
|
for(var i=0; i<=d; ++i) { |
|
var neighbor = cellAdj[i] |
|
if(!neighbor.boundary || neighbor.lastVisited <= -n) { |
|
continue |
|
} |
|
var nv = neighbor.vertices |
|
for(var j=0; j<=d; ++j) { |
|
var vv = nv[j] |
|
if(vv < 0) { |
|
tuple[j] = point |
|
} else { |
|
tuple[j] = verts[vv] |
|
} |
|
} |
|
var o = this.orient() |
|
if(o > 0) { |
|
return neighbor |
|
} |
|
neighbor.lastVisited = -n |
|
if(o === 0) { |
|
toVisit.push(neighbor) |
|
} |
|
} |
|
} |
|
return null |
|
} |
|
|
|
proto.walk = function(point, random) { |
|
//Alias local properties |
|
var n = this.vertices.length - 1 |
|
var d = this.dimension |
|
var verts = this.vertices |
|
var tuple = this.tuple |
|
|
|
//Compute initial jump cell |
|
var initIndex = random ? (this.interior.length * Math.random())|0 : (this.interior.length-1) |
|
var cell = this.interior[ initIndex ] |
|
|
|
//Start walking |
|
outerLoop: |
|
while(!cell.boundary) { |
|
var cellVerts = cell.vertices |
|
var cellAdj = cell.adjacent |
|
|
|
for(var i=0; i<=d; ++i) { |
|
tuple[i] = verts[cellVerts[i]] |
|
} |
|
cell.lastVisited = n |
|
|
|
//Find farthest adjacent cell |
|
for(var i=0; i<=d; ++i) { |
|
var neighbor = cellAdj[i] |
|
if(neighbor.lastVisited >= n) { |
|
continue |
|
} |
|
var prev = tuple[i] |
|
tuple[i] = point |
|
var o = this.orient() |
|
tuple[i] = prev |
|
if(o < 0) { |
|
cell = neighbor |
|
continue outerLoop |
|
} else { |
|
if(!neighbor.boundary) { |
|
neighbor.lastVisited = n |
|
} else { |
|
neighbor.lastVisited = -n |
|
} |
|
} |
|
} |
|
return |
|
} |
|
|
|
return cell |
|
} |
|
|
|
proto.addPeaks = function(point, cell) { |
|
var n = this.vertices.length - 1 |
|
var d = this.dimension |
|
var verts = this.vertices |
|
var tuple = this.tuple |
|
var interior = this.interior |
|
var simplices = this.simplices |
|
|
|
//Walking finished at boundary, time to add peaks |
|
var tovisit = [ cell ] |
|
|
|
//Stretch initial boundary cell into a peak |
|
cell.lastVisited = n |
|
cell.vertices[cell.vertices.indexOf(-1)] = n |
|
cell.boundary = false |
|
interior.push(cell) |
|
|
|
//Record a list of all new boundaries created by added peaks so we can glue them together when we are all done |
|
var glueFacets = [] |
|
|
|
//Do a traversal of the boundary walking outward from starting peak |
|
while(tovisit.length > 0) { |
|
//Pop off peak and walk over adjacent cells |
|
var cell = tovisit.pop() |
|
var cellVerts = cell.vertices |
|
var cellAdj = cell.adjacent |
|
var indexOfN = cellVerts.indexOf(n) |
|
if(indexOfN < 0) { |
|
continue |
|
} |
|
|
|
for(var i=0; i<=d; ++i) { |
|
if(i === indexOfN) { |
|
continue |
|
} |
|
|
|
//For each boundary neighbor of the cell |
|
var neighbor = cellAdj[i] |
|
if(!neighbor.boundary || neighbor.lastVisited >= n) { |
|
continue |
|
} |
|
|
|
var nv = neighbor.vertices |
|
|
|
//Test if neighbor is a peak |
|
if(neighbor.lastVisited !== -n) { |
|
//Compute orientation of p relative to each boundary peak |
|
var indexOfNeg1 = 0 |
|
for(var j=0; j<=d; ++j) { |
|
if(nv[j] < 0) { |
|
indexOfNeg1 = j |
|
tuple[j] = point |
|
} else { |
|
tuple[j] = verts[nv[j]] |
|
} |
|
} |
|
var o = this.orient() |
|
|
|
//Test if neighbor cell is also a peak |
|
if(o > 0) { |
|
nv[indexOfNeg1] = n |
|
neighbor.boundary = false |
|
interior.push(neighbor) |
|
tovisit.push(neighbor) |
|
neighbor.lastVisited = n |
|
continue |
|
} else { |
|
neighbor.lastVisited = -n |
|
} |
|
} |
|
|
|
var na = neighbor.adjacent |
|
|
|
//Otherwise, replace neighbor with new face |
|
var vverts = cellVerts.slice() |
|
var vadj = cellAdj.slice() |
|
var ncell = new Simplex(vverts, vadj, true) |
|
simplices.push(ncell) |
|
|
|
//Connect to neighbor |
|
var opposite = na.indexOf(cell) |
|
if(opposite < 0) { |
|
continue |
|
} |
|
na[opposite] = ncell |
|
vadj[indexOfN] = neighbor |
|
|
|
//Connect to cell |
|
vverts[i] = -1 |
|
vadj[i] = cell |
|
cellAdj[i] = ncell |
|
|
|
//Flip facet |
|
ncell.flip() |
|
|
|
//Add to glue list |
|
for(var j=0; j<=d; ++j) { |
|
var uu = vverts[j] |
|
if(uu < 0 || uu === n) { |
|
continue |
|
} |
|
var nface = new Array(d-1) |
|
var nptr = 0 |
|
for(var k=0; k<=d; ++k) { |
|
var vv = vverts[k] |
|
if(vv < 0 || k === j) { |
|
continue |
|
} |
|
nface[nptr++] = vv |
|
} |
|
glueFacets.push(new GlueFacet(nface, ncell, j)) |
|
} |
|
} |
|
} |
|
|
|
//Glue boundary facets together |
|
glueFacets.sort(compareGlue) |
|
|
|
for(var i=0; i+1<glueFacets.length; i+=2) { |
|
var a = glueFacets[i] |
|
var b = glueFacets[i+1] |
|
var ai = a.index |
|
var bi = b.index |
|
if(ai < 0 || bi < 0) { |
|
continue |
|
} |
|
a.cell.adjacent[a.index] = b.cell |
|
b.cell.adjacent[b.index] = a.cell |
|
} |
|
} |
|
|
|
proto.insert = function(point, random) { |
|
//Add point |
|
var verts = this.vertices |
|
verts.push(point) |
|
|
|
var cell = this.walk(point, random) |
|
if(!cell) { |
|
return |
|
} |
|
|
|
//Alias local properties |
|
var d = this.dimension |
|
var tuple = this.tuple |
|
|
|
//Degenerate case: If point is coplanar to cell, then walk until we find a non-degenerate boundary |
|
for(var i=0; i<=d; ++i) { |
|
var vv = cell.vertices[i] |
|
if(vv < 0) { |
|
tuple[i] = point |
|
} else { |
|
tuple[i] = verts[vv] |
|
} |
|
} |
|
var o = this.orient(tuple) |
|
if(o < 0) { |
|
return |
|
} else if(o === 0) { |
|
cell = this.handleBoundaryDegeneracy(cell, point) |
|
if(!cell) { |
|
return |
|
} |
|
} |
|
|
|
//Add peaks |
|
this.addPeaks(point, cell) |
|
} |
|
|
|
//Extract all boundary cells |
|
proto.boundary = function() { |
|
var d = this.dimension |
|
var boundary = [] |
|
var cells = this.simplices |
|
var nc = cells.length |
|
for(var i=0; i<nc; ++i) { |
|
var c = cells[i] |
|
if(c.boundary) { |
|
var bcell = new Array(d) |
|
var cv = c.vertices |
|
var ptr = 0 |
|
var parity = 0 |
|
for(var j=0; j<=d; ++j) { |
|
if(cv[j] >= 0) { |
|
bcell[ptr++] = cv[j] |
|
} else { |
|
parity = j&1 |
|
} |
|
} |
|
if(parity === (d&1)) { |
|
var t = bcell[0] |
|
bcell[0] = bcell[1] |
|
bcell[1] = t |
|
} |
|
boundary.push(bcell) |
|
} |
|
} |
|
return boundary |
|
} |
|
|
|
function incrementalConvexHull(points, randomSearch) { |
|
var n = points.length |
|
if(n === 0) { |
|
throw new Error("Must have at least d+1 points") |
|
} |
|
var d = points[0].length |
|
if(n <= d) { |
|
throw new Error("Must input at least d+1 points") |
|
} |
|
|
|
//FIXME: This could be degenerate, but need to select d+1 non-coplanar points to bootstrap process |
|
var initialSimplex = points.slice(0, d+1) |
|
|
|
//Make sure initial simplex is positively oriented |
|
var o = orient.apply(void 0, initialSimplex) |
|
if(o === 0) { |
|
throw new Error("Input not in general position") |
|
} |
|
var initialCoords = new Array(d+1) |
|
for(var i=0; i<=d; ++i) { |
|
initialCoords[i] = i |
|
} |
|
if(o < 0) { |
|
initialCoords[0] = 1 |
|
initialCoords[1] = 0 |
|
} |
|
|
|
//Create initial topological index, glue pointers together (kind of messy) |
|
var initialCell = new Simplex(initialCoords, new Array(d+1), false) |
|
var boundary = initialCell.adjacent |
|
var list = new Array(d+2) |
|
for(var i=0; i<=d; ++i) { |
|
var verts = initialCoords.slice() |
|
for(var j=0; j<=d; ++j) { |
|
if(j === i) { |
|
verts[j] = -1 |
|
} |
|
} |
|
var t = verts[0] |
|
verts[0] = verts[1] |
|
verts[1] = t |
|
var cell = new Simplex(verts, new Array(d+1), true) |
|
boundary[i] = cell |
|
list[i] = cell |
|
} |
|
list[d+1] = initialCell |
|
for(var i=0; i<=d; ++i) { |
|
var verts = boundary[i].vertices |
|
var adj = boundary[i].adjacent |
|
for(var j=0; j<=d; ++j) { |
|
var v = verts[j] |
|
if(v < 0) { |
|
adj[j] = initialCell |
|
continue |
|
} |
|
for(var k=0; k<=d; ++k) { |
|
if(boundary[k].vertices.indexOf(v) < 0) { |
|
adj[j] = boundary[k] |
|
} |
|
} |
|
} |
|
} |
|
|
|
//Initialize triangles |
|
var triangles = new Triangulation(d, initialSimplex, list) |
|
|
|
//Insert remaining points |
|
var useRandom = !!randomSearch |
|
for(var i=d+1; i<n; ++i) { |
|
triangles.insert(points[i], useRandom) |
|
} |
|
|
|
//Extract boundary cells |
|
return triangles.boundary() |
|
} |
|
},{"robust-orientation":234,"simplicial-complex":242}],189:[function(require,module,exports){ |
|
"use strict" |
|
|
|
var bounds = require("binary-search-bounds") |
|
|
|
var NOT_FOUND = 0 |
|
var SUCCESS = 1 |
|
var EMPTY = 2 |
|
|
|
module.exports = createWrapper |
|
|
|
function IntervalTreeNode(mid, left, right, leftPoints, rightPoints) { |
|
this.mid = mid |
|
this.left = left |
|
this.right = right |
|
this.leftPoints = leftPoints |
|
this.rightPoints = rightPoints |
|
this.count = (left ? left.count : 0) + (right ? right.count : 0) + leftPoints.length |
|
} |
|
|
|
var proto = IntervalTreeNode.prototype |
|
|
|
function copy(a, b) { |
|
a.mid = b.mid |
|
a.left = b.left |
|
a.right = b.right |
|
a.leftPoints = b.leftPoints |
|
a.rightPoints = b.rightPoints |
|
a.count = b.count |
|
} |
|
|
|
function rebuild(node, intervals) { |
|
var ntree = createIntervalTree(intervals) |
|
node.mid = ntree.mid |
|
node.left = ntree.left |
|
node.right = ntree.right |
|
node.leftPoints = ntree.leftPoints |
|
node.rightPoints = ntree.rightPoints |
|
node.count = ntree.count |
|
} |
|
|
|
function rebuildWithInterval(node, interval) { |
|
var intervals = node.intervals([]) |
|
intervals.push(interval) |
|
rebuild(node, intervals) |
|
} |
|
|
|
function rebuildWithoutInterval(node, interval) { |
|
var intervals = node.intervals([]) |
|
var idx = intervals.indexOf(interval) |
|
if(idx < 0) { |
|
return NOT_FOUND |
|
} |
|
intervals.splice(idx, 1) |
|
rebuild(node, intervals) |
|
return SUCCESS |
|
} |
|
|
|
proto.intervals = function(result) { |
|
result.push.apply(result, this.leftPoints) |
|
if(this.left) { |
|
this.left.intervals(result) |
|
} |
|
if(this.right) { |
|
this.right.intervals(result) |
|
} |
|
return result |
|
} |
|
|
|
proto.insert = function(interval) { |
|
var weight = this.count - this.leftPoints.length |
|
this.count += 1 |
|
if(interval[1] < this.mid) { |
|
if(this.left) { |
|
if(4*(this.left.count+1) > 3*(weight+1)) { |
|
rebuildWithInterval(this, interval) |
|
} else { |
|
this.left.insert(interval) |
|
} |
|
} else { |
|
this.left = createIntervalTree([interval]) |
|
} |
|
} else if(interval[0] > this.mid) { |
|
if(this.right) { |
|
if(4*(this.right.count+1) > 3*(weight+1)) { |
|
rebuildWithInterval(this, interval) |
|
} else { |
|
this.right.insert(interval) |
|
} |
|
} else { |
|
this.right = createIntervalTree([interval]) |
|
} |
|
} else { |
|
var l = bounds.ge(this.leftPoints, interval, compareBegin) |
|
var r = bounds.ge(this.rightPoints, interval, compareEnd) |
|
this.leftPoints.splice(l, 0, interval) |
|
this.rightPoints.splice(r, 0, interval) |
|
} |
|
} |
|
|
|
proto.remove = function(interval) { |
|
var weight = this.count - this.leftPoints |
|
if(interval[1] < this.mid) { |
|
if(!this.left) { |
|
return NOT_FOUND |
|
} |
|
var rw = this.right ? this.right.count : 0 |
|
if(4 * rw > 3 * (weight-1)) { |
|
return rebuildWithoutInterval(this, interval) |
|
} |
|
var r = this.left.remove(interval) |
|
if(r === EMPTY) { |
|
this.left = null |
|
this.count -= 1 |
|
return SUCCESS |
|
} else if(r === SUCCESS) { |
|
this.count -= 1 |
|
} |
|
return r |
|
} else if(interval[0] > this.mid) { |
|
if(!this.right) { |
|
return NOT_FOUND |
|
} |
|
var lw = this.left ? this.left.count : 0 |
|
if(4 * lw > 3 * (weight-1)) { |
|
return rebuildWithoutInterval(this, interval) |
|
} |
|
var r = this.right.remove(interval) |
|
if(r === EMPTY) { |
|
this.right = null |
|
this.count -= 1 |
|
return SUCCESS |
|
} else if(r === SUCCESS) { |
|
this.count -= 1 |
|
} |
|
return r |
|
} else { |
|
if(this.count === 1) { |
|
if(this.leftPoints[0] === interval) { |
|
return EMPTY |
|
} else { |
|
return NOT_FOUND |
|
} |
|
} |
|
if(this.leftPoints.length === 1 && this.leftPoints[0] === interval) { |
|
if(this.left && this.right) { |
|
var p = this |
|
var n = this.left |
|
while(n.right) { |
|
p = n |
|
n = n.right |
|
} |
|
if(p === this) { |
|
n.right = this.right |
|
} else { |
|
var l = this.left |
|
var r = this.right |
|
p.count -= n.count |
|
p.right = n.left |
|
n.left = l |
|
n.right = r |
|
} |
|
copy(this, n) |
|
this.count = (this.left?this.left.count:0) + (this.right?this.right.count:0) + this.leftPoints.length |
|
} else if(this.left) { |
|
copy(this, this.left) |
|
} else { |
|
copy(this, this.right) |
|
} |
|
return SUCCESS |
|
} |
|
for(var l = bounds.ge(this.leftPoints, interval, compareBegin); l<this.leftPoints.length; ++l) { |
|
if(this.leftPoints[l][0] !== interval[0]) { |
|
break |
|
} |
|
if(this.leftPoints[l] === interval) { |
|
this.count -= 1 |
|
this.leftPoints.splice(l, 1) |
|
for(var r = bounds.ge(this.rightPoints, interval, compareEnd); r<this.rightPoints.length; ++r) { |
|
if(this.rightPoints[r][1] !== interval[1]) { |
|
break |
|
} else if(this.rightPoints[r] === interval) { |
|
this.rightPoints.splice(r, 1) |
|
return SUCCESS |
|
} |
|
} |
|
} |
|
} |
|
return NOT_FOUND |
|
} |
|
} |
|
|
|
function reportLeftRange(arr, hi, cb) { |
|
for(var i=0; i<arr.length && arr[i][0] <= hi; ++i) { |
|
var r = cb(arr[i]) |
|
if(r) { return r } |
|
} |
|
} |
|
|
|
function reportRightRange(arr, lo, cb) { |
|
for(var i=arr.length-1; i>=0 && arr[i][1] >= lo; --i) { |
|
var r = cb(arr[i]) |
|
if(r) { return r } |
|
} |
|
} |
|
|
|
function reportRange(arr, cb) { |
|
for(var i=0; i<arr.length; ++i) { |
|
var r = cb(arr[i]) |
|
if(r) { return r } |
|
} |
|
} |
|
|
|
proto.queryPoint = function(x, cb) { |
|
if(x < this.mid) { |
|
if(this.left) { |
|
var r = this.left.queryPoint(x, cb) |
|
if(r) { return r } |
|
} |
|
return reportLeftRange(this.leftPoints, x, cb) |
|
} else if(x > this.mid) { |
|
if(this.right) { |
|
var r = this.right.queryPoint(x, cb) |
|
if(r) { return r } |
|
} |
|
return reportRightRange(this.rightPoints, x, cb) |
|
} else { |
|
return reportRange(this.leftPoints, cb) |
|
} |
|
} |
|
|
|
proto.queryInterval = function(lo, hi, cb) { |
|
if(lo < this.mid && this.left) { |
|
var r = this.left.queryInterval(lo, hi, cb) |
|
if(r) { return r } |
|
} |
|
if(hi > this.mid && this.right) { |
|
var r = this.right.queryInterval(lo, hi, cb) |
|
if(r) { return r } |
|
} |
|
if(hi < this.mid) { |
|
return reportLeftRange(this.leftPoints, hi, cb) |
|
} else if(lo > this.mid) { |
|
return reportRightRange(this.rightPoints, lo, cb) |
|
} else { |
|
return reportRange(this.leftPoints, cb) |
|
} |
|
} |
|
|
|
function compareNumbers(a, b) { |
|
return a - b |
|
} |
|
|
|
function compareBegin(a, b) { |
|
var d = a[0] - b[0] |
|
if(d) { return d } |
|
return a[1] - b[1] |
|
} |
|
|
|
function compareEnd(a, b) { |
|
var d = a[1] - b[1] |
|
if(d) { return d } |
|
return a[0] - b[0] |
|
} |
|
|
|
function createIntervalTree(intervals) { |
|
if(intervals.length === 0) { |
|
return null |
|
} |
|
var pts = [] |
|
for(var i=0; i<intervals.length; ++i) { |
|
pts.push(intervals[i][0], intervals[i][1]) |
|
} |
|
pts.sort(compareNumbers) |
|
|
|
var mid = pts[pts.length>>1] |
|
|
|
var leftIntervals = [] |
|
var rightIntervals = [] |
|
var centerIntervals = [] |
|
for(var i=0; i<intervals.length; ++i) { |
|
var s = intervals[i] |
|
if(s[1] < mid) { |
|
leftIntervals.push(s) |
|
} else if(mid < s[0]) { |
|
rightIntervals.push(s) |
|
} else { |
|
centerIntervals.push(s) |
|
} |
|
} |
|
|
|
//Split center intervals |
|
var leftPoints = centerIntervals |
|
var rightPoints = centerIntervals.slice() |
|
leftPoints.sort(compareBegin) |
|
rightPoints.sort(compareEnd) |
|
|
|
return new IntervalTreeNode(mid, |
|
createIntervalTree(leftIntervals), |
|
createIntervalTree(rightIntervals), |
|
leftPoints, |
|
rightPoints) |
|
} |
|
|
|
//User friendly wrapper that makes it possible to support empty trees |
|
function IntervalTree(root) { |
|
this.root = root |
|
} |
|
|
|
var tproto = IntervalTree.prototype |
|
|
|
tproto.insert = function(interval) { |
|
if(this.root) { |
|
this.root.insert(interval) |
|
} else { |
|
this.root = new IntervalTreeNode(interval[0], null, null, [interval], [interval]) |
|
} |
|
} |
|
|
|
tproto.remove = function(interval) { |
|
if(this.root) { |
|
var r = this.root.remove(interval) |
|
if(r === EMPTY) { |
|
this.root = null |
|
} |
|
return r !== NOT_FOUND |
|
} |
|
return false |
|
} |
|
|
|
tproto.queryPoint = function(p, cb) { |
|
if(this.root) { |
|
return this.root.queryPoint(p, cb) |
|
} |
|
} |
|
|
|
tproto.queryInterval = function(lo, hi, cb) { |
|
if(lo <= hi && this.root) { |
|
return this.root.queryInterval(lo, hi, cb) |
|
} |
|
} |
|
|
|
Object.defineProperty(tproto, "count", { |
|
get: function() { |
|
if(this.root) { |
|
return this.root.count |
|
} |
|
return 0 |
|
} |
|
}) |
|
|
|
Object.defineProperty(tproto, "intervals", { |
|
get: function() { |
|
if(this.root) { |
|
return this.root.intervals([]) |
|
} |
|
return [] |
|
} |
|
}) |
|
|
|
function createWrapper(intervals) { |
|
if(!intervals || intervals.length === 0) { |
|
return new IntervalTree(null) |
|
} |
|
return new IntervalTree(createIntervalTree(intervals)) |
|
} |
|
|
|
},{"binary-search-bounds":35}],190:[function(require,module,exports){ |
|
"use strict" |
|
|
|
function invertPermutation(pi, result) { |
|
result = result || new Array(pi.length) |
|
for(var i=0; i<pi.length; ++i) { |
|
result[pi[i]] = i |
|
} |
|
return result |
|
} |
|
|
|
module.exports = invertPermutation |
|
},{}],191:[function(require,module,exports){ |
|
"use strict" |
|
|
|
function iota(n) { |
|
var result = new Array(n) |
|
for(var i=0; i<n; ++i) { |
|
result[i] = i |
|
} |
|
return result |
|
} |
|
|
|
module.exports = iota |
|
},{}],192:[function(require,module,exports){ |
|
/*! |
|
* Determine if an object is a Buffer |
|
* |
|
* @author Feross Aboukhadijeh <feross@feross.org> <http://feross.org> |
|
* @license MIT |
|
*/ |
|
|
|
// The _isBuffer check is for Safari 5-7 support, because it's missing |
|
// Object.prototype.constructor. Remove this eventually |
|
module.exports = function (obj) { |
|
return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer) |
|
} |
|
|
|
function isBuffer (obj) { |
|
return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj) |
|
} |
|
|
|
// For Node v0.10 support. Remove this eventually. |
|
function isSlowBuffer (obj) { |
|
return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0)) |
|
} |
|
|
|
},{}],193:[function(require,module,exports){ |
|
'use strict' |
|
|
|
module.exports = createTable |
|
|
|
var chull = require('convex-hull') |
|
|
|
function constructVertex(d, a, b) { |
|
var x = new Array(d) |
|
for(var i=0; i<d; ++i) { |
|
x[i] = 0.0 |
|
if(i === a) { |
|
x[i] += 0.5 |
|
} |
|
if(i === b) { |
|
x[i] += 0.5 |
|
} |
|
} |
|
return x |
|
} |
|
|
|
function constructCell(dimension, mask) { |
|
if(mask === 0 || mask === (1<<(dimension+1))-1) { |
|
return [] |
|
} |
|
var points = [] |
|
var index = [] |
|
for(var i=0; i<=dimension; ++i) { |
|
if(mask & (1<<i)) { |
|
points.push(constructVertex(dimension, i-1, i-1)) |
|
index.push(null) |
|
for(var j=0; j<=dimension; ++j) { |
|
if(~mask & (1<<j)) { |
|
points.push(constructVertex(dimension, i-1, j-1)) |
|
index.push([i,j]) |
|
} |
|
} |
|
} |
|
} |
|
|
|
//Preprocess points so first d+1 points are linearly independent |
|
var hull = chull(points) |
|
var faces = [] |
|
i_loop: |
|
for(var i=0; i<hull.length; ++i) { |
|
var face = hull[i] |
|
var nface = [] |
|
for(var j=0; j<face.length; ++j) { |
|
if(!index[face[j]]) { |
|
continue i_loop |
|
} |
|
nface.push(index[face[j]].slice()) |
|
} |
|
faces.push(nface) |
|
} |
|
return faces |
|
} |
|
|
|
function createTable(dimension) { |
|
var numCells = 1<<(dimension+1) |
|
var result = new Array(numCells) |
|
for(var i=0; i<numCells; ++i) { |
|
result[i] = constructCell(dimension, i) |
|
} |
|
return result |
|
} |
|
},{"convex-hull":60}],194:[function(require,module,exports){ |
|
/*jshint unused:true*/ |
|
/* |
|
Input: matrix ; a 4x4 matrix |
|
Output: translation ; a 3 component vector |
|
scale ; a 3 component vector |
|
skew ; skew factors XY,XZ,YZ represented as a 3 component vector |
|
perspective ; a 4 component vector |
|
quaternion ; a 4 component vector |
|
Returns false if the matrix cannot be decomposed, true if it can |
|
|
|
|
|
References: |
|
https://github.com/kamicane/matrix3d/blob/master/lib/Matrix3d.js |
|
https://github.com/ChromiumWebApps/chromium/blob/master/ui/gfx/transform_util.cc |
|
http://www.w3.org/TR/css3-transforms/#decomposing-a-3d-matrix |
|
*/ |
|
|
|
var normalize = require('./normalize') |
|
|
|
var create = require('gl-mat4/create') |
|
var clone = require('gl-mat4/clone') |
|
var determinant = require('gl-mat4/determinant') |
|
var invert = require('gl-mat4/invert') |
|
var transpose = require('gl-mat4/transpose') |
|
var vec3 = { |
|
length: require('gl-vec3/length'), |
|
normalize: require('gl-vec3/normalize'), |
|
dot: require('gl-vec3/dot'), |
|
cross: require('gl-vec3/cross') |
|
} |
|
|
|
var tmp = create() |
|
var perspectiveMatrix = create() |
|
var tmpVec4 = [0, 0, 0, 0] |
|
var row = [ [0,0,0], [0,0,0], [0,0,0] ] |
|
var pdum3 = [0,0,0] |
|
|
|
module.exports = function decomposeMat4(matrix, translation, scale, skew, perspective, quaternion) { |
|
if (!translation) translation = [0,0,0] |
|
if (!scale) scale = [0,0,0] |
|
if (!skew) skew = [0,0,0] |
|
if (!perspective) perspective = [0,0,0,1] |
|
if (!quaternion) quaternion = [0,0,0,1] |
|
|
|
//normalize, if not possible then bail out early |
|
if (!normalize(tmp, matrix)) |
|
return false |
|
|
|
// perspectiveMatrix is used to solve for perspective, but it also provides |
|
// an easy way to test for singularity of the upper 3x3 component. |
|
clone(perspectiveMatrix, tmp) |
|
|
|
perspectiveMatrix[3] = 0 |
|
perspectiveMatrix[7] = 0 |
|
perspectiveMatrix[11] = 0 |
|
perspectiveMatrix[15] = 1 |
|
|
|
// If the perspectiveMatrix is not invertible, we are also unable to |
|
// decompose, so we'll bail early. Constant taken from SkMatrix44::invert. |
|
if (Math.abs(determinant(perspectiveMatrix) < 1e-8)) |
|
return false |
|
|
|
var a03 = tmp[3], a13 = tmp[7], a23 = tmp[11], |
|
a30 = tmp[12], a31 = tmp[13], a32 = tmp[14], a33 = tmp[15] |
|
|
|
// First, isolate perspective. |
|
if (a03 !== 0 || a13 !== 0 || a23 !== 0) { |
|
tmpVec4[0] = a03 |
|
tmpVec4[1] = a13 |
|
tmpVec4[2] = a23 |
|
tmpVec4[3] = a33 |
|
|
|
// Solve the equation by inverting perspectiveMatrix and multiplying |
|
// rightHandSide by the inverse. |
|
// resuing the perspectiveMatrix here since it's no longer needed |
|
var ret = invert(perspectiveMatrix, perspectiveMatrix) |
|
if (!ret) return false |
|
transpose(perspectiveMatrix, perspectiveMatrix) |
|
|
|
//multiply by transposed inverse perspective matrix, into perspective vec4 |
|
vec4multMat4(perspective, tmpVec4, perspectiveMatrix) |
|
} else { |
|
//no perspective |
|
perspective[0] = perspective[1] = perspective[2] = 0 |
|
perspective[3] = 1 |
|
} |
|
|
|
// Next take care of translation |
|
translation[0] = a30 |
|
translation[1] = a31 |
|
translation[2] = a32 |
|
|
|
// Now get scale and shear. 'row' is a 3 element array of 3 component vectors |
|
mat3from4(row, tmp) |
|
|
|
// Compute X scale factor and normalize first row. |
|
scale[0] = vec3.length(row[0]) |
|
vec3.normalize(row[0], row[0]) |
|
|
|
// Compute XY shear factor and make 2nd row orthogonal to 1st. |
|
skew[0] = vec3.dot(row[0], row[1]) |
|
combine(row[1], row[1], row[0], 1.0, -skew[0]) |
|
|
|
// Now, compute Y scale and normalize 2nd row. |
|
scale[1] = vec3.length(row[1]) |
|
vec3.normalize(row[1], row[1]) |
|
skew[0] /= scale[1] |
|
|
|
// Compute XZ and YZ shears, orthogonalize 3rd row |
|
skew[1] = vec3.dot(row[0], row[2]) |
|
combine(row[2], row[2], row[0], 1.0, -skew[1]) |
|
skew[2] = vec3.dot(row[1], row[2]) |
|
combine(row[2], row[2], row[1], 1.0, -skew[2]) |
|
|
|
// Next, get Z scale and normalize 3rd row. |
|
scale[2] = vec3.length(row[2]) |
|
vec3.normalize(row[2], row[2]) |
|
skew[1] /= scale[2] |
|
skew[2] /= scale[2] |
|
|
|
|
|
// At this point, the matrix (in rows) is orthonormal. |
|
// Check for a coordinate system flip. If the determinant |
|
// is -1, then negate the matrix and the scaling factors. |
|
vec3.cross(pdum3, row[1], row[2]) |
|
if (vec3.dot(row[0], pdum3) < 0) { |
|
for (var i = 0; i < 3; i++) { |
|
scale[i] *= -1; |
|
row[i][0] *= -1 |
|
row[i][1] *= -1 |
|
row[i][2] *= -1 |
|
} |
|
} |
|
|
|
// Now, get the rotations out |
|
quaternion[0] = 0.5 * Math.sqrt(Math.max(1 + row[0][0] - row[1][1] - row[2][2], 0)) |
|
quaternion[1] = 0.5 * Math.sqrt(Math.max(1 - row[0][0] + row[1][1] - row[2][2], 0)) |
|
quaternion[2] = 0.5 * Math.sqrt(Math.max(1 - row[0][0] - row[1][1] + row[2][2], 0)) |
|
quaternion[3] = 0.5 * Math.sqrt(Math.max(1 + row[0][0] + row[1][1] + row[2][2], 0)) |
|
|
|
if (row[2][1] > row[1][2]) |
|
quaternion[0] = -quaternion[0] |
|
if (row[0][2] > row[2][0]) |
|
quaternion[1] = -quaternion[1] |
|
if (row[1][0] > row[0][1]) |
|
quaternion[2] = -quaternion[2] |
|
return true |
|
} |
|
|
|
//will be replaced by gl-vec4 eventually |
|
function vec4multMat4(out, a, m) { |
|
var x = a[0], y = a[1], z = a[2], w = a[3]; |
|
out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w; |
|
out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w; |
|
out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w; |
|
out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w; |
|
return out; |
|
} |
|
|
|
//gets upper-left of a 4x4 matrix into a 3x3 of vectors |
|
function mat3from4(out, mat4x4) { |
|
out[0][0] = mat4x4[0] |
|
out[0][1] = mat4x4[1] |
|
out[0][2] = mat4x4[2] |
|
|
|
out[1][0] = mat4x4[4] |
|
out[1][1] = mat4x4[5] |
|
out[1][2] = mat4x4[6] |
|
|
|
out[2][0] = mat4x4[8] |
|
out[2][1] = mat4x4[9] |
|
out[2][2] = mat4x4[10] |
|
} |
|
|
|
function combine(out, a, b, scale1, scale2) { |
|
out[0] = a[0] * scale1 + b[0] * scale2 |
|
out[1] = a[1] * scale1 + b[1] * scale2 |
|
out[2] = a[2] * scale1 + b[2] * scale2 |
|
} |
|
},{"./normalize":195,"gl-mat4/clone":88,"gl-mat4/create":89,"gl-mat4/determinant":90,"gl-mat4/invert":94,"gl-mat4/transpose":104,"gl-vec3/cross":126,"gl-vec3/dot":129,"gl-vec3/length":134,"gl-vec3/normalize":140}],195:[function(require,module,exports){ |
|
module.exports = function normalize(out, mat) { |
|
var m44 = mat[15] |
|
// Cannot normalize. |
|
if (m44 === 0) |
|
return false |
|
var scale = 1 / m44 |
|
for (var i=0; i<16; i++) |
|
out[i] = mat[i] * scale |
|
return true |
|
} |
|
},{}],196:[function(require,module,exports){ |
|
var lerp = require('gl-vec3/lerp') |
|
|
|
var recompose = require('mat4-recompose') |
|
var decompose = require('mat4-decompose') |
|
var determinant = require('gl-mat4/determinant') |
|
var slerp = require('quat-slerp') |
|
|
|
var state0 = state() |
|
var state1 = state() |
|
var tmp = state() |
|
|
|
module.exports = interpolate |
|
function interpolate(out, start, end, alpha) { |
|
if (determinant(start) === 0 || determinant(end) === 0) |
|
return false |
|
|
|
//decompose the start and end matrices into individual components |
|
var r0 = decompose(start, state0.translate, state0.scale, state0.skew, state0.perspective, state0.quaternion) |
|
var r1 = decompose(end, state1.translate, state1.scale, state1.skew, state1.perspective, state1.quaternion) |
|
if (!r0 || !r1) |
|
return false |
|
|
|
|
|
//now lerp/slerp the start and end components into a temporary lerp(tmptranslate, state0.translate, state1.translate, alpha) |
|
lerp(tmp.translate, state0.translate, state1.translate, alpha) |
|
lerp(tmp.skew, state0.skew, state1.skew, alpha) |
|
lerp(tmp.scale, state0.scale, state1.scale, alpha) |
|
lerp(tmp.perspective, state0.perspective, state1.perspective, alpha) |
|
slerp(tmp.quaternion, state0.quaternion, state1.quaternion, alpha) |
|
|
|
//and recompose into our 'out' matrix |
|
recompose(out, tmp.translate, tmp.scale, tmp.skew, tmp.perspective, tmp.quaternion) |
|
return true |
|
} |
|
|
|
function state() { |
|
return { |
|
translate: vec3(), |
|
scale: vec3(1), |
|
skew: vec3(), |
|
perspective: vec4(), |
|
quaternion: vec4() |
|
} |
|
} |
|
|
|
function vec3(n) { |
|
return [n||0,n||0,n||0] |
|
} |
|
|
|
function vec4() { |
|
return [0,0,0,1] |
|
} |
|
},{"gl-mat4/determinant":90,"gl-vec3/lerp":135,"mat4-decompose":194,"mat4-recompose":197,"quat-slerp":222}],197:[function(require,module,exports){ |
|
/* |
|
Input: translation ; a 3 component vector |
|
scale ; a 3 component vector |
|
skew ; skew factors XY,XZ,YZ represented as a 3 component vector |
|
perspective ; a 4 component vector |
|
quaternion ; a 4 component vector |
|
Output: matrix ; a 4x4 matrix |
|
|
|
From: http://www.w3.org/TR/css3-transforms/#recomposing-to-a-3d-matrix |
|
*/ |
|
|
|
var mat4 = { |
|
identity: require('gl-mat4/identity'), |
|
translate: require('gl-mat4/translate'), |
|
multiply: require('gl-mat4/multiply'), |
|
create: require('gl-mat4/create'), |
|
scale: require('gl-mat4/scale'), |
|
fromRotationTranslation: require('gl-mat4/fromRotationTranslation') |
|
} |
|
|
|
var rotationMatrix = mat4.create() |
|
var temp = mat4.create() |
|
|
|
module.exports = function recomposeMat4(matrix, translation, scale, skew, perspective, quaternion) { |
|
mat4.identity(matrix) |
|
|
|
//apply translation & rotation |
|
mat4.fromRotationTranslation(matrix, quaternion, translation) |
|
|
|
//apply perspective |
|
matrix[3] = perspective[0] |
|
matrix[7] = perspective[1] |
|
matrix[11] = perspective[2] |
|
matrix[15] = perspective[3] |
|
|
|
// apply skew |
|
// temp is a identity 4x4 matrix initially |
|
mat4.identity(temp) |
|
|
|
if (skew[2] !== 0) { |
|
temp[9] = skew[2] |
|
mat4.multiply(matrix, matrix, temp) |
|
} |
|
|
|
if (skew[1] !== 0) { |
|
temp[9] = 0 |
|
temp[8] = skew[1] |
|
mat4.multiply(matrix, matrix, temp) |
|
} |
|
|
|
if (skew[0] !== 0) { |
|
temp[8] = 0 |
|
temp[4] = skew[0] |
|
mat4.multiply(matrix, matrix, temp) |
|
} |
|
|
|
//apply scale |
|
mat4.scale(matrix, matrix, scale) |
|
return matrix |
|
} |
|
},{"gl-mat4/create":89,"gl-mat4/fromRotationTranslation":92,"gl-mat4/identity":93,"gl-mat4/multiply":96,"gl-mat4/scale":102,"gl-mat4/translate":103}],198:[function(require,module,exports){ |
|
'use strict' |
|
|
|
var bsearch = require('binary-search-bounds') |
|
var m4interp = require('mat4-interpolate') |
|
var invert44 = require('gl-mat4/invert') |
|
var rotateX = require('gl-mat4/rotateX') |
|
var rotateY = require('gl-mat4/rotateY') |
|
var rotateZ = require('gl-mat4/rotateZ') |
|
var lookAt = require('gl-mat4/lookAt') |
|
var translate = require('gl-mat4/translate') |
|
var scale = require('gl-mat4/scale') |
|
var normalize = require('gl-vec3/normalize') |
|
|
|
var DEFAULT_CENTER = [0,0,0] |
|
|
|
module.exports = createMatrixCameraController |
|
|
|
function MatrixCameraController(initialMatrix) { |
|
this._components = initialMatrix.slice() |
|
this._time = [0] |
|
this.prevMatrix = initialMatrix.slice() |
|
this.nextMatrix = initialMatrix.slice() |
|
this.computedMatrix = initialMatrix.slice() |
|
this.computedInverse = initialMatrix.slice() |
|
this.computedEye = [0,0,0] |
|
this.computedUp = [0,0,0] |
|
this.computedCenter = [0,0,0] |
|
this.computedRadius = [0] |
|
this._limits = [-Infinity, Infinity] |
|
} |
|
|
|
var proto = MatrixCameraController.prototype |
|
|
|
proto.recalcMatrix = function(t) { |
|
var time = this._time |
|
var tidx = bsearch.le(time, t) |
|
var mat = this.computedMatrix |
|
if(tidx < 0) { |
|
return |
|
} |
|
var comps = this._components |
|
if(tidx === time.length-1) { |
|
var ptr = 16*tidx |
|
for(var i=0; i<16; ++i) { |
|
mat[i] = comps[ptr++] |
|
} |
|
} else { |
|
var dt = (time[tidx+1] - time[tidx]) |
|
var ptr = 16*tidx |
|
var prev = this.prevMatrix |
|
var allEqual = true |
|
for(var i=0; i<16; ++i) { |
|
prev[i] = comps[ptr++] |
|
} |
|
var next = this.nextMatrix |
|
for(var i=0; i<16; ++i) { |
|
next[i] = comps[ptr++] |
|
allEqual = allEqual && (prev[i] === next[i]) |
|
} |
|
if(dt < 1e-6 || allEqual) { |
|
for(var i=0; i<16; ++i) { |
|
mat[i] = prev[i] |
|
} |
|
} else { |
|
m4interp(mat, prev, next, (t - time[tidx])/dt) |
|
} |
|
} |
|
|
|
var up = this.computedUp |
|
up[0] = mat[1] |
|
up[1] = mat[5] |
|
up[2] = mat[9] |
|
normalize(up, up) |
|
|
|
var imat = this.computedInverse |
|
invert44(imat, mat) |
|
var eye = this.computedEye |
|
var w = imat[15] |
|
eye[0] = imat[12]/w |
|
eye[1] = imat[13]/w |
|
eye[2] = imat[14]/w |
|
|
|
var center = this.computedCenter |
|
var radius = Math.exp(this.computedRadius[0]) |
|
for(var i=0; i<3; ++i) { |
|
center[i] = eye[i] - mat[2+4*i] * radius |
|
} |
|
} |
|
|
|
proto.idle = function(t) { |
|
if(t < this.lastT()) { |
|
return |
|
} |
|
var mc = this._components |
|
var ptr = mc.length-16 |
|
for(var i=0; i<16; ++i) { |
|
mc.push(mc[ptr++]) |
|
} |
|
this._time.push(t) |
|
} |
|
|
|
proto.flush = function(t) { |
|
var idx = bsearch.gt(this._time, t) - 2 |
|
if(idx < 0) { |
|
return |
|
} |
|
this._time.splice(0, idx) |
|
this._components.splice(0, 16*idx) |
|
} |
|
|
|
proto.lastT = function() { |
|
return this._time[this._time.length-1] |
|
} |
|
|
|
proto.lookAt = function(t, eye, center, up) { |
|
this.recalcMatrix(t) |
|
eye = eye || this.computedEye |
|
center = center || DEFAULT_CENTER |
|
up = up || this.computedUp |
|
this.setMatrix(t, lookAt(this.computedMatrix, eye, center, up)) |
|
var d2 = 0.0 |
|
for(var i=0; i<3; ++i) { |
|
d2 += Math.pow(center[i] - eye[i], 2) |
|
} |
|
d2 = Math.log(Math.sqrt(d2)) |
|
this.computedRadius[0] = d2 |
|
} |
|
|
|
proto.rotate = function(t, yaw, pitch, roll) { |
|
this.recalcMatrix(t) |
|
var mat = this.computedInverse |
|
if(yaw) rotateY(mat, mat, yaw) |
|
if(pitch) rotateX(mat, mat, pitch) |
|
if(roll) rotateZ(mat, mat, roll) |
|
this.setMatrix(t, invert44(this.computedMatrix, mat)) |
|
} |
|
|
|
var tvec = [0,0,0] |
|
|
|
proto.pan = function(t, dx, dy, dz) { |
|
tvec[0] = -(dx || 0.0) |
|
tvec[1] = -(dy || 0.0) |
|
tvec[2] = -(dz || 0.0) |
|
this.recalcMatrix(t) |
|
var mat = this.computedInverse |
|
translate(mat, mat, tvec) |
|
this.setMatrix(t, invert44(mat, mat)) |
|
} |
|
|
|
proto.translate = function(t, dx, dy, dz) { |
|
tvec[0] = dx || 0.0 |
|
tvec[1] = dy || 0.0 |
|
tvec[2] = dz || 0.0 |
|
this.recalcMatrix(t) |
|
var mat = this.computedMatrix |
|
translate(mat, mat, tvec) |
|
this.setMatrix(t, mat) |
|
} |
|
|
|
proto.setMatrix = function(t, mat) { |
|
if(t < this.lastT()) { |
|
return |
|
} |
|
this._time.push(t) |
|
for(var i=0; i<16; ++i) { |
|
this._components.push(mat[i]) |
|
} |
|
} |
|
|
|
proto.setDistance = function(t, d) { |
|
this.computedRadius[0] = d |
|
} |
|
|
|
proto.setDistanceLimits = function(a,b) { |
|
var lim = this._limits |
|
lim[0] = a |
|
lim[1] = b |
|
} |
|
|
|
proto.getDistanceLimits = function(out) { |
|
var lim = this._limits |
|
if(out) { |
|
out[0] = lim[0] |
|
out[1] = lim[1] |
|
return out |
|
} |
|
return lim |
|
} |
|
|
|
function createMatrixCameraController(options) { |
|
options = options || {} |
|
var matrix = options.matrix || |
|
[1,0,0,0, |
|
0,1,0,0, |
|
0,0,1,0, |
|
0,0,0,1] |
|
return new MatrixCameraController(matrix) |
|
} |
|
|
|
},{"binary-search-bounds":35,"gl-mat4/invert":94,"gl-mat4/lookAt":95,"gl-mat4/rotateX":99,"gl-mat4/rotateY":100,"gl-mat4/rotateZ":101,"gl-mat4/scale":102,"gl-mat4/translate":103,"gl-vec3/normalize":140,"mat4-interpolate":196}],199:[function(require,module,exports){ |
|
'use strict' |
|
|
|
module.exports = monotoneConvexHull2D |
|
|
|
var orient = require('robust-orientation')[3] |
|
|
|
function monotoneConvexHull2D(points) { |
|
var n = points.length |
|
|
|
if(n < 3) { |
|
var result = new Array(n) |
|
for(var i=0; i<n; ++i) { |
|
result[i] = i |
|
} |
|
|
|
if(n === 2 && |
|
points[0][0] === points[1][0] && |
|
points[0][1] === points[1][1]) { |
|
return [0] |
|
} |
|
|
|
return result |
|
} |
|
|
|
//Sort point indices along x-axis |
|
var sorted = new Array(n) |
|
for(var i=0; i<n; ++i) { |
|
sorted[i] = i |
|
} |
|
sorted.sort(function(a,b) { |
|
var d = points[a][0]-points[b][0] |
|
if(d) { |
|
return d |
|
} |
|
return points[a][1] - points[b][1] |
|
}) |
|
|
|
//Construct upper and lower hulls |
|
var lower = [sorted[0], sorted[1]] |
|
var upper = [sorted[0], sorted[1]] |
|
|
|
for(var i=2; i<n; ++i) { |
|
var idx = sorted[i] |
|
var p = points[idx] |
|
|
|
//Insert into lower list |
|
var m = lower.length |
|
while(m > 1 && orient( |
|
points[lower[m-2]], |
|
points[lower[m-1]], |
|
p) <= 0) { |
|
m -= 1 |
|
lower.pop() |
|
} |
|
lower.push(idx) |
|
|
|
//Insert into upper list |
|
m = upper.length |
|
while(m > 1 && orient( |
|
points[upper[m-2]], |
|
points[upper[m-1]], |
|
p) >= 0) { |
|
m -= 1 |
|
upper.pop() |
|
} |
|
upper.push(idx) |
|
} |
|
|
|
//Merge lists together |
|
var result = new Array(upper.length + lower.length - 2) |
|
var ptr = 0 |
|
for(var i=0, nl=lower.length; i<nl; ++i) { |
|
result[ptr++] = lower[i] |
|
} |
|
for(var j=upper.length-2; j>0; --j) { |
|
result[ptr++] = upper[j] |
|
} |
|
|
|
//Return result |
|
return result |
|
} |
|
},{"robust-orientation":234}],200:[function(require,module,exports){ |
|
'use strict' |
|
|
|
module.exports = mouseListen |
|
|
|
var mouse = require('mouse-event') |
|
|
|
function mouseListen (element, callback) { |
|
if (!callback) { |
|
callback = element |
|
element = window |
|
} |
|
|
|
var buttonState = 0 |
|
var x = 0 |
|
var y = 0 |
|
var mods = { |
|
shift: false, |
|
alt: false, |
|
control: false, |
|
meta: false |
|
} |
|
var attached = false |
|
|
|
function updateMods (ev) { |
|
var changed = false |
|
if ('altKey' in ev) { |
|
changed = changed || ev.altKey !== mods.alt |
|
mods.alt = !!ev.altKey |
|
} |
|
if ('shiftKey' in ev) { |
|
changed = changed || ev.shiftKey !== mods.shift |
|
mods.shift = !!ev.shiftKey |
|
} |
|
if ('ctrlKey' in ev) { |
|
changed = changed || ev.ctrlKey !== mods.control |
|
mods.control = !!ev.ctrlKey |
|
} |
|
if ('metaKey' in ev) { |
|
changed = changed || ev.metaKey !== mods.meta |
|
mods.meta = !!ev.metaKey |
|
} |
|
return changed |
|
} |
|
|
|
function handleEvent (nextButtons, ev) { |
|
var nextX = mouse.x(ev) |
|
var nextY = mouse.y(ev) |
|
if ('buttons' in ev) { |
|
nextButtons = ev.buttons | 0 |
|
} |
|
if (nextButtons !== buttonState || |
|
nextX !== x || |
|
nextY !== y || |
|
updateMods(ev)) { |
|
buttonState = nextButtons | 0 |
|
x = nextX || 0 |
|
y = nextY || 0 |
|
callback && callback(buttonState, x, y, mods) |
|
} |
|
} |
|
|
|
function clearState (ev) { |
|
handleEvent(0, ev) |
|
} |
|
|
|
function handleBlur () { |
|
if (buttonState || |
|
x || |
|
y || |
|
mods.shift || |
|
mods.alt || |
|
mods.meta || |
|
mods.control) { |
|
x = y = 0 |
|
buttonState = 0 |
|
mods.shift = mods.alt = mods.control = mods.meta = false |
|
callback && callback(0, 0, 0, mods) |
|
} |
|
} |
|
|
|
function handleMods (ev) { |
|
if (updateMods(ev)) { |
|
callback && callback(buttonState, x, y, mods) |
|
} |
|
} |
|
|
|
function handleMouseMove (ev) { |
|
if (mouse.buttons(ev) === 0) { |
|
handleEvent(0, ev) |
|
} else { |
|
handleEvent(buttonState, ev) |
|
} |
|
} |
|
|
|
function handleMouseDown (ev) { |
|
handleEvent(buttonState | mouse.buttons(ev), ev) |
|
} |
|
|
|
function handleMouseUp (ev) { |
|
handleEvent(buttonState & ~mouse.buttons(ev), ev) |
|
} |
|
|
|
function attachListeners () { |
|
if (attached) { |
|
return |
|
} |
|
attached = true |
|
|
|
element.addEventListener('mousemove', handleMouseMove) |
|
|
|
element.addEventListener('mousedown', handleMouseDown) |
|
|
|
element.addEventListener('mouseup', handleMouseUp) |
|
|
|
element.addEventListener('mouseleave', clearState) |
|
element.addEventListener('mouseenter', clearState) |
|
element.addEventListener('mouseout', clearState) |
|
element.addEventListener('mouseover', clearState) |
|
|
|
element.addEventListener('blur', handleBlur) |
|
|
|
element.addEventListener('keyup', handleMods) |
|
element.addEventListener('keydown', handleMods) |
|
element.addEventListener('keypress', handleMods) |
|
|
|
if (element !== window) { |
|
window.addEventListener('blur', handleBlur) |
|
|
|
window.addEventListener('keyup', handleMods) |
|
window.addEventListener('keydown', handleMods) |
|
window.addEventListener('keypress', handleMods) |
|
} |
|
} |
|
|
|
function detachListeners () { |
|
if (!attached) { |
|
return |
|
} |
|
attached = false |
|
|
|
element.removeEventListener('mousemove', handleMouseMove) |
|
|
|
element.removeEventListener('mousedown', handleMouseDown) |
|
|
|
element.removeEventListener('mouseup', handleMouseUp) |
|
|
|
element.removeEventListener('mouseleave', clearState) |
|
element.removeEventListener('mouseenter', clearState) |
|
element.removeEventListener('mouseout', clearState) |
|
element.removeEventListener('mouseover', clearState) |
|
|
|
element.removeEventListener('blur', handleBlur) |
|
|
|
element.removeEventListener('keyup', handleMods) |
|
element.removeEventListener('keydown', handleMods) |
|
element.removeEventListener('keypress', handleMods) |
|
|
|
if (element !== window) { |
|
window.removeEventListener('blur', handleBlur) |
|
|
|
window.removeEventListener('keyup', handleMods) |
|
window.removeEventListener('keydown', handleMods) |
|
window.removeEventListener('keypress', handleMods) |
|
} |
|
} |
|
|
|
// Attach listeners |
|
attachListeners() |
|
|
|
var result = { |
|
element: element |
|
} |
|
|
|
Object.defineProperties(result, { |
|
enabled: { |
|
get: function () { return attached }, |
|
set: function (f) { |
|
if (f) { |
|
attachListeners() |
|
} else { |
|
detachListeners() |
|
} |
|
}, |
|
enumerable: true |
|
}, |
|
buttons: { |
|
get: function () { return buttonState }, |
|
enumerable: true |
|
}, |
|
x: { |
|
get: function () { return x }, |
|
enumerable: true |
|
}, |
|
y: { |
|
get: function () { return y }, |
|
enumerable: true |
|
}, |
|
mods: { |
|
get: function () { return mods }, |
|
enumerable: true |
|
} |
|
}) |
|
|
|
return result |
|
} |
|
|
|
},{"mouse-event":202}],201:[function(require,module,exports){ |
|
var rootPosition = { left: 0, top: 0 } |
|
|
|
module.exports = mouseEventOffset |
|
function mouseEventOffset (ev, target, out) { |
|
target = target || ev.currentTarget || ev.srcElement |
|
if (!Array.isArray(out)) { |
|
out = [ 0, 0 ] |
|
} |
|
var cx = ev.clientX || 0 |
|
var cy = ev.clientY || 0 |
|
var rect = getBoundingClientOffset(target) |
|
out[0] = cx - rect.left |
|
out[1] = cy - rect.top |
|
return out |
|
} |
|
|
|
function getBoundingClientOffset (element) { |
|
if (element === window || |
|
element === document || |
|
element === document.body) { |
|
return rootPosition |
|
} else { |
|
return element.getBoundingClientRect() |
|
} |
|
} |
|
|
|
},{}],202:[function(require,module,exports){ |
|
'use strict' |
|
|
|
function mouseButtons(ev) { |
|
if(typeof ev === 'object') { |
|
if('buttons' in ev) { |
|
return ev.buttons |
|
} else if('which' in ev) { |
|
var b = ev.which |
|
if(b === 2) { |
|
return 4 |
|
} else if(b === 3) { |
|
return 2 |
|
} else if(b > 0) { |
|
return 1<<(b-1) |
|
} |
|
} else if('button' in ev) { |
|
var b = ev.button |
|
if(b === 1) { |
|
return 4 |
|
} else if(b === 2) { |
|
return 2 |
|
} else if(b >= 0) { |
|
return 1<<b |
|
} |
|
} |
|
} |
|
return 0 |
|
} |
|
exports.buttons = mouseButtons |
|
|
|
function mouseElement(ev) { |
|
return ev.target || ev.srcElement || window |
|
} |
|
exports.element = mouseElement |
|
|
|
function mouseRelativeX(ev) { |
|
if(typeof ev === 'object') { |
|
if('offsetX' in ev) { |
|
return ev.offsetX |
|
} |
|
var target = mouseElement(ev) |
|
var bounds = target.getBoundingClientRect() |
|
return ev.clientX - bounds.left |
|
} |
|
return 0 |
|
} |
|
exports.x = mouseRelativeX |
|
|
|
function mouseRelativeY(ev) { |
|
if(typeof ev === 'object') { |
|
if('offsetY' in ev) { |
|
return ev.offsetY |
|
} |
|
var target = mouseElement(ev) |
|
var bounds = target.getBoundingClientRect() |
|
return ev.clientY - bounds.top |
|
} |
|
return 0 |
|
} |
|
exports.y = mouseRelativeY |
|
|
|
},{}],203:[function(require,module,exports){ |
|
'use strict' |
|
|
|
var toPX = require('to-px') |
|
|
|
module.exports = mouseWheelListen |
|
|
|
function mouseWheelListen(element, callback, noScroll) { |
|
if(typeof element === 'function') { |
|
noScroll = !!callback |
|
callback = element |
|
element = window |
|
} |
|
var lineHeight = toPX('ex', element) |
|
var listener = function(ev) { |
|
if(noScroll) { |
|
ev.preventDefault() |
|
} |
|
var dx = ev.deltaX || 0 |
|
var dy = ev.deltaY || 0 |
|
var dz = ev.deltaZ || 0 |
|
var mode = ev.deltaMode |
|
var scale = 1 |
|
switch(mode) { |
|
case 1: |
|
scale = lineHeight |
|
break |
|
case 2: |
|
scale = window.innerHeight |
|
break |
|
} |
|
dx *= scale |
|
dy *= scale |
|
dz *= scale |
|
if(dx || dy || dz) { |
|
return callback(dx, dy, dz, ev) |
|
} |
|
} |
|
element.addEventListener('wheel', listener) |
|
return listener |
|
} |
|
|
|
},{"to-px":252}],204:[function(require,module,exports){ |
|
"use strict" |
|
|
|
var pool = require("typedarray-pool") |
|
|
|
module.exports = createSurfaceExtractor |
|
|
|
//Helper macros |
|
function array(i) { |
|
return "a" + i |
|
} |
|
function data(i) { |
|
return "d" + i |
|
} |
|
function cube(i,bitmask) { |
|
return "c" + i + "_" + bitmask |
|
} |
|
function shape(i) { |
|
return "s" + i |
|
} |
|
function stride(i,j) { |
|
return "t" + i + "_" + j |
|
} |
|
function offset(i) { |
|
return "o" + i |
|
} |
|
function scalar(i) { |
|
return "x" + i |
|
} |
|
function pointer(i) { |
|
return "p" + i |
|
} |
|
function delta(i,bitmask) { |
|
return "d" + i + "_" + bitmask |
|
} |
|
function index(i) { |
|
return "i" + i |
|
} |
|
function step(i,j) { |
|
return "u" + i + "_" + j |
|
} |
|
function pcube(bitmask) { |
|
return "b" + bitmask |
|
} |
|
function qcube(bitmask) { |
|
return "y" + bitmask |
|
} |
|
function pdelta(bitmask) { |
|
return "e" + bitmask |
|
} |
|
function vert(i) { |
|
return "v" + i |
|
} |
|
var VERTEX_IDS = "V" |
|
var PHASES = "P" |
|
var VERTEX_COUNT = "N" |
|
var POOL_SIZE = "Q" |
|
var POINTER = "X" |
|
var TEMPORARY = "T" |
|
|
|
function permBitmask(dimension, mask, order) { |
|
var r = 0 |
|
for(var i=0; i<dimension; ++i) { |
|
if(mask & (1<<i)) { |
|
r |= (1<<order[i]) |
|
} |
|
} |
|
return r |
|
} |
|
|
|
//Generates the surface procedure |
|
function compileSurfaceProcedure(vertexFunc, faceFunc, phaseFunc, scalarArgs, order, typesig) { |
|
var arrayArgs = typesig.length |
|
var dimension = order.length |
|
|
|
if(dimension < 2) { |
|
throw new Error("ndarray-extract-contour: Dimension must be at least 2") |
|
} |
|
|
|
var funcName = "extractContour" + order.join("_") |
|
var code = [] |
|
var vars = [] |
|
var args = [] |
|
|
|
//Assemble arguments |
|
for(var i=0; i<arrayArgs; ++i) { |
|
args.push(array(i)) |
|
} |
|
for(var i=0; i<scalarArgs; ++i) { |
|
args.push(scalar(i)) |
|
} |
|
|
|
//Shape |
|
for(var i=0; i<dimension; ++i) { |
|
vars.push(shape(i) + "=" + array(0) + ".shape[" + i + "]|0") |
|
} |
|
//Data, stride, offset pointers |
|
for(var i=0; i<arrayArgs; ++i) { |
|
vars.push(data(i) + "=" + array(i) + ".data", |
|
offset(i) + "=" + array(i) + ".offset|0") |
|
for(var j=0; j<dimension; ++j) { |
|
vars.push(stride(i,j) + "=" + array(i) + ".stride[" + j + "]|0") |
|
} |
|
} |
|
//Pointer, delta and cube variables |
|
for(var i=0; i<arrayArgs; ++i) { |
|
vars.push(pointer(i) + "=" + offset(i)) |
|
vars.push(cube(i,0)) |
|
for(var j=1; j<(1<<dimension); ++j) { |
|
var ptrStr = [] |
|
for(var k=0; k<dimension; ++k) { |
|
if(j & (1<<k)) { |
|
ptrStr.push("-" + stride(i,k)) |
|
} |
|
} |
|
vars.push(delta(i,j) + "=(" + ptrStr.join("") + ")|0") |
|
vars.push(cube(i,j) + "=0") |
|
} |
|
} |
|
//Create step variables |
|
for(var i=0; i<arrayArgs; ++i) { |
|
for(var j=0; j<dimension; ++j) { |
|
var stepVal = [ stride(i,order[j]) ] |
|
if(j > 0) { |
|
stepVal.push(stride(i, order[j-1]) + "*" + shape(order[j-1]) ) |
|
} |
|
vars.push(step(i,order[j]) + "=(" + stepVal.join("-") + ")|0") |
|
} |
|
} |
|
//Create index variables |
|
for(var i=0; i<dimension; ++i) { |
|
vars.push(index(i) + "=0") |
|
} |
|
//Vertex count |
|
vars.push(VERTEX_COUNT + "=0") |
|
//Compute pool size, initialize pool step |
|
var sizeVariable = ["2"] |
|
for(var i=dimension-2; i>=0; --i) { |
|
sizeVariable.push(shape(order[i])) |
|
} |
|
//Previous phases and vertex_ids |
|
vars.push(POOL_SIZE + "=(" + sizeVariable.join("*") + ")|0", |
|
PHASES + "=mallocUint32(" + POOL_SIZE + ")", |
|
VERTEX_IDS + "=mallocUint32(" + POOL_SIZE + ")", |
|
POINTER + "=0") |
|
//Create cube variables for phases |
|
vars.push(pcube(0) + "=0") |
|
for(var j=1; j<(1<<dimension); ++j) { |
|
var cubeDelta = [] |
|
var cubeStep = [ ] |
|
for(var k=0; k<dimension; ++k) { |
|
if(j & (1<<k)) { |
|
if(cubeStep.length === 0) { |
|
cubeDelta.push("1") |
|
} else { |
|
cubeDelta.unshift(cubeStep.join("*")) |
|
} |
|
} |
|
cubeStep.push(shape(order[k])) |
|
} |
|
var signFlag = "" |
|
if(cubeDelta[0].indexOf(shape(order[dimension-2])) < 0) { |
|
signFlag = "-" |
|
} |
|
var jperm = permBitmask(dimension, j, order) |
|
vars.push(pdelta(jperm) + "=(-" + cubeDelta.join("-") + ")|0", |
|
qcube(jperm) + "=(" + signFlag + cubeDelta.join("-") + ")|0", |
|
pcube(jperm) + "=0") |
|
} |
|
vars.push(vert(0) + "=0", TEMPORARY + "=0") |
|
|
|
function forLoopBegin(i, start) { |
|
code.push("for(", index(order[i]), "=", start, ";", |
|
index(order[i]), "<", shape(order[i]), ";", |
|
"++", index(order[i]), "){") |
|
} |
|
|
|
function forLoopEnd(i) { |
|
for(var j=0; j<arrayArgs; ++j) { |
|
code.push(pointer(j), "+=", step(j,order[i]), ";") |
|
} |
|
code.push("}") |
|
} |
|
|
|
function fillEmptySlice(k) { |
|
for(var i=k-1; i>=0; --i) { |
|
forLoopBegin(i, 0) |
|
} |
|
var phaseFuncArgs = [] |
|
for(var i=0; i<arrayArgs; ++i) { |
|
if(typesig[i]) { |
|
phaseFuncArgs.push(data(i) + ".get(" + pointer(i) + ")") |
|
} else { |
|
phaseFuncArgs.push(data(i) + "[" + pointer(i) + "]") |
|
} |
|
} |
|
for(var i=0; i<scalarArgs; ++i) { |
|
phaseFuncArgs.push(scalar(i)) |
|
} |
|
code.push(PHASES, "[", POINTER, "++]=phase(", phaseFuncArgs.join(), ");") |
|
for(var i=0; i<k; ++i) { |
|
forLoopEnd(i) |
|
} |
|
for(var j=0; j<arrayArgs; ++j) { |
|
code.push(pointer(j), "+=", step(j,order[k]), ";") |
|
} |
|
} |
|
|
|
function processGridCell(mask) { |
|
//Read in local data |
|
for(var i=0; i<arrayArgs; ++i) { |
|
if(typesig[i]) { |
|
code.push(cube(i,0), "=", data(i), ".get(", pointer(i), ");") |
|
} else { |
|
code.push(cube(i,0), "=", data(i), "[", pointer(i), "];") |
|
} |
|
} |
|
|
|
//Read in phase |
|
var phaseFuncArgs = [] |
|
for(var i=0; i<arrayArgs; ++i) { |
|
phaseFuncArgs.push(cube(i,0)) |
|
} |
|
for(var i=0; i<scalarArgs; ++i) { |
|
phaseFuncArgs.push(scalar(i)) |
|
} |
|
|
|
code.push(pcube(0), "=", PHASES, "[", POINTER, "]=phase(", phaseFuncArgs.join(), ");") |
|
|
|
//Read in other cube data |
|
for(var j=1; j<(1<<dimension); ++j) { |
|
code.push(pcube(j), "=", PHASES, "[", POINTER, "+", pdelta(j), "];") |
|
} |
|
|
|
//Check for boundary crossing |
|
var vertexPredicate = [] |
|
for(var j=1; j<(1<<dimension); ++j) { |
|
vertexPredicate.push("(" + pcube(0) + "!==" + pcube(j) + ")") |
|
} |
|
code.push("if(", vertexPredicate.join("||"), "){") |
|
|
|
//Read in boundary data |
|
var vertexArgs = [] |
|
for(var i=0; i<dimension; ++i) { |
|
vertexArgs.push(index(i)) |
|
} |
|
for(var i=0; i<arrayArgs; ++i) { |
|
vertexArgs.push(cube(i,0)) |
|
for(var j=1; j<(1<<dimension); ++j) { |
|
if(typesig[i]) { |
|
code.push(cube(i,j), "=", data(i), ".get(", pointer(i), "+", delta(i,j), ");") |
|
} else { |
|
code.push(cube(i,j), "=", data(i), "[", pointer(i), "+", delta(i,j), "];") |
|
} |
|
vertexArgs.push(cube(i,j)) |
|
} |
|
} |
|
for(var i=0; i<(1<<dimension); ++i) { |
|
vertexArgs.push(pcube(i)) |
|
} |
|
for(var i=0; i<scalarArgs; ++i) { |
|
vertexArgs.push(scalar(i)) |
|
} |
|
|
|
//Generate vertex |
|
code.push("vertex(", vertexArgs.join(), ");", |
|
vert(0), "=", VERTEX_IDS, "[", POINTER, "]=", VERTEX_COUNT, "++;") |
|
|
|
//Check for face crossings |
|
var base = (1<<dimension)-1 |
|
var corner = pcube(base) |
|
for(var j=0; j<dimension; ++j) { |
|
if((mask & ~(1<<j))===0) { |
|
//Check face |
|
var subset = base^(1<<j) |
|
var edge = pcube(subset) |
|
var faceArgs = [ ] |
|
for(var k=subset; k>0; k=(k-1)&subset) { |
|
faceArgs.push(VERTEX_IDS + "[" + POINTER + "+" + pdelta(k) + "]") |
|
} |
|
faceArgs.push(vert(0)) |
|
for(var k=0; k<arrayArgs; ++k) { |
|
if(j&1) { |
|
faceArgs.push(cube(k,base), cube(k,subset)) |
|
} else { |
|
faceArgs.push(cube(k,subset), cube(k,base)) |
|
} |
|
} |
|
if(j&1) { |
|
faceArgs.push(corner, edge) |
|
} else { |
|
faceArgs.push(edge, corner) |
|
} |
|
for(var k=0; k<scalarArgs; ++k) { |
|
faceArgs.push(scalar(k)) |
|
} |
|
code.push("if(", corner, "!==", edge, "){", |
|
"face(", faceArgs.join(), ")}") |
|
} |
|
} |
|
|
|
//Increment pointer, close off if statement |
|
code.push("}", |
|
POINTER, "+=1;") |
|
} |
|
|
|
function flip() { |
|
for(var j=1; j<(1<<dimension); ++j) { |
|
code.push(TEMPORARY, "=", pdelta(j), ";", |
|
pdelta(j), "=", qcube(j), ";", |
|
qcube(j), "=", TEMPORARY, ";") |
|
} |
|
} |
|
|
|
function createLoop(i, mask) { |
|
if(i < 0) { |
|
processGridCell(mask) |
|
return |
|
} |
|
fillEmptySlice(i) |
|
code.push("if(", shape(order[i]), ">0){", |
|
index(order[i]), "=1;") |
|
createLoop(i-1, mask|(1<<order[i])) |
|
|
|
for(var j=0; j<arrayArgs; ++j) { |
|
code.push(pointer(j), "+=", step(j,order[i]), ";") |
|
} |
|
if(i === dimension-1) { |
|
code.push(POINTER, "=0;") |
|
flip() |
|
} |
|
forLoopBegin(i, 2) |
|
createLoop(i-1, mask) |
|
if(i === dimension-1) { |
|
code.push("if(", index(order[dimension-1]), "&1){", |
|
POINTER, "=0;}") |
|
flip() |
|
} |
|
forLoopEnd(i) |
|
code.push("}") |
|
} |
|
|
|
createLoop(dimension-1, 0) |
|
|
|
//Release scratch memory |
|
code.push("freeUint32(", VERTEX_IDS, ");freeUint32(", PHASES, ");") |
|
|
|
//Compile and link procedure |
|
var procedureCode = [ |
|
"'use strict';", |
|
"function ", funcName, "(", args.join(), "){", |
|
"var ", vars.join(), ";", |
|
code.join(""), |
|
"}", |
|
"return ", funcName ].join("") |
|
|
|
var proc = new Function( |
|
"vertex", |
|
"face", |
|
"phase", |
|
"mallocUint32", |
|
"freeUint32", |
|
procedureCode) |
|
return proc( |
|
vertexFunc, |
|
faceFunc, |
|
phaseFunc, |
|
pool.mallocUint32, |
|
pool.freeUint32) |
|
} |
|
|
|
function createSurfaceExtractor(args) { |
|
function error(msg) { |
|
throw new Error("ndarray-extract-contour: " + msg) |
|
} |
|
if(typeof args !== "object") { |
|
error("Must specify arguments") |
|
} |
|
var order = args.order |
|
if(!Array.isArray(order)) { |
|
error("Must specify order") |
|
} |
|
var arrays = args.arrayArguments||1 |
|
if(arrays < 1) { |
|
error("Must have at least one array argument") |
|
} |
|
var scalars = args.scalarArguments||0 |
|
if(scalars < 0) { |
|
error("Scalar arg count must be > 0") |
|
} |
|
if(typeof args.vertex !== "function") { |
|
error("Must specify vertex creation function") |
|
} |
|
if(typeof args.cell !== "function") { |
|
error("Must specify cell creation function") |
|
} |
|
if(typeof args.phase !== "function") { |
|
error("Must specify phase function") |
|
} |
|
var getters = args.getters || [] |
|
var typesig = new Array(arrays) |
|
for(var i=0; i<arrays; ++i) { |
|
if(getters.indexOf(i) >= 0) { |
|
typesig[i] = true |
|
} else { |
|
typesig[i] = false |
|
} |
|
} |
|
return compileSurfaceProcedure( |
|
args.vertex, |
|
args.cell, |
|
args.phase, |
|
scalars, |
|
order, |
|
typesig) |
|
} |
|
},{"typedarray-pool":257}],205:[function(require,module,exports){ |
|
"use strict" |
|
|
|
var compile = require("cwise-compiler") |
|
|
|
var EmptyProc = { |
|
body: "", |
|
args: [], |
|
thisVars: [], |
|
localVars: [] |
|
} |
|
|
|
function fixup(x) { |
|
if(!x) { |
|
return EmptyProc |
|
} |
|
for(var i=0; i<x.args.length; ++i) { |
|
var a = x.args[i] |
|
if(i === 0) { |
|
x.args[i] = {name: a, lvalue:true, rvalue: !!x.rvalue, count:x.count||1 } |
|
} else { |
|
x.args[i] = {name: a, lvalue:false, rvalue:true, count: 1} |
|
} |
|
} |
|
if(!x.thisVars) { |
|
x.thisVars = [] |
|
} |
|
if(!x.localVars) { |
|
x.localVars = [] |
|
} |
|
return x |
|
} |
|
|
|
function pcompile(user_args) { |
|
return compile({ |
|
args: user_args.args, |
|
pre: fixup(user_args.pre), |
|
body: fixup(user_args.body), |
|
post: fixup(user_args.proc), |
|
funcName: user_args.funcName |
|
}) |
|
} |
|
|
|
function makeOp(user_args) { |
|
var args = [] |
|
for(var i=0; i<user_args.args.length; ++i) { |
|
args.push("a"+i) |
|
} |
|
var wrapper = new Function("P", [ |
|
"return function ", user_args.funcName, "_ndarrayops(", args.join(","), ") {P(", args.join(","), ");return a0}" |
|
].join("")) |
|
return wrapper(pcompile(user_args)) |
|
} |
|
|
|
var assign_ops = { |
|
add: "+", |
|
sub: "-", |
|
mul: "*", |
|
div: "/", |
|
mod: "%", |
|
band: "&", |
|
bor: "|", |
|
bxor: "^", |
|
lshift: "<<", |
|
rshift: ">>", |
|
rrshift: ">>>" |
|
} |
|
;(function(){ |
|
for(var id in assign_ops) { |
|
var op = assign_ops[id] |
|
exports[id] = makeOp({ |
|
args: ["array","array","array"], |
|
body: {args:["a","b","c"], |
|
body: "a=b"+op+"c"}, |
|
funcName: id |
|
}) |
|
exports[id+"eq"] = makeOp({ |
|
args: ["array","array"], |
|
body: {args:["a","b"], |
|
body:"a"+op+"=b"}, |
|
rvalue: true, |
|
funcName: id+"eq" |
|
}) |
|
exports[id+"s"] = makeOp({ |
|
args: ["array", "array", "scalar"], |
|
body: {args:["a","b","s"], |
|
body:"a=b"+op+"s"}, |
|
funcName: id+"s" |
|
}) |
|
exports[id+"seq"] = makeOp({ |
|
args: ["array","scalar"], |
|
body: {args:["a","s"], |
|
body:"a"+op+"=s"}, |
|
rvalue: true, |
|
funcName: id+"seq" |
|
}) |
|
} |
|
})(); |
|
|
|
var unary_ops = { |
|
not: "!", |
|
bnot: "~", |
|
neg: "-", |
|
recip: "1.0/" |
|
} |
|
;(function(){ |
|
for(var id in unary_ops) { |
|
var op = unary_ops[id] |
|
exports[id] = makeOp({ |
|
args: ["array", "array"], |
|
body: {args:["a","b"], |
|
body:"a="+op+"b"}, |
|
funcName: id |
|
}) |
|
exports[id+"eq"] = makeOp({ |
|
args: ["array"], |
|
body: {args:["a"], |
|
body:"a="+op+"a"}, |
|
rvalue: true, |
|
count: 2, |
|
funcName: id+"eq" |
|
}) |
|
} |
|
})(); |
|
|
|
var binary_ops = { |
|
and: "&&", |
|
or: "||", |
|
eq: "===", |
|
neq: "!==", |
|
lt: "<", |
|
gt: ">", |
|
leq: "<=", |
|
geq: ">=" |
|
} |
|
;(function() { |
|
for(var id in binary_ops) { |
|
var op = binary_ops[id] |
|
exports[id] = makeOp({ |
|
args: ["array","array","array"], |
|
body: {args:["a", "b", "c"], |
|
body:"a=b"+op+"c"}, |
|
funcName: id |
|
}) |
|
exports[id+"s"] = makeOp({ |
|
args: ["array","array","scalar"], |
|
body: {args:["a", "b", "s"], |
|
body:"a=b"+op+"s"}, |
|
funcName: id+"s" |
|
}) |
|
exports[id+"eq"] = makeOp({ |
|
args: ["array", "array"], |
|
body: {args:["a", "b"], |
|
body:"a=a"+op+"b"}, |
|
rvalue:true, |
|
count:2, |
|
funcName: id+"eq" |
|
}) |
|
exports[id+"seq"] = makeOp({ |
|
args: ["array", "scalar"], |
|
body: {args:["a","s"], |
|
body:"a=a"+op+"s"}, |
|
rvalue:true, |
|
count:2, |
|
funcName: id+"seq" |
|
}) |
|
} |
|
})(); |
|
|
|
var math_unary = [ |
|
"abs", |
|
"acos", |
|
"asin", |
|
"atan", |
|
"ceil", |
|
"cos", |
|
"exp", |
|
"floor", |
|
"log", |
|
"round", |
|
"sin", |
|
"sqrt", |
|
"tan" |
|
] |
|
;(function() { |
|
for(var i=0; i<math_unary.length; ++i) { |
|
var f = math_unary[i] |
|
exports[f] = makeOp({ |
|
args: ["array", "array"], |
|
pre: {args:[], body:"this_f=Math."+f, thisVars:["this_f"]}, |
|
body: {args:["a","b"], body:"a=this_f(b)", thisVars:["this_f"]}, |
|
funcName: f |
|
}) |
|
exports[f+"eq"] = makeOp({ |
|
args: ["array"], |
|
pre: {args:[], body:"this_f=Math."+f, thisVars:["this_f"]}, |
|
body: {args: ["a"], body:"a=this_f(a)", thisVars:["this_f"]}, |
|
rvalue: true, |
|
count: 2, |
|
funcName: f+"eq" |
|
}) |
|
} |
|
})(); |
|
|
|
var math_comm = [ |
|
"max", |
|
"min", |
|
"atan2", |
|
"pow" |
|
] |
|
;(function(){ |
|
for(var i=0; i<math_comm.length; ++i) { |
|
var f= math_comm[i] |
|
exports[f] = makeOp({ |
|
args:["array", "array", "array"], |
|
pre: {args:[], body:"this_f=Math."+f, thisVars:["this_f"]}, |
|
body: {args:["a","b","c"], body:"a=this_f(b,c)", thisVars:["this_f"]}, |
|
funcName: f |
|
}) |
|
exports[f+"s"] = makeOp({ |
|
args:["array", "array", "scalar"], |
|
pre: {args:[], body:"this_f=Math."+f, thisVars:["this_f"]}, |
|
body: {args:["a","b","c"], body:"a=this_f(b,c)", thisVars:["this_f"]}, |
|
funcName: f+"s" |
|
}) |
|
exports[f+"eq"] = makeOp({ args:["array", "array"], |
|
pre: {args:[], body:"this_f=Math."+f, thisVars:["this_f"]}, |
|
body: {args:["a","b"], body:"a=this_f(a,b)", thisVars:["this_f"]}, |
|
rvalue: true, |
|
count: 2, |
|
funcName: f+"eq" |
|
}) |
|
exports[f+"seq"] = makeOp({ args:["array", "scalar"], |
|
pre: {args:[], body:"this_f=Math."+f, thisVars:["this_f"]}, |
|
body: {args:["a","b"], body:"a=this_f(a,b)", thisVars:["this_f"]}, |
|
rvalue:true, |
|
count:2, |
|
funcName: f+"seq" |
|
}) |
|
} |
|
})(); |
|
|
|
var math_noncomm = [ |
|
"atan2", |
|
"pow" |
|
] |
|
;(function(){ |
|
for(var i=0; i<math_noncomm.length; ++i) { |
|
var f= math_noncomm[i] |
|
exports[f+"op"] = makeOp({ |
|
args:["array", "array", "array"], |
|
pre: {args:[], body:"this_f=Math."+f, thisVars:["this_f"]}, |
|
body: {args:["a","b","c"], body:"a=this_f(c,b)", thisVars:["this_f"]}, |
|
funcName: f+"op" |
|
}) |
|
exports[f+"ops"] = makeOp({ |
|
args:["array", "array", "scalar"], |
|
pre: {args:[], body:"this_f=Math."+f, thisVars:["this_f"]}, |
|
body: {args:["a","b","c"], body:"a=this_f(c,b)", thisVars:["this_f"]}, |
|
funcName: f+"ops" |
|
}) |
|
exports[f+"opeq"] = makeOp({ args:["array", "array"], |
|
pre: {args:[], body:"this_f=Math."+f, thisVars:["this_f"]}, |
|
body: {args:["a","b"], body:"a=this_f(b,a)", thisVars:["this_f"]}, |
|
rvalue: true, |
|
count: 2, |
|
funcName: f+"opeq" |
|
}) |
|
exports[f+"opseq"] = makeOp({ args:["array", "scalar"], |
|
pre: {args:[], body:"this_f=Math."+f, thisVars:["this_f"]}, |
|
body: {args:["a","b"], body:"a=this_f(b,a)", thisVars:["this_f"]}, |
|
rvalue:true, |
|
count:2, |
|
funcName: f+"opseq" |
|
}) |
|
} |
|
})(); |
|
|
|
exports.any = compile({ |
|
args:["array"], |
|
pre: EmptyProc, |
|
body: {args:[{name:"a", lvalue:false, rvalue:true, count:1}], body: "if(a){return true}", localVars: [], thisVars: []}, |
|
post: {args:[], localVars:[], thisVars:[], body:"return false"}, |
|
funcName: "any" |
|
}) |
|
|
|
exports.all = compile({ |
|
args:["array"], |
|
pre: EmptyProc, |
|
body: {args:[{name:"x", lvalue:false, rvalue:true, count:1}], body: "if(!x){return false}", localVars: [], thisVars: []}, |
|
post: {args:[], localVars:[], thisVars:[], body:"return true"}, |
|
funcName: "all" |
|
}) |
|
|
|
exports.sum = compile({ |
|
args:["array"], |
|
pre: {args:[], localVars:[], thisVars:["this_s"], body:"this_s=0"}, |
|
body: {args:[{name:"a", lvalue:false, rvalue:true, count:1}], body: "this_s+=a", localVars: [], thisVars: ["this_s"]}, |
|
post: {args:[], localVars:[], thisVars:["this_s"], body:"return this_s"}, |
|
funcName: "sum" |
|
}) |
|
|
|
exports.prod = compile({ |
|
args:["array"], |
|
pre: {args:[], localVars:[], thisVars:["this_s"], body:"this_s=1"}, |
|
body: {args:[{name:"a", lvalue:false, rvalue:true, count:1}], body: "this_s*=a", localVars: [], thisVars: ["this_s"]}, |
|
post: {args:[], localVars:[], thisVars:["this_s"], body:"return this_s"}, |
|
funcName: "prod" |
|
}) |
|
|
|
exports.norm2squared = compile({ |
|
args:["array"], |
|
pre: {args:[], localVars:[], thisVars:["this_s"], body:"this_s=0"}, |
|
body: {args:[{name:"a", lvalue:false, rvalue:true, count:2}], body: "this_s+=a*a", localVars: [], thisVars: ["this_s"]}, |
|
post: {args:[], localVars:[], thisVars:["this_s"], body:"return this_s"}, |
|
funcName: "norm2squared" |
|
}) |
|
|
|
exports.norm2 = compile({ |
|
args:["array"], |
|
pre: {args:[], localVars:[], thisVars:["this_s"], body:"this_s=0"}, |
|
body: {args:[{name:"a", lvalue:false, rvalue:true, count:2}], body: "this_s+=a*a", localVars: [], thisVars: ["this_s"]}, |
|
post: {args:[], localVars:[], thisVars:["this_s"], body:"return Math.sqrt(this_s)"}, |
|
funcName: "norm2" |
|
}) |
|
|
|
|
|
exports.norminf = compile({ |
|
args:["array"], |
|
pre: {args:[], localVars:[], thisVars:["this_s"], body:"this_s=0"}, |
|
body: {args:[{name:"a", lvalue:false, rvalue:true, count:4}], body:"if(-a>this_s){this_s=-a}else if(a>this_s){this_s=a}", localVars: [], thisVars: ["this_s"]}, |
|
post: {args:[], localVars:[], thisVars:["this_s"], body:"return this_s"}, |
|
funcName: "norminf" |
|
}) |
|
|
|
exports.norm1 = compile({ |
|
args:["array"], |
|
pre: {args:[], localVars:[], thisVars:["this_s"], body:"this_s=0"}, |
|
body: {args:[{name:"a", lvalue:false, rvalue:true, count:3}], body: "this_s+=a<0?-a:a", localVars: [], thisVars: ["this_s"]}, |
|
post: {args:[], localVars:[], thisVars:["this_s"], body:"return this_s"}, |
|
funcName: "norm1" |
|
}) |
|
|
|
exports.sup = compile({ |
|
args: [ "array" ], |
|
pre: |
|
{ body: "this_h=-Infinity", |
|
args: [], |
|
thisVars: [ "this_h" ], |
|
localVars: [] }, |
|
body: |
|
{ body: "if(_inline_1_arg0_>this_h)this_h=_inline_1_arg0_", |
|
args: [{"name":"_inline_1_arg0_","lvalue":false,"rvalue":true,"count":2} ], |
|
thisVars: [ "this_h" ], |
|
localVars: [] }, |
|
post: |
|
{ body: "return this_h", |
|
args: [], |
|
thisVars: [ "this_h" ], |
|
localVars: [] } |
|
}) |
|
|
|
exports.inf = compile({ |
|
args: [ "array" ], |
|
pre: |
|
{ body: "this_h=Infinity", |
|
args: [], |
|
thisVars: [ "this_h" ], |
|
localVars: [] }, |
|
body: |
|
{ body: "if(_inline_1_arg0_<this_h)this_h=_inline_1_arg0_", |
|
args: [{"name":"_inline_1_arg0_","lvalue":false,"rvalue":true,"count":2} ], |
|
thisVars: [ "this_h" ], |
|
localVars: [] }, |
|
post: |
|
{ body: "return this_h", |
|
args: [], |
|
thisVars: [ "this_h" ], |
|
localVars: [] } |
|
}) |
|
|
|
exports.argmin = compile({ |
|
args:["index","array","shape"], |
|
pre:{ |
|
body:"{this_v=Infinity;this_i=_inline_0_arg2_.slice(0)}", |
|
args:[ |
|
{name:"_inline_0_arg0_",lvalue:false,rvalue:false,count:0}, |
|
{name:"_inline_0_arg1_",lvalue:false,rvalue:false,count:0}, |
|
{name:"_inline_0_arg2_",lvalue:false,rvalue:true,count:1} |
|
], |
|
thisVars:["this_i","this_v"], |
|
localVars:[]}, |
|
body:{ |
|
body:"{if(_inline_1_arg1_<this_v){this_v=_inline_1_arg1_;for(var _inline_1_k=0;_inline_1_k<_inline_1_arg0_.length;++_inline_1_k){this_i[_inline_1_k]=_inline_1_arg0_[_inline_1_k]}}}", |
|
args:[ |
|
{name:"_inline_1_arg0_",lvalue:false,rvalue:true,count:2}, |
|
{name:"_inline_1_arg1_",lvalue:false,rvalue:true,count:2}], |
|
thisVars:["this_i","this_v"], |
|
localVars:["_inline_1_k"]}, |
|
post:{ |
|
body:"{return this_i}", |
|
args:[], |
|
thisVars:["this_i"], |
|
localVars:[]} |
|
}) |
|
|
|
exports.argmax = compile({ |
|
args:["index","array","shape"], |
|
pre:{ |
|
body:"{this_v=-Infinity;this_i=_inline_0_arg2_.slice(0)}", |
|
args:[ |
|
{name:"_inline_0_arg0_",lvalue:false,rvalue:false,count:0}, |
|
{name:"_inline_0_arg1_",lvalue:false,rvalue:false,count:0}, |
|
{name:"_inline_0_arg2_",lvalue:false,rvalue:true,count:1} |
|
], |
|
thisVars:["this_i","this_v"], |
|
localVars:[]}, |
|
body:{ |
|
body:"{if(_inline_1_arg1_>this_v){this_v=_inline_1_arg1_;for(var _inline_1_k=0;_inline_1_k<_inline_1_arg0_.length;++_inline_1_k){this_i[_inline_1_k]=_inline_1_arg0_[_inline_1_k]}}}", |
|
args:[ |
|
{name:"_inline_1_arg0_",lvalue:false,rvalue:true,count:2}, |
|
{name:"_inline_1_arg1_",lvalue:false,rvalue:true,count:2}], |
|
thisVars:["this_i","this_v"], |
|
localVars:["_inline_1_k"]}, |
|
post:{ |
|
body:"{return this_i}", |
|
args:[], |
|
thisVars:["this_i"], |
|
localVars:[]} |
|
}) |
|
|
|
exports.random = makeOp({ |
|
args: ["array"], |
|
pre: {args:[], body:"this_f=Math.random", thisVars:["this_f"]}, |
|
body: {args: ["a"], body:"a=this_f()", thisVars:["this_f"]}, |
|
funcName: "random" |
|
}) |
|
|
|
exports.assign = makeOp({ |
|
args:["array", "array"], |
|
body: {args:["a", "b"], body:"a=b"}, |
|
funcName: "assign" }) |
|
|
|
exports.assigns = makeOp({ |
|
args:["array", "scalar"], |
|
body: {args:["a", "b"], body:"a=b"}, |
|
funcName: "assigns" }) |
|
|
|
|
|
exports.equals = compile({ |
|
args:["array", "array"], |
|
pre: EmptyProc, |
|
body: {args:[{name:"x", lvalue:false, rvalue:true, count:1}, |
|
{name:"y", lvalue:false, rvalue:true, count:1}], |
|
body: "if(x!==y){return false}", |
|
localVars: [], |
|
thisVars: []}, |
|
post: {args:[], localVars:[], thisVars:[], body:"return true"}, |
|
funcName: "equals" |
|
}) |
|
|
|
|
|
|
|
},{"cwise-compiler":65}],206:[function(require,module,exports){ |
|
"use strict" |
|
|
|
var pool = require("typedarray-pool") |
|
|
|
var INSERTION_SORT_THRESHOLD = 32 |
|
|
|
function getMallocFree(dtype) { |
|
switch(dtype) { |
|
case "uint8": |
|
return [pool.mallocUint8, pool.freeUint8] |
|
case "uint16": |
|
return [pool.mallocUint16, pool.freeUint16] |
|
case "uint32": |
|
return [pool.mallocUint32, pool.freeUint32] |
|
case "int8": |
|
return [pool.mallocInt8, pool.freeInt8] |
|
case "int16": |
|
return [pool.mallocInt16, pool.freeInt16] |
|
case "int32": |
|
return [pool.mallocInt32, pool.freeInt32] |
|
case "float32": |
|
return [pool.mallocFloat, pool.freeFloat] |
|
case "float64": |
|
return [pool.mallocDouble, pool.freeDouble] |
|
default: |
|
return null |
|
} |
|
} |
|
|
|
function shapeArgs(dimension) { |
|
var args = [] |
|
for(var i=0; i<dimension; ++i) { |
|
args.push("s"+i) |
|
} |
|
for(var i=0; i<dimension; ++i) { |
|
args.push("n"+i) |
|
} |
|
for(var i=1; i<dimension; ++i) { |
|
args.push("d"+i) |
|
} |
|
for(var i=1; i<dimension; ++i) { |
|
args.push("e"+i) |
|
} |
|
for(var i=1; i<dimension; ++i) { |
|
args.push("f"+i) |
|
} |
|
return args |
|
} |
|
|
|
function createInsertionSort(order, dtype) { |
|
|
|
var code = ["'use strict'"] |
|
var funcName = ["ndarrayInsertionSort", order.join("d"), dtype].join("") |
|
var funcArgs = ["left", "right", "data", "offset" ].concat(shapeArgs(order.length)) |
|
var allocator = getMallocFree(dtype) |
|
|
|
var vars = [ "i,j,cptr,ptr=left*s0+offset" ] |
|
|
|
if(order.length > 1) { |
|
var scratch_shape = [] |
|
for(var i=1; i<order.length; ++i) { |
|
vars.push("i"+i) |
|
scratch_shape.push("n"+i) |
|
} |
|
if(allocator) { |
|
vars.push("scratch=malloc(" + scratch_shape.join("*") + ")") |
|
} else { |
|
vars.push("scratch=new Array("+scratch_shape.join("*") + ")") |
|
} |
|
vars.push("dptr","sptr","a","b") |
|
} else { |
|
vars.push("scratch") |
|
} |
|
|
|
function dataRead(ptr) { |
|
if(dtype === "generic") { |
|
return ["data.get(", ptr, ")"].join("") |
|
} |
|
return ["data[",ptr,"]"].join("") |
|
} |
|
|
|
function dataWrite(ptr, v) { |
|
if(dtype === "generic") { |
|
return ["data.set(", ptr, ",", v, ")"].join("") |
|
} |
|
return ["data[",ptr,"]=",v].join("") |
|
} |
|
|
|
//Create function header |
|
code.push( |
|
["function ", funcName, "(", funcArgs.join(","), "){var ", vars.join(",")].join(""), |
|
"for(i=left+1;i<=right;++i){", |
|
"j=i;ptr+=s0", |
|
"cptr=ptr") |
|
|
|
|
|
if(order.length > 1) { |
|
|
|
//Copy data into scratch |
|
code.push("dptr=0;sptr=ptr") |
|
for(var i=order.length-1; i>=0; --i) { |
|
var j = order[i] |
|
if(j === 0) { |
|
continue |
|
} |
|
code.push(["for(i",j,"=0;i",j,"<n",j,";++i",j,"){"].join("")) |
|
} |
|
code.push("scratch[dptr++]=",dataRead("sptr")) |
|
for(var i=0; i<order.length; ++i) { |
|
var j = order[i] |
|
if(j === 0) { |
|
continue |
|
} |
|
code.push("sptr+=d"+j,"}") |
|
} |
|
|
|
|
|
//Compare items in outer loop |
|
code.push("__g:while(j-->left){", |
|
"dptr=0", |
|
"sptr=cptr-s0") |
|
for(var i=1; i<order.length; ++i) { |
|
if(i === 1) { |
|
code.push("__l:") |
|
} |
|
code.push(["for(i",i,"=0;i",i,"<n",i,";++i",i,"){"].join("")) |
|
} |
|
code.push(["a=", dataRead("sptr"),"\nb=scratch[dptr]\nif(a<b){break __g}\nif(a>b){break __l}"].join("")) |
|
for(var i=order.length-1; i>=1; --i) { |
|
code.push( |
|
"sptr+=e"+i, |
|
"dptr+=f"+i, |
|
"}") |
|
} |
|
|
|
//Copy data back |
|
code.push("dptr=cptr;sptr=cptr-s0") |
|
for(var i=order.length-1; i>=0; --i) { |
|
var j = order[i] |
|
if(j === 0) { |
|
continue |
|
} |
|
code.push(["for(i",j,"=0;i",j,"<n",j,";++i",j,"){"].join("")) |
|
} |
|
code.push(dataWrite("dptr", dataRead("sptr"))) |
|
for(var i=0; i<order.length; ++i) { |
|
var j = order[i] |
|
if(j === 0) { |
|
continue |
|
} |
|
code.push(["dptr+=d",j,";sptr+=d",j].join(""),"}") |
|
} |
|
|
|
//Close while loop |
|
code.push("cptr-=s0\n}") |
|
|
|
//Copy scratch into cptr |
|
code.push("dptr=cptr;sptr=0") |
|
for(var i=order.length-1; i>=0; --i) { |
|
var j = order[i] |
|
if(j === 0) { |
|
continue |
|
} |
|
code.push(["for(i",j,"=0;i",j,"<n",j,";++i",j,"){"].join("")) |
|
} |
|
code.push(dataWrite("dptr", "scratch[sptr++]")) |
|
for(var i=0; i<order.length; ++i) { |
|
var j = order[i] |
|
if(j === 0) { |
|
continue |
|
} |
|
code.push("dptr+=d"+j,"}") |
|
} |
|
} else { |
|
code.push("scratch=" + dataRead("ptr"), |
|
"while((j-->left)&&("+dataRead("cptr-s0")+">scratch)){", |
|
dataWrite("cptr", dataRead("cptr-s0")), |
|
"cptr-=s0", |
|
"}", |
|
dataWrite("cptr", "scratch")) |
|
} |
|
|
|
//Close outer loop body |
|
code.push("}") |
|
if(order.length > 1 && allocator) { |
|
code.push("free(scratch)") |
|
} |
|
code.push("} return " + funcName) |
|
|
|
//Compile and link function |
|
if(allocator) { |
|
var result = new Function("malloc", "free", code.join("\n")) |
|
return result(allocator[0], allocator[1]) |
|
} else { |
|
var result = new Function(code.join("\n")) |
|
return result() |
|
} |
|
} |
|
|
|
function createQuickSort(order, dtype, insertionSort) { |
|
var code = [ "'use strict'" ] |
|
var funcName = ["ndarrayQuickSort", order.join("d"), dtype].join("") |
|
var funcArgs = ["left", "right", "data", "offset" ].concat(shapeArgs(order.length)) |
|
var allocator = getMallocFree(dtype) |
|
var labelCounter=0 |
|
|
|
code.push(["function ", funcName, "(", funcArgs.join(","), "){"].join("")) |
|
|
|
var vars = [ |
|
"sixth=((right-left+1)/6)|0", |
|
"index1=left+sixth", |
|
"index5=right-sixth", |
|
"index3=(left+right)>>1", |
|
"index2=index3-sixth", |
|
"index4=index3+sixth", |
|
"el1=index1", |
|
"el2=index2", |
|
"el3=index3", |
|
"el4=index4", |
|
"el5=index5", |
|
"less=left+1", |
|
"great=right-1", |
|
"pivots_are_equal=true", |
|
"tmp", |
|
"tmp0", |
|
"x", |
|
"y", |
|
"z", |
|
"k", |
|
"ptr0", |
|
"ptr1", |
|
"ptr2", |
|
"comp_pivot1=0", |
|
"comp_pivot2=0", |
|
"comp=0" |
|
] |
|
|
|
if(order.length > 1) { |
|
var ele_size = [] |
|
for(var i=1; i<order.length; ++i) { |
|
ele_size.push("n"+i) |
|
vars.push("i"+i) |
|
} |
|
for(var i=0; i<8; ++i) { |
|
vars.push("b_ptr"+i) |
|
} |
|
vars.push( |
|
"ptr3", |
|
"ptr4", |
|
"ptr5", |
|
"ptr6", |
|
"ptr7", |
|
"pivot_ptr", |
|
"ptr_shift", |
|
"elementSize="+ele_size.join("*")) |
|
if(allocator) { |
|
vars.push("pivot1=malloc(elementSize)", |
|
"pivot2=malloc(elementSize)") |
|
} else { |
|
vars.push("pivot1=new Array(elementSize),pivot2=new Array(elementSize)") |
|
} |
|
} else { |
|
vars.push("pivot1", "pivot2") |
|
} |
|
|
|
//Initialize local variables |
|
code.push("var " + vars.join(",")) |
|
|
|
function toPointer(v) { |
|
return ["(offset+",v,"*s0)"].join("") |
|
} |
|
|
|
function dataRead(ptr) { |
|
if(dtype === "generic") { |
|
return ["data.get(", ptr, ")"].join("") |
|
} |
|
return ["data[",ptr,"]"].join("") |
|
} |
|
|
|
function dataWrite(ptr, v) { |
|
if(dtype === "generic") { |
|
return ["data.set(", ptr, ",", v, ")"].join("") |
|
} |
|
return ["data[",ptr,"]=",v].join("") |
|
} |
|
|
|
function cacheLoop(ptrs, usePivot, body) { |
|
if(ptrs.length === 1) { |
|
code.push("ptr0="+toPointer(ptrs[0])) |
|
} else { |
|
for(var i=0; i<ptrs.length; ++i) { |
|
code.push(["b_ptr",i,"=s0*",ptrs[i]].join("")) |
|
} |
|
} |
|
if(usePivot) { |
|
code.push("pivot_ptr=0") |
|
} |
|
code.push("ptr_shift=offset") |
|
for(var i=order.length-1; i>=0; --i) { |
|
var j = order[i] |
|
if(j === 0) { |
|
continue |
|
} |
|
code.push(["for(i",j,"=0;i",j,"<n",j,";++i",j,"){"].join("")) |
|
} |
|
if(ptrs.length > 1) { |
|
for(var i=0; i<ptrs.length; ++i) { |
|
code.push(["ptr",i,"=b_ptr",i,"+ptr_shift"].join("")) |
|
} |
|
} |
|
code.push(body) |
|
if(usePivot) { |
|
code.push("++pivot_ptr") |
|
} |
|
for(var i=0; i<order.length; ++i) { |
|
var j = order[i] |
|
if(j === 0) { |
|
continue |
|
} |
|
if(ptrs.length>1) { |
|
code.push("ptr_shift+=d"+j) |
|
} else { |
|
code.push("ptr0+=d"+j) |
|
} |
|
code.push("}") |
|
} |
|
} |
|
|
|
function lexicoLoop(label, ptrs, usePivot, body) { |
|
if(ptrs.length === 1) { |
|
code.push("ptr0="+toPointer(ptrs[0])) |
|
} else { |
|
for(var i=0; i<ptrs.length; ++i) { |
|
code.push(["b_ptr",i,"=s0*",ptrs[i]].join("")) |
|
} |
|
code.push("ptr_shift=offset") |
|
} |
|
if(usePivot) { |
|
code.push("pivot_ptr=0") |
|
} |
|
if(label) { |
|
code.push(label+":") |
|
} |
|
for(var i=1; i<order.length; ++i) { |
|
code.push(["for(i",i,"=0;i",i,"<n",i,";++i",i,"){"].join("")) |
|
} |
|
if(ptrs.length > 1) { |
|
for(var i=0; i<ptrs.length; ++i) { |
|
code.push(["ptr",i,"=b_ptr",i,"+ptr_shift"].join("")) |
|
} |
|
} |
|
code.push(body) |
|
for(var i=order.length-1; i>=1; --i) { |
|
if(usePivot) { |
|
code.push("pivot_ptr+=f"+i) |
|
} |
|
if(ptrs.length > 1) { |
|
code.push("ptr_shift+=e"+i) |
|
} else { |
|
code.push("ptr0+=e"+i) |
|
} |
|
code.push("}") |
|
} |
|
} |
|
|
|
function cleanUp() { |
|
if(order.length > 1 && allocator) { |
|
code.push("free(pivot1)", "free(pivot2)") |
|
} |
|
} |
|
|
|
function compareSwap(a_id, b_id) { |
|
var a = "el"+a_id |
|
var b = "el"+b_id |
|
if(order.length > 1) { |
|
var lbl = "__l" + (++labelCounter) |
|
lexicoLoop(lbl, [a, b], false, [ |
|
"comp=",dataRead("ptr0"),"-",dataRead("ptr1"),"\n", |
|
"if(comp>0){tmp0=", a, ";",a,"=",b,";", b,"=tmp0;break ", lbl,"}\n", |
|
"if(comp<0){break ", lbl, "}" |
|
].join("")) |
|
} else { |
|
code.push(["if(", dataRead(toPointer(a)), ">", dataRead(toPointer(b)), "){tmp0=", a, ";",a,"=",b,";", b,"=tmp0}"].join("")) |
|
} |
|
} |
|
|
|
compareSwap(1, 2) |
|
compareSwap(4, 5) |
|
compareSwap(1, 3) |
|
compareSwap(2, 3) |
|
compareSwap(1, 4) |
|
compareSwap(3, 4) |
|
compareSwap(2, 5) |
|
compareSwap(2, 3) |
|
compareSwap(4, 5) |
|
|
|
if(order.length > 1) { |
|
cacheLoop(["el1", "el2", "el3", "el4", "el5", "index1", "index3", "index5"], true, [ |
|
"pivot1[pivot_ptr]=",dataRead("ptr1"),"\n", |
|
"pivot2[pivot_ptr]=",dataRead("ptr3"),"\n", |
|
"pivots_are_equal=pivots_are_equal&&(pivot1[pivot_ptr]===pivot2[pivot_ptr])\n", |
|
"x=",dataRead("ptr0"),"\n", |
|
"y=",dataRead("ptr2"),"\n", |
|
"z=",dataRead("ptr4"),"\n", |
|
dataWrite("ptr5", "x"),"\n", |
|
dataWrite("ptr6", "y"),"\n", |
|
dataWrite("ptr7", "z") |
|
].join("")) |
|
} else { |
|
code.push([ |
|
"pivot1=", dataRead(toPointer("el2")), "\n", |
|
"pivot2=", dataRead(toPointer("el4")), "\n", |
|
"pivots_are_equal=pivot1===pivot2\n", |
|
"x=", dataRead(toPointer("el1")), "\n", |
|
"y=", dataRead(toPointer("el3")), "\n", |
|
"z=", dataRead(toPointer("el5")), "\n", |
|
dataWrite(toPointer("index1"), "x"), "\n", |
|
dataWrite(toPointer("index3"), "y"), "\n", |
|
dataWrite(toPointer("index5"), "z") |
|
].join("")) |
|
} |
|
|
|
|
|
function moveElement(dst, src) { |
|
if(order.length > 1) { |
|
cacheLoop([dst, src], false, |
|
dataWrite("ptr0", dataRead("ptr1")) |
|
) |
|
} else { |
|
code.push(dataWrite(toPointer(dst), dataRead(toPointer(src)))) |
|
} |
|
} |
|
|
|
moveElement("index2", "left") |
|
moveElement("index4", "right") |
|
|
|
function comparePivot(result, ptr, n) { |
|
if(order.length > 1) { |
|
var lbl = "__l" + (++labelCounter) |
|
lexicoLoop(lbl, [ptr], true, [ |
|
result,"=",dataRead("ptr0"),"-pivot",n,"[pivot_ptr]\n", |
|
"if(",result,"!==0){break ", lbl, "}" |
|
].join("")) |
|
} else { |
|
code.push([result,"=", dataRead(toPointer(ptr)), "-pivot", n].join("")) |
|
} |
|
} |
|
|
|
function swapElements(a, b) { |
|
if(order.length > 1) { |
|
cacheLoop([a,b],false,[ |
|
"tmp=",dataRead("ptr0"),"\n", |
|
dataWrite("ptr0", dataRead("ptr1")),"\n", |
|
dataWrite("ptr1", "tmp") |
|
].join("")) |
|
} else { |
|
code.push([ |
|
"ptr0=",toPointer(a),"\n", |
|
"ptr1=",toPointer(b),"\n", |
|
"tmp=",dataRead("ptr0"),"\n", |
|
dataWrite("ptr0", dataRead("ptr1")),"\n", |
|
dataWrite("ptr1", "tmp") |
|
].join("")) |
|
} |
|
} |
|
|
|
function tripleSwap(k, less, great) { |
|
if(order.length > 1) { |
|
cacheLoop([k,less,great], false, [ |
|
"tmp=",dataRead("ptr0"),"\n", |
|
dataWrite("ptr0", dataRead("ptr1")),"\n", |
|
dataWrite("ptr1", dataRead("ptr2")),"\n", |
|
dataWrite("ptr2", "tmp") |
|
].join("")) |
|
code.push("++"+less, "--"+great) |
|
} else { |
|
code.push([ |
|
"ptr0=",toPointer(k),"\n", |
|
"ptr1=",toPointer(less),"\n", |
|
"ptr2=",toPointer(great),"\n", |
|
"++",less,"\n", |
|
"--",great,"\n", |
|
"tmp=", dataRead("ptr0"), "\n", |
|
dataWrite("ptr0", dataRead("ptr1")), "\n", |
|
dataWrite("ptr1", dataRead("ptr2")), "\n", |
|
dataWrite("ptr2", "tmp") |
|
].join("")) |
|
} |
|
} |
|
|
|
function swapAndDecrement(k, great) { |
|
swapElements(k, great) |
|
code.push("--"+great) |
|
} |
|
|
|
code.push("if(pivots_are_equal){") |
|
//Pivots are equal case |
|
code.push("for(k=less;k<=great;++k){") |
|
comparePivot("comp", "k", 1) |
|
code.push("if(comp===0){continue}") |
|
code.push("if(comp<0){") |
|
code.push("if(k!==less){") |
|
swapElements("k", "less") |
|
code.push("}") |
|
code.push("++less") |
|
code.push("}else{") |
|
code.push("while(true){") |
|
comparePivot("comp", "great", 1) |
|
code.push("if(comp>0){") |
|
code.push("great--") |
|
code.push("}else if(comp<0){") |
|
tripleSwap("k", "less", "great") |
|
code.push("break") |
|
code.push("}else{") |
|
swapAndDecrement("k", "great") |
|
code.push("break") |
|
code.push("}") |
|
code.push("}") |
|
code.push("}") |
|
code.push("}") |
|
code.push("}else{") |
|
//Pivots not equal case |
|
code.push("for(k=less;k<=great;++k){") |
|
comparePivot("comp_pivot1", "k", 1) |
|
code.push("if(comp_pivot1<0){") |
|
code.push("if(k!==less){") |
|
swapElements("k", "less") |
|
code.push("}") |
|
code.push("++less") |
|
code.push("}else{") |
|
comparePivot("comp_pivot2", "k", 2) |
|
code.push("if(comp_pivot2>0){") |
|
code.push("while(true){") |
|
comparePivot("comp", "great", 2) |
|
code.push("if(comp>0){") |
|
code.push("if(--great<k){break}") |
|
code.push("continue") |
|
code.push("}else{") |
|
comparePivot("comp", "great", 1) |
|
code.push("if(comp<0){") |
|
tripleSwap("k", "less", "great") |
|
code.push("}else{") |
|
swapAndDecrement("k", "great") |
|
code.push("}") |
|
code.push("break") |
|
code.push("}") |
|
code.push("}") |
|
code.push("}") |
|
code.push("}") |
|
code.push("}") |
|
code.push("}") |
|
|
|
//Move pivots to correct place |
|
function storePivot(mem_dest, pivot_dest, pivot) { |
|
if(order.length>1) { |
|
cacheLoop([mem_dest, pivot_dest], true, [ |
|
dataWrite("ptr0", dataRead("ptr1")), "\n", |
|
dataWrite("ptr1", ["pivot",pivot,"[pivot_ptr]"].join("")) |
|
].join("")) |
|
} else { |
|
code.push( |
|
dataWrite(toPointer(mem_dest), dataRead(toPointer(pivot_dest))), |
|
dataWrite(toPointer(pivot_dest), "pivot"+pivot)) |
|
} |
|
} |
|
|
|
storePivot("left", "(less-1)", 1) |
|
storePivot("right", "(great+1)", 2) |
|
|
|
//Recursive sort call |
|
function doSort(left, right) { |
|
code.push([ |
|
"if((",right,"-",left,")<=",INSERTION_SORT_THRESHOLD,"){\n", |
|
"insertionSort(", left, ",", right, ",data,offset,", shapeArgs(order.length).join(","), ")\n", |
|
"}else{\n", |
|
funcName, "(", left, ",", right, ",data,offset,", shapeArgs(order.length).join(","), ")\n", |
|
"}" |
|
].join("")) |
|
} |
|
doSort("left", "(less-2)") |
|
doSort("(great+2)", "right") |
|
|
|
//If pivots are equal, then early out |
|
code.push("if(pivots_are_equal){") |
|
cleanUp() |
|
code.push("return") |
|
code.push("}") |
|
|
|
function walkPointer(ptr, pivot, body) { |
|
if(order.length > 1) { |
|
code.push(["__l",++labelCounter,":while(true){"].join("")) |
|
cacheLoop([ptr], true, [ |
|
"if(", dataRead("ptr0"), "!==pivot", pivot, "[pivot_ptr]){break __l", labelCounter, "}" |
|
].join("")) |
|
code.push(body, "}") |
|
} else { |
|
code.push(["while(", dataRead(toPointer(ptr)), "===pivot", pivot, "){", body, "}"].join("")) |
|
} |
|
} |
|
|
|
//Check bounds |
|
code.push("if(less<index1&&great>index5){") |
|
|
|
walkPointer("less", 1, "++less") |
|
walkPointer("great", 2, "--great") |
|
|
|
code.push("for(k=less;k<=great;++k){") |
|
comparePivot("comp_pivot1", "k", 1) |
|
code.push("if(comp_pivot1===0){") |
|
code.push("if(k!==less){") |
|
swapElements("k", "less") |
|
code.push("}") |
|
code.push("++less") |
|
code.push("}else{") |
|
comparePivot("comp_pivot2", "k", 2) |
|
code.push("if(comp_pivot2===0){") |
|
code.push("while(true){") |
|
comparePivot("comp", "great", 2) |
|
code.push("if(comp===0){") |
|
code.push("if(--great<k){break}") |
|
code.push("continue") |
|
code.push("}else{") |
|
comparePivot("comp", "great", 1) |
|
code.push("if(comp<0){") |
|
tripleSwap("k", "less", "great") |
|
code.push("}else{") |
|
swapAndDecrement("k", "great") |
|
code.push("}") |
|
code.push("break") |
|
code.push("}") |
|
code.push("}") |
|
code.push("}") |
|
code.push("}") |
|
code.push("}") |
|
code.push("}") |
|
|
|
//Clean up and do a final sorting pass |
|
cleanUp() |
|
doSort("less", "great") |
|
|
|
//Close off main loop |
|
code.push("}return " + funcName) |
|
|
|
//Compile and link |
|
if(order.length > 1 && allocator) { |
|
var compiled = new Function("insertionSort", "malloc", "free", code.join("\n")) |
|
return compiled(insertionSort, allocator[0], allocator[1]) |
|
} |
|
var compiled = new Function("insertionSort", code.join("\n")) |
|
return compiled(insertionSort) |
|
} |
|
|
|
function compileSort(order, dtype) { |
|
var code = ["'use strict'"] |
|
var funcName = ["ndarraySortWrapper", order.join("d"), dtype].join("") |
|
var funcArgs = [ "array" ] |
|
|
|
code.push(["function ", funcName, "(", funcArgs.join(","), "){"].join("")) |
|
|
|
//Unpack local variables from array |
|
var vars = ["data=array.data,offset=array.offset|0,shape=array.shape,stride=array.stride"] |
|
for(var i=0; i<order.length; ++i) { |
|
vars.push(["s",i,"=stride[",i,"]|0,n",i,"=shape[",i,"]|0"].join("")) |
|
} |
|
|
|
var scratch_stride = new Array(order.length) |
|
var nprod = [] |
|
for(var i=0; i<order.length; ++i) { |
|
var k = order[i] |
|
if(k === 0) { |
|
continue |
|
} |
|
if(nprod.length === 0) { |
|
scratch_stride[k] = "1" |
|
} else { |
|
scratch_stride[k] = nprod.join("*") |
|
} |
|
nprod.push("n"+k) |
|
} |
|
|
|
var p = -1, q = -1 |
|
for(var i=0; i<order.length; ++i) { |
|
var j = order[i] |
|
if(j !== 0) { |
|
if(p > 0) { |
|
vars.push(["d",j,"=s",j,"-d",p,"*n",p].join("")) |
|
} else { |
|
vars.push(["d",j,"=s",j].join("")) |
|
} |
|
p = j |
|
} |
|
var k = order.length-1-i |
|
if(k !== 0) { |
|
if(q > 0) { |
|
vars.push(["e",k,"=s",k,"-e",q,"*n",q, |
|
",f",k,"=",scratch_stride[k],"-f",q,"*n",q].join("")) |
|
} else { |
|
vars.push(["e",k,"=s",k,",f",k,"=",scratch_stride[k]].join("")) |
|
} |
|
q = k |
|
} |
|
} |
|
|
|
//Declare local variables |
|
code.push("var " + vars.join(",")) |
|
|
|
//Create arguments for subroutine |
|
var sortArgs = ["0", "n0-1", "data", "offset"].concat(shapeArgs(order.length)) |
|
|
|
//Call main sorting routine |
|
code.push([ |
|
"if(n0<=",INSERTION_SORT_THRESHOLD,"){", |
|
"insertionSort(", sortArgs.join(","), ")}else{", |
|
"quickSort(", sortArgs.join(","), |
|
")}" |
|
].join("")) |
|
|
|
//Return |
|
code.push("}return " + funcName) |
|
|
|
//Link everything together |
|
var result = new Function("insertionSort", "quickSort", code.join("\n")) |
|
var insertionSort = createInsertionSort(order, dtype) |
|
var quickSort = createQuickSort(order, dtype, insertionSort) |
|
return result(insertionSort, quickSort) |
|
} |
|
|
|
module.exports = compileSort |
|
},{"typedarray-pool":257}],207:[function(require,module,exports){ |
|
"use strict" |
|
|
|
var compile = require("./lib/compile_sort.js") |
|
var CACHE = {} |
|
|
|
function sort(array) { |
|
var order = array.order |
|
var dtype = array.dtype |
|
var typeSig = [order, dtype ] |
|
var typeName = typeSig.join(":") |
|
var compiled = CACHE[typeName] |
|
if(!compiled) { |
|
CACHE[typeName] = compiled = compile(order, dtype) |
|
} |
|
compiled(array) |
|
return array |
|
} |
|
|
|
module.exports = sort |
|
},{"./lib/compile_sort.js":206}],208:[function(require,module,exports){ |
|
var iota = require("iota-array") |
|
var isBuffer = require("is-buffer") |
|
|
|
var hasTypedArrays = ((typeof Float64Array) !== "undefined") |
|
|
|
function compare1st(a, b) { |
|
return a[0] - b[0] |
|
} |
|
|
|
function order() { |
|
var stride = this.stride |
|
var terms = new Array(stride.length) |
|
var i |
|
for(i=0; i<terms.length; ++i) { |
|
terms[i] = [Math.abs(stride[i]), i] |
|
} |
|
terms.sort(compare1st) |
|
var result = new Array(terms.length) |
|
for(i=0; i<result.length; ++i) { |
|
result[i] = terms[i][1] |
|
} |
|
return result |
|
} |
|
|
|
function compileConstructor(dtype, dimension) { |
|
var className = ["View", dimension, "d", dtype].join("") |
|
if(dimension < 0) { |
|
className = "View_Nil" + dtype |
|
} |
|
var useGetters = (dtype === "generic") |
|
|
|
if(dimension === -1) { |
|
//Special case for trivial arrays |
|
var code = |
|
"function "+className+"(a){this.data=a;};\ |
|
var proto="+className+".prototype;\ |
|
proto.dtype='"+dtype+"';\ |
|
proto.index=function(){return -1};\ |
|
proto.size=0;\ |
|
proto.dimension=-1;\ |
|
proto.shape=proto.stride=proto.order=[];\ |
|
proto.lo=proto.hi=proto.transpose=proto.step=\ |
|
function(){return new "+className+"(this.data);};\ |
|
proto.get=proto.set=function(){};\ |
|
proto.pick=function(){return null};\ |
|
return function construct_"+className+"(a){return new "+className+"(a);}" |
|
var procedure = new Function(code) |
|
return procedure() |
|
} else if(dimension === 0) { |
|
//Special case for 0d arrays |
|
var code = |
|
"function "+className+"(a,d) {\ |
|
this.data = a;\ |
|
this.offset = d\ |
|
};\ |
|
var proto="+className+".prototype;\ |
|
proto.dtype='"+dtype+"';\ |
|
proto.index=function(){return this.offset};\ |
|
proto.dimension=0;\ |
|
proto.size=1;\ |
|
proto.shape=\ |
|
proto.stride=\ |
|
proto.order=[];\ |
|
proto.lo=\ |
|
proto.hi=\ |
|
proto.transpose=\ |
|
proto.step=function "+className+"_copy() {\ |
|
return new "+className+"(this.data,this.offset)\ |
|
};\ |
|
proto.pick=function "+className+"_pick(){\ |
|
return TrivialArray(this.data);\ |
|
};\ |
|
proto.valueOf=proto.get=function "+className+"_get(){\ |
|
return "+(useGetters ? "this.data.get(this.offset)" : "this.data[this.offset]")+ |
|
"};\ |
|
proto.set=function "+className+"_set(v){\ |
|
return "+(useGetters ? "this.data.set(this.offset,v)" : "this.data[this.offset]=v")+"\ |
|
};\ |
|
return function construct_"+className+"(a,b,c,d){return new "+className+"(a,d)}" |
|
var procedure = new Function("TrivialArray", code) |
|
return procedure(CACHED_CONSTRUCTORS[dtype][0]) |
|
} |
|
|
|
var code = ["'use strict'"] |
|
|
|
//Create constructor for view |
|
var indices = iota(dimension) |
|
var args = indices.map(function(i) { return "i"+i }) |
|
var index_str = "this.offset+" + indices.map(function(i) { |
|
return "this.stride[" + i + "]*i" + i |
|
}).join("+") |
|
var shapeArg = indices.map(function(i) { |
|
return "b"+i |
|
}).join(",") |
|
var strideArg = indices.map(function(i) { |
|
return "c"+i |
|
}).join(",") |
|
code.push( |
|
"function "+className+"(a," + shapeArg + "," + strideArg + ",d){this.data=a", |
|
"this.shape=[" + shapeArg + "]", |
|
"this.stride=[" + strideArg + "]", |
|
"this.offset=d|0}", |
|
"var proto="+className+".prototype", |
|
"proto.dtype='"+dtype+"'", |
|
"proto.dimension="+dimension) |
|
|
|
//view.size: |
|
code.push("Object.defineProperty(proto,'size',{get:function "+className+"_size(){\ |
|
return "+indices.map(function(i) { return "this.shape["+i+"]" }).join("*"), |
|
"}})") |
|
|
|
//view.order: |
|
if(dimension === 1) { |
|
code.push("proto.order=[0]") |
|
} else { |
|
code.push("Object.defineProperty(proto,'order',{get:") |
|
if(dimension < 4) { |
|
code.push("function "+className+"_order(){") |
|
if(dimension === 2) { |
|
code.push("return (Math.abs(this.stride[0])>Math.abs(this.stride[1]))?[1,0]:[0,1]}})") |
|
} else if(dimension === 3) { |
|
code.push( |
|
"var s0=Math.abs(this.stride[0]),s1=Math.abs(this.stride[1]),s2=Math.abs(this.stride[2]);\ |
|
if(s0>s1){\ |
|
if(s1>s2){\ |
|
return [2,1,0];\ |
|
}else if(s0>s2){\ |
|
return [1,2,0];\ |
|
}else{\ |
|
return [1,0,2];\ |
|
}\ |
|
}else if(s0>s2){\ |
|
return [2,0,1];\ |
|
}else if(s2>s1){\ |
|
return [0,1,2];\ |
|
}else{\ |
|
return [0,2,1];\ |
|
}}})") |
|
} |
|
} else { |
|
code.push("ORDER})") |
|
} |
|
} |
|
|
|
//view.set(i0, ..., v): |
|
code.push( |
|
"proto.set=function "+className+"_set("+args.join(",")+",v){") |
|
if(useGetters) { |
|
code.push("return this.data.set("+index_str+",v)}") |
|
} else { |
|
code.push("return this.data["+index_str+"]=v}") |
|
} |
|
|
|
//view.get(i0, ...): |
|
code.push("proto.get=function "+className+"_get("+args.join(",")+"){") |
|
if(useGetters) { |
|
code.push("return this.data.get("+index_str+")}") |
|
} else { |
|
code.push("return this.data["+index_str+"]}") |
|
} |
|
|
|
//view.index: |
|
code.push( |
|
"proto.index=function "+className+"_index(", args.join(), "){return "+index_str+"}") |
|
|
|
//view.hi(): |
|
code.push("proto.hi=function "+className+"_hi("+args.join(",")+"){return new "+className+"(this.data,"+ |
|
indices.map(function(i) { |
|
return ["(typeof i",i,"!=='number'||i",i,"<0)?this.shape[", i, "]:i", i,"|0"].join("") |
|
}).join(",")+","+ |
|
indices.map(function(i) { |
|
return "this.stride["+i + "]" |
|
}).join(",")+",this.offset)}") |
|
|
|
//view.lo(): |
|
var a_vars = indices.map(function(i) { return "a"+i+"=this.shape["+i+"]" }) |
|
var c_vars = indices.map(function(i) { return "c"+i+"=this.stride["+i+"]" }) |
|
code.push("proto.lo=function "+className+"_lo("+args.join(",")+"){var b=this.offset,d=0,"+a_vars.join(",")+","+c_vars.join(",")) |
|
for(var i=0; i<dimension; ++i) { |
|
code.push( |
|
"if(typeof i"+i+"==='number'&&i"+i+">=0){\ |
|
d=i"+i+"|0;\ |
|
b+=c"+i+"*d;\ |
|
a"+i+"-=d}") |
|
} |
|
code.push("return new "+className+"(this.data,"+ |
|
indices.map(function(i) { |
|
return "a"+i |
|
}).join(",")+","+ |
|
indices.map(function(i) { |
|
return "c"+i |
|
}).join(",")+",b)}") |
|
|
|
//view.step(): |
|
code.push("proto.step=function "+className+"_step("+args.join(",")+"){var "+ |
|
indices.map(function(i) { |
|
return "a"+i+"=this.shape["+i+"]" |
|
}).join(",")+","+ |
|
indices.map(function(i) { |
|
return "b"+i+"=this.stride["+i+"]" |
|
}).join(",")+",c=this.offset,d=0,ceil=Math.ceil") |
|
for(var i=0; i<dimension; ++i) { |
|
code.push( |
|
"if(typeof i"+i+"==='number'){\ |
|
d=i"+i+"|0;\ |
|
if(d<0){\ |
|
c+=b"+i+"*(a"+i+"-1);\ |
|
a"+i+"=ceil(-a"+i+"/d)\ |
|
}else{\ |
|
a"+i+"=ceil(a"+i+"/d)\ |
|
}\ |
|
b"+i+"*=d\ |
|
}") |
|
} |
|
code.push("return new "+className+"(this.data,"+ |
|
indices.map(function(i) { |
|
return "a" + i |
|
}).join(",")+","+ |
|
indices.map(function(i) { |
|
return "b" + i |
|
}).join(",")+",c)}") |
|
|
|
//view.transpose(): |
|
var tShape = new Array(dimension) |
|
var tStride = new Array(dimension) |
|
for(var i=0; i<dimension; ++i) { |
|
tShape[i] = "a[i"+i+"]" |
|
tStride[i] = "b[i"+i+"]" |
|
} |
|
code.push("proto.transpose=function "+className+"_transpose("+args+"){"+ |
|
args.map(function(n,idx) { return n + "=(" + n + "===undefined?" + idx + ":" + n + "|0)"}).join(";"), |
|
"var a=this.shape,b=this.stride;return new "+className+"(this.data,"+tShape.join(",")+","+tStride.join(",")+",this.offset)}") |
|
|
|
//view.pick(): |
|
code.push("proto.pick=function "+className+"_pick("+args+"){var a=[],b=[],c=this.offset") |
|
for(var i=0; i<dimension; ++i) { |
|
code.push("if(typeof i"+i+"==='number'&&i"+i+">=0){c=(c+this.stride["+i+"]*i"+i+")|0}else{a.push(this.shape["+i+"]);b.push(this.stride["+i+"])}") |
|
} |
|
code.push("var ctor=CTOR_LIST[a.length+1];return ctor(this.data,a,b,c)}") |
|
|
|
//Add return statement |
|
code.push("return function construct_"+className+"(data,shape,stride,offset){return new "+className+"(data,"+ |
|
indices.map(function(i) { |
|
return "shape["+i+"]" |
|
}).join(",")+","+ |
|
indices.map(function(i) { |
|
return "stride["+i+"]" |
|
}).join(",")+",offset)}") |
|
|
|
//Compile procedure |
|
var procedure = new Function("CTOR_LIST", "ORDER", code.join("\n")) |
|
return procedure(CACHED_CONSTRUCTORS[dtype], order) |
|
} |
|
|
|
function arrayDType(data) { |
|
if(isBuffer(data)) { |
|
return "buffer" |
|
} |
|
if(hasTypedArrays) { |
|
switch(Object.prototype.toString.call(data)) { |
|
case "[object Float64Array]": |
|
return "float64" |
|
case "[object Float32Array]": |
|
return "float32" |
|
case "[object Int8Array]": |
|
return "int8" |
|
case "[object Int16Array]": |
|
return "int16" |
|
case "[object Int32Array]": |
|
return "int32" |
|
case "[object Uint8Array]": |
|
return "uint8" |
|
case "[object Uint16Array]": |
|
return "uint16" |
|
case "[object Uint32Array]": |
|
return "uint32" |
|
case "[object Uint8ClampedArray]": |
|
return "uint8_clamped" |
|
} |
|
} |
|
if(Array.isArray(data)) { |
|
return "array" |
|
} |
|
return "generic" |
|
} |
|
|
|
var CACHED_CONSTRUCTORS = { |
|
"float32":[], |
|
"float64":[], |
|
"int8":[], |
|
"int16":[], |
|
"int32":[], |
|
"uint8":[], |
|
"uint16":[], |
|
"uint32":[], |
|
"array":[], |
|
"uint8_clamped":[], |
|
"buffer":[], |
|
"generic":[] |
|
} |
|
|
|
;(function() { |
|
for(var id in CACHED_CONSTRUCTORS) { |
|
CACHED_CONSTRUCTORS[id].push(compileConstructor(id, -1)) |
|
} |
|
}); |
|
|
|
function wrappedNDArrayCtor(data, shape, stride, offset) { |
|
if(data === undefined) { |
|
var ctor = CACHED_CONSTRUCTORS.array[0] |
|
return ctor([]) |
|
} else if(typeof data === "number") { |
|
data = [data] |
|
} |
|
if(shape === undefined) { |
|
shape = [ data.length ] |
|
} |
|
var d = shape.length |
|
if(stride === undefined) { |
|
stride = new Array(d) |
|
for(var i=d-1, sz=1; i>=0; --i) { |
|
stride[i] = sz |
|
sz *= shape[i] |
|
} |
|
} |
|
if(offset === undefined) { |
|
offset = 0 |
|
for(var i=0; i<d; ++i) { |
|
if(stride[i] < 0) { |
|
offset -= (shape[i]-1)*stride[i] |
|
} |
|
} |
|
} |
|
var dtype = arrayDType(data) |
|
var ctor_list = CACHED_CONSTRUCTORS[dtype] |
|
while(ctor_list.length <= d+1) { |
|
ctor_list.push(compileConstructor(dtype, ctor_list.length-1)) |
|
} |
|
var ctor = ctor_list[d+1] |
|
return ctor(data, shape, stride, offset) |
|
} |
|
|
|
module.exports = wrappedNDArrayCtor |
|
|
|
},{"iota-array":191,"is-buffer":192}],209:[function(require,module,exports){ |
|
"use strict" |
|
|
|
var doubleBits = require("double-bits") |
|
|
|
var SMALLEST_DENORM = Math.pow(2, -1074) |
|
var UINT_MAX = (-1)>>>0 |
|
|
|
module.exports = nextafter |
|
|
|
function nextafter(x, y) { |
|
if(isNaN(x) || isNaN(y)) { |
|
return NaN |
|
} |
|
if(x === y) { |
|
return x |
|
} |
|
if(x === 0) { |
|
if(y < 0) { |
|
return -SMALLEST_DENORM |
|
} else { |
|
return SMALLEST_DENORM |
|
} |
|
} |
|
var hi = doubleBits.hi(x) |
|
var lo = doubleBits.lo(x) |
|
if((y > x) === (x > 0)) { |
|
if(lo === UINT_MAX) { |
|
hi += 1 |
|
lo = 0 |
|
} else { |
|
lo += 1 |
|
} |
|
} else { |
|
if(lo === 0) { |
|
lo = UINT_MAX |
|
hi -= 1 |
|
} else { |
|
lo -= 1 |
|
} |
|
} |
|
return doubleBits.pack(lo, hi) |
|
} |
|
},{"double-bits":69}],210:[function(require,module,exports){ |
|
var DEFAULT_NORMALS_EPSILON = 1e-6; |
|
var DEFAULT_FACE_EPSILON = 1e-6; |
|
|
|
//Estimate the vertex normals of a mesh |
|
exports.vertexNormals = function(faces, positions, specifiedEpsilon) { |
|
|
|
var N = positions.length; |
|
var normals = new Array(N); |
|
var epsilon = specifiedEpsilon === void(0) ? DEFAULT_NORMALS_EPSILON : specifiedEpsilon; |
|
|
|
//Initialize normal array |
|
for(var i=0; i<N; ++i) { |
|
normals[i] = [0.0, 0.0, 0.0]; |
|
} |
|
|
|
//Walk over all the faces and add per-vertex contribution to normal weights |
|
for(var i=0; i<faces.length; ++i) { |
|
var f = faces[i]; |
|
var p = 0; |
|
var c = f[f.length-1]; |
|
var n = f[0]; |
|
for(var j=0; j<f.length; ++j) { |
|
|
|
//Shift indices back |
|
p = c; |
|
c = n; |
|
n = f[(j+1) % f.length]; |
|
|
|
var v0 = positions[p]; |
|
var v1 = positions[c]; |
|
var v2 = positions[n]; |
|
|
|
//Compute infineteismal arcs |
|
var d01 = new Array(3); |
|
var m01 = 0.0; |
|
var d21 = new Array(3); |
|
var m21 = 0.0; |
|
for(var k=0; k<3; ++k) { |
|
d01[k] = v0[k] - v1[k]; |
|
m01 += d01[k] * d01[k]; |
|
d21[k] = v2[k] - v1[k]; |
|
m21 += d21[k] * d21[k]; |
|
} |
|
|
|
//Accumulate values in normal |
|
if(m01 * m21 > epsilon) { |
|
var norm = normals[c]; |
|
var w = 1.0 / Math.sqrt(m01 * m21); |
|
for(var k=0; k<3; ++k) { |
|
var u = (k+1)%3; |
|
var v = (k+2)%3; |
|
norm[k] += w * (d21[u] * d01[v] - d21[v] * d01[u]); |
|
} |
|
} |
|
} |
|
} |
|
|
|
//Scale all normals to unit length |
|
for(var i=0; i<N; ++i) { |
|
var norm = normals[i]; |
|
var m = 0.0; |
|
for(var k=0; k<3; ++k) { |
|
m += norm[k] * norm[k]; |
|
} |
|
if(m > epsilon) { |
|
var w = 1.0 / Math.sqrt(m); |
|
for(var k=0; k<3; ++k) { |
|
norm[k] *= w; |
|
} |
|
} else { |
|
for(var k=0; k<3; ++k) { |
|
norm[k] = 0.0; |
|
} |
|
} |
|
} |
|
|
|
//Return the resulting set of patches |
|
return normals; |
|
} |
|
|
|
//Compute face normals of a mesh |
|
exports.faceNormals = function(faces, positions, specifiedEpsilon) { |
|
|
|
var N = faces.length; |
|
var normals = new Array(N); |
|
var epsilon = specifiedEpsilon === void(0) ? DEFAULT_FACE_EPSILON : specifiedEpsilon; |
|
|
|
for(var i=0; i<N; ++i) { |
|
var f = faces[i]; |
|
var pos = new Array(3); |
|
for(var j=0; j<3; ++j) { |
|
pos[j] = positions[f[j]]; |
|
} |
|
|
|
var d01 = new Array(3); |
|
var d21 = new Array(3); |
|
for(var j=0; j<3; ++j) { |
|
d01[j] = pos[1][j] - pos[0][j]; |
|
d21[j] = pos[2][j] - pos[0][j]; |
|
} |
|
|
|
var n = new Array(3); |
|
var l = 0.0; |
|
for(var j=0; j<3; ++j) { |
|
var u = (j+1)%3; |
|
var v = (j+2)%3; |
|
n[j] = d01[u] * d21[v] - d01[v] * d21[u]; |
|
l += n[j] * n[j]; |
|
} |
|
if(l > epsilon) { |
|
l = 1.0 / Math.sqrt(l); |
|
} else { |
|
l = 0.0; |
|
} |
|
for(var j=0; j<3; ++j) { |
|
n[j] *= l; |
|
} |
|
normals[i] = n; |
|
} |
|
return normals; |
|
} |
|
|
|
|
|
|
|
},{}],211:[function(require,module,exports){ |
|
'use strict' |
|
|
|
module.exports = quatFromFrame |
|
|
|
function quatFromFrame( |
|
out, |
|
rx, ry, rz, |
|
ux, uy, uz, |
|
fx, fy, fz) { |
|
var tr = rx + uy + fz |
|
if(l > 0) { |
|
var l = Math.sqrt(tr + 1.0) |
|
out[0] = 0.5 * (uz - fy) / l |
|
out[1] = 0.5 * (fx - rz) / l |
|
out[2] = 0.5 * (ry - uy) / l |
|
out[3] = 0.5 * l |
|
} else { |
|
var tf = Math.max(rx, uy, fz) |
|
var l = Math.sqrt(2 * tf - tr + 1.0) |
|
if(rx >= tf) { |
|
//x y z order |
|
out[0] = 0.5 * l |
|
out[1] = 0.5 * (ux + ry) / l |
|
out[2] = 0.5 * (fx + rz) / l |
|
out[3] = 0.5 * (uz - fy) / l |
|
} else if(uy >= tf) { |
|
//y z x order |
|
out[0] = 0.5 * (ry + ux) / l |
|
out[1] = 0.5 * l |
|
out[2] = 0.5 * (fy + uz) / l |
|
out[3] = 0.5 * (fx - rz) / l |
|
} else { |
|
//z x y order |
|
out[0] = 0.5 * (rz + fx) / l |
|
out[1] = 0.5 * (uz + fy) / l |
|
out[2] = 0.5 * l |
|
out[3] = 0.5 * (ry - ux) / l |
|
} |
|
} |
|
return out |
|
} |
|
},{}],212:[function(require,module,exports){ |
|
'use strict' |
|
|
|
module.exports = createOrbitController |
|
|
|
var filterVector = require('filtered-vector') |
|
var lookAt = require('gl-mat4/lookAt') |
|
var mat4FromQuat = require('gl-mat4/fromQuat') |
|
var invert44 = require('gl-mat4/invert') |
|
var quatFromFrame = require('./lib/quatFromFrame') |
|
|
|
function len3(x,y,z) { |
|
return Math.sqrt(Math.pow(x,2) + Math.pow(y,2) + Math.pow(z,2)) |
|
} |
|
|
|
function len4(w,x,y,z) { |
|
return Math.sqrt(Math.pow(w,2) + Math.pow(x,2) + Math.pow(y,2) + Math.pow(z,2)) |
|
} |
|
|
|
function normalize4(out, a) { |
|
var ax = a[0] |
|
var ay = a[1] |
|
var az = a[2] |
|
var aw = a[3] |
|
var al = len4(ax, ay, az, aw) |
|
if(al > 1e-6) { |
|
out[0] = ax/al |
|
out[1] = ay/al |
|
out[2] = az/al |
|
out[3] = aw/al |
|
} else { |
|
out[0] = out[1] = out[2] = 0.0 |
|
out[3] = 1.0 |
|
} |
|
} |
|
|
|
function OrbitCameraController(initQuat, initCenter, initRadius) { |
|
this.radius = filterVector([initRadius]) |
|
this.center = filterVector(initCenter) |
|
this.rotation = filterVector(initQuat) |
|
|
|
this.computedRadius = this.radius.curve(0) |
|
this.computedCenter = this.center.curve(0) |
|
this.computedRotation = this.rotation.curve(0) |
|
this.computedUp = [0.1,0,0] |
|
this.computedEye = [0.1,0,0] |
|
this.computedMatrix = [0.1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] |
|
|
|
this.recalcMatrix(0) |
|
} |
|
|
|
var proto = OrbitCameraController.prototype |
|
|
|
proto.lastT = function() { |
|
return Math.max( |
|
this.radius.lastT(), |
|
this.center.lastT(), |
|
this.rotation.lastT()) |
|
} |
|
|
|
proto.recalcMatrix = function(t) { |
|
this.radius.curve(t) |
|
this.center.curve(t) |
|
this.rotation.curve(t) |
|
|
|
var quat = this.computedRotation |
|
normalize4(quat, quat) |
|
|
|
var mat = this.computedMatrix |
|
mat4FromQuat(mat, quat) |
|
|
|
var center = this.computedCenter |
|
var eye = this.computedEye |
|
var up = this.computedUp |
|
var radius = Math.exp(this.computedRadius[0]) |
|
|
|
eye[0] = center[0] + radius * mat[2] |
|
eye[1] = center[1] + radius * mat[6] |
|
eye[2] = center[2] + radius * mat[10] |
|
up[0] = mat[1] |
|
up[1] = mat[5] |
|
up[2] = mat[9] |
|
|
|
for(var i=0; i<3; ++i) { |
|
var rr = 0.0 |
|
for(var j=0; j<3; ++j) { |
|
rr += mat[i+4*j] * eye[j] |
|
} |
|
mat[12+i] = -rr |
|
} |
|
} |
|
|
|
proto.getMatrix = function(t, result) { |
|
this.recalcMatrix(t) |
|
var m = this.computedMatrix |
|
if(result) { |
|
for(var i=0; i<16; ++i) { |
|
result[i] = m[i] |
|
} |
|
return result |
|
} |
|
return m |
|
} |
|
|
|
proto.idle = function(t) { |
|
this.center.idle(t) |
|
this.radius.idle(t) |
|
this.rotation.idle(t) |
|
} |
|
|
|
proto.flush = function(t) { |
|
this.center.flush(t) |
|
this.radius.flush(t) |
|
this.rotation.flush(t) |
|
} |
|
|
|
proto.pan = function(t, dx, dy, dz) { |
|
dx = dx || 0.0 |
|
dy = dy || 0.0 |
|
dz = dz || 0.0 |
|
|
|
this.recalcMatrix(t) |
|
var mat = this.computedMatrix |
|
|
|
var ux = mat[1] |
|
var uy = mat[5] |
|
var uz = mat[9] |
|
var ul = len3(ux, uy, uz) |
|
ux /= ul |
|
uy /= ul |
|
uz /= ul |
|
|
|
var rx = mat[0] |
|
var ry = mat[4] |
|
var rz = mat[8] |
|
var ru = rx * ux + ry * uy + rz * uz |
|
rx -= ux * ru |
|
ry -= uy * ru |
|
rz -= uz * ru |
|
var rl = len3(rx, ry, rz) |
|
rx /= rl |
|
ry /= rl |
|
rz /= rl |
|
|
|
var fx = mat[2] |
|
var fy = mat[6] |
|
var fz = mat[10] |
|
var fu = fx * ux + fy * uy + fz * uz |
|
var fr = fx * rx + fy * ry + fz * rz |
|
fx -= fu * ux + fr * rx |
|
fy -= fu * uy + fr * ry |
|
fz -= fu * uz + fr * rz |
|
var fl = len3(fx, fy, fz) |
|
fx /= fl |
|
fy /= fl |
|
fz /= fl |
|
|
|
var vx = rx * dx + ux * dy |
|
var vy = ry * dx + uy * dy |
|
var vz = rz * dx + uz * dy |
|
|
|
this.center.move(t, vx, vy, vz) |
|
|
|
//Update z-component of radius |
|
var radius = Math.exp(this.computedRadius[0]) |
|
radius = Math.max(1e-4, radius + dz) |
|
this.radius.set(t, Math.log(radius)) |
|
} |
|
|
|
proto.rotate = function(t, dx, dy, dz) { |
|
this.recalcMatrix(t) |
|
|
|
dx = dx||0.0 |
|
dy = dy||0.0 |
|
|
|
var mat = this.computedMatrix |
|
|
|
var rx = mat[0] |
|
var ry = mat[4] |
|
var rz = mat[8] |
|
|
|
var ux = mat[1] |
|
var uy = mat[5] |
|
var uz = mat[9] |
|
|
|
var fx = mat[2] |
|
var fy = mat[6] |
|
var fz = mat[10] |
|
|
|
var qx = dx * rx + dy * ux |
|
var qy = dx * ry + dy * uy |
|
var qz = dx * rz + dy * uz |
|
|
|
var bx = -(fy * qz - fz * qy) |
|
var by = -(fz * qx - fx * qz) |
|
var bz = -(fx * qy - fy * qx) |
|
var bw = Math.sqrt(Math.max(0.0, 1.0 - Math.pow(bx,2) - Math.pow(by,2) - Math.pow(bz,2))) |
|
var bl = len4(bx, by, bz, bw) |
|
if(bl > 1e-6) { |
|
bx /= bl |
|
by /= bl |
|
bz /= bl |
|
bw /= bl |
|
} else { |
|
bx = by = bz = 0.0 |
|
bw = 1.0 |
|
} |
|
|
|
var rotation = this.computedRotation |
|
var ax = rotation[0] |
|
var ay = rotation[1] |
|
var az = rotation[2] |
|
var aw = rotation[3] |
|
|
|
var cx = ax*bw + aw*bx + ay*bz - az*by |
|
var cy = ay*bw + aw*by + az*bx - ax*bz |
|
var cz = az*bw + aw*bz + ax*by - ay*bx |
|
var cw = aw*bw - ax*bx - ay*by - az*bz |
|
|
|
//Apply roll |
|
if(dz) { |
|
bx = fx |
|
by = fy |
|
bz = fz |
|
var s = Math.sin(dz) / len3(bx, by, bz) |
|
bx *= s |
|
by *= s |
|
bz *= s |
|
bw = Math.cos(dx) |
|
cx = cx*bw + cw*bx + cy*bz - cz*by |
|
cy = cy*bw + cw*by + cz*bx - cx*bz |
|
cz = cz*bw + cw*bz + cx*by - cy*bx |
|
cw = cw*bw - cx*bx - cy*by - cz*bz |
|
} |
|
|
|
var cl = len4(cx, cy, cz, cw) |
|
if(cl > 1e-6) { |
|
cx /= cl |
|
cy /= cl |
|
cz /= cl |
|
cw /= cl |
|
} else { |
|
cx = cy = cz = 0.0 |
|
cw = 1.0 |
|
} |
|
|
|
this.rotation.set(t, cx, cy, cz, cw) |
|
} |
|
|
|
proto.lookAt = function(t, eye, center, up) { |
|
this.recalcMatrix(t) |
|
|
|
center = center || this.computedCenter |
|
eye = eye || this.computedEye |
|
up = up || this.computedUp |
|
|
|
var mat = this.computedMatrix |
|
lookAt(mat, eye, center, up) |
|
|
|
var rotation = this.computedRotation |
|
quatFromFrame(rotation, |
|
mat[0], mat[1], mat[2], |
|
mat[4], mat[5], mat[6], |
|
mat[8], mat[9], mat[10]) |
|
normalize4(rotation, rotation) |
|
this.rotation.set(t, rotation[0], rotation[1], rotation[2], rotation[3]) |
|
|
|
var fl = 0.0 |
|
for(var i=0; i<3; ++i) { |
|
fl += Math.pow(center[i] - eye[i], 2) |
|
} |
|
this.radius.set(t, 0.5 * Math.log(Math.max(fl, 1e-6))) |
|
|
|
this.center.set(t, center[0], center[1], center[2]) |
|
} |
|
|
|
proto.translate = function(t, dx, dy, dz) { |
|
this.center.move(t, |
|
dx||0.0, |
|
dy||0.0, |
|
dz||0.0) |
|
} |
|
|
|
proto.setMatrix = function(t, matrix) { |
|
|
|
var rotation = this.computedRotation |
|
quatFromFrame(rotation, |
|
matrix[0], matrix[1], matrix[2], |
|
matrix[4], matrix[5], matrix[6], |
|
matrix[8], matrix[9], matrix[10]) |
|
normalize4(rotation, rotation) |
|
this.rotation.set(t, rotation[0], rotation[1], rotation[2], rotation[3]) |
|
|
|
var mat = this.computedMatrix |
|
invert44(mat, matrix) |
|
var w = mat[15] |
|
if(Math.abs(w) > 1e-6) { |
|
var cx = mat[12]/w |
|
var cy = mat[13]/w |
|
var cz = mat[14]/w |
|
|
|
this.recalcMatrix(t) |
|
var r = Math.exp(this.computedRadius[0]) |
|
this.center.set(t, cx-mat[2]*r, cy-mat[6]*r, cz-mat[10]*r) |
|
this.radius.idle(t) |
|
} else { |
|
this.center.idle(t) |
|
this.radius.idle(t) |
|
} |
|
} |
|
|
|
proto.setDistance = function(t, d) { |
|
if(d > 0) { |
|
this.radius.set(t, Math.log(d)) |
|
} |
|
} |
|
|
|
proto.setDistanceLimits = function(lo, hi) { |
|
if(lo > 0) { |
|
lo = Math.log(lo) |
|
} else { |
|
lo = -Infinity |
|
} |
|
if(hi > 0) { |
|
hi = Math.log(hi) |
|
} else { |
|
hi = Infinity |
|
} |
|
hi = Math.max(hi, lo) |
|
this.radius.bounds[0][0] = lo |
|
this.radius.bounds[1][0] = hi |
|
} |
|
|
|
proto.getDistanceLimits = function(out) { |
|
var bounds = this.radius.bounds |
|
if(out) { |
|
out[0] = Math.exp(bounds[0][0]) |
|
out[1] = Math.exp(bounds[1][0]) |
|
return out |
|
} |
|
return [ Math.exp(bounds[0][0]), Math.exp(bounds[1][0]) ] |
|
} |
|
|
|
proto.toJSON = function() { |
|
this.recalcMatrix(this.lastT()) |
|
return { |
|
center: this.computedCenter.slice(), |
|
rotation: this.computedRotation.slice(), |
|
distance: Math.log(this.computedRadius[0]), |
|
zoomMin: this.radius.bounds[0][0], |
|
zoomMax: this.radius.bounds[1][0] |
|
} |
|
} |
|
|
|
proto.fromJSON = function(options) { |
|
var t = this.lastT() |
|
var c = options.center |
|
if(c) { |
|
this.center.set(t, c[0], c[1], c[2]) |
|
} |
|
var r = options.rotation |
|
if(r) { |
|
this.rotation.set(t, r[0], r[1], r[2], r[3]) |
|
} |
|
var d = options.distance |
|
if(d && d > 0) { |
|
this.radius.set(t, Math.log(d)) |
|
} |
|
this.setDistanceLimits(options.zoomMin, options.zoomMax) |
|
} |
|
|
|
function createOrbitController(options) { |
|
options = options || {} |
|
var center = options.center || [0,0,0] |
|
var rotation = options.rotation || [0,0,0,1] |
|
var radius = options.radius || 1.0 |
|
|
|
center = [].slice.call(center, 0, 3) |
|
rotation = [].slice.call(rotation, 0, 4) |
|
normalize4(rotation, rotation) |
|
|
|
var result = new OrbitCameraController( |
|
rotation, |
|
center, |
|
Math.log(radius)) |
|
|
|
result.setDistanceLimits(options.zoomMin, options.zoomMax) |
|
|
|
if('eye' in options || 'up' in options) { |
|
result.lookAt(0, options.eye, options.center, options.up) |
|
} |
|
|
|
return result |
|
} |
|
},{"./lib/quatFromFrame":211,"filtered-vector":73,"gl-mat4/fromQuat":91,"gl-mat4/invert":94,"gl-mat4/lookAt":95}],213:[function(require,module,exports){ |
|
/*! |
|
* pad-left <https://github.com/jonschlinkert/pad-left> |
|
* |
|
* Copyright (c) 2014-2015, Jon Schlinkert. |
|
* Licensed under the MIT license. |
|
*/ |
|
|
|
'use strict'; |
|
|
|
var repeat = require('repeat-string'); |
|
|
|
module.exports = function padLeft(str, num, ch) { |
|
ch = typeof ch !== 'undefined' ? (ch + '') : ' '; |
|
return repeat(ch, num) + str; |
|
}; |
|
},{"repeat-string":227}],214:[function(require,module,exports){ |
|
module.exports = function parseUnit(str, out) { |
|
if (!out) |
|
out = [ 0, '' ] |
|
|
|
str = String(str) |
|
var num = parseFloat(str, 10) |
|
out[0] = num |
|
out[1] = str.match(/[\d.\-\+]*\s*(.*)/)[1] || '' |
|
return out |
|
} |
|
},{}],215:[function(require,module,exports){ |
|
"use strict" |
|
|
|
module.exports = permutationSign |
|
|
|
var BRUTE_FORCE_CUTOFF = 32 |
|
|
|
var pool = require("typedarray-pool") |
|
|
|
function permutationSign(p) { |
|
var n = p.length |
|
if(n < BRUTE_FORCE_CUTOFF) { |
|
//Use quadratic algorithm for small n |
|
var sgn = 1 |
|
for(var i=0; i<n; ++i) { |
|
for(var j=0; j<i; ++j) { |
|
if(p[i] < p[j]) { |
|
sgn = -sgn |
|
} else if(p[i] === p[j]) { |
|
return 0 |
|
} |
|
} |
|
} |
|
return sgn |
|
} else { |
|
//Otherwise use linear time algorithm |
|
var visited = pool.mallocUint8(n) |
|
for(var i=0; i<n; ++i) { |
|
visited[i] = 0 |
|
} |
|
var sgn = 1 |
|
for(var i=0; i<n; ++i) { |
|
if(!visited[i]) { |
|
var count = 1 |
|
visited[i] = 1 |
|
for(var j=p[i]; j!==i; j=p[j]) { |
|
if(visited[j]) { |
|
pool.freeUint8(visited) |
|
return 0 |
|
} |
|
count += 1 |
|
visited[j] = 1 |
|
} |
|
if(!(count & 1)) { |
|
sgn = -sgn |
|
} |
|
} |
|
} |
|
pool.freeUint8(visited) |
|
return sgn |
|
} |
|
} |
|
},{"typedarray-pool":257}],216:[function(require,module,exports){ |
|
"use strict" |
|
|
|
var pool = require("typedarray-pool") |
|
var inverse = require("invert-permutation") |
|
|
|
function rank(permutation) { |
|
var n = permutation.length |
|
switch(n) { |
|
case 0: |
|
case 1: |
|
return 0 |
|
case 2: |
|
return permutation[1] |
|
default: |
|
break |
|
} |
|
var p = pool.mallocUint32(n) |
|
var pinv = pool.mallocUint32(n) |
|
var r = 0, s, t, i |
|
inverse(permutation, pinv) |
|
for(i=0; i<n; ++i) { |
|
p[i] = permutation[i] |
|
} |
|
for(i=n-1; i>0; --i) { |
|
t = pinv[i] |
|
s = p[i] |
|
p[i] = p[t] |
|
p[t] = s |
|
pinv[i] = pinv[s] |
|
pinv[s] = t |
|
r = (r + s) * i |
|
} |
|
pool.freeUint32(pinv) |
|
pool.freeUint32(p) |
|
return r |
|
} |
|
|
|
function unrank(n, r, p) { |
|
switch(n) { |
|
case 0: |
|
if(p) { return p } |
|
return [] |
|
case 1: |
|
if(p) { |
|
p[0] = 0 |
|
return p |
|
} else { |
|
return [0] |
|
} |
|
case 2: |
|
if(p) { |
|
if(r) { |
|
p[0] = 0 |
|
p[1] = 1 |
|
} else { |
|
p[0] = 1 |
|
p[1] = 0 |
|
} |
|
return p |
|
} else { |
|
return r ? [0,1] : [1,0] |
|
} |
|
default: |
|
break |
|
} |
|
p = p || new Array(n) |
|
var s, t, i, nf=1 |
|
p[0] = 0 |
|
for(i=1; i<n; ++i) { |
|
p[i] = i |
|
nf = (nf*i)|0 |
|
} |
|
for(i=n-1; i>0; --i) { |
|
s = (r / nf)|0 |
|
r = (r - s * nf)|0 |
|
nf = (nf / i)|0 |
|
t = p[i]|0 |
|
p[i] = p[s]|0 |
|
p[s] = t|0 |
|
} |
|
return p |
|
} |
|
|
|
exports.rank = rank |
|
exports.unrank = unrank |
|
|
|
},{"invert-permutation":190,"typedarray-pool":257}],217:[function(require,module,exports){ |
|
"use strict" |
|
|
|
module.exports = planarDual |
|
|
|
var compareAngle = require("compare-angle") |
|
|
|
function planarDual(cells, positions) { |
|
|
|
var numVertices = positions.length|0 |
|
var numEdges = cells.length |
|
var adj = [new Array(numVertices), new Array(numVertices)] |
|
for(var i=0; i<numVertices; ++i) { |
|
adj[0][i] = [] |
|
adj[1][i] = [] |
|
} |
|
for(var i=0; i<numEdges; ++i) { |
|
var c = cells[i] |
|
adj[0][c[0]].push(c) |
|
adj[1][c[1]].push(c) |
|
} |
|
|
|
var cycles = [] |
|
|
|
//Add isolated vertices as trivial case |
|
for(var i=0; i<numVertices; ++i) { |
|
if(adj[0][i].length + adj[1][i].length === 0) { |
|
cycles.push( [i] ) |
|
} |
|
} |
|
|
|
//Remove a half edge |
|
function cut(c, i) { |
|
var a = adj[i][c[i]] |
|
a.splice(a.indexOf(c), 1) |
|
} |
|
|
|
//Find next vertex and cut edge |
|
function next(a, b, noCut) { |
|
var nextCell, nextVertex, nextDir |
|
for(var i=0; i<2; ++i) { |
|
if(adj[i][b].length > 0) { |
|
nextCell = adj[i][b][0] |
|
nextDir = i |
|
break |
|
} |
|
} |
|
nextVertex = nextCell[nextDir^1] |
|
|
|
for(var dir=0; dir<2; ++dir) { |
|
var nbhd = adj[dir][b] |
|
for(var k=0; k<nbhd.length; ++k) { |
|
var e = nbhd[k] |
|
var p = e[dir^1] |
|
var cmp = compareAngle( |
|
positions[a], |
|
positions[b], |
|
positions[nextVertex], |
|
positions[p]) |
|
if(cmp > 0) { |
|
nextCell = e |
|
nextVertex = p |
|
nextDir = dir |
|
} |
|
} |
|
} |
|
if(noCut) { |
|
return nextVertex |
|
} |
|
if(nextCell) { |
|
cut(nextCell, nextDir) |
|
} |
|
return nextVertex |
|
} |
|
|
|
function extractCycle(v, dir) { |
|
var e0 = adj[dir][v][0] |
|
var cycle = [v] |
|
cut(e0, dir) |
|
var u = e0[dir^1] |
|
var d0 = dir |
|
while(true) { |
|
while(u !== v) { |
|
cycle.push(u) |
|
u = next(cycle[cycle.length-2], u, false) |
|
} |
|
if(adj[0][v].length + adj[1][v].length === 0) { |
|
break |
|
} |
|
var a = cycle[cycle.length-1] |
|
var b = v |
|
var c = cycle[1] |
|
var d = next(a, b, true) |
|
if(compareAngle(positions[a], positions[b], positions[c], positions[d]) < 0) { |
|
break |
|
} |
|
cycle.push(v) |
|
u = next(a, b) |
|
} |
|
return cycle |
|
} |
|
|
|
function shouldGlue(pcycle, ncycle) { |
|
return (ncycle[1] === ncycle[ncycle.length-1]) |
|
} |
|
|
|
for(var i=0; i<numVertices; ++i) { |
|
for(var j=0; j<2; ++j) { |
|
var pcycle = [] |
|
while(adj[j][i].length > 0) { |
|
var ni = adj[0][i].length |
|
var ncycle = extractCycle(i,j) |
|
if(shouldGlue(pcycle, ncycle)) { |
|
//Glue together trivial cycles |
|
pcycle.push.apply(pcycle, ncycle) |
|
} else { |
|
if(pcycle.length > 0) { |
|
cycles.push(pcycle) |
|
} |
|
pcycle = ncycle |
|
} |
|
} |
|
if(pcycle.length > 0) { |
|
cycles.push(pcycle) |
|
} |
|
} |
|
} |
|
|
|
//Combine paths and loops together |
|
return cycles |
|
} |
|
},{"compare-angle":58}],218:[function(require,module,exports){ |
|
'use strict' |
|
|
|
module.exports = trimLeaves |
|
|
|
var e2a = require('edges-to-adjacency-list') |
|
|
|
function trimLeaves(edges, positions) { |
|
var adj = e2a(edges, positions.length) |
|
var live = new Array(positions.length) |
|
var nbhd = new Array(positions.length) |
|
|
|
var dead = [] |
|
for(var i=0; i<positions.length; ++i) { |
|
var count = adj[i].length |
|
nbhd[i] = count |
|
live[i] = true |
|
if(count <= 1) { |
|
dead.push(i) |
|
} |
|
} |
|
|
|
while(dead.length > 0) { |
|
var v = dead.pop() |
|
live[v] = false |
|
var n = adj[v] |
|
for(var i=0; i<n.length; ++i) { |
|
var u = n[i] |
|
if(--nbhd[u] === 0) { |
|
dead.push(u) |
|
} |
|
} |
|
} |
|
|
|
var newIndex = new Array(positions.length) |
|
var npositions = [] |
|
for(var i=0; i<positions.length; ++i) { |
|
if(live[i]) { |
|
var v = npositions.length |
|
newIndex[i] = v |
|
npositions.push(positions[i]) |
|
} else { |
|
newIndex[i] = -1 |
|
} |
|
} |
|
|
|
var nedges = [] |
|
for(var i=0; i<edges.length; ++i) { |
|
var e = edges[i] |
|
if(live[e[0]] && live[e[1]]) { |
|
nedges.push([ newIndex[e[0]], newIndex[e[1]] ]) |
|
} |
|
} |
|
|
|
return [ nedges, npositions ] |
|
} |
|
},{"edges-to-adjacency-list":71}],219:[function(require,module,exports){ |
|
'use strict' |
|
|
|
module.exports = planarGraphToPolyline |
|
|
|
var e2a = require('edges-to-adjacency-list') |
|
var planarDual = require('planar-dual') |
|
var preprocessPolygon = require('point-in-big-polygon') |
|
var twoProduct = require('two-product') |
|
var robustSum = require('robust-sum') |
|
var uniq = require('uniq') |
|
var trimLeaves = require('./lib/trim-leaves') |
|
|
|
function makeArray(length, fill) { |
|
var result = new Array(length) |
|
for(var i=0; i<length; ++i) { |
|
result[i] = fill |
|
} |
|
return result |
|
} |
|
|
|
function makeArrayOfArrays(length) { |
|
var result = new Array(length) |
|
for(var i=0; i<length; ++i) { |
|
result[i] = [] |
|
} |
|
return result |
|
} |
|
|
|
|
|
function planarGraphToPolyline(edges, positions) { |
|
|
|
//Trim leaves |
|
var result = trimLeaves(edges, positions) |
|
edges = result[0] |
|
positions = result[1] |
|
|
|
var numVertices = positions.length |
|
var numEdges = edges.length |
|
|
|
//Calculate adjacency list, check manifold |
|
var adj = e2a(edges, positions.length) |
|
for(var i=0; i<numVertices; ++i) { |
|
if(adj[i].length % 2 === 1) { |
|
throw new Error('planar-graph-to-polyline: graph must be manifold') |
|
} |
|
} |
|
|
|
//Get faces |
|
var faces = planarDual(edges, positions) |
|
|
|
//Check orientation of a polygon using exact arithmetic |
|
function ccw(c) { |
|
var n = c.length |
|
var area = [0] |
|
for(var j=0; j<n; ++j) { |
|
var a = positions[c[j]] |
|
var b = positions[c[(j+1)%n]] |
|
var t00 = twoProduct(-a[0], a[1]) |
|
var t01 = twoProduct(-a[0], b[1]) |
|
var t10 = twoProduct( b[0], a[1]) |
|
var t11 = twoProduct( b[0], b[1]) |
|
area = robustSum(area, robustSum(robustSum(t00, t01), robustSum(t10, t11))) |
|
} |
|
return area[area.length-1] > 0 |
|
} |
|
|
|
//Extract all clockwise faces |
|
faces = faces.filter(ccw) |
|
|
|
//Detect which loops are contained in one another to handle parent-of relation |
|
var numFaces = faces.length |
|
var parent = new Array(numFaces) |
|
var containment = new Array(numFaces) |
|
for(var i=0; i<numFaces; ++i) { |
|
parent[i] = i |
|
var row = new Array(numFaces) |
|
var loopVertices = faces[i].map(function(v) { |
|
return positions[v] |
|
}) |
|
var pmc = preprocessPolygon([loopVertices]) |
|
var count = 0 |
|
outer: |
|
for(var j=0; j<numFaces; ++j) { |
|
row[j] = 0 |
|
if(i === j) { |
|
continue |
|
} |
|
var c = faces[j] |
|
var n = c.length |
|
for(var k=0; k<n; ++k) { |
|
var d = pmc(positions[c[k]]) |
|
if(d !== 0) { |
|
if(d < 0) { |
|
row[j] = 1 |
|
count += 1 |
|
} |
|
continue outer |
|
} |
|
} |
|
row[j] = 1 |
|
count += 1 |
|
} |
|
containment[i] = [count, i, row] |
|
} |
|
containment.sort(function(a,b) { |
|
return b[0] - a[0] |
|
}) |
|
for(var i=0; i<numFaces; ++i) { |
|
var row = containment[i] |
|
var idx = row[1] |
|
var children = row[2] |
|
for(var j=0; j<numFaces; ++j) { |
|
if(children[j]) { |
|
parent[j] = idx |
|
} |
|
} |
|
} |
|
|
|
//Initialize face adjacency list |
|
var fadj = makeArrayOfArrays(numFaces) |
|
for(var i=0; i<numFaces; ++i) { |
|
fadj[i].push(parent[i]) |
|
fadj[parent[i]].push(i) |
|
} |
|
|
|
//Build adjacency matrix for edges |
|
var edgeAdjacency = {} |
|
var internalVertices = makeArray(numVertices, false) |
|
for(var i=0; i<numFaces; ++i) { |
|
var c = faces[i] |
|
var n = c.length |
|
for(var j=0; j<n; ++j) { |
|
var a = c[j] |
|
var b = c[(j+1)%n] |
|
var key = Math.min(a,b) + ":" + Math.max(a,b) |
|
if(key in edgeAdjacency) { |
|
var neighbor = edgeAdjacency[key] |
|
fadj[neighbor].push(i) |
|
fadj[i].push(neighbor) |
|
internalVertices[a] = internalVertices[b] = true |
|
} else { |
|
edgeAdjacency[key] = i |
|
} |
|
} |
|
} |
|
|
|
function sharedBoundary(c) { |
|
var n = c.length |
|
for(var i=0; i<n; ++i) { |
|
if(!internalVertices[c[i]]) { |
|
return false |
|
} |
|
} |
|
return true |
|
} |
|
|
|
var toVisit = [] |
|
var parity = makeArray(numFaces, -1) |
|
for(var i=0; i<numFaces; ++i) { |
|
if(parent[i] === i && !sharedBoundary(faces[i])) { |
|
toVisit.push(i) |
|
parity[i] = 0 |
|
} else { |
|
parity[i] = -1 |
|
} |
|
} |
|
|
|
//Using face adjacency, classify faces as in/out |
|
var result = [] |
|
while(toVisit.length > 0) { |
|
var top = toVisit.pop() |
|
var nbhd = fadj[top] |
|
uniq(nbhd, function(a,b) { |
|
return a-b |
|
}) |
|
var nnbhr = nbhd.length |
|
var p = parity[top] |
|
var polyline |
|
if(p === 0) { |
|
var c = faces[top] |
|
polyline = [c] |
|
} |
|
for(var i=0; i<nnbhr; ++i) { |
|
var f = nbhd[i] |
|
if(parity[f] >= 0) { |
|
continue |
|
} |
|
parity[f] = p^1 |
|
toVisit.push(f) |
|
if(p === 0) { |
|
var c = faces[f] |
|
if(!sharedBoundary(c)) { |
|
c.reverse() |
|
polyline.push(c) |
|
} |
|
} |
|
} |
|
if(p === 0) { |
|
result.push(polyline) |
|
} |
|
} |
|
|
|
return result |
|
} |
|
},{"./lib/trim-leaves":218,"edges-to-adjacency-list":71,"planar-dual":217,"point-in-big-polygon":220,"robust-sum":239,"two-product":255,"uniq":259}],220:[function(require,module,exports){ |
|
module.exports = preprocessPolygon |
|
|
|
var orient = require('robust-orientation')[3] |
|
var makeSlabs = require('slab-decomposition') |
|
var makeIntervalTree = require('interval-tree-1d') |
|
var bsearch = require('binary-search-bounds') |
|
|
|
function visitInterval() { |
|
return true |
|
} |
|
|
|
function intervalSearch(table) { |
|
return function(x, y) { |
|
var tree = table[x] |
|
if(tree) { |
|
return !!tree.queryPoint(y, visitInterval) |
|
} |
|
return false |
|
} |
|
} |
|
|
|
function buildVerticalIndex(segments) { |
|
var table = {} |
|
for(var i=0; i<segments.length; ++i) { |
|
var s = segments[i] |
|
var x = s[0][0] |
|
var y0 = s[0][1] |
|
var y1 = s[1][1] |
|
var p = [ Math.min(y0, y1), Math.max(y0, y1) ] |
|
if(x in table) { |
|
table[x].push(p) |
|
} else { |
|
table[x] = [ p ] |
|
} |
|
} |
|
var intervalTable = {} |
|
var keys = Object.keys(table) |
|
for(var i=0; i<keys.length; ++i) { |
|
var segs = table[keys[i]] |
|
intervalTable[keys[i]] = makeIntervalTree(segs) |
|
} |
|
return intervalSearch(intervalTable) |
|
} |
|
|
|
function buildSlabSearch(slabs, coordinates) { |
|
return function(p) { |
|
var bucket = bsearch.le(coordinates, p[0]) |
|
if(bucket < 0) { |
|
return 1 |
|
} |
|
var root = slabs[bucket] |
|
if(!root) { |
|
if(bucket > 0 && coordinates[bucket] === p[0]) { |
|
root = slabs[bucket-1] |
|
} else { |
|
return 1 |
|
} |
|
} |
|
var lastOrientation = 1 |
|
while(root) { |
|
var s = root.key |
|
var o = orient(p, s[0], s[1]) |
|
if(s[0][0] < s[1][0]) { |
|
if(o < 0) { |
|
root = root.left |
|
} else if(o > 0) { |
|
lastOrientation = -1 |
|
root = root.right |
|
} else { |
|
return 0 |
|
} |
|
} else { |
|
if(o > 0) { |
|
root = root.left |
|
} else if(o < 0) { |
|
lastOrientation = 1 |
|
root = root.right |
|
} else { |
|
return 0 |
|
} |
|
} |
|
} |
|
return lastOrientation |
|
} |
|
} |
|
|
|
function classifyEmpty(p) { |
|
return 1 |
|
} |
|
|
|
function createClassifyVertical(testVertical) { |
|
return function classify(p) { |
|
if(testVertical(p[0], p[1])) { |
|
return 0 |
|
} |
|
return 1 |
|
} |
|
} |
|
|
|
function createClassifyPointDegen(testVertical, testNormal) { |
|
return function classify(p) { |
|
if(testVertical(p[0], p[1])) { |
|
return 0 |
|
} |
|
return testNormal(p) |
|
} |
|
} |
|
|
|
function preprocessPolygon(loops) { |
|
//Compute number of loops |
|
var numLoops = loops.length |
|
|
|
//Unpack segments |
|
var segments = [] |
|
var vsegments = [] |
|
var ptr = 0 |
|
for(var i=0; i<numLoops; ++i) { |
|
var loop = loops[i] |
|
var numVertices = loop.length |
|
for(var s=numVertices-1,t=0; t<numVertices; s=(t++)) { |
|
var a = loop[s] |
|
var b = loop[t] |
|
if(a[0] === b[0]) { |
|
vsegments.push([a,b]) |
|
} else { |
|
segments.push([a,b]) |
|
} |
|
} |
|
} |
|
|
|
//Degenerate case: All loops are empty |
|
if(segments.length === 0) { |
|
if(vsegments.length === 0) { |
|
return classifyEmpty |
|
} else { |
|
return createClassifyVertical(buildVerticalIndex(vsegments)) |
|
} |
|
} |
|
|
|
//Build slab decomposition |
|
var slabs = makeSlabs(segments) |
|
var testSlab = buildSlabSearch(slabs.slabs, slabs.coordinates) |
|
|
|
if(vsegments.length === 0) { |
|
return testSlab |
|
} else { |
|
return createClassifyPointDegen( |
|
buildVerticalIndex(vsegments), |
|
testSlab) |
|
} |
|
} |
|
},{"binary-search-bounds":35,"interval-tree-1d":189,"robust-orientation":234,"slab-decomposition":248}],221:[function(require,module,exports){ |
|
//Optimized version for triangle closest point |
|
// Based on Eberly's WildMagick codes |
|
// http://www.geometrictools.com/LibMathematics/Distance/Distance.html |
|
"use strict"; |
|
|
|
var diff = new Float64Array(4); |
|
var edge0 = new Float64Array(4); |
|
var edge1 = new Float64Array(4); |
|
|
|
function closestPoint2d(V0, V1, V2, point, result) { |
|
//Reallocate buffers if necessary |
|
if(diff.length < point.length) { |
|
diff = new Float64Array(point.length); |
|
edge0 = new Float64Array(point.length); |
|
edge1 = new Float64Array(point.length); |
|
} |
|
//Compute edges |
|
for(var i=0; i<point.length; ++i) { |
|
diff[i] = V0[i] - point[i]; |
|
edge0[i] = V1[i] - V0[i]; |
|
edge1[i] = V2[i] - V0[i]; |
|
} |
|
//Compute coefficients for quadratic func |
|
var a00 = 0.0 |
|
, a01 = 0.0 |
|
, a11 = 0.0 |
|
, b0 = 0.0 |
|
, b1 = 0.0 |
|
, c = 0.0; |
|
for(var i=0; i<point.length; ++i) { |
|
var e0 = edge0[i] |
|
, e1 = edge1[i] |
|
, d = diff[i]; |
|
a00 += e0 * e0; |
|
a01 += e0 * e1; |
|
a11 += e1 * e1; |
|
b0 += d * e0; |
|
b1 += d * e1; |
|
c += d * d; |
|
} |
|
//Compute determinant/coeffs |
|
var det = Math.abs(a00*a11 - a01*a01); |
|
var s = a01*b1 - a11*b0; |
|
var t = a01*b0 - a00*b1; |
|
var sqrDistance; |
|
//Hardcoded Voronoi diagram classification |
|
if (s + t <= det) { |
|
if (s < 0) { |
|
if (t < 0) { // region 4 |
|
if (b0 < 0) { |
|
t = 0; |
|
if (-b0 >= a00) { |
|
s = 1.0; |
|
sqrDistance = a00 + 2.0*b0 + c; |
|
} else { |
|
s = -b0/a00; |
|
sqrDistance = b0*s + c; |
|
} |
|
} else { |
|
s = 0; |
|
if (b1 >= 0) { |
|
t = 0; |
|
sqrDistance = c; |
|
} else if (-b1 >= a11) { |
|
t = 1; |
|
sqrDistance = a11 + 2.0*b1 + c; |
|
} else { |
|
t = -b1/a11; |
|
sqrDistance = b1*t + c; |
|
} |
|
} |
|
} else { // region 3 |
|
s = 0; |
|
if (b1 >= 0) { |
|
t = 0; |
|
sqrDistance = c; |
|
} else if (-b1 >= a11) { |
|
t = 1; |
|
sqrDistance = a11 + 2.0*b1 + c; |
|
} else { |
|
t = -b1/a11; |
|
sqrDistance = b1*t + c; |
|
} |
|
} |
|
} else if (t < 0) { // region 5 |
|
t = 0; |
|
if (b0 >= 0) { |
|
s = 0; |
|
sqrDistance = c; |
|
} else if (-b0 >= a00) { |
|
s = 1; |
|
sqrDistance = a00 + 2.0*b0 + c; |
|
} else { |
|
s = -b0/a00; |
|
sqrDistance = b0*s + c; |
|
} |
|
} else { // region 0 |
|
// minimum at interior point |
|
var invDet = 1.0 / det; |
|
s *= invDet; |
|
t *= invDet; |
|
sqrDistance = s*(a00*s + a01*t + 2.0*b0) + t*(a01*s + a11*t + 2.0*b1) + c; |
|
} |
|
} else { |
|
var tmp0, tmp1, numer, denom; |
|
|
|
if (s < 0) { // region 2 |
|
tmp0 = a01 + b0; |
|
tmp1 = a11 + b1; |
|
if (tmp1 > tmp0) { |
|
numer = tmp1 - tmp0; |
|
denom = a00 - 2.0*a01 + a11; |
|
if (numer >= denom) { |
|
s = 1; |
|
t = 0; |
|
sqrDistance = a00 + 2.0*b0 + c; |
|
} else { |
|
s = numer/denom; |
|
t = 1 - s; |
|
sqrDistance = s*(a00*s + a01*t + 2.0*b0) + |
|
t*(a01*s + a11*t + 2.0*b1) + c; |
|
} |
|
} else { |
|
s = 0; |
|
if (tmp1 <= 0) { |
|
t = 1; |
|
sqrDistance = a11 + 2.0*b1 + c; |
|
} else if (b1 >= 0) { |
|
t = 0; |
|
sqrDistance = c; |
|
} else { |
|
t = -b1/a11; |
|
sqrDistance = b1*t + c; |
|
} |
|
} |
|
} else if (t < 0) { // region 6 |
|
tmp0 = a01 + b1; |
|
tmp1 = a00 + b0; |
|
if (tmp1 > tmp0) { |
|
numer = tmp1 - tmp0; |
|
denom = a00 - 2.0*a01 + a11; |
|
if (numer >= denom) { |
|
t = 1; |
|
s = 0; |
|
sqrDistance = a11 + 2.0*b1 + c; |
|
} else { |
|
t = numer/denom; |
|
s = 1 - t; |
|
sqrDistance = s*(a00*s + a01*t + 2.0*b0) + |
|
t*(a01*s + a11*t + 2.0*b1) + c; |
|
} |
|
} else { |
|
t = 0; |
|
if (tmp1 <= 0) { |
|
s = 1; |
|
sqrDistance = a00 + 2.0*b0 + c; |
|
} else if (b0 >= 0) { |
|
s = 0; |
|
sqrDistance = c; |
|
} else { |
|
s = -b0/a00; |
|
sqrDistance = b0*s + c; |
|
} |
|
} |
|
} else { // region 1 |
|
numer = a11 + b1 - a01 - b0; |
|
if (numer <= 0) { |
|
s = 0; |
|
t = 1; |
|
sqrDistance = a11 + 2.0*b1 + c; |
|
} else { |
|
denom = a00 - 2.0*a01 + a11; |
|
if (numer >= denom) { |
|
s = 1; |
|
t = 0; |
|
sqrDistance = a00 + 2.0*b0 + c; |
|
} else { |
|
s = numer/denom; |
|
t = 1 - s; |
|
sqrDistance = s*(a00*s + a01*t + 2.0*b0) + |
|
t*(a01*s + a11*t + 2.0*b1) + c; |
|
} |
|
} |
|
} |
|
} |
|
var u = 1.0 - s - t; |
|
for(var i=0; i<point.length; ++i) { |
|
result[i] = u * V0[i] + s * V1[i] + t * V2[i]; |
|
} |
|
if(sqrDistance < 0) { |
|
return 0; |
|
} |
|
return sqrDistance; |
|
} |
|
|
|
module.exports = closestPoint2d; |
|
|
|
},{}],222:[function(require,module,exports){ |
|
module.exports = require('gl-quat/slerp') |
|
},{"gl-quat/slerp":105}],223:[function(require,module,exports){ |
|
'use strict' |
|
|
|
var bnadd = require('big-rat/add') |
|
|
|
module.exports = add |
|
|
|
function add (a, b) { |
|
var n = a.length |
|
var r = new Array(n) |
|
for (var i=0; i<n; ++i) { |
|
r[i] = bnadd(a[i], b[i]) |
|
} |
|
return r |
|
} |
|
|
|
},{"big-rat/add":19}],224:[function(require,module,exports){ |
|
'use strict' |
|
|
|
module.exports = float2rat |
|
|
|
var rat = require('big-rat') |
|
|
|
function float2rat(v) { |
|
var result = new Array(v.length) |
|
for(var i=0; i<v.length; ++i) { |
|
result[i] = rat(v[i]) |
|
} |
|
return result |
|
} |
|
|
|
},{"big-rat":22}],225:[function(require,module,exports){ |
|
'use strict' |
|
|
|
var rat = require('big-rat') |
|
var mul = require('big-rat/mul') |
|
|
|
module.exports = muls |
|
|
|
function muls(a, x) { |
|
var s = rat(x) |
|
var n = a.length |
|
var r = new Array(n) |
|
for(var i=0; i<n; ++i) { |
|
r[i] = mul(a[i], s) |
|
} |
|
return r |
|
} |
|
|
|
},{"big-rat":22,"big-rat/mul":31}],226:[function(require,module,exports){ |
|
'use strict' |
|
|
|
var bnsub = require('big-rat/sub') |
|
|
|
module.exports = sub |
|
|
|
function sub(a, b) { |
|
var n = a.length |
|
var r = new Array(n) |
|
for(var i=0; i<n; ++i) { |
|
r[i] = bnsub(a[i], b[i]) |
|
} |
|
return r |
|
} |
|
|
|
},{"big-rat/sub":33}],227:[function(require,module,exports){ |
|
/*! |
|
* repeat-string <https://github.com/jonschlinkert/repeat-string> |
|
* |
|
* Copyright (c) 2014-2015, Jon Schlinkert. |
|
* Licensed under the MIT License. |
|
*/ |
|
|
|
'use strict'; |
|
|
|
/** |
|
* Results cache |
|
*/ |
|
|
|
var res = ''; |
|
var cache; |
|
|
|
/** |
|
* Expose `repeat` |
|
*/ |
|
|
|
module.exports = repeat; |
|
|
|
/** |
|
* Repeat the given `string` the specified `number` |
|
* of times. |
|
* |
|
* **Example:** |
|
* |
|
* ```js |
|
* var repeat = require('repeat-string'); |
|
* repeat('A', 5); |
|
* //=> AAAAA |
|
* ``` |
|
* |
|
* @param {String} `string` The string to repeat |
|
* @param {Number} `number` The number of times to repeat the string |
|
* @return {String} Repeated string |
|
* @api public |
|
*/ |
|
|
|
function repeat(str, num) { |
|
if (typeof str !== 'string') { |
|
throw new TypeError('expected a string'); |
|
} |
|
|
|
// cover common, quick use cases |
|
if (num === 1) return str; |
|
if (num === 2) return str + str; |
|
|
|
var max = str.length * num; |
|
if (cache !== str || typeof cache === 'undefined') { |
|
cache = str; |
|
res = ''; |
|
} else if (res.length >= max) { |
|
return res.substr(0, max); |
|
} |
|
|
|
while (max > res.length && num > 1) { |
|
if (num & 1) { |
|
res += str; |
|
} |
|
|
|
num >>= 1; |
|
str += str; |
|
} |
|
|
|
res += str; |
|
res = res.substr(0, max); |
|
return res; |
|
} |
|
|
|
},{}],228:[function(require,module,exports){ |
|
(function (global){ |
|
module.exports = |
|
global.performance && |
|
global.performance.now ? function now() { |
|
return performance.now() |
|
} : Date.now || function now() { |
|
return +new Date |
|
} |
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) |
|
},{}],229:[function(require,module,exports){ |
|
"use strict" |
|
|
|
module.exports = compressExpansion |
|
|
|
function compressExpansion(e) { |
|
var m = e.length |
|
var Q = e[e.length-1] |
|
var bottom = m |
|
for(var i=m-2; i>=0; --i) { |
|
var a = Q |
|
var b = e[i] |
|
Q = a + b |
|
var bv = Q - a |
|
var q = b - bv |
|
if(q) { |
|
e[--bottom] = Q |
|
Q = q |
|
} |
|
} |
|
var top = 0 |
|
for(var i=bottom; i<m; ++i) { |
|
var a = e[i] |
|
var b = Q |
|
Q = a + b |
|
var bv = Q - a |
|
var q = b - bv |
|
if(q) { |
|
e[top++] = q |
|
} |
|
} |
|
e[top++] = Q |
|
e.length = top |
|
return e |
|
} |
|
},{}],230:[function(require,module,exports){ |
|
"use strict" |
|
|
|
var twoProduct = require("two-product") |
|
var robustSum = require("robust-sum") |
|
var robustScale = require("robust-scale") |
|
var compress = require("robust-compress") |
|
|
|
var NUM_EXPANDED = 6 |
|
|
|
function cofactor(m, c) { |
|
var result = new Array(m.length-1) |
|
for(var i=1; i<m.length; ++i) { |
|
var r = result[i-1] = new Array(m.length-1) |
|
for(var j=0,k=0; j<m.length; ++j) { |
|
if(j === c) { |
|
continue |
|
} |
|
r[k++] = m[i][j] |
|
} |
|
} |
|
return result |
|
} |
|
|
|
function matrix(n) { |
|
var result = new Array(n) |
|
for(var i=0; i<n; ++i) { |
|
result[i] = new Array(n) |
|
for(var j=0; j<n; ++j) { |
|
result[i][j] = ["m[", i, "][", j, "]"].join("") |
|
} |
|
} |
|
return result |
|
} |
|
|
|
function sign(n) { |
|
if(n & 1) { |
|
return "-" |
|
} |
|
return "" |
|
} |
|
|
|
function generateSum(expr) { |
|
if(expr.length === 1) { |
|
return expr[0] |
|
} else if(expr.length === 2) { |
|
return ["sum(", expr[0], ",", expr[1], ")"].join("") |
|
} else { |
|
var m = expr.length>>1 |
|
return ["sum(", generateSum(expr.slice(0, m)), ",", generateSum(expr.slice(m)), ")"].join("") |
|
} |
|
} |
|
|
|
function determinant(m) { |
|
if(m.length === 2) { |
|
return ["sum(prod(", m[0][0], ",", m[1][1], "),prod(-", m[0][1], ",", m[1][0], "))"].join("") |
|
} else { |
|
var expr = [] |
|
for(var i=0; i<m.length; ++i) { |
|
expr.push(["scale(", determinant(cofactor(m, i)), ",", sign(i), m[0][i], ")"].join("")) |
|
} |
|
return generateSum(expr) |
|
} |
|
} |
|
|
|
function compileDeterminant(n) { |
|
var proc = new Function("sum", "scale", "prod", "compress", [ |
|
"function robustDeterminant",n, "(m){return compress(", |
|
determinant(matrix(n)), |
|
")};return robustDeterminant", n].join("")) |
|
return proc(robustSum, robustScale, twoProduct, compress) |
|
} |
|
|
|
var CACHE = [ |
|
function robustDeterminant0() { return [0] }, |
|
function robustDeterminant1(m) { return [m[0][0]] } |
|
] |
|
|
|
function generateDispatch() { |
|
while(CACHE.length < NUM_EXPANDED) { |
|
CACHE.push(compileDeterminant(CACHE.length)) |
|
} |
|
var procArgs = [] |
|
var code = ["function robustDeterminant(m){switch(m.length){"] |
|
for(var i=0; i<NUM_EXPANDED; ++i) { |
|
procArgs.push("det" + i) |
|
code.push("case ", i, ":return det", i, "(m);") |
|
} |
|
code.push("}\ |
|
var det=CACHE[m.length];\ |
|
if(!det)\ |
|
det=CACHE[m.length]=gen(m.length);\ |
|
return det(m);\ |
|
}\ |
|
return robustDeterminant") |
|
procArgs.push("CACHE", "gen", code.join("")) |
|
var proc = Function.apply(undefined, procArgs) |
|
module.exports = proc.apply(undefined, CACHE.concat([CACHE, compileDeterminant])) |
|
for(var i=0; i<CACHE.length; ++i) { |
|
module.exports[i] = CACHE[i] |
|
} |
|
} |
|
|
|
generateDispatch() |
|
},{"robust-compress":229,"robust-scale":236,"robust-sum":239,"two-product":255}],231:[function(require,module,exports){ |
|
"use strict" |
|
|
|
var twoProduct = require("two-product") |
|
var robustSum = require("robust-sum") |
|
|
|
module.exports = robustDotProduct |
|
|
|
function robustDotProduct(a, b) { |
|
var r = twoProduct(a[0], b[0]) |
|
for(var i=1; i<a.length; ++i) { |
|
r = robustSum(r, twoProduct(a[i], b[i])) |
|
} |
|
return r |
|
} |
|
},{"robust-sum":239,"two-product":255}],232:[function(require,module,exports){ |
|
"use strict" |
|
|
|
var twoProduct = require("two-product") |
|
var robustSum = require("robust-sum") |
|
var robustDiff = require("robust-subtract") |
|
var robustScale = require("robust-scale") |
|
|
|
var NUM_EXPAND = 6 |
|
|
|
function cofactor(m, c) { |
|
var result = new Array(m.length-1) |
|
for(var i=1; i<m.length; ++i) { |
|
var r = result[i-1] = new Array(m.length-1) |
|
for(var j=0,k=0; j<m.length; ++j) { |
|
if(j === c) { |
|
continue |
|
} |
|
r[k++] = m[i][j] |
|
} |
|
} |
|
return result |
|
} |
|
|
|
function matrix(n) { |
|
var result = new Array(n) |
|
for(var i=0; i<n; ++i) { |
|
result[i] = new Array(n) |
|
for(var j=0; j<n; ++j) { |
|
result[i][j] = ["m", j, "[", (n-i-2), "]"].join("") |
|
} |
|
} |
|
return result |
|
} |
|
|
|
function generateSum(expr) { |
|
if(expr.length === 1) { |
|
return expr[0] |
|
} else if(expr.length === 2) { |
|
return ["sum(", expr[0], ",", expr[1], ")"].join("") |
|
} else { |
|
var m = expr.length>>1 |
|
return ["sum(", generateSum(expr.slice(0, m)), ",", generateSum(expr.slice(m)), ")"].join("") |
|
} |
|
} |
|
|
|
function makeProduct(a, b) { |
|
if(a.charAt(0) === "m") { |
|
if(b.charAt(0) === "w") { |
|
var toks = a.split("[") |
|
return ["w", b.substr(1), "m", toks[0].substr(1)].join("") |
|
} else { |
|
return ["prod(", a, ",", b, ")"].join("") |
|
} |
|
} else { |
|
return makeProduct(b, a) |
|
} |
|
} |
|
|
|
function sign(s) { |
|
if(s & 1 !== 0) { |
|
return "-" |
|
} |
|
return "" |
|
} |
|
|
|
function determinant(m) { |
|
if(m.length === 2) { |
|
return [["diff(", makeProduct(m[0][0], m[1][1]), ",", makeProduct(m[1][0], m[0][1]), ")"].join("")] |
|
} else { |
|
var expr = [] |
|
for(var i=0; i<m.length; ++i) { |
|
expr.push(["scale(", generateSum(determinant(cofactor(m, i))), ",", sign(i), m[0][i], ")"].join("")) |
|
} |
|
return expr |
|
} |
|
} |
|
|
|
function makeSquare(d, n) { |
|
var terms = [] |
|
for(var i=0; i<n-2; ++i) { |
|
terms.push(["prod(m", d, "[", i, "],m", d, "[", i, "])"].join("")) |
|
} |
|
return generateSum(terms) |
|
} |
|
|
|
function orientation(n) { |
|
var pos = [] |
|
var neg = [] |
|
var m = matrix(n) |
|
for(var i=0; i<n; ++i) { |
|
m[0][i] = "1" |
|
m[n-1][i] = "w"+i |
|
} |
|
for(var i=0; i<n; ++i) { |
|
if((i&1)===0) { |
|
pos.push.apply(pos,determinant(cofactor(m, i))) |
|
} else { |
|
neg.push.apply(neg,determinant(cofactor(m, i))) |
|
} |
|
} |
|
var posExpr = generateSum(pos) |
|
var negExpr = generateSum(neg) |
|
var funcName = "exactInSphere" + n |
|
var funcArgs = [] |
|
for(var i=0; i<n; ++i) { |
|
funcArgs.push("m" + i) |
|
} |
|
var code = ["function ", funcName, "(", funcArgs.join(), "){"] |
|
for(var i=0; i<n; ++i) { |
|
code.push("var w",i,"=",makeSquare(i,n),";") |
|
for(var j=0; j<n; ++j) { |
|
if(j !== i) { |
|
code.push("var w",i,"m",j,"=scale(w",i,",m",j,"[0]);") |
|
} |
|
} |
|
} |
|
code.push("var p=", posExpr, ",n=", negExpr, ",d=diff(p,n);return d[d.length-1];}return ", funcName) |
|
var proc = new Function("sum", "diff", "prod", "scale", code.join("")) |
|
return proc(robustSum, robustDiff, twoProduct, robustScale) |
|
} |
|
|
|
function inSphere0() { return 0 } |
|
function inSphere1() { return 0 } |
|
function inSphere2() { return 0 } |
|
|
|
var CACHED = [ |
|
inSphere0, |
|
inSphere1, |
|
inSphere2 |
|
] |
|
|
|
function slowInSphere(args) { |
|
var proc = CACHED[args.length] |
|
if(!proc) { |
|
proc = CACHED[args.length] = orientation(args.length) |
|
} |
|
return proc.apply(undefined, args) |
|
} |
|
|
|
function generateInSphereTest() { |
|
while(CACHED.length <= NUM_EXPAND) { |
|
CACHED.push(orientation(CACHED.length)) |
|
} |
|
var args = [] |
|
var procArgs = ["slow"] |
|
for(var i=0; i<=NUM_EXPAND; ++i) { |
|
args.push("a" + i) |
|
procArgs.push("o" + i) |
|
} |
|
var code = [ |
|
"function testInSphere(", args.join(), "){switch(arguments.length){case 0:case 1:return 0;" |
|
] |
|
for(var i=2; i<=NUM_EXPAND; ++i) { |
|
code.push("case ", i, ":return o", i, "(", args.slice(0, i).join(), ");") |
|
} |
|
code.push("}var s=new Array(arguments.length);for(var i=0;i<arguments.length;++i){s[i]=arguments[i]};return slow(s);}return testInSphere") |
|
procArgs.push(code.join("")) |
|
|
|
var proc = Function.apply(undefined, procArgs) |
|
|
|
module.exports = proc.apply(undefined, [slowInSphere].concat(CACHED)) |
|
for(var i=0; i<=NUM_EXPAND; ++i) { |
|
module.exports[i] = CACHED[i] |
|
} |
|
} |
|
|
|
generateInSphereTest() |
|
},{"robust-scale":236,"robust-subtract":238,"robust-sum":239,"two-product":255}],233:[function(require,module,exports){ |
|
"use strict" |
|
|
|
var determinant = require("robust-determinant") |
|
|
|
var NUM_EXPAND = 6 |
|
|
|
function generateSolver(n) { |
|
var funcName = "robustLinearSolve" + n + "d" |
|
var code = ["function ", funcName, "(A,b){return ["] |
|
for(var i=0; i<n; ++i) { |
|
code.push("det([") |
|
for(var j=0; j<n; ++j) { |
|
if(j > 0) { |
|
code.push(",") |
|
} |
|
code.push("[") |
|
for(var k=0; k<n; ++k) { |
|
if(k > 0) { |
|
code.push(",") |
|
} |
|
if(k === i) { |
|
code.push("+b[", j, "]") |
|
} else { |
|
code.push("+A[", j, "][", k, "]") |
|
} |
|
} |
|
code.push("]") |
|
} |
|
code.push("]),") |
|
} |
|
code.push("det(A)]}return ", funcName) |
|
var proc = new Function("det", code.join("")) |
|
if(n < 6) { |
|
return proc(determinant[n]) |
|
} |
|
return proc(determinant) |
|
} |
|
|
|
function robustLinearSolve0d() { |
|
return [ 0 ] |
|
} |
|
|
|
function robustLinearSolve1d(A, b) { |
|
return [ [ b[0] ], [ A[0][0] ] ] |
|
} |
|
|
|
var CACHE = [ |
|
robustLinearSolve0d, |
|
robustLinearSolve1d |
|
] |
|
|
|
function generateDispatch() { |
|
while(CACHE.length < NUM_EXPAND) { |
|
CACHE.push(generateSolver(CACHE.length)) |
|
} |
|
var procArgs = [] |
|
var code = ["function dispatchLinearSolve(A,b){switch(A.length){"] |
|
for(var i=0; i<NUM_EXPAND; ++i) { |
|
procArgs.push("s" + i) |
|
code.push("case ", i, ":return s", i, "(A,b);") |
|
} |
|
code.push("}var s=CACHE[A.length];if(!s)s=CACHE[A.length]=g(A.length);return s(A,b)}return dispatchLinearSolve") |
|
procArgs.push("CACHE", "g", code.join("")) |
|
var proc = Function.apply(undefined, procArgs) |
|
module.exports = proc.apply(undefined, CACHE.concat([CACHE, generateSolver])) |
|
for(var i=0; i<NUM_EXPAND; ++i) { |
|
module.exports[i] = CACHE[i] |
|
} |
|
} |
|
|
|
generateDispatch() |
|
},{"robust-determinant":230}],234:[function(require,module,exports){ |
|
"use strict" |
|
|
|
var twoProduct = require("two-product") |
|
var robustSum = require("robust-sum") |
|
var robustScale = require("robust-scale") |
|
var robustSubtract = require("robust-subtract") |
|
|
|
var NUM_EXPAND = 5 |
|
|
|
var EPSILON = 1.1102230246251565e-16 |
|
var ERRBOUND3 = (3.0 + 16.0 * EPSILON) * EPSILON |
|
var ERRBOUND4 = (7.0 + 56.0 * EPSILON) * EPSILON |
|
|
|
function cofactor(m, c) { |
|
var result = new Array(m.length-1) |
|
for(var i=1; i<m.length; ++i) { |
|
var r = result[i-1] = new Array(m.length-1) |
|
for(var j=0,k=0; j<m.length; ++j) { |
|
if(j === c) { |
|
continue |
|
} |
|
r[k++] = m[i][j] |
|
} |
|
} |
|
return result |
|
} |
|
|
|
function matrix(n) { |
|
var result = new Array(n) |
|
for(var i=0; i<n; ++i) { |
|
result[i] = new Array(n) |
|
for(var j=0; j<n; ++j) { |
|
result[i][j] = ["m", j, "[", (n-i-1), "]"].join("") |
|
} |
|
} |
|
return result |
|
} |
|
|
|
function sign(n) { |
|
if(n & 1) { |
|
return "-" |
|
} |
|
return "" |
|
} |
|
|
|
function generateSum(expr) { |
|
if(expr.length === 1) { |
|
return expr[0] |
|
} else if(expr.length === 2) { |
|
return ["sum(", expr[0], ",", expr[1], ")"].join("") |
|
} else { |
|
var m = expr.length>>1 |
|
return ["sum(", generateSum(expr.slice(0, m)), ",", generateSum(expr.slice(m)), ")"].join("") |
|
} |
|
} |
|
|
|
function determinant(m) { |
|
if(m.length === 2) { |
|
return [["sum(prod(", m[0][0], ",", m[1][1], "),prod(-", m[0][1], ",", m[1][0], "))"].join("")] |
|
} else { |
|
var expr = [] |
|
for(var i=0; i<m.length; ++i) { |
|
expr.push(["scale(", generateSum(determinant(cofactor(m, i))), ",", sign(i), m[0][i], ")"].join("")) |
|
} |
|
return expr |
|
} |
|
} |
|
|
|
function orientation(n) { |
|
var pos = [] |
|
var neg = [] |
|
var m = matrix(n) |
|
var args = [] |
|
for(var i=0; i<n; ++i) { |
|
if((i&1)===0) { |
|
pos.push.apply(pos, determinant(cofactor(m, i))) |
|
} else { |
|
neg.push.apply(neg, determinant(cofactor(m, i))) |
|
} |
|
args.push("m" + i) |
|
} |
|
var posExpr = generateSum(pos) |
|
var negExpr = generateSum(neg) |
|
var funcName = "orientation" + n + "Exact" |
|
var code = ["function ", funcName, "(", args.join(), "){var p=", posExpr, ",n=", negExpr, ",d=sub(p,n);\ |
|
return d[d.length-1];};return ", funcName].join("") |
|
var proc = new Function("sum", "prod", "scale", "sub", code) |
|
return proc(robustSum, twoProduct, robustScale, robustSubtract) |
|
} |
|
|
|
var orientation3Exact = orientation(3) |
|
var orientation4Exact = orientation(4) |
|
|
|
var CACHED = [ |
|
function orientation0() { return 0 }, |
|
function orientation1() { return 0 }, |
|
function orientation2(a, b) { |
|
return b[0] - a[0] |
|
}, |
|
function orientation3(a, b, c) { |
|
var l = (a[1] - c[1]) * (b[0] - c[0]) |
|
var r = (a[0] - c[0]) * (b[1] - c[1]) |
|
var det = l - r |
|
var s |
|
if(l > 0) { |
|
if(r <= 0) { |
|
return det |
|
} else { |
|
s = l + r |
|
} |
|
} else if(l < 0) { |
|
if(r >= 0) { |
|
return det |
|
} else { |
|
s = -(l + r) |
|
} |
|
} else { |
|
return det |
|
} |
|
var tol = ERRBOUND3 * s |
|
if(det >= tol || det <= -tol) { |
|
return det |
|
} |
|
return orientation3Exact(a, b, c) |
|
}, |
|
function orientation4(a,b,c,d) { |
|
var adx = a[0] - d[0] |
|
var bdx = b[0] - d[0] |
|
var cdx = c[0] - d[0] |
|
var ady = a[1] - d[1] |
|
var bdy = b[1] - d[1] |
|
var cdy = c[1] - d[1] |
|
var adz = a[2] - d[2] |
|
var bdz = b[2] - d[2] |
|
var cdz = c[2] - d[2] |
|
var bdxcdy = bdx * cdy |
|
var cdxbdy = cdx * bdy |
|
var cdxady = cdx * ady |
|
var adxcdy = adx * cdy |
|
var adxbdy = adx * bdy |
|
var bdxady = bdx * ady |
|
var det = adz * (bdxcdy - cdxbdy) |
|
+ bdz * (cdxady - adxcdy) |
|
+ cdz * (adxbdy - bdxady) |
|
var permanent = (Math.abs(bdxcdy) + Math.abs(cdxbdy)) * Math.abs(adz) |
|
+ (Math.abs(cdxady) + Math.abs(adxcdy)) * Math.abs(bdz) |
|
+ (Math.abs(adxbdy) + Math.abs(bdxady)) * Math.abs(cdz) |
|
var tol = ERRBOUND4 * permanent |
|
if ((det > tol) || (-det > tol)) { |
|
return det |
|
} |
|
return orientation4Exact(a,b,c,d) |
|
} |
|
] |
|
|
|
function slowOrient(args) { |
|
var proc = CACHED[args.length] |
|
if(!proc) { |
|
proc = CACHED[args.length] = orientation(args.length) |
|
} |
|
return proc.apply(undefined, args) |
|
} |
|
|
|
function generateOrientationProc() { |
|
while(CACHED.length <= NUM_EXPAND) { |
|
CACHED.push(orientation(CACHED.length)) |
|
} |
|
var args = [] |
|
var procArgs = ["slow"] |
|
for(var i=0; i<=NUM_EXPAND; ++i) { |
|
args.push("a" + i) |
|
procArgs.push("o" + i) |
|
} |
|
var code = [ |
|
"function getOrientation(", args.join(), "){switch(arguments.length){case 0:case 1:return 0;" |
|
] |
|
for(var i=2; i<=NUM_EXPAND; ++i) { |
|
code.push("case ", i, ":return o", i, "(", args.slice(0, i).join(), ");") |
|
} |
|
code.push("}var s=new Array(arguments.length);for(var i=0;i<arguments.length;++i){s[i]=arguments[i]};return slow(s);}return getOrientation") |
|
procArgs.push(code.join("")) |
|
|
|
var proc = Function.apply(undefined, procArgs) |
|
module.exports = proc.apply(undefined, [slowOrient].concat(CACHED)) |
|
for(var i=0; i<=NUM_EXPAND; ++i) { |
|
module.exports[i] = CACHED[i] |
|
} |
|
} |
|
|
|
generateOrientationProc() |
|
},{"robust-scale":236,"robust-subtract":238,"robust-sum":239,"two-product":255}],235:[function(require,module,exports){ |
|
"use strict" |
|
|
|
var robustSum = require("robust-sum") |
|
var robustScale = require("robust-scale") |
|
|
|
module.exports = robustProduct |
|
|
|
function robustProduct(a, b) { |
|
if(a.length === 1) { |
|
return robustScale(b, a[0]) |
|
} |
|
if(b.length === 1) { |
|
return robustScale(a, b[0]) |
|
} |
|
if(a.length === 0 || b.length === 0) { |
|
return [0] |
|
} |
|
var r = [0] |
|
if(a.length < b.length) { |
|
for(var i=0; i<a.length; ++i) { |
|
r = robustSum(r, robustScale(b, a[i])) |
|
} |
|
} else { |
|
for(var i=0; i<b.length; ++i) { |
|
r = robustSum(r, robustScale(a, b[i])) |
|
} |
|
} |
|
return r |
|
} |
|
},{"robust-scale":236,"robust-sum":239}],236:[function(require,module,exports){ |
|
"use strict" |
|
|
|
var twoProduct = require("two-product") |
|
var twoSum = require("two-sum") |
|
|
|
module.exports = scaleLinearExpansion |
|
|
|
function scaleLinearExpansion(e, scale) { |
|
var n = e.length |
|
if(n === 1) { |
|
var ts = twoProduct(e[0], scale) |
|
if(ts[0]) { |
|
return ts |
|
} |
|
return [ ts[1] ] |
|
} |
|
var g = new Array(2 * n) |
|
var q = [0.1, 0.1] |
|
var t = [0.1, 0.1] |
|
var count = 0 |
|
twoProduct(e[0], scale, q) |
|
if(q[0]) { |
|
g[count++] = q[0] |
|
} |
|
for(var i=1; i<n; ++i) { |
|
twoProduct(e[i], scale, t) |
|
var pq = q[1] |
|
twoSum(pq, t[0], q) |
|
if(q[0]) { |
|
g[count++] = q[0] |
|
} |
|
var a = t[1] |
|
var b = q[1] |
|
var x = a + b |
|
var bv = x - a |
|
var y = b - bv |
|
q[1] = x |
|
if(y) { |
|
g[count++] = y |
|
} |
|
} |
|
if(q[1]) { |
|
g[count++] = q[1] |
|
} |
|
if(count === 0) { |
|
g[count++] = 0.0 |
|
} |
|
g.length = count |
|
return g |
|
} |
|
},{"two-product":255,"two-sum":256}],237:[function(require,module,exports){ |
|
"use strict" |
|
|
|
module.exports = segmentsIntersect |
|
|
|
var orient = require("robust-orientation")[3] |
|
|
|
function checkCollinear(a0, a1, b0, b1) { |
|
|
|
for(var d=0; d<2; ++d) { |
|
var x0 = a0[d] |
|
var y0 = a1[d] |
|
var l0 = Math.min(x0, y0) |
|
var h0 = Math.max(x0, y0) |
|
|
|
var x1 = b0[d] |
|
var y1 = b1[d] |
|
var l1 = Math.min(x1, y1) |
|
var h1 = Math.max(x1, y1) |
|
|
|
if(h1 < l0 || h0 < l1) { |
|
return false |
|
} |
|
} |
|
|
|
return true |
|
} |
|
|
|
function segmentsIntersect(a0, a1, b0, b1) { |
|
var x0 = orient(a0, b0, b1) |
|
var y0 = orient(a1, b0, b1) |
|
if((x0 > 0 && y0 > 0) || (x0 < 0 && y0 < 0)) { |
|
return false |
|
} |
|
|
|
var x1 = orient(b0, a0, a1) |
|
var y1 = orient(b1, a0, a1) |
|
if((x1 > 0 && y1 > 0) || (x1 < 0 && y1 < 0)) { |
|
return false |
|
} |
|
|
|
//Check for degenerate collinear case |
|
if(x0 === 0 && y0 === 0 && x1 === 0 && y1 === 0) { |
|
return checkCollinear(a0, a1, b0, b1) |
|
} |
|
|
|
return true |
|
} |
|
},{"robust-orientation":234}],238:[function(require,module,exports){ |
|
"use strict" |
|
|
|
module.exports = robustSubtract |
|
|
|
//Easy case: Add two scalars |
|
function scalarScalar(a, b) { |
|
var x = a + b |
|
var bv = x - a |
|
var av = x - bv |
|
var br = b - bv |
|
var ar = a - av |
|
var y = ar + br |
|
if(y) { |
|
return [y, x] |
|
} |
|
return [x] |
|
} |
|
|
|
function robustSubtract(e, f) { |
|
var ne = e.length|0 |
|
var nf = f.length|0 |
|
if(ne === 1 && nf === 1) { |
|
return scalarScalar(e[0], -f[0]) |
|
} |
|
var n = ne + nf |
|
var g = new Array(n) |
|
var count = 0 |
|
var eptr = 0 |
|
var fptr = 0 |
|
var abs = Math.abs |
|
var ei = e[eptr] |
|
var ea = abs(ei) |
|
var fi = -f[fptr] |
|
var fa = abs(fi) |
|
var a, b |
|
if(ea < fa) { |
|
b = ei |
|
eptr += 1 |
|
if(eptr < ne) { |
|
ei = e[eptr] |
|
ea = abs(ei) |
|
} |
|
} else { |
|
b = fi |
|
fptr += 1 |
|
if(fptr < nf) { |
|
fi = -f[fptr] |
|
fa = abs(fi) |
|
} |
|
} |
|
if((eptr < ne && ea < fa) || (fptr >= nf)) { |
|
a = ei |
|
eptr += 1 |
|
if(eptr < ne) { |
|
ei = e[eptr] |
|
ea = abs(ei) |
|
} |
|
} else { |
|
a = fi |
|
fptr += 1 |
|
if(fptr < nf) { |
|
fi = -f[fptr] |
|
fa = abs(fi) |
|
} |
|
} |
|
var x = a + b |
|
var bv = x - a |
|
var y = b - bv |
|
var q0 = y |
|
var q1 = x |
|
var _x, _bv, _av, _br, _ar |
|
while(eptr < ne && fptr < nf) { |
|
if(ea < fa) { |
|
a = ei |
|
eptr += 1 |
|
if(eptr < ne) { |
|
ei = e[eptr] |
|
ea = abs(ei) |
|
} |
|
} else { |
|
a = fi |
|
fptr += 1 |
|
if(fptr < nf) { |
|
fi = -f[fptr] |
|
fa = abs(fi) |
|
} |
|
} |
|
b = q0 |
|
x = a + b |
|
bv = x - a |
|
y = b - bv |
|
if(y) { |
|
g[count++] = y |
|
} |
|
_x = q1 + x |
|
_bv = _x - q1 |
|
_av = _x - _bv |
|
_br = x - _bv |
|
_ar = q1 - _av |
|
q0 = _ar + _br |
|
q1 = _x |
|
} |
|
while(eptr < ne) { |
|
a = ei |
|
b = q0 |
|
x = a + b |
|
bv = x - a |
|
y = b - bv |
|
if(y) { |
|
g[count++] = y |
|
} |
|
_x = q1 + x |
|
_bv = _x - q1 |
|
_av = _x - _bv |
|
_br = x - _bv |
|
_ar = q1 - _av |
|
q0 = _ar + _br |
|
q1 = _x |
|
eptr += 1 |
|
if(eptr < ne) { |
|
ei = e[eptr] |
|
} |
|
} |
|
while(fptr < nf) { |
|
a = fi |
|
b = q0 |
|
x = a + b |
|
bv = x - a |
|
y = b - bv |
|
if(y) { |
|
g[count++] = y |
|
} |
|
_x = q1 + x |
|
_bv = _x - q1 |
|
_av = _x - _bv |
|
_br = x - _bv |
|
_ar = q1 - _av |
|
q0 = _ar + _br |
|
q1 = _x |
|
fptr += 1 |
|
if(fptr < nf) { |
|
fi = -f[fptr] |
|
} |
|
} |
|
if(q0) { |
|
g[count++] = q0 |
|
} |
|
if(q1) { |
|
g[count++] = q1 |
|
} |
|
if(!count) { |
|
g[count++] = 0.0 |
|
} |
|
g.length = count |
|
return g |
|
} |
|
},{}],239:[function(require,module,exports){ |
|
"use strict" |
|
|
|
module.exports = linearExpansionSum |
|
|
|
//Easy case: Add two scalars |
|
function scalarScalar(a, b) { |
|
var x = a + b |
|
var bv = x - a |
|
var av = x - bv |
|
var br = b - bv |
|
var ar = a - av |
|
var y = ar + br |
|
if(y) { |
|
return [y, x] |
|
} |
|
return [x] |
|
} |
|
|
|
function linearExpansionSum(e, f) { |
|
var ne = e.length|0 |
|
var nf = f.length|0 |
|
if(ne === 1 && nf === 1) { |
|
return scalarScalar(e[0], f[0]) |
|
} |
|
var n = ne + nf |
|
var g = new Array(n) |
|
var count = 0 |
|
var eptr = 0 |
|
var fptr = 0 |
|
var abs = Math.abs |
|
var ei = e[eptr] |
|
var ea = abs(ei) |
|
var fi = f[fptr] |
|
var fa = abs(fi) |
|
var a, b |
|
if(ea < fa) { |
|
b = ei |
|
eptr += 1 |
|
if(eptr < ne) { |
|
ei = e[eptr] |
|
ea = abs(ei) |
|
} |
|
} else { |
|
b = fi |
|
fptr += 1 |
|
if(fptr < nf) { |
|
fi = f[fptr] |
|
fa = abs(fi) |
|
} |
|
} |
|
if((eptr < ne && ea < fa) || (fptr >= nf)) { |
|
a = ei |
|
eptr += 1 |
|
if(eptr < ne) { |
|
ei = e[eptr] |
|
ea = abs(ei) |
|
} |
|
} else { |
|
a = fi |
|
fptr += 1 |
|
if(fptr < nf) { |
|
fi = f[fptr] |
|
fa = abs(fi) |
|
} |
|
} |
|
var x = a + b |
|
var bv = x - a |
|
var y = b - bv |
|
var q0 = y |
|
var q1 = x |
|
var _x, _bv, _av, _br, _ar |
|
while(eptr < ne && fptr < nf) { |
|
if(ea < fa) { |
|
a = ei |
|
eptr += 1 |
|
if(eptr < ne) { |
|
ei = e[eptr] |
|
ea = abs(ei) |
|
} |
|
} else { |
|
a = fi |
|
fptr += 1 |
|
if(fptr < nf) { |
|
fi = f[fptr] |
|
fa = abs(fi) |
|
} |
|
} |
|
b = q0 |
|
x = a + b |
|
bv = x - a |
|
y = b - bv |
|
if(y) { |
|
g[count++] = y |
|
} |
|
_x = q1 + x |
|
_bv = _x - q1 |
|
_av = _x - _bv |
|
_br = x - _bv |
|
_ar = q1 - _av |
|
q0 = _ar + _br |
|
q1 = _x |
|
} |
|
while(eptr < ne) { |
|
a = ei |
|
b = q0 |
|
x = a + b |
|
bv = x - a |
|
y = b - bv |
|
if(y) { |
|
g[count++] = y |
|
} |
|
_x = q1 + x |
|
_bv = _x - q1 |
|
_av = _x - _bv |
|
_br = x - _bv |
|
_ar = q1 - _av |
|
q0 = _ar + _br |
|
q1 = _x |
|
eptr += 1 |
|
if(eptr < ne) { |
|
ei = e[eptr] |
|
} |
|
} |
|
while(fptr < nf) { |
|
a = fi |
|
b = q0 |
|
x = a + b |
|
bv = x - a |
|
y = b - bv |
|
if(y) { |
|
g[count++] = y |
|
} |
|
_x = q1 + x |
|
_bv = _x - q1 |
|
_av = _x - _bv |
|
_br = x - _bv |
|
_ar = q1 - _av |
|
q0 = _ar + _br |
|
q1 = _x |
|
fptr += 1 |
|
if(fptr < nf) { |
|
fi = f[fptr] |
|
} |
|
} |
|
if(q0) { |
|
g[count++] = q0 |
|
} |
|
if(q1) { |
|
g[count++] = q1 |
|
} |
|
if(!count) { |
|
g[count++] = 0.0 |
|
} |
|
g.length = count |
|
return g |
|
} |
|
},{}],240:[function(require,module,exports){ |
|
'use strict' |
|
|
|
module.exports = extractContour |
|
|
|
var ndarray = require('ndarray') |
|
var pool = require('typedarray-pool') |
|
var ndsort = require('ndarray-sort') |
|
|
|
var contourAlgorithm = require('./lib/codegen') |
|
|
|
function getDimension(cells) { |
|
var numCells = cells.length |
|
var d = 0 |
|
for(var i=0; i<numCells; ++i) { |
|
d = Math.max(d, cells[i].length)|0 |
|
} |
|
return d-1 |
|
} |
|
|
|
function getSigns(values, level) { |
|
var numVerts = values.length |
|
var vertexSigns = pool.mallocUint8(numVerts) |
|
for(var i=0; i<numVerts; ++i) { |
|
vertexSigns[i] = (values[i] < level)|0 |
|
} |
|
return vertexSigns |
|
} |
|
|
|
function getEdges(cells, d) { |
|
var numCells = cells.length |
|
var maxEdges = ((d * (d+1)/2) * numCells)|0 |
|
var edges = pool.mallocUint32(maxEdges*2) |
|
var ePtr = 0 |
|
for(var i=0; i<numCells; ++i) { |
|
var c = cells[i] |
|
var d = c.length |
|
for(var j=0; j<d; ++j) { |
|
for(var k=0; k<j; ++k) { |
|
var a = c[k] |
|
var b = c[j] |
|
edges[ePtr++] = Math.min(a,b)|0 |
|
edges[ePtr++] = Math.max(a,b)|0 |
|
} |
|
} |
|
} |
|
var nedges = (ePtr/2)|0 |
|
ndsort(ndarray(edges, [nedges,2])) |
|
var ptr = 2 |
|
for(var i=2; i<ePtr; i+=2) { |
|
if(edges[i-2] === edges[i] && |
|
edges[i-1] === edges[i+1]) { |
|
continue |
|
} |
|
edges[ptr++] = edges[i] |
|
edges[ptr++] = edges[i+1] |
|
} |
|
|
|
return ndarray(edges, [(ptr/2)|0, 2]) |
|
} |
|
|
|
function getCrossingWeights(edges, values, signs, level) { |
|
var edata = edges.data |
|
var numEdges = edges.shape[0] |
|
var weights = pool.mallocDouble(numEdges) |
|
var ptr = 0 |
|
for(var i=0; i<numEdges; ++i) { |
|
var a = edata[2*i] |
|
var b = edata[2*i+1] |
|
if(signs[a] === signs[b]) { |
|
continue |
|
} |
|
var va = values[a] |
|
var vb = values[b] |
|
edata[2*ptr] = a |
|
edata[2*ptr+1] = b |
|
weights[ptr++] = (vb - level) / (vb - va) |
|
} |
|
edges.shape[0] = ptr |
|
return ndarray(weights, [ptr]) |
|
} |
|
|
|
function getCascade(edges, numVerts) { |
|
var result = pool.mallocInt32(numVerts*2) |
|
var numEdges = edges.shape[0] |
|
var edata = edges.data |
|
result[0] = 0 |
|
var lastV = 0 |
|
for(var i=0; i<numEdges; ++i) { |
|
var a = edata[2*i] |
|
if(a !== lastV) { |
|
result[2*lastV+1] = i |
|
while(++lastV < a) { |
|
result[2*lastV] = i |
|
result[2*lastV+1] = i |
|
} |
|
result[2*lastV] = i |
|
} |
|
} |
|
result[2*lastV+1] = numEdges |
|
while(++lastV < numVerts) { |
|
result[2*lastV] = result[2*lastV+1] = numEdges |
|
} |
|
return result |
|
} |
|
|
|
function unpackEdges(edges) { |
|
var ne = edges.shape[0]|0 |
|
var edata = edges.data |
|
var result = new Array(ne) |
|
for(var i=0; i<ne; ++i) { |
|
result[i] = [edata[2*i], edata[2*i+1]] |
|
} |
|
return result |
|
} |
|
|
|
function extractContour(cells, values, level, d) { |
|
level = level||0.0 |
|
|
|
//If user didn't specify `d`, use brute force scan |
|
if(typeof d === 'undefined') { |
|
d = getDimension(cells) |
|
} |
|
|
|
//Count number of cells |
|
var numCells = cells.length |
|
if(numCells === 0 || d < 1) { |
|
return { |
|
cells: [], |
|
vertexIds: [], |
|
vertexWeights: [] |
|
} |
|
} |
|
|
|
//Read in vertex signs |
|
var vertexSigns = getSigns(values, +level) |
|
|
|
//First get 1-skeleton, find all crossings |
|
var edges = getEdges(cells, d) |
|
var weights = getCrossingWeights(edges, values, vertexSigns, +level) |
|
|
|
//Build vertex cascade to speed up binary search |
|
var vcascade = getCascade(edges, values.length|0) |
|
|
|
//Then construct cells |
|
var faces = contourAlgorithm(d)(cells, edges.data, vcascade, vertexSigns) |
|
|
|
//Unpack data into pretty format |
|
var uedges = unpackEdges(edges) |
|
var uweights = [].slice.call(weights.data, 0, weights.shape[0]) |
|
|
|
//Release data |
|
pool.free(vertexSigns) |
|
pool.free(edges.data) |
|
pool.free(weights.data) |
|
pool.free(vcascade) |
|
|
|
return { |
|
cells: faces, |
|
vertexIds: uedges, |
|
vertexWeights: uweights |
|
} |
|
} |
|
},{"./lib/codegen":241,"ndarray":208,"ndarray-sort":207,"typedarray-pool":257}],241:[function(require,module,exports){ |
|
'use strict' |
|
|
|
module.exports = getPolygonizer |
|
|
|
var pool = require('typedarray-pool') |
|
var createMSTable = require('marching-simplex-table') |
|
|
|
var CACHE = {} |
|
|
|
function createCellPolygonizer(d) { |
|
var maxCellSize = 0 |
|
var tables = new Array(d+1) |
|
tables[0] = [ [] ] |
|
for(var i=1; i<=d; ++i) { |
|
var tab = tables[i] = createMSTable(i) |
|
for(var j=0; j<tab.length; ++j) { |
|
maxCellSize = Math.max(maxCellSize, tab[i].length) |
|
} |
|
} |
|
|
|
var code = [ |
|
'function B(C,E,i,j){', |
|
'var a=Math.min(i,j)|0,b=Math.max(i,j)|0,l=C[2*a],h=C[2*a+1];', |
|
'while(l<h){', |
|
'var m=(l+h)>>1,v=E[2*m+1];', |
|
'if(v===b){return m}', |
|
'if(b<v){h=m}else{l=m+1}', |
|
'}', |
|
'return l;', |
|
'};', |
|
'function getContour', d, 'd(F,E,C,S){', |
|
'var n=F.length,R=[];', |
|
'for(var i=0;i<n;++i){var c=F[i],l=c.length;' |
|
] |
|
|
|
function generateCase(facets) { |
|
if(facets.length <= 0) { |
|
return |
|
} |
|
code.push('R.push(') |
|
for(var i=0; i<facets.length; ++i) { |
|
var facet = facets[i] |
|
if(i > 0) { |
|
code.push(',') |
|
} |
|
code.push('[') |
|
for(var j=0; j<facet.length; ++j) { |
|
var f = facet[j] |
|
if(j > 0) { |
|
code.push(',') |
|
} |
|
code.push('B(C,E,c[', f[0], '],c[', f[1], '])') |
|
} |
|
code.push(']') |
|
} |
|
code.push(');') |
|
} |
|
|
|
for(var i=d+1; i>1; --i) { |
|
if(i < d+1) { |
|
code.push('else ') |
|
} |
|
code.push('if(l===', i, '){') |
|
|
|
//Generate mask |
|
var maskStr = [] |
|
for(var j=0; j<i; ++j) { |
|
maskStr.push('(S[c['+j+']]<<'+j+')') |
|
} |
|
|
|
//Perform table look up |
|
code.push('var M=', maskStr.join('+'), |
|
';if(M===0||M===', (1<<i)-1, |
|
'){continue}switch(M){') |
|
|
|
var tab = tables[i-1] |
|
for(var j=0; j<tab.length; ++j) { |
|
code.push('case ', j, ':') |
|
generateCase(tab[j]) |
|
code.push('break;') |
|
} |
|
code.push('}}') |
|
} |
|
code.push('}return R;};return getContour', d, 'd') |
|
|
|
var proc = new Function('pool', code.join('')) |
|
return proc(pool) |
|
} |
|
|
|
function getPolygonizer(d) { |
|
var alg = CACHE[d] |
|
if(!alg) { |
|
alg = CACHE[d] = createCellPolygonizer(d) |
|
} |
|
return alg |
|
} |
|
},{"marching-simplex-table":193,"typedarray-pool":257}],242:[function(require,module,exports){ |
|
"use strict"; "use restrict"; |
|
|
|
var bits = require("bit-twiddle") |
|
, UnionFind = require("union-find") |
|
|
|
//Returns the dimension of a cell complex |
|
function dimension(cells) { |
|
var d = 0 |
|
, max = Math.max |
|
for(var i=0, il=cells.length; i<il; ++i) { |
|
d = max(d, cells[i].length) |
|
} |
|
return d-1 |
|
} |
|
exports.dimension = dimension |
|
|
|
//Counts the number of vertices in faces |
|
function countVertices(cells) { |
|
var vc = -1 |
|
, max = Math.max |
|
for(var i=0, il=cells.length; i<il; ++i) { |
|
var c = cells[i] |
|
for(var j=0, jl=c.length; j<jl; ++j) { |
|
vc = max(vc, c[j]) |
|
} |
|
} |
|
return vc+1 |
|
} |
|
exports.countVertices = countVertices |
|
|
|
//Returns a deep copy of cells |
|
function cloneCells(cells) { |
|
var ncells = new Array(cells.length) |
|
for(var i=0, il=cells.length; i<il; ++i) { |
|
ncells[i] = cells[i].slice(0) |
|
} |
|
return ncells |
|
} |
|
exports.cloneCells = cloneCells |
|
|
|
//Ranks a pair of cells up to permutation |
|
function compareCells(a, b) { |
|
var n = a.length |
|
, t = a.length - b.length |
|
, min = Math.min |
|
if(t) { |
|
return t |
|
} |
|
switch(n) { |
|
case 0: |
|
return 0; |
|
case 1: |
|
return a[0] - b[0]; |
|
case 2: |
|
var d = a[0]+a[1]-b[0]-b[1] |
|
if(d) { |
|
return d |
|
} |
|
return min(a[0],a[1]) - min(b[0],b[1]) |
|
case 3: |
|
var l1 = a[0]+a[1] |
|
, m1 = b[0]+b[1] |
|
d = l1+a[2] - (m1+b[2]) |
|
if(d) { |
|
return d |
|
} |
|
var l0 = min(a[0], a[1]) |
|
, m0 = min(b[0], b[1]) |
|
, d = min(l0, a[2]) - min(m0, b[2]) |
|
if(d) { |
|
return d |
|
} |
|
return min(l0+a[2], l1) - min(m0+b[2], m1) |
|
|
|
//TODO: Maybe optimize n=4 as well? |
|
|
|
default: |
|
var as = a.slice(0) |
|
as.sort() |
|
var bs = b.slice(0) |
|
bs.sort() |
|
for(var i=0; i<n; ++i) { |
|
t = as[i] - bs[i] |
|
if(t) { |
|
return t |
|
} |
|
} |
|
return 0 |
|
} |
|
} |
|
exports.compareCells = compareCells |
|
|
|
function compareZipped(a, b) { |
|
return compareCells(a[0], b[0]) |
|
} |
|
|
|
//Puts a cell complex into normal order for the purposes of findCell queries |
|
function normalize(cells, attr) { |
|
if(attr) { |
|
var len = cells.length |
|
var zipped = new Array(len) |
|
for(var i=0; i<len; ++i) { |
|
zipped[i] = [cells[i], attr[i]] |
|
} |
|
zipped.sort(compareZipped) |
|
for(var i=0; i<len; ++i) { |
|
cells[i] = zipped[i][0] |
|
attr[i] = zipped[i][1] |
|
} |
|
return cells |
|
} else { |
|
cells.sort(compareCells) |
|
return cells |
|
} |
|
} |
|
exports.normalize = normalize |
|
|
|
//Removes all duplicate cells in the complex |
|
function unique(cells) { |
|
if(cells.length === 0) { |
|
return [] |
|
} |
|
var ptr = 1 |
|
, len = cells.length |
|
for(var i=1; i<len; ++i) { |
|
var a = cells[i] |
|
if(compareCells(a, cells[i-1])) { |
|
if(i === ptr) { |
|
ptr++ |
|
continue |
|
} |
|
cells[ptr++] = a |
|
} |
|
} |
|
cells.length = ptr |
|
return cells |
|
} |
|
exports.unique = unique; |
|
|
|
//Finds a cell in a normalized cell complex |
|
function findCell(cells, c) { |
|
var lo = 0 |
|
, hi = cells.length-1 |
|
, r = -1 |
|
while (lo <= hi) { |
|
var mid = (lo + hi) >> 1 |
|
, s = compareCells(cells[mid], c) |
|
if(s <= 0) { |
|
if(s === 0) { |
|
r = mid |
|
} |
|
lo = mid + 1 |
|
} else if(s > 0) { |
|
hi = mid - 1 |
|
} |
|
} |
|
return r |
|
} |
|
exports.findCell = findCell; |
|
|
|
//Builds an index for an n-cell. This is more general than dual, but less efficient |
|
function incidence(from_cells, to_cells) { |
|
var index = new Array(from_cells.length) |
|
for(var i=0, il=index.length; i<il; ++i) { |
|
index[i] = [] |
|
} |
|
var b = [] |
|
for(var i=0, n=to_cells.length; i<n; ++i) { |
|
var c = to_cells[i] |
|
var cl = c.length |
|
for(var k=1, kn=(1<<cl); k<kn; ++k) { |
|
b.length = bits.popCount(k) |
|
var l = 0 |
|
for(var j=0; j<cl; ++j) { |
|
if(k & (1<<j)) { |
|
b[l++] = c[j] |
|
} |
|
} |
|
var idx=findCell(from_cells, b) |
|
if(idx < 0) { |
|
continue |
|
} |
|
while(true) { |
|
index[idx++].push(i) |
|
if(idx >= from_cells.length || compareCells(from_cells[idx], b) !== 0) { |
|
break |
|
} |
|
} |
|
} |
|
} |
|
return index |
|
} |
|
exports.incidence = incidence |
|
|
|
//Computes the dual of the mesh. This is basically an optimized version of buildIndex for the situation where from_cells is just the list of vertices |
|
function dual(cells, vertex_count) { |
|
if(!vertex_count) { |
|
return incidence(unique(skeleton(cells, 0)), cells, 0) |
|
} |
|
var res = new Array(vertex_count) |
|
for(var i=0; i<vertex_count; ++i) { |
|
res[i] = [] |
|
} |
|
for(var i=0, len=cells.length; i<len; ++i) { |
|
var c = cells[i] |
|
for(var j=0, cl=c.length; j<cl; ++j) { |
|
res[c[j]].push(i) |
|
} |
|
} |
|
return res |
|
} |
|
exports.dual = dual |
|
|
|
//Enumerates all cells in the complex |
|
function explode(cells) { |
|
var result = [] |
|
for(var i=0, il=cells.length; i<il; ++i) { |
|
var c = cells[i] |
|
, cl = c.length|0 |
|
for(var j=1, jl=(1<<cl); j<jl; ++j) { |
|
var b = [] |
|
for(var k=0; k<cl; ++k) { |
|
if((j >>> k) & 1) { |
|
b.push(c[k]) |
|
} |
|
} |
|
result.push(b) |
|
} |
|
} |
|
return normalize(result) |
|
} |
|
exports.explode = explode |
|
|
|
//Enumerates all of the n-cells of a cell complex |
|
function skeleton(cells, n) { |
|
if(n < 0) { |
|
return [] |
|
} |
|
var result = [] |
|
, k0 = (1<<(n+1))-1 |
|
for(var i=0; i<cells.length; ++i) { |
|
var c = cells[i] |
|
for(var k=k0; k<(1<<c.length); k=bits.nextCombination(k)) { |
|
var b = new Array(n+1) |
|
, l = 0 |
|
for(var j=0; j<c.length; ++j) { |
|
if(k & (1<<j)) { |
|
b[l++] = c[j] |
|
} |
|
} |
|
result.push(b) |
|
} |
|
} |
|
return normalize(result) |
|
} |
|
exports.skeleton = skeleton; |
|
|
|
//Computes the boundary of all cells, does not remove duplicates |
|
function boundary(cells) { |
|
var res = [] |
|
for(var i=0,il=cells.length; i<il; ++i) { |
|
var c = cells[i] |
|
for(var j=0,cl=c.length; j<cl; ++j) { |
|
var b = new Array(c.length-1) |
|
for(var k=0, l=0; k<cl; ++k) { |
|
if(k !== j) { |
|
b[l++] = c[k] |
|
} |
|
} |
|
res.push(b) |
|
} |
|
} |
|
return normalize(res) |
|
} |
|
exports.boundary = boundary; |
|
|
|
//Computes connected components for a dense cell complex |
|
function connectedComponents_dense(cells, vertex_count) { |
|
var labels = new UnionFind(vertex_count) |
|
for(var i=0; i<cells.length; ++i) { |
|
var c = cells[i] |
|
for(var j=0; j<c.length; ++j) { |
|
for(var k=j+1; k<c.length; ++k) { |
|
labels.link(c[j], c[k]) |
|
} |
|
} |
|
} |
|
var components = [] |
|
, component_labels = labels.ranks |
|
for(var i=0; i<component_labels.length; ++i) { |
|
component_labels[i] = -1 |
|
} |
|
for(var i=0; i<cells.length; ++i) { |
|
var l = labels.find(cells[i][0]) |
|
if(component_labels[l] < 0) { |
|
component_labels[l] = components.length |
|
components.push([cells[i].slice(0)]) |
|
} else { |
|
components[component_labels[l]].push(cells[i].slice(0)) |
|
} |
|
} |
|
return components |
|
} |
|
|
|
//Computes connected components for a sparse graph |
|
function connectedComponents_sparse(cells) { |
|
var vertices = unique(normalize(skeleton(cells, 0))) |
|
, labels = new UnionFind(vertices.length) |
|
for(var i=0; i<cells.length; ++i) { |
|
var c = cells[i] |
|
for(var j=0; j<c.length; ++j) { |
|
var vj = findCell(vertices, [c[j]]) |
|
for(var k=j+1; k<c.length; ++k) { |
|
labels.link(vj, findCell(vertices, [c[k]])) |
|
} |
|
} |
|
} |
|
var components = [] |
|
, component_labels = labels.ranks |
|
for(var i=0; i<component_labels.length; ++i) { |
|
component_labels[i] = -1 |
|
} |
|
for(var i=0; i<cells.length; ++i) { |
|
var l = labels.find(findCell(vertices, [cells[i][0]])); |
|
if(component_labels[l] < 0) { |
|
component_labels[l] = components.length |
|
components.push([cells[i].slice(0)]) |
|
} else { |
|
components[component_labels[l]].push(cells[i].slice(0)) |
|
} |
|
} |
|
return components |
|
} |
|
|
|
//Computes connected components for a cell complex |
|
function connectedComponents(cells, vertex_count) { |
|
if(vertex_count) { |
|
return connectedComponents_dense(cells, vertex_count) |
|
} |
|
return connectedComponents_sparse(cells) |
|
} |
|
exports.connectedComponents = connectedComponents |
|
|
|
},{"bit-twiddle":36,"union-find":258}],243:[function(require,module,exports){ |
|
arguments[4][36][0].apply(exports,arguments) |
|
},{"dup":36}],244:[function(require,module,exports){ |
|
arguments[4][242][0].apply(exports,arguments) |
|
},{"bit-twiddle":243,"dup":242,"union-find":245}],245:[function(require,module,exports){ |
|
"use strict"; "use restrict"; |
|
|
|
module.exports = UnionFind; |
|
|
|
function UnionFind(count) { |
|
this.roots = new Array(count); |
|
this.ranks = new Array(count); |
|
|
|
for(var i=0; i<count; ++i) { |
|
this.roots[i] = i; |
|
this.ranks[i] = 0; |
|
} |
|
} |
|
|
|
UnionFind.prototype.length = function() { |
|
return this.roots.length; |
|
} |
|
|
|
UnionFind.prototype.makeSet = function() { |
|
var n = this.roots.length; |
|
this.roots.push(n); |
|
this.ranks.push(0); |
|
return n; |
|
} |
|
|
|
UnionFind.prototype.find = function(x) { |
|
var roots = this.roots; |
|
while(roots[x] !== x) { |
|
var y = roots[x]; |
|
roots[x] = roots[y]; |
|
x = y; |
|
} |
|
return x; |
|
} |
|
|
|
UnionFind.prototype.link = function(x, y) { |
|
var xr = this.find(x) |
|
, yr = this.find(y); |
|
if(xr === yr) { |
|
return; |
|
} |
|
var ranks = this.ranks |
|
, roots = this.roots |
|
, xd = ranks[xr] |
|
, yd = ranks[yr]; |
|
if(xd < yd) { |
|
roots[xr] = yr; |
|
} else if(yd < xd) { |
|
roots[yr] = xr; |
|
} else { |
|
roots[yr] = xr; |
|
++ranks[xr]; |
|
} |
|
} |
|
|
|
|
|
},{}],246:[function(require,module,exports){ |
|
"use strict" |
|
|
|
module.exports = simplifyPolygon |
|
|
|
var orient = require("robust-orientation") |
|
var sc = require("simplicial-complex") |
|
|
|
function errorWeight(base, a, b) { |
|
var area = Math.abs(orient(base, a, b)) |
|
var perim = Math.sqrt(Math.pow(a[0] - b[0], 2) + Math.pow(a[1]-b[1], 2)) |
|
return area / perim |
|
} |
|
|
|
function simplifyPolygon(cells, positions, minArea) { |
|
|
|
var n = positions.length |
|
var nc = cells.length |
|
var inv = new Array(n) |
|
var outv = new Array(n) |
|
var weights = new Array(n) |
|
var dead = new Array(n) |
|
|
|
//Initialize tables |
|
for(var i=0; i<n; ++i) { |
|
inv[i] = outv[i] = -1 |
|
weights[i] = Infinity |
|
dead[i] = false |
|
} |
|
|
|
//Compute neighbors |
|
for(var i=0; i<nc; ++i) { |
|
var c = cells[i] |
|
if(c.length !== 2) { |
|
throw new Error("Input must be a graph") |
|
} |
|
var s = c[1] |
|
var t = c[0] |
|
if(outv[t] !== -1) { |
|
outv[t] = -2 |
|
} else { |
|
outv[t] = s |
|
} |
|
if(inv[s] !== -1) { |
|
inv[s] = -2 |
|
} else { |
|
inv[s] = t |
|
} |
|
} |
|
|
|
//Updates the weight for vertex i |
|
function computeWeight(i) { |
|
if(dead[i]) { |
|
return Infinity |
|
} |
|
//TODO: Check that the line segment doesn't cross once simplified |
|
var s = inv[i] |
|
var t = outv[i] |
|
if((s<0) || (t<0)) { |
|
return Infinity |
|
} else { |
|
return errorWeight(positions[i], positions[s], positions[t]) |
|
} |
|
} |
|
|
|
//Swaps two nodes on the heap (i,j) are the index of the nodes |
|
function heapSwap(i,j) { |
|
var a = heap[i] |
|
var b = heap[j] |
|
heap[i] = b |
|
heap[j] = a |
|
index[a] = j |
|
index[b] = i |
|
} |
|
|
|
//Returns the weight of node i on the heap |
|
function heapWeight(i) { |
|
return weights[heap[i]] |
|
} |
|
|
|
function heapParent(i) { |
|
if(i & 1) { |
|
return (i - 1) >> 1 |
|
} |
|
return (i >> 1) - 1 |
|
} |
|
|
|
//Bubble element i down the heap |
|
function heapDown(i) { |
|
var w = heapWeight(i) |
|
while(true) { |
|
var tw = w |
|
var left = 2*i + 1 |
|
var right = 2*(i + 1) |
|
var next = i |
|
if(left < heapCount) { |
|
var lw = heapWeight(left) |
|
if(lw < tw) { |
|
next = left |
|
tw = lw |
|
} |
|
} |
|
if(right < heapCount) { |
|
var rw = heapWeight(right) |
|
if(rw < tw) { |
|
next = right |
|
} |
|
} |
|
if(next === i) { |
|
return i |
|
} |
|
heapSwap(i, next) |
|
i = next |
|
} |
|
} |
|
|
|
//Bubbles element i up the heap |
|
function heapUp(i) { |
|
var w = heapWeight(i) |
|
while(i > 0) { |
|
var parent = heapParent(i) |
|
if(parent >= 0) { |
|
var pw = heapWeight(parent) |
|
if(w < pw) { |
|
heapSwap(i, parent) |
|
i = parent |
|
continue |
|
} |
|
} |
|
return i |
|
} |
|
} |
|
|
|
//Pop minimum element |
|
function heapPop() { |
|
if(heapCount > 0) { |
|
var head = heap[0] |
|
heapSwap(0, heapCount-1) |
|
heapCount -= 1 |
|
heapDown(0) |
|
return head |
|
} |
|
return -1 |
|
} |
|
|
|
//Update heap item i |
|
function heapUpdate(i, w) { |
|
var a = heap[i] |
|
if(weights[a] === w) { |
|
return i |
|
} |
|
weights[a] = -Infinity |
|
heapUp(i) |
|
heapPop() |
|
weights[a] = w |
|
heapCount += 1 |
|
return heapUp(heapCount-1) |
|
} |
|
|
|
//Kills a vertex (assume vertex already removed from heap) |
|
function kill(i) { |
|
if(dead[i]) { |
|
return |
|
} |
|
//Kill vertex |
|
dead[i] = true |
|
//Fixup topology |
|
var s = inv[i] |
|
var t = outv[i] |
|
if(inv[t] >= 0) { |
|
inv[t] = s |
|
} |
|
if(outv[s] >= 0) { |
|
outv[s] = t |
|
} |
|
|
|
//Update weights on s and t |
|
if(index[s] >= 0) { |
|
heapUpdate(index[s], computeWeight(s)) |
|
} |
|
if(index[t] >= 0) { |
|
heapUpdate(index[t], computeWeight(t)) |
|
} |
|
} |
|
|
|
//Initialize weights and heap |
|
var heap = [] |
|
var index = new Array(n) |
|
for(var i=0; i<n; ++i) { |
|
var w = weights[i] = computeWeight(i) |
|
if(w < Infinity) { |
|
index[i] = heap.length |
|
heap.push(i) |
|
} else { |
|
index[i] = -1 |
|
} |
|
} |
|
var heapCount = heap.length |
|
for(var i=heapCount>>1; i>=0; --i) { |
|
heapDown(i) |
|
} |
|
|
|
//Kill vertices |
|
while(true) { |
|
var hmin = heapPop() |
|
if((hmin < 0) || (weights[hmin] > minArea)) { |
|
break |
|
} |
|
kill(hmin) |
|
} |
|
|
|
//Build collapsed vertex table |
|
var npositions = [] |
|
for(var i=0; i<n; ++i) { |
|
if(!dead[i]) { |
|
index[i] = npositions.length |
|
npositions.push(positions[i].slice()) |
|
} |
|
} |
|
var nv = npositions.length |
|
|
|
function tortoiseHare(seq, start) { |
|
if(seq[start] < 0) { |
|
return start |
|
} |
|
var t = start |
|
var h = start |
|
do { |
|
//Walk two steps with h |
|
var nh = seq[h] |
|
if(!dead[h] || nh < 0 || nh === h) { |
|
break |
|
} |
|
h = nh |
|
nh = seq[h] |
|
if(!dead[h] || nh < 0 || nh === h) { |
|
break |
|
} |
|
h = nh |
|
|
|
//Walk one step with t |
|
t = seq[t] |
|
} while(t !== h) |
|
//Compress cycles |
|
for(var v=start; v!==h; v = seq[v]) { |
|
seq[v] = h |
|
} |
|
return h |
|
} |
|
|
|
var ncells = [] |
|
cells.forEach(function(c) { |
|
var tin = tortoiseHare(inv, c[0]) |
|
var tout = tortoiseHare(outv, c[1]) |
|
if(tin >= 0 && tout >= 0 && tin !== tout) { |
|
var cin = index[tin] |
|
var cout = index[tout] |
|
if(cin !== cout) { |
|
ncells.push([ cin, cout ]) |
|
} |
|
} |
|
}) |
|
|
|
//Normalize result |
|
sc.unique(sc.normalize(ncells)) |
|
|
|
//Return final list of cells |
|
return { |
|
positions: npositions, |
|
edges: ncells |
|
} |
|
} |
|
},{"robust-orientation":234,"simplicial-complex":244}],247:[function(require,module,exports){ |
|
"use strict" |
|
|
|
module.exports = orderSegments |
|
|
|
var orient = require("robust-orientation") |
|
|
|
function horizontalOrder(a, b) { |
|
var bl, br |
|
if(b[0][0] < b[1][0]) { |
|
bl = b[0] |
|
br = b[1] |
|
} else if(b[0][0] > b[1][0]) { |
|
bl = b[1] |
|
br = b[0] |
|
} else { |
|
var alo = Math.min(a[0][1], a[1][1]) |
|
var ahi = Math.max(a[0][1], a[1][1]) |
|
var blo = Math.min(b[0][1], b[1][1]) |
|
var bhi = Math.max(b[0][1], b[1][1]) |
|
if(ahi < blo) { |
|
return ahi - blo |
|
} |
|
if(alo > bhi) { |
|
return alo - bhi |
|
} |
|
return ahi - bhi |
|
} |
|
var al, ar |
|
if(a[0][1] < a[1][1]) { |
|
al = a[0] |
|
ar = a[1] |
|
} else { |
|
al = a[1] |
|
ar = a[0] |
|
} |
|
var d = orient(br, bl, al) |
|
if(d) { |
|
return d |
|
} |
|
d = orient(br, bl, ar) |
|
if(d) { |
|
return d |
|
} |
|
return ar - br |
|
} |
|
|
|
function orderSegments(b, a) { |
|
var al, ar |
|
if(a[0][0] < a[1][0]) { |
|
al = a[0] |
|
ar = a[1] |
|
} else if(a[0][0] > a[1][0]) { |
|
al = a[1] |
|
ar = a[0] |
|
} else { |
|
return horizontalOrder(a, b) |
|
} |
|
var bl, br |
|
if(b[0][0] < b[1][0]) { |
|
bl = b[0] |
|
br = b[1] |
|
} else if(b[0][0] > b[1][0]) { |
|
bl = b[1] |
|
br = b[0] |
|
} else { |
|
return -horizontalOrder(b, a) |
|
} |
|
var d1 = orient(al, ar, br) |
|
var d2 = orient(al, ar, bl) |
|
if(d1 < 0) { |
|
if(d2 <= 0) { |
|
return d1 |
|
} |
|
} else if(d1 > 0) { |
|
if(d2 >= 0) { |
|
return d1 |
|
} |
|
} else if(d2) { |
|
return d2 |
|
} |
|
d1 = orient(br, bl, ar) |
|
d2 = orient(br, bl, al) |
|
if(d1 < 0) { |
|
if(d2 <= 0) { |
|
return d1 |
|
} |
|
} else if(d1 > 0) { |
|
if(d2 >= 0) { |
|
return d1 |
|
} |
|
} else if(d2) { |
|
return d2 |
|
} |
|
return ar[0] - br[0] |
|
} |
|
},{"robust-orientation":234}],248:[function(require,module,exports){ |
|
"use strict" |
|
|
|
module.exports = createSlabDecomposition |
|
|
|
var bounds = require("binary-search-bounds") |
|
var createRBTree = require("functional-red-black-tree") |
|
var orient = require("robust-orientation") |
|
var orderSegments = require("./lib/order-segments") |
|
|
|
function SlabDecomposition(slabs, coordinates, horizontal) { |
|
this.slabs = slabs |
|
this.coordinates = coordinates |
|
this.horizontal = horizontal |
|
} |
|
|
|
var proto = SlabDecomposition.prototype |
|
|
|
function compareHorizontal(e, y) { |
|
return e.y - y |
|
} |
|
|
|
function searchBucket(root, p) { |
|
var lastNode = null |
|
while(root) { |
|
var seg = root.key |
|
var l, r |
|
if(seg[0][0] < seg[1][0]) { |
|
l = seg[0] |
|
r = seg[1] |
|
} else { |
|
l = seg[1] |
|
r = seg[0] |
|
} |
|
var o = orient(l, r, p) |
|
if(o < 0) { |
|
root = root.left |
|
} else if(o > 0) { |
|
if(p[0] !== seg[1][0]) { |
|
lastNode = root |
|
root = root.right |
|
} else { |
|
var val = searchBucket(root.right, p) |
|
if(val) { |
|
return val |
|
} |
|
root = root.left |
|
} |
|
} else { |
|
if(p[0] !== seg[1][0]) { |
|
return root |
|
} else { |
|
var val = searchBucket(root.right, p) |
|
if(val) { |
|
return val |
|
} |
|
root = root.left |
|
} |
|
} |
|
} |
|
return lastNode |
|
} |
|
|
|
proto.castUp = function(p) { |
|
var bucket = bounds.le(this.coordinates, p[0]) |
|
if(bucket < 0) { |
|
return -1 |
|
} |
|
var root = this.slabs[bucket] |
|
var hitNode = searchBucket(this.slabs[bucket], p) |
|
var lastHit = -1 |
|
if(hitNode) { |
|
lastHit = hitNode.value |
|
} |
|
//Edge case: need to handle horizontal segments (sucks) |
|
if(this.coordinates[bucket] === p[0]) { |
|
var lastSegment = null |
|
if(hitNode) { |
|
lastSegment = hitNode.key |
|
} |
|
if(bucket > 0) { |
|
var otherHitNode = searchBucket(this.slabs[bucket-1], p) |
|
if(otherHitNode) { |
|
if(lastSegment) { |
|
if(orderSegments(otherHitNode.key, lastSegment) > 0) { |
|
lastSegment = otherHitNode.key |
|
lastHit = otherHitNode.value |
|
} |
|
} else { |
|
lastHit = otherHitNode.value |
|
lastSegment = otherHitNode.key |
|
} |
|
} |
|
} |
|
var horiz = this.horizontal[bucket] |
|
if(horiz.length > 0) { |
|
var hbucket = bounds.ge(horiz, p[1], compareHorizontal) |
|
if(hbucket < horiz.length) { |
|
var e = horiz[hbucket] |
|
if(p[1] === e.y) { |
|
if(e.closed) { |
|
return e.index |
|
} else { |
|
while(hbucket < horiz.length-1 && horiz[hbucket+1].y === p[1]) { |
|
hbucket = hbucket+1 |
|
e = horiz[hbucket] |
|
if(e.closed) { |
|
return e.index |
|
} |
|
} |
|
if(e.y === p[1] && !e.start) { |
|
hbucket = hbucket+1 |
|
if(hbucket >= horiz.length) { |
|
return lastHit |
|
} |
|
e = horiz[hbucket] |
|
} |
|
} |
|
} |
|
//Check if e is above/below last segment |
|
if(e.start) { |
|
if(lastSegment) { |
|
var o = orient(lastSegment[0], lastSegment[1], [p[0], e.y]) |
|
if(lastSegment[0][0] > lastSegment[1][0]) { |
|
o = -o |
|
} |
|
if(o > 0) { |
|
lastHit = e.index |
|
} |
|
} else { |
|
lastHit = e.index |
|
} |
|
} else if(e.y !== p[1]) { |
|
lastHit = e.index |
|
} |
|
} |
|
} |
|
} |
|
return lastHit |
|
} |
|
|
|
function IntervalSegment(y, index, start, closed) { |
|
this.y = y |
|
this.index = index |
|
this.start = start |
|
this.closed = closed |
|
} |
|
|
|
function Event(x, segment, create, index) { |
|
this.x = x |
|
this.segment = segment |
|
this.create = create |
|
this.index = index |
|
} |
|
|
|
|
|
function createSlabDecomposition(segments) { |
|
var numSegments = segments.length |
|
var numEvents = 2 * numSegments |
|
var events = new Array(numEvents) |
|
for(var i=0; i<numSegments; ++i) { |
|
var s = segments[i] |
|
var f = s[0][0] < s[1][0] |
|
events[2*i] = new Event(s[0][0], s, f, i) |
|
events[2*i+1] = new Event(s[1][0], s, !f, i) |
|
} |
|
events.sort(function(a,b) { |
|
var d = a.x - b.x |
|
if(d) { |
|
return d |
|
} |
|
d = a.create - b.create |
|
if(d) { |
|
return d |
|
} |
|
return Math.min(a.segment[0][1], a.segment[1][1]) - Math.min(b.segment[0][1], b.segment[1][1]) |
|
}) |
|
var tree = createRBTree(orderSegments) |
|
var slabs = [] |
|
var lines = [] |
|
var horizontal = [] |
|
var lastX = -Infinity |
|
for(var i=0; i<numEvents; ) { |
|
var x = events[i].x |
|
var horiz = [] |
|
while(i < numEvents) { |
|
var e = events[i] |
|
if(e.x !== x) { |
|
break |
|
} |
|
i += 1 |
|
if(e.segment[0][0] === e.x && e.segment[1][0] === e.x) { |
|
if(e.create) { |
|
if(e.segment[0][1] < e.segment[1][1]) { |
|
horiz.push(new IntervalSegment( |
|
e.segment[0][1], |
|
e.index, |
|
true, |
|
true)) |
|
horiz.push(new IntervalSegment( |
|
e.segment[1][1], |
|
e.index, |
|
false, |
|
false)) |
|
} else { |
|
horiz.push(new IntervalSegment( |
|
e.segment[1][1], |
|
e.index, |
|
true, |
|
false)) |
|
horiz.push(new IntervalSegment( |
|
e.segment[0][1], |
|
e.index, |
|
false, |
|
true)) |
|
} |
|
} |
|
} else { |
|
if(e.create) { |
|
tree = tree.insert(e.segment, e.index) |
|
} else { |
|
tree = tree.remove(e.segment) |
|
} |
|
} |
|
} |
|
slabs.push(tree.root) |
|
lines.push(x) |
|
horizontal.push(horiz) |
|
} |
|
return new SlabDecomposition(slabs, lines, horizontal) |
|
} |
|
},{"./lib/order-segments":247,"binary-search-bounds":35,"functional-red-black-tree":74,"robust-orientation":234}],249:[function(require,module,exports){ |
|
"use strict" |
|
|
|
var robustDot = require("robust-dot-product") |
|
var robustSum = require("robust-sum") |
|
|
|
module.exports = splitPolygon |
|
module.exports.positive = positive |
|
module.exports.negative = negative |
|
|
|
function planeT(p, plane) { |
|
var r = robustSum(robustDot(p, plane), [plane[plane.length-1]]) |
|
return r[r.length-1] |
|
} |
|
|
|
|
|
//Can't do this exactly and emit a floating point result |
|
function lerpW(a, wa, b, wb) { |
|
var d = wb - wa |
|
var t = -wa / d |
|
if(t < 0.0) { |
|
t = 0.0 |
|
} else if(t > 1.0) { |
|
t = 1.0 |
|
} |
|
var ti = 1.0 - t |
|
var n = a.length |
|
var r = new Array(n) |
|
for(var i=0; i<n; ++i) { |
|
r[i] = t * a[i] + ti * b[i] |
|
} |
|
return r |
|
} |
|
|
|
function splitPolygon(points, plane) { |
|
var pos = [] |
|
var neg = [] |
|
var a = planeT(points[points.length-1], plane) |
|
for(var s=points[points.length-1], t=points[0], i=0; i<points.length; ++i, s=t) { |
|
t = points[i] |
|
var b = planeT(t, plane) |
|
if((a < 0 && b > 0) || (a > 0 && b < 0)) { |
|
var p = lerpW(s, b, t, a) |
|
pos.push(p) |
|
neg.push(p.slice()) |
|
} |
|
if(b < 0) { |
|
neg.push(t.slice()) |
|
} else if(b > 0) { |
|
pos.push(t.slice()) |
|
} else { |
|
pos.push(t.slice()) |
|
neg.push(t.slice()) |
|
} |
|
a = b |
|
} |
|
return { positive: pos, negative: neg } |
|
} |
|
|
|
function positive(points, plane) { |
|
var pos = [] |
|
var a = planeT(points[points.length-1], plane) |
|
for(var s=points[points.length-1], t=points[0], i=0; i<points.length; ++i, s=t) { |
|
t = points[i] |
|
var b = planeT(t, plane) |
|
if((a < 0 && b > 0) || (a > 0 && b < 0)) { |
|
pos.push(lerpW(s, b, t, a)) |
|
} |
|
if(b >= 0) { |
|
pos.push(t.slice()) |
|
} |
|
a = b |
|
} |
|
return pos |
|
} |
|
|
|
function negative(points, plane) { |
|
var neg = [] |
|
var a = planeT(points[points.length-1], plane) |
|
for(var s=points[points.length-1], t=points[0], i=0; i<points.length; ++i, s=t) { |
|
t = points[i] |
|
var b = planeT(t, plane) |
|
if((a < 0 && b > 0) || (a > 0 && b < 0)) { |
|
neg.push(lerpW(s, b, t, a)) |
|
} |
|
if(b <= 0) { |
|
neg.push(t.slice()) |
|
} |
|
a = b |
|
} |
|
return neg |
|
} |
|
},{"robust-dot-product":231,"robust-sum":239}],250:[function(require,module,exports){ |
|
/* global window, exports, define */ |
|
|
|
!function() { |
|
'use strict' |
|
|
|
var re = { |
|
not_string: /[^s]/, |
|
not_bool: /[^t]/, |
|
not_type: /[^T]/, |
|
not_primitive: /[^v]/, |
|
number: /[diefg]/, |
|
numeric_arg: /[bcdiefguxX]/, |
|
json: /[j]/, |
|
not_json: /[^j]/, |
|
text: /^[^\x25]+/, |
|
modulo: /^\x25{2}/, |
|
placeholder: /^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-gijostTuvxX])/, |
|
key: /^([a-z_][a-z_\d]*)/i, |
|
key_access: /^\.([a-z_][a-z_\d]*)/i, |
|
index_access: /^\[(\d+)\]/, |
|
sign: /^[\+\-]/ |
|
} |
|
|
|
function sprintf(key) { |
|
// `arguments` is not an array, but should be fine for this call |
|
return sprintf_format(sprintf_parse(key), arguments) |
|
} |
|
|
|
function vsprintf(fmt, argv) { |
|
return sprintf.apply(null, [fmt].concat(argv || [])) |
|
} |
|
|
|
function sprintf_format(parse_tree, argv) { |
|
var cursor = 1, tree_length = parse_tree.length, arg, output = '', i, k, match, pad, pad_character, pad_length, is_positive, sign |
|
for (i = 0; i < tree_length; i++) { |
|
if (typeof parse_tree[i] === 'string') { |
|
output += parse_tree[i] |
|
} |
|
else if (Array.isArray(parse_tree[i])) { |
|
match = parse_tree[i] // convenience purposes only |
|
if (match[2]) { // keyword argument |
|
arg = argv[cursor] |
|
for (k = 0; k < match[2].length; k++) { |
|
if (!arg.hasOwnProperty(match[2][k])) { |
|
throw new Error(sprintf('[sprintf] property "%s" does not exist', match[2][k])) |
|
} |
|
arg = arg[match[2][k]] |
|
} |
|
} |
|
else if (match[1]) { // positional argument (explicit) |
|
arg = argv[match[1]] |
|
} |
|
else { // positional argument (implicit) |
|
arg = argv[cursor++] |
|
} |
|
|
|
if (re.not_type.test(match[8]) && re.not_primitive.test(match[8]) && arg instanceof Function) { |
|
arg = arg() |
|
} |
|
|
|
if (re.numeric_arg.test(match[8]) && (typeof arg !== 'number' && isNaN(arg))) { |
|
throw new TypeError(sprintf('[sprintf] expecting number but found %T', arg)) |
|
} |
|
|
|
if (re.number.test(match[8])) { |
|
is_positive = arg >= 0 |
|
} |
|
|
|
switch (match[8]) { |
|
case 'b': |
|
arg = parseInt(arg, 10).toString(2) |
|
break |
|
case 'c': |
|
arg = String.fromCharCode(parseInt(arg, 10)) |
|
break |
|
case 'd': |
|
case 'i': |
|
arg = parseInt(arg, 10) |
|
break |
|
case 'j': |
|
arg = JSON.stringify(arg, null, match[6] ? parseInt(match[6]) : 0) |
|
break |
|
case 'e': |
|
arg = match[7] ? parseFloat(arg).toExponential(match[7]) : parseFloat(arg).toExponential() |
|
break |
|
case 'f': |
|
arg = match[7] ? parseFloat(arg).toFixed(match[7]) : parseFloat(arg) |
|
break |
|
case 'g': |
|
arg = match[7] ? String(Number(arg.toPrecision(match[7]))) : parseFloat(arg) |
|
break |
|
case 'o': |
|
arg = (parseInt(arg, 10) >>> 0).toString(8) |
|
break |
|
case 's': |
|
arg = String(arg) |
|
arg = (match[7] ? arg.substring(0, match[7]) : arg) |
|
break |
|
case 't': |
|
arg = String(!!arg) |
|
arg = (match[7] ? arg.substring(0, match[7]) : arg) |
|
break |
|
case 'T': |
|
arg = Object.prototype.toString.call(arg).slice(8, -1).toLowerCase() |
|
arg = (match[7] ? arg.substring(0, match[7]) : arg) |
|
break |
|
case 'u': |
|
arg = parseInt(arg, 10) >>> 0 |
|
break |
|
case 'v': |
|
arg = arg.valueOf() |
|
arg = (match[7] ? arg.substring(0, match[7]) : arg) |
|
break |
|
case 'x': |
|
arg = (parseInt(arg, 10) >>> 0).toString(16) |
|
break |
|
case 'X': |
|
arg = (parseInt(arg, 10) >>> 0).toString(16).toUpperCase() |
|
break |
|
} |
|
if (re.json.test(match[8])) { |
|
output += arg |
|
} |
|
else { |
|
if (re.number.test(match[8]) && (!is_positive || match[3])) { |
|
sign = is_positive ? '+' : '-' |
|
arg = arg.toString().replace(re.sign, '') |
|
} |
|
else { |
|
sign = '' |
|
} |
|
pad_character = match[4] ? match[4] === '0' ? '0' : match[4].charAt(1) : ' ' |
|
pad_length = match[6] - (sign + arg).length |
|
pad = match[6] ? (pad_length > 0 ? pad_character.repeat(pad_length) : '') : '' |
|
output += match[5] ? sign + arg + pad : (pad_character === '0' ? sign + pad + arg : pad + sign + arg) |
|
} |
|
} |
|
} |
|
return output |
|
} |
|
|
|
var sprintf_cache = Object.create(null) |
|
|
|
function sprintf_parse(fmt) { |
|
if (sprintf_cache[fmt]) { |
|
return sprintf_cache[fmt] |
|
} |
|
|
|
var _fmt = fmt, match, parse_tree = [], arg_names = 0 |
|
while (_fmt) { |
|
if ((match = re.text.exec(_fmt)) !== null) { |
|
parse_tree.push(match[0]) |
|
} |
|
else if ((match = re.modulo.exec(_fmt)) !== null) { |
|
parse_tree.push('%') |
|
} |
|
else if ((match = re.placeholder.exec(_fmt)) !== null) { |
|
if (match[2]) { |
|
arg_names |= 1 |
|
var field_list = [], replacement_field = match[2], field_match = [] |
|
if ((field_match = re.key.exec(replacement_field)) !== null) { |
|
field_list.push(field_match[1]) |
|
while ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') { |
|
if ((field_match = re.key_access.exec(replacement_field)) !== null) { |
|
field_list.push(field_match[1]) |
|
} |
|
else if ((field_match = re.index_access.exec(replacement_field)) !== null) { |
|
field_list.push(field_match[1]) |
|
} |
|
else { |
|
throw new SyntaxError('[sprintf] failed to parse named argument key') |
|
} |
|
} |
|
} |
|
else { |
|
throw new SyntaxError('[sprintf] failed to parse named argument key') |
|
} |
|
match[2] = field_list |
|
} |
|
else { |
|
arg_names |= 2 |
|
} |
|
if (arg_names === 3) { |
|
throw new Error('[sprintf] mixing positional and named placeholders is not (yet) supported') |
|
} |
|
parse_tree.push(match) |
|
} |
|
else { |
|
throw new SyntaxError('[sprintf] unexpected placeholder') |
|
} |
|
_fmt = _fmt.substring(match[0].length) |
|
} |
|
return sprintf_cache[fmt] = parse_tree |
|
} |
|
|
|
/** |
|
* export to either browser or node.js |
|
*/ |
|
/* eslint-disable quote-props */ |
|
if (typeof exports !== 'undefined') { |
|
exports['sprintf'] = sprintf |
|
exports['vsprintf'] = vsprintf |
|
} |
|
if (typeof window !== 'undefined') { |
|
window['sprintf'] = sprintf |
|
window['vsprintf'] = vsprintf |
|
|
|
if (typeof define === 'function' && define['amd']) { |
|
define(function() { |
|
return { |
|
'sprintf': sprintf, |
|
'vsprintf': vsprintf |
|
} |
|
}) |
|
} |
|
} |
|
/* eslint-enable quote-props */ |
|
}() |
|
|
|
},{}],251:[function(require,module,exports){ |
|
"use strict" |
|
|
|
module.exports = surfaceNets |
|
|
|
var generateContourExtractor = require("ndarray-extract-contour") |
|
var triangulateCube = require("triangulate-hypercube") |
|
var zeroCrossings = require("zero-crossings") |
|
|
|
function buildSurfaceNets(order, dtype) { |
|
var dimension = order.length |
|
var code = ["'use strict';"] |
|
var funcName = "surfaceNets" + order.join("_") + "d" + dtype |
|
|
|
//Contour extraction function |
|
code.push( |
|
"var contour=genContour({", |
|
"order:[", order.join(), "],", |
|
"scalarArguments: 3,", |
|
"phase:function phaseFunc(p,a,b,c) { return (p > c)|0 },") |
|
if(dtype === "generic") { |
|
code.push("getters:[0],") |
|
} |
|
|
|
//Generate vertex function |
|
var cubeArgs = [] |
|
var extraArgs = [] |
|
for(var i=0; i<dimension; ++i) { |
|
cubeArgs.push("d" + i) |
|
extraArgs.push("d" + i) |
|
} |
|
for(var i=0; i<(1<<dimension); ++i) { |
|
cubeArgs.push("v" + i) |
|
extraArgs.push("v" + i) |
|
} |
|
for(var i=0; i<(1<<dimension); ++i) { |
|
cubeArgs.push("p" + i) |
|
extraArgs.push("p" + i) |
|
} |
|
cubeArgs.push("a", "b", "c") |
|
extraArgs.push("a", "c") |
|
code.push("vertex:function vertexFunc(", cubeArgs.join(), "){") |
|
//Mask args together |
|
var maskStr = [] |
|
for(var i=0; i<(1<<dimension); ++i) { |
|
maskStr.push("(p" + i + "<<" + i + ")") |
|
} |
|
//Generate variables and giganto switch statement |
|
code.push("var m=(", maskStr.join("+"), ")|0;if(m===0||m===", (1<<(1<<dimension))-1, "){return}") |
|
var extraFuncs = [] |
|
var currentFunc = [] |
|
if(1<<(1<<dimension) <= 128) { |
|
code.push("switch(m){") |
|
currentFunc = code |
|
} else { |
|
code.push("switch(m>>>7){") |
|
} |
|
for(var i=0; i<1<<(1<<dimension); ++i) { |
|
if(1<<(1<<dimension) > 128) { |
|
if((i%128)===0) { |
|
if(extraFuncs.length > 0) { |
|
currentFunc.push("}}") |
|
} |
|
var efName = "vExtra" + extraFuncs.length |
|
code.push("case ", (i>>>7), ":", efName, "(m&0x7f,", extraArgs.join(), ");break;") |
|
currentFunc = [ |
|
"function ", efName, "(m,", extraArgs.join(), "){switch(m){" |
|
] |
|
extraFuncs.push(currentFunc) |
|
} |
|
} |
|
currentFunc.push("case ", (i&0x7f), ":") |
|
var crossings = new Array(dimension) |
|
var denoms = new Array(dimension) |
|
var crossingCount = new Array(dimension) |
|
var bias = new Array(dimension) |
|
var totalCrossings = 0 |
|
for(var j=0; j<dimension; ++j) { |
|
crossings[j] = [] |
|
denoms[j] = [] |
|
crossingCount[j] = 0 |
|
bias[j] = 0 |
|
} |
|
for(var j=0; j<(1<<dimension); ++j) { |
|
for(var k=0; k<dimension; ++k) { |
|
var u = j ^ (1<<k) |
|
if(u > j) { |
|
continue |
|
} |
|
if(!(i&(1<<u)) !== !(i&(1<<j))) { |
|
var sign = 1 |
|
if(i&(1<<u)) { |
|
denoms[k].push("v" + u + "-v" + j) |
|
} else { |
|
denoms[k].push("v" + j + "-v" + u) |
|
sign = -sign |
|
} |
|
if(sign < 0) { |
|
crossings[k].push("-v" + j + "-v" + u) |
|
crossingCount[k] += 2 |
|
} else { |
|
crossings[k].push("v" + j + "+v" + u) |
|
crossingCount[k] -= 2 |
|
} |
|
totalCrossings += 1 |
|
for(var l=0; l<dimension; ++l) { |
|
if(l === k) { |
|
continue |
|
} |
|
if(u&(1<<l)) { |
|
bias[l] += 1 |
|
} else { |
|
bias[l] -= 1 |
|
} |
|
} |
|
} |
|
} |
|
} |
|
var vertexStr = [] |
|
for(var k=0; k<dimension; ++k) { |
|
if(crossings[k].length === 0) { |
|
vertexStr.push("d" + k + "-0.5") |
|
} else { |
|
var cStr = "" |
|
if(crossingCount[k] < 0) { |
|
cStr = crossingCount[k] + "*c" |
|
} else if(crossingCount[k] > 0) { |
|
cStr = "+" + crossingCount[k] + "*c" |
|
} |
|
var weight = 0.5 * (crossings[k].length / totalCrossings) |
|
var shift = 0.5 + 0.5 * (bias[k] / totalCrossings) |
|
vertexStr.push("d" + k + "-" + shift + "-" + weight + "*(" + crossings[k].join("+") + cStr + ")/(" + denoms[k].join("+") + ")") |
|
|
|
} |
|
} |
|
currentFunc.push("a.push([", vertexStr.join(), "]);", |
|
"break;") |
|
} |
|
code.push("}},") |
|
if(extraFuncs.length > 0) { |
|
currentFunc.push("}}") |
|
} |
|
|
|
//Create face function |
|
var faceArgs = [] |
|
for(var i=0; i<(1<<(dimension-1)); ++i) { |
|
faceArgs.push("v" + i) |
|
} |
|
faceArgs.push("c0", "c1", "p0", "p1", "a", "b", "c") |
|
code.push("cell:function cellFunc(", faceArgs.join(), "){") |
|
|
|
var facets = triangulateCube(dimension-1) |
|
code.push("if(p0){b.push(", |
|
facets.map(function(f) { |
|
return "[" + f.map(function(v) { |
|
return "v" + v |
|
}) + "]" |
|
}).join(), ")}else{b.push(", |
|
facets.map(function(f) { |
|
var e = f.slice() |
|
e.reverse() |
|
return "[" + e.map(function(v) { |
|
return "v" + v |
|
}) + "]" |
|
}).join(), |
|
")}}});function ", funcName, "(array,level){var verts=[],cells=[];contour(array,verts,cells,level);return {positions:verts,cells:cells};} return ", funcName, ";") |
|
|
|
for(var i=0; i<extraFuncs.length; ++i) { |
|
code.push(extraFuncs[i].join("")) |
|
} |
|
|
|
//Compile and link |
|
var proc = new Function("genContour", code.join("")) |
|
return proc(generateContourExtractor) |
|
} |
|
|
|
//1D case: Need to handle specially |
|
function mesh1D(array, level) { |
|
var zc = zeroCrossings(array, level) |
|
var n = zc.length |
|
var npos = new Array(n) |
|
var ncel = new Array(n) |
|
for(var i=0; i<n; ++i) { |
|
npos[i] = [ zc[i] ] |
|
ncel[i] = [ i ] |
|
} |
|
return { |
|
positions: npos, |
|
cells: ncel |
|
} |
|
} |
|
|
|
var CACHE = {} |
|
|
|
function surfaceNets(array,level) { |
|
if(array.dimension <= 0) { |
|
return { positions: [], cells: [] } |
|
} else if(array.dimension === 1) { |
|
return mesh1D(array, level) |
|
} |
|
var typesig = array.order.join() + "-" + array.dtype |
|
var proc = CACHE[typesig] |
|
var level = (+level) || 0.0 |
|
if(!proc) { |
|
proc = CACHE[typesig] = buildSurfaceNets(array.order, array.dtype) |
|
} |
|
return proc(array,level) |
|
} |
|
},{"ndarray-extract-contour":204,"triangulate-hypercube":253,"zero-crossings":266}],252:[function(require,module,exports){ |
|
'use strict' |
|
|
|
var parseUnit = require('parse-unit') |
|
|
|
module.exports = toPX |
|
|
|
var PIXELS_PER_INCH = 96 |
|
|
|
function getPropertyInPX(element, prop) { |
|
var parts = parseUnit(getComputedStyle(element).getPropertyValue(prop)) |
|
return parts[0] * toPX(parts[1], element) |
|
} |
|
|
|
//This brutal hack is needed |
|
function getSizeBrutal(unit, element) { |
|
var testDIV = document.createElement('div') |
|
testDIV.style['font-size'] = '128' + unit |
|
element.appendChild(testDIV) |
|
var size = getPropertyInPX(testDIV, 'font-size') / 128 |
|
element.removeChild(testDIV) |
|
return size |
|
} |
|
|
|
function toPX(str, element) { |
|
element = element || document.body |
|
str = (str || 'px').trim().toLowerCase() |
|
if(element === window || element === document) { |
|
element = document.body |
|
} |
|
switch(str) { |
|
case '%': //Ambiguous, not sure if we should use width or height |
|
return element.clientHeight / 100.0 |
|
case 'ch': |
|
case 'ex': |
|
return getSizeBrutal(str, element) |
|
case 'em': |
|
return getPropertyInPX(element, 'font-size') |
|
case 'rem': |
|
return getPropertyInPX(document.body, 'font-size') |
|
case 'vw': |
|
return window.innerWidth/100 |
|
case 'vh': |
|
return window.innerHeight/100 |
|
case 'vmin': |
|
return Math.min(window.innerWidth, window.innerHeight) / 100 |
|
case 'vmax': |
|
return Math.max(window.innerWidth, window.innerHeight) / 100 |
|
case 'in': |
|
return PIXELS_PER_INCH |
|
case 'cm': |
|
return PIXELS_PER_INCH / 2.54 |
|
case 'mm': |
|
return PIXELS_PER_INCH / 25.4 |
|
case 'pt': |
|
return PIXELS_PER_INCH / 72 |
|
case 'pc': |
|
return PIXELS_PER_INCH / 6 |
|
} |
|
return 1 |
|
} |
|
},{"parse-unit":214}],253:[function(require,module,exports){ |
|
"use strict" |
|
|
|
module.exports = triangulateCube |
|
|
|
var perm = require("permutation-rank") |
|
var sgn = require("permutation-parity") |
|
var gamma = require("gamma") |
|
|
|
function triangulateCube(dimension) { |
|
if(dimension < 0) { |
|
return [ ] |
|
} |
|
if(dimension === 0) { |
|
return [ [0] ] |
|
} |
|
var dfactorial = Math.round(gamma(dimension+1))|0 |
|
var result = [] |
|
for(var i=0; i<dfactorial; ++i) { |
|
var p = perm.unrank(dimension, i) |
|
var cell = [ 0 ] |
|
var v = 0 |
|
for(var j=0; j<p.length; ++j) { |
|
v += (1<<p[j]) |
|
cell.push(v) |
|
} |
|
if(sgn(p) < 1) { |
|
cell[0] = v |
|
cell[dimension] = 0 |
|
} |
|
result.push(cell) |
|
} |
|
return result |
|
} |
|
},{"gamma":75,"permutation-parity":215,"permutation-rank":216}],254:[function(require,module,exports){ |
|
'use strict' |
|
|
|
module.exports = createTurntableController |
|
|
|
var filterVector = require('filtered-vector') |
|
var invert44 = require('gl-mat4/invert') |
|
var rotateM = require('gl-mat4/rotate') |
|
var cross = require('gl-vec3/cross') |
|
var normalize3 = require('gl-vec3/normalize') |
|
var dot3 = require('gl-vec3/dot') |
|
|
|
function len3(x, y, z) { |
|
return Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2) + Math.pow(z, 2)) |
|
} |
|
|
|
function clamp1(x) { |
|
return Math.min(1.0, Math.max(-1.0, x)) |
|
} |
|
|
|
function findOrthoPair(v) { |
|
var vx = Math.abs(v[0]) |
|
var vy = Math.abs(v[1]) |
|
var vz = Math.abs(v[2]) |
|
|
|
var u = [0,0,0] |
|
if(vx > Math.max(vy, vz)) { |
|
u[2] = 1 |
|
} else if(vy > Math.max(vx, vz)) { |
|
u[0] = 1 |
|
} else { |
|
u[1] = 1 |
|
} |
|
|
|
var vv = 0 |
|
var uv = 0 |
|
for(var i=0; i<3; ++i ) { |
|
vv += v[i] * v[i] |
|
uv += u[i] * v[i] |
|
} |
|
for(var i=0; i<3; ++i) { |
|
u[i] -= (uv / vv) * v[i] |
|
} |
|
normalize3(u, u) |
|
return u |
|
} |
|
|
|
function TurntableController(zoomMin, zoomMax, center, up, right, radius, theta, phi) { |
|
this.center = filterVector(center) |
|
this.up = filterVector(up) |
|
this.right = filterVector(right) |
|
this.radius = filterVector([radius]) |
|
this.angle = filterVector([theta, phi]) |
|
this.angle.bounds = [[-Infinity,-Math.PI/2], [Infinity,Math.PI/2]] |
|
this.setDistanceLimits(zoomMin, zoomMax) |
|
|
|
this.computedCenter = this.center.curve(0) |
|
this.computedUp = this.up.curve(0) |
|
this.computedRight = this.right.curve(0) |
|
this.computedRadius = this.radius.curve(0) |
|
this.computedAngle = this.angle.curve(0) |
|
this.computedToward = [0,0,0] |
|
this.computedEye = [0,0,0] |
|
this.computedMatrix = new Array(16) |
|
for(var i=0; i<16; ++i) { |
|
this.computedMatrix[i] = 0.5 |
|
} |
|
|
|
this.recalcMatrix(0) |
|
} |
|
|
|
var proto = TurntableController.prototype |
|
|
|
proto.setDistanceLimits = function(minDist, maxDist) { |
|
if(minDist > 0) { |
|
minDist = Math.log(minDist) |
|
} else { |
|
minDist = -Infinity |
|
} |
|
if(maxDist > 0) { |
|
maxDist = Math.log(maxDist) |
|
} else { |
|
maxDist = Infinity |
|
} |
|
maxDist = Math.max(maxDist, minDist) |
|
this.radius.bounds[0][0] = minDist |
|
this.radius.bounds[1][0] = maxDist |
|
} |
|
|
|
proto.getDistanceLimits = function(out) { |
|
var bounds = this.radius.bounds[0] |
|
if(out) { |
|
out[0] = Math.exp(bounds[0][0]) |
|
out[1] = Math.exp(bounds[1][0]) |
|
return out |
|
} |
|
return [ Math.exp(bounds[0][0]), Math.exp(bounds[1][0]) ] |
|
} |
|
|
|
proto.recalcMatrix = function(t) { |
|
//Recompute curves |
|
this.center.curve(t) |
|
this.up.curve(t) |
|
this.right.curve(t) |
|
this.radius.curve(t) |
|
this.angle.curve(t) |
|
|
|
//Compute frame for camera matrix |
|
var up = this.computedUp |
|
var right = this.computedRight |
|
var uu = 0.0 |
|
var ur = 0.0 |
|
for(var i=0; i<3; ++i) { |
|
ur += up[i] * right[i] |
|
uu += up[i] * up[i] |
|
} |
|
var ul = Math.sqrt(uu) |
|
var rr = 0.0 |
|
for(var i=0; i<3; ++i) { |
|
right[i] -= up[i] * ur / uu |
|
rr += right[i] * right[i] |
|
up[i] /= ul |
|
} |
|
var rl = Math.sqrt(rr) |
|
for(var i=0; i<3; ++i) { |
|
right[i] /= rl |
|
} |
|
|
|
//Compute toward vector |
|
var toward = this.computedToward |
|
cross(toward, up, right) |
|
normalize3(toward, toward) |
|
|
|
//Compute angular parameters |
|
var radius = Math.exp(this.computedRadius[0]) |
|
var theta = this.computedAngle[0] |
|
var phi = this.computedAngle[1] |
|
|
|
var ctheta = Math.cos(theta) |
|
var stheta = Math.sin(theta) |
|
var cphi = Math.cos(phi) |
|
var sphi = Math.sin(phi) |
|
|
|
var center = this.computedCenter |
|
|
|
var wx = ctheta * cphi |
|
var wy = stheta * cphi |
|
var wz = sphi |
|
|
|
var sx = -ctheta * sphi |
|
var sy = -stheta * sphi |
|
var sz = cphi |
|
|
|
var eye = this.computedEye |
|
var mat = this.computedMatrix |
|
for(var i=0; i<3; ++i) { |
|
var x = wx * right[i] + wy * toward[i] + wz * up[i] |
|
mat[4*i+1] = sx * right[i] + sy * toward[i] + sz * up[i] |
|
mat[4*i+2] = x |
|
mat[4*i+3] = 0.0 |
|
} |
|
|
|
var ax = mat[1] |
|
var ay = mat[5] |
|
var az = mat[9] |
|
var bx = mat[2] |
|
var by = mat[6] |
|
var bz = mat[10] |
|
var cx = ay * bz - az * by |
|
var cy = az * bx - ax * bz |
|
var cz = ax * by - ay * bx |
|
var cl = len3(cx, cy, cz) |
|
cx /= cl |
|
cy /= cl |
|
cz /= cl |
|
mat[0] = cx |
|
mat[4] = cy |
|
mat[8] = cz |
|
|
|
for(var i=0; i<3; ++i) { |
|
eye[i] = center[i] + mat[2+4*i]*radius |
|
} |
|
|
|
for(var i=0; i<3; ++i) { |
|
var rr = 0.0 |
|
for(var j=0; j<3; ++j) { |
|
rr += mat[i+4*j] * eye[j] |
|
} |
|
mat[12+i] = -rr |
|
} |
|
mat[15] = 1.0 |
|
} |
|
|
|
proto.getMatrix = function(t, result) { |
|
this.recalcMatrix(t) |
|
var mat = this.computedMatrix |
|
if(result) { |
|
for(var i=0; i<16; ++i) { |
|
result[i] = mat[i] |
|
} |
|
return result |
|
} |
|
return mat |
|
} |
|
|
|
var zAxis = [0,0,0] |
|
proto.rotate = function(t, dtheta, dphi, droll) { |
|
this.angle.move(t, dtheta, dphi) |
|
if(droll) { |
|
this.recalcMatrix(t) |
|
|
|
var mat = this.computedMatrix |
|
zAxis[0] = mat[2] |
|
zAxis[1] = mat[6] |
|
zAxis[2] = mat[10] |
|
|
|
var up = this.computedUp |
|
var right = this.computedRight |
|
var toward = this.computedToward |
|
|
|
for(var i=0; i<3; ++i) { |
|
mat[4*i] = up[i] |
|
mat[4*i+1] = right[i] |
|
mat[4*i+2] = toward[i] |
|
} |
|
rotateM(mat, mat, droll, zAxis) |
|
for(var i=0; i<3; ++i) { |
|
up[i] = mat[4*i] |
|
right[i] = mat[4*i+1] |
|
} |
|
|
|
this.up.set(t, up[0], up[1], up[2]) |
|
this.right.set(t, right[0], right[1], right[2]) |
|
} |
|
} |
|
|
|
proto.pan = function(t, dx, dy, dz) { |
|
dx = dx || 0.0 |
|
dy = dy || 0.0 |
|
dz = dz || 0.0 |
|
|
|
this.recalcMatrix(t) |
|
var mat = this.computedMatrix |
|
|
|
var dist = Math.exp(this.computedRadius[0]) |
|
|
|
var ux = mat[1] |
|
var uy = mat[5] |
|
var uz = mat[9] |
|
var ul = len3(ux, uy, uz) |
|
ux /= ul |
|
uy /= ul |
|
uz /= ul |
|
|
|
var rx = mat[0] |
|
var ry = mat[4] |
|
var rz = mat[8] |
|
var ru = rx * ux + ry * uy + rz * uz |
|
rx -= ux * ru |
|
ry -= uy * ru |
|
rz -= uz * ru |
|
var rl = len3(rx, ry, rz) |
|
rx /= rl |
|
ry /= rl |
|
rz /= rl |
|
|
|
var vx = rx * dx + ux * dy |
|
var vy = ry * dx + uy * dy |
|
var vz = rz * dx + uz * dy |
|
this.center.move(t, vx, vy, vz) |
|
|
|
//Update z-component of radius |
|
var radius = Math.exp(this.computedRadius[0]) |
|
radius = Math.max(1e-4, radius + dz) |
|
this.radius.set(t, Math.log(radius)) |
|
} |
|
|
|
proto.translate = function(t, dx, dy, dz) { |
|
this.center.move(t, |
|
dx||0.0, |
|
dy||0.0, |
|
dz||0.0) |
|
} |
|
|
|
//Recenters the coordinate axes |
|
proto.setMatrix = function(t, mat, axes, noSnap) { |
|
|
|
//Get the axes for tare |
|
var ushift = 1 |
|
if(typeof axes === 'number') { |
|
ushift = (axes)|0 |
|
} |
|
if(ushift < 0 || ushift > 3) { |
|
ushift = 1 |
|
} |
|
var vshift = (ushift + 2) % 3 |
|
var fshift = (ushift + 1) % 3 |
|
|
|
//Recompute state for new t value |
|
if(!mat) { |
|
this.recalcMatrix(t) |
|
mat = this.computedMatrix |
|
} |
|
|
|
//Get right and up vectors |
|
var ux = mat[ushift] |
|
var uy = mat[ushift+4] |
|
var uz = mat[ushift+8] |
|
if(!noSnap) { |
|
var ul = len3(ux, uy, uz) |
|
ux /= ul |
|
uy /= ul |
|
uz /= ul |
|
} else { |
|
var ax = Math.abs(ux) |
|
var ay = Math.abs(uy) |
|
var az = Math.abs(uz) |
|
var am = Math.max(ax,ay,az) |
|
if(ax === am) { |
|
ux = (ux < 0) ? -1 : 1 |
|
uy = uz = 0 |
|
} else if(az === am) { |
|
uz = (uz < 0) ? -1 : 1 |
|
ux = uy = 0 |
|
} else { |
|
uy = (uy < 0) ? -1 : 1 |
|
ux = uz = 0 |
|
} |
|
} |
|
|
|
var rx = mat[vshift] |
|
var ry = mat[vshift+4] |
|
var rz = mat[vshift+8] |
|
var ru = rx * ux + ry * uy + rz * uz |
|
rx -= ux * ru |
|
ry -= uy * ru |
|
rz -= uz * ru |
|
var rl = len3(rx, ry, rz) |
|
rx /= rl |
|
ry /= rl |
|
rz /= rl |
|
|
|
var fx = uy * rz - uz * ry |
|
var fy = uz * rx - ux * rz |
|
var fz = ux * ry - uy * rx |
|
var fl = len3(fx, fy, fz) |
|
fx /= fl |
|
fy /= fl |
|
fz /= fl |
|
|
|
this.center.jump(t, ex, ey, ez) |
|
this.radius.idle(t) |
|
this.up.jump(t, ux, uy, uz) |
|
this.right.jump(t, rx, ry, rz) |
|
|
|
var phi, theta |
|
if(ushift === 2) { |
|
var cx = mat[1] |
|
var cy = mat[5] |
|
var cz = mat[9] |
|
var cr = cx * rx + cy * ry + cz * rz |
|
var cf = cx * fx + cy * fy + cz * fz |
|
if(tu < 0) { |
|
phi = -Math.PI/2 |
|
} else { |
|
phi = Math.PI/2 |
|
} |
|
theta = Math.atan2(cf, cr) |
|
} else { |
|
var tx = mat[2] |
|
var ty = mat[6] |
|
var tz = mat[10] |
|
var tu = tx * ux + ty * uy + tz * uz |
|
var tr = tx * rx + ty * ry + tz * rz |
|
var tf = tx * fx + ty * fy + tz * fz |
|
|
|
phi = Math.asin(clamp1(tu)) |
|
theta = Math.atan2(tf, tr) |
|
} |
|
|
|
this.angle.jump(t, theta, phi) |
|
|
|
this.recalcMatrix(t) |
|
var dx = mat[2] |
|
var dy = mat[6] |
|
var dz = mat[10] |
|
|
|
var imat = this.computedMatrix |
|
invert44(imat, mat) |
|
var w = imat[15] |
|
var ex = imat[12] / w |
|
var ey = imat[13] / w |
|
var ez = imat[14] / w |
|
|
|
var gs = Math.exp(this.computedRadius[0]) |
|
this.center.jump(t, ex-dx*gs, ey-dy*gs, ez-dz*gs) |
|
} |
|
|
|
proto.lastT = function() { |
|
return Math.max( |
|
this.center.lastT(), |
|
this.up.lastT(), |
|
this.right.lastT(), |
|
this.radius.lastT(), |
|
this.angle.lastT()) |
|
} |
|
|
|
proto.idle = function(t) { |
|
this.center.idle(t) |
|
this.up.idle(t) |
|
this.right.idle(t) |
|
this.radius.idle(t) |
|
this.angle.idle(t) |
|
} |
|
|
|
proto.flush = function(t) { |
|
this.center.flush(t) |
|
this.up.flush(t) |
|
this.right.flush(t) |
|
this.radius.flush(t) |
|
this.angle.flush(t) |
|
} |
|
|
|
proto.setDistance = function(t, d) { |
|
if(d > 0) { |
|
this.radius.set(t, Math.log(d)) |
|
} |
|
} |
|
|
|
proto.lookAt = function(t, eye, center, up) { |
|
this.recalcMatrix(t) |
|
|
|
eye = eye || this.computedEye |
|
center = center || this.computedCenter |
|
up = up || this.computedUp |
|
|
|
var ux = up[0] |
|
var uy = up[1] |
|
var uz = up[2] |
|
var ul = len3(ux, uy, uz) |
|
if(ul < 1e-6) { |
|
return |
|
} |
|
ux /= ul |
|
uy /= ul |
|
uz /= ul |
|
|
|
var tx = eye[0] - center[0] |
|
var ty = eye[1] - center[1] |
|
var tz = eye[2] - center[2] |
|
var tl = len3(tx, ty, tz) |
|
if(tl < 1e-6) { |
|
return |
|
} |
|
tx /= tl |
|
ty /= tl |
|
tz /= tl |
|
|
|
var right = this.computedRight |
|
var rx = right[0] |
|
var ry = right[1] |
|
var rz = right[2] |
|
var ru = ux*rx + uy*ry + uz*rz |
|
rx -= ru * ux |
|
ry -= ru * uy |
|
rz -= ru * uz |
|
var rl = len3(rx, ry, rz) |
|
|
|
if(rl < 0.01) { |
|
rx = uy * tz - uz * ty |
|
ry = uz * tx - ux * tz |
|
rz = ux * ty - uy * tx |
|
rl = len3(rx, ry, rz) |
|
if(rl < 1e-6) { |
|
return |
|
} |
|
} |
|
rx /= rl |
|
ry /= rl |
|
rz /= rl |
|
|
|
this.up.set(t, ux, uy, uz) |
|
this.right.set(t, rx, ry, rz) |
|
this.center.set(t, center[0], center[1], center[2]) |
|
this.radius.set(t, Math.log(tl)) |
|
|
|
var fx = uy * rz - uz * ry |
|
var fy = uz * rx - ux * rz |
|
var fz = ux * ry - uy * rx |
|
var fl = len3(fx, fy, fz) |
|
fx /= fl |
|
fy /= fl |
|
fz /= fl |
|
|
|
var tu = ux*tx + uy*ty + uz*tz |
|
var tr = rx*tx + ry*ty + rz*tz |
|
var tf = fx*tx + fy*ty + fz*tz |
|
|
|
var phi = Math.asin(clamp1(tu)) |
|
var theta = Math.atan2(tf, tr) |
|
|
|
var angleState = this.angle._state |
|
var lastTheta = angleState[angleState.length-1] |
|
var lastPhi = angleState[angleState.length-2] |
|
lastTheta = lastTheta % (2.0 * Math.PI) |
|
var dp = Math.abs(lastTheta + 2.0 * Math.PI - theta) |
|
var d0 = Math.abs(lastTheta - theta) |
|
var dn = Math.abs(lastTheta - 2.0 * Math.PI - theta) |
|
if(dp < d0) { |
|
lastTheta += 2.0 * Math.PI |
|
} |
|
if(dn < d0) { |
|
lastTheta -= 2.0 * Math.PI |
|
} |
|
|
|
this.angle.jump(this.angle.lastT(), lastTheta, lastPhi) |
|
this.angle.set(t, theta, phi) |
|
} |
|
|
|
function createTurntableController(options) { |
|
options = options || {} |
|
|
|
var center = options.center || [0,0,0] |
|
var up = options.up || [0,1,0] |
|
var right = options.right || findOrthoPair(up) |
|
var radius = options.radius || 1.0 |
|
var theta = options.theta || 0.0 |
|
var phi = options.phi || 0.0 |
|
|
|
center = [].slice.call(center, 0, 3) |
|
|
|
up = [].slice.call(up, 0, 3) |
|
normalize3(up, up) |
|
|
|
right = [].slice.call(right, 0, 3) |
|
normalize3(right, right) |
|
|
|
if('eye' in options) { |
|
var eye = options.eye |
|
var toward = [ |
|
eye[0]-center[0], |
|
eye[1]-center[1], |
|
eye[2]-center[2] |
|
] |
|
cross(right, toward, up) |
|
if(len3(right[0], right[1], right[2]) < 1e-6) { |
|
right = findOrthoPair(up) |
|
} else { |
|
normalize3(right, right) |
|
} |
|
|
|
radius = len3(toward[0], toward[1], toward[2]) |
|
|
|
var ut = dot3(up, toward) / radius |
|
var rt = dot3(right, toward) / radius |
|
phi = Math.acos(ut) |
|
theta = Math.acos(rt) |
|
} |
|
|
|
//Use logarithmic coordinates for radius |
|
radius = Math.log(radius) |
|
|
|
//Return the controller |
|
return new TurntableController( |
|
options.zoomMin, |
|
options.zoomMax, |
|
center, |
|
up, |
|
right, |
|
radius, |
|
theta, |
|
phi) |
|
} |
|
},{"filtered-vector":73,"gl-mat4/invert":94,"gl-mat4/rotate":98,"gl-vec3/cross":126,"gl-vec3/dot":129,"gl-vec3/normalize":140}],255:[function(require,module,exports){ |
|
"use strict" |
|
|
|
module.exports = twoProduct |
|
|
|
var SPLITTER = +(Math.pow(2, 27) + 1.0) |
|
|
|
function twoProduct(a, b, result) { |
|
var x = a * b |
|
|
|
var c = SPLITTER * a |
|
var abig = c - a |
|
var ahi = c - abig |
|
var alo = a - ahi |
|
|
|
var d = SPLITTER * b |
|
var bbig = d - b |
|
var bhi = d - bbig |
|
var blo = b - bhi |
|
|
|
var err1 = x - (ahi * bhi) |
|
var err2 = err1 - (alo * bhi) |
|
var err3 = err2 - (ahi * blo) |
|
|
|
var y = alo * blo - err3 |
|
|
|
if(result) { |
|
result[0] = y |
|
result[1] = x |
|
return result |
|
} |
|
|
|
return [ y, x ] |
|
} |
|
},{}],256:[function(require,module,exports){ |
|
"use strict" |
|
|
|
module.exports = fastTwoSum |
|
|
|
function fastTwoSum(a, b, result) { |
|
var x = a + b |
|
var bv = x - a |
|
var av = x - bv |
|
var br = b - bv |
|
var ar = a - av |
|
if(result) { |
|
result[0] = ar + br |
|
result[1] = x |
|
return result |
|
} |
|
return [ar+br, x] |
|
} |
|
},{}],257:[function(require,module,exports){ |
|
(function (global,Buffer){ |
|
'use strict' |
|
|
|
var bits = require('bit-twiddle') |
|
var dup = require('dup') |
|
|
|
//Legacy pool support |
|
if(!global.__TYPEDARRAY_POOL) { |
|
global.__TYPEDARRAY_POOL = { |
|
UINT8 : dup([32, 0]) |
|
, UINT16 : dup([32, 0]) |
|
, UINT32 : dup([32, 0]) |
|
, INT8 : dup([32, 0]) |
|
, INT16 : dup([32, 0]) |
|
, INT32 : dup([32, 0]) |
|
, FLOAT : dup([32, 0]) |
|
, DOUBLE : dup([32, 0]) |
|
, DATA : dup([32, 0]) |
|
, UINT8C : dup([32, 0]) |
|
, BUFFER : dup([32, 0]) |
|
} |
|
} |
|
|
|
var hasUint8C = (typeof Uint8ClampedArray) !== 'undefined' |
|
var POOL = global.__TYPEDARRAY_POOL |
|
|
|
//Upgrade pool |
|
if(!POOL.UINT8C) { |
|
POOL.UINT8C = dup([32, 0]) |
|
} |
|
if(!POOL.BUFFER) { |
|
POOL.BUFFER = dup([32, 0]) |
|
} |
|
|
|
//New technique: Only allocate from ArrayBufferView and Buffer |
|
var DATA = POOL.DATA |
|
, BUFFER = POOL.BUFFER |
|
|
|
exports.free = function free(array) { |
|
if(Buffer.isBuffer(array)) { |
|
BUFFER[bits.log2(array.length)].push(array) |
|
} else { |
|
if(Object.prototype.toString.call(array) !== '[object ArrayBuffer]') { |
|
array = array.buffer |
|
} |
|
if(!array) { |
|
return |
|
} |
|
var n = array.length || array.byteLength |
|
var log_n = bits.log2(n)|0 |
|
DATA[log_n].push(array) |
|
} |
|
} |
|
|
|
function freeArrayBuffer(buffer) { |
|
if(!buffer) { |
|
return |
|
} |
|
var n = buffer.length || buffer.byteLength |
|
var log_n = bits.log2(n) |
|
DATA[log_n].push(buffer) |
|
} |
|
|
|
function freeTypedArray(array) { |
|
freeArrayBuffer(array.buffer) |
|
} |
|
|
|
exports.freeUint8 = |
|
exports.freeUint16 = |
|
exports.freeUint32 = |
|
exports.freeInt8 = |
|
exports.freeInt16 = |
|
exports.freeInt32 = |
|
exports.freeFloat32 = |
|
exports.freeFloat = |
|
exports.freeFloat64 = |
|
exports.freeDouble = |
|
exports.freeUint8Clamped = |
|
exports.freeDataView = freeTypedArray |
|
|
|
exports.freeArrayBuffer = freeArrayBuffer |
|
|
|
exports.freeBuffer = function freeBuffer(array) { |
|
BUFFER[bits.log2(array.length)].push(array) |
|
} |
|
|
|
exports.malloc = function malloc(n, dtype) { |
|
if(dtype === undefined || dtype === 'arraybuffer') { |
|
return mallocArrayBuffer(n) |
|
} else { |
|
switch(dtype) { |
|
case 'uint8': |
|
return mallocUint8(n) |
|
case 'uint16': |
|
return mallocUint16(n) |
|
case 'uint32': |
|
return mallocUint32(n) |
|
case 'int8': |
|
return mallocInt8(n) |
|
case 'int16': |
|
return mallocInt16(n) |
|
case 'int32': |
|
return mallocInt32(n) |
|
case 'float': |
|
case 'float32': |
|
return mallocFloat(n) |
|
case 'double': |
|
case 'float64': |
|
return mallocDouble(n) |
|
case 'uint8_clamped': |
|
return mallocUint8Clamped(n) |
|
case 'buffer': |
|
return mallocBuffer(n) |
|
case 'data': |
|
case 'dataview': |
|
return mallocDataView(n) |
|
|
|
default: |
|
return null |
|
} |
|
} |
|
return null |
|
} |
|
|
|
function mallocArrayBuffer(n) { |
|
var n = bits.nextPow2(n) |
|
var log_n = bits.log2(n) |
|
var d = DATA[log_n] |
|
if(d.length > 0) { |
|
return d.pop() |
|
} |
|
return new ArrayBuffer(n) |
|
} |
|
exports.mallocArrayBuffer = mallocArrayBuffer |
|
|
|
function mallocUint8(n) { |
|
return new Uint8Array(mallocArrayBuffer(n), 0, n) |
|
} |
|
exports.mallocUint8 = mallocUint8 |
|
|
|
function mallocUint16(n) { |
|
return new Uint16Array(mallocArrayBuffer(2*n), 0, n) |
|
} |
|
exports.mallocUint16 = mallocUint16 |
|
|
|
function mallocUint32(n) { |
|
return new Uint32Array(mallocArrayBuffer(4*n), 0, n) |
|
} |
|
exports.mallocUint32 = mallocUint32 |
|
|
|
function mallocInt8(n) { |
|
return new Int8Array(mallocArrayBuffer(n), 0, n) |
|
} |
|
exports.mallocInt8 = mallocInt8 |
|
|
|
function mallocInt16(n) { |
|
return new Int16Array(mallocArrayBuffer(2*n), 0, n) |
|
} |
|
exports.mallocInt16 = mallocInt16 |
|
|
|
function mallocInt32(n) { |
|
return new Int32Array(mallocArrayBuffer(4*n), 0, n) |
|
} |
|
exports.mallocInt32 = mallocInt32 |
|
|
|
function mallocFloat(n) { |
|
return new Float32Array(mallocArrayBuffer(4*n), 0, n) |
|
} |
|
exports.mallocFloat32 = exports.mallocFloat = mallocFloat |
|
|
|
function mallocDouble(n) { |
|
return new Float64Array(mallocArrayBuffer(8*n), 0, n) |
|
} |
|
exports.mallocFloat64 = exports.mallocDouble = mallocDouble |
|
|
|
function mallocUint8Clamped(n) { |
|
if(hasUint8C) { |
|
return new Uint8ClampedArray(mallocArrayBuffer(n), 0, n) |
|
} else { |
|
return mallocUint8(n) |
|
} |
|
} |
|
exports.mallocUint8Clamped = mallocUint8Clamped |
|
|
|
function mallocDataView(n) { |
|
return new DataView(mallocArrayBuffer(n), 0, n) |
|
} |
|
exports.mallocDataView = mallocDataView |
|
|
|
function mallocBuffer(n) { |
|
n = bits.nextPow2(n) |
|
var log_n = bits.log2(n) |
|
var cache = BUFFER[log_n] |
|
if(cache.length > 0) { |
|
return cache.pop() |
|
} |
|
return new Buffer(n) |
|
} |
|
exports.mallocBuffer = mallocBuffer |
|
|
|
exports.clearCache = function clearCache() { |
|
for(var i=0; i<32; ++i) { |
|
POOL.UINT8[i].length = 0 |
|
POOL.UINT16[i].length = 0 |
|
POOL.UINT32[i].length = 0 |
|
POOL.INT8[i].length = 0 |
|
POOL.INT16[i].length = 0 |
|
POOL.INT32[i].length = 0 |
|
POOL.FLOAT[i].length = 0 |
|
POOL.DOUBLE[i].length = 0 |
|
POOL.UINT8C[i].length = 0 |
|
DATA[i].length = 0 |
|
BUFFER[i].length = 0 |
|
} |
|
} |
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},require("buffer").Buffer) |
|
},{"bit-twiddle":36,"buffer":3,"dup":70}],258:[function(require,module,exports){ |
|
"use strict"; "use restrict"; |
|
|
|
module.exports = UnionFind; |
|
|
|
function UnionFind(count) { |
|
this.roots = new Array(count); |
|
this.ranks = new Array(count); |
|
|
|
for(var i=0; i<count; ++i) { |
|
this.roots[i] = i; |
|
this.ranks[i] = 0; |
|
} |
|
} |
|
|
|
var proto = UnionFind.prototype |
|
|
|
Object.defineProperty(proto, "length", { |
|
"get": function() { |
|
return this.roots.length |
|
} |
|
}) |
|
|
|
proto.makeSet = function() { |
|
var n = this.roots.length; |
|
this.roots.push(n); |
|
this.ranks.push(0); |
|
return n; |
|
} |
|
|
|
proto.find = function(x) { |
|
var x0 = x |
|
var roots = this.roots; |
|
while(roots[x] !== x) { |
|
x = roots[x] |
|
} |
|
while(roots[x0] !== x) { |
|
var y = roots[x0] |
|
roots[x0] = x |
|
x0 = y |
|
} |
|
return x; |
|
} |
|
|
|
proto.link = function(x, y) { |
|
var xr = this.find(x) |
|
, yr = this.find(y); |
|
if(xr === yr) { |
|
return; |
|
} |
|
var ranks = this.ranks |
|
, roots = this.roots |
|
, xd = ranks[xr] |
|
, yd = ranks[yr]; |
|
if(xd < yd) { |
|
roots[xr] = yr; |
|
} else if(yd < xd) { |
|
roots[yr] = xr; |
|
} else { |
|
roots[yr] = xr; |
|
++ranks[xr]; |
|
} |
|
} |
|
},{}],259:[function(require,module,exports){ |
|
"use strict" |
|
|
|
function unique_pred(list, compare) { |
|
var ptr = 1 |
|
, len = list.length |
|
, a=list[0], b=list[0] |
|
for(var i=1; i<len; ++i) { |
|
b = a |
|
a = list[i] |
|
if(compare(a, b)) { |
|
if(i === ptr) { |
|
ptr++ |
|
continue |
|
} |
|
list[ptr++] = a |
|
} |
|
} |
|
list.length = ptr |
|
return list |
|
} |
|
|
|
function unique_eq(list) { |
|
var ptr = 1 |
|
, len = list.length |
|
, a=list[0], b = list[0] |
|
for(var i=1; i<len; ++i, b=a) { |
|
b = a |
|
a = list[i] |
|
if(a !== b) { |
|
if(i === ptr) { |
|
ptr++ |
|
continue |
|
} |
|
list[ptr++] = a |
|
} |
|
} |
|
list.length = ptr |
|
return list |
|
} |
|
|
|
function unique(list, compare, sorted) { |
|
if(list.length === 0) { |
|
return list |
|
} |
|
if(compare) { |
|
if(!sorted) { |
|
list.sort(compare) |
|
} |
|
return unique_pred(list, compare) |
|
} |
|
if(!sorted) { |
|
list.sort() |
|
} |
|
return unique_eq(list) |
|
} |
|
|
|
module.exports = unique |
|
|
|
},{}],260:[function(require,module,exports){ |
|
"use strict" |
|
|
|
module.exports = createText |
|
|
|
var vectorizeText = require("./lib/vtext") |
|
var defaultCanvas = null |
|
var defaultContext = null |
|
|
|
if(typeof document !== 'undefined') { |
|
defaultCanvas = document.createElement('canvas') |
|
defaultCanvas.width = 8192 |
|
defaultCanvas.height = 1024 |
|
defaultContext = defaultCanvas.getContext("2d") |
|
} |
|
|
|
function createText(str, options) { |
|
if((typeof options !== "object") || (options === null)) { |
|
options = {} |
|
} |
|
return vectorizeText( |
|
str, |
|
options.canvas || defaultCanvas, |
|
options.context || defaultContext, |
|
options) |
|
} |
|
|
|
},{"./lib/vtext":261}],261:[function(require,module,exports){ |
|
"use strict" |
|
|
|
module.exports = vectorizeText |
|
module.exports.processPixels = processPixels |
|
|
|
var surfaceNets = require('surface-nets') |
|
var ndarray = require('ndarray') |
|
var simplify = require('simplify-planar-graph') |
|
var cleanPSLG = require('clean-pslg') |
|
var cdt2d = require('cdt2d') |
|
var toPolygonCrappy = require('planar-graph-to-polyline') |
|
|
|
function transformPositions(positions, options, size) { |
|
var align = options.textAlign || "start" |
|
var baseline = options.textBaseline || "alphabetic" |
|
|
|
var lo = [1<<30, 1<<30] |
|
var hi = [0,0] |
|
var n = positions.length |
|
for(var i=0; i<n; ++i) { |
|
var p = positions[i] |
|
for(var j=0; j<2; ++j) { |
|
lo[j] = Math.min(lo[j], p[j])|0 |
|
hi[j] = Math.max(hi[j], p[j])|0 |
|
} |
|
} |
|
|
|
var xShift = 0 |
|
switch(align) { |
|
case "center": |
|
xShift = -0.5 * (lo[0] + hi[0]) |
|
break |
|
|
|
case "right": |
|
case "end": |
|
xShift = -hi[0] |
|
break |
|
|
|
case "left": |
|
case "start": |
|
xShift = -lo[0] |
|
break |
|
|
|
default: |
|
throw new Error("vectorize-text: Unrecognized textAlign: '" + align + "'") |
|
} |
|
|
|
var yShift = 0 |
|
switch(baseline) { |
|
case "hanging": |
|
case "top": |
|
yShift = -lo[1] |
|
break |
|
|
|
case "middle": |
|
yShift = -0.5 * (lo[1] + hi[1]) |
|
break |
|
|
|
case "alphabetic": |
|
case "ideographic": |
|
yShift = -3 * size |
|
break |
|
|
|
case "bottom": |
|
yShift = -hi[1] |
|
break |
|
|
|
default: |
|
throw new Error("vectorize-text: Unrecoginized textBaseline: '" + baseline + "'") |
|
} |
|
|
|
var scale = 1.0 / size |
|
if("lineHeight" in options) { |
|
scale *= +options.lineHeight |
|
} else if("width" in options) { |
|
scale = options.width / (hi[0] - lo[0]) |
|
} else if("height" in options) { |
|
scale = options.height / (hi[1] - lo[1]) |
|
} |
|
|
|
return positions.map(function(p) { |
|
return [ scale * (p[0] + xShift), scale * (p[1] + yShift) ] |
|
}) |
|
} |
|
|
|
function getPixels(canvas, context, str, size) { |
|
var width = Math.ceil(context.measureText(str).width + 2*size)|0 |
|
if(width > 8192) { |
|
throw new Error("vectorize-text: String too long (sorry, this will get fixed later)") |
|
} |
|
var height = 3 * size |
|
if(canvas.height < height) { |
|
canvas.height = height |
|
} |
|
|
|
context.fillStyle = "#000" |
|
context.fillRect(0, 0, canvas.width, canvas.height) |
|
|
|
context.fillStyle = "#fff" |
|
context.fillText(str, size, 2*size) |
|
|
|
//Cut pixels from image |
|
var pixelData = context.getImageData(0, 0, width, height) |
|
var pixels = ndarray(pixelData.data, [height, width, 4]) |
|
|
|
return pixels.pick(-1,-1,0).transpose(1,0) |
|
} |
|
|
|
function getContour(pixels, doSimplify) { |
|
var contour = surfaceNets(pixels, 128) |
|
if(doSimplify) { |
|
return simplify(contour.cells, contour.positions, 0.25) |
|
} |
|
return { |
|
edges: contour.cells, |
|
positions: contour.positions |
|
} |
|
} |
|
|
|
function processPixelsImpl(pixels, options, size, simplify) { |
|
//Extract contour |
|
var contour = getContour(pixels, simplify) |
|
|
|
//Apply warp to positions |
|
var positions = transformPositions(contour.positions, options, size) |
|
var edges = contour.edges |
|
var flip = "ccw" === options.orientation |
|
|
|
//Clean up the PSLG, resolve self intersections, etc. |
|
cleanPSLG(positions, edges) |
|
|
|
//If triangulate flag passed, triangulate the result |
|
if(options.polygons || options.polygon || options.polyline) { |
|
var result = toPolygonCrappy(edges, positions) |
|
var nresult = new Array(result.length) |
|
for(var i=0; i<result.length; ++i) { |
|
var loops = result[i] |
|
var nloops = new Array(loops.length) |
|
for(var j=0; j<loops.length; ++j) { |
|
var loop = loops[j] |
|
var nloop = new Array(loop.length) |
|
for(var k=0; k<loop.length; ++k) { |
|
nloop[k] = positions[loop[k]].slice() |
|
} |
|
if(flip) { |
|
nloop.reverse() |
|
} |
|
nloops[j] = nloop |
|
} |
|
nresult[i] = nloops |
|
} |
|
return nresult |
|
} else if(options.triangles || options.triangulate || options.triangle) { |
|
return { |
|
cells: cdt2d(positions, edges, { |
|
delaunay: false, |
|
exterior: false, |
|
interior: true |
|
}), |
|
positions: positions |
|
} |
|
} else { |
|
return { |
|
edges: edges, |
|
positions: positions |
|
} |
|
} |
|
} |
|
|
|
function processPixels(pixels, options, size) { |
|
try { |
|
return processPixelsImpl(pixels, options, size, true) |
|
} catch(e) {} |
|
try { |
|
return processPixelsImpl(pixels, options, size, false) |
|
} catch(e) {} |
|
if(options.polygons || options.polyline || options.polygon) { |
|
return [] |
|
} |
|
if(options.triangles || options.triangulate || options.triangle) { |
|
return { |
|
cells: [], |
|
positions: [] |
|
} |
|
} |
|
return { |
|
edges: [], |
|
positions: [] |
|
} |
|
} |
|
|
|
function vectorizeText(str, canvas, context, options) { |
|
var size = options.size || 64 |
|
var family = options.font || "normal" |
|
|
|
context.font = size + "px " + family |
|
context.textAlign = "start" |
|
context.textBaseline = "alphabetic" |
|
context.direction = "ltr" |
|
|
|
var pixels = getPixels(canvas, context, str, size) |
|
|
|
return processPixels(pixels, options, size) |
|
} |
|
|
|
},{"cdt2d":47,"clean-pslg":53,"ndarray":208,"planar-graph-to-polyline":219,"simplify-planar-graph":246,"surface-nets":251}],262:[function(require,module,exports){ |
|
var hiddenStore = require('./hidden-store.js'); |
|
|
|
module.exports = createStore; |
|
|
|
function createStore() { |
|
var key = {}; |
|
|
|
return function (obj) { |
|
if ((typeof obj !== 'object' || obj === null) && |
|
typeof obj !== 'function' |
|
) { |
|
throw new Error('Weakmap-shim: Key must be object') |
|
} |
|
|
|
var store = obj.valueOf(key); |
|
return store && store.identity === key ? |
|
store : hiddenStore(obj, key); |
|
}; |
|
} |
|
|
|
},{"./hidden-store.js":263}],263:[function(require,module,exports){ |
|
module.exports = hiddenStore; |
|
|
|
function hiddenStore(obj, key) { |
|
var store = { identity: key }; |
|
var valueOf = obj.valueOf; |
|
|
|
Object.defineProperty(obj, "valueOf", { |
|
value: function (value) { |
|
return value !== key ? |
|
valueOf.apply(this, arguments) : store; |
|
}, |
|
writable: true |
|
}); |
|
|
|
return store; |
|
} |
|
|
|
},{}],264:[function(require,module,exports){ |
|
// Original - @Gozola. |
|
// https://gist.github.com/Gozala/1269991 |
|
// This is a reimplemented version (with a few bug fixes). |
|
|
|
var createStore = require('./create-store.js'); |
|
|
|
module.exports = weakMap; |
|
|
|
function weakMap() { |
|
var privates = createStore(); |
|
|
|
return { |
|
'get': function (key, fallback) { |
|
var store = privates(key) |
|
return store.hasOwnProperty('value') ? |
|
store.value : fallback |
|
}, |
|
'set': function (key, value) { |
|
privates(key).value = value; |
|
return this; |
|
}, |
|
'has': function(key) { |
|
return 'value' in privates(key); |
|
}, |
|
'delete': function (key) { |
|
return delete privates(key).value; |
|
} |
|
} |
|
} |
|
|
|
},{"./create-store.js":262}],265:[function(require,module,exports){ |
|
module.exports = require('cwise-compiler')({ |
|
args: ['array', { |
|
offset: [1], |
|
array: 0 |
|
}, 'scalar', 'scalar', 'index'], |
|
pre: { |
|
"body": "{}", |
|
"args": [], |
|
"thisVars": [], |
|
"localVars": [] |
|
}, |
|
post: { |
|
"body": "{}", |
|
"args": [], |
|
"thisVars": [], |
|
"localVars": [] |
|
}, |
|
body: { |
|
"body": "{\n var _inline_1_da = _inline_1_arg0_ - _inline_1_arg3_\n var _inline_1_db = _inline_1_arg1_ - _inline_1_arg3_\n if((_inline_1_da >= 0) !== (_inline_1_db >= 0)) {\n _inline_1_arg2_.push(_inline_1_arg4_[0] + 0.5 + 0.5 * (_inline_1_da + _inline_1_db) / (_inline_1_da - _inline_1_db))\n }\n }", |
|
"args": [{ |
|
"name": "_inline_1_arg0_", |
|
"lvalue": false, |
|
"rvalue": true, |
|
"count": 1 |
|
}, { |
|
"name": "_inline_1_arg1_", |
|
"lvalue": false, |
|
"rvalue": true, |
|
"count": 1 |
|
}, { |
|
"name": "_inline_1_arg2_", |
|
"lvalue": false, |
|
"rvalue": true, |
|
"count": 1 |
|
}, { |
|
"name": "_inline_1_arg3_", |
|
"lvalue": false, |
|
"rvalue": true, |
|
"count": 2 |
|
}, { |
|
"name": "_inline_1_arg4_", |
|
"lvalue": false, |
|
"rvalue": true, |
|
"count": 1 |
|
}], |
|
"thisVars": [], |
|
"localVars": ["_inline_1_da", "_inline_1_db"] |
|
}, |
|
funcName: 'zeroCrossings' |
|
}) |
|
|
|
},{"cwise-compiler":65}],266:[function(require,module,exports){ |
|
"use strict" |
|
|
|
module.exports = findZeroCrossings |
|
|
|
var core = require("./lib/zc-core") |
|
|
|
function findZeroCrossings(array, level) { |
|
var cross = [] |
|
level = +level || 0.0 |
|
core(array.hi(array.shape[0]-1), cross, level) |
|
return cross |
|
} |
|
},{"./lib/zc-core":265}],267:[function(require,module,exports){ |
|
"use strict"; |
|
|
|
var vec3 = require('gl-vec3'); |
|
var vec4 = require('gl-vec4'); |
|
|
|
var streamToTube = function(stream) { |
|
var points = stream.points; |
|
var velocities = stream.velocities; |
|
var divergences = stream.divergences; |
|
|
|
var p, fwd, r, u, v, up; |
|
up = vec3.set(vec3.create(), 0, 1, 0); |
|
u = vec3.create(); |
|
v = vec3.create(); |
|
var p2 = vec3.create(); |
|
|
|
var verts = []; |
|
var faces = []; |
|
var vectors = []; |
|
var previousVerts = []; |
|
var currentVerts = []; |
|
var intensities = []; |
|
var previousIntensity = 0; |
|
var currentIntensity = 0; |
|
var currentVector = vec3.create(); |
|
var previousVector = vec3.create(); |
|
|
|
var facets = 8; |
|
|
|
for (var i = 0; i < points.length; i++) { |
|
p = points[i]; |
|
fwd = velocities[i]; |
|
r = divergences[i]; |
|
currentIntensity = vec3.length(fwd); |
|
currentVector = vec3.create(); |
|
vec3.normalize(currentVector, fwd); |
|
vec3.scale(currentVector, currentVector, r); |
|
|
|
for (var a = 0; a < facets; a++) { |
|
currentVerts[a] = [p[0], p[1], p[2], a]; |
|
} |
|
if (previousVerts.length > 0) { |
|
for (var a = 0; a < facets; a++) { |
|
var a1 = (a+1) % facets; |
|
verts.push( |
|
previousVerts[a], |
|
currentVerts[a], |
|
currentVerts[a1], |
|
|
|
currentVerts[a1], |
|
previousVerts[a1], |
|
previousVerts[a] |
|
); |
|
vectors.push( |
|
previousVector, |
|
currentVector, |
|
currentVector, |
|
|
|
currentVector, |
|
previousVector, |
|
previousVector |
|
); |
|
intensities.push( |
|
previousIntensity, |
|
currentIntensity, |
|
currentIntensity, |
|
|
|
currentIntensity, |
|
previousIntensity, |
|
previousIntensity |
|
); |
|
faces.push( |
|
[verts.length-6, verts.length-5, verts.length-4], |
|
[verts.length-3, verts.length-2, verts.length-1] |
|
); |
|
} |
|
} |
|
var tmp = previousVerts; |
|
previousVerts = currentVerts; |
|
currentVerts = tmp; |
|
tmp = previousVector; |
|
previousVector = currentVector; |
|
currentVector = tmp; |
|
tmp = previousIntensity; |
|
previousIntensity = currentIntensity; |
|
currentIntensity = tmp; |
|
} |
|
return { |
|
positions: verts, |
|
cells: faces, |
|
vectors: vectors, |
|
vertexIntensity: intensities |
|
}; |
|
|
|
}; |
|
|
|
var createTubes = function(streams, colormap) { |
|
var tubes = streams.map(streamToTube); |
|
var positions = []; |
|
var cells = []; |
|
var vectors = []; |
|
var vertexIntensity = []; |
|
for (var i=0; i < tubes.length; i++) { |
|
var tube = tubes[i]; |
|
var offset = positions.length; |
|
positions = positions.concat(tube.positions); |
|
vectors = vectors.concat(tube.vectors); |
|
vertexIntensity = vertexIntensity.concat(tube.vertexIntensity); |
|
for (var j=0; j<tube.cells.length; j++) { |
|
var cell = tube.cells[j]; |
|
var newCell = []; |
|
cells.push(newCell); |
|
for (var k=0; k<cell.length; k++) { |
|
newCell.push(cell[k] + offset); |
|
} |
|
} |
|
} |
|
return { |
|
positions: positions, |
|
cells: cells, |
|
vectors: vectors, |
|
vertexIntensity: vertexIntensity, |
|
colormap: colormap |
|
}; |
|
}; |
|
|
|
var defaultGetDivergence = function(p, v0) { |
|
var dp = vec3.create(); |
|
var e = 1/10000; |
|
|
|
vec3.add(dp, p, [e, 0, 0]); |
|
var vx = this.getVelocity(dp); |
|
vec3.subtract(vx, vx, v0); |
|
vec3.scale(vx, vx, 1/e); |
|
|
|
vec3.add(dp, p, [0, e, 0]); |
|
var vy = this.getVelocity(dp); |
|
vec3.subtract(vy, vy, v0); |
|
vec3.scale(vy, vy, 1/e); |
|
|
|
vec3.add(dp, p, [0, 0, e]); |
|
var vz = this.getVelocity(dp); |
|
vec3.subtract(vz, vz, v0); |
|
vec3.scale(vz, vz, 1/e); |
|
|
|
vec3.add(dp, vx, vy); |
|
vec3.add(dp, dp, vz); |
|
return dp; |
|
}; |
|
|
|
var defaultGetVelocity = function(p) { |
|
var u = sampleMeshgrid(p, this.vectors, this.meshgrid, this.clampBorders); |
|
return u; |
|
}; |
|
|
|
|
|
var findLastSmallerIndex = function(points, v) { |
|
for (var i=0; i<points.length; i++) { |
|
var p = points[i]; |
|
if (p === v) return i; |
|
if (p > v) return i-1; |
|
} |
|
return i; |
|
}; |
|
|
|
var tmp = vec3.create(); |
|
var tmp2 = vec3.create(); |
|
|
|
var clamp = function(v, min, max) { |
|
return v < min ? min : (v > max ? max : v); |
|
}; |
|
|
|
var sampleMeshgrid = function(point, array, meshgrid, clampOverflow) { |
|
var x = point[0]; |
|
var y = point[1]; |
|
var z = point[2]; |
|
|
|
var w = meshgrid[0].length; |
|
var h = meshgrid[1].length; |
|
var d = meshgrid[2].length; |
|
|
|
// Find the index of the nearest smaller value in the meshgrid for each coordinate of (x,y,z). |
|
// The nearest smaller value index for x is the index x0 such that |
|
// meshgrid[0][x0] < x and for all x1 > x0, meshgrid[0][x1] >= x. |
|
var x0 = findLastSmallerIndex(meshgrid[0], x); |
|
var y0 = findLastSmallerIndex(meshgrid[1], y); |
|
var z0 = findLastSmallerIndex(meshgrid[2], z); |
|
|
|
// Get the nearest larger meshgrid value indices. |
|
// From the above "nearest smaller value", we know that |
|
// meshgrid[0][x0] < x |
|
// meshgrid[0][x0+1] >= x |
|
var x1 = x0 + 1; |
|
var y1 = y0 + 1; |
|
var z1 = z0 + 1; |
|
|
|
if (meshgrid[0][x0] === x) x1 = x0; |
|
if (meshgrid[1][y0] === y) y1 = y0; |
|
if (meshgrid[2][z0] === z) z1 = z0; |
|
|
|
if (clampOverflow) { |
|
x0 = clamp(x0, 0, w-1); |
|
x1 = clamp(x1, 0, w-1); |
|
y0 = clamp(y0, 0, h-1); |
|
y1 = clamp(y1, 0, h-1); |
|
z0 = clamp(z0, 0, d-1); |
|
z1 = clamp(z1, 0, d-1); |
|
} |
|
|
|
// Reject points outside the meshgrid, return a zero vector. |
|
if (x0 < 0 || y0 < 0 || z0 < 0 || x1 >= w || y1 >= h || z1 >= d) { |
|
return vec3.create(); |
|
} |
|
|
|
// Normalize point coordinates to 0..1 scaling factor between x0 and x1. |
|
var xf = (x - meshgrid[0][x0]) / (meshgrid[0][x1] - meshgrid[0][x0]); |
|
var yf = (y - meshgrid[1][y0]) / (meshgrid[1][y1] - meshgrid[1][y0]); |
|
var zf = (z - meshgrid[2][z0]) / (meshgrid[2][z1] - meshgrid[2][z0]); |
|
|
|
if (xf < 0 || xf > 1 || isNaN(xf)) xf = 0; |
|
if (yf < 0 || yf > 1 || isNaN(yf)) yf = 0; |
|
if (zf < 0 || zf > 1 || isNaN(zf)) zf = 0; |
|
|
|
var z0off = z0*w*h; |
|
var z1off = z1*w*h; |
|
|
|
var y0off = y0*w; |
|
var y1off = y1*w; |
|
|
|
var x0off = x0; |
|
var x1off = x1; |
|
|
|
// Sample data array around the (x,y,z) point. |
|
// vZYX = array[zZoff + yYoff + xXoff] |
|
var v000 = array[y0off + z0off + x0off]; |
|
var v001 = array[y0off + z0off + x1off]; |
|
var v010 = array[y1off + z0off + x0off]; |
|
var v011 = array[y1off + z0off + x1off]; |
|
var v100 = array[y0off + z1off + x0off]; |
|
var v101 = array[y0off + z1off + x1off]; |
|
var v110 = array[y1off + z1off + x0off]; |
|
var v111 = array[y1off + z1off + x1off]; |
|
|
|
var result = vec3.create(); |
|
|
|
// Average samples according to distance to point. |
|
vec3.lerp(result, v000, v001, xf); |
|
vec3.lerp(tmp, v010, v011, xf); |
|
vec3.lerp(result, result, tmp, yf); |
|
vec3.lerp(tmp, v100, v101, xf); |
|
vec3.lerp(tmp2, v110, v111, xf); |
|
vec3.lerp(tmp, tmp, tmp2, yf); |
|
vec3.lerp(result, result, tmp, zf); |
|
|
|
return result; |
|
}; |
|
|
|
|
|
var vabs = function(dst, v) { |
|
var x = v[0]; |
|
var y = v[1]; |
|
var z = v[2]; |
|
dst[0] = x >= 0 ? x : -x; |
|
dst[1] = y >= 0 ? y : -y; |
|
dst[2] = z >= 0 ? z : -z; |
|
return dst; |
|
}; |
|
|
|
var findMinSeparation = function(xs) { |
|
var minSeparation = 1/0; |
|
xs.sort(function(a, b) { return a - b; }); |
|
for (var i=1; i<xs.length; i++) { |
|
var d = Math.abs(xs[i] - xs[i-1]); |
|
if (d < minSeparation) { |
|
minSeparation = d; |
|
} |
|
} |
|
return minSeparation; |
|
}; |
|
|
|
// Finds the minimum per-component distance in positions. |
|
// |
|
var calculateMinPositionDistance = function(positions) { |
|
var xs = [], ys = [], zs = []; |
|
var xi = {}, yi = {}, zi = {}; |
|
for (var i=0; i<positions.length; i++) { |
|
var p = positions[i]; |
|
var x = p[0], y = p[1], z = p[2]; |
|
|
|
// Split the positions array into arrays of unique component values. |
|
// |
|
// Why go through the trouble of using a uniqueness hash table vs |
|
// sort and uniq: |
|
// |
|
// Suppose you've got a million positions in a 100x100x100 grid. |
|
// |
|
// Using a uniqueness hash table, you're doing 1M array reads, |
|
// 3M hash table lookups from 100-element hashes, 300 hash table inserts, then |
|
// sorting three 100-element arrays and iterating over them. |
|
// |
|
// Sort and uniq solution would do 1M array reads, 3M array inserts, |
|
// sort three 1M-element arrays and iterate over them. |
|
if (!xi[x]) { |
|
xs.push(x); |
|
xi[x] = true; |
|
} |
|
if (!yi[y]) { |
|
ys.push(y); |
|
yi[y] = true; |
|
} |
|
if (!zi[z]) { |
|
zs.push(z); |
|
zi[z] = true; |
|
} |
|
} |
|
var xSep = findMinSeparation(xs); |
|
var ySep = findMinSeparation(ys); |
|
var zSep = findMinSeparation(zs); |
|
var minSeparation = Math.min(xSep, ySep, zSep); |
|
if (!isFinite(minSeparation)) { |
|
return 1; |
|
} |
|
return minSeparation; |
|
}; |
|
|
|
module.exports = function(vectorField, bounds) { |
|
var positions = vectorField.startingPositions; |
|
var maxLength = vectorField.maxLength || 1000; |
|
var tubeSize = vectorField.tubeSize || 1; |
|
var absoluteTubeSize = vectorField.absoluteTubeSize; |
|
|
|
if (!vectorField.getDivergence) { |
|
vectorField.getDivergence = defaultGetDivergence; |
|
} |
|
|
|
if (!vectorField.getVelocity) { |
|
vectorField.getVelocity = defaultGetVelocity; |
|
} |
|
|
|
if (vectorField.clampBorders === undefined) { |
|
vectorField.clampBorders = true; |
|
} |
|
|
|
var streams = []; |
|
|
|
var minX = bounds[0][0], minY = bounds[0][1], minZ = bounds[0][2]; |
|
var maxX = bounds[1][0], maxY = bounds[1][1], maxZ = bounds[1][2]; |
|
|
|
var inBounds = function(bounds, p) { |
|
var x = p[0]; |
|
var y = p[1]; |
|
var z = p[2]; |
|
return ( |
|
x >= minX && x <= maxX && |
|
y >= minY && y <= maxY && |
|
z >= minZ && z <= maxZ |
|
); |
|
}; |
|
|
|
var boundsSize = vec3.distance(bounds[0], bounds[1]); |
|
var maxStepSize = 10 * boundsSize / maxLength; |
|
var maxStepSizeSq = maxStepSize * maxStepSize; |
|
|
|
var minDistance = 1; |
|
var maxDivergence = 0; // For component-wise divergence vec3.create(); |
|
var tmp = vec3.create(); |
|
|
|
if (positions.length >= 2) { |
|
minDistance = calculateMinPositionDistance(positions); |
|
} |
|
|
|
for (var i = 0; i < positions.length; i++) { |
|
var p = vec3.create(); |
|
vec3.copy(p, positions[i]); |
|
|
|
var stream = [p]; |
|
var velocities = []; |
|
var v = vectorField.getVelocity(p); |
|
var op = p; |
|
velocities.push(v); |
|
|
|
var divergences = []; |
|
|
|
var dv = vectorField.getDivergence(p, v); |
|
var dvLength = vec3.length(dv); |
|
if (dvLength > maxDivergence) { |
|
maxDivergence = dvLength; |
|
} |
|
// In case we need to do component-wise divergence visualization |
|
// vec3.max(maxDivergence, maxDivergence, vabs(tmp, dv)); |
|
divergences.push(dvLength); |
|
|
|
streams.push({points: stream, velocities: velocities, divergences: divergences}); |
|
|
|
var j = 0; |
|
|
|
while (j < maxLength * 100 && stream.length < maxLength && inBounds(bounds, p)) { |
|
j++; |
|
var np = vec3.clone(v); |
|
var sqLen = vec3.squaredLength(np); |
|
if (sqLen === 0) { |
|
break; |
|
} else if (sqLen > maxStepSizeSq) { |
|
vec3.scale(np, np, maxStepSize / Math.sqrt(sqLen)); |
|
} |
|
vec3.add(np, np, p); |
|
|
|
v = vectorField.getVelocity(np); |
|
|
|
if (vec3.squaredDistance(op, np) - maxStepSizeSq > -0.0001 * maxStepSizeSq) { |
|
stream.push(np); |
|
op = np; |
|
velocities.push(v); |
|
var dv = vectorField.getDivergence(np, v); |
|
var dvLength = vec3.length(dv); |
|
if (dvLength > maxDivergence) { |
|
maxDivergence = dvLength; |
|
} |
|
// In case we need to do component-wise divergence visualization |
|
//vec3.max(maxDivergence, maxDivergence, vabs(tmp, dv)); |
|
divergences.push(dvLength); |
|
} |
|
|
|
p = np; |
|
} |
|
} |
|
|
|
var tubes = createTubes(streams, vectorField.colormap); |
|
if (absoluteTubeSize) { |
|
tubes.tubeScale = absoluteTubeSize; |
|
} else { |
|
tubes.tubeScale = tubeSize * 0.5 * minDistance / maxDivergence; |
|
} |
|
return tubes; |
|
}; |
|
|
|
module.exports.createTubeMesh = require('./lib/tubemesh'); |
|
|
|
},{"./lib/tubemesh":11,"gl-vec3":132,"gl-vec4":162}]},{},[8]);
|