@datagrok/bio 2.11.28 → 2.11.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -1
- package/dist/23.js +2 -0
- package/dist/23.js.map +1 -0
- package/dist/282.js +2 -0
- package/dist/282.js.map +1 -0
- package/dist/36.js +2 -0
- package/dist/36.js.map +1 -0
- package/dist/40.js +2 -0
- package/dist/40.js.map +1 -0
- package/dist/413.js +2 -0
- package/dist/413.js.map +1 -0
- package/dist/42.js +1 -1
- package/dist/42.js.map +1 -1
- package/dist/427.js +2 -0
- package/dist/427.js.map +1 -0
- package/dist/65.js +2 -0
- package/dist/65.js.map +1 -0
- package/dist/709.js +3 -0
- package/dist/709.js.map +1 -0
- package/dist/package-test.js +1 -1
- package/dist/package-test.js.map +1 -1
- package/dist/package.js +1 -1
- package/dist/package.js.map +1 -1
- package/files/tests/to-atomic-level-msa-fasta-input.csv +10 -0
- package/files/tests/to-atomic-level-msa-fasta-output.csv +2178 -0
- package/package.json +9 -9
- package/src/package.ts +12 -10
- package/src/tests/msa-tests.ts +2 -2
- package/src/tests/pepsea-tests.ts +1 -1
- package/src/tests/renderers-test.ts +16 -16
- package/src/tests/splitters-test.ts +7 -12
- package/src/tests/substructure-filters-tests.ts +277 -55
- package/src/tests/to-atomic-level-tests.ts +32 -22
- package/src/tests/utils/sequences-generators.ts +6 -3
- package/src/tests/utils.ts +6 -6
- package/src/utils/cell-renderer.ts +2 -0
- package/src/utils/docker.ts +36 -0
- package/src/viewers/vd-regions-viewer.ts +4 -0
- package/src/viewers/web-logo-viewer.ts +4 -0
- package/src/widgets/bio-substructure-filter-helm.ts +168 -0
- package/src/widgets/bio-substructure-filter-types.ts +131 -0
- package/src/widgets/bio-substructure-filter.ts +215 -175
- package/src/widgets/composition-analysis-widget.ts +1 -1
- package/dist/100.js +0 -2
- package/dist/100.js.map +0 -1
- package/dist/118.js +0 -2
- package/dist/118.js.map +0 -1
- package/dist/361.js +0 -2
- package/dist/361.js.map +0 -1
- package/dist/471.js +0 -2
- package/dist/471.js.map +0 -1
- package/dist/649.js +0 -2
- package/dist/649.js.map +0 -1
- package/dist/664.js +0 -2
- package/dist/664.js.map +0 -1
- package/dist/886.js +0 -3
- package/dist/886.js.map +0 -1
- /package/dist/{886.js.LICENSE.txt → 709.js.LICENSE.txt} +0 -0
package/dist/709.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"709.js","mappings":"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","sources":["webpack://bio/./node_modules/@datagrok-libraries/utils/src/type-declarations.js","webpack://bio/./node_modules/@datagrok-libraries/utils/src/vector-operations.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/typed-metrics/typed-metrics.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/distance-matrix/types.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/distance-matrix/utils.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/distance-matrix/distance-matrix-service.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/umap/utils.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/umap/heap.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/umap/matrix.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/umap/tree.js","webpack://bio/./node_modules/is-any-array/src/index.js","webpack://bio/./node_modules/ml-levenberg-marquardt/src/errorCalculation.js","webpack://bio/./node_modules/ml-matrix/node_modules/is-any-array/lib-esm/index.js","webpack://bio/./node_modules/ml-array-rescale/node_modules/is-any-array/lib-esm/index.js","webpack://bio/./node_modules/ml-array-max/node_modules/is-any-array/lib-esm/index.js","webpack://bio/./node_modules/ml-array-min/node_modules/is-any-array/lib-esm/index.js","webpack://bio/./node_modules/ml-array-rescale/lib-es6/index.js","webpack://bio/./node_modules/ml-array-min/lib-es6/index.js","webpack://bio/./node_modules/ml-array-max/lib-es6/index.js","webpack://bio/./node_modules/ml-matrix/src/inspect.js","webpack://bio/./node_modules/ml-matrix/src/util.js","webpack://bio/./node_modules/ml-matrix/src/matrix.js","webpack://bio/./node_modules/ml-matrix/src/stat.js","webpack://bio/./node_modules/ml-matrix/src/mathOperations.js","webpack://bio/./node_modules/ml-matrix/src/wrap/WrapperMatrix2D.js","webpack://bio/./node_modules/ml-matrix/src/dc/lu.js","webpack://bio/./node_modules/ml-matrix/src/dc/util.js","webpack://bio/./node_modules/ml-matrix/src/dc/qr.js","webpack://bio/./node_modules/ml-matrix/src/dc/svd.js","webpack://bio/./node_modules/ml-levenberg-marquardt/src/step.js","webpack://bio/./node_modules/ml-matrix/src/decompositions.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/umap/umap.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/umap/nn_descent.js","webpack://bio/./node_modules/ml-levenberg-marquardt/src/index.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/distance-matrix/sparse-matrix-service.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/t-sne/t-sne.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/distance-matrix/proxy.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/multi-column-dimensionality-reduction/multi-column-dim-reducer.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/multi-column-dimensionality-reduction/mulit-column-dim-reducer-worker.js","webpack://bio/./node_modules/seedrandom/index.js","webpack://bio/./node_modules/seedrandom/lib/alea.js","webpack://bio/./node_modules/seedrandom/lib/tychei.js","webpack://bio/./node_modules/seedrandom/lib/xor128.js","webpack://bio/./node_modules/seedrandom/lib/xor4096.js","webpack://bio/./node_modules/seedrandom/lib/xorshift7.js","webpack://bio/./node_modules/seedrandom/lib/xorwow.js","webpack://bio/./node_modules/seedrandom/seedrandom.js"],"sourcesContent":["/**\n * Denotes a vector of floating poit values.\n *\n * @export\n * @class Vector\n * @extends {Float32Array}\n */\nexport class Vector extends Float32Array {\n}\n/**\n * Denotes a two-dimensional matrix.\n *\n * @export\n * @class Matrix\n * @extends {Array<Vector>}\n */\nexport class Matrix extends Array {\n}\n/**\n * Denotes cartesian coordinates.\n *\n * @export\n * @class Coordinates\n * @extends {Matrix}\n */\nexport class Coordinates extends Matrix {\n}\n/**\n * Denotes an array of arbitrary-typed vectors.\n *\n * @export\n * @class Vectors\n * @extends {Array<any>}\n */\nexport class Vectors extends Array {\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZS1kZWNsYXJhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0eXBlLWRlY2xhcmF0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQTs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sTUFBTyxTQUFRLFlBQVk7Q0FBRztBQUUzQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sTUFBTyxTQUFRLEtBQWE7Q0FBRztBQUU1Qzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sV0FBWSxTQUFRLE1BQU07Q0FBRztBQUUxQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sT0FBUSxTQUFRLEtBQVU7Q0FBRyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5cbi8qKlxuICogRGVub3RlcyBhIHZlY3RvciBvZiBmbG9hdGluZyBwb2l0IHZhbHVlcy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgVmVjdG9yXG4gKiBAZXh0ZW5kcyB7RmxvYXQzMkFycmF5fVxuICovXG5leHBvcnQgY2xhc3MgVmVjdG9yIGV4dGVuZHMgRmxvYXQzMkFycmF5IHt9XG5cbi8qKlxuICogRGVub3RlcyBhIHR3by1kaW1lbnNpb25hbCBtYXRyaXguXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIE1hdHJpeFxuICogQGV4dGVuZHMge0FycmF5PFZlY3Rvcj59XG4gKi9cbmV4cG9ydCBjbGFzcyBNYXRyaXggZXh0ZW5kcyBBcnJheTxWZWN0b3I+IHt9XG5cbi8qKlxuICogRGVub3RlcyBjYXJ0ZXNpYW4gY29vcmRpbmF0ZXMuXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIENvb3JkaW5hdGVzXG4gKiBAZXh0ZW5kcyB7TWF0cml4fVxuICovXG5leHBvcnQgY2xhc3MgQ29vcmRpbmF0ZXMgZXh0ZW5kcyBNYXRyaXgge31cblxuLyoqXG4gKiBEZW5vdGVzIGFuIGFycmF5IG9mIGFyYml0cmFyeS10eXBlZCB2ZWN0b3JzLlxuICpcbiAqIEBleHBvcnRcbiAqIEBjbGFzcyBWZWN0b3JzXG4gKiBAZXh0ZW5kcyB7QXJyYXk8YW55Pn1cbiAqL1xuZXhwb3J0IGNsYXNzIFZlY3RvcnMgZXh0ZW5kcyBBcnJheTxhbnk+IHt9XG5cbi8qKlxuICogRGVub3RlcyBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBmdW5jdGlvbiBvcHRpb25zLlxuICpcbiAqIEBleHBvcnRcbiAqIEB0eXBlIE9wdGlvbnNcbiAqL1xuZXhwb3J0IHR5cGUgT3B0aW9ucyA9IHtbbmFtZTogc3RyaW5nXTogYW55fTtcblxuLyoqXG4gKiBEZW5vdGVzIGN1c3RvbSBkaXN0YW5jZSBtZXRyaWMgYmV0d2VlbiB0aGUgdHdvIGdpdmVuIHZlY3RvcnMuXG4gKlxuICogQGV4cG9ydFxuICogQHR5cGUgRGlzdGFuY2VNZXRyaWNcbiAqIEBwYXJhbSB7YW55fSB2MSBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHthbnl9IHYyIFRoZSBzZWNvbmQgdmVjdG9yLlxuICogQHJldHVybiB7bnVtYmVyfSBEaXN0YW5jZSBiZXR3ZWVuIHRoZXNlIHR3byB2ZWN0b3JzLlxuICovXG5leHBvcnQgdHlwZSBEaXN0YW5jZU1ldHJpYyA9ICh2MTogYW55LCB2MjogYW55KSA9PiAobnVtYmVyKTtcblxuLyoqXG4gKiBEZW5vdGVzIGEgc2ltcGxlIHN0cmluZyB0byBzdHJpbmcgZGljdGlvbmFyeS5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAdHlwZSBTdHJpbmdEaWN0aW9uYXJ5XG4gKi9cbmV4cG9ydCB0eXBlIFN0cmluZ0RpY3Rpb25hcnkgPSB7W2tleTogc3RyaW5nXTogc3RyaW5nfTtcblxuXG5leHBvcnQgdHlwZSBDb2x1bW5JbnB1dE9wdGlvbnMgPSB7XG4gICAgZmlsdGVyPzogKGNvbDogREcuQ29sdW1uKSA9PiBib29sZWFuIHwgbnVsbDtcbn07XG4iXX0=","import { Vector } from './type-declarations';\nimport { randomFloat, randomInt } from './random';\n/**\n * Asserts a condition by throwing an Error.\n *\n * @export\n * @param {boolean} [condition=false] Condition to assert.\n * @param {string} [message='Assertion error.'] Message to output.\n * @throws {Error}\n */\nexport function assert(condition = false, message = 'Assertion error.') {\n if (!condition)\n throw new Error(message);\n}\n/**\n * Creates new two-dimensional array and fills it with the value given.\n *\n * @param {number} dimension1 The first dimension of the coordinates (number of rows).\n * @param {number} dimension2 The second dimension of the coordinates (number of columns).\n * @param {number} [fill=0] A value to fill the coordinates with.\n * @return {Coordinates} A two-dimensional filled with the value given.\n * @todo Might be slow since used Array.map. Probably needs performance revision.\n */\nexport function initCoordinates(dimension1, dimension2, fill = 0) {\n return new Array(dimension1).fill(fill).map(() => (new Vector(dimension2).fill(fill)));\n}\n/**\n * Transpose matrix.\n *\n * @export\n * @param {Matrix} matrix The matrix to be transposed.\n * @return {Matrix} Transposed matrix.\n * @todo Might be slow since used Array.map. Probably needs performance revision.\n */\nexport function transposeMatrix(matrix) {\n return new Array(matrix[0].length).fill(0)\n .map((_, i) => (new Vector(matrix.length).fill(0).map((_, j) => (matrix[j][i]))));\n}\n/**\n * Adds two vectors with the second one to be multiplied by the given ratio.\n *\n * @export\n * @param {Vector} p The first vector to add.\n * @param {Vector} q The second vector to add.\n * @param {number} [multiplier=1] A multiplier to be used before the second vector is added.\n * @return {Vector} New vector contained the result of operation p+multiplier*q.\n */\nexport function vectorAdd(p, q, multiplier = 1) {\n const nItems = p.length;\n assert(nItems == q.length, 'Vector lengths do not match.');\n const total = new Vector(nItems);\n for (let i = 0; i < p.length; ++i)\n total[i] = p[i] + multiplier * q[i];\n return total;\n}\n/**\n * Sums the vector's items.\n *\n * @param {Vector} v The vector to be summed.\n * @return {number} The vector's items sum.\n */\nfunction itemsSum(v) {\n let total = 0;\n for (let i = 0; i < v.length; ++i)\n total += v[i];\n return total;\n}\n/**\n * Suqares the vector's items.\n *\n * @param {Vector} v The vector to square.\n * @return {Vector} A new vector containing the original's items squared.\n */\nfunction vectorSquare(v) {\n const nItems = v.length;\n const total = new Vector(nItems);\n for (let i = 0; i < v.length; ++i)\n total[i] = v[i] * v[i];\n return total;\n}\nexport function vectorLength(v) {\n let sqrSum = 0;\n for (let i = 0; i < v.length; i++)\n sqrSum += v[i] * v[i];\n return Math.sqrt(sqrSum);\n}\nexport function vectorDotProduct(v1, v2) {\n if (v1.length != v2.length)\n throw new Error('The dimensionality of the vectors must match');\n let prod = 0;\n for (let i = 0; i < v1.length; i++)\n prod += v1[i] * v2[i];\n return prod;\n}\n/**\n * Creates a matrix filled with random floating point values.\n *\n * @export\n * @param {number} dimension1 The first dimension of the matrix.\n * @param {number} dimension2 The second dimension of the matrix.\n * @param {number} [scale=1.] Max value given by random generator.\n * @return {Matrix} A new matrix filled with random floating point values.\n */\nexport function fillRandomMatrix(dimension1, dimension2, scale = 1.) {\n const matrix = initCoordinates(dimension1, dimension2);\n for (let i = 0; i < dimension1; ++i) {\n for (let j = 0; j < dimension2; ++j)\n matrix[i][j] = randomFloat(scale);\n }\n return matrix;\n}\n/**\n * Calculates Euclidean distance between two vectors.\n *\n * @export\n * @param {Vector} p The first vector.\n * @param {Vector} q The second vector.\n * @return {number} Euclidean distance between the given vectors.\n */\nexport function calculateEuclideanDistance(p, q) {\n let result = 0;\n const len = p.length;\n if (len !== q.length)\n throw new Error('The dimensionality of the vectors must match');\n for (let i = 0; i < len; ++i)\n result += Math.pow((p[i] - q[i]), 2);\n return Math.sqrt(result);\n}\n/**\n * Creates a distance matrix using a custom distance function.\n *\n * @export\n * @param {Vectors} data Input vectors to calculate distances.\n * @param {DistanceMetric} distance Custom distance function.\n * @return {Matrix} Calculated custom distance matrix.\n */\nexport function calcDistanceMatrix(data, distance) {\n const nItems = data.length;\n const matrix = initCoordinates(nItems, nItems, 0);\n for (let i = 0; i < nItems; ++i) {\n for (let j = i + 1; j < nItems; ++j) {\n const d = (data[i] == null) || (data[j] == null) ? 0 : distance(data[i], data[j]);\n matrix[i][j] = matrix[j][i] = d;\n }\n }\n return matrix;\n}\n/**\n * Creates a distance matrix using a custom distance function.\n *\n * @export\n * @param {Vectors} data Input vectors to calculate distances.\n * @param {DistanceMetric} distance Custom distance function.\n * @return {Matrix} Calculated custom distance matrix.\n */\nexport function calcNormalizedDistanceMatrix(data, distance) {\n const nItems = data.length;\n const matrix = initCoordinates(nItems, nItems, 0);\n let max = Number.MIN_VALUE;\n let min = Number.MAX_VALUE;\n for (let i = 0; i < nItems; ++i) {\n for (let j = i; j < nItems; ++j) {\n const d = (data[i] == null) || (data[j] == null || i === j) ? 0 : distance(data[i], data[j]);\n matrix[i][j] = matrix[j][i] = d;\n if (d > max)\n max = d;\n if (d < min)\n min = d;\n }\n }\n for (let i = 0; i < nItems; ++i) {\n for (let j = i + 1; j < nItems; ++j)\n matrix[i][j] = matrix[j][i] = (matrix[i][j] - min) / (max - min);\n }\n return matrix;\n}\n/** Generates array from a range [begin; end] or [begin; end) if endExclusive. **/\nexport function genRange(begin, end, endExclusive = false) {\n const nItems = end - begin + (endExclusive ? 0 : 1);\n const series = new Int32Array(nItems);\n for (let i = 0; i < nItems; ++i)\n series[i] = begin + i;\n return series;\n}\n/**\n * Returns order of values as if they are sorted.\n *\n * @export\n * @param {any[]} values Input array.\n * @param {boolean} [reverse=false] Whether to return reversed order.\n * @return {number[]} The order computed.\n */\nexport function argSort(values, reverse = false) {\n const sortfn = reverse ? (a, b) => (b[0] - a[0]) : (a, b) => (a[0] - b[0]);\n const decor = (v, i) => [v, i]; // set index to value\n const undecor = (a) => a[1]; // leave only index\n const _argsort = (arr) => arr.map(decor).sort(sortfn).map(undecor);\n return _argsort(values);\n}\n/**\n * Returns the indexes of the most diverse objects according to the dist function\n * @param {number} length total number of objects\n * @param {number} n number of diverse elements to find\n * @param {(i1: number, i2: number) => number} dist a function which calculates distance between\n * two objects using their indexes\n * @returns {number[]} The indexes of the most diverse objects\n */\nexport function getDiverseSubset(length, n, dist) {\n function maxBy(values, orderBy) {\n let maxValue = null;\n let maxOrderBy = null;\n for (const element of values) {\n const elementOrderBy = orderBy(element);\n if (maxOrderBy == null || elementOrderBy > maxOrderBy) {\n maxValue = element;\n maxOrderBy = elementOrderBy;\n }\n }\n return maxValue;\n }\n const subset = [randomInt(length - 1)];\n const complement = new Set();\n for (let i = 0; i < length; ++i) {\n if (!subset.includes(i))\n complement.add(i);\n }\n while (subset.length < n) {\n const idx = maxBy(complement.values(), (i) => Math.min.apply(Math, subset.map(function (val, index) {\n return dist(i, val);\n })));\n if (idx) {\n subset.push(idx);\n complement.delete(idx);\n }\n }\n return subset;\n}\n/**\n * Returns normalized vector.\n *\n * @export\n * @param {Vector} data numerical array\n */\nexport function normalize(data) {\n const len = data.length;\n let sum = 0;\n let sumOfSquares = 0;\n for (let i = 0; i < len; ++i) {\n sum += data[i];\n sumOfSquares += Math.pow(data[i], 2);\n }\n const mean = sum / len;\n const stdDevInverse = 1.0 / Math.sqrt(sumOfSquares / len - Math.pow(mean, 2));\n for (let i = 0; i < len; ++i)\n data[i] = (data[i] - mean) * stdDevInverse;\n return data;\n}\n/**\n * Finds set difference between two lists.\n * @param {any[]} a The first list.\n * @param {any[]} b The second list.\n * @return {any[]}\n */\nexport function setDifference(a, b) {\n const bSet = new Set(b);\n return Array.from(new Set(a.filter((x) => !bSet.has(x))).values());\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVjdG9yLW9wZXJhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ2ZWN0b3Itb3BlcmF0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVMsTUFBTSxFQUF1QyxNQUFNLHFCQUFxQixDQUFDO0FBQ3pGLE9BQU8sRUFBQyxXQUFXLEVBQUUsU0FBUyxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBRWhEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsTUFBTSxDQUFDLFlBQXFCLEtBQUssRUFBRSxVQUFrQixrQkFBa0I7SUFDckYsSUFBSSxDQUFDLFNBQVM7UUFDWixNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzdCLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsVUFBa0IsRUFBRSxVQUFrQixFQUFFLE9BQWUsQ0FBQztJQUN0RixPQUFPLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pGLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBQyxNQUFjO0lBQzVDLE9BQU8sSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7U0FDdkMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENB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QUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztBQUNyRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtNYXRyaXgsIFZlY3RvciwgQ29vcmRpbmF0ZXMsIFZlY3RvcnMsIERpc3RhbmNlTWV0cmljfSBmcm9tICcuL3R5cGUtZGVjbGFyYXRpb25zJztcbmltcG9ydCB7cmFuZG9tRmxvYXQsIHJhbmRvbUludH0gZnJvbSAnLi9yYW5kb20nO1xuXG4vKipcbiAqIEFzc2VydHMgYSBjb25kaXRpb24gYnkgdGhyb3dpbmcgYW4gRXJyb3IuXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtib29sZWFufSBbY29uZGl0aW9uPWZhbHNlXSBDb25kaXRpb24gdG8gYXNzZXJ0LlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlPSdBc3NlcnRpb24gZXJyb3IuJ10gTWVzc2FnZSB0byBvdXRwdXQuXG4gKiBAdGhyb3dzIHtFcnJvcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydChjb25kaXRpb246IGJvb2xlYW4gPSBmYWxzZSwgbWVzc2FnZTogc3RyaW5nID0gJ0Fzc2VydGlvbiBlcnJvci4nKSB7XG4gIGlmICghY29uZGl0aW9uKVxuICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIG5ldyB0d28tZGltZW5zaW9uYWwgYXJyYXkgYW5kIGZpbGxzIGl0IHdpdGggdGhlIHZhbHVlIGdpdmVuLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBkaW1lbnNpb24xIFRoZSBmaXJzdCBkaW1lbnNpb24gb2YgdGhlIGNvb3JkaW5hdGVzIChudW1iZXIgb2Ygcm93cykuXG4gKiBAcGFyYW0ge251bWJlcn0gZGltZW5zaW9uMiBUaGUgc2Vjb25kIGRpbWVuc2lvbiBvZiB0aGUgY29vcmRpbmF0ZXMgKG51bWJlciBvZiBjb2x1bW5zKS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbZmlsbD0wXSBBIHZhbHVlIHRvIGZpbGwgdGhlIGNvb3JkaW5hdGVzIHdpdGguXG4gKiBAcmV0dXJuIHtDb29yZGluYXRlc30gQSB0d28tZGltZW5zaW9uYWwgZmlsbGVkIHdpdGggdGhlIHZhbHVlIGdpdmVuLlxuICogQHRvZG8gTWlnaHQgYmUgc2xvdyBzaW5jZSB1c2VkIEFycmF5Lm1hcC4gUHJvYmFibHkgbmVlZHMgcGVyZm9ybWFuY2UgcmV2aXNpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0Q29vcmRpbmF0ZXMoZGltZW5zaW9uMTogbnVtYmVyLCBkaW1lbnNpb24yOiBudW1iZXIsIGZpbGw6IG51bWJlciA9IDApOiBDb29yZGluYXRlcyB7XG4gIHJldHVybiBuZXcgQXJyYXkoZGltZW5zaW9uMSkuZmlsbChmaWxsKS5tYXAoKCkgPT4gKG5ldyBWZWN0b3IoZGltZW5zaW9uMikuZmlsbChmaWxsKSkpO1xufVxuXG4vKipcbiAqIFRyYW5zcG9zZSBtYXRyaXguXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtNYXRyaXh9IG1hdHJpeCBUaGUgbWF0cml4IHRvIGJlIHRyYW5zcG9zZWQuXG4gKiBAcmV0dXJuIHtNYXRyaXh9IFRyYW5zcG9zZWQgbWF0cml4LlxuICogQHRvZG8gTWlnaHQgYmUgc2xvdyBzaW5jZSB1c2VkIEFycmF5Lm1hcC4gUHJvYmFibHkgbmVlZHMgcGVyZm9ybWFuY2UgcmV2aXNpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc3Bvc2VNYXRyaXgobWF0cml4OiBNYXRyaXgpOiBNYXRyaXgge1xuICByZXR1cm4gbmV3IEFycmF5KG1hdHJpeFswXS5sZW5ndGgpLmZpbGwoMClcbiAgICAubWFwKChfLCBpKSA9PiAobmV3IFZlY3RvcihtYXRyaXgubGVuZ3RoKS5maWxsKDApLm1hcCgoXywgaikgPT4gKG1hdHJpeFtqXVtpXSkpKSk7XG59XG5cbi8qKlxuICogQWRkcyB0d28gdmVjdG9ycyB3aXRoIHRoZSBzZWNvbmQgb25lIHRvIGJlIG11bHRpcGxpZWQgYnkgdGhlIGdpdmVuIHJhdGlvLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7VmVjdG9yfSBwIFRoZSBmaXJzdCB2ZWN0b3IgdG8gYWRkLlxuICogQHBhcmFtIHtWZWN0b3J9IHEgVGhlIHNlY29uZCB2ZWN0b3IgdG8gYWRkLlxuICogQHBhcmFtIHtudW1iZXJ9IFttdWx0aXBsaWVyPTFdIEEgbXVsdGlwbGllciB0byBiZSB1c2VkIGJlZm9yZSB0aGUgc2Vjb25kIHZlY3RvciBpcyBhZGRlZC5cbiAqIEByZXR1cm4ge1ZlY3Rvcn0gTmV3IHZlY3RvciBjb250YWluZWQgdGhlIHJlc3VsdCBvZiBvcGVyYXRpb24gcCttdWx0aXBsaWVyKnEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZWN0b3JBZGQocDogVmVjdG9yLCBxOiBWZWN0b3IsIG11bHRpcGxpZXI6IG51bWJlciA9IDEpOiBWZWN0b3Ige1xuICBjb25zdCBuSXRlbXMgPSBwLmxlbmd0aDtcblxuICBhc3NlcnQobkl0ZW1zID09IHEubGVuZ3RoLCAnVmVjdG9yIGxlbmd0aHMgZG8gbm90IG1hdGNoLicpO1xuXG4gIGNvbnN0IHRvdGFsID0gbmV3IFZlY3RvcihuSXRlbXMpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcC5sZW5ndGg7ICsraSlcbiAgICB0b3RhbFtpXSA9IHBbaV0gKyBtdWx0aXBsaWVyICogcVtpXTtcblxuICByZXR1cm4gdG90YWw7XG59XG5cbi8qKlxuICogU3VtcyB0aGUgdmVjdG9yJ3MgaXRlbXMuXG4gKlxuICogQHBhcmFtIHtWZWN0b3J9IHYgVGhlIHZlY3RvciB0byBiZSBzdW1tZWQuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB2ZWN0b3IncyBpdGVtcyBzdW0uXG4gKi9cbmZ1bmN0aW9uIGl0ZW1zU3VtKHY6IFZlY3Rvcik6IG51bWJlciB7XG4gIGxldCB0b3RhbCA9IDA7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2Lmxlbmd0aDsgKytpKVxuICAgIHRvdGFsICs9IHZbaV07XG5cbiAgcmV0dXJuIHRvdGFsO1xufVxuXG4vKipcbiAqIFN1cWFyZXMgdGhlIHZlY3RvcidzIGl0ZW1zLlxuICpcbiAqIEBwYXJhbSB7VmVjdG9yfSB2IFRoZSB2ZWN0b3IgdG8gc3F1YXJlLlxuICogQHJldHVybiB7VmVjdG9yfSBBIG5ldyB2ZWN0b3IgY29udGFpbmluZyB0aGUgb3JpZ2luYWwncyBpdGVtcyBzcXVhcmVkLlxuICovXG5mdW5jdGlvbiB2ZWN0b3JTcXVhcmUodjogVmVjdG9yKTogVmVjdG9yIHtcbiAgY29uc3Qgbkl0ZW1zID0gdi5sZW5ndGg7XG4gIGNvbnN0IHRvdGFsID0gbmV3IFZlY3RvcihuSXRlbXMpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdi5sZW5ndGg7ICsraSlcbiAgICB0b3RhbFtpXSA9IHZbaV0gKiB2W2ldO1xuXG4gIHJldHVybiB0b3RhbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZlY3Rvckxlbmd0aCh2OiBWZWN0b3IpOiBudW1iZXIge1xuICBsZXQgc3FyU3VtOiBudW1iZXIgPSAwO1xuICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdi5sZW5ndGg7IGkrKylcbiAgICBzcXJTdW0gKz0gdltpXSAqIHZbaV07XG4gIHJldHVybiBNYXRoLnNxcnQoc3FyU3VtKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZlY3RvckRvdFByb2R1Y3QodjE6IFZlY3RvciwgdjI6IFZlY3Rvcik6IG51bWJlciB7XG4gIGlmICh2MS5sZW5ndGggIT0gdjIubGVuZ3RoKVxuICAgIHRocm93IG5ldyBFcnJvcignVGhlIGRpbWVuc2lvbmFsaXR5IG9mIHRoZSB2ZWN0b3JzIG11c3QgbWF0Y2gnKTtcbiAgbGV0IHByb2Q6IG51bWJlciA9IDA7XG4gIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB2MS5sZW5ndGg7IGkrKylcbiAgICBwcm9kICs9IHYxW2ldICogdjJbaV07XG4gIHJldHVybiBwcm9kO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZmlsbGVkIHdpdGggcmFuZG9tIGZsb2F0aW5nIHBvaW50IHZhbHVlcy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge251bWJlcn0gZGltZW5zaW9uMSBUaGUgZmlyc3QgZGltZW5zaW9uIG9mIHRoZSBtYXRyaXguXG4gKiBAcGFyYW0ge251bWJlcn0gZGltZW5zaW9uMiBUaGUgc2Vjb25kIGRpbWVuc2lvbiBvZiB0aGUgbWF0cml4LlxuICogQHBhcmFtIHtudW1iZXJ9IFtzY2FsZT0xLl0gTWF4IHZhbHVlIGdpdmVuIGJ5IHJhbmRvbSBnZW5lcmF0b3IuXG4gKiBAcmV0dXJuIHtNYXRyaXh9IEEgbmV3IG1hdHJpeCBmaWxsZWQgd2l0aCByYW5kb20gZmxvYXRpbmcgcG9pbnQgIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbGxSYW5kb21NYXRyaXgoZGltZW5zaW9uMTogbnVtYmVyLCBkaW1lbnNpb24yOiBudW1iZXIsIHNjYWxlOiBudW1iZXIgPSAxLik6IE1hdHJpeCB7XG4gIGNvbnN0IG1hdHJpeCA9IGluaXRDb29yZGluYXRlcyhkaW1lbnNpb24xLCBkaW1lbnNpb24yKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRpbWVuc2lvbjE7ICsraSkge1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgZGltZW5zaW9uMjsgKytqKVxuICAgICAgbWF0cml4W2ldW2pdID0gcmFuZG9tRmxvYXQoc2NhbGUpO1xuICB9XG4gIHJldHVybiBtYXRyaXg7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyBFdWNsaWRlYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gdmVjdG9ycy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge1ZlY3Rvcn0gcCBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHtWZWN0b3J9IHEgVGhlIHNlY29uZCB2ZWN0b3IuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IEV1Y2xpZGVhbiBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBnaXZlbiB2ZWN0b3JzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlRXVjbGlkZWFuRGlzdGFuY2UocDogVmVjdG9yLCBxOiBWZWN0b3IpOiBudW1iZXIge1xuICBsZXQgcmVzdWx0ID0gMDtcbiAgY29uc3QgbGVuID0gcC5sZW5ndGg7XG5cbiAgaWYgKGxlbiAhPT0gcS5sZW5ndGgpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgZGltZW5zaW9uYWxpdHkgb2YgdGhlIHZlY3RvcnMgbXVzdCBtYXRjaCcpO1xuICBcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47ICsraSlcbiAgICByZXN1bHQgKz0gKHBbaV0gLSBxW2ldKSAqKiAyO1xuICBcbiAgcmV0dXJuIE1hdGguc3FydChyZXN1bHQpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBkaXN0YW5jZSBtYXRyaXggdXNpbmcgYSBjdXN0b20gZGlzdGFuY2UgZnVuY3Rpb24uXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtWZWN0b3JzfSBkYXRhIElucHV0IHZlY3RvcnMgdG8gY2FsY3VsYXRlIGRpc3RhbmNlcy5cbiAqIEBwYXJhbSB7RGlzdGFuY2VNZXRyaWN9IGRpc3RhbmNlIEN1c3RvbSBkaXN0YW5jZSBmdW5jdGlvbi5cbiAqIEByZXR1cm4ge01hdHJpeH0gQ2FsY3VsYXRlZCBjdXN0b20gZGlzdGFuY2UgbWF0cml4LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY0Rpc3RhbmNlTWF0cml4KGRhdGE6IFZlY3RvcnMsIGRpc3RhbmNlOiBEaXN0YW5jZU1ldHJpYyk6IE1hdHJpeCB7XG4gIGNvbnN0IG5JdGVtcyA9IGRhdGEubGVuZ3RoO1xuICBjb25zdCBtYXRyaXggPSBpbml0Q29vcmRpbmF0ZXMobkl0ZW1zLCBuSXRlbXMsIDApO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbkl0ZW1zOyArK2kpIHtcbiAgICBmb3IgKGxldCBqID0gaSArIDE7IGogPCBuSXRlbXM7ICsraikge1xuICAgICAgY29uc3QgZDogbnVtYmVyID0gKGRhdGFbaV0gPT0gbnVsbCkgfHwgKGRhdGFbal0gPT0gbnVsbCkgPyAwIDogZGlzdGFuY2UoZGF0YVtpXSwgZGF0YVtqXSk7XG4gICAgICBtYXRyaXhbaV1bal0gPSBtYXRyaXhbal1baV0gPSBkO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbWF0cml4O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBkaXN0YW5jZSBtYXRyaXggdXNpbmcgYSBjdXN0b20gZGlzdGFuY2UgZnVuY3Rpb24uXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtWZWN0b3JzfSBkYXRhIElucHV0IHZlY3RvcnMgdG8gY2FsY3VsYXRlIGRpc3RhbmNlcy5cbiAqIEBwYXJhbSB7RGlzdGFuY2VNZXRyaWN9IGRpc3RhbmNlIEN1c3RvbSBkaXN0YW5jZSBmdW5jdGlvbi5cbiAqIEByZXR1cm4ge01hdHJpeH0gQ2FsY3VsYXRlZCBjdXN0b20gZGlzdGFuY2UgbWF0cml4LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY05vcm1hbGl6ZWREaXN0YW5jZU1hdHJpeChkYXRhOiBWZWN0b3JzLCBkaXN0YW5jZTogRGlzdGFuY2VNZXRyaWMpOiBNYXRyaXgge1xuICBjb25zdCBuSXRlbXMgPSBkYXRhLmxlbmd0aDtcbiAgY29uc3QgbWF0cml4ID0gaW5pdENvb3JkaW5hdGVzKG5JdGVtcywgbkl0ZW1zLCAwKTtcbiAgbGV0IG1heCA9IE51bWJlci5NSU5fVkFMVUU7XG4gIGxldCBtaW4gPSBOdW1iZXIuTUFYX1ZBTFVFO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG5JdGVtczsgKytpKSB7XG4gICAgZm9yIChsZXQgaiA9IGk7IGogPCBuSXRlbXM7ICsraikge1xuICAgICAgY29uc3QgZDogbnVtYmVyID0gKGRhdGFbaV0gPT0gbnVsbCkgfHwgKGRhdGFbal0gPT0gbnVsbCB8fCBpID09PSBqKSA/IDAgOiBkaXN0YW5jZShkYXRhW2ldLCBkYXRhW2pdKTtcbiAgICAgIG1hdHJpeFtpXVtqXSA9IG1hdHJpeFtqXVtpXSA9IGQ7XG4gICAgICBpZiAoZCA+IG1heCkgbWF4ID0gZDtcbiAgICAgIGlmIChkIDwgbWluKSBtaW4gPSBkO1xuICAgIH1cbiAgfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IG5JdGVtczsgKytpKSB7XG4gICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgbkl0ZW1zOyArK2opXG4gICAgICBtYXRyaXhbaV1bal0gPSBtYXRyaXhbal1baV0gPSAobWF0cml4W2ldW2pdIC0gbWluKSAvIChtYXggLSBtaW4pO1xuICB9XG4gIHJldHVybiBtYXRyaXg7XG59XG5cbi8qKiBHZW5lcmF0ZXMgYXJyYXkgZnJvbSBhIHJhbmdlIFtiZWdpbjsgZW5kXSBvciBbYmVnaW47IGVuZCkgaWYgZW5kRXhjbHVzaXZlLiAqKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5SYW5nZShiZWdpbjogbnVtYmVyLCBlbmQ6IG51bWJlciwgZW5kRXhjbHVzaXZlID0gZmFsc2UpOiBJbnQzMkFycmF5IHtcbiAgY29uc3Qgbkl0ZW1zID0gZW5kIC0gYmVnaW4gKyAoZW5kRXhjbHVzaXZlID8gMCA6IDEpO1xuICBjb25zdCBzZXJpZXMgPSBuZXcgSW50MzJBcnJheShuSXRlbXMpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbkl0ZW1zOyArK2kpXG4gICAgc2VyaWVzW2ldID0gYmVnaW4gKyBpO1xuXG4gIHJldHVybiBzZXJpZXM7XG59XG5cbi8qKlxuICogUmV0dXJucyBvcmRlciBvZiB2YWx1ZXMgYXMgaWYgdGhleSBhcmUgc29ydGVkLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7YW55W119IHZhbHVlcyBJbnB1dCBhcnJheS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JldmVyc2U9ZmFsc2VdIFdoZXRoZXIgdG8gcmV0dXJuIHJldmVyc2VkIG9yZGVyLlxuICogQHJldHVybiB7bnVtYmVyW119IFRoZSBvcmRlciBjb21wdXRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFyZ1NvcnQodmFsdWVzOiBhbnlbXSwgcmV2ZXJzZSA9IGZhbHNlKTogbnVtYmVyW10ge1xuICBjb25zdCBzb3J0Zm4gPSByZXZlcnNlID8gKGE6IGFueVtdLCBiOiBhbnlbXSkgPT4gKGJbMF0gLSBhWzBdKSA6IChhOiBhbnlbXSwgYjogYW55W10pID0+IChhWzBdIC0gYlswXSk7XG4gIGNvbnN0IGRlY29yID0gKHY6IGFueSwgaTogbnVtYmVyKSA9PiBbdiwgaV07IC8vIHNldCBpbmRleCB0byB2YWx1ZVxuICBjb25zdCB1bmRlY29yID0gKGE6IGFueVtdKSA9PiBhWzFdOyAvLyBsZWF2ZSBvbmx5IGluZGV4XG4gIGNvbnN0IF9hcmdzb3J0ID0gKGFycjogYW55W10pID0+IGFyci5tYXAoZGVjb3IpLnNvcnQoc29ydGZuKS5tYXAodW5kZWNvcik7XG4gIHJldHVybiBfYXJnc29ydCh2YWx1ZXMpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGluZGV4ZXMgb2YgdGhlIG1vc3QgZGl2ZXJzZSBvYmplY3RzIGFjY29yZGluZyB0byB0aGUgZGlzdCBmdW5jdGlvblxuICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aCB0b3RhbCBudW1iZXIgb2Ygb2JqZWN0c1xuICogQHBhcmFtIHtudW1iZXJ9IG4gbnVtYmVyIG9mIGRpdmVyc2UgZWxlbWVudHMgdG8gZmluZFxuICogQHBhcmFtIHsoaTE6IG51bWJlciwgaTI6IG51bWJlcikgPT4gbnVtYmVyfSBkaXN0IGEgZnVuY3Rpb24gd2hpY2ggY2FsY3VsYXRlcyBkaXN0YW5jZSBiZXR3ZWVuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHdvIG9iamVjdHMgdXNpbmcgdGhlaXIgaW5kZXhlc1xuICogQHJldHVybnMge251bWJlcltdfSBUaGUgaW5kZXhlcyBvZiB0aGUgbW9zdCBkaXZlcnNlIG9iamVjdHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERpdmVyc2VTdWJzZXQobGVuZ3RoOiBudW1iZXIsIG46IG51bWJlciwgZGlzdDogKGkxOiBudW1iZXIsIGkyOiBudW1iZXIpID0+IG51bWJlcik6IG51bWJlcltdIHtcbiAgZnVuY3Rpb24gbWF4QnkodmFsdWVzOiBJdGVyYWJsZUl0ZXJhdG9yPG51bWJlcj4sIG9yZGVyQnk6IChpOiBudW1iZXIpID0+IG51bWJlcikge1xuICAgIGxldCBtYXhWYWx1ZSA9IG51bGw7XG4gICAgbGV0IG1heE9yZGVyQnkgPSBudWxsO1xuXG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHZhbHVlcykge1xuICAgICAgY29uc3QgZWxlbWVudE9yZGVyQnkgPSBvcmRlckJ5KGVsZW1lbnQpO1xuICAgICAgaWYgKG1heE9yZGVyQnkgPT0gbnVsbCB8fCBlbGVtZW50T3JkZXJCeSA+IG1heE9yZGVyQnkpIHtcbiAgICAgICAgbWF4VmFsdWUgPSBlbGVtZW50O1xuICAgICAgICBtYXhPcmRlckJ5ID0gZWxlbWVudE9yZGVyQnk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYXhWYWx1ZTtcbiAgfVxuXG4gIGNvbnN0IHN1YnNldCA9IFtyYW5kb21JbnQobGVuZ3RoIC0gMSldO1xuICBjb25zdCBjb21wbGVtZW50ID0gbmV3IFNldCgpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoIXN1YnNldC5pbmNsdWRlcyhpKSlcbiAgICAgIGNvbXBsZW1lbnQuYWRkKGkpO1xuICB9XG5cbiAgd2hpbGUgKHN1YnNldC5sZW5ndGggPCBuKSB7XG4gICAgY29uc3QgaWR4ID0gbWF4QnkoXG4gICAgICBjb21wbGVtZW50LnZhbHVlcygpIGFzIEl0ZXJhYmxlSXRlcmF0b3I8bnVtYmVyPixcbiAgICAgIChpKSA9PiBNYXRoLm1pbi5hcHBseShNYXRoLCBzdWJzZXQubWFwKGZ1bmN0aW9uKHZhbCwgaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGRpc3QoaSwgdmFsKTtcbiAgICAgIH0pKSk7XG4gICAgaWYgKGlkeCkge1xuICAgICAgc3Vic2V0LnB1c2goaWR4KTtcbiAgICAgIGNvbXBsZW1lbnQuZGVsZXRlKGlkeCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBzdWJzZXQ7XG59XG5cbi8qKlxuICogUmV0dXJucyBub3JtYWxpemVkIHZlY3Rvci5cbiAqIFxuICogQGV4cG9ydFxuICogQHBhcmFtIHtWZWN0b3J9IGRhdGEgbnVtZXJpY2FsIGFycmF5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemUoZGF0YTogVmVjdG9yKTogVmVjdG9yIHtcbiAgY29uc3QgbGVuID0gZGF0YS5sZW5ndGg7XG4gIGxldCBzdW0gPSAwO1xuICBsZXQgc3VtT2ZTcXVhcmVzID0gMDtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgc3VtICs9IGRhdGFbaV07XG4gICAgc3VtT2ZTcXVhcmVzICs9IGRhdGFbaV0gKiogMjtcbiAgfVxuXG4gIGNvbnN0IG1lYW4gPSBzdW0gLyBsZW47XG4gIGNvbnN0IHN0ZERldkludmVyc2UgPSAxLjAgLyBNYXRoLnNxcnQoc3VtT2ZTcXVhcmVzIC8gbGVuIC0gbWVhbiAqKiAyKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgKytpKVxuICAgIGRhdGFbaV0gPSAoZGF0YVtpXSAtIG1lYW4pICogc3RkRGV2SW52ZXJzZTtcblxuICByZXR1cm4gZGF0YTtcbn1cblxuLyoqXG4gKiBGaW5kcyBzZXQgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBsaXN0cy5cbiAqIEBwYXJhbSB7YW55W119IGEgVGhlIGZpcnN0IGxpc3QuXG4gKiBAcGFyYW0ge2FueVtdfSBiIFRoZSBzZWNvbmQgbGlzdC5cbiAqIEByZXR1cm4ge2FueVtdfVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0RGlmZmVyZW5jZShhOiBhbnlbXSwgYjogYW55W10pOiBhbnlbXSB7XG4gIGNvbnN0IGJTZXQgPSBuZXcgU2V0KGIpO1xuICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KGEuZmlsdGVyKCh4KSA9PiAhYlNldC5oYXMoeCkpKS52YWx1ZXMoKSk7XG59XG4iXX0=","import * as fl from 'fastest-levenshtein';\nimport { jaroWinkler } from 'jaro-winkler-typescript';\nimport { asymmetricDistance, braunBlanquetDistance, cosineDistance, diceDistance, euclideanDistance, hammingDistance, kulczynskiDistance, mcConnaugheyDistance, rogotGoldbergDistance, russelDistance, sokalDistance, tanimotoDistance, numericDistance, tanimotoDistanceIntArray, } from '../distance-metrics-methods';\nimport { calculateEuclideanDistance } from '@datagrok-libraries/utils/src/vector-operations';\nimport { mmDistanceFunctions, MmDistanceFunctionsNames } from '../macromolecule-distance-functions';\nimport { DistanceMetricsSubjects, BitArrayMetricsNames, StringMetricsNames, VectorMetricsNames, NumberMetricsNames, IntArrayMetricsNames } from './consts';\nexport const vectorDistanceMetricsMethods = {\n [VectorMetricsNames.Euclidean]: calculateEuclideanDistance,\n};\nexport const stringDistanceMetricsMethods = {\n [StringMetricsNames.Levenshtein]: fl.distance,\n [StringMetricsNames.JaroWinkler]: jaroWinkler,\n [StringMetricsNames.Manhattan]: manhattanDistance,\n [StringMetricsNames.Onehot]: categoricalDistance,\n};\nexport const bitArrayDistanceMetricsMethods = {\n [BitArrayMetricsNames.Tanimoto]: tanimotoDistance,\n [BitArrayMetricsNames.Dice]: diceDistance,\n [BitArrayMetricsNames.Asymmetric]: asymmetricDistance,\n [BitArrayMetricsNames.BraunBlanquet]: braunBlanquetDistance,\n [BitArrayMetricsNames.Cosine]: cosineDistance,\n [BitArrayMetricsNames.Kulczynski]: kulczynskiDistance,\n [BitArrayMetricsNames.McConnaughey]: mcConnaugheyDistance,\n [BitArrayMetricsNames.RogotGoldberg]: rogotGoldbergDistance,\n [BitArrayMetricsNames.Russel]: russelDistance,\n [BitArrayMetricsNames.Sokal]: sokalDistance,\n [BitArrayMetricsNames.Hamming]: hammingDistance,\n [BitArrayMetricsNames.Euclidean]: euclideanDistance,\n};\nexport const intArrayDistanceMetricsMethods = {\n [IntArrayMetricsNames.TanimotoIntArray]: tanimotoDistanceIntArray,\n};\nexport const numberDistanceMetricsMethods = {\n [NumberMetricsNames.Difference]: numericDistance,\n};\nexport const AvailableMetrics = {\n [DistanceMetricsSubjects.Vector]: {\n [VectorMetricsNames.Euclidean]: vectorDistanceMetricsMethods[VectorMetricsNames.Euclidean],\n },\n [DistanceMetricsSubjects.String]: {\n [StringMetricsNames.Levenshtein]: stringDistanceMetricsMethods[StringMetricsNames.Levenshtein],\n [StringMetricsNames.JaroWinkler]: stringDistanceMetricsMethods[StringMetricsNames.JaroWinkler],\n [StringMetricsNames.Manhattan]: stringDistanceMetricsMethods[StringMetricsNames.Manhattan],\n [StringMetricsNames.Onehot]: stringDistanceMetricsMethods[StringMetricsNames.Onehot],\n },\n [DistanceMetricsSubjects.BitArray]: {\n [BitArrayMetricsNames.Tanimoto]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.Tanimoto],\n [BitArrayMetricsNames.Dice]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.Dice],\n [BitArrayMetricsNames.Asymmetric]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.Asymmetric],\n [BitArrayMetricsNames.BraunBlanquet]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.BraunBlanquet],\n [BitArrayMetricsNames.Cosine]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.Cosine],\n [BitArrayMetricsNames.Kulczynski]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.Kulczynski],\n [BitArrayMetricsNames.McConnaughey]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.McConnaughey],\n [BitArrayMetricsNames.RogotGoldberg]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.RogotGoldberg],\n [BitArrayMetricsNames.Russel]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.Russel],\n [BitArrayMetricsNames.Sokal]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.Sokal],\n },\n [DistanceMetricsSubjects.MacroMolecule]: {\n [MmDistanceFunctionsNames.HAMMING]: mmDistanceFunctions[MmDistanceFunctionsNames.HAMMING],\n [MmDistanceFunctionsNames.LEVENSHTEIN]: mmDistanceFunctions[MmDistanceFunctionsNames.LEVENSHTEIN],\n [MmDistanceFunctionsNames.NEEDLEMANN_WUNSCH]: mmDistanceFunctions[MmDistanceFunctionsNames.NEEDLEMANN_WUNSCH],\n [MmDistanceFunctionsNames.MONOMER_CHEMICAL_DISTANCE]: mmDistanceFunctions[MmDistanceFunctionsNames.MONOMER_CHEMICAL_DISTANCE],\n },\n [DistanceMetricsSubjects.Number]: {\n [NumberMetricsNames.Difference]: numberDistanceMetricsMethods[NumberMetricsNames.Difference],\n },\n [DistanceMetricsSubjects.IntArray]: {\n [IntArrayMetricsNames.TanimotoIntArray]: intArrayDistanceMetricsMethods[IntArrayMetricsNames.TanimotoIntArray],\n }\n};\nexport const MetricToDataType = Object.keys(AvailableMetrics)\n .reduce((ret, key) => {\n for (const val of Object.keys(AvailableMetrics[key]))\n ret[val] = key;\n return ret;\n}, {});\nexport function isStringMetric(name) {\n return MetricToDataType[name] == 'String';\n}\nexport function isBitArrayMetric(name) {\n return MetricToDataType[name] == 'BitArray';\n}\nexport function isVectorMetric(name) {\n return MetricToDataType[name] == 'Vector';\n}\nexport function isMacroMoleculeMetric(name) {\n return MetricToDataType[name] == DistanceMetricsSubjects.MacroMolecule.toString();\n}\nexport function isNumericMetric(name) {\n return MetricToDataType[name] == DistanceMetricsSubjects.Number.toString();\n}\n/** Manhattan distance between two sequences (match - 0, mismatch - 1) normalized for length. */\nexport function manhattanDistance(s1, s2) {\n if (s1.length !== s2.length) {\n return 1;\n }\n else {\n let dist = 0;\n for (let i = 1; i < s1.length; i++)\n dist += s1[i] == s2[i] ? 0 : 1;\n return dist / s1.length;\n }\n}\nexport function categoricalDistance(s1, s2) {\n return s1 === s2 ? 0 : 1;\n}\n/** Unified class implementing different string measures. */\nexport class Measure {\n method;\n dataType;\n /**\n * Creates an instance of Measure with .\n * @param {string} method Method to calculate distance between strings.\n * @memberof Measurer\n */\n constructor(method) {\n this.method = method;\n this.dataType = MetricToDataType[method];\n }\n /**\n * Returns custom string distance function specified.\n * @param {opts} opts Options for the measure. used for macromolecule distances\n * @return {DistanceMetric} Callback of the measure chosen.\n * @memberof Measurer\n */\n getMeasure(opts) {\n const dict = AvailableMetrics;\n if (!dict.hasOwnProperty(this.dataType) || !dict[this.dataType].hasOwnProperty(this.method))\n throw new Error(`Unknown measure ${this.method} for data type ${this.dataType}`);\n return isMacroMoleculeMetric(this.method) || isNumericMetric(this.method) ?\n dict[this.dataType][this.method](opts) :\n dict[this.dataType][this.method];\n }\n /**\n * Returns custom string distance by the given data type.\n * @param {AvailableDataTypes} dataType Metric's data type\n * @return {string[]} Metric names which expects the given data type\n * @memberof Measurer\n */\n static getMetricByDataType(dataType) {\n return Object.keys(AvailableMetrics[dataType]);\n }\n /** Returns metric names available.\n * @memberof Measurer\n */\n static get availableMeasures() {\n return Object.keys(AvailableMetrics);\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZWQtbWV0cmljcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInR5cGVkLW1ldHJpY3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMxQyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFFcEQsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixxQkFBcUIsRUFDckIsY0FBYyxFQUNkLFlBQVksRUFDWixpQkFBaUIsRUFDakIsZUFBZSxFQUNmLGtCQUFrQixFQUNsQixvQkFBb0IsRUFDcEIscUJBQXFCLEVBQ3JCLGNBQWMsRUFDZCxhQUFhLEVBQ2IsZ0JBQWdCLEVBQ2hCLGVBQWUsRUFDZix3QkFBd0IsR0FDekIsTUFBTSw2QkFBNkIsQ0FBQztBQUVyQyxPQUFPLEVBQUMsMEJBQTBCLEVBQUMsTUFBTSxpREFBaUQsQ0FBQztBQUczRixPQUFPLEVBQUMsbUJBQW1CLEVBQUUsd0JBQXdCLEVBQUMsTUFBTSxxQ0FBcUMsQ0FBQztBQUNsRyxPQUFPLEVBQUMsdUJBQXVCLEVBQUUsb0JBQW9CLEVBQ25ELGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLG9CQUFvQixFQUFDLE1BQU0sVUFBVSxDQUFDO0FBR3BHLE1BQU0sQ0FBQyxNQUFNLDRCQUE0QixHQUF5RDtJQUNoRyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxFQUFFLDBCQUEwQjtDQUMzRCxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQXlEO0lBQ2hHLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRSxDQUFDLFFBQVE7SUFDN0MsQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsRUFBRSxXQUFXO0lBQzdDLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLEVBQUUsaUJBQWlCO0lBQ2pELENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLEVBQUUsbUJBQW1C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UUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBcUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzdFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBbUIsQ0FBQztJQUN2RCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsbUJBQW1CLENBQUMsUUFBNEI7UUFDNUQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxLQUFLLGlCQUFpQjtRQUMxQixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUN2QyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmbCBmcm9tICdmYXN0ZXN0LWxldmVuc2h0ZWluJztcbmltcG9ydCB7amFyb1dpbmtsZXJ9IGZyb20gJ2phcm8td2lua2xlci10eXBlc2NyaXB0JztcbmltcG9ydCB7RGlzdGFuY2VNZXRyaWN9IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL3R5cGUtZGVjbGFyYXRpb25zJztcbmltcG9ydCB7XG4gIGFzeW1tZXRyaWNEaXN0YW5jZSxcbiAgYnJhdW5CbGFucXVldERpc3RhbmNlLFxuICBjb3NpbmVEaXN0YW5jZSxcbiAgZGljZURpc3RhbmNlLFxuICBldWNsaWRlYW5EaXN0YW5jZSxcbiAgaGFtbWluZ0Rpc3RhbmNlLFxuICBrdWxjenluc2tpRGlzdGFuY2UsXG4gIG1jQ29ubmF1Z2hleURpc3RhbmNlLFxuICByb2dvdEdvbGRiZXJnRGlzdGFuY2UsXG4gIHJ1c3NlbERpc3RhbmNlLFxuICBzb2thbERpc3RhbmNlLFxuICB0YW5pbW90b0Rpc3RhbmNlLFxuICBudW1lcmljRGlzdGFuY2UsXG4gIHRhbmltb3RvRGlzdGFuY2VJbnRBcnJheSxcbn0gZnJvbSAnLi4vZGlzdGFuY2UtbWV0cmljcy1tZXRob2RzJztcblxuaW1wb3J0IHtjYWxjdWxhdGVFdWNsaWRlYW5EaXN0YW5jZX0gZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy91dGlscy9zcmMvdmVjdG9yLW9wZXJhdGlvbnMnO1xuaW1wb3J0IEJpdEFycmF5IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL2JpdC1hcnJheSc7XG5pbXBvcnQge1ZlY3RvciwgU3RyaW5nRGljdGlvbmFyeX0gZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy91dGlscy9zcmMvdHlwZS1kZWNsYXJhdGlvbnMnO1xuaW1wb3J0IHttbURpc3RhbmNlRnVuY3Rpb25zLCBNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXN9IGZyb20gJy4uL21hY3JvbW9sZWN1bGUtZGlzdGFuY2UtZnVuY3Rpb25zJztcbmltcG9ydCB7RGlzdGFuY2VNZXRyaWNzU3ViamVjdHMsIEJpdEFycmF5TWV0cmljc05hbWVzLFxuICBTdHJpbmdNZXRyaWNzTmFtZXMsIFZlY3Rvck1ldHJpY3NOYW1lcywgTnVtYmVyTWV0cmljc05hbWVzLCBJbnRBcnJheU1ldHJpY3NOYW1lc30gZnJvbSAnLi9jb25zdHMnO1xuXG5cbmV4cG9ydCBjb25zdCB2ZWN0b3JEaXN0YW5jZU1ldHJpY3NNZXRob2RzOiB7IFtuYW1lOiBzdHJpbmddOiAoeDogVmVjdG9yLCB5OiBWZWN0b3IpID0+IG51bWJlciB9ID0ge1xuICBbVmVjdG9yTWV0cmljc05hbWVzLkV1Y2xpZGVhbl06IGNhbGN1bGF0ZUV1Y2xpZGVhbkRpc3RhbmNlLFxufTtcblxuZXhwb3J0IGNvbnN0IHN0cmluZ0Rpc3RhbmNlTWV0cmljc01ldGhvZHM6IHsgW25hbWU6IHN0cmluZ106ICh4OiBzdHJpbmcsIHk6IHN0cmluZykgPT4gbnVtYmVyIH0gPSB7XG4gIFtTdHJpbmdNZXRyaWNzTmFtZXMuTGV2ZW5zaHRlaW5dOiBmbC5kaXN0YW5jZSxcbiAgW1N0cmluZ01ldHJpY3NOYW1lcy5KYXJvV2lua2xlcl06IGphcm9XaW5rbGVyLFxuICBbU3RyaW5nTWV0cmljc05hbWVzLk1hbmhhdHRhbl06IG1hbmhhdHRhbkRpc3RhbmNlLFxuICBbU3RyaW5nTWV0cmljc05hbWVzLk9uZWhvdF06IGNhdGVnb3JpY2FsRGlzdGFuY2UsXG59O1xuXG5leHBvcnQgY29uc3QgYml0QXJyYXlEaXN0YW5jZU1ldHJpY3NNZXRob2RzOiB7IFtuYW1lOiBzdHJpbmddOiAoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KSA9PiBudW1iZXIgfSA9IHtcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLlRhbmltb3RvXTogdGFuaW1vdG9EaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkRpY2VdOiBkaWNlRGlzdGFuY2UsXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Bc3ltbWV0cmljXTogYXN5bW1ldHJpY0Rpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuQnJhdW5CbGFucXVldF06IGJyYXVuQmxhbnF1ZXREaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkNvc2luZV06IGNvc2luZURpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuS3VsY3p5bnNraV06IGt1bGN6eW5za2lEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLk1jQ29ubmF1Z2hleV06IG1jQ29ubmF1Z2hleURpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuUm9nb3RHb2xkYmVyZ106IHJvZ290R29sZGJlcmdEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLlJ1c3NlbF06IHJ1c3NlbERpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuU29rYWxdOiBzb2thbERpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuSGFtbWluZ106IGhhbW1pbmdEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkV1Y2xpZGVhbl06IGV1Y2xpZGVhbkRpc3RhbmNlLFxufTtcblxuZXhwb3J0IGNvbnN0IGludEFycmF5RGlzdGFuY2VNZXRyaWNzTWV0aG9kczogeyBbbmFtZTogc3RyaW5nXTogKHg6IFVpbnQzMkFycmF5LCB5OiBVaW50MzJBcnJheSkgPT4gbnVtYmVyIH0gPSB7XG4gIFtJbnRBcnJheU1ldHJpY3NOYW1lcy5UYW5pbW90b0ludEFycmF5XTogdGFuaW1vdG9EaXN0YW5jZUludEFycmF5LFxufTtcblxuZXhwb3J0IGNvbnN0IG51bWJlckRpc3RhbmNlTWV0cmljc01ldGhvZHM6IHsgW25hbWU6IHN0cmluZ106IChhcmdzOiBhbnkpID0+ICh4OiBudW1iZXIsIHk6IG51bWJlcikgPT4gbnVtYmVyIH0gPSB7XG4gIFtOdW1iZXJNZXRyaWNzTmFtZXMuRGlmZmVyZW5jZV06IG51bWVyaWNEaXN0YW5jZSxcbn07XG5cbmV4cG9ydCBjb25zdCBBdmFpbGFibGVNZXRyaWNzID0ge1xuICBbRGlzdGFuY2VNZXRyaWNzU3ViamVjdHMuVmVjdG9yXToge1xuICAgIFtWZWN0b3JNZXRyaWNzTmFtZXMuRXVjbGlkZWFuXTogdmVjdG9yRGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tWZWN0b3JNZXRyaWNzTmFtZXMuRXVjbGlkZWFuXSxcbiAgfSxcbiAgW0Rpc3RhbmNlTWV0cmljc1N1YmplY3RzLlN0cmluZ106IHtcbiAgICBbU3RyaW5nTWV0cmljc05hbWVzLkxldmVuc2h0ZWluXTogc3RyaW5nRGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tTdHJpbmdNZXRyaWNzTmFtZXMuTGV2ZW5zaHRlaW5dLFxuICAgIFtTdHJpbmdNZXRyaWNzTmFtZXMuSmFyb1dpbmtsZXJdOiBzdHJpbmdEaXN0YW5jZU1ldHJpY3NNZXRob2RzW1N0cmluZ01ldHJpY3NOYW1lcy5KYXJvV2lua2xlcl0sXG4gICAgW1N0cmluZ01ldHJpY3NOYW1lcy5NYW5oYXR0YW5dOiBzdHJpbmdEaXN0YW5jZU1ldHJpY3NNZXRob2RzW1N0cmluZ01ldHJpY3NOYW1lcy5NYW5oYXR0YW5dLFxuICAgIFtTdHJpbmdNZXRyaWNzTmFtZXMuT25laG90XTogc3RyaW5nRGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tTdHJpbmdNZXRyaWNzTmFtZXMuT25laG90XSxcbiAgfSxcbiAgW0Rpc3RhbmNlTWV0cmljc1N1YmplY3RzLkJpdEFycmF5XToge1xuICAgIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5UYW5pbW90b106IGJpdEFycmF5RGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tCaXRBcnJheU1ldHJpY3NOYW1lcy5UYW5pbW90b10sXG4gICAgW0JpdEFycmF5TWV0cmljc05hbWVzLkRpY2VdOiBiaXRBcnJheURpc3RhbmNlTWV0cmljc01ldGhvZHNbQml0QXJyYXlNZXRyaWNzTmFtZXMuRGljZV0sXG4gICAgW0JpdEFycmF5TWV0cmljc05hbWVzLkFzeW1tZXRyaWNdOiBiaXRBcnJheURpc3RhbmNlTWV0cmljc01ldGhvZHNbQml0QXJyYXlNZXRyaWNzTmFtZXMuQXN5bW1ldHJpY10sXG4gICAgW0JpdEFycmF5TWV0cmljc05hbWVzLkJyYXVuQmxhbnF1ZXRdOiBiaXRBcnJheURpc3RhbmNlTWV0cmljc01ldGhvZHNbQml0QXJyYXlNZXRyaWNzTmFtZXMuQnJhdW5CbGFucXVldF0sXG4gICAgW0JpdEFycmF5TWV0cmljc05hbWVzLkNvc2luZV06IGJpdEFycmF5RGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tCaXRBcnJheU1ldHJpY3NOYW1lcy5Db3NpbmVdLFxuICAgIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5LdWxjenluc2tpXTogYml0QXJyYXlEaXN0YW5jZU1ldHJpY3NNZXRob2RzW0JpdEFycmF5TWV0cmljc05hbWVzLkt1bGN6eW5za2ldLFxuICAgIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5NY0Nvbm5hdWdoZXldOiBiaXRBcnJheURpc3RhbmNlTWV0cmljc01ldGhvZHNbQml0QXJyYXlNZXRyaWNzTmFtZXMuTWNDb25uYXVnaGV5XSxcbiAgICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuUm9nb3RHb2xkYmVyZ106IGJpdEFycmF5RGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tCaXRBcnJheU1ldHJpY3NOYW1lcy5Sb2dvdEdvbGRiZXJnXSxcbiAgICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuUnVzc2VsXTogYml0QXJyYXlEaXN0YW5jZU1ldHJpY3NNZXRob2RzW0JpdEFycmF5TWV0cmljc05hbWVzLlJ1c3NlbF0sXG4gICAgW0JpdEFycmF5TWV0cmljc05hbWVzLlNva2FsXTogYml0QXJyYXlEaXN0YW5jZU1ldHJpY3NNZXRob2RzW0JpdEFycmF5TWV0cmljc05hbWVzLlNva2FsXSxcbiAgfSxcbiAgW0Rpc3RhbmNlTWV0cmljc1N1YmplY3RzLk1hY3JvTW9sZWN1bGVdOiB7IC8vIG9wdGlvbmFsIGFyZ3MgbmVlZGVkIGZvciBtYWNyb21vbGVjdWxlIGZ1bmN0aW9ucyB3aGljaCBpbml0aWFsaXplIHRoZW1cbiAgICBbTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzLkhBTU1JTkddOiBtbURpc3RhbmNlRnVuY3Rpb25zW01tRGlzdGFuY2VGdW5jdGlvbnNOYW1lcy5IQU1NSU5HXSxcbiAgICBbTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzLkxFVkVOU0hURUlOXTogbW1EaXN0YW5jZUZ1bmN0aW9uc1tNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXMuTEVWRU5TSFRFSU5dLFxuICAgIFtNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXMuTkVFRExFTUFOTl9XVU5TQ0hdOiBtbURpc3RhbmNlRnVuY3Rpb25zW01tRGlzdGFuY2VGdW5jdGlvbnNOYW1lcy5ORUVETEVNQU5OX1dVTlNDSF0sXG4gICAgW01tRGlzdGFuY2VGdW5jdGlvbnNOYW1lcy5NT05PTUVSX0NIRU1JQ0FMX0RJU1RBTkNFXTpcbiAgICAgIG1tRGlzdGFuY2VGdW5jdGlvbnNbTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzLk1PTk9NRVJfQ0hFTUlDQUxfRElTVEFOQ0VdLFxuICB9LFxuICBbRGlzdGFuY2VNZXRyaWNzU3ViamVjdHMuTnVtYmVyXToge1xuICAgIFtOdW1iZXJNZXRyaWNzTmFtZXMuRGlmZmVyZW5jZV06IG51bWJlckRpc3RhbmNlTWV0cmljc01ldGhvZHNbTnVtYmVyTWV0cmljc05hbWVzLkRpZmZlcmVuY2VdLFxuICB9LFxuICBbRGlzdGFuY2VNZXRyaWNzU3ViamVjdHMuSW50QXJyYXldOiB7XG4gICAgW0ludEFycmF5TWV0cmljc05hbWVzLlRhbmltb3RvSW50QXJyYXldOiBpbnRBcnJheURpc3RhbmNlTWV0cmljc01ldGhvZHNbSW50QXJyYXlNZXRyaWNzTmFtZXMuVGFuaW1vdG9JbnRBcnJheV0sXG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBNZXRyaWNUb0RhdGFUeXBlOiBTdHJpbmdEaWN0aW9uYXJ5ID0gT2JqZWN0LmtleXMoQXZhaWxhYmxlTWV0cmljcylcbiAgLnJlZHVjZSgocmV0OiBTdHJpbmdEaWN0aW9uYXJ5LCBrZXkpID0+IHtcbiAgICBmb3IgKGNvbnN0IHZhbCBvZiBPYmplY3Qua2V5cyhBdmFpbGFibGVNZXRyaWNzW2tleSBhcyBBdmFpbGFibGVEYXRhVHlwZXNdKSlcbiAgICAgIHJldFt2YWwgYXMgQXZhaWxhYmxlRGF0YVR5cGVzXSA9IGtleTtcblxuICAgIHJldHVybiByZXQ7XG4gIH0sIHt9KTtcblxuZXhwb3J0IHR5cGUgQXZhaWxhYmxlRGF0YVR5cGVzID0ga2V5b2YgdHlwZW9mIEF2YWlsYWJsZU1ldHJpY3M7XG5leHBvcnQgdHlwZSBWZWN0b3JNZXRyaWNzID0ga2V5b2YgdHlwZW9mIEF2YWlsYWJsZU1ldHJpY3NbRGlzdGFuY2VNZXRyaWNzU3ViamVjdHMuVmVjdG9yXTtcbmV4cG9ydCB0eXBlIFN0cmluZ01ldHJpY3MgPSBrZXlvZiB0eXBlb2YgQXZhaWxhYmxlTWV0cmljc1tEaXN0YW5jZU1ldHJpY3NTdWJqZWN0cy5TdHJpbmddO1xuZXhwb3J0IHR5cGUgQml0QXJyYXlNZXRyaWNzID0ga2V5b2YgdHlwZW9mIEF2YWlsYWJsZU1ldHJpY3NbRGlzdGFuY2VNZXRyaWNzU3ViamVjdHMuQml0QXJyYXldO1xuZXhwb3J0IHR5cGUgS25vd25NZXRyaWNzID0gU3RyaW5nTWV0cmljcyB8IEJpdEFycmF5TWV0cmljcyB8IFZlY3Rvck1ldHJpY3MgfFxuICBNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXMgfCBOdW1iZXJNZXRyaWNzTmFtZXMgfCBJbnRBcnJheU1ldHJpY3NOYW1lcztcblxuZXhwb3J0IHR5cGUgVmFsaWRUeXBlcyA9XG4gIHsgZGF0YTogc3RyaW5nW10sIG1ldHJpYzogU3RyaW5nTWV0cmljcyB8IE1tRGlzdGFuY2VGdW5jdGlvbnNOYW1lcyB9IHxcbiAgeyBkYXRhOiBWZWN0b3JbXSwgbWV0cmljOiBWZWN0b3JNZXRyaWNzIH0gfFxuICB7IGRhdGE6IEJpdEFycmF5W10sIG1ldHJpYzogQml0QXJyYXlNZXRyaWNzIH0gfFxuICB7IGRhdGE6IG51bWJlcltdLCBtZXRyaWM6IE51bWJlck1ldHJpY3NOYW1lcyB9O1xuXG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmdNZXRyaWMobmFtZTogS25vd25NZXRyaWNzKSB7XG4gIHJldHVybiBNZXRyaWNUb0RhdGFUeXBlW25hbWVdID09ICdTdHJpbmcnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNCaXRBcnJheU1ldHJpYyhuYW1lOiBLbm93bk1ldHJpY3MpIHtcbiAgcmV0dXJuIE1ldHJpY1RvRGF0YVR5cGVbbmFtZV0gPT0gJ0JpdEFycmF5Jztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVmVjdG9yTWV0cmljKG5hbWU6IEtub3duTWV0cmljcykge1xuICByZXR1cm4gTWV0cmljVG9EYXRhVHlwZVtuYW1lXSA9PSAnVmVjdG9yJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTWFjcm9Nb2xlY3VsZU1ldHJpYyhuYW1lOiBLbm93bk1ldHJpY3MpIHtcbiAgcmV0dXJuIE1ldHJpY1RvRGF0YVR5cGVbbmFtZV0gPT0gRGlzdGFuY2VNZXRyaWNzU3ViamVjdHMuTWFjcm9Nb2xlY3VsZS50b1N0cmluZygpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNOdW1lcmljTWV0cmljKG5hbWU6IEtub3duTWV0cmljcykge1xuICByZXR1cm4gTWV0cmljVG9EYXRhVHlwZVtuYW1lXSA9PSBEaXN0YW5jZU1ldHJpY3NTdWJqZWN0cy5OdW1iZXIudG9TdHJpbmcoKTtcbn1cblxuLyoqIE1hbmhhdHRhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byBzZXF1ZW5jZXMgKG1hdGNoIC0gMCwgbWlzbWF0Y2ggLSAxKSBub3JtYWxpemVkIGZvciBsZW5ndGguICovXG5leHBvcnQgZnVuY3Rpb24gbWFuaGF0dGFuRGlzdGFuY2UoczE6IHN0cmluZywgczI6IHN0cmluZyk6IG51bWJlciB7XG4gIGlmIChzMS5sZW5ndGggIT09IHMyLmxlbmd0aCkge1xuICAgIHJldHVybiAxO1xuICB9IGVsc2Uge1xuICAgIGxldCBkaXN0OiBudW1iZXIgPSAwO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgczEubGVuZ3RoOyBpKyspXG4gICAgICBkaXN0ICs9IHMxW2ldID09IHMyW2ldID8gMCA6IDE7XG4gICAgcmV0dXJuIGRpc3QgLyBzMS5sZW5ndGg7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhdGVnb3JpY2FsRGlzdGFuY2UoczE6IHN0cmluZywgczI6IHN0cmluZyk6IG51bWJlciB7XG4gIHJldHVybiBzMSA9PT0gczIgPyAwIDogMTtcbn1cblxuLyoqIFVuaWZpZWQgY2xhc3MgaW1wbGVtZW50aW5nIGRpZmZlcmVudCBzdHJpbmcgbWVhc3VyZXMuICovXG5leHBvcnQgY2xhc3MgTWVhc3VyZSB7XG4gIHByb3RlY3RlZCBtZXRob2Q6IEtub3duTWV0cmljcztcbiAgcHJvdGVjdGVkIGRhdGFUeXBlOiBBdmFpbGFibGVEYXRhVHlwZXM7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgTWVhc3VyZSB3aXRoIC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZCBNZXRob2QgdG8gY2FsY3VsYXRlIGRpc3RhbmNlIGJldHdlZW4gc3RyaW5ncy5cbiAgICogQG1lbWJlcm9mIE1lYXN1cmVyXG4gICAqL1xuICBjb25zdHJ1Y3RvcihtZXRob2Q6IEtub3duTWV0cmljcykge1xuICAgIHRoaXMubWV0aG9kID0gbWV0aG9kO1xuICAgIHRoaXMuZGF0YVR5cGUgPSBNZXRyaWNUb0RhdGFUeXBlW21ldGhvZF0gYXMgQXZhaWxhYmxlRGF0YVR5cGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgY3VzdG9tIHN0cmluZyBkaXN0YW5jZSBmdW5jdGlvbiBzcGVjaWZpZWQuXG4gICAqIEBwYXJhbSB7b3B0c30gb3B0cyBPcHRpb25zIGZvciB0aGUgbWVhc3VyZS4gdXNlZCBmb3IgbWFjcm9tb2xlY3VsZSBkaXN0YW5jZXNcbiAgICogQHJldHVybiB7RGlzdGFuY2VNZXRyaWN9IENhbGxiYWNrIG9mIHRoZSBtZWFzdXJlIGNob3Nlbi5cbiAgICogQG1lbWJlcm9mIE1lYXN1cmVyXG4gICAqL1xuICBwdWJsaWMgZ2V0TWVhc3VyZShvcHRzPzogYW55KTogRGlzdGFuY2VNZXRyaWMge1xuICAgIGNvbnN0IGRpY3Q6IHsgW2tleTogc3RyaW5nXTpcbiAgICAgIHtba2V5Mjogc3RyaW5nXTogRGlzdGFuY2VNZXRyaWMgfCAoKG9wdHM6IGFueSkgPT4gRGlzdGFuY2VNZXRyaWMpfVxuICAgIH0gPSBBdmFpbGFibGVNZXRyaWNzO1xuICAgIGlmICghZGljdC5oYXNPd25Qcm9wZXJ0eSh0aGlzLmRhdGFUeXBlKSB8fCAhZGljdFt0aGlzLmRhdGFUeXBlXS5oYXNPd25Qcm9wZXJ0eSh0aGlzLm1ldGhvZCkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbWVhc3VyZSAke3RoaXMubWV0aG9kfSBmb3IgZGF0YSB0eXBlICR7dGhpcy5kYXRhVHlwZX1gKTtcbiAgICByZXR1cm4gaXNNYWNyb01vbGVjdWxlTWV0cmljKHRoaXMubWV0aG9kKSB8fCBpc051bWVyaWNNZXRyaWModGhpcy5tZXRob2QpID9cbiAgICAgIChkaWN0W3RoaXMuZGF0YVR5cGVdW3RoaXMubWV0aG9kXSBhcyAoKG9wdHM6IGFueSkgPT4gRGlzdGFuY2VNZXRyaWMpKShvcHRzKSA6XG4gICAgICBkaWN0W3RoaXMuZGF0YVR5cGVdW3RoaXMubWV0aG9kXSBhcyBEaXN0YW5jZU1ldHJpYztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGN1c3RvbSBzdHJpbmcgZGlzdGFuY2UgYnkgdGhlIGdpdmVuIGRhdGEgdHlwZS5cbiAgICogQHBhcmFtIHtBdmFpbGFibGVEYXRhVHlwZXN9IGRhdGFUeXBlIE1ldHJpYydzIGRhdGEgdHlwZVxuICAgKiBAcmV0dXJuIHtzdHJpbmdbXX0gTWV0cmljIG5hbWVzIHdoaWNoIGV4cGVjdHMgdGhlIGdpdmVuIGRhdGEgdHlwZVxuICAgKiBAbWVtYmVyb2YgTWVhc3VyZXJcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0TWV0cmljQnlEYXRhVHlwZShkYXRhVHlwZTogQXZhaWxhYmxlRGF0YVR5cGVzKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhBdmFpbGFibGVNZXRyaWNzW2RhdGFUeXBlXSk7XG4gIH1cblxuICAvKiogUmV0dXJucyBtZXRyaWMgbmFtZXMgYXZhaWxhYmxlLlxuICAgKiBAbWVtYmVyb2YgTWVhc3VyZXJcbiAgICovXG4gIHN0YXRpYyBnZXQgYXZhaWxhYmxlTWVhc3VyZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhBdmFpbGFibGVNZXRyaWNzKTtcbiAgfVxufVxuIl19","export var DistanceAggregationMethods;\n(function (DistanceAggregationMethods) {\n DistanceAggregationMethods[\"EUCLIDEAN\"] = \"EUCLIDEAN\";\n DistanceAggregationMethods[\"MANHATTAN\"] = \"MANHATTAN\";\n})(DistanceAggregationMethods || (DistanceAggregationMethods = {}));\n;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQU4sSUFBWSwwQkFHVDtBQUhILFdBQVksMEJBQTBCO0lBQ2xDLHFEQUF1QixDQUFBO0lBQ3ZCLHFEQUF1QixDQUFBO0FBQ3pCLENBQUMsRUFIUywwQkFBMEIsS0FBMUIsMEJBQTBCLFFBR25DO0FBQUEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBlbnVtIERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzIHtcbiAgICBFVUNMSURFQU4gPSAnRVVDTElERUFOJyxcbiAgICBNQU5IQVRUQU4gPSAnTUFOSEFUVEFOJyxcbiAgfTtcblxuZXhwb3J0IHR5cGUgRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZCA9IGtleW9mIHR5cGVvZiBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kcztcbiJdfQ==","import { DistanceAggregationMethods } from './types';\nexport const isNil = (x) => x === null || x === undefined;\nexport function insertSmaller(distancesAr, indexes, num, index) {\n if (num > distancesAr[distancesAr.length - 1])\n return;\n const newPosition = distancesAr.findIndex((v) => num < v);\n distancesAr.pop();\n distancesAr.splice(newPosition, 0, num);\n indexes.pop();\n indexes.splice(newPosition, 0, index);\n}\nexport function insertLarger(distancesAr, indexes, num, index) {\n if (num < distancesAr[distancesAr.length - 1])\n return;\n const newPosition = distancesAr.findIndex((v) => num > v);\n distancesAr.pop();\n distancesAr.splice(newPosition, 0, num);\n indexes.pop();\n indexes.splice(newPosition, 0, index);\n}\nexport function getAggregationFunction(aggregationMethod, weights) {\n switch (aggregationMethod) {\n case DistanceAggregationMethods.MANHATTAN:\n return (vs) => vs.reduce((acc, val, idx) => acc + val * weights[idx], 0);\n default:\n return (vs) => {\n // euclidean\n const sum = vs.reduce((acc, val, idx) => acc + (val * weights[idx]) ** 2, 0);\n return Math.sqrt(sum);\n };\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ1dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQTRCLDBCQUEwQixFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRTlFLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssU0FBUyxDQUFDO0FBRS9ELE1BQU0sVUFBVSxhQUFhLENBQUMsV0FBcUIsRUFBRSxPQUFpQixFQUFFLEdBQVcsRUFBRSxLQUFhO0lBQ2hHLElBQUksR0FBRyxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFDLENBQUMsQ0FBQztRQUN6QyxPQUFPO0lBRVQsTUFBTSxXQUFXLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzFELFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNsQixXQUFXLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDeEMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ2QsT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3hDLENBQUM7QUFFRCxNQUFNLFVBQVUsWUFBWSxDQUFDLFdBQXFCLEVBQUUsT0FBaUIsRUFBRSxHQUFXLEVBQUUsS0FBYTtJQUMvRixJQUFJLEdBQUcsR0FBRyxXQUFXLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBQyxDQUFDLENBQUM7UUFDekMsT0FBTztJQUVULE1BQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMxRCxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDbEIsV0FBVyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3hDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNkLE9BQU8sQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN4QyxDQUFDO0FBRUQsTUFBTSxVQUFVLHNCQUFzQixDQUNwQyxpQkFBNEMsRUFBRSxPQUFpQjtJQUUvRCxRQUFRLGlCQUFpQixFQUFFO1FBQ3pCLEtBQUssMEJBQTBCLENBQUMsU0FBUztZQUN2QyxPQUFPLENBQUMsRUFBWSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3JGO1lBQ0UsT0FBTyxDQUFDLEVBQVksRUFBRSxFQUFFO2dCQUN0QixZQUFZO2dCQUNaLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDN0UsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3hCLENBQUMsQ0FBQztLQUNMO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZCwgRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZHN9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgY29uc3QgaXNOaWwgPSAoeDogYW55KSA9PiB4ID09PSBudWxsIHx8IHggPT09IHVuZGVmaW5lZDtcblxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydFNtYWxsZXIoZGlzdGFuY2VzQXI6IG51bWJlcltdLCBpbmRleGVzOiBudW1iZXJbXSwgbnVtOiBudW1iZXIsIGluZGV4OiBudW1iZXIpIHtcbiAgaWYgKG51bSA+IGRpc3RhbmNlc0FyW2Rpc3RhbmNlc0FyLmxlbmd0aC0xXSlcbiAgICByZXR1cm47XG5cbiAgY29uc3QgbmV3UG9zaXRpb24gPSBkaXN0YW5jZXNBci5maW5kSW5kZXgoKHYpID0+IG51bSA8IHYpO1xuICBkaXN0YW5jZXNBci5wb3AoKTtcbiAgZGlzdGFuY2VzQXIuc3BsaWNlKG5ld1Bvc2l0aW9uLCAwLCBudW0pO1xuICBpbmRleGVzLnBvcCgpO1xuICBpbmRleGVzLnNwbGljZShuZXdQb3NpdGlvbiwgMCwgaW5kZXgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0TGFyZ2VyKGRpc3RhbmNlc0FyOiBudW1iZXJbXSwgaW5kZXhlczogbnVtYmVyW10sIG51bTogbnVtYmVyLCBpbmRleDogbnVtYmVyKSB7XG4gIGlmIChudW0gPCBkaXN0YW5jZXNBcltkaXN0YW5jZXNBci5sZW5ndGgtMV0pXG4gICAgcmV0dXJuO1xuXG4gIGNvbnN0IG5ld1Bvc2l0aW9uID0gZGlzdGFuY2VzQXIuZmluZEluZGV4KCh2KSA9PiBudW0gPiB2KTtcbiAgZGlzdGFuY2VzQXIucG9wKCk7XG4gIGRpc3RhbmNlc0FyLnNwbGljZShuZXdQb3NpdGlvbiwgMCwgbnVtKTtcbiAgaW5kZXhlcy5wb3AoKTtcbiAgaW5kZXhlcy5zcGxpY2UobmV3UG9zaXRpb24sIDAsIGluZGV4KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFnZ3JlZ2F0aW9uRnVuY3Rpb24oXG4gIGFnZ3JlZ2F0aW9uTWV0aG9kOiBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kLCB3ZWlnaHRzOiBudW1iZXJbXVxuKTogKHZhbHVlczogbnVtYmVyW10pID0+IG51bWJlciB7XG4gIHN3aXRjaCAoYWdncmVnYXRpb25NZXRob2QpIHtcbiAgICBjYXNlIERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzLk1BTkhBVFRBTjpcbiAgICAgIHJldHVybiAodnM6IG51bWJlcltdKSA9PiB2cy5yZWR1Y2UoKGFjYywgdmFsLCBpZHgpID0+IGFjYyArIHZhbCAqIHdlaWdodHNbaWR4XSwgMCk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAodnM6IG51bWJlcltdKSA9PiB7XG4gICAgICAgIC8vIGV1Y2xpZGVhblxuICAgICAgICBjb25zdCBzdW0gPSB2cy5yZWR1Y2UoKGFjYywgdmFsLCBpZHgpID0+IGFjYyArICh2YWwgKiB3ZWlnaHRzW2lkeF0pICoqIDIsIDApO1xuICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KHN1bSk7XG4gICAgICB9O1xuICB9XG59XG4iXX0=","import { DistanceAggregationMethods } from './types';\nexport class DistanceMatrixService {\n _workers;\n _workerCount;\n _terminateOnComplete;\n constructor(useConcurrentWorkers = true, terminateOnComplete = true) {\n const threadCount = navigator.hardwareConcurrency;\n this._workerCount = useConcurrentWorkers ? Math.max(threadCount - 2, 1) : 1;\n this._workers = new Array(this._workerCount).fill(null)\n .map(() => new Worker(new URL('./distance-matrix-worker', import.meta.url)));\n this._terminateOnComplete = terminateOnComplete;\n }\n ;\n async calc(values, fnName, normalize = true, opts) {\n return await this.calcMulti([values], [fnName], normalize, [opts ?? {}], [1], DistanceAggregationMethods.MANHATTAN);\n }\n async calcMulti(values, fnNames, normalize = true, opts = [{}], weights = [1], aggregationMethod = DistanceAggregationMethods.MANHATTAN) {\n if (values.length < 1)\n throw new Error('values must contain at least one array');\n if (fnNames.length !== values.length || opts.length !== values.length || weights.length !== values.length)\n throw new Error('values, fnNames, weights and opts must have the same length');\n return new Promise(async (resolve, reject) => {\n try {\n const len = values[0].length;\n const promises = new Array(this._workerCount);\n const totalLength = len * (len - 1) / 2; // size of reduced distance matrix\n this._workerCount = Math.min(this._workerCount, totalLength);\n const chunkSize = totalLength / this._workerCount;\n const distanceMatrix = new Float32Array(totalLength);\n let endRow = 0;\n let endCol = 1;\n // minmax for normalization\n let lmin = 0;\n let lmax = Number.MIN_VALUE;\n for (let i = 0; i < this._workerCount; i++) {\n const start = Math.floor(i * chunkSize);\n const end = (i === this._workerCount - 1) ? totalLength : Math.floor((i + 1) * chunkSize);\n const startRow = endRow;\n const startCol = endCol;\n if (i !== this._workerCount - 1) {\n // These formulas map the linear index to the upper triangular matrix indices\n endRow = len - 2 - Math.floor(Math.sqrt(-8 * end + 4 * len * (len - 1) - 7) / 2 - 0.5);\n endCol = end - len * endRow + Math.floor((endRow + 1) * (endRow + 2) / 2);\n }\n this._workers[i].postMessage({ values, fnNames, startRow, startCol, chunckSize: end - start, opts, weights, aggregationMethod });\n promises[i] = new Promise((resolveWorker, rejectWorker) => {\n this._workers[i].onmessage = ({ data: { error, distanceMatrixData, min, max } }) => {\n this._terminateOnComplete && setTimeout(() => this._workers[i].terminate());\n if (error) {\n rejectWorker(error);\n }\n else {\n distanceMatrix.set(distanceMatrixData, start);\n if (min < lmin)\n lmin = min;\n if (max > lmax)\n lmax = max;\n resolveWorker();\n }\n };\n });\n }\n await Promise.all(promises);\n if (normalize)\n distanceMatrix.forEach((value, index) => { distanceMatrix[index] = (value - lmin) / (lmax - lmin); });\n resolve(distanceMatrix);\n }\n catch (e) {\n reject(e);\n }\n });\n }\n terminate() {\n this._workers.forEach((worker) => worker.terminate());\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzdGFuY2UtbWF0cml4LXNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJkaXN0YW5jZS1tYXRyaXgtc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQTRCLDBCQUEwQixFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRTlFLE1BQU0sT0FBTyxxQkFBcUI7SUFDdEIsUUFBUSxDQUFXO0lBQ25CLFlBQVksQ0FBUztJQUNyQixvQkFBb0IsQ0FBVTtJQUN0QyxZQUFtQixvQkFBb0IsR0FBRyxJQUFJLEVBQUUsbUJBQW1CLEdBQUcsSUFBSTtRQUN4RSxNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsbUJBQW1CLENBQUM7UUFDbEQsSUFBSSxDQUFDLFlBQVksR0FBRyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUUsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQzthQUNwRCxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsMEJBQTBCLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0UsSUFBSSxDQUFDLG9CQUFvQixHQUFHLG1CQUFtQixDQUFDO0lBQ2xELENBQUM7SUFBQSxDQUFDO0lBRUssS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFrQixFQUFFLE1BQW9CLEVBQ3hELFNBQVMsR0FBRyxJQUFJLEVBQUUsSUFBeUI7UUFDM0MsT0FBTyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLFNBQVMsRUFDdkQsQ0FBQyxJQUFJLElB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QzVCLElBQUksU0FBUztvQkFDWCxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hHLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQzthQUN6QjtZQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNWLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNYO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sU0FBUztRQUNkLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUN4RCxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0tub3duTWV0cmljc30gZnJvbSAnLi4vdHlwZWQtbWV0cmljcyc7XG5pbXBvcnQge0Rpc3RhbmNlQWdncmVnYXRpb25NZXRob2QsIERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIERpc3RhbmNlTWF0cml4U2VydmljZSB7XG4gICAgcHJpdmF0ZSBfd29ya2VyczogV29ya2VyW107XG4gICAgcHJpdmF0ZSBfd29ya2VyQ291bnQ6IG51bWJlcjtcbiAgICBwcml2YXRlIF90ZXJtaW5hdGVPbkNvbXBsZXRlOiBib29sZWFuO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcih1c2VDb25jdXJyZW50V29ya2VycyA9IHRydWUsIHRlcm1pbmF0ZU9uQ29tcGxldGUgPSB0cnVlKSB7XG4gICAgICBjb25zdCB0aHJlYWRDb3VudCA9IG5hdmlnYXRvci5oYXJkd2FyZUNvbmN1cnJlbmN5O1xuICAgICAgdGhpcy5fd29ya2VyQ291bnQgPSB1c2VDb25jdXJyZW50V29ya2VycyA/IE1hdGgubWF4KHRocmVhZENvdW50IC0gMiwgMSkgOiAxO1xuICAgICAgdGhpcy5fd29ya2VycyA9IG5ldyBBcnJheSh0aGlzLl93b3JrZXJDb3VudCkuZmlsbChudWxsKVxuICAgICAgICAubWFwKCgpID0+IG5ldyBXb3JrZXIobmV3IFVSTCgnLi9kaXN0YW5jZS1tYXRyaXgtd29ya2VyJywgaW1wb3J0Lm1ldGEudXJsKSkpO1xuICAgICAgdGhpcy5fdGVybWluYXRlT25Db21wbGV0ZSA9IHRlcm1pbmF0ZU9uQ29tcGxldGU7XG4gICAgfTtcblxuICAgIHB1YmxpYyBhc3luYyBjYWxjKHZhbHVlczogQXJyYXk8YW55PiwgZm5OYW1lOiBLbm93bk1ldHJpY3MsXG4gICAgICBub3JtYWxpemUgPSB0cnVlLCBvcHRzPzoge1tfOiBzdHJpbmddOiBhbnl9KTogUHJvbWlzZTxGbG9hdDMyQXJyYXk+IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNhbGNNdWx0aShbdmFsdWVzXSwgW2ZuTmFtZV0sIG5vcm1hbGl6ZSxcbiAgICAgICAgW29wdHMgPz8ge31dLCBbMV0sIERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzLk1BTkhBVFRBTik7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGNhbGNNdWx0aShcbiAgICAgIHZhbHVlczogQXJyYXk8YW55PltdLCBmbk5hbWVzOiBLbm93bk1ldHJpY3NbXSxcbiAgICAgIG5vcm1hbGl6ZSA9IHRydWUsIG9wdHM6IHtbXzogc3RyaW5nXTogYW55fVtdID0gW3t9XSxcbiAgICAgIHdlaWdodHM6IG51bWJlcltdID0gWzFdLCBhZ2dyZWdhdGlvbk1ldGhvZDogRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZCA9IERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzLk1BTkhBVFRBTlxuICAgICk6IFByb21pc2U8RmxvYXQzMkFycmF5PiB7XG4gICAgICBpZiAodmFsdWVzLmxlbmd0aCA8IDEpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndmFsdWVzIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgYXJyYXknKTtcbiAgICAgIGlmIChmbk5hbWVzLmxlbmd0aCAhPT0gdmFsdWVzLmxlbmd0aCB8fCBvcHRzLmxlbmd0aCAhPT0gdmFsdWVzLmxlbmd0aCB8fCB3ZWlnaHRzLmxlbmd0aCAhPT0gdmFsdWVzLmxlbmd0aClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd2YWx1ZXMsIGZuTmFtZXMsIHdlaWdodHMgYW5kIG9wdHMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCcpO1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBsZW4gPSB2YWx1ZXNbMF0ubGVuZ3RoO1xuICAgICAgICAgIGNvbnN0IHByb21pc2VzID0gbmV3IEFycmF5PFByb21pc2U8dm9pZD4+KHRoaXMuX3dvcmtlckNvdW50KTtcbiAgICAgICAgICBjb25zdCB0b3RhbExlbmd0aCA9IGxlbiAqIChsZW4gLSAxKSAvIDI7IC8vIHNpemUgb2YgcmVkdWNlZCBkaXN0YW5jZSBtYXRyaXhcbiAgICAgICAgICB0aGlzLl93b3JrZXJDb3VudCA9IE1hdGgubWluKHRoaXMuX3dvcmtlckNvdW50LCB0b3RhbExlbmd0aCk7XG4gICAgICAgICAgY29uc3QgY2h1bmtTaXplID0gdG90YWxMZW5ndGggLyB0aGlzLl93b3JrZXJDb3VudDtcbiAgICAgICAgICBjb25zdCBkaXN0YW5jZU1hdHJpeCA9IG5ldyBGbG9hdDMyQXJyYXkodG90YWxMZW5ndGgpO1xuICAgICAgICAgIGxldCBlbmRSb3cgPSAwO1xuICAgICAgICAgIGxldCBlbmRDb2wgPSAxO1xuICAgICAgICAgIC8vIG1pbm1heCBmb3Igbm9ybWFsaXphdGlvblxuICAgICAgICAgIGxldCBsbWluID0gMDtcbiAgICAgICAgICBsZXQgbG1heCA9IE51bWJlci5NSU5fVkFMVUU7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl93b3JrZXJDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IE1hdGguZmxvb3IoaSAqIGNodW5rU2l6ZSk7XG4gICAgICAgICAgICBjb25zdCBlbmQgPSAoaSA9PT0gdGhpcy5fd29ya2VyQ291bnQgLSAxKSA/IHRvdGFsTGVuZ3RoIDogTWF0aC5mbG9vcigoaSArIDEpICogY2h1bmtTaXplKTtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0Um93ID0gZW5kUm93O1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRDb2wgPSBlbmRDb2w7XG4gICAgICAgICAgICBpZiAoaSAhPT0gdGhpcy5fd29ya2VyQ291bnQgLSAxKSB7XG4gICAgICAgICAgICAgIC8vIFRoZXNlIGZvcm11bGFzIG1hcCB0aGUgbGluZWFyIGluZGV4IHRvIHRoZSB1cHBlciB0cmlhbmd1bGFyIG1hdHJpeCBpbmRpY2VzXG4gICAgICAgICAgICAgIGVuZFJvdyA9IGxlbiAtIDIgLSBNYXRoLmZsb29yKE1hdGguc3FydCgtOCAqIGVuZCArIDQgKiBsZW4gKiAobGVuIC0gMSkgLSA3KSAvIDIgLSAwLjUpO1xuICAgICAgICAgICAgICBlbmRDb2wgPSBlbmQgLSBsZW4gKiBlbmRSb3cgKyBNYXRoLmZsb29yKChlbmRSb3cgKyAxKSAqIChlbmRSb3cgKyAyKSAvIDIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fd29ya2Vyc1tpXS5wb3N0TWVzc2FnZShcbiAgICAgICAgICAgICAge3ZhbHVlcywgZm5OYW1lcywgc3RhcnRSb3csIHN0YXJ0Q29sLCBjaHVuY2tTaXplOiBlbmQgLSBzdGFydCwgb3B0cywgd2VpZ2h0cywgYWdncmVnYXRpb25NZXRob2R9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcHJvbWlzZXNbaV0gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZVdvcmtlciwgcmVqZWN0V29ya2VyKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuX3dvcmtlcnNbaV0ub25tZXNzYWdlID0gKHtkYXRhOiB7ZXJyb3IsIGRpc3RhbmNlTWF0cml4RGF0YSwgbWluLCBtYXh9fSk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmF0ZU9uQ29tcGxldGUgJiYgc2V0VGltZW91dCgoKSA9PiB0aGlzLl93b3JrZXJzW2ldLnRlcm1pbmF0ZSgpKTtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgIHJlamVjdFdvcmtlcihlcnJvcik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGRpc3RhbmNlTWF0cml4LnNldChkaXN0YW5jZU1hdHJpeERhdGEsIHN0YXJ0KTtcbiAgICAgICAgICAgICAgICAgIGlmIChtaW4gPCBsbWluKVxuICAgICAgICAgICAgICAgICAgICBsbWluID0gbWluO1xuICAgICAgICAgICAgICAgICAgaWYgKG1heCA+IGxtYXgpXG4gICAgICAgICAgICAgICAgICAgIGxtYXggPSBtYXg7XG4gICAgICAgICAgICAgICAgICByZXNvbHZlV29ya2VyKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICAgICAgICBpZiAobm9ybWFsaXplKVxuICAgICAgICAgICAgZGlzdGFuY2VNYXRyaXguZm9yRWFjaCgodmFsdWUsIGluZGV4KSA9PiB7IGRpc3RhbmNlTWF0cml4W2luZGV4XSA9ICh2YWx1ZSAtIGxtaW4pIC8gKGxtYXggLSBsbWluKTsgfSk7XG4gICAgICAgICAgcmVzb2x2ZShkaXN0YW5jZU1hdHJpeCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyB0ZXJtaW5hdGUoKTogdm9pZCB7XG4gICAgICB0aGlzLl93b3JrZXJzLmZvckVhY2goKHdvcmtlcikgPT4gd29ya2VyLnRlcm1pbmF0ZSgpKTtcbiAgICB9XG59XG4iXX0=","/**\n * @license\n *\n * Copyright 2019 Google LLC. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ==============================================================================\n */\n/**\n * Simple random integer function\n */\nexport function tauRandInt(n, random) {\n return Math.floor(random() * n);\n}\n/**\n * Simple random float function\n */\nexport function tauRand(random) {\n return random();\n}\n/**\n * Compute the (standard l2) norm of a vector.\n */\nexport function norm(vec) {\n let result = 0;\n for (const item of vec)\n result += item ** 2;\n return Math.sqrt(result);\n}\n/**\n * Creates an empty array (filled with undefined)\n */\nexport function empty(n) {\n const output = [];\n for (let i = 0; i < n; i++)\n output.push(undefined);\n return output;\n}\n/**\n * Creates an array filled with index values\n */\nexport function range(n) {\n return empty(n).map((_, i) => i);\n}\n/**\n * Creates an array filled with a specific value\n */\nexport function filled(n, v) {\n return empty(n).map(() => v);\n}\n/**\n * Creates an array filled with zeros\n */\nexport function zeros(n) {\n return filled(n, 0);\n}\n/**\n * Creates an array filled with ones\n */\nexport function ones(n) {\n return filled(n, 1);\n}\n/**\n * Creates an array from a to b, of length len, inclusive\n */\nexport function linear(a, b, len) {\n return empty(len).map((_, i) => {\n return a + i * ((b - a) / (len - 1));\n });\n}\n/**\n * Returns the sum of an array\n */\nexport function sum(input) {\n return input.reduce((sum, val) => sum + val);\n}\n/**\n * Returns the mean of an array\n */\nexport function mean(input) {\n return sum(input) / input.length;\n}\n/**\n * Returns the maximum value of an array\n */\nexport function max(input) {\n let max = 0;\n for (let i = 0; i < input.length; i++)\n max = input[i] > max ? input[i] : max;\n return max;\n}\n/**\n * Returns the maximum value of a 2d array\n */\nexport function max2d(input) {\n let max = 0;\n for (let i = 0; i < input.length; i++) {\n for (let j = 0; j < input[i].length; j++)\n max = input[i][j] > max ? input[i][j] : max;\n }\n return max;\n}\n/**\n * Generate nSamples many integers from 0 to poolSize such that no\n * integer is selected twice. The duplication constraint is achieved via\n * rejection sampling.\n */\nexport function rejectionSample(nSamples, poolSize, random) {\n const result = zeros(nSamples);\n for (let i = 0; i < nSamples; i++) {\n let rejectSample = true;\n while (rejectSample) {\n const j = tauRandInt(poolSize, random);\n let broken = false;\n for (let k = 0; k < i; k++) {\n if (j === result[k]) {\n broken = true;\n break;\n }\n }\n if (!broken)\n rejectSample = false;\n result[i] = j;\n }\n }\n return result;\n}\n/**\n * Reshapes a 1d array into a 2D of given dimensions.\n */\nexport function reshape2d(x, a, b) {\n const rows = [];\n // let count = 0;\n let index = 0;\n if (x.length !== a * b)\n throw new Error('Array dimensions must match input length.');\n for (let i = 0; i < a; i++) {\n const col = [];\n for (let j = 0; j < b; j++) {\n col.push(x[index]);\n index += 1;\n }\n rows.push(col);\n // count += 1;\n }\n return rows;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ1dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFJSDs7R0FFRztBQUNILE1BQU0sVUFBVSxVQUFVLENBQUMsQ0FBUyxFQUFFLE1BQWdCO0lBQ3BELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNsQyxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsT0FBTyxDQUFDLE1BQWdCO0lBQ3RDLE9BQU8sTUFBTSxFQUFFLENBQUM7QUFDbEIsQ0FBQztBQUNEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLElBQUksQ0FBQyxHQUFhO0lBQ2hDLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztJQUNmLEtBQUssTUFBTSxJQUFJLElBQUksR0FBRztRQUNwQixNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQztJQUV0QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDM0IsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLEtBQUssQ0FBQyxDQUFTO0lBQzdCLE1BQU0sTUFBTSxHQUFnQixFQUFFLENBQUM7SUFDL0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUU7UUFDeEIsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUV6QixPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsS0FBSyxDQUFDLENBQVM7SUFDN0IsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkMsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxV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LElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKlxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1JhbmRvbUZufSBmcm9tICcuL3VtYXAnO1xuXG4vKipcbiAqIFNpbXBsZSByYW5kb20gaW50ZWdlciBmdW5jdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gdGF1UmFuZEludChuOiBudW1iZXIsIHJhbmRvbTogUmFuZG9tRm4pIHtcbiAgcmV0dXJuIE1hdGguZmxvb3IocmFuZG9tKCkgKiBuKTtcbn1cblxuLyoqXG4gKiBTaW1wbGUgcmFuZG9tIGZsb2F0IGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0YXVSYW5kKHJhbmRvbTogUmFuZG9tRm4pIHtcbiAgcmV0dXJuIHJhbmRvbSgpO1xufVxuLyoqXG4gKiBDb21wdXRlIHRoZSAoc3RhbmRhcmQgbDIpIG5vcm0gb2YgYSB2ZWN0b3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtKHZlYzogbnVtYmVyW10pIHtcbiAgbGV0IHJlc3VsdCA9IDA7XG4gIGZvciAoY29uc3QgaXRlbSBvZiB2ZWMpXG4gICAgcmVzdWx0ICs9IGl0ZW0gKiogMjtcblxuICByZXR1cm4gTWF0aC5zcXJ0KHJlc3VsdCk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBlbXB0eSBhcnJheSAoZmlsbGVkIHdpdGggdW5kZWZpbmVkKVxuICovXG5leHBvcnQgZnVuY3Rpb24gZW1wdHkobjogbnVtYmVyKTogdW5kZWZpbmVkW10ge1xuICBjb25zdCBvdXRwdXQ6IHVuZGVmaW5lZFtdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKVxuICAgIG91dHB1dC5wdXNoKHVuZGVmaW5lZCk7XG5cbiAgcmV0dXJuIG91dHB1dDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IGZpbGxlZCB3aXRoIGluZGV4IHZhbHVlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmFuZ2UobjogbnVtYmVyKTogbnVtYmVyW10ge1xuICByZXR1cm4gZW1wdHkobikubWFwKChfLCBpKSA9PiBpKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IGZpbGxlZCB3aXRoIGEgc3BlY2lmaWMgdmFsdWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbGxlZChuOiBudW1iZXIsIHY6IG51bWJlcik6IG51bWJlcltdIHtcbiAgcmV0dXJuIGVtcHR5KG4pLm1hcCgoKSA9PiB2KTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IGZpbGxlZCB3aXRoIHplcm9zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB6ZXJvcyhuOiBudW1iZXIpOiBudW1iZXJbXSB7XG4gIHJldHVybiBmaWxsZWQobiwgMCk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBmaWxsZWQgd2l0aCBvbmVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbmVzKG46IG51bWJlcik6IG51bWJlcltdIHtcbiAgcmV0dXJuIGZpbGxlZChuLCAxKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IGZyb20gYSB0byBiLCBvZiBsZW5ndGggbGVuLCBpbmNsdXNpdmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpbmVhcihhOiBudW1iZXIsIGI6IG51bWJlciwgbGVuOiBudW1iZXIpOiBudW1iZXJbXSB7XG4gIHJldHVybiBlbXB0eShsZW4pLm1hcCgoXywgaSkgPT4ge1xuICAgIHJldHVybiBhICsgaSAqICgoYiAtIGEpIC8gKGxlbiAtIDEpKTtcbiAgfSk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgc3VtIG9mIGFuIGFycmF5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdW0oaW5wdXQ6IG51bWJlcltdKTogbnVtYmVyIHtcbiAgcmV0dXJuIGlucHV0LnJlZHVjZSgoc3VtLCB2YWwpID0+IHN1bSArIHZhbCk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbWVhbiBvZiBhbiBhcnJheVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVhbihpbnB1dDogbnVtYmVyW10pOiBudW1iZXIge1xuICByZXR1cm4gc3VtKGlucHV0KSAvIGlucHV0Lmxlbmd0aDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtYXhpbXVtIHZhbHVlIG9mIGFuIGFycmF5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXgoaW5wdXQ6IG51bWJlcltdKTogbnVtYmVyIHtcbiAgbGV0IG1heCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyBpKyspXG4gICAgbWF4ID0gaW5wdXRbaV0gPiBtYXggPyBpbnB1dFtpXSA6IG1heDtcblxuICByZXR1cm4gbWF4O1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIG1heGltdW0gdmFsdWUgb2YgYSAyZCBhcnJheVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWF4MmQoaW5wdXQ6IG51bWJlcltdW10pOiBudW1iZXIge1xuICBsZXQgbWF4ID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7IGkrKykge1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgaW5wdXRbaV0ubGVuZ3RoOyBqKyspXG4gICAgICBtYXggPSBpbnB1dFtpXVtqXSA+IG1heCA/IGlucHV0W2ldW2pdIDogbWF4O1xuICB9XG4gIHJldHVybiBtYXg7XG59XG5cbi8qKlxuICogR2VuZXJhdGUgblNhbXBsZXMgbWFueSBpbnRlZ2VycyBmcm9tIDAgdG8gcG9vbFNpemUgc3VjaCB0aGF0IG5vXG4gKiBpbnRlZ2VyIGlzIHNlbGVjdGVkIHR3aWNlLiBUaGUgZHVwbGljYXRpb24gY29uc3RyYWludCBpcyBhY2hpZXZlZCB2aWFcbiAqIHJlamVjdGlvbiBzYW1wbGluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlamVjdGlvblNhbXBsZShcbiAgblNhbXBsZXM6IG51bWJlcixcbiAgcG9vbFNpemU6IG51bWJlcixcbiAgcmFuZG9tOiBSYW5kb21GblxuKTogbnVtYmVyW10ge1xuICBjb25zdCByZXN1bHQgPSB6ZXJvcyhuU2FtcGxlcyk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgblNhbXBsZXM7IGkrKykge1xuICAgIGxldCByZWplY3RTYW1wbGUgPSB0cnVlO1xuICAgIHdoaWxlIChyZWplY3RTYW1wbGUpIHtcbiAgICAgIGNvbnN0IGogPSB0YXVSYW5kSW50KHBvb2xTaXplLCByYW5kb20pO1xuICAgICAgbGV0IGJyb2tlbiA9IGZhbHNlO1xuICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBpOyBrKyspIHtcbiAgICAgICAgaWYgKGogPT09IHJlc3VsdFtrXSkge1xuICAgICAgICAgIGJyb2tlbiA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghYnJva2VuKVxuICAgICAgICByZWplY3RTYW1wbGUgPSBmYWxzZTtcblxuICAgICAgcmVzdWx0W2ldID0gajtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBSZXNoYXBlcyBhIDFkIGFycmF5IGludG8gYSAyRCBvZiBnaXZlbiBkaW1lbnNpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzaGFwZTJkPFQ+KHg6IFRbXSwgYTogbnVtYmVyLCBiOiBudW1iZXIpOiBUW11bXSB7XG4gIGNvbnN0IHJvd3M6IFRbXVtdID0gW107XG4gIC8vIGxldCBjb3VudCA9IDA7XG4gIGxldCBpbmRleCA9IDA7XG5cbiAgaWYgKHgubGVuZ3RoICE9PSBhICogYilcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0FycmF5IGRpbWVuc2lvbnMgbXVzdCBtYXRjaCBpbnB1dCBsZW5ndGguJyk7XG5cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGE7IGkrKykge1xuICAgIGNvbnN0IGNvbDogVFtdID0gW107XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBiOyBqKyspIHtcbiAgICAgIGNvbC5wdXNoKHhbaW5kZXhdKTtcbiAgICAgIGluZGV4ICs9IDE7XG4gICAgfVxuICAgIHJvd3MucHVzaChjb2wpO1xuICAgIC8vIGNvdW50ICs9IDE7XG4gIH1cbiAgcmV0dXJuIHJvd3M7XG59XG4iXX0=","/**\n * @license\n *\n * Copyright 2019 Google LLC. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ==============================================================================\n */\nimport * as utils from './utils';\n/**\n * Constructor for the heap objects. The heaps are used\n * for approximate nearest neighbor search, maintaining a list of potential\n * neighbors sorted by their distance. We also flag if potential neighbors\n * are newly added to the list or not. Internally this is stored as\n * a single array; the first axis determines whether we are looking at the\n * array of candidate indices, the array of distances, or the flag array for\n * whether elements are new or not. Each of these arrays are of shape\n * (``nPoints``, ``size``)\n */\nexport function makeHeap(nPoints, size) {\n const makeArrays = (fillValue) => {\n return utils.empty(nPoints).map(() => {\n return utils.filled(size, fillValue);\n });\n };\n const heap = [];\n heap.push(makeArrays(-1));\n heap.push(makeArrays(Infinity));\n heap.push(makeArrays(0));\n return heap;\n}\n/**\n * Generate n_samples many integers from 0 to pool_size such that no\n * integer is selected twice. The duplication constraint is achieved via\n * rejection sampling.\n */\nexport function rejectionSample(nSamples, poolSize, random) {\n const result = utils.zeros(nSamples);\n for (let i = 0; i < nSamples; i++) {\n let rejectSample = true;\n let j = 0;\n while (rejectSample) {\n j = utils.tauRandInt(poolSize, random);\n let broken = false;\n for (let k = 0; k < i; k++) {\n if (j === result[k]) {\n broken = true;\n break;\n }\n }\n if (!broken)\n rejectSample = false;\n }\n result[i] = j;\n }\n return result;\n}\n/**\n * Push a new element onto the heap. The heap stores potential neighbors\n * for each data point. The ``row`` parameter determines which data point we\n * are addressing, the ``weight`` determines the distance (for heap sorting),\n * the ``index`` is the element to add, and the flag determines whether this\n * is to be considered a new addition.\n */\nexport function heapPush(heap, row, weight, index, flag) {\n row = Math.floor(row);\n const indices = heap[0][row];\n const weights = heap[1][row];\n //const isNew = heap[2][row];\n if (weight >= weights[0])\n return 0;\n // Break if we already have this element.\n for (let i = 0; i < indices.length; i++) {\n if (index === indices[i])\n return 0;\n }\n return uncheckedHeapPush(heap, row, weight, index, flag);\n}\n/**\n * Push a new element onto the heap. The heap stores potential neighbors\n * for each data point. The ``row`` parameter determines which data point we\n * are addressing, the ``weight`` determines the distance (for heap sorting),\n * the ``index`` is the element to add, and the flag determines whether this\n * is to be considered a new addition.\n */\nexport function uncheckedHeapPush(heap, row, weight, index, flag) {\n const indices = heap[0][row];\n const weights = heap[1][row];\n const isNew = heap[2][row];\n if (weight >= weights[0])\n return 0;\n // Insert val at position zero\n weights[0] = weight;\n indices[0] = index;\n isNew[0] = flag;\n // Descend the heap, swapping values until the max heap criterion is met\n let i = 0;\n let iSwap = 0;\n while (true) {\n const ic1 = 2 * i + 1;\n const ic2 = ic1 + 1;\n const heapShape2 = heap[0][0].length;\n if (ic1 >= heapShape2) {\n break;\n }\n else if (ic2 >= heapShape2) {\n if (weights[ic1] > weight)\n iSwap = ic1;\n else\n break;\n }\n else if (weights[ic1] >= weights[ic2]) {\n if (weight < weights[ic1])\n iSwap = ic1;\n else\n break;\n }\n else {\n if (weight < weights[ic2])\n iSwap = ic2;\n else\n break;\n }\n weights[i] = weights[iSwap];\n indices[i] = indices[iSwap];\n isNew[i] = isNew[iSwap];\n i = iSwap;\n }\n weights[i] = weight;\n indices[i] = index;\n isNew[i] = flag;\n return 1;\n}\n/**\n * Build a heap of candidate neighbors for nearest neighbor descent. For\n * each vertex the candidate neighbors are any current neighbors, and any\n * vertices that have the vertex as one of their nearest neighbors.\n */\nexport function buildCandidates(currentGraph, nVertices, nNeighbors, maxCandidates, random) {\n const candidateNeighbors = makeHeap(nVertices, maxCandidates);\n for (let i = 0; i < nVertices; i++) {\n for (let j = 0; j < nNeighbors; j++) {\n if (currentGraph[0][i][j] < 0)\n continue;\n const idx = currentGraph[0][i][j];\n const isn = currentGraph[2][i][j];\n const d = utils.tauRand(random);\n heapPush(candidateNeighbors, i, d, idx, isn);\n heapPush(candidateNeighbors, idx, d, i, isn);\n currentGraph[2][i][j] = 0;\n }\n }\n return candidateNeighbors;\n}\n/**\n * Given an array of heaps (of indices and weights), unpack the heap\n * out to give and array of sorted lists of indices and weights by increasing\n * weight. This is effectively just the second half of heap sort (the first\n * half not being required since we already have the data in a heap).\n */\nexport function deheapSort(heap) {\n const indices = heap[0];\n const weights = heap[1];\n for (let i = 0; i < indices.length; i++) {\n const indHeap = indices[i];\n const distHeap = weights[i];\n for (let j = 0; j < indHeap.length - 1; j++) {\n const indHeapIndex = indHeap.length - j - 1;\n const distHeapIndex = distHeap.length - j - 1;\n const temp1 = indHeap[0];\n indHeap[0] = indHeap[indHeapIndex];\n indHeap[indHeapIndex] = temp1;\n const temp2 = distHeap[0];\n distHeap[0] = distHeap[distHeapIndex];\n distHeap[distHeapIndex] = temp2;\n siftDown(distHeap, indHeap, distHeapIndex, 0);\n }\n }\n return { indices, weights };\n}\n/**\n * Restore the heap property for a heap with an out of place element\n * at position ``elt``. This works with a heap pair where heap1 carries\n * the weights and heap2 holds the corresponding elements.\n */\nfunction siftDown(heap1, heap2, ceiling, elt) {\n while (elt * 2 + 1 < ceiling) {\n const leftChild = elt * 2 + 1;\n const rightChild = leftChild + 1;\n let swap = elt;\n if (heap1[swap] < heap1[leftChild])\n swap = leftChild;\n if (rightChild < ceiling && heap1[swap] < heap1[rightChild])\n swap = rightChild;\n if (swap === elt) {\n break;\n }\n else {\n const temp1 = heap1[elt];\n heap1[elt] = heap1[swap];\n heap1[swap] = temp1;\n const temp2 = heap2[elt];\n heap2[elt] = heap2[swap];\n heap2[swap] = temp2;\n elt = swap;\n }\n }\n}\n/**\n * Search the heap for the smallest element that is still flagged.\n */\nexport function smallestFlagged(heap, row) {\n const ind = heap[0][row];\n const dist = heap[1][row];\n const flag = heap[2][row];\n let minDist = Infinity;\n let resultIndex = -1;\n for (let i = 0; i > ind.length; i++) {\n if (flag[i] === 1 && dist[i] < minDist) {\n minDist = dist[i];\n resultIndex = i;\n }\n }\n if (resultIndex >= 0) {\n flag[resultIndex] = 0;\n return Math.floor(ind[resultIndex]);\n }\n else {\n return -1;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImhlYXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBMkNILE9BQU8sS0FBSyxLQUFLLE1BQU0sU0FBUyxDQUFDO0FBSWpDOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSxRQUFRLENBQUMsT0FBZSxFQUFFLElBQVk7SUFDcEQsTUFBTSxVQUFVLEdBQUcsQ0FBQyxTQUFpQixFQUFFLEVBQUU7UUFDdkMsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDbkMsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN2QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQztJQUVGLE1BQU0sSUFBSSxHQUFTLEVBQUUsQ0FBQztJQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pCLE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUM3QixRQUFnQixFQUNoQixRQUFnQixFQUNoQixNQUFnQjtJQUVoQixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3JDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDakMsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxHQUFHLENBQUMs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QyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDbkMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLEVBQUU7WUFDdEMsT0FBTyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsQixXQUFXLEdBQUcsQ0FBQyxDQUFDO1NBQ2pCO0tBQ0Y7SUFFRCxJQUFJLFdBQVcsSUFBSSxDQUFDLEVBQUU7UUFDcEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7S0FDckM7U0FBTTtRQUNMLE9BQU8sQ0FBQyxDQUFDLENBQUM7S0FDWDtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKlxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vKipcbiAqIFRoaXMgaXMgYSBKYXZhU2NyaXB0IHJlaW1wbGVtZW50YXRpb24gb2YgVU1BUCAob3JpZ2luYWwgbGljZW5zZSBiZWxvdyksIGZyb21cbiAqIHRoZSBweXRob24gaW1wbGVtZW50YXRpb24gZm91bmQgYXQgaHR0cHM6Ly9naXRodWIuY29tL2xtY2lubmVzL3VtYXAuXG4gKlxuICogQGF1dGhvciBhbmR5Y29lbmVuQGdvb2dsZS5jb20gKEFuZHkgQ29lbmVuKVxuICovXG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIEJTRCAzLUNsYXVzZSBMaWNlbnNlXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE3LCBMZWxhbmQgTWNJbm5lc1xuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuICpcbiAqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4gKiAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICpcbiAqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuICogICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uXG4gKiAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICpcbiAqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlciBub3IgdGhlIG5hbWVzIG9mIGl0c1xuICogICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbVxuICogICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEVcbiAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMXG4gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUlxuICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVJcbiAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksXG4gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRVxuICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqL1xuXG5pbXBvcnQge1JhbmRvbUZufSBmcm9tICcuL3VtYXAnO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCB0eXBlIEhlYXAgPSBudW1iZXJbXVtdW107XG5cbi8qKlxuICogIENvbnN0cnVjdG9yIGZvciB0aGUgaGVhcCBvYmplY3RzLiBUaGUgaGVhcHMgYXJlIHVzZWRcbiAqIGZvciBhcHByb3hpbWF0ZSBuZWFyZXN0IG5laWdoYm9yIHNlYXJjaCwgbWFpbnRhaW5pbmcgYSBsaXN0IG9mIHBvdGVudGlhbFxuICogbmVpZ2hib3JzIHNvcnRlZCBieSB0aGVpciBkaXN0YW5jZS4gV2UgYWxzbyBmbGFnIGlmIHBvdGVudGlhbCBuZWlnaGJvcnNcbiAqIGFyZSBuZXdseSBhZGRlZCB0byB0aGUgbGlzdCBvciBub3QuIEludGVybmFsbHkgdGhpcyBpcyBzdG9yZWQgYXNcbiAqIGEgc2luZ2xlIGFycmF5OyB0aGUgZmlyc3QgYXhpcyBkZXRlcm1pbmVzIHdoZXRoZXIgd2UgYXJlIGxvb2tpbmcgYXQgdGhlXG4gKiBhcnJheSBvZiBjYW5kaWRhdGUgaW5kaWNlcywgdGhlIGFycmF5IG9mIGRpc3RhbmNlcywgb3IgdGhlIGZsYWcgYXJyYXkgZm9yXG4gKiB3aGV0aGVyIGVsZW1lbnRzIGFyZSBuZXcgb3Igbm90LiBFYWNoIG9mIHRoZXNlIGFycmF5cyBhcmUgb2Ygc2hhcGVcbiAqIChgYG5Qb2ludHNgYCwgYGBzaXplYGApXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlSGVhcChuUG9pbnRzOiBudW1iZXIsIHNpemU6IG51bWJlcik6IEhlYXAge1xuICBjb25zdCBtYWtlQXJyYXlzID0gKGZpbGxWYWx1ZTogbnVtYmVyKSA9PiB7XG4gICAgcmV0dXJuIHV0aWxzLmVtcHR5KG5Qb2ludHMpLm1hcCgoKSA9PiB7XG4gICAgICByZXR1cm4gdXRpbHMuZmlsbGVkKHNpemUsIGZpbGxWYWx1ZSk7XG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgaGVhcDogSGVhcCA9IFtdO1xuICBoZWFwLnB1c2gobWFrZUFycmF5cygtMSkpO1xuICBoZWFwLnB1c2gobWFrZUFycmF5cyhJbmZpbml0eSkpO1xuICBoZWFwLnB1c2gobWFrZUFycmF5cygwKSk7XG4gIHJldHVybiBoZWFwO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlIG5fc2FtcGxlcyBtYW55IGludGVnZXJzIGZyb20gMCB0byBwb29sX3NpemUgc3VjaCB0aGF0IG5vXG4gKiBpbnRlZ2VyIGlzIHNlbGVjdGVkIHR3aWNlLiBUaGUgZHVwbGljYXRpb24gY29uc3RyYWludCBpcyBhY2hpZXZlZCB2aWFcbiAqIHJlamVjdGlvbiBzYW1wbGluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlamVjdGlvblNhbXBsZShcbiAgblNhbXBsZXM6IG51bWJlcixcbiAgcG9vbFNpemU6IG51bWJlcixcbiAgcmFuZG9tOiBSYW5kb21GblxuKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHV0aWxzLnplcm9zKG5TYW1wbGVzKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuU2FtcGxlczsgaSsrKSB7XG4gICAgbGV0IHJlamVjdFNhbXBsZSA9IHRydWU7XG4gICAgbGV0IGogPSAwO1xuICAgIHdoaWxlIChyZWplY3RTYW1wbGUpIHtcbiAgICAgIGogPSB1dGlscy50YXVSYW5kSW50KHBvb2xTaXplLCByYW5kb20pO1xuICAgICAgbGV0IGJyb2tlbiA9IGZhbHNlO1xuICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBpOyBrKyspIHtcbiAgICAgICAgaWYgKGogPT09IHJlc3VsdFtrXSkge1xuICAgICAgICAgIGJyb2tlbiA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghYnJva2VuKSByZWplY3RTYW1wbGUgPSBmYWxzZTtcbiAgICB9XG4gICAgcmVzdWx0W2ldID0gajtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFB1c2ggYSBuZXcgZWxlbWVudCBvbnRvIHRoZSBoZWFwLiBUaGUgaGVhcCBzdG9yZXMgcG90ZW50aWFsIG5laWdoYm9yc1xuICogZm9yIGVhY2ggZGF0YSBwb2ludC4gVGhlIGBgcm93YGAgcGFyYW1ldGVyIGRldGVybWluZXMgd2hpY2ggZGF0YSBwb2ludCB3ZVxuICogYXJlIGFkZHJlc3NpbmcsIHRoZSBgYHdlaWdodGBgIGRldGVybWluZXMgdGhlIGRpc3RhbmNlIChmb3IgaGVhcCBzb3J0aW5nKSxcbiAqIHRoZSBgYGluZGV4YGAgaXMgdGhlIGVsZW1lbnQgdG8gYWRkLCBhbmQgdGhlIGZsYWcgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXNcbiAqIGlzIHRvIGJlIGNvbnNpZGVyZWQgYSBuZXcgYWRkaXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoZWFwUHVzaChcbiAgaGVhcDogSGVhcCxcbiAgcm93OiBudW1iZXIsXG4gIHdlaWdodDogbnVtYmVyLFxuICBpbmRleDogbnVtYmVyLFxuICBmbGFnOiBudW1iZXJcbik6IG51bWJlciB7XG4gIHJvdyA9IE1hdGguZmxvb3Iocm93KTtcbiAgY29uc3QgaW5kaWNlcyA9IGhlYXBbMF1bcm93XTtcbiAgY29uc3Qgd2VpZ2h0cyA9IGhlYXBbMV1bcm93XTtcbiAgLy9jb25zdCBpc05ldyA9IGhlYXBbMl1bcm93XTtcblxuICBpZiAod2VpZ2h0ID49IHdlaWdodHNbMF0pXG4gICAgcmV0dXJuIDA7XG5cblxuICAvLyBCcmVhayBpZiB3ZSBhbHJlYWR5IGhhdmUgdGhpcyBlbGVtZW50LlxuICBmb3IgKGxldCBpID0gMDsgaSA8IGluZGljZXMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoaW5kZXggPT09IGluZGljZXNbaV0pXG4gICAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHJldHVybiB1bmNoZWNrZWRIZWFwUHVzaChoZWFwLCByb3csIHdlaWdodCwgaW5kZXgsIGZsYWcpO1xufVxuXG4vKipcbiAqIFB1c2ggYSBuZXcgZWxlbWVudCBvbnRvIHRoZSBoZWFwLiBUaGUgaGVhcCBzdG9yZXMgcG90ZW50aWFsIG5laWdoYm9yc1xuICogZm9yIGVhY2ggZGF0YSBwb2ludC4gVGhlIGBgcm93YGAgcGFyYW1ldGVyIGRldGVybWluZXMgd2hpY2ggZGF0YSBwb2ludCB3ZVxuICogYXJlIGFkZHJlc3NpbmcsIHRoZSBgYHdlaWdodGBgIGRldGVybWluZXMgdGhlIGRpc3RhbmNlIChmb3IgaGVhcCBzb3J0aW5nKSxcbiAqIHRoZSBgYGluZGV4YGAgaXMgdGhlIGVsZW1lbnQgdG8gYWRkLCBhbmQgdGhlIGZsYWcgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXNcbiAqIGlzIHRvIGJlIGNvbnNpZGVyZWQgYSBuZXcgYWRkaXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmNoZWNrZWRIZWFwUHVzaChcbiAgaGVhcDogSGVhcCxcbiAgcm93OiBudW1iZXIsXG4gIHdlaWdodDogbnVtYmVyLFxuICBpbmRleDogbnVtYmVyLFxuICBmbGFnOiBudW1iZXJcbik6IG51bWJlciB7XG4gIGNvbnN0IGluZGljZXMgPSBoZWFwWzBdW3Jvd107XG4gIGNvbnN0IHdlaWdodHMgPSBoZWFwWzFdW3Jvd107XG4gIGNvbnN0IGlzTmV3ID0gaGVhcFsyXVtyb3ddO1xuXG4gIGlmICh3ZWlnaHQgPj0gd2VpZ2h0c1swXSlcbiAgICByZXR1cm4gMDtcblxuXG4gIC8vIEluc2VydCB2YWwgYXQgcG9zaXRpb24gemVyb1xuICB3ZWlnaHRzWzBdID0gd2VpZ2h0O1xuICBpbmRpY2VzWzBdID0gaW5kZXg7XG4gIGlzTmV3WzBdID0gZmxhZztcblxuICAvLyBEZXNjZW5kIHRoZSBoZWFwLCBzd2FwcGluZyB2YWx1ZXMgdW50aWwgdGhlIG1heCBoZWFwIGNyaXRlcmlvbiBpcyBtZXRcbiAgbGV0IGkgPSAwO1xuICBsZXQgaVN3YXAgPSAwO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IGljMSA9IDIgKiBpICsgMTtcbiAgICBjb25zdCBpYzIgPSBpYzEgKyAxO1xuXG4gICAgY29uc3QgaGVhcFNoYXBlMiA9IGhlYXBbMF1bMF0ubGVuZ3RoO1xuICAgIGlmIChpYzEgPj0gaGVhcFNoYXBlMikge1xuICAgICAgYnJlYWs7XG4gICAgfSBlbHNlIGlmIChpYzIgPj0gaGVhcFNoYXBlMikge1xuICAgICAgaWYgKHdlaWdodHNbaWMxXSA+IHdlaWdodClcbiAgICAgICAgaVN3YXAgPSBpYzE7XG4gICAgICBlbHNlXG4gICAgICAgIGJyZWFrO1xuICAgIH0gZWxzZSBpZiAod2VpZ2h0c1tpYzFdID49IHdlaWdodHNbaWMyXSkge1xuICAgICAgaWYgKHdlaWdodCA8IHdlaWdodHNbaWMxXSlcbiAgICAgICAgaVN3YXAgPSBpYzE7XG4gICAgICBlbHNlXG4gICAgICAgIGJyZWFrO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAod2VpZ2h0IDwgd2VpZ2h0c1tpYzJdKVxuICAgICAgICBpU3dhcCA9IGljMjtcbiAgICAgIGVsc2VcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgd2VpZ2h0c1tpXSA9IHdlaWdodHNbaVN3YXBdO1xuICAgIGluZGljZXNbaV0gPSBpbmRpY2VzW2lTd2FwXTtcbiAgICBpc05ld1tpXSA9IGlzTmV3W2lTd2FwXTtcblxuICAgIGkgPSBpU3dhcDtcbiAgfVxuXG4gIHdlaWdodHNbaV0gPSB3ZWlnaHQ7XG4gIGluZGljZXNbaV0gPSBpbmRleDtcbiAgaXNOZXdbaV0gPSBmbGFnO1xuICByZXR1cm4gMTtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIGhlYXAgb2YgY2FuZGlkYXRlIG5laWdoYm9ycyBmb3IgbmVhcmVzdCBuZWlnaGJvciBkZXNjZW50LiBGb3JcbiAqIGVhY2ggdmVydGV4IHRoZSBjYW5kaWRhdGUgbmVpZ2hib3JzIGFyZSBhbnkgY3VycmVudCBuZWlnaGJvcnMsIGFuZCBhbnlcbiAqIHZlcnRpY2VzIHRoYXQgaGF2ZSB0aGUgdmVydGV4IGFzIG9uZSBvZiB0aGVpciBuZWFyZXN0IG5laWdoYm9ycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ2FuZGlkYXRlcyhcbiAgY3VycmVudEdyYXBoOiBIZWFwLFxuICBuVmVydGljZXM6IG51bWJlcixcbiAgbk5laWdoYm9yczogbnVtYmVyLFxuICBtYXhDYW5kaWRhdGVzOiBudW1iZXIsXG4gIHJhbmRvbTogUmFuZG9tRm5cbikge1xuICBjb25zdCBjYW5kaWRhdGVOZWlnaGJvcnMgPSBtYWtlSGVhcChuVmVydGljZXMsIG1heENhbmRpZGF0ZXMpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG5WZXJ0aWNlczsgaSsrKSB7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBuTmVpZ2hib3JzOyBqKyspIHtcbiAgICAgIGlmIChjdXJyZW50R3JhcGhbMF1baV1bal0gPCAwKVxuICAgICAgICBjb250aW51ZTtcblxuICAgICAgY29uc3QgaWR4ID0gY3VycmVudEdyYXBoWzBdW2ldW2pdO1xuICAgICAgY29uc3QgaXNuID0gY3VycmVudEdyYXBoWzJdW2ldW2pdO1xuICAgICAgY29uc3QgZCA9IHV0aWxzLnRhdVJhbmQocmFuZG9tKTtcbiAgICAgIGhlYXBQdXNoKGNhbmRpZGF0ZU5laWdoYm9ycywgaSwgZCwgaWR4LCBpc24pO1xuICAgICAgaGVhcFB1c2goY2FuZGlkYXRlTmVpZ2hib3JzLCBpZHgsIGQsIGksIGlzbik7XG4gICAgICBjdXJyZW50R3JhcGhbMl1baV1bal0gPSAwO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2FuZGlkYXRlTmVpZ2hib3JzO1xufVxuXG4vKipcbiAqIEdpdmVuIGFuIGFycmF5IG9mIGhlYXBzIChvZiBpbmRpY2VzIGFuZCB3ZWlnaHRzKSwgdW5wYWNrIHRoZSBoZWFwXG4gKiBvdXQgdG8gZ2l2ZSBhbmQgYXJyYXkgb2Ygc29ydGVkIGxpc3RzIG9mIGluZGljZXMgYW5kIHdlaWdodHMgYnkgaW5jcmVhc2luZ1xuICogd2VpZ2h0LiBUaGlzIGlzIGVmZmVjdGl2ZWx5IGp1c3QgdGhlIHNlY29uZCBoYWxmIG9mIGhlYXAgc29ydCAodGhlIGZpcnN0XG4gKiBoYWxmIG5vdCBiZWluZyByZXF1aXJlZCBzaW5jZSB3ZSBhbHJlYWR5IGhhdmUgdGhlIGRhdGEgaW4gYSBoZWFwKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlaGVhcFNvcnQoaGVhcDogSGVhcCkge1xuICBjb25zdCBpbmRpY2VzID0gaGVhcFswXTtcbiAgY29uc3Qgd2VpZ2h0cyA9IGhlYXBbMV07XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmRpY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgaW5kSGVhcCA9IGluZGljZXNbaV07XG4gICAgY29uc3QgZGlzdEhlYXAgPSB3ZWlnaHRzW2ldO1xuXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBpbmRIZWFwLmxlbmd0aCAtIDE7IGorKykge1xuICAgICAgY29uc3QgaW5kSGVhcEluZGV4ID0gaW5kSGVhcC5sZW5ndGggLSBqIC0gMTtcbiAgICAgIGNvbnN0IGRpc3RIZWFwSW5kZXggPSBkaXN0SGVhcC5sZW5ndGggLSBqIC0gMTtcblxuICAgICAgY29uc3QgdGVtcDEgPSBpbmRIZWFwWzBdO1xuICAgICAgaW5kSGVhcFswXSA9IGluZEhlYXBbaW5kSGVhcEluZGV4XTtcbiAgICAgIGluZEhlYXBbaW5kSGVhcEluZGV4XSA9IHRlbXAxO1xuXG4gICAgICBjb25zdCB0ZW1wMiA9IGRpc3RIZWFwWzBdO1xuICAgICAgZGlzdEhlYXBbMF0gPSBkaXN0SGVhcFtkaXN0SGVhcEluZGV4XTtcbiAgICAgIGRpc3RIZWFwW2Rpc3RIZWFwSW5kZXhdID0gdGVtcDI7XG5cbiAgICAgIHNpZnREb3duKGRpc3RIZWFwLCBpbmRIZWFwLCBkaXN0SGVhcEluZGV4LCAwKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtpbmRpY2VzLCB3ZWlnaHRzfTtcbn1cblxuLyoqXG4gKiBSZXN0b3JlIHRoZSBoZWFwIHByb3BlcnR5IGZvciBhIGhlYXAgd2l0aCBhbiBvdXQgb2YgcGxhY2UgZWxlbWVudFxuICogYXQgcG9zaXRpb24gYGBlbHRgYC4gVGhpcyB3b3JrcyB3aXRoIGEgaGVhcCBwYWlyIHdoZXJlIGhlYXAxIGNhcnJpZXNcbiAqIHRoZSB3ZWlnaHRzIGFuZCBoZWFwMiBob2xkcyB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50cy5cbiAqL1xuZnVuY3Rpb24gc2lmdERvd24oXG4gIGhlYXAxOiBudW1iZXJbXSxcbiAgaGVhcDI6IG51bWJlcltdLFxuICBjZWlsaW5nOiBudW1iZXIsXG4gIGVsdDogbnVtYmVyXG4pIHtcbiAgd2hpbGUgKGVsdCAqIDIgKyAxIDwgY2VpbGluZykge1xuICAgIGNvbnN0IGxlZnRDaGlsZCA9IGVsdCAqIDIgKyAxO1xuICAgIGNvbnN0IHJpZ2h0Q2hpbGQgPSBsZWZ0Q2hpbGQgKyAxO1xuICAgIGxldCBzd2FwID0gZWx0O1xuXG4gICAgaWYgKGhlYXAxW3N3YXBdIDwgaGVhcDFbbGVmdENoaWxkXSlcbiAgICAgIHN3YXAgPSBsZWZ0Q2hpbGQ7XG5cbiAgICBpZiAocmlnaHRDaGlsZCA8IGNlaWxpbmcgJiYgaGVhcDFbc3dhcF0gPCBoZWFwMVtyaWdodENoaWxkXSlcbiAgICAgIHN3YXAgPSByaWdodENoaWxkO1xuXG5cbiAgICBpZiAoc3dhcCA9PT0gZWx0KSB7XG4gICAgICBicmVhaztcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdGVtcDEgPSBoZWFwMVtlbHRdO1xuICAgICAgaGVhcDFbZWx0XSA9IGhlYXAxW3N3YXBdO1xuICAgICAgaGVhcDFbc3dhcF0gPSB0ZW1wMTtcblxuICAgICAgY29uc3QgdGVtcDIgPSBoZWFwMltlbHRdO1xuICAgICAgaGVhcDJbZWx0XSA9IGhlYXAyW3N3YXBdO1xuICAgICAgaGVhcDJbc3dhcF0gPSB0ZW1wMjtcbiAgICAgIGVsdCA9IHN3YXA7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogU2VhcmNoIHRoZSBoZWFwIGZvciB0aGUgc21hbGxlc3QgZWxlbWVudCB0aGF0IGlzIHN0aWxsIGZsYWdnZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzbWFsbGVzdEZsYWdnZWQoaGVhcDogSGVhcCwgcm93OiBudW1iZXIpIHtcbiAgY29uc3QgaW5kID0gaGVhcFswXVtyb3ddO1xuICBjb25zdCBkaXN0ID0gaGVhcFsxXVtyb3ddO1xuICBjb25zdCBmbGFnID0gaGVhcFsyXVtyb3ddO1xuXG4gIGxldCBtaW5EaXN0ID0gSW5maW5pdHk7XG4gIGxldCByZXN1bHRJbmRleCA9IC0xO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpID4gaW5kLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGZsYWdbaV0gPT09IDEgJiYgZGlzdFtpXSA8IG1pbkRpc3QpIHtcbiAgICAgIG1pbkRpc3QgPSBkaXN0W2ldO1xuICAgICAgcmVzdWx0SW5kZXggPSBpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChyZXN1bHRJbmRleCA+PSAwKSB7XG4gICAgZmxhZ1tyZXN1bHRJbmRleF0gPSAwO1xuICAgIHJldHVybiBNYXRoLmZsb29yKGluZFtyZXN1bHRJbmRleF0pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAtMTtcbiAgfVxufVxuIl19","/**\n * @license\n *\n * Copyright 2019 Google LLC. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ==============================================================================\n */\nimport * as utils from './utils';\n/**\n * Internal 2-dimensional sparse matrix class\n */\nexport class SparseMatrix {\n entries = new Map();\n nRows = 0;\n nCols = 0;\n constructor(rows, cols, values, dims) {\n if (rows.length !== cols.length || rows.length !== values.length) {\n throw new Error('rows, cols and values arrays must all have the same length');\n }\n // TODO: Assert that dims are legit.\n this.nRows = dims[0];\n this.nCols = dims[1];\n for (let i = 0; i < values.length; i++) {\n const row = rows[i];\n const col = cols[i];\n this.checkDims(row, col);\n const key = this.makeKey(row, col);\n this.entries.set(key, { value: values[i], row, col });\n }\n }\n makeKey(row, col) {\n return `${row}:${col}`;\n }\n checkDims(row, col) {\n const withinBounds = row < this.nRows && col < this.nCols;\n if (!withinBounds)\n throw new Error('row and/or col specified outside of matrix dimensions');\n }\n set(row, col, value) {\n this.checkDims(row, col);\n const key = this.makeKey(row, col);\n if (!this.entries.has(key))\n this.entries.set(key, { value, row, col });\n else\n this.entries.get(key).value = value;\n }\n get(row, col, defaultValue = 0) {\n //this.checkDims(row, col);\n const key = this.makeKey(row, col);\n if (this.entries.has(key))\n return this.entries.get(key).value;\n else\n return defaultValue;\n }\n getAll(ordered = true) {\n const rowColValues = new Array(this.entries.size).fill(null);\n let i = 0;\n this.entries.forEach((value) => {\n rowColValues[i++] = value;\n });\n if (ordered) {\n // Ordering the result isn't required for processing but it does make it easier to write tests\n rowColValues.sort((a, b) => {\n if (a.row === b.row)\n return a.col - b.col;\n else\n return a.row - b.row;\n });\n }\n return rowColValues;\n }\n getDims() {\n return [this.nRows, this.nCols];\n }\n getRows() {\n return Array.from(this.entries, ([_key, value]) => value.row);\n // return this.rows as unknown as number[];\n }\n getCols() {\n return Array.from(this.entries, ([_key, value]) => value.col);\n // return this.cols as unknown as number[];\n }\n getValues() {\n return Array.from(this.entries, ([_key, value]) => value.value);\n //return this.values as unknown as number[];\n }\n forEach(fn) {\n this.entries.forEach((value) => fn(value.value, value.row, value.col));\n }\n map(fn) {\n const vals = new Float32Array(this.entries.size);\n let i = 0;\n this.entries.forEach((value) => {\n vals[i++] = fn(value.value, value.row, value.col);\n });\n const dims = [this.nRows, this.nCols];\n return new SparseMatrix(this.getRows(), this.getCols(), vals, dims);\n }\n toArray() {\n const rows = utils.empty(this.nRows);\n const output = rows.map(() => {\n return utils.zeros(this.nCols);\n });\n this.entries.forEach((value) => {\n output[value.row][value.col] = value.value;\n });\n return output;\n }\n}\n/**\n * Transpose a sparse matrix\n */\nexport function transpose(matrix) {\n const oldRows = matrix.getRows();\n const oldCols = matrix.getCols();\n const oldVals = matrix.getValues();\n const matlen = oldCols.length;\n const cols = new Int32Array(matlen);\n const rows = new Int32Array(matlen);\n const vals = new Float32Array(matlen);\n cols.set(oldRows);\n rows.set(oldCols);\n vals.set(oldVals);\n const dims = [matrix.nCols, matrix.nRows];\n return new SparseMatrix(rows, cols, vals, dims);\n}\n/**\n * Construct a sparse identity matrix\n */\nexport function identity(size) {\n const [rows] = size;\n const matrix = new SparseMatrix([], [], [], size);\n for (let i = 0; i < rows; i++)\n matrix.set(i, i, 1);\n return matrix;\n}\n/**\n * Element-wise multiplication of two matrices\n */\nexport function pairwiseMultiply(a, b) {\n return elementWise(a, b, (x, y) => x * y);\n}\n/**\n * Element-wise addition of two matrices\n */\nexport function add(a, b) {\n return elementWise(a, b, (x, y) => x + y);\n}\n/**\n * Element-wise subtraction of two matrices\n */\nexport function subtract(a, b) {\n return elementWise(a, b, (x, y) => x - y);\n}\n/**\n * Element-wise maximum of two matrices\n */\nexport function maximum(a, b) {\n return elementWise(a, b, (x, y) => (x > y ? x : y));\n}\n/**\n * Scalar multiplication of two matrices\n */\nexport function multiplyScalar(a, scalar) {\n return a.map((value) => {\n return value * scalar;\n });\n}\n/**\n * Returns a new matrix with zero entries removed.\n */\nexport function eliminateZeros(m) {\n const zeroIndices = new Set();\n const values = m.getValues();\n const rows = m.getRows();\n const cols = m.getCols();\n for (let i = 0; i < values.length; i++) {\n if (values[i] === 0)\n zeroIndices.add(i);\n }\n const removeByZeroIndex = (_, index) => !zeroIndices.has(index);\n const nextValues = values.filter(removeByZeroIndex);\n const nextRows = rows.filter(removeByZeroIndex);\n const nextCols = cols.filter(removeByZeroIndex);\n return new SparseMatrix(nextRows, nextCols, nextValues, m.getDims());\n}\n/**\n * Normalization of a sparse matrix.\n */\nexport function normalize(m, normType = \"l2\" /* NormType.l2 */) {\n const normFn = normFns[normType];\n const colsByRow = new Map();\n m.forEach((_, row, col) => {\n const cols = colsByRow.get(row) || [];\n cols.push(col);\n colsByRow.set(row, cols);\n });\n const nextMatrix = new SparseMatrix([], [], [], m.getDims());\n for (const row of colsByRow.keys()) {\n const cols = colsByRow.get(row).sort();\n const vals = cols.map((col) => m.get(row, col));\n const norm = normFn(vals);\n for (let i = 0; i < norm.length; i++)\n nextMatrix.set(row, cols[i], norm[i]);\n }\n return nextMatrix;\n}\nconst normFns = {\n [\"max\" /* NormType.max */]: (xs) => {\n let max = -Infinity;\n for (let i = 0; i < xs.length; i++)\n max = xs[i] > max ? xs[i] : max;\n return xs.map((x) => x / max);\n },\n [\"l1\" /* NormType.l1 */]: (xs) => {\n let sum = 0;\n for (let i = 0; i < xs.length; i++)\n sum += xs[i];\n return xs.map((x) => x / sum);\n },\n [\"l2\" /* NormType.l2 */]: (xs) => {\n let sum = 0;\n for (let i = 0; i < xs.length; i++)\n sum += xs[i] ** 2;\n return xs.map((x) => Math.sqrt(x ** 2 / sum));\n },\n};\n/**\n * Helper function for element-wise operations.\n */\nfunction elementWise(a, b, op) {\n const visited = new Set();\n const rows = [];\n const cols = [];\n const vals = [];\n const operate = (row, col) => {\n rows.push(row);\n cols.push(col);\n const nextValue = op(a.get(row, col), b.get(row, col));\n vals.push(nextValue);\n };\n const valuesA = a.getValues();\n const rowsA = a.getRows();\n const colsA = a.getCols();\n for (let i = 0; i < valuesA.length; i++) {\n const row = rowsA[i];\n const col = colsA[i];\n const key = `${row}:${col}`;\n visited.add(key);\n operate(row, col);\n }\n const valuesB = b.getValues();\n const rowsB = b.getRows();\n const colsB = b.getCols();\n for (let i = 0; i < valuesB.length; i++) {\n const row = rowsB[i];\n const col = colsB[i];\n const key = `${row}:${col}`;\n if (visited.has(key))\n continue;\n operate(row, col);\n }\n const dims = [a.nRows, a.nCols];\n return new SparseMatrix(rows, cols, vals, dims);\n}\n/**\n * Helper function for getting data, indices, and inptr arrays from a sparse\n * matrix to follow csr matrix conventions. Super inefficient (and kind of\n * defeats the purpose of this convention) but a lot of the ported python tree\n * search logic depends on this data format.\n */\nexport function getCSR(x) {\n const entries = [];\n x.forEach((value, row, col) => {\n entries.push({ value, row, col });\n });\n entries.sort((a, b) => {\n if (a.row === b.row)\n return a.col - b.col;\n else\n return a.row - b.row;\n });\n const indices = [];\n const values = [];\n const indptr = [];\n let currentRow = -1;\n for (let i = 0; i < entries.length; i++) {\n const { row, col, value } = entries[i];\n if (row !== currentRow) {\n currentRow = row;\n indptr.push(i);\n }\n indices.push(col);\n values.push(value);\n }\n return { indices, values, indptr };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0cml4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibWF0cml4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUVILE9BQU8sS0FBSyxLQUFLLE1BQU0sU0FBUyxDQUFDO0FBSWpDOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFlBQVk7SUFDZixPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQWlCLENBQUM7SUFFbEMsS0FBSyxHQUFXLENBQUMsQ0FBQztJQUNsQixLQUFLLEdBQVcsQ0FBQyxDQUFDO0lBRTNCLFlBQ0UsSUFBMkIsRUFDM0IsSUFBMkIsRUFDM0IsTUFBK0IsRUFDL0IsSUFBYztRQUVkLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDLE1BQU0sRUFBRTtZQUNoRSxNQUFNLElBQUksS0FBSyxDQUNiLDREQUE0RCxDQUM3RCxDQUFDO1NBQ0g7UUFFRCxvQ0FBb0M7UUFDcEMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDdEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwQixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUN6QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNuQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdB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LENBQUMsQ0FBQyxDQUFDO0lBQ3BCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3ZDLE1BQU0sRUFBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyQyxJQUFJLEdBQUcsS0FBSyxVQUFVLEVBQUU7WUFDdEIsVUFBVSxHQUFHLEdBQUcsQ0FBQztZQUNqQixNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2hCO1FBQ0QsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsQixNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQ3BCO0lBRUQsT0FBTyxFQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFDLENBQUM7QUFDbkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJy4vdXRpbHMnO1xuXG50eXBlIEVudHJ5ID0geyB2YWx1ZTogbnVtYmVyOyByb3c6IG51bWJlcjsgY29sOiBudW1iZXIgfTtcblxuLyoqXG4gKiBJbnRlcm5hbCAyLWRpbWVuc2lvbmFsIHNwYXJzZSBtYXRyaXggY2xhc3NcbiAqL1xuZXhwb3J0IGNsYXNzIFNwYXJzZU1hdHJpeCB7XG4gIHByaXZhdGUgZW50cmllcyA9IG5ldyBNYXA8c3RyaW5nLCBFbnRyeT4oKTtcblxuICByZWFkb25seSBuUm93czogbnVtYmVyID0gMDtcbiAgcmVhZG9ubHkgbkNvbHM6IG51bWJlciA9IDA7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcm93czogbnVtYmVyW10gfCBJbnQzMkFycmF5LFxuICAgIGNvbHM6IG51bWJlcltdIHwgSW50MzJBcnJheSxcbiAgICB2YWx1ZXM6IG51bWJlcltdIHwgRmxvYXQzMkFycmF5LFxuICAgIGRpbXM6IG51bWJlcltdXG4gICkge1xuICAgIGlmIChyb3dzLmxlbmd0aCAhPT0gY29scy5sZW5ndGggfHwgcm93cy5sZW5ndGggIT09IHZhbHVlcy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ3Jvd3MsIGNvbHMgYW5kIHZhbHVlcyBhcnJheXMgbXVzdCBhbGwgaGF2ZSB0aGUgc2FtZSBsZW5ndGgnXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFRPRE86IEFzc2VydCB0aGF0IGRpbXMgYXJlIGxlZ2l0LlxuICAgIHRoaXMublJvd3MgPSBkaW1zWzBdO1xuICAgIHRoaXMubkNvbHMgPSBkaW1zWzFdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCByb3cgPSByb3dzW2ldO1xuICAgICAgY29uc3QgY29sID0gY29sc1tpXTtcbiAgICAgIHRoaXMuY2hlY2tEaW1zKHJvdywgY29sKTtcbiAgICAgIGNvbnN0IGtleSA9IHRoaXMubWFrZUtleShyb3csIGNvbCk7XG4gICAgICB0aGlzLmVudHJpZXMuc2V0KGtleSwge3ZhbHVlOiB2YWx1ZXNbaV0sIHJvdywgY29sfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBtYWtlS2V5KHJvdzogbnVtYmVyLCBjb2w6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3Jvd306JHtjb2x9YDtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tEaW1zKHJvdzogbnVtYmVyLCBjb2w6IG51bWJlcikge1xuICAgIGNvbnN0IHdpdGhpbkJvdW5kcyA9IHJvdyA8IHRoaXMublJvd3MgJiYgY29sIDwgdGhpcy5uQ29scztcbiAgICBpZiAoIXdpdGhpbkJvdW5kcylcbiAgICAgIHRocm93IG5ldyBFcnJvcigncm93IGFuZC9vciBjb2wgc3BlY2lmaWVkIG91dHNpZGUgb2YgbWF0cml4IGRpbWVuc2lvbnMnKTtcbiAgfVxuXG4gIHNldChyb3c6IG51bWJlciwgY29sOiBudW1iZXIsIHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLmNoZWNrRGltcyhyb3csIGNvbCk7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5tYWtlS2V5KHJvdywgY29sKTtcbiAgICBpZiAoIXRoaXMuZW50cmllcy5oYXMoa2V5KSlcbiAgICAgIHRoaXMuZW50cmllcy5zZXQoa2V5LCB7dmFsdWUsIHJvdywgY29sfSk7XG4gICAgZWxzZVxuICAgICAgdGhpcy5lbnRyaWVzLmdldChrZXkpIS52YWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgZ2V0KHJvdzogbnVtYmVyLCBjb2w6IG51bWJlciwgZGVmYXVsdFZhbHVlID0gMCkge1xuICAgIC8vdGhpcy5jaGVja0RpbXMocm93LCBjb2wpO1xuICAgIGNvbnN0IGtleSA9IHRoaXMubWFrZUtleShyb3csIGNvbCk7XG4gICAgaWYgKHRoaXMuZW50cmllcy5oYXMoa2V5KSlcbiAgICAgIHJldHVybiB0aGlzLmVudHJpZXMuZ2V0KGtleSkhLnZhbHVlO1xuICAgIGVsc2VcbiAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gIH1cblxuICBnZXRBbGwob3JkZXJlZCA9IHRydWUpOiB7IHZhbHVlOiBudW1iZXI7IHJvdzogbnVtYmVyOyBjb2w6IG51bWJlciB9W10ge1xuICAgIGNvbnN0IHJvd0NvbFZhbHVlczogRW50cnlbXSA9IG5ldyBBcnJheSh0aGlzLmVudHJpZXMuc2l6ZSkuZmlsbChudWxsKTtcbiAgICBsZXQgaSA9IDA7XG4gICAgdGhpcy5lbnRyaWVzLmZvckVhY2goKHZhbHVlKSA9PiB7XG4gICAgICByb3dDb2xWYWx1ZXNbaSsrXSA9IHZhbHVlO1xuICAgIH0pO1xuICAgIGlmIChvcmRlcmVkKSB7XG4gICAgICAvLyBPcmRlcmluZyB0aGUgcmVzdWx0IGlzbid0IHJlcXVpcmVkIGZvciBwcm9jZXNzaW5nIGJ1dCBpdCBkb2VzIG1ha2UgaXQgZWFzaWVyIHRvIHdyaXRlIHRlc3RzXG4gICAgICByb3dDb2xWYWx1ZXMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICBpZiAoYS5yb3cgPT09IGIucm93KVxuICAgICAgICAgIHJldHVybiBhLmNvbCAtIGIuY29sO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgcmV0dXJuIGEucm93IC0gYi5yb3c7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJvd0NvbFZhbHVlcztcbiAgfVxuXG4gIGdldERpbXMoKTogbnVtYmVyW10ge1xuICAgIHJldHVybiBbdGhpcy5uUm93cywgdGhpcy5uQ29sc107XG4gIH1cblxuICBnZXRSb3dzKCk6IG51bWJlcltdIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMsIChbX2tleSwgdmFsdWVdKSA9PiB2YWx1ZS5yb3cpO1xuICAgIC8vIHJldHVybiB0aGlzLnJvd3MgYXMgdW5rbm93biBhcyBudW1iZXJbXTtcbiAgfVxuXG4gIGdldENvbHMoKTogbnVtYmVyW10ge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZW50cmllcywgKFtfa2V5LCB2YWx1ZV0pID0+IHZhbHVlLmNvbCk7XG4gICAgLy8gcmV0dXJuIHRoaXMuY29scyBhcyB1bmtub3duIGFzIG51bWJlcltdO1xuICB9XG5cbiAgZ2V0VmFsdWVzKCk6IG51bWJlcltdIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMsIChbX2tleSwgdmFsdWVdKSA9PiB2YWx1ZS52YWx1ZSk7XG4gIC8vcmV0dXJuIHRoaXMudmFsdWVzIGFzIHVua25vd24gYXMgbnVtYmVyW107XG4gIH1cblxuICBmb3JFYWNoKGZuOiAodmFsdWU6IG51bWJlciwgcm93OiBudW1iZXIsIGNvbDogbnVtYmVyKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5lbnRyaWVzLmZvckVhY2goKHZhbHVlKSA9PiBmbih2YWx1ZS52YWx1ZSwgdmFsdWUucm93LCB2YWx1ZS5jb2wpKTtcbiAgfVxuXG4gIG1hcChmbjogKHZhbHVlOiBudW1iZXIsIHJvdzogbnVtYmVyLCBjb2w6IG51bWJlcikgPT4gbnVtYmVyKTogU3BhcnNlTWF0cml4IHtcbiAgICBjb25zdCB2YWxzID0gbmV3IEZsb2F0MzJBcnJheSh0aGlzLmVudHJpZXMuc2l6ZSk7XG4gICAgbGV0IGkgPSAwO1xuICAgIHRoaXMuZW50cmllcy5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xuICAgICAgdmFsc1tpKytdID0gZm4odmFsdWUudmFsdWUsIHZhbHVlLnJvdywgdmFsdWUuY29sKTtcbiAgICB9KTtcbiAgICBjb25zdCBkaW1zID0gW3RoaXMublJvd3MsIHRoaXMubkNvbHNdO1xuICAgIHJldHVybiBuZXcgU3BhcnNlTWF0cml4KHRoaXMuZ2V0Um93cygpLCB0aGlzLmdldENvbHMoKSwgdmFscyBhcyB1bmtub3duIGFzIG51bWJlcltdLCBkaW1zKTtcbiAgfVxuXG4gIHRvQXJyYXkoKSB7XG4gICAgY29uc3Qgcm93czogdW5kZWZpbmVkW10gPSB1dGlscy5lbXB0eSh0aGlzLm5Sb3dzKTtcbiAgICBjb25zdCBvdXRwdXQgPSByb3dzLm1hcCgoKSA9PiB7XG4gICAgICByZXR1cm4gdXRpbHMuemVyb3ModGhpcy5uQ29scyk7XG4gICAgfSk7XG4gICAgdGhpcy5lbnRyaWVzLmZvckVhY2goKHZhbHVlKSA9PiB7XG4gICAgICBvdXRwdXRbdmFsdWUucm93XVt2YWx1ZS5jb2xdID0gdmFsdWUudmFsdWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfVxufVxuXG4vKipcbiAqIFRyYW5zcG9zZSBhIHNwYXJzZSBtYXRyaXhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zcG9zZShtYXRyaXg6IFNwYXJzZU1hdHJpeCk6IFNwYXJzZU1hdHJpeCB7XG4gIGNvbnN0IG9sZFJvd3MgPSBtYXRyaXguZ2V0Um93cygpO1xuICBjb25zdCBvbGRDb2xzID0gbWF0cml4LmdldENvbHMoKTtcbiAgY29uc3Qgb2xkVmFscyA9IG1hdHJpeC5nZXRWYWx1ZXMoKTtcbiAgY29uc3QgbWF0bGVuID0gb2xkQ29scy5sZW5ndGg7XG4gIGNvbnN0IGNvbHMgPSBuZXcgSW50MzJBcnJheShtYXRsZW4pO1xuICBjb25zdCByb3dzID0gbmV3IEludDMyQXJyYXkobWF0bGVuKTtcbiAgY29uc3QgdmFscyA9IG5ldyBGbG9hdDMyQXJyYXkobWF0bGVuKTtcblxuICBjb2xzLnNldChvbGRSb3dzKTtcbiAgcm93cy5zZXQob2xkQ29scyk7XG4gIHZhbHMuc2V0KG9sZFZhbHMpO1xuICBjb25zdCBkaW1zID0gW21hdHJpeC5uQ29scywgbWF0cml4Lm5Sb3dzXTtcbiAgcmV0dXJuIG5ldyBTcGFyc2VNYXRyaXgocm93cywgY29scywgdmFscywgZGltcyk7XG59XG5cbi8qKlxuICogQ29uc3RydWN0IGEgc3BhcnNlIGlkZW50aXR5IG1hdHJpeFxuICovXG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpdHkoc2l6ZTogbnVtYmVyW10pOiBTcGFyc2VNYXRyaXgge1xuICBjb25zdCBbcm93c10gPSBzaXplO1xuICBjb25zdCBtYXRyaXggPSBuZXcgU3BhcnNlTWF0cml4KFtdLCBbXSwgW10sIHNpemUpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHJvd3M7IGkrKylcbiAgICBtYXRyaXguc2V0KGksIGksIDEpO1xuXG4gIHJldHVybiBtYXRyaXg7XG59XG5cbi8qKlxuICogRWxlbWVudC13aXNlIG11bHRpcGxpY2F0aW9uIG9mIHR3byBtYXRyaWNlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGFpcndpc2VNdWx0aXBseShcbiAgYTogU3BhcnNlTWF0cml4LFxuICBiOiBTcGFyc2VNYXRyaXhcbik6IFNwYXJzZU1hdHJpeCB7XG4gIHJldHVybiBlbGVtZW50V2lzZShhLCBiLCAoeCwgeSkgPT4geCAqIHkpO1xufVxuXG4vKipcbiAqIEVsZW1lbnQtd2lzZSBhZGRpdGlvbiBvZiB0d28gbWF0cmljZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZChhOiBTcGFyc2VNYXRyaXgsIGI6IFNwYXJzZU1hdHJpeCk6IFNwYXJzZU1hdHJpeCB7XG4gIHJldHVybiBlbGVtZW50V2lzZShhLCBiLCAoeCwgeSkgPT4geCArIHkpO1xufVxuXG4vKipcbiAqIEVsZW1lbnQtd2lzZSBzdWJ0cmFjdGlvbiBvZiB0d28gbWF0cmljZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1YnRyYWN0KGE6IFNwYXJzZU1hdHJpeCwgYjogU3BhcnNlTWF0cml4KTogU3BhcnNlTWF0cml4IHtcbiAgcmV0dXJuIGVsZW1lbnRXaXNlKGEsIGIsICh4LCB5KSA9PiB4IC0geSk7XG59XG5cbi8qKlxuICogRWxlbWVudC13aXNlIG1heGltdW0gb2YgdHdvIG1hdHJpY2VzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXhpbXVtKGE6IFNwYXJzZU1hdHJpeCwgYjogU3BhcnNlTWF0cml4KTogU3BhcnNlTWF0cml4IHtcbiAgcmV0dXJuIGVsZW1lbnRXaXNlKGEsIGIsICh4LCB5KSA9PiAoeCA+IHkgPyB4IDogeSkpO1xufVxuXG4vKipcbiAqIFNjYWxhciBtdWx0aXBsaWNhdGlvbiBvZiB0d28gbWF0cmljZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG11bHRpcGx5U2NhbGFyKGE6IFNwYXJzZU1hdHJpeCwgc2NhbGFyOiBudW1iZXIpOiBTcGFyc2VNYXRyaXgge1xuICByZXR1cm4gYS5tYXAoKHZhbHVlOiBudW1iZXIpID0+IHtcbiAgICByZXR1cm4gdmFsdWUgKiBzY2FsYXI7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBuZXcgbWF0cml4IHdpdGggemVybyBlbnRyaWVzIHJlbW92ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbGltaW5hdGVaZXJvcyhtOiBTcGFyc2VNYXRyaXgpIHtcbiAgY29uc3QgemVyb0luZGljZXMgPSBuZXcgU2V0KCk7XG4gIGNvbnN0IHZhbHVlcyA9IG0uZ2V0VmFsdWVzKCk7XG4gIGNvbnN0IHJvd3MgPSBtLmdldFJvd3MoKTtcbiAgY29uc3QgY29scyA9IG0uZ2V0Q29scygpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgIGlmICh2YWx1ZXNbaV0gPT09IDApXG4gICAgICB6ZXJvSW5kaWNlcy5hZGQoaSk7XG4gIH1cbiAgY29uc3QgcmVtb3ZlQnlaZXJvSW5kZXggPSAoXzogYW55LCBpbmRleDogbnVtYmVyKSA9PiAhemVyb0luZGljZXMuaGFzKGluZGV4KTtcbiAgY29uc3QgbmV4dFZhbHVlcyA9IHZhbHVlcy5maWx0ZXIocmVtb3ZlQnlaZXJvSW5kZXgpO1xuICBjb25zdCBuZXh0Um93cyA9IHJvd3MuZmlsdGVyKHJlbW92ZUJ5WmVyb0luZGV4KTtcbiAgY29uc3QgbmV4dENvbHMgPSBjb2xzLmZpbHRlcihyZW1vdmVCeVplcm9JbmRleCk7XG5cbiAgcmV0dXJuIG5ldyBTcGFyc2VNYXRyaXgobmV4dFJvd3MsIG5leHRDb2xzLCBuZXh0VmFsdWVzLCBtLmdldERpbXMoKSk7XG59XG5cbi8qKlxuICogTm9ybWFsaXphdGlvbiBvZiBhIHNwYXJzZSBtYXRyaXguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemUobTogU3BhcnNlTWF0cml4LCBub3JtVHlwZSA9IE5vcm1UeXBlLmwyKSB7XG4gIGNvbnN0IG5vcm1GbiA9IG5vcm1GbnNbbm9ybVR5cGVdO1xuXG4gIGNvbnN0IGNvbHNCeVJvdyA9IG5ldyBNYXA8bnVtYmVyLCBudW1iZXJbXT4oKTtcbiAgbS5mb3JFYWNoKChfLCByb3csIGNvbCkgPT4ge1xuICAgIGNvbnN0IGNvbHMgPSBjb2xzQnlSb3cuZ2V0KHJvdykgfHwgW107XG4gICAgY29scy5wdXNoKGNvbCk7XG4gICAgY29sc0J5Um93LnNldChyb3csIGNvbHMpO1xuICB9KTtcblxuICBjb25zdCBuZXh0TWF0cml4ID0gbmV3IFNwYXJzZU1hdHJpeChbXSwgW10sIFtdLCBtLmdldERpbXMoKSk7XG5cbiAgZm9yIChjb25zdCByb3cgb2YgY29sc0J5Um93LmtleXMoKSkge1xuICAgIGNvbnN0IGNvbHMgPSBjb2xzQnlSb3cuZ2V0KHJvdykhLnNvcnQoKTtcblxuICAgIGNvbnN0IHZhbHMgPSBjb2xzLm1hcCgoY29sKSA9PiBtLmdldChyb3csIGNvbCkpO1xuICAgIGNvbnN0IG5vcm0gPSBub3JtRm4odmFscyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub3JtLmxlbmd0aDsgaSsrKVxuICAgICAgbmV4dE1hdHJpeC5zZXQocm93LCBjb2xzW2ldLCBub3JtW2ldKTtcbiAgfVxuXG4gIHJldHVybiBuZXh0TWF0cml4O1xufVxuXG4vKipcbiAqIFZlY3RvciBub3JtYWxpemF0aW9uIGZ1bmN0aW9uc1xuICovXG50eXBlIE5vcm1GbnMgPSB7IFtrZXkgaW4gTm9ybVR5cGVdOiAodjogbnVtYmVyW10pID0+IG51bWJlcltdIH07XG5jb25zdCBub3JtRm5zOiBOb3JtRm5zID0ge1xuICBbTm9ybVR5cGUubWF4XTogKHhzOiBudW1iZXJbXSkgPT4ge1xuICAgIGxldCBtYXggPSAtSW5maW5pdHk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB4cy5sZW5ndGg7IGkrKylcbiAgICAgIG1heCA9IHhzW2ldID4gbWF4ID8geHNbaV0gOiBtYXg7XG5cbiAgICByZXR1cm4geHMubWFwKCh4KSA9PiB4IC8gbWF4KTtcbiAgfSxcbiAgW05vcm1UeXBlLmwxXTogKHhzOiBudW1iZXJbXSkgPT4ge1xuICAgIGxldCBzdW0gPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeHMubGVuZ3RoOyBpKyspXG4gICAgICBzdW0gKz0geHNbaV07XG5cbiAgICByZXR1cm4geHMubWFwKCh4KSA9PiB4IC8gc3VtKTtcbiAgfSxcbiAgW05vcm1UeXBlLmwyXTogKHhzOiBudW1iZXJbXSkgPT4ge1xuICAgIGxldCBzdW0gPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeHMubGVuZ3RoOyBpKyspXG4gICAgICBzdW0gKz0geHNbaV0gKiogMjtcblxuICAgIHJldHVybiB4cy5tYXAoKHgpID0+IE1hdGguc3FydCh4ICoqIDIgLyBzdW0pKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBlbnVtIE5vcm1UeXBlIHtcbiAgbWF4ID0gJ21heCcsXG4gIGwxID0gJ2wxJyxcbiAgbDIgPSAnbDInLFxufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiBmb3IgZWxlbWVudC13aXNlIG9wZXJhdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIGVsZW1lbnRXaXNlKFxuICBhOiBTcGFyc2VNYXRyaXgsXG4gIGI6IFNwYXJzZU1hdHJpeCxcbiAgb3A6ICh4OiBudW1iZXIsIHk6IG51bWJlcikgPT4gbnVtYmVyXG4pOiBTcGFyc2VNYXRyaXgge1xuICBjb25zdCB2aXNpdGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IHJvd3M6IG51bWJlcltdID0gW107XG4gIGNvbnN0IGNvbHM6IG51bWJlcltdID0gW107XG4gIGNvbnN0IHZhbHM6IG51bWJlcltdID0gW107XG5cbiAgY29uc3Qgb3BlcmF0ZSA9IChyb3c6IG51bWJlciwgY29sOiBudW1iZXIpID0+IHtcbiAgICByb3dzLnB1c2gocm93KTtcbiAgICBjb2xzLnB1c2goY29sKTtcbiAgICBjb25zdCBuZXh0VmFsdWUgPSBvcChhLmdldChyb3csIGNvbCksIGIuZ2V0KHJvdywgY29sKSk7XG4gICAgdmFscy5wdXNoKG5leHRWYWx1ZSk7XG4gIH07XG4gIGNvbnN0IHZhbHVlc0EgPSBhLmdldFZhbHVlcygpO1xuICBjb25zdCByb3dzQSA9IGEuZ2V0Um93cygpO1xuICBjb25zdCBjb2xzQSA9IGEuZ2V0Q29scygpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlc0EubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCByb3cgPSByb3dzQVtpXTtcbiAgICBjb25zdCBjb2wgPSBjb2xzQVtpXTtcbiAgICBjb25zdCBrZXkgPSBgJHtyb3d9OiR7Y29sfWA7XG4gICAgdmlzaXRlZC5hZGQoa2V5KTtcbiAgICBvcGVyYXRlKHJvdywgY29sKTtcbiAgfVxuXG4gIGNvbnN0IHZhbHVlc0IgPSBiLmdldFZhbHVlcygpO1xuICBjb25zdCByb3dzQiA9IGIuZ2V0Um93cygpO1xuICBjb25zdCBjb2xzQiA9IGIuZ2V0Q29scygpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlc0IubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCByb3cgPSByb3dzQltpXTtcbiAgICBjb25zdCBjb2wgPSBjb2xzQltpXTtcbiAgICBjb25zdCBrZXkgPSBgJHtyb3d9OiR7Y29sfWA7XG4gICAgaWYgKHZpc2l0ZWQuaGFzKGtleSkpIGNvbnRpbnVlO1xuICAgIG9wZXJhdGUocm93LCBjb2wpO1xuICB9XG5cbiAgY29uc3QgZGltcyA9IFthLm5Sb3dzLCBhLm5Db2xzXTtcbiAgcmV0dXJuIG5ldyBTcGFyc2VNYXRyaXgocm93cywgY29scywgdmFscywgZGltcyk7XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIGZvciBnZXR0aW5nIGRhdGEsIGluZGljZXMsIGFuZCBpbnB0ciBhcnJheXMgZnJvbSBhIHNwYXJzZVxuICogbWF0cml4IHRvIGZvbGxvdyBjc3IgbWF0cml4IGNvbnZlbnRpb25zLiBTdXBlciBpbmVmZmljaWVudCAoYW5kIGtpbmQgb2ZcbiAqIGRlZmVhdHMgdGhlIHB1cnBvc2Ugb2YgdGhpcyBjb252ZW50aW9uKSBidXQgYSBsb3Qgb2YgdGhlIHBvcnRlZCBweXRob24gdHJlZVxuICogc2VhcmNoIGxvZ2ljIGRlcGVuZHMgb24gdGhpcyBkYXRhIGZvcm1hdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENTUih4OiBTcGFyc2VNYXRyaXgpIHtcbiAgY29uc3QgZW50cmllczogRW50cnlbXSA9IFtdO1xuXG4gIHguZm9yRWFjaCgodmFsdWUsIHJvdywgY29sKSA9PiB7XG4gICAgZW50cmllcy5wdXNoKHt2YWx1ZSwgcm93LCBjb2x9KTtcbiAgfSk7XG5cbiAgZW50cmllcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgaWYgKGEucm93ID09PSBiLnJvdylcbiAgICAgIHJldHVybiBhLmNvbCAtIGIuY29sO1xuICAgIGVsc2VcbiAgICAgIHJldHVybiBhLnJvdyAtIGIucm93O1xuICB9KTtcblxuICBjb25zdCBpbmRpY2VzOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCB2YWx1ZXM6IG51bWJlcltdID0gW107XG4gIGNvbnN0IGluZHB0cjogbnVtYmVyW10gPSBbXTtcblxuICBsZXQgY3VycmVudFJvdyA9IC0xO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB7cm93LCBjb2wsIHZhbHVlfSA9IGVudHJpZXNbaV07XG4gICAgaWYgKHJvdyAhPT0gY3VycmVudFJvdykge1xuICAgICAgY3VycmVudFJvdyA9IHJvdztcbiAgICAgIGluZHB0ci5wdXNoKGkpO1xuICAgIH1cbiAgICBpbmRpY2VzLnB1c2goY29sKTtcbiAgICB2YWx1ZXMucHVzaCh2YWx1ZSk7XG4gIH1cblxuICByZXR1cm4ge2luZGljZXMsIHZhbHVlcywgaW5kcHRyfTtcbn1cbiJdfQ==","/**\n * @license\n *\n * Copyright 2019 Google LLC. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ==============================================================================\n */\n/**\n * This is a JavaScript reimplementation of UMAP (original license below), from\n * the python implementation found at https://github.com/lmcinnes/umap.\n *\n * @author andycoenen@google.com (Andy Coenen)\n */\n/**\n * @license\n * BSD 3-Clause License\n *\n * Copyright (c) 2017, Leland McInnes\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 * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n *\n * * 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 * * Neither the name of the copyright holder nor the names of its\n * contributors may be used to endorse or promote products derived from\n * 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 THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport * as utils from './utils';\nexport class FlatTree {\n hyperplanes;\n offsets;\n children;\n indices;\n constructor(hyperplanes, offsets, children, indices) {\n this.hyperplanes = hyperplanes;\n this.offsets = offsets;\n this.children = children;\n this.indices = indices;\n }\n}\n/**\n * Build a random projection forest with ``nTrees``.\n */\nexport function makeForest(data, nNeighbors, nTrees, random) {\n const leafSize = Math.max(10, nNeighbors);\n const trees = utils\n .range(nTrees)\n .map((_, i) => makeTree(data, leafSize, i, random));\n const forest = trees.map((tree) => flattenTree(tree, leafSize));\n return forest;\n}\n/**\n * Construct a random projection tree based on ``data`` with leaves\n * of size at most ``leafSize``\n */\nfunction makeTree(data, leafSize = 30, n, random) {\n const indices = utils.range(data.length);\n const tree = makeEuclideanTree(data, indices, leafSize, n, random);\n return tree;\n}\nfunction makeEuclideanTree(data, indices, leafSize = 30, q, random) {\n if (indices.length > leafSize) {\n const splitResults = euclideanRandomProjectionSplit(data, indices, random);\n const { indicesLeft, indicesRight, hyperplane, offset } = splitResults;\n const leftChild = makeEuclideanTree(data, indicesLeft, leafSize, q + 1, random);\n const rightChild = makeEuclideanTree(data, indicesRight, leafSize, q + 1, random);\n const node = { leftChild, rightChild, isLeaf: false, hyperplane, offset };\n return node;\n }\n else {\n const node = { indices, isLeaf: true };\n return node;\n }\n}\n/**\n * Given a set of ``indices`` for data points from ``data``, create\n * a random hyperplane to split the data, returning two arrays indices\n * that fall on either side of the hyperplane. This is the basis for a\n * random projection tree, which simply uses this splitting recursively.\n * This particular split uses euclidean distance to determine the hyperplane\n * and which side each data sample falls on.\n */\nfunction euclideanRandomProjectionSplit(data, indices, random) {\n //const dim = 1;\n // Select two random points, set the hyperplane between them\n const leftIndex = utils.tauRandInt(indices.length, random);\n let rightIndex = utils.tauRandInt(indices.length, random);\n rightIndex += leftIndex === rightIndex ? 1 : 0;\n rightIndex = rightIndex % indices.length;\n const left = indices[leftIndex];\n const right = indices[rightIndex];\n // Compute the normal vector to the hyperplane (the vector between the two\n // points) and the offset from the origin\n let hyperplaneOffset = 0;\n let hyperplaneVector = 0;\n hyperplaneVector = data[left] - data[right];\n hyperplaneOffset -=\n (hyperplaneVector * (data[left] + data[right])) / 2.0;\n // For each point compute the margin (project into normal vector)\n // If we are on lower side of the hyperplane put in one pile, otherwise\n // put it in the other pile (if we hit hyperplane on the nose, flip a coin)\n let nLeft = 0;\n let nRight = 0;\n const side = utils.zeros(indices.length);\n for (let i = 0; i < indices.length; i++) {\n let margin = hyperplaneOffset;\n margin += hyperplaneVector * data[indices[i]];\n if (margin === 0) {\n side[i] = utils.tauRandInt(2, random);\n if (side[i] === 0)\n nLeft += 1;\n else\n nRight += 1;\n }\n else if (margin > 0) {\n side[i] = 0;\n nLeft += 1;\n }\n else {\n side[i] = 1;\n nRight += 1;\n }\n }\n // Now that we have the counts, allocate arrays\n const indicesLeft = utils.zeros(nLeft);\n const indicesRight = utils.zeros(nRight);\n // Populate the arrays with indices according to which side they fell on\n nLeft = 0;\n nRight = 0;\n for (let i = 0; i < side.length; i++) {\n if (side[i] === 0) {\n indicesLeft[nLeft] = indices[i];\n nLeft += 1;\n }\n else {\n indicesRight[nRight] = indices[i];\n nRight += 1;\n }\n }\n return {\n indicesLeft,\n indicesRight,\n hyperplane: hyperplaneVector,\n offset: hyperplaneOffset,\n };\n}\nfunction flattenTree(tree, leafSize) {\n const nNodes = numNodes(tree);\n const nLeaves = numLeaves(tree);\n // TODO: Verify that sparse code is not relevant...\n const hyperplanes = utils\n .range(nNodes)\n .map(() => tree.hyperplane ? 1 : 0);\n const offsets = utils.zeros(nNodes);\n const children = utils.range(nNodes).map(() => [-1, -1]);\n const indices = utils\n .range(nLeaves)\n .map(() => utils.range(leafSize).map(() => -1));\n recursiveFlatten(tree, hyperplanes, offsets, children, indices, 0, 0);\n return new FlatTree(hyperplanes, offsets, children, indices);\n}\nfunction recursiveFlatten(tree, hyperplanes, offsets, children, indices, nodeNum, leafNum) {\n if (tree.isLeaf) {\n children[nodeNum][0] = -leafNum;\n // TODO: Triple check this operation corresponds to\n // indices[leafNum : tree.indices.shape[0]] = tree.indices\n indices[leafNum].splice(0, tree.indices.length, ...tree.indices);\n leafNum += 1;\n return { nodeNum, leafNum };\n }\n else {\n hyperplanes[nodeNum] = tree.hyperplane;\n offsets[nodeNum] = tree.offset;\n children[nodeNum][0] = nodeNum + 1;\n const oldNodeNum = nodeNum;\n let res = recursiveFlatten(tree.leftChild, hyperplanes, offsets, children, indices, nodeNum + 1, leafNum);\n nodeNum = res.nodeNum;\n leafNum = res.leafNum;\n children[oldNodeNum][1] = nodeNum + 1;\n res = recursiveFlatten(tree.rightChild, hyperplanes, offsets, children, indices, nodeNum + 1, leafNum);\n return { nodeNum: res.nodeNum, leafNum: res.leafNum };\n }\n}\nfunction numNodes(tree) {\n if (tree.isLeaf)\n return 1;\n else\n return 1 + numNodes(tree.leftChild) + numNodes(tree.rightChild);\n}\nfunction numLeaves(tree) {\n if (tree.isLeaf)\n return 1;\n else\n return numLeaves(tree.leftChild) + numLeaves(tree.rightChild);\n}\n/**\n * Generate an array of sets of candidate nearest neighbors by\n * constructing a random projection forest and taking the leaves of all the\n * trees. Any given tree has leaves that are a set of potential nearest\n * neighbors. Given enough trees the set of all such leaves gives a good\n * likelihood of getting a good set of nearest neighbors in composite. Since\n * such a random projection forest is inexpensive to compute, this can be a\n * useful means of seeding other nearest neighbor algorithms.\n */\nexport function makeLeafArray(rpForest) {\n if (rpForest.length > 0) {\n const output = [];\n for (const tree of rpForest)\n output.push(...tree.indices);\n return output;\n }\n else {\n return [[-1]];\n }\n}\n/**\n * Selects the side of the tree to search during flat tree search.\n */\nfunction selectSide(hyperplane, offset, point, random) {\n let margin = offset;\n margin += hyperplane * point;\n if (margin === 0) {\n const side = utils.tauRandInt(2, random);\n return side;\n }\n else if (margin > 0) {\n return 0;\n }\n else {\n return 1;\n }\n}\n/**\n * Searches a flattened rp-tree for a point.\n */\nexport function searchFlatTree(point, tree, random) {\n let node = 0;\n while (tree.children[node][0] > 0) {\n const side = selectSide(tree.hyperplanes[node], tree.offsets[node], point, random);\n if (side === 0)\n node = tree.children[node][0];\n else\n node = tree.children[node][1];\n }\n const index = -1 * tree.children[node][0];\n return tree.indices[index];\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRyZWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStCRztBQUVILE9BQU8sS0FBSyxLQUFLLE1BQU0sU0FBUyxDQUFDO0FBZWpDLE1BQU0sT0FBTyxRQUFRO0lBRVY7SUFDQTtJQUNBO0lBQ0E7SUFKVCxZQUNTLFdBQXFCLEVBQ3JCLE9BQWlCLEVBQ2pCLFFBQW9CLEVBQ3BCLE9BQW1CO1FBSG5CLGdCQUFXLEdBQVgsV0FBVyxDQUFVO1FBQ3JCLFlBQU8sR0FBUCxPQUFPLENBQVU7UUFDakIsYUFBUSxHQUFSLFFBQVEsQ0FBWTtRQUNwQixZQUFPLEdBQVAsT0FBTyxDQUFZO0lBQ3pCLENBQUM7Q0FDTDtBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FDeEIsSUFBWSxFQUNaLFVBQWtCLEVBQ2xCLE1BQWMsRUFDZCxNQUFnQjtJQUVoQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUUxQyxNQUFNLEtBQUssR0FBRyxLQUFLO1NBQ2hCLEtBQUssQ0FBQyxNQUFNLENBQUM7U0FDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUN0RCxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFFaEUsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsUUFBUSxDQUNmLElBQVks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QUNqQztJQUVELE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKlxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vKipcbiAqIFRoaXMgaXMgYSBKYXZhU2NyaXB0IHJlaW1wbGVtZW50YXRpb24gb2YgVU1BUCAob3JpZ2luYWwgbGljZW5zZSBiZWxvdyksIGZyb21cbiAqIHRoZSBweXRob24gaW1wbGVtZW50YXRpb24gZm91bmQgYXQgaHR0cHM6Ly9naXRodWIuY29tL2xtY2lubmVzL3VtYXAuXG4gKlxuICogQGF1dGhvciBhbmR5Y29lbmVuQGdvb2dsZS5jb20gKEFuZHkgQ29lbmVuKVxuICovXG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIEJTRCAzLUNsYXVzZSBMaWNlbnNlXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE3LCBMZWxhbmQgTWNJbm5lc1xuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuICpcbiAqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4gKiAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICpcbiAqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuICogICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uXG4gKiAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICpcbiAqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlciBub3IgdGhlIG5hbWVzIG9mIGl0c1xuICogICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbVxuICogICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEVcbiAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMXG4gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUlxuICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVJcbiAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksXG4gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRVxuICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqL1xuXG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7UmFuZG9tRm4sIFZlY3Rvcn0gZnJvbSAnLi91bWFwJztcblxuLyoqXG4gKiBUcmVlIGZ1bmN0aW9uYWxpdHkgZm9yIGFwcHJveGltYXRpbmcgbmVhcmVzdCBuZWlnaGJvcnNcbiAqL1xuaW50ZXJmYWNlIFJhbmRvbVByb2plY3Rpb25UcmVlTm9kZSB7XG4gIGlzTGVhZjogYm9vbGVhbjtcbiAgaW5kaWNlcz86IG51bWJlcltdO1xuICBsZWZ0Q2hpbGQ/OiBSYW5kb21Qcm9qZWN0aW9uVHJlZU5vZGU7XG4gIHJpZ2h0Q2hpbGQ/OiBSYW5kb21Qcm9qZWN0aW9uVHJlZU5vZGU7XG4gIGh5cGVycGxhbmU/OiBudW1iZXI7XG4gIG9mZnNldD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIEZsYXRUcmVlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGh5cGVycGxhbmVzOiBudW1iZXJbXSxcbiAgICBwdWJsaWMgb2Zmc2V0czogbnVtYmVyW10sXG4gICAgcHVibGljIGNoaWxkcmVuOiBudW1iZXJbXVtdLFxuICAgIHB1YmxpYyBpbmRpY2VzOiBudW1iZXJbXVtdXG4gICkge31cbn1cblxuLyoqXG4gKiBCdWlsZCBhIHJhbmRvbSBwcm9qZWN0aW9uIGZvcmVzdCB3aXRoIGBgblRyZWVzYGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlRm9yZXN0KFxuICBkYXRhOiBWZWN0b3IsXG4gIG5OZWlnaGJvcnM6IG51bWJlcixcbiAgblRyZWVzOiBudW1iZXIsXG4gIHJhbmRvbTogUmFuZG9tRm5cbikge1xuICBjb25zdCBsZWFmU2l6ZSA9IE1hdGgubWF4KDEwLCBuTmVpZ2hib3JzKTtcblxuICBjb25zdCB0cmVlcyA9IHV0aWxzXG4gICAgLnJhbmdlKG5UcmVlcylcbiAgICAubWFwKChfLCBpKSA9PiBtYWtlVHJlZShkYXRhLCBsZWFmU2l6ZSwgaSwgcmFuZG9tKSk7XG4gIGNvbnN0IGZvcmVzdCA9IHRyZWVzLm1hcCgodHJlZSkgPT4gZmxhdHRlblRyZWUodHJlZSwgbGVhZlNpemUpKTtcblxuICByZXR1cm4gZm9yZXN0O1xufVxuXG4vKipcbiAqIENvbnN0cnVjdCBhIHJhbmRvbSBwcm9qZWN0aW9uIHRyZWUgYmFzZWQgb24gYGBkYXRhYGAgd2l0aCBsZWF2ZXNcbiAqIG9mIHNpemUgYXQgbW9zdCBgYGxlYWZTaXplYGBcbiAqL1xuZnVuY3Rpb24gbWFrZVRyZWUoXG4gIGRhdGE6IFZlY3RvcixcbiAgbGVhZlNpemUgPSAzMCxcbiAgbjogbnVtYmVyLFxuICByYW5kb206IFJhbmRvbUZuXG4pOiBSYW5kb21Qcm9qZWN0aW9uVHJlZU5vZGUge1xuICBjb25zdCBpbmRpY2VzID0gdXRpbHMucmFuZ2UoZGF0YS5sZW5ndGgpO1xuICBjb25zdCB0cmVlID0gbWFrZUV1Y2xpZGVhblRyZWUoZGF0YSwgaW5kaWNlcywgbGVhZlNpemUsIG4sIHJhbmRvbSk7XG4gIHJldHVybiB0cmVlO1xufVxuXG5mdW5jdGlvbiBtYWtlRXVjbGlkZWFuVHJlZShcbiAgZGF0YTogVmVjdG9yLFxuICBpbmRpY2VzOiBudW1iZXJbXSxcbiAgbGVhZlNpemUgPSAzMCxcbiAgcTogbnVtYmVyLFxuICByYW5kb206IFJhbmRvbUZuXG4pOiBSYW5kb21Qcm9qZWN0aW9uVHJlZU5vZGUge1xuICBpZiAoaW5kaWNlcy5sZW5ndGggPiBsZWFmU2l6ZSkge1xuICAgIGNvbnN0IHNwbGl0UmVzdWx0cyA9IGV1Y2xpZGVhblJhbmRvbVByb2plY3Rpb25TcGxpdChkYXRhLCBpbmRpY2VzLCByYW5kb20pO1xuICAgIGNvbnN0IHtpbmRpY2VzTGVmdCwgaW5kaWNlc1JpZ2h0LCBoeXBlcnBsYW5lLCBvZmZzZXR9ID0gc3BsaXRSZXN1bHRzO1xuXG4gICAgY29uc3QgbGVmdENoaWxkID0gbWFrZUV1Y2xpZGVhblRyZWUoXG4gICAgICBkYXRhLFxuICAgICAgaW5kaWNlc0xlZnQsXG4gICAgICBsZWFmU2l6ZSxcbiAgICAgIHEgKyAxLFxuICAgICAgcmFuZG9tXG4gICAgKTtcbiAgICBjb25zdCByaWdodENoaWxkID0gbWFrZUV1Y2xpZGVhblRyZWUoXG4gICAgICBkYXRhLFxuICAgICAgaW5kaWNlc1JpZ2h0LFxuICAgICAgbGVhZlNpemUsXG4gICAgICBxICsgMSxcbiAgICAgIHJhbmRvbVxuICAgICk7XG5cbiAgICBjb25zdCBub2RlID0ge2xlZnRDaGlsZCwgcmlnaHRDaGlsZCwgaXNMZWFmOiBmYWxzZSwgaHlwZXJwbGFuZSwgb2Zmc2V0fTtcbiAgICByZXR1cm4gbm9kZTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBub2RlID0ge2luZGljZXMsIGlzTGVhZjogdHJ1ZX07XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cbn1cblxuLyoqXG4gKiBHaXZlbiBhIHNldCBvZiBgYGluZGljZXNgYCBmb3IgZGF0YSBwb2ludHMgZnJvbSBgYGRhdGFgYCwgY3JlYXRlXG4gKiBhIHJhbmRvbSBoeXBlcnBsYW5lIHRvIHNwbGl0IHRoZSBkYXRhLCByZXR1cm5pbmcgdHdvIGFycmF5cyBpbmRpY2VzXG4gKiB0aGF0IGZhbGwgb24gZWl0aGVyIHNpZGUgb2YgdGhlIGh5cGVycGxhbmUuIFRoaXMgaXMgdGhlIGJhc2lzIGZvciBhXG4gKiByYW5kb20gcHJvamVjdGlvbiB0cmVlLCB3aGljaCBzaW1wbHkgdXNlcyB0aGlzIHNwbGl0dGluZyByZWN1cnNpdmVseS5cbiAqIFRoaXMgcGFydGljdWxhciBzcGxpdCB1c2VzIGV1Y2xpZGVhbiBkaXN0YW5jZSB0byBkZXRlcm1pbmUgdGhlIGh5cGVycGxhbmVcbiAqIGFuZCB3aGljaCBzaWRlIGVhY2ggZGF0YSBzYW1wbGUgZmFsbHMgb24uXG4gKi9cbmZ1bmN0aW9uIGV1Y2xpZGVhblJhbmRvbVByb2plY3Rpb25TcGxpdChcbiAgZGF0YTogVmVjdG9yLFxuICBpbmRpY2VzOiBudW1iZXJbXSxcbiAgcmFuZG9tOiBSYW5kb21GblxuKSB7XG4gIC8vY29uc3QgZGltID0gMTtcblxuICAvLyBTZWxlY3QgdHdvIHJhbmRvbSBwb2ludHMsIHNldCB0aGUgaHlwZXJwbGFuZSBiZXR3ZWVuIHRoZW1cbiAgY29uc3QgbGVmdEluZGV4ID0gdXRpbHMudGF1UmFuZEludChpbmRpY2VzLmxlbmd0aCwgcmFuZG9tKTtcbiAgbGV0IHJpZ2h0SW5kZXggPSB1dGlscy50YXVSYW5kSW50KGluZGljZXMubGVuZ3RoLCByYW5kb20pO1xuICByaWdodEluZGV4ICs9IGxlZnRJbmRleCA9PT0gcmlnaHRJbmRleCA/IDEgOiAwO1xuICByaWdodEluZGV4ID0gcmlnaHRJbmRleCAlIGluZGljZXMubGVuZ3RoO1xuICBjb25zdCBsZWZ0ID0gaW5kaWNlc1tsZWZ0SW5kZXhdO1xuICBjb25zdCByaWdodCA9IGluZGljZXNbcmlnaHRJbmRleF07XG5cbiAgLy8gQ29tcHV0ZSB0aGUgbm9ybWFsIHZlY3RvciB0byB0aGUgaHlwZXJwbGFuZSAodGhlIHZlY3RvciBiZXR3ZWVuIHRoZSB0d29cbiAgLy8gcG9pbnRzKSBhbmQgdGhlIG9mZnNldCBmcm9tIHRoZSBvcmlnaW5cbiAgbGV0IGh5cGVycGxhbmVPZmZzZXQgPSAwO1xuICBsZXQgaHlwZXJwbGFuZVZlY3RvciA9IDA7XG5cblxuICBoeXBlcnBsYW5lVmVjdG9yID0gZGF0YVtsZWZ0XSAtIGRhdGFbcmlnaHRdO1xuICBoeXBlcnBsYW5lT2Zmc2V0IC09XG4gICAgKGh5cGVycGxhbmVWZWN0b3IgKiAoZGF0YVtsZWZ0XSArIGRhdGFbcmlnaHRdKSkgLyAyLjA7XG5cblxuICAvLyBGb3IgZWFjaCBwb2ludCBjb21wdXRlIHRoZSBtYXJnaW4gKHByb2plY3QgaW50byBub3JtYWwgdmVjdG9yKVxuICAvLyBJZiB3ZSBhcmUgb24gbG93ZXIgc2lkZSBvZiB0aGUgaHlwZXJwbGFuZSBwdXQgaW4gb25lIHBpbGUsIG90aGVyd2lzZVxuICAvLyBwdXQgaXQgaW4gdGhlIG90aGVyIHBpbGUgKGlmIHdlIGhpdCBoeXBlcnBsYW5lIG9uIHRoZSBub3NlLCBmbGlwIGEgY29pbilcbiAgbGV0IG5MZWZ0ID0gMDtcbiAgbGV0IG5SaWdodCA9IDA7XG4gIGNvbnN0IHNpZGUgPSB1dGlscy56ZXJvcyhpbmRpY2VzLmxlbmd0aCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaW5kaWNlcy5sZW5ndGg7IGkrKykge1xuICAgIGxldCBtYXJnaW4gPSBoeXBlcnBsYW5lT2Zmc2V0O1xuXG4gICAgbWFyZ2luICs9IGh5cGVycGxhbmVWZWN0b3IgKiBkYXRhW2luZGljZXNbaV1dO1xuXG4gICAgaWYgKG1hcmdpbiA9PT0gMCkge1xuICAgICAgc2lkZVtpXSA9IHV0aWxzLnRhdVJhbmRJbnQoMiwgcmFuZG9tKTtcbiAgICAgIGlmIChzaWRlW2ldID09PSAwKVxuICAgICAgICBuTGVmdCArPSAxO1xuICAgICAgZWxzZVxuICAgICAgICBuUmlnaHQgKz0gMTtcbiAgICB9IGVsc2UgaWYgKG1hcmdpbiA+IDApIHtcbiAgICAgIHNpZGVbaV0gPSAwO1xuICAgICAgbkxlZnQgKz0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2lkZVtpXSA9IDE7XG4gICAgICBuUmlnaHQgKz0gMTtcbiAgICB9XG4gIH1cblxuICAvLyBOb3cgdGhhdCB3ZSBoYXZlIHRoZSBjb3VudHMsIGFsbG9jYXRlIGFycmF5c1xuICBjb25zdCBpbmRpY2VzTGVmdCA9IHV0aWxzLnplcm9zKG5MZWZ0KTtcbiAgY29uc3QgaW5kaWNlc1JpZ2h0ID0gdXRpbHMuemVyb3MoblJpZ2h0KTtcblxuICAvLyBQb3B1bGF0ZSB0aGUgYXJyYXlzIHdpdGggaW5kaWNlcyBhY2NvcmRpbmcgdG8gd2hpY2ggc2lkZSB0aGV5IGZlbGwgb25cbiAgbkxlZnQgPSAwO1xuICBuUmlnaHQgPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNpZGUubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoc2lkZVtpXSA9PT0gMCkge1xuICAgICAgaW5kaWNlc0xlZnRbbkxlZnRdID0gaW5kaWNlc1tpXTtcbiAgICAgIG5MZWZ0ICs9IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGluZGljZXNSaWdodFtuUmlnaHRdID0gaW5kaWNlc1tpXTtcbiAgICAgIG5SaWdodCArPSAxO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgaW5kaWNlc0xlZnQsXG4gICAgaW5kaWNlc1JpZ2h0LFxuICAgIGh5cGVycGxhbmU6IGh5cGVycGxhbmVWZWN0b3IsXG4gICAgb2Zmc2V0OiBoeXBlcnBsYW5lT2Zmc2V0LFxuICB9O1xufVxuXG5mdW5jdGlvbiBmbGF0dGVuVHJlZSh0cmVlOiBSYW5kb21Qcm9qZWN0aW9uVHJlZU5vZGUsIGxlYWZTaXplOiBudW1iZXIpIHtcbiAgY29uc3Qgbk5vZGVzID0gbnVtTm9kZXModHJlZSk7XG4gIGNvbnN0IG5MZWF2ZXMgPSBudW1MZWF2ZXModHJlZSk7XG5cbiAgLy8gVE9ETzogVmVyaWZ5IHRoYXQgc3BhcnNlIGNvZGUgaXMgbm90IHJlbGV2YW50Li4uXG4gIGNvbnN0IGh5cGVycGxhbmVzID0gdXRpbHNcbiAgICAucmFuZ2Uobk5vZGVzKVxuICAgIC5tYXAoKCkgPT4gdHJlZS5oeXBlcnBsYW5lID8gMSA6IDApO1xuXG4gIGNvbnN0IG9mZnNldHMgPSB1dGlscy56ZXJvcyhuTm9kZXMpO1xuICBjb25zdCBjaGlsZHJlbiA9IHV0aWxzLnJhbmdlKG5Ob2RlcykubWFwKCgpID0+IFstMSwgLTFdKTtcbiAgY29uc3QgaW5kaWNlcyA9IHV0aWxzXG4gICAgLnJhbmdlKG5MZWF2ZXMpXG4gICAgLm1hcCgoKSA9PiB1dGlscy5yYW5nZShsZWFmU2l6ZSkubWFwKCgpID0+IC0xKSk7XG4gIHJlY3Vyc2l2ZUZsYXR0ZW4odHJlZSwgaHlwZXJwbGFuZXMsIG9mZnNldHMsIGNoaWxkcmVuLCBpbmRpY2VzLCAwLCAwKTtcbiAgcmV0dXJuIG5ldyBGbGF0VHJlZShoeXBlcnBsYW5lcywgb2Zmc2V0cywgY2hpbGRyZW4sIGluZGljZXMpO1xufVxuXG5mdW5jdGlvbiByZWN1cnNpdmVGbGF0dGVuKFxuICB0cmVlOiBSYW5kb21Qcm9qZWN0aW9uVHJlZU5vZGUsXG4gIGh5cGVycGxhbmVzOiBudW1iZXJbXSxcbiAgb2Zmc2V0czogbnVtYmVyW10sXG4gIGNoaWxkcmVuOiBudW1iZXJbXVtdLFxuICBpbmRpY2VzOiBudW1iZXJbXVtdLFxuICBub2RlTnVtOiBudW1iZXIsXG4gIGxlYWZOdW06IG51bWJlclxuKTogeyBub2RlTnVtOiBudW1iZXI7IGxlYWZOdW06IG51bWJlciB9IHtcbiAgaWYgKHRyZWUuaXNMZWFmKSB7XG4gICAgY2hpbGRyZW5bbm9kZU51bV1bMF0gPSAtbGVhZk51bTtcblxuICAgIC8vIFRPRE86IFRyaXBsZSBjaGVjayB0aGlzIG9wZXJhdGlvbiBjb3JyZXNwb25kcyB0b1xuICAgIC8vIGluZGljZXNbbGVhZk51bSA6IHRyZWUuaW5kaWNlcy5zaGFwZVswXV0gPSB0cmVlLmluZGljZXNcbiAgICBpbmRpY2VzW2xlYWZOdW1dLnNwbGljZSgwLCB0cmVlLmluZGljZXMhLmxlbmd0aCwgLi4udHJlZS5pbmRpY2VzISk7XG4gICAgbGVhZk51bSArPSAxO1xuICAgIHJldHVybiB7bm9kZU51bSwgbGVhZk51bX07XG4gIH0gZWxzZSB7XG4gICAgaHlwZXJwbGFuZXNbbm9kZU51bV0gPSB0cmVlLmh5cGVycGxhbmUhO1xuICAgIG9mZnNldHNbbm9kZU51bV0gPSB0cmVlLm9mZnNldCE7XG4gICAgY2hpbGRyZW5bbm9kZU51bV1bMF0gPSBub2RlTnVtICsgMTtcbiAgICBjb25zdCBvbGROb2RlTnVtID0gbm9kZU51bTtcblxuICAgIGxldCByZXMgPSByZWN1cnNpdmVGbGF0dGVuKFxuICAgICAgdHJlZS5sZWZ0Q2hpbGQhLFxuICAgICAgaHlwZXJwbGFuZXMsXG4gICAgICBvZmZzZXRzLFxuICAgICAgY2hpbGRyZW4sXG4gICAgICBpbmRpY2VzLFxuICAgICAgbm9kZU51bSArIDEsXG4gICAgICBsZWFmTnVtXG4gICAgKTtcbiAgICBub2RlTnVtID0gcmVzLm5vZGVOdW07XG4gICAgbGVhZk51bSA9IHJlcy5sZWFmTnVtO1xuXG4gICAgY2hpbGRyZW5bb2xkTm9kZU51bV1bMV0gPSBub2RlTnVtICsgMTtcblxuICAgIHJlcyA9IHJlY3Vyc2l2ZUZsYXR0ZW4oXG4gICAgICB0cmVlLnJpZ2h0Q2hpbGQhLFxuICAgICAgaHlwZXJwbGFuZXMsXG4gICAgICBvZmZzZXRzLFxuICAgICAgY2hpbGRyZW4sXG4gICAgICBpbmRpY2VzLFxuICAgICAgbm9kZU51bSArIDEsXG4gICAgICBsZWFmTnVtXG4gICAgKTtcbiAgICByZXR1cm4ge25vZGVOdW06IHJlcy5ub2RlTnVtLCBsZWFmTnVtOiByZXMubGVhZk51bX07XG4gIH1cbn1cblxuZnVuY3Rpb24gbnVtTm9kZXModHJlZTogUmFuZG9tUHJvamVjdGlvblRyZWVOb2RlKTogbnVtYmVyIHtcbiAgaWYgKHRyZWUuaXNMZWFmKVxuICAgIHJldHVybiAxO1xuICBlbHNlXG4gICAgcmV0dXJuIDEgKyBudW1Ob2Rlcyh0cmVlLmxlZnRDaGlsZCEpICsgbnVtTm9kZXModHJlZS5yaWdodENoaWxkISk7XG59XG5cbmZ1bmN0aW9uIG51bUxlYXZlcyh0cmVlOiBSYW5kb21Qcm9qZWN0aW9uVHJlZU5vZGUpOiBudW1iZXIge1xuICBpZiAodHJlZS5pc0xlYWYpXG4gICAgcmV0dXJuIDE7XG4gIGVsc2VcbiAgICByZXR1cm4gbnVtTGVhdmVzKHRyZWUubGVmdENoaWxkISkgKyBudW1MZWF2ZXModHJlZS5yaWdodENoaWxkISk7XG59XG5cbi8qKlxuICogR2VuZXJhdGUgYW4gYXJyYXkgb2Ygc2V0cyBvZiBjYW5kaWRhdGUgbmVhcmVzdCBuZWlnaGJvcnMgYnlcbiAqIGNvbnN0cnVjdGluZyBhIHJhbmRvbSBwcm9qZWN0aW9uIGZvcmVzdCBhbmQgdGFraW5nIHRoZSBsZWF2ZXMgb2YgYWxsIHRoZVxuICogdHJlZXMuIEFueSBnaXZlbiB0cmVlIGhhcyBsZWF2ZXMgdGhhdCBhcmUgYSBzZXQgb2YgcG90ZW50aWFsIG5lYXJlc3RcbiAqIG5laWdoYm9ycy4gR2l2ZW4gZW5vdWdoIHRyZWVzIHRoZSBzZXQgb2YgYWxsIHN1Y2ggbGVhdmVzIGdpdmVzIGEgZ29vZFxuICogbGlrZWxpaG9vZCBvZiBnZXR0aW5nIGEgZ29vZCBzZXQgb2YgbmVhcmVzdCBuZWlnaGJvcnMgaW4gY29tcG9zaXRlLiBTaW5jZVxuICogc3VjaCBhIHJhbmRvbSBwcm9qZWN0aW9uIGZvcmVzdCBpcyBpbmV4cGVuc2l2ZSB0byBjb21wdXRlLCB0aGlzIGNhbiBiZSBhXG4gKiB1c2VmdWwgbWVhbnMgb2Ygc2VlZGluZyBvdGhlciBuZWFyZXN0IG5laWdoYm9yIGFsZ29yaXRobXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlTGVhZkFycmF5KHJwRm9yZXN0OiBGbGF0VHJlZVtdKTogbnVtYmVyW11bXSB7XG4gIGlmIChycEZvcmVzdC5sZW5ndGggPiAwKSB7XG4gICAgY29uc3Qgb3V0cHV0OiBudW1iZXJbXVtdID0gW107XG4gICAgZm9yIChjb25zdCB0cmVlIG9mIHJwRm9yZXN0KVxuICAgICAgb3V0cHV0LnB1c2goLi4udHJlZS5pbmRpY2VzISk7XG5cbiAgICByZXR1cm4gb3V0cHV0O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBbWy0xXV07XG4gIH1cbn1cblxuLyoqXG4gKiBTZWxlY3RzIHRoZSBzaWRlIG9mIHRoZSB0cmVlIHRvIHNlYXJjaCBkdXJpbmcgZmxhdCB0cmVlIHNlYXJjaC5cbiAqL1xuZnVuY3Rpb24gc2VsZWN0U2lkZShcbiAgaHlwZXJwbGFuZTogbnVtYmVyLFxuICBvZmZzZXQ6IG51bWJlcixcbiAgcG9pbnQ6IG51bWJlcixcbiAgcmFuZG9tOiBSYW5kb21GblxuKSB7XG4gIGxldCBtYXJnaW4gPSBvZmZzZXQ7XG5cbiAgbWFyZ2luICs9IGh5cGVycGxhbmUgKiBwb2ludDtcblxuXG4gIGlmIChtYXJnaW4gPT09IDApIHtcbiAgICBjb25zdCBzaWRlID0gdXRpbHMudGF1UmFuZEludCgyLCByYW5kb20pO1xuICAgIHJldHVybiBzaWRlO1xuICB9IGVsc2UgaWYgKG1hcmdpbiA+IDApIHtcbiAgICByZXR1cm4gMDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gMTtcbiAgfVxufVxuXG4vKipcbiAqIFNlYXJjaGVzIGEgZmxhdHRlbmVkIHJwLXRyZWUgZm9yIGEgcG9pbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWFyY2hGbGF0VHJlZShcbiAgcG9pbnQ6IG51bWJlcixcbiAgdHJlZTogRmxhdFRyZWUsXG4gIHJhbmRvbTogUmFuZG9tRm5cbikge1xuICBsZXQgbm9kZSA9IDA7XG4gIHdoaWxlICh0cmVlLmNoaWxkcmVuW25vZGVdWzBdID4gMCkge1xuICAgIGNvbnN0IHNpZGUgPSBzZWxlY3RTaWRlKFxuICAgICAgdHJlZS5oeXBlcnBsYW5lc1tub2RlXSxcbiAgICAgIHRyZWUub2Zmc2V0c1tub2RlXSxcbiAgICAgIHBvaW50LFxuICAgICAgcmFuZG9tXG4gICAgKTtcbiAgICBpZiAoc2lkZSA9PT0gMClcbiAgICAgIG5vZGUgPSB0cmVlLmNoaWxkcmVuW25vZGVdWzBdO1xuICAgIGVsc2VcbiAgICAgIG5vZGUgPSB0cmVlLmNoaWxkcmVuW25vZGVdWzFdO1xuICB9XG5cbiAgY29uc3QgaW5kZXggPSAtMSAqIHRyZWUuY2hpbGRyZW5bbm9kZV1bMF07XG4gIHJldHVybiB0cmVlLmluZGljZXNbaW5kZXhdO1xufVxuIl19","const toString = Object.prototype.toString;\n\nexport default function isAnyArray(object) {\n return toString.call(object).endsWith('Array]');\n}\n","/**\n * Calculate current error\n * @ignore\n * @param {{x:Array<number>, y:Array<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {Array<number>} parameters - Array of current parameter values\n * @param {function} parameterizedFunction - The parameters and returns a function with the independent variable as a parameter\n * @return {number}\n */\nexport default function errorCalculation(\n data,\n parameters,\n parameterizedFunction,\n) {\n let error = 0;\n const func = parameterizedFunction(parameters);\n\n for (let i = 0; i < data.x.length; i++) {\n error += Math.abs(data.y[i] - func(data.x[i]));\n }\n\n return error;\n}\n","const toString = Object.prototype.toString;\n/**\n * Checks if an object is an instance of an Array (array or typed array).\n *\n * @param {any} value - Object to check.\n * @returns {boolean} True if the object is an array.\n */\nexport function isAnyArray(value) {\n return toString.call(value).endsWith('Array]');\n}\n//# sourceMappingURL=index.js.map","const toString = Object.prototype.toString;\n/**\n * Checks if an object is an instance of an Array (array or typed array).\n *\n * @param {any} value - Object to check.\n * @returns {boolean} True if the object is an array.\n */\nexport function isAnyArray(value) {\n return toString.call(value).endsWith('Array]');\n}\n//# sourceMappingURL=index.js.map","const toString = Object.prototype.toString;\n/**\n * Checks if an object is an instance of an Array (array or typed array).\n *\n * @param {any} value - Object to check.\n * @returns {boolean} True if the object is an array.\n */\nexport function isAnyArray(value) {\n return toString.call(value).endsWith('Array]');\n}\n//# sourceMappingURL=index.js.map","const toString = Object.prototype.toString;\n/**\n * Checks if an object is an instance of an Array (array or typed array).\n *\n * @param {any} value - Object to check.\n * @returns {boolean} True if the object is an array.\n */\nexport function isAnyArray(value) {\n return toString.call(value).endsWith('Array]');\n}\n//# sourceMappingURL=index.js.map","import { isAnyArray } from 'is-any-array';\nimport max from 'ml-array-max';\nimport min from 'ml-array-min';\n\nfunction rescale(input) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (!isAnyArray(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 (!isAnyArray(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 { rescale as default };\n","import { isAnyArray } from 'is-any-array';\n\nfunction min(input) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (!isAnyArray(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 _options$fromIndex = options.fromIndex,\n fromIndex = _options$fromIndex === void 0 ? 0 : _options$fromIndex,\n _options$toIndex = options.toIndex,\n toIndex = _options$toIndex === void 0 ? input.length : _options$toIndex;\n\n if (fromIndex < 0 || fromIndex >= input.length || !Number.isInteger(fromIndex)) {\n throw new Error('fromIndex must be a positive integer smaller than length');\n }\n\n if (toIndex <= fromIndex || toIndex > input.length || !Number.isInteger(toIndex)) {\n throw new Error('toIndex must be an integer greater than fromIndex and at most equal to length');\n }\n\n var minValue = input[fromIndex];\n\n for (var i = fromIndex + 1; i < toIndex; i++) {\n if (input[i] < minValue) minValue = input[i];\n }\n\n return minValue;\n}\n\nexport { min as default };\n","import { isAnyArray } from 'is-any-array';\n\nfunction max(input) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (!isAnyArray(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 _options$fromIndex = options.fromIndex,\n fromIndex = _options$fromIndex === void 0 ? 0 : _options$fromIndex,\n _options$toIndex = options.toIndex,\n toIndex = _options$toIndex === void 0 ? input.length : _options$toIndex;\n\n if (fromIndex < 0 || fromIndex >= input.length || !Number.isInteger(fromIndex)) {\n throw new Error('fromIndex must be a positive integer smaller than length');\n }\n\n if (toIndex <= fromIndex || toIndex > input.length || !Number.isInteger(toIndex)) {\n throw new Error('toIndex must be an integer greater than fromIndex and at most equal to length');\n }\n\n var maxValue = input[fromIndex];\n\n for (var i = fromIndex + 1; i < toIndex; i++) {\n if (input[i] > maxValue) maxValue = input[i];\n }\n\n return maxValue;\n}\n\nexport { max as default };\n","const indent = ' '.repeat(2);\nconst indentData = ' '.repeat(4);\n\nexport function inspectMatrix() {\n return inspectMatrixWithOptions(this);\n}\n\nexport function inspectMatrixWithOptions(matrix, options = {}) {\n const {\n maxRows = 15,\n maxColumns = 10,\n maxNumSize = 8,\n padMinus = 'auto',\n } = options;\n return `${matrix.constructor.name} {\n${indent}[\n${indentData}${inspectData(matrix, maxRows, maxColumns, maxNumSize, padMinus)}\n${indent}]\n${indent}rows: ${matrix.rows}\n${indent}columns: ${matrix.columns}\n}`;\n}\n\nfunction inspectData(matrix, maxRows, maxColumns, maxNumSize, padMinus) {\n const { rows, columns } = matrix;\n const maxI = Math.min(rows, maxRows);\n const maxJ = Math.min(columns, maxColumns);\n const result = [];\n\n if (padMinus === 'auto') {\n padMinus = false;\n loop: for (let i = 0; i < maxI; i++) {\n for (let j = 0; j < maxJ; j++) {\n if (matrix.get(i, j) < 0) {\n padMinus = true;\n break loop;\n }\n }\n }\n }\n\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), maxNumSize, padMinus));\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${indentData}`);\n}\n\nfunction formatNumber(num, maxNumSize, padMinus) {\n return (\n num >= 0 && padMinus\n ? ` ${formatNumber2(num, maxNumSize - 1)}`\n : formatNumber2(num, maxNumSize)\n ).padEnd(maxNumSize);\n}\n\nfunction formatNumber2(num, len) {\n // small.length numbers should be as is\n let str = num.toString();\n if (str.length <= len) return str;\n\n // (7)'0.00123' is better then (7)'1.23e-2'\n // (8)'0.000123' is worse then (7)'1.23e-3',\n let fix = num.toFixed(len);\n if (fix.length > len) {\n fix = num.toFixed(Math.max(0, len - (fix.length - len)));\n }\n if (\n fix.length <= len &&\n !fix.startsWith('0.000') &&\n !fix.startsWith('-0.000')\n ) {\n return fix;\n }\n\n // well, if it's still too long the user should've used longer numbers\n let exp = num.toExponential(len);\n if (exp.length > len) {\n exp = num.toExponential(Math.max(0, len - (exp.length - len)));\n }\n return exp.slice(0);\n}\n","import { isAnyArray } from 'is-any-array';\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 checkRowIndices(matrix, rowIndices) {\n if (!isAnyArray(rowIndices)) {\n throw new TypeError('row indices must be an array');\n }\n\n for (let i = 0; i < rowIndices.length; i++) {\n if (rowIndices[i] < 0 || rowIndices[i] >= matrix.rows) {\n throw new RangeError('row indices are out of range');\n }\n }\n}\n\nexport function checkColumnIndices(matrix, columnIndices) {\n if (!isAnyArray(columnIndices)) {\n throw new TypeError('column indices must be an array');\n }\n\n for (let i = 0; i < columnIndices.length; i++) {\n if (columnIndices[i] < 0 || columnIndices[i] >= matrix.columns) {\n throw new RangeError('column indices are out of range');\n }\n }\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\nexport function checkNonEmpty(matrix) {\n if (matrix.isEmpty()) {\n throw new Error('Empty matrix has no elements to index');\n }\n}\n","import { isAnyArray } from 'is-any-array';\nimport rescale from 'ml-array-rescale';\n\nimport { inspectMatrix, inspectMatrixWithOptions } from './inspect';\nimport { installMathOperations } from './mathOperations';\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 {\n checkRowVector,\n checkRowIndex,\n checkColumnIndex,\n checkColumnVector,\n checkRange,\n checkNonEmpty,\n checkRowIndices,\n checkColumnIndices,\n} from './util';\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 isEmpty() {\n return this.rows === 0 || this.columns === 0;\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(by) {\n if (this.isEmpty()) {\n return NaN;\n }\n switch (by) {\n case 'row': {\n const max = new Array(this.rows).fill(Number.NEGATIVE_INFINITY);\n for (let row = 0; row < this.rows; row++) {\n for (let column = 0; column < this.columns; column++) {\n if (this.get(row, column) > max[row]) {\n max[row] = this.get(row, column);\n }\n }\n }\n return max;\n }\n case 'column': {\n const max = new Array(this.columns).fill(Number.NEGATIVE_INFINITY);\n for (let row = 0; row < this.rows; row++) {\n for (let column = 0; column < this.columns; column++) {\n if (this.get(row, column) > max[column]) {\n max[column] = this.get(row, column);\n }\n }\n }\n return max;\n }\n case undefined: {\n let max = this.get(0, 0);\n for (let row = 0; row < this.rows; row++) {\n for (let column = 0; column < this.columns; column++) {\n if (this.get(row, column) > max) {\n max = this.get(row, column);\n }\n }\n }\n return max;\n }\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n maxIndex() {\n checkNonEmpty(this);\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(by) {\n if (this.isEmpty()) {\n return NaN;\n }\n\n switch (by) {\n case 'row': {\n const min = new Array(this.rows).fill(Number.POSITIVE_INFINITY);\n for (let row = 0; row < this.rows; row++) {\n for (let column = 0; column < this.columns; column++) {\n if (this.get(row, column) < min[row]) {\n min[row] = this.get(row, column);\n }\n }\n }\n return min;\n }\n case 'column': {\n const min = new Array(this.columns).fill(Number.POSITIVE_INFINITY);\n for (let row = 0; row < this.rows; row++) {\n for (let column = 0; column < this.columns; column++) {\n if (this.get(row, column) < min[column]) {\n min[column] = this.get(row, column);\n }\n }\n }\n return min;\n }\n case undefined: {\n let min = this.get(0, 0);\n for (let row = 0; row < this.rows; row++) {\n for (let column = 0; column < this.columns; column++) {\n if (this.get(row, column) < min) {\n min = this.get(row, column);\n }\n }\n }\n return min;\n }\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n minIndex() {\n checkNonEmpty(this);\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 if (this.isEmpty()) {\n return NaN;\n }\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 checkNonEmpty(this);\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 if (this.isEmpty()) {\n return NaN;\n }\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 checkNonEmpty(this);\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 if (this.isEmpty()) {\n return NaN;\n }\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 checkNonEmpty(this);\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 if (this.isEmpty()) {\n return NaN;\n }\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 checkNonEmpty(this);\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\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 if (row.length > 0) {\n rescale(row, { min, max, output: row });\n }\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 if (column.length) {\n rescale(column, {\n min: min,\n max: max,\n output: column,\n });\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 kroneckerSum(other) {\n other = Matrix.checkMatrix(other);\n if (!this.isSquare() || !other.isSquare()) {\n throw new Error('Kronecker Sum needs two Square Matrices');\n }\n let m = this.rows;\n let n = other.rows;\n let AxI = this.kroneckerProduct(Matrix.eye(n, n));\n let IxB = Matrix.eye(m, m).kroneckerProduct(other);\n return AxI.add(IxB);\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 if (matrix.isEmpty()) {\n return this;\n }\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 checkRowIndices(this, rowIndices);\n checkColumnIndices(this, columnIndices);\n let newMatrix = new Matrix(rowIndices.length, columnIndices.length);\n for (let i = 0; i < rowIndices.length; i++) {\n let rowIndex = rowIndices[i];\n for (let j = 0; j < columnIndices.length; j++) {\n let columnIndex = columnIndices[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 (!isAnyArray(mean)) {\n throw new TypeError('mean must be an array');\n }\n return varianceByRow(this, unbiased, mean);\n }\n case 'column': {\n if (!isAnyArray(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 (!isAnyArray(center)) {\n throw new TypeError('center must be an array');\n }\n centerByRow(this, center);\n return this;\n }\n case 'column': {\n if (!isAnyArray(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 (!isAnyArray(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 (!isAnyArray(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 toString(options) {\n return inspectMatrixWithOptions(this, options);\n }\n}\n\nAbstractMatrix.prototype.klass = 'Matrix';\nif (typeof Symbol !== 'undefined') {\n AbstractMatrix.prototype[Symbol.for('nodejs.util.inspect.custom')] =\n inspectMatrix;\n}\n\nfunction compareNumbers(a, b) {\n return a - b;\n}\n\nfunction isArrayOfNumbers(array) {\n return array.every((element) => {\n return typeof element === 'number';\n });\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 // eslint-disable-next-line no-constructor-return\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 (isAnyArray(nRows)) {\n // Copy the values from the 2D array\n const arrayData = nRows;\n nRows = arrayData.length;\n nColumns = nRows ? arrayData[0].length : 0;\n if (typeof nColumns !== 'number') {\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 if (!isArrayOfNumbers(arrayData[i])) {\n throw new TypeError('Input data contains non-numeric values');\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 }\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 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));\n this.data.splice(index, 0, array);\n this.rows += 1;\n return this;\n }\n\n removeColumn(index) {\n checkColumnIndex(this, index);\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","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","import { AbstractMatrix } from '../matrix';\n\nexport default class WrapperMatrix2D extends AbstractMatrix {\n constructor(data) {\n super();\n this.data = data;\n this.rows = data.length;\n this.columns = data[0].length;\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","import Matrix from '../matrix';\nimport WrapperMatrix2D from '../wrap/WrapperMatrix2D';\n\nexport default class LuDecomposition {\n constructor(matrix) {\n matrix = WrapperMatrix2D.checkMatrix(matrix);\n\n let lu = matrix.clone();\n let rows = lu.rows;\n let columns = lu.columns;\n let pivotVector = new Float64Array(rows);\n let pivotSign = 1;\n let i, j, k, p, s, t, v;\n let LUcolj, kmax;\n\n for (i = 0; i < rows; i++) {\n pivotVector[i] = i;\n }\n\n LUcolj = new Float64Array(rows);\n\n for (j = 0; j < columns; j++) {\n for (i = 0; i < rows; i++) {\n LUcolj[i] = lu.get(i, j);\n }\n\n for (i = 0; i < rows; i++) {\n kmax = Math.min(i, j);\n s = 0;\n for (k = 0; k < kmax; k++) {\n s += lu.get(i, k) * LUcolj[k];\n }\n LUcolj[i] -= s;\n lu.set(i, j, LUcolj[i]);\n }\n\n p = j;\n for (i = j + 1; i < rows; i++) {\n if (Math.abs(LUcolj[i]) > Math.abs(LUcolj[p])) {\n p = i;\n }\n }\n\n if (p !== j) {\n for (k = 0; k < columns; k++) {\n t = lu.get(p, k);\n lu.set(p, k, lu.get(j, k));\n lu.set(j, k, t);\n }\n\n v = pivotVector[p];\n pivotVector[p] = pivotVector[j];\n pivotVector[j] = v;\n\n pivotSign = -pivotSign;\n }\n\n if (j < rows && lu.get(j, j) !== 0) {\n for (i = j + 1; i < rows; i++) {\n lu.set(i, j, lu.get(i, j) / lu.get(j, j));\n }\n }\n }\n\n this.LU = lu;\n this.pivotVector = pivotVector;\n this.pivotSign = pivotSign;\n }\n\n isSingular() {\n let data = this.LU;\n let col = data.columns;\n for (let j = 0; j < col; j++) {\n if (data.get(j, j) === 0) {\n return true;\n }\n }\n return false;\n }\n\n solve(value) {\n value = Matrix.checkMatrix(value);\n\n let lu = this.LU;\n let rows = lu.rows;\n\n if (rows !== value.rows) {\n throw new Error('Invalid matrix dimensions');\n }\n if (this.isSingular()) {\n throw new Error('LU matrix is singular');\n }\n\n let count = value.columns;\n let X = value.subMatrixRow(this.pivotVector, 0, count - 1);\n let columns = lu.columns;\n let i, j, k;\n\n for (k = 0; k < columns; k++) {\n for (i = k + 1; i < columns; i++) {\n for (j = 0; j < count; j++) {\n X.set(i, j, X.get(i, j) - X.get(k, j) * lu.get(i, k));\n }\n }\n }\n for (k = columns - 1; k >= 0; k--) {\n for (j = 0; j < count; j++) {\n X.set(k, j, X.get(k, j) / lu.get(k, k));\n }\n for (i = 0; i < k; i++) {\n for (j = 0; j < count; j++) {\n X.set(i, j, X.get(i, j) - X.get(k, j) * lu.get(i, k));\n }\n }\n }\n return X;\n }\n\n get determinant() {\n let data = this.LU;\n if (!data.isSquare()) {\n throw new Error('Matrix must be square');\n }\n let determinant = this.pivotSign;\n let col = data.columns;\n for (let j = 0; j < col; j++) {\n determinant *= data.get(j, j);\n }\n return determinant;\n }\n\n get lowerTriangularMatrix() {\n let data = this.LU;\n let rows = data.rows;\n let columns = data.columns;\n let X = new Matrix(rows, columns);\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < columns; j++) {\n if (i > j) {\n X.set(i, j, data.get(i, j));\n } else if (i === j) {\n X.set(i, j, 1);\n } else {\n X.set(i, j, 0);\n }\n }\n }\n return X;\n }\n\n get upperTriangularMatrix() {\n let data = this.LU;\n let rows = data.rows;\n let columns = data.columns;\n let X = new Matrix(rows, columns);\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < columns; j++) {\n if (i <= j) {\n X.set(i, j, data.get(i, j));\n } else {\n X.set(i, j, 0);\n }\n }\n }\n return X;\n }\n\n get pivotPermutationVector() {\n return Array.from(this.pivotVector);\n }\n}\n","export function hypotenuse(a, b) {\n let r = 0;\n if (Math.abs(a) > Math.abs(b)) {\n r = b / a;\n return Math.abs(a) * Math.sqrt(1 + r * r);\n }\n if (b !== 0) {\n r = a / b;\n return Math.abs(b) * Math.sqrt(1 + r * r);\n }\n return 0;\n}\n","import Matrix from '../matrix';\nimport WrapperMatrix2D from '../wrap/WrapperMatrix2D';\n\nimport { hypotenuse } from './util';\n\nexport default class QrDecomposition {\n constructor(value) {\n value = WrapperMatrix2D.checkMatrix(value);\n\n let qr = value.clone();\n let m = value.rows;\n let n = value.columns;\n let rdiag = new Float64Array(n);\n let i, j, k, s;\n\n for (k = 0; k < n; k++) {\n let nrm = 0;\n for (i = k; i < m; i++) {\n nrm = hypotenuse(nrm, qr.get(i, k));\n }\n if (nrm !== 0) {\n if (qr.get(k, k) < 0) {\n nrm = -nrm;\n }\n for (i = k; i < m; i++) {\n qr.set(i, k, qr.get(i, k) / nrm);\n }\n qr.set(k, k, qr.get(k, k) + 1);\n for (j = k + 1; j < n; j++) {\n s = 0;\n for (i = k; i < m; i++) {\n s += qr.get(i, k) * qr.get(i, j);\n }\n s = -s / qr.get(k, k);\n for (i = k; i < m; i++) {\n qr.set(i, j, qr.get(i, j) + s * qr.get(i, k));\n }\n }\n }\n rdiag[k] = -nrm;\n }\n\n this.QR = qr;\n this.Rdiag = rdiag;\n }\n\n solve(value) {\n value = Matrix.checkMatrix(value);\n\n let qr = this.QR;\n let m = qr.rows;\n\n if (value.rows !== m) {\n throw new Error('Matrix row dimensions must agree');\n }\n if (!this.isFullRank()) {\n throw new Error('Matrix is rank deficient');\n }\n\n let count = value.columns;\n let X = value.clone();\n let n = qr.columns;\n let i, j, k, s;\n\n for (k = 0; k < n; k++) {\n for (j = 0; j < count; j++) {\n s = 0;\n for (i = k; i < m; i++) {\n s += qr.get(i, k) * X.get(i, j);\n }\n s = -s / qr.get(k, k);\n for (i = k; i < m; i++) {\n X.set(i, j, X.get(i, j) + s * qr.get(i, k));\n }\n }\n }\n for (k = n - 1; k >= 0; k--) {\n for (j = 0; j < count; j++) {\n X.set(k, j, X.get(k, j) / this.Rdiag[k]);\n }\n for (i = 0; i < k; i++) {\n for (j = 0; j < count; j++) {\n X.set(i, j, X.get(i, j) - X.get(k, j) * qr.get(i, k));\n }\n }\n }\n\n return X.subMatrix(0, n - 1, 0, count - 1);\n }\n\n isFullRank() {\n let columns = this.QR.columns;\n for (let i = 0; i < columns; i++) {\n if (this.Rdiag[i] === 0) {\n return false;\n }\n }\n return true;\n }\n\n get upperTriangularMatrix() {\n let qr = this.QR;\n let n = qr.columns;\n let X = new Matrix(n, n);\n let i, j;\n for (i = 0; i < n; i++) {\n for (j = 0; j < n; j++) {\n if (i < j) {\n X.set(i, j, qr.get(i, j));\n } else if (i === j) {\n X.set(i, j, this.Rdiag[i]);\n } else {\n X.set(i, j, 0);\n }\n }\n }\n return X;\n }\n\n get orthogonalMatrix() {\n let qr = this.QR;\n let rows = qr.rows;\n let columns = qr.columns;\n let X = new Matrix(rows, columns);\n let i, j, k, s;\n\n for (k = columns - 1; k >= 0; k--) {\n for (i = 0; i < rows; i++) {\n X.set(i, k, 0);\n }\n X.set(k, k, 1);\n for (j = k; j < columns; j++) {\n if (qr.get(k, k) !== 0) {\n s = 0;\n for (i = k; i < rows; i++) {\n s += qr.get(i, k) * X.get(i, j);\n }\n\n s = -s / qr.get(k, k);\n\n for (i = k; i < rows; i++) {\n X.set(i, j, X.get(i, j) + s * qr.get(i, k));\n }\n }\n }\n }\n return X;\n }\n}\n","import Matrix from '../matrix';\nimport WrapperMatrix2D from '../wrap/WrapperMatrix2D';\n\nimport { hypotenuse } from './util';\n\nexport default class SingularValueDecomposition {\n constructor(value, options = {}) {\n value = WrapperMatrix2D.checkMatrix(value);\n\n if (value.isEmpty()) {\n throw new Error('Matrix must be non-empty');\n }\n\n let m = value.rows;\n let n = value.columns;\n\n const {\n computeLeftSingularVectors = true,\n computeRightSingularVectors = true,\n autoTranspose = false,\n } = options;\n\n let wantu = Boolean(computeLeftSingularVectors);\n let wantv = Boolean(computeRightSingularVectors);\n\n let swapped = false;\n let a;\n if (m < n) {\n if (!autoTranspose) {\n a = value.clone();\n // eslint-disable-next-line no-console\n console.warn(\n 'Computing SVD on a matrix with more columns than rows. Consider enabling autoTranspose',\n );\n } else {\n a = value.transpose();\n m = a.rows;\n n = a.columns;\n swapped = true;\n let aux = wantu;\n wantu = wantv;\n wantv = aux;\n }\n } else {\n a = value.clone();\n }\n\n let nu = Math.min(m, n);\n let ni = Math.min(m + 1, n);\n let s = new Float64Array(ni);\n let U = new Matrix(m, nu);\n let V = new Matrix(n, n);\n\n let e = new Float64Array(n);\n let work = new Float64Array(m);\n\n let si = new Float64Array(ni);\n for (let i = 0; i < ni; i++) si[i] = i;\n\n let nct = Math.min(m - 1, n);\n let nrt = Math.max(0, Math.min(n - 2, m));\n let mrc = Math.max(nct, nrt);\n\n for (let k = 0; k < mrc; k++) {\n if (k < nct) {\n s[k] = 0;\n for (let i = k; i < m; i++) {\n s[k] = hypotenuse(s[k], a.get(i, k));\n }\n if (s[k] !== 0) {\n if (a.get(k, k) < 0) {\n s[k] = -s[k];\n }\n for (let i = k; i < m; i++) {\n a.set(i, k, a.get(i, k) / s[k]);\n }\n a.set(k, k, a.get(k, k) + 1);\n }\n s[k] = -s[k];\n }\n\n for (let j = k + 1; j < n; j++) {\n if (k < nct && s[k] !== 0) {\n let t = 0;\n for (let i = k; i < m; i++) {\n t += a.get(i, k) * a.get(i, j);\n }\n t = -t / a.get(k, k);\n for (let i = k; i < m; i++) {\n a.set(i, j, a.get(i, j) + t * a.get(i, k));\n }\n }\n e[j] = a.get(k, j);\n }\n\n if (wantu && k < nct) {\n for (let i = k; i < m; i++) {\n U.set(i, k, a.get(i, k));\n }\n }\n\n if (k < nrt) {\n e[k] = 0;\n for (let i = k + 1; i < n; i++) {\n e[k] = hypotenuse(e[k], e[i]);\n }\n if (e[k] !== 0) {\n if (e[k + 1] < 0) {\n e[k] = 0 - e[k];\n }\n for (let i = k + 1; i < n; i++) {\n e[i] /= e[k];\n }\n e[k + 1] += 1;\n }\n e[k] = -e[k];\n if (k + 1 < m && e[k] !== 0) {\n for (let i = k + 1; i < m; i++) {\n work[i] = 0;\n }\n for (let i = k + 1; i < m; i++) {\n for (let j = k + 1; j < n; j++) {\n work[i] += e[j] * a.get(i, j);\n }\n }\n for (let j = k + 1; j < n; j++) {\n let t = -e[j] / e[k + 1];\n for (let i = k + 1; i < m; i++) {\n a.set(i, j, a.get(i, j) + t * work[i]);\n }\n }\n }\n if (wantv) {\n for (let i = k + 1; i < n; i++) {\n V.set(i, k, e[i]);\n }\n }\n }\n }\n\n let p = Math.min(n, m + 1);\n if (nct < n) {\n s[nct] = a.get(nct, nct);\n }\n if (m < p) {\n s[p - 1] = 0;\n }\n if (nrt + 1 < p) {\n e[nrt] = a.get(nrt, p - 1);\n }\n e[p - 1] = 0;\n\n if (wantu) {\n for (let j = nct; j < nu; j++) {\n for (let i = 0; i < m; i++) {\n U.set(i, j, 0);\n }\n U.set(j, j, 1);\n }\n for (let k = nct - 1; k >= 0; k--) {\n if (s[k] !== 0) {\n for (let j = k + 1; j < nu; j++) {\n let t = 0;\n for (let i = k; i < m; i++) {\n t += U.get(i, k) * U.get(i, j);\n }\n t = -t / U.get(k, k);\n for (let i = k; i < m; i++) {\n U.set(i, j, U.get(i, j) + t * U.get(i, k));\n }\n }\n for (let i = k; i < m; i++) {\n U.set(i, k, -U.get(i, k));\n }\n U.set(k, k, 1 + U.get(k, k));\n for (let i = 0; i < k - 1; i++) {\n U.set(i, k, 0);\n }\n } else {\n for (let i = 0; i < m; i++) {\n U.set(i, k, 0);\n }\n U.set(k, k, 1);\n }\n }\n }\n\n if (wantv) {\n for (let k = n - 1; k >= 0; k--) {\n if (k < nrt && e[k] !== 0) {\n for (let j = k + 1; j < n; j++) {\n let t = 0;\n for (let i = k + 1; i < n; i++) {\n t += V.get(i, k) * V.get(i, j);\n }\n t = -t / V.get(k + 1, k);\n for (let i = k + 1; i < n; i++) {\n V.set(i, j, V.get(i, j) + t * V.get(i, k));\n }\n }\n }\n for (let i = 0; i < n; i++) {\n V.set(i, k, 0);\n }\n V.set(k, k, 1);\n }\n }\n\n let pp = p - 1;\n let iter = 0;\n let eps = Number.EPSILON;\n while (p > 0) {\n let k, kase;\n for (k = p - 2; k >= -1; k--) {\n if (k === -1) {\n break;\n }\n const alpha =\n Number.MIN_VALUE + eps * Math.abs(s[k] + Math.abs(s[k + 1]));\n if (Math.abs(e[k]) <= alpha || Number.isNaN(e[k])) {\n e[k] = 0;\n break;\n }\n }\n if (k === p - 2) {\n kase = 4;\n } else {\n let ks;\n for (ks = p - 1; ks >= k; ks--) {\n if (ks === k) {\n break;\n }\n let t =\n (ks !== p ? Math.abs(e[ks]) : 0) +\n (ks !== k + 1 ? Math.abs(e[ks - 1]) : 0);\n if (Math.abs(s[ks]) <= eps * t) {\n s[ks] = 0;\n break;\n }\n }\n if (ks === k) {\n kase = 3;\n } else if (ks === p - 1) {\n kase = 1;\n } else {\n kase = 2;\n k = ks;\n }\n }\n\n k++;\n\n switch (kase) {\n case 1: {\n let f = e[p - 2];\n e[p - 2] = 0;\n for (let j = p - 2; j >= k; j--) {\n let t = hypotenuse(s[j], f);\n let cs = s[j] / t;\n let sn = f / t;\n s[j] = t;\n if (j !== k) {\n f = -sn * e[j - 1];\n e[j - 1] = cs * e[j - 1];\n }\n if (wantv) {\n for (let i = 0; i < n; i++) {\n t = cs * V.get(i, j) + sn * V.get(i, p - 1);\n V.set(i, p - 1, -sn * V.get(i, j) + cs * V.get(i, p - 1));\n V.set(i, j, t);\n }\n }\n }\n break;\n }\n case 2: {\n let f = e[k - 1];\n e[k - 1] = 0;\n for (let j = k; j < p; j++) {\n let t = hypotenuse(s[j], f);\n let cs = s[j] / t;\n let sn = f / t;\n s[j] = t;\n f = -sn * e[j];\n e[j] = cs * e[j];\n if (wantu) {\n for (let i = 0; i < m; i++) {\n t = cs * U.get(i, j) + sn * U.get(i, k - 1);\n U.set(i, k - 1, -sn * U.get(i, j) + cs * U.get(i, k - 1));\n U.set(i, j, t);\n }\n }\n }\n break;\n }\n case 3: {\n const scale = Math.max(\n Math.abs(s[p - 1]),\n Math.abs(s[p - 2]),\n Math.abs(e[p - 2]),\n Math.abs(s[k]),\n Math.abs(e[k]),\n );\n const sp = s[p - 1] / scale;\n const spm1 = s[p - 2] / scale;\n const epm1 = e[p - 2] / scale;\n const sk = s[k] / scale;\n const ek = e[k] / scale;\n const b = ((spm1 + sp) * (spm1 - sp) + epm1 * epm1) / 2;\n const c = sp * epm1 * (sp * epm1);\n let shift = 0;\n if (b !== 0 || c !== 0) {\n if (b < 0) {\n shift = 0 - Math.sqrt(b * b + c);\n } else {\n shift = Math.sqrt(b * b + c);\n }\n shift = c / (b + shift);\n }\n let f = (sk + sp) * (sk - sp) + shift;\n let g = sk * ek;\n for (let j = k; j < p - 1; j++) {\n let t = hypotenuse(f, g);\n if (t === 0) t = Number.MIN_VALUE;\n let cs = f / t;\n let sn = g / t;\n if (j !== k) {\n e[j - 1] = t;\n }\n f = cs * s[j] + sn * e[j];\n e[j] = cs * e[j] - sn * s[j];\n g = sn * s[j + 1];\n s[j + 1] = cs * s[j + 1];\n if (wantv) {\n for (let i = 0; i < n; i++) {\n t = cs * V.get(i, j) + sn * V.get(i, j + 1);\n V.set(i, j + 1, -sn * V.get(i, j) + cs * V.get(i, j + 1));\n V.set(i, j, t);\n }\n }\n t = hypotenuse(f, g);\n if (t === 0) t = Number.MIN_VALUE;\n cs = f / t;\n sn = g / t;\n s[j] = t;\n f = cs * e[j] + sn * s[j + 1];\n s[j + 1] = -sn * e[j] + cs * s[j + 1];\n g = sn * e[j + 1];\n e[j + 1] = cs * e[j + 1];\n if (wantu && j < m - 1) {\n for (let i = 0; i < m; i++) {\n t = cs * U.get(i, j) + sn * U.get(i, j + 1);\n U.set(i, j + 1, -sn * U.get(i, j) + cs * U.get(i, j + 1));\n U.set(i, j, t);\n }\n }\n }\n e[p - 2] = f;\n iter = iter + 1;\n break;\n }\n case 4: {\n if (s[k] <= 0) {\n s[k] = s[k] < 0 ? -s[k] : 0;\n if (wantv) {\n for (let i = 0; i <= pp; i++) {\n V.set(i, k, -V.get(i, k));\n }\n }\n }\n while (k < pp) {\n if (s[k] >= s[k + 1]) {\n break;\n }\n let t = s[k];\n s[k] = s[k + 1];\n s[k + 1] = t;\n if (wantv && k < n - 1) {\n for (let i = 0; i < n; i++) {\n t = V.get(i, k + 1);\n V.set(i, k + 1, V.get(i, k));\n V.set(i, k, t);\n }\n }\n if (wantu && k < m - 1) {\n for (let i = 0; i < m; i++) {\n t = U.get(i, k + 1);\n U.set(i, k + 1, U.get(i, k));\n U.set(i, k, t);\n }\n }\n k++;\n }\n iter = 0;\n p--;\n break;\n }\n // no default\n }\n }\n\n if (swapped) {\n let tmp = V;\n V = U;\n U = tmp;\n }\n\n this.m = m;\n this.n = n;\n this.s = s;\n this.U = U;\n this.V = V;\n }\n\n solve(value) {\n let Y = value;\n let e = this.threshold;\n let scols = this.s.length;\n let Ls = Matrix.zeros(scols, scols);\n\n for (let i = 0; i < scols; i++) {\n if (Math.abs(this.s[i]) <= e) {\n Ls.set(i, i, 0);\n } else {\n Ls.set(i, i, 1 / this.s[i]);\n }\n }\n\n let U = this.U;\n let V = this.rightSingularVectors;\n\n let VL = V.mmul(Ls);\n let vrows = V.rows;\n let urows = U.rows;\n let VLU = Matrix.zeros(vrows, urows);\n\n for (let i = 0; i < vrows; i++) {\n for (let j = 0; j < urows; j++) {\n let sum = 0;\n for (let k = 0; k < scols; k++) {\n sum += VL.get(i, k) * U.get(j, k);\n }\n VLU.set(i, j, sum);\n }\n }\n\n return VLU.mmul(Y);\n }\n\n solveForDiagonal(value) {\n return this.solve(Matrix.diag(value));\n }\n\n inverse() {\n let V = this.V;\n let e = this.threshold;\n let vrows = V.rows;\n let vcols = V.columns;\n let X = new Matrix(vrows, this.s.length);\n\n for (let i = 0; i < vrows; i++) {\n for (let j = 0; j < vcols; j++) {\n if (Math.abs(this.s[j]) > e) {\n X.set(i, j, V.get(i, j) / this.s[j]);\n }\n }\n }\n\n let U = this.U;\n\n let urows = U.rows;\n let ucols = U.columns;\n let Y = new Matrix(vrows, urows);\n\n for (let i = 0; i < vrows; i++) {\n for (let j = 0; j < urows; j++) {\n let sum = 0;\n for (let k = 0; k < ucols; k++) {\n sum += X.get(i, k) * U.get(j, k);\n }\n Y.set(i, j, sum);\n }\n }\n\n return Y;\n }\n\n get condition() {\n return this.s[0] / this.s[Math.min(this.m, this.n) - 1];\n }\n\n get norm2() {\n return this.s[0];\n }\n\n get rank() {\n let tol = Math.max(this.m, this.n) * this.s[0] * Number.EPSILON;\n let r = 0;\n let s = this.s;\n for (let i = 0, ii = s.length; i < ii; i++) {\n if (s[i] > tol) {\n r++;\n }\n }\n return r;\n }\n\n get diagonal() {\n return Array.from(this.s);\n }\n\n get threshold() {\n return (Number.EPSILON / 2) * Math.max(this.m, this.n) * this.s[0];\n }\n\n get leftSingularVectors() {\n return this.U;\n }\n\n get rightSingularVectors() {\n return this.V;\n }\n\n get diagonalMatrix() {\n return Matrix.diag(this.s);\n }\n}\n","import { inverse, Matrix } from 'ml-matrix';\n\n/**\n * Difference of the matrix function over the parameters\n * @ignore\n * @param {{x:Array<number>, y:Array<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {Array<number>} evaluatedData - Array of previous evaluated function values\n * @param {Array<number>} params - Array of previous parameter values\n * @param {number} gradientDifference - Adjustment for decrease the damping parameter\n * @param {function} paramFunction - The parameters and returns a function with the independent variable as a parameter\n * @return {Matrix}\n */\nfunction gradientFunction(\n data,\n evaluatedData,\n params,\n gradientDifference,\n paramFunction,\n) {\n const n = params.length;\n const m = data.x.length;\n\n let ans = new Array(n);\n\n for (let param = 0; param < n; param++) {\n ans[param] = new Array(m);\n let auxParams = params.slice();\n auxParams[param] += gradientDifference;\n let funcParam = paramFunction(auxParams);\n\n for (let point = 0; point < m; point++) {\n ans[param][point] = evaluatedData[point] - funcParam(data.x[point]);\n }\n }\n return new Matrix(ans);\n}\n\n/**\n * Matrix function over the samples\n * @ignore\n * @param {{x:Array<number>, y:Array<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {Array<number>} evaluatedData - Array of previous evaluated function values\n * @return {Matrix}\n */\nfunction matrixFunction(data, evaluatedData) {\n const m = data.x.length;\n\n let ans = new Array(m);\n\n for (let point = 0; point < m; point++) {\n ans[point] = [data.y[point] - evaluatedData[point]];\n }\n\n return new Matrix(ans);\n}\n\n/**\n * Iteration for Levenberg-Marquardt\n * @ignore\n * @param {{x:Array<number>, y:Array<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {Array<number>} params - Array of previous parameter values\n * @param {number} damping - Levenberg-Marquardt parameter\n * @param {number} gradientDifference - Adjustment for decrease the damping parameter\n * @param {function} parameterizedFunction - The parameters and returns a function with the independent variable as a parameter\n * @return {Array<number>}\n */\nexport default function step(\n data,\n params,\n damping,\n gradientDifference,\n parameterizedFunction,\n) {\n let value = damping * gradientDifference * gradientDifference;\n let identity = Matrix.eye(params.length, params.length, value);\n\n const func = parameterizedFunction(params);\n\n let evaluatedData = new Float64Array(data.x.length);\n for (let i = 0; i < data.x.length; i++) {\n evaluatedData[i] = func(data.x[i]);\n }\n\n let gradientFunc = gradientFunction(\n data,\n evaluatedData,\n params,\n gradientDifference,\n parameterizedFunction,\n );\n let matrixFunc = matrixFunction(data, evaluatedData);\n let inverseMatrix = inverse(\n identity.add(gradientFunc.mmul(gradientFunc.transpose())),\n );\n\n params = new Matrix([params]);\n params = params.sub(\n inverseMatrix\n .mmul(gradientFunc)\n .mmul(matrixFunc)\n .mul(gradientDifference)\n .transpose(),\n );\n\n return params.to1DArray();\n}\n","import LuDecomposition from './dc/lu';\nimport QrDecomposition from './dc/qr';\nimport SingularValueDecomposition from './dc/svd';\nimport Matrix from './matrix';\nimport WrapperMatrix2D from './wrap/WrapperMatrix2D';\n\nexport function inverse(matrix, useSVD = false) {\n matrix = WrapperMatrix2D.checkMatrix(matrix);\n if (useSVD) {\n return new SingularValueDecomposition(matrix).inverse();\n } else {\n return solve(matrix, Matrix.eye(matrix.rows));\n }\n}\n\nexport function solve(leftHandSide, rightHandSide, useSVD = false) {\n leftHandSide = WrapperMatrix2D.checkMatrix(leftHandSide);\n rightHandSide = WrapperMatrix2D.checkMatrix(rightHandSide);\n if (useSVD) {\n return new SingularValueDecomposition(leftHandSide).solve(rightHandSide);\n } else {\n return leftHandSide.isSquare()\n ? new LuDecomposition(leftHandSide).solve(rightHandSide)\n : new QrDecomposition(leftHandSide).solve(rightHandSide);\n }\n}\n","/* eslint-disable max-len */\n/**\n * @license\n *\n * Copyright 2019 Google LLC. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ==============================================================================\n */\n/**\n * This is a JavaScript reimplementation of UMAP (original license below), from\n * the python implementation found at https://github.com/lmcinnes/umap.\n *\n * @author andycoenen@google.com (Andy Coenen)\n */\n/**\n * @license\n * BSD 3-Clause License\n *\n * Copyright (c) 2017, Leland McInnes\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 * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n *\n * * 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 * * Neither the name of the copyright holder nor the names of its\n * contributors may be used to endorse or promote products derived from\n * 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 THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport * as heap from './heap';\nimport * as matrix from './matrix';\nimport * as nnDescent from './nn_descent';\nimport * as tree from './tree';\nimport * as utils from './utils';\nimport LM from 'ml-levenberg-marquardt';\nconst SMOOTH_K_TOLERANCE = 1e-5;\nconst MIN_K_DIST_SCALE = 1e-3;\n/**\n * UMAP projection system, based on the python implementation from McInnes, L,\n * Healy, J, UMAP: Uniform Manifold Approximation and Projection for Dimension\n * Reduction (https://github.com/lmcinnes/umap).\n *\n * This implementation differs in a few regards:\n * a) The initialization of the embedding for optimization is not computed using\n * a spectral method, rather it is initialized randomly. This avoids some\n * computationally intensive matrix eigen computations that aren't easily\n * ported to JavaScript.\n * b) A lot of \"extra\" functionality has been omitted from this implementation,\n * most notably a great deal of alternate distance functions.\n *\n * This implementation provides three methods of reducing dimensionality:\n * 1) fit: fit the data synchronously\n * 2) fitAsync: fit the data asynchronously, with a callback function provided\n * that is invoked on each optimization step.\n * 3) initializeFit / step: manually initialize the algorithm then explictly\n * step through each epoch of the SGD optimization\n */\nexport class UMAP {\n learningRate = 1.0;\n localConnectivity = 1.0;\n minDist = 0.1;\n nComponents = 2;\n nEpochs = 0;\n nNeighbors = 15;\n negativeSampleRate = 5;\n random = Math.random;\n repulsionStrength = 1.0;\n setOpMixRatio = 1.0;\n spread = 1.0;\n transformQueueSize = 4.0;\n // Supervised projection params\n targetMetric = \"categorical\" /* TargetMetric.categorical */;\n targetWeight = 0.5;\n targetNNeighbors = 15;\n distanceFn = numeric;\n // KNN state (can be precomputed and supplied via initializeFit)\n knnIndices;\n knnDistances;\n // Internal graph connectivity representation\n graph;\n X;\n isInitialized = false;\n rpForest = [];\n initFromRandom;\n initFromTree;\n search;\n searchGraph;\n // Supervised projection labels / targets\n Y;\n // Projected embedding\n embedding = [];\n optimizationState = new OptimizationState();\n get neighbors() {\n return this.nNeighbors;\n }\n constructor(params = {}) {\n const setParam = (key) => {\n //@ts-ignore\n if (params[key] !== undefined)\n this[key] = params[key];\n };\n setParam('distanceFn');\n setParam('learningRate');\n setParam('localConnectivity');\n setParam('minDist');\n setParam('nComponents');\n setParam('nEpochs');\n setParam('nNeighbors');\n setParam('negativeSampleRate');\n setParam('random');\n setParam('repulsionStrength');\n setParam('setOpMixRatio');\n setParam('spread');\n setParam('transformQueueSize');\n this.targetNNeighbors = params.nNeighbors || this.nNeighbors || this.targetNNeighbors;\n }\n /**\n * Fit the data to a projected embedding space synchronously.\n */\n fit(X) {\n this.initializeFit(X);\n this.optimizeLayout();\n return this.embedding;\n }\n /**\n * Fit the data to a projected embedding space asynchronously, with a callback\n * function invoked on every epoch of optimization.\n */\n async fitAsync(X, callback = () => true) {\n this.initializeFit(X);\n await this.optimizeLayoutAsync(callback);\n return this.embedding;\n }\n /**\n * Initializes parameters needed for supervised projection.\n */\n setSupervisedProjection(Y, params = {}) {\n this.Y = Y;\n this.targetMetric = params.targetMetric || this.targetMetric;\n this.targetWeight = params.targetWeight || this.targetWeight;\n this.targetNNeighbors = params.targetNNeighbors || this.targetNNeighbors;\n }\n /**\n * Initializes umap with precomputed KNN indices and distances.\n */\n setPrecomputedKNN(knnIndices, knnDistances) {\n this.knnIndices = knnIndices;\n this.knnDistances = knnDistances;\n }\n /**\n * Initializes fit by computing KNN and a fuzzy simplicial set, as well as\n * initializing the projected embeddings. Sets the optimization state ahead\n * of optimization steps. Returns the number of epochs to be used for the\n * SGD optimization.\n */\n initializeFit(X) {\n if (X.length <= this.nNeighbors)\n throw new Error(`Not enough data points (${X.length}) to create nNeighbors: ${this.nNeighbors}. Add more data points or adjust the configuration.`);\n // We don't need to reinitialize if we've already initialized for this data.\n if (this.X === X && this.isInitialized)\n return this.getNEpochs();\n this.X = X;\n if (!this.knnIndices && !this.knnDistances) {\n const knnResults = this.nearestNeighbors(X);\n this.knnIndices = knnResults.knnIndices;\n this.knnDistances = knnResults.knnDistances;\n }\n this.graph = this.fuzzySimplicialSet(X, this.nNeighbors, this.setOpMixRatio);\n // Set up the search graph for subsequent transformation.\n this.makeSearchFns();\n this.searchGraph = this.makeSearchGraph(X);\n // Check if supervised projection, then adjust the graph.\n this.processGraphForSupervisedProjection();\n const { head, tail, epochsPerSample, } = this.initializeSimplicialSetEmbedding();\n // Set the optimization routine state\n this.optimizationState.head = head;\n this.optimizationState.tail = tail;\n this.optimizationState.epochsPerSample = epochsPerSample;\n // Now, initialize the optimization steps\n this.initializeOptimization();\n this.prepareForOptimizationLoop();\n this.isInitialized = true;\n return this.getNEpochs();\n }\n makeSearchFns() {\n const { initFromTree, initFromRandom } = nnDescent.makeInitializations(this.distanceFn);\n this.initFromTree = initFromTree;\n this.initFromRandom = initFromRandom;\n this.search = nnDescent.makeInitializedNNSearch(this.distanceFn);\n }\n makeSearchGraph(X) {\n const knnIndices = this.knnIndices;\n const knnDistances = this.knnDistances;\n const dims = [X.length, X.length];\n const searchGraph = new matrix.SparseMatrix([], [], [], dims);\n for (let i = 0; i < knnIndices.length; i++) {\n const knn = knnIndices[i];\n const distances = knnDistances[i];\n for (let j = 0; j < knn.length; j++) {\n const neighbor = knn[j];\n const distance = distances[j];\n if (distance > 0)\n searchGraph.set(i, neighbor, distance);\n }\n }\n const transpose = matrix.transpose(searchGraph);\n return matrix.maximum(searchGraph, transpose);\n }\n /**\n * Transforms data to the existing embedding space.\n */\n transform(toTransform) {\n // Use the previous rawData\n const rawData = this.X;\n if (rawData === undefined || rawData.length === 0)\n throw new Error('No data has been fit.');\n let nNeighbors = Math.floor(this.nNeighbors * this.transformQueueSize);\n nNeighbors = Math.min(rawData.length, nNeighbors);\n const init = nnDescent.initializeSearch(this.rpForest, rawData, toTransform, nNeighbors, this.initFromRandom, this.initFromTree, this.random);\n const result = this.search(rawData, this.searchGraph, init, toTransform);\n let { indices, weights: distances } = heap.deheapSort(result);\n indices = indices.map((x) => x.slice(0, this.nNeighbors));\n distances = distances.map((x) => x.slice(0, this.nNeighbors));\n const adjustedLocalConnectivity = Math.max(0, this.localConnectivity - 1);\n const { sigmas, rhos } = this.smoothKNNDistance(distances, this.nNeighbors, adjustedLocalConnectivity);\n const { rows, cols, vals } = this.computeMembershipStrengths(indices, distances, sigmas, rhos);\n const size = [toTransform.length, rawData.length];\n let graph = new matrix.SparseMatrix(rows, cols, vals, size);\n // This was a very specially constructed graph with constant degree.\n // That lets us do fancy unpacking by reshaping the csr matrix indices\n // and data. Doing so relies on the constant degree assumption!\n const normed = matrix.normalize(graph, \"l1\" /* matrix.NormType.l1 */);\n const csrMatrix = matrix.getCSR(normed);\n const nPoints = toTransform.length;\n const eIndices = utils.reshape2d(csrMatrix.indices, nPoints, this.nNeighbors);\n const eWeights = utils.reshape2d(csrMatrix.values, nPoints, this.nNeighbors);\n const embedding = initTransform(eIndices, eWeights, this.embedding);\n const nEpochs = this.nEpochs ?\n this.nEpochs / 3 :\n graph.nRows <= 10000 ?\n 100 :\n 30;\n const graphMax = graph\n .getValues()\n .reduce((max, val) => (val > max ? val : max), 0);\n graph = graph.map((value) => (value < graphMax / nEpochs ? 0 : value));\n graph = matrix.eliminateZeros(graph);\n const epochsPerSample = this.makeEpochsPerSample(graph.getValues(), nEpochs);\n const head = graph.getRows();\n const tail = graph.getCols();\n // Initialize optimization slightly differently than the fit method.\n this.assignOptimizationStateParameters({\n headEmbedding: embedding,\n tailEmbedding: this.embedding,\n head,\n tail,\n currentEpoch: 0,\n nEpochs,\n nVertices: graph.getDims()[1],\n epochsPerSample,\n });\n this.prepareForOptimizationLoop();\n return this.optimizeLayout();\n }\n /**\n * Checks if we're using supervised projection, then process the graph\n * accordingly.\n */\n processGraphForSupervisedProjection() {\n const { Y, X } = this;\n if (Y) {\n if (Y.length !== X.length)\n throw new Error('Length of X and y must be equal');\n if (this.targetMetric === \"categorical\" /* TargetMetric.categorical */) {\n const lt = this.targetWeight < 1.0;\n const farDist = lt ? 2.5 * (1.0 / (1.0 - this.targetWeight)) : 1.0e12;\n this.graph = this.categoricalSimplicialSetIntersection(this.graph, Y, farDist);\n }\n // TODO (andycoenen@): add non-categorical supervised embeddings.\n }\n }\n /**\n * Manually step through the optimization process one epoch at a time.\n */\n step() {\n const { currentEpoch } = this.optimizationState;\n if (currentEpoch < this.getNEpochs())\n this.optimizeLayoutStep(currentEpoch);\n return this.optimizationState.currentEpoch;\n }\n /**\n * Returns the computed projected embedding.\n */\n getEmbedding() {\n return this.embedding;\n }\n /**\n * Compute the ``nNeighbors`` nearest points for each data point in ``X``\n * This may be exact, but more likely is approximated via nearest neighbor\n * descent.\n */\n nearestNeighbors(X) {\n const { distanceFn, nNeighbors } = this;\n const log2 = (n) => Math.log(n) / Math.log(2);\n const metricNNDescent = nnDescent.makeNNDescent(distanceFn, this.random);\n // Handle python3 rounding down from 0.5 discrpancy\n const round = (n) => {\n return n === 0.5 ? 0 : Math.round(n);\n };\n const nTrees = 5 + Math.floor(round(X.length ** 0.5 / 20.0));\n const nIters = Math.max(5, Math.floor(Math.round(log2(X.length))));\n this.rpForest = tree.makeForest(X, nNeighbors, nTrees, this.random);\n const leafArray = tree.makeLeafArray(this.rpForest);\n const { indices, weights } = metricNNDescent(X, leafArray, nNeighbors, nIters);\n return { knnIndices: indices, knnDistances: weights };\n }\n /**\n * Given a set of data X, a neighborhood size, and a measure of distance\n * compute the fuzzy simplicial set (here represented as a fuzzy graph in\n * the form of a sparse matrix) associated to the data. This is done by\n * locally approximating geodesic distance at each point, creating a fuzzy\n * simplicial set for each such point, and then combining all the local\n * fuzzy simplicial sets into a global one via a fuzzy union.\n */\n fuzzySimplicialSet(X, nNeighbors, setOpMixRatio = 1.0) {\n const { knnIndices = [], knnDistances = [], localConnectivity } = this;\n const { sigmas, rhos } = this.smoothKNNDistance(knnDistances, nNeighbors, localConnectivity);\n const { rows, cols, vals } = this.computeMembershipStrengths(knnIndices, knnDistances, sigmas, rhos);\n const size = [X.length, X.length];\n const sparseMatrix = new matrix.SparseMatrix(rows, cols, vals, size);\n const transpose = matrix.transpose(sparseMatrix);\n const prodMatrix = matrix.pairwiseMultiply(sparseMatrix, transpose);\n const a = matrix.subtract(matrix.add(sparseMatrix, transpose), prodMatrix);\n const b = matrix.multiplyScalar(a, setOpMixRatio);\n const c = matrix.multiplyScalar(prodMatrix, 1.0 - setOpMixRatio);\n const result = matrix.add(b, c);\n return result;\n }\n /**\n * Combine a fuzzy simplicial set with another fuzzy simplicial set\n * generated from categorical data using categorical distances. The target\n * data is assumed to be categorical label data (a vector of labels),\n * and this will update the fuzzy simplicial set to respect that label data.\n */\n categoricalSimplicialSetIntersection(simplicialSet, target, farDist, unknownDist = 1.0) {\n let intersection = fastIntersection(simplicialSet, target, unknownDist, farDist);\n intersection = matrix.eliminateZeros(intersection);\n return resetLocalConnectivity(intersection);\n }\n /**\n * Compute a continuous version of the distance to the kth nearest\n * neighbor. That is, this is similar to knn-distance but allows continuous\n * k values rather than requiring an integral k. In esscence we are simply\n * computing the distance such that the cardinality of fuzzy set we generate\n * is k.\n */\n smoothKNNDistance(distances, k, localConnectivity = 1.0, nIter = 64, bandwidth = 1.0) {\n const target = (Math.log(k) / Math.log(2)) * bandwidth;\n const rho = utils.zeros(distances.length);\n const result = utils.zeros(distances.length);\n for (let i = 0; i < distances.length; i++) {\n let lo = 0.0;\n let hi = Infinity;\n let mid = 1.0;\n // TODO: This is very inefficient, but will do for now. FIXME\n const ithDistances = distances[i];\n const nonZeroDists = ithDistances.filter((d) => d > 0.0);\n if (nonZeroDists.length >= localConnectivity) {\n const index = Math.floor(localConnectivity);\n const interpolation = localConnectivity - index;\n if (index > 0) {\n rho[i] = nonZeroDists[index - 1];\n if (interpolation > SMOOTH_K_TOLERANCE) {\n rho[i] +=\n interpolation * (nonZeroDists[index] - nonZeroDists[index - 1]);\n }\n }\n else {\n rho[i] = interpolation * nonZeroDists[0];\n }\n }\n else if (nonZeroDists.length > 0) {\n rho[i] = utils.max(nonZeroDists);\n }\n for (let n = 0; n < nIter; n++) {\n let psum = 0.0;\n for (let j = 1; j < distances[i].length; j++) {\n const d = distances[i][j] - rho[i];\n if (d > 0)\n psum += Math.exp(-(d / mid));\n else\n psum += 1.0;\n }\n if (Math.abs(psum - target) < SMOOTH_K_TOLERANCE)\n break;\n if (psum > target) {\n hi = mid;\n mid = (lo + hi) / 2.0;\n }\n else {\n lo = mid;\n if (hi === Infinity)\n mid *= 2;\n else\n mid = (lo + hi) / 2.0;\n }\n }\n result[i] = mid;\n // TODO: This is very inefficient, but will do for now. FIXME\n if (rho[i] > 0.0) {\n const meanIthDistances = utils.mean(ithDistances);\n if (result[i] < MIN_K_DIST_SCALE * meanIthDistances)\n result[i] = MIN_K_DIST_SCALE * meanIthDistances;\n }\n else {\n const meanDistances = utils.mean(distances.map(utils.mean));\n if (result[i] < MIN_K_DIST_SCALE * meanDistances)\n result[i] = MIN_K_DIST_SCALE * meanDistances;\n }\n }\n return { sigmas: result, rhos: rho };\n }\n /**\n * Construct the membership strength data for the 1-skeleton of each local\n * fuzzy simplicial set -- this is formed as a sparse matrix where each row is\n * a local fuzzy simplicial set, with a membership strength for the\n * 1-simplex to each other data point.\n */\n computeMembershipStrengths(knnIndices, knnDistances, sigmas, rhos) {\n const nSamples = knnIndices.length;\n const nNeighbors = knnIndices[0].length;\n const rows = utils.zeros(nSamples * nNeighbors);\n const cols = utils.zeros(nSamples * nNeighbors);\n const vals = utils.zeros(nSamples * nNeighbors);\n for (let i = 0; i < nSamples; i++) {\n for (let j = 0; j < nNeighbors; j++) {\n let val = 0;\n if (knnIndices[i][j] === -1)\n continue; // We didn't get the full knn for i\n if (knnIndices[i][j] === i)\n val = 0.0;\n else if (knnDistances[i][j] - rhos[i] <= 0.0)\n val = 1.0;\n else\n val = Math.exp(-((knnDistances[i][j] - rhos[i]) / sigmas[i]));\n rows[i * nNeighbors + j] = i;\n cols[i * nNeighbors + j] = knnIndices[i][j];\n vals[i * nNeighbors + j] = val;\n }\n }\n return { rows, cols, vals };\n }\n /**\n * Initialize a fuzzy simplicial set embedding, using a specified\n * initialisation method and then minimizing the fuzzy set cross entropy\n * between the 1-skeletons of the high and low dimensional fuzzy simplicial\n * sets.\n */\n initializeSimplicialSetEmbedding() {\n const nEpochs = this.getNEpochs();\n const { nComponents } = this;\n const graphValues = this.graph.getValues();\n let graphMax = 0;\n for (let i = 0; i < graphValues.length; i++) {\n const value = graphValues[i];\n if (graphMax < graphValues[i])\n graphMax = value;\n }\n const graph = this.graph.map((value) => {\n if (value < graphMax / nEpochs)\n return 0;\n else\n return value;\n });\n // We're not computing the spectral initialization in this implementation\n // until we determine a better eigenvalue/eigenvector computation\n // approach\n this.embedding = utils.zeros(graph.nRows).map(() => {\n return utils.zeros(nComponents).map(() => {\n return utils.tauRand(this.random) * 20 + -10; // Random from -10 to 10\n });\n });\n // Get graph data in ordered way...\n const weights = [];\n const head = [];\n const tail = [];\n const rowColValues = graph.getAll();\n for (let i = 0; i < rowColValues.length; i++) {\n const entry = rowColValues[i];\n if (entry.value) {\n weights.push(entry.value);\n tail.push(entry.row);\n head.push(entry.col);\n }\n }\n const epochsPerSample = this.makeEpochsPerSample(weights, nEpochs);\n return { head, tail, epochsPerSample };\n }\n /**\n * Given a set of weights and number of epochs generate the number of\n * epochs per sample for each weight.\n */\n makeEpochsPerSample(weights, nEpochs) {\n const result = utils.filled(weights.length, -1.0);\n const max = utils.max(weights);\n const nSamples = weights.map((w) => (w / max) * nEpochs);\n nSamples.forEach((n, i) => {\n if (n > 0)\n result[i] = nEpochs / nSamples[i];\n });\n return result;\n }\n /**\n * Assigns optimization state parameters from a partial optimization state.\n */\n assignOptimizationStateParameters(state) {\n Object.assign(this.optimizationState, state);\n }\n /**\n * Sets a few optimization state parameters that are necessary before entering\n * the optimization step loop.\n */\n prepareForOptimizationLoop() {\n // Hyperparameters\n const { repulsionStrength, learningRate, negativeSampleRate } = this;\n const { epochsPerSample, headEmbedding, tailEmbedding, } = this.optimizationState;\n const dim = headEmbedding[0].length;\n const moveOther = headEmbedding.length === tailEmbedding.length;\n const epochsPerNegativeSample = epochsPerSample.map((e) => e / negativeSampleRate);\n const epochOfNextNegativeSample = [...epochsPerNegativeSample];\n const epochOfNextSample = [...epochsPerSample];\n this.assignOptimizationStateParameters({\n epochOfNextSample,\n epochOfNextNegativeSample,\n epochsPerNegativeSample,\n moveOther,\n initialAlpha: learningRate,\n alpha: learningRate,\n gamma: repulsionStrength,\n dim,\n });\n }\n /**\n * Initializes optimization state for stepwise optimization.\n */\n initializeOptimization() {\n // Algorithm state\n const headEmbedding = this.embedding;\n const tailEmbedding = this.embedding;\n // Initialized in initializeSimplicialSetEmbedding()\n const { head, tail, epochsPerSample } = this.optimizationState;\n const nEpochs = this.getNEpochs();\n const nVertices = this.graph.nCols;\n const { a, b } = findABParams(this.spread, this.minDist);\n this.assignOptimizationStateParameters({\n headEmbedding,\n tailEmbedding,\n head,\n tail,\n epochsPerSample,\n a,\n b,\n nEpochs,\n nVertices,\n });\n }\n /**\n * Improve an embedding using stochastic gradient descent to minimize the\n * fuzzy set cross entropy between the 1-skeletons of the high dimensional\n * and low dimensional fuzzy simplicial sets. In practice this is done by\n * sampling edges based on their membership strength (with the (1-p) terms\n * coming from negative sampling similar to word2vec).\n */\n optimizeLayoutStep(n) {\n const { optimizationState } = this;\n const { head, tail, headEmbedding, tailEmbedding, epochsPerSample, epochOfNextSample, epochOfNextNegativeSample, epochsPerNegativeSample, moveOther, initialAlpha, alpha, gamma, a, b, dim, nEpochs, nVertices, } = optimizationState;\n const clipValue = 4.0;\n for (let i = 0; i < epochsPerSample.length; i++) {\n if (epochOfNextSample[i] > n)\n continue;\n const j = head[i];\n const k = tail[i];\n const current = headEmbedding[j];\n const other = tailEmbedding[k];\n const distSquared = rDist(current, other);\n let gradCoeff = 0;\n if (distSquared > 0) {\n gradCoeff = -2.0 * a * b * Math.pow(distSquared, b - 1.0);\n gradCoeff /= a * Math.pow(distSquared, b) + 1.0;\n }\n for (let d = 0; d < dim; d++) {\n const gradD = clip(gradCoeff * (current[d] - other[d]), clipValue);\n current[d] += gradD * alpha;\n if (moveOther)\n other[d] += -gradD * alpha;\n }\n epochOfNextSample[i] += epochsPerSample[i];\n const nNegSamples = Math.floor((n - epochOfNextNegativeSample[i]) / epochsPerNegativeSample[i]);\n for (let p = 0; p < nNegSamples; p++) {\n const k = utils.tauRandInt(nVertices, this.random);\n const other = tailEmbedding[k];\n const distSquared = rDist(current, other);\n let gradCoeff = 0.0;\n if (distSquared > 0.0) {\n gradCoeff = 2.0 * gamma * b;\n gradCoeff /=\n (0.001 + distSquared) * (a * Math.pow(distSquared, b) + 1);\n }\n else if (j === k) {\n continue;\n }\n for (let d = 0; d < dim; d++) {\n let gradD = 4.0;\n if (gradCoeff > 0.0)\n gradD = clip(gradCoeff * (current[d] - other[d]), clipValue);\n current[d] += gradD * alpha;\n }\n }\n epochOfNextNegativeSample[i] += nNegSamples * epochsPerNegativeSample[i];\n }\n optimizationState.alpha = initialAlpha * (1.0 - n / nEpochs);\n optimizationState.currentEpoch += 1;\n return headEmbedding;\n }\n /**\n * Improve an embedding using stochastic gradient descent to minimize the\n * fuzzy set cross entropy between the 1-skeletons of the high dimensional\n * and low dimensional fuzzy simplicial sets. In practice this is done by\n * sampling edges based on their membership strength (with the (1-p) terms\n * coming from negative sampling similar to word2vec).\n */\n optimizeLayoutAsync(epochCallback = () => true) {\n return new Promise((resolve, reject) => {\n const step = async () => {\n try {\n const { nEpochs, currentEpoch } = this.optimizationState;\n this.embedding = this.optimizeLayoutStep(currentEpoch);\n const epochCompleted = this.optimizationState.currentEpoch;\n const shouldStop = epochCallback(epochCompleted) === false;\n const isFinished = epochCompleted === nEpochs;\n if (!shouldStop && !isFinished)\n setTimeout(() => step(), 0);\n else\n return resolve(isFinished);\n }\n catch (err) {\n reject(err);\n }\n };\n setTimeout(() => step(), 0);\n });\n }\n /**\n * Improve an embedding using stochastic gradient descent to minimize the\n * fuzzy set cross entropy between the 1-skeletons of the high dimensional\n * and low dimensional fuzzy simplicial sets. In practice this is done by\n * sampling edges based on their membership strength (with the (1-p) terms\n * coming from negative sampling similar to word2vec).\n */\n optimizeLayout(epochCallback = () => true) {\n let isFinished = false;\n let embedding = [];\n while (!isFinished) {\n const { nEpochs, currentEpoch } = this.optimizationState;\n embedding = this.optimizeLayoutStep(currentEpoch);\n const epochCompleted = this.optimizationState.currentEpoch;\n const shouldStop = epochCallback(epochCompleted) === false;\n isFinished = epochCompleted === nEpochs || shouldStop;\n }\n return embedding;\n }\n /**\n * Gets the number of epochs for optimizing the projection.\n * NOTE: This heuristic differs from the python version\n */\n getNEpochs() {\n const graph = this.graph;\n if (this.nEpochs > 0)\n return this.nEpochs;\n if (!graph)\n return 200;\n const length = graph.nRows;\n if (length <= 2500)\n return 500;\n else if (length <= 5000)\n return 400;\n else if (length <= 7500)\n return 300;\n else\n return 200;\n }\n}\nexport function euclidean(x, y) {\n let result = 0;\n for (let i = 0; i < x.length; i++)\n result += (x[i] - y[i]) ** 2;\n return Math.sqrt(result);\n}\nexport function numeric(x, y) {\n const result = Math.abs(x - y);\n return result;\n}\nexport function cosine(x, y) {\n let result = 0.0;\n let normX = 0.0;\n let normY = 0.0;\n for (let i = 0; i < x.length; i++) {\n result += x[i] * y[i];\n normX += x[i] ** 2;\n normY += y[i] ** 2;\n }\n if (normX === 0 && normY === 0)\n return 0;\n else if (normX === 0 || normY === 0)\n return 1.0;\n else\n return 1.0 - result / Math.sqrt(normX * normY);\n}\n/**\n * An interface representing the optimization state tracked between steps of\n * the SGD optimization\n */\nclass OptimizationState {\n currentEpoch = 0;\n // Data tracked during optimization steps.\n headEmbedding = [];\n tailEmbedding = [];\n head = [];\n tail = [];\n epochsPerSample = [];\n epochOfNextSample = [];\n epochOfNextNegativeSample = [];\n epochsPerNegativeSample = [];\n moveOther = true;\n initialAlpha = 1.0;\n alpha = 1.0;\n gamma = 1.0;\n a = 1.5769434603113077;\n b = 0.8950608779109733;\n dim = 2;\n nEpochs = 500;\n nVertices = 0;\n}\n/**\n * Standard clamping of a value into a fixed range\n */\nfunction clip(x, clipValue) {\n if (x > clipValue)\n return clipValue;\n else if (x < -clipValue)\n return -clipValue;\n else\n return x;\n}\n/**\n * Reduced Euclidean distance.\n */\nfunction rDist(x, y) {\n let result = 0.0;\n for (let i = 0; i < x.length; i++)\n result += Math.pow(x[i] - y[i], 2);\n return result;\n}\n/**\n * Fit a, b params for the differentiable curve used in lower\n * dimensional fuzzy simplicial complex construction. We want the\n * smooth curve (from a pre-defined family with simple gradient) that\n * best matches an offset exponential decay.\n */\nexport function findABParams(spread, minDist) {\n const curve = ([a, b]) => (x) => {\n return 1.0 / (1.0 + a * x ** (2 * b));\n };\n const xv = utils\n .linear(0, spread * 3, 300)\n .map((val) => (val < minDist ? 1.0 : val));\n const yv = utils.zeros(xv.length).map((val, index) => {\n const gte = xv[index] >= minDist;\n return gte ? Math.exp(-(xv[index] - minDist) / spread) : val;\n });\n const initialValues = [0.5, 0.5];\n const data = { x: xv, y: yv };\n // Default options for the algorithm (from github example)\n const options = {\n damping: 1.5,\n initialValues,\n gradientDifference: 10e-2,\n maxIterations: 100,\n errorTolerance: 10e-3,\n };\n // eslint-disable-next-line new-cap\n const { parameterValues } = LM(data, curve, options);\n const [a, b] = parameterValues;\n return { a, b };\n}\n/**\n * Under the assumption of categorical distance for the intersecting\n * simplicial set perform a fast intersection.\n */\nexport function fastIntersection(graph, target, unknownDist = 1.0, farDist = 5.0) {\n return graph.map((value, row, col) => {\n if (target[row] === -1 || target[col] === -1)\n return value * Math.exp(-unknownDist);\n else if (target[row] !== target[col])\n return value * Math.exp(-farDist);\n else\n return value;\n });\n}\n/**\n * Reset the local connectivity requirement -- each data sample should\n * have complete confidence in at least one 1-simplex in the simplicial set.\n * We can enforce this by locally rescaling confidences, and then remerging the\n * different local simplicial sets together.\n */\nexport function resetLocalConnectivity(simplicialSet) {\n simplicialSet = matrix.normalize(simplicialSet, \"max\" /* matrix.NormType.max */);\n const transpose = matrix.transpose(simplicialSet);\n const prodMatrix = matrix.pairwiseMultiply(transpose, simplicialSet);\n simplicialSet = matrix.add(simplicialSet, matrix.subtract(transpose, prodMatrix));\n return matrix.eliminateZeros(simplicialSet);\n}\n/**\n * Given indices and weights and an original embeddings\n * initialize the positions of new points relative to the\n * indices and weights (of their neighbors in the source data).\n */\nexport function initTransform(indices, weights, embedding) {\n const result = utils\n .zeros(indices.length)\n .map((_z) => utils.zeros(embedding[0].length));\n for (let i = 0; i < indices.length; i++) {\n for (let j = 0; j < indices[0].length; j++) {\n for (let d = 0; d < embedding[0].length; d++) {\n const a = indices[i][j];\n result[i][d] += weights[i][j] * embedding[a][d];\n }\n }\n }\n return result;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW1hcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInVtYXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsNEJBQTRCO0FBQzVCOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0ErQkc7QUFFSCxPQUFPLEtBQUssSUFBSSxNQUFNLFFBQVEsQ0FBQztBQUMvQixPQUFPLEtBQUssTUFBTSxNQUFNLFVBQVUsQ0FBQztBQUNuQyxPQUFPLEtBQUssU0FBUyxNQUFNLGNBQWMsQ0FBQztBQUMxQyxPQUFPLEtBQUssSUFBSSxNQUFNLFFBQVEsQ0FBQztBQUMvQixPQUFPLEtBQUssS0FBSyxNQUFNLFNBQVMsQ0FBQztBQUNqQyxPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQWF4QyxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQztBQUNoQyxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQztBQW1IOUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFDSCxNQUFNLE9BQU8sSUFBSTtJQUNQLFlBQVksR0FBRyxHQUFHLENBQUM7SUFDbkIsaUJBQWlCLEdBQUcsR0FBRyxDQUFDO0lBQ3hCLE9BQU8sR0FBRyxHQUFHLENBQUM7SUFDZCxXQUFXLEdBQUcsQ0FBQyxDQUFDO0lBQ2hCLE9BQU8sR0FBRyxDQUFDLENBQUM7SUFDWixVQUFVLEdBQUcsRUFBRSxDQUFDO0lBQ2hCLGtCQUFrQixHQUFHLENBQUMsQ0FBQztJQUN2QixNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixpQkFBaUIsR0FBRyxHQUFHLENBQUM7SUFDeEIsYUFBYSxHQUFHLEdBQUcsQ0FBQztJQUNwQixNQUFNLEdBQUcsR0FBRyxDQUFDO0lBQ2Isa0JBQWtCLEdBQUcsR0FBRyxDQUFDO0lBRWpDLCtCQUErQjtJQUN2QixZQUFZLGdEQUE0QjtJQUN4QyxZQUFZLEdBQUcsR0FBRyxDQUFDO0lB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QyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN4QixNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNqRDtTQUNGO0tBQ0Y7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xuLyoqXG4gKiBAbGljZW5zZVxuICpcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLyoqXG4gKiBUaGlzIGlzIGEgSmF2YVNjcmlwdCByZWltcGxlbWVudGF0aW9uIG9mIFVNQVAgKG9yaWdpbmFsIGxpY2Vuc2UgYmVsb3cpLCBmcm9tXG4gKiB0aGUgcHl0aG9uIGltcGxlbWVudGF0aW9uIGZvdW5kIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9sbWNpbm5lcy91bWFwLlxuICpcbiAqIEBhdXRob3IgYW5keWNvZW5lbkBnb29nbGUuY29tIChBbmR5IENvZW5lbilcbiAqL1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBCU0QgMy1DbGF1c2UgTGljZW5zZVxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNywgTGVsYW5kIE1jSW5uZXNcbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbiAqXG4gKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuICogICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqXG4gKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiAqICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvblxuICogICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXIgbm9yIHRoZSBuYW1lcyBvZiBpdHNcbiAqICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb21cbiAqICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXG4gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFXG4gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTFxuICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1JcbiAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSXG4gKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLFxuICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0VcbiAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKi9cblxuaW1wb3J0ICogYXMgaGVhcCBmcm9tICcuL2hlYXAnO1xuaW1wb3J0ICogYXMgbWF0cml4IGZyb20gJy4vbWF0cml4JztcbmltcG9ydCAqIGFzIG5uRGVzY2VudCBmcm9tICcuL25uX2Rlc2NlbnQnO1xuaW1wb3J0ICogYXMgdHJlZSBmcm9tICcuL3RyZWUnO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgTE0gZnJvbSAnbWwtbGV2ZW5iZXJnLW1hcnF1YXJkdCc7XG5cbmV4cG9ydCB0eXBlIERpc3RhbmNlRm4gPSAoeDogbnVtYmVyLCB5OiBudW1iZXIpID0+IG51bWJlcjtcbmV4cG9ydCB0eXBlIFJhbmRvbUZuID0gKCkgPT4gbnVtYmVyO1xuZXhwb3J0IHR5cGUgRXBvY2hDYWxsYmFjayA9IChlcG9jaDogbnVtYmVyKSA9PiBib29sZWFuIHwgdm9pZDtcbmV4cG9ydCB0eXBlIFZlY3RvciA9IG51bWJlcltdO1xuZXhwb3J0IHR5cGUgVmVjdG9ycyA9IFZlY3RvcltdO1xuZXhwb3J0IGNvbnN0IGVudW0gVGFyZ2V0TWV0cmljIHtcbiAgY2F0ZWdvcmljYWwgPSAnY2F0ZWdvcmljYWwnLFxuICBsMSA9ICdsMScsXG4gIGwyID0gJ2wyJyxcbn1cblxuY29uc3QgU01PT1RIX0tfVE9MRVJBTkNFID0gMWUtNTtcbmNvbnN0IE1JTl9LX0RJU1RfU0NBTEUgPSAxZS0zO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVNQVBQYXJhbWV0ZXJzIHtcbiAgLyoqXG4gICAqIFRoZSBkaXN0YW5jZSBmdW5jdGlvbiB3aXRoIHdoaWNoIHRvIGFzc2VzcyBuZWFyZXN0IG5laWdoYm9ycywgZGVmYXVsdHNcbiAgICogdG8gZXVjbGlkZWFuIGRpc3RhbmNlLlxuICAgKi9cbiAgZGlzdGFuY2VGbj86IERpc3RhbmNlRm47XG4gIC8qKlxuICAgKiBUaGUgaW5pdGlhbCBsZWFybmluZyByYXRlIGZvciB0aGUgZW1iZWRkaW5nIG9wdGltaXphdGlvbi5cbiAgICovXG4gIGxlYXJuaW5nUmF0ZT86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBsb2NhbCBjb25uZWN0aXZpdHkgcmVxdWlyZWQgLS0gaS5lLiB0aGUgbnVtYmVyIG9mIG5lYXJlc3RcbiAgICogbmVpZ2hib3JzIHRoYXQgc2hvdWxkIGJlIGFzc3VtZWQgdG8gYmUgY29ubmVjdGVkIGF0IGEgbG9jYWwgbGV2ZWwuXG4gICAqIFRoZSBoaWdoZXIgdGhpcyB2YWx1ZSB0aGUgbW9yZSBjb25uZWN0ZWQgdGhlIG1hbmlmb2xkIGJlY29tZXNcbiAgICogbG9jYWxseS4gSW4gcHJhY3RpY2UgdGhpcyBzaG91bGQgYmUgbm90IG1vcmUgdGhhbiB0aGUgbG9jYWwgaW50cmluc2ljXG4gICAqIGRpbWVuc2lvbiBvZiB0aGUgbWFuaWZvbGQuXG4gICAqL1xuICBsb2NhbENvbm5lY3Rpdml0eT86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBlZmZlY3RpdmUgbWluaW11bSBkaXN0YW5jZSBiZXR3ZWVuIGVtYmVkZGVkIHBvaW50cy4gU21hbGxlciB2YWx1ZXNcbiAgICogd2lsbCByZXN1bHQgaW4gYSBtb3JlIGNsdXN0ZXJlZC9jbHVtcGVkIGVtYmVkZGluZyB3aGVyZSBuZWFyYnkgcG9pbnRzXG4gICAqIG9uIHRoZSBtYW5pZm9sZCBhcmUgZHJhd24gY2xvc2VyIHRvZ2V0aGVyLCB3aGlsZSBsYXJnZXIgdmFsdWVzIHdpbGxcbiAgICogcmVzdWx0IG9uIGEgbW9yZSBldmVuIGRpc3BlcnNhbCBvZiBwb2ludHMuIFRoZSB2YWx1ZSBzaG91bGQgYmUgc2V0XG4gICAqIHJlbGF0aXZlIHRvIHRoZSBgYHNwcmVhZGBgIHZhbHVlLCB3aGljaCBkZXRlcm1pbmVzIHRoZSBzY2FsZSBhdCB3aGljaFxuICAgKiBlbWJlZGRlZCBwb2ludHMgd2lsbCBiZSBzcHJlYWQgb3V0LlxuICAgKi9cbiAgbWluRGlzdD86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBkaW1lbnNpb24gb2YgdGhlIHNwYWNlIHRvIGVtYmVkIGludG8uIFRoaXMgZGVmYXVsdHMgdG8gMiB0b1xuICAgKiBwcm92aWRlIGVhc3kgdmlzdWFsaXphdGlvbiwgYnV0IGNhbiByZWFzb25hYmx5IGJlIHNldCB0byBhbnlcbiAgICogaW50ZWdlciB2YWx1ZSBpbiB0aGUgcmFuZ2UgMiB0byAxMDAuXG4gICAqL1xuICBuQ29tcG9uZW50cz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgdHJhaW5pbmcgZXBvY2hzIHRvIGJlIHVzZWQgaW4gb3B0aW1pemluZyB0aGVcbiAgICogbG93IGRpbWVuc2lvbmFsIGVtYmVkZGluZy4gTGFyZ2VyIHZhbHVlcyByZXN1bHQgaW4gbW9yZSBhY2N1cmF0ZVxuICAgKiBlbWJlZGRpbmdzLiBJZiBOb25lIGlzIHNwZWNpZmllZCBhIHZhbHVlIHdpbGwgYmUgc2VsZWN0ZWQgYmFzZWQgb25cbiAgICogdGhlIHNpemUgb2YgdGhlIGlucHV0IGRhdGFzZXQgKDIwMCBmb3IgbGFyZ2UgZGF0YXNldHMsIDUwMCBmb3Igc21hbGwpLlxuICAgKi9cbiAgbkVwb2Nocz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBzaXplIG9mIGxvY2FsIG5laWdoYm9yaG9vZCAoaW4gdGVybXMgb2YgbnVtYmVyIG9mIG5laWdoYm9yaW5nXG4gICAqIHNhbXBsZSBwb2ludHMpIHVzZWQgZm9yIG1hbmlmb2xkIGFwcHJveGltYXRpb24uIExhcmdlciB2YWx1ZXNcbiAgICogcmVzdWx0IGluIG1vcmUgZ2xvYmFsIHZpZXdzIG9mIHRoZSBtYW5pZm9sZCwgd2hpbGUgc21hbGxlclxuICAgKiB2YWx1ZXMgcmVzdWx0IGluIG1vcmUgbG9jYWwgZGF0YSBiZWluZyBwcmVzZXJ2ZWQuIEluIGdlbmVyYWxcbiAgICogdmFsdWVzIHNob3VsZCBiZSBpbiB0aGUgcmFuZ2UgMiB0byAxMDAuXG4gICAqL1xuICBuTmVpZ2hib3JzPzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBuZWdhdGl2ZSBzYW1wbGVzIHRvIHNlbGVjdCBwZXIgcG9zaXRpdmUgc2FtcGxlXG4gICAqIGluIHRoZSBvcHRpbWl6YXRpb24gcHJvY2Vzcy4gSW5jcmVhc2luZyB0aGlzIHZhbHVlIHdpbGwgcmVzdWx0XG4gICAqIGluIGdyZWF0ZXIgcmVwdWxzaXZlIGZvcmNlIGJlaW5nIGFwcGxpZWQsIGdyZWF0ZXIgb3B0aW1pemF0aW9uXG4gICAqIGNvc3QsIGJ1dCBzbGlnaHRseSBtb3JlIGFjY3VyYWN5LlxuICAgKi9cbiAgbmVnYXRpdmVTYW1wbGVSYXRlPzogbnVtYmVyO1xuICAvKipcbiAgICogV2VpZ2h0aW5nIGFwcGxpZWQgdG8gbmVnYXRpdmUgc2FtcGxlcyBpbiBsb3cgZGltZW5zaW9uYWwgZW1iZWRkaW5nXG4gICAqIG9wdGltaXphdGlvbi4gVmFsdWVzIGhpZ2hlciB0aGFuIG9uZSB3aWxsIHJlc3VsdCBpbiBncmVhdGVyIHdlaWdodFxuICAgKiBiZWluZyBnaXZlbiB0byBuZWdhdGl2ZSBzYW1wbGVzLlxuICAgKi9cbiAgcmVwdWxzaW9uU3RyZW5ndGg/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgcHNldWRvLXJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIHVzZWQgYnkgdGhlIHN0b2NoYXN0aWMgcGFydHMgb2YgdGhlXG4gICAqIGFsZ29yaXRobS5cbiAgICovXG4gIHJhbmRvbT86IFJhbmRvbUZuO1xuICAvKipcbiAgICogSW50ZXJwb2xhdGUgYmV0d2VlbiAoZnV6enkpIHVuaW9uIGFuZCBpbnRlcnNlY3Rpb24gYXMgdGhlIHNldCBvcGVyYXRpb25cbiAgICogdXNlZCB0byBjb21iaW5lIGxvY2FsIGZ1enp5IHNpbXBsaWNpYWwgc2V0cyB0byBvYnRhaW4gYSBnbG9iYWwgZnV6enlcbiAgICogc2ltcGxpY2lhbCBzZXRzLiBCb3RoIGZ1enp5IHNldCBvcGVyYXRpb25zIHVzZSB0aGUgcHJvZHVjdCB0LW5vcm0uXG4gICAqIFRoZSB2YWx1ZSBvZiB0aGlzIHBhcmFtZXRlciBzaG91bGQgYmUgYmV0d2VlbiAwLjAgYW5kIDEuMDsgYSB2YWx1ZSBvZlxuICAgKiAxLjAgd2lsbCB1c2UgYSBwdXJlIGZ1enp5IHVuaW9uLCB3aGlsZSAwLjAgd2lsbCB1c2UgYSBwdXJlIGZ1enp5XG4gICAqIGludGVyc2VjdGlvbi5cbiAgICovXG4gIHNldE9wTWl4UmF0aW8/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgZWZmZWN0aXZlIHNjYWxlIG9mIGVtYmVkZGVkIHBvaW50cy4gSW4gY29tYmluYXRpb24gd2l0aCBgYG1pbl9kaXN0YGBcbiAgICogdGhpcyBkZXRlcm1pbmVzIGhvdyBjbHVzdGVyZWQvY2x1bXBlZCB0aGUgZW1iZWRkZWQgcG9pbnRzIGFyZS5cbiAgICovXG4gIHNwcmVhZD86IG51bWJlcjtcbiAgLyoqXG4gICAqIEZvciB0cmFuc2Zvcm0gb3BlcmF0aW9ucyAoZW1iZWRkaW5nIG5ldyBwb2ludHMgdXNpbmcgYSB0cmFpbmVkIG1vZGVsKVxuICAgKiB0aGlzIHdpbGwgY29udHJvbCBob3cgYWdncmVzc2l2ZWx5IHRvIHNlYXJjaCBmb3IgbmVhcmVzdCBuZWlnaGJvcnMuXG4gICAqIExhcmdlciB2YWx1ZXMgd2lsbCByZXN1bHQgaW4gc2xvd2VyIHBlcmZvcm1hbmNlIGJ1dCBtb3JlIGFjY3VyYXRlXG4gICAqIG5lYXJlc3QgbmVpZ2hib3IgZXZhbHVhdGlvbi5cbiAgICovXG4gIHRyYW5zZm9ybVF1ZXVlU2l6ZT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVTUFQU3VwZXJ2aXNlZFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgbWV0cmljIHVzZWQgdG8gbWVhc3VyZSBkaXN0YW5jZSBmb3IgYSB0YXJnZXQgYXJyYXkgaXMgdXNpbmcgc3VwZXJ2aXNlZFxuICAgKiBkaW1lbnNpb24gcmVkdWN0aW9uLiBCeSBkZWZhdWx0IHRoaXMgaXMgJ2NhdGVnb3JpY2FsJyB3aGljaCB3aWxsIG1lYXN1cmVcbiAgICogZGlzdGFuY2UgaW4gdGVybXMgb2Ygd2hldGhlciBjYXRlZ29yaWVzIG1hdGNoIG9yIGFyZSBkaWZmZXJlbnQuIEZ1cnRoZXJtb3JlLFxuICAgKiBpZiBzZW1pLXN1cGVydmlzZWQgaXMgcmVxdWlyZWQgdGFyZ2V0IHZhbHVlcyBvZiAtMSB3aWxsIGJlIHRyZWF0ZWQgYXNcbiAgICogdW5sYWJlbGxlZCB1bmRlciB0aGUgJ2NhdGVnb3JpY2FsJyBtZXRyaWMuIElmIHRoZSB0YXJnZXQgYXJyYXkgdGFrZXNcbiAgICogY29udGludW91cyB2YWx1ZXMgKGUuZy4gZm9yIGEgcmVncmVzc2lvbiBwcm9ibGVtKSB0aGVuIG1ldHJpYyBvZiAnbDEnXG4gICAqIG9yICdsMicgaXMgcHJvYmFibHkgbW9yZSBhcHByb3ByaWF0ZS5cbiAgICovXG4gIHRhcmdldE1ldHJpYz86IFRhcmdldE1ldHJpYztcbiAgLyoqXG4gICAqIFdlaWdodGluZyBmYWN0b3IgYmV0d2VlbiBkYXRhIHRvcG9sb2d5IGFuZCB0YXJnZXQgdG9wb2xvZ3kuIEEgdmFsdWUgb2ZcbiAgICogMC4wIHdlaWdodHMgZW50aXJlbHkgb24gZGF0YSwgYSB2YWx1ZSBvZiAxLjAgd2VpZ2h0cyBlbnRpcmVseSBvbiB0YXJnZXQuXG4gICAqIFRoZSBkZWZhdWx0IG9mIDAuNSBiYWxhbmNlcyB0aGUgd2VpZ2h0aW5nIGVxdWFsbHkgYmV0d2VlbiBkYXRhIGFuZCB0YXJnZXQuXG4gICAqL1xuICB0YXJnZXRXZWlnaHQ/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIG5lYXJlc3QgbmVpZ2hib3JzIHRvIHVzZSB0byBjb25zdHJ1Y3QgdGhlIHRhcmdldCBzaW1wbGNpYWxcbiAgICogc2V0LiBEZWZhdWx0cyB0byB0aGUgYG5lYXJlc3ROZWlnaGJvcnNgIHBhcmFtZXRlci5cbiAgICovXG4gIHRhcmdldE5OZWlnaGJvcnM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogVU1BUCBwcm9qZWN0aW9uIHN5c3RlbSwgYmFzZWQgb24gdGhlIHB5dGhvbiBpbXBsZW1lbnRhdGlvbiBmcm9tIE1jSW5uZXMsIEwsXG4gKiBIZWFseSwgSiwgVU1BUDogVW5pZm9ybSBNYW5pZm9sZCBBcHByb3hpbWF0aW9uIGFuZCBQcm9qZWN0aW9uIGZvciBEaW1lbnNpb25cbiAqIFJlZHVjdGlvbiAoaHR0cHM6Ly9naXRodWIuY29tL2xtY2lubmVzL3VtYXApLlxuICpcbiAqIFRoaXMgaW1wbGVtZW50YXRpb24gZGlmZmVycyBpbiBhIGZldyByZWdhcmRzOlxuICogYSkgVGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBlbWJlZGRpbmcgZm9yIG9wdGltaXphdGlvbiBpcyBub3QgY29tcHV0ZWQgdXNpbmdcbiAqICAgIGEgc3BlY3RyYWwgbWV0aG9kLCByYXRoZXIgaXQgaXMgaW5pdGlhbGl6ZWQgcmFuZG9tbHkuIFRoaXMgYXZvaWRzIHNvbWVcbiAqICAgIGNvbXB1dGF0aW9uYWxseSBpbnRlbnNpdmUgbWF0cml4IGVpZ2VuIGNvbXB1dGF0aW9ucyB0aGF0IGFyZW4ndCBlYXNpbHlcbiAqICAgIHBvcnRlZCB0byBKYXZhU2NyaXB0LlxuICogYikgQSBsb3Qgb2YgXCJleHRyYVwiIGZ1bmN0aW9uYWxpdHkgaGFzIGJlZW4gb21pdHRlZCBmcm9tIHRoaXMgaW1wbGVtZW50YXRpb24sXG4gKiAgICBtb3N0IG5vdGFibHkgYSBncmVhdCBkZWFsIG9mIGFsdGVybmF0ZSBkaXN0YW5jZSBmdW5jdGlvbnMuXG4gKlxuICogVGhpcyBpbXBsZW1lbnRhdGlvbiBwcm92aWRlcyB0aHJlZSBtZXRob2RzIG9mIHJlZHVjaW5nIGRpbWVuc2lvbmFsaXR5OlxuICogMSkgZml0OiBmaXQgdGhlIGRhdGEgc3luY2hyb25vdXNseVxuICogMikgZml0QXN5bmM6IGZpdCB0aGUgZGF0YSBhc3luY2hyb25vdXNseSwgd2l0aCBhIGNhbGxiYWNrIGZ1bmN0aW9uIHByb3ZpZGVkXG4gKiAgICAgIHRoYXQgaXMgaW52b2tlZCBvbiBlYWNoIG9wdGltaXphdGlvbiBzdGVwLlxuICogMykgaW5pdGlhbGl6ZUZpdCAvIHN0ZXA6IG1hbnVhbGx5IGluaXRpYWxpemUgdGhlIGFsZ29yaXRobSB0aGVuIGV4cGxpY3RseVxuICogICAgICBzdGVwIHRocm91Z2ggZWFjaCBlcG9jaCBvZiB0aGUgU0dEIG9wdGltaXphdGlvblxuICovXG5leHBvcnQgY2xhc3MgVU1BUCB7XG4gIHByaXZhdGUgbGVhcm5pbmdSYXRlID0gMS4wO1xuICBwcml2YXRlIGxvY2FsQ29ubmVjdGl2aXR5ID0gMS4wO1xuICBwcml2YXRlIG1pbkRpc3QgPSAwLjE7XG4gIHByaXZhdGUgbkNvbXBvbmVudHMgPSAyO1xuICBwcml2YXRlIG5FcG9jaHMgPSAwO1xuICBwcml2YXRlIG5OZWlnaGJvcnMgPSAxNTtcbiAgcHJpdmF0ZSBuZWdhdGl2ZVNhbXBsZVJhdGUgPSA1O1xuICBwcml2YXRlIHJhbmRvbSA9IE1hdGgucmFuZG9tO1xuICBwcml2YXRlIHJlcHVsc2lvblN0cmVuZ3RoID0gMS4wO1xuICBwcml2YXRlIHNldE9wTWl4UmF0aW8gPSAxLjA7XG4gIHByaXZhdGUgc3ByZWFkID0gMS4wO1xuICBwcml2YXRlIHRyYW5zZm9ybVF1ZXVlU2l6ZSA9IDQuMDtcblxuICAvLyBTdXBlcnZpc2VkIHByb2plY3Rpb24gcGFyYW1zXG4gIHByaXZhdGUgdGFyZ2V0TWV0cmljID0gVGFyZ2V0TWV0cmljLmNhdGVnb3JpY2FsO1xuICBwcml2YXRlIHRhcmdldFdlaWdodCA9IDAuNTtcbiAgcHJpdmF0ZSB0YXJnZXROTmVpZ2hib3JzID0gMTU7XG5cbiAgcHJpdmF0ZSBkaXN0YW5jZUZuOiBEaXN0YW5jZUZuID0gbnVtZXJpYztcblxuICAvLyBLTk4gc3RhdGUgKGNhbiBiZSBwcmVjb21wdXRlZCBhbmQgc3VwcGxpZWQgdmlhIGluaXRpYWxpemVGaXQpXG4gIHByaXZhdGUga25uSW5kaWNlcz86IG51bWJlcltdW107XG4gIHByaXZhdGUga25uRGlzdGFuY2VzPzogbnVtYmVyW11bXTtcblxuICAvLyBJbnRlcm5hbCBncmFwaCBjb25uZWN0aXZpdHkgcmVwcmVzZW50YXRpb25cbiAgcHJpdmF0ZSBncmFwaCE6IG1hdHJpeC5TcGFyc2VNYXRyaXg7XG4gIHByaXZhdGUgWCE6IFZlY3RvcjtcbiAgcHJpdmF0ZSBpc0luaXRpYWxpemVkID0gZmFsc2U7XG4gIHByaXZhdGUgcnBGb3Jlc3Q6IHRyZWUuRmxhdFRyZWVbXSA9IFtdO1xuICBwcml2YXRlIGluaXRGcm9tUmFuZG9tITogbm5EZXNjZW50LkluaXRGcm9tUmFuZG9tRm47XG4gIHByaXZhdGUgaW5pdEZyb21UcmVlITogbm5EZXNjZW50LkluaXRGcm9tVHJlZUZuO1xuICBwcml2YXRlIHNlYXJjaCE6IG5uRGVzY2VudC5TZWFyY2hGbjtcbiAgcHJpdmF0ZSBzZWFyY2hHcmFwaCE6IG1hdHJpeC5TcGFyc2VNYXRyaXg7XG5cbiAgLy8gU3VwZXJ2aXNlZCBwcm9qZWN0aW9uIGxhYmVscyAvIHRhcmdldHNcbiAgcHJpdmF0ZSBZPzogbnVtYmVyW107XG5cbiAgLy8gUHJvamVjdGVkIGVtYmVkZGluZ1xuICBwcml2YXRlIGVtYmVkZGluZzogbnVtYmVyW11bXSA9IFtdO1xuICBwcml2YXRlIG9wdGltaXphdGlvblN0YXRlID0gbmV3IE9wdGltaXphdGlvblN0YXRlKCk7XG5cblxuICBnZXQgbmVpZ2hib3JzKCkge1xuICAgIHJldHVybiB0aGlzLm5OZWlnaGJvcnM7XG4gIH1cbiAgY29uc3RydWN0b3IocGFyYW1zOiBVTUFQUGFyYW1ldGVycyA9IHt9KSB7XG4gICAgY29uc3Qgc2V0UGFyYW0gPSAoa2V5OiBrZXlvZiBVTUFQUGFyYW1ldGVycykgPT4ge1xuICAgICAgLy9AdHMtaWdub3JlXG4gICAgICBpZiAocGFyYW1zW2tleV0gIT09IHVuZGVmaW5lZCkgdGhpc1trZXldID0gcGFyYW1zW2tleV07XG4gICAgfTtcblxuICAgIHNldFBhcmFtKCdkaXN0YW5jZUZuJyk7XG4gICAgc2V0UGFyYW0oJ2xlYXJuaW5nUmF0ZScpO1xuICAgIHNldFBhcmFtKCdsb2NhbENvbm5lY3Rpdml0eScpO1xuICAgIHNldFBhcmFtKCdtaW5EaXN0Jyk7XG4gICAgc2V0UGFyYW0oJ25Db21wb25lbnRzJyk7XG4gICAgc2V0UGFyYW0oJ25FcG9jaHMnKTtcbiAgICBzZXRQYXJhbSgnbk5laWdoYm9ycycpO1xuICAgIHNldFBhcmFtKCduZWdhdGl2ZVNhbXBsZVJhdGUnKTtcbiAgICBzZXRQYXJhbSgncmFuZG9tJyk7XG4gICAgc2V0UGFyYW0oJ3JlcHVsc2lvblN0cmVuZ3RoJyk7XG4gICAgc2V0UGFyYW0oJ3NldE9wTWl4UmF0aW8nKTtcbiAgICBzZXRQYXJhbSgnc3ByZWFkJyk7XG4gICAgc2V0UGFyYW0oJ3RyYW5zZm9ybVF1ZXVlU2l6ZScpO1xuICAgIHRoaXMudGFyZ2V0Tk5laWdoYm9ycyA9IHBhcmFtcy5uTmVpZ2hib3JzIHx8IHRoaXMubk5laWdoYm9ycyB8fCB0aGlzLnRhcmdldE5OZWlnaGJvcnM7XG4gIH1cblxuICAvKipcbiAgICogRml0IHRoZSBkYXRhIHRvIGEgcHJvamVjdGVkIGVtYmVkZGluZyBzcGFjZSBzeW5jaHJvbm91c2x5LlxuICAgKi9cbiAgZml0KFg6IFZlY3Rvcikge1xuICAgIHRoaXMuaW5pdGlhbGl6ZUZpdChYKTtcbiAgICB0aGlzLm9wdGltaXplTGF5b3V0KCk7XG5cbiAgICByZXR1cm4gdGhpcy5lbWJlZGRpbmc7XG4gIH1cblxuICAvKipcbiAgICogRml0IHRoZSBkYXRhIHRvIGEgcHJvamVjdGVkIGVtYmVkZGluZyBzcGFjZSBhc3luY2hyb25vdXNseSwgd2l0aCBhIGNhbGxiYWNrXG4gICAqIGZ1bmN0aW9uIGludm9rZWQgb24gZXZlcnkgZXBvY2ggb2Ygb3B0aW1pemF0aW9uLlxuICAgKi9cbiAgYXN5bmMgZml0QXN5bmMoXG4gICAgWDogVmVjdG9yLFxuICAgIGNhbGxiYWNrOiAoZXBvY2hOdW1iZXI6IG51bWJlcikgPT4gdm9pZCB8IGJvb2xlYW4gPSAoKSA9PiB0cnVlXG4gICkge1xuICAgIHRoaXMuaW5pdGlhbGl6ZUZpdChYKTtcblxuICAgIGF3YWl0IHRoaXMub3B0aW1pemVMYXlvdXRBc3luYyhjYWxsYmFjayk7XG4gICAgcmV0dXJuIHRoaXMuZW1iZWRkaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHBhcmFtZXRlcnMgbmVlZGVkIGZvciBzdXBlcnZpc2VkIHByb2plY3Rpb24uXG4gICAqL1xuICBzZXRTdXBlcnZpc2VkUHJvamVjdGlvbihZOiBudW1iZXJbXSwgcGFyYW1zOiBVTUFQU3VwZXJ2aXNlZFBhcmFtcyA9IHt9KSB7XG4gICAgdGhpcy5ZID0gWTtcbiAgICB0aGlzLnRhcmdldE1ldHJpYyA9IHBhcmFtcy50YXJnZXRNZXRyaWMgfHwgdGhpcy50YXJnZXRNZXRyaWM7XG4gICAgdGhpcy50YXJnZXRXZWlnaHQgPSBwYXJhbXMudGFyZ2V0V2VpZ2h0IHx8IHRoaXMudGFyZ2V0V2VpZ2h0O1xuICAgIHRoaXMudGFyZ2V0Tk5laWdoYm9ycyA9IHBhcmFtcy50YXJnZXROTmVpZ2hib3JzIHx8IHRoaXMudGFyZ2V0Tk5laWdoYm9ycztcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB1bWFwIHdpdGggcHJlY29tcHV0ZWQgS05OIGluZGljZXMgYW5kIGRpc3RhbmNlcy5cbiAgICovXG4gIHNldFByZWNvbXB1dGVkS05OKGtubkluZGljZXM6IG51bWJlcltdW10sIGtubkRpc3RhbmNlczogbnVtYmVyW11bXSkge1xuICAgIHRoaXMua25uSW5kaWNlcyA9IGtubkluZGljZXM7XG4gICAgdGhpcy5rbm5EaXN0YW5jZXMgPSBrbm5EaXN0YW5jZXM7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgZml0IGJ5IGNvbXB1dGluZyBLTk4gYW5kIGEgZnV6enkgc2ltcGxpY2lhbCBzZXQsIGFzIHdlbGwgYXNcbiAgICogaW5pdGlhbGl6aW5nIHRoZSBwcm9qZWN0ZWQgZW1iZWRkaW5ncy4gU2V0cyB0aGUgb3B0aW1pemF0aW9uIHN0YXRlIGFoZWFkXG4gICAqIG9mIG9wdGltaXphdGlvbiBzdGVwcy4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVwb2NocyB0byBiZSB1c2VkIGZvciB0aGVcbiAgICogU0dEIG9wdGltaXphdGlvbi5cbiAgICovXG4gIGluaXRpYWxpemVGaXQoWDogVmVjdG9yKTogbnVtYmVyIHtcbiAgICBpZiAoWC5sZW5ndGggPD0gdGhpcy5uTmVpZ2hib3JzKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBOb3QgZW5vdWdoIGRhdGEgcG9pbnRzICgke1gubGVuZ3RofSkgdG8gY3JlYXRlIG5OZWlnaGJvcnM6ICR7dGhpcy5uTmVpZ2hib3JzfS4gIEFkZCBtb3JlIGRhdGEgcG9pbnRzIG9yIGFkanVzdCB0aGUgY29uZmlndXJhdGlvbi5gKTtcblxuXG4gICAgLy8gV2UgZG9uJ3QgbmVlZCB0byByZWluaXRpYWxpemUgaWYgd2UndmUgYWxyZWFkeSBpbml0aWFsaXplZCBmb3IgdGhpcyBkYXRhLlxuICAgIGlmICh0aGlzLlggPT09IFggJiYgdGhpcy5pc0luaXRpYWxpemVkKVxuICAgICAgcmV0dXJuIHRoaXMuZ2V0TkVwb2NocygpO1xuXG5cbiAgICB0aGlzLlggPSBYO1xuXG4gICAgaWYgKCF0aGlzLmtubkluZGljZXMgJiYgIXRoaXMua25uRGlzdGFuY2VzKSB7XG4gICAgICBjb25zdCBrbm5SZXN1bHRzID0gdGhpcy5uZWFyZXN0TmVpZ2hib3JzKFgpO1xuICAgICAgdGhpcy5rbm5JbmRpY2VzID0ga25uUmVzdWx0cy5rbm5JbmRpY2VzO1xuICAgICAgdGhpcy5rbm5EaXN0YW5jZXMgPSBrbm5SZXN1bHRzLmtubkRpc3RhbmNlcztcbiAgICB9XG5cbiAgICB0aGlzLmdyYXBoID0gdGhpcy5mdXp6eVNpbXBsaWNpYWxTZXQoXG4gICAgICBYLFxuICAgICAgdGhpcy5uTmVpZ2hib3JzLFxuICAgICAgdGhpcy5zZXRPcE1peFJhdGlvXG4gICAgKTtcblxuICAgIC8vIFNldCB1cCB0aGUgc2VhcmNoIGdyYXBoIGZvciBzdWJzZXF1ZW50IHRyYW5zZm9ybWF0aW9uLlxuICAgIHRoaXMubWFrZVNlYXJjaEZucygpO1xuICAgIHRoaXMuc2VhcmNoR3JhcGggPSB0aGlzLm1ha2VTZWFyY2hHcmFwaChYKTtcblxuICAgIC8vIENoZWNrIGlmIHN1cGVydmlzZWQgcHJvamVjdGlvbiwgdGhlbiBhZGp1c3QgdGhlIGdyYXBoLlxuICAgIHRoaXMucHJvY2Vzc0dyYXBoRm9yU3VwZXJ2aXNlZFByb2plY3Rpb24oKTtcblxuICAgIGNvbnN0IHtcbiAgICAgIGhlYWQsXG4gICAgICB0YWlsLFxuICAgICAgZXBvY2hzUGVyU2FtcGxlLFxuICAgIH0gPSB0aGlzLmluaXRpYWxpemVTaW1wbGljaWFsU2V0RW1iZWRkaW5nKCk7XG5cbiAgICAvLyBTZXQgdGhlIG9wdGltaXphdGlvbiByb3V0aW5lIHN0YXRlXG4gICAgdGhpcy5vcHRpbWl6YXRpb25TdGF0ZS5oZWFkID0gaGVhZDtcbiAgICB0aGlzLm9wdGltaXphdGlvblN0YXRlLnRhaWwgPSB0YWlsO1xuICAgIHRoaXMub3B0aW1pemF0aW9uU3RhdGUuZXBvY2hzUGVyU2FtcGxlID0gZXBvY2hzUGVyU2FtcGxlO1xuXG4gICAgLy8gTm93LCBpbml0aWFsaXplIHRoZSBvcHRpbWl6YXRpb24gc3RlcHNcbiAgICB0aGlzLmluaXRpYWxpemVPcHRpbWl6YXRpb24oKTtcbiAgICB0aGlzLnByZXBhcmVGb3JPcHRpbWl6YXRpb25Mb29wKCk7XG4gICAgdGhpcy5pc0luaXRpYWxpemVkID0gdHJ1ZTtcblxuICAgIHJldHVybiB0aGlzLmdldE5FcG9jaHMoKTtcbiAgfVxuXG4gIHByaXZhdGUgbWFrZVNlYXJjaEZucygpIHtcbiAgICBjb25zdCB7aW5pdEZyb21UcmVlLCBpbml0RnJvbVJhbmRvbX0gPSBubkRlc2NlbnQubWFrZUluaXRpYWxpemF0aW9ucyhcbiAgICAgIHRoaXMuZGlzdGFuY2VGblxuICAgICk7XG4gICAgdGhpcy5pbml0RnJvbVRyZWUgPSBpbml0RnJvbVRyZWU7XG4gICAgdGhpcy5pbml0RnJvbVJhbmRvbSA9IGluaXRGcm9tUmFuZG9tO1xuICAgIHRoaXMuc2VhcmNoID0gbm5EZXNjZW50Lm1ha2VJbml0aWFsaXplZE5OU2VhcmNoKHRoaXMuZGlzdGFuY2VGbik7XG4gIH1cblxuICBwcml2YXRlIG1ha2VTZWFyY2hHcmFwaChYOiBWZWN0b3IpIHtcbiAgICBjb25zdCBrbm5JbmRpY2VzID0gdGhpcy5rbm5JbmRpY2VzITtcbiAgICBjb25zdCBrbm5EaXN0YW5jZXMgPSB0aGlzLmtubkRpc3RhbmNlcyE7XG4gICAgY29uc3QgZGltcyA9IFtYLmxlbmd0aCwgWC5sZW5ndGhdO1xuICAgIGNvbnN0IHNlYXJjaEdyYXBoID0gbmV3IG1hdHJpeC5TcGFyc2VNYXRyaXgoW10sIFtdLCBbXSwgZGltcyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrbm5JbmRpY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBrbm4gPSBrbm5JbmRpY2VzW2ldO1xuICAgICAgY29uc3QgZGlzdGFuY2VzID0ga25uRGlzdGFuY2VzW2ldO1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBrbm4ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgY29uc3QgbmVpZ2hib3IgPSBrbm5bal07XG4gICAgICAgIGNvbnN0IGRpc3RhbmNlID0gZGlzdGFuY2VzW2pdO1xuICAgICAgICBpZiAoZGlzdGFuY2UgPiAwKVxuICAgICAgICAgIHNlYXJjaEdyYXBoLnNldChpLCBuZWlnaGJvciwgZGlzdGFuY2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHRyYW5zcG9zZSA9IG1hdHJpeC50cmFuc3Bvc2Uoc2VhcmNoR3JhcGgpO1xuICAgIHJldHVybiBtYXRyaXgubWF4aW11bShzZWFyY2hHcmFwaCwgdHJhbnNwb3NlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2Zvcm1zIGRhdGEgdG8gdGhlIGV4aXN0aW5nIGVtYmVkZGluZyBzcGFjZS5cbiAgICovXG4gIHRyYW5zZm9ybSh0b1RyYW5zZm9ybTogVmVjdG9yKSB7XG4gICAgLy8gVXNlIHRoZSBwcmV2aW91cyByYXdEYXRhXG4gICAgY29uc3QgcmF3RGF0YSA9IHRoaXMuWDtcbiAgICBpZiAocmF3RGF0YSA9PT0gdW5kZWZpbmVkIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBkYXRhIGhhcyBiZWVuIGZpdC4nKTtcblxuXG4gICAgbGV0IG5OZWlnaGJvcnMgPSBNYXRoLmZsb29yKHRoaXMubk5laWdoYm9ycyAqIHRoaXMudHJhbnNmb3JtUXVldWVTaXplKTtcbiAgICBuTmVpZ2hib3JzID0gTWF0aC5taW4ocmF3RGF0YS5sZW5ndGgsIG5OZWlnaGJvcnMpO1xuICAgIGNvbnN0IGluaXQgPSBubkRlc2NlbnQuaW5pdGlhbGl6ZVNlYXJjaChcbiAgICAgIHRoaXMucnBGb3Jlc3QsXG4gICAgICByYXdEYXRhLFxuICAgICAgdG9UcmFuc2Zvcm0sXG4gICAgICBuTmVpZ2hib3JzLFxuICAgICAgdGhpcy5pbml0RnJvbVJhbmRvbSxcbiAgICAgIHRoaXMuaW5pdEZyb21UcmVlLFxuICAgICAgdGhpcy5yYW5kb21cbiAgICApO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5zZWFyY2gocmF3RGF0YSwgdGhpcy5zZWFyY2hHcmFwaCwgaW5pdCwgdG9UcmFuc2Zvcm0pO1xuXG4gICAgbGV0IHtpbmRpY2VzLCB3ZWlnaHRzOiBkaXN0YW5jZXN9ID0gaGVhcC5kZWhlYXBTb3J0KHJlc3VsdCk7XG5cbiAgICBpbmRpY2VzID0gaW5kaWNlcy5tYXAoKHgpID0+IHguc2xpY2UoMCwgdGhpcy5uTmVpZ2hib3JzKSk7XG4gICAgZGlzdGFuY2VzID0gZGlzdGFuY2VzLm1hcCgoeCkgPT4geC5zbGljZSgwLCB0aGlzLm5OZWlnaGJvcnMpKTtcblxuICAgIGNvbnN0IGFkanVzdGVkTG9jYWxDb25uZWN0aXZpdHkgPSBNYXRoLm1heCgwLCB0aGlzLmxvY2FsQ29ubmVjdGl2aXR5IC0gMSk7XG4gICAgY29uc3Qge3NpZ21hcywgcmhvc30gPSB0aGlzLnNtb290aEtOTkRpc3RhbmNlKFxuICAgICAgZGlzdGFuY2VzLFxuICAgICAgdGhpcy5uTmVpZ2hib3JzLFxuICAgICAgYWRqdXN0ZWRMb2NhbENvbm5lY3Rpdml0eVxuICAgICk7XG5cbiAgICBjb25zdCB7cm93cywgY29scywgdmFsc30gPSB0aGlzLmNvbXB1dGVNZW1iZXJzaGlwU3RyZW5ndGhzKFxuICAgICAgaW5kaWNlcyxcbiAgICAgIGRpc3RhbmNlcyxcbiAgICAgIHNpZ21hcyxcbiAgICAgIHJob3NcbiAgICApO1xuXG4gICAgY29uc3Qgc2l6ZSA9IFt0b1RyYW5zZm9ybS5sZW5ndGgsIHJhd0RhdGEubGVuZ3RoXTtcbiAgICBsZXQgZ3JhcGggPSBuZXcgbWF0cml4LlNwYXJzZU1hdHJpeChyb3dzLCBjb2xzLCB2YWxzLCBzaXplKTtcblxuICAgIC8vIFRoaXMgd2FzIGEgdmVyeSBzcGVjaWFsbHkgY29uc3RydWN0ZWQgZ3JhcGggd2l0aCBjb25zdGFudCBkZWdyZWUuXG4gICAgLy8gVGhhdCBsZXRzIHVzIGRvIGZhbmN5IHVucGFja2luZyBieSByZXNoYXBpbmcgdGhlIGNzciBtYXRyaXggaW5kaWNlc1xuICAgIC8vIGFuZCBkYXRhLiBEb2luZyBzbyByZWxpZXMgb24gdGhlIGNvbnN0YW50IGRlZ3JlZSBhc3N1bXB0aW9uIVxuXG4gICAgY29uc3Qgbm9ybWVkID0gbWF0cml4Lm5vcm1hbGl6ZShncmFwaCwgbWF0cml4Lk5vcm1UeXBlLmwxKTtcblxuICAgIGNvbnN0IGNzck1hdHJpeCA9IG1hdHJpeC5nZXRDU1Iobm9ybWVkKTtcbiAgICBjb25zdCBuUG9pbnRzID0gdG9UcmFuc2Zvcm0ubGVuZ3RoO1xuXG4gICAgY29uc3QgZUluZGljZXMgPSB1dGlscy5yZXNoYXBlMmQoXG4gICAgICBjc3JNYXRyaXguaW5kaWNlcyxcbiAgICAgIG5Qb2ludHMsXG4gICAgICB0aGlzLm5OZWlnaGJvcnNcbiAgICApO1xuXG4gICAgY29uc3QgZVdlaWdodHMgPSB1dGlscy5yZXNoYXBlMmQoXG4gICAgICBjc3JNYXRyaXgudmFsdWVzLFxuICAgICAgblBvaW50cyxcbiAgICAgIHRoaXMubk5laWdoYm9yc1xuICAgICk7XG5cbiAgICBjb25zdCBlbWJlZGRpbmcgPSBpbml0VHJhbnNmb3JtKGVJbmRpY2VzLCBlV2VpZ2h0cywgdGhpcy5lbWJlZGRpbmcpO1xuXG4gICAgY29uc3QgbkVwb2NocyA9IHRoaXMubkVwb2NocyA/XG4gICAgICB0aGlzLm5FcG9jaHMgLyAzIDpcbiAgICAgIGdyYXBoLm5Sb3dzIDw9IDEwMDAwID9cbiAgICAgICAgMTAwIDpcbiAgICAgICAgMzA7XG5cbiAgICBjb25zdCBncmFwaE1heCA9IGdyYXBoXG4gICAgICAuZ2V0VmFsdWVzKClcbiAgICAgIC5yZWR1Y2UoKG1heCwgdmFsKSA9PiAodmFsID4gbWF4ID8gdmFsIDogbWF4KSwgMCk7XG4gICAgZ3JhcGggPSBncmFwaC5tYXAoKHZhbHVlKSA9PiAodmFsdWUgPCBncmFwaE1heCAvIG5FcG9jaHMgPyAwIDogdmFsdWUpKTtcbiAgICBncmFwaCA9IG1hdHJpeC5lbGltaW5hdGVaZXJvcyhncmFwaCk7XG5cbiAgICBjb25zdCBlcG9jaHNQZXJTYW1wbGUgPSB0aGlzLm1ha2VFcG9jaHNQZXJTYW1wbGUoXG4gICAgICBncmFwaC5nZXRWYWx1ZXMoKSxcbiAgICAgIG5FcG9jaHNcbiAgICApO1xuICAgIGNvbnN0IGhlYWQgPSBncmFwaC5nZXRSb3dzKCk7XG4gICAgY29uc3QgdGFpbCA9IGdyYXBoLmdldENvbHMoKTtcblxuICAgIC8vIEluaXRpYWxpemUgb3B0aW1pemF0aW9uIHNsaWdodGx5IGRpZmZlcmVudGx5IHRoYW4gdGhlIGZpdCBtZXRob2QuXG4gICAgdGhpcy5hc3NpZ25PcHRpbWl6YXRpb25TdGF0ZVBhcmFtZXRlcnMoe1xuICAgICAgaGVhZEVtYmVkZGluZzogZW1iZWRkaW5nLFxuICAgICAgdGFpbEVtYmVkZGluZzogdGhpcy5lbWJlZGRpbmcsXG4gICAgICBoZWFkLFxuICAgICAgdGFpbCxcbiAgICAgIGN1cnJlbnRFcG9jaDogMCxcbiAgICAgIG5FcG9jaHMsXG4gICAgICBuVmVydGljZXM6IGdyYXBoLmdldERpbXMoKVsxXSxcbiAgICAgIGVwb2Noc1BlclNhbXBsZSxcbiAgICB9KTtcbiAgICB0aGlzLnByZXBhcmVGb3JPcHRpbWl6YXRpb25Mb29wKCk7XG5cbiAgICByZXR1cm4gdGhpcy5vcHRpbWl6ZUxheW91dCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB3ZSdyZSB1c2luZyBzdXBlcnZpc2VkIHByb2plY3Rpb24sIHRoZW4gcHJvY2VzcyB0aGUgZ3JhcGhcbiAgICogYWNjb3JkaW5nbHkuXG4gICAqL1xuICBwcml2YXRlIHByb2Nlc3NHcmFwaEZvclN1cGVydmlzZWRQcm9qZWN0aW9uKCkge1xuICAgIGNvbnN0IHtZLCBYfSA9IHRoaXM7XG4gICAgaWYgKFkpIHtcbiAgICAgIGlmIChZLmxlbmd0aCAhPT0gWC5sZW5ndGgpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTGVuZ3RoIG9mIFggYW5kIHkgbXVzdCBiZSBlcXVhbCcpO1xuXG5cbiAgICAgIGlmICh0aGlzLnRhcmdldE1ldHJpYyA9PT0gVGFyZ2V0TWV0cmljLmNhdGVnb3JpY2FsKSB7XG4gICAgICAgIGNvbnN0IGx0ID0gdGhpcy50YXJnZXRXZWlnaHQgPCAxLjA7XG4gICAgICAgIGNvbnN0IGZhckRpc3QgPSBsdCA/IDIuNSAqICgxLjAgLyAoMS4wIC0gdGhpcy50YXJnZXRXZWlnaHQpKSA6IDEuMGUxMjtcbiAgICAgICAgdGhpcy5ncmFwaCA9IHRoaXMuY2F0ZWdvcmljYWxTaW1wbGljaWFsU2V0SW50ZXJzZWN0aW9uKFxuICAgICAgICAgIHRoaXMuZ3JhcGgsXG4gICAgICAgICAgWSxcbiAgICAgICAgICBmYXJEaXN0XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICAvLyBUT0RPIChhbmR5Y29lbmVuQCk6IGFkZCBub24tY2F0ZWdvcmljYWwgc3VwZXJ2aXNlZCBlbWJlZGRpbmdzLlxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNYW51YWxseSBzdGVwIHRocm91Z2ggdGhlIG9wdGltaXphdGlvbiBwcm9jZXNzIG9uZSBlcG9jaCBhdCBhIHRpbWUuXG4gICAqL1xuICBzdGVwKCkge1xuICAgIGNvbnN0IHtjdXJyZW50RXBvY2h9ID0gdGhpcy5vcHRpbWl6YXRpb25TdGF0ZTtcblxuICAgIGlmIChjdXJyZW50RXBvY2ggPCB0aGlzLmdldE5FcG9jaHMoKSlcbiAgICAgIHRoaXMub3B0aW1pemVMYXlvdXRTdGVwKGN1cnJlbnRFcG9jaCk7XG5cbiAgICByZXR1cm4gdGhpcy5vcHRpbWl6YXRpb25TdGF0ZS5jdXJyZW50RXBvY2g7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY29tcHV0ZWQgcHJvamVjdGVkIGVtYmVkZGluZy5cbiAgICovXG4gIGdldEVtYmVkZGluZygpIHtcbiAgICByZXR1cm4gdGhpcy5lbWJlZGRpbmc7XG4gIH1cblxuICAvKipcbiAgICogQ29tcHV0ZSB0aGUgYGBuTmVpZ2hib3JzYGAgbmVhcmVzdCBwb2ludHMgZm9yIGVhY2ggZGF0YSBwb2ludCBpbiBgYFhgYFxuICAgKiBUaGlzIG1heSBiZSBleGFjdCwgYnV0IG1vcmUgbGlrZWx5IGlzIGFwcHJveGltYXRlZCB2aWEgbmVhcmVzdCBuZWlnaGJvclxuICAgKiBkZXNjZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBuZWFyZXN0TmVpZ2hib3JzKFg6IFZlY3Rvcikge1xuICAgIGNvbnN0IHtkaXN0YW5jZUZuLCBuTmVpZ2hib3JzfSA9IHRoaXM7XG4gICAgY29uc3QgbG9nMiA9IChuOiBudW1iZXIpID0+IE1hdGgubG9nKG4pIC8gTWF0aC5sb2coMik7XG4gICAgY29uc3QgbWV0cmljTk5EZXNjZW50ID0gbm5EZXNjZW50Lm1ha2VOTkRlc2NlbnQoZGlzdGFuY2VGbiwgdGhpcy5yYW5kb20pO1xuXG4gICAgLy8gSGFuZGxlIHB5dGhvbjMgcm91bmRpbmcgZG93biBmcm9tIDAuNSBkaXNjcnBhbmN5XG4gICAgY29uc3Qgcm91bmQgPSAobjogbnVtYmVyKSA9PiB7XG4gICAgICByZXR1cm4gbiA9PT0gMC41ID8gMCA6IE1hdGgucm91bmQobik7XG4gICAgfTtcblxuICAgIGNvbnN0IG5UcmVlcyA9IDUgKyBNYXRoLmZsb29yKHJvdW5kKFgubGVuZ3RoICoqIDAuNSAvIDIwLjApKTtcbiAgICBjb25zdCBuSXRlcnMgPSBNYXRoLm1heCg1LCBNYXRoLmZsb29yKE1hdGgucm91bmQobG9nMihYLmxlbmd0aCkpKSk7XG5cbiAgICB0aGlzLnJwRm9yZXN0ID0gdHJlZS5tYWtlRm9yZXN0KFgsIG5OZWlnaGJvcnMsIG5UcmVlcywgdGhpcy5yYW5kb20pO1xuXG4gICAgY29uc3QgbGVhZkFycmF5ID0gdHJlZS5tYWtlTGVhZkFycmF5KHRoaXMucnBGb3Jlc3QpO1xuICAgIGNvbnN0IHtpbmRpY2VzLCB3ZWlnaHRzfSA9IG1ldHJpY05ORGVzY2VudChcbiAgICAgIFgsXG4gICAgICBsZWFmQXJyYXksXG4gICAgICBuTmVpZ2hib3JzLFxuICAgICAgbkl0ZXJzXG4gICAgKTtcbiAgICByZXR1cm4ge2tubkluZGljZXM6IGluZGljZXMsIGtubkRpc3RhbmNlczogd2VpZ2h0c307XG4gIH1cblxuICAvKipcbiAgICogR2l2ZW4gYSBzZXQgb2YgZGF0YSBYLCBhIG5laWdoYm9yaG9vZCBzaXplLCBhbmQgYSBtZWFzdXJlIG9mIGRpc3RhbmNlXG4gICAqIGNvbXB1dGUgdGhlIGZ1enp5IHNpbXBsaWNpYWwgc2V0IChoZXJlIHJlcHJlc2VudGVkIGFzIGEgZnV6enkgZ3JhcGggaW5cbiAgICogdGhlIGZvcm0gb2YgYSBzcGFyc2UgbWF0cml4KSBhc3NvY2lhdGVkIHRvIHRoZSBkYXRhLiBUaGlzIGlzIGRvbmUgYnlcbiAgICogbG9jYWxseSBhcHByb3hpbWF0aW5nIGdlb2Rlc2ljIGRpc3RhbmNlIGF0IGVhY2ggcG9pbnQsIGNyZWF0aW5nIGEgZnV6enlcbiAgICogc2ltcGxpY2lhbCBzZXQgZm9yIGVhY2ggc3VjaCBwb2ludCwgYW5kIHRoZW4gY29tYmluaW5nIGFsbCB0aGUgbG9jYWxcbiAgICogZnV6enkgc2ltcGxpY2lhbCBzZXRzIGludG8gYSBnbG9iYWwgb25lIHZpYSBhIGZ1enp5IHVuaW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBmdXp6eVNpbXBsaWNpYWxTZXQoXG4gICAgWDogVmVjdG9yLFxuICAgIG5OZWlnaGJvcnM6IG51bWJlcixcbiAgICBzZXRPcE1peFJhdGlvID0gMS4wXG4gICkge1xuICAgIGNvbnN0IHtrbm5JbmRpY2VzID0gW10sIGtubkRpc3RhbmNlcyA9IFtdLCBsb2NhbENvbm5lY3Rpdml0eX0gPSB0aGlzO1xuXG4gICAgY29uc3Qge3NpZ21hcywgcmhvc30gPSB0aGlzLnNtb290aEtOTkRpc3RhbmNlKFxuICAgICAga25uRGlzdGFuY2VzLFxuICAgICAgbk5laWdoYm9ycyxcbiAgICAgIGxvY2FsQ29ubmVjdGl2aXR5XG4gICAgKTtcblxuICAgIGNvbnN0IHtyb3dzLCBjb2xzLCB2YWxzfSA9IHRoaXMuY29tcHV0ZU1lbWJlcnNoaXBTdHJlbmd0aHMoXG4gICAgICBrbm5JbmRpY2VzLFxuICAgICAga25uRGlzdGFuY2VzLFxuICAgICAgc2lnbWFzLFxuICAgICAgcmhvc1xuICAgICk7XG5cbiAgICBjb25zdCBzaXplID0gW1gubGVuZ3RoLCBYLmxlbmd0aF07XG4gICAgY29uc3Qgc3BhcnNlTWF0cml4ID0gbmV3IG1hdHJpeC5TcGFyc2VNYXRyaXgocm93cywgY29scywgdmFscywgc2l6ZSk7XG5cbiAgICBjb25zdCB0cmFuc3Bvc2UgPSBtYXRyaXgudHJhbnNwb3NlKHNwYXJzZU1hdHJpeCk7XG4gICAgY29uc3QgcHJvZE1hdHJpeCA9IG1hdHJpeC5wYWlyd2lzZU11bHRpcGx5KHNwYXJzZU1hdHJpeCwgdHJhbnNwb3NlKTtcblxuICAgIGNvbnN0IGEgPSBtYXRyaXguc3VidHJhY3QobWF0cml4LmFkZChzcGFyc2VNYXRyaXgsIHRyYW5zcG9zZSksIHByb2RNYXRyaXgpO1xuICAgIGNvbnN0IGIgPSBtYXRyaXgubXVsdGlwbHlTY2FsYXIoYSwgc2V0T3BNaXhSYXRpbyk7XG4gICAgY29uc3QgYyA9IG1hdHJpeC5tdWx0aXBseVNjYWxhcihwcm9kTWF0cml4LCAxLjAgLSBzZXRPcE1peFJhdGlvKTtcbiAgICBjb25zdCByZXN1bHQgPSBtYXRyaXguYWRkKGIsIGMpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21iaW5lIGEgZnV6enkgc2ltcGxpY2lhbCBzZXQgd2l0aCBhbm90aGVyIGZ1enp5IHNpbXBsaWNpYWwgc2V0XG4gICAqIGdlbmVyYXRlZCBmcm9tIGNhdGVnb3JpY2FsIGRhdGEgdXNpbmcgY2F0ZWdvcmljYWwgZGlzdGFuY2VzLiBUaGUgdGFyZ2V0XG4gICAqIGRhdGEgaXMgYXNzdW1lZCB0byBiZSBjYXRlZ29yaWNhbCBsYWJlbCBkYXRhIChhIHZlY3RvciBvZiBsYWJlbHMpLFxuICAgKiBhbmQgdGhpcyB3aWxsIHVwZGF0ZSB0aGUgZnV6enkgc2ltcGxpY2lhbCBzZXQgdG8gcmVzcGVjdCB0aGF0IGxhYmVsIGRhdGEuXG4gICAqL1xuICBwcml2YXRlIGNhdGVnb3JpY2FsU2ltcGxpY2lhbFNldEludGVyc2VjdGlvbihcbiAgICBzaW1wbGljaWFsU2V0OiBtYXRyaXguU3BhcnNlTWF0cml4LFxuICAgIHRhcmdldDogbnVtYmVyW10sXG4gICAgZmFyRGlzdDogbnVtYmVyLFxuICAgIHVua25vd25EaXN0ID0gMS4wXG4gICkge1xuICAgIGxldCBpbnRlcnNlY3Rpb24gPSBmYXN0SW50ZXJzZWN0aW9uKFxuICAgICAgc2ltcGxpY2lhbFNldCxcbiAgICAgIHRhcmdldCxcbiAgICAgIHVua25vd25EaXN0LFxuICAgICAgZmFyRGlzdFxuICAgICk7XG4gICAgaW50ZXJzZWN0aW9uID0gbWF0cml4LmVsaW1pbmF0ZVplcm9zKGludGVyc2VjdGlvbik7XG4gICAgcmV0dXJuIHJlc2V0TG9jYWxDb25uZWN0aXZpdHkoaW50ZXJzZWN0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlIGEgY29udGludW91cyB2ZXJzaW9uIG9mIHRoZSBkaXN0YW5jZSB0byB0aGUga3RoIG5lYXJlc3RcbiAgICogbmVpZ2hib3IuIFRoYXQgaXMsIHRoaXMgaXMgc2ltaWxhciB0byBrbm4tZGlzdGFuY2UgYnV0IGFsbG93cyBjb250aW51b3VzXG4gICAqIGsgdmFsdWVzIHJhdGhlciB0aGFuIHJlcXVpcmluZyBhbiBpbnRlZ3JhbCBrLiBJbiBlc3NjZW5jZSB3ZSBhcmUgc2ltcGx5XG4gICAqIGNvbXB1dGluZyB0aGUgZGlzdGFuY2Ugc3VjaCB0aGF0IHRoZSBjYXJkaW5hbGl0eSBvZiBmdXp6eSBzZXQgd2UgZ2VuZXJhdGVcbiAgICogaXMgay5cbiAgICovXG4gIHByaXZhdGUgc21vb3RoS05ORGlzdGFuY2UoXG4gICAgZGlzdGFuY2VzOiBWZWN0b3JzLFxuICAgIGs6IG51bWJlcixcbiAgICBsb2NhbENvbm5lY3Rpdml0eSA9IDEuMCxcbiAgICBuSXRlciA9IDY0LFxuICAgIGJhbmR3aWR0aCA9IDEuMFxuICApIHtcbiAgICBjb25zdCB0YXJnZXQgPSAoTWF0aC5sb2coaykgLyBNYXRoLmxvZygyKSkgKiBiYW5kd2lkdGg7XG4gICAgY29uc3QgcmhvID0gdXRpbHMuemVyb3MoZGlzdGFuY2VzLmxlbmd0aCk7XG4gICAgY29uc3QgcmVzdWx0ID0gdXRpbHMuemVyb3MoZGlzdGFuY2VzLmxlbmd0aCk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpc3RhbmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IGxvID0gMC4wO1xuICAgICAgbGV0IGhpID0gSW5maW5pdHk7XG4gICAgICBsZXQgbWlkID0gMS4wO1xuXG4gICAgICAvLyBUT0RPOiBUaGlzIGlzIHZlcnkgaW5lZmZpY2llbnQsIGJ1dCB3aWxsIGRvIGZvciBub3cuIEZJWE1FXG4gICAgICBjb25zdCBpdGhEaXN0YW5jZXMgPSBkaXN0YW5jZXNbaV07XG4gICAgICBjb25zdCBub25aZXJvRGlzdHMgPSBpdGhEaXN0YW5jZXMuZmlsdGVyKChkKSA9PiBkID4gMC4wKTtcblxuICAgICAgaWYgKG5vblplcm9EaXN0cy5sZW5ndGggPj0gbG9jYWxDb25uZWN0aXZpdHkpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBNYXRoLmZsb29yKGxvY2FsQ29ubmVjdGl2aXR5KTtcbiAgICAgICAgY29uc3QgaW50ZXJwb2xhdGlvbiA9IGxvY2FsQ29ubmVjdGl2aXR5IC0gaW5kZXg7XG4gICAgICAgIGlmIChpbmRleCA+IDApIHtcbiAgICAgICAgICByaG9baV0gPSBub25aZXJvRGlzdHNbaW5kZXggLSAxXTtcbiAgICAgICAgICBpZiAoaW50ZXJwb2xhdGlvbiA+IFNNT09USF9LX1RPTEVSQU5DRSkge1xuICAgICAgICAgICAgcmhvW2ldICs9XG4gICAgICAgICAgICAgIGludGVycG9sYXRpb24gKiAobm9uWmVyb0Rpc3RzW2luZGV4XSAtIG5vblplcm9EaXN0c1tpbmRleCAtIDFdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmhvW2ldID0gaW50ZXJwb2xhdGlvbiAqIG5vblplcm9EaXN0c1swXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChub25aZXJvRGlzdHMubGVuZ3RoID4gMCkge1xuICAgICAgICByaG9baV0gPSB1dGlscy5tYXgobm9uWmVyb0Rpc3RzKTtcbiAgICAgIH1cblxuICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCBuSXRlcjsgbisrKSB7XG4gICAgICAgIGxldCBwc3VtID0gMC4wO1xuICAgICAgICBmb3IgKGxldCBqID0gMTsgaiA8IGRpc3RhbmNlc1tpXS5sZW5ndGg7IGorKykge1xuICAgICAgICAgIGNvbnN0IGQgPSBkaXN0YW5jZXNbaV1bal0gLSByaG9baV07XG4gICAgICAgICAgaWYgKGQgPiAwKVxuICAgICAgICAgICAgcHN1bSArPSBNYXRoLmV4cCgtKGQgLyBtaWQpKTtcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBwc3VtICs9IDEuMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChNYXRoLmFicyhwc3VtIC0gdGFyZ2V0KSA8IFNNT09USF9LX1RPTEVSQU5DRSlcbiAgICAgICAgICBicmVhaztcblxuXG4gICAgICAgIGlmIChwc3VtID4gdGFyZ2V0KSB7XG4gICAgICAgICAgaGkgPSBtaWQ7XG4gICAgICAgICAgbWlkID0gKGxvICsgaGkpIC8gMi4wO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvID0gbWlkO1xuICAgICAgICAgIGlmIChoaSA9PT0gSW5maW5pdHkpXG4gICAgICAgICAgICBtaWQgKj0gMjtcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBtaWQgPSAobG8gKyBoaSkgLyAyLjA7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmVzdWx0W2ldID0gbWlkO1xuXG4gICAgICAvLyBUT0RPOiBUaGlzIGlzIHZlcnkgaW5lZmZpY2llbnQsIGJ1dCB3aWxsIGRvIGZvciBub3cuIEZJWE1FXG4gICAgICBpZiAocmhvW2ldID4gMC4wKSB7XG4gICAgICAgIGNvbnN0IG1lYW5JdGhEaXN0YW5jZXMgPSB1dGlscy5tZWFuKGl0aERpc3RhbmNlcyk7XG4gICAgICAgIGlmIChyZXN1bHRbaV0gPCBNSU5fS19ESVNUX1NDQUxFICogbWVhbkl0aERpc3RhbmNlcylcbiAgICAgICAgICByZXN1bHRbaV0gPSBNSU5fS19ESVNUX1NDQUxFICogbWVhbkl0aERpc3RhbmNlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG1lYW5EaXN0YW5jZXMgPSB1dGlscy5tZWFuKGRpc3RhbmNlcy5tYXAodXRpbHMubWVhbikpO1xuICAgICAgICBpZiAocmVzdWx0W2ldIDwgTUlOX0tfRElTVF9TQ0FMRSAqIG1lYW5EaXN0YW5jZXMpXG4gICAgICAgICAgcmVzdWx0W2ldID0gTUlOX0tfRElTVF9TQ0FMRSAqIG1lYW5EaXN0YW5jZXM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtzaWdtYXM6IHJlc3VsdCwgcmhvczogcmhvfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3QgdGhlIG1lbWJlcnNoaXAgc3RyZW5ndGggZGF0YSBmb3IgdGhlIDEtc2tlbGV0b24gb2YgZWFjaCBsb2NhbFxuICAgKiBmdXp6eSBzaW1wbGljaWFsIHNldCAtLSB0aGlzIGlzIGZvcm1lZCBhcyBhIHNwYXJzZSBtYXRyaXggd2hlcmUgZWFjaCByb3cgaXNcbiAgICogYSBsb2NhbCBmdXp6eSBzaW1wbGljaWFsIHNldCwgd2l0aCBhIG1lbWJlcnNoaXAgc3RyZW5ndGggZm9yIHRoZVxuICAgKiAxLXNpbXBsZXggdG8gZWFjaCBvdGhlciBkYXRhIHBvaW50LlxuICAgKi9cbiAgcHJpdmF0ZSBjb21wdXRlTWVtYmVyc2hpcFN0cmVuZ3RocyhcbiAgICBrbm5JbmRpY2VzOiBWZWN0b3JzLFxuICAgIGtubkRpc3RhbmNlczogVmVjdG9ycyxcbiAgICBzaWdtYXM6IG51bWJlcltdLFxuICAgIHJob3M6IG51bWJlcltdXG4gICk6IHsgcm93czogbnVtYmVyW107IGNvbHM6IG51bWJlcltdOyB2YWxzOiBudW1iZXJbXSB9IHtcbiAgICBjb25zdCBuU2FtcGxlcyA9IGtubkluZGljZXMubGVuZ3RoO1xuICAgIGNvbnN0IG5OZWlnaGJvcnMgPSBrbm5JbmRpY2VzWzBdLmxlbmd0aDtcblxuICAgIGNvbnN0IHJvd3MgPSB1dGlscy56ZXJvcyhuU2FtcGxlcyAqIG5OZWlnaGJvcnMpO1xuICAgIGNvbnN0IGNvbHMgPSB1dGlscy56ZXJvcyhuU2FtcGxlcyAqIG5OZWlnaGJvcnMpO1xuICAgIGNvbnN0IHZhbHMgPSB1dGlscy56ZXJvcyhuU2FtcGxlcyAqIG5OZWlnaGJvcnMpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuU2FtcGxlczsgaSsrKSB7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG5OZWlnaGJvcnM7IGorKykge1xuICAgICAgICBsZXQgdmFsID0gMDtcbiAgICAgICAgaWYgKGtubkluZGljZXNbaV1bal0gPT09IC0xKVxuICAgICAgICAgIGNvbnRpbnVlOyAvLyBXZSBkaWRuJ3QgZ2V0IHRoZSBmdWxsIGtubiBmb3IgaVxuXG4gICAgICAgIGlmIChrbm5JbmRpY2VzW2ldW2pdID09PSBpKVxuICAgICAgICAgIHZhbCA9IDAuMDtcbiAgICAgICAgZWxzZSBpZiAoa25uRGlzdGFuY2VzW2ldW2pdIC0gcmhvc1tpXSA8PSAwLjApXG4gICAgICAgICAgdmFsID0gMS4wO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgdmFsID0gTWF0aC5leHAoLSgoa25uRGlzdGFuY2VzW2ldW2pdIC0gcmhvc1tpXSkgLyBzaWdtYXNbaV0pKTtcblxuXG4gICAgICAgIHJvd3NbaSAqIG5OZWlnaGJvcnMgKyBqXSA9IGk7XG4gICAgICAgIGNvbHNbaSAqIG5OZWlnaGJvcnMgKyBqXSA9IGtubkluZGljZXNbaV1bal07XG4gICAgICAgIHZhbHNbaSAqIG5OZWlnaGJvcnMgKyBqXSA9IHZhbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge3Jvd3MsIGNvbHMsIHZhbHN9O1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgYSBmdXp6eSBzaW1wbGljaWFsIHNldCBlbWJlZGRpbmcsIHVzaW5nIGEgc3BlY2lmaWVkXG4gICAqIGluaXRpYWxpc2F0aW9uIG1ldGhvZCBhbmQgdGhlbiBtaW5pbWl6aW5nIHRoZSBmdXp6eSBzZXQgY3Jvc3MgZW50cm9weVxuICAgKiBiZXR3ZWVuIHRoZSAxLXNrZWxldG9ucyBvZiB0aGUgaGlnaCBhbmQgbG93IGRpbWVuc2lvbmFsIGZ1enp5IHNpbXBsaWNpYWxcbiAgICogc2V0cy5cbiAgICovXG4gIHByaXZhdGUgaW5pdGlhbGl6ZVNpbXBsaWNpYWxTZXRFbWJlZGRpbmcoKSB7XG4gICAgY29uc3QgbkVwb2NocyA9IHRoaXMuZ2V0TkVwb2NocygpO1xuXG4gICAgY29uc3Qge25Db21wb25lbnRzfSA9IHRoaXM7XG4gICAgY29uc3QgZ3JhcGhWYWx1ZXMgPSB0aGlzLmdyYXBoLmdldFZhbHVlcygpO1xuICAgIGxldCBncmFwaE1heCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBncmFwaFZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgdmFsdWUgPSBncmFwaFZhbHVlc1tpXTtcbiAgICAgIGlmIChncmFwaE1heCA8IGdyYXBoVmFsdWVzW2ldKVxuICAgICAgICBncmFwaE1heCA9IHZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0IGdyYXBoID0gdGhpcy5ncmFwaC5tYXAoKHZhbHVlKSA9PiB7XG4gICAgICBpZiAodmFsdWUgPCBncmFwaE1heCAvIG5FcG9jaHMpXG4gICAgICAgIHJldHVybiAwO1xuICAgICAgZWxzZVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSk7XG5cbiAgICAvLyBXZSdyZSBub3QgY29tcHV0aW5nIHRoZSBzcGVjdHJhbCBpbml0aWFsaXphdGlvbiBpbiB0aGlzIGltcGxlbWVudGF0aW9uXG4gICAgLy8gdW50aWwgd2UgZGV0ZXJtaW5lIGEgYmV0dGVyIGVpZ2VudmFsdWUvZWlnZW52ZWN0b3IgY29tcHV0YXRpb25cbiAgICAvLyBhcHByb2FjaFxuICAgIHRoaXMuZW1iZWRkaW5nID0gdXRpbHMuemVyb3MoZ3JhcGgublJvd3MpLm1hcCgoKSA9PiB7XG4gICAgICByZXR1cm4gdXRpbHMuemVyb3MobkNvbXBvbmVudHMpLm1hcCgoKSA9PiB7XG4gICAgICAgIHJldHVybiB1dGlscy50YXVSYW5kKHRoaXMucmFuZG9tKSAqIDIwICsgLTEwOyAvLyBSYW5kb20gZnJvbSAtMTAgdG8gMTBcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gR2V0IGdyYXBoIGRhdGEgaW4gb3JkZXJlZCB3YXkuLi5cbiAgICBjb25zdCB3ZWlnaHRzOiBudW1iZXJbXSA9IFtdO1xuICAgIGNvbnN0IGhlYWQ6IG51bWJlcltdID0gW107XG4gICAgY29uc3QgdGFpbDogbnVtYmVyW10gPSBbXTtcbiAgICBjb25zdCByb3dDb2xWYWx1ZXMgPSBncmFwaC5nZXRBbGwoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvd0NvbFZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZW50cnkgPSByb3dDb2xWYWx1ZXNbaV07XG4gICAgICBpZiAoZW50cnkudmFsdWUpIHtcbiAgICAgICAgd2VpZ2h0cy5wdXNoKGVudHJ5LnZhbHVlKTtcbiAgICAgICAgdGFpbC5wdXNoKGVudHJ5LnJvdyk7XG4gICAgICAgIGhlYWQucHVzaChlbnRyeS5jb2wpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBlcG9jaHNQZXJTYW1wbGUgPSB0aGlzLm1ha2VFcG9jaHNQZXJTYW1wbGUod2VpZ2h0cywgbkVwb2Nocyk7XG5cbiAgICByZXR1cm4ge2hlYWQsIHRhaWwsIGVwb2Noc1BlclNhbXBsZX07XG4gIH1cblxuICAvKipcbiAgICogR2l2ZW4gYSBzZXQgb2Ygd2VpZ2h0cyBhbmQgbnVtYmVyIG9mIGVwb2NocyBnZW5lcmF0ZSB0aGUgbnVtYmVyIG9mXG4gICAqIGVwb2NocyBwZXIgc2FtcGxlIGZvciBlYWNoIHdlaWdodC5cbiAgICovXG4gIHByaXZhdGUgbWFrZUVwb2Noc1BlclNhbXBsZSh3ZWlnaHRzOiBudW1iZXJbXSwgbkVwb2NoczogbnVtYmVyKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gdXRpbHMuZmlsbGVkKHdlaWdodHMubGVuZ3RoLCAtMS4wKTtcbiAgICBjb25zdCBtYXggPSB1dGlscy5tYXgod2VpZ2h0cyk7XG4gICAgY29uc3QgblNhbXBsZXMgPSB3ZWlnaHRzLm1hcCgodykgPT4gKHcgLyBtYXgpICogbkVwb2Nocyk7XG4gICAgblNhbXBsZXMuZm9yRWFjaCgobiwgaSkgPT4ge1xuICAgICAgaWYgKG4gPiAwKSByZXN1bHRbaV0gPSBuRXBvY2hzIC8gblNhbXBsZXNbaV07XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3NpZ25zIG9wdGltaXphdGlvbiBzdGF0ZSBwYXJhbWV0ZXJzIGZyb20gYSBwYXJ0aWFsIG9wdGltaXphdGlvbiBzdGF0ZS5cbiAgICovXG4gIHByaXZhdGUgYXNzaWduT3B0aW1pemF0aW9uU3RhdGVQYXJhbWV0ZXJzKHN0YXRlOiBQYXJ0aWFsPE9wdGltaXphdGlvblN0YXRlPikge1xuICAgIE9iamVjdC5hc3NpZ24odGhpcy5vcHRpbWl6YXRpb25TdGF0ZSwgc3RhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgYSBmZXcgb3B0aW1pemF0aW9uIHN0YXRlIHBhcmFtZXRlcnMgdGhhdCBhcmUgbmVjZXNzYXJ5IGJlZm9yZSBlbnRlcmluZ1xuICAgKiB0aGUgb3B0aW1pemF0aW9uIHN0ZXAgbG9vcC5cbiAgICovXG4gIHByaXZhdGUgcHJlcGFyZUZvck9wdGltaXphdGlvbkxvb3AoKSB7XG4gICAgLy8gSHlwZXJwYXJhbWV0ZXJzXG4gICAgY29uc3Qge3JlcHVsc2lvblN0cmVuZ3RoLCBsZWFybmluZ1JhdGUsIG5lZ2F0aXZlU2FtcGxlUmF0ZX0gPSB0aGlzO1xuXG4gICAgY29uc3Qge1xuICAgICAgZXBvY2hzUGVyU2FtcGxlLFxuICAgICAgaGVhZEVtYmVkZGluZyxcbiAgICAgIHRhaWxFbWJlZGRpbmcsXG4gICAgfSA9IHRoaXMub3B0aW1pemF0aW9uU3RhdGU7XG5cbiAgICBjb25zdCBkaW0gPSBoZWFkRW1iZWRkaW5nWzBdLmxlbmd0aDtcbiAgICBjb25zdCBtb3ZlT3RoZXIgPSBoZWFkRW1iZWRkaW5nLmxlbmd0aCA9PT0gdGFpbEVtYmVkZGluZy5sZW5ndGg7XG5cbiAgICBjb25zdCBlcG9jaHNQZXJOZWdhdGl2ZVNhbXBsZSA9IGVwb2Noc1BlclNhbXBsZS5tYXAoXG4gICAgICAoZSkgPT4gZSAvIG5lZ2F0aXZlU2FtcGxlUmF0ZVxuICAgICk7XG4gICAgY29uc3QgZXBvY2hPZk5leHROZWdhdGl2ZVNhbXBsZSA9IFsuLi5lcG9jaHNQZXJOZWdhdGl2ZVNhbXBsZV07XG4gICAgY29uc3QgZXBvY2hPZk5leHRTYW1wbGUgPSBbLi4uZXBvY2hzUGVyU2FtcGxlXTtcblxuICAgIHRoaXMuYXNzaWduT3B0aW1pemF0aW9uU3RhdGVQYXJhbWV0ZXJzKHtcbiAgICAgIGVwb2NoT2ZOZXh0U2FtcGxlLFxuICAgICAgZXBvY2hPZk5leHROZWdhdGl2ZVNhbXBsZSxcbiAgICAgIGVwb2Noc1Blck5lZ2F0aXZlU2FtcGxlLFxuICAgICAgbW92ZU90aGVyLFxuICAgICAgaW5pdGlhbEFscGhhOiBsZWFybmluZ1JhdGUsXG4gICAgICBhbHBoYTogbGVhcm5pbmdSYXRlLFxuICAgICAgZ2FtbWE6IHJlcHVsc2lvblN0cmVuZ3RoLFxuICAgICAgZGltLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIG9wdGltaXphdGlvbiBzdGF0ZSBmb3Igc3RlcHdpc2Ugb3B0aW1pemF0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBpbml0aWFsaXplT3B0aW1pemF0aW9uKCkge1xuICAgIC8vIEFsZ29yaXRobSBzdGF0ZVxuICAgIGNvbnN0IGhlYWRFbWJlZGRpbmcgPSB0aGlzLmVtYmVkZGluZztcbiAgICBjb25zdCB0YWlsRW1iZWRkaW5nID0gdGhpcy5lbWJlZGRpbmc7XG5cbiAgICAvLyBJbml0aWFsaXplZCBpbiBpbml0aWFsaXplU2ltcGxpY2lhbFNldEVtYmVkZGluZygpXG4gICAgY29uc3Qge2hlYWQsIHRhaWwsIGVwb2Noc1BlclNhbXBsZX0gPSB0aGlzLm9wdGltaXphdGlvblN0YXRlO1xuXG4gICAgY29uc3QgbkVwb2NocyA9IHRoaXMuZ2V0TkVwb2NocygpO1xuICAgIGNvbnN0IG5WZXJ0aWNlcyA9IHRoaXMuZ3JhcGgubkNvbHM7XG5cbiAgICBjb25zdCB7YSwgYn0gPSBmaW5kQUJQYXJhbXModGhpcy5zcHJlYWQsIHRoaXMubWluRGlzdCk7XG5cbiAgICB0aGlzLmFzc2lnbk9wdGltaXphdGlvblN0YXRlUGFyYW1ldGVycyh7XG4gICAgICBoZWFkRW1iZWRkaW5nLFxuICAgICAgdGFpbEVtYmVkZGluZyxcbiAgICAgIGhlYWQsXG4gICAgICB0YWlsLFxuICAgICAgZXBvY2hzUGVyU2FtcGxlLFxuICAgICAgYSxcbiAgICAgIGIsXG4gICAgICBuRXBvY2hzLFxuICAgICAgblZlcnRpY2VzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcHJvdmUgYW4gZW1iZWRkaW5nIHVzaW5nIHN0b2NoYXN0aWMgZ3JhZGllbnQgZGVzY2VudCB0byBtaW5pbWl6ZSB0aGVcbiAgICogZnV6enkgc2V0IGNyb3NzIGVudHJvcHkgYmV0d2VlbiB0aGUgMS1za2VsZXRvbnMgb2YgdGhlIGhpZ2ggZGltZW5zaW9uYWxcbiAgICogYW5kIGxvdyBkaW1lbnNpb25hbCBmdXp6eSBzaW1wbGljaWFsIHNldHMuIEluIHByYWN0aWNlIHRoaXMgaXMgZG9uZSBieVxuICAgKiBzYW1wbGluZyBlZGdlcyBiYXNlZCBvbiB0aGVpciBtZW1iZXJzaGlwIHN0cmVuZ3RoICh3aXRoIHRoZSAoMS1wKSB0ZXJtc1xuICAgKiBjb21pbmcgZnJvbSBuZWdhdGl2ZSBzYW1wbGluZyBzaW1pbGFyIHRvIHdvcmQydmVjKS5cbiAgICovXG4gIHByaXZhdGUgb3B0aW1pemVMYXlvdXRTdGVwKG46IG51bWJlcikge1xuICAgIGNvbnN0IHtvcHRpbWl6YXRpb25TdGF0ZX0gPSB0aGlzO1xuICAgIGNvbnN0IHtcbiAgICAgIGhlYWQsXG4gICAgICB0YWlsLFxuICAgICAgaGVhZEVtYmVkZGluZyxcbiAgICAgIHRhaWxFbWJlZGRpbmcsXG4gICAgICBlcG9jaHNQZXJTYW1wbGUsXG4gICAgICBlcG9jaE9mTmV4dFNhbXBsZSxcbiAgICAgIGVwb2NoT2ZOZXh0TmVnYXRpdmVTYW1wbGUsXG4gICAgICBlcG9jaHNQZXJOZWdhdGl2ZVNhbXBsZSxcbiAgICAgIG1vdmVPdGhlcixcbiAgICAgIGluaXRpYWxBbHBoYSxcbiAgICAgIGFscGhhLFxuICAgICAgZ2FtbWEsXG4gICAgICBhLFxuICAgICAgYixcbiAgICAgIGRpbSxcbiAgICAgIG5FcG9jaHMsXG4gICAgICBuVmVydGljZXMsXG4gICAgfSA9IG9wdGltaXphdGlvblN0YXRlO1xuXG4gICAgY29uc3QgY2xpcFZhbHVlID0gNC4wO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlcG9jaHNQZXJTYW1wbGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChlcG9jaE9mTmV4dFNhbXBsZVtpXSA+IG4pXG4gICAgICAgIGNvbnRpbnVlO1xuXG5cbiAgICAgIGNvbnN0IGogPSBoZWFkW2ldO1xuICAgICAgY29uc3QgayA9IHRhaWxbaV07XG5cbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBoZWFkRW1iZWRkaW5nW2pdO1xuICAgICAgY29uc3Qgb3RoZXIgPSB0YWlsRW1iZWRkaW5nW2tdO1xuXG4gICAgICBjb25zdCBkaXN0U3F1YXJlZCA9IHJEaXN0KGN1cnJlbnQsIG90aGVyKTtcblxuICAgICAgbGV0IGdyYWRDb2VmZiA9IDA7XG4gICAgICBpZiAoZGlzdFNxdWFyZWQgPiAwKSB7XG4gICAgICAgIGdyYWRDb2VmZiA9IC0yLjAgKiBhICogYiAqIE1hdGgucG93KGRpc3RTcXVhcmVkLCBiIC0gMS4wKTtcbiAgICAgICAgZ3JhZENvZWZmIC89IGEgKiBNYXRoLnBvdyhkaXN0U3F1YXJlZCwgYikgKyAxLjA7XG4gICAgICB9XG5cbiAgICAgIGZvciAobGV0IGQgPSAwOyBkIDwgZGltOyBkKyspIHtcbiAgICAgICAgY29uc3QgZ3JhZEQgPSBjbGlwKGdyYWRDb2VmZiAqIChjdXJyZW50W2RdIC0gb3RoZXJbZF0pLCBjbGlwVmFsdWUpO1xuICAgICAgICBjdXJyZW50W2RdICs9IGdyYWREICogYWxwaGE7XG4gICAgICAgIGlmIChtb3ZlT3RoZXIpXG4gICAgICAgICAgb3RoZXJbZF0gKz0gLWdyYWREICogYWxwaGE7XG4gICAgICB9XG5cbiAgICAgIGVwb2NoT2ZOZXh0U2FtcGxlW2ldICs9IGVwb2Noc1BlclNhbXBsZVtpXTtcblxuICAgICAgY29uc3Qgbk5lZ1NhbXBsZXMgPSBNYXRoLmZsb29yKFxuICAgICAgICAobiAtIGVwb2NoT2ZOZXh0TmVnYXRpdmVTYW1wbGVbaV0pIC8gZXBvY2hzUGVyTmVnYXRpdmVTYW1wbGVbaV1cbiAgICAgICk7XG5cbiAgICAgIGZvciAobGV0IHAgPSAwOyBwIDwgbk5lZ1NhbXBsZXM7IHArKykge1xuICAgICAgICBjb25zdCBrID0gdXRpbHMudGF1UmFuZEludChuVmVydGljZXMsIHRoaXMucmFuZG9tKTtcbiAgICAgICAgY29uc3Qgb3RoZXIgPSB0YWlsRW1iZWRkaW5nW2tdO1xuXG4gICAgICAgIGNvbnN0IGRpc3RTcXVhcmVkID0gckRpc3QoY3VycmVudCwgb3RoZXIpO1xuXG4gICAgICAgIGxldCBncmFkQ29lZmYgPSAwLjA7XG4gICAgICAgIGlmIChkaXN0U3F1YXJlZCA+IDAuMCkge1xuICAgICAgICAgIGdyYWRDb2VmZiA9IDIuMCAqIGdhbW1hICogYjtcbiAgICAgICAgICBncmFkQ29lZmYgLz1cbiAgICAgICAgICAgICgwLjAwMSArIGRpc3RTcXVhcmVkKSAqIChhICogTWF0aC5wb3coZGlzdFNxdWFyZWQsIGIpICsgMSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaiA9PT0gaykge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgZCA9IDA7IGQgPCBkaW07IGQrKykge1xuICAgICAgICAgIGxldCBncmFkRCA9IDQuMDtcbiAgICAgICAgICBpZiAoZ3JhZENvZWZmID4gMC4wKVxuICAgICAgICAgICAgZ3JhZEQgPSBjbGlwKGdyYWRDb2VmZiAqIChjdXJyZW50W2RdIC0gb3RoZXJbZF0pLCBjbGlwVmFsdWUpO1xuXG4gICAgICAgICAgY3VycmVudFtkXSArPSBncmFkRCAqIGFscGhhO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlcG9jaE9mTmV4dE5lZ2F0aXZlU2FtcGxlW2ldICs9IG5OZWdTYW1wbGVzICogZXBvY2hzUGVyTmVnYXRpdmVTYW1wbGVbaV07XG4gICAgfVxuICAgIG9wdGltaXphdGlvblN0YXRlLmFscGhhID0gaW5pdGlhbEFscGhhICogKDEuMCAtIG4gLyBuRXBvY2hzKTtcblxuICAgIG9wdGltaXphdGlvblN0YXRlLmN1cnJlbnRFcG9jaCArPSAxO1xuICAgIHJldHVybiBoZWFkRW1iZWRkaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcHJvdmUgYW4gZW1iZWRkaW5nIHVzaW5nIHN0b2NoYXN0aWMgZ3JhZGllbnQgZGVzY2VudCB0byBtaW5pbWl6ZSB0aGVcbiAgICogZnV6enkgc2V0IGNyb3NzIGVudHJvcHkgYmV0d2VlbiB0aGUgMS1za2VsZXRvbnMgb2YgdGhlIGhpZ2ggZGltZW5zaW9uYWxcbiAgICogYW5kIGxvdyBkaW1lbnNpb25hbCBmdXp6eSBzaW1wbGljaWFsIHNldHMuIEluIHByYWN0aWNlIHRoaXMgaXMgZG9uZSBieVxuICAgKiBzYW1wbGluZyBlZGdlcyBiYXNlZCBvbiB0aGVpciBtZW1iZXJzaGlwIHN0cmVuZ3RoICh3aXRoIHRoZSAoMS1wKSB0ZXJtc1xuICAgKiBjb21pbmcgZnJvbSBuZWdhdGl2ZSBzYW1wbGluZyBzaW1pbGFyIHRvIHdvcmQydmVjKS5cbiAgICovXG4gIHByaXZhdGUgb3B0aW1pemVMYXlvdXRBc3luYyhcbiAgICBlcG9jaENhbGxiYWNrOiAoZXBvY2hOdW1iZXI6IG51bWJlcikgPT4gdm9pZCB8IGJvb2xlYW4gPSAoKSA9PiB0cnVlXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBzdGVwID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHtuRXBvY2hzLCBjdXJyZW50RXBvY2h9ID0gdGhpcy5vcHRpbWl6YXRpb25TdGF0ZTtcbiAgICAgICAgICB0aGlzLmVtYmVkZGluZyA9IHRoaXMub3B0aW1pemVMYXlvdXRTdGVwKGN1cnJlbnRFcG9jaCk7XG4gICAgICAgICAgY29uc3QgZXBvY2hDb21wbGV0ZWQgPSB0aGlzLm9wdGltaXphdGlvblN0YXRlLmN1cnJlbnRFcG9jaDtcbiAgICAgICAgICBjb25zdCBzaG91bGRTdG9wID0gZXBvY2hDYWxsYmFjayhlcG9jaENvbXBsZXRlZCkgPT09IGZhbHNlO1xuICAgICAgICAgIGNvbnN0IGlzRmluaXNoZWQgPSBlcG9jaENvbXBsZXRlZCA9PT0gbkVwb2NocztcbiAgICAgICAgICBpZiAoIXNob3VsZFN0b3AgJiYgIWlzRmluaXNoZWQpXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHN0ZXAoKSwgMCk7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoaXNGaW5pc2hlZCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgc2V0VGltZW91dCgoKSA9PiBzdGVwKCksIDApO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcHJvdmUgYW4gZW1iZWRkaW5nIHVzaW5nIHN0b2NoYXN0aWMgZ3JhZGllbnQgZGVzY2VudCB0byBtaW5pbWl6ZSB0aGVcbiAgICogZnV6enkgc2V0IGNyb3NzIGVudHJvcHkgYmV0d2VlbiB0aGUgMS1za2VsZXRvbnMgb2YgdGhlIGhpZ2ggZGltZW5zaW9uYWxcbiAgICogYW5kIGxvdyBkaW1lbnNpb25hbCBmdXp6eSBzaW1wbGljaWFsIHNldHMuIEluIHByYWN0aWNlIHRoaXMgaXMgZG9uZSBieVxuICAgKiBzYW1wbGluZyBlZGdlcyBiYXNlZCBvbiB0aGVpciBtZW1iZXJzaGlwIHN0cmVuZ3RoICh3aXRoIHRoZSAoMS1wKSB0ZXJtc1xuICAgKiBjb21pbmcgZnJvbSBuZWdhdGl2ZSBzYW1wbGluZyBzaW1pbGFyIHRvIHdvcmQydmVjKS5cbiAgICovXG4gIHByaXZhdGUgb3B0aW1pemVMYXlvdXQoXG4gICAgZXBvY2hDYWxsYmFjazogKGVwb2NoTnVtYmVyOiBudW1iZXIpID0+IHZvaWQgfCBib29sZWFuID0gKCkgPT4gdHJ1ZVxuICApOiBWZWN0b3JzIHtcbiAgICBsZXQgaXNGaW5pc2hlZCA9IGZhbHNlO1xuICAgIGxldCBlbWJlZGRpbmc6IFZlY3RvcnMgPSBbXTtcbiAgICB3aGlsZSAoIWlzRmluaXNoZWQpIHtcbiAgICAgIGNvbnN0IHtuRXBvY2hzLCBjdXJyZW50RXBvY2h9ID0gdGhpcy5vcHRpbWl6YXRpb25TdGF0ZTtcbiAgICAgIGVtYmVkZGluZyA9IHRoaXMub3B0aW1pemVMYXlvdXRTdGVwKGN1cnJlbnRFcG9jaCk7XG4gICAgICBjb25zdCBlcG9jaENvbXBsZXRlZCA9IHRoaXMub3B0aW1pemF0aW9uU3RhdGUuY3VycmVudEVwb2NoO1xuICAgICAgY29uc3Qgc2hvdWxkU3RvcCA9IGVwb2NoQ2FsbGJhY2soZXBvY2hDb21wbGV0ZWQpID09PSBmYWxzZTtcbiAgICAgIGlzRmluaXNoZWQgPSBlcG9jaENvbXBsZXRlZCA9PT0gbkVwb2NocyB8fCBzaG91bGRTdG9wO1xuICAgIH1cbiAgICByZXR1cm4gZW1iZWRkaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIG51bWJlciBvZiBlcG9jaHMgZm9yIG9wdGltaXppbmcgdGhlIHByb2plY3Rpb24uXG4gICAqIE5PVEU6IFRoaXMgaGV1cmlzdGljIGRpZmZlcnMgZnJvbSB0aGUgcHl0aG9uIHZlcnNpb25cbiAgICovXG4gIHB1YmxpYyBnZXRORXBvY2hzKCkge1xuICAgIGNvbnN0IGdyYXBoID0gdGhpcy5ncmFwaDtcblxuICAgIGlmICh0aGlzLm5FcG9jaHMgPiAwKVxuICAgICAgcmV0dXJuIHRoaXMubkVwb2NocztcblxuXG4gICAgaWYgKCFncmFwaClcbiAgICAgIHJldHVybiAyMDA7XG5cblxuICAgIGNvbnN0IGxlbmd0aCA9IGdyYXBoLm5Sb3dzO1xuICAgIGlmIChsZW5ndGggPD0gMjUwMClcbiAgICAgIHJldHVybiA1MDA7XG4gICAgZWxzZSBpZiAobGVuZ3RoIDw9IDUwMDApXG4gICAgICByZXR1cm4gNDAwO1xuICAgIGVsc2UgaWYgKGxlbmd0aCA8PSA3NTAwKVxuICAgICAgcmV0dXJuIDMwMDtcbiAgICBlbHNlXG4gICAgICByZXR1cm4gMjAwO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBldWNsaWRlYW4oeDogVmVjdG9yLCB5OiBWZWN0b3IpIHtcbiAgbGV0IHJlc3VsdCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgeC5sZW5ndGg7IGkrKylcbiAgICByZXN1bHQgKz0gKHhbaV0gLSB5W2ldKSAqKiAyO1xuXG4gIHJldHVybiBNYXRoLnNxcnQocmVzdWx0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG51bWVyaWMoeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcbiAgY29uc3QgcmVzdWx0ID0gTWF0aC5hYnMoeCAtIHkpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29zaW5lKHg6IFZlY3RvciwgeTogVmVjdG9yKSB7XG4gIGxldCByZXN1bHQgPSAwLjA7XG4gIGxldCBub3JtWCA9IDAuMDtcbiAgbGV0IG5vcm1ZID0gMC4wO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgeC5sZW5ndGg7IGkrKykge1xuICAgIHJlc3VsdCArPSB4W2ldICogeVtpXTtcbiAgICBub3JtWCArPSB4W2ldICoqIDI7XG4gICAgbm9ybVkgKz0geVtpXSAqKiAyO1xuICB9XG5cbiAgaWYgKG5vcm1YID09PSAwICYmIG5vcm1ZID09PSAwKVxuICAgIHJldHVybiAwO1xuICBlbHNlIGlmIChub3JtWCA9PT0gMCB8fCBub3JtWSA9PT0gMClcbiAgICByZXR1cm4gMS4wO1xuICBlbHNlXG4gICAgcmV0dXJuIDEuMCAtIHJlc3VsdCAvIE1hdGguc3FydChub3JtWCAqIG5vcm1ZKTtcbn1cblxuLyoqXG4gKiBBbiBpbnRlcmZhY2UgcmVwcmVzZW50aW5nIHRoZSBvcHRpbWl6YXRpb24gc3RhdGUgdHJhY2tlZCBiZXR3ZWVuIHN0ZXBzIG9mXG4gKiB0aGUgU0dEIG9wdGltaXphdGlvblxuICovXG5jbGFzcyBPcHRpbWl6YXRpb25TdGF0ZSB7XG4gIGN1cnJlbnRFcG9jaCA9IDA7XG5cbiAgLy8gRGF0YSB0cmFja2VkIGR1cmluZyBvcHRpbWl6YXRpb24gc3RlcHMuXG4gIGhlYWRFbWJlZGRpbmc6IG51bWJlcltdW10gPSBbXTtcbiAgdGFpbEVtYmVkZGluZzogbnVtYmVyW11bXSA9IFtdO1xuICBoZWFkOiBudW1iZXJbXSA9IFtdO1xuICB0YWlsOiBudW1iZXJbXSA9IFtdO1xuICBlcG9jaHNQZXJTYW1wbGU6IG51bWJlcltdID0gW107XG4gIGVwb2NoT2ZOZXh0U2FtcGxlOiBudW1iZXJbXSA9IFtdO1xuICBlcG9jaE9mTmV4dE5lZ2F0aXZlU2FtcGxlOiBudW1iZXJbXSA9IFtdO1xuICBlcG9jaHNQZXJOZWdhdGl2ZVNhbXBsZTogbnVtYmVyW10gPSBbXTtcbiAgbW92ZU90aGVyID0gdHJ1ZTtcbiAgaW5pdGlhbEFscGhhID0gMS4wO1xuICBhbHBoYSA9IDEuMDtcbiAgZ2FtbWEgPSAxLjA7XG4gIGEgPSAxLjU3Njk0MzQ2MDMxMTMwNzc7XG4gIGIgPSAwLjg5NTA2MDg3NzkxMDk3MzM7XG4gIGRpbSA9IDI7XG4gIG5FcG9jaHMgPSA1MDA7XG4gIG5WZXJ0aWNlcyA9IDA7XG59XG5cbi8qKlxuICogU3RhbmRhcmQgY2xhbXBpbmcgb2YgYSB2YWx1ZSBpbnRvIGEgZml4ZWQgcmFuZ2VcbiAqL1xuZnVuY3Rpb24gY2xpcCh4OiBudW1iZXIsIGNsaXBWYWx1ZTogbnVtYmVyKSB7XG4gIGlmICh4ID4gY2xpcFZhbHVlKSByZXR1cm4gY2xpcFZhbHVlO1xuICBlbHNlIGlmICh4IDwgLWNsaXBWYWx1ZSkgcmV0dXJuIC1jbGlwVmFsdWU7XG4gIGVsc2UgcmV0dXJuIHg7XG59XG5cbi8qKlxuICogUmVkdWNlZCBFdWNsaWRlYW4gZGlzdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIHJEaXN0KHg6IG51bWJlcltdLCB5OiBudW1iZXJbXSkge1xuICBsZXQgcmVzdWx0ID0gMC4wO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHgubGVuZ3RoOyBpKyspXG4gICAgcmVzdWx0ICs9IE1hdGgucG93KHhbaV0gLSB5W2ldLCAyKTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEZpdCBhLCBiIHBhcmFtcyBmb3IgdGhlIGRpZmZlcmVudGlhYmxlIGN1cnZlIHVzZWQgaW4gbG93ZXJcbiAqIGRpbWVuc2lvbmFsIGZ1enp5IHNpbXBsaWNpYWwgY29tcGxleCBjb25zdHJ1Y3Rpb24uIFdlIHdhbnQgdGhlXG4gKiBzbW9vdGggY3VydmUgKGZyb20gYSBwcmUtZGVmaW5lZCBmYW1pbHkgd2l0aCBzaW1wbGUgZ3JhZGllbnQpIHRoYXRcbiAqIGJlc3QgbWF0Y2hlcyBhbiBvZmZzZXQgZXhwb25lbnRpYWwgZGVjYXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kQUJQYXJhbXMoc3ByZWFkOiBudW1iZXIsIG1pbkRpc3Q6IG51bWJlcikge1xuICBjb25zdCBjdXJ2ZSA9IChbYSwgYl06IG51bWJlcltdKSA9PiAoeDogbnVtYmVyKSA9PiB7XG4gICAgcmV0dXJuIDEuMCAvICgxLjAgKyBhICogeCAqKiAoMiAqIGIpKTtcbiAgfTtcblxuICBjb25zdCB4diA9IHV0aWxzXG4gICAgLmxpbmVhcigwLCBzcHJlYWQgKiAzLCAzMDApXG4gICAgLm1hcCgodmFsKSA9PiAodmFsIDwgbWluRGlzdCA/IDEuMCA6IHZhbCkpO1xuXG4gIGNvbnN0IHl2ID0gdXRpbHMuemVyb3MoeHYubGVuZ3RoKS5tYXAoKHZhbCwgaW5kZXgpID0+IHtcbiAgICBjb25zdCBndGUgPSB4dltpbmRleF0gPj0gbWluRGlzdDtcbiAgICByZXR1cm4gZ3RlID8gTWF0aC5leHAoLSh4dltpbmRleF0gLSBtaW5EaXN0KSAvIHNwcmVhZCkgOiB2YWw7XG4gIH0pO1xuXG4gIGNvbnN0IGluaXRpYWxWYWx1ZXMgPSBbMC41LCAwLjVdO1xuICBjb25zdCBkYXRhID0ge3g6IHh2LCB5OiB5dn07XG5cbiAgLy8gRGVmYXVsdCBvcHRpb25zIGZvciB0aGUgYWxnb3JpdGhtIChmcm9tIGdpdGh1YiBleGFtcGxlKVxuICBjb25zdCBvcHRpb25zID0ge1xuICAgIGRhbXBpbmc6IDEuNSxcbiAgICBpbml0aWFsVmFsdWVzLFxuICAgIGdyYWRpZW50RGlmZmVyZW5jZTogMTBlLTIsXG4gICAgbWF4SXRlcmF0aW9uczogMTAwLFxuICAgIGVycm9yVG9sZXJhbmNlOiAxMGUtMyxcbiAgfTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbmV3LWNhcFxuICBjb25zdCB7cGFyYW1ldGVyVmFsdWVzfSA9IExNKGRhdGEsIGN1cnZlLCBvcHRpb25zKTtcbiAgY29uc3QgW2EsIGJdID0gcGFyYW1ldGVyVmFsdWVzIGFzIG51bWJlcltdO1xuICByZXR1cm4ge2EsIGJ9O1xufVxuXG4vKipcbiAqIFVuZGVyIHRoZSBhc3N1bXB0aW9uIG9mIGNhdGVnb3JpY2FsIGRpc3RhbmNlIGZvciB0aGUgaW50ZXJzZWN0aW5nXG4gKiBzaW1wbGljaWFsIHNldCBwZXJmb3JtIGEgZmFzdCBpbnRlcnNlY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmYXN0SW50ZXJzZWN0aW9uKFxuICBncmFwaDogbWF0cml4LlNwYXJzZU1hdHJpeCxcbiAgdGFyZ2V0OiBudW1iZXJbXSxcbiAgdW5rbm93bkRpc3QgPSAxLjAsXG4gIGZhckRpc3QgPSA1LjBcbikge1xuICByZXR1cm4gZ3JhcGgubWFwKCh2YWx1ZSwgcm93LCBjb2wpID0+IHtcbiAgICBpZiAodGFyZ2V0W3Jvd10gPT09IC0xIHx8IHRhcmdldFtjb2xdID09PSAtMSlcbiAgICAgIHJldHVybiB2YWx1ZSAqIE1hdGguZXhwKC11bmtub3duRGlzdCk7XG4gICAgZWxzZSBpZiAodGFyZ2V0W3Jvd10gIT09IHRhcmdldFtjb2xdKVxuICAgICAgcmV0dXJuIHZhbHVlICogTWF0aC5leHAoLWZhckRpc3QpO1xuICAgIGVsc2VcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgfSk7XG59XG5cbi8qKlxuICogUmVzZXQgdGhlIGxvY2FsIGNvbm5lY3Rpdml0eSByZXF1aXJlbWVudCAtLSBlYWNoIGRhdGEgc2FtcGxlIHNob3VsZFxuICogaGF2ZSBjb21wbGV0ZSBjb25maWRlbmNlIGluIGF0IGxlYXN0IG9uZSAxLXNpbXBsZXggaW4gdGhlIHNpbXBsaWNpYWwgc2V0LlxuICogV2UgY2FuIGVuZm9yY2UgdGhpcyBieSBsb2NhbGx5IHJlc2NhbGluZyBjb25maWRlbmNlcywgYW5kIHRoZW4gcmVtZXJnaW5nIHRoZVxuICogZGlmZmVyZW50IGxvY2FsIHNpbXBsaWNpYWwgc2V0cyB0b2dldGhlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0TG9jYWxDb25uZWN0aXZpdHkoc2ltcGxpY2lhbFNldDogbWF0cml4LlNwYXJzZU1hdHJpeCkge1xuICBzaW1wbGljaWFsU2V0ID0gbWF0cml4Lm5vcm1hbGl6ZShzaW1wbGljaWFsU2V0LCBtYXRyaXguTm9ybVR5cGUubWF4KTtcbiAgY29uc3QgdHJhbnNwb3NlID0gbWF0cml4LnRyYW5zcG9zZShzaW1wbGljaWFsU2V0KTtcbiAgY29uc3QgcHJvZE1hdHJpeCA9IG1hdHJpeC5wYWlyd2lzZU11bHRpcGx5KHRyYW5zcG9zZSwgc2ltcGxpY2lhbFNldCk7XG4gIHNpbXBsaWNpYWxTZXQgPSBtYXRyaXguYWRkKFxuICAgIHNpbXBsaWNpYWxTZXQsXG4gICAgbWF0cml4LnN1YnRyYWN0KHRyYW5zcG9zZSwgcHJvZE1hdHJpeClcbiAgKTtcbiAgcmV0dXJuIG1hdHJpeC5lbGltaW5hdGVaZXJvcyhzaW1wbGljaWFsU2V0KTtcbn1cblxuLyoqXG4gKiBHaXZlbiBpbmRpY2VzIGFuZCB3ZWlnaHRzIGFuZCBhbiBvcmlnaW5hbCBlbWJlZGRpbmdzXG4gKiBpbml0aWFsaXplIHRoZSBwb3NpdGlvbnMgb2YgbmV3IHBvaW50cyByZWxhdGl2ZSB0byB0aGVcbiAqIGluZGljZXMgYW5kIHdlaWdodHMgKG9mIHRoZWlyIG5laWdoYm9ycyBpbiB0aGUgc291cmNlIGRhdGEpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdFRyYW5zZm9ybShcbiAgaW5kaWNlczogbnVtYmVyW11bXSxcbiAgd2VpZ2h0czogbnVtYmVyW11bXSxcbiAgZW1iZWRkaW5nOiBWZWN0b3JzXG4pIHtcbiAgY29uc3QgcmVzdWx0ID0gdXRpbHNcbiAgICAuemVyb3MoaW5kaWNlcy5sZW5ndGgpXG4gICAgLm1hcCgoX3opID0+IHV0aWxzLnplcm9zKGVtYmVkZGluZ1swXS5sZW5ndGgpKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGluZGljZXMubGVuZ3RoOyBpKyspIHtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGluZGljZXNbMF0ubGVuZ3RoOyBqKyspIHtcbiAgICAgIGZvciAobGV0IGQgPSAwOyBkIDwgZW1iZWRkaW5nWzBdLmxlbmd0aDsgZCsrKSB7XG4gICAgICAgIGNvbnN0IGEgPSBpbmRpY2VzW2ldW2pdO1xuICAgICAgICByZXN1bHRbaV1bZF0gKz0gd2VpZ2h0c1tpXVtqXSAqIGVtYmVkZGluZ1thXVtkXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiJdfQ==","/**\n * @license\n *\n * Copyright 2019 Google LLC. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ==============================================================================\n */\n/**\n * This is a JavaScript reimplementation of UMAP (original license below), from\n * the python implementation found at https://github.com/lmcinnes/umap.\n *\n * @author andycoenen@google.com (Andy Coenen)\n */\n/**\n * @license\n * BSD 3-Clause License\n *\n * Copyright (c) 2017, Leland McInnes\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 * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n *\n * * 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 * * Neither the name of the copyright holder nor the names of its\n * contributors may be used to endorse or promote products derived from\n * 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 THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport * as heap from './heap';\nimport * as matrix from './matrix';\nimport * as tree from './tree';\nimport * as utils from './utils';\n/**\n * Create a version of nearest neighbor descent.\n */\nexport function makeNNDescent(distanceFn, random) {\n return function nNDescent(data, leafArray, nNeighbors, nIters = 10, maxCandidates = 50, delta = 0.001, rho = 0.5, rpTreeInit = true) {\n const nVertices = data.length;\n const currentGraph = heap.makeHeap(data.length, nNeighbors);\n for (let i = 0; i < data.length; i++) {\n const indices = heap.rejectionSample(nNeighbors, data.length, random);\n for (let j = 0; j < indices.length; j++) {\n const d = distanceFn(data[i], data[indices[j]]);\n heap.heapPush(currentGraph, i, d, indices[j], 1);\n heap.heapPush(currentGraph, indices[j], d, i, 1);\n }\n }\n if (rpTreeInit) {\n for (let n = 0; n < leafArray.length; n++) {\n for (let i = 0; i < leafArray[n].length; i++) {\n if (leafArray[n][i] < 0)\n break;\n for (let j = i + 1; j < leafArray[n].length; j++) {\n if (leafArray[n][j] < 0)\n break;\n const d = distanceFn(data[leafArray[n][i]], data[leafArray[n][j]]);\n heap.heapPush(currentGraph, leafArray[n][i], d, leafArray[n][j], 1);\n heap.heapPush(currentGraph, leafArray[n][j], d, leafArray[n][i], 1);\n }\n }\n }\n }\n for (let n = 0; n < nIters; n++) {\n const candidateNeighbors = heap.buildCandidates(currentGraph, nVertices, nNeighbors, maxCandidates, random);\n let c = 0;\n for (let i = 0; i < nVertices; i++) {\n for (let j = 0; j < maxCandidates; j++) {\n const p = Math.floor(candidateNeighbors[0][i][j]);\n if (p < 0 || utils.tauRand(random) < rho)\n continue;\n for (let k = 0; k < maxCandidates; k++) {\n const q = Math.floor(candidateNeighbors[0][i][k]);\n const cj = candidateNeighbors[2][i][j];\n const ck = candidateNeighbors[2][i][k];\n if (q < 0 || (!cj && !ck))\n continue;\n const d = distanceFn(data[p], data[q]);\n c += heap.heapPush(currentGraph, p, d, q, 1);\n c += heap.heapPush(currentGraph, q, d, p, 1);\n }\n }\n }\n if (c <= delta * nNeighbors * data.length)\n break;\n }\n const sorted = heap.deheapSort(currentGraph);\n return sorted;\n };\n}\nexport function makeInitializations(distanceFn) {\n function initFromRandom(nNeighbors, data, queryPoints, _heap, random) {\n for (let i = 0; i < queryPoints.length; i++) {\n const indices = utils.rejectionSample(nNeighbors, data.length, random);\n for (let j = 0; j < indices.length; j++) {\n if (indices[j] < 0)\n continue;\n const d = distanceFn(data[indices[j]], queryPoints[i]);\n heap.heapPush(_heap, i, d, indices[j], 1);\n }\n }\n }\n function initFromTree(_tree, data, queryPoints, _heap, random) {\n for (let i = 0; i < queryPoints.length; i++) {\n const indices = tree.searchFlatTree(queryPoints[i], _tree, random);\n for (let j = 0; j < indices.length; j++) {\n if (indices[j] < 0)\n return;\n const d = distanceFn(data[indices[j]], queryPoints[i]);\n heap.heapPush(_heap, i, d, indices[j], 1);\n }\n }\n return;\n }\n return { initFromRandom, initFromTree };\n}\nexport function makeInitializedNNSearch(distanceFn) {\n return function nnSearchFn(data, graph, initialization, queryPoints) {\n const { indices, indptr } = matrix.getCSR(graph);\n for (let i = 0; i < queryPoints.length; i++) {\n const tried = new Set(initialization[0][i]);\n while (true) {\n // Find smallest flagged vertex\n const vertex = heap.smallestFlagged(initialization, i);\n if (vertex === -1)\n break;\n const candidates = indices.slice(indptr[vertex], indptr[vertex + 1]);\n for (const candidate of candidates) {\n if (candidate === vertex ||\n candidate === -1 ||\n tried.has(candidate))\n continue;\n const d = distanceFn(data[candidate], queryPoints[i]);\n heap.uncheckedHeapPush(initialization, i, d, candidate, 1);\n tried.add(candidate);\n }\n }\n }\n return initialization;\n };\n}\nexport function initializeSearch(forest, data, queryPoints, nNeighbors, initFromRandom, initFromTree, random) {\n const results = heap.makeHeap(queryPoints.length, nNeighbors);\n initFromRandom(nNeighbors, data, queryPoints, results, random);\n if (forest) {\n for (const tree of forest)\n initFromTree(tree, data, queryPoints, results, random);\n }\n return results;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm5fZGVzY2VudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm5uX2Rlc2NlbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStCRztBQUVILE9BQU8sS0FBSyxJQUFJLE1BQU0sUUFBUSxDQUFDO0FBQy9CLE9BQU8sS0FBSyxNQUFNLE1BQU0sVUFBVSxDQUFDO0FBQ25DLE9BQU8sS0FBSyxJQUFJLE1BQU0sUUFBUSxDQUFDO0FBQy9CLE9BQU8sS0FBSyxLQUFLLE1BQU0sU0FBUyxDQUFDO0FBR2pDOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBQyxVQUFzQixFQUFFLE1BQWdCO0lBQ3BFLE9BQU8sU0FBUyxTQUFTLENBQ3ZCLElBQVksRUFDWixTQUFrQixFQUNsQixVQUFrQixFQUNsQixNQUFNLEdBQUcsRUFBRSxFQUNYLGFBQWEsR0FBRyxFQUFFLEVBQ2xCLEtBQUssR0FBRyxLQUFLLEVBQ2IsR0FBRyxHQUFHLEdBQUcsRUFDVCxVQUFVLEdBQUcsSUFBSTtRQUVqQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzlCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUU1RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNwQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ3RFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxF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TSxTQUFTLElBQUksVUFBVSxFQUFFO29CQUNsQyxJQUNFLFNBQVMsS0FBSyxNQUFNO3dCQUNwQixTQUFTLEtBQUssQ0FBQyxDQUFDO3dCQUNoQixLQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQzt3QkFFcEIsU0FBUztvQkFFWCxNQUFNLENBQUMsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUN0RCxJQUFJLENBQUMsaUJBQWlCLENBQUMsY0FBYyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUMzRCxLQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2lCQUN0QjthQUNGO1NBQ0Y7UUFDRCxPQUFPLGNBQWMsQ0FBQztJQUN4QixDQUFDLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxVQUFVLGdCQUFnQixDQUM5QixNQUF1QixFQUN2QixJQUFZLEVBQ1osV0FBbUIsRUFDbkIsVUFBa0IsRUFDbEIsY0FBZ0MsRUFDaEMsWUFBNEIsRUFDNUIsTUFBZ0I7SUFFaEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzlELGNBQWMsQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDL0QsSUFBSSxNQUFNLEVBQUU7UUFDVixLQUFLLE1BQU0sSUFBSSxJQUFJLE1BQU07WUFDdkIsWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztLQUMxRDtJQUNELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKlxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vKipcbiAqIFRoaXMgaXMgYSBKYXZhU2NyaXB0IHJlaW1wbGVtZW50YXRpb24gb2YgVU1BUCAob3JpZ2luYWwgbGljZW5zZSBiZWxvdyksIGZyb21cbiAqIHRoZSBweXRob24gaW1wbGVtZW50YXRpb24gZm91bmQgYXQgaHR0cHM6Ly9naXRodWIuY29tL2xtY2lubmVzL3VtYXAuXG4gKlxuICogQGF1dGhvciBhbmR5Y29lbmVuQGdvb2dsZS5jb20gKEFuZHkgQ29lbmVuKVxuICovXG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIEJTRCAzLUNsYXVzZSBMaWNlbnNlXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE3LCBMZWxhbmQgTWNJbm5lc1xuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuICpcbiAqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4gKiAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICpcbiAqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuICogICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uXG4gKiAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICpcbiAqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlciBub3IgdGhlIG5hbWVzIG9mIGl0c1xuICogICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbVxuICogICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEVcbiAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMXG4gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUlxuICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVJcbiAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksXG4gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRVxuICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqL1xuXG5pbXBvcnQgKiBhcyBoZWFwIGZyb20gJy4vaGVhcCc7XG5pbXBvcnQgKiBhcyBtYXRyaXggZnJvbSAnLi9tYXRyaXgnO1xuaW1wb3J0ICogYXMgdHJlZSBmcm9tICcuL3RyZWUnO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi91dGlscyc7XG5pbXBvcnQge1JhbmRvbUZuLCBWZWN0b3JzLCBEaXN0YW5jZUZuLCBWZWN0b3J9IGZyb20gJy4vdW1hcCc7XG5cbi8qKlxuICogQ3JlYXRlIGEgdmVyc2lvbiBvZiBuZWFyZXN0IG5laWdoYm9yIGRlc2NlbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlTk5EZXNjZW50KGRpc3RhbmNlRm46IERpc3RhbmNlRm4sIHJhbmRvbTogUmFuZG9tRm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIG5ORGVzY2VudChcbiAgICBkYXRhOiBWZWN0b3IsXG4gICAgbGVhZkFycmF5OiBWZWN0b3JzLFxuICAgIG5OZWlnaGJvcnM6IG51bWJlcixcbiAgICBuSXRlcnMgPSAxMCxcbiAgICBtYXhDYW5kaWRhdGVzID0gNTAsXG4gICAgZGVsdGEgPSAwLjAwMSxcbiAgICByaG8gPSAwLjUsXG4gICAgcnBUcmVlSW5pdCA9IHRydWVcbiAgKSB7XG4gICAgY29uc3QgblZlcnRpY2VzID0gZGF0YS5sZW5ndGg7XG4gICAgY29uc3QgY3VycmVudEdyYXBoID0gaGVhcC5tYWtlSGVhcChkYXRhLmxlbmd0aCwgbk5laWdoYm9ycyk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGluZGljZXMgPSBoZWFwLnJlamVjdGlvblNhbXBsZShuTmVpZ2hib3JzLCBkYXRhLmxlbmd0aCwgcmFuZG9tKTtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgaW5kaWNlcy5sZW5ndGg7IGorKykge1xuICAgICAgICBjb25zdCBkID0gZGlzdGFuY2VGbihkYXRhW2ldLCBkYXRhW2luZGljZXNbal1dKTtcblxuICAgICAgICBoZWFwLmhlYXBQdXNoKGN1cnJlbnRHcmFwaCwgaSwgZCwgaW5kaWNlc1tqXSwgMSk7XG4gICAgICAgIGhlYXAuaGVhcFB1c2goY3VycmVudEdyYXBoLCBpbmRpY2VzW2pdLCBkLCBpLCAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJwVHJlZUluaXQpIHtcbiAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgbGVhZkFycmF5Lmxlbmd0aDsgbisrKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVhZkFycmF5W25dLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKGxlYWZBcnJheVtuXVtpXSA8IDApXG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGZvciAobGV0IGogPSBpICsgMTsgaiA8IGxlYWZBcnJheVtuXS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKGxlYWZBcnJheVtuXVtqXSA8IDApXG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjb25zdCBkID0gZGlzdGFuY2VGbihkYXRhW2xlYWZBcnJheVtuXVtpXV0sIGRhdGFbbGVhZkFycmF5W25dW2pdXSk7XG4gICAgICAgICAgICBoZWFwLmhlYXBQdXNoKGN1cnJlbnRHcmFwaCwgbGVhZkFycmF5W25dW2ldLCBkLCBsZWFmQXJyYXlbbl1bal0sIDEpO1xuICAgICAgICAgICAgaGVhcC5oZWFwUHVzaChjdXJyZW50R3JhcGgsIGxlYWZBcnJheVtuXVtqXSwgZCwgbGVhZkFycmF5W25dW2ldLCAxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGxldCBuID0gMDsgbiA8IG5JdGVyczsgbisrKSB7XG4gICAgICBjb25zdCBjYW5kaWRhdGVOZWlnaGJvcnMgPSBoZWFwLmJ1aWxkQ2FuZGlkYXRlcyhcbiAgICAgICAgY3VycmVudEdyYXBoLFxuICAgICAgICBuVmVydGljZXMsXG4gICAgICAgIG5OZWlnaGJvcnMsXG4gICAgICAgIG1heENhbmRpZGF0ZXMsXG4gICAgICAgIHJhbmRvbVxuICAgICAgKTtcblxuICAgICAgbGV0IGMgPSAwO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuVmVydGljZXM7IGkrKykge1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG1heENhbmRpZGF0ZXM7IGorKykge1xuICAgICAgICAgIGNvbnN0IHAgPSBNYXRoLmZsb29yKGNhbmRpZGF0ZU5laWdoYm9yc1swXVtpXVtqXSk7XG4gICAgICAgICAgaWYgKHAgPCAwIHx8IHV0aWxzLnRhdVJhbmQocmFuZG9tKSA8IHJobylcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBtYXhDYW5kaWRhdGVzOyBrKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHEgPSBNYXRoLmZsb29yKGNhbmRpZGF0ZU5laWdoYm9yc1swXVtpXVtrXSk7XG4gICAgICAgICAgICBjb25zdCBjaiA9IGNhbmRpZGF0ZU5laWdoYm9yc1syXVtpXVtqXTtcbiAgICAgICAgICAgIGNvbnN0IGNrID0gY2FuZGlkYXRlTmVpZ2hib3JzWzJdW2ldW2tdO1xuICAgICAgICAgICAgaWYgKHEgPCAwIHx8ICghY2ogJiYgIWNrKSlcbiAgICAgICAgICAgICAgY29udGludWU7XG5cblxuICAgICAgICAgICAgY29uc3QgZCA9IGRpc3RhbmNlRm4oZGF0YVtwXSwgZGF0YVtxXSk7XG4gICAgICAgICAgICBjICs9IGhlYXAuaGVhcFB1c2goY3VycmVudEdyYXBoLCBwLCBkLCBxLCAxKTtcbiAgICAgICAgICAgIGMgKz0gaGVhcC5oZWFwUHVzaChjdXJyZW50R3JhcGgsIHEsIGQsIHAsIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGMgPD0gZGVsdGEgKiBuTmVpZ2hib3JzICogZGF0YS5sZW5ndGgpXG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjb25zdCBzb3J0ZWQgPSBoZWFwLmRlaGVhcFNvcnQoY3VycmVudEdyYXBoKTtcbiAgICByZXR1cm4gc29ydGVkO1xuICB9O1xufVxuXG5leHBvcnQgdHlwZSBJbml0RnJvbVJhbmRvbUZuID0gKFxuICBuTmVpZ2hib3JzOiBudW1iZXIsXG4gIGRhdGE6IFZlY3RvcixcbiAgcXVlcnlQb2ludHM6IFZlY3RvcixcbiAgX2hlYXA6IGhlYXAuSGVhcCxcbiAgcmFuZG9tOiBSYW5kb21GblxuKSA9PiB2b2lkO1xuXG5leHBvcnQgdHlwZSBJbml0RnJvbVRyZWVGbiA9IChcbiAgX3RyZWU6IHRyZWUuRmxhdFRyZWUsXG4gIGRhdGE6IFZlY3RvcixcbiAgcXVlcnlQb2ludHM6IFZlY3RvcixcbiAgX2hlYXA6IGhlYXAuSGVhcCxcbiAgcmFuZG9tOiBSYW5kb21GblxuKSA9PiB2b2lkO1xuXG5leHBvcnQgZnVuY3Rpb24gbWFrZUluaXRpYWxpemF0aW9ucyhkaXN0YW5jZUZuOiBEaXN0YW5jZUZuKSB7XG4gIGZ1bmN0aW9uIGluaXRGcm9tUmFuZG9tKFxuICAgIG5OZWlnaGJvcnM6IG51bWJlcixcbiAgICBkYXRhOiBWZWN0b3IsXG4gICAgcXVlcnlQb2ludHM6IFZlY3RvcixcbiAgICBfaGVhcDogaGVhcC5IZWFwLFxuICAgIHJhbmRvbTogUmFuZG9tRm5cbiAgKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBxdWVyeVBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgaW5kaWNlcyA9IHV0aWxzLnJlamVjdGlvblNhbXBsZShuTmVpZ2hib3JzLCBkYXRhLmxlbmd0aCwgcmFuZG9tKTtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgaW5kaWNlcy5sZW5ndGg7IGorKykge1xuICAgICAgICBpZiAoaW5kaWNlc1tqXSA8IDApXG4gICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgZCA9IGRpc3RhbmNlRm4oZGF0YVtpbmRpY2VzW2pdXSwgcXVlcnlQb2ludHNbaV0pO1xuICAgICAgICBoZWFwLmhlYXBQdXNoKF9oZWFwLCBpLCBkLCBpbmRpY2VzW2pdLCAxKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpbml0RnJvbVRyZWUoXG4gICAgX3RyZWU6IHRyZWUuRmxhdFRyZWUsXG4gICAgZGF0YTogVmVjdG9yLFxuICAgIHF1ZXJ5UG9pbnRzOiBWZWN0b3IsXG4gICAgX2hlYXA6IGhlYXAuSGVhcCxcbiAgICByYW5kb206IFJhbmRvbUZuXG4gICkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcXVlcnlQb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGluZGljZXMgPSB0cmVlLnNlYXJjaEZsYXRUcmVlKHF1ZXJ5UG9pbnRzW2ldLCBfdHJlZSwgcmFuZG9tKTtcblxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBpbmRpY2VzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmIChpbmRpY2VzW2pdIDwgMClcbiAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY29uc3QgZCA9IGRpc3RhbmNlRm4oZGF0YVtpbmRpY2VzW2pdXSwgcXVlcnlQb2ludHNbaV0pO1xuICAgICAgICBoZWFwLmhlYXBQdXNoKF9oZWFwLCBpLCBkLCBpbmRpY2VzW2pdLCAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmV0dXJuIHtpbml0RnJvbVJhbmRvbSwgaW5pdEZyb21UcmVlfTtcbn1cblxuZXhwb3J0IHR5cGUgU2VhcmNoRm4gPSAoXG4gIGRhdGE6IFZlY3RvcixcbiAgZ3JhcGg6IG1hdHJpeC5TcGFyc2VNYXRyaXgsXG4gIGluaXRpYWxpemF0aW9uOiBoZWFwLkhlYXAsXG4gIHF1ZXJ5UG9pbnRzOiBWZWN0b3JcbikgPT4gaGVhcC5IZWFwO1xuXG5leHBvcnQgZnVuY3Rpb24gbWFrZUluaXRpYWxpemVkTk5TZWFyY2goZGlzdGFuY2VGbjogRGlzdGFuY2VGbikge1xuICByZXR1cm4gZnVuY3Rpb24gbm5TZWFyY2hGbihcbiAgICBkYXRhOiBWZWN0b3IsXG4gICAgZ3JhcGg6IG1hdHJpeC5TcGFyc2VNYXRyaXgsXG4gICAgaW5pdGlhbGl6YXRpb246IGhlYXAuSGVhcCxcbiAgICBxdWVyeVBvaW50czogVmVjdG9yXG4gICkge1xuICAgIGNvbnN0IHtpbmRpY2VzLCBpbmRwdHJ9ID0gbWF0cml4LmdldENTUihncmFwaCk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHF1ZXJ5UG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCB0cmllZCA9IG5ldyBTZXQoaW5pdGlhbGl6YXRpb25bMF1baV0pO1xuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgLy8gRmluZCBzbWFsbGVzdCBmbGFnZ2VkIHZlcnRleFxuICAgICAgICBjb25zdCB2ZXJ0ZXggPSBoZWFwLnNtYWxsZXN0RmxhZ2dlZChpbml0aWFsaXphdGlvbiwgaSk7XG5cbiAgICAgICAgaWYgKHZlcnRleCA9PT0gLTEpXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY29uc3QgY2FuZGlkYXRlcyA9IGluZGljZXMuc2xpY2UoaW5kcHRyW3ZlcnRleF0sIGluZHB0clt2ZXJ0ZXggKyAxXSk7XG4gICAgICAgIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBjYW5kaWRhdGUgPT09IHZlcnRleCB8fFxuICAgICAgICAgICAgY2FuZGlkYXRlID09PSAtMSB8fFxuICAgICAgICAgICAgdHJpZWQuaGFzKGNhbmRpZGF0ZSlcbiAgICAgICAgICApXG4gICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICAgIGNvbnN0IGQgPSBkaXN0YW5jZUZuKGRhdGFbY2FuZGlkYXRlXSwgcXVlcnlQb2ludHNbaV0pO1xuICAgICAgICAgIGhlYXAudW5jaGVja2VkSGVhcFB1c2goaW5pdGlhbGl6YXRpb24sIGksIGQsIGNhbmRpZGF0ZSwgMSk7XG4gICAgICAgICAgdHJpZWQuYWRkKGNhbmRpZGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGluaXRpYWxpemF0aW9uO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5pdGlhbGl6ZVNlYXJjaChcbiAgZm9yZXN0OiB0cmVlLkZsYXRUcmVlW10sXG4gIGRhdGE6IFZlY3RvcixcbiAgcXVlcnlQb2ludHM6IFZlY3RvcixcbiAgbk5laWdoYm9yczogbnVtYmVyLFxuICBpbml0RnJvbVJhbmRvbTogSW5pdEZyb21SYW5kb21GbixcbiAgaW5pdEZyb21UcmVlOiBJbml0RnJvbVRyZWVGbixcbiAgcmFuZG9tOiBSYW5kb21GblxuKSB7XG4gIGNvbnN0IHJlc3VsdHMgPSBoZWFwLm1ha2VIZWFwKHF1ZXJ5UG9pbnRzLmxlbmd0aCwgbk5laWdoYm9ycyk7XG4gIGluaXRGcm9tUmFuZG9tKG5OZWlnaGJvcnMsIGRhdGEsIHF1ZXJ5UG9pbnRzLCByZXN1bHRzLCByYW5kb20pO1xuICBpZiAoZm9yZXN0KSB7XG4gICAgZm9yIChjb25zdCB0cmVlIG9mIGZvcmVzdClcbiAgICAgIGluaXRGcm9tVHJlZSh0cmVlLCBkYXRhLCBxdWVyeVBvaW50cywgcmVzdWx0cywgcmFuZG9tKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0cztcbn1cbiJdfQ==","import isArray from 'is-any-array';\n\nimport errorCalculation from './errorCalculation';\nimport step from './step';\n\n/**\n * Curve fitting algorithm\n * @param {{x:Array<number>, y:Array<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {function} parameterizedFunction - The parameters and returns a function with the independent variable as a parameter\n * @param {object} [options] - Options object\n * @param {number} [options.damping] - Levenberg-Marquardt parameter\n * @param {number} [options.gradientDifference = 10e-2] - Adjustment for decrease the damping parameter\n * @param {Array<number>} [options.minValues] - Minimum allowed values for parameters\n * @param {Array<number>} [options.maxValues] - Maximum allowed values for parameters\n * @param {Array<number>} [options.initialValues] - Array of initial parameter values\n * @param {number} [options.maxIterations = 100] - Maximum of allowed iterations\n * @param {number} [options.errorTolerance = 10e-3] - Minimum uncertainty allowed for each point\n * @return {{parameterValues: Array<number>, parameterError: number, iterations: number}}\n */\nexport default function levenbergMarquardt(\n data,\n parameterizedFunction,\n options = {},\n) {\n let {\n maxIterations = 100,\n gradientDifference = 10e-2,\n damping = 0,\n errorTolerance = 10e-3,\n minValues,\n maxValues,\n initialValues,\n } = options;\n\n if (damping <= 0) {\n throw new Error('The damping option must be a positive number');\n } else if (!data.x || !data.y) {\n throw new Error('The data parameter must have x and y elements');\n } else if (\n !isArray(data.x) ||\n data.x.length < 2 ||\n !isArray(data.y) ||\n data.y.length < 2\n ) {\n throw new Error(\n 'The data parameter elements must be an array with more than 2 points',\n );\n } else if (data.x.length !== data.y.length) {\n throw new Error('The data parameter elements must have the same size');\n }\n\n let parameters =\n initialValues || new Array(parameterizedFunction.length).fill(1);\n let parLen = parameters.length;\n maxValues = maxValues || new Array(parLen).fill(Number.MAX_SAFE_INTEGER);\n minValues = minValues || new Array(parLen).fill(Number.MIN_SAFE_INTEGER);\n\n if (maxValues.length !== minValues.length) {\n throw new Error('minValues and maxValues must be the same size');\n }\n\n if (!isArray(parameters)) {\n throw new Error('initialValues must be an array');\n }\n\n let error = errorCalculation(data, parameters, parameterizedFunction);\n\n let converged = error <= errorTolerance;\n\n let iteration;\n for (iteration = 0; iteration < maxIterations && !converged; iteration++) {\n parameters = step(\n data,\n parameters,\n damping,\n gradientDifference,\n parameterizedFunction,\n );\n\n for (let k = 0; k < parLen; k++) {\n parameters[k] = Math.min(\n Math.max(minValues[k], parameters[k]),\n maxValues[k],\n );\n }\n\n error = errorCalculation(data, parameters, parameterizedFunction);\n if (isNaN(error)) break;\n converged = error <= errorTolerance;\n }\n\n return {\n parameterValues: parameters,\n parameterError: error,\n iterations: iteration,\n };\n}\n","import { DistanceAggregationMethods } from './types';\nimport { insertSmaller, isNil } from './utils';\nexport class SparseMatrixService {\n _workerCount;\n constructor() {\n this._workerCount = Math.max(navigator.hardwareConcurrency - 2, 1);\n }\n async calcMultiColumn(values, fnNames, threshold, opts = [{}], weights = [1], aggregationMethod = DistanceAggregationMethods.EUCLIDEAN) {\n const matSize = values[0].length * (values[0].length - 1) / 2;\n const chunkSize = Math.floor(matSize / this._workerCount);\n const minThreshold = values[0].length > 20000 ?\n await this.getMinimalThreshold(values, fnNames, opts, weights, aggregationMethod) : 0;\n if (threshold < minThreshold) {\n console.log(`using threshold ${minThreshold}`);\n threshold = minThreshold;\n }\n opts.forEach((_, i) => opts[i]['threshold'] = threshold);\n const promises = new Array(this._workerCount);\n const workers = new Array(this._workerCount)\n .fill(null).map(() => new Worker(new URL('./sparse-matrix-worker', import.meta.url)));\n for (let idx = 0; idx < this._workerCount; idx++) {\n promises[idx] = new Promise((resolveWorker, rejectWorker) => {\n const startIdx = idx * chunkSize;\n const endIdx = idx === this._workerCount - 1 ? matSize : (idx + 1) * chunkSize;\n if (endIdx <= startIdx)\n resolveWorker({ i: new Int32Array(0), j: new Int32Array(0), distance: new Float32Array(0), idx });\n workers[idx].postMessage({ values, startIdx, endIdx, threshold, fnNames, opts, weights, aggregationMethod });\n workers[idx].onmessage = ({ data: { error, i, j, distance } }) => {\n if (error) {\n workers[idx].terminate();\n rejectWorker(error);\n }\n else {\n workers[idx].terminate();\n resolveWorker({ i, j, distance, idx });\n }\n };\n });\n }\n const results = await Promise.all(promises);\n const fullSize = results.reduce((acc, val) => acc + val.i.length, 0);\n const i = new Int32Array(fullSize);\n const j = new Int32Array(fullSize);\n const distance = new Float32Array(fullSize);\n let offset = 0;\n // setting the results\n for (const res of results) {\n i.set(res.i, offset);\n j.set(res.j, offset);\n distance.set(res.distance, offset);\n offset += res.i.length;\n }\n return { i, j, distance };\n }\n async calc(values, fnName, threshold, opts = {}) {\n //size of full matrix\n return await this.calcMultiColumn([values], [fnName], threshold, [opts], [1]);\n }\n async getKNN(values, fnName, nNeighbours = 15, opts = {}) {\n return await this.multiColumnKNN([values], [fnName], nNeighbours, [opts], [1]);\n }\n async getThresholdKNN(values, fnName, threshold = 0.8, opts = {}) {\n return await this.multiColumnThresholdKnn([values], [fnName], threshold, [opts], [1]);\n }\n async multiColumnThresholdKnn(values, fnNames, threshold = 0.8, opts, weights, aggregationMethod = DistanceAggregationMethods.EUCLIDEAN) {\n if (values.length !== fnNames.length || values.length !== opts.length || values.length !== weights.length)\n throw new Error('values, distance functions, options and weights arrays should have the same length');\n if (values.some((v) => v.length !== values[0].length))\n throw new Error('all values arrays should have the same length');\n const matSize = values[0].length * (values[0].length - 1) / 2;\n const chunkSize = Math.floor(matSize / this._workerCount);\n const promises = new Array(this._workerCount);\n const workers = new Array(this._workerCount)\n .fill(null).map(() => new Worker(new URL('./knn-threshold-worker', import.meta.url)));\n for (let idx = 0; idx < this._workerCount; idx++) {\n promises[idx] = new Promise((resolveWorker, rejectWorker) => {\n const startIdx = idx * chunkSize;\n const endIdx = idx === this._workerCount - 1 ? matSize : (idx + 1) * chunkSize;\n if (endIdx <= startIdx)\n resolveWorker({ knnDistances: new Array(0), knnIndexes: new Array(0) });\n workers[idx].postMessage({ values, startIdx, endIdx, fnNames, opts, threshold, weights, aggregationMethod });\n workers[idx].onmessage = ({ data: { error, knnDistances, knnIndexes } }) => {\n if (error) {\n workers[idx].terminate();\n rejectWorker(error);\n }\n else {\n workers[idx].terminate();\n resolveWorker({ knnDistances, knnIndexes });\n }\n };\n });\n }\n const results = await Promise.all(promises);\n const knnSizes = new Int32Array(values[0].length);\n for (const res of results) {\n for (let i = 0; i < values[0].length; ++i)\n knnSizes[i] += res.knnIndexes[i]?.length ?? 0;\n }\n const knnRes = {\n knnDistances: new Array(values[0].length).fill(null).map((_, i) => new Array(knnSizes[i])),\n knnIndexes: new Array(values[0].length).fill(null).map((_, i) => new Array(knnSizes[i]))\n };\n for (const res of results) {\n for (let i = 0; i < values[0].length; ++i) {\n for (let j = 0; j < res.knnDistances[i]?.length ?? 0; ++j) {\n knnRes.knnDistances[i][knnSizes[i] - 1] = res.knnDistances[i][j];\n knnRes.knnIndexes[i][knnSizes[i] - 1] = res.knnIndexes[i][j];\n knnSizes[i] -= 1;\n }\n }\n }\n return knnRes;\n }\n async multiColumnKNN(values, fnNames, nNeighbours = 15, opts, weights, aggregationMethod = DistanceAggregationMethods.EUCLIDEAN) {\n if (values.length !== fnNames.length || values.length !== opts.length || values.length !== weights.length)\n throw new Error('values, distance functions, options and weights arrays should have the same length');\n if (values.some((v) => v.length !== values[0].length))\n throw new Error('all values arrays should have the same length');\n const matSize = values[0].length * (values[0].length - 1) / 2;\n const chunkSize = Math.floor(matSize / this._workerCount);\n const promises = new Array(this._workerCount);\n const workers = new Array(this._workerCount)\n .fill(null).map(() => new Worker(new URL('./knn-worker', import.meta.url)));\n for (let idx = 0; idx < this._workerCount; idx++) {\n promises[idx] = new Promise((resolveWorker, rejectWorker) => {\n const startIdx = idx * chunkSize;\n const endIdx = idx === this._workerCount - 1 ? matSize : (idx + 1) * chunkSize;\n if (endIdx <= startIdx)\n resolveWorker({ knnDistances: new Array(0), knnIndexes: new Array(0) });\n workers[idx].postMessage({ values, startIdx, endIdx, fnNames, opts, nNeighbours, weights, aggregationMethod });\n workers[idx].onmessage = ({ data: { error, knnDistances, knnIndexes } }) => {\n if (error) {\n workers[idx].terminate();\n rejectWorker(error);\n }\n else {\n workers[idx].terminate();\n resolveWorker({ knnDistances, knnIndexes });\n }\n };\n });\n }\n const results = await Promise.all(promises);\n const knnRes = {\n knnDistances: new Array(values[0].length).fill(null).map(() => new Array(nNeighbours).fill(99999)),\n knnIndexes: new Array(values[0].length).fill(null).map(() => new Array(nNeighbours).fill(-1))\n };\n for (const res of results) {\n for (let i = 0; i < values[0].length; ++i) {\n for (let j = 0; j < res.knnDistances[i]?.length ?? 0; ++j)\n insertSmaller(knnRes.knnDistances[i], knnRes.knnIndexes[i], res.knnDistances[i][j], res.knnIndexes[i][j]);\n }\n }\n return knnRes;\n }\n async getSampleDistances(values, fnNames, opts = [], weights, aggregationMethod = DistanceAggregationMethods.EUCLIDEAN) {\n const thresholdWorkers = new Array(this._workerCount).fill(null)\n .map(() => new Worker(new URL('./sparse-matrix-threshold-worker', import.meta.url)));\n try {\n const matSize = values[0].length * (values[0].length - 1) / 2;\n const chunkSize = Math.floor(matSize / this._workerCount);\n const maxSampleSize = 1000000;\n const sampleSise = Math.max(Math.min(matSize / 1000, maxSampleSize), Math.min(matSize, maxSampleSize));\n const testSetSizePerWorker = Math.floor(sampleSise / this._workerCount);\n const tPromises = new Array(this._workerCount);\n for (let idx = 0; idx < this._workerCount; idx++) {\n tPromises[idx] = new Promise((resolveWorker, rejectWorker) => {\n const startIdx = idx * chunkSize;\n const endIdx = idx === this._workerCount - 1 ? matSize : (idx + 1) * chunkSize;\n thresholdWorkers[idx].postMessage({\n values: values, startIdx, endIdx, sampleLength: testSetSizePerWorker,\n fnNames, opts, weights, aggregationMethod\n });\n thresholdWorkers[idx].onmessage = ({ data: { error, distance } }) => {\n thresholdWorkers[idx].terminate();\n if (error)\n rejectWorker(error);\n else\n resolveWorker({ distance });\n };\n });\n }\n const results = await Promise.all(tPromises);\n const fullSize = results.reduce((acc, val) => acc + val.distance.length, 0);\n const distance = new Float32Array(fullSize);\n let offset = 0;\n for (const res of results) {\n distance.set(res.distance, offset);\n offset += res.distance.length;\n }\n distance.sort();\n return distance;\n }\n catch (e) {\n thresholdWorkers?.forEach((w) => w?.terminate());\n console.error(e);\n return new Float32Array(1).fill(0.5);\n }\n }\n async getMinimalThreshold(values, fnNames, opts = [], weights, aggregationMethod = DistanceAggregationMethods.EUCLIDEAN) {\n //We need to calculate the minimal threshold first,\n //in order to get matrix such that it does not exceed the maximum size of 1GB\n //we have 3 return arrays, each 4 bites per element, so if the maximum size of the matrix is 1GB,\n const maxSparseMatrixSize = 70000000;\n try {\n const matSize = values.length * (values.length - 1) / 2;\n const distance = await this.getSampleDistances(values, fnNames, opts, weights, aggregationMethod);\n const fractionIndex = Math.floor(maxSparseMatrixSize / matSize * distance.length);\n const threshold = 1 - distance[fractionIndex];\n // threshold = Math.max(threshold, 0.3);\n return threshold;\n }\n catch (e) {\n console.error(e);\n return 0.5;\n }\n }\n static calcSync(values, fnName, distanceFn, threshold) {\n const i = [];\n const j = [];\n const distances = [];\n let cnt = 0;\n let mi = 0;\n let mj = 0;\n const fullSize = values.length * (values.length - 1) / 2;\n while (cnt < fullSize) {\n //const value = seq1List[mi] && seq1List[mj] ? hamming(seq1List[mi], seq1List[mj]) : 0;\n const value = !isNil(values[mi]) && !isNil(values[mj]) ?\n distanceFn(values[mi], values[mj]) : 1;\n const similarity = 1 - value;\n if (similarity >= threshold) {\n i.push(mi);\n j.push(mj);\n distances.push(value);\n }\n cnt++;\n mj++;\n if (mj === values.length) {\n mi++;\n mj = mi + 1;\n }\n }\n const iArray = new Int32Array(i);\n const jArray = new Int32Array(j);\n const distanceArray = new Float32Array(distances);\n return { i: iArray, j: jArray, distance: distanceArray };\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhcnNlLW1hdHJpeC1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3BhcnNlLW1hdHJpeC1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBNEIsMEJBQTBCLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDOUUsT0FBTyxFQUFDLGFBQWEsRUFBRSxLQUFLLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFhN0MsTUFBTSxPQUFPLG1CQUFtQjtJQUNwQixZQUFZLENBQVM7SUFDN0I7UUFDRSxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLG1CQUFtQixHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRU0sS0FBSyxDQUFDLGVBQWUsQ0FBQyxNQUFvQixFQUFFLE9BQXVCLEVBQ3hFLFNBQWlCLEVBQUUsT0FBNkIsQ0FBQyxFQUFFLENBQUMsRUFBRSxVQUFvQixDQUFDLENBQUMsQ0FBQyxFQUM3RSxvQkFBK0MsMEJBQTBCLENBQUMsU0FBUztRQUVuRixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRTFELE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsS0FBTSxDQUFDLENBQUM7WUFDOUMsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4RixJQUFJLFNBQVMsR0FB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QyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ1gsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDWCxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3ZCO1lBQ0QsR0FBRyxFQUFFLENBQUM7WUFDTixFQUFFLEVBQUUsQ0FBQztZQUNMLElBQUksRUFBRSxLQUFLLE1BQU0sQ0FBQyxNQUFNLEVBQUU7Z0JBQ3hCLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2FBQ2I7U0FDRjtRQUVELE1BQU0sTUFBTSxHQUFHLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pDLE1BQU0sTUFBTSxHQUFHLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pDLE1BQU0sYUFBYSxHQUFHLElBQUksWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRWxELE9BQU8sRUFBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBQyxDQUFDO0lBQ3pELENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7S25vd25NZXRyaWNzfSBmcm9tICcuLi90eXBlZC1tZXRyaWNzJztcbmltcG9ydCB7RGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZCwgRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZHN9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHtpbnNlcnRTbWFsbGVyLCBpc05pbH0gZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCB0eXBlIFNwYXJzZU1hdHJpeFJlc3VsdCA9IHtcbiAgaTogSW50MzJBcnJheSxcbiAgajogSW50MzJBcnJheSxcbiAgZGlzdGFuY2U6IEZsb2F0MzJBcnJheSxcbiAgaWR4PzogbnVtYmVyXG59O1xuXG5leHBvcnQgdHlwZSBLbm5SZXN1bHQgPSB7XG4gIGtubkRpc3RhbmNlczogbnVtYmVyW11bXSxcbiAga25uSW5kZXhlczogbnVtYmVyW11bXVxufVxuZXhwb3J0IGNsYXNzIFNwYXJzZU1hdHJpeFNlcnZpY2Uge1xuICAgIHByaXZhdGUgX3dvcmtlckNvdW50OiBudW1iZXI7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICB0aGlzLl93b3JrZXJDb3VudCA9IE1hdGgubWF4KG5hdmlnYXRvci5oYXJkd2FyZUNvbmN1cnJlbmN5IC0gMiwgMSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGNhbGNNdWx0aUNvbHVtbih2YWx1ZXM6IEFycmF5PGFueVtdPiwgZm5OYW1lczogS25vd25NZXRyaWNzW10sXG4gICAgICB0aHJlc2hvbGQ6IG51bWJlciwgb3B0czoge1tfOiBzdHJpbmddOiBhbnl9W10gPSBbe31dLCB3ZWlnaHRzOiBudW1iZXJbXSA9IFsxXSxcbiAgICAgIGFnZ3JlZ2F0aW9uTWV0aG9kOiBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kID0gRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZHMuRVVDTElERUFOXG4gICAgKSB7XG4gICAgICBjb25zdCBtYXRTaXplID0gdmFsdWVzWzBdLmxlbmd0aCAqICh2YWx1ZXNbMF0ubGVuZ3RoIC0gMSkgLyAyO1xuICAgICAgY29uc3QgY2h1bmtTaXplID0gTWF0aC5mbG9vcihtYXRTaXplIC8gdGhpcy5fd29ya2VyQ291bnQpO1xuXG4gICAgICBjb25zdCBtaW5UaHJlc2hvbGQgPSB2YWx1ZXNbMF0ubGVuZ3RoID4gMjBfMDAwID9cbiAgICAgICAgYXdhaXQgdGhpcy5nZXRNaW5pbWFsVGhyZXNob2xkKHZhbHVlcywgZm5OYW1lcywgb3B0cywgd2VpZ2h0cywgYWdncmVnYXRpb25NZXRob2QpIDogMDtcbiAgICAgIGlmICh0aHJlc2hvbGQgPCBtaW5UaHJlc2hvbGQpIHtcbiAgICAgICAgY29uc29sZS5sb2coYHVzaW5nIHRocmVzaG9sZCAke21pblRocmVzaG9sZH1gKTtcbiAgICAgICAgdGhyZXNob2xkID0gbWluVGhyZXNob2xkO1xuICAgICAgfVxuICAgICAgb3B0cy5mb3JFYWNoKChfLCBpKSA9PiBvcHRzW2ldWyd0aHJlc2hvbGQnXSA9IHRocmVzaG9sZCk7XG4gICAgICBjb25zdCBwcm9taXNlcyA9XG4gICAgICAgIG5ldyBBcnJheTxQcm9taXNlPFNwYXJzZU1hdHJpeFJlc3VsdD4+KHRoaXMuX3dvcmtlckNvdW50KTtcblxuICAgICAgY29uc3Qgd29ya2VycyA9IG5ldyBBcnJheSh0aGlzLl93b3JrZXJDb3VudClcbiAgICAgICAgLmZpbGwobnVsbCkubWFwKCgpID0+IG5ldyBXb3JrZXIobmV3IFVSTCgnLi9zcGFyc2UtbWF0cml4LXdvcmtlcicsIGltcG9ydC5tZXRhLnVybCkpKTtcbiAgICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IHRoaXMuX3dvcmtlckNvdW50OyBpZHgrKykge1xuICAgICAgICBwcm9taXNlc1tpZHhdID0gbmV3IFByb21pc2UoKHJlc29sdmVXb3JrZXIsIHJlamVjdFdvcmtlcikgPT4ge1xuICAgICAgICAgIGNvbnN0IHN0YXJ0SWR4ID0gaWR4ICogY2h1bmtTaXplO1xuICAgICAgICAgIGNvbnN0IGVuZElkeCA9IGlkeCA9PT0gdGhpcy5fd29ya2VyQ291bnQgLSAxID8gbWF0U2l6ZSA6IChpZHggKyAxKSAqIGNodW5rU2l6ZTtcbiAgICAgICAgICBpZiAoZW5kSWR4IDw9IHN0YXJ0SWR4KVxuICAgICAgICAgICAgcmVzb2x2ZVdvcmtlcih7aTogbmV3IEludDMyQXJyYXkoMCksIGo6IG5ldyBJbnQzMkFycmF5KDApLCBkaXN0YW5jZTogbmV3IEZsb2F0MzJBcnJheSgwKSwgaWR4fSk7XG4gICAgICAgICAgd29ya2Vyc1tpZHhdLnBvc3RNZXNzYWdlKHt2YWx1ZXMsIHN0YXJ0SWR4LCBlbmRJZHgsIHRocmVzaG9sZCwgZm5OYW1lcywgb3B0cywgd2VpZ2h0cywgYWdncmVnYXRpb25NZXRob2R9KTtcbiAgICAgICAgICB3b3JrZXJzW2lkeF0ub25tZXNzYWdlID0gKHtkYXRhOiB7ZXJyb3IsIGksIGosIGRpc3RhbmNlfX0pOiB2b2lkID0+IHtcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICB3b3JrZXJzW2lkeF0udGVybWluYXRlKCk7XG4gICAgICAgICAgICAgIHJlamVjdFdvcmtlcihlcnJvcik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB3b3JrZXJzW2lkeF0udGVybWluYXRlKCk7XG4gICAgICAgICAgICAgIHJlc29sdmVXb3JrZXIoe2ksIGosIGRpc3RhbmNlLCBpZHh9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICAgIGNvbnN0IGZ1bGxTaXplID0gcmVzdWx0cy5yZWR1Y2UoKGFjYywgdmFsKSA9PiBhY2MgKyB2YWwuaS5sZW5ndGgsIDApO1xuICAgICAgY29uc3QgaSA9IG5ldyBJbnQzMkFycmF5KGZ1bGxTaXplKTtcbiAgICAgIGNvbnN0IGogPSBuZXcgSW50MzJBcnJheShmdWxsU2l6ZSk7XG4gICAgICBjb25zdCBkaXN0YW5jZSA9IG5ldyBGbG9hdDMyQXJyYXkoZnVsbFNpemUpO1xuICAgICAgbGV0IG9mZnNldCA9IDA7XG4gICAgICAvLyBzZXR0aW5nIHRoZSByZXN1bHRzXG4gICAgICBmb3IgKGNvbnN0IHJlcyBvZiByZXN1bHRzKSB7XG4gICAgICAgIGkuc2V0KHJlcy5pLCBvZmZzZXQpO1xuICAgICAgICBqLnNldChyZXMuaiwgb2Zmc2V0KTtcbiAgICAgICAgZGlzdGFuY2Uuc2V0KHJlcy5kaXN0YW5jZSwgb2Zmc2V0KTtcbiAgICAgICAgb2Zmc2V0ICs9IHJlcy5pLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7aSwgaiwgZGlzdGFuY2V9O1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBjYWxjPFQ+KHZhbHVlczogQXJyYXk8VD4sIGZuTmFtZTogS25vd25NZXRyaWNzLCB0aHJlc2hvbGQ6IG51bWJlciwgb3B0czoge1tfOiBzdHJpbmddOiBhbnl9ID0ge30pIHtcbiAgICAgIC8vc2l6ZSBvZiBmdWxsIG1hdHJpeFxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2FsY011bHRpQ29sdW1uKFt2YWx1ZXNdLCBbZm5OYW1lXSwgdGhyZXNob2xkLCBbb3B0c10sIFsxXSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldEtOTihcbiAgICAgIHZhbHVlczogQXJyYXk8YW55PiwgZm5OYW1lOiBLbm93bk1ldHJpY3MsIG5OZWlnaGJvdXJzOiBudW1iZXIgPSAxNSwgb3B0czoge1tfOiBzdHJpbmddOiBhbnl9ID0ge31cbiAgICApIHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLm11bHRpQ29sdW1uS05OKFt2YWx1ZXNdLCBbZm5OYW1lXSwgbk5laWdoYm91cnMsIFtvcHRzXSwgWzFdKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0VGhyZXNob2xkS05OKFxuICAgICAgdmFsdWVzOiBBcnJheTxhbnk+LCBmbk5hbWU6IEtub3duTWV0cmljcywgdGhyZXNob2xkOiBudW1iZXIgPSAwLjgsIG9wdHM6IHtbXzogc3RyaW5nXTogYW55fSA9IHt9XG4gICAgKSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5tdWx0aUNvbHVtblRocmVzaG9sZEtubihbdmFsdWVzXSwgW2ZuTmFtZV0sIHRocmVzaG9sZCwgW29wdHNdLCBbMV0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBtdWx0aUNvbHVtblRocmVzaG9sZEtubih2YWx1ZXM6IEFycmF5PEFycmF5PGFueT4+LCBmbk5hbWVzOiBLbm93bk1ldHJpY3NbXSwgdGhyZXNob2xkOiBudW1iZXIgPSAwLjgsXG4gICAgICBvcHRzOiB7W186IHN0cmluZ106IGFueX1bXSwgd2VpZ2h0czogbnVtYmVyW10sXG4gICAgICBhZ2dyZWdhdGlvbk1ldGhvZDogRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZCA9IERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzLkVVQ0xJREVBTlxuICAgICkge1xuICAgICAgaWYgKHZhbHVlcy5sZW5ndGggIT09IGZuTmFtZXMubGVuZ3RoIHx8IHZhbHVlcy5sZW5ndGggIT09IG9wdHMubGVuZ3RoIHx8IHZhbHVlcy5sZW5ndGggIT09IHdlaWdodHMubGVuZ3RoKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ZhbHVlcywgZGlzdGFuY2UgZnVuY3Rpb25zLCBvcHRpb25zIGFuZCB3ZWlnaHRzIGFycmF5cyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBsZW5ndGgnKTtcblxuICAgICAgaWYgKHZhbHVlcy5zb21lKCh2KSA9PiB2Lmxlbmd0aCAhPT0gdmFsdWVzWzBdLmxlbmd0aCkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignYWxsIHZhbHVlcyBhcnJheXMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgbGVuZ3RoJyk7XG5cbiAgICAgIGNvbnN0IG1hdFNpemUgPSB2YWx1ZXNbMF0ubGVuZ3RoICogKHZhbHVlc1swXS5sZW5ndGggLSAxKSAvIDI7XG4gICAgICBjb25zdCBjaHVua1NpemUgPSBNYXRoLmZsb29yKG1hdFNpemUgLyB0aGlzLl93b3JrZXJDb3VudCk7XG4gICAgICBjb25zdCBwcm9taXNlcyA9XG4gICAgICAgIG5ldyBBcnJheTxQcm9taXNlPEtublJlc3VsdD4+KHRoaXMuX3dvcmtlckNvdW50KTtcbiAgICAgIGNvbnN0IHdvcmtlcnMgPSBuZXcgQXJyYXkodGhpcy5fd29ya2VyQ291bnQpXG4gICAgICAgIC5maWxsKG51bGwpLm1hcCgoKSA9PiBuZXcgV29ya2VyKG5ldyBVUkwoJy4va25uLXRocmVzaG9sZC13b3JrZXInLCBpbXBvcnQubWV0YS51cmwpKSk7XG4gICAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCB0aGlzLl93b3JrZXJDb3VudDsgaWR4KyspIHtcbiAgICAgICAgcHJvbWlzZXNbaWR4XSA9IG5ldyBQcm9taXNlKChyZXNvbHZlV29ya2VyLCByZWplY3RXb3JrZXIpID0+IHtcbiAgICAgICAgICBjb25zdCBzdGFydElkeCA9IGlkeCAqIGNodW5rU2l6ZTtcbiAgICAgICAgICBjb25zdCBlbmRJZHggPSBpZHggPT09IHRoaXMuX3dvcmtlckNvdW50IC0gMSA/IG1hdFNpemUgOiAoaWR4ICsgMSkgKiBjaHVua1NpemU7XG4gICAgICAgICAgaWYgKGVuZElkeCA8PSBzdGFydElkeClcbiAgICAgICAgICAgIHJlc29sdmVXb3JrZXIoe2tubkRpc3RhbmNlczogbmV3IEFycmF5KDApLCBrbm5JbmRleGVzOiBuZXcgQXJyYXkoMCl9KTtcbiAgICAgICAgICB3b3JrZXJzW2lkeF0ucG9zdE1lc3NhZ2Uoe3ZhbHVlcywgc3RhcnRJZHgsIGVuZElkeCwgZm5OYW1lcywgb3B0cywgdGhyZXNob2xkLCB3ZWlnaHRzLCBhZ2dyZWdhdGlvbk1ldGhvZH0pO1xuICAgICAgICAgIHdvcmtlcnNbaWR4XS5vbm1lc3NhZ2UgPSAoe2RhdGE6IHtlcnJvciwga25uRGlzdGFuY2VzLCBrbm5JbmRleGVzfX0pOiB2b2lkID0+IHtcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICB3b3JrZXJzW2lkeF0udGVybWluYXRlKCk7XG4gICAgICAgICAgICAgIHJlamVjdFdvcmtlcihlcnJvcik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB3b3JrZXJzW2lkeF0udGVybWluYXRlKCk7XG4gICAgICAgICAgICAgIHJlc29sdmVXb3JrZXIoe2tubkRpc3RhbmNlcywga25uSW5kZXhlc30pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgICAgY29uc3Qga25uU2l6ZXMgPSBuZXcgSW50MzJBcnJheSh2YWx1ZXNbMF0ubGVuZ3RoKTtcbiAgICAgIGZvciAoY29uc3QgcmVzIG9mIHJlc3VsdHMpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXNbMF0ubGVuZ3RoOyArK2kpXG4gICAgICAgICAga25uU2l6ZXNbaV0gKz0gcmVzLmtubkluZGV4ZXNbaV0/Lmxlbmd0aCA/PyAwO1xuICAgICAgfVxuICAgICAgY29uc3Qga25uUmVzOiBLbm5SZXN1bHQgPSB7XG4gICAgICAgIGtubkRpc3RhbmNlczogbmV3IEFycmF5KHZhbHVlc1swXS5sZW5ndGgpLmZpbGwobnVsbCkubWFwKChfLCBpKSA9PiBuZXcgQXJyYXk8bnVtYmVyPihrbm5TaXplc1tpXSkpLFxuICAgICAgICBrbm5JbmRleGVzOiBuZXcgQXJyYXkodmFsdWVzWzBdLmxlbmd0aCkuZmlsbChudWxsKS5tYXAoKF8sIGkpID0+IG5ldyBBcnJheTxudW1iZXI+KGtublNpemVzW2ldKSl9O1xuICAgICAgZm9yIChjb25zdCByZXMgb2YgcmVzdWx0cykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlc1swXS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcmVzLmtubkRpc3RhbmNlc1tpXT8ubGVuZ3RoID8/IDA7ICsraikge1xuICAgICAgICAgICAga25uUmVzLmtubkRpc3RhbmNlc1tpXVtrbm5TaXplc1tpXSAtIDFdID0gcmVzLmtubkRpc3RhbmNlc1tpXVtqXTtcbiAgICAgICAgICAgIGtublJlcy5rbm5JbmRleGVzW2ldW2tublNpemVzW2ldIC0gMV0gPSByZXMua25uSW5kZXhlc1tpXVtqXTtcbiAgICAgICAgICAgIGtublNpemVzW2ldIC09IDE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4ga25uUmVzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBtdWx0aUNvbHVtbktOTih2YWx1ZXM6IEFycmF5PEFycmF5PGFueT4+LCBmbk5hbWVzOiBLbm93bk1ldHJpY3NbXSwgbk5laWdoYm91cnM6IG51bWJlciA9IDE1LFxuICAgICAgb3B0czoge1tfOiBzdHJpbmddOiBhbnl9W10sIHdlaWdodHM6IG51bWJlcltdLFxuICAgICAgYWdncmVnYXRpb25NZXRob2Q6IERpc3RhbmNlQWdncmVnYXRpb25NZXRob2QgPSBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kcy5FVUNMSURFQU5cbiAgICApIHtcbiAgICAgIGlmICh2YWx1ZXMubGVuZ3RoICE9PSBmbk5hbWVzLmxlbmd0aCB8fCB2YWx1ZXMubGVuZ3RoICE9PSBvcHRzLmxlbmd0aCB8fCB2YWx1ZXMubGVuZ3RoICE9PSB3ZWlnaHRzLmxlbmd0aClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd2YWx1ZXMsIGRpc3RhbmNlIGZ1bmN0aW9ucywgb3B0aW9ucyBhbmQgd2VpZ2h0cyBhcnJheXMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgbGVuZ3RoJyk7XG5cbiAgICAgIGlmICh2YWx1ZXMuc29tZSgodikgPT4gdi5sZW5ndGggIT09IHZhbHVlc1swXS5sZW5ndGgpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FsbCB2YWx1ZXMgYXJyYXlzIHNob3VsZCBoYXZlIHRoZSBzYW1lIGxlbmd0aCcpO1xuXG4gICAgICBjb25zdCBtYXRTaXplID0gdmFsdWVzWzBdLmxlbmd0aCAqICh2YWx1ZXNbMF0ubGVuZ3RoIC0gMSkgLyAyO1xuICAgICAgY29uc3QgY2h1bmtTaXplID0gTWF0aC5mbG9vcihtYXRTaXplIC8gdGhpcy5fd29ya2VyQ291bnQpO1xuICAgICAgY29uc3QgcHJvbWlzZXMgPVxuICAgICAgICBuZXcgQXJyYXk8UHJvbWlzZTxLbm5SZXN1bHQ+Pih0aGlzLl93b3JrZXJDb3VudCk7XG4gICAgICBjb25zdCB3b3JrZXJzID0gbmV3IEFycmF5KHRoaXMuX3dvcmtlckNvdW50KVxuICAgICAgICAuZmlsbChudWxsKS5tYXAoKCkgPT4gbmV3IFdvcmtlcihuZXcgVVJMKCcuL2tubi13b3JrZXInLCBpbXBvcnQubWV0YS51cmwpKSk7XG4gICAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCB0aGlzLl93b3JrZXJDb3VudDsgaWR4KyspIHtcbiAgICAgICAgcHJvbWlzZXNbaWR4XSA9IG5ldyBQcm9taXNlKChyZXNvbHZlV29ya2VyLCByZWplY3RXb3JrZXIpID0+IHtcbiAgICAgICAgICBjb25zdCBzdGFydElkeCA9IGlkeCAqIGNodW5rU2l6ZTtcbiAgICAgICAgICBjb25zdCBlbmRJZHggPSBpZHggPT09IHRoaXMuX3dvcmtlckNvdW50IC0gMSA/IG1hdFNpemUgOiAoaWR4ICsgMSkgKiBjaHVua1NpemU7XG4gICAgICAgICAgaWYgKGVuZElkeCA8PSBzdGFydElkeClcbiAgICAgICAgICAgIHJlc29sdmVXb3JrZXIoe2tubkRpc3RhbmNlczogbmV3IEFycmF5KDApLCBrbm5JbmRleGVzOiBuZXcgQXJyYXkoMCl9KTtcbiAgICAgICAgICB3b3JrZXJzW2lkeF0ucG9zdE1lc3NhZ2Uoe3ZhbHVlcywgc3RhcnRJZHgsIGVuZElkeCwgZm5OYW1lcywgb3B0cywgbk5laWdoYm91cnMsIHdlaWdodHMsIGFnZ3JlZ2F0aW9uTWV0aG9kfSk7XG4gICAgICAgICAgd29ya2Vyc1tpZHhdLm9ubWVzc2FnZSA9ICh7ZGF0YToge2Vycm9yLCBrbm5EaXN0YW5jZXMsIGtubkluZGV4ZXN9fSk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgIHdvcmtlcnNbaWR4XS50ZXJtaW5hdGUoKTtcbiAgICAgICAgICAgICAgcmVqZWN0V29ya2VyKGVycm9yKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHdvcmtlcnNbaWR4XS50ZXJtaW5hdGUoKTtcbiAgICAgICAgICAgICAgcmVzb2x2ZVdvcmtlcih7a25uRGlzdGFuY2VzLCBrbm5JbmRleGVzfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgICBjb25zdCBrbm5SZXM6IEtublJlc3VsdCA9IHtcbiAgICAgICAga25uRGlzdGFuY2VzOiBuZXcgQXJyYXkodmFsdWVzWzBdLmxlbmd0aCkuZmlsbChudWxsKS5tYXAoKCkgPT4gbmV3IEFycmF5PG51bWJlcj4obk5laWdoYm91cnMpLmZpbGwoOTk5OTkpKSxcbiAgICAgICAga25uSW5kZXhlczogbmV3IEFycmF5KHZhbHVlc1swXS5sZW5ndGgpLmZpbGwobnVsbCkubWFwKCgpID0+IG5ldyBBcnJheTxudW1iZXI+KG5OZWlnaGJvdXJzKS5maWxsKC0xKSl9O1xuICAgICAgZm9yIChjb25zdCByZXMgb2YgcmVzdWx0cykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlc1swXS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcmVzLmtubkRpc3RhbmNlc1tpXT8ubGVuZ3RoID8/IDA7ICsrailcbiAgICAgICAgICAgIGluc2VydFNtYWxsZXIoa25uUmVzLmtubkRpc3RhbmNlc1tpXSwga25uUmVzLmtubkluZGV4ZXNbaV0sIHJlcy5rbm5EaXN0YW5jZXNbaV1bal0sIHJlcy5rbm5JbmRleGVzW2ldW2pdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGtublJlcztcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0U2FtcGxlRGlzdGFuY2VzKHZhbHVlczogQXJyYXk8YW55W10+LFxuICAgICAgZm5OYW1lczogS25vd25NZXRyaWNzW10sIG9wdHM6IHtbXzogc3RyaW5nXTogYW55fVtdID0gW10sIHdlaWdodHM6IG51bWJlcltdLFxuICAgICAgYWdncmVnYXRpb25NZXRob2Q6IERpc3RhbmNlQWdncmVnYXRpb25NZXRob2QgPSBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kcy5FVUNMSURFQU4pOiBQcm9taXNlPEZsb2F0MzJBcnJheT4ge1xuICAgICAgY29uc3QgdGhyZXNob2xkV29ya2VycyA9IG5ldyBBcnJheSh0aGlzLl93b3JrZXJDb3VudCkuZmlsbChudWxsKVxuICAgICAgICAubWFwKCgpID0+IG5ldyBXb3JrZXIobmV3IFVSTCgnLi9zcGFyc2UtbWF0cml4LXRocmVzaG9sZC13b3JrZXInLCBpbXBvcnQubWV0YS51cmwpKSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG1hdFNpemUgPSB2YWx1ZXNbMF0ubGVuZ3RoICogKHZhbHVlc1swXS5sZW5ndGggLSAxKSAvIDI7XG4gICAgICAgIGNvbnN0IGNodW5rU2l6ZSA9IE1hdGguZmxvb3IobWF0U2l6ZSAvIHRoaXMuX3dvcmtlckNvdW50KTtcbiAgICAgICAgY29uc3QgbWF4U2FtcGxlU2l6ZSA9IDFfMDAwXzAwMDtcbiAgICAgICAgY29uc3Qgc2FtcGxlU2lzZSA9IE1hdGgubWF4KE1hdGgubWluKG1hdFNpemUgLyAxMDAwLCBtYXhTYW1wbGVTaXplKSwgTWF0aC5taW4obWF0U2l6ZSwgbWF4U2FtcGxlU2l6ZSkpO1xuICAgICAgICBjb25zdCB0ZXN0U2V0U2l6ZVBlcldvcmtlciA9IE1hdGguZmxvb3Ioc2FtcGxlU2lzZSAvIHRoaXMuX3dvcmtlckNvdW50KTtcbiAgICAgICAgY29uc3QgdFByb21pc2VzID0gbmV3IEFycmF5PFByb21pc2U8e2Rpc3RhbmNlOiBGbG9hdDMyQXJyYXl9Pj4odGhpcy5fd29ya2VyQ291bnQpO1xuXG4gICAgICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IHRoaXMuX3dvcmtlckNvdW50OyBpZHgrKykge1xuICAgICAgICAgIHRQcm9taXNlc1tpZHhdID0gbmV3IFByb21pc2UoKHJlc29sdmVXb3JrZXIsIHJlamVjdFdvcmtlcikgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRJZHggPSBpZHggKiBjaHVua1NpemU7XG4gICAgICAgICAgICBjb25zdCBlbmRJZHggPSBpZHggPT09IHRoaXMuX3dvcmtlckNvdW50IC0gMSA/IG1hdFNpemUgOiAoaWR4ICsgMSkgKiBjaHVua1NpemU7XG4gICAgICAgICAgICB0aHJlc2hvbGRXb3JrZXJzW2lkeF0ucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICB2YWx1ZXM6IHZhbHVlcywgc3RhcnRJZHgsIGVuZElkeCwgc2FtcGxlTGVuZ3RoOiB0ZXN0U2V0U2l6ZVBlcldvcmtlcixcbiAgICAgICAgICAgICAgZm5OYW1lcywgb3B0cywgd2VpZ2h0cywgYWdncmVnYXRpb25NZXRob2RcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyZXNob2xkV29ya2Vyc1tpZHhdLm9ubWVzc2FnZSA9ICh7ZGF0YToge2Vycm9yLCBkaXN0YW5jZX19KTogdm9pZCA9PiB7XG4gICAgICAgICAgICAgIHRocmVzaG9sZFdvcmtlcnNbaWR4XS50ZXJtaW5hdGUoKTtcbiAgICAgICAgICAgICAgaWYgKGVycm9yKSByZWplY3RXb3JrZXIoZXJyb3IpOyBlbHNlXG4gICAgICAgICAgICAgICAgcmVzb2x2ZVdvcmtlcih7ZGlzdGFuY2V9KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwodFByb21pc2VzKTtcbiAgICAgICAgY29uc3QgZnVsbFNpemUgPSByZXN1bHRzLnJlZHVjZSgoYWNjLCB2YWwpID0+IGFjYyArIHZhbC5kaXN0YW5jZS5sZW5ndGgsIDApO1xuICAgICAgICBjb25zdCBkaXN0YW5jZSA9IG5ldyBGbG9hdDMyQXJyYXkoZnVsbFNpemUpO1xuICAgICAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICAgICAgZm9yIChjb25zdCByZXMgb2YgcmVzdWx0cykge1xuICAgICAgICAgIGRpc3RhbmNlLnNldChyZXMuZGlzdGFuY2UsIG9mZnNldCk7XG4gICAgICAgICAgb2Zmc2V0ICs9IHJlcy5kaXN0YW5jZS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgZGlzdGFuY2Uuc29ydCgpO1xuXG4gICAgICAgIHJldHVybiBkaXN0YW5jZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyZXNob2xkV29ya2Vycz8uZm9yRWFjaCgodykgPT4gdz8udGVybWluYXRlKCkpO1xuICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICByZXR1cm4gbmV3IEZsb2F0MzJBcnJheSgxKS5maWxsKDAuNSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBnZXRNaW5pbWFsVGhyZXNob2xkKHZhbHVlczogQXJyYXk8YW55W10+LFxuICAgICAgZm5OYW1lczogS25vd25NZXRyaWNzW10sIG9wdHM6IHtbXzogc3RyaW5nXTogYW55fVtdID0gW10sIHdlaWdodHM6IG51bWJlcltdLFxuICAgICAgYWdncmVnYXRpb25NZXRob2Q6IERpc3RhbmNlQWdncmVnYXRpb25NZXRob2QgPSBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kcy5FVUNMSURFQU4pIHtcbiAgICAgIC8vV2UgbmVlZCB0byBjYWxjdWxhdGUgdGhlIG1pbmltYWwgdGhyZXNob2xkIGZpcnN0LFxuICAgICAgLy9pbiBvcmRlciB0byBnZXQgbWF0cml4IHN1Y2ggdGhhdCBpdCBkb2VzIG5vdCBleGNlZWQgdGhlIG1heGltdW0gc2l6ZSBvZiAxR0JcbiAgICAgIC8vd2UgaGF2ZSAzIHJldHVybiBhcnJheXMsIGVhY2ggNCBiaXRlcyBwZXIgZWxlbWVudCwgc28gaWYgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgbWF0cml4IGlzIDFHQixcbiAgICAgIGNvbnN0IG1heFNwYXJzZU1hdHJpeFNpemUgPSA3MF8wMDBfMDAwO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbWF0U2l6ZSA9IHZhbHVlcy5sZW5ndGggKiAodmFsdWVzLmxlbmd0aCAtIDEpIC8gMjtcbiAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBhd2FpdCB0aGlzLmdldFNhbXBsZURpc3RhbmNlcyh2YWx1ZXMsIGZuTmFtZXMsIG9wdHMsIHdlaWdodHMsIGFnZ3JlZ2F0aW9uTWV0aG9kKTtcbiAgICAgICAgY29uc3QgZnJhY3Rpb25JbmRleCA9IE1hdGguZmxvb3IobWF4U3BhcnNlTWF0cml4U2l6ZSAvIG1hdFNpemUgKiBkaXN0YW5jZS5sZW5ndGgpO1xuICAgICAgICBjb25zdCB0aHJlc2hvbGQgPSAxIC0gZGlzdGFuY2VbZnJhY3Rpb25JbmRleF07XG4gICAgICAgIC8vIHRocmVzaG9sZCA9IE1hdGgubWF4KHRocmVzaG9sZCwgMC4zKTtcbiAgICAgICAgcmV0dXJuIHRocmVzaG9sZDtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgcmV0dXJuIDAuNTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNhbGNTeW5jPFQ+KFxuICAgICAgdmFsdWVzOiBBcnJheTxUPiB8IEFycmF5TGlrZTxUPiwgZm5OYW1lOiBLbm93bk1ldHJpY3MsIGRpc3RhbmNlRm46IEZ1bmN0aW9uLCB0aHJlc2hvbGQ6IG51bWJlclxuICAgICkge1xuICAgICAgY29uc3QgaTogbnVtYmVyW10gPSBbXTtcbiAgICAgIGNvbnN0IGo6IG51bWJlcltdID0gW107XG4gICAgICBjb25zdCBkaXN0YW5jZXM6IG51bWJlcltdID0gW107XG4gICAgICBsZXQgY250ID0gMDtcbiAgICAgIGxldCBtaSA9IDA7XG4gICAgICBsZXQgbWogPSAwO1xuICAgICAgY29uc3QgZnVsbFNpemUgPSB2YWx1ZXMubGVuZ3RoICogKHZhbHVlcy5sZW5ndGggLSAxKSAvIDI7XG4gICAgICB3aGlsZSAoY250IDwgZnVsbFNpemUpIHtcbiAgICAgICAgLy9jb25zdCB2YWx1ZSA9IHNlcTFMaXN0W21pXSAmJiBzZXExTGlzdFttal0gPyBoYW1taW5nKHNlcTFMaXN0W21pXSwgc2VxMUxpc3RbbWpdKSA6IDA7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gIWlzTmlsKHZhbHVlc1ttaV0pICYmICFpc05pbCh2YWx1ZXNbbWpdKSA/XG4gICAgICAgICAgZGlzdGFuY2VGbih2YWx1ZXNbbWldLCB2YWx1ZXNbbWpdKSA6IDE7XG4gICAgICAgIGNvbnN0IHNpbWlsYXJpdHkgPSAxIC0gdmFsdWU7XG4gICAgICAgIGlmIChzaW1pbGFyaXR5ID49IHRocmVzaG9sZCkge1xuICAgICAgICAgIGkucHVzaChtaSk7XG4gICAgICAgICAgai5wdXNoKG1qKTtcbiAgICAgICAgICBkaXN0YW5jZXMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgY250Kys7XG4gICAgICAgIG1qKys7XG4gICAgICAgIGlmIChtaiA9PT0gdmFsdWVzLmxlbmd0aCkge1xuICAgICAgICAgIG1pKys7XG4gICAgICAgICAgbWogPSBtaSArIDE7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgaUFycmF5ID0gbmV3IEludDMyQXJyYXkoaSk7XG4gICAgICBjb25zdCBqQXJyYXkgPSBuZXcgSW50MzJBcnJheShqKTtcbiAgICAgIGNvbnN0IGRpc3RhbmNlQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KGRpc3RhbmNlcyk7XG5cbiAgICAgIHJldHVybiB7aTogaUFycmF5LCBqOiBqQXJyYXksIGRpc3RhbmNlOiBkaXN0YW5jZUFycmF5fTtcbiAgICB9XG59XG4iXX0=","import { dmLinearIndex } from '../distance-matrix';\nexport class TSNE {\n perplexity;\n dim;\n epsilon;\n iter = 0;\n N;\n P;\n Y;\n gains;\n ystep;\n random = Math.random;\n assert(condition, message) {\n if (!condition)\n throw message || 'Assertion failed';\n }\n // syntax sugar\n getopt(opt, field, defaultval) {\n if (opt.hasOwnProperty(field))\n return opt[field];\n else\n return defaultval;\n }\n // return 0 mean unit standard deviation random number\n returnV = false;\n vValue = 0.0;\n gaussRandom() {\n if (this.returnV) {\n this.returnV = false;\n return this.vValue;\n }\n const u = 2 * this.random() - 1;\n const v = 2 * this.random() - 1;\n const r = u * u + v * v;\n if (r === 0 || r > 1)\n return this.gaussRandom();\n const c = Math.sqrt(-2 * Math.log(r) / r);\n this.vValue = v * c; // cache this for next function call for efficiency\n this.returnV = true;\n return u * c;\n }\n // return random normal number\n randn(mu, std) {\n return mu + this.gaussRandom() * std;\n }\n // utilitity that creates contiguous vector of zeros of size n\n zeros(n) {\n if (typeof (n) === 'undefined' || isNaN(n))\n return new Float32Array();\n if (typeof ArrayBuffer === 'undefined') {\n // lacking browser support\n const arr = new Float32Array(n);\n for (let i = 0; i < n; i++)\n arr[i] = 0;\n return arr;\n }\n else {\n return new Float32Array(n); // typed arrays are faster\n }\n }\n // utility that returns 2d array filled with random numbers\n // or with value s, if provided\n randn2d(n, d, s) {\n const uses = typeof s !== 'undefined';\n const x = (new Array(n)).fill(null).map(() => new Float32Array(d));\n if (uses) {\n for (let i = 0; i < n; i++)\n x[i] = new Float32Array(d).fill(s);\n }\n else {\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < d; j++)\n x[i][j] = this.randn(0.0, 1e-4);\n }\n }\n return x;\n }\n // compute L2 distance between two vectors\n l2(x1, x2) {\n const D = x1.length;\n let d = 0;\n for (let i = 0; i < D; i++) {\n const x1i = x1[i];\n const x2i = x2[i];\n d += (x1i - x2i) * (x1i - x2i);\n }\n return d;\n }\n // compute pairwise distance in all vectors in X\n xtod(X) {\n const N = X.length;\n const dist = this.zeros(N * N); // allocate contiguous array\n for (let i = 0; i < N; i++) {\n for (let j = i + 1; j < N; j++) {\n const d = this.l2(X[i], X[j]);\n dist[i * N + j] = d;\n dist[j * N + i] = d;\n }\n }\n return dist;\n }\n getIterSize(rowSize) {\n if (rowSize <= 2000)\n return 100;\n else if (rowSize <= 3000)\n return 90;\n else if (rowSize <= 5000)\n return 80;\n else\n return 70;\n }\n // compute (p_{i|j} + p_{j|i})/(2n)\n d2p(D, perplexity, tol, rowSize) {\n // const nf = Math.sqrt(D.length); // this better be an integer\n // const n = Math.floor(nf);\n // this.assert(n === nf, 'D should have square number of elements.');\n const indexer = dmLinearIndex(rowSize);\n const distances = new Float32Array(rowSize * rowSize);\n for (let i = 0; i < rowSize; i++) {\n for (let j = i + 1; j < rowSize; j++)\n distances[i * rowSize + j] = distances[j * rowSize + i] = D[indexer(i, j)];\n }\n const n = rowSize;\n const hTarget = Math.log(perplexity); // target entropy of distribution\n const P = this.zeros(n * n); // temporary probability matrix\n const prow = this.zeros(n); // a temporary storage compartment\n for (let i = 0; i < n; i++) {\n let betamin = -Infinity;\n let betamax = Infinity;\n let beta = 1; // initial value of precision\n let done = false;\n const maxtries = Math.floor(this.getIterSize(rowSize) / 5);\n // perform binary search to find a suitable precision beta\n // so that the entropy of the distribution is appropriate\n let num = 0;\n while (!done) {\n //debugger;\n // compute entropy and kernel row with beta precision\n let psum = 0.0;\n for (let j = 0; j < n; j++) {\n const pj = i === j ? 0 : Math.exp(-distances[i * n + j] * beta);\n prow[j] = pj;\n psum += pj;\n }\n // normalize p and compute entropy\n let nHere = 0.0;\n for (let j = 0; j < n; j++) {\n let pj;\n if (psum === 0)\n pj = 0;\n else\n pj = prow[j] / psum;\n prow[j] = pj;\n if (pj > 1e-7)\n nHere -= pj * Math.log(pj);\n }\n // adjust beta based on result\n if (nHere > hTarget) {\n // entropy was too high (distribution too diffuse)\n // so we need to increase the precision for more peaky distribution\n betamin = beta; // move up the bounds\n if (betamax === Infinity)\n beta = beta * 2;\n else\n beta = (beta + betamax) / 2;\n }\n else {\n // converse case. make distrubtion less peaky\n betamax = beta;\n if (betamin === -Infinity)\n beta = beta / 2;\n else\n beta = (beta + betamin) / 2;\n }\n // stopping conditions: too many tries or got a good precision\n num++;\n if (Math.abs(nHere - hTarget) < tol)\n done = true;\n if (num >= maxtries)\n done = true;\n }\n // console.log('data point ' + i + ' gets precision ' + beta + ' after ' + num + ' binary search steps.');\n // copy over the final prow to P at row i\n for (let j = 0; j < n; j++)\n P[i * n + j] = prow[j];\n } // end loop over examples i\n // symmetrize P and normalize it to sum to 1 over all ij\n const pOut = this.zeros(n * n);\n const N2 = n * 2;\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++)\n pOut[i * n + j] = Math.max((P[i * n + j] + P[j * n + i]) / N2, 1e-100);\n }\n return pOut;\n }\n // helper function\n sign(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; }\n constructor(opt) {\n opt = opt || {};\n this.perplexity = this.getopt(opt, 'perplexity', 30); // effective number of nearest neighbors\n this.dim = this.getopt(opt, 'dim', 2); // by default 2-D tSNE\n this.epsilon = this.getopt(opt, 'epsilon', 10); // learning rate\n this.random = this.getopt(opt, 'random', Math.random); // random number generator\n }\n // this function takes a set of high-dimensional points\n // and creates matrix P from them using gaussian kernel\n initDataRaw(X) {\n const N = X.length;\n const D = X[0].length;\n this.assert(N > 0, ' X is empty? You must have some data!');\n this.assert(D > 0, ' X[0] is empty? Where is the data?');\n const dists = this.xtod(X); // convert X to distances using gaussian kernel\n this.P = this.d2p(dists, this.perplexity, 1e-4, D); // attach to object\n this.N = N; // back up the size of the dataset\n this.initSolution(); // refresh this\n }\n // this function takes a given distance matrix and creates\n // matrix P from them.\n // D is assumed to be provided as a list of lists, and should be symmetric\n initDataDist(D, rowSize) {\n const N = D.length;\n this.assert(N > 0, ' X is empty? You must have some data!');\n // convert D to a (fast) typed array version\n // dists.forEach((d) => console.log(d));\n console.time('distances to matrix');\n this.P = this.d2p(D, this.perplexity, 1e-4, rowSize);\n console.timeEnd('distances to matrix');\n this.N = rowSize;\n this.initSolution(); // refresh this\n }\n // (re)initializes the solution to random\n initSolution() {\n // generate random solution to t-SNE\n this.Y = this.randn2d(this.N, this.dim); // the solution\n this.gains = this.randn2d(this.N, this.dim, 1.0); // step gains to accelerate progress in unchanging directions\n this.ystep = this.randn2d(this.N, this.dim, 0.0); // momentum accumulator\n this.iter = 0;\n }\n // return pointer to current solution\n getSolution() {\n return this.Y;\n }\n // perform a single step of optimization to improve the embedding\n step() {\n this.iter += 1;\n const N = this.N;\n const cg = this.costGrad(this.Y); // evaluate gradient\n const cost = cg.cost;\n const grad = cg.grad;\n // perform gradient step\n const ymean = this.zeros(this.dim);\n for (let i = 0; i < N; i++) {\n for (let d = 0; d < this.dim; d++) {\n const gid = grad[i][d];\n const sid = this.ystep[i][d];\n const gainid = this.gains[i][d];\n // compute gain update\n let newgain = this.sign(gid) === this.sign(sid) ? gainid * 0.8 : gainid + 0.2;\n if (newgain < 0.01)\n newgain = 0.01; // clamp\n this.gains[i][d] = newgain; // store for next turn\n // compute momentum step direction\n const momval = this.iter < 250 ? 0.5 : 0.8;\n const newsid = momval * sid - this.epsilon * newgain * grad[i][d];\n this.ystep[i][d] = newsid; // remember the step we took\n // step!\n this.Y[i][d] += newsid;\n ymean[d] += this.Y[i][d]; // accumulate mean so that we can center later\n }\n }\n // reproject Y to be zero mean\n for (let i = 0; i < N; i++) {\n for (let d = 0; d < this.dim; d++)\n this.Y[i][d] -= ymean[d] / N;\n }\n //if(this.iter%100===0) console.log('iter ' + this.iter + ', cost: ' + cost);\n return cost; // return current cost\n }\n // for debugging: gradient check\n debugGrad() {\n const N = this.N;\n const cg = this.costGrad(this.Y); // evaluate gradient\n //const cost = cg.cost;\n const grad = cg.grad;\n const e = 1e-5;\n for (let i = 0; i < N; i++) {\n for (let d = 0; d < this.dim; d++) {\n const yold = this.Y[i][d];\n this.Y[i][d] = yold + e;\n const cg0 = this.costGrad(this.Y);\n this.Y[i][d] = yold - e;\n const cg1 = this.costGrad(this.Y);\n const analytic = grad[i][d];\n const numerical = (cg0.cost - cg1.cost) / (2 * e);\n console.log(i + ',' + d + ': gradcheck analytic: ' + analytic + ' vs. numerical: ' + numerical);\n this.Y[i][d] = yold;\n }\n }\n }\n quArr;\n // return cost and gradient, given an arrangement\n costGrad(Y) {\n const N = this.N;\n const dim = this.dim; // dim of output space\n const P = this.P;\n const pmul = this.iter < 100 ? 4 : 1; // trick that helps with local optima\n // compute current Q distribution, unnormalized first\n this.quArr ??= this.zeros(N * N);\n let qsum = 0.0;\n for (let i = 0; i < N; i++) {\n for (let j = i + 1; j < N; j++) {\n const dsum = new Array(dim).reduce((prev, _, d) => prev + Math.pow(Y[i][d] - Y[j][d], 2), 0);\n const qu = 1.0 / (1.0 + dsum); // Student t-distribution\n this.quArr[i * N + j] = qu;\n this.quArr[j * N + i] = qu;\n qsum += 2 * qu;\n }\n }\n // normalize Q distribution to sum to 1\n //const NN = N * N;\n //const Q = this.zeros(NN);\n let cost = 0.0;\n const grad = new Array(N).fill(null).map(() => (new Float32Array(dim)).fill(0.0));\n for (let i = 0; i < N; i++) {\n // const gsum = new Float32Array(dim).fill(0.0); // init grad for point i\n for (let j = i + 1; j < N; j++) {\n const Q = Math.max(this.quArr[i * N + j] / qsum, 1e-100);\n cost += (-P[i * N + j] * Math.log(Q)) * 2; // accumulate cost (the non-constant portion at least...)\n const premult = 4 * (pmul * P[i * N + j] - Q) * this.quArr[i * N + j];\n //console.log(premult, Q, i, j);\n for (let d = 0; d < dim; d++) {\n grad[i][d] += premult * (Y[i][d] - Y[j][d]);\n grad[j][d] += premult * (Y[j][d] - Y[i][d]);\n }\n }\n //grad[i] = gsum;\n }\n return { cost, grad };\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidC1zbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0LXNuZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHakQsTUFBTSxPQUFPLElBQUk7SUFDUCxVQUFVLENBQVM7SUFDbkIsR0FBRyxDQUFTO0lBQ1osT0FBTyxDQUFTO0lBQ2hCLElBQUksR0FBRyxDQUFDLENBQUM7SUFDVCxDQUFDLENBQVU7SUFDWCxDQUFDLENBQWdCO0lBQ2pCLENBQUMsQ0FBUztJQUNWLEtBQUssQ0FBUztJQUNkLEtBQUssQ0FBUztJQUNkLE1BQU0sR0FBaUIsSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNuQyxNQUFNLENBQUMsU0FBYyxFQUFFLE9BQVk7UUFDekMsSUFBSSxDQUFDLFNBQVM7WUFBRSxNQUFNLE9BQU8sSUFBSSxrQkFBa0IsQ0FBQztJQUN0RCxDQUFDO0lBRUQsZUFBZTtJQUNQLE1BQU0sQ0FBQyxHQUF1QixFQUFFLEtBQWEsRUFBRSxVQUFlO1FBQ3BFLElBQUksR0FBRyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUM7WUFDM0IsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7O1lBRWxCLE9BQU8sVUFBVSxDQUFDO0lBQ3RCLENBQUM7SUFFQyxzREFBc0Q7SUFDOUMsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDO0lBQ3JCLFdBQVc7UUFDVCxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDaEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7WUFDckIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO1NBQ3BCO1FBQ0QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDaEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFD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QUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLHlEQUF5RDtnQkFDckcsTUFBTSxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDdEUsZ0NBQWdDO2dCQUNoQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUM1QixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUM1QyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUM3QzthQUNGO1lBQ0QsaUJBQWlCO1NBQ2xCO1FBRUQsT0FBTyxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUMsQ0FBQztJQUN0QixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2RtTGluZWFySW5kZXh9IGZyb20gJy4uL2Rpc3RhbmNlLW1hdHJpeCc7XG5cblxuZXhwb3J0IGNsYXNzIFRTTkUge1xuICBwcml2YXRlIHBlcnBsZXhpdHk6IG51bWJlcjtcbiAgcHJpdmF0ZSBkaW06IG51bWJlcjtcbiAgcHJpdmF0ZSBlcHNpbG9uOiBudW1iZXI7XG4gIHByaXZhdGUgaXRlciA9IDA7XG4gIHByaXZhdGUgTiE6IG51bWJlcjtcbiAgcHJpdmF0ZSBQITogRmxvYXQzMkFycmF5O1xuICBwcml2YXRlIFkhOiBhbnlbXTtcbiAgcHJpdmF0ZSBnYWlucyE6IGFueVtdO1xuICBwcml2YXRlIHlzdGVwITogYW55W107XG4gIHByaXZhdGUgcmFuZG9tOiAoKSA9PiBudW1iZXIgPSBNYXRoLnJhbmRvbTtcbiAgcHJpdmF0ZSBhc3NlcnQoY29uZGl0aW9uOiBhbnksIG1lc3NhZ2U6IGFueSkge1xuICAgIGlmICghY29uZGl0aW9uKSB0aHJvdyBtZXNzYWdlIHx8ICdBc3NlcnRpb24gZmFpbGVkJztcbiAgfVxuXG4gIC8vIHN5bnRheCBzdWdhclxuICBwcml2YXRlIGdldG9wdChvcHQ6IHtbXzogc3RyaW5nXTogYW55fSwgZmllbGQ6IHN0cmluZywgZGVmYXVsdHZhbDogYW55KSB7XG4gICAgaWYgKG9wdC5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpXG4gICAgICByZXR1cm4gb3B0W2ZpZWxkXTtcbiAgICBlbHNlXG4gICAgICByZXR1cm4gZGVmYXVsdHZhbDtcbiAgfVxuXG4gICAgLy8gcmV0dXJuIDAgbWVhbiB1bml0IHN0YW5kYXJkIGRldmlhdGlvbiByYW5kb20gbnVtYmVyXG4gICAgcHJpdmF0ZSByZXR1cm5WID0gZmFsc2U7XG4gICAgcHJpdmF0ZSB2VmFsdWUgPSAwLjA7XG4gICAgZ2F1c3NSYW5kb20oKTogbnVtYmVyIHtcbiAgICAgIGlmICh0aGlzLnJldHVyblYpIHtcbiAgICAgICAgdGhpcy5yZXR1cm5WID0gZmFsc2U7XG4gICAgICAgIHJldHVybiB0aGlzLnZWYWx1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHUgPSAyICogdGhpcy5yYW5kb20oKSAtIDE7XG4gICAgICBjb25zdCB2ID0gMiAqIHRoaXMucmFuZG9tKCkgLSAxO1xuICAgICAgY29uc3QgciA9IHUgKiB1ICsgdiAqIHY7XG4gICAgICBpZiAociA9PT0gMCB8fCByID4gMSkgcmV0dXJuIHRoaXMuZ2F1c3NSYW5kb20oKTtcbiAgICAgIGNvbnN0IGMgPSBNYXRoLnNxcnQoLTIgKiBNYXRoLmxvZyhyKSAvIHIpO1xuICAgICAgdGhpcy52VmFsdWUgPSB2ICogYzsgLy8gY2FjaGUgdGhpcyBmb3IgbmV4dCBmdW5jdGlvbiBjYWxsIGZvciBlZmZpY2llbmN5XG4gICAgICB0aGlzLnJldHVyblYgPSB0cnVlO1xuICAgICAgcmV0dXJuIHUgKiBjO1xuICAgIH1cblxuICAgIC8vIHJldHVybiByYW5kb20gbm9ybWFsIG51bWJlclxuICAgIHByaXZhdGUgcmFuZG4obXU6IG51bWJlciwgc3RkOiBudW1iZXIpIHtcbiAgICAgIHJldHVybiBtdSArIHRoaXMuZ2F1c3NSYW5kb20oKSAqIHN0ZDtcbiAgICB9XG5cbiAgICAvLyB1dGlsaXRpdHkgdGhhdCBjcmVhdGVzIGNvbnRpZ3VvdXMgdmVjdG9yIG9mIHplcm9zIG9mIHNpemUgblxuICAgIHByaXZhdGUgemVyb3MobjogbnVtYmVyKSB7XG4gICAgICBpZiAodHlwZW9mIChuKSA9PT0gJ3VuZGVmaW5lZCcgfHwgaXNOYU4obikpIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KCk7XG4gICAgICBpZiAodHlwZW9mIEFycmF5QnVmZmVyID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAvLyBsYWNraW5nIGJyb3dzZXIgc3VwcG9ydFxuICAgICAgICBjb25zdCBhcnIgPSBuZXcgRmxvYXQzMkFycmF5KG4pO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykgYXJyW2ldID0gMDtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KG4pOyAvLyB0eXBlZCBhcnJheXMgYXJlIGZhc3RlclxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHV0aWxpdHkgdGhhdCByZXR1cm5zIDJkIGFycmF5IGZpbGxlZCB3aXRoIHJhbmRvbSBudW1iZXJzXG4gICAgLy8gb3Igd2l0aCB2YWx1ZSBzLCBpZiBwcm92aWRlZFxuICAgIHByaXZhdGUgcmFuZG4yZChuOiBudW1iZXIsIGQ6IG51bWJlciwgcz86IG51bWJlcikge1xuICAgICAgY29uc3QgdXNlcyA9IHR5cGVvZiBzICE9PSAndW5kZWZpbmVkJztcbiAgICAgIGNvbnN0IHggPSAobmV3IEFycmF5KG4pKS5maWxsKG51bGwpLm1hcCgoKSA9PiBuZXcgRmxvYXQzMkFycmF5KGQpKTtcbiAgICAgIGlmICh1c2VzKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKVxuICAgICAgICAgIHhbaV0gPSBuZXcgRmxvYXQzMkFycmF5KGQpLmZpbGwocyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZDsgaisrKVxuICAgICAgICAgICAgeFtpXVtqXSA9IHRoaXMucmFuZG4oMC4wLCAxZS00KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHg7XG4gICAgfVxuXG4gICAgLy8gY29tcHV0ZSBMMiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWN0b3JzXG4gICAgcHJpdmF0ZSBsMih4MTogbnVtYmVyW10sIHgyOiBudW1iZXJbXSkge1xuICAgICAgY29uc3QgRCA9IHgxLmxlbmd0aDtcbiAgICAgIGxldCBkID0gMDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgRDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHgxaSA9IHgxW2ldO1xuICAgICAgICBjb25zdCB4MmkgPSB4MltpXTtcbiAgICAgICAgZCArPSAoeDFpIC0geDJpKSAqICh4MWkgLSB4MmkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGQ7XG4gICAgfVxuXG4gICAgLy8gY29tcHV0ZSBwYWlyd2lzZSBkaXN0YW5jZSBpbiBhbGwgdmVjdG9ycyBpbiBYXG4gICAgcHJpdmF0ZSB4dG9kKFg6IEFycmF5PCBBcnJheTxudW1iZXI+ID4pIHtcbiAgICAgIGNvbnN0IE4gPSBYLmxlbmd0aDtcbiAgICAgIGNvbnN0IGRpc3QgPSB0aGlzLnplcm9zKE4gKiBOKTsgLy8gYWxsb2NhdGUgY29udGlndW91cyBhcnJheVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBOOyBpKyspIHtcbiAgICAgICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgTjsgaisrKSB7XG4gICAgICAgICAgY29uc3QgZCA9IHRoaXMubDIoWFtpXSwgWFtqXSk7XG4gICAgICAgICAgZGlzdFtpICogTiArIGpdID0gZDtcbiAgICAgICAgICBkaXN0W2ogKiBOICsgaV0gPSBkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZGlzdDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0SXRlclNpemUocm93U2l6ZTogbnVtYmVyKSB7XG4gICAgICBpZiAocm93U2l6ZSA8PSAyMDAwKVxuICAgICAgICByZXR1cm4gMTAwO1xuICAgICAgZWxzZSBpZiAocm93U2l6ZSA8PSAzMDAwKVxuICAgICAgICByZXR1cm4gOTA7XG4gICAgICBlbHNlIGlmIChyb3dTaXplIDw9IDUwMDApXG4gICAgICAgIHJldHVybiA4MDtcbiAgICAgIGVsc2VcbiAgICAgICAgcmV0dXJuIDcwO1xuICAgIH1cblxuICAgIC8vIGNvbXB1dGUgKHBfe2l8an0gKyBwX3tqfGl9KS8oMm4pXG4gICAgcHJpdmF0ZSBkMnAoRDogRmxvYXQzMkFycmF5LCBwZXJwbGV4aXR5OiBudW1iZXIsIHRvbDogbnVtYmVyLCByb3dTaXplOiBudW1iZXIpIHtcbiAgICAgIC8vIGNvbnN0IG5mID0gTWF0aC5zcXJ0KEQubGVuZ3RoKTsgLy8gdGhpcyBiZXR0ZXIgYmUgYW4gaW50ZWdlclxuICAgICAgLy8gY29uc3QgbiA9IE1hdGguZmxvb3IobmYpO1xuICAgICAgLy8gdGhpcy5hc3NlcnQobiA9PT0gbmYsICdEIHNob3VsZCBoYXZlIHNxdWFyZSBudW1iZXIgb2YgZWxlbWVudHMuJyk7XG4gICAgICBjb25zdCBpbmRleGVyID0gZG1MaW5lYXJJbmRleChyb3dTaXplKTtcbiAgICAgIGNvbnN0IGRpc3RhbmNlcyA9IG5ldyBGbG9hdDMyQXJyYXkocm93U2l6ZSAqIHJvd1NpemUpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3dTaXplOyBpKyspIHtcbiAgICAgICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgcm93U2l6ZTsgaisrKVxuICAgICAgICAgIGRpc3RhbmNlc1tpICogcm93U2l6ZSArIGpdID0gZGlzdGFuY2VzW2ogKiByb3dTaXplICsgaV0gPSBEW2luZGV4ZXIoaSwgaildO1xuICAgICAgfVxuICAgICAgY29uc3QgbiA9IHJvd1NpemU7XG4gICAgICBjb25zdCBoVGFyZ2V0ID0gTWF0aC5sb2cocGVycGxleGl0eSk7IC8vIHRhcmdldCBlbnRyb3B5IG9mIGRpc3RyaWJ1dGlvblxuICAgICAgY29uc3QgUCA9IHRoaXMuemVyb3MobiAqIG4pOyAvLyB0ZW1wb3JhcnkgcHJvYmFiaWxpdHkgbWF0cml4XG4gICAgICBjb25zdCBwcm93ID0gdGhpcy56ZXJvcyhuKTsgLy8gYSB0ZW1wb3Jhcnkgc3RvcmFnZSBjb21wYXJ0bWVudFxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgbGV0IGJldGFtaW4gPSAtSW5maW5pdHk7XG4gICAgICAgIGxldCBiZXRhbWF4ID0gSW5maW5pdHk7XG4gICAgICAgIGxldCBiZXRhID0gMTsgLy8gaW5pdGlhbCB2YWx1ZSBvZiBwcmVjaXNpb25cbiAgICAgICAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgbWF4dHJpZXMgPSBNYXRoLmZsb29yKHRoaXMuZ2V0SXRlclNpemUocm93U2l6ZSkgLyA1KTtcblxuICAgICAgICAvLyBwZXJmb3JtIGJpbmFyeSBzZWFyY2ggdG8gZmluZCBhIHN1aXRhYmxlIHByZWNpc2lvbiBiZXRhXG4gICAgICAgIC8vIHNvIHRoYXQgdGhlIGVudHJvcHkgb2YgdGhlIGRpc3RyaWJ1dGlvbiBpcyBhcHByb3ByaWF0ZVxuICAgICAgICBsZXQgbnVtID0gMDtcbiAgICAgICAgd2hpbGUgKCFkb25lKSB7XG4gICAgICAgICAgLy9kZWJ1Z2dlcjtcblxuICAgICAgICAgIC8vIGNvbXB1dGUgZW50cm9weSBhbmQga2VybmVsIHJvdyB3aXRoIGJldGEgcHJlY2lzaW9uXG4gICAgICAgICAgbGV0IHBzdW0gPSAwLjA7XG4gICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBuOyBqKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHBqID0gaSA9PT0gaiA/IDAgOiBNYXRoLmV4cCgtIGRpc3RhbmNlc1tpICogbiArIGpdICogYmV0YSk7XG4gICAgICAgICAgICBwcm93W2pdID0gcGo7XG4gICAgICAgICAgICBwc3VtICs9IHBqO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBub3JtYWxpemUgcCBhbmQgY29tcHV0ZSBlbnRyb3B5XG4gICAgICAgICAgbGV0IG5IZXJlID0gMC4wO1xuICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbjsgaisrKSB7XG4gICAgICAgICAgICBsZXQgcGo7XG4gICAgICAgICAgICBpZiAocHN1bSA9PT0gMClcbiAgICAgICAgICAgICAgcGogPSAwO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICBwaiA9IHByb3dbal0gLyBwc3VtO1xuXG4gICAgICAgICAgICBwcm93W2pdID0gcGo7XG4gICAgICAgICAgICBpZiAocGogPiAxZS03KSBuSGVyZSAtPSBwaiAqIE1hdGgubG9nKHBqKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBhZGp1c3QgYmV0YSBiYXNlZCBvbiByZXN1bHRcbiAgICAgICAgICBpZiAobkhlcmUgPiBoVGFyZ2V0KSB7XG4gICAgICAgICAgICAvLyBlbnRyb3B5IHdhcyB0b28gaGlnaCAoZGlzdHJpYnV0aW9uIHRvbyBkaWZmdXNlKVxuICAgICAgICAgICAgLy8gc28gd2UgbmVlZCB0byBpbmNyZWFzZSB0aGUgcHJlY2lzaW9uIGZvciBtb3JlIHBlYWt5IGRpc3RyaWJ1dGlvblxuICAgICAgICAgICAgYmV0YW1pbiA9IGJldGE7IC8vIG1vdmUgdXAgdGhlIGJvdW5kc1xuICAgICAgICAgICAgaWYgKGJldGFtYXggPT09IEluZmluaXR5KSBiZXRhID0gYmV0YSAqIDI7IGVsc2UgYmV0YSA9IChiZXRhICsgYmV0YW1heCkgLyAyO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBjb252ZXJzZSBjYXNlLiBtYWtlIGRpc3RydWJ0aW9uIGxlc3MgcGVha3lcbiAgICAgICAgICAgIGJldGFtYXggPSBiZXRhO1xuICAgICAgICAgICAgaWYgKGJldGFtaW4gPT09IC1JbmZpbml0eSkgYmV0YSA9IGJldGEgLyAyOyBlbHNlIGJldGEgPSAoYmV0YSArIGJldGFtaW4pIC8gMjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBzdG9wcGluZyBjb25kaXRpb25zOiB0b28gbWFueSB0cmllcyBvciBnb3QgYSBnb29kIHByZWNpc2lvblxuICAgICAgICAgIG51bSsrO1xuICAgICAgICAgIGlmIChNYXRoLmFicyhuSGVyZSAtIGhUYXJnZXQpIDwgdG9sKSBkb25lID0gdHJ1ZTtcbiAgICAgICAgICBpZiAobnVtID49IG1heHRyaWVzKSBkb25lID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdkYXRhIHBvaW50ICcgKyBpICsgJyBnZXRzIHByZWNpc2lvbiAnICsgYmV0YSArICcgYWZ0ZXIgJyArIG51bSArICcgYmluYXJ5IHNlYXJjaCBzdGVwcy4nKTtcbiAgICAgICAgLy8gY29weSBvdmVyIHRoZSBmaW5hbCBwcm93IHRvIFAgYXQgcm93IGlcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBuOyBqKyspIFBbaSAqIG4gKyBqXSA9IHByb3dbal07XG4gICAgICB9IC8vIGVuZCBsb29wIG92ZXIgZXhhbXBsZXMgaVxuXG4gICAgICAvLyBzeW1tZXRyaXplIFAgYW5kIG5vcm1hbGl6ZSBpdCB0byBzdW0gdG8gMSBvdmVyIGFsbCBpalxuICAgICAgY29uc3QgcE91dCA9IHRoaXMuemVyb3MobiAqIG4pO1xuICAgICAgY29uc3QgTjIgPSBuICogMjtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbjsgaisrKVxuICAgICAgICAgIHBPdXRbaSAqIG4gKyBqXSA9IE1hdGgubWF4KChQW2kgKiBuICsgal0gKyBQW2ogKiBuICsgaV0pIC8gTjIsIDFlLTEwMCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwT3V0O1xuICAgIH1cblxuICAgIC8vIGhlbHBlciBmdW5jdGlvblxuICAgIHByaXZhdGUgc2lnbih4OiBudW1iZXIpIHsgcmV0dXJuIHggPiAwID8gMSA6IHggPCAwID8gLTEgOiAwOyB9XG5cbiAgICBjb25zdHJ1Y3RvcihvcHQ6IHtbXzogc3RyaW5nXTogYW55fSkge1xuICAgICAgb3B0ID0gb3B0IHx8IHt9O1xuICAgICAgdGhpcy5wZXJwbGV4aXR5ID0gdGhpcy5nZXRvcHQob3B0LCAncGVycGxleGl0eScsIDMwKTsgLy8gZWZmZWN0aXZlIG51bWJlciBvZiBuZWFyZXN0IG5laWdoYm9yc1xuICAgICAgdGhpcy5kaW0gPSB0aGlzLmdldG9wdChvcHQsICdkaW0nLCAyKTsgLy8gYnkgZGVmYXVsdCAyLUQgdFNORVxuICAgICAgdGhpcy5lcHNpbG9uID0gdGhpcy5nZXRvcHQob3B0LCAnZXBzaWxvbicsIDEwKTsgLy8gbGVhcm5pbmcgcmF0ZVxuICAgICAgdGhpcy5yYW5kb20gPSB0aGlzLmdldG9wdChvcHQsICdyYW5kb20nLCBNYXRoLnJhbmRvbSk7IC8vIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yXG4gICAgfVxuXG4gICAgLy8gdGhpcyBmdW5jdGlvbiB0YWtlcyBhIHNldCBvZiBoaWdoLWRpbWVuc2lvbmFsIHBvaW50c1xuICAgIC8vIGFuZCBjcmVhdGVzIG1hdHJpeCBQIGZyb20gdGhlbSB1c2luZyBnYXVzc2lhbiBrZXJuZWxcbiAgICBwdWJsaWMgaW5pdERhdGFSYXcoWDogQXJyYXk8QXJyYXk8YW55Pj4pIHtcbiAgICAgIGNvbnN0IE4gPSBYLmxlbmd0aDtcbiAgICAgIGNvbnN0IEQgPSBYWzBdLmxlbmd0aDtcbiAgICAgIHRoaXMuYXNzZXJ0KE4gPiAwLCAnIFggaXMgZW1wdHk/IFlvdSBtdXN0IGhhdmUgc29tZSBkYXRhIScpO1xuICAgICAgdGhpcy5hc3NlcnQoRCA+IDAsICcgWFswXSBpcyBlbXB0eT8gV2hlcmUgaXMgdGhlIGRhdGE/Jyk7XG4gICAgICBjb25zdCBkaXN0cyA9IHRoaXMueHRvZChYKTsgLy8gY29udmVydCBYIHRvIGRpc3RhbmNlcyB1c2luZyBnYXVzc2lhbiBrZXJuZWxcbiAgICAgIHRoaXMuUCA9IHRoaXMuZDJwKGRpc3RzLCB0aGlzLnBlcnBsZXhpdHksIDFlLTQsIEQpOyAvLyBhdHRhY2ggdG8gb2JqZWN0XG4gICAgICB0aGlzLk4gPSBOOyAvLyBiYWNrIHVwIHRoZSBzaXplIG9mIHRoZSBkYXRhc2V0XG4gICAgICB0aGlzLmluaXRTb2x1dGlvbigpOyAvLyByZWZyZXNoIHRoaXNcbiAgICB9XG5cbiAgICAvLyB0aGlzIGZ1bmN0aW9uIHRha2VzIGEgZ2l2ZW4gZGlzdGFuY2UgbWF0cml4IGFuZCBjcmVhdGVzXG4gICAgLy8gbWF0cml4IFAgZnJvbSB0aGVtLlxuICAgIC8vIEQgaXMgYXNzdW1lZCB0byBiZSBwcm92aWRlZCBhcyBhIGxpc3Qgb2YgbGlzdHMsIGFuZCBzaG91bGQgYmUgc3ltbWV0cmljXG4gICAgcHVibGljIGluaXREYXRhRGlzdChEOiBGbG9hdDMyQXJyYXksIHJvd1NpemU6IG51bWJlcikge1xuICAgICAgY29uc3QgTiA9IEQubGVuZ3RoO1xuICAgICAgdGhpcy5hc3NlcnQoTiA+IDAsICcgWCBpcyBlbXB0eT8gWW91IG11c3QgaGF2ZSBzb21lIGRhdGEhJyk7XG4gICAgICAvLyBjb252ZXJ0IEQgdG8gYSAoZmFzdCkgdHlwZWQgYXJyYXkgdmVyc2lvblxuICAgICAgLy8gZGlzdHMuZm9yRWFjaCgoZCkgPT4gY29uc29sZS5sb2coZCkpO1xuICAgICAgY29uc29sZS50aW1lKCdkaXN0YW5jZXMgdG8gbWF0cml4Jyk7XG4gICAgICB0aGlzLlAgPSB0aGlzLmQycChELCB0aGlzLnBlcnBsZXhpdHksIDFlLTQsIHJvd1NpemUpO1xuICAgICAgY29uc29sZS50aW1lRW5kKCdkaXN0YW5jZXMgdG8gbWF0cml4Jyk7XG4gICAgICB0aGlzLk4gPSByb3dTaXplO1xuICAgICAgdGhpcy5pbml0U29sdXRpb24oKTsgLy8gcmVmcmVzaCB0aGlzXG4gICAgfVxuXG4gICAgLy8gKHJlKWluaXRpYWxpemVzIHRoZSBzb2x1dGlvbiB0byByYW5kb21cbiAgICBwdWJsaWMgaW5pdFNvbHV0aW9uKCkge1xuICAgICAgLy8gZ2VuZXJhdGUgcmFuZG9tIHNvbHV0aW9uIHRvIHQtU05FXG4gICAgICB0aGlzLlkgPSB0aGlzLnJhbmRuMmQodGhpcy5OLCB0aGlzLmRpbSk7IC8vIHRoZSBzb2x1dGlvblxuICAgICAgdGhpcy5nYWlucyA9IHRoaXMucmFuZG4yZCh0aGlzLk4sIHRoaXMuZGltLCAxLjApOyAvLyBzdGVwIGdhaW5zIHRvIGFjY2VsZXJhdGUgcHJvZ3Jlc3MgaW4gdW5jaGFuZ2luZyBkaXJlY3Rpb25zXG4gICAgICB0aGlzLnlzdGVwID0gdGhpcy5yYW5kbjJkKHRoaXMuTiwgdGhpcy5kaW0sIDAuMCk7IC8vIG1vbWVudHVtIGFjY3VtdWxhdG9yXG4gICAgICB0aGlzLml0ZXIgPSAwO1xuICAgIH1cblxuICAgIC8vIHJldHVybiBwb2ludGVyIHRvIGN1cnJlbnQgc29sdXRpb25cbiAgICBwdWJsaWMgZ2V0U29sdXRpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5ZO1xuICAgIH1cblxuICAgIC8vIHBlcmZvcm0gYSBzaW5nbGUgc3RlcCBvZiBvcHRpbWl6YXRpb24gdG8gaW1wcm92ZSB0aGUgZW1iZWRkaW5nXG4gICAgcHVibGljIHN0ZXAoKSB7XG4gICAgICB0aGlzLml0ZXIgKz0gMTtcbiAgICAgIGNvbnN0IE4gPSB0aGlzLk47XG4gICAgICBjb25zdCBjZyA9IHRoaXMuY29zdEdyYWQodGhpcy5ZKTsgLy8gZXZhbHVhdGUgZ3JhZGllbnRcbiAgICAgIGNvbnN0IGNvc3QgPSBjZy5jb3N0O1xuICAgICAgY29uc3QgZ3JhZCA9IGNnLmdyYWQ7XG5cbiAgICAgIC8vIHBlcmZvcm0gZ3JhZGllbnQgc3RlcFxuICAgICAgY29uc3QgeW1lYW4gPSB0aGlzLnplcm9zKHRoaXMuZGltKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTjsgaSsrKSB7XG4gICAgICAgIGZvciAobGV0IGQgPSAwOyBkIDwgdGhpcy5kaW07IGQrKykge1xuICAgICAgICAgIGNvbnN0IGdpZCA9IGdyYWRbaV1bZF07XG4gICAgICAgICAgY29uc3Qgc2lkID0gdGhpcy55c3RlcFtpXVtkXTtcbiAgICAgICAgICBjb25zdCBnYWluaWQgPSB0aGlzLmdhaW5zW2ldW2RdO1xuXG4gICAgICAgICAgLy8gY29tcHV0ZSBnYWluIHVwZGF0ZVxuICAgICAgICAgIGxldCBuZXdnYWluID0gdGhpcy5zaWduKGdpZCkgPT09IHRoaXMuc2lnbihzaWQpID8gZ2FpbmlkICogMC44IDogZ2FpbmlkICsgMC4yO1xuICAgICAgICAgIGlmIChuZXdnYWluIDwgMC4wMSkgbmV3Z2FpbiA9IDAuMDE7IC8vIGNsYW1wXG4gICAgICAgICAgdGhpcy5nYWluc1tpXVtkXSA9IG5ld2dhaW47IC8vIHN0b3JlIGZvciBuZXh0IHR1cm5cblxuICAgICAgICAgIC8vIGNvbXB1dGUgbW9tZW50dW0gc3RlcCBkaXJlY3Rpb25cbiAgICAgICAgICBjb25zdCBtb212YWwgPSB0aGlzLml0ZXIgPCAyNTAgPyAwLjUgOiAwLjg7XG4gICAgICAgICAgY29uc3QgbmV3c2lkID0gbW9tdmFsICogc2lkIC0gdGhpcy5lcHNpbG9uICogbmV3Z2FpbiAqIGdyYWRbaV1bZF07XG4gICAgICAgICAgdGhpcy55c3RlcFtpXVtkXSA9IG5ld3NpZDsgLy8gcmVtZW1iZXIgdGhlIHN0ZXAgd2UgdG9va1xuXG4gICAgICAgICAgLy8gc3RlcCFcbiAgICAgICAgICB0aGlzLllbaV1bZF0gKz0gbmV3c2lkO1xuXG4gICAgICAgICAgeW1lYW5bZF0gKz0gdGhpcy5ZW2ldW2RdOyAvLyBhY2N1bXVsYXRlIG1lYW4gc28gdGhhdCB3ZSBjYW4gY2VudGVyIGxhdGVyXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gcmVwcm9qZWN0IFkgdG8gYmUgemVybyBtZWFuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IE47IGkrKykge1xuICAgICAgICBmb3IgKGxldCBkID0gMDsgZCA8IHRoaXMuZGltOyBkKyspXG4gICAgICAgICAgdGhpcy5ZW2ldW2RdIC09IHltZWFuW2RdIC8gTjtcbiAgICAgIH1cblxuICAgICAgLy9pZih0aGlzLml0ZXIlMTAwPT09MCkgY29uc29sZS5sb2coJ2l0ZXIgJyArIHRoaXMuaXRlciArICcsIGNvc3Q6ICcgKyBjb3N0KTtcbiAgICAgIHJldHVybiBjb3N0OyAvLyByZXR1cm4gY3VycmVudCBjb3N0XG4gICAgfVxuXG4gICAgLy8gZm9yIGRlYnVnZ2luZzogZ3JhZGllbnQgY2hlY2tcbiAgICBwdWJsaWMgZGVidWdHcmFkKCkge1xuICAgICAgY29uc3QgTiA9IHRoaXMuTjtcblxuICAgICAgY29uc3QgY2cgPSB0aGlzLmNvc3RHcmFkKHRoaXMuWSk7IC8vIGV2YWx1YXRlIGdyYWRpZW50XG4gICAgICAvL2NvbnN0IGNvc3QgPSBjZy5jb3N0O1xuICAgICAgY29uc3QgZ3JhZCA9IGNnLmdyYWQ7XG5cbiAgICAgIGNvbnN0IGUgPSAxZS01O1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBOOyBpKyspIHtcbiAgICAgICAgZm9yIChsZXQgZCA9IDA7IGQgPCB0aGlzLmRpbTsgZCsrKSB7XG4gICAgICAgICAgY29uc3QgeW9sZCA9IHRoaXMuWVtpXVtkXTtcblxuICAgICAgICAgIHRoaXMuWVtpXVtkXSA9IHlvbGQgKyBlO1xuICAgICAgICAgIGNvbnN0IGNnMCA9IHRoaXMuY29zdEdyYWQodGhpcy5ZKTtcblxuICAgICAgICAgIHRoaXMuWVtpXVtkXSA9IHlvbGQgLSBlO1xuICAgICAgICAgIGNvbnN0IGNnMSA9IHRoaXMuY29zdEdyYWQodGhpcy5ZKTtcblxuICAgICAgICAgIGNvbnN0IGFuYWx5dGljID0gZ3JhZFtpXVtkXTtcbiAgICAgICAgICBjb25zdCBudW1lcmljYWwgPSAoY2cwLmNvc3QgLSBjZzEuY29zdCkgLyAoMiAqIGUpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKGkgKyAnLCcgKyBkICsgJzogZ3JhZGNoZWNrIGFuYWx5dGljOiAnICsgYW5hbHl0aWMgKyAnIHZzLiBudW1lcmljYWw6ICcgKyBudW1lcmljYWwpO1xuXG4gICAgICAgICAgdGhpcy5ZW2ldW2RdID0geW9sZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcXVBcnI/OiBGbG9hdDMyQXJyYXk7XG4gICAgLy8gcmV0dXJuIGNvc3QgYW5kIGdyYWRpZW50LCBnaXZlbiBhbiBhcnJhbmdlbWVudFxuICAgIHB1YmxpYyBjb3N0R3JhZChZOiBudW1iZXJbXVtdKSB7XG4gICAgICBjb25zdCBOID0gdGhpcy5OO1xuICAgICAgY29uc3QgZGltID0gdGhpcy5kaW07IC8vIGRpbSBvZiBvdXRwdXQgc3BhY2VcbiAgICAgIGNvbnN0IFAgPSB0aGlzLlA7XG5cbiAgICAgIGNvbnN0IHBtdWwgPSB0aGlzLml0ZXIgPCAxMDAgPyA0IDogMTsgLy8gdHJpY2sgdGhhdCBoZWxwcyB3aXRoIGxvY2FsIG9wdGltYVxuXG4gICAgICAvLyBjb21wdXRlIGN1cnJlbnQgUSBkaXN0cmlidXRpb24sIHVubm9ybWFsaXplZCBmaXJzdFxuICAgICAgdGhpcy5xdUFyciA/Pz0gdGhpcy56ZXJvcyhOICogTik7XG4gICAgICBsZXQgcXN1bSA9IDAuMDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTjsgaSsrKSB7XG4gICAgICAgIGZvciAobGV0IGogPSBpICsgMTsgaiA8IE47IGorKykge1xuICAgICAgICAgIGNvbnN0IGRzdW0gPSBuZXcgQXJyYXkoZGltKS5yZWR1Y2UoKHByZXYsIF8sIGQpID0+IHByZXYgKyBNYXRoLnBvdyhZW2ldW2RdIC0gWVtqXVtkXSwgMiksIDApO1xuICAgICAgICAgIGNvbnN0IHF1ID0gMS4wIC8gKDEuMCArIGRzdW0pOyAvLyBTdHVkZW50IHQtZGlzdHJpYnV0aW9uXG4gICAgICAgICAgdGhpcy5xdUFycltpICogTiArIGpdID0gcXU7XG4gICAgICAgICAgdGhpcy5xdUFycltqICogTiArIGldID0gcXU7XG4gICAgICAgICAgcXN1bSArPSAyICogcXU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIG5vcm1hbGl6ZSBRIGRpc3RyaWJ1dGlvbiB0byBzdW0gdG8gMVxuICAgICAgLy9jb25zdCBOTiA9IE4gKiBOO1xuICAgICAgLy9jb25zdCBRID0gdGhpcy56ZXJvcyhOTik7XG4gICAgICBsZXQgY29zdCA9IDAuMDtcbiAgICAgIGNvbnN0IGdyYWQgPSBuZXcgQXJyYXkoTikuZmlsbChudWxsKS5tYXAoKCkgPT4gKG5ldyBGbG9hdDMyQXJyYXkoZGltKSkuZmlsbCgwLjApKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTjsgaSsrKSB7XG4gICAgICAgIC8vIGNvbnN0IGdzdW0gPSBuZXcgRmxvYXQzMkFycmF5KGRpbSkuZmlsbCgwLjApOyAvLyBpbml0IGdyYWQgZm9yIHBvaW50IGlcbiAgICAgICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgTjsgaisrKSB7XG4gICAgICAgICAgY29uc3QgUSA9IE1hdGgubWF4KHRoaXMucXVBcnJbaSAqIE4gKyBqXSAvIHFzdW0sIDFlLTEwMCk7XG4gICAgICAgICAgY29zdCArPSAoLSBQW2kgKiBOICsgal0gKiBNYXRoLmxvZyhRKSkgKiAyOyAvLyBhY2N1bXVsYXRlIGNvc3QgKHRoZSBub24tY29uc3RhbnQgcG9ydGlvbiBhdCBsZWFzdC4uLilcbiAgICAgICAgICBjb25zdCBwcmVtdWx0ID0gNCAqIChwbXVsICogUFtpICogTiArIGpdIC0gUSkgKiB0aGlzLnF1QXJyW2kgKiBOICsgal07XG4gICAgICAgICAgLy9jb25zb2xlLmxvZyhwcmVtdWx0LCBRLCBpLCBqKTtcbiAgICAgICAgICBmb3IgKGxldCBkID0gMDsgZCA8IGRpbTsgZCsrKSB7XG4gICAgICAgICAgICBncmFkW2ldW2RdICs9IHByZW11bHQgKiAoWVtpXVtkXSAtIFlbal1bZF0pO1xuICAgICAgICAgICAgZ3JhZFtqXVtkXSArPSBwcmVtdWx0ICogKFlbal1bZF0gLSBZW2ldW2RdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy9ncmFkW2ldID0gZ3N1bTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtjb3N0LCBncmFkfTtcbiAgICB9XG59XG4iXX0=","/** Proxy for DistanceMatrix class. Allows to index matrix as matrix[i][j]\n * Note: much slower than direct indexing, but still much faster than recalculating distances.\n * will be used for T-SNE mainly.\n * @param {Float32Array}condensedArray - array of distances between all pairs of objects\n * @param {number}size - number of comparebles in matrix\n * @return {Float32Array} - proxy for condensedArray\n*/\nexport function distanceMatrixProxy(condensedArray, size) {\n const linearFunc = dmLinearIndex(size);\n function linearIndex(i, j) {\n const iNum = Number(i);\n const jNum = Number(j);\n return linearFunc(iNum, jNum);\n }\n function idx2Handler(idx1) {\n return ({\n get(target, idx2, _receiver) {\n if (idx1 === idx2)\n return 0;\n const linearIdx = Number(idx1) > Number(idx2) ? linearIndex(idx2, idx1) : linearIndex(idx1, idx2);\n return target[linearIdx];\n },\n });\n }\n const idx1Handler = {\n get(target, idx1, _receiver) {\n if (idx1 === 'length')\n return size;\n return new Proxy(target, idx2Handler(idx1));\n },\n };\n return new Proxy(condensedArray, idx1Handler);\n}\nexport function dmLinearIndex(size) {\n return (i, j) => size * i + j - Math.floor(((i + 2) * (i + 1)) / 2);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJveHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJwcm94eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQTs7Ozs7O0VBTUU7QUFDRixNQUFNLFVBQVUsbUJBQW1CLENBQUMsY0FBNEIsRUFBRSxJQUFZO0lBQzVFLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2QyxTQUFTLFdBQVcsQ0FBQyxDQUFrQixFQUFFLENBQWtCO1FBQ3pELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2QixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkIsT0FBTyxVQUFVLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCxTQUFTLFdBQVcsQ0FBQyxJQUFxQjtRQUN4QyxPQUFPLENBQ0w7WUFDRSxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTO2dCQUN6QixJQUFJLElBQUksS0FBSyxJQUFJO29CQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUM1QixNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNsRyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMzQixDQUFDO1NBQ0YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUNELE1BQU0sV0FBVyxHQUErQjtRQUM5QyxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTO1lBQ3pCLElBQUksSUFBSSxLQUFLLFFBQVE7Z0JBQUUsT0FBTyxJQUFJLENBQUM7WUFDbkMsT0FBTyxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDOUMsQ0FBQztLQUNGLENBQUM7SUFFRixPQUFPLElBQUksS0FBSyxDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsQ0FBQztBQUNoRCxDQUFDO0FBRUQsTUFBTSxVQUFVLGFBQWEsQ0FBQyxJQUFZO0lBQ3hDLE9BQU8sQ0FBQyxDQUFTLEVBQUUsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN0RixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXG5cbi8qKiBQcm94eSBmb3IgRGlzdGFuY2VNYXRyaXggY2xhc3MuIEFsbG93cyB0byBpbmRleCBtYXRyaXggYXMgbWF0cml4W2ldW2pdXG4gKiBOb3RlOiBtdWNoIHNsb3dlciB0aGFuIGRpcmVjdCBpbmRleGluZywgYnV0IHN0aWxsIG11Y2ggZmFzdGVyIHRoYW4gcmVjYWxjdWxhdGluZyBkaXN0YW5jZXMuXG4gKiB3aWxsIGJlIHVzZWQgZm9yIFQtU05FIG1haW5seS5cbiAqIEBwYXJhbSB7RmxvYXQzMkFycmF5fWNvbmRlbnNlZEFycmF5IC0gYXJyYXkgb2YgZGlzdGFuY2VzIGJldHdlZW4gYWxsIHBhaXJzIG9mIG9iamVjdHNcbiAqIEBwYXJhbSB7bnVtYmVyfXNpemUgLSBudW1iZXIgb2YgY29tcGFyZWJsZXMgaW4gbWF0cml4XG4gKiBAcmV0dXJuIHtGbG9hdDMyQXJyYXl9IC0gcHJveHkgZm9yIGNvbmRlbnNlZEFycmF5XG4qL1xuZXhwb3J0IGZ1bmN0aW9uIGRpc3RhbmNlTWF0cml4UHJveHkoY29uZGVuc2VkQXJyYXk6IEZsb2F0MzJBcnJheSwgc2l6ZTogbnVtYmVyKTogRmxvYXQzMkFycmF5IHtcbiAgY29uc3QgbGluZWFyRnVuYyA9IGRtTGluZWFySW5kZXgoc2l6ZSk7XG4gIGZ1bmN0aW9uIGxpbmVhckluZGV4KGk6IHN5bWJvbCB8IHN0cmluZywgajogc3ltYm9sIHwgc3RyaW5nKSB7XG4gICAgY29uc3QgaU51bSA9IE51bWJlcihpKTtcbiAgICBjb25zdCBqTnVtID0gTnVtYmVyKGopO1xuICAgIHJldHVybiBsaW5lYXJGdW5jKGlOdW0sIGpOdW0pO1xuICB9XG5cbiAgZnVuY3Rpb24gaWR4MkhhbmRsZXIoaWR4MTogc3ltYm9sIHwgc3RyaW5nKTpQcm94eUhhbmRsZXI8RmxvYXQzMkFycmF5PiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHtcbiAgICAgICAgZ2V0KHRhcmdldCwgaWR4MiwgX3JlY2VpdmVyKSB7XG4gICAgICAgICAgaWYgKGlkeDEgPT09IGlkeDIpIHJldHVybiAwO1xuICAgICAgICAgIGNvbnN0IGxpbmVhcklkeCA9IE51bWJlcihpZHgxKSA+IE51bWJlcihpZHgyKSA/IGxpbmVhckluZGV4KGlkeDIsIGlkeDEpIDogbGluZWFySW5kZXgoaWR4MSwgaWR4Mik7XG4gICAgICAgICAgcmV0dXJuIHRhcmdldFtsaW5lYXJJZHhdO1xuICAgICAgICB9LFxuICAgICAgfVxuICAgICk7XG4gIH1cbiAgY29uc3QgaWR4MUhhbmRsZXI6IFByb3h5SGFuZGxlcjxGbG9hdDMyQXJyYXk+ID0ge1xuICAgIGdldCh0YXJnZXQsIGlkeDEsIF9yZWNlaXZlcikge1xuICAgICAgaWYgKGlkeDEgPT09ICdsZW5ndGgnKSByZXR1cm4gc2l6ZTtcbiAgICAgIHJldHVybiBuZXcgUHJveHkodGFyZ2V0LCBpZHgySGFuZGxlcihpZHgxKSk7XG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4gbmV3IFByb3h5KGNvbmRlbnNlZEFycmF5LCBpZHgxSGFuZGxlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkbUxpbmVhckluZGV4KHNpemU6IG51bWJlcik6IChpOiBudW1iZXIsIGo6IG51bWJlcikgPT4gbnVtYmVyIHtcbiAgcmV0dXJuIChpOiBudW1iZXIsIGo6IG51bWJlcikgPT4gc2l6ZSAqIGkgKyBqIC0gTWF0aC5mbG9vcigoKGkgKyAyKSAqIChpICsgMSkpIC8gMik7XG59XG4iXX0=","import { Vector } from '@datagrok-libraries/utils/src/type-declarations';\nimport { AvailableMetrics, Measure, isBitArrayMetric } from '../typed-metrics';\nimport { DistanceMatrixService } from '../distance-matrix';\nimport { UMAP } from '../umap';\nimport { assert, transposeMatrix } from '@datagrok-libraries/utils/src/vector-operations';\nimport { SparseMatrixService } from '../distance-matrix/sparse-matrix-service';\nimport BitArray from '@datagrok-libraries/utils/src/bit-array';\nimport seedRandom from 'seedrandom';\n//import {TSNE} from '@keckelt/tsne';\nimport { TSNE } from '../t-sne/t-sne';\nclass MultiColumnReducer {\n data;\n weights;\n aggregationMethod;\n constructor(options) {\n this.data = options.data;\n this.weights = options.weights;\n this.aggregationMethod = options.aggregationMethod;\n }\n}\nclass TSNEReducer extends MultiColumnReducer {\n reducer;\n iterations;\n distanceFnames;\n distanceFns;\n distanceFnArgs;\n progressFunc;\n /**\n * Creates an instance of TSNEReducer.\n * @param {Options} options Options to pass to the constructor.\n * @memberof TSNEReducer\n */\n constructor(options) {\n super(options);\n const randomSeed = options.randomSeed ?? Date();\n const randomFn = seedRandom(randomSeed);\n options.random = randomFn;\n this.reducer = new TSNE(options);\n this.iterations = options?.iterations ?? this.reducer.getIterSize(this.data[0].length);\n this.distanceFnames = options.distanceFnames;\n this.distanceFns = options.distanceFns;\n this.distanceFnArgs = options.distanceFnArgs;\n this.progressFunc = options.progressFunc;\n }\n /**\n * Embeds the data given into the two-dimensional space using t-SNE method.\\\n * @param {boolean} [parallelDistanceWorkers] Whether to use parallel distance workers.\n * @return {any} Cartesian coordinate of this embedding and distance matrix where applicable.\n */\n async transform() {\n if (this.data[0].length > 10000)\n throw new Error('Maximum number of samples for T-SNE is 10000');\n const matrixService = new DistanceMatrixService(true, false);\n try {\n // const aggregate = getAggregationFunction(this.aggregationMethod, this.weights);\n // const distances: Array<Float32Array> = [];\n // for (let i = 0; i < this.data.length; ++i) {\n // const dist = await matrixService.calc(this.data[i], this.distanceFnames[i], false, this.distanceFnArgs[i]);\n // distances.push(dist);\n // }\n // const distance = new Float32Array(distances[0].length).fill(0);\n // for (let i = 0; i < distances[0].length; ++i)\n // distance[i] = aggregate(distances.map((d) => d[i]));\n const distance = await matrixService.calcMulti(this.data, this.distanceFnames, false, this.distanceFnArgs, this.weights, this.aggregationMethod);\n matrixService.terminate();\n // const matrixProxy = distanceMatrixProxy(distance, this.data[0].length);\n this.reducer.initDataDist(distance, this.data[0].length);\n for (let i = 0; i < this.iterations; ++i) {\n this.reducer.step(); // every time you call this, solution gets better\n if (this.progressFunc)\n this.progressFunc(i, this.iterations, []);\n }\n return this.reducer.getSolution();\n }\n catch (e) {\n matrixService.terminate();\n throw e;\n }\n }\n}\nclass UMAPReducer extends MultiColumnReducer {\n reducer;\n distanceFnames;\n distanceFns;\n vectors;\n progressFunc;\n distanceFnArgs;\n /**\n * Creates an instance of UMAPReducer.\n * @param {Options} options Options to pass to the constructor.\n * @memberof UMAPReducer\n */\n constructor(options) {\n const randomSeed = options.randomSeed ?? Date();\n const randomFn = seedRandom(randomSeed);\n super(options);\n assert('distanceFnames' in options);\n assert('distanceFns' in options);\n this.distanceFnArgs = options.distanceFnArgs;\n this.distanceFns = options.distanceFns;\n this.progressFunc = options.progressFunc;\n this.distanceFnames = options.distanceFnames;\n //Umap uses vector indexing, so we need to create an array of vectors as indeces.\n this.vectors = new Array(this.data[0].length).fill(0).map((_, i) => i);\n if (this.data[0].length <= (options.nNeighbors ?? 15))\n options.nNeighbors = this.data[0].length - 1;\n options.random = randomFn;\n this.reducer = new UMAP(options);\n // this.reducer.distanceFn = this._encodedDistance.bind(this);\n }\n /**\n * Embeds the data given into the two-dimensional space using UMAP method.\n * @param {boolean} [_parallelDistanceWorkers] Whether to use parallel distance matrix workers.\n * @return {any} Cartesian coordinate of this embedding.\n */\n async transform(_parallelDistanceWorkers) {\n console.time('knn graph');\n const knnRes = await new SparseMatrixService()\n .multiColumnKNN(this.data, this.distanceFnames, this.reducer.neighbors, this.distanceFnArgs, this.weights, this.aggregationMethod);\n console.timeEnd('knn graph');\n this.reducer.setPrecomputedKNN(knnRes.knnIndexes, knnRes.knnDistances);\n // needed so that garbage collector can free memory from distance matrix\n await new Promise((resolve) => {\n setTimeout(() => {\n resolve();\n }, 300);\n });\n const embedding = await this.reducer.fitAsync(this.vectors, (epoc) => {\n if (this.progressFunc)\n this.progressFunc(epoc, this.reducer.getNEpochs(), this.reducer.getEmbedding());\n });\n function arrayCast2Coordinates(data) {\n return new Array(data.length).fill(0).map((_, i) => (Vector.from(data[i])));\n }\n return arrayCast2Coordinates(embedding);\n }\n}\nconst AvailableReducers = {\n 'UMAP': UMAPReducer,\n 't-SNE': TSNEReducer,\n};\nexport class MultiColDimReducer {\n reducer;\n /**\n * Creates an instance of DimensionalityReducer.\n * @param {any[]} data Vectors to embed.\n * @param {KnownMethods} method Embedding method to be applied\n * @param {KnownMetrics} metric Distance metric to be computed between each of the vectors.\n * @param {Options} [options] Options to pass to the implementing embedders.\n * @memberof DimensionalityReducer\n */\n constructor(data, method, metrics, weights, distanceAggregation, options) {\n const measures = [];\n for (let idx = 0; idx < metrics.length; ++idx) {\n const measure = new Measure(metrics[idx]).getMeasure(options.distanceFnArgs[idx]);\n measures.push(measure);\n let bitArrayLength = 2048;\n for (let i = 0; i < data[idx].length; ++i) {\n if (data[idx][i] && data[idx][i]._length) {\n bitArrayLength = data[idx][i]._length;\n break;\n }\n }\n if (isBitArrayMetric(metrics[idx])) {\n for (let i = 0; i < data[idx].length; ++i) {\n if (data[idx][i] && data[idx][i]._data)\n data[idx][i] = new BitArray(data[idx][i]._data, data[idx][i]._length);\n else\n data[idx][i] = new BitArray(bitArrayLength);\n }\n }\n }\n if (method == 'UMAP') {\n this.reducer = new UMAPReducer({\n data: data,\n distanceFnames: metrics,\n distanceFns: measures,\n distanceFnArgs: options.distanceFnArgs,\n weights: weights,\n aggregationMethod: distanceAggregation,\n ...options\n });\n }\n else if (method == 't-SNE') {\n this.reducer = new TSNEReducer({\n data: data,\n distanceFnames: metrics,\n distanceFns: measures,\n distanceFnArgs: options.distanceFnArgs,\n weights: weights,\n aggregationMethod: distanceAggregation,\n ...options\n });\n }\n }\n /**\n * Embeds the data given into the two-dimensional space using the chosen method.\n *\n * @param {boolean} transpose Whether to transform coordinates to have columns-first orientation.\n * @param {boolean} parallelDistanceWorkers Whether to use parallel distance computation.\n * @throws {Error} If the embedding method was not found.\n * @return {any} Cartesian coordinate of this embedding and distance matrix where applicable.\n * @memberof DimensionalityReducer\n */\n async transform(transpose = false) {\n if (this.reducer === undefined)\n throw new Error('Reducer was not defined.');\n let embedding = await this.reducer.transform();\n if (transpose)\n embedding = transposeMatrix(embedding);\n return embedding;\n }\n /**\n * Returns metrics available by type.\n *\n * @param {AvailableDataTypes} typeName type name\n * @return {string[]} Metric names which expects the given data type\n * @memberof DimensionalityReducer\n */\n static availableMetricsByType(typeName) {\n return Object.keys(AvailableMetrics[typeName]);\n }\n /**\n * Returns dimensionality reduction methods available.\n *\n * @readonly\n * @memberof DimensionalityReducer\n */\n static get availableMethods() {\n return Object.keys(AvailableReducers);\n }\n /**\n * Returns metrics available.\n *\n * @readonly\n * @memberof DimensionalityReducer\n */\n static get availableMetrics() {\n let ans = [];\n Object.values(AvailableMetrics).forEach((obj) => {\n const array = Object.values(obj);\n ans = [...ans, ...array];\n });\n return ans;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktY29sdW1uLWRpbS1yZWR1Y2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibXVsdGktY29sdW1uLWRpbS1yZWR1Y2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBK0MsTUFBTSxFQUFVLE1BQy9ELGlEQUFpRCxDQUFDO0FBQ3pELE9BQU8sRUFBcUIsZ0JBQWdCLEVBQWdCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQy9HLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRXpELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDN0IsT0FBTyxFQUFDLE1BQU0sRUFBRSxlQUFlLEVBQUMsTUFBTSxpREFBaUQsQ0FBQztBQUN4RixPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSwwQ0FBMEMsQ0FBQztBQUU3RSxPQUFPLFFBQVEsTUFBTSx5Q0FBeUMsQ0FBQztBQUMvRCxPQUFPLFVBQVUsTUFBTSxZQUFZLENBQUM7QUFDcEMscUNBQXFDO0FBQ3JDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQThCcEMsTUFBZSxrQkFBa0I7SUFDbkIsSUFBSSxDQUFZO0lBQ2hCLE9BQU8sQ0FBVztJQUNsQixpQkFBaUIsQ0FBNEI7SUFDdkQsWUFBWSxPQUFnQjtRQUMxQixJQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDekIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQy9CLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUM7SUFDckQsQ0FBQztDQUtKO0FBRUQsTUFBTSxXQUFZLFNBQVEsa0JBQWtCO0lBQzlCLE9BQU8sQ0FBTztJQUNkLFVBQVUsQ0FBUztJQUNuQixjQUFjLENBQWlCO0lBQy9CLFdBQVcsQ0FBaUM7SUFDNUMsY0FBYyxDQUF1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QzNCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0Nvb3JkaW5hdGVzLCBEaXN0YW5jZU1ldHJpYywgTWF0cml4LCBPcHRpb25zLCBWZWN0b3IsIFZlY3RvcnN9XG4gIGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL3R5cGUtZGVjbGFyYXRpb25zJztcbmltcG9ydCB7QXZhaWxhYmxlRGF0YVR5cGVzLCBBdmFpbGFibGVNZXRyaWNzLCBLbm93bk1ldHJpY3MsIE1lYXN1cmUsIGlzQml0QXJyYXlNZXRyaWN9IGZyb20gJy4uL3R5cGVkLW1ldHJpY3MnO1xuaW1wb3J0IHtEaXN0YW5jZU1hdHJpeFNlcnZpY2V9IGZyb20gJy4uL2Rpc3RhbmNlLW1hdHJpeCc7XG5pbXBvcnQge0Rpc3RhbmNlQWdncmVnYXRpb25NZXRob2R9IGZyb20gJy4uL2Rpc3RhbmNlLW1hdHJpeC90eXBlcyc7XG5pbXBvcnQge1VNQVB9IGZyb20gJy4uL3VtYXAnO1xuaW1wb3J0IHthc3NlcnQsIHRyYW5zcG9zZU1hdHJpeH0gZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy91dGlscy9zcmMvdmVjdG9yLW9wZXJhdGlvbnMnO1xuaW1wb3J0IHtTcGFyc2VNYXRyaXhTZXJ2aWNlfSBmcm9tICcuLi9kaXN0YW5jZS1tYXRyaXgvc3BhcnNlLW1hdHJpeC1zZXJ2aWNlJztcbmltcG9ydCB7RGltUmVkdWN0aW9uTWV0aG9kc30gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgQml0QXJyYXkgZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy91dGlscy9zcmMvYml0LWFycmF5JztcbmltcG9ydCBzZWVkUmFuZG9tIGZyb20gJ3NlZWRyYW5kb20nO1xuLy9pbXBvcnQge1RTTkV9IGZyb20gJ0BrZWNrZWx0L3RzbmUnO1xuaW1wb3J0IHtUU05FfSBmcm9tICcuLi90LXNuZS90LXNuZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVVNQVBPcHRpb25zIHtcbiAgICBsZWFybmluZ1JhdGU/OiBudW1iZXI7XG4gICAgbkNvbXBvbmVudHM/OiBudW1iZXI7XG4gICAgbkVwb2Nocz86IG51bWJlcjtcbiAgICBuTmVpZ2hib3JzPzogbnVtYmVyO1xuICAgIHNwcmVhZD86IG51bWJlcjtcbiAgICBtaW5EaXN0PzogbnVtYmVyO1xuICAgIHByb2dyZXNzRnVuYz86IChlcG9jOiBudW1iZXIsIGVwb2Noc0xlbmd0aDogbnVtYmVyLCBlbWJlZGRpbmdzOiBudW1iZXJbXVtdKSA9PiB2b2lkO1xuICAgIHJhbmRvbVNlZWQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVRTTkVPcHRpb25zIHtcbiAgICBlcHNpbG9uPzogbnVtYmVyO1xuICAgIHBlcnBsZXhpdHk/OiBudW1iZXI7XG4gICAgZGltPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElEaW1SZWR1Y3Rpb25QYXJhbTxUIGV4dGVuZHMgbnVtYmVyIHwgc3RyaW5nID0gbnVtYmVyPiB7XG4gICAgdWlOYW1lOiBzdHJpbmc7XG4gICAgdmFsdWU6IChUIGV4dGVuZHMgbnVtYmVyID8gbnVtYmVyIDogc3RyaW5nKSB8IG51bGw7XG4gICAgdG9vbHRpcDogc3RyaW5nO1xuICAgIHR5cGU/OiBUIGV4dGVuZHMgbnVtYmVyID8gJ251bWJlcicgOiAnc3RyaW5nJztcbiAgICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgICBtaW4/OiBudW1iZXI7XG4gICAgbWF4PzogbnVtYmVyO1xuICAgIHN0ZXA/OiBudW1iZXI7XG59XG5cbmFic3RyYWN0IGNsYXNzIE11bHRpQ29sdW1uUmVkdWNlciB7XG4gICAgcHJvdGVjdGVkIGRhdGE6IFZlY3RvcnNbXTtcbiAgICBwcm90ZWN0ZWQgd2VpZ2h0czogbnVtYmVyW107XG4gICAgcHJvdGVjdGVkIGFnZ3JlZ2F0aW9uTWV0aG9kOiBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kO1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE9wdGlvbnMpIHtcbiAgICAgIHRoaXMuZGF0YSA9IG9wdGlvbnMuZGF0YTtcbiAgICAgIHRoaXMud2VpZ2h0cyA9IG9wdGlvbnMud2VpZ2h0cztcbiAgICAgIHRoaXMuYWdncmVnYXRpb25NZXRob2QgPSBvcHRpb25zLmFnZ3JlZ2F0aW9uTWV0aG9kO1xuICAgIH1cblxuICAgIC8qKiBFbWJlZHMgdGhlIGRhdGEgZ2l2ZW4gaW50byB0aGUgdHdvLWRpbWVuc2lvbmFsIHNwYWNlLlxuICAgICAqIEByZXR1cm4ge2FueX0gQ2FydGVzaWFuIGNvb3JkaW5hdGUgb2YgdGhpcyBlbWJlZGRpbmcgYW5kIGRpc3RhbmNlIG1hdHJpeCB3aGVyZSBhcHBsaWNhYmxlLiAqL1xuICAgIGFic3RyYWN0IHRyYW5zZm9ybSgpOiBQcm9taXNlPE1hdHJpeD47XG59XG5cbmNsYXNzIFRTTkVSZWR1Y2VyIGV4dGVuZHMgTXVsdGlDb2x1bW5SZWR1Y2VyIHtcbiAgICBwcm90ZWN0ZWQgcmVkdWNlcjogVFNORTtcbiAgICBwcm90ZWN0ZWQgaXRlcmF0aW9uczogbnVtYmVyO1xuICAgIHByb3RlY3RlZCBkaXN0YW5jZUZuYW1lczogS25vd25NZXRyaWNzW107XG4gICAgcHJvdGVjdGVkIGRpc3RhbmNlRm5zOiAoKGE6IGFueSwgYjogYW55KSA9PiBudW1iZXIpW107XG4gICAgcHJvdGVjdGVkIGRpc3RhbmNlRm5BcmdzOiB7W186IHN0cmluZ106IGFueX1bXTtcbiAgICBwcm90ZWN0ZWQgcHJvZ3Jlc3NGdW5jPzogKGVwb2M6IG51bWJlciwgZXBvY2hzTGVuZ3RoOiBudW1iZXIsIGVtYmVkZGluZ3M/OiBudW1iZXJbXVtdKSA9PiB2b2lkO1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgVFNORVJlZHVjZXIuXG4gICAgICogQHBhcmFtIHtPcHRpb25zfSBvcHRpb25zIE9wdGlvbnMgdG8gcGFzcyB0byB0aGUgY29uc3RydWN0b3IuXG4gICAgICogQG1lbWJlcm9mIFRTTkVSZWR1Y2VyXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogT3B0aW9ucykge1xuICAgICAgc3VwZXIob3B0aW9ucyk7XG4gICAgICBjb25zdCByYW5kb21TZWVkOiBzdHJpbmcgPSBvcHRpb25zLnJhbmRvbVNlZWQgPz8gRGF0ZSgpO1xuICAgICAgY29uc3QgcmFuZG9tRm4gPSBzZWVkUmFuZG9tKHJhbmRvbVNlZWQpO1xuICAgICAgb3B0aW9ucy5yYW5kb20gPSByYW5kb21GbjtcbiAgICAgIHRoaXMucmVkdWNlciA9IG5ldyBUU05FKG9wdGlvbnMpO1xuICAgICAgdGhpcy5pdGVyYXRpb25zID0gb3B0aW9ucz8uaXRlcmF0aW9ucyA/PyB0aGlzLnJlZHVjZXIuZ2V0SXRlclNpemUodGhpcy5kYXRhWzBdLmxlbmd0aCk7XG4gICAgICB0aGlzLmRpc3RhbmNlRm5hbWVzID0gb3B0aW9ucy5kaXN0YW5jZUZuYW1lcztcbiAgICAgIHRoaXMuZGlzdGFuY2VGbnMgPSBvcHRpb25zLmRpc3RhbmNlRm5zO1xuICAgICAgdGhpcy5kaXN0YW5jZUZuQXJncyA9IG9wdGlvbnMuZGlzdGFuY2VGbkFyZ3M7XG4gICAgICB0aGlzLnByb2dyZXNzRnVuYyA9IG9wdGlvbnMucHJvZ3Jlc3NGdW5jO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVtYmVkcyB0aGUgZGF0YSBnaXZlbiBpbnRvIHRoZSB0d28tZGltZW5zaW9uYWwgc3BhY2UgdXNpbmcgdC1TTkUgbWV0aG9kLlxcXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbcGFyYWxsZWxEaXN0YW5jZVdvcmtlcnNdIFdoZXRoZXIgdG8gdXNlIHBhcmFsbGVsIGRpc3RhbmNlIHdvcmtlcnMuXG4gICAgICogQHJldHVybiB7YW55fSBDYXJ0ZXNpYW4gY29vcmRpbmF0ZSBvZiB0aGlzIGVtYmVkZGluZyBhbmQgZGlzdGFuY2UgbWF0cml4IHdoZXJlIGFwcGxpY2FibGUuXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHRyYW5zZm9ybSgpOiBQcm9taXNlPE1hdHJpeD4ge1xuICAgICAgaWYgKHRoaXMuZGF0YVswXS5sZW5ndGggPiAxMDAwMClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNYXhpbXVtIG51bWJlciBvZiBzYW1wbGVzIGZvciBULVNORSBpcyAxMDAwMCcpO1xuICAgICAgY29uc3QgbWF0cml4U2VydmljZSA9IG5ldyBEaXN0YW5jZU1hdHJpeFNlcnZpY2UodHJ1ZSwgZmFsc2UpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gY29uc3QgYWdncmVnYXRlID0gZ2V0QWdncmVnYXRpb25GdW5jdGlvbih0aGlzLmFnZ3JlZ2F0aW9uTWV0aG9kLCB0aGlzLndlaWdodHMpO1xuICAgICAgICAvLyBjb25zdCBkaXN0YW5jZXM6IEFycmF5PEZsb2F0MzJBcnJheT4gPSBbXTtcbiAgICAgICAgLy8gZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmRhdGEubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgLy8gICBjb25zdCBkaXN0ID0gYXdhaXQgbWF0cml4U2VydmljZS5jYWxjKHRoaXMuZGF0YVtpXSwgdGhpcy5kaXN0YW5jZUZuYW1lc1tpXSwgZmFsc2UsIHRoaXMuZGlzdGFuY2VGbkFyZ3NbaV0pO1xuICAgICAgICAvLyAgIGRpc3RhbmNlcy5wdXNoKGRpc3QpO1xuICAgICAgICAvLyB9XG4gICAgICAgIC8vIGNvbnN0IGRpc3RhbmNlID0gbmV3IEZsb2F0MzJBcnJheShkaXN0YW5jZXNbMF0ubGVuZ3RoKS5maWxsKDApO1xuICAgICAgICAvLyBmb3IgKGxldCBpID0gMDsgaSA8IGRpc3RhbmNlc1swXS5sZW5ndGg7ICsraSlcbiAgICAgICAgLy8gICBkaXN0YW5jZVtpXSA9IGFnZ3JlZ2F0ZShkaXN0YW5jZXMubWFwKChkKSA9PiBkW2ldKSk7XG4gICAgICAgIGNvbnN0IGRpc3RhbmNlID0gYXdhaXQgbWF0cml4U2VydmljZS5jYWxjTXVsdGkodGhpcy5kYXRhLCB0aGlzLmRpc3RhbmNlRm5hbWVzLCBmYWxzZSwgdGhpcy5kaXN0YW5jZUZuQXJncyxcbiAgICAgICAgICB0aGlzLndlaWdodHMsIHRoaXMuYWdncmVnYXRpb25NZXRob2QpO1xuICAgICAgICBtYXRyaXhTZXJ2aWNlLnRlcm1pbmF0ZSgpO1xuICAgICAgICAvLyBjb25zdCBtYXRyaXhQcm94eSA9IGRpc3RhbmNlTWF0cml4UHJveHkoZGlzdGFuY2UsIHRoaXMuZGF0YVswXS5sZW5ndGgpO1xuICAgICAgICB0aGlzLnJlZHVjZXIuaW5pdERhdGFEaXN0KGRpc3RhbmNlLCB0aGlzLmRhdGFbMF0ubGVuZ3RoKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuaXRlcmF0aW9uczsgKytpKSB7XG4gICAgICAgICAgdGhpcy5yZWR1Y2VyLnN0ZXAoKTsgLy8gZXZlcnkgdGltZSB5b3UgY2FsbCB0aGlzLCBzb2x1dGlvbiBnZXRzIGJldHRlclxuICAgICAgICAgIGlmICh0aGlzLnByb2dyZXNzRnVuYylcbiAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3NGdW5jKGksIHRoaXMuaXRlcmF0aW9ucywgW10pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnJlZHVjZXIuZ2V0U29sdXRpb24oKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbWF0cml4U2VydmljZS50ZXJtaW5hdGUoKTtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9XG59XG5cbmNsYXNzIFVNQVBSZWR1Y2VyIGV4dGVuZHMgTXVsdGlDb2x1bW5SZWR1Y2VyIHtcbiAgICBwcm90ZWN0ZWQgcmVkdWNlcjogVU1BUDtcbiAgICBwcm90ZWN0ZWQgZGlzdGFuY2VGbmFtZXM6IEtub3duTWV0cmljc1tdO1xuICAgIHByb3RlY3RlZCBkaXN0YW5jZUZuczogRnVuY3Rpb25bXTtcbiAgICBwcm90ZWN0ZWQgdmVjdG9yczogbnVtYmVyW107XG4gICAgcHJvdGVjdGVkIHByb2dyZXNzRnVuYz86IChlcG9jOiBudW1iZXIsIGVwb2Noc0xlbmd0aDogbnVtYmVyLCBlbWJlZGRpbmc6IG51bWJlcltdW10pID0+IHZvaWQ7XG4gICAgcHJvdGVjdGVkIGRpc3RhbmNlRm5BcmdzOiB7W186IHN0cmluZ106IGFueX1bXTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIFVNQVBSZWR1Y2VyLlxuICAgICAqIEBwYXJhbSB7T3B0aW9uc30gb3B0aW9ucyBPcHRpb25zIHRvIHBhc3MgdG8gdGhlIGNvbnN0cnVjdG9yLlxuICAgICAqIEBtZW1iZXJvZiBVTUFQUmVkdWNlclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHJhbmRvbVNlZWQ6IHN0cmluZyA9IG9wdGlvbnMucmFuZG9tU2VlZCA/PyBEYXRlKCk7XG4gICAgICBjb25zdCByYW5kb21GbiA9IHNlZWRSYW5kb20ocmFuZG9tU2VlZCk7XG4gICAgICBzdXBlcihvcHRpb25zKTtcbiAgICAgIGFzc2VydCgnZGlzdGFuY2VGbmFtZXMnIGluIG9wdGlvbnMpO1xuICAgICAgYXNzZXJ0KCdkaXN0YW5jZUZucycgaW4gb3B0aW9ucyk7XG4gICAgICB0aGlzLmRpc3RhbmNlRm5BcmdzID0gb3B0aW9ucy5kaXN0YW5jZUZuQXJncztcbiAgICAgIHRoaXMuZGlzdGFuY2VGbnMgPSBvcHRpb25zLmRpc3RhbmNlRm5zITtcbiAgICAgIHRoaXMucHJvZ3Jlc3NGdW5jID0gb3B0aW9ucy5wcm9ncmVzc0Z1bmM7XG5cbiAgICAgIHRoaXMuZGlzdGFuY2VGbmFtZXMgPSBvcHRpb25zLmRpc3RhbmNlRm5hbWVzITtcbiAgICAgIC8vVW1hcCB1c2VzIHZlY3RvciBpbmRleGluZywgc28gd2UgbmVlZCB0byBjcmVhdGUgYW4gYXJyYXkgb2YgdmVjdG9ycyBhcyBpbmRlY2VzLlxuICAgICAgdGhpcy52ZWN0b3JzID0gbmV3IEFycmF5KHRoaXMuZGF0YVswXS5sZW5ndGgpLmZpbGwoMCkubWFwKChfLCBpKSA9PiBpKTtcblxuICAgICAgaWYgKHRoaXMuZGF0YVswXS5sZW5ndGggPD0gKG9wdGlvbnMubk5laWdoYm9ycyA/PyAxNSkpXG4gICAgICAgIG9wdGlvbnMubk5laWdoYm9ycyA9IHRoaXMuZGF0YVswXS5sZW5ndGggLSAxO1xuICAgICAgb3B0aW9ucy5yYW5kb20gPSByYW5kb21GbjtcbiAgICAgIHRoaXMucmVkdWNlciA9IG5ldyBVTUFQKG9wdGlvbnMpO1xuICAgICAgLy8gdGhpcy5yZWR1Y2VyLmRpc3RhbmNlRm4gPSB0aGlzLl9lbmNvZGVkRGlzdGFuY2UuYmluZCh0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbWJlZHMgdGhlIGRhdGEgZ2l2ZW4gaW50byB0aGUgdHdvLWRpbWVuc2lvbmFsIHNwYWNlIHVzaW5nIFVNQVAgbWV0aG9kLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW19wYXJhbGxlbERpc3RhbmNlV29ya2Vyc10gV2hldGhlciB0byB1c2UgcGFyYWxsZWwgZGlzdGFuY2UgbWF0cml4IHdvcmtlcnMuXG4gICAgICogQHJldHVybiB7YW55fSBDYXJ0ZXNpYW4gY29vcmRpbmF0ZSBvZiB0aGlzIGVtYmVkZGluZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgdHJhbnNmb3JtKF9wYXJhbGxlbERpc3RhbmNlV29ya2Vycz86IGJvb2xlYW4pOiBQcm9taXNlPE1hdHJpeD4ge1xuICAgICAgY29uc29sZS50aW1lKCdrbm4gZ3JhcGgnKTtcbiAgICAgIGNvbnN0IGtublJlcyA9IGF3YWl0IG5ldyBTcGFyc2VNYXRyaXhTZXJ2aWNlKClcbiAgICAgICAgLm11bHRpQ29sdW1uS05OKHRoaXMuZGF0YSwgdGhpcy5kaXN0YW5jZUZuYW1lcywgdGhpcy5yZWR1Y2VyLm5laWdoYm9ycyxcbiAgICAgICAgICB0aGlzLmRpc3RhbmNlRm5BcmdzLCB0aGlzLndlaWdodHMsIHRoaXMuYWdncmVnYXRpb25NZXRob2QpO1xuICAgICAgY29uc29sZS50aW1lRW5kKCdrbm4gZ3JhcGgnKTtcbiAgICAgIHRoaXMucmVkdWNlci5zZXRQcmVjb21wdXRlZEtOTihrbm5SZXMua25uSW5kZXhlcywga25uUmVzLmtubkRpc3RhbmNlcyk7XG5cbiAgICAgIC8vIG5lZWRlZCBzbyB0aGF0IGdhcmJhZ2UgY29sbGVjdG9yIGNhbiBmcmVlIG1lbW9yeSBmcm9tIGRpc3RhbmNlIG1hdHJpeFxuICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9LCAzMDApO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGVtYmVkZGluZyA9IGF3YWl0IHRoaXMucmVkdWNlci5maXRBc3luYyh0aGlzLnZlY3RvcnMsIChlcG9jKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnByb2dyZXNzRnVuYylcbiAgICAgICAgICB0aGlzLnByb2dyZXNzRnVuYyhlcG9jLCB0aGlzLnJlZHVjZXIuZ2V0TkVwb2NocygpLCB0aGlzLnJlZHVjZXIuZ2V0RW1iZWRkaW5nKCkpO1xuICAgICAgfSk7XG5cbiAgICAgIGZ1bmN0aW9uIGFycmF5Q2FzdDJDb29yZGluYXRlcyhkYXRhOiBudW1iZXJbXVtdKTogQ29vcmRpbmF0ZXMge1xuICAgICAgICByZXR1cm4gbmV3IEFycmF5KGRhdGEubGVuZ3RoKS5maWxsKDApLm1hcCgoXywgaSkgPT4gKFZlY3Rvci5mcm9tKGRhdGFbaV0pKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhcnJheUNhc3QyQ29vcmRpbmF0ZXMoZW1iZWRkaW5nKTtcbiAgICB9XG59XG5cbmNvbnN0IEF2YWlsYWJsZVJlZHVjZXJzID0ge1xuICAnVU1BUCc6IFVNQVBSZWR1Y2VyLFxuICAndC1TTkUnOiBUU05FUmVkdWNlcixcbn07XG5cbmV4cG9ydCB0eXBlIEtub3duTWV0aG9kcyA9IGtleW9mIHR5cGVvZiBBdmFpbGFibGVSZWR1Y2VycztcblxuZXhwb3J0IGNsYXNzIE11bHRpQ29sRGltUmVkdWNlciB7XG4gICAgcHJpdmF0ZSByZWR1Y2VyOiBNdWx0aUNvbHVtblJlZHVjZXIgfCB1bmRlZmluZWQ7XG4gICAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgRGltZW5zaW9uYWxpdHlSZWR1Y2VyLlxuICAgKiBAcGFyYW0ge2FueVtdfSBkYXRhIFZlY3RvcnMgdG8gZW1iZWQuXG4gICAqIEBwYXJhbSB7S25vd25NZXRob2RzfSBtZXRob2QgRW1iZWRkaW5nIG1ldGhvZCB0byBiZSBhcHBsaWVkXG4gICAqIEBwYXJhbSB7S25vd25NZXRyaWNzfSBtZXRyaWMgRGlzdGFuY2UgbWV0cmljIHRvIGJlIGNvbXB1dGVkIGJldHdlZW4gZWFjaCBvZiB0aGUgdmVjdG9ycy5cbiAgICogQHBhcmFtIHtPcHRpb25zfSBbb3B0aW9uc10gT3B0aW9ucyB0byBwYXNzIHRvIHRoZSBpbXBsZW1lbnRpbmcgZW1iZWRkZXJzLlxuICAgKiBAbWVtYmVyb2YgRGltZW5zaW9uYWxpdHlSZWR1Y2VyXG4gICAqL1xuICAgIGNvbnN0cnVjdG9yKGRhdGE6IEFycmF5PGFueVtdPiwgbWV0aG9kOiBEaW1SZWR1Y3Rpb25NZXRob2RzLCBtZXRyaWNzOiBLbm93bk1ldHJpY3NbXSxcbiAgICAgIHdlaWdodHM6IG51bWJlcltdLCBkaXN0YW5jZUFnZ3JlZ2F0aW9uOiBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kLCBvcHRpb25zOiBPcHRpb25zKSB7XG4gICAgICBjb25zdCBtZWFzdXJlczogRGlzdGFuY2VNZXRyaWNbXSA9IFtdO1xuICAgICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgbWV0cmljcy5sZW5ndGg7ICsraWR4KSB7XG4gICAgICAgIGNvbnN0IG1lYXN1cmUgPSBuZXcgTWVhc3VyZShtZXRyaWNzW2lkeF0pLmdldE1lYXN1cmUob3B0aW9ucy5kaXN0YW5jZUZuQXJnc1tpZHhdKTtcbiAgICAgICAgbWVhc3VyZXMucHVzaChtZWFzdXJlKTtcbiAgICAgICAgbGV0IGJpdEFycmF5TGVuZ3RoID0gMjA0ODtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhW2lkeF0ubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBpZiAoZGF0YVtpZHhdW2ldICYmIGRhdGFbaWR4XVtpXS5fbGVuZ3RoKSB7XG4gICAgICAgICAgICBiaXRBcnJheUxlbmd0aCA9IGRhdGFbaWR4XVtpXS5fbGVuZ3RoO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpc0JpdEFycmF5TWV0cmljKG1ldHJpY3NbaWR4XSkpIHtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGFbaWR4XS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKGRhdGFbaWR4XVtpXSAmJiBkYXRhW2lkeF1baV0uX2RhdGEpXG4gICAgICAgICAgICAgIGRhdGFbaWR4XVtpXSA9IG5ldyBCaXRBcnJheShkYXRhW2lkeF1baV0uX2RhdGEsIGRhdGFbaWR4XVtpXS5fbGVuZ3RoKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgZGF0YVtpZHhdW2ldID0gbmV3IEJpdEFycmF5KGJpdEFycmF5TGVuZ3RoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKG1ldGhvZCA9PSAnVU1BUCcpIHtcbiAgICAgICAgdGhpcy5yZWR1Y2VyID0gbmV3IFVNQVBSZWR1Y2VyKHtcbiAgICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICAgIGRpc3RhbmNlRm5hbWVzOiBtZXRyaWNzLFxuICAgICAgICAgIGRpc3RhbmNlRm5zOiBtZWFzdXJlcyxcbiAgICAgICAgICBkaXN0YW5jZUZuQXJnczogb3B0aW9ucy5kaXN0YW5jZUZuQXJncyxcbiAgICAgICAgICB3ZWlnaHRzOiB3ZWlnaHRzLFxuICAgICAgICAgIGFnZ3JlZ2F0aW9uTWV0aG9kOiBkaXN0YW5jZUFnZ3JlZ2F0aW9uLFxuICAgICAgICAgIC4uLm9wdGlvbnNcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKG1ldGhvZCA9PSAndC1TTkUnKSB7XG4gICAgICAgIHRoaXMucmVkdWNlciA9IG5ldyBUU05FUmVkdWNlcih7XG4gICAgICAgICAgZGF0YTogZGF0YSxcbiAgICAgICAgICBkaXN0YW5jZUZuYW1lczogbWV0cmljcyxcbiAgICAgICAgICBkaXN0YW5jZUZuczogbWVhc3VyZXMsXG4gICAgICAgICAgZGlzdGFuY2VGbkFyZ3M6IG9wdGlvbnMuZGlzdGFuY2VGbkFyZ3MsXG4gICAgICAgICAgd2VpZ2h0czogd2VpZ2h0cyxcbiAgICAgICAgICBhZ2dyZWdhdGlvbk1ldGhvZDogZGlzdGFuY2VBZ2dyZWdhdGlvbixcbiAgICAgICAgICAuLi5vcHRpb25zXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgKiBFbWJlZHMgdGhlIGRhdGEgZ2l2ZW4gaW50byB0aGUgdHdvLWRpbWVuc2lvbmFsIHNwYWNlIHVzaW5nIHRoZSBjaG9zZW4gbWV0aG9kLlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHRyYW5zcG9zZSBXaGV0aGVyIHRvIHRyYW5zZm9ybSBjb29yZGluYXRlcyB0byBoYXZlIGNvbHVtbnMtZmlyc3Qgb3JpZW50YXRpb24uXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gcGFyYWxsZWxEaXN0YW5jZVdvcmtlcnMgV2hldGhlciB0byB1c2UgcGFyYWxsZWwgZGlzdGFuY2UgY29tcHV0YXRpb24uXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgZW1iZWRkaW5nIG1ldGhvZCB3YXMgbm90IGZvdW5kLlxuICAgKiBAcmV0dXJuIHthbnl9IENhcnRlc2lhbiBjb29yZGluYXRlIG9mIHRoaXMgZW1iZWRkaW5nIGFuZCBkaXN0YW5jZSBtYXRyaXggd2hlcmUgYXBwbGljYWJsZS5cbiAgICogQG1lbWJlcm9mIERpbWVuc2lvbmFsaXR5UmVkdWNlclxuICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgdHJhbnNmb3JtKHRyYW5zcG9zZTogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxNYXRyaXg+IHtcbiAgICAgIGlmICh0aGlzLnJlZHVjZXIgPT09IHVuZGVmaW5lZClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWR1Y2VyIHdhcyBub3QgZGVmaW5lZC4nKTtcblxuICAgICAgbGV0IGVtYmVkZGluZyA9IGF3YWl0IHRoaXMucmVkdWNlci50cmFuc2Zvcm0oKTtcblxuICAgICAgaWYgKHRyYW5zcG9zZSlcbiAgICAgICAgZW1iZWRkaW5nID0gdHJhbnNwb3NlTWF0cml4KGVtYmVkZGluZyk7XG5cbiAgICAgIHJldHVybiBlbWJlZGRpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAqIFJldHVybnMgbWV0cmljcyBhdmFpbGFibGUgYnkgdHlwZS5cbiAgICpcbiAgICogQHBhcmFtIHtBdmFpbGFibGVEYXRhVHlwZXN9IHR5cGVOYW1lIHR5cGUgbmFtZVxuICAgKiBAcmV0dXJuIHtzdHJpbmdbXX0gTWV0cmljIG5hbWVzIHdoaWNoIGV4cGVjdHMgdGhlIGdpdmVuIGRhdGEgdHlwZVxuICAgKiBAbWVtYmVyb2YgRGltZW5zaW9uYWxpdHlSZWR1Y2VyXG4gICAqL1xuICAgIHN0YXRpYyBhdmFpbGFibGVNZXRyaWNzQnlUeXBlKHR5cGVOYW1lOiBBdmFpbGFibGVEYXRhVHlwZXMpIHtcbiAgICAgIHJldHVybiBPYmplY3Qua2V5cyhBdmFpbGFibGVNZXRyaWNzW3R5cGVOYW1lXSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAqIFJldHVybnMgZGltZW5zaW9uYWxpdHkgcmVkdWN0aW9uIG1ldGhvZHMgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBAcmVhZG9ubHlcbiAgICogQG1lbWJlcm9mIERpbWVuc2lvbmFsaXR5UmVkdWNlclxuICAgKi9cbiAgICBzdGF0aWMgZ2V0IGF2YWlsYWJsZU1ldGhvZHMoKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmtleXMoQXZhaWxhYmxlUmVkdWNlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgKiBSZXR1cm5zIG1ldHJpY3MgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBAcmVhZG9ubHlcbiAgICogQG1lbWJlcm9mIERpbWVuc2lvbmFsaXR5UmVkdWNlclxuICAgKi9cbiAgICBzdGF0aWMgZ2V0IGF2YWlsYWJsZU1ldHJpY3MoKSB7XG4gICAgICBsZXQgYW5zOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgT2JqZWN0LnZhbHVlcyhBdmFpbGFibGVNZXRyaWNzKS5mb3JFYWNoKChvYmopID0+IHtcbiAgICAgICAgY29uc3QgYXJyYXkgPSBPYmplY3QudmFsdWVzKG9iaik7XG4gICAgICAgIGFucyA9IFsuLi5hbnMsIC4uLmFycmF5XTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGFucztcbiAgICB9XG59XG4iXX0=","import { MultiColDimReducer } from './multi-column-dim-reducer';\n/**\n * Worker thread receiving data function.\n *\n * @param {any[]} columnData Samples to process.\n * @param {KnownMethods} method Embedding method.\n * @param {KnownMetrics} measure Distance metric.\n * @param {any} options Options to pass to algorithm.\n * @param {boolean} parallelDistanceWorkers Whether to use parallel distance workers.\n * @return {any} Embedding (and distance matrix where applicable).\n */\nasync function onMessage(columnsData, method, metrics, weights, aggregationMethod, options) {\n const reducer = new MultiColDimReducer(columnsData, method, metrics, weights, aggregationMethod, { ...options, progressFunc });\n return await reducer.transform(true);\n}\nasync function progressFunc(epochNum, epochsLength, embedding) {\n if (epochNum % 5 === 0)\n self.postMessage({ epochNum, epochsLength, embedding });\n}\nself.onmessage = async ({ data: { columnsData, method, distanceMetrics, options, weights, aggregationMethod } }) => {\n let data;\n try {\n const embedding = await onMessage(columnsData, method, distanceMetrics, weights, aggregationMethod, options);\n data = { embedding };\n }\n catch (e) {\n data = { error: e };\n }\n self.postMessage({\n error: data.error,\n embedding: data.embedding,\n });\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsaXQtY29sdW1uLWRpbS1yZWR1Y2VyLXdvcmtlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm11bGl0LWNvbHVtbi1kaW0tcmVkdWNlci13b3JrZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFFOUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsS0FBSyxVQUFVLFNBQVMsQ0FBQyxXQUF5QixFQUFFLE1BQTJCLEVBQUUsT0FBdUIsRUFDdEcsT0FBaUIsRUFBRSxpQkFBNEMsRUFDL0QsT0FBWTtJQUNaLE1BQU0sT0FBTyxHQUFHLElBQUksa0JBQWtCLENBQ3BDLFdBQVcsRUFDWCxNQUFNLEVBQ04sT0FBTyxFQUNQLE9BQU8sRUFDUCxpQkFBaUIsRUFDakIsRUFBQyxHQUFHLE9BQU8sRUFBRSxZQUFZLEVBQUMsQ0FDM0IsQ0FBQztJQUNGLE9BQU8sTUFBTSxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3ZDLENBQUM7QUFFRCxLQUFLLFVBQVUsWUFBWSxDQUFDLFFBQWdCLEVBQUUsWUFBb0IsRUFBRSxTQUFxQjtJQUN2RixJQUFJLFFBQVEsR0FBRyxDQUFDLEtBQUssQ0FBQztRQUNwQixJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUMsUUFBUSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUMsQ0FBQyxDQUFDO0FBQzFELENBQUM7QUFFRCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssRUFBRSxFQUFDLElBQUksRUFBRSxFQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUMsRUFBQyxFQUFFLEVBQUU7SUFDN0csSUFBSSxJQUFvQyxDQUFDO0lBQ3pDLElBQUk7UUFDRixNQUFNLFNBQVMsR0FBRyxNQUFNLFNBQVMsQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDN0csSUFBSSxHQUFHLEVBQUMsU0FBUyxFQUFDLENBQUM7S0FDcEI7SUFBQyxPQUFPLENBQU0sRUFBRTtRQUNmLElBQUksR0FBRyxFQUFDLEtBQUssRUFBRSxDQUFDLEVBQUMsQ0FBQztLQUNuQjtJQUNELElBQUksQ0FBQyxXQUFXLENBQUM7UUFDZixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7UUFDakIsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO0tBQzFCLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TWF0cml4fSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy90eXBlLWRlY2xhcmF0aW9ucyc7XG5pbXBvcnQge0tub3duTWV0cmljc30gZnJvbSAnLi4vdHlwZWQtbWV0cmljcy90eXBlZC1tZXRyaWNzJztcbmltcG9ydCB7RGltUmVkdWN0aW9uTWV0aG9kc30gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQge0Rpc3RhbmNlQWdncmVnYXRpb25NZXRob2R9IGZyb20gJy4uL2Rpc3RhbmNlLW1hdHJpeC90eXBlcyc7XG5pbXBvcnQge011bHRpQ29sRGltUmVkdWNlcn0gZnJvbSAnLi9tdWx0aS1jb2x1bW4tZGltLXJlZHVjZXInO1xuXG4vKipcbiAqIFdvcmtlciB0aHJlYWQgcmVjZWl2aW5nIGRhdGEgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHthbnlbXX0gY29sdW1uRGF0YSBTYW1wbGVzIHRvIHByb2Nlc3MuXG4gKiBAcGFyYW0ge0tub3duTWV0aG9kc30gbWV0aG9kIEVtYmVkZGluZyBtZXRob2QuXG4gKiBAcGFyYW0ge0tub3duTWV0cmljc30gbWVhc3VyZSBEaXN0YW5jZSBtZXRyaWMuXG4gKiBAcGFyYW0ge2FueX0gb3B0aW9ucyBPcHRpb25zIHRvIHBhc3MgdG8gYWxnb3JpdGhtLlxuICogQHBhcmFtIHtib29sZWFufSBwYXJhbGxlbERpc3RhbmNlV29ya2VycyBXaGV0aGVyIHRvIHVzZSBwYXJhbGxlbCBkaXN0YW5jZSB3b3JrZXJzLlxuICogQHJldHVybiB7YW55fSBFbWJlZGRpbmcgKGFuZCBkaXN0YW5jZSBtYXRyaXggd2hlcmUgYXBwbGljYWJsZSkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG9uTWVzc2FnZShjb2x1bW5zRGF0YTogQXJyYXk8YW55W10+LCBtZXRob2Q6IERpbVJlZHVjdGlvbk1ldGhvZHMsIG1ldHJpY3M6IEtub3duTWV0cmljc1tdLFxuICB3ZWlnaHRzOiBudW1iZXJbXSwgYWdncmVnYXRpb25NZXRob2Q6IERpc3RhbmNlQWdncmVnYXRpb25NZXRob2QsXG4gIG9wdGlvbnM6IGFueSk6IFByb21pc2U8TWF0cml4PiB7XG4gIGNvbnN0IHJlZHVjZXIgPSBuZXcgTXVsdGlDb2xEaW1SZWR1Y2VyKFxuICAgIGNvbHVtbnNEYXRhLFxuICAgIG1ldGhvZCxcbiAgICBtZXRyaWNzLFxuICAgIHdlaWdodHMsXG4gICAgYWdncmVnYXRpb25NZXRob2QsXG4gICAgey4uLm9wdGlvbnMsIHByb2dyZXNzRnVuY31cbiAgKTtcbiAgcmV0dXJuIGF3YWl0IHJlZHVjZXIudHJhbnNmb3JtKHRydWUpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwcm9ncmVzc0Z1bmMoZXBvY2hOdW06IG51bWJlciwgZXBvY2hzTGVuZ3RoOiBudW1iZXIsIGVtYmVkZGluZzogbnVtYmVyW11bXSkge1xuICBpZiAoZXBvY2hOdW0gJSA1ID09PSAwKVxuICAgIHNlbGYucG9zdE1lc3NhZ2Uoe2Vwb2NoTnVtLCBlcG9jaHNMZW5ndGgsIGVtYmVkZGluZ30pO1xufVxuXG5zZWxmLm9ubWVzc2FnZSA9IGFzeW5jICh7ZGF0YToge2NvbHVtbnNEYXRhLCBtZXRob2QsIGRpc3RhbmNlTWV0cmljcywgb3B0aW9ucywgd2VpZ2h0cywgYWdncmVnYXRpb25NZXRob2R9fSkgPT4ge1xuICBsZXQgZGF0YToge2Vycm9yPzogYW55LCBlbWJlZGRpbmc/OiBhbnl9O1xuICB0cnkge1xuICAgIGNvbnN0IGVtYmVkZGluZyA9IGF3YWl0IG9uTWVzc2FnZShjb2x1bW5zRGF0YSwgbWV0aG9kLCBkaXN0YW5jZU1ldHJpY3MsIHdlaWdodHMsIGFnZ3JlZ2F0aW9uTWV0aG9kLCBvcHRpb25zKTtcbiAgICBkYXRhID0ge2VtYmVkZGluZ307XG4gIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgIGRhdGEgPSB7ZXJyb3I6IGV9O1xuICB9XG4gIHNlbGYucG9zdE1lc3NhZ2Uoe1xuICAgIGVycm9yOiBkYXRhLmVycm9yLFxuICAgIGVtYmVkZGluZzogZGF0YS5lbWJlZGRpbmcsXG4gIH0pO1xufTtcbiJdfQ==","// A library of seedable RNGs implemented in Javascript.\n//\n// Usage:\n//\n// var seedrandom = require('seedrandom');\n// var random = seedrandom(1); // or any seed.\n// var x = random(); // 0 <= x < 1. Every bit is random.\n// var x = random.quick(); // 0 <= x < 1. 32 bits of randomness.\n\n// alea, a 53-bit multiply-with-carry generator by Johannes Baagøe.\n// Period: ~2^116\n// Reported to pass all BigCrush tests.\nvar alea = require('./lib/alea');\n\n// xor128, a pure xor-shift generator by George Marsaglia.\n// Period: 2^128-1.\n// Reported to fail: MatrixRank and LinearComp.\nvar xor128 = require('./lib/xor128');\n\n// xorwow, George Marsaglia's 160-bit xor-shift combined plus weyl.\n// Period: 2^192-2^32\n// Reported to fail: CollisionOver, SimpPoker, and LinearComp.\nvar xorwow = require('./lib/xorwow');\n\n// xorshift7, by François Panneton and Pierre L'ecuyer, takes\n// a different approach: it adds robustness by allowing more shifts\n// than Marsaglia's original three. It is a 7-shift generator\n// with 256 bits, that passes BigCrush with no systmatic failures.\n// Period 2^256-1.\n// No systematic BigCrush failures reported.\nvar xorshift7 = require('./lib/xorshift7');\n\n// xor4096, by Richard Brent, is a 4096-bit xor-shift with a\n// very long period that also adds a Weyl generator. It also passes\n// BigCrush with no systematic failures. Its long period may\n// be useful if you have many generators and need to avoid\n// collisions.\n// Period: 2^4128-2^32.\n// No systematic BigCrush failures reported.\nvar xor4096 = require('./lib/xor4096');\n\n// Tyche-i, by Samuel Neves and Filipe Araujo, is a bit-shifting random\n// number generator derived from ChaCha, a modern stream cipher.\n// https://eden.dei.uc.pt/~sneves/pubs/2011-snfa2.pdf\n// Period: ~2^127\n// No systematic BigCrush failures reported.\nvar tychei = require('./lib/tychei');\n\n// The original ARC4-based prng included in this library.\n// Period: ~2^1600\nvar sr = require('./seedrandom');\n\nsr.alea = alea;\nsr.xor128 = xor128;\nsr.xorwow = xorwow;\nsr.xorshift7 = xorshift7;\nsr.xor4096 = xor4096;\nsr.tychei = tychei;\n\nmodule.exports = sr;\n","// A port of an algorithm by Johannes Baagøe <baagoe@baagoe.com>, 2010\n// http://baagoe.com/en/RandomMusings/javascript/\n// https://github.com/nquinlan/better-random-numbers-for-javascript-mirror\n// Original work is under MIT license -\n\n// Copyright (C) 2010 by Johannes Baagøe <baagoe@baagoe.org>\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n\n\n(function(global, module, define) {\n\nfunction Alea(seed) {\n var me = this, mash = Mash();\n\n me.next = function() {\n var t = 2091639 * me.s0 + me.c * 2.3283064365386963e-10; // 2^-32\n me.s0 = me.s1;\n me.s1 = me.s2;\n return me.s2 = t - (me.c = t | 0);\n };\n\n // Apply the seeding algorithm from Baagoe.\n me.c = 1;\n me.s0 = mash(' ');\n me.s1 = mash(' ');\n me.s2 = mash(' ');\n me.s0 -= mash(seed);\n if (me.s0 < 0) { me.s0 += 1; }\n me.s1 -= mash(seed);\n if (me.s1 < 0) { me.s1 += 1; }\n me.s2 -= mash(seed);\n if (me.s2 < 0) { me.s2 += 1; }\n mash = null;\n}\n\nfunction copy(f, t) {\n t.c = f.c;\n t.s0 = f.s0;\n t.s1 = f.s1;\n t.s2 = f.s2;\n return t;\n}\n\nfunction impl(seed, opts) {\n var xg = new Alea(seed),\n state = opts && opts.state,\n prng = xg.next;\n prng.int32 = function() { return (xg.next() * 0x100000000) | 0; }\n prng.double = function() {\n return prng() + (prng() * 0x200000 | 0) * 1.1102230246251565e-16; // 2^-53\n };\n prng.quick = prng;\n if (state) {\n if (typeof(state) == 'object') copy(state, xg);\n prng.state = function() { return copy(xg, {}); }\n }\n return prng;\n}\n\nfunction Mash() {\n var n = 0xefc8249d;\n\n var mash = function(data) {\n data = String(data);\n for (var i = 0; i < data.length; i++) {\n n += data.charCodeAt(i);\n var h = 0.02519603282416938 * n;\n n = h >>> 0;\n h -= n;\n h *= n;\n n = h >>> 0;\n h -= n;\n n += h * 0x100000000; // 2^32\n }\n return (n >>> 0) * 2.3283064365386963e-10; // 2^-32\n };\n\n return mash;\n}\n\n\nif (module && module.exports) {\n module.exports = impl;\n} else if (define && define.amd) {\n define(function() { return impl; });\n} else {\n this.alea = impl;\n}\n\n})(\n this,\n (typeof module) == 'object' && module, // present in node.js\n (typeof define) == 'function' && define // present with an AMD loader\n);\n\n\n","// A Javascript implementaion of the \"Tyche-i\" prng algorithm by\n// Samuel Neves and Filipe Araujo.\n// See https://eden.dei.uc.pt/~sneves/pubs/2011-snfa2.pdf\n\n(function(global, module, define) {\n\nfunction XorGen(seed) {\n var me = this, strseed = '';\n\n // Set up generator function.\n me.next = function() {\n var b = me.b, c = me.c, d = me.d, a = me.a;\n b = (b << 25) ^ (b >>> 7) ^ c;\n c = (c - d) | 0;\n d = (d << 24) ^ (d >>> 8) ^ a;\n a = (a - b) | 0;\n me.b = b = (b << 20) ^ (b >>> 12) ^ c;\n me.c = c = (c - d) | 0;\n me.d = (d << 16) ^ (c >>> 16) ^ a;\n return me.a = (a - b) | 0;\n };\n\n /* The following is non-inverted tyche, which has better internal\n * bit diffusion, but which is about 25% slower than tyche-i in JS.\n me.next = function() {\n var a = me.a, b = me.b, c = me.c, d = me.d;\n a = (me.a + me.b | 0) >>> 0;\n d = me.d ^ a; d = d << 16 ^ d >>> 16;\n c = me.c + d | 0;\n b = me.b ^ c; b = b << 12 ^ d >>> 20;\n me.a = a = a + b | 0;\n d = d ^ a; me.d = d = d << 8 ^ d >>> 24;\n me.c = c = c + d | 0;\n b = b ^ c;\n return me.b = (b << 7 ^ b >>> 25);\n }\n */\n\n me.a = 0;\n me.b = 0;\n me.c = 2654435769 | 0;\n me.d = 1367130551;\n\n if (seed === Math.floor(seed)) {\n // Integer seed.\n me.a = (seed / 0x100000000) | 0;\n me.b = seed | 0;\n } else {\n // String seed.\n strseed += seed;\n }\n\n // Mix in string seed, then discard an initial batch of 64 values.\n for (var k = 0; k < strseed.length + 20; k++) {\n me.b ^= strseed.charCodeAt(k) | 0;\n me.next();\n }\n}\n\nfunction copy(f, t) {\n t.a = f.a;\n t.b = f.b;\n t.c = f.c;\n t.d = f.d;\n return t;\n};\n\nfunction impl(seed, opts) {\n var xg = new XorGen(seed),\n state = opts && opts.state,\n prng = function() { return (xg.next() >>> 0) / 0x100000000; };\n prng.double = function() {\n do {\n var top = xg.next() >>> 11,\n bot = (xg.next() >>> 0) / 0x100000000,\n result = (top + bot) / (1 << 21);\n } while (result === 0);\n return result;\n };\n prng.int32 = xg.next;\n prng.quick = prng;\n if (state) {\n if (typeof(state) == 'object') copy(state, xg);\n prng.state = function() { return copy(xg, {}); }\n }\n return prng;\n}\n\nif (module && module.exports) {\n module.exports = impl;\n} else if (define && define.amd) {\n define(function() { return impl; });\n} else {\n this.tychei = impl;\n}\n\n})(\n this,\n (typeof module) == 'object' && module, // present in node.js\n (typeof define) == 'function' && define // present with an AMD loader\n);\n\n\n","// A Javascript implementaion of the \"xor128\" prng algorithm by\n// George Marsaglia. See http://www.jstatsoft.org/v08/i14/paper\n\n(function(global, module, define) {\n\nfunction XorGen(seed) {\n var me = this, strseed = '';\n\n me.x = 0;\n me.y = 0;\n me.z = 0;\n me.w = 0;\n\n // Set up generator function.\n me.next = function() {\n var t = me.x ^ (me.x << 11);\n me.x = me.y;\n me.y = me.z;\n me.z = me.w;\n return me.w ^= (me.w >>> 19) ^ t ^ (t >>> 8);\n };\n\n if (seed === (seed | 0)) {\n // Integer seed.\n me.x = seed;\n } else {\n // String seed.\n strseed += seed;\n }\n\n // Mix in string seed, then discard an initial batch of 64 values.\n for (var k = 0; k < strseed.length + 64; k++) {\n me.x ^= strseed.charCodeAt(k) | 0;\n me.next();\n }\n}\n\nfunction copy(f, t) {\n t.x = f.x;\n t.y = f.y;\n t.z = f.z;\n t.w = f.w;\n return t;\n}\n\nfunction impl(seed, opts) {\n var xg = new XorGen(seed),\n state = opts && opts.state,\n prng = function() { return (xg.next() >>> 0) / 0x100000000; };\n prng.double = function() {\n do {\n var top = xg.next() >>> 11,\n bot = (xg.next() >>> 0) / 0x100000000,\n result = (top + bot) / (1 << 21);\n } while (result === 0);\n return result;\n };\n prng.int32 = xg.next;\n prng.quick = prng;\n if (state) {\n if (typeof(state) == 'object') copy(state, xg);\n prng.state = function() { return copy(xg, {}); }\n }\n return prng;\n}\n\nif (module && module.exports) {\n module.exports = impl;\n} else if (define && define.amd) {\n define(function() { return impl; });\n} else {\n this.xor128 = impl;\n}\n\n})(\n this,\n (typeof module) == 'object' && module, // present in node.js\n (typeof define) == 'function' && define // present with an AMD loader\n);\n\n\n","// A Javascript implementaion of Richard Brent's Xorgens xor4096 algorithm.\n//\n// This fast non-cryptographic random number generator is designed for\n// use in Monte-Carlo algorithms. It combines a long-period xorshift\n// generator with a Weyl generator, and it passes all common batteries\n// of stasticial tests for randomness while consuming only a few nanoseconds\n// for each prng generated. For background on the generator, see Brent's\n// paper: \"Some long-period random number generators using shifts and xors.\"\n// http://arxiv.org/pdf/1004.3115v1.pdf\n//\n// Usage:\n//\n// var xor4096 = require('xor4096');\n// random = xor4096(1); // Seed with int32 or string.\n// assert.equal(random(), 0.1520436450538547); // (0, 1) range, 53 bits.\n// assert.equal(random.int32(), 1806534897); // signed int32, 32 bits.\n//\n// For nonzero numeric keys, this impelementation provides a sequence\n// identical to that by Brent's xorgens 3 implementaion in C. This\n// implementation also provides for initalizing the generator with\n// string seeds, or for saving and restoring the state of the generator.\n//\n// On Chrome, this prng benchmarks about 2.1 times slower than\n// Javascript's built-in Math.random().\n\n(function(global, module, define) {\n\nfunction XorGen(seed) {\n var me = this;\n\n // Set up generator function.\n me.next = function() {\n var w = me.w,\n X = me.X, i = me.i, t, v;\n // Update Weyl generator.\n me.w = w = (w + 0x61c88647) | 0;\n // Update xor generator.\n v = X[(i + 34) & 127];\n t = X[i = ((i + 1) & 127)];\n v ^= v << 13;\n t ^= t << 17;\n v ^= v >>> 15;\n t ^= t >>> 12;\n // Update Xor generator array state.\n v = X[i] = v ^ t;\n me.i = i;\n // Result is the combination.\n return (v + (w ^ (w >>> 16))) | 0;\n };\n\n function init(me, seed) {\n var t, v, i, j, w, X = [], limit = 128;\n if (seed === (seed | 0)) {\n // Numeric seeds initialize v, which is used to generates X.\n v = seed;\n seed = null;\n } else {\n // String seeds are mixed into v and X one character at a time.\n seed = seed + '\\0';\n v = 0;\n limit = Math.max(limit, seed.length);\n }\n // Initialize circular array and weyl value.\n for (i = 0, j = -32; j < limit; ++j) {\n // Put the unicode characters into the array, and shuffle them.\n if (seed) v ^= seed.charCodeAt((j + 32) % seed.length);\n // After 32 shuffles, take v as the starting w value.\n if (j === 0) w = v;\n v ^= v << 10;\n v ^= v >>> 15;\n v ^= v << 4;\n v ^= v >>> 13;\n if (j >= 0) {\n w = (w + 0x61c88647) | 0; // Weyl.\n t = (X[j & 127] ^= (v + w)); // Combine xor and weyl to init array.\n i = (0 == t) ? i + 1 : 0; // Count zeroes.\n }\n }\n // We have detected all zeroes; make the key nonzero.\n if (i >= 128) {\n X[(seed && seed.length || 0) & 127] = -1;\n }\n // Run the generator 512 times to further mix the state before using it.\n // Factoring this as a function slows the main generator, so it is just\n // unrolled here. The weyl generator is not advanced while warming up.\n i = 127;\n for (j = 4 * 128; j > 0; --j) {\n v = X[(i + 34) & 127];\n t = X[i = ((i + 1) & 127)];\n v ^= v << 13;\n t ^= t << 17;\n v ^= v >>> 15;\n t ^= t >>> 12;\n X[i] = v ^ t;\n }\n // Storing state as object members is faster than using closure variables.\n me.w = w;\n me.X = X;\n me.i = i;\n }\n\n init(me, seed);\n}\n\nfunction copy(f, t) {\n t.i = f.i;\n t.w = f.w;\n t.X = f.X.slice();\n return t;\n};\n\nfunction impl(seed, opts) {\n if (seed == null) seed = +(new Date);\n var xg = new XorGen(seed),\n state = opts && opts.state,\n prng = function() { return (xg.next() >>> 0) / 0x100000000; };\n prng.double = function() {\n do {\n var top = xg.next() >>> 11,\n bot = (xg.next() >>> 0) / 0x100000000,\n result = (top + bot) / (1 << 21);\n } while (result === 0);\n return result;\n };\n prng.int32 = xg.next;\n prng.quick = prng;\n if (state) {\n if (state.X) copy(state, xg);\n prng.state = function() { return copy(xg, {}); }\n }\n return prng;\n}\n\nif (module && module.exports) {\n module.exports = impl;\n} else if (define && define.amd) {\n define(function() { return impl; });\n} else {\n this.xor4096 = impl;\n}\n\n})(\n this, // window object or global\n (typeof module) == 'object' && module, // present in node.js\n (typeof define) == 'function' && define // present with an AMD loader\n);\n","// A Javascript implementaion of the \"xorshift7\" algorithm by\n// François Panneton and Pierre L'ecuyer:\n// \"On the Xorgshift Random Number Generators\"\n// http://saluc.engr.uconn.edu/refs/crypto/rng/panneton05onthexorshift.pdf\n\n(function(global, module, define) {\n\nfunction XorGen(seed) {\n var me = this;\n\n // Set up generator function.\n me.next = function() {\n // Update xor generator.\n var X = me.x, i = me.i, t, v, w;\n t = X[i]; t ^= (t >>> 7); v = t ^ (t << 24);\n t = X[(i + 1) & 7]; v ^= t ^ (t >>> 10);\n t = X[(i + 3) & 7]; v ^= t ^ (t >>> 3);\n t = X[(i + 4) & 7]; v ^= t ^ (t << 7);\n t = X[(i + 7) & 7]; t = t ^ (t << 13); v ^= t ^ (t << 9);\n X[i] = v;\n me.i = (i + 1) & 7;\n return v;\n };\n\n function init(me, seed) {\n var j, w, X = [];\n\n if (seed === (seed | 0)) {\n // Seed state array using a 32-bit integer.\n w = X[0] = seed;\n } else {\n // Seed state using a string.\n seed = '' + seed;\n for (j = 0; j < seed.length; ++j) {\n X[j & 7] = (X[j & 7] << 15) ^\n (seed.charCodeAt(j) + X[(j + 1) & 7] << 13);\n }\n }\n // Enforce an array length of 8, not all zeroes.\n while (X.length < 8) X.push(0);\n for (j = 0; j < 8 && X[j] === 0; ++j);\n if (j == 8) w = X[7] = -1; else w = X[j];\n\n me.x = X;\n me.i = 0;\n\n // Discard an initial 256 values.\n for (j = 256; j > 0; --j) {\n me.next();\n }\n }\n\n init(me, seed);\n}\n\nfunction copy(f, t) {\n t.x = f.x.slice();\n t.i = f.i;\n return t;\n}\n\nfunction impl(seed, opts) {\n if (seed == null) seed = +(new Date);\n var xg = new XorGen(seed),\n state = opts && opts.state,\n prng = function() { return (xg.next() >>> 0) / 0x100000000; };\n prng.double = function() {\n do {\n var top = xg.next() >>> 11,\n bot = (xg.next() >>> 0) / 0x100000000,\n result = (top + bot) / (1 << 21);\n } while (result === 0);\n return result;\n };\n prng.int32 = xg.next;\n prng.quick = prng;\n if (state) {\n if (state.x) copy(state, xg);\n prng.state = function() { return copy(xg, {}); }\n }\n return prng;\n}\n\nif (module && module.exports) {\n module.exports = impl;\n} else if (define && define.amd) {\n define(function() { return impl; });\n} else {\n this.xorshift7 = impl;\n}\n\n})(\n this,\n (typeof module) == 'object' && module, // present in node.js\n (typeof define) == 'function' && define // present with an AMD loader\n);\n\n","// A Javascript implementaion of the \"xorwow\" prng algorithm by\n// George Marsaglia. See http://www.jstatsoft.org/v08/i14/paper\n\n(function(global, module, define) {\n\nfunction XorGen(seed) {\n var me = this, strseed = '';\n\n // Set up generator function.\n me.next = function() {\n var t = (me.x ^ (me.x >>> 2));\n me.x = me.y; me.y = me.z; me.z = me.w; me.w = me.v;\n return (me.d = (me.d + 362437 | 0)) +\n (me.v = (me.v ^ (me.v << 4)) ^ (t ^ (t << 1))) | 0;\n };\n\n me.x = 0;\n me.y = 0;\n me.z = 0;\n me.w = 0;\n me.v = 0;\n\n if (seed === (seed | 0)) {\n // Integer seed.\n me.x = seed;\n } else {\n // String seed.\n strseed += seed;\n }\n\n // Mix in string seed, then discard an initial batch of 64 values.\n for (var k = 0; k < strseed.length + 64; k++) {\n me.x ^= strseed.charCodeAt(k) | 0;\n if (k == strseed.length) {\n me.d = me.x << 10 ^ me.x >>> 4;\n }\n me.next();\n }\n}\n\nfunction copy(f, t) {\n t.x = f.x;\n t.y = f.y;\n t.z = f.z;\n t.w = f.w;\n t.v = f.v;\n t.d = f.d;\n return t;\n}\n\nfunction impl(seed, opts) {\n var xg = new XorGen(seed),\n state = opts && opts.state,\n prng = function() { return (xg.next() >>> 0) / 0x100000000; };\n prng.double = function() {\n do {\n var top = xg.next() >>> 11,\n bot = (xg.next() >>> 0) / 0x100000000,\n result = (top + bot) / (1 << 21);\n } while (result === 0);\n return result;\n };\n prng.int32 = xg.next;\n prng.quick = prng;\n if (state) {\n if (typeof(state) == 'object') copy(state, xg);\n prng.state = function() { return copy(xg, {}); }\n }\n return prng;\n}\n\nif (module && module.exports) {\n module.exports = impl;\n} else if (define && define.amd) {\n define(function() { return impl; });\n} else {\n this.xorwow = impl;\n}\n\n})(\n this,\n (typeof module) == 'object' && module, // present in node.js\n (typeof define) == 'function' && define // present with an AMD loader\n);\n\n\n","/*\nCopyright 2019 David Bau.\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n*/\n\n(function (global, pool, math) {\n//\n// The following constants are related to IEEE 754 limits.\n//\n\nvar width = 256, // each RC4 output is 0 <= x < 256\n chunks = 6, // at least six RC4 outputs for each double\n digits = 52, // there are 52 significant digits in a double\n rngname = 'random', // rngname: name for Math.random and Math.seedrandom\n startdenom = math.pow(width, chunks),\n significance = math.pow(2, digits),\n overflow = significance * 2,\n mask = width - 1,\n nodecrypto; // node.js crypto module, initialized at the bottom.\n\n//\n// seedrandom()\n// This is the seedrandom function described above.\n//\nfunction seedrandom(seed, options, callback) {\n var key = [];\n options = (options == true) ? { entropy: true } : (options || {});\n\n // Flatten the seed string or build one from local entropy if needed.\n var shortseed = mixkey(flatten(\n options.entropy ? [seed, tostring(pool)] :\n (seed == null) ? autoseed() : seed, 3), key);\n\n // Use the seed to initialize an ARC4 generator.\n var arc4 = new ARC4(key);\n\n // This function returns a random double in [0, 1) that contains\n // randomness in every bit of the mantissa of the IEEE 754 value.\n var prng = function() {\n var n = arc4.g(chunks), // Start with a numerator n < 2 ^ 48\n d = startdenom, // and denominator d = 2 ^ 48.\n x = 0; // and no 'extra last byte'.\n while (n < significance) { // Fill up all significant digits by\n n = (n + x) * width; // shifting numerator and\n d *= width; // denominator and generating a\n x = arc4.g(1); // new least-significant-byte.\n }\n while (n >= overflow) { // To avoid rounding up, before adding\n n /= 2; // last byte, shift everything\n d /= 2; // right using integer math until\n x >>>= 1; // we have exactly the desired bits.\n }\n return (n + x) / d; // Form the number within [0, 1).\n };\n\n prng.int32 = function() { return arc4.g(4) | 0; }\n prng.quick = function() { return arc4.g(4) / 0x100000000; }\n prng.double = prng;\n\n // Mix the randomness into accumulated entropy.\n mixkey(tostring(arc4.S), pool);\n\n // Calling convention: what to return as a function of prng, seed, is_math.\n return (options.pass || callback ||\n function(prng, seed, is_math_call, state) {\n if (state) {\n // Load the arc4 state from the given state if it has an S array.\n if (state.S) { copy(state, arc4); }\n // Only provide the .state method if requested via options.state.\n prng.state = function() { return copy(arc4, {}); }\n }\n\n // If called as a method of Math (Math.seedrandom()), mutate\n // Math.random because that is how seedrandom.js has worked since v1.0.\n if (is_math_call) { math[rngname] = prng; return seed; }\n\n // Otherwise, it is a newer calling convention, so return the\n // prng directly.\n else return prng;\n })(\n prng,\n shortseed,\n 'global' in options ? options.global : (this == math),\n options.state);\n}\n\n//\n// ARC4\n//\n// An ARC4 implementation. The constructor takes a key in the form of\n// an array of at most (width) integers that should be 0 <= x < (width).\n//\n// The g(count) method returns a pseudorandom integer that concatenates\n// the next (count) outputs from ARC4. Its return value is a number x\n// that is in the range 0 <= x < (width ^ count).\n//\nfunction ARC4(key) {\n var t, keylen = key.length,\n me = this, i = 0, j = me.i = me.j = 0, s = me.S = [];\n\n // The empty key [] is treated as [0].\n if (!keylen) { key = [keylen++]; }\n\n // Set up S using the standard key scheduling algorithm.\n while (i < width) {\n s[i] = i++;\n }\n for (i = 0; i < width; i++) {\n s[i] = s[j = mask & (j + key[i % keylen] + (t = s[i]))];\n s[j] = t;\n }\n\n // The \"g\" method returns the next (count) outputs as one number.\n (me.g = function(count) {\n // Using instance members instead of closure state nearly doubles speed.\n var t, r = 0,\n i = me.i, j = me.j, s = me.S;\n while (count--) {\n t = s[i = mask & (i + 1)];\n r = r * width + s[mask & ((s[i] = s[j = mask & (j + t)]) + (s[j] = t))];\n }\n me.i = i; me.j = j;\n return r;\n // For robust unpredictability, the function call below automatically\n // discards an initial batch of values. This is called RC4-drop[256].\n // See http://google.com/search?q=rsa+fluhrer+response&btnI\n })(width);\n}\n\n//\n// copy()\n// Copies internal state of ARC4 to or from a plain object.\n//\nfunction copy(f, t) {\n t.i = f.i;\n t.j = f.j;\n t.S = f.S.slice();\n return t;\n};\n\n//\n// flatten()\n// Converts an object tree to nested arrays of strings.\n//\nfunction flatten(obj, depth) {\n var result = [], typ = (typeof obj), prop;\n if (depth && typ == 'object') {\n for (prop in obj) {\n try { result.push(flatten(obj[prop], depth - 1)); } catch (e) {}\n }\n }\n return (result.length ? result : typ == 'string' ? obj : obj + '\\0');\n}\n\n//\n// mixkey()\n// Mixes a string seed into a key that is an array of integers, and\n// returns a shortened string seed that is equivalent to the result key.\n//\nfunction mixkey(seed, key) {\n var stringseed = seed + '', smear, j = 0;\n while (j < stringseed.length) {\n key[mask & j] =\n mask & ((smear ^= key[mask & j] * 19) + stringseed.charCodeAt(j++));\n }\n return tostring(key);\n}\n\n//\n// autoseed()\n// Returns an object for autoseeding, using window.crypto and Node crypto\n// module if available.\n//\nfunction autoseed() {\n try {\n var out;\n if (nodecrypto && (out = nodecrypto.randomBytes)) {\n // The use of 'out' to remember randomBytes makes tight minified code.\n out = out(width);\n } else {\n out = new Uint8Array(width);\n (global.crypto || global.msCrypto).getRandomValues(out);\n }\n return tostring(out);\n } catch (e) {\n var browser = global.navigator,\n plugins = browser && browser.plugins;\n return [+new Date, global, plugins, global.screen, tostring(pool)];\n }\n}\n\n//\n// tostring()\n// Converts an array of charcodes to a string\n//\nfunction tostring(a) {\n return String.fromCharCode.apply(0, a);\n}\n\n//\n// When seedrandom.js is loaded, we immediately mix a few bits\n// from the built-in RNG into the entropy pool. Because we do\n// not want to interfere with deterministic PRNG state later,\n// seedrandom will not call math.random on its own again after\n// initialization.\n//\nmixkey(math.random(), pool);\n\n//\n// Nodejs and AMD support: export the implementation as a module using\n// either convention.\n//\nif ((typeof module) == 'object' && module.exports) {\n module.exports = seedrandom;\n // When in node.js, try using crypto package for autoseeding.\n try {\n nodecrypto = require('crypto');\n } catch (ex) {}\n} else if ((typeof define) == 'function' && define.amd) {\n define(function() { return seedrandom; });\n} else {\n // When included as a plain script, set up Math.seedrandom global.\n math['seed' + rngname] = seedrandom;\n}\n\n\n// End anonymous scope, and pass initial values.\n})(\n // global: `self` in browsers (including strict mode and web workers),\n // otherwise `this` in Node and other environments\n (typeof self !== 'undefined') ? self : this,\n [], // pool: entropy pool starts empty\n Math // math: package containing random, pow, and seedrandom\n);\n"],"names":["Float32Array","assert","condition","message","Error","vectorDistanceMetricsMethods","Euclidean","p","q","result","len","length","i","Math","pow","sqrt","stringDistanceMetricsMethods","Levenshtein","JaroWinkler","Manhattan","s1","s2","dist","Onehot","bitArrayDistanceMetricsMethods","Tanimoto","Dice","Asymmetric","BraunBlanquet","Cosine","Kulczynski","McConnaughey","RogotGoldberg","Russel","Sokal","Hamming","intArrayDistanceMetricsMethods","TanimotoIntArray","numberDistanceMetricsMethods","Difference","AvailableMetrics","Vector","String","BitArray","MacroMolecule","HAMMING","LEVENSHTEIN","NEEDLEMANN_WUNSCH","MONOMER_CHEMICAL_DISTANCE","Number","IntArray","MetricToDataType","Object","keys","reduce","ret","key","val","Measure","method","dataType","constructor","this","getMeasure","opts","dict","hasOwnProperty","name","toString","isNumericMetric","static","availableMeasures","DistanceAggregationMethods","x","insertSmaller","distancesAr","indexes","num","index","newPosition","findIndex","v","pop","splice","DistanceMatrixService","_workers","_workerCount","_terminateOnComplete","useConcurrentWorkers","terminateOnComplete","threadCount","navigator","hardwareConcurrency","max","Array","fill","map","Worker","URL","async","values","fnName","normalize","calcMulti","MANHATTAN","fnNames","weights","aggregationMethod","Promise","resolve","reject","promises","totalLength","min","chunkSize","distanceMatrix","endRow","endCol","lmin","lmax","MIN_VALUE","start","floor","end","startRow","startCol","postMessage","chunckSize","resolveWorker","rejectWorker","onmessage","data","error","distanceMatrixData","setTimeout","terminate","set","all","forEach","value","e","worker","tauRandInt","n","random","tauRand","empty","output","push","undefined","range","_","filled","zeros","mean","input","sum","rejectionSample","nSamples","poolSize","rejectSample","j","broken","k","reshape2d","a","b","rows","col","makeHeap","nPoints","size","makeArrays","fillValue","heap","Infinity","heapPush","row","weight","flag","indices","uncheckedHeapPush","isNew","iSwap","ic1","ic2","heapShape2","buildCandidates","currentGraph","nVertices","nNeighbors","maxCandidates","candidateNeighbors","idx","isn","d","deheapSort","indHeap","distHeap","indHeapIndex","distHeapIndex","temp1","temp2","siftDown","heap1","heap2","ceiling","elt","leftChild","rightChild","swap","smallestFlagged","ind","minDist","resultIndex","SparseMatrix","entries","Map","nRows","nCols","cols","dims","checkDims","makeKey","has","get","defaultValue","getAll","ordered","rowColValues","sort","getDims","getRows","from","_key","getCols","getValues","fn","vals","toArray","matrix","oldRows","oldCols","oldVals","matlen","Int32Array","pairwiseMultiply","elementWise","y","add","subtract","multiplyScalar","scalar","eliminateZeros","m","zeroIndices","Set","removeByZeroIndex","nextValues","filter","nextRows","nextCols","normType","normFn","normFns","colsByRow","nextMatrix","norm","xs","op","visited","operate","nextValue","valuesA","rowsA","colsA","valuesB","rowsB","colsB","getCSR","indptr","currentRow","FlatTree","hyperplanes","offsets","children","makeForest","nTrees","leafSize","trees","makeEuclideanTree","makeTree","forest","tree","nNodes","numNodes","nLeaves","numLeaves","hyperplane","recursiveFlatten","flattenTree","splitResults","leftIndex","rightIndex","left","right","hyperplaneOffset","hyperplaneVector","nLeft","nRight","side","margin","indicesLeft","indicesRight","offset","euclideanRandomProjectionSplit","isLeaf","nodeNum","leafNum","oldNodeNum","res","selectSide","point","searchFlatTree","node","prototype","isAnyArray","object","call","endsWith","errorCalculation","parameters","parameterizedFunction","func","abs","rescale","options","arguments","TypeError","currentMin","_options$fromIndex","fromIndex","_options$toIndex","toIndex","isInteger","minValue","currentMax","maxValue","RangeError","_options$min","autoMinMax","_options$max","factor","indent","repeat","indentData","inspectMatrixWithOptions","maxRows","maxColumns","maxNumSize","padMinus","columns","maxI","maxJ","loop","line","formatNumber","join","inspectData","formatNumber2","padEnd","str","fix","toFixed","startsWith","exp","toExponential","slice","checkRowIndex","outer","checkColumnIndex","checkRowVector","vector","to1DArray","checkColumnVector","checkRange","startColumn","endColumn","checkNumber","newArray","array","checkNonEmpty","isEmpty","AbstractMatrix","newRows","newColumns","newData","newMatrix","column","interval","round","l","matrix1","matrix2","checkMatrix","isMatrix","klass","apply","callback","to2DArray","copy","toJSON","isRowVector","isColumnVector","isVector","isSquare","isSymmetric","isEchelonForm","previousColumn","checked","isReducedEchelonForm","echelonForm","clone","h","iMax","swapRows","tmp","reducedEchelonForm","maxRow","pivot","setSubMatrix","neg","mulS","getRow","getRowVector","rowVector","setRow","row1","row2","temp","getColumn","getColumnVector","columnVector","setColumn","swapColumns","column1","column2","addRowVector","subRowVector","mulRowVector","divRowVector","addColumnVector","subColumnVector","mulColumnVector","divColumnVector","mulRow","mulColumn","by","NaN","NEGATIVE_INFINITY","maxIndex","POSITIVE_INFINITY","minIndex","maxRowIndex","minRow","minRowIndex","maxColumn","maxColumnIndex","minColumn","minColumnIndex","diag","type","cumulativeSum","dot","vector2","vector1","mmul","other","Bcolj","Float64Array","s","strassen2x2","a11","b11","a12","b12","a21","b21","a22","b22","m1","m2","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","r1","c1","r2","c2","embed","mat","r","c","resultat","console","warn","blockMult","halfRows","parseInt","halfCols","subMatrix","sub","scaleRows","isFinite","scaleColumns","flipRows","middle","ceil","first","last","flipColumns","kroneckerProduct","kroneckerSum","AxI","eye","IxB","transpose","sortRows","compareFunction","compareNumbers","sortColumns","subMatrixRow","subMatrixColumn","selection","rowIndices","columnIndices","checkRowIndices","checkColumnIndices","rowIndex","columnIndex","trace","sumByRow","sumByColumn","sumAll","product","productByRow","productByColumn","productAll","variance","unbiased","sum1","sum2","varianceByRow","varianceByColumn","varianceAll","standardDeviation","center","centerByRow","centerByColumn","centerAll","scale","getScaleByRow","scaleByRow","getScaleByColumn","scaleByColumn","divider","getScaleAll","scaleAll","Symbol","for","rand","randomInt","randInt","diagonal","identity","negate","tensorProduct","nColumns","super","arrayData","every","element","removeRow","addRow","removeColumn","newRow","addColumn","Matrix","addS","addM","subS","subM","subtractS","subtractM","mul","mulM","multiply","multiplyS","multiplyM","div","divS","divM","divide","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","acos","acosh","asin","asinh","atan","atanh","cbrt","clz32","cos","cosh","expm1","fround","log","log1p","log10","log2","sign","sin","sinh","tan","tanh","trunc","arg0","powS","powM","installMathOperations","WrapperMatrix2D","LuDecomposition","t","LUcolj","kmax","lu","pivotVector","pivotSign","LU","isSingular","solve","count","X","determinant","lowerTriangularMatrix","upperTriangularMatrix","pivotPermutationVector","hypotenuse","QrDecomposition","qr","rdiag","nrm","QR","Rdiag","isFullRank","orthogonalMatrix","SingularValueDecomposition","computeLeftSingularVectors","computeRightSingularVectors","autoTranspose","wantu","Boolean","wantv","swapped","aux","nu","ni","U","V","work","si","nct","nrt","mrc","pp","iter","eps","EPSILON","kase","alpha","isNaN","ks","f","cs","sn","sp","spm1","epm1","sk","ek","shift","g","Y","threshold","scols","Ls","rightSingularVectors","VL","vrows","urows","VLU","solveForDiagonal","inverse","vcols","ucols","norm2","rank","tol","ii","leftSingularVectors","diagonalMatrix","step","params","damping","gradientDifference","evaluatedData","gradientFunc","paramFunction","ans","param","auxParams","funcParam","gradientFunction","matrixFunc","matrixFunction","inverseMatrix","useSVD","leftHandSide","rightHandSide","SMOOTH_K_TOLERANCE","MIN_K_DIST_SCALE","UMAP","learningRate","localConnectivity","nComponents","nEpochs","negativeSampleRate","repulsionStrength","setOpMixRatio","spread","transformQueueSize","targetMetric","targetWeight","targetNNeighbors","distanceFn","numeric","knnIndices","knnDistances","graph","isInitialized","rpForest","initFromRandom","initFromTree","search","searchGraph","embedding","optimizationState","OptimizationState","neighbors","setParam","fit","initializeFit","optimizeLayout","optimizeLayoutAsync","setSupervisedProjection","setPrecomputedKNN","getNEpochs","knnResults","nearestNeighbors","fuzzySimplicialSet","makeSearchFns","makeSearchGraph","processGraphForSupervisedProjection","head","tail","epochsPerSample","initializeSimplicialSetEmbedding","initializeOptimization","prepareForOptimizationLoop","queryPoints","_heap","_tree","initialization","tried","vertex","candidates","candidate","knn","distances","neighbor","distance","transform","toTransform","rawData","init","results","adjustedLocalConnectivity","sigmas","rhos","smoothKNNDistance","computeMembershipStrengths","csrMatrix","_z","initTransform","graphMax","makeEpochsPerSample","assignOptimizationStateParameters","headEmbedding","tailEmbedding","currentEpoch","farDist","categoricalSimplicialSetIntersection","optimizeLayoutStep","getEmbedding","metricNNDescent","leafArray","nIters","delta","rho","rpTreeInit","cj","ck","sparseMatrix","prodMatrix","simplicialSet","target","unknownDist","intersection","fastIntersection","resetLocalConnectivity","nIter","bandwidth","lo","hi","mid","ithDistances","nonZeroDists","interpolation","psum","meanIthDistances","meanDistances","graphValues","entry","w","state","assign","dim","moveOther","epochsPerNegativeSample","epochOfNextNegativeSample","epochOfNextSample","initialAlpha","gamma","xv","yv","parameterValues","maxIterations","errorTolerance","minValues","maxValues","initialValues","parLen","MAX_SAFE_INTEGER","MIN_SAFE_INTEGER","iteration","converged","parameterError","iterations","findABParams","current","distSquared","rDist","gradCoeff","gradD","clip","nNegSamples","epochCallback","epochCompleted","shouldStop","isFinished","err","clipValue","SparseMatrixService","EUCLIDEAN","matSize","minThreshold","getMinimalThreshold","workers","startIdx","endIdx","fullSize","acc","calcMultiColumn","nNeighbours","multiColumnKNN","multiColumnThresholdKnn","some","knnIndexes","knnSizes","knnRes","thresholdWorkers","maxSampleSize","sampleSise","testSetSizePerWorker","tPromises","sampleLength","getSampleDistances","cnt","mi","mj","TSNE","perplexity","epsilon","N","P","gains","ystep","getopt","opt","field","defaultval","returnV","vValue","gaussRandom","u","randn","mu","std","ArrayBuffer","arr","randn2d","uses","l2","x1","x2","D","x1i","x2i","xtod","getIterSize","rowSize","d2p","indexer","hTarget","prow","betamin","betamax","beta","done","maxtries","pj","nHere","pOut","N2","initDataRaw","dists","initSolution","initDataDist","time","timeEnd","getSolution","cg","costGrad","cost","grad","ymean","gid","sid","gainid","newgain","newsid","debugGrad","yold","cg0","cg1","analytic","numerical","quArr","pmul","qsum","qu","prev","Q","premult","MultiColumnReducer","TSNEReducer","reducer","distanceFnames","distanceFns","distanceFnArgs","progressFunc","randomSeed","Date","randomFn","matrixService","UMAPReducer","vectors","_parallelDistanceWorkers","fitAsync","epoc","AvailableReducers","MultiColDimReducer","metrics","distanceAggregation","measures","measure","bitArrayLength","_length","_data","typeName","availableMethods","availableMetrics","obj","epochNum","epochsLength","self","columnsData","distanceMetrics","onMessage","alea","xor128","xorwow","xorshift7","xor4096","tychei","sr","module","exports","global","define","Alea","seed","me","mash","charCodeAt","next","s0","impl","xg","prng","int32","double","quick","XorGen","strseed","z","limit","pool","math","nodecrypto","width","chunks","rngname","startdenom","significance","overflow","mask","seedrandom","shortseed","mixkey","flatten","entropy","tostring","out","randomBytes","Uint8Array","crypto","msCrypto","getRandomValues","browser","plugins","screen","autoseed","arc4","ARC4","S","pass","is_math_call","keylen","depth","prop","typ","smear","stringseed","fromCharCode","ex"],"sourceRoot":""}
|