|
(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){ |
|
|
|
},{}],2:[function(require,module,exports){ |
|
'use strict' |
|
|
|
exports.toByteArray = toByteArray |
|
exports.fromByteArray = fromByteArray |
|
|
|
var lookup = [] |
|
var revLookup = [] |
|
var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array |
|
|
|
function init () { |
|
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 |
|
} |
|
|
|
init() |
|
|
|
function toByteArray (b64) { |
|
var i, j, l, tmp, placeHolders, arr |
|
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 |
|
placeHolders = b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0 |
|
|
|
// base64 is 4/3 + up to two characters of the original data |
|
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('') |
|
} |
|
|
|
},{}],3:[function(require,module,exports){ |
|
(function (global){ |
|
/*! |
|
* 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') |
|
var isArray = require('isarray') |
|
|
|
exports.Buffer = Buffer |
|
exports.SlowBuffer = SlowBuffer |
|
exports.INSPECT_MAX_BYTES = 50 |
|
|
|
/** |
|
* If `Buffer.TYPED_ARRAY_SUPPORT`: |
|
* === true Use Uint8Array implementation (fastest) |
|
* === false Use 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+. |
|
* |
|
* Due to various browser bugs, sometimes the Object implementation will be used even |
|
* when the browser supports typed arrays. |
|
* |
|
* Note: |
|
* |
|
* - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances, |
|
* See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438. |
|
* |
|
* - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function. |
|
* |
|
* - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of |
|
* incorrect length in some situations. |
|
|
|
* We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they |
|
* get the Object implementation, which is slower but behaves correctly. |
|
*/ |
|
Buffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined |
|
? global.TYPED_ARRAY_SUPPORT |
|
: typedArraySupport() |
|
|
|
/* |
|
* Export kMaxLength after typed array support is determined. |
|
*/ |
|
exports.kMaxLength = kMaxLength() |
|
|
|
function typedArraySupport () { |
|
try { |
|
var arr = new Uint8Array(1) |
|
arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }} |
|
return arr.foo() === 42 && // typed array instances can be augmented |
|
typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray` |
|
arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray` |
|
} catch (e) { |
|
return false |
|
} |
|
} |
|
|
|
function kMaxLength () { |
|
return Buffer.TYPED_ARRAY_SUPPORT |
|
? 0x7fffffff |
|
: 0x3fffffff |
|
} |
|
|
|
function createBuffer (that, length) { |
|
if (kMaxLength() < length) { |
|
throw new RangeError('Invalid typed array length') |
|
} |
|
if (Buffer.TYPED_ARRAY_SUPPORT) { |
|
// Return an augmented `Uint8Array` instance, for best performance |
|
that = new Uint8Array(length) |
|
that.__proto__ = Buffer.prototype |
|
} else { |
|
// Fallback: Return an object instance of the Buffer class |
|
if (that === null) { |
|
that = new Buffer(length) |
|
} |
|
that.length = length |
|
} |
|
|
|
return that |
|
} |
|
|
|
/** |
|
* 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) { |
|
if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) { |
|
return new 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(this, arg) |
|
} |
|
return from(this, arg, encodingOrOffset, length) |
|
} |
|
|
|
Buffer.poolSize = 8192 // not used by this implementation |
|
|
|
// TODO: Legacy, not needed anymore. Remove in next major version. |
|
Buffer._augment = function (arr) { |
|
arr.__proto__ = Buffer.prototype |
|
return arr |
|
} |
|
|
|
function from (that, value, encodingOrOffset, length) { |
|
if (typeof value === 'number') { |
|
throw new TypeError('"value" argument must not be a number') |
|
} |
|
|
|
if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) { |
|
return fromArrayBuffer(that, value, encodingOrOffset, length) |
|
} |
|
|
|
if (typeof value === 'string') { |
|
return fromString(that, value, encodingOrOffset) |
|
} |
|
|
|
return fromObject(that, 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(null, value, encodingOrOffset, length) |
|
} |
|
|
|
if (Buffer.TYPED_ARRAY_SUPPORT) { |
|
Buffer.prototype.__proto__ = Uint8Array.prototype |
|
Buffer.__proto__ = Uint8Array |
|
if (typeof Symbol !== 'undefined' && Symbol.species && |
|
Buffer[Symbol.species] === Buffer) { |
|
// Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97 |
|
Object.defineProperty(Buffer, Symbol.species, { |
|
value: null, |
|
configurable: true |
|
}) |
|
} |
|
} |
|
|
|
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 (that, size, fill, encoding) { |
|
assertSize(size) |
|
if (size <= 0) { |
|
return createBuffer(that, 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(that, size).fill(fill, encoding) |
|
: createBuffer(that, size).fill(fill) |
|
} |
|
return createBuffer(that, size) |
|
} |
|
|
|
/** |
|
* Creates a new filled Buffer instance. |
|
* alloc(size[, fill[, encoding]]) |
|
**/ |
|
Buffer.alloc = function (size, fill, encoding) { |
|
return alloc(null, size, fill, encoding) |
|
} |
|
|
|
function allocUnsafe (that, size) { |
|
assertSize(size) |
|
that = createBuffer(that, size < 0 ? 0 : checked(size) | 0) |
|
if (!Buffer.TYPED_ARRAY_SUPPORT) { |
|
for (var i = 0; i < size; ++i) { |
|
that[i] = 0 |
|
} |
|
} |
|
return that |
|
} |
|
|
|
/** |
|
* Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance. |
|
* */ |
|
Buffer.allocUnsafe = function (size) { |
|
return allocUnsafe(null, size) |
|
} |
|
/** |
|
* Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance. |
|
*/ |
|
Buffer.allocUnsafeSlow = function (size) { |
|
return allocUnsafe(null, size) |
|
} |
|
|
|
function fromString (that, 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 |
|
that = createBuffer(that, length) |
|
|
|
var actual = that.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') |
|
that = that.slice(0, actual) |
|
} |
|
|
|
return that |
|
} |
|
|
|
function fromArrayLike (that, array) { |
|
var length = array.length < 0 ? 0 : checked(array.length) | 0 |
|
that = createBuffer(that, length) |
|
for (var i = 0; i < length; i += 1) { |
|
that[i] = array[i] & 255 |
|
} |
|
return that |
|
} |
|
|
|
function fromArrayBuffer (that, array, byteOffset, length) { |
|
array.byteLength // this throws if `array` is not a valid ArrayBuffer |
|
|
|
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') |
|
} |
|
|
|
if (byteOffset === undefined && length === undefined) { |
|
array = new Uint8Array(array) |
|
} else if (length === undefined) { |
|
array = new Uint8Array(array, byteOffset) |
|
} else { |
|
array = new Uint8Array(array, byteOffset, length) |
|
} |
|
|
|
if (Buffer.TYPED_ARRAY_SUPPORT) { |
|
// Return an augmented `Uint8Array` instance, for best performance |
|
that = array |
|
that.__proto__ = Buffer.prototype |
|
} else { |
|
// Fallback: Return an object instance of the Buffer class |
|
that = fromArrayLike(that, array) |
|
} |
|
return that |
|
} |
|
|
|
function fromObject (that, obj) { |
|
if (Buffer.isBuffer(obj)) { |
|
var len = checked(obj.length) | 0 |
|
that = createBuffer(that, len) |
|
|
|
if (that.length === 0) { |
|
return that |
|
} |
|
|
|
obj.copy(that, 0, 0, len) |
|
return that |
|
} |
|
|
|
if (obj) { |
|
if ((typeof ArrayBuffer !== 'undefined' && |
|
obj.buffer instanceof ArrayBuffer) || 'length' in obj) { |
|
if (typeof obj.length !== 'number' || isnan(obj.length)) { |
|
return createBuffer(that, 0) |
|
} |
|
return fromArrayLike(that, obj) |
|
} |
|
|
|
if (obj.type === 'Buffer' && isArray(obj.data)) { |
|
return fromArrayLike(that, 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 < kMaxLength()` here because that fails when |
|
// length is NaN (which is otherwise coerced to zero.) |
|
if (length >= kMaxLength()) { |
|
throw new RangeError('Attempt to allocate Buffer larger than maximum ' + |
|
'size: 0x' + kMaxLength().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) |
|
} |
|
|
|
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 (!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 (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' && |
|
(ArrayBuffer.isView(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 |
|
} |
|
} |
|
} |
|
|
|
// The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect |
|
// Buffer instances. |
|
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 | 0 |
|
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 (isNaN(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 (Buffer.TYPED_ARRAY_SUPPORT && |
|
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 (isNaN(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 |
|
} |
|
// legacy write(string, encoding, offset, length) - remove in v0.13 |
|
} 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 |
|
if (Buffer.TYPED_ARRAY_SUPPORT) { |
|
newBuf = this.subarray(start, end) |
|
newBuf.__proto__ = Buffer.prototype |
|
} else { |
|
var sliceLen = end - start |
|
newBuf = new Buffer(sliceLen, undefined) |
|
for (var i = 0; i < sliceLen; ++i) { |
|
newBuf[i] = this[i + start] |
|
} |
|
} |
|
|
|
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) { |
|
if (!noAssert) checkOffset(offset, 1, this.length) |
|
return this[offset] |
|
} |
|
|
|
Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) { |
|
if (!noAssert) checkOffset(offset, 2, this.length) |
|
return this[offset] | (this[offset + 1] << 8) |
|
} |
|
|
|
Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) { |
|
if (!noAssert) checkOffset(offset, 2, this.length) |
|
return (this[offset] << 8) | this[offset + 1] |
|
} |
|
|
|
Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) { |
|
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) { |
|
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) { |
|
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) { |
|
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) { |
|
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) { |
|
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) { |
|
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) { |
|
if (!noAssert) checkOffset(offset, 4, this.length) |
|
return ieee754.read(this, offset, true, 23, 4) |
|
} |
|
|
|
Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) { |
|
if (!noAssert) checkOffset(offset, 4, this.length) |
|
return ieee754.read(this, offset, false, 23, 4) |
|
} |
|
|
|
Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) { |
|
if (!noAssert) checkOffset(offset, 8, this.length) |
|
return ieee754.read(this, offset, true, 52, 8) |
|
} |
|
|
|
Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) { |
|
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) |
|
if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) |
|
this[offset] = (value & 0xff) |
|
return offset + 1 |
|
} |
|
|
|
function objectWriteUInt16 (buf, value, offset, littleEndian) { |
|
if (value < 0) value = 0xffff + value + 1 |
|
for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) { |
|
buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>> |
|
(littleEndian ? i : 1 - i) * 8 |
|
} |
|
} |
|
|
|
Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) { |
|
value = +value |
|
offset = offset | 0 |
|
if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) |
|
if (Buffer.TYPED_ARRAY_SUPPORT) { |
|
this[offset] = (value & 0xff) |
|
this[offset + 1] = (value >>> 8) |
|
} else { |
|
objectWriteUInt16(this, value, offset, true) |
|
} |
|
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) |
|
if (Buffer.TYPED_ARRAY_SUPPORT) { |
|
this[offset] = (value >>> 8) |
|
this[offset + 1] = (value & 0xff) |
|
} else { |
|
objectWriteUInt16(this, value, offset, false) |
|
} |
|
return offset + 2 |
|
} |
|
|
|
function objectWriteUInt32 (buf, value, offset, littleEndian) { |
|
if (value < 0) value = 0xffffffff + value + 1 |
|
for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) { |
|
buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff |
|
} |
|
} |
|
|
|
Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) { |
|
value = +value |
|
offset = offset | 0 |
|
if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) |
|
if (Buffer.TYPED_ARRAY_SUPPORT) { |
|
this[offset + 3] = (value >>> 24) |
|
this[offset + 2] = (value >>> 16) |
|
this[offset + 1] = (value >>> 8) |
|
this[offset] = (value & 0xff) |
|
} else { |
|
objectWriteUInt32(this, value, offset, true) |
|
} |
|
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) |
|
if (Buffer.TYPED_ARRAY_SUPPORT) { |
|
this[offset] = (value >>> 24) |
|
this[offset + 1] = (value >>> 16) |
|
this[offset + 2] = (value >>> 8) |
|
this[offset + 3] = (value & 0xff) |
|
} else { |
|
objectWriteUInt32(this, value, offset, false) |
|
} |
|
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 (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) |
|
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) |
|
if (Buffer.TYPED_ARRAY_SUPPORT) { |
|
this[offset] = (value & 0xff) |
|
this[offset + 1] = (value >>> 8) |
|
} else { |
|
objectWriteUInt16(this, value, offset, true) |
|
} |
|
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) |
|
if (Buffer.TYPED_ARRAY_SUPPORT) { |
|
this[offset] = (value >>> 8) |
|
this[offset + 1] = (value & 0xff) |
|
} else { |
|
objectWriteUInt16(this, value, offset, false) |
|
} |
|
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) |
|
if (Buffer.TYPED_ARRAY_SUPPORT) { |
|
this[offset] = (value & 0xff) |
|
this[offset + 1] = (value >>> 8) |
|
this[offset + 2] = (value >>> 16) |
|
this[offset + 3] = (value >>> 24) |
|
} else { |
|
objectWriteUInt32(this, value, offset, true) |
|
} |
|
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 |
|
if (Buffer.TYPED_ARRAY_SUPPORT) { |
|
this[offset] = (value >>> 24) |
|
this[offset + 1] = (value >>> 16) |
|
this[offset + 2] = (value >>> 8) |
|
this[offset + 3] = (value & 0xff) |
|
} else { |
|
objectWriteUInt32(this, value, offset, false) |
|
} |
|
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) { |
|
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) { |
|
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 || !Buffer.TYPED_ARRAY_SUPPORT) { |
|
// 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 |
|
: utf8ToBytes(new Buffer(val, encoding).toString()) |
|
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 = stringtrim(str).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 stringtrim (str) { |
|
if (str.trim) return str.trim() |
|
return str.replace(/^\s+|\s+$/g, '') |
|
} |
|
|
|
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 |
|
} |
|
|
|
function isnan (val) { |
|
return val !== val // eslint-disable-line no-self-compare |
|
} |
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) |
|
},{"base64-js":2,"ieee754":4,"isarray":5}],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){ |
|
var toString = {}.toString; |
|
|
|
module.exports = Array.isArray || function (arr) { |
|
return toString.call(arr) == '[object Array]'; |
|
}; |
|
|
|
},{}],6:[function(require,module,exports){ |
|
var MidiPlayer = require('midi-player-js'); |
|
var request = require("d3-request"); |
|
var d3_selection = require("d3-selection"); |
|
var d3_transition = require("d3-transition"); |
|
var d3_ease = require("d3-ease"); |
|
var d3_scale = require("d3-scale"); |
|
var d3_interpolate = require("d3-interpolate"); |
|
var d3_color = require("d3-color"); |
|
|
|
|
|
var width = 960; |
|
var height = 500; |
|
|
|
var svg = d3_selection.select("body") |
|
.append("svg") |
|
.attr("width", width) |
|
.attr("height", height); |
|
|
|
var color = d3_scale.scaleLinear().domain([45,75]) |
|
.interpolate(d3_interpolate.interpolateHcl) |
|
.range([d3_color.rgb("#007AFF"), d3_color.rgb('#FFF500')]); |
|
|
|
// Initialize player and register event handler |
|
var Player = new MidiPlayer.Player(function(event) { |
|
//console.log(event); |
|
/**Object { track: 6, delta: 1, tick: 47040, |
|
* running: true, noteNumber: 54, |
|
* noteName: "Gb3", velocity: 88, |
|
* name: "Note on", channel: 6 } app.js:2025:5 */ |
|
if(event.name=="Note on"){ |
|
//http://localhost/gist/audio/jesu/ |
|
var elLength = 40*(event.delta<=1?1:event.delta/120); |
|
var element = svg.append("g"); |
|
element.attr("transform","translate("+(-1*elLength)+" 0)"); |
|
element.append("rect") |
|
.attr("width", elLength) |
|
.attr("height", 20) |
|
.attr("rx", 5) |
|
.attr("ry", 5) |
|
.attr("x", 0) |
|
.attr("y", (event.noteNumber - 45)*12) |
|
.attr("fill", color(event.noteNumber)); |
|
|
|
element.append("text") |
|
.attr("x", 3) |
|
.attr("y", 15 + (event.noteNumber - 45)*12) |
|
.text(event.noteName); |
|
|
|
|
|
var t = d3_transition.transition() |
|
.duration(4000) |
|
.ease(d3_ease.easeLinear); |
|
element.transition(t) |
|
.attr("transform","translate("+(width+300-elLength)+" 0)") |
|
.remove(); |
|
} |
|
}); |
|
|
|
// Load a MIDI file |
|
|
|
request.request("Bach_JmF.mid") |
|
.responseType('arraybuffer') |
|
.get(function(error, midiData){ |
|
|
|
Player.loadArrayBuffer(midiData.response); |
|
var timeInfo = Player.getDivision() |
|
Player.play(); |
|
//var sisi = Player.getEvents(); |
|
//console.info(sisi); |
|
console.info(Player.getDivision()); |
|
}); |
|
|
|
|
|
|
|
|
|
},{"d3-color":9,"d3-ease":12,"d3-interpolate":14,"d3-request":15,"d3-scale":16,"d3-selection":17,"d3-transition":21,"midi-player-js":22}],7:[function(require,module,exports){ |
|
// https://d3js.org/d3-array/ Version 1.2.0. Copyright 2017 Mike Bostock. |
|
(function (global, factory) { |
|
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : |
|
typeof define === 'function' && define.amd ? define(['exports'], factory) : |
|
(factory((global.d3 = global.d3 || {}))); |
|
}(this, (function (exports) { 'use strict'; |
|
|
|
var ascending = function(a, b) { |
|
return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; |
|
}; |
|
|
|
var bisector = function(compare) { |
|
if (compare.length === 1) compare = ascendingComparator(compare); |
|
return { |
|
left: function(a, x, lo, hi) { |
|
if (lo == null) lo = 0; |
|
if (hi == null) hi = a.length; |
|
while (lo < hi) { |
|
var mid = lo + hi >>> 1; |
|
if (compare(a[mid], x) < 0) lo = mid + 1; |
|
else hi = mid; |
|
} |
|
return lo; |
|
}, |
|
right: function(a, x, lo, hi) { |
|
if (lo == null) lo = 0; |
|
if (hi == null) hi = a.length; |
|
while (lo < hi) { |
|
var mid = lo + hi >>> 1; |
|
if (compare(a[mid], x) > 0) hi = mid; |
|
else lo = mid + 1; |
|
} |
|
return lo; |
|
} |
|
}; |
|
}; |
|
|
|
function ascendingComparator(f) { |
|
return function(d, x) { |
|
return ascending(f(d), x); |
|
}; |
|
} |
|
|
|
var ascendingBisect = bisector(ascending); |
|
var bisectRight = ascendingBisect.right; |
|
var bisectLeft = ascendingBisect.left; |
|
|
|
var pairs = function(array, f) { |
|
if (f == null) f = pair; |
|
var i = 0, n = array.length - 1, p = array[0], pairs = new Array(n < 0 ? 0 : n); |
|
while (i < n) pairs[i] = f(p, p = array[++i]); |
|
return pairs; |
|
}; |
|
|
|
function pair(a, b) { |
|
return [a, b]; |
|
} |
|
|
|
var cross = function(values0, values1, reduce) { |
|
var n0 = values0.length, |
|
n1 = values1.length, |
|
values = new Array(n0 * n1), |
|
i0, |
|
i1, |
|
i, |
|
value0; |
|
|
|
if (reduce == null) reduce = pair; |
|
|
|
for (i0 = i = 0; i0 < n0; ++i0) { |
|
for (value0 = values0[i0], i1 = 0; i1 < n1; ++i1, ++i) { |
|
values[i] = reduce(value0, values1[i1]); |
|
} |
|
} |
|
|
|
return values; |
|
}; |
|
|
|
var descending = function(a, b) { |
|
return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN; |
|
}; |
|
|
|
var number = function(x) { |
|
return x === null ? NaN : +x; |
|
}; |
|
|
|
var variance = function(values, valueof) { |
|
var n = values.length, |
|
m = 0, |
|
i = -1, |
|
mean = 0, |
|
value, |
|
delta, |
|
sum = 0; |
|
|
|
if (valueof == null) { |
|
while (++i < n) { |
|
if (!isNaN(value = number(values[i]))) { |
|
delta = value - mean; |
|
mean += delta / ++m; |
|
sum += delta * (value - mean); |
|
} |
|
} |
|
} |
|
|
|
else { |
|
while (++i < n) { |
|
if (!isNaN(value = number(valueof(values[i], i, values)))) { |
|
delta = value - mean; |
|
mean += delta / ++m; |
|
sum += delta * (value - mean); |
|
} |
|
} |
|
} |
|
|
|
if (m > 1) return sum / (m - 1); |
|
}; |
|
|
|
var deviation = function(array, f) { |
|
var v = variance(array, f); |
|
return v ? Math.sqrt(v) : v; |
|
}; |
|
|
|
var extent = function(values, valueof) { |
|
var n = values.length, |
|
i = -1, |
|
value, |
|
min, |
|
max; |
|
|
|
if (valueof == null) { |
|
while (++i < n) { // Find the first comparable value. |
|
if ((value = values[i]) != null && value >= value) { |
|
min = max = value; |
|
while (++i < n) { // Compare the remaining values. |
|
if ((value = values[i]) != null) { |
|
if (min > value) min = value; |
|
if (max < value) max = value; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
else { |
|
while (++i < n) { // Find the first comparable value. |
|
if ((value = valueof(values[i], i, values)) != null && value >= value) { |
|
min = max = value; |
|
while (++i < n) { // Compare the remaining values. |
|
if ((value = valueof(values[i], i, values)) != null) { |
|
if (min > value) min = value; |
|
if (max < value) max = value; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
return [min, max]; |
|
}; |
|
|
|
var array = Array.prototype; |
|
|
|
var slice = array.slice; |
|
var map = array.map; |
|
|
|
var constant = function(x) { |
|
return function() { |
|
return x; |
|
}; |
|
}; |
|
|
|
var identity = function(x) { |
|
return x; |
|
}; |
|
|
|
var range = function(start, stop, step) { |
|
start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step; |
|
|
|
var i = -1, |
|
n = Math.max(0, Math.ceil((stop - start) / step)) | 0, |
|
range = new Array(n); |
|
|
|
while (++i < n) { |
|
range[i] = start + i * step; |
|
} |
|
|
|
return range; |
|
}; |
|
|
|
var e10 = Math.sqrt(50); |
|
var e5 = Math.sqrt(10); |
|
var e2 = Math.sqrt(2); |
|
|
|
var ticks = function(start, stop, count) { |
|
var reverse = stop < start, |
|
i = -1, |
|
n, |
|
ticks, |
|
step; |
|
|
|
if (reverse) n = start, start = stop, stop = n; |
|
|
|
if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return []; |
|
|
|
if (step > 0) { |
|
start = Math.ceil(start / step); |
|
stop = Math.floor(stop / step); |
|
ticks = new Array(n = Math.ceil(stop - start + 1)); |
|
while (++i < n) ticks[i] = (start + i) * step; |
|
} else { |
|
start = Math.floor(start * step); |
|
stop = Math.ceil(stop * step); |
|
ticks = new Array(n = Math.ceil(start - stop + 1)); |
|
while (++i < n) ticks[i] = (start - i) / step; |
|
} |
|
|
|
if (reverse) ticks.reverse(); |
|
|
|
return ticks; |
|
}; |
|
|
|
function tickIncrement(start, stop, count) { |
|
var step = (stop - start) / Math.max(0, count), |
|
power = Math.floor(Math.log(step) / Math.LN10), |
|
error = step / Math.pow(10, power); |
|
return power >= 0 |
|
? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power) |
|
: -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1); |
|
} |
|
|
|
function tickStep(start, stop, count) { |
|
var step0 = Math.abs(stop - start) / Math.max(0, count), |
|
step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)), |
|
error = step0 / step1; |
|
if (error >= e10) step1 *= 10; |
|
else if (error >= e5) step1 *= 5; |
|
else if (error >= e2) step1 *= 2; |
|
return stop < start ? -step1 : step1; |
|
} |
|
|
|
var sturges = function(values) { |
|
return Math.ceil(Math.log(values.length) / Math.LN2) + 1; |
|
}; |
|
|
|
var histogram = function() { |
|
var value = identity, |
|
domain = extent, |
|
threshold = sturges; |
|
|
|
function histogram(data) { |
|
var i, |
|
n = data.length, |
|
x, |
|
values = new Array(n); |
|
|
|
for (i = 0; i < n; ++i) { |
|
values[i] = value(data[i], i, data); |
|
} |
|
|
|
var xz = domain(values), |
|
x0 = xz[0], |
|
x1 = xz[1], |
|
tz = threshold(values, x0, x1); |
|
|
|
// Convert number of thresholds into uniform thresholds. |
|
if (!Array.isArray(tz)) { |
|
tz = tickStep(x0, x1, tz); |
|
tz = range(Math.ceil(x0 / tz) * tz, Math.floor(x1 / tz) * tz, tz); // exclusive |
|
} |
|
|
|
// Remove any thresholds outside the domain. |
|
var m = tz.length; |
|
while (tz[0] <= x0) tz.shift(), --m; |
|
while (tz[m - 1] > x1) tz.pop(), --m; |
|
|
|
var bins = new Array(m + 1), |
|
bin; |
|
|
|
// Initialize bins. |
|
for (i = 0; i <= m; ++i) { |
|
bin = bins[i] = []; |
|
bin.x0 = i > 0 ? tz[i - 1] : x0; |
|
bin.x1 = i < m ? tz[i] : x1; |
|
} |
|
|
|
// Assign data to bins by value, ignoring any outside the domain. |
|
for (i = 0; i < n; ++i) { |
|
x = values[i]; |
|
if (x0 <= x && x <= x1) { |
|
bins[bisectRight(tz, x, 0, m)].push(data[i]); |
|
} |
|
} |
|
|
|
return bins; |
|
} |
|
|
|
histogram.value = function(_) { |
|
return arguments.length ? (value = typeof _ === "function" ? _ : constant(_), histogram) : value; |
|
}; |
|
|
|
histogram.domain = function(_) { |
|
return arguments.length ? (domain = typeof _ === "function" ? _ : constant([_[0], _[1]]), histogram) : domain; |
|
}; |
|
|
|
histogram.thresholds = function(_) { |
|
return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), histogram) : threshold; |
|
}; |
|
|
|
return histogram; |
|
}; |
|
|
|
var quantile = function(values, p, valueof) { |
|
if (valueof == null) valueof = number; |
|
if (!(n = values.length)) return; |
|
if ((p = +p) <= 0 || n < 2) return +valueof(values[0], 0, values); |
|
if (p >= 1) return +valueof(values[n - 1], n - 1, values); |
|
var n, |
|
i = (n - 1) * p, |
|
i0 = Math.floor(i), |
|
value0 = +valueof(values[i0], i0, values), |
|
value1 = +valueof(values[i0 + 1], i0 + 1, values); |
|
return value0 + (value1 - value0) * (i - i0); |
|
}; |
|
|
|
var freedmanDiaconis = function(values, min, max) { |
|
values = map.call(values, number).sort(ascending); |
|
return Math.ceil((max - min) / (2 * (quantile(values, 0.75) - quantile(values, 0.25)) * Math.pow(values.length, -1 / 3))); |
|
}; |
|
|
|
var scott = function(values, min, max) { |
|
return Math.ceil((max - min) / (3.5 * deviation(values) * Math.pow(values.length, -1 / 3))); |
|
}; |
|
|
|
var max = function(values, valueof) { |
|
var n = values.length, |
|
i = -1, |
|
value, |
|
max; |
|
|
|
if (valueof == null) { |
|
while (++i < n) { // Find the first comparable value. |
|
if ((value = values[i]) != null && value >= value) { |
|
max = value; |
|
while (++i < n) { // Compare the remaining values. |
|
if ((value = values[i]) != null && value > max) { |
|
max = value; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
else { |
|
while (++i < n) { // Find the first comparable value. |
|
if ((value = valueof(values[i], i, values)) != null && value >= value) { |
|
max = value; |
|
while (++i < n) { // Compare the remaining values. |
|
if ((value = valueof(values[i], i, values)) != null && value > max) { |
|
max = value; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
return max; |
|
}; |
|
|
|
var mean = function(values, valueof) { |
|
var n = values.length, |
|
m = n, |
|
i = -1, |
|
value, |
|
sum = 0; |
|
|
|
if (valueof == null) { |
|
while (++i < n) { |
|
if (!isNaN(value = number(values[i]))) sum += value; |
|
else --m; |
|
} |
|
} |
|
|
|
else { |
|
while (++i < n) { |
|
if (!isNaN(value = number(valueof(values[i], i, values)))) sum += value; |
|
else --m; |
|
} |
|
} |
|
|
|
if (m) return sum / m; |
|
}; |
|
|
|
var median = function(values, valueof) { |
|
var n = values.length, |
|
i = -1, |
|
value, |
|
numbers = []; |
|
|
|
if (valueof == null) { |
|
while (++i < n) { |
|
if (!isNaN(value = number(values[i]))) { |
|
numbers.push(value); |
|
} |
|
} |
|
} |
|
|
|
else { |
|
while (++i < n) { |
|
if (!isNaN(value = number(valueof(values[i], i, values)))) { |
|
numbers.push(value); |
|
} |
|
} |
|
} |
|
|
|
return quantile(numbers.sort(ascending), 0.5); |
|
}; |
|
|
|
var merge = function(arrays) { |
|
var n = arrays.length, |
|
m, |
|
i = -1, |
|
j = 0, |
|
merged, |
|
array; |
|
|
|
while (++i < n) j += arrays[i].length; |
|
merged = new Array(j); |
|
|
|
while (--n >= 0) { |
|
array = arrays[n]; |
|
m = array.length; |
|
while (--m >= 0) { |
|
merged[--j] = array[m]; |
|
} |
|
} |
|
|
|
return merged; |
|
}; |
|
|
|
var min = function(values, valueof) { |
|
var n = values.length, |
|
i = -1, |
|
value, |
|
min; |
|
|
|
if (valueof == null) { |
|
while (++i < n) { // Find the first comparable value. |
|
if ((value = values[i]) != null && value >= value) { |
|
min = value; |
|
while (++i < n) { // Compare the remaining values. |
|
if ((value = values[i]) != null && min > value) { |
|
min = value; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
else { |
|
while (++i < n) { // Find the first comparable value. |
|
if ((value = valueof(values[i], i, values)) != null && value >= value) { |
|
min = value; |
|
while (++i < n) { // Compare the remaining values. |
|
if ((value = valueof(values[i], i, values)) != null && min > value) { |
|
min = value; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
return min; |
|
}; |
|
|
|
var permute = function(array, indexes) { |
|
var i = indexes.length, permutes = new Array(i); |
|
while (i--) permutes[i] = array[indexes[i]]; |
|
return permutes; |
|
}; |
|
|
|
var scan = function(values, compare) { |
|
if (!(n = values.length)) return; |
|
var n, |
|
i = 0, |
|
j = 0, |
|
xi, |
|
xj = values[j]; |
|
|
|
if (compare == null) compare = ascending; |
|
|
|
while (++i < n) { |
|
if (compare(xi = values[i], xj) < 0 || compare(xj, xj) !== 0) { |
|
xj = xi, j = i; |
|
} |
|
} |
|
|
|
if (compare(xj, xj) === 0) return j; |
|
}; |
|
|
|
var shuffle = function(array, i0, i1) { |
|
var m = (i1 == null ? array.length : i1) - (i0 = i0 == null ? 0 : +i0), |
|
t, |
|
i; |
|
|
|
while (m) { |
|
i = Math.random() * m-- | 0; |
|
t = array[m + i0]; |
|
array[m + i0] = array[i + i0]; |
|
array[i + i0] = t; |
|
} |
|
|
|
return array; |
|
}; |
|
|
|
var sum = function(values, valueof) { |
|
var n = values.length, |
|
i = -1, |
|
value, |
|
sum = 0; |
|
|
|
if (valueof == null) { |
|
while (++i < n) { |
|
if (value = +values[i]) sum += value; // Note: zero and null are equivalent. |
|
} |
|
} |
|
|
|
else { |
|
while (++i < n) { |
|
if (value = +valueof(values[i], i, values)) sum += value; |
|
} |
|
} |
|
|
|
return sum; |
|
}; |
|
|
|
var transpose = function(matrix) { |
|
if (!(n = matrix.length)) return []; |
|
for (var i = -1, m = min(matrix, length), transpose = new Array(m); ++i < m;) { |
|
for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n;) { |
|
row[j] = matrix[j][i]; |
|
} |
|
} |
|
return transpose; |
|
}; |
|
|
|
function length(d) { |
|
return d.length; |
|
} |
|
|
|
var zip = function() { |
|
return transpose(arguments); |
|
}; |
|
|
|
exports.bisect = bisectRight; |
|
exports.bisectRight = bisectRight; |
|
exports.bisectLeft = bisectLeft; |
|
exports.ascending = ascending; |
|
exports.bisector = bisector; |
|
exports.cross = cross; |
|
exports.descending = descending; |
|
exports.deviation = deviation; |
|
exports.extent = extent; |
|
exports.histogram = histogram; |
|
exports.thresholdFreedmanDiaconis = freedmanDiaconis; |
|
exports.thresholdScott = scott; |
|
exports.thresholdSturges = sturges; |
|
exports.max = max; |
|
exports.mean = mean; |
|
exports.median = median; |
|
exports.merge = merge; |
|
exports.min = min; |
|
exports.pairs = pairs; |
|
exports.permute = permute; |
|
exports.quantile = quantile; |
|
exports.range = range; |
|
exports.scan = scan; |
|
exports.shuffle = shuffle; |
|
exports.sum = sum; |
|
exports.ticks = ticks; |
|
exports.tickIncrement = tickIncrement; |
|
exports.tickStep = tickStep; |
|
exports.transpose = transpose; |
|
exports.variance = variance; |
|
exports.zip = zip; |
|
|
|
Object.defineProperty(exports, '__esModule', { value: true }); |
|
|
|
}))); |
|
|
|
},{}],8:[function(require,module,exports){ |
|
// https://d3js.org/d3-collection/ Version 1.0.3. Copyright 2017 Mike Bostock. |
|
(function (global, factory) { |
|
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : |
|
typeof define === 'function' && define.amd ? define(['exports'], factory) : |
|
(factory((global.d3 = global.d3 || {}))); |
|
}(this, (function (exports) { 'use strict'; |
|
|
|
var prefix = "$"; |
|
|
|
function Map() {} |
|
|
|
Map.prototype = map.prototype = { |
|
constructor: Map, |
|
has: function(key) { |
|
return (prefix + key) in this; |
|
}, |
|
get: function(key) { |
|
return this[prefix + key]; |
|
}, |
|
set: function(key, value) { |
|
this[prefix + key] = value; |
|
return this; |
|
}, |
|
remove: function(key) { |
|
var property = prefix + key; |
|
return property in this && delete this[property]; |
|
}, |
|
clear: function() { |
|
for (var property in this) if (property[0] === prefix) delete this[property]; |
|
}, |
|
keys: function() { |
|
var keys = []; |
|
for (var property in this) if (property[0] === prefix) keys.push(property.slice(1)); |
|
return keys; |
|
}, |
|
values: function() { |
|
var values = []; |
|
for (var property in this) if (property[0] === prefix) values.push(this[property]); |
|
return values; |
|
}, |
|
entries: function() { |
|
var entries = []; |
|
for (var property in this) if (property[0] === prefix) entries.push({key: property.slice(1), value: this[property]}); |
|
return entries; |
|
}, |
|
size: function() { |
|
var size = 0; |
|
for (var property in this) if (property[0] === prefix) ++size; |
|
return size; |
|
}, |
|
empty: function() { |
|
for (var property in this) if (property[0] === prefix) return false; |
|
return true; |
|
}, |
|
each: function(f) { |
|
for (var property in this) if (property[0] === prefix) f(this[property], property.slice(1), this); |
|
} |
|
}; |
|
|
|
function map(object, f) { |
|
var map = new Map; |
|
|
|
// Copy constructor. |
|
if (object instanceof Map) object.each(function(value, key) { map.set(key, value); }); |
|
|
|
// Index array by numeric index or specified key function. |
|
else if (Array.isArray(object)) { |
|
var i = -1, |
|
n = object.length, |
|
o; |
|
|
|
if (f == null) while (++i < n) map.set(i, object[i]); |
|
else while (++i < n) map.set(f(o = object[i], i, object), o); |
|
} |
|
|
|
// Convert object to map. |
|
else if (object) for (var key in object) map.set(key, object[key]); |
|
|
|
return map; |
|
} |
|
|
|
var nest = function() { |
|
var keys = [], |
|
sortKeys = [], |
|
sortValues, |
|
rollup, |
|
nest; |
|
|
|
function apply(array, depth, createResult, setResult) { |
|
if (depth >= keys.length) return rollup != null |
|
? rollup(array) : (sortValues != null |
|
? array.sort(sortValues) |
|
: array); |
|
|
|
var i = -1, |
|
n = array.length, |
|
key = keys[depth++], |
|
keyValue, |
|
value, |
|
valuesByKey = map(), |
|
values, |
|
result = createResult(); |
|
|
|
while (++i < n) { |
|
if (values = valuesByKey.get(keyValue = key(value = array[i]) + "")) { |
|
values.push(value); |
|
} else { |
|
valuesByKey.set(keyValue, [value]); |
|
} |
|
} |
|
|
|
valuesByKey.each(function(values, key) { |
|
setResult(result, key, apply(values, depth, createResult, setResult)); |
|
}); |
|
|
|
return result; |
|
} |
|
|
|
function entries(map$$1, depth) { |
|
if (++depth > keys.length) return map$$1; |
|
var array, sortKey = sortKeys[depth - 1]; |
|
if (rollup != null && depth >= keys.length) array = map$$1.entries(); |
|
else array = [], map$$1.each(function(v, k) { array.push({key: k, values: entries(v, depth)}); }); |
|
return sortKey != null ? array.sort(function(a, b) { return sortKey(a.key, b.key); }) : array; |
|
} |
|
|
|
return nest = { |
|
object: function(array) { return apply(array, 0, createObject, setObject); }, |
|
map: function(array) { return apply(array, 0, createMap, setMap); }, |
|
entries: function(array) { return entries(apply(array, 0, createMap, setMap), 0); }, |
|
key: function(d) { keys.push(d); return nest; }, |
|
sortKeys: function(order) { sortKeys[keys.length - 1] = order; return nest; }, |
|
sortValues: function(order) { sortValues = order; return nest; }, |
|
rollup: function(f) { rollup = f; return nest; } |
|
}; |
|
}; |
|
|
|
function createObject() { |
|
return {}; |
|
} |
|
|
|
function setObject(object, key, value) { |
|
object[key] = value; |
|
} |
|
|
|
function createMap() { |
|
return map(); |
|
} |
|
|
|
function setMap(map$$1, key, value) { |
|
map$$1.set(key, value); |
|
} |
|
|
|
function Set() {} |
|
|
|
var proto = map.prototype; |
|
|
|
Set.prototype = set.prototype = { |
|
constructor: Set, |
|
has: proto.has, |
|
add: function(value) { |
|
value += ""; |
|
this[prefix + value] = value; |
|
return this; |
|
}, |
|
remove: proto.remove, |
|
clear: proto.clear, |
|
values: proto.keys, |
|
size: proto.size, |
|
empty: proto.empty, |
|
each: proto.each |
|
}; |
|
|
|
function set(object, f) { |
|
var set = new Set; |
|
|
|
// Copy constructor. |
|
if (object instanceof Set) object.each(function(value) { set.add(value); }); |
|
|
|
// Otherwise, assume it’s an array. |
|
else if (object) { |
|
var i = -1, n = object.length; |
|
if (f == null) while (++i < n) set.add(object[i]); |
|
else while (++i < n) set.add(f(object[i], i, object)); |
|
} |
|
|
|
return set; |
|
} |
|
|
|
var keys = function(map) { |
|
var keys = []; |
|
for (var key in map) keys.push(key); |
|
return keys; |
|
}; |
|
|
|
var values = function(map) { |
|
var values = []; |
|
for (var key in map) values.push(map[key]); |
|
return values; |
|
}; |
|
|
|
var entries = function(map) { |
|
var entries = []; |
|
for (var key in map) entries.push({key: key, value: map[key]}); |
|
return entries; |
|
}; |
|
|
|
exports.nest = nest; |
|
exports.set = set; |
|
exports.map = map; |
|
exports.keys = keys; |
|
exports.values = values; |
|
exports.entries = entries; |
|
|
|
Object.defineProperty(exports, '__esModule', { value: true }); |
|
|
|
}))); |
|
|
|
},{}],9:[function(require,module,exports){ |
|
// https://d3js.org/d3-color/ Version 1.0.3. Copyright 2017 Mike Bostock. |
|
(function (global, factory) { |
|
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : |
|
typeof define === 'function' && define.amd ? define(['exports'], factory) : |
|
(factory((global.d3 = global.d3 || {}))); |
|
}(this, (function (exports) { 'use strict'; |
|
|
|
var define = function(constructor, factory, prototype) { |
|
constructor.prototype = factory.prototype = prototype; |
|
prototype.constructor = constructor; |
|
}; |
|
|
|
function extend(parent, definition) { |
|
var prototype = Object.create(parent.prototype); |
|
for (var key in definition) prototype[key] = definition[key]; |
|
return prototype; |
|
} |
|
|
|
function Color() {} |
|
|
|
var darker = 0.7; |
|
var brighter = 1 / darker; |
|
|
|
var reI = "\\s*([+-]?\\d+)\\s*"; |
|
var reN = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*"; |
|
var reP = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*"; |
|
var reHex3 = /^#([0-9a-f]{3})$/; |
|
var reHex6 = /^#([0-9a-f]{6})$/; |
|
var reRgbInteger = new RegExp("^rgb\\(" + [reI, reI, reI] + "\\)$"); |
|
var reRgbPercent = new RegExp("^rgb\\(" + [reP, reP, reP] + "\\)$"); |
|
var reRgbaInteger = new RegExp("^rgba\\(" + [reI, reI, reI, reN] + "\\)$"); |
|
var reRgbaPercent = new RegExp("^rgba\\(" + [reP, reP, reP, reN] + "\\)$"); |
|
var reHslPercent = new RegExp("^hsl\\(" + [reN, reP, reP] + "\\)$"); |
|
var reHslaPercent = new RegExp("^hsla\\(" + [reN, reP, reP, reN] + "\\)$"); |
|
|
|
var named = { |
|
aliceblue: 0xf0f8ff, |
|
antiquewhite: 0xfaebd7, |
|
aqua: 0x00ffff, |
|
aquamarine: 0x7fffd4, |
|
azure: 0xf0ffff, |
|
beige: 0xf5f5dc, |
|
bisque: 0xffe4c4, |
|
black: 0x000000, |
|
blanchedalmond: 0xffebcd, |
|
blue: 0x0000ff, |
|
blueviolet: 0x8a2be2, |
|
brown: 0xa52a2a, |
|
burlywood: 0xdeb887, |
|
cadetblue: 0x5f9ea0, |
|
chartreuse: 0x7fff00, |
|
chocolate: 0xd2691e, |
|
coral: 0xff7f50, |
|
cornflowerblue: 0x6495ed, |
|
cornsilk: 0xfff8dc, |
|
crimson: 0xdc143c, |
|
cyan: 0x00ffff, |
|
darkblue: 0x00008b, |
|
darkcyan: 0x008b8b, |
|
darkgoldenrod: 0xb8860b, |
|
darkgray: 0xa9a9a9, |
|
darkgreen: 0x006400, |
|
darkgrey: 0xa9a9a9, |
|
darkkhaki: 0xbdb76b, |
|
darkmagenta: 0x8b008b, |
|
darkolivegreen: 0x556b2f, |
|
darkorange: 0xff8c00, |
|
darkorchid: 0x9932cc, |
|
darkred: 0x8b0000, |
|
darksalmon: 0xe9967a, |
|
darkseagreen: 0x8fbc8f, |
|
darkslateblue: 0x483d8b, |
|
darkslategray: 0x2f4f4f, |
|
darkslategrey: 0x2f4f4f, |
|
darkturquoise: 0x00ced1, |
|
darkviolet: 0x9400d3, |
|
deeppink: 0xff1493, |
|
deepskyblue: 0x00bfff, |
|
dimgray: 0x696969, |
|
dimgrey: 0x696969, |
|
dodgerblue: 0x1e90ff, |
|
firebrick: 0xb22222, |
|
floralwhite: 0xfffaf0, |
|
forestgreen: 0x228b22, |
|
fuchsia: 0xff00ff, |
|
gainsboro: 0xdcdcdc, |
|
ghostwhite: 0xf8f8ff, |
|
gold: 0xffd700, |
|
goldenrod: 0xdaa520, |
|
gray: 0x808080, |
|
green: 0x008000, |
|
greenyellow: 0xadff2f, |
|
grey: 0x808080, |
|
honeydew: 0xf0fff0, |
|
hotpink: 0xff69b4, |
|
indianred: 0xcd5c5c, |
|
indigo: 0x4b0082, |
|
ivory: 0xfffff0, |
|
khaki: 0xf0e68c, |
|
lavender: 0xe6e6fa, |
|
lavenderblush: 0xfff0f5, |
|
lawngreen: 0x7cfc00, |
|
lemonchiffon: 0xfffacd, |
|
lightblue: 0xadd8e6, |
|
lightcoral: 0xf08080, |
|
lightcyan: 0xe0ffff, |
|
lightgoldenrodyellow: 0xfafad2, |
|
lightgray: 0xd3d3d3, |
|
lightgreen: 0x90ee90, |
|
lightgrey: 0xd3d3d3, |
|
lightpink: 0xffb6c1, |
|
lightsalmon: 0xffa07a, |
|
lightseagreen: 0x20b2aa, |
|
lightskyblue: 0x87cefa, |
|
lightslategray: 0x778899, |
|
lightslategrey: 0x778899, |
|
lightsteelblue: 0xb0c4de, |
|
lightyellow: 0xffffe0, |
|
lime: 0x00ff00, |
|
limegreen: 0x32cd32, |
|
linen: 0xfaf0e6, |
|
magenta: 0xff00ff, |
|
maroon: 0x800000, |
|
mediumaquamarine: 0x66cdaa, |
|
mediumblue: 0x0000cd, |
|
mediumorchid: 0xba55d3, |
|
mediumpurple: 0x9370db, |
|
mediumseagreen: 0x3cb371, |
|
mediumslateblue: 0x7b68ee, |
|
mediumspringgreen: 0x00fa9a, |
|
mediumturquoise: 0x48d1cc, |
|
mediumvioletred: 0xc71585, |
|
midnightblue: 0x191970, |
|
mintcream: 0xf5fffa, |
|
mistyrose: 0xffe4e1, |
|
moccasin: 0xffe4b5, |
|
navajowhite: 0xffdead, |
|
navy: 0x000080, |
|
oldlace: 0xfdf5e6, |
|
olive: 0x808000, |
|
olivedrab: 0x6b8e23, |
|
orange: 0xffa500, |
|
orangered: 0xff4500, |
|
orchid: 0xda70d6, |
|
palegoldenrod: 0xeee8aa, |
|
palegreen: 0x98fb98, |
|
paleturquoise: 0xafeeee, |
|
palevioletred: 0xdb7093, |
|
papayawhip: 0xffefd5, |
|
peachpuff: 0xffdab9, |
|
peru: 0xcd853f, |
|
pink: 0xffc0cb, |
|
plum: 0xdda0dd, |
|
powderblue: 0xb0e0e6, |
|
purple: 0x800080, |
|
rebeccapurple: 0x663399, |
|
red: 0xff0000, |
|
rosybrown: 0xbc8f8f, |
|
royalblue: 0x4169e1, |
|
saddlebrown: 0x8b4513, |
|
salmon: 0xfa8072, |
|
sandybrown: 0xf4a460, |
|
seagreen: 0x2e8b57, |
|
seashell: 0xfff5ee, |
|
sienna: 0xa0522d, |
|
silver: 0xc0c0c0, |
|
skyblue: 0x87ceeb, |
|
slateblue: 0x6a5acd, |
|
slategray: 0x708090, |
|
slategrey: 0x708090, |
|
snow: 0xfffafa, |
|
springgreen: 0x00ff7f, |
|
steelblue: 0x4682b4, |
|
tan: 0xd2b48c, |
|
teal: 0x008080, |
|
thistle: 0xd8bfd8, |
|
tomato: 0xff6347, |
|
turquoise: 0x40e0d0, |
|
violet: 0xee82ee, |
|
wheat: 0xf5deb3, |
|
white: 0xffffff, |
|
whitesmoke: 0xf5f5f5, |
|
yellow: 0xffff00, |
|
yellowgreen: 0x9acd32 |
|
}; |
|
|
|
define(Color, color, { |
|
displayable: function() { |
|
return this.rgb().displayable(); |
|
}, |
|
toString: function() { |
|
return this.rgb() + ""; |
|
} |
|
}); |
|
|
|
function color(format) { |
|
var m; |
|
format = (format + "").trim().toLowerCase(); |
|
return (m = reHex3.exec(format)) ? (m = parseInt(m[1], 16), new Rgb((m >> 8 & 0xf) | (m >> 4 & 0x0f0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1)) // #f00 |
|
: (m = reHex6.exec(format)) ? rgbn(parseInt(m[1], 16)) // #ff0000 |
|
: (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0) |
|
: (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%) |
|
: (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1) |
|
: (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1) |
|
: (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%) |
|
: (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1) |
|
: named.hasOwnProperty(format) ? rgbn(named[format]) |
|
: format === "transparent" ? new Rgb(NaN, NaN, NaN, 0) |
|
: null; |
|
} |
|
|
|
function rgbn(n) { |
|
return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1); |
|
} |
|
|
|
function rgba(r, g, b, a) { |
|
if (a <= 0) r = g = b = NaN; |
|
return new Rgb(r, g, b, a); |
|
} |
|
|
|
function rgbConvert(o) { |
|
if (!(o instanceof Color)) o = color(o); |
|
if (!o) return new Rgb; |
|
o = o.rgb(); |
|
return new Rgb(o.r, o.g, o.b, o.opacity); |
|
} |
|
|
|
function rgb(r, g, b, opacity) { |
|
return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity); |
|
} |
|
|
|
function Rgb(r, g, b, opacity) { |
|
this.r = +r; |
|
this.g = +g; |
|
this.b = +b; |
|
this.opacity = +opacity; |
|
} |
|
|
|
define(Rgb, rgb, extend(Color, { |
|
brighter: function(k) { |
|
k = k == null ? brighter : Math.pow(brighter, k); |
|
return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); |
|
}, |
|
darker: function(k) { |
|
k = k == null ? darker : Math.pow(darker, k); |
|
return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); |
|
}, |
|
rgb: function() { |
|
return this; |
|
}, |
|
displayable: function() { |
|
return (0 <= this.r && this.r <= 255) |
|
&& (0 <= this.g && this.g <= 255) |
|
&& (0 <= this.b && this.b <= 255) |
|
&& (0 <= this.opacity && this.opacity <= 1); |
|
}, |
|
toString: function() { |
|
var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a)); |
|
return (a === 1 ? "rgb(" : "rgba(") |
|
+ Math.max(0, Math.min(255, Math.round(this.r) || 0)) + ", " |
|
+ Math.max(0, Math.min(255, Math.round(this.g) || 0)) + ", " |
|
+ Math.max(0, Math.min(255, Math.round(this.b) || 0)) |
|
+ (a === 1 ? ")" : ", " + a + ")"); |
|
} |
|
})); |
|
|
|
function hsla(h, s, l, a) { |
|
if (a <= 0) h = s = l = NaN; |
|
else if (l <= 0 || l >= 1) h = s = NaN; |
|
else if (s <= 0) h = NaN; |
|
return new Hsl(h, s, l, a); |
|
} |
|
|
|
function hslConvert(o) { |
|
if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity); |
|
if (!(o instanceof Color)) o = color(o); |
|
if (!o) return new Hsl; |
|
if (o instanceof Hsl) return o; |
|
o = o.rgb(); |
|
var r = o.r / 255, |
|
g = o.g / 255, |
|
b = o.b / 255, |
|
min = Math.min(r, g, b), |
|
max = Math.max(r, g, b), |
|
h = NaN, |
|
s = max - min, |
|
l = (max + min) / 2; |
|
if (s) { |
|
if (r === max) h = (g - b) / s + (g < b) * 6; |
|
else if (g === max) h = (b - r) / s + 2; |
|
else h = (r - g) / s + 4; |
|
s /= l < 0.5 ? max + min : 2 - max - min; |
|
h *= 60; |
|
} else { |
|
s = l > 0 && l < 1 ? 0 : h; |
|
} |
|
return new Hsl(h, s, l, o.opacity); |
|
} |
|
|
|
function hsl(h, s, l, opacity) { |
|
return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity); |
|
} |
|
|
|
function Hsl(h, s, l, opacity) { |
|
this.h = +h; |
|
this.s = +s; |
|
this.l = +l; |
|
this.opacity = +opacity; |
|
} |
|
|
|
define(Hsl, hsl, extend(Color, { |
|
brighter: function(k) { |
|
k = k == null ? brighter : Math.pow(brighter, k); |
|
return new Hsl(this.h, this.s, this.l * k, this.opacity); |
|
}, |
|
darker: function(k) { |
|
k = k == null ? darker : Math.pow(darker, k); |
|
return new Hsl(this.h, this.s, this.l * k, this.opacity); |
|
}, |
|
rgb: function() { |
|
var h = this.h % 360 + (this.h < 0) * 360, |
|
s = isNaN(h) || isNaN(this.s) ? 0 : this.s, |
|
l = this.l, |
|
m2 = l + (l < 0.5 ? l : 1 - l) * s, |
|
m1 = 2 * l - m2; |
|
return new Rgb( |
|
hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2), |
|
hsl2rgb(h, m1, m2), |
|
hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2), |
|
this.opacity |
|
); |
|
}, |
|
displayable: function() { |
|
return (0 <= this.s && this.s <= 1 || isNaN(this.s)) |
|
&& (0 <= this.l && this.l <= 1) |
|
&& (0 <= this.opacity && this.opacity <= 1); |
|
} |
|
})); |
|
|
|
/* From FvD 13.37, CSS Color Module Level 3 */ |
|
function hsl2rgb(h, m1, m2) { |
|
return (h < 60 ? m1 + (m2 - m1) * h / 60 |
|
: h < 180 ? m2 |
|
: h < 240 ? m1 + (m2 - m1) * (240 - h) / 60 |
|
: m1) * 255; |
|
} |
|
|
|
var deg2rad = Math.PI / 180; |
|
var rad2deg = 180 / Math.PI; |
|
|
|
var Kn = 18; |
|
var Xn = 0.950470; |
|
var Yn = 1; |
|
var Zn = 1.088830; |
|
var t0 = 4 / 29; |
|
var t1 = 6 / 29; |
|
var t2 = 3 * t1 * t1; |
|
var t3 = t1 * t1 * t1; |
|
|
|
function labConvert(o) { |
|
if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity); |
|
if (o instanceof Hcl) { |
|
var h = o.h * deg2rad; |
|
return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity); |
|
} |
|
if (!(o instanceof Rgb)) o = rgbConvert(o); |
|
var b = rgb2xyz(o.r), |
|
a = rgb2xyz(o.g), |
|
l = rgb2xyz(o.b), |
|
x = xyz2lab((0.4124564 * b + 0.3575761 * a + 0.1804375 * l) / Xn), |
|
y = xyz2lab((0.2126729 * b + 0.7151522 * a + 0.0721750 * l) / Yn), |
|
z = xyz2lab((0.0193339 * b + 0.1191920 * a + 0.9503041 * l) / Zn); |
|
return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity); |
|
} |
|
|
|
function lab(l, a, b, opacity) { |
|
return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity); |
|
} |
|
|
|
function Lab(l, a, b, opacity) { |
|
this.l = +l; |
|
this.a = +a; |
|
this.b = +b; |
|
this.opacity = +opacity; |
|
} |
|
|
|
define(Lab, lab, extend(Color, { |
|
brighter: function(k) { |
|
return new Lab(this.l + Kn * (k == null ? 1 : k), this.a, this.b, this.opacity); |
|
}, |
|
darker: function(k) { |
|
return new Lab(this.l - Kn * (k == null ? 1 : k), this.a, this.b, this.opacity); |
|
}, |
|
rgb: function() { |
|
var y = (this.l + 16) / 116, |
|
x = isNaN(this.a) ? y : y + this.a / 500, |
|
z = isNaN(this.b) ? y : y - this.b / 200; |
|
y = Yn * lab2xyz(y); |
|
x = Xn * lab2xyz(x); |
|
z = Zn * lab2xyz(z); |
|
return new Rgb( |
|
xyz2rgb( 3.2404542 * x - 1.5371385 * y - 0.4985314 * z), // D65 -> sRGB |
|
xyz2rgb(-0.9692660 * x + 1.8760108 * y + 0.0415560 * z), |
|
xyz2rgb( 0.0556434 * x - 0.2040259 * y + 1.0572252 * z), |
|
this.opacity |
|
); |
|
} |
|
})); |
|
|
|
function xyz2lab(t) { |
|
return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0; |
|
} |
|
|
|
function lab2xyz(t) { |
|
return t > t1 ? t * t * t : t2 * (t - t0); |
|
} |
|
|
|
function xyz2rgb(x) { |
|
return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055); |
|
} |
|
|
|
function rgb2xyz(x) { |
|
return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4); |
|
} |
|
|
|
function hclConvert(o) { |
|
if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity); |
|
if (!(o instanceof Lab)) o = labConvert(o); |
|
var h = Math.atan2(o.b, o.a) * rad2deg; |
|
return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity); |
|
} |
|
|
|
function hcl(h, c, l, opacity) { |
|
return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity); |
|
} |
|
|
|
function Hcl(h, c, l, opacity) { |
|
this.h = +h; |
|
this.c = +c; |
|
this.l = +l; |
|
this.opacity = +opacity; |
|
} |
|
|
|
define(Hcl, hcl, extend(Color, { |
|
brighter: function(k) { |
|
return new Hcl(this.h, this.c, this.l + Kn * (k == null ? 1 : k), this.opacity); |
|
}, |
|
darker: function(k) { |
|
return new Hcl(this.h, this.c, this.l - Kn * (k == null ? 1 : k), this.opacity); |
|
}, |
|
rgb: function() { |
|
return labConvert(this).rgb(); |
|
} |
|
})); |
|
|
|
var A = -0.14861; |
|
var B = +1.78277; |
|
var C = -0.29227; |
|
var D = -0.90649; |
|
var E = +1.97294; |
|
var ED = E * D; |
|
var EB = E * B; |
|
var BC_DA = B * C - D * A; |
|
|
|
function cubehelixConvert(o) { |
|
if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity); |
|
if (!(o instanceof Rgb)) o = rgbConvert(o); |
|
var r = o.r / 255, |
|
g = o.g / 255, |
|
b = o.b / 255, |
|
l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB), |
|
bl = b - l, |
|
k = (E * (g - l) - C * bl) / D, |
|
s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=0 or l=1 |
|
h = s ? Math.atan2(k, bl) * rad2deg - 120 : NaN; |
|
return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity); |
|
} |
|
|
|
function cubehelix(h, s, l, opacity) { |
|
return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity); |
|
} |
|
|
|
function Cubehelix(h, s, l, opacity) { |
|
this.h = +h; |
|
this.s = +s; |
|
this.l = +l; |
|
this.opacity = +opacity; |
|
} |
|
|
|
define(Cubehelix, cubehelix, extend(Color, { |
|
brighter: function(k) { |
|
k = k == null ? brighter : Math.pow(brighter, k); |
|
return new Cubehelix(this.h, this.s, this.l * k, this.opacity); |
|
}, |
|
darker: function(k) { |
|
k = k == null ? darker : Math.pow(darker, k); |
|
return new Cubehelix(this.h, this.s, this.l * k, this.opacity); |
|
}, |
|
rgb: function() { |
|
var h = isNaN(this.h) ? 0 : (this.h + 120) * deg2rad, |
|
l = +this.l, |
|
a = isNaN(this.s) ? 0 : this.s * l * (1 - l), |
|
cosh = Math.cos(h), |
|
sinh = Math.sin(h); |
|
return new Rgb( |
|
255 * (l + a * (A * cosh + B * sinh)), |
|
255 * (l + a * (C * cosh + D * sinh)), |
|
255 * (l + a * (E * cosh)), |
|
this.opacity |
|
); |
|
} |
|
})); |
|
|
|
exports.color = color; |
|
exports.rgb = rgb; |
|
exports.hsl = hsl; |
|
exports.lab = lab; |
|
exports.hcl = hcl; |
|
exports.cubehelix = cubehelix; |
|
|
|
Object.defineProperty(exports, '__esModule', { value: true }); |
|
|
|
}))); |
|
|
|
},{}],10:[function(require,module,exports){ |
|
// https://d3js.org/d3-dispatch/ Version 1.0.3. Copyright 2017 Mike Bostock. |
|
(function (global, factory) { |
|
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : |
|
typeof define === 'function' && define.amd ? define(['exports'], factory) : |
|
(factory((global.d3 = global.d3 || {}))); |
|
}(this, (function (exports) { 'use strict'; |
|
|
|
var noop = {value: function() {}}; |
|
|
|
function dispatch() { |
|
for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) { |
|
if (!(t = arguments[i] + "") || (t in _)) throw new Error("illegal type: " + t); |
|
_[t] = []; |
|
} |
|
return new Dispatch(_); |
|
} |
|
|
|
function Dispatch(_) { |
|
this._ = _; |
|
} |
|
|
|
function parseTypenames(typenames, types) { |
|
return typenames.trim().split(/^|\s+/).map(function(t) { |
|
var name = "", i = t.indexOf("."); |
|
if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i); |
|
if (t && !types.hasOwnProperty(t)) throw new Error("unknown type: " + t); |
|
return {type: t, name: name}; |
|
}); |
|
} |
|
|
|
Dispatch.prototype = dispatch.prototype = { |
|
constructor: Dispatch, |
|
on: function(typename, callback) { |
|
var _ = this._, |
|
T = parseTypenames(typename + "", _), |
|
t, |
|
i = -1, |
|
n = T.length; |
|
|
|
// If no callback was specified, return the callback of the given type and name. |
|
if (arguments.length < 2) { |
|
while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t; |
|
return; |
|
} |
|
|
|
// If a type was specified, set the callback for the given type and name. |
|
// Otherwise, if a null callback was specified, remove callbacks of the given name. |
|
if (callback != null && typeof callback !== "function") throw new Error("invalid callback: " + callback); |
|
while (++i < n) { |
|
if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback); |
|
else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null); |
|
} |
|
|
|
return this; |
|
}, |
|
copy: function() { |
|
var copy = {}, _ = this._; |
|
for (var t in _) copy[t] = _[t].slice(); |
|
return new Dispatch(copy); |
|
}, |
|
call: function(type, that) { |
|
if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2]; |
|
if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type); |
|
for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args); |
|
}, |
|
apply: function(type, that, args) { |
|
if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type); |
|
for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args); |
|
} |
|
}; |
|
|
|
function get(type, name) { |
|
for (var i = 0, n = type.length, c; i < n; ++i) { |
|
if ((c = type[i]).name === name) { |
|
return c.value; |
|
} |
|
} |
|
} |
|
|
|
function set(type, name, callback) { |
|
for (var i = 0, n = type.length; i < n; ++i) { |
|
if (type[i].name === name) { |
|
type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1)); |
|
break; |
|
} |
|
} |
|
if (callback != null) type.push({name: name, value: callback}); |
|
return type; |
|
} |
|
|
|
exports.dispatch = dispatch; |
|
|
|
Object.defineProperty(exports, '__esModule', { value: true }); |
|
|
|
}))); |
|
|
|
},{}],11:[function(require,module,exports){ |
|
// https://d3js.org/d3-dsv/ Version 1.0.5. Copyright 2017 Mike Bostock. |
|
(function (global, factory) { |
|
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : |
|
typeof define === 'function' && define.amd ? define(['exports'], factory) : |
|
(factory((global.d3 = global.d3 || {}))); |
|
}(this, (function (exports) { 'use strict'; |
|
|
|
function objectConverter(columns) { |
|
return new Function("d", "return {" + columns.map(function(name, i) { |
|
return JSON.stringify(name) + ": d[" + i + "]"; |
|
}).join(",") + "}"); |
|
} |
|
|
|
function customConverter(columns, f) { |
|
var object = objectConverter(columns); |
|
return function(row, i) { |
|
return f(object(row), i, columns); |
|
}; |
|
} |
|
|
|
// Compute unique columns in order of discovery. |
|
function inferColumns(rows) { |
|
var columnSet = Object.create(null), |
|
columns = []; |
|
|
|
rows.forEach(function(row) { |
|
for (var column in row) { |
|
if (!(column in columnSet)) { |
|
columns.push(columnSet[column] = column); |
|
} |
|
} |
|
}); |
|
|
|
return columns; |
|
} |
|
|
|
var dsv = function(delimiter) { |
|
var reFormat = new RegExp("[\"" + delimiter + "\n\r]"), |
|
delimiterCode = delimiter.charCodeAt(0); |
|
|
|
function parse(text, f) { |
|
var convert, columns, rows = parseRows(text, function(row, i) { |
|
if (convert) return convert(row, i - 1); |
|
columns = row, convert = f ? customConverter(row, f) : objectConverter(row); |
|
}); |
|
rows.columns = columns; |
|
return rows; |
|
} |
|
|
|
function parseRows(text, f) { |
|
var EOL = {}, // sentinel value for end-of-line |
|
EOF = {}, // sentinel value for end-of-file |
|
rows = [], // output rows |
|
N = text.length, |
|
I = 0, // current character index |
|
n = 0, // the current line number |
|
t, // the current token |
|
eol; // is the current token followed by EOL? |
|
|
|
function token() { |
|
if (I >= N) return EOF; // special case: end of file |
|
if (eol) return eol = false, EOL; // special case: end of line |
|
|
|
// special case: quotes |
|
var j = I, c; |
|
if (text.charCodeAt(j) === 34) { |
|
var i = j; |
|
while (i++ < N) { |
|
if (text.charCodeAt(i) === 34) { |
|
if (text.charCodeAt(i + 1) !== 34) break; |
|
++i; |
|
} |
|
} |
|
I = i + 2; |
|
c = text.charCodeAt(i + 1); |
|
if (c === 13) { |
|
eol = true; |
|
if (text.charCodeAt(i + 2) === 10) ++I; |
|
} else if (c === 10) { |
|
eol = true; |
|
} |
|
return text.slice(j + 1, i).replace(/""/g, "\""); |
|
} |
|
|
|
// common case: find next delimiter or newline |
|
while (I < N) { |
|
var k = 1; |
|
c = text.charCodeAt(I++); |
|
if (c === 10) eol = true; // \n |
|
else if (c === 13) { eol = true; if (text.charCodeAt(I) === 10) ++I, ++k; } // \r|\r\n |
|
else if (c !== delimiterCode) continue; |
|
return text.slice(j, I - k); |
|
} |
|
|
|
// special case: last token before EOF |
|
return text.slice(j); |
|
} |
|
|
|
while ((t = token()) !== EOF) { |
|
var a = []; |
|
while (t !== EOL && t !== EOF) { |
|
a.push(t); |
|
t = token(); |
|
} |
|
if (f && (a = f(a, n++)) == null) continue; |
|
rows.push(a); |
|
} |
|
|
|
return rows; |
|
} |
|
|
|
function format(rows, columns) { |
|
if (columns == null) columns = inferColumns(rows); |
|
return [columns.map(formatValue).join(delimiter)].concat(rows.map(function(row) { |
|
return columns.map(function(column) { |
|
return formatValue(row[column]); |
|
}).join(delimiter); |
|
})).join("\n"); |
|
} |
|
|
|
function formatRows(rows) { |
|
return rows.map(formatRow).join("\n"); |
|
} |
|
|
|
function formatRow(row) { |
|
return row.map(formatValue).join(delimiter); |
|
} |
|
|
|
function formatValue(text) { |
|
return text == null ? "" |
|
: reFormat.test(text += "") ? "\"" + text.replace(/\"/g, "\"\"") + "\"" |
|
: text; |
|
} |
|
|
|
return { |
|
parse: parse, |
|
parseRows: parseRows, |
|
format: format, |
|
formatRows: formatRows |
|
}; |
|
}; |
|
|
|
var csv = dsv(","); |
|
|
|
var csvParse = csv.parse; |
|
var csvParseRows = csv.parseRows; |
|
var csvFormat = csv.format; |
|
var csvFormatRows = csv.formatRows; |
|
|
|
var tsv = dsv("\t"); |
|
|
|
var tsvParse = tsv.parse; |
|
var tsvParseRows = tsv.parseRows; |
|
var tsvFormat = tsv.format; |
|
var tsvFormatRows = tsv.formatRows; |
|
|
|
exports.dsvFormat = dsv; |
|
exports.csvParse = csvParse; |
|
exports.csvParseRows = csvParseRows; |
|
exports.csvFormat = csvFormat; |
|
exports.csvFormatRows = csvFormatRows; |
|
exports.tsvParse = tsvParse; |
|
exports.tsvParseRows = tsvParseRows; |
|
exports.tsvFormat = tsvFormat; |
|
exports.tsvFormatRows = tsvFormatRows; |
|
|
|
Object.defineProperty(exports, '__esModule', { value: true }); |
|
|
|
}))); |
|
|
|
},{}],12:[function(require,module,exports){ |
|
// https://d3js.org/d3-ease/ Version 1.0.3. Copyright 2017 Mike Bostock. |
|
(function (global, factory) { |
|
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : |
|
typeof define === 'function' && define.amd ? define(['exports'], factory) : |
|
(factory((global.d3 = global.d3 || {}))); |
|
}(this, (function (exports) { 'use strict'; |
|
|
|
function linear(t) { |
|
return +t; |
|
} |
|
|
|
function quadIn(t) { |
|
return t * t; |
|
} |
|
|
|
function quadOut(t) { |
|
return t * (2 - t); |
|
} |
|
|
|
function quadInOut(t) { |
|
return ((t *= 2) <= 1 ? t * t : --t * (2 - t) + 1) / 2; |
|
} |
|
|
|
function cubicIn(t) { |
|
return t * t * t; |
|
} |
|
|
|
function cubicOut(t) { |
|
return --t * t * t + 1; |
|
} |
|
|
|
function cubicInOut(t) { |
|
return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2; |
|
} |
|
|
|
var exponent = 3; |
|
|
|
var polyIn = (function custom(e) { |
|
e = +e; |
|
|
|
function polyIn(t) { |
|
return Math.pow(t, e); |
|
} |
|
|
|
polyIn.exponent = custom; |
|
|
|
return polyIn; |
|
})(exponent); |
|
|
|
var polyOut = (function custom(e) { |
|
e = +e; |
|
|
|
function polyOut(t) { |
|
return 1 - Math.pow(1 - t, e); |
|
} |
|
|
|
polyOut.exponent = custom; |
|
|
|
return polyOut; |
|
})(exponent); |
|
|
|
var polyInOut = (function custom(e) { |
|
e = +e; |
|
|
|
function polyInOut(t) { |
|
return ((t *= 2) <= 1 ? Math.pow(t, e) : 2 - Math.pow(2 - t, e)) / 2; |
|
} |
|
|
|
polyInOut.exponent = custom; |
|
|
|
return polyInOut; |
|
})(exponent); |
|
|
|
var pi = Math.PI; |
|
var halfPi = pi / 2; |
|
|
|
function sinIn(t) { |
|
return 1 - Math.cos(t * halfPi); |
|
} |
|
|
|
function sinOut(t) { |
|
return Math.sin(t * halfPi); |
|
} |
|
|
|
function sinInOut(t) { |
|
return (1 - Math.cos(pi * t)) / 2; |
|
} |
|
|
|
function expIn(t) { |
|
return Math.pow(2, 10 * t - 10); |
|
} |
|
|
|
function expOut(t) { |
|
return 1 - Math.pow(2, -10 * t); |
|
} |
|
|
|
function expInOut(t) { |
|
return ((t *= 2) <= 1 ? Math.pow(2, 10 * t - 10) : 2 - Math.pow(2, 10 - 10 * t)) / 2; |
|
} |
|
|
|
function circleIn(t) { |
|
return 1 - Math.sqrt(1 - t * t); |
|
} |
|
|
|
function circleOut(t) { |
|
return Math.sqrt(1 - --t * t); |
|
} |
|
|
|
function circleInOut(t) { |
|
return ((t *= 2) <= 1 ? 1 - Math.sqrt(1 - t * t) : Math.sqrt(1 - (t -= 2) * t) + 1) / 2; |
|
} |
|
|
|
var b1 = 4 / 11; |
|
var b2 = 6 / 11; |
|
var b3 = 8 / 11; |
|
var b4 = 3 / 4; |
|
var b5 = 9 / 11; |
|
var b6 = 10 / 11; |
|
var b7 = 15 / 16; |
|
var b8 = 21 / 22; |
|
var b9 = 63 / 64; |
|
var b0 = 1 / b1 / b1; |
|
|
|
function bounceIn(t) { |
|
return 1 - bounceOut(1 - t); |
|
} |
|
|
|
function bounceOut(t) { |
|
return (t = +t) < b1 ? b0 * t * t : t < b3 ? b0 * (t -= b2) * t + b4 : t < b6 ? b0 * (t -= b5) * t + b7 : b0 * (t -= b8) * t + b9; |
|
} |
|
|
|
function bounceInOut(t) { |
|
return ((t *= 2) <= 1 ? 1 - bounceOut(1 - t) : bounceOut(t - 1) + 1) / 2; |
|
} |
|
|
|
var overshoot = 1.70158; |
|
|
|
var backIn = (function custom(s) { |
|
s = +s; |
|
|
|
function backIn(t) { |
|
return t * t * ((s + 1) * t - s); |
|
} |
|
|
|
backIn.overshoot = custom; |
|
|
|
return backIn; |
|
})(overshoot); |
|
|
|
var backOut = (function custom(s) { |
|
s = +s; |
|
|
|
function backOut(t) { |
|
return --t * t * ((s + 1) * t + s) + 1; |
|
} |
|
|
|
backOut.overshoot = custom; |
|
|
|
return backOut; |
|
})(overshoot); |
|
|
|
var backInOut = (function custom(s) { |
|
s = +s; |
|
|
|
function backInOut(t) { |
|
return ((t *= 2) < 1 ? t * t * ((s + 1) * t - s) : (t -= 2) * t * ((s + 1) * t + s) + 2) / 2; |
|
} |
|
|
|
backInOut.overshoot = custom; |
|
|
|
return backInOut; |
|
})(overshoot); |
|
|
|
var tau = 2 * Math.PI; |
|
var amplitude = 1; |
|
var period = 0.3; |
|
|
|
var elasticIn = (function custom(a, p) { |
|
var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau); |
|
|
|
function elasticIn(t) { |
|
return a * Math.pow(2, 10 * --t) * Math.sin((s - t) / p); |
|
} |
|
|
|
elasticIn.amplitude = function(a) { return custom(a, p * tau); }; |
|
elasticIn.period = function(p) { return custom(a, p); }; |
|
|
|
return elasticIn; |
|
})(amplitude, period); |
|
|
|
var elasticOut = (function custom(a, p) { |
|
var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau); |
|
|
|
function elasticOut(t) { |
|
return 1 - a * Math.pow(2, -10 * (t = +t)) * Math.sin((t + s) / p); |
|
} |
|
|
|
elasticOut.amplitude = function(a) { return custom(a, p * tau); }; |
|
elasticOut.period = function(p) { return custom(a, p); }; |
|
|
|
return elasticOut; |
|
})(amplitude, period); |
|
|
|
var elasticInOut = (function custom(a, p) { |
|
var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau); |
|
|
|
function elasticInOut(t) { |
|
return ((t = t * 2 - 1) < 0 |
|
? a * Math.pow(2, 10 * t) * Math.sin((s - t) / p) |
|
: 2 - a * Math.pow(2, -10 * t) * Math.sin((s + t) / p)) / 2; |
|
} |
|
|
|
elasticInOut.amplitude = function(a) { return custom(a, p * tau); }; |
|
elasticInOut.period = function(p) { return custom(a, p); }; |
|
|
|
return elasticInOut; |
|
})(amplitude, period); |
|
|
|
exports.easeLinear = linear; |
|
exports.easeQuad = quadInOut; |
|
exports.easeQuadIn = quadIn; |
|
exports.easeQuadOut = quadOut; |
|
exports.easeQuadInOut = quadInOut; |
|
exports.easeCubic = cubicInOut; |
|
exports.easeCubicIn = cubicIn; |
|
exports.easeCubicOut = cubicOut; |
|
exports.easeCubicInOut = cubicInOut; |
|
exports.easePoly = polyInOut; |
|
exports.easePolyIn = polyIn; |
|
exports.easePolyOut = polyOut; |
|
exports.easePolyInOut = polyInOut; |
|
exports.easeSin = sinInOut; |
|
exports.easeSinIn = sinIn; |
|
exports.easeSinOut = sinOut; |
|
exports.easeSinInOut = sinInOut; |
|
exports.easeExp = expInOut; |
|
exports.easeExpIn = expIn; |
|
exports.easeExpOut = expOut; |
|
exports.easeExpInOut = expInOut; |
|
exports.easeCircle = circleInOut; |
|
exports.easeCircleIn = circleIn; |
|
exports.easeCircleOut = circleOut; |
|
exports.easeCircleInOut = circleInOut; |
|
exports.easeBounce = bounceOut; |
|
exports.easeBounceIn = bounceIn; |
|
exports.easeBounceOut = bounceOut; |
|
exports.easeBounceInOut = bounceInOut; |
|
exports.easeBack = backInOut; |
|
exports.easeBackIn = backIn; |
|
exports.easeBackOut = backOut; |
|
exports.easeBackInOut = backInOut; |
|
exports.easeElastic = elasticOut; |
|
exports.easeElasticIn = elasticIn; |
|
exports.easeElasticOut = elasticOut; |
|
exports.easeElasticInOut = elasticInOut; |
|
|
|
Object.defineProperty(exports, '__esModule', { value: true }); |
|
|
|
}))); |
|
|
|
},{}],13:[function(require,module,exports){ |
|
// https://d3js.org/d3-format/ Version 1.2.0. Copyright 2017 Mike Bostock. |
|
(function (global, factory) { |
|
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : |
|
typeof define === 'function' && define.amd ? define(['exports'], factory) : |
|
(factory((global.d3 = global.d3 || {}))); |
|
}(this, (function (exports) { 'use strict'; |
|
|
|
// Computes the decimal coefficient and exponent of the specified number x with |
|
// significant digits p, where x is positive and p is in [1, 21] or undefined. |
|
// For example, formatDecimal(1.23) returns ["123", 0]. |
|
var formatDecimal = function(x, p) { |
|
if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf("e")) < 0) return null; // NaN, ±Infinity |
|
var i, coefficient = x.slice(0, i); |
|
|
|
// The string returned by toExponential either has the form \d\.\d+e[-+]\d+ |
|
// (e.g., 1.2e+3) or the form \de[-+]\d+ (e.g., 1e+3). |
|
return [ |
|
coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient, |
|
+x.slice(i + 1) |
|
]; |
|
}; |
|
|
|
var exponent = function(x) { |
|
return x = formatDecimal(Math.abs(x)), x ? x[1] : NaN; |
|
}; |
|
|
|
var formatGroup = function(grouping, thousands) { |
|
return function(value, width) { |
|
var i = value.length, |
|
t = [], |
|
j = 0, |
|
g = grouping[0], |
|
length = 0; |
|
|
|
while (i > 0 && g > 0) { |
|
if (length + g + 1 > width) g = Math.max(1, width - length); |
|
t.push(value.substring(i -= g, i + g)); |
|
if ((length += g + 1) > width) break; |
|
g = grouping[j = (j + 1) % grouping.length]; |
|
} |
|
|
|
return t.reverse().join(thousands); |
|
}; |
|
}; |
|
|
|
var formatNumerals = function(numerals) { |
|
return function(value) { |
|
return value.replace(/[0-9]/g, function(i) { |
|
return numerals[+i]; |
|
}); |
|
}; |
|
}; |
|
|
|
var formatDefault = function(x, p) { |
|
x = x.toPrecision(p); |
|
|
|
out: for (var n = x.length, i = 1, i0 = -1, i1; i < n; ++i) { |
|
switch (x[i]) { |
|
case ".": i0 = i1 = i; break; |
|
case "0": if (i0 === 0) i0 = i; i1 = i; break; |
|
case "e": break out; |
|
default: if (i0 > 0) i0 = 0; break; |
|
} |
|
} |
|
|
|
return i0 > 0 ? x.slice(0, i0) + x.slice(i1 + 1) : x; |
|
}; |
|
|
|
var prefixExponent; |
|
|
|
var formatPrefixAuto = function(x, p) { |
|
var d = formatDecimal(x, p); |
|
if (!d) return x + ""; |
|
var coefficient = d[0], |
|
exponent = d[1], |
|
i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1, |
|
n = coefficient.length; |
|
return i === n ? coefficient |
|
: i > n ? coefficient + new Array(i - n + 1).join("0") |
|
: i > 0 ? coefficient.slice(0, i) + "." + coefficient.slice(i) |
|
: "0." + new Array(1 - i).join("0") + formatDecimal(x, Math.max(0, p + i - 1))[0]; // less than 1y! |
|
}; |
|
|
|
var formatRounded = function(x, p) { |
|
var d = formatDecimal(x, p); |
|
if (!d) return x + ""; |
|
var coefficient = d[0], |
|
exponent = d[1]; |
|
return exponent < 0 ? "0." + new Array(-exponent).join("0") + coefficient |
|
: coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + "." + coefficient.slice(exponent + 1) |
|
: coefficient + new Array(exponent - coefficient.length + 2).join("0"); |
|
}; |
|
|
|
var formatTypes = { |
|
"": formatDefault, |
|
"%": function(x, p) { return (x * 100).toFixed(p); }, |
|
"b": function(x) { return Math.round(x).toString(2); }, |
|
"c": function(x) { return x + ""; }, |
|
"d": function(x) { return Math.round(x).toString(10); }, |
|
"e": function(x, p) { return x.toExponential(p); }, |
|
"f": function(x, p) { return x.toFixed(p); }, |
|
"g": function(x, p) { return x.toPrecision(p); }, |
|
"o": function(x) { return Math.round(x).toString(8); }, |
|
"p": function(x, p) { return formatRounded(x * 100, p); }, |
|
"r": formatRounded, |
|
"s": formatPrefixAuto, |
|
"X": function(x) { return Math.round(x).toString(16).toUpperCase(); }, |
|
"x": function(x) { return Math.round(x).toString(16); } |
|
}; |
|
|
|
// [[fill]align][sign][symbol][0][width][,][.precision][type] |
|
var re = /^(?:(.)?([<>=^]))?([+\-\( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?([a-z%])?$/i; |
|
|
|
function formatSpecifier(specifier) { |
|
return new FormatSpecifier(specifier); |
|
} |
|
|
|
formatSpecifier.prototype = FormatSpecifier.prototype; // instanceof |
|
|
|
function FormatSpecifier(specifier) { |
|
if (!(match = re.exec(specifier))) throw new Error("invalid format: " + specifier); |
|
|
|
var match, |
|
fill = match[1] || " ", |
|
align = match[2] || ">", |
|
sign = match[3] || "-", |
|
symbol = match[4] || "", |
|
zero = !!match[5], |
|
width = match[6] && +match[6], |
|
comma = !!match[7], |
|
precision = match[8] && +match[8].slice(1), |
|
type = match[9] || ""; |
|
|
|
// The "n" type is an alias for ",g". |
|
if (type === "n") comma = true, type = "g"; |
|
|
|
// Map invalid types to the default format. |
|
else if (!formatTypes[type]) type = ""; |
|
|
|
// If zero fill is specified, padding goes after sign and before digits. |
|
if (zero || (fill === "0" && align === "=")) zero = true, fill = "0", align = "="; |
|
|
|
this.fill = fill; |
|
this.align = align; |
|
this.sign = sign; |
|
this.symbol = symbol; |
|
this.zero = zero; |
|
this.width = width; |
|
this.comma = comma; |
|
this.precision = precision; |
|
this.type = type; |
|
} |
|
|
|
FormatSpecifier.prototype.toString = function() { |
|
return this.fill |
|
+ this.align |
|
+ this.sign |
|
+ this.symbol |
|
+ (this.zero ? "0" : "") |
|
+ (this.width == null ? "" : Math.max(1, this.width | 0)) |
|
+ (this.comma ? "," : "") |
|
+ (this.precision == null ? "" : "." + Math.max(0, this.precision | 0)) |
|
+ this.type; |
|
}; |
|
|
|
var identity = function(x) { |
|
return x; |
|
}; |
|
|
|
var prefixes = ["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"]; |
|
|
|
var formatLocale = function(locale) { |
|
var group = locale.grouping && locale.thousands ? formatGroup(locale.grouping, locale.thousands) : identity, |
|
currency = locale.currency, |
|
decimal = locale.decimal, |
|
numerals = locale.numerals ? formatNumerals(locale.numerals) : identity, |
|
percent = locale.percent || "%"; |
|
|
|
function newFormat(specifier) { |
|
specifier = formatSpecifier(specifier); |
|
|
|
var fill = specifier.fill, |
|
align = specifier.align, |
|
sign = specifier.sign, |
|
symbol = specifier.symbol, |
|
zero = specifier.zero, |
|
width = specifier.width, |
|
comma = specifier.comma, |
|
precision = specifier.precision, |
|
type = specifier.type; |
|
|
|
// Compute the prefix and suffix. |
|
// For SI-prefix, the suffix is lazily computed. |
|
var prefix = symbol === "$" ? currency[0] : symbol === "#" && /[boxX]/.test(type) ? "0" + type.toLowerCase() : "", |
|
suffix = symbol === "$" ? currency[1] : /[%p]/.test(type) ? percent : ""; |
|
|
|
// What format function should we use? |
|
// Is this an integer type? |
|
// Can this type generate exponential notation? |
|
var formatType = formatTypes[type], |
|
maybeSuffix = !type || /[defgprs%]/.test(type); |
|
|
|
// Set the default precision if not specified, |
|
// or clamp the specified precision to the supported range. |
|
// For significant precision, it must be in [1, 21]. |
|
// For fixed precision, it must be in [0, 20]. |
|
precision = precision == null ? (type ? 6 : 12) |
|
: /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision)) |
|
: Math.max(0, Math.min(20, precision)); |
|
|
|
function format(value) { |
|
var valuePrefix = prefix, |
|
valueSuffix = suffix, |
|
i, n, c; |
|
|
|
if (type === "c") { |
|
valueSuffix = formatType(value) + valueSuffix; |
|
value = ""; |
|
} else { |
|
value = +value; |
|
|
|
// Perform the initial formatting. |
|
var valueNegative = value < 0; |
|
value = formatType(Math.abs(value), precision); |
|
|
|
// If a negative value rounds to zero during formatting, treat as positive. |
|
if (valueNegative && +value === 0) valueNegative = false; |
|
|
|
// Compute the prefix and suffix. |
|
valuePrefix = (valueNegative ? (sign === "(" ? sign : "-") : sign === "-" || sign === "(" ? "" : sign) + valuePrefix; |
|
valueSuffix = valueSuffix + (type === "s" ? prefixes[8 + prefixExponent / 3] : "") + (valueNegative && sign === "(" ? ")" : ""); |
|
|
|
// Break the formatted value into the integer “value” part that can be |
|
// grouped, and fractional or exponential “suffix” part that is not. |
|
if (maybeSuffix) { |
|
i = -1, n = value.length; |
|
while (++i < n) { |
|
if (c = value.charCodeAt(i), 48 > c || c > 57) { |
|
valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix; |
|
value = value.slice(0, i); |
|
break; |
|
} |
|
} |
|
} |
|
} |
|
|
|
// If the fill character is not "0", grouping is applied before padding. |
|
if (comma && !zero) value = group(value, Infinity); |
|
|
|
// Compute the padding. |
|
var length = valuePrefix.length + value.length + valueSuffix.length, |
|
padding = length < width ? new Array(width - length + 1).join(fill) : ""; |
|
|
|
// If the fill character is "0", grouping is applied after padding. |
|
if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = ""; |
|
|
|
// Reconstruct the final output based on the desired alignment. |
|
switch (align) { |
|
case "<": value = valuePrefix + value + valueSuffix + padding; break; |
|
case "=": value = valuePrefix + padding + value + valueSuffix; break; |
|
case "^": value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); break; |
|
default: value = padding + valuePrefix + value + valueSuffix; break; |
|
} |
|
|
|
return numerals(value); |
|
} |
|
|
|
format.toString = function() { |
|
return specifier + ""; |
|
}; |
|
|
|
return format; |
|
} |
|
|
|
function formatPrefix(specifier, value) { |
|
var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = "f", specifier)), |
|
e = Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3, |
|
k = Math.pow(10, -e), |
|
prefix = prefixes[8 + e / 3]; |
|
return function(value) { |
|
return f(k * value) + prefix; |
|
}; |
|
} |
|
|
|
return { |
|
format: newFormat, |
|
formatPrefix: formatPrefix |
|
}; |
|
}; |
|
|
|
var locale; |
|
|
|
|
|
|
|
defaultLocale({ |
|
decimal: ".", |
|
thousands: ",", |
|
grouping: [3], |
|
currency: ["$", ""] |
|
}); |
|
|
|
function defaultLocale(definition) { |
|
locale = formatLocale(definition); |
|
exports.format = locale.format; |
|
exports.formatPrefix = locale.formatPrefix; |
|
return locale; |
|
} |
|
|
|
var precisionFixed = function(step) { |
|
return Math.max(0, -exponent(Math.abs(step))); |
|
}; |
|
|
|
var precisionPrefix = function(step, value) { |
|
return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3 - exponent(Math.abs(step))); |
|
}; |
|
|
|
var precisionRound = function(step, max) { |
|
step = Math.abs(step), max = Math.abs(max) - step; |
|
return Math.max(0, exponent(max) - exponent(step)) + 1; |
|
}; |
|
|
|
exports.formatDefaultLocale = defaultLocale; |
|
exports.formatLocale = formatLocale; |
|
exports.formatSpecifier = formatSpecifier; |
|
exports.precisionFixed = precisionFixed; |
|
exports.precisionPrefix = precisionPrefix; |
|
exports.precisionRound = precisionRound; |
|
|
|
Object.defineProperty(exports, '__esModule', { value: true }); |
|
|
|
}))); |
|
|
|
},{}],14:[function(require,module,exports){ |
|
// https://d3js.org/d3-interpolate/ Version 1.1.5. Copyright 2017 Mike Bostock. |
|
(function (global, factory) { |
|
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-color')) : |
|
typeof define === 'function' && define.amd ? define(['exports', 'd3-color'], factory) : |
|
(factory((global.d3 = global.d3 || {}),global.d3)); |
|
}(this, (function (exports,d3Color) { 'use strict'; |
|
|
|
function basis(t1, v0, v1, v2, v3) { |
|
var t2 = t1 * t1, t3 = t2 * t1; |
|
return ((1 - 3 * t1 + 3 * t2 - t3) * v0 |
|
+ (4 - 6 * t2 + 3 * t3) * v1 |
|
+ (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2 |
|
+ t3 * v3) / 6; |
|
} |
|
|
|
var basis$1 = function(values) { |
|
var n = values.length - 1; |
|
return function(t) { |
|
var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n), |
|
v1 = values[i], |
|
v2 = values[i + 1], |
|
v0 = i > 0 ? values[i - 1] : 2 * v1 - v2, |
|
v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1; |
|
return basis((t - i / n) * n, v0, v1, v2, v3); |
|
}; |
|
}; |
|
|
|
var basisClosed = function(values) { |
|
var n = values.length; |
|
return function(t) { |
|
var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n), |
|
v0 = values[(i + n - 1) % n], |
|
v1 = values[i % n], |
|
v2 = values[(i + 1) % n], |
|
v3 = values[(i + 2) % n]; |
|
return basis((t - i / n) * n, v0, v1, v2, v3); |
|
}; |
|
}; |
|
|
|
var constant = function(x) { |
|
return function() { |
|
return x; |
|
}; |
|
}; |
|
|
|
function linear(a, d) { |
|
return function(t) { |
|
return a + t * d; |
|
}; |
|
} |
|
|
|
function exponential(a, b, y) { |
|
return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) { |
|
return Math.pow(a + t * b, y); |
|
}; |
|
} |
|
|
|
function hue(a, b) { |
|
var d = b - a; |
|
return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant(isNaN(a) ? b : a); |
|
} |
|
|
|
function gamma(y) { |
|
return (y = +y) === 1 ? nogamma : function(a, b) { |
|
return b - a ? exponential(a, b, y) : constant(isNaN(a) ? b : a); |
|
}; |
|
} |
|
|
|
function nogamma(a, b) { |
|
var d = b - a; |
|
return d ? linear(a, d) : constant(isNaN(a) ? b : a); |
|
} |
|
|
|
var rgb$1 = ((function rgbGamma(y) { |
|
var color$$1 = gamma(y); |
|
|
|
function rgb$$1(start, end) { |
|
var r = color$$1((start = d3Color.rgb(start)).r, (end = d3Color.rgb(end)).r), |
|
g = color$$1(start.g, end.g), |
|
b = color$$1(start.b, end.b), |
|
opacity = nogamma(start.opacity, end.opacity); |
|
return function(t) { |
|
start.r = r(t); |
|
start.g = g(t); |
|
start.b = b(t); |
|
start.opacity = opacity(t); |
|
return start + ""; |
|
}; |
|
} |
|
|
|
rgb$$1.gamma = rgbGamma; |
|
|
|
return rgb$$1; |
|
}))(1); |
|
|
|
function rgbSpline(spline) { |
|
return function(colors) { |
|
var n = colors.length, |
|
r = new Array(n), |
|
g = new Array(n), |
|
b = new Array(n), |
|
i, color$$1; |
|
for (i = 0; i < n; ++i) { |
|
color$$1 = d3Color.rgb(colors[i]); |
|
r[i] = color$$1.r || 0; |
|
g[i] = color$$1.g || 0; |
|
b[i] = color$$1.b || 0; |
|
} |
|
r = spline(r); |
|
g = spline(g); |
|
b = spline(b); |
|
color$$1.opacity = 1; |
|
return function(t) { |
|
color$$1.r = r(t); |
|
color$$1.g = g(t); |
|
color$$1.b = b(t); |
|
return color$$1 + ""; |
|
}; |
|
}; |
|
} |
|
|
|
var rgbBasis = rgbSpline(basis$1); |
|
var rgbBasisClosed = rgbSpline(basisClosed); |
|
|
|
var array = function(a, b) { |
|
var nb = b ? b.length : 0, |
|
na = a ? Math.min(nb, a.length) : 0, |
|
x = new Array(nb), |
|
c = new Array(nb), |
|
i; |
|
|
|
for (i = 0; i < na; ++i) x[i] = value(a[i], b[i]); |
|
for (; i < nb; ++i) c[i] = b[i]; |
|
|
|
return function(t) { |
|
for (i = 0; i < na; ++i) c[i] = x[i](t); |
|
return c; |
|
}; |
|
}; |
|
|
|
var date = function(a, b) { |
|
var d = new Date; |
|
return a = +a, b -= a, function(t) { |
|
return d.setTime(a + b * t), d; |
|
}; |
|
}; |
|
|
|
var number = function(a, b) { |
|
return a = +a, b -= a, function(t) { |
|
return a + b * t; |
|
}; |
|
}; |
|
|
|
var object = function(a, b) { |
|
var i = {}, |
|
c = {}, |
|
k; |
|
|
|
if (a === null || typeof a !== "object") a = {}; |
|
if (b === null || typeof b !== "object") b = {}; |
|
|
|
for (k in b) { |
|
if (k in a) { |
|
i[k] = value(a[k], b[k]); |
|
} else { |
|
c[k] = b[k]; |
|
} |
|
} |
|
|
|
return function(t) { |
|
for (k in i) c[k] = i[k](t); |
|
return c; |
|
}; |
|
}; |
|
|
|
var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g; |
|
var reB = new RegExp(reA.source, "g"); |
|
|
|
function zero(b) { |
|
return function() { |
|
return b; |
|
}; |
|
} |
|
|
|
function one(b) { |
|
return function(t) { |
|
return b(t) + ""; |
|
}; |
|
} |
|
|
|
var string = function(a, b) { |
|
var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b |
|
am, // current match in a |
|
bm, // current match in b |
|
bs, // string preceding current number in b, if any |
|
i = -1, // index in s |
|
s = [], // string constants and placeholders |
|
q = []; // number interpolators |
|
|
|
// Coerce inputs to strings. |
|
a = a + "", b = b + ""; |
|
|
|
// Interpolate pairs of numbers in a & b. |
|
while ((am = reA.exec(a)) |
|
&& (bm = reB.exec(b))) { |
|
if ((bs = bm.index) > bi) { // a string precedes the next number in b |
|
bs = b.slice(bi, bs); |
|
if (s[i]) s[i] += bs; // coalesce with previous string |
|
else s[++i] = bs; |
|
} |
|
if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match |
|
if (s[i]) s[i] += bm; // coalesce with previous string |
|
else s[++i] = bm; |
|
} else { // interpolate non-matching numbers |
|
s[++i] = null; |
|
q.push({i: i, x: number(am, bm)}); |
|
} |
|
bi = reB.lastIndex; |
|
} |
|
|
|
// Add remains of b. |
|
if (bi < b.length) { |
|
bs = b.slice(bi); |
|
if (s[i]) s[i] += bs; // coalesce with previous string |
|
else s[++i] = bs; |
|
} |
|
|
|
// Special optimization for only a single match. |
|
// Otherwise, interpolate each of the numbers and rejoin the string. |
|
return s.length < 2 ? (q[0] |
|
? one(q[0].x) |
|
: zero(b)) |
|
: (b = q.length, function(t) { |
|
for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t); |
|
return s.join(""); |
|
}); |
|
}; |
|
|
|
var value = function(a, b) { |
|
var t = typeof b, c; |
|
return b == null || t === "boolean" ? constant(b) |
|
: (t === "number" ? number |
|
: t === "string" ? ((c = d3Color.color(b)) ? (b = c, rgb$1) : string) |
|
: b instanceof d3Color.color ? rgb$1 |
|
: b instanceof Date ? date |
|
: Array.isArray(b) ? array |
|
: typeof b.valueOf !== "function" && typeof b.toString !== "function" || isNaN(b) ? object |
|
: number)(a, b); |
|
}; |
|
|
|
var round = function(a, b) { |
|
return a = +a, b -= a, function(t) { |
|
return Math.round(a + b * t); |
|
}; |
|
}; |
|
|
|
var degrees = 180 / Math.PI; |
|
|
|
var identity = { |
|
translateX: 0, |
|
translateY: 0, |
|
rotate: 0, |
|
skewX: 0, |
|
scaleX: 1, |
|
scaleY: 1 |
|
}; |
|
|
|
var decompose = function(a, b, c, d, e, f) { |
|
var scaleX, scaleY, skewX; |
|
if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX; |
|
if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX; |
|
if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY; |
|
if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX; |
|
return { |
|
translateX: e, |
|
translateY: f, |
|
rotate: Math.atan2(b, a) * degrees, |
|
skewX: Math.atan(skewX) * degrees, |
|
scaleX: scaleX, |
|
scaleY: scaleY |
|
}; |
|
}; |
|
|
|
var cssNode; |
|
var cssRoot; |
|
var cssView; |
|
var svgNode; |
|
|
|
function parseCss(value) { |
|
if (value === "none") return identity; |
|
if (!cssNode) cssNode = document.createElement("DIV"), cssRoot = document.documentElement, cssView = document.defaultView; |
|
cssNode.style.transform = value; |
|
value = cssView.getComputedStyle(cssRoot.appendChild(cssNode), null).getPropertyValue("transform"); |
|
cssRoot.removeChild(cssNode); |
|
value = value.slice(7, -1).split(","); |
|
return decompose(+value[0], +value[1], +value[2], +value[3], +value[4], +value[5]); |
|
} |
|
|
|
function parseSvg(value) { |
|
if (value == null) return identity; |
|
if (!svgNode) svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g"); |
|
svgNode.setAttribute("transform", value); |
|
if (!(value = svgNode.transform.baseVal.consolidate())) return identity; |
|
value = value.matrix; |
|
return decompose(value.a, value.b, value.c, value.d, value.e, value.f); |
|
} |
|
|
|
function interpolateTransform(parse, pxComma, pxParen, degParen) { |
|
|
|
function pop(s) { |
|
return s.length ? s.pop() + " " : ""; |
|
} |
|
|
|
function translate(xa, ya, xb, yb, s, q) { |
|
if (xa !== xb || ya !== yb) { |
|
var i = s.push("translate(", null, pxComma, null, pxParen); |
|
q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)}); |
|
} else if (xb || yb) { |
|
s.push("translate(" + xb + pxComma + yb + pxParen); |
|
} |
|
} |
|
|
|
function rotate(a, b, s, q) { |
|
if (a !== b) { |
|
if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path |
|
q.push({i: s.push(pop(s) + "rotate(", null, degParen) - 2, x: number(a, b)}); |
|
} else if (b) { |
|
s.push(pop(s) + "rotate(" + b + degParen); |
|
} |
|
} |
|
|
|
function skewX(a, b, s, q) { |
|
if (a !== b) { |
|
q.push({i: s.push(pop(s) + "skewX(", null, degParen) - 2, x: number(a, b)}); |
|
} else if (b) { |
|
s.push(pop(s) + "skewX(" + b + degParen); |
|
} |
|
} |
|
|
|
function scale(xa, ya, xb, yb, s, q) { |
|
if (xa !== xb || ya !== yb) { |
|
var i = s.push(pop(s) + "scale(", null, ",", null, ")"); |
|
q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)}); |
|
} else if (xb !== 1 || yb !== 1) { |
|
s.push(pop(s) + "scale(" + xb + "," + yb + ")"); |
|
} |
|
} |
|
|
|
return function(a, b) { |
|
var s = [], // string constants and placeholders |
|
q = []; // number interpolators |
|
a = parse(a), b = parse(b); |
|
translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q); |
|
rotate(a.rotate, b.rotate, s, q); |
|
skewX(a.skewX, b.skewX, s, q); |
|
scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q); |
|
a = b = null; // gc |
|
return function(t) { |
|
var i = -1, n = q.length, o; |
|
while (++i < n) s[(o = q[i]).i] = o.x(t); |
|
return s.join(""); |
|
}; |
|
}; |
|
} |
|
|
|
var interpolateTransformCss = interpolateTransform(parseCss, "px, ", "px)", "deg)"); |
|
var interpolateTransformSvg = interpolateTransform(parseSvg, ", ", ")", ")"); |
|
|
|
var rho = Math.SQRT2; |
|
var rho2 = 2; |
|
var rho4 = 4; |
|
var epsilon2 = 1e-12; |
|
|
|
function cosh(x) { |
|
return ((x = Math.exp(x)) + 1 / x) / 2; |
|
} |
|
|
|
function sinh(x) { |
|
return ((x = Math.exp(x)) - 1 / x) / 2; |
|
} |
|
|
|
function tanh(x) { |
|
return ((x = Math.exp(2 * x)) - 1) / (x + 1); |
|
} |
|
|
|
// p0 = [ux0, uy0, w0] |
|
// p1 = [ux1, uy1, w1] |
|
var zoom = function(p0, p1) { |
|
var ux0 = p0[0], uy0 = p0[1], w0 = p0[2], |
|
ux1 = p1[0], uy1 = p1[1], w1 = p1[2], |
|
dx = ux1 - ux0, |
|
dy = uy1 - uy0, |
|
d2 = dx * dx + dy * dy, |
|
i, |
|
S; |
|
|
|
// Special case for u0 ≅ u1. |
|
if (d2 < epsilon2) { |
|
S = Math.log(w1 / w0) / rho; |
|
i = function(t) { |
|
return [ |
|
ux0 + t * dx, |
|
uy0 + t * dy, |
|
w0 * Math.exp(rho * t * S) |
|
]; |
|
}; |
|
} |
|
|
|
// General case. |
|
else { |
|
var d1 = Math.sqrt(d2), |
|
b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1), |
|
b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1), |
|
r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), |
|
r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1); |
|
S = (r1 - r0) / rho; |
|
i = function(t) { |
|
var s = t * S, |
|
coshr0 = cosh(r0), |
|
u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0)); |
|
return [ |
|
ux0 + u * dx, |
|
uy0 + u * dy, |
|
w0 * coshr0 / cosh(rho * s + r0) |
|
]; |
|
}; |
|
} |
|
|
|
i.duration = S * 1000; |
|
|
|
return i; |
|
}; |
|
|
|
function hsl$1(hue$$1) { |
|
return function(start, end) { |
|
var h = hue$$1((start = d3Color.hsl(start)).h, (end = d3Color.hsl(end)).h), |
|
s = nogamma(start.s, end.s), |
|
l = nogamma(start.l, end.l), |
|
opacity = nogamma(start.opacity, end.opacity); |
|
return function(t) { |
|
start.h = h(t); |
|
start.s = s(t); |
|
start.l = l(t); |
|
start.opacity = opacity(t); |
|
return start + ""; |
|
}; |
|
} |
|
} |
|
|
|
var hsl$2 = hsl$1(hue); |
|
var hslLong = hsl$1(nogamma); |
|
|
|
function lab$1(start, end) { |
|
var l = nogamma((start = d3Color.lab(start)).l, (end = d3Color.lab(end)).l), |
|
a = nogamma(start.a, end.a), |
|
b = nogamma(start.b, end.b), |
|
opacity = nogamma(start.opacity, end.opacity); |
|
return function(t) { |
|
start.l = l(t); |
|
start.a = a(t); |
|
start.b = b(t); |
|
start.opacity = opacity(t); |
|
return start + ""; |
|
}; |
|
} |
|
|
|
function hcl$1(hue$$1) { |
|
return function(start, end) { |
|
var h = hue$$1((start = d3Color.hcl(start)).h, (end = d3Color.hcl(end)).h), |
|
c = nogamma(start.c, end.c), |
|
l = nogamma(start.l, end.l), |
|
opacity = nogamma(start.opacity, end.opacity); |
|
return function(t) { |
|
start.h = h(t); |
|
start.c = c(t); |
|
start.l = l(t); |
|
start.opacity = opacity(t); |
|
return start + ""; |
|
}; |
|
} |
|
} |
|
|
|
var hcl$2 = hcl$1(hue); |
|
var hclLong = hcl$1(nogamma); |
|
|
|
function cubehelix$1(hue$$1) { |
|
return (function cubehelixGamma(y) { |
|
y = +y; |
|
|
|
function cubehelix$$1(start, end) { |
|
var h = hue$$1((start = d3Color.cubehelix(start)).h, (end = d3Color.cubehelix(end)).h), |
|
s = nogamma(start.s, end.s), |
|
l = nogamma(start.l, end.l), |
|
opacity = nogamma(start.opacity, end.opacity); |
|
return function(t) { |
|
start.h = h(t); |
|
start.s = s(t); |
|
start.l = l(Math.pow(t, y)); |
|
start.opacity = opacity(t); |
|
return start + ""; |
|
}; |
|
} |
|
|
|
cubehelix$$1.gamma = cubehelixGamma; |
|
|
|
return cubehelix$$1; |
|
})(1); |
|
} |
|
|
|
var cubehelix$2 = cubehelix$1(hue); |
|
var cubehelixLong = cubehelix$1(nogamma); |
|
|
|
var quantize = function(interpolator, n) { |
|
var samples = new Array(n); |
|
for (var i = 0; i < n; ++i) samples[i] = interpolator(i / (n - 1)); |
|
return samples; |
|
}; |
|
|
|
exports.interpolate = value; |
|
exports.interpolateArray = array; |
|
exports.interpolateBasis = basis$1; |
|
exports.interpolateBasisClosed = basisClosed; |
|
exports.interpolateDate = date; |
|
exports.interpolateNumber = number; |
|
exports.interpolateObject = object; |
|
exports.interpolateRound = round; |
|
exports.interpolateString = string; |
|
exports.interpolateTransformCss = interpolateTransformCss; |
|
exports.interpolateTransformSvg = interpolateTransformSvg; |
|
exports.interpolateZoom = zoom; |
|
exports.interpolateRgb = rgb$1; |
|
exports.interpolateRgbBasis = rgbBasis; |
|
exports.interpolateRgbBasisClosed = rgbBasisClosed; |
|
exports.interpolateHsl = hsl$2; |
|
exports.interpolateHslLong = hslLong; |
|
exports.interpolateLab = lab$1; |
|
exports.interpolateHcl = hcl$2; |
|
exports.interpolateHclLong = hclLong; |
|
exports.interpolateCubehelix = cubehelix$2; |
|
exports.interpolateCubehelixLong = cubehelixLong; |
|
exports.quantize = quantize; |
|
|
|
Object.defineProperty(exports, '__esModule', { value: true }); |
|
|
|
}))); |
|
|
|
},{"d3-color":9}],15:[function(require,module,exports){ |
|
// https://d3js.org/d3-request/ Version 1.0.5. Copyright 2017 Mike Bostock. |
|
(function (global, factory) { |
|
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-collection'), require('d3-dispatch'), require('d3-dsv')) : |
|
typeof define === 'function' && define.amd ? define(['exports', 'd3-collection', 'd3-dispatch', 'd3-dsv'], factory) : |
|
(factory((global.d3 = global.d3 || {}),global.d3,global.d3,global.d3)); |
|
}(this, (function (exports,d3Collection,d3Dispatch,d3Dsv) { 'use strict'; |
|
|
|
var request = function(url, callback) { |
|
var request, |
|
event = d3Dispatch.dispatch("beforesend", "progress", "load", "error"), |
|
mimeType, |
|
headers = d3Collection.map(), |
|
xhr = new XMLHttpRequest, |
|
user = null, |
|
password = null, |
|
response, |
|
responseType, |
|
timeout = 0; |
|
|
|
// If IE does not support CORS, use XDomainRequest. |
|
if (typeof XDomainRequest !== "undefined" |
|
&& !("withCredentials" in xhr) |
|
&& /^(http(s)?:)?\/\//.test(url)) xhr = new XDomainRequest; |
|
|
|
"onload" in xhr |
|
? xhr.onload = xhr.onerror = xhr.ontimeout = respond |
|
: xhr.onreadystatechange = function(o) { xhr.readyState > 3 && respond(o); }; |
|
|
|
function respond(o) { |
|
var status = xhr.status, result; |
|
if (!status && hasResponse(xhr) |
|
|| status >= 200 && status < 300 |
|
|| status === 304) { |
|
if (response) { |
|
try { |
|
result = response.call(request, xhr); |
|
} catch (e) { |
|
event.call("error", request, e); |
|
return; |
|
} |
|
} else { |
|
result = xhr; |
|
} |
|
event.call("load", request, result); |
|
} else { |
|
event.call("error", request, o); |
|
} |
|
} |
|
|
|
xhr.onprogress = function(e) { |
|
event.call("progress", request, e); |
|
}; |
|
|
|
request = { |
|
header: function(name, value) { |
|
name = (name + "").toLowerCase(); |
|
if (arguments.length < 2) return headers.get(name); |
|
if (value == null) headers.remove(name); |
|
else headers.set(name, value + ""); |
|
return request; |
|
}, |
|
|
|
// If mimeType is non-null and no Accept header is set, a default is used. |
|
mimeType: function(value) { |
|
if (!arguments.length) return mimeType; |
|
mimeType = value == null ? null : value + ""; |
|
return request; |
|
}, |
|
|
|
// Specifies what type the response value should take; |
|
// for instance, arraybuffer, blob, document, or text. |
|
responseType: function(value) { |
|
if (!arguments.length) return responseType; |
|
responseType = value; |
|
return request; |
|
}, |
|
|
|
timeout: function(value) { |
|
if (!arguments.length) return timeout; |
|
timeout = +value; |
|
return request; |
|
}, |
|
|
|
user: function(value) { |
|
return arguments.length < 1 ? user : (user = value == null ? null : value + "", request); |
|
}, |
|
|
|
password: function(value) { |
|
return arguments.length < 1 ? password : (password = value == null ? null : value + "", request); |
|
}, |
|
|
|
// Specify how to convert the response content to a specific type; |
|
// changes the callback value on "load" events. |
|
response: function(value) { |
|
response = value; |
|
return request; |
|
}, |
|
|
|
// Alias for send("GET", …). |
|
get: function(data, callback) { |
|
return request.send("GET", data, callback); |
|
}, |
|
|
|
// Alias for send("POST", …). |
|
post: function(data, callback) { |
|
return request.send("POST", data, callback); |
|
}, |
|
|
|
// If callback is non-null, it will be used for error and load events. |
|
send: function(method, data, callback) { |
|
xhr.open(method, url, true, user, password); |
|
if (mimeType != null && !headers.has("accept")) headers.set("accept", mimeType + ",*/*"); |
|
if (xhr.setRequestHeader) headers.each(function(value, name) { xhr.setRequestHeader(name, value); }); |
|
if (mimeType != null && xhr.overrideMimeType) xhr.overrideMimeType(mimeType); |
|
if (responseType != null) xhr.responseType = responseType; |
|
if (timeout > 0) xhr.timeout = timeout; |
|
if (callback == null && typeof data === "function") callback = data, data = null; |
|
if (callback != null && callback.length === 1) callback = fixCallback(callback); |
|
if (callback != null) request.on("error", callback).on("load", function(xhr) { callback(null, xhr); }); |
|
event.call("beforesend", request, xhr); |
|
xhr.send(data == null ? null : data); |
|
return request; |
|
}, |
|
|
|
abort: function() { |
|
xhr.abort(); |
|
return request; |
|
}, |
|
|
|
on: function() { |
|
var value = event.on.apply(event, arguments); |
|
return value === event ? request : value; |
|
} |
|
}; |
|
|
|
if (callback != null) { |
|
if (typeof callback !== "function") throw new Error("invalid callback: " + callback); |
|
return request.get(callback); |
|
} |
|
|
|
return request; |
|
}; |
|
|
|
function fixCallback(callback) { |
|
return function(error, xhr) { |
|
callback(error == null ? xhr : null); |
|
}; |
|
} |
|
|
|
function hasResponse(xhr) { |
|
var type = xhr.responseType; |
|
return type && type !== "text" |
|
? xhr.response // null on error |
|
: xhr.responseText; // "" on error |
|
} |
|
|
|
var type = function(defaultMimeType, response) { |
|
return function(url, callback) { |
|
var r = request(url).mimeType(defaultMimeType).response(response); |
|
if (callback != null) { |
|
if (typeof callback !== "function") throw new Error("invalid callback: " + callback); |
|
return r.get(callback); |
|
} |
|
return r; |
|
}; |
|
}; |
|
|
|
var html = type("text/html", function(xhr) { |
|
return document.createRange().createContextualFragment(xhr.responseText); |
|
}); |
|
|
|
var json = type("application/json", function(xhr) { |
|
return JSON.parse(xhr.responseText); |
|
}); |
|
|
|
var text = type("text/plain", function(xhr) { |
|
return xhr.responseText; |
|
}); |
|
|
|
var xml = type("application/xml", function(xhr) { |
|
var xml = xhr.responseXML; |
|
if (!xml) throw new Error("parse error"); |
|
return xml; |
|
}); |
|
|
|
var dsv = function(defaultMimeType, parse) { |
|
return function(url, row, callback) { |
|
if (arguments.length < 3) callback = row, row = null; |
|
var r = request(url).mimeType(defaultMimeType); |
|
r.row = function(_) { return arguments.length ? r.response(responseOf(parse, row = _)) : row; }; |
|
r.row(row); |
|
return callback ? r.get(callback) : r; |
|
}; |
|
}; |
|
|
|
function responseOf(parse, row) { |
|
return function(request$$1) { |
|
return parse(request$$1.responseText, row); |
|
}; |
|
} |
|
|
|
var csv = dsv("text/csv", d3Dsv.csvParse); |
|
|
|
var tsv = dsv("text/tab-separated-values", d3Dsv.tsvParse); |
|
|
|
exports.request = request; |
|
exports.html = html; |
|
exports.json = json; |
|
exports.text = text; |
|
exports.xml = xml; |
|
exports.csv = csv; |
|
exports.tsv = tsv; |
|
|
|
Object.defineProperty(exports, '__esModule', { value: true }); |
|
|
|
}))); |
|
|
|
},{"d3-collection":8,"d3-dispatch":10,"d3-dsv":11}],16:[function(require,module,exports){ |
|
// https://d3js.org/d3-scale/ Version 1.0.6. Copyright 2017 Mike Bostock. |
|
(function (global, factory) { |
|
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-array'), require('d3-collection'), require('d3-interpolate'), require('d3-format'), require('d3-time'), require('d3-time-format'), require('d3-color')) : |
|
typeof define === 'function' && define.amd ? define(['exports', 'd3-array', 'd3-collection', 'd3-interpolate', 'd3-format', 'd3-time', 'd3-time-format', 'd3-color'], factory) : |
|
(factory((global.d3 = global.d3 || {}),global.d3,global.d3,global.d3,global.d3,global.d3,global.d3,global.d3)); |
|
}(this, (function (exports,d3Array,d3Collection,d3Interpolate,d3Format,d3Time,d3TimeFormat,d3Color) { 'use strict'; |
|
|
|
var array = Array.prototype; |
|
|
|
var map$1 = array.map; |
|
var slice = array.slice; |
|
|
|
var implicit = {name: "implicit"}; |
|
|
|
function ordinal(range$$1) { |
|
var index = d3Collection.map(), |
|
domain = [], |
|
unknown = implicit; |
|
|
|
range$$1 = range$$1 == null ? [] : slice.call(range$$1); |
|
|
|
function scale(d) { |
|
var key = d + "", i = index.get(key); |
|
if (!i) { |
|
if (unknown !== implicit) return unknown; |
|
index.set(key, i = domain.push(d)); |
|
} |
|
return range$$1[(i - 1) % range$$1.length]; |
|
} |
|
|
|
scale.domain = function(_) { |
|
if (!arguments.length) return domain.slice(); |
|
domain = [], index = d3Collection.map(); |
|
var i = -1, n = _.length, d, key; |
|
while (++i < n) if (!index.has(key = (d = _[i]) + "")) index.set(key, domain.push(d)); |
|
return scale; |
|
}; |
|
|
|
scale.range = function(_) { |
|
return arguments.length ? (range$$1 = slice.call(_), scale) : range$$1.slice(); |
|
}; |
|
|
|
scale.unknown = function(_) { |
|
return arguments.length ? (unknown = _, scale) : unknown; |
|
}; |
|
|
|
scale.copy = function() { |
|
return ordinal() |
|
.domain(domain) |
|
.range(range$$1) |
|
.unknown(unknown); |
|
}; |
|
|
|
return scale; |
|
} |
|
|
|
function band() { |
|
var scale = ordinal().unknown(undefined), |
|
domain = scale.domain, |
|
ordinalRange = scale.range, |
|
range$$1 = [0, 1], |
|
step, |
|
bandwidth, |
|
round = false, |
|
paddingInner = 0, |
|
paddingOuter = 0, |
|
align = 0.5; |
|
|
|
delete scale.unknown; |
|
|
|
function rescale() { |
|
var n = domain().length, |
|
reverse = range$$1[1] < range$$1[0], |
|
start = range$$1[reverse - 0], |
|
stop = range$$1[1 - reverse]; |
|
step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2); |
|
if (round) step = Math.floor(step); |
|
start += (stop - start - step * (n - paddingInner)) * align; |
|
bandwidth = step * (1 - paddingInner); |
|
if (round) start = Math.round(start), bandwidth = Math.round(bandwidth); |
|
var values = d3Array.range(n).map(function(i) { return start + step * i; }); |
|
return ordinalRange(reverse ? values.reverse() : values); |
|
} |
|
|
|
scale.domain = function(_) { |
|
return arguments.length ? (domain(_), rescale()) : domain(); |
|
}; |
|
|
|
scale.range = function(_) { |
|
return arguments.length ? (range$$1 = [+_[0], +_[1]], rescale()) : range$$1.slice(); |
|
}; |
|
|
|
scale.rangeRound = function(_) { |
|
return range$$1 = [+_[0], +_[1]], round = true, rescale(); |
|
}; |
|
|
|
scale.bandwidth = function() { |
|
return bandwidth; |
|
}; |
|
|
|
scale.step = function() { |
|
return step; |
|
}; |
|
|
|
scale.round = function(_) { |
|
return arguments.length ? (round = !!_, rescale()) : round; |
|
}; |
|
|
|
scale.padding = function(_) { |
|
return arguments.length ? (paddingInner = paddingOuter = Math.max(0, Math.min(1, _)), rescale()) : paddingInner; |
|
}; |
|
|
|
scale.paddingInner = function(_) { |
|
return arguments.length ? (paddingInner = Math.max(0, Math.min(1, _)), rescale()) : paddingInner; |
|
}; |
|
|
|
scale.paddingOuter = function(_) { |
|
return arguments.length ? (paddingOuter = Math.max(0, Math.min(1, _)), rescale()) : paddingOuter; |
|
}; |
|
|
|
scale.align = function(_) { |
|
return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align; |
|
}; |
|
|
|
scale.copy = function() { |
|
return band() |
|
.domain(domain()) |
|
.range(range$$1) |
|
.round(round) |
|
.paddingInner(paddingInner) |
|
.paddingOuter(paddingOuter) |
|
.align(align); |
|
}; |
|
|
|
return rescale(); |
|
} |
|
|
|
function pointish(scale) { |
|
var copy = scale.copy; |
|
|
|
scale.padding = scale.paddingOuter; |
|
delete scale.paddingInner; |
|
delete scale.paddingOuter; |
|
|
|
scale.copy = function() { |
|
return pointish(copy()); |
|
}; |
|
|
|
return scale; |
|
} |
|
|
|
function point() { |
|
return pointish(band().paddingInner(1)); |
|
} |
|
|
|
var constant = function(x) { |
|
return function() { |
|
return x; |
|
}; |
|
}; |
|
|
|
var number = function(x) { |
|
return +x; |
|
}; |
|
|
|
var unit = [0, 1]; |
|
|
|
function deinterpolateLinear(a, b) { |
|
return (b -= (a = +a)) |
|
? function(x) { return (x - a) / b; } |
|
: constant(b); |
|
} |
|
|
|
function deinterpolateClamp(deinterpolate) { |
|
return function(a, b) { |
|
var d = deinterpolate(a = +a, b = +b); |
|
return function(x) { return x <= a ? 0 : x >= b ? 1 : d(x); }; |
|
}; |
|
} |
|
|
|
function reinterpolateClamp(reinterpolate) { |
|
return function(a, b) { |
|
var r = reinterpolate(a = +a, b = +b); |
|
return function(t) { return t <= 0 ? a : t >= 1 ? b : r(t); }; |
|
}; |
|
} |
|
|
|
function bimap(domain, range$$1, deinterpolate, reinterpolate) { |
|
var d0 = domain[0], d1 = domain[1], r0 = range$$1[0], r1 = range$$1[1]; |
|
if (d1 < d0) d0 = deinterpolate(d1, d0), r0 = reinterpolate(r1, r0); |
|
else d0 = deinterpolate(d0, d1), r0 = reinterpolate(r0, r1); |
|
return function(x) { return r0(d0(x)); }; |
|
} |
|
|
|
function polymap(domain, range$$1, deinterpolate, reinterpolate) { |
|
var j = Math.min(domain.length, range$$1.length) - 1, |
|
d = new Array(j), |
|
r = new Array(j), |
|
i = -1; |
|
|
|
// Reverse descending domains. |
|
if (domain[j] < domain[0]) { |
|
domain = domain.slice().reverse(); |
|
range$$1 = range$$1.slice().reverse(); |
|
} |
|
|
|
while (++i < j) { |
|
d[i] = deinterpolate(domain[i], domain[i + 1]); |
|
r[i] = reinterpolate(range$$1[i], range$$1[i + 1]); |
|
} |
|
|
|
return function(x) { |
|
var i = d3Array.bisect(domain, x, 1, j) - 1; |
|
return r[i](d[i](x)); |
|
}; |
|
} |
|
|
|
function copy(source, target) { |
|
return target |
|
.domain(source.domain()) |
|
.range(source.range()) |
|
.interpolate(source.interpolate()) |
|
.clamp(source.clamp()); |
|
} |
|
|
|
// deinterpolate(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1]. |
|
// reinterpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding domain value x in [a,b]. |
|
function continuous(deinterpolate, reinterpolate) { |
|
var domain = unit, |
|
range$$1 = unit, |
|
interpolate$$1 = d3Interpolate.interpolate, |
|
clamp = false, |
|
piecewise, |
|
output, |
|
input; |
|
|
|
function rescale() { |
|
piecewise = Math.min(domain.length, range$$1.length) > 2 ? polymap : bimap; |
|
output = input = null; |
|
return scale; |
|
} |
|
|
|
function scale(x) { |
|
return (output || (output = piecewise(domain, range$$1, clamp ? deinterpolateClamp(deinterpolate) : deinterpolate, interpolate$$1)))(+x); |
|
} |
|
|
|
scale.invert = function(y) { |
|
return (input || (input = piecewise(range$$1, domain, deinterpolateLinear, clamp ? reinterpolateClamp(reinterpolate) : reinterpolate)))(+y); |
|
}; |
|
|
|
scale.domain = function(_) { |
|
return arguments.length ? (domain = map$1.call(_, number), rescale()) : domain.slice(); |
|
}; |
|
|
|
scale.range = function(_) { |
|
return arguments.length ? (range$$1 = slice.call(_), rescale()) : range$$1.slice(); |
|
}; |
|
|
|
scale.rangeRound = function(_) { |
|
return range$$1 = slice.call(_), interpolate$$1 = d3Interpolate.interpolateRound, rescale(); |
|
}; |
|
|
|
scale.clamp = function(_) { |
|
return arguments.length ? (clamp = !!_, rescale()) : clamp; |
|
}; |
|
|
|
scale.interpolate = function(_) { |
|
return arguments.length ? (interpolate$$1 = _, rescale()) : interpolate$$1; |
|
}; |
|
|
|
return rescale(); |
|
} |
|
|
|
var tickFormat = function(domain, count, specifier) { |
|
var start = domain[0], |
|
stop = domain[domain.length - 1], |
|
step = d3Array.tickStep(start, stop, count == null ? 10 : count), |
|
precision; |
|
specifier = d3Format.formatSpecifier(specifier == null ? ",f" : specifier); |
|
switch (specifier.type) { |
|
case "s": { |
|
var value = Math.max(Math.abs(start), Math.abs(stop)); |
|
if (specifier.precision == null && !isNaN(precision = d3Format.precisionPrefix(step, value))) specifier.precision = precision; |
|
return d3Format.formatPrefix(specifier, value); |
|
} |
|
case "": |
|
case "e": |
|
case "g": |
|
case "p": |
|
case "r": { |
|
if (specifier.precision == null && !isNaN(precision = d3Format.precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === "e"); |
|
break; |
|
} |
|
case "f": |
|
case "%": { |
|
if (specifier.precision == null && !isNaN(precision = d3Format.precisionFixed(step))) specifier.precision = precision - (specifier.type === "%") * 2; |
|
break; |
|
} |
|
} |
|
return d3Format.format(specifier); |
|
}; |
|
|
|
function linearish(scale) { |
|
var domain = scale.domain; |
|
|
|
scale.ticks = function(count) { |
|
var d = domain(); |
|
return d3Array.ticks(d[0], d[d.length - 1], count == null ? 10 : count); |
|
}; |
|
|
|
scale.tickFormat = function(count, specifier) { |
|
return tickFormat(domain(), count, specifier); |
|
}; |
|
|
|
scale.nice = function(count) { |
|
if (count == null) count = 10; |
|
|
|
var d = domain(), |
|
i0 = 0, |
|
i1 = d.length - 1, |
|
start = d[i0], |
|
stop = d[i1], |
|
step; |
|
|
|
if (stop < start) { |
|
step = start, start = stop, stop = step; |
|
step = i0, i0 = i1, i1 = step; |
|
} |
|
|
|
step = d3Array.tickIncrement(start, stop, count); |
|
|
|
if (step > 0) { |
|
start = Math.floor(start / step) * step; |
|
stop = Math.ceil(stop / step) * step; |
|
step = d3Array.tickIncrement(start, stop, count); |
|
} else if (step < 0) { |
|
start = Math.ceil(start * step) / step; |
|
stop = Math.floor(stop * step) / step; |
|
step = d3Array.tickIncrement(start, stop, count); |
|
} |
|
|
|
if (step > 0) { |
|
d[i0] = Math.floor(start / step) * step; |
|
d[i1] = Math.ceil(stop / step) * step; |
|
domain(d); |
|
} else if (step < 0) { |
|
d[i0] = Math.ceil(start * step) / step; |
|
d[i1] = Math.floor(stop * step) / step; |
|
domain(d); |
|
} |
|
|
|
return scale; |
|
}; |
|
|
|
return scale; |
|
} |
|
|
|
function linear() { |
|
var scale = continuous(deinterpolateLinear, d3Interpolate.interpolateNumber); |
|
|
|
scale.copy = function() { |
|
return copy(scale, linear()); |
|
}; |
|
|
|
return linearish(scale); |
|
} |
|
|
|
function identity() { |
|
var domain = [0, 1]; |
|
|
|
function scale(x) { |
|
return +x; |
|
} |
|
|
|
scale.invert = scale; |
|
|
|
scale.domain = scale.range = function(_) { |
|
return arguments.length ? (domain = map$1.call(_, number), scale) : domain.slice(); |
|
}; |
|
|
|
scale.copy = function() { |
|
return identity().domain(domain); |
|
}; |
|
|
|
return linearish(scale); |
|
} |
|
|
|
var nice = function(domain, interval) { |
|
domain = domain.slice(); |
|
|
|
var i0 = 0, |
|
i1 = domain.length - 1, |
|
x0 = domain[i0], |
|
x1 = domain[i1], |
|
t; |
|
|
|
if (x1 < x0) { |
|
t = i0, i0 = i1, i1 = t; |
|
t = x0, x0 = x1, x1 = t; |
|
} |
|
|
|
domain[i0] = interval.floor(x0); |
|
domain[i1] = interval.ceil(x1); |
|
return domain; |
|
}; |
|
|
|
function deinterpolate(a, b) { |
|
return (b = Math.log(b / a)) |
|
? function(x) { return Math.log(x / a) / b; } |
|
: constant(b); |
|
} |
|
|
|
function reinterpolate(a, b) { |
|
return a < 0 |
|
? function(t) { return -Math.pow(-b, t) * Math.pow(-a, 1 - t); } |
|
: function(t) { return Math.pow(b, t) * Math.pow(a, 1 - t); }; |
|
} |
|
|
|
function pow10(x) { |
|
return isFinite(x) ? +("1e" + x) : x < 0 ? 0 : x; |
|
} |
|
|
|
function powp(base) { |
|
return base === 10 ? pow10 |
|
: base === Math.E ? Math.exp |
|
: function(x) { return Math.pow(base, x); }; |
|
} |
|
|
|
function logp(base) { |
|
return base === Math.E ? Math.log |
|
: base === 10 && Math.log10 |
|
|| base === 2 && Math.log2 |
|
|| (base = Math.log(base), function(x) { return Math.log(x) / base; }); |
|
} |
|
|
|
function reflect(f) { |
|
return function(x) { |
|
return -f(-x); |
|
}; |
|
} |
|
|
|
function log() { |
|
var scale = continuous(deinterpolate, reinterpolate).domain([1, 10]), |
|
domain = scale.domain, |
|
base = 10, |
|
logs = logp(10), |
|
pows = powp(10); |
|
|
|
function rescale() { |
|
logs = logp(base), pows = powp(base); |
|
if (domain()[0] < 0) logs = reflect(logs), pows = reflect(pows); |
|
return scale; |
|
} |
|
|
|
scale.base = function(_) { |
|
return arguments.length ? (base = +_, rescale()) : base; |
|
}; |
|
|
|
scale.domain = function(_) { |
|
return arguments.length ? (domain(_), rescale()) : domain(); |
|
}; |
|
|
|
scale.ticks = function(count) { |
|
var d = domain(), |
|
u = d[0], |
|
v = d[d.length - 1], |
|
r; |
|
|
|
if (r = v < u) i = u, u = v, v = i; |
|
|
|
var i = logs(u), |
|
j = logs(v), |
|
p, |
|
k, |
|
t, |
|
n = count == null ? 10 : +count, |
|
z = []; |
|
|
|
if (!(base % 1) && j - i < n) { |
|
i = Math.round(i) - 1, j = Math.round(j) + 1; |
|
if (u > 0) for (; i < j; ++i) { |
|
for (k = 1, p = pows(i); k < base; ++k) { |
|
t = p * k; |
|
if (t < u) continue; |
|
if (t > v) break; |
|
z.push(t); |
|
} |
|
} else for (; i < j; ++i) { |
|
for (k = base - 1, p = pows(i); k >= 1; --k) { |
|
t = p * k; |
|
if (t < u) continue; |
|
if (t > v) break; |
|
z.push(t); |
|
} |
|
} |
|
} else { |
|
z = d3Array.ticks(i, j, Math.min(j - i, n)).map(pows); |
|
} |
|
|
|
return r ? z.reverse() : z; |
|
}; |
|
|
|
scale.tickFormat = function(count, specifier) { |
|
if (specifier == null) specifier = base === 10 ? ".0e" : ","; |
|
if (typeof specifier !== "function") specifier = d3Format.format(specifier); |
|
if (count === Infinity) return specifier; |
|
if (count == null) count = 10; |
|
var k = Math.max(1, base * count / scale.ticks().length); // TODO fast estimate? |
|
return function(d) { |
|
var i = d / pows(Math.round(logs(d))); |
|
if (i * base < base - 0.5) i *= base; |
|
return i <= k ? specifier(d) : ""; |
|
}; |
|
}; |
|
|
|
scale.nice = function() { |
|
return domain(nice(domain(), { |
|
floor: function(x) { return pows(Math.floor(logs(x))); }, |
|
ceil: function(x) { return pows(Math.ceil(logs(x))); } |
|
})); |
|
}; |
|
|
|
scale.copy = function() { |
|
return copy(scale, log().base(base)); |
|
}; |
|
|
|
return scale; |
|
} |
|
|
|
function raise(x, exponent) { |
|
return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent); |
|
} |
|
|
|
function pow() { |
|
var exponent = 1, |
|
scale = continuous(deinterpolate, reinterpolate), |
|
domain = scale.domain; |
|
|
|
function deinterpolate(a, b) { |
|
return (b = raise(b, exponent) - (a = raise(a, exponent))) |
|
? function(x) { return (raise(x, exponent) - a) / b; } |
|
: constant(b); |
|
} |
|
|
|
function reinterpolate(a, b) { |
|
b = raise(b, exponent) - (a = raise(a, exponent)); |
|
return function(t) { return raise(a + b * t, 1 / exponent); }; |
|
} |
|
|
|
scale.exponent = function(_) { |
|
return arguments.length ? (exponent = +_, domain(domain())) : exponent; |
|
}; |
|
|
|
scale.copy = function() { |
|
return copy(scale, pow().exponent(exponent)); |
|
}; |
|
|
|
return linearish(scale); |
|
} |
|
|
|
function sqrt() { |
|
return pow().exponent(0.5); |
|
} |
|
|
|
function quantile$1() { |
|
var domain = [], |
|
range$$1 = [], |
|
thresholds = []; |
|
|
|
function rescale() { |
|
var i = 0, n = Math.max(1, range$$1.length); |
|
thresholds = new Array(n - 1); |
|
while (++i < n) thresholds[i - 1] = d3Array.quantile(domain, i / n); |
|
return scale; |
|
} |
|
|
|
function scale(x) { |
|
if (!isNaN(x = +x)) return range$$1[d3Array.bisect(thresholds, x)]; |
|
} |
|
|
|
scale.invertExtent = function(y) { |
|
var i = range$$1.indexOf(y); |
|
return i < 0 ? [NaN, NaN] : [ |
|
i > 0 ? thresholds[i - 1] : domain[0], |
|
i < thresholds.length ? thresholds[i] : domain[domain.length - 1] |
|
]; |
|
}; |
|
|
|
scale.domain = function(_) { |
|
if (!arguments.length) return domain.slice(); |
|
domain = []; |
|
for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d); |
|
domain.sort(d3Array.ascending); |
|
return rescale(); |
|
}; |
|
|
|
scale.range = function(_) { |
|
return arguments.length ? (range$$1 = slice.call(_), rescale()) : range$$1.slice(); |
|
}; |
|
|
|
scale.quantiles = function() { |
|
return thresholds.slice(); |
|
}; |
|
|
|
scale.copy = function() { |
|
return quantile$1() |
|
.domain(domain) |
|
.range(range$$1); |
|
}; |
|
|
|
return scale; |
|
} |
|
|
|
function quantize() { |
|
var x0 = 0, |
|
x1 = 1, |
|
n = 1, |
|
domain = [0.5], |
|
range$$1 = [0, 1]; |
|
|
|
function scale(x) { |
|
if (x <= x) return range$$1[d3Array.bisect(domain, x, 0, n)]; |
|
} |
|
|
|
function rescale() { |
|
var i = -1; |
|
domain = new Array(n); |
|
while (++i < n) domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1); |
|
return scale; |
|
} |
|
|
|
scale.domain = function(_) { |
|
return arguments.length ? (x0 = +_[0], x1 = +_[1], rescale()) : [x0, x1]; |
|
}; |
|
|
|
scale.range = function(_) { |
|
return arguments.length ? (n = (range$$1 = slice.call(_)).length - 1, rescale()) : range$$1.slice(); |
|
}; |
|
|
|
scale.invertExtent = function(y) { |
|
var i = range$$1.indexOf(y); |
|
return i < 0 ? [NaN, NaN] |
|
: i < 1 ? [x0, domain[0]] |
|
: i >= n ? [domain[n - 1], x1] |
|
: [domain[i - 1], domain[i]]; |
|
}; |
|
|
|
scale.copy = function() { |
|
return quantize() |
|
.domain([x0, x1]) |
|
.range(range$$1); |
|
}; |
|
|
|
return linearish(scale); |
|
} |
|
|
|
function threshold() { |
|
var domain = [0.5], |
|
range$$1 = [0, 1], |
|
n = 1; |
|
|
|
function scale(x) { |
|
if (x <= x) return range$$1[d3Array.bisect(domain, x, 0, n)]; |
|
} |
|
|
|
scale.domain = function(_) { |
|
return arguments.length ? (domain = slice.call(_), n = Math.min(domain.length, range$$1.length - 1), scale) : domain.slice(); |
|
}; |
|
|
|
scale.range = function(_) { |
|
return arguments.length ? (range$$1 = slice.call(_), n = Math.min(domain.length, range$$1.length - 1), scale) : range$$1.slice(); |
|
}; |
|
|
|
scale.invertExtent = function(y) { |
|
var i = range$$1.indexOf(y); |
|
return [domain[i - 1], domain[i]]; |
|
}; |
|
|
|
scale.copy = function() { |
|
return threshold() |
|
.domain(domain) |
|
.range(range$$1); |
|
}; |
|
|
|
return scale; |
|
} |
|
|
|
var durationSecond = 1000; |
|
var durationMinute = durationSecond * 60; |
|
var durationHour = durationMinute * 60; |
|
var durationDay = durationHour * 24; |
|
var durationWeek = durationDay * 7; |
|
var durationMonth = durationDay * 30; |
|
var durationYear = durationDay * 365; |
|
|
|
function date(t) { |
|
return new Date(t); |
|
} |
|
|
|
function number$1(t) { |
|
return t instanceof Date ? +t : +new Date(+t); |
|
} |
|
|
|
function calendar(year, month, week, day, hour, minute, second, millisecond, format$$1) { |
|
var scale = continuous(deinterpolateLinear, d3Interpolate.interpolateNumber), |
|
invert = scale.invert, |
|
domain = scale.domain; |
|
|
|
var formatMillisecond = format$$1(".%L"), |
|
formatSecond = format$$1(":%S"), |
|
formatMinute = format$$1("%I:%M"), |
|
formatHour = format$$1("%I %p"), |
|
formatDay = format$$1("%a %d"), |
|
formatWeek = format$$1("%b %d"), |
|
formatMonth = format$$1("%B"), |
|
formatYear = format$$1("%Y"); |
|
|
|
var tickIntervals = [ |
|
[second, 1, durationSecond], |
|
[second, 5, 5 * durationSecond], |
|
[second, 15, 15 * durationSecond], |
|
[second, 30, 30 * durationSecond], |
|
[minute, 1, durationMinute], |
|
[minute, 5, 5 * durationMinute], |
|
[minute, 15, 15 * durationMinute], |
|
[minute, 30, 30 * durationMinute], |
|
[ hour, 1, durationHour ], |
|
[ hour, 3, 3 * durationHour ], |
|
[ hour, 6, 6 * durationHour ], |
|
[ hour, 12, 12 * durationHour ], |
|
[ day, 1, durationDay ], |
|
[ day, 2, 2 * durationDay ], |
|
[ week, 1, durationWeek ], |
|
[ month, 1, durationMonth ], |
|
[ month, 3, 3 * durationMonth ], |
|
[ year, 1, durationYear ] |
|
]; |
|
|
|
function tickFormat(date) { |
|
return (second(date) < date ? formatMillisecond |
|
: minute(date) < date ? formatSecond |
|
: hour(date) < date ? formatMinute |
|
: day(date) < date ? formatHour |
|
: month(date) < date ? (week(date) < date ? formatDay : formatWeek) |
|
: year(date) < date ? formatMonth |
|
: formatYear)(date); |
|
} |
|
|
|
function tickInterval(interval, start, stop, step) { |
|
if (interval == null) interval = 10; |
|
|
|
// If a desired tick count is specified, pick a reasonable tick interval |
|
// based on the extent of the domain and a rough estimate of tick size. |
|
// Otherwise, assume interval is already a time interval and use it. |
|
if (typeof interval === "number") { |
|
var target = Math.abs(stop - start) / interval, |
|
i = d3Array.bisector(function(i) { return i[2]; }).right(tickIntervals, target); |
|
if (i === tickIntervals.length) { |
|
step = d3Array.tickStep(start / durationYear, stop / durationYear, interval); |
|
interval = year; |
|
} else if (i) { |
|
i = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i]; |
|
step = i[1]; |
|
interval = i[0]; |
|
} else { |
|
step = d3Array.tickStep(start, stop, interval); |
|
interval = millisecond; |
|
} |
|
} |
|
|
|
return step == null ? interval : interval.every(step); |
|
} |
|
|
|
scale.invert = function(y) { |
|
return new Date(invert(y)); |
|
}; |
|
|
|
scale.domain = function(_) { |
|
return arguments.length ? domain(map$1.call(_, number$1)) : domain().map(date); |
|
}; |
|
|
|
scale.ticks = function(interval, step) { |
|
var d = domain(), |
|
t0 = d[0], |
|
t1 = d[d.length - 1], |
|
r = t1 < t0, |
|
t; |
|
if (r) t = t0, t0 = t1, t1 = t; |
|
t = tickInterval(interval, t0, t1, step); |
|
t = t ? t.range(t0, t1 + 1) : []; // inclusive stop |
|
return r ? t.reverse() : t; |
|
}; |
|
|
|
scale.tickFormat = function(count, specifier) { |
|
return specifier == null ? tickFormat : format$$1(specifier); |
|
}; |
|
|
|
scale.nice = function(interval, step) { |
|
var d = domain(); |
|
return (interval = tickInterval(interval, d[0], d[d.length - 1], step)) |
|
? domain(nice(d, interval)) |
|
: scale; |
|
}; |
|
|
|
scale.copy = function() { |
|
return copy(scale, calendar(year, month, week, day, hour, minute, second, millisecond, format$$1)); |
|
}; |
|
|
|
return scale; |
|
} |
|
|
|
var time = function() { |
|
return calendar(d3Time.timeYear, d3Time.timeMonth, d3Time.timeWeek, d3Time.timeDay, d3Time.timeHour, d3Time.timeMinute, d3Time.timeSecond, d3Time.timeMillisecond, d3TimeFormat.timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]); |
|
}; |
|
|
|
var utcTime = function() { |
|
return calendar(d3Time.utcYear, d3Time.utcMonth, d3Time.utcWeek, d3Time.utcDay, d3Time.utcHour, d3Time.utcMinute, d3Time.utcSecond, d3Time.utcMillisecond, d3TimeFormat.utcFormat).domain([Date.UTC(2000, 0, 1), Date.UTC(2000, 0, 2)]); |
|
}; |
|
|
|
var colors = function(s) { |
|
return s.match(/.{6}/g).map(function(x) { |
|
return "#" + x; |
|
}); |
|
}; |
|
|
|
var category10 = colors("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf"); |
|
|
|
var category20b = colors("393b795254a36b6ecf9c9ede6379398ca252b5cf6bcedb9c8c6d31bd9e39e7ba52e7cb94843c39ad494ad6616be7969c7b4173a55194ce6dbdde9ed6"); |
|
|
|
var category20c = colors("3182bd6baed69ecae1c6dbefe6550dfd8d3cfdae6bfdd0a231a35474c476a1d99bc7e9c0756bb19e9ac8bcbddcdadaeb636363969696bdbdbdd9d9d9"); |
|
|
|
var category20 = colors("1f77b4aec7e8ff7f0effbb782ca02c98df8ad62728ff98969467bdc5b0d58c564bc49c94e377c2f7b6d27f7f7fc7c7c7bcbd22dbdb8d17becf9edae5"); |
|
|
|
var cubehelix$1 = d3Interpolate.interpolateCubehelixLong(d3Color.cubehelix(300, 0.5, 0.0), d3Color.cubehelix(-240, 0.5, 1.0)); |
|
|
|
var warm = d3Interpolate.interpolateCubehelixLong(d3Color.cubehelix(-100, 0.75, 0.35), d3Color.cubehelix(80, 1.50, 0.8)); |
|
|
|
var cool = d3Interpolate.interpolateCubehelixLong(d3Color.cubehelix(260, 0.75, 0.35), d3Color.cubehelix(80, 1.50, 0.8)); |
|
|
|
var rainbow = d3Color.cubehelix(); |
|
|
|
var rainbow$1 = function(t) { |
|
if (t < 0 || t > 1) t -= Math.floor(t); |
|
var ts = Math.abs(t - 0.5); |
|
rainbow.h = 360 * t - 100; |
|
rainbow.s = 1.5 - 1.5 * ts; |
|
rainbow.l = 0.8 - 0.9 * ts; |
|
return rainbow + ""; |
|
}; |
|
|
|
function ramp(range$$1) { |
|
var n = range$$1.length; |
|
return function(t) { |
|
return range$$1[Math.max(0, Math.min(n - 1, Math.floor(t * n)))]; |
|
}; |
|
} |
|
|
|
var viridis = ramp(colors("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725")); |
|
|
|
var magma = ramp(colors("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf")); |
|
|
|
var inferno = ramp(colors("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4")); |
|
|
|
var plasma = ramp(colors("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921")); |
|
|
|
function sequential(interpolator) { |
|
var x0 = 0, |
|
x1 = 1, |
|
clamp = false; |
|
|
|
function scale(x) { |
|
var t = (x - x0) / (x1 - x0); |
|
return interpolator(clamp ? Math.max(0, Math.min(1, t)) : t); |
|
} |
|
|
|
scale.domain = function(_) { |
|
return arguments.length ? (x0 = +_[0], x1 = +_[1], scale) : [x0, x1]; |
|
}; |
|
|
|
scale.clamp = function(_) { |
|
return arguments.length ? (clamp = !!_, scale) : clamp; |
|
}; |
|
|
|
scale.interpolator = function(_) { |
|
return arguments.length ? (interpolator = _, scale) : interpolator; |
|
}; |
|
|
|
scale.copy = function() { |
|
return sequential(interpolator).domain([x0, x1]).clamp(clamp); |
|
}; |
|
|
|
return linearish(scale); |
|
} |
|
|
|
exports.scaleBand = band; |
|
exports.scalePoint = point; |
|
exports.scaleIdentity = identity; |
|
exports.scaleLinear = linear; |
|
exports.scaleLog = log; |
|
exports.scaleOrdinal = ordinal; |
|
exports.scaleImplicit = implicit; |
|
exports.scalePow = pow; |
|
exports.scaleSqrt = sqrt; |
|
exports.scaleQuantile = quantile$1; |
|
exports.scaleQuantize = quantize; |
|
exports.scaleThreshold = threshold; |
|
exports.scaleTime = time; |
|
exports.scaleUtc = utcTime; |
|
exports.schemeCategory10 = category10; |
|
exports.schemeCategory20b = category20b; |
|
exports.schemeCategory20c = category20c; |
|
exports.schemeCategory20 = category20; |
|
exports.interpolateCubehelixDefault = cubehelix$1; |
|
exports.interpolateRainbow = rainbow$1; |
|
exports.interpolateWarm = warm; |
|
exports.interpolateCool = cool; |
|
exports.interpolateViridis = viridis; |
|
exports.interpolateMagma = magma; |
|
exports.interpolateInferno = inferno; |
|
exports.interpolatePlasma = plasma; |
|
exports.scaleSequential = sequential; |
|
|
|
Object.defineProperty(exports, '__esModule', { value: true }); |
|
|
|
}))); |
|
|
|
},{"d3-array":7,"d3-collection":8,"d3-color":9,"d3-format":13,"d3-interpolate":14,"d3-time":19,"d3-time-format":18}],17:[function(require,module,exports){ |
|
// https://d3js.org/d3-selection/ Version 1.1.0. Copyright 2017 Mike Bostock. |
|
(function (global, factory) { |
|
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : |
|
typeof define === 'function' && define.amd ? define(['exports'], factory) : |
|
(factory((global.d3 = global.d3 || {}))); |
|
}(this, (function (exports) { 'use strict'; |
|
|
|
var xhtml = "http://www.w3.org/1999/xhtml"; |
|
|
|
var namespaces = { |
|
svg: "http://www.w3.org/2000/svg", |
|
xhtml: xhtml, |
|
xlink: "http://www.w3.org/1999/xlink", |
|
xml: "http://www.w3.org/XML/1998/namespace", |
|
xmlns: "http://www.w3.org/2000/xmlns/" |
|
}; |
|
|
|
var namespace = function(name) { |
|
var prefix = name += "", i = prefix.indexOf(":"); |
|
if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns") name = name.slice(i + 1); |
|
return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name; |
|
}; |
|
|
|
function creatorInherit(name) { |
|
return function() { |
|
var document = this.ownerDocument, |
|
uri = this.namespaceURI; |
|
return uri === xhtml && document.documentElement.namespaceURI === xhtml |
|
? document.createElement(name) |
|
: document.createElementNS(uri, name); |
|
}; |
|
} |
|
|
|
function creatorFixed(fullname) { |
|
return function() { |
|
return this.ownerDocument.createElementNS(fullname.space, fullname.local); |
|
}; |
|
} |
|
|
|
var creator = function(name) { |
|
var fullname = namespace(name); |
|
return (fullname.local |
|
? creatorFixed |
|
: creatorInherit)(fullname); |
|
}; |
|
|
|
var nextId = 0; |
|
|
|
function local() { |
|
return new Local; |
|
} |
|
|
|
function Local() { |
|
this._ = "@" + (++nextId).toString(36); |
|
} |
|
|
|
Local.prototype = local.prototype = { |
|
constructor: Local, |
|
get: function(node) { |
|
var id = this._; |
|
while (!(id in node)) if (!(node = node.parentNode)) return; |
|
return node[id]; |
|
}, |
|
set: function(node, value) { |
|
return node[this._] = value; |
|
}, |
|
remove: function(node) { |
|
return this._ in node && delete node[this._]; |
|
}, |
|
toString: function() { |
|
return this._; |
|
} |
|
}; |
|
|
|
var matcher = function(selector) { |
|
return function() { |
|
return this.matches(selector); |
|
}; |
|
}; |
|
|
|
if (typeof document !== "undefined") { |
|
var element = document.documentElement; |
|
if (!element.matches) { |
|
var vendorMatches = element.webkitMatchesSelector |
|
|| element.msMatchesSelector |
|
|| element.mozMatchesSelector |
|
|| element.oMatchesSelector; |
|
matcher = function(selector) { |
|
return function() { |
|
return vendorMatches.call(this, selector); |
|
}; |
|
}; |
|
} |
|
} |
|
|
|
var matcher$1 = matcher; |
|
|
|
var filterEvents = {}; |
|
|
|
exports.event = null; |
|
|
|
if (typeof document !== "undefined") { |
|
var element$1 = document.documentElement; |
|
if (!("onmouseenter" in element$1)) { |
|
filterEvents = {mouseenter: "mouseover", mouseleave: "mouseout"}; |
|
} |
|
} |
|
|
|
function filterContextListener(listener, index, group) { |
|
listener = contextListener(listener, index, group); |
|
return function(event) { |
|
var related = event.relatedTarget; |
|
if (!related || (related !== this && !(related.compareDocumentPosition(this) & 8))) { |
|
listener.call(this, event); |
|
} |
|
}; |
|
} |
|
|
|
function contextListener(listener, index, group) { |
|
return function(event1) { |
|
var event0 = exports.event; // Events can be reentrant (e.g., focus). |
|
exports.event = event1; |
|
try { |
|
listener.call(this, this.__data__, index, group); |
|
} finally { |
|
exports.event = event0; |
|
} |
|
}; |
|
} |
|
|
|
function parseTypenames(typenames) { |
|
return typenames.trim().split(/^|\s+/).map(function(t) { |
|
var name = "", i = t.indexOf("."); |
|
if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i); |
|
return {type: t, name: name}; |
|
}); |
|
} |
|
|
|
function onRemove(typename) { |
|
return function() { |
|
var on = this.__on; |
|
if (!on) return; |
|
for (var j = 0, i = -1, m = on.length, o; j < m; ++j) { |
|
if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) { |
|
this.removeEventListener(o.type, o.listener, o.capture); |
|
} else { |
|
on[++i] = o; |
|
} |
|
} |
|
if (++i) on.length = i; |
|
else delete this.__on; |
|
}; |
|
} |
|
|
|
function onAdd(typename, value, capture) { |
|
var wrap = filterEvents.hasOwnProperty(typename.type) ? filterContextListener : contextListener; |
|
return function(d, i, group) { |
|
var on = this.__on, o, listener = wrap(value, i, group); |
|
if (on) for (var j = 0, m = on.length; j < m; ++j) { |
|
if ((o = on[j]).type === typename.type && o.name === typename.name) { |
|
this.removeEventListener(o.type, o.listener, o.capture); |
|
this.addEventListener(o.type, o.listener = listener, o.capture = capture); |
|
o.value = value; |
|
return; |
|
} |
|
} |
|
this.addEventListener(typename.type, listener, capture); |
|
o = {type: typename.type, name: typename.name, value: value, listener: listener, capture: capture}; |
|
if (!on) this.__on = [o]; |
|
else on.push(o); |
|
}; |
|
} |
|
|
|
var selection_on = function(typename, value, capture) { |
|
var typenames = parseTypenames(typename + ""), i, n = typenames.length, t; |
|
|
|
if (arguments.length < 2) { |
|
var on = this.node().__on; |
|
if (on) for (var j = 0, m = on.length, o; j < m; ++j) { |
|
for (i = 0, o = on[j]; i < n; ++i) { |
|
if ((t = typenames[i]).type === o.type && t.name === o.name) { |
|
return o.value; |
|
} |
|
} |
|
} |
|
return; |
|
} |
|
|
|
on = value ? onAdd : onRemove; |
|
if (capture == null) capture = false; |
|
for (i = 0; i < n; ++i) this.each(on(typenames[i], value, capture)); |
|
return this; |
|
}; |
|
|
|
function customEvent(event1, listener, that, args) { |
|
var event0 = exports.event; |
|
event1.sourceEvent = exports.event; |
|
exports.event = event1; |
|
try { |
|
return listener.apply(that, args); |
|
} finally { |
|
exports.event = event0; |
|
} |
|
} |
|
|
|
var sourceEvent = function() { |
|
var current = exports.event, source; |
|
while (source = current.sourceEvent) current = source; |
|
return current; |
|
}; |
|
|
|
var point = function(node, event) { |
|
var svg = node.ownerSVGElement || node; |
|
|
|
if (svg.createSVGPoint) { |
|
var point = svg.createSVGPoint(); |
|
point.x = event.clientX, point.y = event.clientY; |
|
point = point.matrixTransform(node.getScreenCTM().inverse()); |
|
return [point.x, point.y]; |
|
} |
|
|
|
var rect = node.getBoundingClientRect(); |
|
return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop]; |
|
}; |
|
|
|
var mouse = function(node) { |
|
var event = sourceEvent(); |
|
if (event.changedTouches) event = event.changedTouches[0]; |
|
return point(node, event); |
|
}; |
|
|
|
function none() {} |
|
|
|
var selector = function(selector) { |
|
return selector == null ? none : function() { |
|
return this.querySelector(selector); |
|
}; |
|
}; |
|
|
|
var selection_select = function(select) { |
|
if (typeof select !== "function") select = selector(select); |
|
|
|
for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { |
|
for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) { |
|
if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) { |
|
if ("__data__" in node) subnode.__data__ = node.__data__; |
|
subgroup[i] = subnode; |
|
} |
|
} |
|
} |
|
|
|
return new Selection(subgroups, this._parents); |
|
}; |
|
|
|
function empty() { |
|
return []; |
|
} |
|
|
|
var selectorAll = function(selector) { |
|
return selector == null ? empty : function() { |
|
return this.querySelectorAll(selector); |
|
}; |
|
}; |
|
|
|
var selection_selectAll = function(select) { |
|
if (typeof select !== "function") select = selectorAll(select); |
|
|
|
for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) { |
|
for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { |
|
if (node = group[i]) { |
|
subgroups.push(select.call(node, node.__data__, i, group)); |
|
parents.push(node); |
|
} |
|
} |
|
} |
|
|
|
return new Selection(subgroups, parents); |
|
}; |
|
|
|
var selection_filter = function(match) { |
|
if (typeof match !== "function") match = matcher$1(match); |
|
|
|
for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { |
|
for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) { |
|
if ((node = group[i]) && match.call(node, node.__data__, i, group)) { |
|
subgroup.push(node); |
|
} |
|
} |
|
} |
|
|
|
return new Selection(subgroups, this._parents); |
|
}; |
|
|
|
var sparse = function(update) { |
|
return new Array(update.length); |
|
}; |
|
|
|
var selection_enter = function() { |
|
return new Selection(this._enter || this._groups.map(sparse), this._parents); |
|
}; |
|
|
|
function EnterNode(parent, datum) { |
|
this.ownerDocument = parent.ownerDocument; |
|
this.namespaceURI = parent.namespaceURI; |
|
this._next = null; |
|
this._parent = parent; |
|
this.__data__ = datum; |
|
} |
|
|
|
EnterNode.prototype = { |
|
constructor: EnterNode, |
|
appendChild: function(child) { return this._parent.insertBefore(child, this._next); }, |
|
insertBefore: function(child, next) { return this._parent.insertBefore(child, next); }, |
|
querySelector: function(selector) { return this._parent.querySelector(selector); }, |
|
querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); } |
|
}; |
|
|
|
var constant = function(x) { |
|
return function() { |
|
return x; |
|
}; |
|
}; |
|
|
|
var keyPrefix = "$"; // Protect against keys like “__proto__”. |
|
|
|
function bindIndex(parent, group, enter, update, exit, data) { |
|
var i = 0, |
|
node, |
|
groupLength = group.length, |
|
dataLength = data.length; |
|
|
|
// Put any non-null nodes that fit into update. |
|
// Put any null nodes into enter. |
|
// Put any remaining data into enter. |
|
for (; i < dataLength; ++i) { |
|
if (node = group[i]) { |
|
node.__data__ = data[i]; |
|
update[i] = node; |
|
} else { |
|
enter[i] = new EnterNode(parent, data[i]); |
|
} |
|
} |
|
|
|
// Put any non-null nodes that don’t fit into exit. |
|
for (; i < groupLength; ++i) { |
|
if (node = group[i]) { |
|
exit[i] = node; |
|
} |
|
} |
|
} |
|
|
|
function bindKey(parent, group, enter, update, exit, data, key) { |
|
var i, |
|
node, |
|
nodeByKeyValue = {}, |
|
groupLength = group.length, |
|
dataLength = data.length, |
|
keyValues = new Array(groupLength), |
|
keyValue; |
|
|
|
// Compute the key for each node. |
|
// If multiple nodes have the same key, the duplicates are added to exit. |
|
for (i = 0; i < groupLength; ++i) { |
|
if (node = group[i]) { |
|
keyValues[i] = keyValue = keyPrefix + key.call(node, node.__data__, i, group); |
|
if (keyValue in nodeByKeyValue) { |
|
exit[i] = node; |
|
} else { |
|
nodeByKeyValue[keyValue] = node; |
|
} |
|
} |
|
} |
|
|
|
// Compute the key for each datum. |
|
// If there a node associated with this key, join and add it to update. |
|
// If there is not (or the key is a duplicate), add it to enter. |
|
for (i = 0; i < dataLength; ++i) { |
|
keyValue = keyPrefix + key.call(parent, data[i], i, data); |
|
if (node = nodeByKeyValue[keyValue]) { |
|
update[i] = node; |
|
node.__data__ = data[i]; |
|
nodeByKeyValue[keyValue] = null; |
|
} else { |
|
enter[i] = new EnterNode(parent, data[i]); |
|
} |
|
} |
|
|
|
// Add any remaining nodes that were not bound to data to exit. |
|
for (i = 0; i < groupLength; ++i) { |
|
if ((node = group[i]) && (nodeByKeyValue[keyValues[i]] === node)) { |
|
exit[i] = node; |
|
} |
|
} |
|
} |
|
|
|
var selection_data = function(value, key) { |
|
if (!value) { |
|
data = new Array(this.size()), j = -1; |
|
this.each(function(d) { data[++j] = d; }); |
|
return data; |
|
} |
|
|
|
var bind = key ? bindKey : bindIndex, |
|
parents = this._parents, |
|
groups = this._groups; |
|
|
|
if (typeof value !== "function") value = constant(value); |
|
|
|
for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) { |
|
var parent = parents[j], |
|
group = groups[j], |
|
groupLength = group.length, |
|
data = value.call(parent, parent && parent.__data__, j, parents), |
|
dataLength = data.length, |
|
enterGroup = enter[j] = new Array(dataLength), |
|
updateGroup = update[j] = new Array(dataLength), |
|
exitGroup = exit[j] = new Array(groupLength); |
|
|
|
bind(parent, group, enterGroup, updateGroup, exitGroup, data, key); |
|
|
|
// Now connect the enter nodes to their following update node, such that |
|
// appendChild can insert the materialized enter node before this node, |
|
// rather than at the end of the parent node. |
|
for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) { |
|
if (previous = enterGroup[i0]) { |
|
if (i0 >= i1) i1 = i0 + 1; |
|
while (!(next = updateGroup[i1]) && ++i1 < dataLength); |
|
previous._next = next || null; |
|
} |
|
} |
|
} |
|
|
|
update = new Selection(update, parents); |
|
update._enter = enter; |
|
update._exit = exit; |
|
return update; |
|
}; |
|
|
|
var selection_exit = function() { |
|
return new Selection(this._exit || this._groups.map(sparse), this._parents); |
|
}; |
|
|
|
var selection_merge = function(selection) { |
|
|
|
for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) { |
|
for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) { |
|
if (node = group0[i] || group1[i]) { |
|
merge[i] = node; |
|
} |
|
} |
|
} |
|
|
|
for (; j < m0; ++j) { |
|
merges[j] = groups0[j]; |
|
} |
|
|
|
return new Selection(merges, this._parents); |
|
}; |
|
|
|
var selection_order = function() { |
|
|
|
for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) { |
|
for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) { |
|
if (node = group[i]) { |
|
if (next && next !== node.nextSibling) next.parentNode.insertBefore(node, next); |
|
next = node; |
|
} |
|
} |
|
} |
|
|
|
return this; |
|
}; |
|
|
|
var selection_sort = function(compare) { |
|
if (!compare) compare = ascending; |
|
|
|
function compareNode(a, b) { |
|
return a && b ? compare(a.__data__, b.__data__) : !a - !b; |
|
} |
|
|
|
for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) { |
|
for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) { |
|
if (node = group[i]) { |
|
sortgroup[i] = node; |
|
} |
|
} |
|
sortgroup.sort(compareNode); |
|
} |
|
|
|
return new Selection(sortgroups, this._parents).order(); |
|
}; |
|
|
|
function ascending(a, b) { |
|
return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; |
|
} |
|
|
|
var selection_call = function() { |
|
var callback = arguments[0]; |
|
arguments[0] = this; |
|
callback.apply(null, arguments); |
|
return this; |
|
}; |
|
|
|
var selection_nodes = function() { |
|
var nodes = new Array(this.size()), i = -1; |
|
this.each(function() { nodes[++i] = this; }); |
|
return nodes; |
|
}; |
|
|
|
var selection_node = function() { |
|
|
|
for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) { |
|
for (var group = groups[j], i = 0, n = group.length; i < n; ++i) { |
|
var node = group[i]; |
|
if (node) return node; |
|
} |
|
} |
|
|
|
return null; |
|
}; |
|
|
|
var selection_size = function() { |
|
var size = 0; |
|
this.each(function() { ++size; }); |
|
return size; |
|
}; |
|
|
|
var selection_empty = function() { |
|
return !this.node(); |
|
}; |
|
|
|
var selection_each = function(callback) { |
|
|
|
for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) { |
|
for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) { |
|
if (node = group[i]) callback.call(node, node.__data__, i, group); |
|
} |
|
} |
|
|
|
return this; |
|
}; |
|
|
|
function attrRemove(name) { |
|
return function() { |
|
this.removeAttribute(name); |
|
}; |
|
} |
|
|
|
function attrRemoveNS(fullname) { |
|
return function() { |
|
this.removeAttributeNS(fullname.space, fullname.local); |
|
}; |
|
} |
|
|
|
function attrConstant(name, value) { |
|
return function() { |
|
this.setAttribute(name, value); |
|
}; |
|
} |
|
|
|
function attrConstantNS(fullname, value) { |
|
return function() { |
|
this.setAttributeNS(fullname.space, fullname.local, value); |
|
}; |
|
} |
|
|
|
function attrFunction(name, value) { |
|
return function() { |
|
var v = value.apply(this, arguments); |
|
if (v == null) this.removeAttribute(name); |
|
else this.setAttribute(name, v); |
|
}; |
|
} |
|
|
|
function attrFunctionNS(fullname, value) { |
|
return function() { |
|
var v = value.apply(this, arguments); |
|
if (v == null) this.removeAttributeNS(fullname.space, fullname.local); |
|
else this.setAttributeNS(fullname.space, fullname.local, v); |
|
}; |
|
} |
|
|
|
var selection_attr = function(name, value) { |
|
var fullname = namespace(name); |
|
|
|
if (arguments.length < 2) { |
|
var node = this.node(); |
|
return fullname.local |
|
? node.getAttributeNS(fullname.space, fullname.local) |
|
: node.getAttribute(fullname); |
|
} |
|
|
|
return this.each((value == null |
|
? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === "function" |
|
? (fullname.local ? attrFunctionNS : attrFunction) |
|
: (fullname.local ? attrConstantNS : attrConstant)))(fullname, value)); |
|
}; |
|
|
|
var defaultView = function(node) { |
|
return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node |
|
|| (node.document && node) // node is a Window |
|
|| node.defaultView; // node is a Document |
|
}; |
|
|
|
function styleRemove(name) { |
|
return function() { |
|
this.style.removeProperty(name); |
|
}; |
|
} |
|
|
|
function styleConstant(name, value, priority) { |
|
return function() { |
|
this.style.setProperty(name, value, priority); |
|
}; |
|
} |
|
|
|
function styleFunction(name, value, priority) { |
|
return function() { |
|
var v = value.apply(this, arguments); |
|
if (v == null) this.style.removeProperty(name); |
|
else this.style.setProperty(name, v, priority); |
|
}; |
|
} |
|
|
|
var selection_style = function(name, value, priority) { |
|
return arguments.length > 1 |
|
? this.each((value == null |
|
? styleRemove : typeof value === "function" |
|
? styleFunction |
|
: styleConstant)(name, value, priority == null ? "" : priority)) |
|
: styleValue(this.node(), name); |
|
}; |
|
|
|
function styleValue(node, name) { |
|
return node.style.getPropertyValue(name) |
|
|| defaultView(node).getComputedStyle(node, null).getPropertyValue(name); |
|
} |
|
|
|
function propertyRemove(name) { |
|
return function() { |
|
delete this[name]; |
|
}; |
|
} |
|
|
|
function propertyConstant(name, value) { |
|
return function() { |
|
this[name] = value; |
|
}; |
|
} |
|
|
|
function propertyFunction(name, value) { |
|
return function() { |
|
var v = value.apply(this, arguments); |
|
if (v == null) delete this[name]; |
|
else this[name] = v; |
|
}; |
|
} |
|
|
|
var selection_property = function(name, value) { |
|
return arguments.length > 1 |
|
? this.each((value == null |
|
? propertyRemove : typeof value === "function" |
|
? propertyFunction |
|
: propertyConstant)(name, value)) |
|
: this.node()[name]; |
|
}; |
|
|
|
function classArray(string) { |
|
return string.trim().split(/^|\s+/); |
|
} |
|
|
|
function classList(node) { |
|
return node.classList || new ClassList(node); |
|
} |
|
|
|
function ClassList(node) { |
|
this._node = node; |
|
this._names = classArray(node.getAttribute("class") || ""); |
|
} |
|
|
|
ClassList.prototype = { |
|
add: function(name) { |
|
var i = this._names.indexOf(name); |
|
if (i < 0) { |
|
this._names.push(name); |
|
this._node.setAttribute("class", this._names.join(" ")); |
|
} |
|
}, |
|
remove: function(name) { |
|
var i = this._names.indexOf(name); |
|
if (i >= 0) { |
|
this._names.splice(i, 1); |
|
this._node.setAttribute("class", this._names.join(" ")); |
|
} |
|
}, |
|
contains: function(name) { |
|
return this._names.indexOf(name) >= 0; |
|
} |
|
}; |
|
|
|
function classedAdd(node, names) { |
|
var list = classList(node), i = -1, n = names.length; |
|
while (++i < n) list.add(names[i]); |
|
} |
|
|
|
function classedRemove(node, names) { |
|
var list = classList(node), i = -1, n = names.length; |
|
while (++i < n) list.remove(names[i]); |
|
} |
|
|
|
function classedTrue(names) { |
|
return function() { |
|
classedAdd(this, names); |
|
}; |
|
} |
|
|
|
function classedFalse(names) { |
|
return function() { |
|
classedRemove(this, names); |
|
}; |
|
} |
|
|
|
function classedFunction(names, value) { |
|
return function() { |
|
(value.apply(this, arguments) ? classedAdd : classedRemove)(this, names); |
|
}; |
|
} |
|
|
|
var selection_classed = function(name, value) { |
|
var names = classArray(name + ""); |
|
|
|
if (arguments.length < 2) { |
|
var list = classList(this.node()), i = -1, n = names.length; |
|
while (++i < n) if (!list.contains(names[i])) return false; |
|
return true; |
|
} |
|
|
|
return this.each((typeof value === "function" |
|
? classedFunction : value |
|
? classedTrue |
|
: classedFalse)(names, value)); |
|
}; |
|
|
|
function textRemove() { |
|
this.textContent = ""; |
|
} |
|
|
|
function textConstant(value) { |
|
return function() { |
|
this.textContent = value; |
|
}; |
|
} |
|
|
|
function textFunction(value) { |
|
return function() { |
|
var v = value.apply(this, arguments); |
|
this.textContent = v == null ? "" : v; |
|
}; |
|
} |
|
|
|
var selection_text = function(value) { |
|
return arguments.length |
|
? this.each(value == null |
|
? textRemove : (typeof value === "function" |
|
? textFunction |
|
: textConstant)(value)) |
|
: this.node().textContent; |
|
}; |
|
|
|
function htmlRemove() { |
|
this.innerHTML = ""; |
|
} |
|
|
|
function htmlConstant(value) { |
|
return function() { |
|
this.innerHTML = value; |
|
}; |
|
} |
|
|
|
function htmlFunction(value) { |
|
return function() { |
|
var v = value.apply(this, arguments); |
|
this.innerHTML = v == null ? "" : v; |
|
}; |
|
} |
|
|
|
var selection_html = function(value) { |
|
return arguments.length |
|
? this.each(value == null |
|
? htmlRemove : (typeof value === "function" |
|
? htmlFunction |
|
: htmlConstant)(value)) |
|
: this.node().innerHTML; |
|
}; |
|
|
|
function raise() { |
|
if (this.nextSibling) this.parentNode.appendChild(this); |
|
} |
|
|
|
var selection_raise = function() { |
|
return this.each(raise); |
|
}; |
|
|
|
function lower() { |
|
if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild); |
|
} |
|
|
|
var selection_lower = function() { |
|
return this.each(lower); |
|
}; |
|
|
|
var selection_append = function(name) { |
|
var create = typeof name === "function" ? name : creator(name); |
|
return this.select(function() { |
|
return this.appendChild(create.apply(this, arguments)); |
|
}); |
|
}; |
|
|
|
function constantNull() { |
|
return null; |
|
} |
|
|
|
var selection_insert = function(name, before) { |
|
var create = typeof name === "function" ? name : creator(name), |
|
select = before == null ? constantNull : typeof before === "function" ? before : selector(before); |
|
return this.select(function() { |
|
return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null); |
|
}); |
|
}; |
|
|
|
function remove() { |
|
var parent = this.parentNode; |
|
if (parent) parent.removeChild(this); |
|
} |
|
|
|
var selection_remove = function() { |
|
return this.each(remove); |
|
}; |
|
|
|
var selection_datum = function(value) { |
|
return arguments.length |
|
? this.property("__data__", value) |
|
: this.node().__data__; |
|
}; |
|
|
|
function dispatchEvent(node, type, params) { |
|
var window = defaultView(node), |
|
event = window.CustomEvent; |
|
|
|
if (typeof event === "function") { |
|
event = new event(type, params); |
|
} else { |
|
event = window.document.createEvent("Event"); |
|
if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail; |
|
else event.initEvent(type, false, false); |
|
} |
|
|
|
node.dispatchEvent(event); |
|
} |
|
|
|
function dispatchConstant(type, params) { |
|
return function() { |
|
return dispatchEvent(this, type, params); |
|
}; |
|
} |
|
|
|
function dispatchFunction(type, params) { |
|
return function() { |
|
return dispatchEvent(this, type, params.apply(this, arguments)); |
|
}; |
|
} |
|
|
|
var selection_dispatch = function(type, params) { |
|
return this.each((typeof params === "function" |
|
? dispatchFunction |
|
: dispatchConstant)(type, params)); |
|
}; |
|
|
|
var root = [null]; |
|
|
|
function Selection(groups, parents) { |
|
this._groups = groups; |
|
this._parents = parents; |
|
} |
|
|
|
function selection() { |
|
return new Selection([[document.documentElement]], root); |
|
} |
|
|
|
Selection.prototype = selection.prototype = { |
|
constructor: Selection, |
|
select: selection_select, |
|
selectAll: selection_selectAll, |
|
filter: selection_filter, |
|
data: selection_data, |
|
enter: selection_enter, |
|
exit: selection_exit, |
|
merge: selection_merge, |
|
order: selection_order, |
|
sort: selection_sort, |
|
call: selection_call, |
|
nodes: selection_nodes, |
|
node: selection_node, |
|
size: selection_size, |
|
empty: selection_empty, |
|
each: selection_each, |
|
attr: selection_attr, |
|
style: selection_style, |
|
property: selection_property, |
|
classed: selection_classed, |
|
text: selection_text, |
|
html: selection_html, |
|
raise: selection_raise, |
|
lower: selection_lower, |
|
append: selection_append, |
|
insert: selection_insert, |
|
remove: selection_remove, |
|
datum: selection_datum, |
|
on: selection_on, |
|
dispatch: selection_dispatch |
|
}; |
|
|
|
var select = function(selector) { |
|
return typeof selector === "string" |
|
? new Selection([[document.querySelector(selector)]], [document.documentElement]) |
|
: new Selection([[selector]], root); |
|
}; |
|
|
|
var selectAll = function(selector) { |
|
return typeof selector === "string" |
|
? new Selection([document.querySelectorAll(selector)], [document.documentElement]) |
|
: new Selection([selector == null ? [] : selector], root); |
|
}; |
|
|
|
var touch = function(node, touches, identifier) { |
|
if (arguments.length < 3) identifier = touches, touches = sourceEvent().changedTouches; |
|
|
|
for (var i = 0, n = touches ? touches.length : 0, touch; i < n; ++i) { |
|
if ((touch = touches[i]).identifier === identifier) { |
|
return point(node, touch); |
|
} |
|
} |
|
|
|
return null; |
|
}; |
|
|
|
var touches = function(node, touches) { |
|
if (touches == null) touches = sourceEvent().touches; |
|
|
|
for (var i = 0, n = touches ? touches.length : 0, points = new Array(n); i < n; ++i) { |
|
points[i] = point(node, touches[i]); |
|
} |
|
|
|
return points; |
|
}; |
|
|
|
exports.creator = creator; |
|
exports.local = local; |
|
exports.matcher = matcher$1; |
|
exports.mouse = mouse; |
|
exports.namespace = namespace; |
|
exports.namespaces = namespaces; |
|
exports.select = select; |
|
exports.selectAll = selectAll; |
|
exports.selection = selection; |
|
exports.selector = selector; |
|
exports.selectorAll = selectorAll; |
|
exports.style = styleValue; |
|
exports.touch = touch; |
|
exports.touches = touches; |
|
exports.window = defaultView; |
|
exports.customEvent = customEvent; |
|
|
|
Object.defineProperty(exports, '__esModule', { value: true }); |
|
|
|
}))); |
|
|
|
},{}],18:[function(require,module,exports){ |
|
// https://d3js.org/d3-time-format/ Version 2.0.5. Copyright 2017 Mike Bostock. |
|
(function (global, factory) { |
|
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-time')) : |
|
typeof define === 'function' && define.amd ? define(['exports', 'd3-time'], factory) : |
|
(factory((global.d3 = global.d3 || {}),global.d3)); |
|
}(this, (function (exports,d3Time) { 'use strict'; |
|
|
|
function localDate(d) { |
|
if (0 <= d.y && d.y < 100) { |
|
var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L); |
|
date.setFullYear(d.y); |
|
return date; |
|
} |
|
return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L); |
|
} |
|
|
|
function utcDate(d) { |
|
if (0 <= d.y && d.y < 100) { |
|
var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L)); |
|
date.setUTCFullYear(d.y); |
|
return date; |
|
} |
|
return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L)); |
|
} |
|
|
|
function newYear(y) { |
|
return {y: y, m: 0, d: 1, H: 0, M: 0, S: 0, L: 0}; |
|
} |
|
|
|
function formatLocale(locale) { |
|
var locale_dateTime = locale.dateTime, |
|
locale_date = locale.date, |
|
locale_time = locale.time, |
|
locale_periods = locale.periods, |
|
locale_weekdays = locale.days, |
|
locale_shortWeekdays = locale.shortDays, |
|
locale_months = locale.months, |
|
locale_shortMonths = locale.shortMonths; |
|
|
|
var periodRe = formatRe(locale_periods), |
|
periodLookup = formatLookup(locale_periods), |
|
weekdayRe = formatRe(locale_weekdays), |
|
weekdayLookup = formatLookup(locale_weekdays), |
|
shortWeekdayRe = formatRe(locale_shortWeekdays), |
|
shortWeekdayLookup = formatLookup(locale_shortWeekdays), |
|
monthRe = formatRe(locale_months), |
|
monthLookup = formatLookup(locale_months), |
|
shortMonthRe = formatRe(locale_shortMonths), |
|
shortMonthLookup = formatLookup(locale_shortMonths); |
|
|
|
var formats = { |
|
"a": formatShortWeekday, |
|
"A": formatWeekday, |
|
"b": formatShortMonth, |
|
"B": formatMonth, |
|
"c": null, |
|
"d": formatDayOfMonth, |
|
"e": formatDayOfMonth, |
|
"H": formatHour24, |
|
"I": formatHour12, |
|
"j": formatDayOfYear, |
|
"L": formatMilliseconds, |
|
"m": formatMonthNumber, |
|
"M": formatMinutes, |
|
"p": formatPeriod, |
|
"S": formatSeconds, |
|
"U": formatWeekNumberSunday, |
|
"w": formatWeekdayNumber, |
|
"W": formatWeekNumberMonday, |
|
"x": null, |
|
"X": null, |
|
"y": formatYear, |
|
"Y": formatFullYear, |
|
"Z": formatZone, |
|
"%": formatLiteralPercent |
|
}; |
|
|
|
var utcFormats = { |
|
"a": formatUTCShortWeekday, |
|
"A": formatUTCWeekday, |
|
"b": formatUTCShortMonth, |
|
"B": formatUTCMonth, |
|
"c": null, |
|
"d": formatUTCDayOfMonth, |
|
"e": formatUTCDayOfMonth, |
|
"H": formatUTCHour24, |
|
"I": formatUTCHour12, |
|
"j": formatUTCDayOfYear, |
|
"L": formatUTCMilliseconds, |
|
"m": formatUTCMonthNumber, |
|
"M": formatUTCMinutes, |
|
"p": formatUTCPeriod, |
|
"S": formatUTCSeconds, |
|
"U": formatUTCWeekNumberSunday, |
|
"w": formatUTCWeekdayNumber, |
|
"W": formatUTCWeekNumberMonday, |
|
"x": null, |
|
"X": null, |
|
"y": formatUTCYear, |
|
"Y": formatUTCFullYear, |
|
"Z": formatUTCZone, |
|
"%": formatLiteralPercent |
|
}; |
|
|
|
var parses = { |
|
"a": parseShortWeekday, |
|
"A": parseWeekday, |
|
"b": parseShortMonth, |
|
"B": parseMonth, |
|
"c": parseLocaleDateTime, |
|
"d": parseDayOfMonth, |
|
"e": parseDayOfMonth, |
|
"H": parseHour24, |
|
"I": parseHour24, |
|
"j": parseDayOfYear, |
|
"L": parseMilliseconds, |
|
"m": parseMonthNumber, |
|
"M": parseMinutes, |
|
"p": parsePeriod, |
|
"S": parseSeconds, |
|
"U": parseWeekNumberSunday, |
|
"w": parseWeekdayNumber, |
|
"W": parseWeekNumberMonday, |
|
"x": parseLocaleDate, |
|
"X": parseLocaleTime, |
|
"y": parseYear, |
|
"Y": parseFullYear, |
|
"Z": parseZone, |
|
"%": parseLiteralPercent |
|
}; |
|
|
|
// These recursive directive definitions must be deferred. |
|
formats.x = newFormat(locale_date, formats); |
|
formats.X = newFormat(locale_time, formats); |
|
formats.c = newFormat(locale_dateTime, formats); |
|
utcFormats.x = newFormat(locale_date, utcFormats); |
|
utcFormats.X = newFormat(locale_time, utcFormats); |
|
utcFormats.c = newFormat(locale_dateTime, utcFormats); |
|
|
|
function newFormat(specifier, formats) { |
|
return function(date) { |
|
var string = [], |
|
i = -1, |
|
j = 0, |
|
n = specifier.length, |
|
c, |
|
pad, |
|
format; |
|
|
|
if (!(date instanceof Date)) date = new Date(+date); |
|
|
|
while (++i < n) { |
|
if (specifier.charCodeAt(i) === 37) { |
|
string.push(specifier.slice(j, i)); |
|
if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i); |
|
else pad = c === "e" ? " " : "0"; |
|
if (format = formats[c]) c = format(date, pad); |
|
string.push(c); |
|
j = i + 1; |
|
} |
|
} |
|
|
|
string.push(specifier.slice(j, i)); |
|
return string.join(""); |
|
}; |
|
} |
|
|
|
function newParse(specifier, newDate) { |
|
return function(string) { |
|
var d = newYear(1900), |
|
i = parseSpecifier(d, specifier, string += "", 0); |
|
if (i != string.length) return null; |
|
|
|
// The am-pm flag is 0 for AM, and 1 for PM. |
|
if ("p" in d) d.H = d.H % 12 + d.p * 12; |
|
|
|
// Convert day-of-week and week-of-year to day-of-year. |
|
if ("W" in d || "U" in d) { |
|
if (!("w" in d)) d.w = "W" in d ? 1 : 0; |
|
var day = "Z" in d ? utcDate(newYear(d.y)).getUTCDay() : newDate(newYear(d.y)).getDay(); |
|
d.m = 0; |
|
d.d = "W" in d ? (d.w + 6) % 7 + d.W * 7 - (day + 5) % 7 : d.w + d.U * 7 - (day + 6) % 7; |
|
} |
|
|
|
// If a time zone is specified, all fields are interpreted as UTC and then |
|
// offset according to the specified time zone. |
|
if ("Z" in d) { |
|
d.H += d.Z / 100 | 0; |
|
d.M += d.Z % 100; |
|
return utcDate(d); |
|
} |
|
|
|
// Otherwise, all fields are in local time. |
|
return newDate(d); |
|
}; |
|
} |
|
|
|
function parseSpecifier(d, specifier, string, j) { |
|
var i = 0, |
|
n = specifier.length, |
|
m = string.length, |
|
c, |
|
parse; |
|
|
|
while (i < n) { |
|
if (j >= m) return -1; |
|
c = specifier.charCodeAt(i++); |
|
if (c === 37) { |
|
c = specifier.charAt(i++); |
|
parse = parses[c in pads ? specifier.charAt(i++) : c]; |
|
if (!parse || ((j = parse(d, string, j)) < 0)) return -1; |
|
} else if (c != string.charCodeAt(j++)) { |
|
return -1; |
|
} |
|
} |
|
|
|
return j; |
|
} |
|
|
|
function parsePeriod(d, string, i) { |
|
var n = periodRe.exec(string.slice(i)); |
|
return n ? (d.p = periodLookup[n[0].toLowerCase()], i + n[0].length) : -1; |
|
} |
|
|
|
function parseShortWeekday(d, string, i) { |
|
var n = shortWeekdayRe.exec(string.slice(i)); |
|
return n ? (d.w = shortWeekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1; |
|
} |
|
|
|
function parseWeekday(d, string, i) { |
|
var n = weekdayRe.exec(string.slice(i)); |
|
return n ? (d.w = weekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1; |
|
} |
|
|
|
function parseShortMonth(d, string, i) { |
|
var n = shortMonthRe.exec(string.slice(i)); |
|
return n ? (d.m = shortMonthLookup[n[0].toLowerCase()], i + n[0].length) : -1; |
|
} |
|
|
|
function parseMonth(d, string, i) { |
|
var n = monthRe.exec(string.slice(i)); |
|
return n ? (d.m = monthLookup[n[0].toLowerCase()], i + n[0].length) : -1; |
|
} |
|
|
|
function parseLocaleDateTime(d, string, i) { |
|
return parseSpecifier(d, locale_dateTime, string, i); |
|
} |
|
|
|
function parseLocaleDate(d, string, i) { |
|
return parseSpecifier(d, locale_date, string, i); |
|
} |
|
|
|
function parseLocaleTime(d, string, i) { |
|
return parseSpecifier(d, locale_time, string, i); |
|
} |
|
|
|
function formatShortWeekday(d) { |
|
return locale_shortWeekdays[d.getDay()]; |
|
} |
|
|
|
function formatWeekday(d) { |
|
return locale_weekdays[d.getDay()]; |
|
} |
|
|
|
function formatShortMonth(d) { |
|
return locale_shortMonths[d.getMonth()]; |
|
} |
|
|
|
function formatMonth(d) { |
|
return locale_months[d.getMonth()]; |
|
} |
|
|
|
function formatPeriod(d) { |
|
return locale_periods[+(d.getHours() >= 12)]; |
|
} |
|
|
|
function formatUTCShortWeekday(d) { |
|
return locale_shortWeekdays[d.getUTCDay()]; |
|
} |
|
|
|
function formatUTCWeekday(d) { |
|
return locale_weekdays[d.getUTCDay()]; |
|
} |
|
|
|
function formatUTCShortMonth(d) { |
|
return locale_shortMonths[d.getUTCMonth()]; |
|
} |
|
|
|
function formatUTCMonth(d) { |
|
return locale_months[d.getUTCMonth()]; |
|
} |
|
|
|
function formatUTCPeriod(d) { |
|
return locale_periods[+(d.getUTCHours() >= 12)]; |
|
} |
|
|
|
return { |
|
format: function(specifier) { |
|
var f = newFormat(specifier += "", formats); |
|
f.toString = function() { return specifier; }; |
|
return f; |
|
}, |
|
parse: function(specifier) { |
|
var p = newParse(specifier += "", localDate); |
|
p.toString = function() { return specifier; }; |
|
return p; |
|
}, |
|
utcFormat: function(specifier) { |
|
var f = newFormat(specifier += "", utcFormats); |
|
f.toString = function() { return specifier; }; |
|
return f; |
|
}, |
|
utcParse: function(specifier) { |
|
var p = newParse(specifier, utcDate); |
|
p.toString = function() { return specifier; }; |
|
return p; |
|
} |
|
}; |
|
} |
|
|
|
var pads = {"-": "", "_": " ", "0": "0"}; |
|
var numberRe = /^\s*\d+/; |
|
var percentRe = /^%/; |
|
var requoteRe = /[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g; |
|
|
|
function pad(value, fill, width) { |
|
var sign = value < 0 ? "-" : "", |
|
string = (sign ? -value : value) + "", |
|
length = string.length; |
|
return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string); |
|
} |
|
|
|
function requote(s) { |
|
return s.replace(requoteRe, "\\$&"); |
|
} |
|
|
|
function formatRe(names) { |
|
return new RegExp("^(?:" + names.map(requote).join("|") + ")", "i"); |
|
} |
|
|
|
function formatLookup(names) { |
|
var map = {}, i = -1, n = names.length; |
|
while (++i < n) map[names[i].toLowerCase()] = i; |
|
return map; |
|
} |
|
|
|
function parseWeekdayNumber(d, string, i) { |
|
var n = numberRe.exec(string.slice(i, i + 1)); |
|
return n ? (d.w = +n[0], i + n[0].length) : -1; |
|
} |
|
|
|
function parseWeekNumberSunday(d, string, i) { |
|
var n = numberRe.exec(string.slice(i)); |
|
return n ? (d.U = +n[0], i + n[0].length) : -1; |
|
} |
|
|
|
function parseWeekNumberMonday(d, string, i) { |
|
var n = numberRe.exec(string.slice(i)); |
|
return n ? (d.W = +n[0], i + n[0].length) : -1; |
|
} |
|
|
|
function parseFullYear(d, string, i) { |
|
var n = numberRe.exec(string.slice(i, i + 4)); |
|
return n ? (d.y = +n[0], i + n[0].length) : -1; |
|
} |
|
|
|
function parseYear(d, string, i) { |
|
var n = numberRe.exec(string.slice(i, i + 2)); |
|
return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1; |
|
} |
|
|
|
function parseZone(d, string, i) { |
|
var n = /^(Z)|([+-]\d\d)(?:\:?(\d\d))?/.exec(string.slice(i, i + 6)); |
|
return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || "00")), i + n[0].length) : -1; |
|
} |
|
|
|
function parseMonthNumber(d, string, i) { |
|
var n = numberRe.exec(string.slice(i, i + 2)); |
|
return n ? (d.m = n[0] - 1, i + n[0].length) : -1; |
|
} |
|
|
|
function parseDayOfMonth(d, string, i) { |
|
var n = numberRe.exec(string.slice(i, i + 2)); |
|
return n ? (d.d = +n[0], i + n[0].length) : -1; |
|
} |
|
|
|
function parseDayOfYear(d, string, i) { |
|
var n = numberRe.exec(string.slice(i, i + 3)); |
|
return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1; |
|
} |
|
|
|
function parseHour24(d, string, i) { |
|
var n = numberRe.exec(string.slice(i, i + 2)); |
|
return n ? (d.H = +n[0], i + n[0].length) : -1; |
|
} |
|
|
|
function parseMinutes(d, string, i) { |
|
var n = numberRe.exec(string.slice(i, i + 2)); |
|
return n ? (d.M = +n[0], i + n[0].length) : -1; |
|
} |
|
|
|
function parseSeconds(d, string, i) { |
|
var n = numberRe.exec(string.slice(i, i + 2)); |
|
return n ? (d.S = +n[0], i + n[0].length) : -1; |
|
} |
|
|
|
function parseMilliseconds(d, string, i) { |
|
var n = numberRe.exec(string.slice(i, i + 3)); |
|
return n ? (d.L = +n[0], i + n[0].length) : -1; |
|
} |
|
|
|
function parseLiteralPercent(d, string, i) { |
|
var n = percentRe.exec(string.slice(i, i + 1)); |
|
return n ? i + n[0].length : -1; |
|
} |
|
|
|
function formatDayOfMonth(d, p) { |
|
return pad(d.getDate(), p, 2); |
|
} |
|
|
|
function formatHour24(d, p) { |
|
return pad(d.getHours(), p, 2); |
|
} |
|
|
|
function formatHour12(d, p) { |
|
return pad(d.getHours() % 12 || 12, p, 2); |
|
} |
|
|
|
function formatDayOfYear(d, p) { |
|
return pad(1 + d3Time.timeDay.count(d3Time.timeYear(d), d), p, 3); |
|
} |
|
|
|
function formatMilliseconds(d, p) { |
|
return pad(d.getMilliseconds(), p, 3); |
|
} |
|
|
|
function formatMonthNumber(d, p) { |
|
return pad(d.getMonth() + 1, p, 2); |
|
} |
|
|
|
function formatMinutes(d, p) { |
|
return pad(d.getMinutes(), p, 2); |
|
} |
|
|
|
function formatSeconds(d, p) { |
|
return pad(d.getSeconds(), p, 2); |
|
} |
|
|
|
function formatWeekNumberSunday(d, p) { |
|
return pad(d3Time.timeSunday.count(d3Time.timeYear(d), d), p, 2); |
|
} |
|
|
|
function formatWeekdayNumber(d) { |
|
return d.getDay(); |
|
} |
|
|
|
function formatWeekNumberMonday(d, p) { |
|
return pad(d3Time.timeMonday.count(d3Time.timeYear(d), d), p, 2); |
|
} |
|
|
|
function formatYear(d, p) { |
|
return pad(d.getFullYear() % 100, p, 2); |
|
} |
|
|
|
function formatFullYear(d, p) { |
|
return pad(d.getFullYear() % 10000, p, 4); |
|
} |
|
|
|
function formatZone(d) { |
|
var z = d.getTimezoneOffset(); |
|
return (z > 0 ? "-" : (z *= -1, "+")) |
|
+ pad(z / 60 | 0, "0", 2) |
|
+ pad(z % 60, "0", 2); |
|
} |
|
|
|
function formatUTCDayOfMonth(d, p) { |
|
return pad(d.getUTCDate(), p, 2); |
|
} |
|
|
|
function formatUTCHour24(d, p) { |
|
return pad(d.getUTCHours(), p, 2); |
|
} |
|
|
|
function formatUTCHour12(d, p) { |
|
return pad(d.getUTCHours() % 12 || 12, p, 2); |
|
} |
|
|
|
function formatUTCDayOfYear(d, p) { |
|
return pad(1 + d3Time.utcDay.count(d3Time.utcYear(d), d), p, 3); |
|
} |
|
|
|
function formatUTCMilliseconds(d, p) { |
|
return pad(d.getUTCMilliseconds(), p, 3); |
|
} |
|
|
|
function formatUTCMonthNumber(d, p) { |
|
return pad(d.getUTCMonth() + 1, p, 2); |
|
} |
|
|
|
function formatUTCMinutes(d, p) { |
|
return pad(d.getUTCMinutes(), p, 2); |
|
} |
|
|
|
function formatUTCSeconds(d, p) { |
|
return pad(d.getUTCSeconds(), p, 2); |
|
} |
|
|
|
function formatUTCWeekNumberSunday(d, p) { |
|
return pad(d3Time.utcSunday.count(d3Time.utcYear(d), d), p, 2); |
|
} |
|
|
|
function formatUTCWeekdayNumber(d) { |
|
return d.getUTCDay(); |
|
} |
|
|
|
function formatUTCWeekNumberMonday(d, p) { |
|
return pad(d3Time.utcMonday.count(d3Time.utcYear(d), d), p, 2); |
|
} |
|
|
|
function formatUTCYear(d, p) { |
|
return pad(d.getUTCFullYear() % 100, p, 2); |
|
} |
|
|
|
function formatUTCFullYear(d, p) { |
|
return pad(d.getUTCFullYear() % 10000, p, 4); |
|
} |
|
|
|
function formatUTCZone() { |
|
return "+0000"; |
|
} |
|
|
|
function formatLiteralPercent() { |
|
return "%"; |
|
} |
|
|
|
var locale$1; |
|
|
|
|
|
|
|
|
|
|
|
defaultLocale({ |
|
dateTime: "%x, %X", |
|
date: "%-m/%-d/%Y", |
|
time: "%-I:%M:%S %p", |
|
periods: ["AM", "PM"], |
|
days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], |
|
shortDays: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], |
|
months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], |
|
shortMonths: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] |
|
}); |
|
|
|
function defaultLocale(definition) { |
|
locale$1 = formatLocale(definition); |
|
exports.timeFormat = locale$1.format; |
|
exports.timeParse = locale$1.parse; |
|
exports.utcFormat = locale$1.utcFormat; |
|
exports.utcParse = locale$1.utcParse; |
|
return locale$1; |
|
} |
|
|
|
var isoSpecifier = "%Y-%m-%dT%H:%M:%S.%LZ"; |
|
|
|
function formatIsoNative(date) { |
|
return date.toISOString(); |
|
} |
|
|
|
var formatIso = Date.prototype.toISOString |
|
? formatIsoNative |
|
: exports.utcFormat(isoSpecifier); |
|
|
|
function parseIsoNative(string) { |
|
var date = new Date(string); |
|
return isNaN(date) ? null : date; |
|
} |
|
|
|
var parseIso = +new Date("2000-01-01T00:00:00.000Z") |
|
? parseIsoNative |
|
: exports.utcParse(isoSpecifier); |
|
|
|
exports.timeFormatDefaultLocale = defaultLocale; |
|
exports.timeFormatLocale = formatLocale; |
|
exports.isoFormat = formatIso; |
|
exports.isoParse = parseIso; |
|
|
|
Object.defineProperty(exports, '__esModule', { value: true }); |
|
|
|
}))); |
|
|
|
},{"d3-time":19}],19:[function(require,module,exports){ |
|
// https://d3js.org/d3-time/ Version 1.0.6. Copyright 2017 Mike Bostock. |
|
(function (global, factory) { |
|
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : |
|
typeof define === 'function' && define.amd ? define(['exports'], factory) : |
|
(factory((global.d3 = global.d3 || {}))); |
|
}(this, (function (exports) { 'use strict'; |
|
|
|
var t0 = new Date; |
|
var t1 = new Date; |
|
|
|
function newInterval(floori, offseti, count, field) { |
|
|
|
function interval(date) { |
|
return floori(date = new Date(+date)), date; |
|
} |
|
|
|
interval.floor = interval; |
|
|
|
interval.ceil = function(date) { |
|
return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date; |
|
}; |
|
|
|
interval.round = function(date) { |
|
var d0 = interval(date), |
|
d1 = interval.ceil(date); |
|
return date - d0 < d1 - date ? d0 : d1; |
|
}; |
|
|
|
interval.offset = function(date, step) { |
|
return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date; |
|
}; |
|
|
|
interval.range = function(start, stop, step) { |
|
var range = []; |
|
start = interval.ceil(start); |
|
step = step == null ? 1 : Math.floor(step); |
|
if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date |
|
do range.push(new Date(+start)); while (offseti(start, step), floori(start), start < stop) |
|
return range; |
|
}; |
|
|
|
interval.filter = function(test) { |
|
return newInterval(function(date) { |
|
if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1); |
|
}, function(date, step) { |
|
if (date >= date) while (--step >= 0) while (offseti(date, 1), !test(date)) {} // eslint-disable-line no-empty |
|
}); |
|
}; |
|
|
|
if (count) { |
|
interval.count = function(start, end) { |
|
t0.setTime(+start), t1.setTime(+end); |
|
floori(t0), floori(t1); |
|
return Math.floor(count(t0, t1)); |
|
}; |
|
|
|
interval.every = function(step) { |
|
step = Math.floor(step); |
|
return !isFinite(step) || !(step > 0) ? null |
|
: !(step > 1) ? interval |
|
: interval.filter(field |
|
? function(d) { return field(d) % step === 0; } |
|
: function(d) { return interval.count(0, d) % step === 0; }); |
|
}; |
|
} |
|
|
|
return interval; |
|
} |
|
|
|
var millisecond = newInterval(function() { |
|
// noop |
|
}, function(date, step) { |
|
date.setTime(+date + step); |
|
}, function(start, end) { |
|
return end - start; |
|
}); |
|
|
|
// An optimized implementation for this simple case. |
|
millisecond.every = function(k) { |
|
k = Math.floor(k); |
|
if (!isFinite(k) || !(k > 0)) return null; |
|
if (!(k > 1)) return millisecond; |
|
return newInterval(function(date) { |
|
date.setTime(Math.floor(date / k) * k); |
|
}, function(date, step) { |
|
date.setTime(+date + step * k); |
|
}, function(start, end) { |
|
return (end - start) / k; |
|
}); |
|
}; |
|
|
|
var milliseconds = millisecond.range; |
|
|
|
var durationSecond = 1e3; |
|
var durationMinute = 6e4; |
|
var durationHour = 36e5; |
|
var durationDay = 864e5; |
|
var durationWeek = 6048e5; |
|
|
|
var second = newInterval(function(date) { |
|
date.setTime(Math.floor(date / durationSecond) * durationSecond); |
|
}, function(date, step) { |
|
date.setTime(+date + step * durationSecond); |
|
}, function(start, end) { |
|
return (end - start) / durationSecond; |
|
}, function(date) { |
|
return date.getUTCSeconds(); |
|
}); |
|
|
|
var seconds = second.range; |
|
|
|
var minute = newInterval(function(date) { |
|
date.setTime(Math.floor(date / durationMinute) * durationMinute); |
|
}, function(date, step) { |
|
date.setTime(+date + step * durationMinute); |
|
}, function(start, end) { |
|
return (end - start) / durationMinute; |
|
}, function(date) { |
|
return date.getMinutes(); |
|
}); |
|
|
|
var minutes = minute.range; |
|
|
|
var hour = newInterval(function(date) { |
|
var offset = date.getTimezoneOffset() * durationMinute % durationHour; |
|
if (offset < 0) offset += durationHour; |
|
date.setTime(Math.floor((+date - offset) / durationHour) * durationHour + offset); |
|
}, function(date, step) { |
|
date.setTime(+date + step * durationHour); |
|
}, function(start, end) { |
|
return (end - start) / durationHour; |
|
}, function(date) { |
|
return date.getHours(); |
|
}); |
|
|
|
var hours = hour.range; |
|
|
|
var day = newInterval(function(date) { |
|
date.setHours(0, 0, 0, 0); |
|
}, function(date, step) { |
|
date.setDate(date.getDate() + step); |
|
}, function(start, end) { |
|
return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay; |
|
}, function(date) { |
|
return date.getDate() - 1; |
|
}); |
|
|
|
var days = day.range; |
|
|
|
function weekday(i) { |
|
return newInterval(function(date) { |
|
date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7); |
|
date.setHours(0, 0, 0, 0); |
|
}, function(date, step) { |
|
date.setDate(date.getDate() + step * 7); |
|
}, function(start, end) { |
|
return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek; |
|
}); |
|
} |
|
|
|
var sunday = weekday(0); |
|
var monday = weekday(1); |
|
var tuesday = weekday(2); |
|
var wednesday = weekday(3); |
|
var thursday = weekday(4); |
|
var friday = weekday(5); |
|
var saturday = weekday(6); |
|
|
|
var sundays = sunday.range; |
|
var mondays = monday.range; |
|
var tuesdays = tuesday.range; |
|
var wednesdays = wednesday.range; |
|
var thursdays = thursday.range; |
|
var fridays = friday.range; |
|
var saturdays = saturday.range; |
|
|
|
var month = newInterval(function(date) { |
|
date.setDate(1); |
|
date.setHours(0, 0, 0, 0); |
|
}, function(date, step) { |
|
date.setMonth(date.getMonth() + step); |
|
}, function(start, end) { |
|
return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12; |
|
}, function(date) { |
|
return date.getMonth(); |
|
}); |
|
|
|
var months = month.range; |
|
|
|
var year = newInterval(function(date) { |
|
date.setMonth(0, 1); |
|
date.setHours(0, 0, 0, 0); |
|
}, function(date, step) { |
|
date.setFullYear(date.getFullYear() + step); |
|
}, function(start, end) { |
|
return end.getFullYear() - start.getFullYear(); |
|
}, function(date) { |
|
return date.getFullYear(); |
|
}); |
|
|
|
// An optimized implementation for this simple case. |
|
year.every = function(k) { |
|
return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) { |
|
date.setFullYear(Math.floor(date.getFullYear() / k) * k); |
|
date.setMonth(0, 1); |
|
date.setHours(0, 0, 0, 0); |
|
}, function(date, step) { |
|
date.setFullYear(date.getFullYear() + step * k); |
|
}); |
|
}; |
|
|
|
var years = year.range; |
|
|
|
var utcMinute = newInterval(function(date) { |
|
date.setUTCSeconds(0, 0); |
|
}, function(date, step) { |
|
date.setTime(+date + step * durationMinute); |
|
}, function(start, end) { |
|
return (end - start) / durationMinute; |
|
}, function(date) { |
|
return date.getUTCMinutes(); |
|
}); |
|
|
|
var utcMinutes = utcMinute.range; |
|
|
|
var utcHour = newInterval(function(date) { |
|
date.setUTCMinutes(0, 0, 0); |
|
}, function(date, step) { |
|
date.setTime(+date + step * durationHour); |
|
}, function(start, end) { |
|
return (end - start) / durationHour; |
|
}, function(date) { |
|
return date.getUTCHours(); |
|
}); |
|
|
|
var utcHours = utcHour.range; |
|
|
|
var utcDay = newInterval(function(date) { |
|
date.setUTCHours(0, 0, 0, 0); |
|
}, function(date, step) { |
|
date.setUTCDate(date.getUTCDate() + step); |
|
}, function(start, end) { |
|
return (end - start) / durationDay; |
|
}, function(date) { |
|
return date.getUTCDate() - 1; |
|
}); |
|
|
|
var utcDays = utcDay.range; |
|
|
|
function utcWeekday(i) { |
|
return newInterval(function(date) { |
|
date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7); |
|
date.setUTCHours(0, 0, 0, 0); |
|
}, function(date, step) { |
|
date.setUTCDate(date.getUTCDate() + step * 7); |
|
}, function(start, end) { |
|
return (end - start) / durationWeek; |
|
}); |
|
} |
|
|
|
var utcSunday = utcWeekday(0); |
|
var utcMonday = utcWeekday(1); |
|
var utcTuesday = utcWeekday(2); |
|
var utcWednesday = utcWeekday(3); |
|
var utcThursday = utcWeekday(4); |
|
var utcFriday = utcWeekday(5); |
|
var utcSaturday = utcWeekday(6); |
|
|
|
var utcSundays = utcSunday.range; |
|
var utcMondays = utcMonday.range; |
|
var utcTuesdays = utcTuesday.range; |
|
var utcWednesdays = utcWednesday.range; |
|
var utcThursdays = utcThursday.range; |
|
var utcFridays = utcFriday.range; |
|
var utcSaturdays = utcSaturday.range; |
|
|
|
var utcMonth = newInterval(function(date) { |
|
date.setUTCDate(1); |
|
date.setUTCHours(0, 0, 0, 0); |
|
}, function(date, step) { |
|
date.setUTCMonth(date.getUTCMonth() + step); |
|
}, function(start, end) { |
|
return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12; |
|
}, function(date) { |
|
return date.getUTCMonth(); |
|
}); |
|
|
|
var utcMonths = utcMonth.range; |
|
|
|
var utcYear = newInterval(function(date) { |
|
date.setUTCMonth(0, 1); |
|
date.setUTCHours(0, 0, 0, 0); |
|
}, function(date, step) { |
|
date.setUTCFullYear(date.getUTCFullYear() + step); |
|
}, function(start, end) { |
|
return end.getUTCFullYear() - start.getUTCFullYear(); |
|
}, function(date) { |
|
return date.getUTCFullYear(); |
|
}); |
|
|
|
// An optimized implementation for this simple case. |
|
utcYear.every = function(k) { |
|
return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) { |
|
date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k); |
|
date.setUTCMonth(0, 1); |
|
date.setUTCHours(0, 0, 0, 0); |
|
}, function(date, step) { |
|
date.setUTCFullYear(date.getUTCFullYear() + step * k); |
|
}); |
|
}; |
|
|
|
var utcYears = utcYear.range; |
|
|
|
exports.timeInterval = newInterval; |
|
exports.timeMillisecond = millisecond; |
|
exports.timeMilliseconds = milliseconds; |
|
exports.utcMillisecond = millisecond; |
|
exports.utcMilliseconds = milliseconds; |
|
exports.timeSecond = second; |
|
exports.timeSeconds = seconds; |
|
exports.utcSecond = second; |
|
exports.utcSeconds = seconds; |
|
exports.timeMinute = minute; |
|
exports.timeMinutes = minutes; |
|
exports.timeHour = hour; |
|
exports.timeHours = hours; |
|
exports.timeDay = day; |
|
exports.timeDays = days; |
|
exports.timeWeek = sunday; |
|
exports.timeWeeks = sundays; |
|
exports.timeSunday = sunday; |
|
exports.timeSundays = sundays; |
|
exports.timeMonday = monday; |
|
exports.timeMondays = mondays; |
|
exports.timeTuesday = tuesday; |
|
exports.timeTuesdays = tuesdays; |
|
exports.timeWednesday = wednesday; |
|
exports.timeWednesdays = wednesdays; |
|
exports.timeThursday = thursday; |
|
exports.timeThursdays = thursdays; |
|
exports.timeFriday = friday; |
|
exports.timeFridays = fridays; |
|
exports.timeSaturday = saturday; |
|
exports.timeSaturdays = saturdays; |
|
exports.timeMonth = month; |
|
exports.timeMonths = months; |
|
exports.timeYear = year; |
|
exports.timeYears = years; |
|
exports.utcMinute = utcMinute; |
|
exports.utcMinutes = utcMinutes; |
|
exports.utcHour = utcHour; |
|
exports.utcHours = utcHours; |
|
exports.utcDay = utcDay; |
|
exports.utcDays = utcDays; |
|
exports.utcWeek = utcSunday; |
|
exports.utcWeeks = utcSundays; |
|
exports.utcSunday = utcSunday; |
|
exports.utcSundays = utcSundays; |
|
exports.utcMonday = utcMonday; |
|
exports.utcMondays = utcMondays; |
|
exports.utcTuesday = utcTuesday; |
|
exports.utcTuesdays = utcTuesdays; |
|
exports.utcWednesday = utcWednesday; |
|
exports.utcWednesdays = utcWednesdays; |
|
exports.utcThursday = utcThursday; |
|
exports.utcThursdays = utcThursdays; |
|
exports.utcFriday = utcFriday; |
|
exports.utcFridays = utcFridays; |
|
exports.utcSaturday = utcSaturday; |
|
exports.utcSaturdays = utcSaturdays; |
|
exports.utcMonth = utcMonth; |
|
exports.utcMonths = utcMonths; |
|
exports.utcYear = utcYear; |
|
exports.utcYears = utcYears; |
|
|
|
Object.defineProperty(exports, '__esModule', { value: true }); |
|
|
|
}))); |
|
|
|
},{}],20:[function(require,module,exports){ |
|
// https://d3js.org/d3-timer/ Version 1.0.6. Copyright 2017 Mike Bostock. |
|
(function (global, factory) { |
|
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : |
|
typeof define === 'function' && define.amd ? define(['exports'], factory) : |
|
(factory((global.d3 = global.d3 || {}))); |
|
}(this, (function (exports) { 'use strict'; |
|
|
|
var frame = 0; |
|
var timeout = 0; |
|
var interval = 0; |
|
var pokeDelay = 1000; |
|
var taskHead; |
|
var taskTail; |
|
var clockLast = 0; |
|
var clockNow = 0; |
|
var clockSkew = 0; |
|
var clock = typeof performance === "object" && performance.now ? performance : Date; |
|
var setFrame = typeof window === "object" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); }; |
|
|
|
function now() { |
|
return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew); |
|
} |
|
|
|
function clearNow() { |
|
clockNow = 0; |
|
} |
|
|
|
function Timer() { |
|
this._call = |
|
this._time = |
|
this._next = null; |
|
} |
|
|
|
Timer.prototype = timer.prototype = { |
|
constructor: Timer, |
|
restart: function(callback, delay, time) { |
|
if (typeof callback !== "function") throw new TypeError("callback is not a function"); |
|
time = (time == null ? now() : +time) + (delay == null ? 0 : +delay); |
|
if (!this._next && taskTail !== this) { |
|
if (taskTail) taskTail._next = this; |
|
else taskHead = this; |
|
taskTail = this; |
|
} |
|
this._call = callback; |
|
this._time = time; |
|
sleep(); |
|
}, |
|
stop: function() { |
|
if (this._call) { |
|
this._call = null; |
|
this._time = Infinity; |
|
sleep(); |
|
} |
|
} |
|
}; |
|
|
|
function timer(callback, delay, time) { |
|
var t = new Timer; |
|
t.restart(callback, delay, time); |
|
return t; |
|
} |
|
|
|
function timerFlush() { |
|
now(); // Get the current time, if not already set. |
|
++frame; // Pretend we’ve set an alarm, if we haven’t already. |
|
var t = taskHead, e; |
|
while (t) { |
|
if ((e = clockNow - t._time) >= 0) t._call.call(null, e); |
|
t = t._next; |
|
} |
|
--frame; |
|
} |
|
|
|
function wake() { |
|
clockNow = (clockLast = clock.now()) + clockSkew; |
|
frame = timeout = 0; |
|
try { |
|
timerFlush(); |
|
} finally { |
|
frame = 0; |
|
nap(); |
|
clockNow = 0; |
|
} |
|
} |
|
|
|
function poke() { |
|
var now = clock.now(), delay = now - clockLast; |
|
if (delay > pokeDelay) clockSkew -= delay, clockLast = now; |
|
} |
|
|
|
function nap() { |
|
var t0, t1 = taskHead, t2, time = Infinity; |
|
while (t1) { |
|
if (t1._call) { |
|
if (time > t1._time) time = t1._time; |
|
t0 = t1, t1 = t1._next; |
|
} else { |
|
t2 = t1._next, t1._next = null; |
|
t1 = t0 ? t0._next = t2 : taskHead = t2; |
|
} |
|
} |
|
taskTail = t0; |
|
sleep(time); |
|
} |
|
|
|
function sleep(time) { |
|
if (frame) return; // Soonest alarm already set, or will be. |
|
if (timeout) timeout = clearTimeout(timeout); |
|
var delay = time - clockNow; |
|
if (delay > 24) { |
|
if (time < Infinity) timeout = setTimeout(wake, delay); |
|
if (interval) interval = clearInterval(interval); |
|
} else { |
|
if (!interval) clockLast = clockNow, interval = setInterval(poke, pokeDelay); |
|
frame = 1, setFrame(wake); |
|
} |
|
} |
|
|
|
var timeout$1 = function(callback, delay, time) { |
|
var t = new Timer; |
|
delay = delay == null ? 0 : +delay; |
|
t.restart(function(elapsed) { |
|
t.stop(); |
|
callback(elapsed + delay); |
|
}, delay, time); |
|
return t; |
|
}; |
|
|
|
var interval$1 = function(callback, delay, time) { |
|
var t = new Timer, total = delay; |
|
if (delay == null) return t.restart(callback, delay, time), t; |
|
delay = +delay, time = time == null ? now() : +time; |
|
t.restart(function tick(elapsed) { |
|
elapsed += total; |
|
t.restart(tick, total += delay, time); |
|
callback(elapsed); |
|
}, delay, time); |
|
return t; |
|
}; |
|
|
|
exports.now = now; |
|
exports.timer = timer; |
|
exports.timerFlush = timerFlush; |
|
exports.timeout = timeout$1; |
|
exports.interval = interval$1; |
|
|
|
Object.defineProperty(exports, '__esModule', { value: true }); |
|
|
|
}))); |
|
|
|
},{}],21:[function(require,module,exports){ |
|
// https://d3js.org/d3-transition/ Version 1.1.0. Copyright 2017 Mike Bostock. |
|
(function (global, factory) { |
|
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-selection'), require('d3-dispatch'), require('d3-timer'), require('d3-interpolate'), require('d3-color'), require('d3-ease')) : |
|
typeof define === 'function' && define.amd ? define(['exports', 'd3-selection', 'd3-dispatch', 'd3-timer', 'd3-interpolate', 'd3-color', 'd3-ease'], factory) : |
|
(factory((global.d3 = global.d3 || {}),global.d3,global.d3,global.d3,global.d3,global.d3,global.d3)); |
|
}(this, (function (exports,d3Selection,d3Dispatch,d3Timer,d3Interpolate,d3Color,d3Ease) { 'use strict'; |
|
|
|
var emptyOn = d3Dispatch.dispatch("start", "end", "interrupt"); |
|
var emptyTween = []; |
|
|
|
var CREATED = 0; |
|
var SCHEDULED = 1; |
|
var STARTING = 2; |
|
var STARTED = 3; |
|
var RUNNING = 4; |
|
var ENDING = 5; |
|
var ENDED = 6; |
|
|
|
var schedule = function(node, name, id, index, group, timing) { |
|
var schedules = node.__transition; |
|
if (!schedules) node.__transition = {}; |
|
else if (id in schedules) return; |
|
create(node, id, { |
|
name: name, |
|
index: index, // For context during callback. |
|
group: group, // For context during callback. |
|
on: emptyOn, |
|
tween: emptyTween, |
|
time: timing.time, |
|
delay: timing.delay, |
|
duration: timing.duration, |
|
ease: timing.ease, |
|
timer: null, |
|
state: CREATED |
|
}); |
|
}; |
|
|
|
function init(node, id) { |
|
var schedule = node.__transition; |
|
if (!schedule || !(schedule = schedule[id]) || schedule.state > CREATED) throw new Error("too late"); |
|
return schedule; |
|
} |
|
|
|
function set(node, id) { |
|
var schedule = node.__transition; |
|
if (!schedule || !(schedule = schedule[id]) || schedule.state > STARTING) throw new Error("too late"); |
|
return schedule; |
|
} |
|
|
|
function get(node, id) { |
|
var schedule = node.__transition; |
|
if (!schedule || !(schedule = schedule[id])) throw new Error("too late"); |
|
return schedule; |
|
} |
|
|
|
function create(node, id, self) { |
|
var schedules = node.__transition, |
|
tween; |
|
|
|
// Initialize the self timer when the transition is created. |
|
// Note the actual delay is not known until the first callback! |
|
schedules[id] = self; |
|
self.timer = d3Timer.timer(schedule, 0, self.time); |
|
|
|
function schedule(elapsed) { |
|
self.state = SCHEDULED; |
|
self.timer.restart(start, self.delay, self.time); |
|
|
|
// If the elapsed delay is less than our first sleep, start immediately. |
|
if (self.delay <= elapsed) start(elapsed - self.delay); |
|
} |
|
|
|
function start(elapsed) { |
|
var i, j, n, o; |
|
|
|
// If the state is not SCHEDULED, then we previously errored on start. |
|
if (self.state !== SCHEDULED) return stop(); |
|
|
|
for (i in schedules) { |
|
o = schedules[i]; |
|
if (o.name !== self.name) continue; |
|
|
|
// While this element already has a starting transition during this frame, |
|
// defer starting an interrupting transition until that transition has a |
|
// chance to tick (and possibly end); see d3/d3-transition#54! |
|
if (o.state === STARTED) return d3Timer.timeout(start); |
|
|
|
// Interrupt the active transition, if any. |
|
// Dispatch the interrupt event. |
|
if (o.state === RUNNING) { |
|
o.state = ENDED; |
|
o.timer.stop(); |
|
o.on.call("interrupt", node, node.__data__, o.index, o.group); |
|
delete schedules[i]; |
|
} |
|
|
|
// Cancel any pre-empted transitions. No interrupt event is dispatched |
|
// because the cancelled transitions never started. Note that this also |
|
// removes this transition from the pending list! |
|
else if (+i < id) { |
|
o.state = ENDED; |
|
o.timer.stop(); |
|
delete schedules[i]; |
|
} |
|
} |
|
|
|
// Defer the first tick to end of the current frame; see d3/d3#1576. |
|
// Note the transition may be canceled after start and before the first tick! |
|
// Note this must be scheduled before the start event; see d3/d3-transition#16! |
|
// Assuming this is successful, subsequent callbacks go straight to tick. |
|
d3Timer.timeout(function() { |
|
if (self.state === STARTED) { |
|
self.state = RUNNING; |
|
self.timer.restart(tick, self.delay, self.time); |
|
tick(elapsed); |
|
} |
|
}); |
|
|
|
// Dispatch the start event. |
|
// Note this must be done before the tween are initialized. |
|
self.state = STARTING; |
|
self.on.call("start", node, node.__data__, self.index, self.group); |
|
if (self.state !== STARTING) return; // interrupted |
|
self.state = STARTED; |
|
|
|
// Initialize the tween, deleting null tween. |
|
tween = new Array(n = self.tween.length); |
|
for (i = 0, j = -1; i < n; ++i) { |
|
if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) { |
|
tween[++j] = o; |
|
} |
|
} |
|
tween.length = j + 1; |
|
} |
|
|
|
function tick(elapsed) { |
|
var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1), |
|
i = -1, |
|
n = tween.length; |
|
|
|
while (++i < n) { |
|
tween[i].call(null, t); |
|
} |
|
|
|
// Dispatch the end event. |
|
if (self.state === ENDING) { |
|
self.on.call("end", node, node.__data__, self.index, self.group); |
|
stop(); |
|
} |
|
} |
|
|
|
function stop() { |
|
self.state = ENDED; |
|
self.timer.stop(); |
|
delete schedules[id]; |
|
for (var i in schedules) return; // eslint-disable-line no-unused-vars |
|
delete node.__transition; |
|
} |
|
} |
|
|
|
var interrupt = function(node, name) { |
|
var schedules = node.__transition, |
|
schedule, |
|
active, |
|
empty = true, |
|
i; |
|
|
|
if (!schedules) return; |
|
|
|
name = name == null ? null : name + ""; |
|
|
|
for (i in schedules) { |
|
if ((schedule = schedules[i]).name !== name) { empty = false; continue; } |
|
active = schedule.state > STARTING && schedule.state < ENDING; |
|
schedule.state = ENDED; |
|
schedule.timer.stop(); |
|
if (active) schedule.on.call("interrupt", node, node.__data__, schedule.index, schedule.group); |
|
delete schedules[i]; |
|
} |
|
|
|
if (empty) delete node.__transition; |
|
}; |
|
|
|
var selection_interrupt = function(name) { |
|
return this.each(function() { |
|
interrupt(this, name); |
|
}); |
|
}; |
|
|
|
function tweenRemove(id, name) { |
|
var tween0, tween1; |
|
return function() { |
|
var schedule = set(this, id), |
|
tween = schedule.tween; |
|
|
|
// If this node shared tween with the previous node, |
|
// just assign the updated shared tween and we’re done! |
|
// Otherwise, copy-on-write. |
|
if (tween !== tween0) { |
|
tween1 = tween0 = tween; |
|
for (var i = 0, n = tween1.length; i < n; ++i) { |
|
if (tween1[i].name === name) { |
|
tween1 = tween1.slice(); |
|
tween1.splice(i, 1); |
|
break; |
|
} |
|
} |
|
} |
|
|
|
schedule.tween = tween1; |
|
}; |
|
} |
|
|
|
function tweenFunction(id, name, value) { |
|
var tween0, tween1; |
|
if (typeof value !== "function") throw new Error; |
|
return function() { |
|
var schedule = set(this, id), |
|
tween = schedule.tween; |
|
|
|
// If this node shared tween with the previous node, |
|
// just assign the updated shared tween and we’re done! |
|
// Otherwise, copy-on-write. |
|
if (tween !== tween0) { |
|
tween1 = (tween0 = tween).slice(); |
|
for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) { |
|
if (tween1[i].name === name) { |
|
tween1[i] = t; |
|
break; |
|
} |
|
} |
|
if (i === n) tween1.push(t); |
|
} |
|
|
|
schedule.tween = tween1; |
|
}; |
|
} |
|
|
|
var transition_tween = function(name, value) { |
|
var id = this._id; |
|
|
|
name += ""; |
|
|
|
if (arguments.length < 2) { |
|
var tween = get(this.node(), id).tween; |
|
for (var i = 0, n = tween.length, t; i < n; ++i) { |
|
if ((t = tween[i]).name === name) { |
|
return t.value; |
|
} |
|
} |
|
return null; |
|
} |
|
|
|
return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value)); |
|
}; |
|
|
|
function tweenValue(transition, name, value) { |
|
var id = transition._id; |
|
|
|
transition.each(function() { |
|
var schedule = set(this, id); |
|
(schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments); |
|
}); |
|
|
|
return function(node) { |
|
return get(node, id).value[name]; |
|
}; |
|
} |
|
|
|
var interpolate = function(a, b) { |
|
var c; |
|
return (typeof b === "number" ? d3Interpolate.interpolateNumber |
|
: b instanceof d3Color.color ? d3Interpolate.interpolateRgb |
|
: (c = d3Color.color(b)) ? (b = c, d3Interpolate.interpolateRgb) |
|
: d3Interpolate.interpolateString)(a, b); |
|
}; |
|
|
|
function attrRemove(name) { |
|
return function() { |
|
this.removeAttribute(name); |
|
}; |
|
} |
|
|
|
function attrRemoveNS(fullname) { |
|
return function() { |
|
this.removeAttributeNS(fullname.space, fullname.local); |
|
}; |
|
} |
|
|
|
function attrConstant(name, interpolate$$1, value1) { |
|
var value00, |
|
interpolate0; |
|
return function() { |
|
var value0 = this.getAttribute(name); |
|
return value0 === value1 ? null |
|
: value0 === value00 ? interpolate0 |
|
: interpolate0 = interpolate$$1(value00 = value0, value1); |
|
}; |
|
} |
|
|
|
function attrConstantNS(fullname, interpolate$$1, value1) { |
|
var value00, |
|
interpolate0; |
|
return function() { |
|
var value0 = this.getAttributeNS(fullname.space, fullname.local); |
|
return value0 === value1 ? null |
|
: value0 === value00 ? interpolate0 |
|
: interpolate0 = interpolate$$1(value00 = value0, value1); |
|
}; |
|
} |
|
|
|
function attrFunction(name, interpolate$$1, value) { |
|
var value00, |
|
value10, |
|
interpolate0; |
|
return function() { |
|
var value0, value1 = value(this); |
|
if (value1 == null) return void this.removeAttribute(name); |
|
value0 = this.getAttribute(name); |
|
return value0 === value1 ? null |
|
: value0 === value00 && value1 === value10 ? interpolate0 |
|
: interpolate0 = interpolate$$1(value00 = value0, value10 = value1); |
|
}; |
|
} |
|
|
|
function attrFunctionNS(fullname, interpolate$$1, value) { |
|
var value00, |
|
value10, |
|
interpolate0; |
|
return function() { |
|
var value0, value1 = value(this); |
|
if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local); |
|
value0 = this.getAttributeNS(fullname.space, fullname.local); |
|
return value0 === value1 ? null |
|
: value0 === value00 && value1 === value10 ? interpolate0 |
|
: interpolate0 = interpolate$$1(value00 = value0, value10 = value1); |
|
}; |
|
} |
|
|
|
var transition_attr = function(name, value) { |
|
var fullname = d3Selection.namespace(name), i = fullname === "transform" ? d3Interpolate.interpolateTransformSvg : interpolate; |
|
return this.attrTween(name, typeof value === "function" |
|
? (fullname.local ? attrFunctionNS : attrFunction)(fullname, i, tweenValue(this, "attr." + name, value)) |
|
: value == null ? (fullname.local ? attrRemoveNS : attrRemove)(fullname) |
|
: (fullname.local ? attrConstantNS : attrConstant)(fullname, i, value + "")); |
|
}; |
|
|
|
function attrTweenNS(fullname, value) { |
|
function tween() { |
|
var node = this, i = value.apply(node, arguments); |
|
return i && function(t) { |
|
node.setAttributeNS(fullname.space, fullname.local, i(t)); |
|
}; |
|
} |
|
tween._value = value; |
|
return tween; |
|
} |
|
|
|
function attrTween(name, value) { |
|
function tween() { |
|
var node = this, i = value.apply(node, arguments); |
|
return i && function(t) { |
|
node.setAttribute(name, i(t)); |
|
}; |
|
} |
|
tween._value = value; |
|
return tween; |
|
} |
|
|
|
var transition_attrTween = function(name, value) { |
|
var key = "attr." + name; |
|
if (arguments.length < 2) return (key = this.tween(key)) && key._value; |
|
if (value == null) return this.tween(key, null); |
|
if (typeof value !== "function") throw new Error; |
|
var fullname = d3Selection.namespace(name); |
|
return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value)); |
|
}; |
|
|
|
function delayFunction(id, value) { |
|
return function() { |
|
init(this, id).delay = +value.apply(this, arguments); |
|
}; |
|
} |
|
|
|
function delayConstant(id, value) { |
|
return value = +value, function() { |
|
init(this, id).delay = value; |
|
}; |
|
} |
|
|
|
var transition_delay = function(value) { |
|
var id = this._id; |
|
|
|
return arguments.length |
|
? this.each((typeof value === "function" |
|
? delayFunction |
|
: delayConstant)(id, value)) |
|
: get(this.node(), id).delay; |
|
}; |
|
|
|
function durationFunction(id, value) { |
|
return function() { |
|
set(this, id).duration = +value.apply(this, arguments); |
|
}; |
|
} |
|
|
|
function durationConstant(id, value) { |
|
return value = +value, function() { |
|
set(this, id).duration = value; |
|
}; |
|
} |
|
|
|
var transition_duration = function(value) { |
|
var id = this._id; |
|
|
|
return arguments.length |
|
? this.each((typeof value === "function" |
|
? durationFunction |
|
: durationConstant)(id, value)) |
|
: get(this.node(), id).duration; |
|
}; |
|
|
|
function easeConstant(id, value) { |
|
if (typeof value !== "function") throw new Error; |
|
return function() { |
|
set(this, id).ease = value; |
|
}; |
|
} |
|
|
|
var transition_ease = function(value) { |
|
var id = this._id; |
|
|
|
return arguments.length |
|
? this.each(easeConstant(id, value)) |
|
: get(this.node(), id).ease; |
|
}; |
|
|
|
var transition_filter = function(match) { |
|
if (typeof match !== "function") match = d3Selection.matcher(match); |
|
|
|
for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { |
|
for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) { |
|
if ((node = group[i]) && match.call(node, node.__data__, i, group)) { |
|
subgroup.push(node); |
|
} |
|
} |
|
} |
|
|
|
return new Transition(subgroups, this._parents, this._name, this._id); |
|
}; |
|
|
|
var transition_merge = function(transition) { |
|
if (transition._id !== this._id) throw new Error; |
|
|
|
for (var groups0 = this._groups, groups1 = transition._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) { |
|
for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) { |
|
if (node = group0[i] || group1[i]) { |
|
merge[i] = node; |
|
} |
|
} |
|
} |
|
|
|
for (; j < m0; ++j) { |
|
merges[j] = groups0[j]; |
|
} |
|
|
|
return new Transition(merges, this._parents, this._name, this._id); |
|
}; |
|
|
|
function start(name) { |
|
return (name + "").trim().split(/^|\s+/).every(function(t) { |
|
var i = t.indexOf("."); |
|
if (i >= 0) t = t.slice(0, i); |
|
return !t || t === "start"; |
|
}); |
|
} |
|
|
|
function onFunction(id, name, listener) { |
|
var on0, on1, sit = start(name) ? init : set; |
|
return function() { |
|
var schedule = sit(this, id), |
|
on = schedule.on; |
|
|
|
// If this node shared a dispatch with the previous node, |
|
// just assign the updated shared dispatch and we’re done! |
|
// Otherwise, copy-on-write. |
|
if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener); |
|
|
|
schedule.on = on1; |
|
}; |
|
} |
|
|
|
var transition_on = function(name, listener) { |
|
var id = this._id; |
|
|
|
return arguments.length < 2 |
|
? get(this.node(), id).on.on(name) |
|
: this.each(onFunction(id, name, listener)); |
|
}; |
|
|
|
function removeFunction(id) { |
|
return function() { |
|
var parent = this.parentNode; |
|
for (var i in this.__transition) if (+i !== id) return; |
|
if (parent) parent.removeChild(this); |
|
}; |
|
} |
|
|
|
var transition_remove = function() { |
|
return this.on("end.remove", removeFunction(this._id)); |
|
}; |
|
|
|
var transition_select = function(select) { |
|
var name = this._name, |
|
id = this._id; |
|
|
|
if (typeof select !== "function") select = d3Selection.selector(select); |
|
|
|
for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { |
|
for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) { |
|
if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) { |
|
if ("__data__" in node) subnode.__data__ = node.__data__; |
|
subgroup[i] = subnode; |
|
schedule(subgroup[i], name, id, i, subgroup, get(node, id)); |
|
} |
|
} |
|
} |
|
|
|
return new Transition(subgroups, this._parents, name, id); |
|
}; |
|
|
|
var transition_selectAll = function(select) { |
|
var name = this._name, |
|
id = this._id; |
|
|
|
if (typeof select !== "function") select = d3Selection.selectorAll(select); |
|
|
|
for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) { |
|
for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { |
|
if (node = group[i]) { |
|
for (var children = select.call(node, node.__data__, i, group), child, inherit = get(node, id), k = 0, l = children.length; k < l; ++k) { |
|
if (child = children[k]) { |
|
schedule(child, name, id, k, children, inherit); |
|
} |
|
} |
|
subgroups.push(children); |
|
parents.push(node); |
|
} |
|
} |
|
} |
|
|
|
return new Transition(subgroups, parents, name, id); |
|
}; |
|
|
|
var Selection = d3Selection.selection.prototype.constructor; |
|
|
|
var transition_selection = function() { |
|
return new Selection(this._groups, this._parents); |
|
}; |
|
|
|
function styleRemove(name, interpolate$$1) { |
|
var value00, |
|
value10, |
|
interpolate0; |
|
return function() { |
|
var value0 = d3Selection.style(this, name), |
|
value1 = (this.style.removeProperty(name), d3Selection.style(this, name)); |
|
return value0 === value1 ? null |
|
: value0 === value00 && value1 === value10 ? interpolate0 |
|
: interpolate0 = interpolate$$1(value00 = value0, value10 = value1); |
|
}; |
|
} |
|
|
|
function styleRemoveEnd(name) { |
|
return function() { |
|
this.style.removeProperty(name); |
|
}; |
|
} |
|
|
|
function styleConstant(name, interpolate$$1, value1) { |
|
var value00, |
|
interpolate0; |
|
return function() { |
|
var value0 = d3Selection.style(this, name); |
|
return value0 === value1 ? null |
|
: value0 === value00 ? interpolate0 |
|
: interpolate0 = interpolate$$1(value00 = value0, value1); |
|
}; |
|
} |
|
|
|
function styleFunction(name, interpolate$$1, value) { |
|
var value00, |
|
value10, |
|
interpolate0; |
|
return function() { |
|
var value0 = d3Selection.style(this, name), |
|
value1 = value(this); |
|
if (value1 == null) value1 = (this.style.removeProperty(name), d3Selection.style(this, name)); |
|
return value0 === value1 ? null |
|
: value0 === value00 && value1 === value10 ? interpolate0 |
|
: interpolate0 = interpolate$$1(value00 = value0, value10 = value1); |
|
}; |
|
} |
|
|
|
var transition_style = function(name, value, priority) { |
|
var i = (name += "") === "transform" ? d3Interpolate.interpolateTransformCss : interpolate; |
|
return value == null ? this |
|
.styleTween(name, styleRemove(name, i)) |
|
.on("end.style." + name, styleRemoveEnd(name)) |
|
: this.styleTween(name, typeof value === "function" |
|
? styleFunction(name, i, tweenValue(this, "style." + name, value)) |
|
: styleConstant(name, i, value + ""), priority); |
|
}; |
|
|
|
function styleTween(name, value, priority) { |
|
function tween() { |
|
var node = this, i = value.apply(node, arguments); |
|
return i && function(t) { |
|
node.style.setProperty(name, i(t), priority); |
|
}; |
|
} |
|
tween._value = value; |
|
return tween; |
|
} |
|
|
|
var transition_styleTween = function(name, value, priority) { |
|
var key = "style." + (name += ""); |
|
if (arguments.length < 2) return (key = this.tween(key)) && key._value; |
|
if (value == null) return this.tween(key, null); |
|
if (typeof value !== "function") throw new Error; |
|
return this.tween(key, styleTween(name, value, priority == null ? "" : priority)); |
|
}; |
|
|
|
function textConstant(value) { |
|
return function() { |
|
this.textContent = value; |
|
}; |
|
} |
|
|
|
function textFunction(value) { |
|
return function() { |
|
var value1 = value(this); |
|
this.textContent = value1 == null ? "" : value1; |
|
}; |
|
} |
|
|
|
var transition_text = function(value) { |
|
return this.tween("text", typeof value === "function" |
|
? textFunction(tweenValue(this, "text", value)) |
|
: textConstant(value == null ? "" : value + "")); |
|
}; |
|
|
|
var transition_transition = function() { |
|
var name = this._name, |
|
id0 = this._id, |
|
id1 = newId(); |
|
|
|
for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) { |
|
for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { |
|
if (node = group[i]) { |
|
var inherit = get(node, id0); |
|
schedule(node, name, id1, i, group, { |
|
time: inherit.time + inherit.delay + inherit.duration, |
|
delay: 0, |
|
duration: inherit.duration, |
|
ease: inherit.ease |
|
}); |
|
} |
|
} |
|
} |
|
|
|
return new Transition(groups, this._parents, name, id1); |
|
}; |
|
|
|
var id = 0; |
|
|
|
function Transition(groups, parents, name, id) { |
|
this._groups = groups; |
|
this._parents = parents; |
|
this._name = name; |
|
this._id = id; |
|
} |
|
|
|
function transition(name) { |
|
return d3Selection.selection().transition(name); |
|
} |
|
|
|
function newId() { |
|
return ++id; |
|
} |
|
|
|
var selection_prototype = d3Selection.selection.prototype; |
|
|
|
Transition.prototype = transition.prototype = { |
|
constructor: Transition, |
|
select: transition_select, |
|
selectAll: transition_selectAll, |
|
filter: transition_filter, |
|
merge: transition_merge, |
|
selection: transition_selection, |
|
transition: transition_transition, |
|
call: selection_prototype.call, |
|
nodes: selection_prototype.nodes, |
|
node: selection_prototype.node, |
|
size: selection_prototype.size, |
|
empty: selection_prototype.empty, |
|
each: selection_prototype.each, |
|
on: transition_on, |
|
attr: transition_attr, |
|
attrTween: transition_attrTween, |
|
style: transition_style, |
|
styleTween: transition_styleTween, |
|
text: transition_text, |
|
remove: transition_remove, |
|
tween: transition_tween, |
|
delay: transition_delay, |
|
duration: transition_duration, |
|
ease: transition_ease |
|
}; |
|
|
|
var defaultTiming = { |
|
time: null, // Set on use. |
|
delay: 0, |
|
duration: 250, |
|
ease: d3Ease.easeCubicInOut |
|
}; |
|
|
|
function inherit(node, id) { |
|
var timing; |
|
while (!(timing = node.__transition) || !(timing = timing[id])) { |
|
if (!(node = node.parentNode)) { |
|
return defaultTiming.time = d3Timer.now(), defaultTiming; |
|
} |
|
} |
|
return timing; |
|
} |
|
|
|
var selection_transition = function(name) { |
|
var id, |
|
timing; |
|
|
|
if (name instanceof Transition) { |
|
id = name._id, name = name._name; |
|
} else { |
|
id = newId(), (timing = defaultTiming).time = d3Timer.now(), name = name == null ? null : name + ""; |
|
} |
|
|
|
for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) { |
|
for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { |
|
if (node = group[i]) { |
|
schedule(node, name, id, i, group, timing || inherit(node, id)); |
|
} |
|
} |
|
} |
|
|
|
return new Transition(groups, this._parents, name, id); |
|
}; |
|
|
|
d3Selection.selection.prototype.interrupt = selection_interrupt; |
|
d3Selection.selection.prototype.transition = selection_transition; |
|
|
|
var root = [null]; |
|
|
|
var active = function(node, name) { |
|
var schedules = node.__transition, |
|
schedule, |
|
i; |
|
|
|
if (schedules) { |
|
name = name == null ? null : name + ""; |
|
for (i in schedules) { |
|
if ((schedule = schedules[i]).state > SCHEDULED && schedule.name === name) { |
|
return new Transition([[node]], root, name, +i); |
|
} |
|
} |
|
} |
|
|
|
return null; |
|
}; |
|
|
|
exports.transition = transition; |
|
exports.active = active; |
|
exports.interrupt = interrupt; |
|
|
|
Object.defineProperty(exports, '__esModule', { value: true }); |
|
|
|
}))); |
|
|
|
},{"d3-color":9,"d3-dispatch":10,"d3-ease":12,"d3-interpolate":14,"d3-selection":17,"d3-timer":20}],22:[function(require,module,exports){ |
|
(function (Buffer){ |
|
'use strict'; |
|
|
|
/** |
|
* Constants used in player. |
|
*/ |
|
var Constants = { |
|
VERSION: '1.1.0', |
|
NOTES: [] |
|
}; |
|
|
|
(function () { |
|
// Builds notes object for reference against binary values. |
|
var allNotes = [['C'], ['C#', 'Db'], ['D'], ['D#', 'Eb'], ['E'], ['F'], ['F#', 'Gb'], ['G'], ['G#', 'Ab'], ['A'], ['A#', 'Bb'], ['B']]; |
|
var counter = 0; |
|
|
|
// All available octaves. |
|
|
|
var _loop = function _loop(i) { |
|
allNotes.forEach(function (noteGroup) { |
|
noteGroup.forEach(function (note) { |
|
return Constants.NOTES[counter] = note + i; |
|
}); |
|
counter++; |
|
}); |
|
}; |
|
|
|
for (var i = -1; i <= 9; i++) { |
|
_loop(i); |
|
} |
|
})(); |
|
|
|
exports.Constants = Constants; |
|
|
|
'use strict'; |
|
|
|
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); |
|
|
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } |
|
|
|
/** |
|
* Main player class. Contains methods to load files, start, stop. |
|
* @param {function} - Callback to fire for each MIDI event. Can also be added with on('midiEvent', fn) |
|
* @param {array} - Array buffer of MIDI file (optional). |
|
*/ |
|
var Player = function () { |
|
function Player(eventHandler, buffer) { |
|
_classCallCheck(this, Player); |
|
|
|
this.sampleRate = 5; // milliseconds |
|
this.startTime = 0; |
|
this.buffer = buffer || null; |
|
this.division; |
|
this.format; |
|
this.setIntervalId = null; |
|
this.tracks = []; |
|
this.tempo = 120; |
|
this.startTick = 0; |
|
this.tick = 0; |
|
this.lastTick = null; |
|
this.inLoop = false; |
|
this.totalTicks = 0; |
|
this.events = []; |
|
this.eventListeners = {}; |
|
|
|
if (typeof eventHandler === 'function') this.on('midiEvent', eventHandler); |
|
} |
|
|
|
/** |
|
* Load a file into the player (Node.js only). |
|
* @param {string} path - Path of file. |
|
* @return {Player} |
|
*/ |
|
|
|
|
|
_createClass(Player, [{ |
|
key: 'loadFile', |
|
value: function loadFile(path) { |
|
var fs = require('fs'); |
|
this.buffer = fs.readFileSync(path); |
|
return this.fileLoaded(); |
|
} |
|
|
|
/** |
|
* Load an array buffer into the player. |
|
* @param {array} arrayBuffer - Array buffer of file to be loaded. |
|
* @return {Player} |
|
*/ |
|
|
|
}, { |
|
key: 'loadArrayBuffer', |
|
value: function loadArrayBuffer(arrayBuffer) { |
|
this.buffer = new Uint8Array(arrayBuffer); |
|
return this.fileLoaded(); |
|
} |
|
|
|
/** |
|
* Load a data URI into the player. |
|
* @param {string} dataUri - Data URI to be loaded. |
|
* @return {Player} |
|
*/ |
|
|
|
}, { |
|
key: 'loadDataUri', |
|
value: function loadDataUri(dataUri) { |
|
// convert base64 to raw binary data held in a string. |
|
// doesn't handle URLEncoded DataURIs - see SO answer #6850276 for code that does this |
|
var byteString = Utils.atob(dataUri.split(',')[1]); |
|
|
|
// write the bytes of the string to an ArrayBuffer |
|
var ia = new Uint8Array(byteString.length); |
|
for (var i = 0; i < byteString.length; i++) { |
|
ia[i] = byteString.charCodeAt(i); |
|
} |
|
|
|
this.buffer = ia; |
|
return this.fileLoaded(); |
|
} |
|
|
|
/** |
|
* Get filesize of loaded file in number of bytes. |
|
* @return {number} - The filesize. |
|
*/ |
|
|
|
}, { |
|
key: 'getFilesize', |
|
value: function getFilesize() { |
|
return this.buffer ? this.buffer.length : 0; |
|
} |
|
|
|
/** |
|
* Parses file for necessary information and does a dry run to calculate total length. |
|
* Populates this.events & this.totalTicks. |
|
* @return {Player} |
|
*/ |
|
|
|
}, { |
|
key: 'fileLoaded', |
|
value: function fileLoaded() { |
|
if (!this.validate()) throw 'Invalid MIDI file; should start with MThd'; |
|
return this.getDivision().getFormat().getTracks().dryRun(); |
|
} |
|
|
|
/** |
|
* Validates file using simple means - first four bytes should == MThd. |
|
* @return {boolean} |
|
*/ |
|
|
|
}, { |
|
key: 'validate', |
|
value: function validate() { |
|
return Utils.bytesToLetters(this.buffer.slice(0, 4)) === 'MThd'; |
|
} |
|
|
|
/** |
|
* Gets MIDI file format for loaded file. |
|
* @return {Player} |
|
*/ |
|
|
|
}, { |
|
key: 'getFormat', |
|
value: function getFormat() { |
|
/* |
|
MIDI files come in 3 variations: |
|
Format 0 which contain a single track |
|
Format 1 which contain one or more simultaneous tracks |
|
(ie all tracks are to be played simultaneously). |
|
Format 2 which contain one or more independant tracks |
|
(ie each track is to be played independantly of the others). |
|
return Utils.bytesToNumber(this.buffer.slice(8, 10)); |
|
*/ |
|
|
|
this.format = Utils.bytesToNumber(this.buffer.slice(8, 10)); |
|
return this; |
|
} |
|
|
|
/** |
|
* Parses out tracks, places them in this.tracks and initializes this.pointers |
|
* @return {Player} |
|
*/ |
|
|
|
}, { |
|
key: 'getTracks', |
|
value: function getTracks() { |
|
this.tracks = []; |
|
this.buffer.forEach(function (byte, index) { |
|
if (Utils.bytesToLetters(this.buffer.slice(index, index + 4)) == 'MTrk') { |
|
var trackLength = Utils.bytesToNumber(this.buffer.slice(index + 4, index + 8)); |
|
this.tracks.push(new Track(this.tracks.length, this.buffer.slice(index + 8, index + 8 + trackLength))); |
|
} |
|
}, this); |
|
|
|
return this; |
|
} |
|
|
|
/** |
|
* Enables a track for playing. |
|
* @param {number} trackNumber - Track number |
|
* @return {Player} |
|
*/ |
|
|
|
}, { |
|
key: 'enableTrack', |
|
value: function enableTrack(trackNumber) { |
|
this.tracks[trackNumber - 1].enable(); |
|
return this; |
|
} |
|
|
|
/** |
|
* Disables a track for playing. |
|
* @param {number} - Track number |
|
* @return {Player} |
|
*/ |
|
|
|
}, { |
|
key: 'disableTrack', |
|
value: function disableTrack(trackNumber) { |
|
this.tracks[trackNumber - 1].disable(); |
|
return this; |
|
} |
|
|
|
/** |
|
* Gets quarter note division of loaded MIDI file. |
|
* @return {Player} |
|
*/ |
|
|
|
}, { |
|
key: 'getDivision', |
|
value: function getDivision() { |
|
this.division = Utils.bytesToNumber(this.buffer.slice(12, 14)); |
|
return this; |
|
} |
|
|
|
/** |
|
* The main play loop. |
|
* @param {boolean} - Indicates whether or not this is being called simply for parsing purposes. Disregards timing if so. |
|
* @return {undefined} |
|
*/ |
|
|
|
}, { |
|
key: 'playLoop', |
|
value: function playLoop(dryRun) { |
|
if (!this.inLoop) { |
|
this.inLoop = true; |
|
this.tick = this.getCurrentTick(); |
|
|
|
this.tracks.forEach(function (track) { |
|
// Handle next event |
|
if (!dryRun && this.endOfFile()) { |
|
this.triggerPlayerEvent('endOfFile'); |
|
this.stop(); |
|
} else { |
|
var event = track.handleEvent(this.tick, dryRun); |
|
if (event && !dryRun) this.emitEvent(event); |
|
} |
|
}, this); |
|
|
|
if (!dryRun) this.triggerPlayerEvent('playing', { tick: this.tick }); |
|
this.inLoop = false; |
|
} |
|
} |
|
|
|
/** |
|
* Setter for startTime. |
|
* @param {number} - UTC timestamp |
|
*/ |
|
|
|
}, { |
|
key: 'setStartTime', |
|
value: function setStartTime(startTime) { |
|
this.startTime = startTime; |
|
} |
|
|
|
/** |
|
* Start playing loaded MIDI file if not already playing. |
|
* @return {Player} |
|
*/ |
|
|
|
}, { |
|
key: 'play', |
|
value: function play() { |
|
if (this.isPlaying()) throw 'Already playing...'; |
|
|
|
// Initialize |
|
if (!this.startTime) this.startTime = new Date().getTime(); |
|
|
|
// Start play loop |
|
//window.requestAnimationFrame(this.playLoop.bind(this)); |
|
this.setIntervalId = setInterval(this.playLoop.bind(this), this.sampleRate); |
|
|
|
return this; |
|
} |
|
|
|
/** |
|
* Pauses playback if playing. |
|
* @return {Player} |
|
*/ |
|
|
|
}, { |
|
key: 'pause', |
|
value: function pause() { |
|
clearInterval(this.setIntervalId); |
|
this.setIntervalId = false; |
|
this.startTick = this.tick; |
|
this.startTime = 0; |
|
return this; |
|
} |
|
|
|
/** |
|
* Stops playback if playing. |
|
* @return {Player} |
|
*/ |
|
|
|
}, { |
|
key: 'stop', |
|
value: function stop() { |
|
clearInterval(this.setIntervalId); |
|
this.setIntervalId = false; |
|
this.startTick = 0; |
|
this.startTime = 0; |
|
this.resetTracks(); |
|
return this; |
|
} |
|
|
|
/** |
|
* Checks if player is playing |
|
* @return {boolean} |
|
*/ |
|
|
|
}, { |
|
key: 'isPlaying', |
|
value: function isPlaying() { |
|
return this.setIntervalId > 0; |
|
} |
|
|
|
/** |
|
* Plays the loaded MIDI file without regard for timing and saves events in this.events. Essentially used as a parser. |
|
* @return {Player} |
|
*/ |
|
|
|
}, { |
|
key: 'dryRun', |
|
value: function dryRun() { |
|
// Reset tracks first |
|
this.resetTracks(); |
|
while (!this.endOfFile()) { |
|
this.playLoop(true); |
|
}this.events = this.getEvents(); |
|
this.totalTicks = this.getTotalTicks(); |
|
this.startTick = 0; |
|
this.startTime = 0; |
|
|
|
// Leave tracks in pristine condish |
|
this.resetTracks(); |
|
//console.log('Song time: ' + this.getSongTime() + ' seconds / ' + this.totalTicks + ' ticks.'); |
|
|
|
this.triggerPlayerEvent('fileLoaded', this); |
|
return this; |
|
} |
|
|
|
/** |
|
* Resets play pointers for all tracks. |
|
* @return {Player} |
|
*/ |
|
|
|
}, { |
|
key: 'resetTracks', |
|
value: function resetTracks() { |
|
this.tracks.forEach(function (track) { |
|
return track.reset(); |
|
}); |
|
return this; |
|
} |
|
|
|
/** |
|
* Gets an array of events grouped by track. |
|
* @return {array} |
|
*/ |
|
|
|
}, { |
|
key: 'getEvents', |
|
value: function getEvents() { |
|
return this.tracks.map(function (track) { |
|
return track.events; |
|
}); |
|
} |
|
|
|
/** |
|
* Gets total number of ticks in the loaded MIDI file. |
|
* @return {number} |
|
*/ |
|
|
|
}, { |
|
key: 'getTotalTicks', |
|
value: function getTotalTicks() { |
|
return Math.max.apply(null, this.tracks.map(function (track) { |
|
return track.delta; |
|
})); |
|
} |
|
|
|
/** |
|
* Gets song duration in seconds. |
|
* @return {number} |
|
*/ |
|
|
|
}, { |
|
key: 'getSongTime', |
|
value: function getSongTime() { |
|
return this.totalTicks / this.division / this.tempo * 60; |
|
} |
|
|
|
/** |
|
* Gets remaining number of seconds in playback. |
|
* @return {number} |
|
*/ |
|
|
|
}, { |
|
key: 'getSongTimeRemaining', |
|
value: function getSongTimeRemaining() { |
|
return Math.round((this.totalTicks - this.tick) / this.division / this.tempo * 60); |
|
} |
|
|
|
/** |
|
* Gets remaining percent of playback. |
|
* @return {number} |
|
*/ |
|
|
|
}, { |
|
key: 'getSongPercentRemaining', |
|
value: function getSongPercentRemaining() { |
|
return Math.round(this.getSongTimeRemaining() / this.getSongTime() * 100); |
|
} |
|
|
|
/** |
|
* Number of bytes processed in the loaded MIDI file. |
|
* @return {number} |
|
*/ |
|
|
|
}, { |
|
key: 'bytesProcessed', |
|
value: function bytesProcessed() { |
|
// Currently assume header chunk is strictly 14 bytes |
|
return 14 + this.tracks.length * 8 + this.tracks.reduce(function (a, b) { |
|
return { pointer: a.pointer + b.pointer }; |
|
}, { pointer: 0 }).pointer; |
|
} |
|
|
|
/** |
|
* Determines if the player pointer has reached the end of the loaded MIDI file. |
|
* @return {boolean} |
|
*/ |
|
|
|
}, { |
|
key: 'endOfFile', |
|
value: function endOfFile() { |
|
return this.bytesProcessed() == this.buffer.length; |
|
} |
|
|
|
/** |
|
* Gets the current tick number in playback. |
|
* @return {number} |
|
*/ |
|
|
|
}, { |
|
key: 'getCurrentTick', |
|
value: function getCurrentTick() { |
|
return Math.round((new Date().getTime() - this.startTime) / 1000 * (this.division * (this.tempo / 60))) + this.startTick; |
|
} |
|
|
|
/** |
|
* Sends MIDI event out to listener. |
|
* @param {object} |
|
* @return {Player} |
|
*/ |
|
|
|
}, { |
|
key: 'emitEvent', |
|
value: function emitEvent(event) { |
|
// Grab tempo if available. |
|
if (event.hasOwnProperty('name') && event.name === 'Set Tempo') this.tempo = event.data; |
|
this.triggerPlayerEvent('midiEvent', event); |
|
return this; |
|
} |
|
|
|
/** |
|
* Subscribes events to listeners |
|
* @param {string} - Name of event to subscribe to. |
|
* @param {function} - Callback to fire when event is broadcast. |
|
* @return {Player} |
|
*/ |
|
|
|
}, { |
|
key: 'on', |
|
value: function on(playerEvent, fn) { |
|
if (!this.eventListeners.hasOwnProperty(playerEvent)) this.eventListeners[playerEvent] = []; |
|
this.eventListeners[playerEvent].push(fn); |
|
return this; |
|
} |
|
|
|
/** |
|
* Broadcasts event to trigger subscribed callbacks. |
|
* @param {string} - Name of event. |
|
* @param {object} - Data to be passed to subscriber callback. |
|
* @return {Player} |
|
*/ |
|
|
|
}, { |
|
key: 'triggerPlayerEvent', |
|
value: function triggerPlayerEvent(playerEvent, data) { |
|
if (this.eventListeners.hasOwnProperty(playerEvent)) this.eventListeners[playerEvent].forEach(function (fn) { |
|
return fn(data || {}); |
|
}); |
|
return this; |
|
} |
|
}]); |
|
|
|
return Player; |
|
}(); |
|
|
|
exports.Player = Player; |
|
|
|
'use strict'; |
|
|
|
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); |
|
|
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } |
|
|
|
/** |
|
* Class representing a track. Contains methods for parsing events and keeping track of pointer. |
|
*/ |
|
var Track = function () { |
|
function Track(index, data) { |
|
_classCallCheck(this, Track); |
|
|
|
this.enabled = true; |
|
this.pointer = 0; |
|
this.lastTick = 0; |
|
this.lastStatus = null; |
|
this.index = index; |
|
this.data = data; |
|
this.delta = 0; |
|
this.runningDelta = 0; |
|
this.events = []; |
|
} |
|
|
|
/** |
|
* Resets all stateful track informaion used during playback. |
|
* @return {Track} |
|
*/ |
|
|
|
|
|
_createClass(Track, [{ |
|
key: 'reset', |
|
value: function reset() { |
|
this.enabled = true; |
|
this.pointer = 0; |
|
this.lastTick = 0; |
|
this.lastStatus = null; |
|
this.delta = 0; |
|
this.runningDelta = 0; |
|
return this; |
|
} |
|
|
|
/** |
|
* Sets this track to be enabled during playback. |
|
* @return {Track} |
|
*/ |
|
|
|
}, { |
|
key: 'enable', |
|
value: function enable() { |
|
this.enabled = true; |
|
return this; |
|
} |
|
|
|
/** |
|
* Sets this track to be disabled during playback. |
|
* @return {Track} |
|
*/ |
|
|
|
}, { |
|
key: 'disable', |
|
value: function disable() { |
|
this.enabled = false; |
|
return this; |
|
} |
|
|
|
/** |
|
* Gets byte located at pointer position. |
|
* @return {number} |
|
*/ |
|
|
|
}, { |
|
key: 'getCurrentByte', |
|
value: function getCurrentByte() { |
|
return this.data[this.pointer]; |
|
} |
|
|
|
/** |
|
* Gets count of delta bytes and current pointer position. |
|
* @return {number} |
|
*/ |
|
|
|
}, { |
|
key: 'getDeltaByteCount', |
|
value: function getDeltaByteCount() { |
|
// Get byte count of delta VLV |
|
// http://www.ccarh.org/courses/253/handout/vlv/ |
|
// If byte is greater or equal to 80h (128 decimal) then the next byte |
|
// is also part of the VLV, |
|
// else byte is the last byte in a VLV. |
|
var currentByte = this.getCurrentByte(); |
|
var byteCount = 1; |
|
|
|
while (currentByte >= 128) { |
|
currentByte = this.data[this.pointer + byteCount]; |
|
byteCount++; |
|
} |
|
|
|
return byteCount; |
|
} |
|
|
|
/** |
|
* Get delta value at current pointer position. |
|
* @return {number} |
|
*/ |
|
|
|
}, { |
|
key: 'getDelta', |
|
value: function getDelta() { |
|
return Utils.readVarInt(this.data.slice(this.pointer, this.pointer + this.getDeltaByteCount())); |
|
} |
|
|
|
/** |
|
* Handles event within a given track starting at specified index |
|
* @param {number} currentTick |
|
* @param {boolean} dryRun - If true events will be parsed and returned regardless of time. |
|
*/ |
|
|
|
}, { |
|
key: 'handleEvent', |
|
value: function handleEvent(currentTick, dryRun) { |
|
dryRun = dryRun || false; |
|
if (this.pointer < this.data.length && (dryRun || currentTick - this.lastTick >= this.getDelta())) { |
|
var _event = this.parseEvent(); |
|
if (this.enabled) return _event; |
|
// Recursively call this function for each event ahead that has 0 delta time? |
|
} |
|
|
|
return null; |
|
} |
|
|
|
/** |
|
* Get string data from event. |
|
* @param {number} eventStartIndex |
|
* @return {string} |
|
*/ |
|
|
|
}, { |
|
key: 'getStringData', |
|
value: function getStringData(eventStartIndex) { |
|
var currentByte = this.pointer; |
|
var byteCount = 1; |
|
var length = Utils.readVarInt(this.data.slice(eventStartIndex + 2, eventStartIndex + 2 + byteCount)); |
|
var stringLength = length; |
|
|
|
return Utils.bytesToLetters(this.data.slice(eventStartIndex + byteCount + 2, eventStartIndex + byteCount + length + 2)); |
|
} |
|
|
|
/** |
|
* Parses event into JSON and advances pointer for the track |
|
* @return {object} |
|
*/ |
|
|
|
}, { |
|
key: 'parseEvent', |
|
value: function parseEvent() { |
|
var eventStartIndex = this.pointer + this.getDeltaByteCount(); |
|
var eventJson = {}; |
|
var deltaByteCount = this.getDeltaByteCount(); |
|
eventJson.track = this.index + 1; |
|
eventJson.delta = this.getDelta(); |
|
this.lastTick = this.lastTick + eventJson.delta; |
|
this.runningDelta += eventJson.delta; |
|
eventJson.tick = this.runningDelta; |
|
|
|
//eventJson.raw = event; |
|
if (this.data[eventStartIndex] == 0xff) { |
|
// Meta Event |
|
|
|
// If this is a meta event we should emit the data and immediately move to the next event |
|
// otherwise if we let it run through the next cycle a slight delay will accumulate if multiple tracks |
|
// are being played simultaneously |
|
|
|
switch (this.data[eventStartIndex + 1]) { |
|
case 0x00: |
|
// Sequence Number |
|
eventJson.name = 'Sequence Number'; |
|
break; |
|
case 0x01: |
|
// Text Event |
|
eventJson.name = 'Text Event'; |
|
eventJson.string = this.getStringData(eventStartIndex); |
|
break; |
|
case 0x02: |
|
// Copyright Notice |
|
eventJson.name = 'Copyright Notice'; |
|
break; |
|
case 0x03: |
|
// Sequence/Track Name |
|
eventJson.name = 'Sequence/Track Name'; |
|
eventJson.string = this.getStringData(eventStartIndex); |
|
break; |
|
case 0x04: |
|
// Instrument Name |
|
eventJson.name = 'Instrument Name'; |
|
eventJson.string = this.getStringData(eventStartIndex); |
|
break; |
|
case 0x05: |
|
// Lyric |
|
eventJson.name = 'Lyric'; |
|
eventJson.string = this.getStringData(eventStartIndex); |
|
break; |
|
case 0x06: |
|
// Marker |
|
eventJson.name = 'Marker'; |
|
break; |
|
case 0x07: |
|
// Cue Point |
|
eventJson.name = 'Cue Point'; |
|
eventJson.string = this.getStringData(eventStartIndex); |
|
break; |
|
case 0x09: |
|
// Device Name |
|
eventJson.name = 'Device Name'; |
|
eventJson.string = this.getStringData(eventStartIndex); |
|
break; |
|
case 0x20: |
|
// MIDI Channel Prefix |
|
eventJson.name = 'MIDI Channel Prefix'; |
|
break; |
|
case 0x21: |
|
// MIDI Port |
|
eventJson.name = 'MIDI Port'; |
|
eventJson.data = Utils.bytesToNumber([this.data[eventStartIndex + 3]]); |
|
break; |
|
case 0x2F: |
|
// End of Track |
|
eventJson.name = 'End of Track'; |
|
break; |
|
case 0x51: |
|
// Set Tempo |
|
eventJson.name = 'Set Tempo'; |
|
eventJson.data = Math.round(60000000 / Utils.bytesToNumber(this.data.slice(eventStartIndex + 3, eventStartIndex + 6))); |
|
this.tempo = eventJson.data; |
|
break; |
|
case 0x54: |
|
// SMTPE Offset |
|
eventJson.name = 'SMTPE Offset'; |
|
break; |
|
case 0x58: |
|
// Time Signature |
|
eventJson.name = 'Time Signature'; |
|
break; |
|
case 0x59: |
|
// Key Signature |
|
eventJson.name = 'Key Signature'; |
|
break; |
|
case 0x7F: |
|
// Sequencer-Specific Meta-event |
|
eventJson.name = 'Sequencer-Specific Meta-event'; |
|
break; |
|
default: |
|
eventJson.name = 'Unknown: ' + this.data[eventStartIndex + 1].toString(16); |
|
break; |
|
} |
|
|
|
var length = this.data[this.pointer + deltaByteCount + 2]; |
|
// Some meta events will have vlv that needs to be handled |
|
|
|
this.pointer += deltaByteCount + 3 + length; |
|
} else if (this.data[eventStartIndex] == 0xf0) { |
|
// Sysex |
|
eventJson.name = 'Sysex'; |
|
var length = this.data[this.pointer + deltaByteCount + 1]; |
|
this.pointer += deltaByteCount + 2 + length; |
|
} else { |
|
// Voice event |
|
if (this.data[eventStartIndex] < 0x80) { |
|
// Running status |
|
eventJson.running = true; |
|
eventJson.noteNumber = this.data[eventStartIndex]; |
|
eventJson.noteName = Constants.NOTES[this.data[eventStartIndex]]; |
|
eventJson.velocity = this.data[eventStartIndex + 1]; |
|
|
|
if (this.lastStatus <= 0x8f) { |
|
eventJson.name = 'Note off'; |
|
eventJson.channel = this.lastStatus - 0x80 + 1; |
|
} else if (this.lastStatus <= 0x9f) { |
|
eventJson.name = 'Note on'; |
|
eventJson.channel = this.lastStatus - 0x90 + 1; |
|
} |
|
|
|
this.pointer += deltaByteCount + 2; |
|
} else { |
|
this.lastStatus = this.data[eventStartIndex]; |
|
|
|
if (this.data[eventStartIndex] <= 0x8f) { |
|
// Note off |
|
eventJson.name = 'Note off'; |
|
eventJson.channel = this.lastStatus - 0x80 + 1; |
|
eventJson.noteNumber = this.data[eventStartIndex + 1]; |
|
eventJson.noteName = Constants.NOTES[this.data[eventStartIndex + 1]]; |
|
eventJson.velocity = Math.round(this.data[eventStartIndex + 2] / 127 * 100); |
|
this.pointer += deltaByteCount + 3; |
|
} else if (this.data[eventStartIndex] <= 0x9f) { |
|
// Note on |
|
eventJson.name = 'Note on'; |
|
eventJson.channel = this.lastStatus - 0x90 + 1; |
|
eventJson.noteNumber = this.data[eventStartIndex + 1]; |
|
eventJson.noteName = Constants.NOTES[this.data[eventStartIndex + 1]]; |
|
eventJson.velocity = Math.round(this.data[eventStartIndex + 2] / 127 * 100); |
|
this.pointer += deltaByteCount + 3; |
|
} else if (this.data[eventStartIndex] <= 0xaf) { |
|
// Polyphonic Key Pressure |
|
eventJson.name = 'Polyphonic Key Pressure'; |
|
eventJson.channel = this.lastStatus - 0xa0 + 1; |
|
eventJson.note = Constants.NOTES[this.data[eventStartIndex + 1]]; |
|
eventJson.pressure = event[2]; |
|
this.pointer += deltaByteCount + 3; |
|
} else if (this.data[eventStartIndex] <= 0xbf) { |
|
// Controller Change |
|
eventJson.name = 'Controller Change'; |
|
eventJson.channel = this.lastStatus - 0xb0 + 1; |
|
eventJson.number = this.data[eventStartIndex + 1]; |
|
eventJson.value = this.data[eventStartIndex + 2]; |
|
this.pointer += deltaByteCount + 3; |
|
} else if (this.data[eventStartIndex] <= 0xcf) { |
|
// Program Change |
|
eventJson.name = 'Program Change'; |
|
eventJson.channel = this.lastStatus - 0xc0 + 1; |
|
this.pointer += deltaByteCount + 2; |
|
} else if (this.data[eventStartIndex] <= 0xdf) { |
|
// Channel Key Pressure |
|
eventJson.name = 'Channel Key Pressure'; |
|
eventJson.channel = this.lastStatus - 0xd0 + 1; |
|
this.pointer += deltaByteCount + 2; |
|
} else if (this.data[eventStartIndex] <= 0xef) { |
|
// Pitch Bend |
|
eventJson.name = 'Pitch Bend'; |
|
eventJson.channel = this.lastStatus - 0xe0 + 1; |
|
this.pointer += deltaByteCount + 3; |
|
} else { |
|
eventJson.name = 'Unknown. Pointer: ' + this.pointer.toString() + ' ' + eventStartIndex.toString() + ' ' + this.data.length; |
|
} |
|
} |
|
} |
|
|
|
this.delta += eventJson.delta; |
|
this.events.push(eventJson); |
|
|
|
return eventJson; |
|
} |
|
|
|
/** |
|
* Returns true if pointer has reached the end of the track. |
|
* @param {boolean} |
|
*/ |
|
|
|
}, { |
|
key: 'endOfTrack', |
|
value: function endOfTrack() { |
|
if (this.data[this.pointer + 1] == 0xff && this.data[this.pointer + 2] == 0x2f && this.data[this.pointer + 3] == 0x00) { |
|
return true; |
|
} |
|
|
|
return false; |
|
} |
|
}]); |
|
|
|
return Track; |
|
}(); |
|
|
|
'use strict'; |
|
|
|
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); |
|
|
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } |
|
|
|
/** |
|
* Contains misc static utility methods. |
|
*/ |
|
var Utils = function () { |
|
function Utils() { |
|
_classCallCheck(this, Utils); |
|
} |
|
|
|
_createClass(Utils, null, [{ |
|
key: 'byteToHex', |
|
|
|
|
|
/** |
|
* Converts a single byte to a hex string. |
|
* @param {number} byte |
|
* @return {string} |
|
*/ |
|
value: function byteToHex(byte) { |
|
// Ensure hex string always has two chars |
|
return ('0' + byte.toString(16)).slice(-2); |
|
} |
|
|
|
/** |
|
* Converts an array of bytes to a hex string. |
|
* @param {array} byteArray |
|
* @return {string} |
|
*/ |
|
|
|
}, { |
|
key: 'bytesToHex', |
|
value: function bytesToHex(byteArray) { |
|
var hex = []; |
|
byteArray.forEach(function (byte) { |
|
return hex.push(Utils.byteToHex(byte)); |
|
}); |
|
return hex.join(''); |
|
} |
|
|
|
/** |
|
* Converts a hex string to a number. |
|
* @param {string} hexString |
|
* @return {number} |
|
*/ |
|
|
|
}, { |
|
key: 'hexToNumber', |
|
value: function hexToNumber(hexString) { |
|
return parseInt(hexString, 16); |
|
} |
|
|
|
/** |
|
* Converts an array of bytes to a number. |
|
* @param {array} byteArray |
|
* @return {number} |
|
*/ |
|
|
|
}, { |
|
key: 'bytesToNumber', |
|
value: function bytesToNumber(byteArray) { |
|
return Utils.hexToNumber(Utils.bytesToHex(byteArray)); |
|
} |
|
|
|
/** |
|
* Converts an array of bytes to letters. |
|
* @param {array} byteArray |
|
* @return {string} |
|
*/ |
|
|
|
}, { |
|
key: 'bytesToLetters', |
|
value: function bytesToLetters(byteArray) { |
|
var letters = []; |
|
byteArray.forEach(function (byte) { |
|
return letters.push(String.fromCharCode(byte)); |
|
}); |
|
return letters.join(''); |
|
} |
|
|
|
/** |
|
* Converts a decimal to it's binary representation. |
|
* @param {number} dec |
|
* @return {string} |
|
*/ |
|
|
|
}, { |
|
key: 'decToBinary', |
|
value: function decToBinary(dec) { |
|
return (dec >>> 0).toString(2); |
|
} |
|
|
|
/** |
|
* Reads a variable length value. |
|
* @param {array} byteArray |
|
* @return {number} |
|
*/ |
|
|
|
}, { |
|
key: 'readVarInt', |
|
value: function readVarInt(byteArray) { |
|
var result = 0; |
|
byteArray.forEach(function (number) { |
|
var b = number; |
|
if (b & 0x80) { |
|
result += b & 0x7f; |
|
result <<= 7; |
|
} else { |
|
/* b is the last byte */ |
|
result += b; |
|
} |
|
}); |
|
|
|
return result; |
|
} |
|
|
|
/** |
|
* Decodes base-64 encoded string |
|
* @param {string} string |
|
* @return {string} |
|
*/ |
|
|
|
}, { |
|
key: 'atob', |
|
value: function (_atob) { |
|
function atob(_x) { |
|
return _atob.apply(this, arguments); |
|
} |
|
|
|
atob.toString = function () { |
|
return _atob.toString(); |
|
}; |
|
|
|
return atob; |
|
}(function (string) { |
|
if (typeof atob === 'function') return atob(string); |
|
return new Buffer(string, 'base64').toString('binary'); |
|
}) |
|
}]); |
|
|
|
return Utils; |
|
}(); |
|
|
|
exports.Utils = Utils; |
|
|
|
|
|
}).call(this,require("buffer").Buffer) |
|
},{"buffer":3,"fs":1}]},{},[6]); |