{"version":3,"file":"spectra-processor.min.js","sources":["../node_modules/ml-stat/array.js","../node_modules/ml-array-xy-filter-x/src/index.js","../node_modules/ml-array-xy-filter-x/src/getZones.js","../node_modules/is-any-array/src/index.js","../node_modules/ml-array-sequential-fill/lib-es6/index.js","../node_modules/ml-zones/src/normalize.js","../node_modules/ml-array-xy-equally-spaced/src/integral.js","../node_modules/ml-array-xy-equally-spaced/src/index.js","../node_modules/ml-zones/src/invert.js","../node_modules/ml-zones/src/zonesWithPoints.js","../node_modules/ml-array-xy-equally-spaced/src/equallySpacedSlot.js","../node_modules/ml-array-xy-equally-spaced/src/equallySpacedSmooth.js","../node_modules/ml-array-max/lib-es6/index.js","../node_modules/ml-array-sum/lib-es6/index.js","../node_modules/ml-array-normed/node_modules/is-any-array/src/index.js","../node_modules/ml-array-normed/lib-es6/index.js","../node_modules/ml-array-min/lib-es6/index.js","../node_modules/ml-array-rescale/lib-es6/index.js","../node_modules/ml-spectra-processing/node_modules/is-any-array/src/index.js","../node_modules/ml-spectra-processing/src/xy/check.js","../node_modules/ml-spectra-processing/src/util/normalizeZones.js","../node_modules/ml-spectra-processing/src/x/findClosestIndex.js","../node_modules/ml-spectra-processing/src/x/getFromToIndex.js","../node_modules/ml-spectra-processing/src/x/getTargetIndex.js","../node_modules/ml-spectra-processing/src/xy/index.js","../node_modules/ml-spectra-processing/src/xy/extract.js","../node_modules/ml-spectra-processing/src/xy/integral.js","../node_modules/ml-spectra-processing/src/xy/integration.js","../node_modules/ml-spectra-processing/src/xy/maxY.js","../node_modules/ml-spectra-processing/src/xy/maximaY.js","../node_modules/ml-spectra-processing/src/xy/maxYPoint.js","../node_modules/ml-spectra-processing/src/xy/minimaY.js","../node_modules/ml-spectra-processing/src/xy/minYPoint.js","../node_modules/ml-spectra-processing/src/xy/reduce.js","../node_modules/ml-spectra-processing/src/xy/growingX.js","../node_modules/ml-spectra-processing/src/xy/minClosestYPoint.js","../node_modules/ml-spectra-processing/src/xy/maxClosestYPoint.js","../node_modules/ml-spectra-processing/src/xy/realMaxYPoint.js","../node_modules/ml-spectra-processing/src/xy/realMinYPoint.js","../node_modules/ml-spectra-processing/src/xy/peakInfo.js","../node_modules/ml-spectra-processing/src/xy/toXYObject.js","../node_modules/ml-spectra-processing/src/x/multiply.js","../node_modules/ml-spectra-processing/src/x/dotProduct.js","../node_modules/ml-spectra-processing/src/x/crossCorrelation.js","../node_modules/ml-spectra-processing/src/x/index.js","../node_modules/ml-spectra-processing/src/x/add.js","../node_modules/ml-spectra-processing/src/x/autoCorrelation.js","../node_modules/ml-spectra-processing/src/x/boxPlot.js","../node_modules/ml-spectra-processing/src/x/correlation.js","../node_modules/ml-spectra-processing/src/x/divide.js","../node_modules/ml-spectra-processing/src/x/rotate.js","../node_modules/ml-spectra-processing/src/x/subtract.js","../src/spectrum/Spectrum.js","../node_modules/jcampconverter/src/index.js","../src/spectrum/getData.js","../src/spectrum/getNormalized.js","../src/spectrum/updateRangesInfo.js","../src/Kinds.js","../src/parser/jcamp.js","../node_modules/xy-parser/src/index.js","../node_modules/ml-arrayxy-uniquex/src/index.js","../src/jsgraph/getBoxPlotAnnotations.js","../src/spectra/getBoxPlotData.js","../src/jsgraph/addChartDataStyle.js","../node_modules/chroma-js/chroma.js","../src/spectra/getNormalizedData.js","../node_modules/ml-matrix/src/util.js","../node_modules/ml-matrix/src/inspect.js","../node_modules/ml-matrix/src/matrix.js","../node_modules/ml-matrix/src/stat.js","../src/spectra/scaled/getFromToIndex.js","../node_modules/ml-regression-base/src/maybeToPrecision.js","../node_modules/ml-matrix/src/mathOperations.js","../node_modules/ml-regression-base/src/index.js","../node_modules/ml-regression-simple-linear/src/index.js","../node_modules/ml-regression-base/src/checkArrayLength.js","../src/spectra/getScaledData.js","../src/spectra/scaled/min.js","../src/spectra/scaled/max.js","../src/spectra/scaled/minMax.js","../src/spectra/scaled/range.js","../src/metadata/getCategoriesStats.js","../src/SpectraProcessor.js","../src/jsgraph/getNormalizationAnnotations.js","../src/spectra/getAutocorrelation.js","../src/spectra/getMeanData.js","../src/spectra/getNormalizedText.js","../src/parser/text.js","../src/metadata/getMetadata.js","../src/metadata/getClasses.js","../src/jsgraph/getChart.js","../src/jsgraph/getAutocorrelationChart.js","../src/jsgraph/getTrackAnnotation.js","../src/jsgraph/getNormalizedChart.js","../src/jsgraph/getScaledChart.js","../src/parser/matrix.js"],"sourcesContent":["'use strict';\n\nfunction compareNumbers(a, b) {\n    return a - b;\n}\n\n/**\n * Computes the sum of the given values\n * @param {Array} values\n * @returns {number}\n */\nexports.sum = function sum(values) {\n    var sum = 0;\n    for (var i = 0; i < values.length; i++) {\n        sum += values[i];\n    }\n    return sum;\n};\n\n/**\n * Computes the maximum of the given values\n * @param {Array} values\n * @returns {number}\n */\nexports.max = function max(values) {\n    var max = values[0];\n    var l = values.length;\n    for (var i = 1; i < l; i++) {\n        if (values[i] > max) max = values[i];\n    }\n    return max;\n};\n\n/**\n * Computes the minimum of the given values\n * @param {Array} values\n * @returns {number}\n */\nexports.min = function min(values) {\n    var min = values[0];\n    var l = values.length;\n    for (var i = 1; i < l; i++) {\n        if (values[i] < min) min = values[i];\n    }\n    return min;\n};\n\n/**\n * Computes the min and max of the given values\n * @param {Array} values\n * @returns {{min: number, max: number}}\n */\nexports.minMax = function minMax(values) {\n    var min = values[0];\n    var max = values[0];\n    var l = values.length;\n    for (var i = 1; i < l; i++) {\n        if (values[i] < min) min = values[i];\n        if (values[i] > max) max = values[i];\n    }\n    return {\n        min: min,\n        max: max\n    };\n};\n\n/**\n * Computes the arithmetic mean of the given values\n * @param {Array} values\n * @returns {number}\n */\nexports.arithmeticMean = function arithmeticMean(values) {\n    var sum = 0;\n    var l = values.length;\n    for (var i = 0; i < l; i++) {\n        sum += values[i];\n    }\n    return sum / l;\n};\n\n/**\n * {@link arithmeticMean}\n */\nexports.mean = exports.arithmeticMean;\n\n/**\n * Computes the geometric mean of the given values\n * @param {Array} values\n * @returns {number}\n */\nexports.geometricMean = function geometricMean(values) {\n    var mul = 1;\n    var l = values.length;\n    for (var i = 0; i < l; i++) {\n        mul *= values[i];\n    }\n    return Math.pow(mul, 1 / l);\n};\n\n/**\n * Computes the mean of the log of the given values\n * If the return value is exponentiated, it gives the same result as the\n * geometric mean.\n * @param {Array} values\n * @returns {number}\n */\nexports.logMean = function logMean(values) {\n    var lnsum = 0;\n    var l = values.length;\n    for (var i = 0; i < l; i++) {\n        lnsum += Math.log(values[i]);\n    }\n    return lnsum / l;\n};\n\n/**\n * Computes the weighted grand mean for a list of means and sample sizes\n * @param {Array} means - Mean values for each set of samples\n * @param {Array} samples - Number of original values for each set of samples\n * @returns {number}\n */\nexports.grandMean = function grandMean(means, samples) {\n    var sum = 0;\n    var n = 0;\n    var l = means.length;\n    for (var i = 0; i < l; i++) {\n        sum += samples[i] * means[i];\n        n += samples[i];\n    }\n    return sum / n;\n};\n\n/**\n * Computes the truncated mean of the given values using a given percentage\n * @param {Array} values\n * @param {number} percent - The percentage of values to keep (range: [0,1])\n * @param {boolean} [alreadySorted=false]\n * @returns {number}\n */\nexports.truncatedMean = function truncatedMean(values, percent, alreadySorted) {\n    if (alreadySorted === undefined) alreadySorted = false;\n    if (!alreadySorted) {\n        values = [].concat(values).sort(compareNumbers);\n    }\n    var l = values.length;\n    var k = Math.floor(l * percent);\n    var sum = 0;\n    for (var i = k; i < (l - k); i++) {\n        sum += values[i];\n    }\n    return sum / (l - 2 * k);\n};\n\n/**\n * Computes the harmonic mean of the given values\n * @param {Array} values\n * @returns {number}\n */\nexports.harmonicMean = function harmonicMean(values) {\n    var sum = 0;\n    var l = values.length;\n    for (var i = 0; i < l; i++) {\n        if (values[i] === 0) {\n            throw new RangeError('value at index ' + i + 'is zero');\n        }\n        sum += 1 / values[i];\n    }\n    return l / sum;\n};\n\n/**\n * Computes the contraharmonic mean of the given values\n * @param {Array} values\n * @returns {number}\n */\nexports.contraHarmonicMean = function contraHarmonicMean(values) {\n    var r1 = 0;\n    var r2 = 0;\n    var l = values.length;\n    for (var i = 0; i < l; i++) {\n        r1 += values[i] * values[i];\n        r2 += values[i];\n    }\n    if (r2 < 0) {\n        throw new RangeError('sum of values is negative');\n    }\n    return r1 / r2;\n};\n\n/**\n * Computes the median of the given values\n * @param {Array} values\n * @param {boolean} [alreadySorted=false]\n * @returns {number}\n */\nexports.median = function median(values, alreadySorted) {\n    if (alreadySorted === undefined) alreadySorted = false;\n    if (!alreadySorted) {\n        values = [].concat(values).sort(compareNumbers);\n    }\n    var l = values.length;\n    var half = Math.floor(l / 2);\n    if (l % 2 === 0) {\n        return (values[half - 1] + values[half]) * 0.5;\n    } else {\n        return values[half];\n    }\n};\n\n/**\n * Computes the variance of the given values\n * @param {Array} values\n * @param {boolean} [unbiased=true] - if true, divide by (n-1); if false, divide by n.\n * @returns {number}\n */\nexports.variance = function variance(values, unbiased) {\n    if (unbiased === undefined) unbiased = true;\n    var theMean = exports.mean(values);\n    var theVariance = 0;\n    var l = values.length;\n\n    for (var i = 0; i < l; i++) {\n        var x = values[i] - theMean;\n        theVariance += x * x;\n    }\n\n    if (unbiased) {\n        return theVariance / (l - 1);\n    } else {\n        return theVariance / l;\n    }\n};\n\n/**\n * Computes the standard deviation of the given values\n * @param {Array} values\n * @param {boolean} [unbiased=true] - if true, divide by (n-1); if false, divide by n.\n * @returns {number}\n */\nexports.standardDeviation = function standardDeviation(values, unbiased) {\n    return Math.sqrt(exports.variance(values, unbiased));\n};\n\nexports.standardError = function standardError(values) {\n    return exports.standardDeviation(values) / Math.sqrt(values.length);\n};\n\n/**\n * IEEE Transactions on biomedical engineering, vol. 52, no. 1, january 2005, p. 76-\n * Calculate the standard deviation via the Median of the absolute deviation\n *  The formula for the standard deviation only holds for Gaussian random variables.\n * @returns {{mean: number, stdev: number}}\n */\nexports.robustMeanAndStdev = function robustMeanAndStdev(y) {\n    var mean = 0, stdev = 0;\n    var length = y.length, i = 0;\n    for (i = 0; i < length; i++) {\n        mean += y[i];\n    }\n    mean /= length;\n    var averageDeviations = new Array(length);\n    for (i = 0; i < length; i++)\n        averageDeviations[i] = Math.abs(y[i] - mean);\n    averageDeviations.sort(compareNumbers);\n    if (length % 2 === 1) {\n        stdev = averageDeviations[(length - 1) / 2] / 0.6745;\n    } else {\n        stdev = 0.5 * (averageDeviations[length / 2] + averageDeviations[length / 2 - 1]) / 0.6745;\n    }\n\n    return {\n        mean: mean,\n        stdev: stdev\n    };\n};\n\nexports.quartiles = function quartiles(values, alreadySorted) {\n    if (typeof (alreadySorted) === 'undefined') alreadySorted = false;\n    if (!alreadySorted) {\n        values = [].concat(values).sort(compareNumbers);\n    }\n\n    var quart = values.length / 4;\n    var q1 = values[Math.ceil(quart) - 1];\n    var q2 = exports.median(values, true);\n    var q3 = values[Math.ceil(quart * 3) - 1];\n\n    return {q1: q1, q2: q2, q3: q3};\n};\n\nexports.pooledStandardDeviation = function pooledStandardDeviation(samples, unbiased) {\n    return Math.sqrt(exports.pooledVariance(samples, unbiased));\n};\n\nexports.pooledVariance = function pooledVariance(samples, unbiased) {\n    if (typeof (unbiased) === 'undefined') unbiased = true;\n    var sum = 0;\n    var length = 0, l = samples.length;\n    for (var i = 0; i < l; i++) {\n        var values = samples[i];\n        var vari = exports.variance(values);\n\n        sum += (values.length - 1) * vari;\n\n        if (unbiased)\n            length += values.length - 1;\n        else\n            length += values.length;\n    }\n    return sum / length;\n};\n\nexports.mode = function mode(values) {\n    var l = values.length,\n        itemCount = new Array(l),\n        i;\n    for (i = 0; i < l; i++) {\n        itemCount[i] = 0;\n    }\n    var itemArray = new Array(l);\n    var count = 0;\n\n    for (i = 0; i < l; i++) {\n        var index = itemArray.indexOf(values[i]);\n        if (index >= 0)\n            itemCount[index]++;\n        else {\n            itemArray[count] = values[i];\n            itemCount[count] = 1;\n            count++;\n        }\n    }\n\n    var maxValue = 0, maxIndex = 0;\n    for (i = 0; i < count; i++) {\n        if (itemCount[i] > maxValue) {\n            maxValue = itemCount[i];\n            maxIndex = i;\n        }\n    }\n\n    return itemArray[maxIndex];\n};\n\nexports.covariance = function covariance(vector1, vector2, unbiased) {\n    if (typeof (unbiased) === 'undefined') unbiased = true;\n    var mean1 = exports.mean(vector1);\n    var mean2 = exports.mean(vector2);\n\n    if (vector1.length !== vector2.length)\n        throw 'Vectors do not have the same dimensions';\n\n    var cov = 0, l = vector1.length;\n    for (var i = 0; i < l; i++) {\n        var x = vector1[i] - mean1;\n        var y = vector2[i] - mean2;\n        cov += x * y;\n    }\n\n    if (unbiased)\n        return cov / (l - 1);\n    else\n        return cov / l;\n};\n\nexports.skewness = function skewness(values, unbiased) {\n    if (typeof (unbiased) === 'undefined') unbiased = true;\n    var theMean = exports.mean(values);\n\n    var s2 = 0, s3 = 0, l = values.length;\n    for (var i = 0; i < l; i++) {\n        var dev = values[i] - theMean;\n        s2 += dev * dev;\n        s3 += dev * dev * dev;\n    }\n    var m2 = s2 / l;\n    var m3 = s3 / l;\n\n    var g = m3 / (Math.pow(m2, 3 / 2.0));\n    if (unbiased) {\n        var a = Math.sqrt(l * (l - 1));\n        var b = l - 2;\n        return (a / b) * g;\n    } else {\n        return g;\n    }\n};\n\nexports.kurtosis = function kurtosis(values, unbiased) {\n    if (typeof (unbiased) === 'undefined') unbiased = true;\n    var theMean = exports.mean(values);\n    var n = values.length, s2 = 0, s4 = 0;\n\n    for (var i = 0; i < n; i++) {\n        var dev = values[i] - theMean;\n        s2 += dev * dev;\n        s4 += dev * dev * dev * dev;\n    }\n    var m2 = s2 / n;\n    var m4 = s4 / n;\n\n    if (unbiased) {\n        var v = s2 / (n - 1);\n        var a = (n * (n + 1)) / ((n - 1) * (n - 2) * (n - 3));\n        var b = s4 / (v * v);\n        var c = ((n - 1) * (n - 1)) / ((n - 2) * (n - 3));\n\n        return a * b - 3 * c;\n    } else {\n        return m4 / (m2 * m2) - 3;\n    }\n};\n\nexports.entropy = function entropy(values, eps) {\n    if (typeof (eps) === 'undefined') eps = 0;\n    var sum = 0, l = values.length;\n    for (var i = 0; i < l; i++)\n        sum += values[i] * Math.log(values[i] + eps);\n    return -sum;\n};\n\nexports.weightedMean = function weightedMean(values, weights) {\n    var sum = 0, l = values.length;\n    for (var i = 0; i < l; i++)\n        sum += values[i] * weights[i];\n    return sum;\n};\n\nexports.weightedStandardDeviation = function weightedStandardDeviation(values, weights) {\n    return Math.sqrt(exports.weightedVariance(values, weights));\n};\n\nexports.weightedVariance = function weightedVariance(values, weights) {\n    var theMean = exports.weightedMean(values, weights);\n    var vari = 0, l = values.length;\n    var a = 0, b = 0;\n\n    for (var i = 0; i < l; i++) {\n        var z = values[i] - theMean;\n        var w = weights[i];\n\n        vari += w * (z * z);\n        b += w;\n        a += w * w;\n    }\n\n    return vari * (b / (b * b - a));\n};\n\nexports.center = function center(values, inPlace) {\n    if (typeof (inPlace) === 'undefined') inPlace = false;\n\n    var result = values;\n    if (!inPlace)\n        result = [].concat(values);\n\n    var theMean = exports.mean(result), l = result.length;\n    for (var i = 0; i < l; i++)\n        result[i] -= theMean;\n};\n\nexports.standardize = function standardize(values, standardDev, inPlace) {\n    if (typeof (standardDev) === 'undefined') standardDev = exports.standardDeviation(values);\n    if (typeof (inPlace) === 'undefined') inPlace = false;\n    var l = values.length;\n    var result = inPlace ? values : new Array(l);\n    for (var i = 0; i < l; i++)\n        result[i] = values[i] / standardDev;\n    return result;\n};\n\nexports.cumulativeSum = function cumulativeSum(array) {\n    var l = array.length;\n    var result = new Array(l);\n    result[0] = array[0];\n    for (var i = 1; i < l; i++)\n        result[i] = result[i - 1] + array[i];\n    return result;\n};\n","import getZones from './getZones';\n\n/**\n * Filter an array x/y based on various criteria\n * x points are expected to be sorted\n *\n * @param {object} points\n * @param {object} [options={}]\n * @param {array} [options.from]\n * @param {array} [options.to]\n * @param {array} [options.exclusions=[]]\n * @return {{x: Array<number>, y: Array<number>}}\n */\n\nexport default function filterX(points, options = {}) {\n  const { x, y } = points;\n  const { from = x[0], to = x[x.length - 1], exclusions = [] } = options;\n\n  let zones = getZones(from, to, exclusions);\n\n\n  let currentZoneIndex = 0;\n  let newX = [];\n  let newY = [];\n  let position = 0;\n  while (position < x.length) {\n    if (\n      x[position] <= zones[currentZoneIndex].to &&\n      x[position] >= zones[currentZoneIndex].from\n    ) {\n      newX.push(x[position]);\n      newY.push(y[position]);\n    } else {\n      if (x[position] > zones[currentZoneIndex].to) {\n        currentZoneIndex++;\n        if (!zones[currentZoneIndex]) break;\n      }\n    }\n    position++;\n  }\n\n  return {\n    x: newX,\n    y: newY\n  };\n}\n","export default function getZones(from, to, exclusions = []) {\n  if (from > to) {\n    [from, to] = [to, from];\n  }\n\n  // in exclusions from and to have to be defined\n  exclusions = exclusions.filter(\n    (exclusion) => exclusion.from !== undefined && exclusion.to !== undefined\n  );\n\n  exclusions = JSON.parse(JSON.stringify(exclusions));\n  // we ensure that from before to\n  exclusions.forEach((exclusion) => {\n    if (exclusion.from > exclusion.to) {\n      [exclusion.to, exclusion.from] = [exclusion.from, exclusion.to];\n    }\n  });\n\n  exclusions.sort((a, b) => a.from - b.from);\n\n  // we will rework the exclusions in order to remove overlap and outside range (from / to)\n  exclusions.forEach((exclusion) => {\n    if (exclusion.from < from) exclusion.from = from;\n    if (exclusion.to > to) exclusion.to = to;\n  });\n  for (let i = 0; i < exclusions.length - 1; i++) {\n    if (exclusions[i].to > exclusions[i + 1].from) {\n      exclusions[i].to = exclusions[i + 1].from;\n    }\n  }\n  exclusions = exclusions.filter((exclusion) => exclusion.from < exclusion.to);\n\n  if (!exclusions || exclusions.length === 0) {\n    return [{ from, to }];\n  }\n\n  let zones = [];\n  let currentFrom = from;\n  for (let exclusion of exclusions) {\n    if (currentFrom < exclusion.from) {\n      zones.push({\n        from: currentFrom,\n        to: exclusion.from\n      });\n    }\n\n    currentFrom = exclusion.to;\n  }\n  if (currentFrom < to) {\n    zones.push({\n      from: currentFrom,\n      to: to\n    });\n  }\n\n  return zones;\n}\n","'use strict';\n\nconst toString = Object.prototype.toString;\n\nfunction isAnyArray(object) {\n  return toString.call(object).endsWith('Array]');\n}\n\nmodule.exports = isAnyArray;\n","import isArray from 'is-any-array';\n\nfunction _typeof(obj) {\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function (obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function (obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\n/**\n * Fill an array with sequential numbers\n * @param {Array<number>} [input] - optional destination array (if not provided a new array will be created)\n * @param {object} [options={}]\n * @param {number} [options.from=0] - first value in the array\n * @param {number} [options.to=10] - last value in the array\n * @param {number} [options.size=input.length] - size of the array (if not provided calculated from step)\n * @param {number} [options.step] - if not provided calculated from size\n * @return {Array<number>}\n */\n\nfunction sequentialFill() {\n  var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (_typeof(input) === 'object' && !isArray(input)) {\n    options = input;\n    input = [];\n  }\n\n  if (!isArray(input)) {\n    throw new TypeError('input must be an array');\n  }\n\n  var _options = options,\n      _options$from = _options.from,\n      from = _options$from === void 0 ? 0 : _options$from,\n      _options$to = _options.to,\n      to = _options$to === void 0 ? 10 : _options$to,\n      _options$size = _options.size,\n      size = _options$size === void 0 ? input.length : _options$size,\n      step = _options.step;\n\n  if (size && step) {\n    throw new Error('step is defined by the array size');\n  }\n\n  if (!size) {\n    if (step) {\n      size = Math.floor((to - from) / step) + 1;\n    } else {\n      size = to - from + 1;\n    }\n  }\n\n  if (!step && size) {\n    step = (to - from) / (size - 1);\n  }\n\n  if (Array.isArray(input)) {\n    input.length = 0; // only works with normal array\n\n    for (var i = 0; i < size; i++) {\n      input.push(from);\n      from += step;\n    }\n  } else {\n    if (input.length !== size) {\n      throw new Error('sequentialFill typed array must have the correct length');\n    }\n\n    for (var _i = 0; _i < size; _i++) {\n      input[_i] = from;\n      from += step;\n    }\n  }\n\n  return input;\n}\n\nexport default sequentialFill;\n","/**\n * Normalize an array of zones:\n * - ensure than from < to\n * - merge overlapping zones\n *\n * The method will always check if from if lower than to and will swap if required.\n * @param {Array} [zones=[]]\n * @param {object} [options={}]\n * @param {number} [options.from=Number.NEGATIVE_INFINITY] Specify min value of a zone\n * @param {number} [options.to=Number.POSITIVE_INFINITY] Specify max value of a zone\n */\n\nexport function normalize(zones = [], options = {}) {\n  if (zones.length === 0) return [];\n  let {\n    from = Number.NEGATIVE_INFINITY,\n    to = Number.POSITIVE_INFINITY,\n  } = options;\n  if (from > to) [from, to] = [to, from];\n\n  zones = JSON.parse(JSON.stringify(zones)).map((zone) =>\n    zone.from > zone.to ? { from: zone.to, to: zone.from } : zone,\n  );\n  zones = zones.sort((a, b) => {\n    if (a.from !== b.from) return a.from - b.from;\n    return a.to - b.to;\n  });\n\n  zones.forEach((zone) => {\n    if (from > zone.from) zone.from = from;\n    if (to < zone.to) zone.to = to;\n  });\n\n  zones = zones.filter((zone) => zone.from <= zone.to);\n  if (zones.length === 0) return [];\n\n  let currentZone = zones[0];\n  let result = [currentZone];\n  for (let i = 1; i < zones.length; i++) {\n    let zone = zones[i];\n    if (zone.from <= currentZone.to) {\n      currentZone.to = zone.to;\n    } else {\n      currentZone = zone;\n      result.push(currentZone);\n    }\n  }\n  return result;\n}\n","/**\n * Function that calculates the integral of the line between two\n * x-coordinates, given the slope and intercept of the line.\n * @param {number} x0\n * @param {number} x1\n * @param {number} slope\n * @param {number} intercept\n * @return {number} integral value.\n */\nexport default function integral(x0, x1, slope, intercept) {\n  return (\n    0.5 * slope * x1 * x1 +\n    intercept * x1 -\n    (0.5 * slope * x0 * x0 + intercept * x0)\n  );\n}\n","import sequentialFill from 'ml-array-sequential-fill';\nimport { zonesWithPoints, invert } from 'ml-zones';\n\nimport equallySpacedSmooth from './equallySpacedSmooth';\nimport equallySpacedSlot from './equallySpacedSlot';\n\n/**\n * Function that returns a Number array of equally spaced numberOfPoints\n * containing a representation of intensities of the spectra arguments x\n * and y.\n *\n * The options parameter contains an object in the following form:\n * from: starting point\n * to: last point\n * numberOfPoints: number of points between from and to\n * variant: \"slot\" or \"smooth\" - smooth is the default option\n *\n * The slot variant consist that each point in the new array is calculated\n * averaging the existing points between the slot that belongs to the current\n * value. The smooth variant is the same but takes the integral of the range\n * of the slot and divide by the step size between two points in the new array.\n *\n * If exclusions zone are present, zones are ignored !\n * @param {object} [arrayXY={}] - object containing 2 properties x and y (both an array)\n * @param {object} [options={}]\n * @param {number} [options.from=x[0]]\n * @param {number} [options.to=x[x.length-1]]\n * @param {string} [options.variant='smooth']\n * @param {number} [options.numberOfPoints=100]\n * @param {Array} [options.exclusions=[]] array of from / to that should be skipped for the generation of the points\n * @param {Array} [options.zones=[]] array of from / to that should be kept\n * @return {object<x: Array, y:Array>} new object with x / y array with the equally spaced data.\n */\n\nexport default function equallySpaced(arrayXY = {}, options = {}) {\n  let { x, y } = arrayXY;\n  let xLength = x.length;\n  let reverse = false;\n  if (x.length > 1 && x[0] > x[1]) {\n    x = x.slice().reverse();\n    y = y.slice().reverse();\n    reverse = true;\n  }\n\n  let {\n    from = x[0],\n    to = x[xLength - 1],\n    variant = 'smooth',\n    numberOfPoints = 100,\n    exclusions = [],\n    zones = [],\n  } = options;\n\n  if (xLength !== y.length) {\n    throw new RangeError(\"the x and y vector doesn't have the same size.\");\n  }\n\n  if (typeof from !== 'number' || isNaN(from)) {\n    throw new RangeError(\"'from' option must be a number\");\n  }\n\n  if (typeof to !== 'number' || isNaN(to)) {\n    throw new RangeError(\"'to' option must be a number\");\n  }\n\n  if (typeof numberOfPoints !== 'number' || isNaN(numberOfPoints)) {\n    throw new RangeError(\"'numberOfPoints' option must be a number\");\n  }\n\n  if (numberOfPoints < 2) {\n    throw new RangeError(\"'numberOfPoints' option must be greater than 1\");\n  }\n\n  if (zones.length === 0) {\n    zones = invert(exclusions, { from, to });\n  }\n\n  zones = zonesWithPoints(zones, numberOfPoints, { from, to });\n\n  let xResult = [];\n  let yResult = [];\n  for (let zone of zones) {\n    let zoneResult = processZone(\n      x,\n      y,\n      zone.from,\n      zone.to,\n      zone.numberOfPoints,\n      variant,\n      reverse,\n    );\n\n    xResult = xResult.concat(zoneResult.x);\n    yResult = yResult.concat(zoneResult.y);\n  }\n  if (reverse) {\n    if (from < to) {\n      return { x: xResult.reverse(), y: yResult.reverse() };\n    } else {\n      return { x: xResult, y: yResult };\n    }\n  } else {\n    if (from < to) {\n      return { x: xResult, y: yResult };\n    } else {\n      return { x: xResult.reverse(), y: yResult.reverse() };\n    }\n  }\n}\n\nfunction processZone(x, y, from, to, numberOfPoints, variant) {\n  if (numberOfPoints < 1) {\n    throw new RangeError('the number of points must be at least 1');\n  }\n\n  let output =\n    variant === 'slot'\n      ? equallySpacedSlot(x, y, from, to, numberOfPoints)\n      : equallySpacedSmooth(x, y, from, to, numberOfPoints);\n\n  return {\n    x: sequentialFill({\n      from,\n      to,\n      size: numberOfPoints,\n    }),\n    y: output,\n  };\n}\n","import { normalize } from './normalize';\n\n/**\n * Convert an array of exclusions and keep only from / to\n *\n * The method will always check if from if lower than to and will swap if required.\n * @param {Array} [exclusions=[]]\n * @param {object} [options={}]\n * @param {number} [options.from=Number.NEGATIVE_INFINITY] Specify min value of zones (after inversion)\n * @param {number} [options.to=Number.POSITIVE_INFINITY] Specify max value of zones (after inversion)\n */\n\nexport function invert(exclusions = [], options = {}) {\n  let {\n    from = Number.NEGATIVE_INFINITY,\n    to = Number.POSITIVE_INFINITY,\n  } = options;\n  if (from > to) [from, to] = [to, from];\n\n  exclusions = normalize(exclusions, { from, to });\n  if (exclusions.length === 0) return [{ from, to }];\n\n  let zones = [];\n  for (let i = 0; i < exclusions.length; i++) {\n    let exclusion = exclusions[i];\n    let nextExclusion = exclusions[i + 1];\n    if (i === 0) {\n      if (exclusion.from > from) {\n        zones.push({ from, to: exclusion.from });\n      }\n    }\n    if (i === exclusions.length - 1) {\n      if (exclusion.to < to) {\n        zones.push({ from: exclusion.to, to });\n      }\n    } else {\n      zones.push({ from: exclusion.to, to: nextExclusion.from });\n    }\n  }\n\n  return zones;\n}\n","import { normalize } from './normalize';\n\n/**\n * Add the number of points per zone to reach a specified total\n * @param {Array} [zones=[]]\n * @param {number} [numberOfPoints] Total number of points to distribute between zones\n * @param {object} [options={}]\n * @param {number} [options.from=Number.NEGATIVE_INFINITY] Specify min value of a zone\n * @param {number} [options.to=Number.POSITIVE_INFINITY] Specify max value of a zone\n */\n\nexport function zonesWithPoints(zones, numberOfPoints, options = {}) {\n  if (zones.length === 0) return zones;\n  zones = normalize(zones, options);\n\n  const totalSize = zones.reduce((previous, current) => {\n    return previous + (current.to - current.from);\n  }, 0);\n\n  let unitsPerPoint = totalSize / numberOfPoints;\n  let currentTotal = 0;\n  for (let i = 0; i < zones.length - 1; i++) {\n    let zone = zones[i];\n    zone.numberOfPoints = Math.min(\n      Math.round((zone.to - zone.from) / unitsPerPoint),\n      numberOfPoints - currentTotal,\n    );\n    currentTotal += zone.numberOfPoints;\n  }\n\n  zones[zones.length - 1].numberOfPoints = numberOfPoints - currentTotal;\n\n  return zones;\n}\n","/**\n * function that retrieves the getEquallySpacedData with the variant \"slot\"\n *\n * @param {Array<number>} x\n * @param {Array<number>} y\n * @param {number} from - Initial point\n * @param {number} to - Final point\n * @param {number} numberOfPoints\n * @return {Array} - Array of y's equally spaced with the variant \"slot\"\n */\nexport default function equallySpacedSlot(x, y, from, to, numberOfPoints) {\n  let xLength = x.length;\n\n  let step = (to - from) / (numberOfPoints - 1);\n  let halfStep = step / 2;\n  let lastStep = x[x.length - 1] - x[x.length - 2];\n\n  let start = from - halfStep;\n  let output = new Array(numberOfPoints);\n\n  // Init main variables\n  let min = start;\n  let max = start + step;\n\n  let previousX = -Number.MAX_VALUE;\n  let previousY = 0;\n  let nextX = x[0];\n  let nextY = y[0];\n  let frontOutsideSpectra = 0;\n  let backOutsideSpectra = true;\n\n  let currentValue = 0;\n\n  // for slot algorithm\n  let currentPoints = 0;\n\n  let i = 1; // index of input\n  let j = 0; // index of output\n\n  main: while (true) {\n    if (previousX >= nextX) throw new Error('x must be an increasing serie');\n    while (previousX - max > 0) {\n      // no overlap with original point, just consume current value\n      if (backOutsideSpectra) {\n        currentPoints++;\n        backOutsideSpectra = false;\n      }\n\n      output[j] = currentPoints <= 0 ? 0 : currentValue / currentPoints;\n      j++;\n\n      if (j === numberOfPoints) {\n        break main;\n      }\n\n      min = max;\n      max += step;\n      currentValue = 0;\n      currentPoints = 0;\n    }\n\n    if (previousX > min) {\n      currentValue += previousY;\n      currentPoints++;\n    }\n\n    if (previousX === -Number.MAX_VALUE || frontOutsideSpectra > 1) {\n      currentPoints--;\n    }\n\n    previousX = nextX;\n    previousY = nextY;\n\n    if (i < xLength) {\n      nextX = x[i];\n      nextY = y[i];\n      i++;\n    } else {\n      nextX += lastStep;\n      nextY = 0;\n      frontOutsideSpectra++;\n    }\n  }\n\n  return output;\n}\n","import integral from './integral';\n\n/**\n * function that retrieves the getEquallySpacedData with the variant \"smooth\"\n *\n * @param {Array<number>} x\n * @param {Array<number>} y\n * @param {number} from - Initial point\n * @param {number} to - Final point\n * @param {number} numberOfPoints\n * @return {Array} - Array of y's equally spaced with the variant \"smooth\"\n */\nexport default function equallySpacedSmooth(x, y, from, to, numberOfPoints) {\n  let xLength = x.length;\n\n  let step = (to - from) / (numberOfPoints - 1);\n  let halfStep = step / 2;\n\n  let output = new Array(numberOfPoints);\n\n  let initialOriginalStep = x[1] - x[0];\n  let lastOriginalStep = x[xLength - 1] - x[xLength - 2];\n\n  // Init main variables\n  let min = from - halfStep;\n  let max = from + halfStep;\n\n  let previousX = Number.MIN_VALUE;\n  let previousY = 0;\n  let nextX = x[0] - initialOriginalStep;\n  let nextY = 0;\n\n  let currentValue = 0;\n  let slope = 0;\n  let intercept = 0;\n  let sumAtMin = 0;\n  let sumAtMax = 0;\n\n  let i = 0; // index of input\n  let j = 0; // index of output\n\n  function getSlope(x0, y0, x1, y1) {\n    return (y1 - y0) / (x1 - x0);\n  }\n\n  let add = 0;\n  main: while (true) {\n    if (previousX <= min && min <= nextX) {\n      add = integral(0, min - previousX, slope, previousY);\n      sumAtMin = currentValue + add;\n    }\n\n    while (nextX - max >= 0) {\n      // no overlap with original point, just consume current value\n      add = integral(0, max - previousX, slope, previousY);\n      sumAtMax = currentValue + add;\n\n      output[j++] = (sumAtMax - sumAtMin) / step;\n\n      if (j === numberOfPoints) {\n        break main;\n      }\n\n      min = max;\n      max += step;\n      sumAtMin = sumAtMax;\n    }\n\n    currentValue += integral(previousX, nextX, slope, intercept);\n\n    previousX = nextX;\n    previousY = nextY;\n\n    if (i < xLength) {\n      nextX = x[i];\n      nextY = y[i];\n      i++;\n    } else if (i === xLength) {\n      nextX += lastOriginalStep;\n      nextY = 0;\n    }\n\n    slope = getSlope(previousX, previousY, nextX, nextY);\n    intercept = -slope * previousX + previousY;\n  }\n\n  return output;\n}\n","import isArray from 'is-any-array';\n\n/**\n * Computes the maximum of the given values\n * @param {Array<number>} input\n * @return {number}\n */\n\nfunction max(input) {\n  if (!isArray(input)) {\n    throw new TypeError('input must be an array');\n  }\n\n  if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  var maxValue = input[0];\n\n  for (var i = 1; i < input.length; i++) {\n    if (input[i] > maxValue) maxValue = input[i];\n  }\n\n  return maxValue;\n}\n\nexport default max;\n","import isArray from 'is-any-array';\n\n/**\n * Computes the mean of the given values\n * @param {Array<number>} input\n * @return {number}\n */\n\nfunction sum(input) {\n  if (!isArray(input)) {\n    throw new TypeError('input must be an array');\n  }\n\n  if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  var sumValue = 0;\n\n  for (var i = 0; i < input.length; i++) {\n    sumValue += input[i];\n  }\n\n  return sumValue;\n}\n\nexport default sum;\n","const toString = Object.prototype.toString;\n\nexport default function isAnyArray(object) {\n  return toString.call(object).endsWith('Array]');\n}\n","import max from 'ml-array-max';\nimport sum from 'ml-array-sum';\nimport isArray from 'is-any-array';\n\n/**\n * Computes the norm of the given values\n * @param {Array<number>} input\n * @param {object} [options={}]\n * @param {string} [options.algorithm='absolute'] absolute, sum or max\n * @return {number}\n */\n\nfunction norm(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  var _options$algorithm = options.algorithm,\n      algorithm = _options$algorithm === void 0 ? 'absolute' : _options$algorithm;\n\n  if (!isArray(input)) {\n    throw new Error('input must be an array');\n  }\n\n  if (input.length === 0) {\n    throw new Error('input must not be empty');\n  }\n\n  switch (algorithm.toLowerCase()) {\n    case 'absolute':\n      {\n        var absoluteSumValue = absoluteSum(input);\n        if (absoluteSumValue === 0) return input.slice(0);\n        return input.map(function (element) {\n          return element / absoluteSumValue;\n        });\n      }\n\n    case 'max':\n      {\n        var maxValue = max(input);\n        if (maxValue === 0) return input.slice(0);\n        return input.map(function (element) {\n          return element / maxValue;\n        });\n      }\n\n    case 'sum':\n      {\n        var sumValue = sum(input);\n        if (sumValue === 0) return input.slice(0);\n        return input.map(function (element) {\n          return element / sumValue;\n        });\n      }\n\n    default:\n      throw new Error(\"norm: unknown algorithm: \".concat(algorithm));\n  }\n}\n\nfunction absoluteSum(input) {\n  var sumValue = 0;\n\n  for (var i = 0; i < input.length; i++) {\n    sumValue += Math.abs(input[i]);\n  }\n\n  return sumValue;\n}\n\nexport default norm;\n","import isArray from 'is-any-array';\n\n/**\n * Computes the minimum of the given values\n * @param {Array<number>} input\n * @return {number}\n */\n\nfunction min(input) {\n  if (!isArray(input)) {\n    throw new TypeError('input must be an array');\n  }\n\n  if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  var minValue = input[0];\n\n  for (var i = 1; i < input.length; i++) {\n    if (input[i] < minValue) minValue = input[i];\n  }\n\n  return minValue;\n}\n\nexport default min;\n","import max from 'ml-array-max';\nimport min from 'ml-array-min';\nimport isArray from 'is-any-array';\n\nfunction rescale(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isArray(input)) {\n    throw new TypeError('input must be an array');\n  } else if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  var output;\n\n  if (options.output !== undefined) {\n    if (!isArray(options.output)) {\n      throw new TypeError('output option must be an array if specified');\n    }\n\n    output = options.output;\n  } else {\n    output = new Array(input.length);\n  }\n\n  var currentMin = min(input);\n  var currentMax = max(input);\n\n  if (currentMin === currentMax) {\n    throw new RangeError('minimum and maximum input values are equal. Cannot rescale a constant array');\n  }\n\n  var _options$min = options.min,\n      minValue = _options$min === void 0 ? options.autoMinMax ? currentMin : 0 : _options$min,\n      _options$max = options.max,\n      maxValue = _options$max === void 0 ? options.autoMinMax ? currentMax : 1 : _options$max;\n\n  if (minValue >= maxValue) {\n    throw new RangeError('min option must be smaller than max option');\n  }\n\n  var factor = (maxValue - minValue) / (currentMax - currentMin);\n\n  for (var i = 0; i < input.length; i++) {\n    output[i] = (input[i] - currentMin) * factor + minValue;\n  }\n\n  return output;\n}\n\nexport default rescale;\n","const toString = Object.prototype.toString;\n\nexport default function isAnyArray(object) {\n  return toString.call(object).endsWith('Array]');\n}\n","import isAnyArray from 'is-any-array';\n\n/**\n * Throw an error in no an object of x,y arrays\n * @param {object} [points={}]\n */\nexport function check(points = {}) {\n  if (!isAnyArray(points.x) || !isAnyArray(points.y)) {\n    throw new Error('Points must be an object of x and y arrays');\n  }\n  if (points.x.length !== points.y.length) {\n    throw new Error('The x and y arrays mush have the same length');\n  }\n}\n","/**\n * Normalize an array of zones:\n * - ensure than from < to\n * - merge overlapping zones\n * @param {object} [zones=[]]\n * @param {object} [options={}]\n * @param {number} [options.from=Number.MIN_VALUE]\n * @param {number} [options.to=Number.MAX_VALUE]\n */\n\nexport function normalizeZones(zones = [], options = {}) {\n  if (zones.length === 0) return [];\n  zones = JSON.parse(JSON.stringify(zones)).map((zone) =>\n    zone.from > zone.to ? { from: zone.to, to: zone.from } : zone,\n  );\n  let {\n    from = Number.NEGATIVE_INFINITY,\n    to = Number.POSITIVE_INFINITY,\n  } = options;\n  if (from > to) {\n    [from, to] = [to, from];\n  }\n\n  zones = zones.sort((a, b) => {\n    if (a.from !== b.from) return a.from - b.from;\n    return a.to - b.to;\n  });\n\n  zones.forEach((zone) => {\n    if (from > zone.from) zone.from = from;\n    if (to < zone.to) zone.to = to;\n  });\n\n  zones = zones.filter((zone) => zone.from <= zone.to);\n  if (zones.length === 0) return [];\n\n  let currentZone = zones[0];\n  let result = [currentZone];\n  for (let i = 1; i < zones.length; i++) {\n    let zone = zones[i];\n    if (zone.from <= currentZone.to) {\n      currentZone.to = zone.to;\n    } else {\n      currentZone = zone;\n      result.push(currentZone);\n    }\n  }\n  return result;\n}\n","/**\n * Returns the closest index of a `target` in an ordered array\n * @param {array} array\n * @param {number} target\n */\n\nexport function findClosestIndex(array, target) {\n  let low = 0;\n  let high = array.length - 1;\n  let middle = 0;\n  while (high - low > 1) {\n    middle = low + ((high - low) >> 1);\n    if (array[middle] < target) {\n      low = middle;\n    } else if (array[middle] > target) {\n      high = middle;\n    } else {\n      return middle;\n    }\n  }\n\n  if (low < array.length - 1) {\n    if (Math.abs(target - array[low]) < Math.abs(array[low + 1] - target)) {\n      return low;\n    } else {\n      return low + 1;\n    }\n  } else {\n    return low;\n  }\n}\n","import { findClosestIndex } from './findClosestIndex';\n\n/**\n * Returns an object with {fromIndex, toIndex} for a specific from / to\n * @param {array} x\n * @param {object} [options={}]\n * @param {number} [options.from] - First value for integration in the X scale\n * @param {number} [options.fromIndex=0] - First point for integration\n * @param {number} [options.to] - Last value for integration in the X scale\n * @param {number} [options.toIndex=x.length-1] - Last point for integration\n */\n\nexport function getFromToIndex(x, options = {}) {\n  let { fromIndex, toIndex, from, to } = options;\n\n  if (fromIndex === undefined) {\n    if (from !== undefined) {\n      fromIndex = findClosestIndex(x, from);\n    } else {\n      fromIndex = 0;\n    }\n  }\n  if (toIndex === undefined) {\n    if (to !== undefined) {\n      toIndex = findClosestIndex(x, to);\n    } else {\n      toIndex = x.length - 1;\n    }\n  }\n  if (fromIndex > toIndex) [fromIndex, toIndex] = [toIndex, fromIndex];\n  return { fromIndex, toIndex };\n}\n","import { findClosestIndex } from './findClosestIndex';\n\n/**\n *  Returns the targetIndex\n * @param {array} [x]\n * @param {object} [options={}]\n * @param {number} [options.target]\n * @param {number} [options.targetIndex=0]\n * @param {number}\n */\n\nexport function getTargetIndex(x, options = {}) {\n  let { target, targetIndex } = options;\n  if (targetIndex === undefined) {\n    if (target !== undefined) {\n      return findClosestIndex(x, target);\n    } else {\n      return 0;\n    }\n  }\n  return targetIndex;\n}\n","import { check } from './check';\nimport { extract } from './extract';\nimport { integration } from './integration';\nimport { integral } from './integral';\nimport { maxY } from './maxY';\nimport { maxYPoint } from './maxYPoint';\nimport { minYPoint } from './minYPoint';\nimport { reduce } from './reduce';\nimport { growingX } from './growingX';\nimport { minClosestYPoint } from './minClosestYPoint';\nimport { maxClosestYPoint } from './maxClosestYPoint';\nimport { realMinYPoint } from './realMinYPoint';\nimport { realMaxYPoint } from './realMaxYPoint';\nimport { maximaY } from './maximaY';\nimport { minimaY } from './minimaY';\nimport { peakInfo } from './peakInfo';\nimport { toXYObject } from './toXYObject';\n\nexport const XY = {\n  check,\n  extract,\n  integral,\n  integration,\n  maxY,\n  maximaY,\n  maxYPoint,\n  minimaY,\n  minYPoint,\n  reduce,\n  growingX,\n  minClosestYPoint,\n  maxClosestYPoint,\n  realMaxYPoint,\n  realMinYPoint,\n  peakInfo,\n  toXYObject,\n};\n","import { normalizeZones } from '../util/normalizeZones';\n\nimport { check } from './check';\n\n/**\n * Extract zones from a XY data\n * @param {object} [points={}] - Object of points contains property x (an ordered increasing array) and y (an array)\n * @param {object} [options={}]\n * @param {Array} [options.zones=[]]\n * @return {Array} Array of points\n */\n\nexport function extract(points = {}, options = {}) {\n  check(points);\n  const { x, y } = points;\n  let { zones } = options;\n\n  zones = normalizeZones(zones);\n\n  if (!Array.isArray(zones) || zones.length === 0) return points;\n\n  let newX = [];\n  let newY = [];\n\n  let currentZone = zones[0];\n  let position = 0;\n  loop: for (let i = 0; i < x.length; i++) {\n    while (currentZone.to < x[i]) {\n      position++;\n      currentZone = zones[position];\n      if (!currentZone) {\n        i = x.length;\n        break loop;\n      }\n    }\n    if (x[i] >= currentZone.from) {\n      newX.push(x[i]);\n      newY.push(y[i]);\n    }\n  }\n  return { x: newX, y: newY };\n}\n","import { getFromToIndex } from '../x/getFromToIndex';\n\nimport { check } from './check';\n/**\n * Generate a X / Y of the integral\n * @param {object} [points={}] - Object of points contains property x (an ordered increasing array) and y (an array)\n * @param {object} [options={}]\n * @param {number} [options.from] - First value for integration in the X scale\n * @param {number} [options.fromIndex=0] - First point for integration\n * @param {number} [options.to] - Last value for integration in the X scale\n * @param {number} [options.toIndex=x.length-1] - Last point for integration\n * @param {boolean} [options.reverse=false] - Integrate from the larger value to the smallest value\n * @return {{x:[],y:[]}} An object with the integration function\n */\n\nexport function integral(points = {}, options = {}) {\n  const { reverse = false } = options;\n  check(points);\n  const { x, y } = points;\n  if (x.length < 2) return 0;\n\n  const { fromIndex, toIndex } = getFromToIndex(x, options);\n\n  let integration = 0;\n  let integral;\n  if (reverse) {\n    integral = { x: [x[toIndex]], y: [0] };\n    for (let i = toIndex; i > fromIndex; i--) {\n      integration += ((x[i] - x[i - 1]) * (y[i - 1] + y[i])) / 2;\n      integral.x.push(x[i - 1]);\n      integral.y.push(integration);\n    }\n    integral.x.reverse();\n    integral.y.reverse();\n  } else {\n    integral = { x: [x[fromIndex]], y: [0] };\n    for (let i = fromIndex; i < toIndex; i++) {\n      integration += ((x[i + 1] - x[i]) * (y[i + 1] + y[i])) / 2;\n      integral.x.push(x[i + 1]);\n      integral.y.push(integration);\n    }\n  }\n\n  return integral;\n}\n","import { getFromToIndex } from '../x/getFromToIndex';\n\nimport { check } from './check';\n\n/**\n * In place modification of the 2 arrays to make X unique and sum the Y if X has the same value\n * @param {object} [points={}] - Object of points contains property x (an ordered increasing array) and y (an array)\n * @param {object} [options={}]\n * @param {number} [options.from] - First value for integration in the X scale\n * @param {number} [options.fromIndex=0] - First point for integration\n * @param {number} [options.to] - Last value for integration in the X scale\n * @param {number} [options.toIndex=x.length-1] - Last point for integration\n * @return {number} Integration value on the specified range\n */\n\nexport function integration(points = {}, options = {}) {\n  check(points);\n  const { x, y } = points;\n  if (x.length < 2) return 0;\n  const { fromIndex, toIndex } = getFromToIndex(x, options);\n  let integration = 0;\n  for (let i = fromIndex; i < toIndex; i++) {\n    integration += ((x[i + 1] - x[i]) * (y[i + 1] + y[i])) / 2;\n  }\n\n  return integration;\n}\n","import { getFromToIndex } from '../x/getFromToIndex';\n\nimport { check } from './check';\n/**\n * Finds the max value in a zone\n * @param {object} [points={}] - Object of points contains property x (an ordered increasing array) and y (an array)\n * @param {object} [options={}]\n * @param {number} [options.from] - First value for integration in the X scale\n * @param {number} [options.fromIndex=0] - First point for integration\n * @param {number} [options.to] - Last value for integration in the X scale\n * @param {number} [options.toIndex=x.length-1] - Last point for integration\n * @return {number} Max y on the specified range\n */\n\nexport function maxY(points = {}, options = {}) {\n  check(points);\n  const { x, y } = points;\n  if (x.length < 2) return 0;\n\n  const { fromIndex, toIndex } = getFromToIndex(x, options);\n\n  let maxY = y[fromIndex];\n  for (let i = fromIndex; i <= toIndex; i++) {\n    if (y[i] > maxY) maxY = y[i];\n  }\n\n  return maxY;\n}\n","import { check } from './check';\n/**\n * Finds all the max values\n * If the values are equal the middle\n * of the equal part will be the position of the signal!\n *\n * @param {object} [points={}] - Object of points contains property x (an ordered increasing array) and y (an array)\n * @return {Array} Array of points\n */\n\nexport function maximaY(points = {}) {\n  check(points);\n  const { x, y } = points;\n  if (x.length < 3) return [];\n  let maxima = [];\n  let startEqualIndex = -1;\n  for (let i = 1; i < x.length - 1; i++) {\n    if (y[i - 1] < y[i] && y[i + 1] < y[i]) {\n      maxima.push({ x: x[i], y: y[i], index: i });\n    } else if (y[i - 1] < y[i] && y[i + 1] === y[i]) {\n      startEqualIndex = i;\n    } else if (y[i - 1] === y[i] && y[i + 1] < y[i]) {\n      let index = ((i + startEqualIndex) / 2) >> 0;\n      maxima.push({ x: x[index], y: y[index], index });\n    }\n  }\n  return maxima;\n}\n","import { getFromToIndex } from '../x/getFromToIndex';\n\nimport { check } from './check';\n/**\n * Finds the max y value in a range and return a {x,y} point\n * @param {object} [points={}] - Object of points contains property x (an ordered increasing array) and y (an array)\n * @param {object} [options={}]\n * @param {number} [options.from] - First value for integration in the X scale\n * @param {number} [options.fromIndex=0] - First point for integration\n * @param {number} [options.to] - Last value for integration in the X scale\n * @param {number} [options.toIndex=x.length-1] - Last point for integration\n * @return {object}\n */\n\nexport function maxYPoint(points = {}, options = {}) {\n  check(points);\n  const { x, y } = points;\n  if (x.length < 2) return 0;\n\n  const { fromIndex, toIndex } = getFromToIndex(x, options);\n\n  let current = { x: x[fromIndex], y: y[fromIndex], index: fromIndex };\n  for (let i = fromIndex; i <= toIndex; i++) {\n    if (y[i] > current.y) current = { x: x[i], y: y[i], index: i };\n  }\n\n  return current;\n}\n","import { check } from './check';\n/**\n * Finds all the min values\n * If the values are equal the middle\n * of the equal part will be the position of the signal!\n *\n * @param {object} [points={}] - Object of points contains property x (an ordered increasing array) and y (an array)\n * @return {Array} Array of points\n */\n\nexport function minimaY(points = {}) {\n  check(points);\n  const { x, y } = points;\n  if (x.length < 3) return [];\n  let maxima = [];\n  let startEqualIndex = -1;\n  for (let i = 1; i < x.length - 1; i++) {\n    if (y[i - 1] > y[i] && y[i + 1] > y[i]) {\n      maxima.push({ x: x[i], y: y[i], index: i });\n    } else if (y[i - 1] > y[i] && y[i + 1] === y[i]) {\n      startEqualIndex = i;\n    } else if (y[i - 1] === y[i] && y[i + 1] > y[i]) {\n      let index = ((i + startEqualIndex) / 2) >> 0;\n      maxima.push({ x: x[index], y: y[index], index });\n    }\n  }\n  return maxima;\n}\n","import { getFromToIndex } from '../x/getFromToIndex';\n\nimport { check } from './check';\n/**\n * Finds the max y value in a range and return a {x,y} point\n * @param {object} [points={}] - Object of points contains property x (an ordered increasing array) and y (an array)\n * @param {object} [options={}]\n * @param {number} [options.from] - First value for integration in the X scale\n * @param {number} [options.fromIndex=0] - First point for integration\n * @param {number} [options.to] - Last value for integration in the X scale\n * @param {number} [options.toIndex=x.length-1] - Last point for integration\n * @return {object}\n */\n\nexport function minYPoint(points = {}, options = {}) {\n  check(points);\n  const { x, y } = points;\n  if (x.length < 2) return 0;\n\n  const { fromIndex, toIndex } = getFromToIndex(x, options);\n\n  let current = { x: x[fromIndex], y: y[fromIndex], index: fromIndex };\n  for (let i = fromIndex; i <= toIndex; i++) {\n    if (y[i] < current.y) current = { x: x[i], y: y[i], index: i };\n  }\n\n  return current;\n}\n","import { findClosestIndex } from '../x/findClosestIndex';\nimport { normalizeZones } from '../util/normalizeZones';\n\nimport { check } from './check';\n/**\n * Reduce the number of points while keeping visually the same noise. Practical to\n * display many spectra as SVG.\n * SHOULD NOT BE USED FOR DATA PROCESSING !!!\n * You should rather use ml-xy-equally-spaced to make further processing\n * @param {object} [points={}] - Object of points contains property x (an ordered increasing array) and y (an array)\n * @param {object} [options={}]\n * @param {number} [options.from=x[0]]\n * @param {number} [options.to=x[x.length-1]]\n * @param {number} [options.nbPoints=4001] Number of points\n * @param {number} [options.zones=[]] Array of zones to keep (from/to object)\n * @param {number} [options.optimize=false] If optimize we may have less than nbPoints at the end\n */\n\nexport function reduce(points, options = {}) {\n  check(points);\n  const { x, y } = points;\n  let {\n    from = x[0],\n    to = x[x.length - 1],\n    nbPoints = 4001,\n    optimize = false,\n    zones = [],\n  } = options;\n\n  zones = normalizeZones(zones, { from, to });\n  if (zones.length === 0) zones = [{ from, to }]; // we take everything\n\n  // for each zone we should know the first index, the last index and the number of points\n\n  let totalPoints = 0;\n  for (let zone of zones) {\n    zone.fromIndex = findClosestIndex(x, zone.from);\n    zone.toIndex = findClosestIndex(x, zone.to);\n    if (zone.fromIndex > 0 && x[zone.fromIndex] > zone.from) {\n      zone.fromIndex--;\n    }\n    if (zone.toIndex < x.length - 1 && x[zone.toIndex] < zone.to) {\n      zone.toIndex++;\n    }\n\n    zone.nbPoints = zone.toIndex - zone.fromIndex + 1;\n    totalPoints += zone.nbPoints;\n  }\n  // we calculate the number of points per zone that we should keep\n  if (totalPoints > nbPoints) {\n    // need to reduce number of points\n    let ratio = nbPoints / totalPoints;\n    let currentTotal = 0;\n    for (let i = 0; i < zones.length - 1; i++) {\n      const zone = zones[i];\n      zone.nbPoints = Math.round(zone.nbPoints * ratio);\n      currentTotal += zone.nbPoints;\n    }\n    zones[zones.length - 1].nbPoints = nbPoints - currentTotal;\n  } else {\n    let newX = new Float64Array(totalPoints);\n    let newY = new Float64Array(totalPoints);\n    let index = 0;\n    for (let zone of zones) {\n      for (let i = zone.fromIndex; i < zone.toIndex + 1; i++) {\n        newX[index] = x[i];\n        newY[index] = y[i];\n        index++;\n      }\n    }\n    return {\n      x: newX,\n      y: newY,\n    };\n  }\n\n  let newX = [];\n  let newY = [];\n  for (let zone of zones) {\n    if (!zone.nbPoints) continue;\n    appendFromTo(zone.fromIndex, zone.toIndex, zone.nbPoints);\n  }\n  return { x: newX, y: newY };\n\n  function appendFromTo(fromIndex, toIndex, zoneNbPoints) {\n    if (zoneNbPoints === 1) {\n      newX.push(x[Math.round((toIndex - fromIndex) / 2)]);\n      newY.push(y[Math.round((toIndex - fromIndex) / 2)]);\n      return;\n    }\n    if (zoneNbPoints === 2) {\n      newX.push(x[fromIndex], x[toIndex]);\n      newY.push(y[fromIndex], y[toIndex]);\n      return;\n    }\n    newX.push(x[fromIndex]);\n    newY.push(y[fromIndex]);\n    let minY = Number.MAX_VALUE;\n    let maxY = Number.MIN_VALUE;\n    if (zoneNbPoints % 2 === 0) {\n      zoneNbPoints = zoneNbPoints / 2 + 1;\n    } else {\n      zoneNbPoints = (zoneNbPoints - 1) / 2 + 1;\n    }\n\n    // we will need to make some kind of min / max because there are too many points\n    // we will always keep the first point and the last point\n    let slot = (x[toIndex] - x[fromIndex]) / (zoneNbPoints - 1);\n    let currentX = x[fromIndex] + slot;\n    let first = true;\n    for (let i = fromIndex + 1; i <= toIndex; i++) {\n      if (first) {\n        minY = y[i];\n        maxY = y[i];\n        first = false;\n      } else {\n        if (y[i] < minY) minY = y[i];\n        if (y[i] > maxY) maxY = y[i];\n      }\n      if (x[i] >= currentX || i === toIndex) {\n        if (optimize) {\n          if (minY > newY[newX.length - 1]) {\n            // we can skip the intermediate value\n          } else if (maxY < newY[newX.length - 1]) {\n            // we can skip the intermediate value\n            maxY = minY;\n          } else {\n            newX.push(currentX - slot / 2);\n            newY.push(minY);\n          }\n        } else {\n          newX.push(currentX - slot / 2);\n          newY.push(minY);\n        }\n\n        newX.push(currentX);\n        newY.push(maxY);\n\n        currentX += slot;\n        first = true;\n      }\n    }\n  }\n}\n","/**\n * Order object of array, x has to be monotone.\n * Ensure x is growing\n * @param {object} data Object of kind {x:[], y:[]}.\n * @return {SD}\n */\n\nexport function growingX(data) {\n  const { x, y } = data;\n\n  if (x.length !== y.length) {\n    throw TypeError('sortX: length of x and y must be identical');\n  }\n\n  if (x.length < 2 || x[0] < x[1]) return data;\n\n  return {\n    x: x.slice(0).reverse(),\n    y: y.slice(0).reverse(),\n  };\n}\n","import { findClosestIndex } from '../x/findClosestIndex';\n\nimport { check } from './check';\n\n/**\n * Find the closest minimum going down hill\n * @param {object} [points={}] - Object of points contains property x (an ordered increasing array) and y (an array)\n * @param {object} [options={}]\n * @param {number} [options.target]\n * @param {number} [options.targetIndex=0]\n * @return {{x,y,xIndex}} An object with the x/y value\n */\n\nexport function minClosestYPoint(points, options = {}) {\n  check(points);\n  const { x, y } = points;\n\n  let { target, targetIndex } = options;\n\n  if (targetIndex === undefined) {\n    if (target !== undefined) {\n      targetIndex = findClosestIndex(x, target);\n    } else {\n      targetIndex = 0;\n    }\n  }\n\n  let previousIndex = Number.MIN_SAFE_INTEGER;\n  let currentIndex = targetIndex;\n\n  let minY = y[targetIndex];\n\n  while (currentIndex !== previousIndex) {\n    previousIndex = currentIndex;\n    if (currentIndex > 0 && y[currentIndex - 1] < minY) {\n      currentIndex--;\n    } else if (currentIndex < x.length - 1 && y[currentIndex + 1] < minY) {\n      currentIndex++;\n    }\n    minY = y[currentIndex];\n  }\n  return {\n    x: x[currentIndex],\n    y: y[currentIndex],\n    index: currentIndex,\n  };\n}\n","import { findClosestIndex } from '../x/findClosestIndex';\n\nimport { check } from './check';\n\n/**\n * Find the closest maximum going up hill\n * @param {object} [points={}] - Object of points contains property x (an ordered increasing array) and y (an array)\n * @param {object} [options={}]\n * @param {number} [options.target]\n * @param {number} [options.targetIndex=0]\n * @return {{x,y,xIndex}} An object with the x/y value\n */\n\nexport function maxClosestYPoint(points, options = {}) {\n  check(points);\n  const { x, y } = points;\n\n  let { target, targetIndex } = options;\n\n  if (targetIndex === undefined) {\n    if (target !== undefined) {\n      targetIndex = findClosestIndex(x, target);\n    } else {\n      targetIndex = 0;\n    }\n  }\n\n  let previousIndex = Number.MIN_SAFE_INTEGER;\n  let currentIndex = targetIndex;\n\n  let maxY = y[targetIndex];\n\n  while (currentIndex !== previousIndex) {\n    previousIndex = currentIndex;\n    if (currentIndex > 0 && y[currentIndex - 1] > maxY) {\n      currentIndex--;\n    } else if (currentIndex < x.length - 1 && y[currentIndex + 1] > maxY) {\n      currentIndex++;\n    }\n    maxY = y[currentIndex];\n  }\n  return {\n    x: x[currentIndex],\n    y: y[currentIndex],\n    index: currentIndex,\n  };\n}\n","import { getTargetIndex } from '../x/getTargetIndex';\n\nimport { check } from './check';\n/**\n * Find the closest minimum going down hill\n * @param {object} [points={}] - Object of points contains property x (an ordered increasing array) and y (an array)\n * @param {object} [options={}]\n * @param {number} [options.target]\n * @param {number} [options.targetIndex=0]\n * @return {{x,y,xIndex}} An object with the x/y value\n */\n\nexport function realMaxYPoint(points, options = {}) {\n  check(points);\n  const { x, y } = points;\n  const targetIndex = getTargetIndex(x, options);\n  // interpolation to a sin() function\n  if (\n    y[targetIndex - 1] > 0 &&\n    y[targetIndex + 1] > 0 &&\n    y[targetIndex] >= y[targetIndex - 1] &&\n    y[targetIndex] >= y[targetIndex + 1]\n  ) {\n    let alpha = 20 * Math.log10(y[targetIndex - 1]);\n    let beta = 20 * Math.log10(y[targetIndex]);\n    let gamma = 20 * Math.log10(y[targetIndex + 1]);\n    let p = (0.5 * (alpha - gamma)) / (alpha - 2 * beta + gamma);\n    return {\n      x: x[targetIndex] + (x[targetIndex] - x[targetIndex - 1]) * p,\n      y: y[targetIndex] - 0.25 * (y[targetIndex - 1] - y[targetIndex + 1]) * p,\n      index: targetIndex,\n    };\n  } else {\n    return {\n      x: x[targetIndex],\n      y: y[targetIndex],\n      index: targetIndex,\n    };\n  }\n}\n","import { getTargetIndex } from '../x/getTargetIndex';\n\nimport { check } from './check';\n\nexport function realMinYPoint(points, options = {}) {\n  check(points);\n  const { x, y } = points;\n\n  const targetIndex = getTargetIndex(x, options);\n  // interpolation to a sin() function\n  if (\n    y[targetIndex - 1] < 0 &&\n    y[targetIndex + 1] < 0 &&\n    y[targetIndex] <= y[targetIndex - 1] &&\n    y[targetIndex] <= y[targetIndex + 1]\n  ) {\n    let alpha = 20 * Math.log10(-y[targetIndex - 1]);\n    let beta = 20 * Math.log10(-y[targetIndex]);\n    let gamma = 20 * Math.log10(-y[targetIndex + 1]);\n    let p = (0.5 * (alpha - gamma)) / (alpha - 2 * beta + gamma);\n    return {\n      x: x[targetIndex] + (x[targetIndex] - x[targetIndex - 1]) * p,\n      y: y[targetIndex] - 0.25 * (y[targetIndex - 1] - y[targetIndex + 1]) * p,\n      index: targetIndex,\n    };\n  } else {\n    return {\n      x: x[targetIndex],\n      y: y[targetIndex],\n      index: targetIndex,\n    };\n  }\n}\n","import { findClosestIndex } from '../x/findClosestIndex';\n\nimport { check } from './check';\n\n/**\n * Returns an information about a signal\n *\n * We expect ordered data and equidistant X axis\n * You can use the method helper if required:\n * ML.ArrayXY.uniqueX\n * ML.ArrayXY.sortX\n * ML.ArrayXY.equallySpaced\n *\n * @param {object} [points={}] - Object of points contains property x (an ordered increasing array) and y (an array)\n * @param {object} [options={}]\n * @param {number} [options.target]\n * @param {number} [options.targetIndex]\n * @return {object} Information about signal\n */\n\nexport function peakInfo(points = {}, options = {}) {\n  check(points);\n  const { x, y } = points;\n  if (x.length < 3) return undefined;\n  let { targetIndex, target } = options;\n  if (targetIndex === undefined) {\n    if (target !== undefined) {\n      targetIndex = findClosestIndex(x, target);\n    }\n  }\n\n  if (targetIndex === undefined) {\n    throw new Error('peakInfo: need to specify target or targetIndex');\n  }\n\n  let i = targetIndex;\n  let currentDiff = y[i] - y[i + 1];\n\n  let multiplier = currentDiff < 0 ? -1 : 1;\n  currentDiff *= multiplier;\n  while (i < x.length - 1) {\n    i++;\n    let newDiff = (y[i] - y[i + 1]) * multiplier;\n    if (newDiff < currentDiff) break;\n    currentDiff = newDiff;\n  }\n  let after = { x: x[i], y: y[i] };\n\n  i = targetIndex;\n  currentDiff = (y[i] - y[i - 1]) * multiplier;\n  while (i > 1) {\n    i--;\n    let newDiff = (y[i] - y[i - 1]) * multiplier;\n    if (newDiff < currentDiff) break;\n    currentDiff = newDiff;\n  }\n  let before = { x: x[i], y: y[i] };\n\n  return {\n    inflectionBefore: before,\n    inflectionAfter: after,\n    extrema: { x: x[targetIndex], y: y[targetIndex] },\n    inflectionMiddle: {\n      x: (before.x + after.x) / 2,\n      y: (before.y + after.y) / 2,\n    },\n    width: Math.abs(before.x - after.x),\n  };\n}\n","import { check } from './check';\n\n/**\n *\n * @param {array} [data] array of points {x,y}\n */\nexport function toXYObject(points) {\n  check(points);\n  const { x, y } = points;\n  let data = [];\n  for (let i = 0; i < x.length; i++) {\n    data.push({ x: x[i], y: y[i] });\n  }\n  return data;\n}\n","/**\n\n/**\n * This function multiply the first array by the second array or a constant value to each element of the first array\n * @param {Array} array1 - the array that will be rotated\n * @param {Array|Number} array2\n * @return {Float64Array}\n */\nexport function multiply(array1, array2) {\n  let isConstant = false;\n  let constant;\n  if (Array.isArray(array2)) {\n    if (array1.length !== array2.length) {\n      throw new Error('sub: size of array1 and array2 must be identical');\n    }\n  } else {\n    isConstant = true;\n    constant = Number(array2);\n  }\n\n  let array3 = new Float64Array(array1.length);\n  if (isConstant) {\n    for (let i = 0; i < array1.length; i++) {\n      array3[i] = array1[i] * constant;\n    }\n  } else {\n    for (let i = 0; i < array1.length; i++) {\n      array3[i] = array1[i] * array2[i];\n    }\n  }\n\n  return array3;\n}\n","import { multiply } from './multiply';\n\nexport function dotProduct(A, B) {\n  let g = multiply(A, B);\n  let result = 0;\n  for (let i = 0; i < A.length; i++) {\n    result += g[i];\n  }\n  return result;\n}\n","import { dotProduct } from './dotProduct';\n\n/**\n * Calculates the cross-correlation between 2 vectors\n * @param {Array} [A] - fixed array\n * @param {Array} [B] - sweeping array\n * @param {object} [options={}]\n * @param {number} [options.tau = 1] - sweep increment size (in number of points, min = 1, max = A.length)\n * @param {number} [options.lag = A.length - 1] - scalar lag parameter\n */\n\nexport function crossCorrelation(A, B, options = {}) {\n  let { tau = 1, lag = A.length - 1 } = options;\n  let result = new Float64Array(1 + (2 * lag) / tau);\n  if (A.length === B.length) {\n    let n = B.length;\n    let g = new Float64Array(2 * n);\n    let q = new Float64Array(2 * n);\n    for (let i = 0; i < n; i++) {\n      q[n + i] = B[i];\n    }\n    for (let i = n * 2 - (tau - 1); i > 0; i -= tau) {\n      let k = 0;\n      for (let j = i; j < n * 2; j++) {\n        g[k] = q[j];\n        k++;\n      }\n      let w = [];\n      for (let l = 0; l < n; l++) {\n        w[l] = g[l];\n      }\n      result[(k - (n - lag)) / tau] = dotProduct(A, w);\n    }\n  }\n  return result;\n}\n","import { add } from './add';\nimport { boxPlot } from './boxPlot';\nimport { autoCorrelation } from './autoCorrelation';\nimport { crossCorrelation } from './crossCorrelation';\nimport { correlation } from './correlation';\nimport { divide } from './divide';\nimport { findClosestIndex } from './findClosestIndex';\nimport { getFromToIndex } from './getFromToIndex';\nimport { getTargetIndex } from './getTargetIndex';\nimport { multiply } from './multiply';\nimport { rotate } from './rotate';\nimport { subtract } from './subtract';\n\nexport const X = {\n  add,\n  autoCorrelation,\n  boxPlot,\n  correlation,\n  crossCorrelation,\n  divide,\n  findClosestIndex,\n  getFromToIndex,\n  getTargetIndex,\n  multiply,\n  rotate,\n  subtract,\n};\n","/**\n\n/**\n * This function add the first array by the second array or a constant value to each element of the first array\n * @param {Array} array1 - the array that will be rotated\n * @param {Array|Number} array2\n * @return {Array}\n */\nexport function add(array1, array2) {\n  let isConstant = false;\n  let constant;\n  if (Array.isArray(array2)) {\n    if (array1.length !== array2.length) {\n      throw new Error('sub: size of array1 and array2 must be identical');\n    }\n  } else {\n    isConstant = true;\n    constant = Number(array2);\n  }\n\n  let array3 = new Array(array1.length);\n  if (isConstant) {\n    for (let i = 0; i < array1.length; i++) {\n      array3[i] = array1[i] + constant;\n    }\n  } else {\n    for (let i = 0; i < array1.length; i++) {\n      array3[i] = array1[i] + array2[i];\n    }\n  }\n\n  return array3;\n}\n","import { crossCorrelation } from './crossCorrelation';\n\n/**\n * Calculates the auto-correlation of a vector\n * @param {Array} [A] - the array that will be fixed\n * @param {object} [options={}]\n * @param {number} [options.tau = 1] - sweep increment size (in number of points, min = 1, max = A.length)\n * @param {number} [options.lag = A.length - 1] - scalar lag parameter\n */\n\nexport function autoCorrelation(A, options = {}) {\n  return crossCorrelation(A, A, options);\n}\n","/**\n * This function subtract the first array by the second array or a constant value from each element of the first array\n * @param {Array} array1 - the array that will be rotated\n * @return {object}\n */\nexport function boxPlot(array) {\n  array = array.slice(0).sort((a, b) => a - b);\n  if (array.length < 5) {\n    throw Error(\n      'boxPlot: can not calculate info if array contains less than 3 elements',\n    );\n  }\n  let info = {\n    Q1: 0.0,\n    Q2: 0.0,\n    Q3: 0.0,\n    min: array[0],\n    max: array[array.length - 1],\n  };\n  let q1max, q3min;\n  if (array.length % 2 === 1) {\n    // odd\n    let middle = (array.length - 1) / 2;\n    info.Q2 = array[middle];\n    q1max = middle - 1;\n    q3min = middle + 1;\n  } else {\n    // even\n    q3min = array.length / 2;\n    q1max = q3min - 1;\n    info.Q2 = (array[q1max] + array[q3min]) / 2;\n  }\n  if (q1max % 2 === 0) {\n    info.Q1 = array[q1max / 2];\n    info.Q3 = array[(array.length + q3min - 1) / 2];\n  } else {\n    info.Q1 = (array[(q1max + 1) / 2] + array[(q1max - 1) / 2]) / 2;\n    let middleOver = (array.length + q3min) / 2;\n    info.Q3 = (array[middleOver] + array[middleOver - 1]) / 2;\n  }\n  return info;\n}\n","/**\n\n/**\n * Calculates the correlation between 2 vectors\n * https://en.wikipedia.org/wiki/Correlation_and_dependence\n *\n * @param {Array} [A] - the array that will be rotated\n * @param {Array} [B]\n * @return {Array}\n */\nexport function correlation(A, B) {\n  let n = A.length;\n  let sumA = 0;\n  let sumA2 = 0;\n  let sumB = 0;\n  let sumB2 = 0;\n  let sumAB = 0;\n  for (let i = 0; i < n; i++) {\n    let a = A[i];\n    let b = B[i];\n    sumA += a;\n    sumA2 += a ** 2;\n    sumB += b;\n    sumB2 += b ** 2;\n    sumAB += a * b;\n  }\n  return (\n    (n * sumAB - sumA * sumB) /\n    (Math.sqrt(n * sumA2 - sumA ** 2) * Math.sqrt(n * sumB2 - sumB ** 2))\n  );\n}\n","/**\n\n/**\n * This function divide the first array by the second array or a constant value to each element of the first array\n * @param {Array} array1 - the array that will be rotated\n * @param {Array|Number} array2\n * @return {Array}\n */\nexport function divide(array1, array2) {\n  let isConstant = false;\n  let constant;\n  if (Array.isArray(array2)) {\n    if (array1.length !== array2.length) {\n      throw new Error('sub: size of array1 and array2 must be identical');\n    }\n  } else {\n    isConstant = true;\n    constant = Number(array2);\n  }\n\n  let array3 = new Array(array1.length);\n  if (isConstant) {\n    for (let i = 0; i < array1.length; i++) {\n      array3[i] = array1[i] / constant;\n    }\n  } else {\n    for (let i = 0; i < array1.length; i++) {\n      array3[i] = array1[i] / array2[i];\n    }\n  }\n\n  return array3;\n}\n","/**\n * This function performs a circular shift to a new array\n * Positive values of shifts will shift to the right and negative values will do to the left\n * @example rotate([1,2,3,4],1) -> [4,1,2,3]\n * @example rotate([1,2,3,4],-1) -> [2,3,4,1]\n * @param {Array} array - the array that will be rotated\n * @param {number} shift\n * @return {Array}\n */\nexport function rotate(array, shift) {\n  shift = shift % array.length;\n  if (shift < 0) shift += array.length;\n  return array\n    .slice(array.length - shift)\n    .concat(array.slice(0, array.length - shift));\n}\n","/**\n * This function subtract the first array by the second array or a constant value from each element of the first array\n * @param {Array} array1 - the array that will be rotated\n * @param {Array|Number} array2\n * @return {Array}\n */\nexport function subtract(array1, array2) {\n  let isConstant = false;\n  let constant;\n  if (Array.isArray(array2)) {\n    if (array1.length !== array2.length) {\n      throw new Error('sub: size of array1 and array2 must be identical');\n    }\n  } else {\n    isConstant = true;\n    constant = Number(array2);\n  }\n\n  let array3 = new Array(array1.length);\n  if (isConstant) {\n    for (let i = 0; i < array1.length; i++) {\n      array3[i] = array1[i] - constant;\n    }\n  } else {\n    for (let i = 0; i < array1.length; i++) {\n      array3[i] = array1[i] - array2[i];\n    }\n  }\n\n  return array3;\n}\n","import { minMax } from 'ml-stat/array';\n\nimport { getData } from './getData';\nimport { getNormalized } from './getNormalized';\nimport { updateRangesInfo } from './updateRangesInfo';\n\n/**\n * Class allowing manipulate one IR spectrum\n * @class spectrum\n * @param {object} [json={}] - object containing a spectrum\n * @param {Array} [json.x=[]] - x values\n * @param {Array} [json.y=[]] - y values\n */\nexport class Spectrum {\n  /**\n   *\n   * @param {array} x\n   * @param {array} y\n   * @param {string} id\n   * @param {object} [options={}]\n   * @param {object} [options.meta={}]\n   * @param {object} [options.normalization]\n   * @param {object} [options.normalized]\n   */\n  constructor(x, y, id, options = {}) {\n    const { meta = {}, normalization = {}, normalized } = options;\n\n    if (x && x.length > 1 && x[0] > x[1]) {\n      this.x = x.reverse();\n      this.y = y.reverse();\n    } else {\n      this.x = x || [];\n      this.y = y || [];\n    }\n    this.id = id;\n    this.meta = meta;\n    this.normalizedBoundary = { x: { min: 0, max: 0 }, y: { min: 0, max: 0 } };\n    if (normalized) {\n      this.normalized = normalized;\n      this.updateNormalizedBoundary();\n    } else {\n      this.updateNormalization(normalization);\n    }\n\n    this.updateMemory();\n  }\n\n  get minX() {\n    return this.x[0];\n  }\n\n  get maxX() {\n    return this.x[this.x.length - 1];\n  }\n\n  updateMemory() {\n    let original = ((this.x && this.x.length) || 0) * 16;\n    let normalized = this.normalized.x.length * 16;\n    this.memory = { original, normalized, total: original + normalized };\n  }\n\n  removeOriginal() {\n    this.x = undefined;\n    this.y = undefined;\n    this.updateMemory();\n  }\n\n  getXY() {\n    if (!Array.isArray(this.x) || !Array.isArray(this.y)) {\n      throw new Error('Can not get normalized data');\n    }\n    return { x: this.x, y: this.y };\n  }\n}\n\nSpectrum.prototype.getData = function (options) {\n  return getData(this, options);\n};\n\nSpectrum.prototype.updateNormalization = function (normalization) {\n  this.normalized = getNormalized(this, normalization);\n  this.ranges = {};\n  this.updateMemory();\n  this.updateNormalizedBoundary();\n};\n\nSpectrum.prototype.updateRangesInfo = function (ranges) {\n  updateRangesInfo(this, ranges);\n};\n\nSpectrum.prototype.updateNormalizedBoundary = function () {\n  this.normalizedBoundary.x = {\n    min: this.normalized.x[0],\n    max: this.normalized.x[this.normalized.x.length - 1],\n  };\n  this.normalizedBoundary.y = minMax(this.normalized.y);\n};\n","'use strict';\n\nfunction getConverter() {\n  // the following RegExp can only be used for XYdata, some peakTables have values with a \"E-5\" ...\n  const ntuplesSeparator = /[, \\t]+/;\n  const GC_MS_FIELDS = ['TIC', '.RIC', 'SCANNUMBER'];\n\n  function convertToFloatArray(stringArray) {\n    let floatArray = [];\n    for (let i = 0; i < stringArray.length; i++) {\n      floatArray.push(parseFloat(stringArray[i]));\n    }\n    return floatArray;\n  }\n\n  class Spectrum {}\n\n  const defaultOptions = {\n    keepRecordsRegExp: /^$/,\n    canonicDataLabels: true,\n    dynamicTyping: false,\n    xy: false,\n    withoutXY: false,\n    chromatogram: false,\n    keepSpectra: false,\n    noContour: false,\n    nbContourLevels: 7,\n    noiseMultiplier: 5,\n    profiling: false,\n  };\n\n  function convert(jcamp, options) {\n    options = Object.assign({}, defaultOptions, options);\n\n    let wantXY = !options.withoutXY;\n\n    let start = Date.now();\n\n    let ntuples = {};\n    let ldr, dataValue, ldrs;\n    let position, endLine, infos;\n\n    let result = {};\n    result.profiling = options.profiling ? [] : false;\n    result.logs = [];\n    let spectra = [];\n    result.spectra = spectra;\n    result.info = {};\n    let spectrum = new Spectrum();\n\n    if (!(typeof jcamp === 'string')) {\n      throw new TypeError('the JCAMP should be a string');\n    }\n\n    if (result.profiling) {\n      result.profiling.push({\n        action: 'Before split to LDRS',\n        time: Date.now() - start,\n      });\n    }\n\n    ldrs = jcamp.split(/[\\r\\n]+##/);\n\n    if (result.profiling) {\n      result.profiling.push({\n        action: 'Split to LDRS',\n        time: Date.now() - start,\n      });\n    }\n\n    if (ldrs[0]) ldrs[0] = ldrs[0].replace(/^[\\r\\n ]*##/, '');\n\n    for (let i = 0; i < ldrs.length; i++) {\n      let dataLabel;\n      ldr = ldrs[i];\n      // This is a new LDR\n      position = ldr.indexOf('=');\n      if (position > 0) {\n        dataLabel = ldr.substring(0, position);\n        dataValue = ldr.substring(position + 1).trim();\n      } else {\n        dataLabel = ldr;\n        dataValue = '';\n      }\n      let canonicDataLabel = dataLabel.replace(/[_ -]/g, '').toUpperCase();\n\n      if (canonicDataLabel === 'DATATABLE') {\n        endLine = dataValue.indexOf('\\n');\n        if (endLine === -1) endLine = dataValue.indexOf('\\r');\n        if (endLine > 0) {\n          let xIndex = -1;\n          let yIndex = -1;\n          // ##DATA TABLE= (X++(I..I)), XYDATA\n          // We need to find the variables\n\n          infos = dataValue.substring(0, endLine).split(/[ ,;\\t]+/);\n          if (infos[0].indexOf('++') > 0) {\n            let firstVariable = infos[0].replace(\n              /.*\\(([a-zA-Z0-9]+)\\+\\+.*/,\n              '$1',\n            );\n            let secondVariable = infos[0].replace(\n              /.*\\.\\.([a-zA-Z0-9]+).*/,\n              '$1',\n            );\n            xIndex = ntuples.symbol.indexOf(firstVariable);\n            yIndex = ntuples.symbol.indexOf(secondVariable);\n          }\n\n          if (xIndex === -1) xIndex = 0;\n          if (yIndex === -1) yIndex = 0;\n\n          if (ntuples.first) {\n            if (ntuples.first.length > xIndex) {\n              spectrum.firstX = ntuples.first[xIndex];\n            }\n            if (ntuples.first.length > yIndex) {\n              spectrum.firstY = ntuples.first[yIndex];\n            }\n          }\n          if (ntuples.last) {\n            if (ntuples.last.length > xIndex) {\n              spectrum.lastX = ntuples.last[xIndex];\n            }\n            if (ntuples.last.length > yIndex) {\n              spectrum.lastY = ntuples.last[yIndex];\n            }\n          }\n          if (ntuples.vardim && ntuples.vardim.length > xIndex) {\n            spectrum.nbPoints = ntuples.vardim[xIndex];\n          }\n          if (ntuples.factor) {\n            if (ntuples.factor.length > xIndex) {\n              spectrum.xFactor = ntuples.factor[xIndex];\n            }\n            if (ntuples.factor.length > yIndex) {\n              spectrum.yFactor = ntuples.factor[yIndex];\n            }\n          }\n          if (ntuples.units) {\n            if (ntuples.units.length > xIndex) {\n              spectrum.xUnit = ntuples.units[xIndex];\n            }\n            if (ntuples.units.length > yIndex) {\n              spectrum.yUnit = ntuples.units[yIndex];\n            }\n          }\n          spectrum.datatable = infos[0];\n          if (infos[1] && infos[1].indexOf('PEAKS') > -1) {\n            canonicDataLabel = 'PEAKTABLE';\n          } else if (\n            infos[1] &&\n            (infos[1].indexOf('XYDATA') || infos[0].indexOf('++') > 0)\n          ) {\n            canonicDataLabel = 'XYDATA';\n            spectrum.deltaX =\n              (spectrum.lastX - spectrum.firstX) / (spectrum.nbPoints - 1);\n          }\n        }\n      }\n\n      if (canonicDataLabel === 'XYDATA') {\n        if (wantXY) {\n          prepareSpectrum(result, spectrum);\n          // well apparently we should still consider it is a PEAK TABLE if there are no '++' after\n          if (dataValue.match(/.*\\+\\+.*/)) {\n            // ex: (X++(Y..Y))\n            if (!spectrum.deltaX) {\n              spectrum.deltaX =\n                (spectrum.lastX - spectrum.firstX) / (spectrum.nbPoints - 1);\n            }\n            fastParseXYData(spectrum, dataValue, result);\n          } else {\n            parsePeakTable(spectrum, dataValue, result);\n          }\n          spectra.push(spectrum);\n          spectrum = new Spectrum();\n        }\n        continue;\n      } else if (canonicDataLabel === 'PEAKTABLE') {\n        if (wantXY) {\n          prepareSpectrum(result, spectrum);\n          parsePeakTable(spectrum, dataValue, result);\n          spectra.push(spectrum);\n          spectrum = new Spectrum();\n        }\n        continue;\n      }\n      if (canonicDataLabel === 'PEAKASSIGNMENTS') {\n        if (wantXY) {\n          if (dataValue.match(/.*(XYA).*/)) {\n            // ex: (XYA)\n            parseXYA(spectrum, dataValue);\n          }\n          spectra.push(spectrum);\n          spectrum = new Spectrum();\n        }\n        continue;\n      }\n\n      if (canonicDataLabel === 'TITLE') {\n        spectrum.title = dataValue;\n      } else if (canonicDataLabel === 'DATATYPE') {\n        spectrum.dataType = dataValue;\n        if (dataValue.indexOf('nD') > -1) {\n          result.twoD = true;\n        }\n      } else if (canonicDataLabel === 'NTUPLES') {\n        if (dataValue.indexOf('nD') > -1) {\n          result.twoD = true;\n        }\n      } else if (canonicDataLabel === 'XUNITS') {\n        spectrum.xUnit = dataValue;\n      } else if (canonicDataLabel === 'YUNITS') {\n        spectrum.yUnit = dataValue;\n      } else if (canonicDataLabel === 'FIRSTX') {\n        spectrum.firstX = parseFloat(dataValue);\n      } else if (canonicDataLabel === 'LASTX') {\n        spectrum.lastX = parseFloat(dataValue);\n      } else if (canonicDataLabel === 'FIRSTY') {\n        spectrum.firstY = parseFloat(dataValue);\n      } else if (canonicDataLabel === 'LASTY') {\n        spectrum.lastY = parseFloat(dataValue);\n      } else if (canonicDataLabel === 'NPOINTS') {\n        spectrum.nbPoints = parseFloat(dataValue);\n      } else if (canonicDataLabel === 'XFACTOR') {\n        spectrum.xFactor = parseFloat(dataValue);\n      } else if (canonicDataLabel === 'YFACTOR') {\n        spectrum.yFactor = parseFloat(dataValue);\n      } else if (canonicDataLabel === 'MAXX') {\n        spectrum.maxX = parseFloat(dataValue);\n      } else if (canonicDataLabel === 'MINX') {\n        spectrum.minX = parseFloat(dataValue);\n      } else if (canonicDataLabel === 'MAXY') {\n        spectrum.maxY = parseFloat(dataValue);\n      } else if (canonicDataLabel === 'MINY') {\n        spectrum.minY = parseFloat(dataValue);\n      } else if (canonicDataLabel === 'DELTAX') {\n        spectrum.deltaX = parseFloat(dataValue);\n      } else if (\n        canonicDataLabel === '.OBSERVEFREQUENCY' ||\n        canonicDataLabel === '$SFO1'\n      ) {\n        if (!spectrum.observeFrequency) {\n          spectrum.observeFrequency = parseFloat(dataValue);\n        }\n      } else if (canonicDataLabel === '.OBSERVENUCLEUS') {\n        if (!spectrum.xType) {\n          result.xType = dataValue.replace(/[^a-zA-Z0-9]/g, '');\n        }\n      } else if (canonicDataLabel === '$SFO2') {\n        if (!result.indirectFrequency) {\n          result.indirectFrequency = parseFloat(dataValue);\n        }\n      } else if (canonicDataLabel === '$OFFSET') {\n        // OFFSET for Bruker spectra\n        result.shiftOffsetNum = 0;\n        if (!spectrum.shiftOffsetVal) {\n          spectrum.shiftOffsetVal = parseFloat(dataValue);\n        }\n      } else if (canonicDataLabel === '$REFERENCEPOINT') {\n        // OFFSET for Varian spectra\n        // if we activate this part it does not work for ACD specmanager\n        //         } else if (canonicDataLabel=='.SHIFTREFERENCE') {   // OFFSET FOR Bruker Spectra\n        //                 var parts = dataValue.split(/ *, */);\n        //                 result.shiftOffsetNum = parseInt(parts[2].trim());\n        //                 spectrum.shiftOffsetVal = parseFloat(parts[3].trim());\n      } else if (canonicDataLabel === 'VARNAME') {\n        ntuples.varname = dataValue.split(ntuplesSeparator);\n      } else if (canonicDataLabel === 'SYMBOL') {\n        ntuples.symbol = dataValue.split(ntuplesSeparator);\n      } else if (canonicDataLabel === 'VARTYPE') {\n        ntuples.vartype = dataValue.split(ntuplesSeparator);\n      } else if (canonicDataLabel === 'VARFORM') {\n        ntuples.varform = dataValue.split(ntuplesSeparator);\n      } else if (canonicDataLabel === 'VARDIM') {\n        ntuples.vardim = convertToFloatArray(dataValue.split(ntuplesSeparator));\n      } else if (canonicDataLabel === 'UNITS') {\n        ntuples.units = dataValue.split(ntuplesSeparator);\n      } else if (canonicDataLabel === 'FACTOR') {\n        ntuples.factor = convertToFloatArray(dataValue.split(ntuplesSeparator));\n      } else if (canonicDataLabel === 'FIRST') {\n        ntuples.first = convertToFloatArray(dataValue.split(ntuplesSeparator));\n      } else if (canonicDataLabel === 'LAST') {\n        ntuples.last = convertToFloatArray(dataValue.split(ntuplesSeparator));\n      } else if (canonicDataLabel === 'MIN') {\n        ntuples.min = convertToFloatArray(dataValue.split(ntuplesSeparator));\n      } else if (canonicDataLabel === 'MAX') {\n        ntuples.max = convertToFloatArray(dataValue.split(ntuplesSeparator));\n      } else if (canonicDataLabel === '.NUCLEUS') {\n        if (result.twoD) {\n          result.yType = dataValue.split(ntuplesSeparator)[0];\n        }\n      } else if (canonicDataLabel === 'PAGE') {\n        spectrum.page = dataValue.trim();\n        spectrum.pageValue = parseFloat(dataValue.replace(/^.*=/, ''));\n        spectrum.pageSymbol = spectrum.page.replace(/[=].*/, '');\n        let pageSymbolIndex = ntuples.symbol.indexOf(spectrum.pageSymbol);\n        let unit = '';\n        if (ntuples.units && ntuples.units[pageSymbolIndex]) {\n          unit = ntuples.units[pageSymbolIndex];\n        }\n        if (result.indirectFrequency && unit !== 'PPM') {\n          spectrum.pageValue /= result.indirectFrequency;\n        }\n      } else if (canonicDataLabel === 'RETENTIONTIME') {\n        spectrum.pageValue = parseFloat(dataValue);\n      } else if (isMSField(canonicDataLabel)) {\n        spectrum[convertMSFieldToLabel(canonicDataLabel)] = dataValue;\n      } else if (canonicDataLabel === 'SAMPLEDESCRIPTION') {\n        spectrum.sampleDescription = dataValue;\n      }\n      if (canonicDataLabel.match(options.keepRecordsRegExp)) {\n        let label = options.canonicDataLabels ? canonicDataLabel : dataLabel;\n        let value = dataValue.trim();\n        if (options.dynamicTyping && !isNaN(value)) {\n          value = Number(value);\n        }\n        if (result.info[label]) {\n          if (!Array.isArray(result.info[label])) {\n            result.info[label] = [result.info[label]];\n          }\n          result.info[label].push(value);\n        } else {\n          result.info[label] = value;\n        }\n      }\n    }\n\n    if (result.profiling) {\n      result.profiling.push({\n        action: 'Finished parsing',\n        time: Date.now() - start,\n      });\n    }\n\n    if (Object.keys(ntuples).length > 0) {\n      let newNtuples = [];\n      let keys = Object.keys(ntuples);\n      for (let i = 0; i < keys.length; i++) {\n        let key = keys[i];\n        let values = ntuples[key];\n        for (let j = 0; j < values.length; j++) {\n          if (!newNtuples[j]) newNtuples[j] = {};\n          newNtuples[j][key] = values[j];\n        }\n      }\n      result.ntuples = newNtuples;\n    }\n\n    if (result.twoD && wantXY) {\n      add2D(result, options);\n      if (result.profiling) {\n        result.profiling.push({\n          action: 'Finished countour plot calculation',\n          time: Date.now() - start,\n        });\n      }\n      if (!options.keepSpectra) {\n        delete result.spectra;\n      }\n    }\n\n    if (options.chromatogram) {\n      options.xy = true;\n    }\n\n    if (options.xy && wantXY) {\n      // the spectraData should not be a oneD array but an object with x and y\n      if (spectra.length > 0) {\n        for (let i = 0; i < spectra.length; i++) {\n          spectrum = spectra[i];\n          if (spectrum.data.length > 0) {\n            for (let j = 0; j < spectrum.data.length; j++) {\n              let data = spectrum.data[j];\n              let newData = {\n                x: new Array(data.length / 2),\n                y: new Array(data.length / 2),\n              };\n              for (let k = 0; k < data.length; k = k + 2) {\n                newData.x[k / 2] = data[k];\n                newData.y[k / 2] = data[k + 1];\n              }\n              spectrum.data[j] = newData;\n            }\n          }\n        }\n      }\n    }\n\n    // maybe it is a GC (HPLC) / MS. In this case we add a new format\n    if (options.chromatogram) {\n      if (result.spectra.length > 1) {\n        complexChromatogram(result);\n      } else {\n        simpleChromatogram(result);\n      }\n      if (result.profiling) {\n        result.profiling.push({\n          action: 'Finished chromatogram calculation',\n          time: Date.now() - start,\n        });\n      }\n    }\n\n    if (result.profiling) {\n      result.profiling.push({\n        action: 'Total time',\n        time: Date.now() - start,\n      });\n    }\n\n    return result;\n  }\n\n  function convertMSFieldToLabel(value) {\n    return value.toLowerCase().replace(/[^a-z0-9]/g, '');\n  }\n\n  function isMSField(canonicDataLabel) {\n    return GC_MS_FIELDS.indexOf(canonicDataLabel) !== -1;\n  }\n\n  function complexChromatogram(result) {\n    let spectra = result.spectra;\n    let length = spectra.length;\n    let chromatogram = {\n      times: new Array(length),\n      series: {\n        ms: {\n          dimension: 2,\n          data: new Array(length),\n        },\n      },\n    };\n\n    let existingGCMSFields = [];\n    for (let i = 0; i < GC_MS_FIELDS.length; i++) {\n      let label = convertMSFieldToLabel(GC_MS_FIELDS[i]);\n      if (spectra[0][label]) {\n        existingGCMSFields.push(label);\n        chromatogram.series[label] = {\n          dimension: 1,\n          data: new Array(length),\n        };\n      }\n    }\n\n    for (let i = 0; i < length; i++) {\n      let spectrum = spectra[i];\n      chromatogram.times[i] = spectrum.pageValue;\n      for (let j = 0; j < existingGCMSFields.length; j++) {\n        chromatogram.series[existingGCMSFields[j]].data[i] = parseFloat(\n          spectrum[existingGCMSFields[j]],\n        );\n      }\n      if (spectrum.data) {\n        chromatogram.series.ms.data[i] = [\n          spectrum.data[0].x,\n          spectrum.data[0].y,\n        ];\n      }\n    }\n    result.chromatogram = chromatogram;\n  }\n\n  function simpleChromatogram(result) {\n    let data = result.spectra[0].data[0];\n    result.chromatogram = {\n      times: data.x.slice(),\n      series: {\n        intensity: {\n          dimension: 1,\n          data: data.y.slice(),\n        },\n      },\n    };\n  }\n\n  function prepareSpectrum(result, spectrum) {\n    if (!spectrum.xFactor) spectrum.xFactor = 1;\n    if (!spectrum.yFactor) spectrum.yFactor = 1;\n    if (spectrum.observeFrequency) {\n      if (spectrum.xUnit && spectrum.xUnit.toUpperCase() === 'HZ') {\n        spectrum.xUnit = 'PPM';\n        spectrum.xFactor = spectrum.xFactor / spectrum.observeFrequency;\n        spectrum.firstX = spectrum.firstX / spectrum.observeFrequency;\n        spectrum.lastX = spectrum.lastX / spectrum.observeFrequency;\n        spectrum.deltaX = spectrum.deltaX / spectrum.observeFrequency;\n      }\n    }\n    if (spectrum.shiftOffsetVal) {\n      let shift = spectrum.firstX - spectrum.shiftOffsetVal;\n      spectrum.firstX = spectrum.firstX - shift;\n      spectrum.lastX = spectrum.lastX - shift;\n    }\n  }\n\n  function getMedian(data) {\n    data = data.sort(compareNumbers);\n    let l = data.length;\n    return data[Math.floor(l / 2)];\n  }\n\n  function compareNumbers(a, b) {\n    return a - b;\n  }\n\n  function convertTo3DZ(spectra) {\n    let minZ = spectra[0].data[0][0];\n    let maxZ = minZ;\n    let ySize = spectra.length;\n    let xSize = spectra[0].data[0].length / 2;\n    let z = new Array(ySize);\n    for (let i = 0; i < ySize; i++) {\n      z[i] = new Array(xSize);\n      let xVector = spectra[i].data[0];\n      for (let j = 0; j < xSize; j++) {\n        let value = xVector[j * 2 + 1];\n        z[i][j] = value;\n        if (value < minZ) minZ = value;\n        if (value > maxZ) maxZ = value;\n      }\n    }\n\n    const firstX = spectra[0].data[0][0];\n    const lastX = spectra[0].data[0][spectra[0].data[0].length - 2]; // has to be -2 because it is a 1D array [x,y,x,y,...]\n    const firstY = spectra[0].pageValue;\n    const lastY = spectra[ySize - 1].pageValue;\n\n    // Because the min / max value are the only information about the matrix if we invert\n    // min and max we need to invert the array\n    if (firstX > lastX) {\n      for (let spectrum of z) {\n        spectrum.reverse();\n      }\n    }\n    if (firstY > lastY) {\n      z.reverse();\n    }\n\n    return {\n      z: z,\n      minX: Math.min(firstX, lastX),\n      maxX: Math.max(firstX, lastX),\n      minY: Math.min(firstY, lastY),\n      maxY: Math.max(firstY, lastY),\n      minZ: minZ,\n      maxZ: maxZ,\n      noise: getMedian(z[0].map(Math.abs)),\n    };\n  }\n\n  function add2D(result, options) {\n    let zData = convertTo3DZ(result.spectra);\n    if (!options.noContour) {\n      result.contourLines = generateContourLines(zData, options);\n      delete zData.z;\n    }\n    result.minMax = zData;\n  }\n\n  function generateContourLines(zData, options) {\n    let noise = zData.noise;\n    let z = zData.z;\n    let povarHeight0, povarHeight1, povarHeight2, povarHeight3;\n    let isOver0, isOver1, isOver2, isOver3;\n    let nbSubSpectra = z.length;\n    let nbPovars = z[0].length;\n    let pAx, pAy, pBx, pBy;\n\n    let x0 = zData.minX;\n    let xN = zData.maxX;\n    let dx = (xN - x0) / (nbPovars - 1);\n    let y0 = zData.minY;\n    let yN = zData.maxY;\n    let dy = (yN - y0) / (nbSubSpectra - 1);\n    let minZ = zData.minZ;\n    let maxZ = zData.maxZ;\n\n    // System.out.prvarln('y0 '+y0+' yN '+yN);\n    // -------------------------\n    // Povars attribution\n    //\n    // 0----1\n    // |  / |\n    // | /  |\n    // 2----3\n    //\n    // ---------------------d------\n\n    let iter = options.nbContourLevels * 2;\n    let contourLevels = new Array(iter);\n    let lineZValue;\n    for (let level = 0; level < iter; level++) {\n      // multiply by 2 for positif and negatif\n      let contourLevel = {};\n      contourLevels[level] = contourLevel;\n      let side = level % 2;\n      let factor =\n        (maxZ - options.noiseMultiplier * noise) *\n        Math.exp((level >> 1) - options.nbContourLevels);\n      if (side === 0) {\n        lineZValue = factor + options.noiseMultiplier * noise;\n      } else {\n        lineZValue = 0 - factor - options.noiseMultiplier * noise;\n      }\n      let lines = [];\n      contourLevel.zValue = lineZValue;\n      contourLevel.lines = lines;\n\n      if (lineZValue <= minZ || lineZValue >= maxZ) continue;\n\n      for (let iSubSpectra = 0; iSubSpectra < nbSubSpectra - 1; iSubSpectra++) {\n        let subSpectra = z[iSubSpectra];\n        let subSpectraAfter = z[iSubSpectra + 1];\n        for (let povar = 0; povar < nbPovars - 1; povar++) {\n          povarHeight0 = subSpectra[povar];\n          povarHeight1 = subSpectra[povar + 1];\n          povarHeight2 = subSpectraAfter[povar];\n          povarHeight3 = subSpectraAfter[povar + 1];\n\n          isOver0 = povarHeight0 > lineZValue;\n          isOver1 = povarHeight1 > lineZValue;\n          isOver2 = povarHeight2 > lineZValue;\n          isOver3 = povarHeight3 > lineZValue;\n\n          // Example povar0 is over the plane and povar1 and\n          // povar2 are below, we find the varersections and add\n          // the segment\n          if (isOver0 !== isOver1 && isOver0 !== isOver2) {\n            pAx =\n              povar +\n              (lineZValue - povarHeight0) / (povarHeight1 - povarHeight0);\n            pAy = iSubSpectra;\n            pBx = povar;\n            pBy =\n              iSubSpectra +\n              (lineZValue - povarHeight0) / (povarHeight2 - povarHeight0);\n            lines.push(pAx * dx + x0);\n            lines.push(pAy * dy + y0);\n            lines.push(pBx * dx + x0);\n            lines.push(pBy * dy + y0);\n          }\n          // remove push does not help !!!!\n          if (isOver3 !== isOver1 && isOver3 !== isOver2) {\n            pAx = povar + 1;\n            pAy =\n              iSubSpectra +\n              1 -\n              (lineZValue - povarHeight3) / (povarHeight1 - povarHeight3);\n            pBx =\n              povar +\n              1 -\n              (lineZValue - povarHeight3) / (povarHeight2 - povarHeight3);\n            pBy = iSubSpectra + 1;\n            lines.push(pAx * dx + x0);\n            lines.push(pAy * dy + y0);\n            lines.push(pBx * dx + x0);\n            lines.push(pBy * dy + y0);\n          }\n          // test around the diagonal\n          if (isOver1 !== isOver2) {\n            pAx =\n              (povar +\n                1 -\n                (lineZValue - povarHeight1) / (povarHeight2 - povarHeight1)) *\n                dx +\n              x0;\n            pAy =\n              (iSubSpectra +\n                (lineZValue - povarHeight1) / (povarHeight2 - povarHeight1)) *\n                dy +\n              y0;\n            if (isOver1 !== isOver0) {\n              pBx =\n                povar +\n                1 -\n                (lineZValue - povarHeight1) / (povarHeight0 - povarHeight1);\n              pBy = iSubSpectra;\n              lines.push(pAx);\n              lines.push(pAy);\n              lines.push(pBx * dx + x0);\n              lines.push(pBy * dy + y0);\n            }\n            if (isOver2 !== isOver0) {\n              pBx = povar;\n              pBy =\n                iSubSpectra +\n                1 -\n                (lineZValue - povarHeight2) / (povarHeight0 - povarHeight2);\n              lines.push(pAx);\n              lines.push(pAy);\n              lines.push(pBx * dx + x0);\n              lines.push(pBy * dy + y0);\n            }\n            if (isOver1 !== isOver3) {\n              pBx = povar + 1;\n              pBy =\n                iSubSpectra +\n                (lineZValue - povarHeight1) / (povarHeight3 - povarHeight1);\n              lines.push(pAx);\n              lines.push(pAy);\n              lines.push(pBx * dx + x0);\n              lines.push(pBy * dy + y0);\n            }\n            if (isOver2 !== isOver3) {\n              pBx =\n                povar +\n                (lineZValue - povarHeight2) / (povarHeight3 - povarHeight2);\n              pBy = iSubSpectra + 1;\n              lines.push(pAx);\n              lines.push(pAy);\n              lines.push(pBx * dx + x0);\n              lines.push(pBy * dy + y0);\n            }\n          }\n        }\n      }\n    }\n\n    return {\n      minX: zData.minX,\n      maxX: zData.maxX,\n      minY: zData.minY,\n      maxY: zData.maxY,\n      segments: contourLevels,\n    };\n  }\n\n  function fastParseXYData(spectrum, value) {\n    // TODO need to deal with result\n    //  console.log(value);\n    // we check if deltaX is defined otherwise we calculate it\n\n    let yFactor = spectrum.yFactor;\n    let deltaX = spectrum.deltaX;\n\n    spectrum.isXYdata = true;\n    // TODO to be improved using 2 array {x:[], y:[]}\n    let currentData = [];\n    spectrum.data = [currentData];\n\n    let currentX = spectrum.firstX;\n    let currentY = spectrum.firstY;\n\n    // we skip the first line\n    //\n    let endLine = false;\n    let ascii;\n    let i = 0;\n    for (; i < value.length; i++) {\n      ascii = value.charCodeAt(i);\n      if (ascii === 13 || ascii === 10) {\n        endLine = true;\n      } else {\n        if (endLine) break;\n      }\n    }\n\n    // we proceed taking the i after the first line\n    let newLine = true;\n    let isDifference = false;\n    let isLastDifference = false;\n    let lastDifference = 0;\n    let isDuplicate = false;\n    let inComment = false;\n    let currentValue = 0; // can be a difference or a duplicate\n    let lastValue = 0; // must be the real last value\n    let isNegative = false;\n    let inValue = false;\n    let skipFirstValue = false;\n    let decimalPosition = 0;\n    for (; i <= value.length; i++) {\n      if (i === value.length) ascii = 13;\n      else ascii = value.charCodeAt(i);\n      if (inComment) {\n        // we should ignore the text if we are after $$\n        if (ascii === 13 || ascii === 10) {\n          newLine = true;\n          inComment = false;\n        }\n      } else {\n        // when is it a new value ?\n        // when it is not a digit, . or comma\n        // it is a number that is either new or we continue\n        if (ascii <= 57 && ascii >= 48) {\n          // a number\n          inValue = true;\n          if (decimalPosition > 0) {\n            currentValue += (ascii - 48) / Math.pow(10, decimalPosition++);\n          } else {\n            currentValue *= 10;\n            currentValue += ascii - 48;\n          }\n        } else if (ascii === 44 || ascii === 46) {\n          // a \",\" or \".\"\n          inValue = true;\n          decimalPosition++;\n        } else {\n          if (inValue) {\n            // need to process the previous value\n            if (newLine) {\n              newLine = false; // we don't check the X value\n              // console.log(\"NEW LINE\",isDifference, lastDifference);\n              // if new line and lastDifference, the first value is just a check !\n              // that we don't check ...\n              if (isLastDifference) skipFirstValue = true;\n            } else {\n              // need to deal with duplicate and differences\n              if (skipFirstValue) {\n                skipFirstValue = false;\n              } else {\n                if (isDifference) {\n                  lastDifference = isNegative ? 0 - currentValue : currentValue;\n                  isLastDifference = true;\n                  isDifference = false;\n                } else if (!isDuplicate) {\n                  lastValue = isNegative ? 0 - currentValue : currentValue;\n                }\n                let duplicate = isDuplicate ? currentValue - 1 : 1;\n                for (let j = 0; j < duplicate; j++) {\n                  if (isLastDifference) {\n                    currentY += lastDifference;\n                  } else {\n                    currentY = lastValue;\n                  }\n                  currentData.push(currentX);\n                  currentData.push(currentY * yFactor);\n                  currentX += deltaX;\n                }\n              }\n            }\n            isNegative = false;\n            currentValue = 0;\n            decimalPosition = 0;\n            inValue = false;\n            isDuplicate = false;\n          }\n\n          // positive SQZ digits @ A B C D E F G H I (ascii 64-73)\n          if (ascii < 74 && ascii > 63) {\n            inValue = true;\n            isLastDifference = false;\n            currentValue = ascii - 64;\n          } else if (ascii > 96 && ascii < 106) {\n            // negative SQZ digits a b c d e f g h i (ascii 97-105)\n            inValue = true;\n            isLastDifference = false;\n            currentValue = ascii - 96;\n            isNegative = true;\n          } else if (ascii === 115) {\n            // DUP digits S T U V W X Y Z s (ascii 83-90, 115)\n            inValue = true;\n            isDuplicate = true;\n            currentValue = 9;\n          } else if (ascii > 82 && ascii < 91) {\n            inValue = true;\n            isDuplicate = true;\n            currentValue = ascii - 82;\n          } else if (ascii > 73 && ascii < 83) {\n            // positive DIF digits % J K L M N O P Q R (ascii 37, 74-82)\n            inValue = true;\n            isDifference = true;\n            currentValue = ascii - 73;\n          } else if (ascii > 105 && ascii < 115) {\n            // negative DIF digits j k l m n o p q r (ascii 106-114)\n            inValue = true;\n            isDifference = true;\n            currentValue = ascii - 105;\n            isNegative = true;\n          } else if (ascii === 36 && value.charCodeAt(i + 1) === 36) {\n            // $ sign, we need to check the next one\n            inValue = true;\n            inComment = true;\n          } else if (ascii === 37) {\n            // positive DIF digits % J K L M N O P Q R (ascii 37, 74-82)\n            inValue = true;\n            isDifference = true;\n            currentValue = 0;\n            isNegative = false;\n          } else if (ascii === 45) {\n            // a \"-\"\n            // check if after there is a number, decimal or comma\n            let ascii2 = value.charCodeAt(i + 1);\n            if (\n              (ascii2 >= 48 && ascii2 <= 57) ||\n              ascii2 === 44 ||\n              ascii2 === 46\n            ) {\n              inValue = true;\n              if (!newLine) isLastDifference = false;\n              isNegative = true;\n            }\n          } else if (ascii === 13 || ascii === 10) {\n            newLine = true;\n            inComment = false;\n          }\n          // and now analyse the details ... space or tabulation\n          // if \"+\" we just don't care\n        }\n      }\n    }\n  }\n\n  function parseXYA(spectrum, value) {\n    let removeSymbolRegExp = /(\\(+|\\)+|<+|>+|\\s+)/g;\n\n    spectrum.isXYAdata = true;\n    let values;\n    let currentData = [];\n    spectrum.data = [currentData];\n\n    let lines = value.split(/,? *,?[;\\r\\n]+ */);\n\n    for (let i = 1; i < lines.length; i++) {\n      values = lines[i]\n        .trim()\n        .replace(removeSymbolRegExp, '')\n        .split(',');\n      currentData.push(parseFloat(values[0]));\n      currentData.push(parseFloat(values[1]));\n    }\n  }\n\n  function parsePeakTable(spectrum, value, result) {\n    let removeCommentRegExp = /\\$\\$.*/;\n    let peakTableSplitRegExp = /[,\\t ]+/;\n\n    spectrum.isPeaktable = true;\n    let values;\n    let currentData = [];\n    spectrum.data = [currentData];\n\n    // counts for around 20% of the time\n    let lines = value.split(/,? *,?[;\\r\\n]+ */);\n\n    for (let i = 1; i < lines.length; i++) {\n      values = lines[i]\n        .trim()\n        .replace(removeCommentRegExp, '')\n        .split(peakTableSplitRegExp);\n      if (values.length % 2 === 0) {\n        for (let j = 0; j < values.length; j = j + 2) {\n          // takes around 40% of the time to add and parse the 2 values nearly exclusively because of parseFloat\n          currentData.push(parseFloat(values[j]) * spectrum.xFactor);\n          currentData.push(parseFloat(values[j + 1]) * spectrum.yFactor);\n        }\n      } else {\n        result.logs.push(`Format error: ${values}`);\n      }\n    }\n  }\n\n  return convert;\n}\n\nlet convert = getConverter();\n\nfunction JcampConverter(input, options, useWorker) {\n  if (typeof options === 'boolean') {\n    useWorker = options;\n    options = {};\n  }\n  if (useWorker) {\n    return postToWorker(input, options);\n  } else {\n    return convert(input, options);\n  }\n}\n\nlet stamps = {};\nlet worker;\n\nfunction postToWorker(input, options) {\n  if (!worker) {\n    createWorker();\n  }\n  return new Promise(function(resolve) {\n    let stamp = `${Date.now()}${Math.random()}`;\n    stamps[stamp] = resolve;\n    worker.postMessage(\n      JSON.stringify({\n        stamp: stamp,\n        input: input,\n        options: options,\n      }),\n    );\n  });\n}\n\nfunction createWorker() {\n  let workerURL = URL.createObjectURL(\n    new Blob(\n      [\n        `var getConverter =${getConverter.toString()};var convert = getConverter(); onmessage = function (event) { var data = JSON.parse(event.data); postMessage(JSON.stringify({stamp: data.stamp, output: convert(data.input, data.options)})); };`,\n      ],\n      { type: 'application/javascript' },\n    ),\n  );\n  worker = new Worker(workerURL);\n  URL.revokeObjectURL(workerURL);\n  worker.addEventListener('message', function(event) {\n    let data = JSON.parse(event.data);\n    let stamp = data.stamp;\n    if (stamps[stamp]) {\n      stamps[stamp](data.output);\n    }\n  });\n}\n\nfunction createTree(jcamp, options = {}) {\n  const { flatten = false } = options;\n  if (typeof jcamp !== 'string') {\n    throw new TypeError('the JCAMP should be a string');\n  }\n\n  let lines = jcamp.split(/[\\r\\n]+/);\n  let flat = [];\n  let stack = [];\n  let result = [];\n  let current;\n  let ntupleLevel = 0;\n\n  let spaces = jcamp.includes('## ');\n\n  for (let i = 0; i < lines.length; i++) {\n    let line = lines[i];\n    let labelLine = spaces ? line.replace(/ /g, '') : line;\n\n    if (labelLine.substring(0, 9) === '##NTUPLES') {\n      ntupleLevel++;\n    }\n\n    if (labelLine.substring(0, 7) === '##TITLE') {\n      let title = [labelLine.substring(8).trim()];\n      for (let j = i + 1; j < lines.length; j++) {\n        if (lines[j].startsWith('##')) {\n          break;\n        } else {\n          title.push(lines[j].trim());\n        }\n      }\n      stack.push({\n        title: title.join('\\n'),\n        jcamp: `${line}\\n`,\n        children: [],\n      });\n      current = stack[stack.length - 1];\n      flat.push(current);\n    } else if (labelLine.substring(0, 5) === '##END' && ntupleLevel === 0) {\n      current.jcamp += `${line}\\n`;\n      let finished = stack.pop();\n      if (stack.length !== 0) {\n        current = stack[stack.length - 1];\n        current.children.push(finished);\n      } else {\n        current = undefined;\n        result.push(finished);\n      }\n    } else if (current && current.jcamp) {\n      current.jcamp += `${line}\\n`;\n      let match = labelLine.match(/^##(.*?)=(.+)/);\n      if (match) {\n        let canonicDataLabel = match[1].replace(/[ _-]/g, '').toUpperCase();\n        if (canonicDataLabel === 'DATATYPE') {\n          current.dataType = match[2].trim();\n        }\n      }\n    }\n\n    if (labelLine.substring(0, 5) === '##END' && ntupleLevel > 0) {\n      ntupleLevel--;\n    }\n  }\n  if (flatten) {\n    flat.forEach((entry) => {\n      entry.children = undefined;\n    });\n    return flat;\n  } else {\n    return result;\n  }\n}\n\nmodule.exports = {\n  convert: JcampConverter,\n  createTree: createTree,\n};\n","import filterX from 'ml-array-xy-filter-x';\n\n/**\n *\n * @private\n * @param {Spectrum} spectrum\n * @param {object} [options.xFilter={}]\n * @param {array} [options.xFilter.from]\n * @param {array} [options.xFilter.to]\n * @param {array} [options.xFilter.exclusions=[]]\n * @param {array} [options.yFactor=1]\n */\n\nexport function getData(spectrum, options = {}) {\n  const { xFilter = {}, yFactor = 1 } = options;\n  let data = { x: spectrum.x, y: spectrum.y };\n\n  if (xFilter) {\n    data = filterX({ x: spectrum.x, y: spectrum.y }, xFilter);\n  }\n  if (yFactor && yFactor !== 1) {\n    data.y = data.y.map((y) => y * yFactor);\n  }\n  return data;\n}\n","import equallySpaced from 'ml-array-xy-equally-spaced';\nimport Stat from 'ml-stat/array';\nimport normed from 'ml-array-normed';\nimport rescale from 'ml-array-rescale';\n\n/**\n *\n * @private\n * @param {*} spectrum\n * @param {*} options\n */\nexport function getNormalized(spectrum, options = {}) {\n  if (!Array.isArray(spectrum.x) || !Array.isArray(spectrum.y)) {\n    throw new Error(\n      'getNormalized: Can not get normalized data, missing original data.',\n    );\n  }\n\n  let {\n    from = spectrum.x[0],\n    to = spectrum.x[spectrum.x.length - 1],\n    numberOfPoints = 1024,\n    filters = [],\n    exclusions = [],\n  } = options;\n\n  let y = spectrum.y.slice(0);\n\n  for (let filter of filters) {\n    switch (filter.name) {\n      case 'centerMean': {\n        let mean = Stat.mean(spectrum.y);\n        let meanFct = (y) => y - mean;\n        y = y.map(meanFct);\n        break;\n      }\n      case 'scaleSD': {\n        let std = Stat.standardDeviation(spectrum.y);\n        let stdFct = (y) => y / std;\n        y = y.map(stdFct);\n        break;\n      }\n      case 'normalize': {\n        y = normed(y);\n        break;\n      }\n      case 'rescale': {\n        y = rescale(y);\n        break;\n      }\n      case '':\n      case undefined:\n        break;\n      default:\n        throw new Error(`Unknown process kind: ${process.kind}`);\n    }\n  }\n  let result = equallySpaced(\n    { x: spectrum.x, y },\n    { from, to, numberOfPoints, exclusions },\n  );\n  return result;\n}\n","import { XY, X } from 'ml-spectra-processing';\n\n/**\n * @private\n * @param {*} spectrum\n * @param {*} ranges\n */\nexport function updateRangesInfo(spectrum, ranges = []) {\n  spectrum.ranges = {};\n  for (let range of ranges) {\n    range = JSON.parse(JSON.stringify(range));\n    spectrum.ranges[range.label] = range;\n    let fromToIndex = {\n      fromIndex: X.findClosestIndex(spectrum.normalized.x, range.from),\n      toIndex: X.findClosestIndex(spectrum.normalized.x, range.to),\n    };\n    range.integration = XY.integration(spectrum.normalized, fromToIndex);\n    range.maxPoint = XY.maxYPoint(spectrum.normalized, fromToIndex);\n    range.minPoint = XY.minYPoint(spectrum.normalized, fromToIndex);\n    range.x = spectrum.normalized.x.slice(\n      fromToIndex.fromIndex,\n      fromToIndex.toIndex + 1,\n    );\n    range.y = spectrum.normalized.y.slice(\n      fromToIndex.fromIndex,\n      fromToIndex.toIndex + 1,\n    );\n  }\n}\n","export function getJcampKind(data) {\n  let datatype = data.spectra[0].dataType.toLowerCase();\n  let yUnit = data.spectra[0].yUnit.toLowerCase();\n\n  if (datatype.match(/infrared/)) {\n    if (yUnit.match(/absorbance/)) {\n      return IR_ABSORBANCE;\n    } else {\n      return IR_TRANSMITTANCE;\n    }\n  }\n  return undefined;\n}\n\nexport const IR_TRANSMITTANCE = {\n  normalization: {},\n  importation: {\n    converter: (transmittance) => -Math.log10(transmittance),\n  },\n  kind: 'Infrared',\n  display: {\n    xLabel: 'wavelength [cm-1]',\n    xInverted: true,\n    yLabel: 'Absorbance',\n  },\n};\n\nexport const IR_ABSORBANCE = {\n  normalization: {},\n  kind: 'Infrared',\n  display: {\n    xLabel: 'wavelength [cm-1]',\n    xInverted: true,\n    yLabel: 'Absorbance',\n  },\n};\n\nexport const nmr1H = {\n  display: {\n    xLabel: 'δ [ppm]',\n    xInverted: true,\n    yLabel: 'Intensity',\n  },\n};\n\nexport const nmr13C = {\n  display: {\n    xLabel: 'δ [ppm]',\n    xInverted: true,\n    yLabel: 'Intensity',\n  },\n};\n","import { convert } from 'jcampconverter';\n\nimport { getJcampKind } from '../Kinds';\n/**\n * Create a spectrum from a jcamp\n * @param {string} jcamp - String containing the JCAMP data\n * @return {Spectrum} - new instance of Spectrum with the provided data\n */\nexport default function jcamp(jcamp) {\n  const parsed = convert(jcamp, { xy: true, keepRecordsRegExp: /TITLE/ });\n  const kind = getJcampKind(parsed);\n  const data = parsed.spectra[0].data[0];\n  const meta = parsed.info;\n  // we convert the data\n  if (kind && kind.importation && kind.importation.converter) {\n    data.y = data.y.map(kind.importation.converter);\n  }\n\n  return { data, kind, meta };\n}\n","import uniqueXFunction from 'ml-arrayxy-uniquex';\n\n/**\n * Parse a text-file and convert it to an array of XY points\n * @param {string} text - csv or tsv strings\n * @param {object} [options={}]\n * @param {boolean} [options.rescale = false] - will set the maximum value to 1\n * @param {boolean} [options.uniqueX = false] - Make the X values unique (works only with 'xxyy' format). If the X value is repeated the sum of Y is done.\n * @param {number} [options.xColumn = 0] - A number that specifies the x column\n * @param {number} [options.yColumn = 1] - A number that specifies the y column\n * @param {number} [options.maxNumberColumns = (Math.max(xColumn, yColumn)+1)] - A number that specifies the maximum number of y columns\n * @param {number} [options.minNumberColumns = (Math.min(xColumn, yColumn)+1)] - A number that specifies the minimum number of y columns\n * @param {boolean} [options.keepInfo = false] - shoud we keep the non numeric lines. In this case the system will return an object {data, info}\n * @return {object{x:<Array<number>>,y:<Array<number>>}\n */\nexport function parseXY(text, options = {}) {\n  let {\n    rescale = false,\n    uniqueX = false,\n    xColumn = 0,\n    yColumn = 1,\n    keepInfo = false,\n    maxNumberColumns = Number.MAX_SAFE_INTEGER,\n    minNumberColumns = 2,\n  } = options;\n\n  maxNumberColumns = Math.max(maxNumberColumns, xColumn + 1, yColumn + 1);\n  minNumberColumns = Math.max(xColumn + 1, yColumn + 1, minNumberColumns);\n\n  let lines = text.split(/[\\r\\n]+/);\n\n  let maxY = Number.MIN_VALUE;\n  let result = { x: [], y: [] };\n  let info = [];\n  for (let l = 0; l < lines.length; l++) {\n    let line = lines[l].trim();\n    // we will consider only lines that contains only numbers\n    if (line.match(/[0-9]+/) && line.match(/^[0-9eE,;. \\t+-]+$/)) {\n      let fields = line.split(/,[; \\t]+|[; \\t]+/);\n      if (fields.length === 1) {\n        fields = line.split(/[,; \\t]+/);\n      }\n      if (\n        fields &&\n        fields.length >= minNumberColumns &&\n        fields.length <= maxNumberColumns\n      ) {\n        let x = parseFloat(fields[xColumn].replace(',', '.'));\n        let y = parseFloat(fields[yColumn].replace(',', '.'));\n\n        if (y > maxY) maxY = y;\n        result.x.push(x);\n        result.y.push(y);\n      }\n    } else if (line) {\n      info.push({ position: result.x.length, value: line });\n    }\n  }\n\n  if (uniqueX) {\n    uniqueXFunction(result);\n  }\n\n  if (rescale) {\n    for (let i = 0; i < result.y.length; i++) {\n      result.y[i] /= maxY;\n    }\n  }\n\n  if (!keepInfo) return result;\n\n  return {\n    info,\n    data: result,\n  };\n}\n","\n/**\n * In place modification of the 2 arrays to make X unique and sum the Y if X has the same value\n * @param {object} [points={}] : Object of points contains property x (an array) and y (an array)\n * @return points\n */\n\nexport default function uniqueX(points = {}) {\n  const { x, y } = points;\n  if (x.length < 2) return;\n  if (x.length !== y.length) {\n    throw new Error('The X and Y arrays mush have the same length');\n  }\n\n  let current = x[0];\n  let counter = 0;\n\n  for (let i = 1; i < x.length; i++) {\n    if (current !== x[i]) {\n      counter++;\n      current = x[i];\n      x[counter] = x[i];\n      if (i !== counter) {\n        y[counter] = 0;\n      }\n    }\n    if (i !== counter) {\n      y[counter] += y[i];\n    }\n  }\n\n  x.length = counter + 1;\n  y.length = counter + 1;\n}\n","import { getBoxPlotData } from '../spectra/getBoxPlotData';\n\nexport function getBoxPlotAnnotations(spectra, options = {}) {\n  const {\n    q13FillColor = '#000',\n    q13FillOpacity = 0.3,\n    q2StrokeColor = '#000',\n    q2StrokeWidth = 3,\n    minMaxFillColor = '#000',\n    minMaxFillOpacity = 0.15,\n  } = options;\n  let annotations = [];\n\n  let data = getBoxPlotData(spectra);\n  if (q13FillOpacity && q13FillColor) {\n    let q13 = [];\n    for (let i = 0; i < data.x.length; i++) {\n      q13.push({\n        x: data.x[i],\n        y: data.Q1[i],\n      });\n    }\n    for (let i = data.x.length - 1; i >= 0; i--) {\n      q13.push({\n        x: data.x[i],\n        y: data.Q3[i],\n      });\n    }\n    annotations.push({\n      type: 'polygon',\n      layer: 0,\n      properties: {\n        fillColor: q13FillColor,\n        fillOpacity: q13FillOpacity,\n        strokeWidth: 0.0000001,\n        position: q13,\n      },\n    });\n  }\n\n  if (q2StrokeColor && q2StrokeWidth) {\n    let q2 = [];\n    for (let i = 0; i < data.x.length; i++) {\n      q2.push({\n        x: data.x[i],\n        y: data.Q2[i],\n      });\n    }\n    // Temp code because polyline is not working\n    for (let i = data.x.length - 1; i >= 0; i--) {\n      q2.push({\n        x: data.x[i],\n        y: data.Q2[i],\n      });\n    }\n\n    annotations.push({\n      type: 'polygon',\n      layer: 0,\n      properties: {\n        strokeWidth: q2StrokeWidth,\n        strokeColor: q2StrokeColor,\n        position: q2,\n      },\n    });\n  }\n\n  if (minMaxFillColor && minMaxFillOpacity) {\n    let minMax = [];\n    for (let i = 0; i < data.x.length; i++) {\n      minMax.push({\n        x: data.x[i],\n        y: data.min[i],\n      });\n    }\n    for (let i = data.x.length - 1; i >= 0; i--) {\n      minMax.push({\n        x: data.x[i],\n        y: data.max[i],\n      });\n    }\n\n    annotations.push({\n      type: 'polygon',\n      layer: 0,\n      properties: {\n        fillColor: minMaxFillColor,\n        fillOpacity: minMaxFillOpacity,\n        strokeWidth: 0.0000001,\n        strokeColor: '#FFF',\n        position: minMax,\n      },\n    });\n  }\n\n  return annotations;\n}\n","import { X } from 'ml-spectra-processing';\n\n/**\n * @private\n * @param {*} spectra\n */\n\nexport function getBoxPlotData(spectra) {\n  let matrix = [];\n  let x = spectra[0].normalized.x;\n  for (let spectrum of spectra) {\n    matrix.push(spectrum.normalized.y);\n  }\n\n  let nbRow = matrix.length;\n  let nbColumn = matrix[0].length;\n  let result;\n  let aColumn = new Float64Array(nbRow);\n  for (let column = 0; column < nbColumn; column++) {\n    for (let row = 0; row < nbRow; row++) {\n      aColumn[row] = matrix[row][column];\n    }\n    let info = X.boxPlot(aColumn);\n    if (!result) {\n      result = { x };\n      for (let key in info) {\n        result[key] = [];\n      }\n    }\n    for (let key in info) {\n      result[key].push(info[key]);\n    }\n  }\n  return result;\n}\n","export function addChartDataStyle(data, spectrum) {\n  data.styles = {\n    unselected: {\n      lineColor: spectrum.meta.color || 'darkgrey',\n      lineWidth: 1,\n      lineStyle: 1,\n    },\n    selected: {\n      lineColor: spectrum.meta.color || 'darkgrey',\n      lineWidth: 3,\n      lineStyle: 1,\n    },\n  };\n  data.label = spectrum.meta.id || spectrum.id;\n}\n","/**\n * chroma.js - JavaScript library for color conversions\n *\n * Copyright (c) 2011-2019, Gregor Aisch\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation\n * and/or other materials provided with the distribution.\n *\n * 3. The name Gregor Aisch may not be used to endorse or promote products\n * derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL GREGOR AISCH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY\n * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * -------------------------------------------------------\n *\n * chroma.js includes colors from colorbrewer2.org, which are released under\n * the following license:\n *\n * Copyright (c) 2002 Cynthia Brewer, Mark Harrower,\n * and The Pennsylvania State University.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,\n * either express or implied. See the License for the specific\n * language governing permissions and limitations under the License.\n *\n * ------------------------------------------------------\n *\n * Named colors are taken from X11 Color Names.\n * http://www.w3.org/TR/css3-color/#svg-color\n *\n * @preserve\n */\n\n(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n    typeof define === 'function' && define.amd ? define(factory) :\n    (global.chroma = factory());\n}(this, (function () { 'use strict';\n\n    var limit = function (x, min, max) {\n        if ( min === void 0 ) min=0;\n        if ( max === void 0 ) max=1;\n\n        return x < min ? min : x > max ? max : x;\n    };\n\n    var clip_rgb = function (rgb) {\n        rgb._clipped = false;\n        rgb._unclipped = rgb.slice(0);\n        for (var i=0; i<=3; i++) {\n            if (i < 3) {\n                if (rgb[i] < 0 || rgb[i] > 255) { rgb._clipped = true; }\n                rgb[i] = limit(rgb[i], 0, 255);\n            } else if (i === 3) {\n                rgb[i] = limit(rgb[i], 0, 1);\n            }\n        }\n        return rgb;\n    };\n\n    // ported from jQuery's $.type\n    var classToType = {};\n    for (var i = 0, list = ['Boolean', 'Number', 'String', 'Function', 'Array', 'Date', 'RegExp', 'Undefined', 'Null']; i < list.length; i += 1) {\n        var name = list[i];\n\n        classToType[(\"[object \" + name + \"]\")] = name.toLowerCase();\n    }\n    var type = function(obj) {\n        return classToType[Object.prototype.toString.call(obj)] || \"object\";\n    };\n\n    var unpack = function (args, keyOrder) {\n        if ( keyOrder === void 0 ) keyOrder=null;\n\n    \t// if called with more than 3 arguments, we return the arguments\n        if (args.length >= 3) { return Array.prototype.slice.call(args); }\n        // with less than 3 args we check if first arg is object\n        // and use the keyOrder string to extract and sort properties\n    \tif (type(args[0]) == 'object' && keyOrder) {\n    \t\treturn keyOrder.split('')\n    \t\t\t.filter(function (k) { return args[0][k] !== undefined; })\n    \t\t\t.map(function (k) { return args[0][k]; });\n    \t}\n    \t// otherwise we just return the first argument\n    \t// (which we suppose is an array of args)\n        return args[0];\n    };\n\n    var last = function (args) {\n        if (args.length < 2) { return null; }\n        var l = args.length-1;\n        if (type(args[l]) == 'string') { return args[l].toLowerCase(); }\n        return null;\n    };\n\n    var PI = Math.PI;\n\n    var utils = {\n    \tclip_rgb: clip_rgb,\n    \tlimit: limit,\n    \ttype: type,\n    \tunpack: unpack,\n    \tlast: last,\n    \tPI: PI,\n    \tTWOPI: PI*2,\n    \tPITHIRD: PI/3,\n    \tDEG2RAD: PI / 180,\n    \tRAD2DEG: 180 / PI\n    };\n\n    var input = {\n    \tformat: {},\n    \tautodetect: []\n    };\n\n    var last$1 = utils.last;\n    var clip_rgb$1 = utils.clip_rgb;\n    var type$1 = utils.type;\n\n\n    var Color = function Color() {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        var me = this;\n        if (type$1(args[0]) === 'object' &&\n            args[0].constructor &&\n            args[0].constructor === this.constructor) {\n            // the argument is already a Color instance\n            return args[0];\n        }\n\n        // last argument could be the mode\n        var mode = last$1(args);\n        var autodetect = false;\n\n        if (!mode) {\n            autodetect = true;\n            if (!input.sorted) {\n                input.autodetect = input.autodetect.sort(function (a,b) { return b.p - a.p; });\n                input.sorted = true;\n            }\n            // auto-detect format\n            for (var i = 0, list = input.autodetect; i < list.length; i += 1) {\n                var chk = list[i];\n\n                mode = chk.test.apply(chk, args);\n                if (mode) { break; }\n            }\n        }\n\n        if (input.format[mode]) {\n            var rgb = input.format[mode].apply(null, autodetect ? args : args.slice(0,-1));\n            me._rgb = clip_rgb$1(rgb);\n        } else {\n            throw new Error('unknown format: '+args);\n        }\n\n        // add alpha channel\n        if (me._rgb.length === 3) { me._rgb.push(1); }\n    };\n\n    Color.prototype.toString = function toString () {\n        if (type$1(this.hex) == 'function') { return this.hex(); }\n        return (\"[\" + (this._rgb.join(',')) + \"]\");\n    };\n\n    var Color_1 = Color;\n\n    var chroma = function () {\n    \tvar args = [], len = arguments.length;\n    \twhile ( len-- ) args[ len ] = arguments[ len ];\n\n    \treturn new (Function.prototype.bind.apply( chroma.Color, [ null ].concat( args) ));\n    };\n\n    chroma.Color = Color_1;\n    chroma.version = '2.1.0';\n\n    var chroma_1 = chroma;\n\n    var unpack$1 = utils.unpack;\n    var max = Math.max;\n\n    var rgb2cmyk = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        var ref = unpack$1(args, 'rgb');\n        var r = ref[0];\n        var g = ref[1];\n        var b = ref[2];\n        r = r / 255;\n        g = g / 255;\n        b = b / 255;\n        var k = 1 - max(r,max(g,b));\n        var f = k < 1 ? 1 / (1-k) : 0;\n        var c = (1-r-k) * f;\n        var m = (1-g-k) * f;\n        var y = (1-b-k) * f;\n        return [c,m,y,k];\n    };\n\n    var rgb2cmyk_1 = rgb2cmyk;\n\n    var unpack$2 = utils.unpack;\n\n    var cmyk2rgb = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        args = unpack$2(args, 'cmyk');\n        var c = args[0];\n        var m = args[1];\n        var y = args[2];\n        var k = args[3];\n        var alpha = args.length > 4 ? args[4] : 1;\n        if (k === 1) { return [0,0,0,alpha]; }\n        return [\n            c >= 1 ? 0 : 255 * (1-c) * (1-k), // r\n            m >= 1 ? 0 : 255 * (1-m) * (1-k), // g\n            y >= 1 ? 0 : 255 * (1-y) * (1-k), // b\n            alpha\n        ];\n    };\n\n    var cmyk2rgb_1 = cmyk2rgb;\n\n    var unpack$3 = utils.unpack;\n    var type$2 = utils.type;\n\n\n\n    Color_1.prototype.cmyk = function() {\n        return rgb2cmyk_1(this._rgb);\n    };\n\n    chroma_1.cmyk = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        return new (Function.prototype.bind.apply( Color_1, [ null ].concat( args, ['cmyk']) ));\n    };\n\n    input.format.cmyk = cmyk2rgb_1;\n\n    input.autodetect.push({\n        p: 2,\n        test: function () {\n            var args = [], len = arguments.length;\n            while ( len-- ) args[ len ] = arguments[ len ];\n\n            args = unpack$3(args, 'cmyk');\n            if (type$2(args) === 'array' && args.length === 4) {\n                return 'cmyk';\n            }\n        }\n    });\n\n    var unpack$4 = utils.unpack;\n    var last$2 = utils.last;\n    var rnd = function (a) { return Math.round(a*100)/100; };\n\n    /*\n     * supported arguments:\n     * - hsl2css(h,s,l)\n     * - hsl2css(h,s,l,a)\n     * - hsl2css([h,s,l], mode)\n     * - hsl2css([h,s,l,a], mode)\n     * - hsl2css({h,s,l,a}, mode)\n     */\n    var hsl2css = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        var hsla = unpack$4(args, 'hsla');\n        var mode = last$2(args) || 'lsa';\n        hsla[0] = rnd(hsla[0] || 0);\n        hsla[1] = rnd(hsla[1]*100) + '%';\n        hsla[2] = rnd(hsla[2]*100) + '%';\n        if (mode === 'hsla' || (hsla.length > 3 && hsla[3]<1)) {\n            hsla[3] = hsla.length > 3 ? hsla[3] : 1;\n            mode = 'hsla';\n        } else {\n            hsla.length = 3;\n        }\n        return (mode + \"(\" + (hsla.join(',')) + \")\");\n    };\n\n    var hsl2css_1 = hsl2css;\n\n    var unpack$5 = utils.unpack;\n\n    /*\n     * supported arguments:\n     * - rgb2hsl(r,g,b)\n     * - rgb2hsl(r,g,b,a)\n     * - rgb2hsl([r,g,b])\n     * - rgb2hsl([r,g,b,a])\n     * - rgb2hsl({r,g,b,a})\n     */\n    var rgb2hsl = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        args = unpack$5(args, 'rgba');\n        var r = args[0];\n        var g = args[1];\n        var b = args[2];\n\n        r /= 255;\n        g /= 255;\n        b /= 255;\n\n        var min = Math.min(r, g, b);\n        var max = Math.max(r, g, b);\n\n        var l = (max + min) / 2;\n        var s, h;\n\n        if (max === min){\n            s = 0;\n            h = Number.NaN;\n        } else {\n            s = l < 0.5 ? (max - min) / (max + min) : (max - min) / (2 - max - min);\n        }\n\n        if (r == max) { h = (g - b) / (max - min); }\n        else if (g == max) { h = 2 + (b - r) / (max - min); }\n        else if (b == max) { h = 4 + (r - g) / (max - min); }\n\n        h *= 60;\n        if (h < 0) { h += 360; }\n        if (args.length>3 && args[3]!==undefined) { return [h,s,l,args[3]]; }\n        return [h,s,l];\n    };\n\n    var rgb2hsl_1 = rgb2hsl;\n\n    var unpack$6 = utils.unpack;\n    var last$3 = utils.last;\n\n\n    var round = Math.round;\n\n    /*\n     * supported arguments:\n     * - rgb2css(r,g,b)\n     * - rgb2css(r,g,b,a)\n     * - rgb2css([r,g,b], mode)\n     * - rgb2css([r,g,b,a], mode)\n     * - rgb2css({r,g,b,a}, mode)\n     */\n    var rgb2css = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        var rgba = unpack$6(args, 'rgba');\n        var mode = last$3(args) || 'rgb';\n        if (mode.substr(0,3) == 'hsl') {\n            return hsl2css_1(rgb2hsl_1(rgba), mode);\n        }\n        rgba[0] = round(rgba[0]);\n        rgba[1] = round(rgba[1]);\n        rgba[2] = round(rgba[2]);\n        if (mode === 'rgba' || (rgba.length > 3 && rgba[3]<1)) {\n            rgba[3] = rgba.length > 3 ? rgba[3] : 1;\n            mode = 'rgba';\n        }\n        return (mode + \"(\" + (rgba.slice(0,mode==='rgb'?3:4).join(',')) + \")\");\n    };\n\n    var rgb2css_1 = rgb2css;\n\n    var unpack$7 = utils.unpack;\n    var round$1 = Math.round;\n\n    var hsl2rgb = function () {\n        var assign;\n\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n        args = unpack$7(args, 'hsl');\n        var h = args[0];\n        var s = args[1];\n        var l = args[2];\n        var r,g,b;\n        if (s === 0) {\n            r = g = b = l*255;\n        } else {\n            var t3 = [0,0,0];\n            var c = [0,0,0];\n            var t2 = l < 0.5 ? l * (1+s) : l+s-l*s;\n            var t1 = 2 * l - t2;\n            var h_ = h / 360;\n            t3[0] = h_ + 1/3;\n            t3[1] = h_;\n            t3[2] = h_ - 1/3;\n            for (var i=0; i<3; i++) {\n                if (t3[i] < 0) { t3[i] += 1; }\n                if (t3[i] > 1) { t3[i] -= 1; }\n                if (6 * t3[i] < 1)\n                    { c[i] = t1 + (t2 - t1) * 6 * t3[i]; }\n                else if (2 * t3[i] < 1)\n                    { c[i] = t2; }\n                else if (3 * t3[i] < 2)\n                    { c[i] = t1 + (t2 - t1) * ((2 / 3) - t3[i]) * 6; }\n                else\n                    { c[i] = t1; }\n            }\n            (assign = [round$1(c[0]*255),round$1(c[1]*255),round$1(c[2]*255)], r = assign[0], g = assign[1], b = assign[2]);\n        }\n        if (args.length > 3) {\n            // keep alpha channel\n            return [r,g,b,args[3]];\n        }\n        return [r,g,b,1];\n    };\n\n    var hsl2rgb_1 = hsl2rgb;\n\n    var RE_RGB = /^rgb\\(\\s*(-?\\d+),\\s*(-?\\d+)\\s*,\\s*(-?\\d+)\\s*\\)$/;\n    var RE_RGBA = /^rgba\\(\\s*(-?\\d+),\\s*(-?\\d+)\\s*,\\s*(-?\\d+)\\s*,\\s*([01]|[01]?\\.\\d+)\\)$/;\n    var RE_RGB_PCT = /^rgb\\(\\s*(-?\\d+(?:\\.\\d+)?)%,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*\\)$/;\n    var RE_RGBA_PCT = /^rgba\\(\\s*(-?\\d+(?:\\.\\d+)?)%,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*([01]|[01]?\\.\\d+)\\)$/;\n    var RE_HSL = /^hsl\\(\\s*(-?\\d+(?:\\.\\d+)?),\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*\\)$/;\n    var RE_HSLA = /^hsla\\(\\s*(-?\\d+(?:\\.\\d+)?),\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*([01]|[01]?\\.\\d+)\\)$/;\n\n    var round$2 = Math.round;\n\n    var css2rgb = function (css) {\n        css = css.toLowerCase().trim();\n        var m;\n\n        if (input.format.named) {\n            try {\n                return input.format.named(css);\n            } catch (e) {\n                // eslint-disable-next-line\n            }\n        }\n\n        // rgb(250,20,0)\n        if ((m = css.match(RE_RGB))) {\n            var rgb = m.slice(1,4);\n            for (var i=0; i<3; i++) {\n                rgb[i] = +rgb[i];\n            }\n            rgb[3] = 1;  // default alpha\n            return rgb;\n        }\n\n        // rgba(250,20,0,0.4)\n        if ((m = css.match(RE_RGBA))) {\n            var rgb$1 = m.slice(1,5);\n            for (var i$1=0; i$1<4; i$1++) {\n                rgb$1[i$1] = +rgb$1[i$1];\n            }\n            return rgb$1;\n        }\n\n        // rgb(100%,0%,0%)\n        if ((m = css.match(RE_RGB_PCT))) {\n            var rgb$2 = m.slice(1,4);\n            for (var i$2=0; i$2<3; i$2++) {\n                rgb$2[i$2] = round$2(rgb$2[i$2] * 2.55);\n            }\n            rgb$2[3] = 1;  // default alpha\n            return rgb$2;\n        }\n\n        // rgba(100%,0%,0%,0.4)\n        if ((m = css.match(RE_RGBA_PCT))) {\n            var rgb$3 = m.slice(1,5);\n            for (var i$3=0; i$3<3; i$3++) {\n                rgb$3[i$3] = round$2(rgb$3[i$3] * 2.55);\n            }\n            rgb$3[3] = +rgb$3[3];\n            return rgb$3;\n        }\n\n        // hsl(0,100%,50%)\n        if ((m = css.match(RE_HSL))) {\n            var hsl = m.slice(1,4);\n            hsl[1] *= 0.01;\n            hsl[2] *= 0.01;\n            var rgb$4 = hsl2rgb_1(hsl);\n            rgb$4[3] = 1;\n            return rgb$4;\n        }\n\n        // hsla(0,100%,50%,0.5)\n        if ((m = css.match(RE_HSLA))) {\n            var hsl$1 = m.slice(1,4);\n            hsl$1[1] *= 0.01;\n            hsl$1[2] *= 0.01;\n            var rgb$5 = hsl2rgb_1(hsl$1);\n            rgb$5[3] = +m[4];  // default alpha = 1\n            return rgb$5;\n        }\n    };\n\n    css2rgb.test = function (s) {\n        return RE_RGB.test(s) ||\n            RE_RGBA.test(s) ||\n            RE_RGB_PCT.test(s) ||\n            RE_RGBA_PCT.test(s) ||\n            RE_HSL.test(s) ||\n            RE_HSLA.test(s);\n    };\n\n    var css2rgb_1 = css2rgb;\n\n    var type$3 = utils.type;\n\n\n\n\n    Color_1.prototype.css = function(mode) {\n        return rgb2css_1(this._rgb, mode);\n    };\n\n    chroma_1.css = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        return new (Function.prototype.bind.apply( Color_1, [ null ].concat( args, ['css']) ));\n    };\n\n    input.format.css = css2rgb_1;\n\n    input.autodetect.push({\n        p: 5,\n        test: function (h) {\n            var rest = [], len = arguments.length - 1;\n            while ( len-- > 0 ) rest[ len ] = arguments[ len + 1 ];\n\n            if (!rest.length && type$3(h) === 'string' && css2rgb_1.test(h)) {\n                return 'css';\n            }\n        }\n    });\n\n    var unpack$8 = utils.unpack;\n\n    input.format.gl = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        var rgb = unpack$8(args, 'rgba');\n        rgb[0] *= 255;\n        rgb[1] *= 255;\n        rgb[2] *= 255;\n        return rgb;\n    };\n\n    chroma_1.gl = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        return new (Function.prototype.bind.apply( Color_1, [ null ].concat( args, ['gl']) ));\n    };\n\n    Color_1.prototype.gl = function() {\n        var rgb = this._rgb;\n        return [rgb[0]/255, rgb[1]/255, rgb[2]/255, rgb[3]];\n    };\n\n    var unpack$9 = utils.unpack;\n\n    var rgb2hcg = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        var ref = unpack$9(args, 'rgb');\n        var r = ref[0];\n        var g = ref[1];\n        var b = ref[2];\n        var min = Math.min(r, g, b);\n        var max = Math.max(r, g, b);\n        var delta = max - min;\n        var c = delta * 100 / 255;\n        var _g = min / (255 - delta) * 100;\n        var h;\n        if (delta === 0) {\n            h = Number.NaN;\n        } else {\n            if (r === max) { h = (g - b) / delta; }\n            if (g === max) { h = 2+(b - r) / delta; }\n            if (b === max) { h = 4+(r - g) / delta; }\n            h *= 60;\n            if (h < 0) { h += 360; }\n        }\n        return [h, c, _g];\n    };\n\n    var rgb2hcg_1 = rgb2hcg;\n\n    var unpack$a = utils.unpack;\n    var floor = Math.floor;\n\n    /*\n     * this is basically just HSV with some minor tweaks\n     *\n     * hue.. [0..360]\n     * chroma .. [0..1]\n     * grayness .. [0..1]\n     */\n\n    var hcg2rgb = function () {\n        var assign, assign$1, assign$2, assign$3, assign$4, assign$5;\n\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n        args = unpack$a(args, 'hcg');\n        var h = args[0];\n        var c = args[1];\n        var _g = args[2];\n        var r,g,b;\n        _g = _g * 255;\n        var _c = c * 255;\n        if (c === 0) {\n            r = g = b = _g;\n        } else {\n            if (h === 360) { h = 0; }\n            if (h > 360) { h -= 360; }\n            if (h < 0) { h += 360; }\n            h /= 60;\n            var i = floor(h);\n            var f = h - i;\n            var p = _g * (1 - c);\n            var q = p + _c * (1 - f);\n            var t = p + _c * f;\n            var v = p + _c;\n            switch (i) {\n                case 0: (assign = [v, t, p], r = assign[0], g = assign[1], b = assign[2]); break\n                case 1: (assign$1 = [q, v, p], r = assign$1[0], g = assign$1[1], b = assign$1[2]); break\n                case 2: (assign$2 = [p, v, t], r = assign$2[0], g = assign$2[1], b = assign$2[2]); break\n                case 3: (assign$3 = [p, q, v], r = assign$3[0], g = assign$3[1], b = assign$3[2]); break\n                case 4: (assign$4 = [t, p, v], r = assign$4[0], g = assign$4[1], b = assign$4[2]); break\n                case 5: (assign$5 = [v, p, q], r = assign$5[0], g = assign$5[1], b = assign$5[2]); break\n            }\n        }\n        return [r, g, b, args.length > 3 ? args[3] : 1];\n    };\n\n    var hcg2rgb_1 = hcg2rgb;\n\n    var unpack$b = utils.unpack;\n    var type$4 = utils.type;\n\n\n\n\n\n\n    Color_1.prototype.hcg = function() {\n        return rgb2hcg_1(this._rgb);\n    };\n\n    chroma_1.hcg = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        return new (Function.prototype.bind.apply( Color_1, [ null ].concat( args, ['hcg']) ));\n    };\n\n    input.format.hcg = hcg2rgb_1;\n\n    input.autodetect.push({\n        p: 1,\n        test: function () {\n            var args = [], len = arguments.length;\n            while ( len-- ) args[ len ] = arguments[ len ];\n\n            args = unpack$b(args, 'hcg');\n            if (type$4(args) === 'array' && args.length === 3) {\n                return 'hcg';\n            }\n        }\n    });\n\n    var unpack$c = utils.unpack;\n    var last$4 = utils.last;\n    var round$3 = Math.round;\n\n    var rgb2hex = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        var ref = unpack$c(args, 'rgba');\n        var r = ref[0];\n        var g = ref[1];\n        var b = ref[2];\n        var a = ref[3];\n        var mode = last$4(args) || 'auto';\n        if (a === undefined) { a = 1; }\n        if (mode === 'auto') {\n            mode = a < 1 ? 'rgba' : 'rgb';\n        }\n        r = round$3(r);\n        g = round$3(g);\n        b = round$3(b);\n        var u = r << 16 | g << 8 | b;\n        var str = \"000000\" + u.toString(16); //#.toUpperCase();\n        str = str.substr(str.length - 6);\n        var hxa = '0' + round$3(a * 255).toString(16);\n        hxa = hxa.substr(hxa.length - 2);\n        switch (mode.toLowerCase()) {\n            case 'rgba': return (\"#\" + str + hxa);\n            case 'argb': return (\"#\" + hxa + str);\n            default: return (\"#\" + str);\n        }\n    };\n\n    var rgb2hex_1 = rgb2hex;\n\n    var RE_HEX = /^#?([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/;\n    var RE_HEXA = /^#?([A-Fa-f0-9]{8}|[A-Fa-f0-9]{4})$/;\n\n    var hex2rgb = function (hex) {\n        if (hex.match(RE_HEX)) {\n            // remove optional leading #\n            if (hex.length === 4 || hex.length === 7) {\n                hex = hex.substr(1);\n            }\n            // expand short-notation to full six-digit\n            if (hex.length === 3) {\n                hex = hex.split('');\n                hex = hex[0]+hex[0]+hex[1]+hex[1]+hex[2]+hex[2];\n            }\n            var u = parseInt(hex, 16);\n            var r = u >> 16;\n            var g = u >> 8 & 0xFF;\n            var b = u & 0xFF;\n            return [r,g,b,1];\n        }\n\n        // match rgba hex format, eg #FF000077\n        if (hex.match(RE_HEXA)) {\n            if (hex.length === 5 || hex.length === 9) {\n                // remove optional leading #\n                hex = hex.substr(1);\n            }\n            // expand short-notation to full eight-digit\n            if (hex.length === 4) {\n                hex = hex.split('');\n                hex = hex[0]+hex[0]+hex[1]+hex[1]+hex[2]+hex[2]+hex[3]+hex[3];\n            }\n            var u$1 = parseInt(hex, 16);\n            var r$1 = u$1 >> 24 & 0xFF;\n            var g$1 = u$1 >> 16 & 0xFF;\n            var b$1 = u$1 >> 8 & 0xFF;\n            var a = Math.round((u$1 & 0xFF) / 0xFF * 100) / 100;\n            return [r$1,g$1,b$1,a];\n        }\n\n        // we used to check for css colors here\n        // if _input.css? and rgb = _input.css hex\n        //     return rgb\n\n        throw new Error((\"unknown hex color: \" + hex));\n    };\n\n    var hex2rgb_1 = hex2rgb;\n\n    var type$5 = utils.type;\n\n\n\n\n    Color_1.prototype.hex = function(mode) {\n        return rgb2hex_1(this._rgb, mode);\n    };\n\n    chroma_1.hex = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        return new (Function.prototype.bind.apply( Color_1, [ null ].concat( args, ['hex']) ));\n    };\n\n    input.format.hex = hex2rgb_1;\n    input.autodetect.push({\n        p: 4,\n        test: function (h) {\n            var rest = [], len = arguments.length - 1;\n            while ( len-- > 0 ) rest[ len ] = arguments[ len + 1 ];\n\n            if (!rest.length && type$5(h) === 'string' && [3,4,5,6,7,8,9].indexOf(h.length) >= 0) {\n                return 'hex';\n            }\n        }\n    });\n\n    var unpack$d = utils.unpack;\n    var TWOPI = utils.TWOPI;\n    var min = Math.min;\n    var sqrt = Math.sqrt;\n    var acos = Math.acos;\n\n    var rgb2hsi = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        /*\n        borrowed from here:\n        http://hummer.stanford.edu/museinfo/doc/examples/humdrum/keyscape2/rgb2hsi.cpp\n        */\n        var ref = unpack$d(args, 'rgb');\n        var r = ref[0];\n        var g = ref[1];\n        var b = ref[2];\n        r /= 255;\n        g /= 255;\n        b /= 255;\n        var h;\n        var min_ = min(r,g,b);\n        var i = (r+g+b) / 3;\n        var s = i > 0 ? 1 - min_/i : 0;\n        if (s === 0) {\n            h = NaN;\n        } else {\n            h = ((r-g)+(r-b)) / 2;\n            h /= sqrt((r-g)*(r-g) + (r-b)*(g-b));\n            h = acos(h);\n            if (b > g) {\n                h = TWOPI - h;\n            }\n            h /= TWOPI;\n        }\n        return [h*360,s,i];\n    };\n\n    var rgb2hsi_1 = rgb2hsi;\n\n    var unpack$e = utils.unpack;\n    var limit$1 = utils.limit;\n    var TWOPI$1 = utils.TWOPI;\n    var PITHIRD = utils.PITHIRD;\n    var cos = Math.cos;\n\n    /*\n     * hue [0..360]\n     * saturation [0..1]\n     * intensity [0..1]\n     */\n    var hsi2rgb = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        /*\n        borrowed from here:\n        http://hummer.stanford.edu/museinfo/doc/examples/humdrum/keyscape2/hsi2rgb.cpp\n        */\n        args = unpack$e(args, 'hsi');\n        var h = args[0];\n        var s = args[1];\n        var i = args[2];\n        var r,g,b;\n\n        if (isNaN(h)) { h = 0; }\n        if (isNaN(s)) { s = 0; }\n        // normalize hue\n        if (h > 360) { h -= 360; }\n        if (h < 0) { h += 360; }\n        h /= 360;\n        if (h < 1/3) {\n            b = (1-s)/3;\n            r = (1+s*cos(TWOPI$1*h)/cos(PITHIRD-TWOPI$1*h))/3;\n            g = 1 - (b+r);\n        } else if (h < 2/3) {\n            h -= 1/3;\n            r = (1-s)/3;\n            g = (1+s*cos(TWOPI$1*h)/cos(PITHIRD-TWOPI$1*h))/3;\n            b = 1 - (r+g);\n        } else {\n            h -= 2/3;\n            g = (1-s)/3;\n            b = (1+s*cos(TWOPI$1*h)/cos(PITHIRD-TWOPI$1*h))/3;\n            r = 1 - (g+b);\n        }\n        r = limit$1(i*r*3);\n        g = limit$1(i*g*3);\n        b = limit$1(i*b*3);\n        return [r*255, g*255, b*255, args.length > 3 ? args[3] : 1];\n    };\n\n    var hsi2rgb_1 = hsi2rgb;\n\n    var unpack$f = utils.unpack;\n    var type$6 = utils.type;\n\n\n\n\n\n\n    Color_1.prototype.hsi = function() {\n        return rgb2hsi_1(this._rgb);\n    };\n\n    chroma_1.hsi = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        return new (Function.prototype.bind.apply( Color_1, [ null ].concat( args, ['hsi']) ));\n    };\n\n    input.format.hsi = hsi2rgb_1;\n\n    input.autodetect.push({\n        p: 2,\n        test: function () {\n            var args = [], len = arguments.length;\n            while ( len-- ) args[ len ] = arguments[ len ];\n\n            args = unpack$f(args, 'hsi');\n            if (type$6(args) === 'array' && args.length === 3) {\n                return 'hsi';\n            }\n        }\n    });\n\n    var unpack$g = utils.unpack;\n    var type$7 = utils.type;\n\n\n\n\n\n\n    Color_1.prototype.hsl = function() {\n        return rgb2hsl_1(this._rgb);\n    };\n\n    chroma_1.hsl = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        return new (Function.prototype.bind.apply( Color_1, [ null ].concat( args, ['hsl']) ));\n    };\n\n    input.format.hsl = hsl2rgb_1;\n\n    input.autodetect.push({\n        p: 2,\n        test: function () {\n            var args = [], len = arguments.length;\n            while ( len-- ) args[ len ] = arguments[ len ];\n\n            args = unpack$g(args, 'hsl');\n            if (type$7(args) === 'array' && args.length === 3) {\n                return 'hsl';\n            }\n        }\n    });\n\n    var unpack$h = utils.unpack;\n    var min$1 = Math.min;\n    var max$1 = Math.max;\n\n    /*\n     * supported arguments:\n     * - rgb2hsv(r,g,b)\n     * - rgb2hsv([r,g,b])\n     * - rgb2hsv({r,g,b})\n     */\n    var rgb2hsl$1 = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        args = unpack$h(args, 'rgb');\n        var r = args[0];\n        var g = args[1];\n        var b = args[2];\n        var min_ = min$1(r, g, b);\n        var max_ = max$1(r, g, b);\n        var delta = max_ - min_;\n        var h,s,v;\n        v = max_ / 255.0;\n        if (max_ === 0) {\n            h = Number.NaN;\n            s = 0;\n        } else {\n            s = delta / max_;\n            if (r === max_) { h = (g - b) / delta; }\n            if (g === max_) { h = 2+(b - r) / delta; }\n            if (b === max_) { h = 4+(r - g) / delta; }\n            h *= 60;\n            if (h < 0) { h += 360; }\n        }\n        return [h, s, v]\n    };\n\n    var rgb2hsv = rgb2hsl$1;\n\n    var unpack$i = utils.unpack;\n    var floor$1 = Math.floor;\n\n    var hsv2rgb = function () {\n        var assign, assign$1, assign$2, assign$3, assign$4, assign$5;\n\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n        args = unpack$i(args, 'hsv');\n        var h = args[0];\n        var s = args[1];\n        var v = args[2];\n        var r,g,b;\n        v *= 255;\n        if (s === 0) {\n            r = g = b = v;\n        } else {\n            if (h === 360) { h = 0; }\n            if (h > 360) { h -= 360; }\n            if (h < 0) { h += 360; }\n            h /= 60;\n\n            var i = floor$1(h);\n            var f = h - i;\n            var p = v * (1 - s);\n            var q = v * (1 - s * f);\n            var t = v * (1 - s * (1 - f));\n\n            switch (i) {\n                case 0: (assign = [v, t, p], r = assign[0], g = assign[1], b = assign[2]); break\n                case 1: (assign$1 = [q, v, p], r = assign$1[0], g = assign$1[1], b = assign$1[2]); break\n                case 2: (assign$2 = [p, v, t], r = assign$2[0], g = assign$2[1], b = assign$2[2]); break\n                case 3: (assign$3 = [p, q, v], r = assign$3[0], g = assign$3[1], b = assign$3[2]); break\n                case 4: (assign$4 = [t, p, v], r = assign$4[0], g = assign$4[1], b = assign$4[2]); break\n                case 5: (assign$5 = [v, p, q], r = assign$5[0], g = assign$5[1], b = assign$5[2]); break\n            }\n        }\n        return [r,g,b,args.length > 3?args[3]:1];\n    };\n\n    var hsv2rgb_1 = hsv2rgb;\n\n    var unpack$j = utils.unpack;\n    var type$8 = utils.type;\n\n\n\n\n\n\n    Color_1.prototype.hsv = function() {\n        return rgb2hsv(this._rgb);\n    };\n\n    chroma_1.hsv = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        return new (Function.prototype.bind.apply( Color_1, [ null ].concat( args, ['hsv']) ));\n    };\n\n    input.format.hsv = hsv2rgb_1;\n\n    input.autodetect.push({\n        p: 2,\n        test: function () {\n            var args = [], len = arguments.length;\n            while ( len-- ) args[ len ] = arguments[ len ];\n\n            args = unpack$j(args, 'hsv');\n            if (type$8(args) === 'array' && args.length === 3) {\n                return 'hsv';\n            }\n        }\n    });\n\n    var labConstants = {\n        // Corresponds roughly to RGB brighter/darker\n        Kn: 18,\n\n        // D65 standard referent\n        Xn: 0.950470,\n        Yn: 1,\n        Zn: 1.088830,\n\n        t0: 0.137931034,  // 4 / 29\n        t1: 0.206896552,  // 6 / 29\n        t2: 0.12841855,   // 3 * t1 * t1\n        t3: 0.008856452,  // t1 * t1 * t1\n    };\n\n    var unpack$k = utils.unpack;\n    var pow = Math.pow;\n\n    var rgb2lab = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        var ref = unpack$k(args, 'rgb');\n        var r = ref[0];\n        var g = ref[1];\n        var b = ref[2];\n        var ref$1 = rgb2xyz(r,g,b);\n        var x = ref$1[0];\n        var y = ref$1[1];\n        var z = ref$1[2];\n        var l = 116 * y - 16;\n        return [l < 0 ? 0 : l, 500 * (x - y), 200 * (y - z)];\n    };\n\n    var rgb_xyz = function (r) {\n        if ((r /= 255) <= 0.04045) { return r / 12.92; }\n        return pow((r + 0.055) / 1.055, 2.4);\n    };\n\n    var xyz_lab = function (t) {\n        if (t > labConstants.t3) { return pow(t, 1 / 3); }\n        return t / labConstants.t2 + labConstants.t0;\n    };\n\n    var rgb2xyz = function (r,g,b) {\n        r = rgb_xyz(r);\n        g = rgb_xyz(g);\n        b = rgb_xyz(b);\n        var x = xyz_lab((0.4124564 * r + 0.3575761 * g + 0.1804375 * b) / labConstants.Xn);\n        var y = xyz_lab((0.2126729 * r + 0.7151522 * g + 0.0721750 * b) / labConstants.Yn);\n        var z = xyz_lab((0.0193339 * r + 0.1191920 * g + 0.9503041 * b) / labConstants.Zn);\n        return [x,y,z];\n    };\n\n    var rgb2lab_1 = rgb2lab;\n\n    var unpack$l = utils.unpack;\n    var pow$1 = Math.pow;\n\n    /*\n     * L* [0..100]\n     * a [-100..100]\n     * b [-100..100]\n     */\n    var lab2rgb = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        args = unpack$l(args, 'lab');\n        var l = args[0];\n        var a = args[1];\n        var b = args[2];\n        var x,y,z, r,g,b_;\n\n        y = (l + 16) / 116;\n        x = isNaN(a) ? y : y + a / 500;\n        z = isNaN(b) ? y : y - b / 200;\n\n        y = labConstants.Yn * lab_xyz(y);\n        x = labConstants.Xn * lab_xyz(x);\n        z = labConstants.Zn * lab_xyz(z);\n\n        r = xyz_rgb(3.2404542 * x - 1.5371385 * y - 0.4985314 * z);  // D65 -> sRGB\n        g = xyz_rgb(-0.9692660 * x + 1.8760108 * y + 0.0415560 * z);\n        b_ = xyz_rgb(0.0556434 * x - 0.2040259 * y + 1.0572252 * z);\n\n        return [r,g,b_,args.length > 3 ? args[3] : 1];\n    };\n\n    var xyz_rgb = function (r) {\n        return 255 * (r <= 0.00304 ? 12.92 * r : 1.055 * pow$1(r, 1 / 2.4) - 0.055)\n    };\n\n    var lab_xyz = function (t) {\n        return t > labConstants.t1 ? t * t * t : labConstants.t2 * (t - labConstants.t0)\n    };\n\n    var lab2rgb_1 = lab2rgb;\n\n    var unpack$m = utils.unpack;\n    var type$9 = utils.type;\n\n\n\n\n\n\n    Color_1.prototype.lab = function() {\n        return rgb2lab_1(this._rgb);\n    };\n\n    chroma_1.lab = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        return new (Function.prototype.bind.apply( Color_1, [ null ].concat( args, ['lab']) ));\n    };\n\n    input.format.lab = lab2rgb_1;\n\n    input.autodetect.push({\n        p: 2,\n        test: function () {\n            var args = [], len = arguments.length;\n            while ( len-- ) args[ len ] = arguments[ len ];\n\n            args = unpack$m(args, 'lab');\n            if (type$9(args) === 'array' && args.length === 3) {\n                return 'lab';\n            }\n        }\n    });\n\n    var unpack$n = utils.unpack;\n    var RAD2DEG = utils.RAD2DEG;\n    var sqrt$1 = Math.sqrt;\n    var atan2 = Math.atan2;\n    var round$4 = Math.round;\n\n    var lab2lch = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        var ref = unpack$n(args, 'lab');\n        var l = ref[0];\n        var a = ref[1];\n        var b = ref[2];\n        var c = sqrt$1(a * a + b * b);\n        var h = (atan2(b, a) * RAD2DEG + 360) % 360;\n        if (round$4(c*10000) === 0) { h = Number.NaN; }\n        return [l, c, h];\n    };\n\n    var lab2lch_1 = lab2lch;\n\n    var unpack$o = utils.unpack;\n\n\n\n    var rgb2lch = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        var ref = unpack$o(args, 'rgb');\n        var r = ref[0];\n        var g = ref[1];\n        var b = ref[2];\n        var ref$1 = rgb2lab_1(r,g,b);\n        var l = ref$1[0];\n        var a = ref$1[1];\n        var b_ = ref$1[2];\n        return lab2lch_1(l,a,b_);\n    };\n\n    var rgb2lch_1 = rgb2lch;\n\n    var unpack$p = utils.unpack;\n    var DEG2RAD = utils.DEG2RAD;\n    var sin = Math.sin;\n    var cos$1 = Math.cos;\n\n    var lch2lab = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        /*\n        Convert from a qualitative parameter h and a quantitative parameter l to a 24-bit pixel.\n        These formulas were invented by David Dalrymple to obtain maximum contrast without going\n        out of gamut if the parameters are in the range 0-1.\n\n        A saturation multiplier was added by Gregor Aisch\n        */\n        var ref = unpack$p(args, 'lch');\n        var l = ref[0];\n        var c = ref[1];\n        var h = ref[2];\n        if (isNaN(h)) { h = 0; }\n        h = h * DEG2RAD;\n        return [l, cos$1(h) * c, sin(h) * c]\n    };\n\n    var lch2lab_1 = lch2lab;\n\n    var unpack$q = utils.unpack;\n\n\n\n    var lch2rgb = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        args = unpack$q(args, 'lch');\n        var l = args[0];\n        var c = args[1];\n        var h = args[2];\n        var ref = lch2lab_1 (l,c,h);\n        var L = ref[0];\n        var a = ref[1];\n        var b_ = ref[2];\n        var ref$1 = lab2rgb_1 (L,a,b_);\n        var r = ref$1[0];\n        var g = ref$1[1];\n        var b = ref$1[2];\n        return [r, g, b, args.length > 3 ? args[3] : 1];\n    };\n\n    var lch2rgb_1 = lch2rgb;\n\n    var unpack$r = utils.unpack;\n\n\n    var hcl2rgb = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        var hcl = unpack$r(args, 'hcl').reverse();\n        return lch2rgb_1.apply(void 0, hcl);\n    };\n\n    var hcl2rgb_1 = hcl2rgb;\n\n    var unpack$s = utils.unpack;\n    var type$a = utils.type;\n\n\n\n\n\n\n    Color_1.prototype.lch = function() { return rgb2lch_1(this._rgb); };\n    Color_1.prototype.hcl = function() { return rgb2lch_1(this._rgb).reverse(); };\n\n    chroma_1.lch = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        return new (Function.prototype.bind.apply( Color_1, [ null ].concat( args, ['lch']) ));\n    };\n    chroma_1.hcl = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        return new (Function.prototype.bind.apply( Color_1, [ null ].concat( args, ['hcl']) ));\n    };\n\n    input.format.lch = lch2rgb_1;\n    input.format.hcl = hcl2rgb_1;\n\n    ['lch','hcl'].forEach(function (m) { return input.autodetect.push({\n        p: 2,\n        test: function () {\n            var args = [], len = arguments.length;\n            while ( len-- ) args[ len ] = arguments[ len ];\n\n            args = unpack$s(args, m);\n            if (type$a(args) === 'array' && args.length === 3) {\n                return m;\n            }\n        }\n    }); });\n\n    /**\n    \tX11 color names\n\n    \thttp://www.w3.org/TR/css3-color/#svg-color\n    */\n\n    var w3cx11 = {\n        aliceblue: '#f0f8ff',\n        antiquewhite: '#faebd7',\n        aqua: '#00ffff',\n        aquamarine: '#7fffd4',\n        azure: '#f0ffff',\n        beige: '#f5f5dc',\n        bisque: '#ffe4c4',\n        black: '#000000',\n        blanchedalmond: '#ffebcd',\n        blue: '#0000ff',\n        blueviolet: '#8a2be2',\n        brown: '#a52a2a',\n        burlywood: '#deb887',\n        cadetblue: '#5f9ea0',\n        chartreuse: '#7fff00',\n        chocolate: '#d2691e',\n        coral: '#ff7f50',\n        cornflower: '#6495ed',\n        cornflowerblue: '#6495ed',\n        cornsilk: '#fff8dc',\n        crimson: '#dc143c',\n        cyan: '#00ffff',\n        darkblue: '#00008b',\n        darkcyan: '#008b8b',\n        darkgoldenrod: '#b8860b',\n        darkgray: '#a9a9a9',\n        darkgreen: '#006400',\n        darkgrey: '#a9a9a9',\n        darkkhaki: '#bdb76b',\n        darkmagenta: '#8b008b',\n        darkolivegreen: '#556b2f',\n        darkorange: '#ff8c00',\n        darkorchid: '#9932cc',\n        darkred: '#8b0000',\n        darksalmon: '#e9967a',\n        darkseagreen: '#8fbc8f',\n        darkslateblue: '#483d8b',\n        darkslategray: '#2f4f4f',\n        darkslategrey: '#2f4f4f',\n        darkturquoise: '#00ced1',\n        darkviolet: '#9400d3',\n        deeppink: '#ff1493',\n        deepskyblue: '#00bfff',\n        dimgray: '#696969',\n        dimgrey: '#696969',\n        dodgerblue: '#1e90ff',\n        firebrick: '#b22222',\n        floralwhite: '#fffaf0',\n        forestgreen: '#228b22',\n        fuchsia: '#ff00ff',\n        gainsboro: '#dcdcdc',\n        ghostwhite: '#f8f8ff',\n        gold: '#ffd700',\n        goldenrod: '#daa520',\n        gray: '#808080',\n        green: '#008000',\n        greenyellow: '#adff2f',\n        grey: '#808080',\n        honeydew: '#f0fff0',\n        hotpink: '#ff69b4',\n        indianred: '#cd5c5c',\n        indigo: '#4b0082',\n        ivory: '#fffff0',\n        khaki: '#f0e68c',\n        laserlemon: '#ffff54',\n        lavender: '#e6e6fa',\n        lavenderblush: '#fff0f5',\n        lawngreen: '#7cfc00',\n        lemonchiffon: '#fffacd',\n        lightblue: '#add8e6',\n        lightcoral: '#f08080',\n        lightcyan: '#e0ffff',\n        lightgoldenrod: '#fafad2',\n        lightgoldenrodyellow: '#fafad2',\n        lightgray: '#d3d3d3',\n        lightgreen: '#90ee90',\n        lightgrey: '#d3d3d3',\n        lightpink: '#ffb6c1',\n        lightsalmon: '#ffa07a',\n        lightseagreen: '#20b2aa',\n        lightskyblue: '#87cefa',\n        lightslategray: '#778899',\n        lightslategrey: '#778899',\n        lightsteelblue: '#b0c4de',\n        lightyellow: '#ffffe0',\n        lime: '#00ff00',\n        limegreen: '#32cd32',\n        linen: '#faf0e6',\n        magenta: '#ff00ff',\n        maroon: '#800000',\n        maroon2: '#7f0000',\n        maroon3: '#b03060',\n        mediumaquamarine: '#66cdaa',\n        mediumblue: '#0000cd',\n        mediumorchid: '#ba55d3',\n        mediumpurple: '#9370db',\n        mediumseagreen: '#3cb371',\n        mediumslateblue: '#7b68ee',\n        mediumspringgreen: '#00fa9a',\n        mediumturquoise: '#48d1cc',\n        mediumvioletred: '#c71585',\n        midnightblue: '#191970',\n        mintcream: '#f5fffa',\n        mistyrose: '#ffe4e1',\n        moccasin: '#ffe4b5',\n        navajowhite: '#ffdead',\n        navy: '#000080',\n        oldlace: '#fdf5e6',\n        olive: '#808000',\n        olivedrab: '#6b8e23',\n        orange: '#ffa500',\n        orangered: '#ff4500',\n        orchid: '#da70d6',\n        palegoldenrod: '#eee8aa',\n        palegreen: '#98fb98',\n        paleturquoise: '#afeeee',\n        palevioletred: '#db7093',\n        papayawhip: '#ffefd5',\n        peachpuff: '#ffdab9',\n        peru: '#cd853f',\n        pink: '#ffc0cb',\n        plum: '#dda0dd',\n        powderblue: '#b0e0e6',\n        purple: '#800080',\n        purple2: '#7f007f',\n        purple3: '#a020f0',\n        rebeccapurple: '#663399',\n        red: '#ff0000',\n        rosybrown: '#bc8f8f',\n        royalblue: '#4169e1',\n        saddlebrown: '#8b4513',\n        salmon: '#fa8072',\n        sandybrown: '#f4a460',\n        seagreen: '#2e8b57',\n        seashell: '#fff5ee',\n        sienna: '#a0522d',\n        silver: '#c0c0c0',\n        skyblue: '#87ceeb',\n        slateblue: '#6a5acd',\n        slategray: '#708090',\n        slategrey: '#708090',\n        snow: '#fffafa',\n        springgreen: '#00ff7f',\n        steelblue: '#4682b4',\n        tan: '#d2b48c',\n        teal: '#008080',\n        thistle: '#d8bfd8',\n        tomato: '#ff6347',\n        turquoise: '#40e0d0',\n        violet: '#ee82ee',\n        wheat: '#f5deb3',\n        white: '#ffffff',\n        whitesmoke: '#f5f5f5',\n        yellow: '#ffff00',\n        yellowgreen: '#9acd32'\n    };\n\n    var w3cx11_1 = w3cx11;\n\n    var type$b = utils.type;\n\n\n\n\n\n    Color_1.prototype.name = function() {\n        var hex = rgb2hex_1(this._rgb, 'rgb');\n        for (var i = 0, list = Object.keys(w3cx11_1); i < list.length; i += 1) {\n            var n = list[i];\n\n            if (w3cx11_1[n] === hex) { return n.toLowerCase(); }\n        }\n        return hex;\n    };\n\n    input.format.named = function (name) {\n        name = name.toLowerCase();\n        if (w3cx11_1[name]) { return hex2rgb_1(w3cx11_1[name]); }\n        throw new Error('unknown color name: '+name);\n    };\n\n    input.autodetect.push({\n        p: 5,\n        test: function (h) {\n            var rest = [], len = arguments.length - 1;\n            while ( len-- > 0 ) rest[ len ] = arguments[ len + 1 ];\n\n            if (!rest.length && type$b(h) === 'string' && w3cx11_1[h.toLowerCase()]) {\n                return 'named';\n            }\n        }\n    });\n\n    var unpack$t = utils.unpack;\n\n    var rgb2num = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        var ref = unpack$t(args, 'rgb');\n        var r = ref[0];\n        var g = ref[1];\n        var b = ref[2];\n        return (r << 16) + (g << 8) + b;\n    };\n\n    var rgb2num_1 = rgb2num;\n\n    var type$c = utils.type;\n\n    var num2rgb = function (num) {\n        if (type$c(num) == \"number\" && num >= 0 && num <= 0xFFFFFF) {\n            var r = num >> 16;\n            var g = (num >> 8) & 0xFF;\n            var b = num & 0xFF;\n            return [r,g,b,1];\n        }\n        throw new Error(\"unknown num color: \"+num);\n    };\n\n    var num2rgb_1 = num2rgb;\n\n    var type$d = utils.type;\n\n\n\n    Color_1.prototype.num = function() {\n        return rgb2num_1(this._rgb);\n    };\n\n    chroma_1.num = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        return new (Function.prototype.bind.apply( Color_1, [ null ].concat( args, ['num']) ));\n    };\n\n    input.format.num = num2rgb_1;\n\n    input.autodetect.push({\n        p: 5,\n        test: function () {\n            var args = [], len = arguments.length;\n            while ( len-- ) args[ len ] = arguments[ len ];\n\n            if (args.length === 1 && type$d(args[0]) === 'number' && args[0] >= 0 && args[0] <= 0xFFFFFF) {\n                return 'num';\n            }\n        }\n    });\n\n    var unpack$u = utils.unpack;\n    var type$e = utils.type;\n    var round$5 = Math.round;\n\n    Color_1.prototype.rgb = function(rnd) {\n        if ( rnd === void 0 ) rnd=true;\n\n        if (rnd === false) { return this._rgb.slice(0,3); }\n        return this._rgb.slice(0,3).map(round$5);\n    };\n\n    Color_1.prototype.rgba = function(rnd) {\n        if ( rnd === void 0 ) rnd=true;\n\n        return this._rgb.slice(0,4).map(function (v,i) {\n            return i<3 ? (rnd === false ? v : round$5(v)) : v;\n        });\n    };\n\n    chroma_1.rgb = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        return new (Function.prototype.bind.apply( Color_1, [ null ].concat( args, ['rgb']) ));\n    };\n\n    input.format.rgb = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        var rgba = unpack$u(args, 'rgba');\n        if (rgba[3] === undefined) { rgba[3] = 1; }\n        return rgba;\n    };\n\n    input.autodetect.push({\n        p: 3,\n        test: function () {\n            var args = [], len = arguments.length;\n            while ( len-- ) args[ len ] = arguments[ len ];\n\n            args = unpack$u(args, 'rgba');\n            if (type$e(args) === 'array' && (args.length === 3 ||\n                args.length === 4 && type$e(args[3]) == 'number' && args[3] >= 0 && args[3] <= 1)) {\n                return 'rgb';\n            }\n        }\n    });\n\n    /*\n     * Based on implementation by Neil Bartlett\n     * https://github.com/neilbartlett/color-temperature\n     */\n\n    var log = Math.log;\n\n    var temperature2rgb = function (kelvin) {\n        var temp = kelvin / 100;\n        var r,g,b;\n        if (temp < 66) {\n            r = 255;\n            g = -155.25485562709179 - 0.44596950469579133 * (g = temp-2) + 104.49216199393888 * log(g);\n            b = temp < 20 ? 0 : -254.76935184120902 + 0.8274096064007395 * (b = temp-10) + 115.67994401066147 * log(b);\n        } else {\n            r = 351.97690566805693 + 0.114206453784165 * (r = temp-55) - 40.25366309332127 * log(r);\n            g = 325.4494125711974 + 0.07943456536662342 * (g = temp-50) - 28.0852963507957 * log(g);\n            b = 255;\n        }\n        return [r,g,b,1];\n    };\n\n    var temperature2rgb_1 = temperature2rgb;\n\n    /*\n     * Based on implementation by Neil Bartlett\n     * https://github.com/neilbartlett/color-temperature\n     **/\n\n\n    var unpack$v = utils.unpack;\n    var round$6 = Math.round;\n\n    var rgb2temperature = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        var rgb = unpack$v(args, 'rgb');\n        var r = rgb[0], b = rgb[2];\n        var minTemp = 1000;\n        var maxTemp = 40000;\n        var eps = 0.4;\n        var temp;\n        while (maxTemp - minTemp > eps) {\n            temp = (maxTemp + minTemp) * 0.5;\n            var rgb$1 = temperature2rgb_1(temp);\n            if ((rgb$1[2] / rgb$1[0]) >= (b / r)) {\n                maxTemp = temp;\n            } else {\n                minTemp = temp;\n            }\n        }\n        return round$6(temp);\n    };\n\n    var rgb2temperature_1 = rgb2temperature;\n\n    Color_1.prototype.temp =\n    Color_1.prototype.kelvin =\n    Color_1.prototype.temperature = function() {\n        return rgb2temperature_1(this._rgb);\n    };\n\n    chroma_1.temp =\n    chroma_1.kelvin =\n    chroma_1.temperature = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        return new (Function.prototype.bind.apply( Color_1, [ null ].concat( args, ['temp']) ));\n    };\n\n    input.format.temp =\n    input.format.kelvin =\n    input.format.temperature = temperature2rgb_1;\n\n    var type$f = utils.type;\n\n    Color_1.prototype.alpha = function(a, mutate) {\n        if ( mutate === void 0 ) mutate=false;\n\n        if (a !== undefined && type$f(a) === 'number') {\n            if (mutate) {\n                this._rgb[3] = a;\n                return this;\n            }\n            return new Color_1([this._rgb[0], this._rgb[1], this._rgb[2], a], 'rgb');\n        }\n        return this._rgb[3];\n    };\n\n    Color_1.prototype.clipped = function() {\n        return this._rgb._clipped || false;\n    };\n\n    Color_1.prototype.darken = function(amount) {\n    \tif ( amount === void 0 ) amount=1;\n\n    \tvar me = this;\n    \tvar lab = me.lab();\n    \tlab[0] -= labConstants.Kn * amount;\n    \treturn new Color_1(lab, 'lab').alpha(me.alpha(), true);\n    };\n\n    Color_1.prototype.brighten = function(amount) {\n    \tif ( amount === void 0 ) amount=1;\n\n    \treturn this.darken(-amount);\n    };\n\n    Color_1.prototype.darker = Color_1.prototype.darken;\n    Color_1.prototype.brighter = Color_1.prototype.brighten;\n\n    Color_1.prototype.get = function(mc) {\n        var ref = mc.split('.');\n        var mode = ref[0];\n        var channel = ref[1];\n        var src = this[mode]();\n        if (channel) {\n            var i = mode.indexOf(channel);\n            if (i > -1) { return src[i]; }\n            throw new Error((\"unknown channel \" + channel + \" in mode \" + mode));\n        } else {\n            return src;\n        }\n    };\n\n    var type$g = utils.type;\n    var pow$2 = Math.pow;\n\n    var EPS = 1e-7;\n    var MAX_ITER = 20;\n\n    Color_1.prototype.luminance = function(lum) {\n        if (lum !== undefined && type$g(lum) === 'number') {\n            if (lum === 0) {\n                // return pure black\n                return new Color_1([0,0,0,this._rgb[3]], 'rgb');\n            }\n            if (lum === 1) {\n                // return pure white\n                return new Color_1([255,255,255,this._rgb[3]], 'rgb');\n            }\n            // compute new color using...\n            var cur_lum = this.luminance();\n            var mode = 'rgb';\n            var max_iter = MAX_ITER;\n\n            var test = function (low, high) {\n                var mid = low.interpolate(high, 0.5, mode);\n                var lm = mid.luminance();\n                if (Math.abs(lum - lm) < EPS || !max_iter--) {\n                    // close enough\n                    return mid;\n                }\n                return lm > lum ? test(low, mid) : test(mid, high);\n            };\n\n            var rgb = (cur_lum > lum ? test(new Color_1([0,0,0]), this) : test(this, new Color_1([255,255,255]))).rgb();\n            return new Color_1(rgb.concat( [this._rgb[3]]));\n        }\n        return rgb2luminance.apply(void 0, (this._rgb).slice(0,3));\n    };\n\n\n    var rgb2luminance = function (r,g,b) {\n        // relative luminance\n        // see http://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef\n        r = luminance_x(r);\n        g = luminance_x(g);\n        b = luminance_x(b);\n        return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n    };\n\n    var luminance_x = function (x) {\n        x /= 255;\n        return x <= 0.03928 ? x/12.92 : pow$2((x+0.055)/1.055, 2.4);\n    };\n\n    var interpolator = {};\n\n    var type$h = utils.type;\n\n\n    var mix = function (col1, col2, f) {\n        if ( f === void 0 ) f=0.5;\n        var rest = [], len = arguments.length - 3;\n        while ( len-- > 0 ) rest[ len ] = arguments[ len + 3 ];\n\n        var mode = rest[0] || 'lrgb';\n        if (!interpolator[mode] && !rest.length) {\n            // fall back to the first supported mode\n            mode = Object.keys(interpolator)[0];\n        }\n        if (!interpolator[mode]) {\n            throw new Error((\"interpolation mode \" + mode + \" is not defined\"));\n        }\n        if (type$h(col1) !== 'object') { col1 = new Color_1(col1); }\n        if (type$h(col2) !== 'object') { col2 = new Color_1(col2); }\n        return interpolator[mode](col1, col2, f)\n            .alpha(col1.alpha() + f * (col2.alpha() - col1.alpha()));\n    };\n\n    Color_1.prototype.mix =\n    Color_1.prototype.interpolate = function(col2, f) {\n    \tif ( f === void 0 ) f=0.5;\n    \tvar rest = [], len = arguments.length - 2;\n    \twhile ( len-- > 0 ) rest[ len ] = arguments[ len + 2 ];\n\n    \treturn mix.apply(void 0, [ this, col2, f ].concat( rest ));\n    };\n\n    Color_1.prototype.premultiply = function(mutate) {\n    \tif ( mutate === void 0 ) mutate=false;\n\n    \tvar rgb = this._rgb;\n    \tvar a = rgb[3];\n    \tif (mutate) {\n    \t\tthis._rgb = [rgb[0]*a, rgb[1]*a, rgb[2]*a, a];\n    \t\treturn this;\n    \t} else {\n    \t\treturn new Color_1([rgb[0]*a, rgb[1]*a, rgb[2]*a, a], 'rgb');\n    \t}\n    };\n\n    Color_1.prototype.saturate = function(amount) {\n    \tif ( amount === void 0 ) amount=1;\n\n    \tvar me = this;\n    \tvar lch = me.lch();\n    \tlch[1] += labConstants.Kn * amount;\n    \tif (lch[1] < 0) { lch[1] = 0; }\n    \treturn new Color_1(lch, 'lch').alpha(me.alpha(), true);\n    };\n\n    Color_1.prototype.desaturate = function(amount) {\n    \tif ( amount === void 0 ) amount=1;\n\n    \treturn this.saturate(-amount);\n    };\n\n    var type$i = utils.type;\n\n    Color_1.prototype.set = function(mc, value, mutate) {\n        if ( mutate === void 0 ) mutate=false;\n\n        var ref = mc.split('.');\n        var mode = ref[0];\n        var channel = ref[1];\n        var src = this[mode]();\n        if (channel) {\n            var i = mode.indexOf(channel);\n            if (i > -1) {\n                if (type$i(value) == 'string') {\n                    switch(value.charAt(0)) {\n                        case '+': src[i] += +value; break;\n                        case '-': src[i] += +value; break;\n                        case '*': src[i] *= +(value.substr(1)); break;\n                        case '/': src[i] /= +(value.substr(1)); break;\n                        default: src[i] = +value;\n                    }\n                } else if (type$i(value) === 'number') {\n                    src[i] = value;\n                } else {\n                    throw new Error(\"unsupported value for Color.set\");\n                }\n                var out = new Color_1(src, mode);\n                if (mutate) {\n                    this._rgb = out._rgb;\n                    return this;\n                }\n                return out;\n            }\n            throw new Error((\"unknown channel \" + channel + \" in mode \" + mode));\n        } else {\n            return src;\n        }\n    };\n\n    var rgb$1 = function (col1, col2, f) {\n        var xyz0 = col1._rgb;\n        var xyz1 = col2._rgb;\n        return new Color_1(\n            xyz0[0] + f * (xyz1[0]-xyz0[0]),\n            xyz0[1] + f * (xyz1[1]-xyz0[1]),\n            xyz0[2] + f * (xyz1[2]-xyz0[2]),\n            'rgb'\n        )\n    };\n\n    // register interpolator\n    interpolator.rgb = rgb$1;\n\n    var sqrt$2 = Math.sqrt;\n    var pow$3 = Math.pow;\n\n    var lrgb = function (col1, col2, f) {\n        var ref = col1._rgb;\n        var x1 = ref[0];\n        var y1 = ref[1];\n        var z1 = ref[2];\n        var ref$1 = col2._rgb;\n        var x2 = ref$1[0];\n        var y2 = ref$1[1];\n        var z2 = ref$1[2];\n        return new Color_1(\n            sqrt$2(pow$3(x1,2) * (1-f) + pow$3(x2,2) * f),\n            sqrt$2(pow$3(y1,2) * (1-f) + pow$3(y2,2) * f),\n            sqrt$2(pow$3(z1,2) * (1-f) + pow$3(z2,2) * f),\n            'rgb'\n        )\n    };\n\n    // register interpolator\n    interpolator.lrgb = lrgb;\n\n    var lab$1 = function (col1, col2, f) {\n        var xyz0 = col1.lab();\n        var xyz1 = col2.lab();\n        return new Color_1(\n            xyz0[0] + f * (xyz1[0]-xyz0[0]),\n            xyz0[1] + f * (xyz1[1]-xyz0[1]),\n            xyz0[2] + f * (xyz1[2]-xyz0[2]),\n            'lab'\n        )\n    };\n\n    // register interpolator\n    interpolator.lab = lab$1;\n\n    var _hsx = function (col1, col2, f, m) {\n        var assign, assign$1;\n\n        var xyz0, xyz1;\n        if (m === 'hsl') {\n            xyz0 = col1.hsl();\n            xyz1 = col2.hsl();\n        } else if (m === 'hsv') {\n            xyz0 = col1.hsv();\n            xyz1 = col2.hsv();\n        } else if (m === 'hcg') {\n            xyz0 = col1.hcg();\n            xyz1 = col2.hcg();\n        } else if (m === 'hsi') {\n            xyz0 = col1.hsi();\n            xyz1 = col2.hsi();\n        } else if (m === 'lch' || m === 'hcl') {\n            m = 'hcl';\n            xyz0 = col1.hcl();\n            xyz1 = col2.hcl();\n        }\n\n        var hue0, hue1, sat0, sat1, lbv0, lbv1;\n        if (m.substr(0, 1) === 'h') {\n            (assign = xyz0, hue0 = assign[0], sat0 = assign[1], lbv0 = assign[2]);\n            (assign$1 = xyz1, hue1 = assign$1[0], sat1 = assign$1[1], lbv1 = assign$1[2]);\n        }\n\n        var sat, hue, lbv, dh;\n\n        if (!isNaN(hue0) && !isNaN(hue1)) {\n            // both colors have hue\n            if (hue1 > hue0 && hue1 - hue0 > 180) {\n                dh = hue1-(hue0+360);\n            } else if (hue1 < hue0 && hue0 - hue1 > 180) {\n                dh = hue1+360-hue0;\n            } else{\n                dh = hue1 - hue0;\n            }\n            hue = hue0 + f * dh;\n        } else if (!isNaN(hue0)) {\n            hue = hue0;\n            if ((lbv1 == 1 || lbv1 == 0) && m != 'hsv') { sat = sat0; }\n        } else if (!isNaN(hue1)) {\n            hue = hue1;\n            if ((lbv0 == 1 || lbv0 == 0) && m != 'hsv') { sat = sat1; }\n        } else {\n            hue = Number.NaN;\n        }\n\n        if (sat === undefined) { sat = sat0 + f * (sat1 - sat0); }\n        lbv = lbv0 + f * (lbv1-lbv0);\n        return new Color_1([hue, sat, lbv], m);\n    };\n\n    var lch$1 = function (col1, col2, f) {\n    \treturn _hsx(col1, col2, f, 'lch');\n    };\n\n    // register interpolator\n    interpolator.lch = lch$1;\n    interpolator.hcl = lch$1;\n\n    var num$1 = function (col1, col2, f) {\n        var c1 = col1.num();\n        var c2 = col2.num();\n        return new Color_1(c1 + f * (c2-c1), 'num')\n    };\n\n    // register interpolator\n    interpolator.num = num$1;\n\n    var hcg$1 = function (col1, col2, f) {\n    \treturn _hsx(col1, col2, f, 'hcg');\n    };\n\n    // register interpolator\n    interpolator.hcg = hcg$1;\n\n    var hsi$1 = function (col1, col2, f) {\n    \treturn _hsx(col1, col2, f, 'hsi');\n    };\n\n    // register interpolator\n    interpolator.hsi = hsi$1;\n\n    var hsl$1 = function (col1, col2, f) {\n    \treturn _hsx(col1, col2, f, 'hsl');\n    };\n\n    // register interpolator\n    interpolator.hsl = hsl$1;\n\n    var hsv$1 = function (col1, col2, f) {\n    \treturn _hsx(col1, col2, f, 'hsv');\n    };\n\n    // register interpolator\n    interpolator.hsv = hsv$1;\n\n    var clip_rgb$2 = utils.clip_rgb;\n    var pow$4 = Math.pow;\n    var sqrt$3 = Math.sqrt;\n    var PI$1 = Math.PI;\n    var cos$2 = Math.cos;\n    var sin$1 = Math.sin;\n    var atan2$1 = Math.atan2;\n\n    var average = function (colors, mode, weights) {\n        if ( mode === void 0 ) mode='lrgb';\n        if ( weights === void 0 ) weights=null;\n\n        var l = colors.length;\n        if (!weights) { weights = Array.from(new Array(l)).map(function () { return 1; }); }\n        // normalize weights\n        var k = l / weights.reduce(function(a, b) { return a + b; });\n        weights.forEach(function (w,i) { weights[i] *= k; });\n        // convert colors to Color objects\n        colors = colors.map(function (c) { return new Color_1(c); });\n        if (mode === 'lrgb') {\n            return _average_lrgb(colors, weights)\n        }\n        var first = colors.shift();\n        var xyz = first.get(mode);\n        var cnt = [];\n        var dx = 0;\n        var dy = 0;\n        // initial color\n        for (var i=0; i<xyz.length; i++) {\n            xyz[i] = (xyz[i] || 0) * weights[0];\n            cnt.push(isNaN(xyz[i]) ? 0 : weights[0]);\n            if (mode.charAt(i) === 'h' && !isNaN(xyz[i])) {\n                var A = xyz[i] / 180 * PI$1;\n                dx += cos$2(A) * weights[0];\n                dy += sin$1(A) * weights[0];\n            }\n        }\n\n        var alpha = first.alpha() * weights[0];\n        colors.forEach(function (c,ci) {\n            var xyz2 = c.get(mode);\n            alpha += c.alpha() * weights[ci+1];\n            for (var i=0; i<xyz.length; i++) {\n                if (!isNaN(xyz2[i])) {\n                    cnt[i] += weights[ci+1];\n                    if (mode.charAt(i) === 'h') {\n                        var A = xyz2[i] / 180 * PI$1;\n                        dx += cos$2(A) * weights[ci+1];\n                        dy += sin$1(A) * weights[ci+1];\n                    } else {\n                        xyz[i] += xyz2[i] * weights[ci+1];\n                    }\n                }\n            }\n        });\n\n        for (var i$1=0; i$1<xyz.length; i$1++) {\n            if (mode.charAt(i$1) === 'h') {\n                var A$1 = atan2$1(dy / cnt[i$1], dx / cnt[i$1]) / PI$1 * 180;\n                while (A$1 < 0) { A$1 += 360; }\n                while (A$1 >= 360) { A$1 -= 360; }\n                xyz[i$1] = A$1;\n            } else {\n                xyz[i$1] = xyz[i$1]/cnt[i$1];\n            }\n        }\n        alpha /= l;\n        return (new Color_1(xyz, mode)).alpha(alpha > 0.99999 ? 1 : alpha, true);\n    };\n\n\n    var _average_lrgb = function (colors, weights) {\n        var l = colors.length;\n        var xyz = [0,0,0,0];\n        for (var i=0; i < colors.length; i++) {\n            var col = colors[i];\n            var f = weights[i] / l;\n            var rgb = col._rgb;\n            xyz[0] += pow$4(rgb[0],2) * f;\n            xyz[1] += pow$4(rgb[1],2) * f;\n            xyz[2] += pow$4(rgb[2],2) * f;\n            xyz[3] += rgb[3] * f;\n        }\n        xyz[0] = sqrt$3(xyz[0]);\n        xyz[1] = sqrt$3(xyz[1]);\n        xyz[2] = sqrt$3(xyz[2]);\n        if (xyz[3] > 0.9999999) { xyz[3] = 1; }\n        return new Color_1(clip_rgb$2(xyz));\n    };\n\n    // minimal multi-purpose interface\n\n    // @requires utils color analyze\n\n\n    var type$j = utils.type;\n\n    var pow$5 = Math.pow;\n\n    var scale = function(colors) {\n\n        // constructor\n        var _mode = 'rgb';\n        var _nacol = chroma_1('#ccc');\n        var _spread = 0;\n        // const _fixed = false;\n        var _domain = [0, 1];\n        var _pos = [];\n        var _padding = [0,0];\n        var _classes = false;\n        var _colors = [];\n        var _out = false;\n        var _min = 0;\n        var _max = 1;\n        var _correctLightness = false;\n        var _colorCache = {};\n        var _useCache = true;\n        var _gamma = 1;\n\n        // private methods\n\n        var setColors = function(colors) {\n            colors = colors || ['#fff', '#000'];\n            if (colors && type$j(colors) === 'string' && chroma_1.brewer &&\n                chroma_1.brewer[colors.toLowerCase()]) {\n                colors = chroma_1.brewer[colors.toLowerCase()];\n            }\n            if (type$j(colors) === 'array') {\n                // handle single color\n                if (colors.length === 1) {\n                    colors = [colors[0], colors[0]];\n                }\n                // make a copy of the colors\n                colors = colors.slice(0);\n                // convert to chroma classes\n                for (var c=0; c<colors.length; c++) {\n                    colors[c] = chroma_1(colors[c]);\n                }\n                // auto-fill color position\n                _pos.length = 0;\n                for (var c$1=0; c$1<colors.length; c$1++) {\n                    _pos.push(c$1/(colors.length-1));\n                }\n            }\n            resetCache();\n            return _colors = colors;\n        };\n\n        var getClass = function(value) {\n            if (_classes != null) {\n                var n = _classes.length-1;\n                var i = 0;\n                while (i < n && value >= _classes[i]) {\n                    i++;\n                }\n                return i-1;\n            }\n            return 0;\n        };\n\n        var tMapLightness = function (t) { return t; };\n        var tMapDomain = function (t) { return t; };\n\n        // const classifyValue = function(value) {\n        //     let val = value;\n        //     if (_classes.length > 2) {\n        //         const n = _classes.length-1;\n        //         const i = getClass(value);\n        //         const minc = _classes[0] + ((_classes[1]-_classes[0]) * (0 + (_spread * 0.5)));  // center of 1st class\n        //         const maxc = _classes[n-1] + ((_classes[n]-_classes[n-1]) * (1 - (_spread * 0.5)));  // center of last class\n        //         val = _min + ((((_classes[i] + ((_classes[i+1] - _classes[i]) * 0.5)) - minc) / (maxc-minc)) * (_max - _min));\n        //     }\n        //     return val;\n        // };\n\n        var getColor = function(val, bypassMap) {\n            var col, t;\n            if (bypassMap == null) { bypassMap = false; }\n            if (isNaN(val) || (val === null)) { return _nacol; }\n            if (!bypassMap) {\n                if (_classes && (_classes.length > 2)) {\n                    // find the class\n                    var c = getClass(val);\n                    t = c / (_classes.length-2);\n                } else if (_max !== _min) {\n                    // just interpolate between min/max\n                    t = (val - _min) / (_max - _min);\n                } else {\n                    t = 1;\n                }\n            } else {\n                t = val;\n            }\n\n            // domain map\n            t = tMapDomain(t);\n\n            if (!bypassMap) {\n                t = tMapLightness(t);  // lightness correction\n            }\n\n            if (_gamma !== 1) { t = pow$5(t, _gamma); }\n\n            t = _padding[0] + (t * (1 - _padding[0] - _padding[1]));\n\n            t = Math.min(1, Math.max(0, t));\n\n            var k = Math.floor(t * 10000);\n\n            if (_useCache && _colorCache[k]) {\n                col = _colorCache[k];\n            } else {\n                if (type$j(_colors) === 'array') {\n                    //for i in [0.._pos.length-1]\n                    for (var i=0; i<_pos.length; i++) {\n                        var p = _pos[i];\n                        if (t <= p) {\n                            col = _colors[i];\n                            break;\n                        }\n                        if ((t >= p) && (i === (_pos.length-1))) {\n                            col = _colors[i];\n                            break;\n                        }\n                        if (t > p && t < _pos[i+1]) {\n                            t = (t-p)/(_pos[i+1]-p);\n                            col = chroma_1.interpolate(_colors[i], _colors[i+1], t, _mode);\n                            break;\n                        }\n                    }\n                } else if (type$j(_colors) === 'function') {\n                    col = _colors(t);\n                }\n                if (_useCache) { _colorCache[k] = col; }\n            }\n            return col;\n        };\n\n        var resetCache = function () { return _colorCache = {}; };\n\n        setColors(colors);\n\n        // public interface\n\n        var f = function(v) {\n            var c = chroma_1(getColor(v));\n            if (_out && c[_out]) { return c[_out](); } else { return c; }\n        };\n\n        f.classes = function(classes) {\n            if (classes != null) {\n                if (type$j(classes) === 'array') {\n                    _classes = classes;\n                    _domain = [classes[0], classes[classes.length-1]];\n                } else {\n                    var d = chroma_1.analyze(_domain);\n                    if (classes === 0) {\n                        _classes = [d.min, d.max];\n                    } else {\n                        _classes = chroma_1.limits(d, 'e', classes);\n                    }\n                }\n                return f;\n            }\n            return _classes;\n        };\n\n\n        f.domain = function(domain) {\n            if (!arguments.length) {\n                return _domain;\n            }\n            _min = domain[0];\n            _max = domain[domain.length-1];\n            _pos = [];\n            var k = _colors.length;\n            if ((domain.length === k) && (_min !== _max)) {\n                // update positions\n                for (var i = 0, list = Array.from(domain); i < list.length; i += 1) {\n                    var d = list[i];\n\n                  _pos.push((d-_min) / (_max-_min));\n                }\n            } else {\n                for (var c=0; c<k; c++) {\n                    _pos.push(c/(k-1));\n                }\n                if (domain.length > 2) {\n                    // set domain map\n                    var tOut = domain.map(function (d,i) { return i/(domain.length-1); });\n                    var tBreaks = domain.map(function (d) { return (d - _min) / (_max - _min); });\n                    if (!tBreaks.every(function (val, i) { return tOut[i] === val; })) {\n                        tMapDomain = function (t) {\n                            if (t <= 0 || t >= 1) { return t; }\n                            var i = 0;\n                            while (t >= tBreaks[i+1]) { i++; }\n                            var f = (t - tBreaks[i]) / (tBreaks[i+1] - tBreaks[i]);\n                            var out = tOut[i] + f * (tOut[i+1] - tOut[i]);\n                            return out;\n                        };\n                    }\n\n                }\n            }\n            _domain = [_min, _max];\n            return f;\n        };\n\n        f.mode = function(_m) {\n            if (!arguments.length) {\n                return _mode;\n            }\n            _mode = _m;\n            resetCache();\n            return f;\n        };\n\n        f.range = function(colors, _pos) {\n            setColors(colors, _pos);\n            return f;\n        };\n\n        f.out = function(_o) {\n            _out = _o;\n            return f;\n        };\n\n        f.spread = function(val) {\n            if (!arguments.length) {\n                return _spread;\n            }\n            _spread = val;\n            return f;\n        };\n\n        f.correctLightness = function(v) {\n            if (v == null) { v = true; }\n            _correctLightness = v;\n            resetCache();\n            if (_correctLightness) {\n                tMapLightness = function(t) {\n                    var L0 = getColor(0, true).lab()[0];\n                    var L1 = getColor(1, true).lab()[0];\n                    var pol = L0 > L1;\n                    var L_actual = getColor(t, true).lab()[0];\n                    var L_ideal = L0 + ((L1 - L0) * t);\n                    var L_diff = L_actual - L_ideal;\n                    var t0 = 0;\n                    var t1 = 1;\n                    var max_iter = 20;\n                    while ((Math.abs(L_diff) > 1e-2) && (max_iter-- > 0)) {\n                        (function() {\n                            if (pol) { L_diff *= -1; }\n                            if (L_diff < 0) {\n                                t0 = t;\n                                t += (t1 - t) * 0.5;\n                            } else {\n                                t1 = t;\n                                t += (t0 - t) * 0.5;\n                            }\n                            L_actual = getColor(t, true).lab()[0];\n                            return L_diff = L_actual - L_ideal;\n                        })();\n                    }\n                    return t;\n                };\n            } else {\n                tMapLightness = function (t) { return t; };\n            }\n            return f;\n        };\n\n        f.padding = function(p) {\n            if (p != null) {\n                if (type$j(p) === 'number') {\n                    p = [p,p];\n                }\n                _padding = p;\n                return f;\n            } else {\n                return _padding;\n            }\n        };\n\n        f.colors = function(numColors, out) {\n            // If no arguments are given, return the original colors that were provided\n            if (arguments.length < 2) { out = 'hex'; }\n            var result = [];\n\n            if (arguments.length === 0) {\n                result = _colors.slice(0);\n\n            } else if (numColors === 1) {\n                result = [f(0.5)];\n\n            } else if (numColors > 1) {\n                var dm = _domain[0];\n                var dd = _domain[1] - dm;\n                result = __range__(0, numColors, false).map(function (i) { return f( dm + ((i/(numColors-1)) * dd) ); });\n\n            } else { // returns all colors based on the defined classes\n                colors = [];\n                var samples = [];\n                if (_classes && (_classes.length > 2)) {\n                    for (var i = 1, end = _classes.length, asc = 1 <= end; asc ? i < end : i > end; asc ? i++ : i--) {\n                        samples.push((_classes[i-1]+_classes[i])*0.5);\n                    }\n                } else {\n                    samples = _domain;\n                }\n                result = samples.map(function (v) { return f(v); });\n            }\n\n            if (chroma_1[out]) {\n                result = result.map(function (c) { return c[out](); });\n            }\n            return result;\n        };\n\n        f.cache = function(c) {\n            if (c != null) {\n                _useCache = c;\n                return f;\n            } else {\n                return _useCache;\n            }\n        };\n\n        f.gamma = function(g) {\n            if (g != null) {\n                _gamma = g;\n                return f;\n            } else {\n                return _gamma;\n            }\n        };\n\n        f.nodata = function(d) {\n            if (d != null) {\n                _nacol = chroma_1(d);\n                return f;\n            } else {\n                return _nacol;\n            }\n        };\n\n        return f;\n    };\n\n    function __range__(left, right, inclusive) {\n      var range = [];\n      var ascending = left < right;\n      var end = !inclusive ? right : ascending ? right + 1 : right - 1;\n      for (var i = left; ascending ? i < end : i > end; ascending ? i++ : i--) {\n        range.push(i);\n      }\n      return range;\n    }\n\n    //\n    // interpolates between a set of colors uzing a bezier spline\n    //\n\n    // @requires utils lab\n\n\n\n\n    var bezier = function(colors) {\n        var assign, assign$1, assign$2;\n\n        var I, lab0, lab1, lab2;\n        colors = colors.map(function (c) { return new Color_1(c); });\n        if (colors.length === 2) {\n            // linear interpolation\n            (assign = colors.map(function (c) { return c.lab(); }), lab0 = assign[0], lab1 = assign[1]);\n            I = function(t) {\n                var lab = ([0, 1, 2].map(function (i) { return lab0[i] + (t * (lab1[i] - lab0[i])); }));\n                return new Color_1(lab, 'lab');\n            };\n        } else if (colors.length === 3) {\n            // quadratic bezier interpolation\n            (assign$1 = colors.map(function (c) { return c.lab(); }), lab0 = assign$1[0], lab1 = assign$1[1], lab2 = assign$1[2]);\n            I = function(t) {\n                var lab = ([0, 1, 2].map(function (i) { return ((1-t)*(1-t) * lab0[i]) + (2 * (1-t) * t * lab1[i]) + (t * t * lab2[i]); }));\n                return new Color_1(lab, 'lab');\n            };\n        } else if (colors.length === 4) {\n            // cubic bezier interpolation\n            var lab3;\n            (assign$2 = colors.map(function (c) { return c.lab(); }), lab0 = assign$2[0], lab1 = assign$2[1], lab2 = assign$2[2], lab3 = assign$2[3]);\n            I = function(t) {\n                var lab = ([0, 1, 2].map(function (i) { return ((1-t)*(1-t)*(1-t) * lab0[i]) + (3 * (1-t) * (1-t) * t * lab1[i]) + (3 * (1-t) * t * t * lab2[i]) + (t*t*t * lab3[i]); }));\n                return new Color_1(lab, 'lab');\n            };\n        } else if (colors.length === 5) {\n            var I0 = bezier(colors.slice(0, 3));\n            var I1 = bezier(colors.slice(2, 5));\n            I = function(t) {\n                if (t < 0.5) {\n                    return I0(t*2);\n                } else {\n                    return I1((t-0.5)*2);\n                }\n            };\n        }\n        return I;\n    };\n\n    var bezier_1 = function (colors) {\n        var f = bezier(colors);\n        f.scale = function () { return scale(f); };\n        return f;\n    };\n\n    /*\n     * interpolates between a set of colors uzing a bezier spline\n     * blend mode formulas taken from http://www.venture-ware.com/kevin/coding/lets-learn-math-photoshop-blend-modes/\n     */\n\n\n\n\n    var blend = function (bottom, top, mode) {\n        if (!blend[mode]) {\n            throw new Error('unknown blend mode ' + mode);\n        }\n        return blend[mode](bottom, top);\n    };\n\n    var blend_f = function (f) { return function (bottom,top) {\n            var c0 = chroma_1(top).rgb();\n            var c1 = chroma_1(bottom).rgb();\n            return chroma_1.rgb(f(c0, c1));\n        }; };\n\n    var each = function (f) { return function (c0, c1) {\n            var out = [];\n            out[0] = f(c0[0], c1[0]);\n            out[1] = f(c0[1], c1[1]);\n            out[2] = f(c0[2], c1[2]);\n            return out;\n        }; };\n\n    var normal = function (a) { return a; };\n    var multiply = function (a,b) { return a * b / 255; };\n    var darken$1 = function (a,b) { return a > b ? b : a; };\n    var lighten = function (a,b) { return a > b ? a : b; };\n    var screen = function (a,b) { return 255 * (1 - (1-a/255) * (1-b/255)); };\n    var overlay = function (a,b) { return b < 128 ? 2 * a * b / 255 : 255 * (1 - 2 * (1 - a / 255 ) * ( 1 - b / 255 )); };\n    var burn = function (a,b) { return 255 * (1 - (1 - b / 255) / (a/255)); };\n    var dodge = function (a,b) {\n        if (a === 255) { return 255; }\n        a = 255 * (b / 255) / (1 - a / 255);\n        return a > 255 ? 255 : a\n    };\n\n    // # add = (a,b) ->\n    // #     if (a + b > 255) then 255 else a + b\n\n    blend.normal = blend_f(each(normal));\n    blend.multiply = blend_f(each(multiply));\n    blend.screen = blend_f(each(screen));\n    blend.overlay = blend_f(each(overlay));\n    blend.darken = blend_f(each(darken$1));\n    blend.lighten = blend_f(each(lighten));\n    blend.dodge = blend_f(each(dodge));\n    blend.burn = blend_f(each(burn));\n    // blend.add = blend_f(each(add));\n\n    var blend_1 = blend;\n\n    // cubehelix interpolation\n    // based on D.A. Green \"A colour scheme for the display of astronomical intensity images\"\n    // http://astron-soc.in/bulletin/11June/289392011.pdf\n\n    var type$k = utils.type;\n    var clip_rgb$3 = utils.clip_rgb;\n    var TWOPI$2 = utils.TWOPI;\n    var pow$6 = Math.pow;\n    var sin$2 = Math.sin;\n    var cos$3 = Math.cos;\n\n\n    var cubehelix = function(start, rotations, hue, gamma, lightness) {\n        if ( start === void 0 ) start=300;\n        if ( rotations === void 0 ) rotations=-1.5;\n        if ( hue === void 0 ) hue=1;\n        if ( gamma === void 0 ) gamma=1;\n        if ( lightness === void 0 ) lightness=[0,1];\n\n        var dh = 0, dl;\n        if (type$k(lightness) === 'array') {\n            dl = lightness[1] - lightness[0];\n        } else {\n            dl = 0;\n            lightness = [lightness, lightness];\n        }\n\n        var f = function(fract) {\n            var a = TWOPI$2 * (((start+120)/360) + (rotations * fract));\n            var l = pow$6(lightness[0] + (dl * fract), gamma);\n            var h = dh !== 0 ? hue[0] + (fract * dh) : hue;\n            var amp = (h * l * (1-l)) / 2;\n            var cos_a = cos$3(a);\n            var sin_a = sin$2(a);\n            var r = l + (amp * ((-0.14861 * cos_a) + (1.78277* sin_a)));\n            var g = l + (amp * ((-0.29227 * cos_a) - (0.90649* sin_a)));\n            var b = l + (amp * (+1.97294 * cos_a));\n            return chroma_1(clip_rgb$3([r*255,g*255,b*255,1]));\n        };\n\n        f.start = function(s) {\n            if ((s == null)) { return start; }\n            start = s;\n            return f;\n        };\n\n        f.rotations = function(r) {\n            if ((r == null)) { return rotations; }\n            rotations = r;\n            return f;\n        };\n\n        f.gamma = function(g) {\n            if ((g == null)) { return gamma; }\n            gamma = g;\n            return f;\n        };\n\n        f.hue = function(h) {\n            if ((h == null)) { return hue; }\n            hue = h;\n            if (type$k(hue) === 'array') {\n                dh = hue[1] - hue[0];\n                if (dh === 0) { hue = hue[1]; }\n            } else {\n                dh = 0;\n            }\n            return f;\n        };\n\n        f.lightness = function(h) {\n            if ((h == null)) { return lightness; }\n            if (type$k(h) === 'array') {\n                lightness = h;\n                dl = h[1] - h[0];\n            } else {\n                lightness = [h,h];\n                dl = 0;\n            }\n            return f;\n        };\n\n        f.scale = function () { return chroma_1.scale(f); };\n\n        f.hue(hue);\n\n        return f;\n    };\n\n    var digits = '0123456789abcdef';\n\n    var floor$2 = Math.floor;\n    var random = Math.random;\n\n    var random_1 = function () {\n        var code = '#';\n        for (var i=0; i<6; i++) {\n            code += digits.charAt(floor$2(random() * 16));\n        }\n        return new Color_1(code, 'hex');\n    };\n\n    var log$1 = Math.log;\n    var pow$7 = Math.pow;\n    var floor$3 = Math.floor;\n    var abs = Math.abs;\n\n\n    var analyze = function (data, key) {\n        if ( key === void 0 ) key=null;\n\n        var r = {\n            min: Number.MAX_VALUE,\n            max: Number.MAX_VALUE*-1,\n            sum: 0,\n            values: [],\n            count: 0\n        };\n        if (type(data) === 'object') {\n            data = Object.values(data);\n        }\n        data.forEach(function (val) {\n            if (key && type(val) === 'object') { val = val[key]; }\n            if (val !== undefined && val !== null && !isNaN(val)) {\n                r.values.push(val);\n                r.sum += val;\n                if (val < r.min) { r.min = val; }\n                if (val > r.max) { r.max = val; }\n                r.count += 1;\n            }\n        });\n\n        r.domain = [r.min, r.max];\n\n        r.limits = function (mode, num) { return limits(r, mode, num); };\n\n        return r;\n    };\n\n\n    var limits = function (data, mode, num) {\n        if ( mode === void 0 ) mode='equal';\n        if ( num === void 0 ) num=7;\n\n        if (type(data) == 'array') {\n            data = analyze(data);\n        }\n        var min = data.min;\n        var max = data.max;\n        var values = data.values.sort(function (a,b) { return a-b; });\n\n        if (num === 1) { return [min,max]; }\n\n        var limits = [];\n\n        if (mode.substr(0,1) === 'c') { // continuous\n            limits.push(min);\n            limits.push(max);\n        }\n\n        if (mode.substr(0,1) === 'e') { // equal interval\n            limits.push(min);\n            for (var i=1; i<num; i++) {\n                limits.push(min+((i/num)*(max-min)));\n            }\n            limits.push(max);\n        }\n\n        else if (mode.substr(0,1) === 'l') { // log scale\n            if (min <= 0) {\n                throw new Error('Logarithmic scales are only possible for values > 0');\n            }\n            var min_log = Math.LOG10E * log$1(min);\n            var max_log = Math.LOG10E * log$1(max);\n            limits.push(min);\n            for (var i$1=1; i$1<num; i$1++) {\n                limits.push(pow$7(10, min_log + ((i$1/num) * (max_log - min_log))));\n            }\n            limits.push(max);\n        }\n\n        else if (mode.substr(0,1) === 'q') { // quantile scale\n            limits.push(min);\n            for (var i$2=1; i$2<num; i$2++) {\n                var p = ((values.length-1) * i$2)/num;\n                var pb = floor$3(p);\n                if (pb === p) {\n                    limits.push(values[pb]);\n                } else { // p > pb\n                    var pr = p - pb;\n                    limits.push((values[pb]*(1-pr)) + (values[pb+1]*pr));\n                }\n            }\n            limits.push(max);\n\n        }\n\n        else if (mode.substr(0,1) === 'k') { // k-means clustering\n            /*\n            implementation based on\n            http://code.google.com/p/figue/source/browse/trunk/figue.js#336\n            simplified for 1-d input values\n            */\n            var cluster;\n            var n = values.length;\n            var assignments = new Array(n);\n            var clusterSizes = new Array(num);\n            var repeat = true;\n            var nb_iters = 0;\n            var centroids = null;\n\n            // get seed values\n            centroids = [];\n            centroids.push(min);\n            for (var i$3=1; i$3<num; i$3++) {\n                centroids.push(min + ((i$3/num) * (max-min)));\n            }\n            centroids.push(max);\n\n            while (repeat) {\n                // assignment step\n                for (var j=0; j<num; j++) {\n                    clusterSizes[j] = 0;\n                }\n                for (var i$4=0; i$4<n; i$4++) {\n                    var value = values[i$4];\n                    var mindist = Number.MAX_VALUE;\n                    var best = (void 0);\n                    for (var j$1=0; j$1<num; j$1++) {\n                        var dist = abs(centroids[j$1]-value);\n                        if (dist < mindist) {\n                            mindist = dist;\n                            best = j$1;\n                        }\n                        clusterSizes[best]++;\n                        assignments[i$4] = best;\n                    }\n                }\n\n                // update centroids step\n                var newCentroids = new Array(num);\n                for (var j$2=0; j$2<num; j$2++) {\n                    newCentroids[j$2] = null;\n                }\n                for (var i$5=0; i$5<n; i$5++) {\n                    cluster = assignments[i$5];\n                    if (newCentroids[cluster] === null) {\n                        newCentroids[cluster] = values[i$5];\n                    } else {\n                        newCentroids[cluster] += values[i$5];\n                    }\n                }\n                for (var j$3=0; j$3<num; j$3++) {\n                    newCentroids[j$3] *= 1/clusterSizes[j$3];\n                }\n\n                // check convergence\n                repeat = false;\n                for (var j$4=0; j$4<num; j$4++) {\n                    if (newCentroids[j$4] !== centroids[j$4]) {\n                        repeat = true;\n                        break;\n                    }\n                }\n\n                centroids = newCentroids;\n                nb_iters++;\n\n                if (nb_iters > 200) {\n                    repeat = false;\n                }\n            }\n\n            // finished k-means clustering\n            // the next part is borrowed from gabrielflor.it\n            var kClusters = {};\n            for (var j$5=0; j$5<num; j$5++) {\n                kClusters[j$5] = [];\n            }\n            for (var i$6=0; i$6<n; i$6++) {\n                cluster = assignments[i$6];\n                kClusters[cluster].push(values[i$6]);\n            }\n            var tmpKMeansBreaks = [];\n            for (var j$6=0; j$6<num; j$6++) {\n                tmpKMeansBreaks.push(kClusters[j$6][0]);\n                tmpKMeansBreaks.push(kClusters[j$6][kClusters[j$6].length-1]);\n            }\n            tmpKMeansBreaks = tmpKMeansBreaks.sort(function (a,b){ return a-b; });\n            limits.push(tmpKMeansBreaks[0]);\n            for (var i$7=1; i$7 < tmpKMeansBreaks.length; i$7+= 2) {\n                var v = tmpKMeansBreaks[i$7];\n                if (!isNaN(v) && (limits.indexOf(v) === -1)) {\n                    limits.push(v);\n                }\n            }\n        }\n        return limits;\n    };\n\n    var analyze_1 = {analyze: analyze, limits: limits};\n\n    var contrast = function (a, b) {\n        // WCAG contrast ratio\n        // see http://www.w3.org/TR/2008/REC-WCAG20-20081211/#contrast-ratiodef\n        a = new Color_1(a);\n        b = new Color_1(b);\n        var l1 = a.luminance();\n        var l2 = b.luminance();\n        return l1 > l2 ? (l1 + 0.05) / (l2 + 0.05) : (l2 + 0.05) / (l1 + 0.05);\n    };\n\n    var sqrt$4 = Math.sqrt;\n    var atan2$2 = Math.atan2;\n    var abs$1 = Math.abs;\n    var cos$4 = Math.cos;\n    var PI$2 = Math.PI;\n\n    var deltaE = function(a, b, L, C) {\n        if ( L === void 0 ) L=1;\n        if ( C === void 0 ) C=1;\n\n        // Delta E (CMC)\n        // see http://www.brucelindbloom.com/index.html?Eqn_DeltaE_CMC.html\n        a = new Color_1(a);\n        b = new Color_1(b);\n        var ref = Array.from(a.lab());\n        var L1 = ref[0];\n        var a1 = ref[1];\n        var b1 = ref[2];\n        var ref$1 = Array.from(b.lab());\n        var L2 = ref$1[0];\n        var a2 = ref$1[1];\n        var b2 = ref$1[2];\n        var c1 = sqrt$4((a1 * a1) + (b1 * b1));\n        var c2 = sqrt$4((a2 * a2) + (b2 * b2));\n        var sl = L1 < 16.0 ? 0.511 : (0.040975 * L1) / (1.0 + (0.01765 * L1));\n        var sc = ((0.0638 * c1) / (1.0 + (0.0131 * c1))) + 0.638;\n        var h1 = c1 < 0.000001 ? 0.0 : (atan2$2(b1, a1) * 180.0) / PI$2;\n        while (h1 < 0) { h1 += 360; }\n        while (h1 >= 360) { h1 -= 360; }\n        var t = (h1 >= 164.0) && (h1 <= 345.0) ? (0.56 + abs$1(0.2 * cos$4((PI$2 * (h1 + 168.0)) / 180.0))) : (0.36 + abs$1(0.4 * cos$4((PI$2 * (h1 + 35.0)) / 180.0)));\n        var c4 = c1 * c1 * c1 * c1;\n        var f = sqrt$4(c4 / (c4 + 1900.0));\n        var sh = sc * (((f * t) + 1.0) - f);\n        var delL = L1 - L2;\n        var delC = c1 - c2;\n        var delA = a1 - a2;\n        var delB = b1 - b2;\n        var dH2 = ((delA * delA) + (delB * delB)) - (delC * delC);\n        var v1 = delL / (L * sl);\n        var v2 = delC / (C * sc);\n        var v3 = sh;\n        return sqrt$4((v1 * v1) + (v2 * v2) + (dH2 / (v3 * v3)));\n    };\n\n    // simple Euclidean distance\n    var distance = function(a, b, mode) {\n        if ( mode === void 0 ) mode='lab';\n\n        // Delta E (CIE 1976)\n        // see http://www.brucelindbloom.com/index.html?Equations.html\n        a = new Color_1(a);\n        b = new Color_1(b);\n        var l1 = a.get(mode);\n        var l2 = b.get(mode);\n        var sum_sq = 0;\n        for (var i in l1) {\n            var d = (l1[i] || 0) - (l2[i] || 0);\n            sum_sq += d*d;\n        }\n        return Math.sqrt(sum_sq);\n    };\n\n    var valid = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        try {\n            new (Function.prototype.bind.apply( Color_1, [ null ].concat( args) ));\n            return true;\n        } catch (e) {\n            return false;\n        }\n    };\n\n    // some pre-defined color scales:\n\n\n\n\n    var scales = {\n    \tcool: function cool() { return scale([chroma_1.hsl(180,1,.9), chroma_1.hsl(250,.7,.4)]) },\n    \thot: function hot() { return scale(['#000','#f00','#ff0','#fff'], [0,.25,.75,1]).mode('rgb') }\n    };\n\n    /**\n        ColorBrewer colors for chroma.js\n\n        Copyright (c) 2002 Cynthia Brewer, Mark Harrower, and The\n        Pennsylvania State University.\n\n        Licensed under the Apache License, Version 2.0 (the \"License\");\n        you may not use this file except in compliance with the License.\n        You may obtain a copy of the License at\n        http://www.apache.org/licenses/LICENSE-2.0\n\n        Unless required by applicable law or agreed to in writing, software distributed\n        under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR\n        CONDITIONS OF ANY KIND, either express or implied. See the License for the\n        specific language governing permissions and limitations under the License.\n    */\n\n    var colorbrewer = {\n        // sequential\n        OrRd: ['#fff7ec', '#fee8c8', '#fdd49e', '#fdbb84', '#fc8d59', '#ef6548', '#d7301f', '#b30000', '#7f0000'],\n        PuBu: ['#fff7fb', '#ece7f2', '#d0d1e6', '#a6bddb', '#74a9cf', '#3690c0', '#0570b0', '#045a8d', '#023858'],\n        BuPu: ['#f7fcfd', '#e0ecf4', '#bfd3e6', '#9ebcda', '#8c96c6', '#8c6bb1', '#88419d', '#810f7c', '#4d004b'],\n        Oranges: ['#fff5eb', '#fee6ce', '#fdd0a2', '#fdae6b', '#fd8d3c', '#f16913', '#d94801', '#a63603', '#7f2704'],\n        BuGn: ['#f7fcfd', '#e5f5f9', '#ccece6', '#99d8c9', '#66c2a4', '#41ae76', '#238b45', '#006d2c', '#00441b'],\n        YlOrBr: ['#ffffe5', '#fff7bc', '#fee391', '#fec44f', '#fe9929', '#ec7014', '#cc4c02', '#993404', '#662506'],\n        YlGn: ['#ffffe5', '#f7fcb9', '#d9f0a3', '#addd8e', '#78c679', '#41ab5d', '#238443', '#006837', '#004529'],\n        Reds: ['#fff5f0', '#fee0d2', '#fcbba1', '#fc9272', '#fb6a4a', '#ef3b2c', '#cb181d', '#a50f15', '#67000d'],\n        RdPu: ['#fff7f3', '#fde0dd', '#fcc5c0', '#fa9fb5', '#f768a1', '#dd3497', '#ae017e', '#7a0177', '#49006a'],\n        Greens: ['#f7fcf5', '#e5f5e0', '#c7e9c0', '#a1d99b', '#74c476', '#41ab5d', '#238b45', '#006d2c', '#00441b'],\n        YlGnBu: ['#ffffd9', '#edf8b1', '#c7e9b4', '#7fcdbb', '#41b6c4', '#1d91c0', '#225ea8', '#253494', '#081d58'],\n        Purples: ['#fcfbfd', '#efedf5', '#dadaeb', '#bcbddc', '#9e9ac8', '#807dba', '#6a51a3', '#54278f', '#3f007d'],\n        GnBu: ['#f7fcf0', '#e0f3db', '#ccebc5', '#a8ddb5', '#7bccc4', '#4eb3d3', '#2b8cbe', '#0868ac', '#084081'],\n        Greys: ['#ffffff', '#f0f0f0', '#d9d9d9', '#bdbdbd', '#969696', '#737373', '#525252', '#252525', '#000000'],\n        YlOrRd: ['#ffffcc', '#ffeda0', '#fed976', '#feb24c', '#fd8d3c', '#fc4e2a', '#e31a1c', '#bd0026', '#800026'],\n        PuRd: ['#f7f4f9', '#e7e1ef', '#d4b9da', '#c994c7', '#df65b0', '#e7298a', '#ce1256', '#980043', '#67001f'],\n        Blues: ['#f7fbff', '#deebf7', '#c6dbef', '#9ecae1', '#6baed6', '#4292c6', '#2171b5', '#08519c', '#08306b'],\n        PuBuGn: ['#fff7fb', '#ece2f0', '#d0d1e6', '#a6bddb', '#67a9cf', '#3690c0', '#02818a', '#016c59', '#014636'],\n        Viridis: ['#440154', '#482777', '#3f4a8a', '#31678e', '#26838f', '#1f9d8a', '#6cce5a', '#b6de2b', '#fee825'],\n\n        // diverging\n\n        Spectral: ['#9e0142', '#d53e4f', '#f46d43', '#fdae61', '#fee08b', '#ffffbf', '#e6f598', '#abdda4', '#66c2a5', '#3288bd', '#5e4fa2'],\n        RdYlGn: ['#a50026', '#d73027', '#f46d43', '#fdae61', '#fee08b', '#ffffbf', '#d9ef8b', '#a6d96a', '#66bd63', '#1a9850', '#006837'],\n        RdBu: ['#67001f', '#b2182b', '#d6604d', '#f4a582', '#fddbc7', '#f7f7f7', '#d1e5f0', '#92c5de', '#4393c3', '#2166ac', '#053061'],\n        PiYG: ['#8e0152', '#c51b7d', '#de77ae', '#f1b6da', '#fde0ef', '#f7f7f7', '#e6f5d0', '#b8e186', '#7fbc41', '#4d9221', '#276419'],\n        PRGn: ['#40004b', '#762a83', '#9970ab', '#c2a5cf', '#e7d4e8', '#f7f7f7', '#d9f0d3', '#a6dba0', '#5aae61', '#1b7837', '#00441b'],\n        RdYlBu: ['#a50026', '#d73027', '#f46d43', '#fdae61', '#fee090', '#ffffbf', '#e0f3f8', '#abd9e9', '#74add1', '#4575b4', '#313695'],\n        BrBG: ['#543005', '#8c510a', '#bf812d', '#dfc27d', '#f6e8c3', '#f5f5f5', '#c7eae5', '#80cdc1', '#35978f', '#01665e', '#003c30'],\n        RdGy: ['#67001f', '#b2182b', '#d6604d', '#f4a582', '#fddbc7', '#ffffff', '#e0e0e0', '#bababa', '#878787', '#4d4d4d', '#1a1a1a'],\n        PuOr: ['#7f3b08', '#b35806', '#e08214', '#fdb863', '#fee0b6', '#f7f7f7', '#d8daeb', '#b2abd2', '#8073ac', '#542788', '#2d004b'],\n\n        // qualitative\n\n        Set2: ['#66c2a5', '#fc8d62', '#8da0cb', '#e78ac3', '#a6d854', '#ffd92f', '#e5c494', '#b3b3b3'],\n        Accent: ['#7fc97f', '#beaed4', '#fdc086', '#ffff99', '#386cb0', '#f0027f', '#bf5b17', '#666666'],\n        Set1: ['#e41a1c', '#377eb8', '#4daf4a', '#984ea3', '#ff7f00', '#ffff33', '#a65628', '#f781bf', '#999999'],\n        Set3: ['#8dd3c7', '#ffffb3', '#bebada', '#fb8072', '#80b1d3', '#fdb462', '#b3de69', '#fccde5', '#d9d9d9', '#bc80bd', '#ccebc5', '#ffed6f'],\n        Dark2: ['#1b9e77', '#d95f02', '#7570b3', '#e7298a', '#66a61e', '#e6ab02', '#a6761d', '#666666'],\n        Paired: ['#a6cee3', '#1f78b4', '#b2df8a', '#33a02c', '#fb9a99', '#e31a1c', '#fdbf6f', '#ff7f00', '#cab2d6', '#6a3d9a', '#ffff99', '#b15928'],\n        Pastel2: ['#b3e2cd', '#fdcdac', '#cbd5e8', '#f4cae4', '#e6f5c9', '#fff2ae', '#f1e2cc', '#cccccc'],\n        Pastel1: ['#fbb4ae', '#b3cde3', '#ccebc5', '#decbe4', '#fed9a6', '#ffffcc', '#e5d8bd', '#fddaec', '#f2f2f2'],\n    };\n\n    // add lowercase aliases for case-insensitive matches\n    for (var i$1 = 0, list$1 = Object.keys(colorbrewer); i$1 < list$1.length; i$1 += 1) {\n        var key = list$1[i$1];\n\n        colorbrewer[key.toLowerCase()] = colorbrewer[key];\n    }\n\n    var colorbrewer_1 = colorbrewer;\n\n    // feel free to comment out anything to rollup\n    // a smaller chroma.js built\n\n    // io --> convert colors\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    // operators --> modify existing Colors\n\n\n\n\n\n\n\n\n\n\n    // interpolators\n\n\n\n\n\n\n\n\n\n\n    // generators -- > create new colors\n    chroma_1.average = average;\n    chroma_1.bezier = bezier_1;\n    chroma_1.blend = blend_1;\n    chroma_1.cubehelix = cubehelix;\n    chroma_1.mix = chroma_1.interpolate = mix;\n    chroma_1.random = random_1;\n    chroma_1.scale = scale;\n\n    // other utility methods\n    chroma_1.analyze = analyze_1.analyze;\n    chroma_1.contrast = contrast;\n    chroma_1.deltaE = deltaE;\n    chroma_1.distance = distance;\n    chroma_1.limits = analyze_1.limits;\n    chroma_1.valid = valid;\n\n    // scale\n    chroma_1.scales = scales;\n\n    // colors\n    chroma_1.colors = w3cx11_1;\n    chroma_1.brewer = colorbrewer_1;\n\n    var chroma_js = chroma_1;\n\n    return chroma_js;\n\n})));\n","/**\n * @private\n * @param {*} spectra\n * @param {object} options\n */\n\nexport function getNormalizedData(spectra, options = {}) {\n  const { ids } = options;\n\n  let matrix = [];\n  let meta = [];\n  let currentIDs = [];\n  let x = [];\n\n  if (Array.isArray(spectra) && spectra.length > 0) {\n    for (let spectrum of spectra) {\n      if (!ids || ids.includes(spectrum.id)) {\n        currentIDs.push(spectrum.id);\n        matrix.push(spectrum.normalized.y);\n        meta.push(spectrum.meta);\n      }\n    }\n    x = spectra[0].normalized.x;\n  }\n\n  return { ids: currentIDs, matrix, meta, x };\n}\n","/**\n * @private\n * Check that a row index is not out of bounds\n * @param {Matrix} matrix\n * @param {number} index\n * @param {boolean} [outer]\n */\nexport function checkRowIndex(matrix, index, outer) {\n  let max = outer ? matrix.rows : matrix.rows - 1;\n  if (index < 0 || index > max) {\n    throw new RangeError('Row index out of range');\n  }\n}\n\n/**\n * @private\n * Check that a column index is not out of bounds\n * @param {Matrix} matrix\n * @param {number} index\n * @param {boolean} [outer]\n */\nexport function checkColumnIndex(matrix, index, outer) {\n  let max = outer ? matrix.columns : matrix.columns - 1;\n  if (index < 0 || index > max) {\n    throw new RangeError('Column index out of range');\n  }\n}\n\n/**\n * @private\n * Check that the provided vector is an array with the right length\n * @param {Matrix} matrix\n * @param {Array|Matrix} vector\n * @return {Array}\n * @throws {RangeError}\n */\nexport function checkRowVector(matrix, vector) {\n  if (vector.to1DArray) {\n    vector = vector.to1DArray();\n  }\n  if (vector.length !== matrix.columns) {\n    throw new RangeError(\n      'vector size must be the same as the number of columns',\n    );\n  }\n  return vector;\n}\n\n/**\n * @private\n * Check that the provided vector is an array with the right length\n * @param {Matrix} matrix\n * @param {Array|Matrix} vector\n * @return {Array}\n * @throws {RangeError}\n */\nexport function checkColumnVector(matrix, vector) {\n  if (vector.to1DArray) {\n    vector = vector.to1DArray();\n  }\n  if (vector.length !== matrix.rows) {\n    throw new RangeError('vector size must be the same as the number of rows');\n  }\n  return vector;\n}\n\nexport function checkIndices(matrix, rowIndices, columnIndices) {\n  return {\n    row: checkRowIndices(matrix, rowIndices),\n    column: checkColumnIndices(matrix, columnIndices),\n  };\n}\n\nexport function checkRowIndices(matrix, rowIndices) {\n  if (typeof rowIndices !== 'object') {\n    throw new TypeError('unexpected type for row indices');\n  }\n\n  let rowOut = rowIndices.some((r) => {\n    return r < 0 || r >= matrix.rows;\n  });\n\n  if (rowOut) {\n    throw new RangeError('row indices are out of range');\n  }\n\n  if (!Array.isArray(rowIndices)) rowIndices = Array.from(rowIndices);\n\n  return rowIndices;\n}\n\nexport function checkColumnIndices(matrix, columnIndices) {\n  if (typeof columnIndices !== 'object') {\n    throw new TypeError('unexpected type for column indices');\n  }\n\n  let columnOut = columnIndices.some((c) => {\n    return c < 0 || c >= matrix.columns;\n  });\n\n  if (columnOut) {\n    throw new RangeError('column indices are out of range');\n  }\n  if (!Array.isArray(columnIndices)) columnIndices = Array.from(columnIndices);\n\n  return columnIndices;\n}\n\nexport function checkRange(matrix, startRow, endRow, startColumn, endColumn) {\n  if (arguments.length !== 5) {\n    throw new RangeError('expected 4 arguments');\n  }\n  checkNumber('startRow', startRow);\n  checkNumber('endRow', endRow);\n  checkNumber('startColumn', startColumn);\n  checkNumber('endColumn', endColumn);\n  if (\n    startRow > endRow ||\n    startColumn > endColumn ||\n    startRow < 0 ||\n    startRow >= matrix.rows ||\n    endRow < 0 ||\n    endRow >= matrix.rows ||\n    startColumn < 0 ||\n    startColumn >= matrix.columns ||\n    endColumn < 0 ||\n    endColumn >= matrix.columns\n  ) {\n    throw new RangeError('Submatrix indices are out of range');\n  }\n}\n\nexport function newArray(length, value = 0) {\n  let array = [];\n  for (let i = 0; i < length; i++) {\n    array.push(value);\n  }\n  return array;\n}\n\nfunction checkNumber(name, value) {\n  if (typeof value !== 'number') {\n    throw new TypeError(`${name} must be a number`);\n  }\n}\n","export function inspectMatrix() {\n  const indent = ' '.repeat(2);\n  const indentData = ' '.repeat(4);\n  return `${this.constructor.name} {\n${indent}[\n${indentData}${inspectData(this, indentData)}\n${indent}]\n${indent}rows: ${this.rows}\n${indent}columns: ${this.columns}\n}`;\n}\n\nconst maxRows = 15;\nconst maxColumns = 10;\nconst maxNumSize = 8;\n\nfunction inspectData(matrix, indent) {\n  const { rows, columns } = matrix;\n  const maxI = Math.min(rows, maxRows);\n  const maxJ = Math.min(columns, maxColumns);\n  const result = [];\n  for (let i = 0; i < maxI; i++) {\n    let line = [];\n    for (let j = 0; j < maxJ; j++) {\n      line.push(formatNumber(matrix.get(i, j)));\n    }\n    result.push(`${line.join(' ')}`);\n  }\n  if (maxJ !== columns) {\n    result[result.length - 1] += ` ... ${columns - maxColumns} more columns`;\n  }\n  if (maxI !== rows) {\n    result.push(`... ${rows - maxRows} more rows`);\n  }\n  return result.join(`\\n${indent}`);\n}\n\nfunction formatNumber(num) {\n  const numStr = String(num);\n  if (numStr.length <= maxNumSize) {\n    return numStr.padEnd(maxNumSize, ' ');\n  }\n  const precise = num.toPrecision(maxNumSize - 2);\n  if (precise.length <= maxNumSize) {\n    return precise;\n  }\n  const exponential = num.toExponential(maxNumSize - 2);\n  const eIndex = exponential.indexOf('e');\n  const e = exponential.substring(eIndex);\n  return exponential.substring(0, maxNumSize - e.length) + e;\n}\n","import rescale from 'ml-array-rescale';\n\nimport {\n  checkRowVector,\n  checkRowIndex,\n  checkColumnIndex,\n  checkColumnVector,\n  checkRange,\n  checkIndices,\n} from './util';\nimport {\n  sumByRow,\n  sumByColumn,\n  sumAll,\n  productByRow,\n  productByColumn,\n  productAll,\n  varianceByRow,\n  varianceByColumn,\n  varianceAll,\n  centerByRow,\n  centerByColumn,\n  centerAll,\n  scaleByRow,\n  scaleByColumn,\n  scaleAll,\n  getScaleByRow,\n  getScaleByColumn,\n  getScaleAll,\n} from './stat';\nimport { inspectMatrix } from './inspect';\nimport { installMathOperations } from './mathOperations';\n\nexport class AbstractMatrix {\n  static from1DArray(newRows, newColumns, newData) {\n    let length = newRows * newColumns;\n    if (length !== newData.length) {\n      throw new RangeError('data length does not match given dimensions');\n    }\n    let newMatrix = new Matrix(newRows, newColumns);\n    for (let row = 0; row < newRows; row++) {\n      for (let column = 0; column < newColumns; column++) {\n        newMatrix.set(row, column, newData[row * newColumns + column]);\n      }\n    }\n    return newMatrix;\n  }\n\n  static rowVector(newData) {\n    let vector = new Matrix(1, newData.length);\n    for (let i = 0; i < newData.length; i++) {\n      vector.set(0, i, newData[i]);\n    }\n    return vector;\n  }\n\n  static columnVector(newData) {\n    let vector = new Matrix(newData.length, 1);\n    for (let i = 0; i < newData.length; i++) {\n      vector.set(i, 0, newData[i]);\n    }\n    return vector;\n  }\n\n  static zeros(rows, columns) {\n    return new Matrix(rows, columns);\n  }\n\n  static ones(rows, columns) {\n    return new Matrix(rows, columns).fill(1);\n  }\n\n  static rand(rows, columns, options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { random = Math.random } = options;\n    let matrix = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        matrix.set(i, j, random());\n      }\n    }\n    return matrix;\n  }\n\n  static randInt(rows, columns, options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { min = 0, max = 1000, random = Math.random } = options;\n    if (!Number.isInteger(min)) throw new TypeError('min must be an integer');\n    if (!Number.isInteger(max)) throw new TypeError('max must be an integer');\n    if (min >= max) throw new RangeError('min must be smaller than max');\n    let interval = max - min;\n    let matrix = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        let value = min + Math.round(random() * interval);\n        matrix.set(i, j, value);\n      }\n    }\n    return matrix;\n  }\n\n  static eye(rows, columns, value) {\n    if (columns === undefined) columns = rows;\n    if (value === undefined) value = 1;\n    let min = Math.min(rows, columns);\n    let matrix = this.zeros(rows, columns);\n    for (let i = 0; i < min; i++) {\n      matrix.set(i, i, value);\n    }\n    return matrix;\n  }\n\n  static diag(data, rows, columns) {\n    let l = data.length;\n    if (rows === undefined) rows = l;\n    if (columns === undefined) columns = rows;\n    let min = Math.min(l, rows, columns);\n    let matrix = this.zeros(rows, columns);\n    for (let i = 0; i < min; i++) {\n      matrix.set(i, i, data[i]);\n    }\n    return matrix;\n  }\n\n  static min(matrix1, matrix2) {\n    matrix1 = this.checkMatrix(matrix1);\n    matrix2 = this.checkMatrix(matrix2);\n    let rows = matrix1.rows;\n    let columns = matrix1.columns;\n    let result = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        result.set(i, j, Math.min(matrix1.get(i, j), matrix2.get(i, j)));\n      }\n    }\n    return result;\n  }\n\n  static max(matrix1, matrix2) {\n    matrix1 = this.checkMatrix(matrix1);\n    matrix2 = this.checkMatrix(matrix2);\n    let rows = matrix1.rows;\n    let columns = matrix1.columns;\n    let result = new this(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        result.set(i, j, Math.max(matrix1.get(i, j), matrix2.get(i, j)));\n      }\n    }\n    return result;\n  }\n\n  static checkMatrix(value) {\n    return AbstractMatrix.isMatrix(value) ? value : new Matrix(value);\n  }\n\n  static isMatrix(value) {\n    return value != null && value.klass === 'Matrix';\n  }\n\n  get size() {\n    return this.rows * this.columns;\n  }\n\n  apply(callback) {\n    if (typeof callback !== 'function') {\n      throw new TypeError('callback must be a function');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        callback.call(this, i, j);\n      }\n    }\n    return this;\n  }\n\n  to1DArray() {\n    let array = [];\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        array.push(this.get(i, j));\n      }\n    }\n    return array;\n  }\n\n  to2DArray() {\n    let copy = [];\n    for (let i = 0; i < this.rows; i++) {\n      copy.push([]);\n      for (let j = 0; j < this.columns; j++) {\n        copy[i].push(this.get(i, j));\n      }\n    }\n    return copy;\n  }\n\n  toJSON() {\n    return this.to2DArray();\n  }\n\n  isRowVector() {\n    return this.rows === 1;\n  }\n\n  isColumnVector() {\n    return this.columns === 1;\n  }\n\n  isVector() {\n    return this.rows === 1 || this.columns === 1;\n  }\n\n  isSquare() {\n    return this.rows === this.columns;\n  }\n\n  isSymmetric() {\n    if (this.isSquare()) {\n      for (let i = 0; i < this.rows; i++) {\n        for (let j = 0; j <= i; j++) {\n          if (this.get(i, j) !== this.get(j, i)) {\n            return false;\n          }\n        }\n      }\n      return true;\n    }\n    return false;\n  }\n\n  isEchelonForm() {\n    let i = 0;\n    let j = 0;\n    let previousColumn = -1;\n    let isEchelonForm = true;\n    let checked = false;\n    while (i < this.rows && isEchelonForm) {\n      j = 0;\n      checked = false;\n      while (j < this.columns && checked === false) {\n        if (this.get(i, j) === 0) {\n          j++;\n        } else if (this.get(i, j) === 1 && j > previousColumn) {\n          checked = true;\n          previousColumn = j;\n        } else {\n          isEchelonForm = false;\n          checked = true;\n        }\n      }\n      i++;\n    }\n    return isEchelonForm;\n  }\n\n  isReducedEchelonForm() {\n    let i = 0;\n    let j = 0;\n    let previousColumn = -1;\n    let isReducedEchelonForm = true;\n    let checked = false;\n    while (i < this.rows && isReducedEchelonForm) {\n      j = 0;\n      checked = false;\n      while (j < this.columns && checked === false) {\n        if (this.get(i, j) === 0) {\n          j++;\n        } else if (this.get(i, j) === 1 && j > previousColumn) {\n          checked = true;\n          previousColumn = j;\n        } else {\n          isReducedEchelonForm = false;\n          checked = true;\n        }\n      }\n      for (let k = j + 1; k < this.rows; k++) {\n        if (this.get(i, k) !== 0) {\n          isReducedEchelonForm = false;\n        }\n      }\n      i++;\n    }\n    return isReducedEchelonForm;\n  }\n\n  echelonForm() {\n    let result = this.clone();\n    let h = 0;\n    let k = 0;\n    while (h < result.rows && k < result.columns) {\n      let iMax = h;\n      for (let i = h; i < result.rows; i++) {\n        if (result.get(i, k) > result.get(iMax, k)) {\n          iMax = i;\n        }\n      }\n      if (result.get(iMax, k) === 0) {\n        k++;\n      } else {\n        result.swapRows(h, iMax);\n        let tmp = result.get(h, k);\n        for (let j = k; j < result.columns; j++) {\n          result.set(h, j, result.get(h, j) / tmp);\n        }\n        for (let i = h + 1; i < result.rows; i++) {\n          let factor = result.get(i, k) / result.get(h, k);\n          result.set(i, k, 0);\n          for (let j = k + 1; j < result.columns; j++) {\n            result.set(i, j, result.get(i, j) - result.get(h, j) * factor);\n          }\n        }\n        h++;\n        k++;\n      }\n    }\n    return result;\n  }\n\n  reducedEchelonForm() {\n    let result = this.echelonForm();\n    let m = result.columns;\n    let n = result.rows;\n    let h = n - 1;\n    while (h >= 0) {\n      if (result.maxRow(h) === 0) {\n        h--;\n      } else {\n        let p = 0;\n        let pivot = false;\n        while (p < n && pivot === false) {\n          if (result.get(h, p) === 1) {\n            pivot = true;\n          } else {\n            p++;\n          }\n        }\n        for (let i = 0; i < h; i++) {\n          let factor = result.get(i, p);\n          for (let j = p; j < m; j++) {\n            let tmp = result.get(i, j) - factor * result.get(h, j);\n            result.set(i, j, tmp);\n          }\n        }\n        h--;\n      }\n    }\n    return result;\n  }\n\n  set() {\n    throw new Error('set method is unimplemented');\n  }\n\n  get() {\n    throw new Error('get method is unimplemented');\n  }\n\n  repeat(options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { rows = 1, columns = 1 } = options;\n    if (!Number.isInteger(rows) || rows <= 0) {\n      throw new TypeError('rows must be a positive integer');\n    }\n    if (!Number.isInteger(columns) || columns <= 0) {\n      throw new TypeError('columns must be a positive integer');\n    }\n    let matrix = new Matrix(this.rows * rows, this.columns * columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        matrix.setSubMatrix(this, this.rows * i, this.columns * j);\n      }\n    }\n    return matrix;\n  }\n\n  fill(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, value);\n      }\n    }\n    return this;\n  }\n\n  neg() {\n    return this.mulS(-1);\n  }\n\n  getRow(index) {\n    checkRowIndex(this, index);\n    let row = [];\n    for (let i = 0; i < this.columns; i++) {\n      row.push(this.get(index, i));\n    }\n    return row;\n  }\n\n  getRowVector(index) {\n    return Matrix.rowVector(this.getRow(index));\n  }\n\n  setRow(index, array) {\n    checkRowIndex(this, index);\n    array = checkRowVector(this, array);\n    for (let i = 0; i < this.columns; i++) {\n      this.set(index, i, array[i]);\n    }\n    return this;\n  }\n\n  swapRows(row1, row2) {\n    checkRowIndex(this, row1);\n    checkRowIndex(this, row2);\n    for (let i = 0; i < this.columns; i++) {\n      let temp = this.get(row1, i);\n      this.set(row1, i, this.get(row2, i));\n      this.set(row2, i, temp);\n    }\n    return this;\n  }\n\n  getColumn(index) {\n    checkColumnIndex(this, index);\n    let column = [];\n    for (let i = 0; i < this.rows; i++) {\n      column.push(this.get(i, index));\n    }\n    return column;\n  }\n\n  getColumnVector(index) {\n    return Matrix.columnVector(this.getColumn(index));\n  }\n\n  setColumn(index, array) {\n    checkColumnIndex(this, index);\n    array = checkColumnVector(this, array);\n    for (let i = 0; i < this.rows; i++) {\n      this.set(i, index, array[i]);\n    }\n    return this;\n  }\n\n  swapColumns(column1, column2) {\n    checkColumnIndex(this, column1);\n    checkColumnIndex(this, column2);\n    for (let i = 0; i < this.rows; i++) {\n      let temp = this.get(i, column1);\n      this.set(i, column1, this.get(i, column2));\n      this.set(i, column2, temp);\n    }\n    return this;\n  }\n\n  addRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) + vector[j]);\n      }\n    }\n    return this;\n  }\n\n  subRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) - vector[j]);\n      }\n    }\n    return this;\n  }\n\n  mulRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) * vector[j]);\n      }\n    }\n    return this;\n  }\n\n  divRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) / vector[j]);\n      }\n    }\n    return this;\n  }\n\n  addColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) + vector[i]);\n      }\n    }\n    return this;\n  }\n\n  subColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) - vector[i]);\n      }\n    }\n    return this;\n  }\n\n  mulColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) * vector[i]);\n      }\n    }\n    return this;\n  }\n\n  divColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) / vector[i]);\n      }\n    }\n    return this;\n  }\n\n  mulRow(index, value) {\n    checkRowIndex(this, index);\n    for (let i = 0; i < this.columns; i++) {\n      this.set(index, i, this.get(index, i) * value);\n    }\n    return this;\n  }\n\n  mulColumn(index, value) {\n    checkColumnIndex(this, index);\n    for (let i = 0; i < this.rows; i++) {\n      this.set(i, index, this.get(i, index) * value);\n    }\n    return this;\n  }\n\n  max() {\n    let v = this.get(0, 0);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        if (this.get(i, j) > v) {\n          v = this.get(i, j);\n        }\n      }\n    }\n    return v;\n  }\n\n  maxIndex() {\n    let v = this.get(0, 0);\n    let idx = [0, 0];\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        if (this.get(i, j) > v) {\n          v = this.get(i, j);\n          idx[0] = i;\n          idx[1] = j;\n        }\n      }\n    }\n    return idx;\n  }\n\n  min() {\n    let v = this.get(0, 0);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        if (this.get(i, j) < v) {\n          v = this.get(i, j);\n        }\n      }\n    }\n    return v;\n  }\n\n  minIndex() {\n    let v = this.get(0, 0);\n    let idx = [0, 0];\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        if (this.get(i, j) < v) {\n          v = this.get(i, j);\n          idx[0] = i;\n          idx[1] = j;\n        }\n      }\n    }\n    return idx;\n  }\n\n  maxRow(row) {\n    checkRowIndex(this, row);\n    let v = this.get(row, 0);\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) > v) {\n        v = this.get(row, i);\n      }\n    }\n    return v;\n  }\n\n  maxRowIndex(row) {\n    checkRowIndex(this, row);\n    let v = this.get(row, 0);\n    let idx = [row, 0];\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) > v) {\n        v = this.get(row, i);\n        idx[1] = i;\n      }\n    }\n    return idx;\n  }\n\n  minRow(row) {\n    checkRowIndex(this, row);\n    let v = this.get(row, 0);\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) < v) {\n        v = this.get(row, i);\n      }\n    }\n    return v;\n  }\n\n  minRowIndex(row) {\n    checkRowIndex(this, row);\n    let v = this.get(row, 0);\n    let idx = [row, 0];\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) < v) {\n        v = this.get(row, i);\n        idx[1] = i;\n      }\n    }\n    return idx;\n  }\n\n  maxColumn(column) {\n    checkColumnIndex(this, column);\n    let v = this.get(0, column);\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) > v) {\n        v = this.get(i, column);\n      }\n    }\n    return v;\n  }\n\n  maxColumnIndex(column) {\n    checkColumnIndex(this, column);\n    let v = this.get(0, column);\n    let idx = [0, column];\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) > v) {\n        v = this.get(i, column);\n        idx[0] = i;\n      }\n    }\n    return idx;\n  }\n\n  minColumn(column) {\n    checkColumnIndex(this, column);\n    let v = this.get(0, column);\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) < v) {\n        v = this.get(i, column);\n      }\n    }\n    return v;\n  }\n\n  minColumnIndex(column) {\n    checkColumnIndex(this, column);\n    let v = this.get(0, column);\n    let idx = [0, column];\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) < v) {\n        v = this.get(i, column);\n        idx[0] = i;\n      }\n    }\n    return idx;\n  }\n\n  diag() {\n    let min = Math.min(this.rows, this.columns);\n    let diag = [];\n    for (let i = 0; i < min; i++) {\n      diag.push(this.get(i, i));\n    }\n    return diag;\n  }\n\n  norm(type = 'frobenius') {\n    let result = 0;\n    if (type === 'max') {\n      return this.max();\n    } else if (type === 'frobenius') {\n      for (let i = 0; i < this.rows; i++) {\n        for (let j = 0; j < this.columns; j++) {\n          result = result + this.get(i, j) * this.get(i, j);\n        }\n      }\n      return Math.sqrt(result);\n    } else {\n      throw new RangeError(`unknown norm type: ${type}`);\n    }\n  }\n\n  cumulativeSum() {\n    let sum = 0;\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        sum += this.get(i, j);\n        this.set(i, j, sum);\n      }\n    }\n    return this;\n  }\n\n  dot(vector2) {\n    if (AbstractMatrix.isMatrix(vector2)) vector2 = vector2.to1DArray();\n    let vector1 = this.to1DArray();\n    if (vector1.length !== vector2.length) {\n      throw new RangeError('vectors do not have the same size');\n    }\n    let dot = 0;\n    for (let i = 0; i < vector1.length; i++) {\n      dot += vector1[i] * vector2[i];\n    }\n    return dot;\n  }\n\n  mmul(other) {\n    other = Matrix.checkMatrix(other);\n\n    let m = this.rows;\n    let n = this.columns;\n    let p = other.columns;\n\n    let result = new Matrix(m, p);\n\n    let Bcolj = new Float64Array(n);\n    for (let j = 0; j < p; j++) {\n      for (let k = 0; k < n; k++) {\n        Bcolj[k] = other.get(k, j);\n      }\n\n      for (let i = 0; i < m; i++) {\n        let s = 0;\n        for (let k = 0; k < n; k++) {\n          s += this.get(i, k) * Bcolj[k];\n        }\n\n        result.set(i, j, s);\n      }\n    }\n    return result;\n  }\n\n  strassen2x2(other) {\n    other = Matrix.checkMatrix(other);\n    let result = new Matrix(2, 2);\n    const a11 = this.get(0, 0);\n    const b11 = other.get(0, 0);\n    const a12 = this.get(0, 1);\n    const b12 = other.get(0, 1);\n    const a21 = this.get(1, 0);\n    const b21 = other.get(1, 0);\n    const a22 = this.get(1, 1);\n    const b22 = other.get(1, 1);\n\n    // Compute intermediate values.\n    const m1 = (a11 + a22) * (b11 + b22);\n    const m2 = (a21 + a22) * b11;\n    const m3 = a11 * (b12 - b22);\n    const m4 = a22 * (b21 - b11);\n    const m5 = (a11 + a12) * b22;\n    const m6 = (a21 - a11) * (b11 + b12);\n    const m7 = (a12 - a22) * (b21 + b22);\n\n    // Combine intermediate values into the output.\n    const c00 = m1 + m4 - m5 + m7;\n    const c01 = m3 + m5;\n    const c10 = m2 + m4;\n    const c11 = m1 - m2 + m3 + m6;\n\n    result.set(0, 0, c00);\n    result.set(0, 1, c01);\n    result.set(1, 0, c10);\n    result.set(1, 1, c11);\n    return result;\n  }\n\n  strassen3x3(other) {\n    other = Matrix.checkMatrix(other);\n    let result = new Matrix(3, 3);\n\n    const a00 = this.get(0, 0);\n    const a01 = this.get(0, 1);\n    const a02 = this.get(0, 2);\n    const a10 = this.get(1, 0);\n    const a11 = this.get(1, 1);\n    const a12 = this.get(1, 2);\n    const a20 = this.get(2, 0);\n    const a21 = this.get(2, 1);\n    const a22 = this.get(2, 2);\n\n    const b00 = other.get(0, 0);\n    const b01 = other.get(0, 1);\n    const b02 = other.get(0, 2);\n    const b10 = other.get(1, 0);\n    const b11 = other.get(1, 1);\n    const b12 = other.get(1, 2);\n    const b20 = other.get(2, 0);\n    const b21 = other.get(2, 1);\n    const b22 = other.get(2, 2);\n\n    const m1 = (a00 + a01 + a02 - a10 - a11 - a21 - a22) * b11;\n    const m2 = (a00 - a10) * (-b01 + b11);\n    const m3 = a11 * (-b00 + b01 + b10 - b11 - b12 - b20 + b22);\n    const m4 = (-a00 + a10 + a11) * (b00 - b01 + b11);\n    const m5 = (a10 + a11) * (-b00 + b01);\n    const m6 = a00 * b00;\n    const m7 = (-a00 + a20 + a21) * (b00 - b02 + b12);\n    const m8 = (-a00 + a20) * (b02 - b12);\n    const m9 = (a20 + a21) * (-b00 + b02);\n    const m10 = (a00 + a01 + a02 - a11 - a12 - a20 - a21) * b12;\n    const m11 = a21 * (-b00 + b02 + b10 - b11 - b12 - b20 + b21);\n    const m12 = (-a02 + a21 + a22) * (b11 + b20 - b21);\n    const m13 = (a02 - a22) * (b11 - b21);\n    const m14 = a02 * b20;\n    const m15 = (a21 + a22) * (-b20 + b21);\n    const m16 = (-a02 + a11 + a12) * (b12 + b20 - b22);\n    const m17 = (a02 - a12) * (b12 - b22);\n    const m18 = (a11 + a12) * (-b20 + b22);\n    const m19 = a01 * b10;\n    const m20 = a12 * b21;\n    const m21 = a10 * b02;\n    const m22 = a20 * b01;\n    const m23 = a22 * b22;\n\n    const c00 = m6 + m14 + m19;\n    const c01 = m1 + m4 + m5 + m6 + m12 + m14 + m15;\n    const c02 = m6 + m7 + m9 + m10 + m14 + m16 + m18;\n    const c10 = m2 + m3 + m4 + m6 + m14 + m16 + m17;\n    const c11 = m2 + m4 + m5 + m6 + m20;\n    const c12 = m14 + m16 + m17 + m18 + m21;\n    const c20 = m6 + m7 + m8 + m11 + m12 + m13 + m14;\n    const c21 = m12 + m13 + m14 + m15 + m22;\n    const c22 = m6 + m7 + m8 + m9 + m23;\n\n    result.set(0, 0, c00);\n    result.set(0, 1, c01);\n    result.set(0, 2, c02);\n    result.set(1, 0, c10);\n    result.set(1, 1, c11);\n    result.set(1, 2, c12);\n    result.set(2, 0, c20);\n    result.set(2, 1, c21);\n    result.set(2, 2, c22);\n    return result;\n  }\n\n  mmulStrassen(y) {\n    y = Matrix.checkMatrix(y);\n    let x = this.clone();\n    let r1 = x.rows;\n    let c1 = x.columns;\n    let r2 = y.rows;\n    let c2 = y.columns;\n    if (c1 !== r2) {\n      // eslint-disable-next-line no-console\n      console.warn(\n        `Multiplying ${r1} x ${c1} and ${r2} x ${c2} matrix: dimensions do not match.`,\n      );\n    }\n\n    // Put a matrix into the top left of a matrix of zeros.\n    // `rows` and `cols` are the dimensions of the output matrix.\n    function embed(mat, rows, cols) {\n      let r = mat.rows;\n      let c = mat.columns;\n      if (r === rows && c === cols) {\n        return mat;\n      } else {\n        let resultat = AbstractMatrix.zeros(rows, cols);\n        resultat = resultat.setSubMatrix(mat, 0, 0);\n        return resultat;\n      }\n    }\n\n    // Make sure both matrices are the same size.\n    // This is exclusively for simplicity:\n    // this algorithm can be implemented with matrices of different sizes.\n\n    let r = Math.max(r1, r2);\n    let c = Math.max(c1, c2);\n    x = embed(x, r, c);\n    y = embed(y, r, c);\n\n    // Our recursive multiplication function.\n    function blockMult(a, b, rows, cols) {\n      // For small matrices, resort to naive multiplication.\n      if (rows <= 512 || cols <= 512) {\n        return a.mmul(b); // a is equivalent to this\n      }\n\n      // Apply dynamic padding.\n      if (rows % 2 === 1 && cols % 2 === 1) {\n        a = embed(a, rows + 1, cols + 1);\n        b = embed(b, rows + 1, cols + 1);\n      } else if (rows % 2 === 1) {\n        a = embed(a, rows + 1, cols);\n        b = embed(b, rows + 1, cols);\n      } else if (cols % 2 === 1) {\n        a = embed(a, rows, cols + 1);\n        b = embed(b, rows, cols + 1);\n      }\n\n      let halfRows = parseInt(a.rows / 2, 10);\n      let halfCols = parseInt(a.columns / 2, 10);\n      // Subdivide input matrices.\n      let a11 = a.subMatrix(0, halfRows - 1, 0, halfCols - 1);\n      let b11 = b.subMatrix(0, halfRows - 1, 0, halfCols - 1);\n\n      let a12 = a.subMatrix(0, halfRows - 1, halfCols, a.columns - 1);\n      let b12 = b.subMatrix(0, halfRows - 1, halfCols, b.columns - 1);\n\n      let a21 = a.subMatrix(halfRows, a.rows - 1, 0, halfCols - 1);\n      let b21 = b.subMatrix(halfRows, b.rows - 1, 0, halfCols - 1);\n\n      let a22 = a.subMatrix(halfRows, a.rows - 1, halfCols, a.columns - 1);\n      let b22 = b.subMatrix(halfRows, b.rows - 1, halfCols, b.columns - 1);\n\n      // Compute intermediate values.\n      let m1 = blockMult(\n        AbstractMatrix.add(a11, a22),\n        AbstractMatrix.add(b11, b22),\n        halfRows,\n        halfCols,\n      );\n      let m2 = blockMult(AbstractMatrix.add(a21, a22), b11, halfRows, halfCols);\n      let m3 = blockMult(a11, AbstractMatrix.sub(b12, b22), halfRows, halfCols);\n      let m4 = blockMult(a22, AbstractMatrix.sub(b21, b11), halfRows, halfCols);\n      let m5 = blockMult(AbstractMatrix.add(a11, a12), b22, halfRows, halfCols);\n      let m6 = blockMult(\n        AbstractMatrix.sub(a21, a11),\n        AbstractMatrix.add(b11, b12),\n        halfRows,\n        halfCols,\n      );\n      let m7 = blockMult(\n        AbstractMatrix.sub(a12, a22),\n        AbstractMatrix.add(b21, b22),\n        halfRows,\n        halfCols,\n      );\n\n      // Combine intermediate values into the output.\n      let c11 = AbstractMatrix.add(m1, m4);\n      c11.sub(m5);\n      c11.add(m7);\n      let c12 = AbstractMatrix.add(m3, m5);\n      let c21 = AbstractMatrix.add(m2, m4);\n      let c22 = AbstractMatrix.sub(m1, m2);\n      c22.add(m3);\n      c22.add(m6);\n\n      // Crop output to the desired size (undo dynamic padding).\n      let resultat = AbstractMatrix.zeros(2 * c11.rows, 2 * c11.columns);\n      resultat = resultat.setSubMatrix(c11, 0, 0);\n      resultat = resultat.setSubMatrix(c12, c11.rows, 0);\n      resultat = resultat.setSubMatrix(c21, 0, c11.columns);\n      resultat = resultat.setSubMatrix(c22, c11.rows, c11.columns);\n      return resultat.subMatrix(0, rows - 1, 0, cols - 1);\n    }\n    return blockMult(x, y, r, c);\n  }\n\n  scaleRows(options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { min = 0, max = 1 } = options;\n    if (!Number.isFinite(min)) throw new TypeError('min must be a number');\n    if (!Number.isFinite(max)) throw new TypeError('max must be a number');\n    if (min >= max) throw new RangeError('min must be smaller than max');\n    let newMatrix = new Matrix(this.rows, this.columns);\n    for (let i = 0; i < this.rows; i++) {\n      const row = this.getRow(i);\n      rescale(row, { min, max, output: row });\n      newMatrix.setRow(i, row);\n    }\n    return newMatrix;\n  }\n\n  scaleColumns(options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { min = 0, max = 1 } = options;\n    if (!Number.isFinite(min)) throw new TypeError('min must be a number');\n    if (!Number.isFinite(max)) throw new TypeError('max must be a number');\n    if (min >= max) throw new RangeError('min must be smaller than max');\n    let newMatrix = new Matrix(this.rows, this.columns);\n    for (let i = 0; i < this.columns; i++) {\n      const column = this.getColumn(i);\n      rescale(column, {\n        min: min,\n        max: max,\n        output: column,\n      });\n      newMatrix.setColumn(i, column);\n    }\n    return newMatrix;\n  }\n\n  flipRows() {\n    const middle = Math.ceil(this.columns / 2);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < middle; j++) {\n        let first = this.get(i, j);\n        let last = this.get(i, this.columns - 1 - j);\n        this.set(i, j, last);\n        this.set(i, this.columns - 1 - j, first);\n      }\n    }\n    return this;\n  }\n\n  flipColumns() {\n    const middle = Math.ceil(this.rows / 2);\n    for (let j = 0; j < this.columns; j++) {\n      for (let i = 0; i < middle; i++) {\n        let first = this.get(i, j);\n        let last = this.get(this.rows - 1 - i, j);\n        this.set(i, j, last);\n        this.set(this.rows - 1 - i, j, first);\n      }\n    }\n    return this;\n  }\n\n  kroneckerProduct(other) {\n    other = Matrix.checkMatrix(other);\n\n    let m = this.rows;\n    let n = this.columns;\n    let p = other.rows;\n    let q = other.columns;\n\n    let result = new Matrix(m * p, n * q);\n    for (let i = 0; i < m; i++) {\n      for (let j = 0; j < n; j++) {\n        for (let k = 0; k < p; k++) {\n          for (let l = 0; l < q; l++) {\n            result.set(p * i + k, q * j + l, this.get(i, j) * other.get(k, l));\n          }\n        }\n      }\n    }\n    return result;\n  }\n\n  transpose() {\n    let result = new Matrix(this.columns, this.rows);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        result.set(j, i, this.get(i, j));\n      }\n    }\n    return result;\n  }\n\n  sortRows(compareFunction = compareNumbers) {\n    for (let i = 0; i < this.rows; i++) {\n      this.setRow(i, this.getRow(i).sort(compareFunction));\n    }\n    return this;\n  }\n\n  sortColumns(compareFunction = compareNumbers) {\n    for (let i = 0; i < this.columns; i++) {\n      this.setColumn(i, this.getColumn(i).sort(compareFunction));\n    }\n    return this;\n  }\n\n  subMatrix(startRow, endRow, startColumn, endColumn) {\n    checkRange(this, startRow, endRow, startColumn, endColumn);\n    let newMatrix = new Matrix(\n      endRow - startRow + 1,\n      endColumn - startColumn + 1,\n    );\n    for (let i = startRow; i <= endRow; i++) {\n      for (let j = startColumn; j <= endColumn; j++) {\n        newMatrix.set(i - startRow, j - startColumn, this.get(i, j));\n      }\n    }\n    return newMatrix;\n  }\n\n  subMatrixRow(indices, startColumn, endColumn) {\n    if (startColumn === undefined) startColumn = 0;\n    if (endColumn === undefined) endColumn = this.columns - 1;\n    if (\n      startColumn > endColumn ||\n      startColumn < 0 ||\n      startColumn >= this.columns ||\n      endColumn < 0 ||\n      endColumn >= this.columns\n    ) {\n      throw new RangeError('Argument out of range');\n    }\n\n    let newMatrix = new Matrix(indices.length, endColumn - startColumn + 1);\n    for (let i = 0; i < indices.length; i++) {\n      for (let j = startColumn; j <= endColumn; j++) {\n        if (indices[i] < 0 || indices[i] >= this.rows) {\n          throw new RangeError(`Row index out of range: ${indices[i]}`);\n        }\n        newMatrix.set(i, j - startColumn, this.get(indices[i], j));\n      }\n    }\n    return newMatrix;\n  }\n\n  subMatrixColumn(indices, startRow, endRow) {\n    if (startRow === undefined) startRow = 0;\n    if (endRow === undefined) endRow = this.rows - 1;\n    if (\n      startRow > endRow ||\n      startRow < 0 ||\n      startRow >= this.rows ||\n      endRow < 0 ||\n      endRow >= this.rows\n    ) {\n      throw new RangeError('Argument out of range');\n    }\n\n    let newMatrix = new Matrix(endRow - startRow + 1, indices.length);\n    for (let i = 0; i < indices.length; i++) {\n      for (let j = startRow; j <= endRow; j++) {\n        if (indices[i] < 0 || indices[i] >= this.columns) {\n          throw new RangeError(`Column index out of range: ${indices[i]}`);\n        }\n        newMatrix.set(j - startRow, i, this.get(j, indices[i]));\n      }\n    }\n    return newMatrix;\n  }\n\n  setSubMatrix(matrix, startRow, startColumn) {\n    matrix = Matrix.checkMatrix(matrix);\n    let endRow = startRow + matrix.rows - 1;\n    let endColumn = startColumn + matrix.columns - 1;\n    checkRange(this, startRow, endRow, startColumn, endColumn);\n    for (let i = 0; i < matrix.rows; i++) {\n      for (let j = 0; j < matrix.columns; j++) {\n        this.set(startRow + i, startColumn + j, matrix.get(i, j));\n      }\n    }\n    return this;\n  }\n\n  selection(rowIndices, columnIndices) {\n    let indices = checkIndices(this, rowIndices, columnIndices);\n    let newMatrix = new Matrix(rowIndices.length, columnIndices.length);\n    for (let i = 0; i < indices.row.length; i++) {\n      let rowIndex = indices.row[i];\n      for (let j = 0; j < indices.column.length; j++) {\n        let columnIndex = indices.column[j];\n        newMatrix.set(i, j, this.get(rowIndex, columnIndex));\n      }\n    }\n    return newMatrix;\n  }\n\n  trace() {\n    let min = Math.min(this.rows, this.columns);\n    let trace = 0;\n    for (let i = 0; i < min; i++) {\n      trace += this.get(i, i);\n    }\n    return trace;\n  }\n\n  clone() {\n    let newMatrix = new Matrix(this.rows, this.columns);\n    for (let row = 0; row < this.rows; row++) {\n      for (let column = 0; column < this.columns; column++) {\n        newMatrix.set(row, column, this.get(row, column));\n      }\n    }\n    return newMatrix;\n  }\n\n  sum(by) {\n    switch (by) {\n      case 'row':\n        return sumByRow(this);\n      case 'column':\n        return sumByColumn(this);\n      case undefined:\n        return sumAll(this);\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  product(by) {\n    switch (by) {\n      case 'row':\n        return productByRow(this);\n      case 'column':\n        return productByColumn(this);\n      case undefined:\n        return productAll(this);\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  mean(by) {\n    const sum = this.sum(by);\n    switch (by) {\n      case 'row': {\n        for (let i = 0; i < this.rows; i++) {\n          sum[i] /= this.columns;\n        }\n        return sum;\n      }\n      case 'column': {\n        for (let i = 0; i < this.columns; i++) {\n          sum[i] /= this.rows;\n        }\n        return sum;\n      }\n      case undefined:\n        return sum / this.size;\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  variance(by, options = {}) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { unbiased = true, mean = this.mean(by) } = options;\n    if (typeof unbiased !== 'boolean') {\n      throw new TypeError('unbiased must be a boolean');\n    }\n    switch (by) {\n      case 'row': {\n        if (!Array.isArray(mean)) {\n          throw new TypeError('mean must be an array');\n        }\n        return varianceByRow(this, unbiased, mean);\n      }\n      case 'column': {\n        if (!Array.isArray(mean)) {\n          throw new TypeError('mean must be an array');\n        }\n        return varianceByColumn(this, unbiased, mean);\n      }\n      case undefined: {\n        if (typeof mean !== 'number') {\n          throw new TypeError('mean must be a number');\n        }\n        return varianceAll(this, unbiased, mean);\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  standardDeviation(by, options) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    const variance = this.variance(by, options);\n    if (by === undefined) {\n      return Math.sqrt(variance);\n    } else {\n      for (let i = 0; i < variance.length; i++) {\n        variance[i] = Math.sqrt(variance[i]);\n      }\n      return variance;\n    }\n  }\n\n  center(by, options = {}) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { center = this.mean(by) } = options;\n    switch (by) {\n      case 'row': {\n        if (!Array.isArray(center)) {\n          throw new TypeError('center must be an array');\n        }\n        centerByRow(this, center);\n        return this;\n      }\n      case 'column': {\n        if (!Array.isArray(center)) {\n          throw new TypeError('center must be an array');\n        }\n        centerByColumn(this, center);\n        return this;\n      }\n      case undefined: {\n        if (typeof center !== 'number') {\n          throw new TypeError('center must be a number');\n        }\n        centerAll(this, center);\n        return this;\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  scale(by, options = {}) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    let scale = options.scale;\n    switch (by) {\n      case 'row': {\n        if (scale === undefined) {\n          scale = getScaleByRow(this);\n        } else if (!Array.isArray(scale)) {\n          throw new TypeError('scale must be an array');\n        }\n        scaleByRow(this, scale);\n        return this;\n      }\n      case 'column': {\n        if (scale === undefined) {\n          scale = getScaleByColumn(this);\n        } else if (!Array.isArray(scale)) {\n          throw new TypeError('scale must be an array');\n        }\n        scaleByColumn(this, scale);\n        return this;\n      }\n      case undefined: {\n        if (scale === undefined) {\n          scale = getScaleAll(this);\n        } else if (typeof scale !== 'number') {\n          throw new TypeError('scale must be a number');\n        }\n        scaleAll(this, scale);\n        return this;\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n}\n\nAbstractMatrix.prototype.klass = 'Matrix';\nif (typeof Symbol !== 'undefined') {\n  AbstractMatrix.prototype[\n    Symbol.for('nodejs.util.inspect.custom')\n  ] = inspectMatrix;\n}\n\nfunction compareNumbers(a, b) {\n  return a - b;\n}\n\n// Synonyms\nAbstractMatrix.random = AbstractMatrix.rand;\nAbstractMatrix.randomInt = AbstractMatrix.randInt;\nAbstractMatrix.diagonal = AbstractMatrix.diag;\nAbstractMatrix.prototype.diagonal = AbstractMatrix.prototype.diag;\nAbstractMatrix.identity = AbstractMatrix.eye;\nAbstractMatrix.prototype.negate = AbstractMatrix.prototype.neg;\nAbstractMatrix.prototype.tensorProduct =\n  AbstractMatrix.prototype.kroneckerProduct;\n\nexport default class Matrix extends AbstractMatrix {\n  constructor(nRows, nColumns) {\n    super();\n    if (Matrix.isMatrix(nRows)) {\n      return nRows.clone();\n    } else if (Number.isInteger(nRows) && nRows > 0) {\n      // Create an empty matrix\n      this.data = [];\n      if (Number.isInteger(nColumns) && nColumns > 0) {\n        for (let i = 0; i < nRows; i++) {\n          this.data.push(new Float64Array(nColumns));\n        }\n      } else {\n        throw new TypeError('nColumns must be a positive integer');\n      }\n    } else if (Array.isArray(nRows)) {\n      // Copy the values from the 2D array\n      const arrayData = nRows;\n      nRows = arrayData.length;\n      nColumns = arrayData[0].length;\n      if (typeof nColumns !== 'number' || nColumns === 0) {\n        throw new TypeError(\n          'Data must be a 2D array with at least one element',\n        );\n      }\n      this.data = [];\n      for (let i = 0; i < nRows; i++) {\n        if (arrayData[i].length !== nColumns) {\n          throw new RangeError('Inconsistent array dimensions');\n        }\n        this.data.push(Float64Array.from(arrayData[i]));\n      }\n    } else {\n      throw new TypeError(\n        'First argument must be a positive number or an array',\n      );\n    }\n    this.rows = nRows;\n    this.columns = nColumns;\n    return this;\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.data[rowIndex][columnIndex] = value;\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.data[rowIndex][columnIndex];\n  }\n\n  removeRow(index) {\n    checkRowIndex(this, index);\n    if (this.rows === 1) {\n      throw new RangeError('A matrix cannot have less than one row');\n    }\n    this.data.splice(index, 1);\n    this.rows -= 1;\n    return this;\n  }\n\n  addRow(index, array) {\n    if (array === undefined) {\n      array = index;\n      index = this.rows;\n    }\n    checkRowIndex(this, index, true);\n    array = Float64Array.from(checkRowVector(this, array, true));\n    this.data.splice(index, 0, array);\n    this.rows += 1;\n    return this;\n  }\n\n  removeColumn(index) {\n    checkColumnIndex(this, index);\n    if (this.columns === 1) {\n      throw new RangeError('A matrix cannot have less than one column');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      const newRow = new Float64Array(this.columns - 1);\n      for (let j = 0; j < index; j++) {\n        newRow[j] = this.data[i][j];\n      }\n      for (let j = index + 1; j < this.columns; j++) {\n        newRow[j - 1] = this.data[i][j];\n      }\n      this.data[i] = newRow;\n    }\n    this.columns -= 1;\n    return this;\n  }\n\n  addColumn(index, array) {\n    if (typeof array === 'undefined') {\n      array = index;\n      index = this.columns;\n    }\n    checkColumnIndex(this, index, true);\n    array = checkColumnVector(this, array);\n    for (let i = 0; i < this.rows; i++) {\n      const newRow = new Float64Array(this.columns + 1);\n      let j = 0;\n      for (; j < index; j++) {\n        newRow[j] = this.data[i][j];\n      }\n      newRow[j++] = array[i];\n      for (; j < this.columns + 1; j++) {\n        newRow[j] = this.data[i][j - 1];\n      }\n      this.data[i] = newRow;\n    }\n    this.columns += 1;\n    return this;\n  }\n}\n\ninstallMathOperations(AbstractMatrix, Matrix);\n","import { newArray } from './util';\n\nexport function sumByRow(matrix) {\n  let sum = newArray(matrix.rows);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[i] += matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function sumByColumn(matrix) {\n  let sum = newArray(matrix.columns);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[j] += matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function sumAll(matrix) {\n  let v = 0;\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      v += matrix.get(i, j);\n    }\n  }\n  return v;\n}\n\nexport function productByRow(matrix) {\n  let sum = newArray(matrix.rows, 1);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[i] *= matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function productByColumn(matrix) {\n  let sum = newArray(matrix.columns, 1);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[j] *= matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function productAll(matrix) {\n  let v = 1;\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      v *= matrix.get(i, j);\n    }\n  }\n  return v;\n}\n\nexport function varianceByRow(matrix, unbiased, mean) {\n  const rows = matrix.rows;\n  const cols = matrix.columns;\n  const variance = [];\n\n  for (let i = 0; i < rows; i++) {\n    let sum1 = 0;\n    let sum2 = 0;\n    let x = 0;\n    for (let j = 0; j < cols; j++) {\n      x = matrix.get(i, j) - mean[i];\n      sum1 += x;\n      sum2 += x * x;\n    }\n    if (unbiased) {\n      variance.push((sum2 - (sum1 * sum1) / cols) / (cols - 1));\n    } else {\n      variance.push((sum2 - (sum1 * sum1) / cols) / cols);\n    }\n  }\n  return variance;\n}\n\nexport function varianceByColumn(matrix, unbiased, mean) {\n  const rows = matrix.rows;\n  const cols = matrix.columns;\n  const variance = [];\n\n  for (let j = 0; j < cols; j++) {\n    let sum1 = 0;\n    let sum2 = 0;\n    let x = 0;\n    for (let i = 0; i < rows; i++) {\n      x = matrix.get(i, j) - mean[j];\n      sum1 += x;\n      sum2 += x * x;\n    }\n    if (unbiased) {\n      variance.push((sum2 - (sum1 * sum1) / rows) / (rows - 1));\n    } else {\n      variance.push((sum2 - (sum1 * sum1) / rows) / rows);\n    }\n  }\n  return variance;\n}\n\nexport function varianceAll(matrix, unbiased, mean) {\n  const rows = matrix.rows;\n  const cols = matrix.columns;\n  const size = rows * cols;\n\n  let sum1 = 0;\n  let sum2 = 0;\n  let x = 0;\n  for (let i = 0; i < rows; i++) {\n    for (let j = 0; j < cols; j++) {\n      x = matrix.get(i, j) - mean;\n      sum1 += x;\n      sum2 += x * x;\n    }\n  }\n  if (unbiased) {\n    return (sum2 - (sum1 * sum1) / size) / (size - 1);\n  } else {\n    return (sum2 - (sum1 * sum1) / size) / size;\n  }\n}\n\nexport function centerByRow(matrix, mean) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) - mean[i]);\n    }\n  }\n}\n\nexport function centerByColumn(matrix, mean) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) - mean[j]);\n    }\n  }\n}\n\nexport function centerAll(matrix, mean) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) - mean);\n    }\n  }\n}\n\nexport function getScaleByRow(matrix) {\n  const scale = [];\n  for (let i = 0; i < matrix.rows; i++) {\n    let sum = 0;\n    for (let j = 0; j < matrix.columns; j++) {\n      sum += Math.pow(matrix.get(i, j), 2) / (matrix.columns - 1);\n    }\n    scale.push(Math.sqrt(sum));\n  }\n  return scale;\n}\n\nexport function scaleByRow(matrix, scale) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) / scale[i]);\n    }\n  }\n}\n\nexport function getScaleByColumn(matrix) {\n  const scale = [];\n  for (let j = 0; j < matrix.columns; j++) {\n    let sum = 0;\n    for (let i = 0; i < matrix.rows; i++) {\n      sum += Math.pow(matrix.get(i, j), 2) / (matrix.rows - 1);\n    }\n    scale.push(Math.sqrt(sum));\n  }\n  return scale;\n}\n\nexport function scaleByColumn(matrix, scale) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) / scale[j]);\n    }\n  }\n}\n\nexport function getScaleAll(matrix) {\n  const divider = matrix.size - 1;\n  let sum = 0;\n  for (let j = 0; j < matrix.columns; j++) {\n    for (let i = 0; i < matrix.rows; i++) {\n      sum += Math.pow(matrix.get(i, j), 2) / divider;\n    }\n  }\n  return Math.sqrt(sum);\n}\n\nexport function scaleAll(matrix, scale) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) / scale);\n    }\n  }\n}\n","import { X } from 'ml-spectra-processing';\n\nexport function getFromToIndex(xs, range) {\n  let { from, to } = range;\n  if (from === undefined) {\n    from = xs[0];\n  }\n  if (to === undefined) {\n    to = xs[xs.length - 1];\n  }\n\n  return {\n    fromIndex: X.findClosestIndex(xs, from),\n    toIndex: X.findClosestIndex(xs, to),\n  };\n}\n","export default function maybeToPrecision(value, digits) {\n  if (value < 0) {\n    value = 0 - value;\n    if (typeof digits === 'number') {\n      return `- ${value.toPrecision(digits)}`;\n    } else {\n      return `- ${value.toString()}`;\n    }\n  } else {\n    if (typeof digits === 'number') {\n      return value.toPrecision(digits);\n    } else {\n      return value.toString();\n    }\n  }\n}\n","export function installMathOperations(AbstractMatrix, Matrix) {\n  AbstractMatrix.prototype.add = function add(value) {\n    if (typeof value === 'number') return this.addS(value);\n    return this.addM(value);\n  };\n\n  AbstractMatrix.prototype.addS = function addS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) + value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.addM = function addM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) + matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.add = function add(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.add(value);\n  };\n\n  AbstractMatrix.prototype.sub = function sub(value) {\n    if (typeof value === 'number') return this.subS(value);\n    return this.subM(value);\n  };\n\n  AbstractMatrix.prototype.subS = function subS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) - value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.subM = function subM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) - matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sub = function sub(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sub(value);\n  };\n  AbstractMatrix.prototype.subtract = AbstractMatrix.prototype.sub;\n  AbstractMatrix.prototype.subtractS = AbstractMatrix.prototype.subS;\n  AbstractMatrix.prototype.subtractM = AbstractMatrix.prototype.subM;\n  AbstractMatrix.subtract = AbstractMatrix.sub;\n\n  AbstractMatrix.prototype.mul = function mul(value) {\n    if (typeof value === 'number') return this.mulS(value);\n    return this.mulM(value);\n  };\n\n  AbstractMatrix.prototype.mulS = function mulS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) * value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.mulM = function mulM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) * matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.mul = function mul(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.mul(value);\n  };\n  AbstractMatrix.prototype.multiply = AbstractMatrix.prototype.mul;\n  AbstractMatrix.prototype.multiplyS = AbstractMatrix.prototype.mulS;\n  AbstractMatrix.prototype.multiplyM = AbstractMatrix.prototype.mulM;\n  AbstractMatrix.multiply = AbstractMatrix.mul;\n\n  AbstractMatrix.prototype.div = function div(value) {\n    if (typeof value === 'number') return this.divS(value);\n    return this.divM(value);\n  };\n\n  AbstractMatrix.prototype.divS = function divS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) / value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.divM = function divM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) / matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.div = function div(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.div(value);\n  };\n  AbstractMatrix.prototype.divide = AbstractMatrix.prototype.div;\n  AbstractMatrix.prototype.divideS = AbstractMatrix.prototype.divS;\n  AbstractMatrix.prototype.divideM = AbstractMatrix.prototype.divM;\n  AbstractMatrix.divide = AbstractMatrix.div;\n\n  AbstractMatrix.prototype.mod = function mod(value) {\n    if (typeof value === 'number') return this.modS(value);\n    return this.modM(value);\n  };\n\n  AbstractMatrix.prototype.modS = function modS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) % value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.modM = function modM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) % matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.mod = function mod(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.mod(value);\n  };\n  AbstractMatrix.prototype.modulus = AbstractMatrix.prototype.mod;\n  AbstractMatrix.prototype.modulusS = AbstractMatrix.prototype.modS;\n  AbstractMatrix.prototype.modulusM = AbstractMatrix.prototype.modM;\n  AbstractMatrix.modulus = AbstractMatrix.mod;\n\n  AbstractMatrix.prototype.and = function and(value) {\n    if (typeof value === 'number') return this.andS(value);\n    return this.andM(value);\n  };\n\n  AbstractMatrix.prototype.andS = function andS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) & value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.andM = function andM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) & matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.and = function and(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.and(value);\n  };\n\n  AbstractMatrix.prototype.or = function or(value) {\n    if (typeof value === 'number') return this.orS(value);\n    return this.orM(value);\n  };\n\n  AbstractMatrix.prototype.orS = function orS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) | value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.orM = function orM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) | matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.or = function or(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.or(value);\n  };\n\n  AbstractMatrix.prototype.xor = function xor(value) {\n    if (typeof value === 'number') return this.xorS(value);\n    return this.xorM(value);\n  };\n\n  AbstractMatrix.prototype.xorS = function xorS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) ^ value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.xorM = function xorM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) ^ matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.xor = function xor(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.xor(value);\n  };\n\n  AbstractMatrix.prototype.leftShift = function leftShift(value) {\n    if (typeof value === 'number') return this.leftShiftS(value);\n    return this.leftShiftM(value);\n  };\n\n  AbstractMatrix.prototype.leftShiftS = function leftShiftS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) << value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.leftShiftM = function leftShiftM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) << matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.leftShift = function leftShift(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.leftShift(value);\n  };\n\n  AbstractMatrix.prototype.signPropagatingRightShift = function signPropagatingRightShift(value) {\n    if (typeof value === 'number') return this.signPropagatingRightShiftS(value);\n    return this.signPropagatingRightShiftM(value);\n  };\n\n  AbstractMatrix.prototype.signPropagatingRightShiftS = function signPropagatingRightShiftS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) >> value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.signPropagatingRightShiftM = function signPropagatingRightShiftM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) >> matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.signPropagatingRightShift = function signPropagatingRightShift(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.signPropagatingRightShift(value);\n  };\n\n  AbstractMatrix.prototype.rightShift = function rightShift(value) {\n    if (typeof value === 'number') return this.rightShiftS(value);\n    return this.rightShiftM(value);\n  };\n\n  AbstractMatrix.prototype.rightShiftS = function rightShiftS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) >>> value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.rightShiftM = function rightShiftM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) >>> matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.rightShift = function rightShift(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.rightShift(value);\n  };\n  AbstractMatrix.prototype.zeroFillRightShift = AbstractMatrix.prototype.rightShift;\n  AbstractMatrix.prototype.zeroFillRightShiftS = AbstractMatrix.prototype.rightShiftS;\n  AbstractMatrix.prototype.zeroFillRightShiftM = AbstractMatrix.prototype.rightShiftM;\n  AbstractMatrix.zeroFillRightShift = AbstractMatrix.rightShift;\n\n  AbstractMatrix.prototype.not = function not() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, ~(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.not = function not(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.not();\n  };\n\n  AbstractMatrix.prototype.abs = function abs() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.abs(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.abs = function abs(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.abs();\n  };\n\n  AbstractMatrix.prototype.acos = function acos() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.acos(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.acos = function acos(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.acos();\n  };\n\n  AbstractMatrix.prototype.acosh = function acosh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.acosh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.acosh = function acosh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.acosh();\n  };\n\n  AbstractMatrix.prototype.asin = function asin() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.asin(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.asin = function asin(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.asin();\n  };\n\n  AbstractMatrix.prototype.asinh = function asinh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.asinh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.asinh = function asinh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.asinh();\n  };\n\n  AbstractMatrix.prototype.atan = function atan() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.atan(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.atan = function atan(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.atan();\n  };\n\n  AbstractMatrix.prototype.atanh = function atanh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.atanh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.atanh = function atanh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.atanh();\n  };\n\n  AbstractMatrix.prototype.cbrt = function cbrt() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.cbrt(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.cbrt = function cbrt(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.cbrt();\n  };\n\n  AbstractMatrix.prototype.ceil = function ceil() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.ceil(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.ceil = function ceil(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.ceil();\n  };\n\n  AbstractMatrix.prototype.clz32 = function clz32() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.clz32(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.clz32 = function clz32(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.clz32();\n  };\n\n  AbstractMatrix.prototype.cos = function cos() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.cos(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.cos = function cos(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.cos();\n  };\n\n  AbstractMatrix.prototype.cosh = function cosh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.cosh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.cosh = function cosh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.cosh();\n  };\n\n  AbstractMatrix.prototype.exp = function exp() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.exp(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.exp = function exp(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.exp();\n  };\n\n  AbstractMatrix.prototype.expm1 = function expm1() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.expm1(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.expm1 = function expm1(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.expm1();\n  };\n\n  AbstractMatrix.prototype.floor = function floor() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.floor(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.floor = function floor(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.floor();\n  };\n\n  AbstractMatrix.prototype.fround = function fround() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.fround(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.fround = function fround(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.fround();\n  };\n\n  AbstractMatrix.prototype.log = function log() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.log(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.log = function log(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.log();\n  };\n\n  AbstractMatrix.prototype.log1p = function log1p() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.log1p(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.log1p = function log1p(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.log1p();\n  };\n\n  AbstractMatrix.prototype.log10 = function log10() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.log10(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.log10 = function log10(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.log10();\n  };\n\n  AbstractMatrix.prototype.log2 = function log2() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.log2(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.log2 = function log2(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.log2();\n  };\n\n  AbstractMatrix.prototype.round = function round() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.round(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.round = function round(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.round();\n  };\n\n  AbstractMatrix.prototype.sign = function sign() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.sign(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sign = function sign(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sign();\n  };\n\n  AbstractMatrix.prototype.sin = function sin() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.sin(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sin = function sin(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sin();\n  };\n\n  AbstractMatrix.prototype.sinh = function sinh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.sinh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sinh = function sinh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sinh();\n  };\n\n  AbstractMatrix.prototype.sqrt = function sqrt() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.sqrt(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sqrt = function sqrt(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sqrt();\n  };\n\n  AbstractMatrix.prototype.tan = function tan() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.tan(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.tan = function tan(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.tan();\n  };\n\n  AbstractMatrix.prototype.tanh = function tanh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.tanh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.tanh = function tanh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.tanh();\n  };\n\n  AbstractMatrix.prototype.trunc = function trunc() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.trunc(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.trunc = function trunc(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.trunc();\n  };\n\n  AbstractMatrix.pow = function pow(matrix, arg0) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.pow(arg0);\n  };\n\n  AbstractMatrix.prototype.pow = function pow(value) {\n    if (typeof value === 'number') return this.powS(value);\n    return this.powM(value);\n  };\n\n  AbstractMatrix.prototype.powS = function powS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.pow(this.get(i, j), value));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.powM = function powM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.pow(this.get(i, j), matrix.get(i, j)));\n      }\n    }\n    return this;\n  };\n}\n","export { default as maybeToPrecision } from './maybeToPrecision';\nexport { default as checkArrayLength } from './checkArrayLength';\n\nexport default class BaseRegression {\n  constructor() {\n    if (new.target === BaseRegression) {\n      throw new Error('BaseRegression must be subclassed');\n    }\n  }\n\n  predict(x) {\n    if (typeof x === 'number') {\n      return this._predict(x);\n    } else if (Array.isArray(x)) {\n      const y = [];\n      for (let i = 0; i < x.length; i++) {\n        y.push(this._predict(x[i]));\n      }\n      return y;\n    } else {\n      throw new TypeError('x must be a number or array');\n    }\n  }\n\n  _predict() {\n    throw new Error('_predict must be implemented');\n  }\n\n  train() {\n    // Do nothing for this package\n  }\n\n  toString() {\n    return '';\n  }\n\n  toLaTeX() {\n    return '';\n  }\n\n  /**\n   * Return the correlation coefficient of determination (r) and chi-square.\n   * @param {Array<number>} x\n   * @param {Array<number>} y\n   * @return {object}\n   */\n  score(x, y) {\n    if (!Array.isArray(x) || !Array.isArray(y) || x.length !== y.length) {\n      throw new Error('x and y must be arrays of the same length');\n    }\n\n    const n = x.length;\n    const y2 = new Array(n);\n    for (let i = 0; i < n; i++) {\n      y2[i] = this._predict(x[i]);\n    }\n\n    let xSum = 0;\n    let ySum = 0;\n    let chi2 = 0;\n    let rmsd = 0;\n    let xSquared = 0;\n    let ySquared = 0;\n    let xY = 0;\n    for (let i = 0; i < n; i++) {\n      xSum += y2[i];\n      ySum += y[i];\n      xSquared += y2[i] * y2[i];\n      ySquared += y[i] * y[i];\n      xY += y2[i] * y[i];\n      if (y[i] !== 0) {\n        chi2 += ((y[i] - y2[i]) * (y[i] - y2[i])) / y[i];\n      }\n      rmsd += (y[i] - y2[i]) * (y[i] - y2[i]);\n    }\n\n    const r =\n      (n * xY - xSum * ySum) /\n      Math.sqrt((n * xSquared - xSum * xSum) * (n * ySquared - ySum * ySum));\n\n    return {\n      r: r,\n      r2: r * r,\n      chi2: chi2,\n      rmsd: Math.sqrt(rmsd / n)\n    };\n  }\n}\n","import BaseRegression, {\n  checkArrayLength,\n  maybeToPrecision\n} from 'ml-regression-base';\n\nexport default class SimpleLinearRegression extends BaseRegression {\n  constructor(x, y) {\n    super();\n    if (x === true) {\n      this.slope = y.slope;\n      this.intercept = y.intercept;\n      this.coefficients = [y.intercept, y.slope];\n    } else {\n      checkArrayLength(x, y);\n      regress(this, x, y);\n    }\n  }\n\n  toJSON() {\n    return {\n      name: 'simpleLinearRegression',\n      slope: this.slope,\n      intercept: this.intercept\n    };\n  }\n\n  _predict(x) {\n    return this.slope * x + this.intercept;\n  }\n\n  computeX(y) {\n    return (y - this.intercept) / this.slope;\n  }\n\n  toString(precision) {\n    let result = 'f(x) = ';\n    if (this.slope !== 0) {\n      const xFactor = maybeToPrecision(this.slope, precision);\n      result += `${xFactor === '1' ? '' : `${xFactor} * `}x`;\n      if (this.intercept !== 0) {\n        const absIntercept = Math.abs(this.intercept);\n        const operator = absIntercept === this.intercept ? '+' : '-';\n        result += ` ${operator} ${maybeToPrecision(absIntercept, precision)}`;\n      }\n    } else {\n      result += maybeToPrecision(this.intercept, precision);\n    }\n    return result;\n  }\n\n  toLaTeX(precision) {\n    return this.toString(precision);\n  }\n\n  static load(json) {\n    if (json.name !== 'simpleLinearRegression') {\n      throw new TypeError('not a SLR model');\n    }\n    return new SimpleLinearRegression(true, json);\n  }\n}\n\nfunction regress(slr, x, y) {\n  const n = x.length;\n  let xSum = 0;\n  let ySum = 0;\n\n  let xSquared = 0;\n  let xY = 0;\n\n  for (let i = 0; i < n; i++) {\n    xSum += x[i];\n    ySum += y[i];\n    xSquared += x[i] * x[i];\n    xY += x[i] * y[i];\n  }\n\n  const numerator = n * xY - xSum * ySum;\n  slr.slope = numerator / (n * xSquared - xSum * xSum);\n  slr.intercept = (1 / n) * ySum - slr.slope * (1 / n) * xSum;\n  slr.coefficients = [slr.intercept, slr.slope];\n}\n","export default function checkArraySize(x, y) {\n  if (!Array.isArray(x) || !Array.isArray(y)) {\n    throw new TypeError('x and y must be arrays');\n  }\n  if (x.length !== y.length) {\n    throw new RangeError('x and y arrays must have the same length');\n  }\n}\n","import { X, XY } from 'ml-spectra-processing';\n\nimport { getNormalizedData } from './getNormalizedData';\nimport { min } from './scaled/min';\nimport { max } from './scaled/max';\nimport { minMax } from './scaled/minMax';\nimport { range as rangeFct } from './scaled/range';\nimport { getFromToIndex } from './scaled/getFromToIndex';\n/**\n * @private\n * @param {Array<Spectrum>} spectra\n * @param {object} [options={}] scale spectra based on various parameters\n * @param {object} [options.range] from - to\n * @param {Array} [options.ids] ids of selected spectra\n * @param {string} [options.targetID=spectra[0].id]\n * @param {string} [options.method='max'] min, max, range, minMax\n * @param {boolean} [options.relative=false]\n * @param {Array} [options.ranges] Array of object containing {from:'', to:'', label:''}\n * @param {Array} [options.calculations] Array of object containing {label:'', formula:''}\n * @returns {object} { ids:[], matrix:[Array], meta:[object], x:[], ranges:[object] }\n */\n\nexport function getScaledData(spectraProcessor, options = {}) {\n  if (!spectraProcessor.spectra || !spectraProcessor.spectra[0]) return {};\n  const {\n    range,\n    targetID,\n    relative,\n    method,\n    ids,\n    ranges,\n    calculations,\n  } = options;\n  let targetSpectrum =\n    spectraProcessor.getSpectrum(targetID) || spectraProcessor.spectra[0];\n  let spectra = spectraProcessor.getSpectra(ids);\n  let result;\n\n  if (method === '' || method === undefined) {\n    result = getNormalizedData(spectra);\n  } else {\n    let matrix;\n    switch (method.toLowerCase()) {\n      case 'min':\n        matrix = min(spectra, targetSpectrum, range);\n        break;\n      case 'max':\n        matrix = max(spectra, targetSpectrum, range);\n        break;\n      case 'minmax':\n        matrix = minMax(spectra, targetSpectrum, range);\n        break;\n      case 'range':\n        matrix = rangeFct(spectra, targetSpectrum, range);\n        break;\n      default:\n        throw new Error(`getScaledData: unknown method: ${method}`);\n    }\n    let meta = [];\n    let currentIDs = [];\n    for (let spectrum of spectra) {\n      currentIDs.push(spectrum.id);\n      meta.push(spectrum.meta);\n    }\n    let x = spectra[0].normalized.x;\n    result = { ids: currentIDs, matrix, meta, x };\n  }\n\n  if (relative) {\n    for (let i = 0; i < result.matrix.length; i++) {\n      result.matrix[i] = X.subtract(\n        result.matrix[i],\n        targetSpectrum.normalized.y,\n      );\n    }\n  }\n\n  if (ranges) {\n    result.ranges = [];\n    for (let i = 0; i < result.matrix.length; i++) {\n      let rangesCopy = JSON.parse(JSON.stringify(ranges));\n      let yNormalized = result.matrix[i];\n      let resultRanges = {};\n      result.ranges.push(resultRanges);\n      for (let currentRange of rangesCopy) {\n        if (currentRange.label) {\n          let fromToIndex = getFromToIndex(\n            targetSpectrum.normalized.x,\n            currentRange,\n          );\n          currentRange.integration = XY.integration(\n            { x: result.x, y: yNormalized },\n            fromToIndex,\n          );\n          currentRange.maxPoint = XY.maxYPoint(\n            { x: result.x, y: yNormalized },\n            fromToIndex,\n          );\n          resultRanges[currentRange.label] = currentRange;\n        }\n      }\n    }\n  }\n\n  if (calculations && result.ranges) {\n    result.calculations = result.ranges.map(() => {\n      return {};\n    });\n    const parameters = Object.keys(result.ranges[0]);\n    for (let calculation of calculations) {\n      // eslint-disable-next-line no-new-func\n      const callback = new Function(\n        ...parameters,\n        `return ${calculation.formula}`,\n      );\n      for (let i = 0; i < result.ranges.length; i++) {\n        let oneRanges = result.ranges[i];\n        let values = parameters.map((key) => oneRanges[key].integration);\n        result.calculations[i][calculation.label] = callback(...values);\n      }\n    }\n  }\n\n  return result;\n}\n","import { XY, X } from 'ml-spectra-processing';\n\nimport { getFromToIndex } from './getFromToIndex';\n\nexport function min(spectra, targetSpectrum, range = {}) {\n  let fromToIndex = getFromToIndex(targetSpectrum.normalized.x, range);\n\n  let targetValue = XY.minYPoint(targetSpectrum.normalized, fromToIndex).y;\n\n  let values = spectra.map(\n    (spectrum) => XY.minYPoint(spectrum.normalized, fromToIndex).y,\n  );\n\n  let matrix = [];\n  for (let i = 0; i < spectra.length; i++) {\n    let spectrum = spectra[i];\n    let factor = targetValue / values[i];\n    matrix.push(X.multiply(spectrum.normalized.y, factor));\n  }\n\n  return matrix;\n}\n","import { XY, X } from 'ml-spectra-processing';\n\nimport { getFromToIndex } from './getFromToIndex';\n\nexport function max(spectra, targetSpectrum, range = {}) {\n  let fromToIndex = getFromToIndex(targetSpectrum.normalized.x, range);\n\n  let targetValue = XY.maxYPoint(targetSpectrum.normalized, fromToIndex).y;\n\n  let values = spectra.map(\n    (spectrum) => XY.maxYPoint(spectrum.normalized, fromToIndex).y,\n  );\n\n  let matrix = [];\n  for (let i = 0; i < spectra.length; i++) {\n    let spectrum = spectra[i];\n    let factor = targetValue / values[i];\n    matrix.push(X.multiply(spectrum.normalized.y, factor));\n  }\n\n  return matrix;\n}\n","import { XY } from 'ml-spectra-processing';\nimport SimpleLinearRegression from 'ml-regression-simple-linear';\n\nimport { getFromToIndex } from './getFromToIndex';\n\nexport function minMax(spectra, targetSpectrum, range = {}) {\n  let fromToIndex = getFromToIndex(targetSpectrum.normalized.x, range);\n\n  let targetValue = {\n    min: XY.minYPoint(targetSpectrum.normalized, fromToIndex).y,\n    max: XY.maxYPoint(targetSpectrum.normalized, fromToIndex).y,\n  };\n\n  let values = spectra.map((spectrum) => {\n    return {\n      min: XY.minYPoint(spectrum.normalized, fromToIndex).y,\n      max: XY.maxYPoint(spectrum.normalized, fromToIndex).y,\n    };\n  });\n\n  let matrix = [];\n  for (let i = 0; i < spectra.length; i++) {\n    let spectrum = spectra[i];\n    const regression = new SimpleLinearRegression(\n      [targetValue.min, targetValue.max],\n      [values[i].min, values[i].max],\n    );\n\n    let length = spectrum.normalized.y.length;\n    let scaled = new Array(length);\n    for (let j = 0; j < length; j++) {\n      scaled[j] = regression.computeX(spectrum.normalized.y[j]);\n    }\n    matrix.push(scaled);\n  }\n\n  return matrix;\n}\n","import { XY, X } from 'ml-spectra-processing';\n\nimport { getFromToIndex } from './getFromToIndex';\n\nexport function range(spectra, targetSpectrum, range = {}) {\n  let fromToIndex = getFromToIndex(targetSpectrum.normalized.x, range);\n\n  let targetValue = XY.integration(targetSpectrum.normalized, fromToIndex);\n\n  let values = spectra.map((spectrum) =>\n    XY.integration(spectrum.normalized, fromToIndex),\n  );\n\n  let matrix = [];\n  for (let i = 0; i < spectra.length; i++) {\n    let spectrum = spectra[i];\n    let factor = targetValue / values[i];\n    matrix.push(X.multiply(spectrum.normalized.y, factor));\n  }\n\n  return matrix;\n}\n","/**\n * @private\n * @param {Array<object>} [metadata]\n * @param {object} [options={}] scale spectra based on various parameters\n * @param {string} [options.propertyName=\"category\"]\n */\n\nexport function getCategoriesStats(metadata, options = {}) {\n  const { propertyName = 'category' } = options;\n  let categories = {};\n  let classNumber = 0;\n  for (let metadatum of metadata) {\n    let value = metadatum[propertyName];\n    if (!categories[value]) {\n      categories[value] = {\n        classNumber: classNumber++,\n        counter: 0,\n      };\n    }\n    categories[value].counter++;\n  }\n  return categories;\n}\n","import { Spectrum } from './spectrum/Spectrum';\nimport parseJcamp from './parser/jcamp';\nimport parseText from './parser/text';\nimport parseMatrix from './parser/matrix';\nimport { getNormalizationAnnotations } from './jsgraph/getNormalizationAnnotations';\nimport { getBoxPlotAnnotations } from './jsgraph/getBoxPlotAnnotations';\nimport { getChart } from './jsgraph/getChart';\nimport { getAutocorrelationChart } from './jsgraph/getAutocorrelationChart';\nimport { getTrackAnnotation } from './jsgraph/getTrackAnnotation';\nimport { getNormalizedChart } from './jsgraph/getNormalizedChart';\nimport { getScaledChart } from './jsgraph/getScaledChart';\nimport { getAutocorrelation } from './spectra/getAutocorrelation';\nimport { getMeanData } from './spectra/getMeanData';\nimport { getNormalizedData } from './spectra/getNormalizedData';\nimport { getNormalizedText } from './spectra/getNormalizedText';\nimport { getScaledData } from './spectra/getScaledData';\nimport { getMetadata } from './metadata/getMetadata';\nimport { getClasses } from './metadata/getClasses';\nimport { getCategoriesStats } from './metadata/getCategoriesStats';\n\nexport class SpectraProcessor {\n  /**\n   * Manager a large number of spectra with the possibility to normalize the data\n   * and skip the original data.\n   * @param {object} [options={}]\n   * @param {boolean} [options.maxMemory=64M]\n   * @param {object} [options.normalization={}] options to normalize the spectra before comparison\n   * @param {number} [options.normalization.from]\n   * @param {number} [options.normalization.to]\n   * @param {number} [options.normalization.numberOfPoints]\n   * @param {array<object>} [options.normalization.filters]\n   * @param {string} [options.normalization.filters.X.name]\n   * @param {object} [options.normalization.filters.X.options]\n   * @param {array<object>} [options.normalization.exclusions]\n   * @param {string} [options.normalization.exclusions.X.from]\n   * @param {object} [options.normalization.exclusions.X.to]\n   */\n  constructor(options = {}) {\n    this.normalization = options.normalization;\n    this.maxMemory = options.maxMemory || 64 * 1024 * 1024;\n    this.keepOriginal = true;\n    this.spectra = [];\n    this.boundaries = {\n      minX: Number.MAX_VALUE,\n      maxX: Number.MIN_VALUE,\n      minY: Number.MAX_VALUE,\n      maxY: Number.MIN_VALUE,\n    };\n  }\n\n  getNormalizationAnnotations() {\n    return getNormalizationAnnotations(\n      this.normalization,\n      this.getNormalizedBoundary(),\n    );\n  }\n\n  /**\n   * Recalculate the normalized data using the stored original data if available\n   * This will throw an error in the original data is not present\n   * @param {number} [normalization.from]\n   * @param {number} [normalization.to]\n   * @param {number} [normalization.numberOfPoints]\n   * @param {array<object>} [normalization.filters]\n   * @param {string} [normalization.filters.X.name]\n   * @param {object} [normalization.filters.X.options]\n   * @param {array<object>} [normalization.exclusions]\n   * @param {string} [normalization.exclusions.X.from]\n   * @param {object} [normalization.exclusions.X.to]\n   */\n  setNormalization(normalization = {}) {\n    if (JSON.stringify(this.normalization) === JSON.stringify(normalization)) {\n      return;\n    }\n    this.normalization = normalization;\n    for (let spectrum of this.spectra) {\n      spectrum.updateNormalization(this.normalization);\n    }\n  }\n\n  getNormalization() {\n    return this.normalization;\n  }\n\n  /**\n   * Returns an object {x:[], y:[]} containing the autocorrelation for the\n   * specified index\n   * @param {integer} [index] point of the spectrum to autocorrelate\n   * @param {object} [options={}]\n   * @param {array} [options.ids=[]] list of ids, by default all spectra\n   */\n  getAutocorrelation(index, options) {\n    return getAutocorrelation(this.getNormalizedData(options), index);\n  }\n\n  /**\n   * Returns a {x:[], y:[]} containg the average of specified spectra\n   * @param {object} [options={}]\n   * @param {array} [options.ids=[]] list of ids, by default all spectra\n   */\n  getMeanData(options) {\n    return getMeanData(this.getNormalizedData(options));\n  }\n\n  /**\n   * Returns an object contains 4 parameters with the normalized data\n   * @returns {object} { ids:[], matrix:[Array], meta:[object], x:[] }\n   * @param {object} [options={}]\n   * @param {Array} [options.ids] List of spectra ids to export, by default all\n   */\n  getNormalizedData(options = {}) {\n    const { ids } = options;\n    let spectra = this.getSpectra(ids);\n    return getNormalizedData(spectra);\n  }\n\n  /**\n   * Returns a tab separated value containing the normalized data\n   * @param {object} [options={}]\n   * @param {Array} [options.ids] List of spectra ids to export, by default all\n   * @param {string} [options.fs='\\t'] field separator\n   * @param {string} [options.rs='\\n'] record (line) separator\n   * @returns {string}\n   */\n  getNormalizedText(options = {}) {\n    const { ids } = options;\n    let spectra = this.getSpectra(ids);\n    return getNormalizedText(spectra, options);\n  }\n\n  getMinMaxX() {\n    let min = Number.MAX_VALUE;\n    let max = Number.MIN_VALUE;\n    for (let spectrum of this.spectra) {\n      if (spectrum.minX < min) min = spectrum.minX;\n      if (spectrum.maxX > max) max = spectrum.maxX;\n    }\n    return { min, max };\n  }\n\n  /**\n\n   * Returns an object contains 4 parameters with the scaled data\n   * @param {object} [options={}] scale spectra based on various parameters\n   * @param {object} [options.range] from - to\n   * @param {Array} [options.ids] ids of selected spectra, by default all\n   * @param {string} [options.targetID=spectra[0].id]\n   * @param {string} [options.method='max'] min, max, range, minMax\n   * @param {boolean} [options.relative=false]\n   * @returns {object} { ids:[], matrix:[Array], meta:[object], x:[] }\n   */\n  getScaledData(options) {\n    return getScaledData(this, options);\n  }\n\n  /**\n   * Add from text\n   * By default TITLE from the jcamp will be in the meta information\n   * @param {string} text\n   * @param {object} [options={}]\n   * @param {object} [options.parserOptions={}] XY parser options\n   * @param {object} [options.meta={}]\n   * @param {string} [options.meta.color]\n   * @param {object} [options.id={}]\n   * @param {object} [options.kind]\n   * @param {boolean} [options.force=false] replace existing spectrum (same ID)\n   */\n\n  addFromText(text, options = {}) {\n    if (options.force !== true && options.id && this.contains(options.id)) {\n      return;\n    }\n    let parsed = parseText(text, options);\n    let meta = { ...parsed.meta, ...(options.meta || {}) };\n    this.addFromData(parsed.data, { meta, id: options.id });\n  }\n\n  /**\n   * Add jcamp\n   * By default TITLE from the jcamp will be in the meta information\n   * @param {string} jcamp\n   * @param {object} [options={}]\n   * @param {object} [options.meta={}]\n   * @param {string} [options.meta.color]\n   * @param {object} [options.id={}]\n   * @param {boolean} [options.force=false] replace existing spectrum (same ID)\n   */\n\n  addFromJcamp(jcamp, options = {}) {\n    if (options.force !== true && options.id && this.contains(options.id)) {\n      return;\n    }\n    let parsed = parseJcamp(jcamp);\n    let meta = { ...parsed.meta, ...(options.meta || {}) };\n    this.addFromData(parsed.data, { meta, id: options.id });\n  }\n\n  updateRangesInfo(options) {\n    for (let spectrum of this.spectra) {\n      spectrum.updateRangesInfo(options);\n    }\n  }\n\n  getMetadata() {\n    return getMetadata(this.spectra);\n  }\n\n  /**\n   *\n   * @param {object} [options={}]\n   * @param {string} [options.propertyName=\"category\"]\n   */\n  getClasses(options) {\n    return getClasses(this.getMetadata(), options);\n  }\n\n  /**\n   *\n   * @param {object} [options={}]\n   * @param {string} [options.propertyName=\"category\"]\n   */\n  getCategoriesStats(options) {\n    return getCategoriesStats(this.getMetadata(), options);\n  }\n\n  /**\n   * Add a spectrum based on the data\n   * @param {object} data {x, y}}\n   * @param {object} [options={}]\n   * @param {object} [options.meta={}]\n   * @param {object} [options.id]\n   * @param {object} [options.normalization={}]\n   * @param {object} [options.normalized]\n   * @return {Spectrum}\n   */\n\n  addFromData(data, options = {}) {\n    if (this.spectra.length === 0) this.keepOriginal = true;\n    const id = options.id || Math.random().toString(36).substring(2, 10);\n    let index = this.getSpectrumIndex(id);\n    if (index === undefined) index = this.spectra.length;\n    let spectrum = new Spectrum(data.x, data.y, id, {\n      meta: options.meta,\n      normalized: options.normalized,\n      normalization: this.normalization,\n    });\n    this.spectra[index] = spectrum;\n    if (!this.keepOriginal) {\n      spectrum.removeOriginal();\n    } else {\n      let memoryInfo = this.getMemoryInfo();\n      if (memoryInfo.total > this.maxMemory) {\n        this.keepOriginal = false;\n        this.removeOriginals();\n      }\n    }\n  }\n\n  removeOriginals() {\n    for (let spectrum of this.spectra) {\n      spectrum.removeOriginal();\n    }\n  }\n\n  /**\n   * Remove the spectrum from the SpectraProcessor for the specified id\n   * @param {string} id\n   */\n  removeSpectrum(id) {\n    let index = this.getSpectrumIndex(id);\n    if (index === undefined) return undefined;\n    return this.spectra.splice(index, 1);\n  }\n\n  /**\n   * Remove all the spectra not present in the list\n   * @param {Array} [ids] Array of ids of the spectra to keep\n   */\n  removeSpectraNotIn(ids) {\n    let currentIDs = this.spectra.map((spectrum) => spectrum.id);\n    for (let id of currentIDs) {\n      if (!ids.includes(id)) {\n        this.removeSpectrum(id);\n      }\n    }\n  }\n\n  /**\n   * Checks if the ID of a spectrum exists in the SpectraProcessor\n   * @param {string} id\n   */\n  contains(id) {\n    return !isNaN(this.getSpectrumIndex(id));\n  }\n\n  /**\n   * Returns the index of the spectrum in the spectra array\n   * @param {string} id\n   * @returns {number}\n   */\n  getSpectrumIndex(id) {\n    if (!id) return undefined;\n    for (let i = 0; i < this.spectra.length; i++) {\n      let spectrum = this.spectra[i];\n      if (spectrum.id === id) return i;\n    }\n    return undefined;\n  }\n\n  /**\n   * Returns an array of spectrum from their ids\n   * @param {Array} ids\n   * @returns {Array<Spectrum}\n   */\n  getSpectra(ids) {\n    if (!ids || !Array.isArray(ids)) return this.spectra;\n    let spectra = [];\n    for (let id of ids) {\n      let index = this.getSpectrumIndex(id);\n      if (index !== undefined) {\n        spectra.push(this.spectra[index]);\n      }\n    }\n    return spectra;\n  }\n\n  /**\n   * Returns the index of the spectrum in the spectra array\n   * @param {string} id\n   * @returns {number}\n   */\n  getSpectrum(id) {\n    let index = this.getSpectrumIndex(id);\n    if (index === undefined) return undefined;\n    return this.spectra[index];\n  }\n\n  /**\n   * Returns a JSGraph chart object for all the spectra\n   * @returns {object}\n   */\n  getChart(options) {\n    return getChart(this.spectra, options);\n  }\n\n  /**\n   * Returns a JSGraph chart object for all the spectra\n   * @returns {object}\n   */\n  getAutocorrelationChart(index, options) {\n    return getAutocorrelationChart(this, index, options);\n  }\n\n  /**\n   * Returns a JSGraph annotation object for the specified index\n   * @returns {object}\n   */\n  getTrackAnnotation(index, options) {\n    return getTrackAnnotation(this.spectra, index, options);\n  }\n\n  /**\n   * Returns a JSGraph annotation object for box plot\n   * @returns {object}\n   */\n  getBoxPlotAnnotations(options) {\n    return getBoxPlotAnnotations(this.spectra, options);\n  }\n\n  /**\n   * Returns a JSGraph chart object for all the normalized spectra\n   * @param {object} [options={}]\n   * @param {Array} [options.ids] ids of the spectra to select, by default all\n   * @returns {object}\n   */\n  getNormalizedChart(options) {\n    return getNormalizedChart(this.spectra, options);\n  }\n\n  /**\n   * Returns a JSGraph chart object for all the scaled normalized spectra\n   * @param {object} [options={}]\n   * @param {Array} [options.ids] ids of the spectra to select, by default all\n   * @param {object} [options.range] from - to\n   * @param {string} [options.targetID=spectra[0].id]\n   * @param {string} [options.method='max'] min, max, range, minMax\n   * @param {boolean} [options.relative=false]\n   * @returns {object}\n   */\n  getScaledChart(options) {\n    return getScaledChart(this, options);\n  }\n\n  getMemoryInfo() {\n    let memoryInfo = { original: 0, normalized: 0, total: 0 };\n    this.spectra.forEach((spectrum) => {\n      let memory = spectrum.memory;\n      memoryInfo.original += memory.original;\n      memoryInfo.normalized += memory.normalized;\n      memoryInfo.total += memory.total;\n    });\n    memoryInfo.keepOriginal = this.keepOriginal;\n    memoryInfo.maxMemory = this.maxMemory;\n    return memoryInfo;\n  }\n\n  getNormalizedBoundary() {\n    let boundary = {\n      x: { min: Number.MAX_VALUE, max: Number.MIN_VALUE },\n      y: { min: Number.MAX_VALUE, max: Number.MIN_VALUE },\n    };\n    for (let spectrum of this.spectra) {\n      if (spectrum.normalizedBoundary.x.min < boundary.x.min) {\n        boundary.x.min = spectrum.normalizedBoundary.x.min;\n      }\n      if (spectrum.normalizedBoundary.x.max > boundary.x.max) {\n        boundary.x.max = spectrum.normalizedBoundary.x.max;\n      }\n      if (spectrum.normalizedBoundary.y.min < boundary.y.min) {\n        boundary.y.min = spectrum.normalizedBoundary.y.min;\n      }\n      if (spectrum.normalizedBoundary.y.max > boundary.y.max) {\n        boundary.y.max = spectrum.normalizedBoundary.y.max;\n      }\n    }\n    return boundary;\n  }\n\n  /**\n   * Create SpectraProcessor from normalized TSV\n   * @param {string} text\n   * @param {object} [options={}]\n   * @param {object} [options.separator='\\t']\n   */\n  static fromNormalizedMatrix(text, options = {}) {\n    let parsed = parseMatrix(text, options);\n    if (!parsed) {\n      throw new Error('Can not parse TSV file');\n    }\n    let spectraProcessor = new SpectraProcessor();\n\n    spectraProcessor.setNormalization({\n      from: parsed.x[0],\n      to: parsed.x[parsed.x.length - 1],\n      numberOfPoints: parsed.x.length,\n    });\n    spectraProcessor.keepOriginal = false;\n\n    for (let i = 0; i < parsed.ids.length; i++) {\n      spectraProcessor.addFromData(\n        { x: [], y: [] },\n        {\n          normalized: {\n            x: parsed.x,\n            y: parsed.matrix[i],\n          },\n          id: parsed.ids[i],\n          meta: parsed.meta[i],\n        },\n      );\n    }\n\n    return spectraProcessor;\n  }\n}\n","export function getNormalizationAnnotations(filter = {}, boundary) {\n  let { exclusions = [] } = filter;\n  let annotations = [];\n  exclusions = exclusions.filter((exclusion) => !exclusion.ignore);\n  annotations = exclusions.map((exclusion) => {\n    let annotation = {\n      type: 'rect',\n      position: [\n        { x: exclusion.from, y: boundary.y.min },\n        { x: exclusion.to, y: boundary.y.max },\n      ],\n      strokeWidth: 0,\n      fillColor: 'rgba(255,255,224,1)',\n    };\n    return annotation;\n  });\n  if (filter.from !== undefined) {\n    annotations.push({\n      type: 'rect',\n      position: [\n        { x: Number.MIN_SAFE_INTEGER, y: boundary.y.min },\n        { x: filter.from, y: boundary.y.max },\n      ],\n      strokeWidth: 0,\n      fillColor: 'rgba(255,255,224,1)',\n    });\n  }\n  if (filter.to !== undefined) {\n    annotations.push({\n      type: 'rect',\n      position: [\n        { x: filter.to, y: boundary.y.min },\n        { x: Number.MAX_SAFE_INTEGER, y: boundary.y.max },\n      ],\n      strokeWidth: 0,\n      fillColor: 'rgba(255,255,224,1)',\n    });\n  }\n  return annotations;\n}\n","import { X } from 'ml-spectra-processing';\n\n/**\n * @private\n */\n\nexport function getAutocorrelation(normalized, index) {\n  let matrix = normalized.matrix;\n  let nbRow = matrix.length;\n  let nbColumn = matrix[0].length;\n  let array1 = new Float64Array(nbRow);\n  let array2 = new Float64Array(nbRow);\n  let result = new Array(nbColumn);\n  for (let j = 0; j < nbRow; j++) {\n    array1[j] = matrix[j][index];\n  }\n  for (let i = 0; i < nbColumn; i++) {\n    for (let j = 0; j < nbRow; j++) {\n      array2[j] = matrix[j][i];\n    }\n    result[i] = X.correlation(array1, array2);\n  }\n  return {\n    x: normalized.x,\n    y: result,\n  };\n}\n","import { Matrix } from 'ml-matrix';\n\n/**\n * @private\n */\n\nexport function getMeanData(normalized) {\n  let matrix = new Matrix(normalized.matrix);\n  return {\n    x: normalized.x,\n    y: matrix.mean('column'),\n  };\n}\n","import { getNormalizedData } from './getNormalizedData.js';\n\n/**\n * @private\n * @param {*} spectra\n * @param {object} [options={}]\n * @param {string} [options.fs='\\t'] field separator\n * @param {string} [options.rs='\\n'] record (line) separator\n */\n\nexport function getNormalizedText(spectra, options = {}) {\n  let { fs = '\\t', rs = '\\n' } = options;\n  let { matrix, meta, ids, x } = getNormalizedData(spectra);\n  let allKeysObject = {};\n  for (let metum of meta) {\n    for (let key of Object.keys(metum)) {\n      let type = typeof metum[key];\n      if (type === 'number' || type === 'string' || type === 'boolean') {\n        allKeysObject[key] = true;\n      }\n    }\n  }\n  let allKeys = Object.keys(allKeysObject);\n\n  let lines = [];\n  let line = [];\n  line.push('id', ...allKeys, ...x);\n  lines.push(line.join(fs));\n\n  for (let i = 0; i < ids.length; i++) {\n    line = [];\n    line.push(ids[i]);\n    for (let key of allKeys) {\n      line.push(meta[i][key]);\n    }\n    line.push(...matrix[i]);\n    lines.push(line.join(fs));\n  }\n\n  return lines.join(rs);\n}\n","import { parseXY } from 'xy-parser';\n\n/**\n * Create a spectrum from a text file\n * @param {string} text - String containing the JCAMP data\n * @return {Spectrum} - new instance of Spectrum with the provided data\n */\nexport default function text(text, options = {}) {\n  const { kind, parserOptions = {} } = options;\n\n  const data = parseXY(text, parserOptions);\n\n  // we convert the data\n  if (kind && kind.importation && kind.importation.converter) {\n    data.y = data.y.map(kind.importation.converter);\n  }\n\n  return { data };\n}\n","/**\n * @private\n * @param {*} spectra\n * @param {object} options\n */\n\nexport function getMetadata(spectra, options = {}) {\n  const { ids } = options;\n\n  let metadata = [];\n\n  if (Array.isArray(spectra) && spectra.length > 0) {\n    for (let spectrum of spectra) {\n      if (!ids || ids.includes(spectrum.id)) {\n        metadata.push(spectrum.meta);\n      }\n    }\n  }\n\n  return metadata;\n}\n","import { getCategoriesStats } from './getCategoriesStats';\n\n/**\n * @private\n * @param {Array<object>} [metadata]\n * @param {object} [options={}] scale spectra based on various parameters\n * @param {string} [options.propertyName=\"category\"]\n */\n\nexport function getClasses(metadata, options = {}) {\n  const { propertyName = 'category' } = options;\n  const categoriesStats = getCategoriesStats(metadata, options);\n  const result = new Array(metadata.length);\n  for (let i = 0; i < metadata.length; i++) {\n    result[i] = categoriesStats[metadata[i][propertyName]].classNumber;\n  }\n  return result;\n}\n","import { addChartDataStyle } from './addChartDataStyle';\n/**\n * Retrieve a chart with selected original data\n * @param {object} [options={}]\n * @param {Array} [options.ids] List of spectra ids, by default all\n * @param {Array} [options.yFactor=1]\n */\nexport function getChart(spectra, options = {}) {\n  const { ids, yFactor, xFilter = {} } = options;\n  let chart = {\n    data: [],\n  };\n\n  for (let spectrum of spectra) {\n    if (!ids || ids.includes(spectrum.id)) {\n      let data = spectrum.getData({ yFactor, xFilter });\n      addChartDataStyle(data, spectrum);\n      chart.data.push(data);\n    }\n  }\n  return chart;\n}\n","import chroma from 'chroma-js';\n\n/**\n * Retrieve a chart with autocorrelation color\n * @param {SpectraProcessor} [spectraProcessor]\n * @param {number} [index]\n * @param {object} [options={}]\n * @param {Array} [options.autocorrelation] precalculated autocorrelation {x,y}\n * @param {Array} [options.maxDataPoints=]\n */\nexport function getAutocorrelationChart(spectraProcessor, index, options = {}) {\n  const {\n    autocorrelation = spectraProcessor.getAutocorrelation(index),\n  } = options;\n\n  let max = autocorrelation.y.reduce(function (a, b) {\n    return isNaN(b) ? a : Math.max(a, b);\n  }, Number.MIN_VALUE);\n\n  let min = autocorrelation.y.reduce(function (a, b) {\n    return isNaN(b) ? a : Math.min(a, b);\n  }, Number.MAX_VALUE);\n\n  let colorCallback = chroma\n    .scale(['blue', 'cyan', 'yellow', 'red'])\n    .domain([min, max])\n    .mode('lch');\n\n  let colorScale = autocorrelation.y.map((y) => colorCallback(y));\n\n  let mean = spectraProcessor.getMeanData();\n\n  let colorSpectrum = {\n    type: 'color',\n    x: mean.x,\n    y: mean.y,\n    color: colorScale,\n    styles: {\n      unselected: {\n        lineWidth: 1,\n        lineStyle: 1,\n      },\n      selected: {\n        lineWidth: 3,\n        lineStyle: 1,\n      },\n    },\n  };\n\n  return colorSpectrum;\n}\n","import { getNormalizedData } from '../spectra/getNormalizedData';\n\nexport function getTrackAnnotation(spectra, index, options = {}) {\n  const { ids, showSpectrumID = true } = options;\n  let annotations = [];\n\n  let normalized = getNormalizedData(spectra, { ids });\n\n  if (normalized.ids.length === 0) return annotations;\n  let line = 0;\n\n  // header containing X coordinate\n  annotations.push({\n    type: 'line',\n    position: [\n      { x: `${70}px`, y: `${15 + 15 * line}px` },\n      { x: `${85}px`, y: `${15 + 15 * line}px` },\n    ],\n    strokeWidth: 0.0000001,\n    label: {\n      size: 16,\n      text: `x: ${normalized.x[index].toPrecision(6)}`,\n      position: { x: `${130}px`, y: `${20 + 15 * line}px` },\n    },\n  });\n  line++;\n\n  for (let i = 0; i < normalized.ids.length; i++) {\n    let id = normalized.ids[i];\n    let meta = normalized.meta[i];\n    let y = normalized.matrix[i][index];\n    annotations.push({\n      type: 'line',\n      position: [\n        { x: `${70}px`, y: `${15 + 15 * line}px` },\n        { x: `${85}px`, y: `${15 + 15 * line}px` },\n      ],\n      strokeColor: meta.color,\n      strokeWidth: 2,\n      label: {\n        text: `${y.toPrecision(4)}${showSpectrumID ? ` - ${id}` : ''}`,\n        position: { x: `${90}px`, y: `${20 + 15 * line}px` },\n      },\n    });\n    line++;\n  }\n\n  return annotations;\n}\n","import { addChartDataStyle } from './addChartDataStyle';\n\nexport function getNormalizedChart(spectra, options = {}) {\n  const { ids } = options;\n  let chart = {\n    data: [],\n  };\n  for (let spectrum of spectra) {\n    if (!ids || ids.includes(spectrum.id)) {\n      let data = spectrum.normalized;\n      addChartDataStyle(data, spectrum);\n      chart.data.push(data);\n    }\n  }\n  return chart;\n}\n","import { addChartDataStyle } from './addChartDataStyle';\n/**\n *\n * @param {SpectraProcessor} spectraProcessor\n * @param {object} [options={}] scale spectra based on various parameters\n * @param {object} [options.range] from - to\n * @param {Array} [options.ids] ids of selected spectra\n * @param {string} [options.targetID=spectra[0].id]\n * @param {string} [options.method='max'] min, max, range, minMax\n * @param {Array} [options.ranges] Array of object containing {from:'', to:'', label:''}\n * @param {Array} [options.calculations] Array of object containing {label:'', formula:''}\n * @param {boolean} [options.relative=false]\n */\nexport function getScaledChart(spectraProcessor, options = {}) {\n  let scaled = spectraProcessor.getScaledData(options);\n\n  let chart = {\n    data: [],\n  };\n  if (!scaled || !scaled.matrix) return chart;\n\n  for (let i = 0; i < scaled.matrix.length; i++) {\n    let data = {\n      x: scaled.x,\n      y: scaled.matrix[i],\n    };\n    addChartDataStyle(data, { meta: scaled.meta[i], id: scaled.ids[i] });\n    chart.data.push(data);\n  }\n\n  return chart;\n}\n","/**\n * Creates a g\n * @param {string} text - String containing the text data\n * @param {object} [options={}]\n * @param {string} [options.fs='\\t'] Field separator\n * @return {object} - {matrix, data, x, ids}\n */\nexport default function matrix(text, options = {}) {\n  const lines = text.split(/[\\r\\n]+/).filter((value) => value);\n  const { fs = '\\t' } = options;\n  let matrix = [];\n  let ids = [];\n  let meta = [];\n  let x = [];\n\n  let headers = lines[0].split(fs);\n  let labels = [];\n\n  for (let i = 0; i < headers.length; i++) {\n    let header = headers[i];\n    if (isNaN(header)) {\n      labels[i] = header;\n    } else {\n      x = headers.slice(i).map((value) => Number(value));\n      break;\n    }\n  }\n\n  for (let i = 1; i < lines.length; i++) {\n    let line = lines[i];\n    let parts = line.split('\\t');\n    ids.push(parts[0]);\n    let oneMeta = {};\n    meta.push(oneMeta);\n    for (let j = 1; j < parts.length; j++) {\n      if (j < labels.length) {\n        oneMeta[labels[j]] = parts[j];\n      } else {\n        matrix.push(parts.slice(labels.length).map((value) => Number(value)));\n        break;\n      }\n    }\n  }\n  return { x, meta, matrix, ids };\n}\n"],"names":["compareNumbers","a","b","exports","values","sum","i","length","max","l","min","arithmeticMean","mul","Math","pow","lnsum","log","means","samples","n","percent","alreadySorted","undefined","concat","sort","k","floor","RangeError","r1","r2","half","unbiased","theMean","mean","theVariance","x","sqrt","variance","standardDeviation","y","averageDeviations","Array","abs","stdev","quart","q1","ceil","q2","median","q3","pooledVariance","vari","itemCount","itemArray","count","index","indexOf","maxValue","maxIndex","vector1","vector2","mean1","mean2","cov","s2","s3","dev","m2","g","s4","v","eps","weights","weightedVariance","weightedMean","z","w","inPlace","result","standardDev","array","filterX","points","options","from","to","exclusions","zones","filter","exclusion","JSON","parse","stringify","forEach","currentFrom","push","getZones","currentZoneIndex","newX","newY","position","toString","Object","prototype","object","call","endsWith","_typeof","obj","Symbol","iterator","constructor","sequentialFill","input","arguments","isArray","TypeError","_options","_options$from","_options$to","_options$size","size","step","Error","_i","normalize","Number","NEGATIVE_INFINITY","POSITIVE_INFINITY","map","zone","currentZone","integral","x0","x1","slope","intercept","equallySpaced","arrayXY","xLength","reverse","slice","variant","numberOfPoints","isNaN","nextExclusion","invert","unitsPerPoint","reduce","previous","current","currentTotal","round","zonesWithPoints","xResult","yResult","zoneResult","processZone","output","halfStep","lastStep","start","previousX","MAX_VALUE","previousY","nextX","nextY","frontOutsideSpectra","backOutsideSpectra","currentValue","currentPoints","j","main","equallySpacedSlot","initialOriginalStep","lastOriginalStep","MIN_VALUE","sumAtMin","sumAtMax","add","equallySpacedSmooth","sumValue","isAnyArray","norm","_options$algorithm","algorithm","toLowerCase","absoluteSumValue","absoluteSum","element","minValue","rescale","currentMin","currentMax","_options$min","autoMinMax","_options$max","factor","check","normalizeZones","findClosestIndex","target","low","high","middle","getFromToIndex","fromIndex","toIndex","getTargetIndex","targetIndex","XY","extract","loop","integration","maxY","maximaY","maxima","startEqualIndex","maxYPoint","minimaY","minYPoint","nbPoints","optimize","totalPoints","Float64Array","ratio","appendFromTo","zoneNbPoints","minY","slot","currentX","first","growingX","data","minClosestYPoint","previousIndex","MIN_SAFE_INTEGER","currentIndex","maxClosestYPoint","realMaxYPoint","alpha","log10","beta","gamma","p","realMinYPoint","peakInfo","currentDiff","multiplier","newDiff","after","before","inflectionBefore","inflectionAfter","extrema","inflectionMiddle","width","toXYObject","multiply","array1","array2","constant","isConstant","array3","dotProduct","A","B","crossCorrelation","tau","lag","q","X","autoCorrelation","boxPlot","q1max","q3min","info","Q1","Q2","Q3","middleOver","correlation","sumA","sumA2","sumB","sumB2","sumAB","divide","rotate","shift","subtract","Spectrum","id","meta","normalization","normalized","normalizedBoundary","updateNormalizedBoundary","updateNormalization","updateMemory","this","original","memory","total","removeOriginal","getXY","getConverter","ntuplesSeparator","GC_MS_FIELDS","convertToFloatArray","stringArray","floatArray","parseFloat","defaultOptions","keepRecordsRegExp","canonicDataLabels","dynamicTyping","xy","withoutXY","chromatogram","keepSpectra","noContour","nbContourLevels","noiseMultiplier","profiling","convertMSFieldToLabel","value","replace","isMSField","canonicDataLabel","prepareSpectrum","spectrum","xFactor","yFactor","observeFrequency","xUnit","toUpperCase","firstX","lastX","deltaX","shiftOffsetVal","getMedian","fastParseXYData","isXYdata","currentData","ascii","currentY","firstY","endLine","charCodeAt","newLine","isDifference","isLastDifference","lastDifference","isDuplicate","inComment","lastValue","isNegative","inValue","skipFirstValue","decimalPosition","duplicate","ascii2","parseXYA","removeSymbolRegExp","isXYAdata","lines","split","trim","parsePeakTable","removeCommentRegExp","peakTableSplitRegExp","isPeaktable","logs","jcamp","ldr","dataValue","ldrs","infos","wantXY","assign","Date","now","ntuples","spectra","action","time","dataLabel","substring","xIndex","yIndex","firstVariable","secondVariable","symbol","last","lastY","vardim","units","yUnit","datatable","title","dataType","twoD","maxX","minX","xType","indirectFrequency","shiftOffsetNum","varname","vartype","varform","yType","page","pageValue","pageSymbol","pageSymbolIndex","unit","sampleDescription","match","label","keys","newNtuples","key","zData","minZ","maxZ","ySize","xSize","xVector","noise","convertTo3DZ","contourLines","povarHeight0","povarHeight1","povarHeight2","povarHeight3","isOver0","isOver1","isOver2","isOver3","pAx","pAy","pBx","pBy","lineZValue","nbSubSpectra","nbPovars","dx","y0","dy","iter","contourLevels","level","contourLevel","side","exp","zValue","iSubSpectra","subSpectra","subSpectraAfter","povar","segments","generateContourLines","minMax","add2D","newData","times","series","ms","dimension","existingGCMSFields","complexChromatogram","intensity","simpleChromatogram","getData","xFilter","filters","name","Stat","meanFct","std","stdFct","normed","process","kind","getNormalized","ranges","updateRangesInfo","range","fromToIndex","maxPoint","minPoint","convert","worker","stamps","useWorker","workerURL","URL","createObjectURL","Blob","type","Worker","revokeObjectURL","addEventListener","event","stamp","createWorker","Promise","resolve","random","postMessage","postToWorker","IR_TRANSMITTANCE","importation","converter","transmittance","display","xLabel","xInverted","yLabel","IR_ABSORBANCE","parsed","datatype","getJcampKind","parseXY","text","uniqueX","xColumn","yColumn","keepInfo","maxNumberColumns","MAX_SAFE_INTEGER","minNumberColumns","line","fields","counter","uniqueXFunction","getBoxPlotAnnotations","q13FillColor","q13FillOpacity","q2StrokeColor","q2StrokeWidth","minMaxFillColor","minMaxFillOpacity","annotations","matrix","nbRow","nbColumn","aColumn","column","row","getBoxPlotData","q13","layer","properties","fillColor","fillOpacity","strokeWidth","strokeColor","addChartDataStyle","styles","unselected","lineColor","color","lineWidth","lineStyle","selected","module","limit","classToType","list","PI","utils","clip_rgb","rgb","_clipped","_unclipped","unpack","args","keyOrder","TWOPI","PITHIRD","DEG2RAD","RAD2DEG","format","autodetect","last$1","clip_rgb$1","type$1","Color","len","me","mode","sorted","chk","test","apply","_rgb","hex","join","Color_1","chroma","Function","bind","version","chroma_1","unpack$1","rgb2cmyk_1","ref","r","f","c","m","unpack$2","cmyk2rgb_1","unpack$3","type$2","cmyk","unpack$4","last$2","rnd","hsl2css_1","hsla","unpack$5","rgb2hsl_1","s","h","NaN","unpack$6","last$3","rgb2css_1","rgba","substr","unpack$7","round$1","hsl2rgb_1","t3","t2","t1","h_","RE_RGB","RE_RGBA","RE_RGB_PCT","RE_RGBA_PCT","RE_HSL","RE_HSLA","round$2","css2rgb","css","named","e","rgb$1","i$1","rgb$2","i$2","rgb$3","i$3","hsl","rgb$4","hsl$1","rgb$5","css2rgb_1","type$3","rest","unpack$8","gl","unpack$9","rgb2hcg_1","delta","_g","unpack$a","hcg2rgb_1","assign$1","assign$2","assign$3","assign$4","assign$5","_c","t","unpack$b","type$4","hcg","unpack$c","last$4","round$3","rgb2hex_1","u","str","hxa","RE_HEX","RE_HEXA","hex2rgb_1","parseInt","u$1","type$5","unpack$d","acos","rgb2hsi_1","min_","unpack$e","limit$1","TWOPI$1","cos","hsi2rgb_1","unpack$f","type$6","hsi","unpack$g","type$7","unpack$h","min$1","max$1","rgb2hsv","max_","unpack$i","floor$1","hsv2rgb_1","unpack$j","type$8","hsv","labConstants","unpack$k","rgb_xyz","xyz_lab","rgb2xyz","rgb2lab_1","ref$1","unpack$l","pow$1","xyz_rgb","lab_xyz","lab2rgb_1","unpack$m","type$9","lab","unpack$n","sqrt$1","atan2","round$4","lab2lch_1","unpack$o","rgb2lch_1","b_","unpack$p","sin","cos$1","lch2lab_1","unpack$q","lch2rgb_1","L","unpack$r","hcl2rgb_1","hcl","unpack$s","type$a","lch","w3cx11_1","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflower","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","green","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","laserlemon","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrod","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","maroon2","maroon3","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","purple2","purple3","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","type$b","unpack$t","rgb2num_1","type$c","num2rgb_1","num","type$d","unpack$u","type$e","round$5","temperature2rgb_1","kelvin","temp","unpack$v","round$6","rgb2temperature_1","minTemp","maxTemp","temperature","type$f","mutate","clipped","darken","amount","brighten","darker","brighter","get","mc","channel","src","type$g","pow$2","luminance","lum","cur_lum","max_iter","mid","interpolate","lm","rgb2luminance","luminance_x","interpolator","type$h","mix","col1","col2","premultiply","saturate","desaturate","type$i","set","charAt","out","xyz0","xyz1","sqrt$2","pow$3","lrgb","y1","z1","x2","y2","z2","_hsx","hue0","hue1","sat0","sat1","lbv0","lbv1","sat","hue","lch$1","c1","c2","clip_rgb$2","pow$4","sqrt$3","PI$1","cos$2","sin$1","atan2$1","_average_lrgb","colors","xyz","col","type$j","pow$5","scale","_mode","_nacol","_spread","_domain","_pos","_padding","_classes","_colors","_out","_min","_max","_correctLightness","_colorCache","_useCache","_gamma","setColors","brewer","c$1","resetCache","tMapLightness","tMapDomain","getColor","val","bypassMap","getClass","classes","d","analyze","limits","domain","tOut","tBreaks","every","_m","_o","spread","correctLightness","L0","L1","pol","L_actual","L_ideal","L_diff","t0","padding","numColors","dm","dd","__range__","end","asc","cache","nodata","left","right","inclusive","ascending","bezier","I","lab0","lab1","lab2","lab3","I0","I1","blend","bottom","top","blend_f","c0","each","normal","screen","overlay","lighten","dodge","burn","blend_1","type$k","clip_rgb$3","TWOPI$2","pow$6","sin$2","cos$3","floor$2","log$1","pow$7","floor$3","min_log","LOG10E","max_log","pb","pr","cluster","assignments","clusterSizes","repeat","nb_iters","centroids","i$4","mindist","best","j$1","dist","newCentroids","j$2","i$5","j$3","j$4","kClusters","j$5","i$6","tmpKMeansBreaks","j$6","i$7","analyze_1","sqrt$4","atan2$2","abs$1","cos$4","PI$2","scales","cool","hot","colorbrewer","OrRd","PuBu","BuPu","Oranges","BuGn","YlOrBr","YlGn","Reds","RdPu","Greens","YlGnBu","Purples","GnBu","Greys","YlOrRd","PuRd","Blues","PuBuGn","Viridis","Spectral","RdYlGn","RdBu","PiYG","PRGn","RdYlBu","BrBG","RdGy","PuOr","Set2","Accent","Set1","Set3","Dark2","Paired","Pastel2","Pastel1","list$1","colorbrewer_1","average","cnt","ci","xyz2","A$1","cubehelix","rotations","lightness","dl","dh","fract","amp","cos_a","sin_a","code","contrast","l1","l2","deltaE","C","a1","b1","L2","a2","b2","sl","sc","h1","c4","sh","delC","delA","delB","v1","v2","distance","sum_sq","valid","factory","getNormalizedData","ids","currentIDs","includes","checkRowIndex","outer","rows","checkColumnIndex","columns","checkRowVector","vector","to1DArray","checkColumnVector","checkRowIndices","rowIndices","some","checkColumnIndices","columnIndices","checkRange","startRow","endRow","startColumn","endColumn","checkNumber","newArray","formatNumber","numStr","String","padEnd","precise","toPrecision","maxNumSize","exponential","toExponential","eIndex","AbstractMatrix","newRows","newColumns","newMatrix","Matrix","fill","isInteger","interval","zeros","matrix1","matrix2","checkMatrix","isMatrix","klass","callback","to2DArray","copy","toJSON","isRowVector","isColumnVector","isVector","isSquare","isSymmetric","isEchelonForm","previousColumn","checked","isReducedEchelonForm","echelonForm","clone","iMax","swapRows","tmp","reducedEchelonForm","maxRow","pivot","setSubMatrix","neg","mulS","getRow","getRowVector","rowVector","setRow","row1","row2","getColumn","getColumnVector","columnVector","setColumn","swapColumns","column1","column2","addRowVector","subRowVector","mulRowVector","divRowVector","addColumnVector","subColumnVector","mulColumnVector","divColumnVector","mulRow","mulColumn","idx","minIndex","maxRowIndex","minRow","minRowIndex","maxColumn","maxColumnIndex","minColumn","minColumnIndex","diag","cumulativeSum","dot","mmul","other","Bcolj","strassen2x2","a11","b11","a12","b12","a21","b21","a22","b22","m1","m3","m4","m5","c00","c01","c10","c11","strassen3x3","a00","a01","a02","a10","a20","b00","b01","b02","b10","b20","m6","m7","m8","m9","m12","m13","m14","m15","m16","m17","m18","c02","c12","c20","c21","c22","mmulStrassen","embed","mat","cols","resultat","console","warn","blockMult","halfRows","halfCols","subMatrix","sub","scaleRows","isFinite","scaleColumns","flipRows","flipColumns","kroneckerProduct","transpose","sortRows","compareFunction","sortColumns","subMatrixRow","indices","subMatrixColumn","selection","checkIndices","rowIndex","columnIndex","trace","by","sumByRow","sumByColumn","sumAll","product","productByRow","productByColumn","productAll","sum1","sum2","varianceByRow","varianceByColumn","varianceAll","center","centerByRow","centerByColumn","centerAll","getScaleByRow","scaleByRow","getScaleByColumn","scaleByColumn","divider","getScaleAll","scaleAll","for","indent","indentData","maxI","maxJ","inspectData","rand","randomInt","randInt","diagonal","identity","eye","negate","tensorProduct","nRows","nColumns","arrayData","removeRow","splice","addRow","removeColumn","newRow","addColumn","xs","maybeToPrecision","digits","addS","addM","subS","subM","subtractS","subtractM","mulM","multiplyS","multiplyM","div","divS","divM","divideS","divideM","mod","modS","modM","modulus","modulusS","modulusM","and","andS","andM","or","orS","orM","xor","xorS","xorM","leftShift","leftShiftS","leftShiftM","signPropagatingRightShift","signPropagatingRightShiftS","signPropagatingRightShiftM","rightShift","rightShiftS","rightShiftM","zeroFillRightShift","zeroFillRightShiftS","zeroFillRightShiftM","not","acosh","asin","asinh","atan","atanh","cbrt","clz32","cosh","expm1","fround","log1p","log2","sign","sinh","tanh","trunc","arg0","powS","powM","installMathOperations","BaseRegression","predict","_predict","train","toLaTeX","score","xSum","ySum","chi2","rmsd","xSquared","ySquared","xY","SimpleLinearRegression","coefficients","checkArrayLength","slr","numerator","regress","computeX","precision","absIntercept","operator","json","getScaledData","spectraProcessor","targetID","relative","method","calculations","targetSpectrum","getSpectrum","getSpectra","targetValue","regression","scaled","rangeFct","rangesCopy","yNormalized","resultRanges","currentRange","parameters","calculation","formula","oneRanges","getCategoriesStats","metadata","propertyName","categories","classNumber","metadatum","SpectraProcessor","maxMemory","keepOriginal","boundaries","getNormalizationAnnotations","boundary","ignore","getNormalizedBoundary","setNormalization","getNormalization","getAutocorrelation","getMeanData","getNormalizedText","fs","rs","allKeysObject","metum","allKeys","getMinMaxX","addFromText","force","contains","parserOptions","parseText","addFromData","addFromJcamp","parseJcamp","getMetadata","getClasses","categoriesStats","getSpectrumIndex","getMemoryInfo","removeOriginals","removeSpectrum","removeSpectraNotIn","getChart","chart","getAutocorrelationChart","autocorrelation","colorCallback","colorScale","getTrackAnnotation","showSpectrumID","getNormalizedChart","getScaledChart","memoryInfo","headers","labels","header","parts","oneMeta","parseMatrix"],"mappings":"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"}