@datagrok/bio 2.7.1 → 2.7.2
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/dist/18.js +1 -1
- package/dist/18.js.map +1 -1
- package/dist/190.js +1 -1
- package/dist/190.js.map +1 -1
- package/dist/452.js.map +1 -1
- package/dist/729.js +1 -1
- package/dist/729.js.map +1 -1
- package/dist/79.js.map +1 -1
- 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/package.json +3 -3
- package/src/package.ts +12 -12
- package/src/substructure-search/substructure-search.ts +1 -0
- package/tsconfig.json +2 -3
- package/webpack.config.js +1 -1
package/dist/729.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"729.js","mappings":"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,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAEjDtD,EAAS8G,YAAcG,UAAU3D,KAAK,EACjC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC9C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAEjDtD,EAASgH,WAAaC,UAAU3D,KAAK,EAChC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC9C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG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","sources":["webpack://bio/webpack/runtime/chunk loaded","webpack://bio/webpack/runtime/startup chunk dependencies","webpack://bio/./node_modules/@datagrok-libraries/ml/src/typed-metrics/consts.js","webpack://bio/./node_modules/@datagrok-libraries/utils/src/random.js","webpack://bio/./node_modules/@datagrok-libraries/utils/src/vector-operations.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/distance-matrix/proxy.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/distance-matrix/distance-matrix-service.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/spe.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/typed-metrics/typed-metrics.js","webpack://bio/./node_modules/@datagrok-libraries/utils/src/bit-array.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/reduce-dimensionality.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/distance-matrix/distance-matrix.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/workers/dimensionality-reducer.js","webpack://bio/./node_modules/@keckelt/tsne/lib/index.js","webpack://bio/./node_modules/@keckelt/tsne/lib/tsne.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/ml-levenberg-marquardt/src/index.js","webpack://bio/./node_modules/umap-js/dist/heap.js","webpack://bio/./node_modules/umap-js/dist/index.js","webpack://bio/./node_modules/umap-js/dist/matrix.js","webpack://bio/./node_modules/umap-js/dist/nn_descent.js","webpack://bio/./node_modules/umap-js/dist/tree.js","webpack://bio/./node_modules/umap-js/dist/umap.js","webpack://bio/./node_modules/umap-js/dist/utils.js","webpack://bio/webpack/bootstrap","webpack://bio/webpack/runtime/define property getters","webpack://bio/webpack/runtime/ensure chunk","webpack://bio/webpack/runtime/get javascript chunk filename","webpack://bio/webpack/runtime/global","webpack://bio/webpack/runtime/hasOwnProperty shorthand","webpack://bio/webpack/runtime/make namespace object","webpack://bio/webpack/runtime/publicPath","webpack://bio/webpack/runtime/importScripts chunk loading","webpack://bio/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var next = __webpack_require__.x;\n__webpack_require__.x = () => {\n\treturn Promise.all([\n\t\t__webpack_require__.e(1),\n\t\t__webpack_require__.e(452)\n\t]).then(next);\n};","export var StringMetricsNames;\n(function (StringMetricsNames) {\n StringMetricsNames[\"Levenshtein\"] = \"Levenshtein\";\n StringMetricsNames[\"JaroWinkler\"] = \"Jaro-Winkler\";\n StringMetricsNames[\"Manhattan\"] = \"Manhattan\";\n})(StringMetricsNames || (StringMetricsNames = {}));\nexport var VectorMetricsNames;\n(function (VectorMetricsNames) {\n VectorMetricsNames[\"Euclidean\"] = \"Euclidean\";\n})(VectorMetricsNames || (VectorMetricsNames = {}));\nexport var BitArrayMetricsNames;\n(function (BitArrayMetricsNames) {\n BitArrayMetricsNames[\"Tanimoto\"] = \"Tanimoto\";\n BitArrayMetricsNames[\"Dice\"] = \"Dice\";\n BitArrayMetricsNames[\"Asymmetric\"] = \"Asymmetric\";\n BitArrayMetricsNames[\"BraunBlanquet\"] = \"Braun-Blanquet\";\n BitArrayMetricsNames[\"Cosine\"] = \"Cosine\";\n BitArrayMetricsNames[\"Kulczynski\"] = \"Kulczynski\";\n BitArrayMetricsNames[\"McConnaughey\"] = \"Mc-Connaughey\";\n BitArrayMetricsNames[\"RogotGoldberg\"] = \"Rogot-Goldberg\";\n BitArrayMetricsNames[\"Russel\"] = \"Russel\";\n BitArrayMetricsNames[\"Sokal\"] = \"Sokal\";\n BitArrayMetricsNames[\"Hamming\"] = \"Hamming\";\n BitArrayMetricsNames[\"Euclidean\"] = \"Euclidean\";\n})(BitArrayMetricsNames || (BitArrayMetricsNames = {}));\nexport var DistanceMetricsSubjects;\n(function (DistanceMetricsSubjects) {\n DistanceMetricsSubjects[\"Vector\"] = \"Vector\";\n DistanceMetricsSubjects[\"String\"] = \"String\";\n DistanceMetricsSubjects[\"BitArray\"] = \"BitArray\";\n DistanceMetricsSubjects[\"MacroMolecule\"] = \"MacroMolecule\";\n DistanceMetricsSubjects[\"Number\"] = \"Number\";\n})(DistanceMetricsSubjects || (DistanceMetricsSubjects = {}));\nexport var NumberMetricsNames;\n(function (NumberMetricsNames) {\n NumberMetricsNames[\"NumericDistance\"] = \"NumericDistance\";\n})(NumberMetricsNames || (NumberMetricsNames = {}));\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY29uc3RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBTixJQUFZLGtCQUlUO0FBSkgsV0FBWSxrQkFBa0I7SUFDMUIsaURBQTJCLENBQUE7SUFDM0Isa0RBQTRCLENBQUE7SUFDNUIsNkNBQXVCLENBQUE7QUFDekIsQ0FBQyxFQUpTLGtCQUFrQixLQUFsQixrQkFBa0IsUUFJM0I7QUFFSCxNQUFNLENBQU4sSUFBWSxrQkFFVDtBQUZILFdBQVksa0JBQWtCO0lBQzFCLDZDQUF1QixDQUFBO0FBQ3pCLENBQUMsRUFGUyxrQkFBa0IsS0FBbEIsa0JBQWtCLFFBRTNCO0FBRUgsTUFBTSxDQUFOLElBQVksb0JBYVQ7QUFiSCxXQUFZLG9CQUFvQjtJQUM1Qiw2Q0FBcUIsQ0FBQTtJQUNyQixxQ0FBYSxDQUFBO0lBQ2IsaURBQXlCLENBQUE7SUFDekIsd0RBQWdDLENBQUE7SUFDaEMseUNBQWlCLENBQUE7SUFDakIsaURBQXlCLENBQUE7SUFDekIsc0RBQThCLENBQUE7SUFDOUIsd0RBQWdDLENBQUE7SUFDaEMseUNBQWlCLENBQUE7SUFDakIsdUNBQWUsQ0FBQTtJQUNmLDJDQUFtQixDQUFBO0lBQ25CLCtDQUF1QixDQUFBO0FBQ3pCLENBQUMsRUFiUyxvQkFBb0IsS0FBcEIsb0JBQW9CLFFBYTdCO0FBRUgsTUFBTSxDQUFOLElBQVksdUJBTVQ7QUFOSCxXQUFZLHVCQUF1QjtJQUMvQiw0Q0FBaUIsQ0FBQTtJQUNqQiw0Q0FBaUIsQ0FBQTtJQUNqQixnREFBcUIsQ0FBQTtJQUNyQiwwREFBK0IsQ0FBQTtJQUMvQiw0Q0FBaUIsQ0FBQTtBQUNuQixDQUFDLEVBTlMsdUJBQXVCLEtBQXZCLHVCQUF1QixRQU1oQztBQUVILE1BQU0sQ0FBTixJQUFZLGtCQUVYO0FBRkQsV0FBWSxrQkFBa0I7SUFDNUIseURBQW1DLENBQUE7QUFDckMsQ0FBQyxFQUZXLGtCQUFrQixLQUFsQixrQkFBa0IsUUFFN0IiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZW51bSBTdHJpbmdNZXRyaWNzTmFtZXMge1xuICAgIExldmVuc2h0ZWluID0gJ0xldmVuc2h0ZWluJyxcbiAgICBKYXJvV2lua2xlciA9ICdKYXJvLVdpbmtsZXInLFxuICAgIE1hbmhhdHRhbiA9ICdNYW5oYXR0YW4nLFxuICB9XG5cbmV4cG9ydCBlbnVtIFZlY3Rvck1ldHJpY3NOYW1lcyB7XG4gICAgRXVjbGlkZWFuID0gJ0V1Y2xpZGVhbicsXG4gIH1cblxuZXhwb3J0IGVudW0gQml0QXJyYXlNZXRyaWNzTmFtZXMge1xuICAgIFRhbmltb3RvID0gJ1Rhbmltb3RvJyxcbiAgICBEaWNlID0gJ0RpY2UnLFxuICAgIEFzeW1tZXRyaWMgPSAnQXN5bW1ldHJpYycsXG4gICAgQnJhdW5CbGFucXVldCA9ICdCcmF1bi1CbGFucXVldCcsXG4gICAgQ29zaW5lID0gJ0Nvc2luZScsXG4gICAgS3VsY3p5bnNraSA9ICdLdWxjenluc2tpJyxcbiAgICBNY0Nvbm5hdWdoZXkgPSAnTWMtQ29ubmF1Z2hleScsXG4gICAgUm9nb3RHb2xkYmVyZyA9ICdSb2dvdC1Hb2xkYmVyZycsXG4gICAgUnVzc2VsID0gJ1J1c3NlbCcsXG4gICAgU29rYWwgPSAnU29rYWwnLFxuICAgIEhhbW1pbmcgPSAnSGFtbWluZycsXG4gICAgRXVjbGlkZWFuID0gJ0V1Y2xpZGVhbicsXG4gIH1cblxuZXhwb3J0IGVudW0gRGlzdGFuY2VNZXRyaWNzU3ViamVjdHMge1xuICAgIFZlY3RvciA9ICdWZWN0b3InLFxuICAgIFN0cmluZyA9ICdTdHJpbmcnLFxuICAgIEJpdEFycmF5ID0gJ0JpdEFycmF5JyxcbiAgICBNYWNyb01vbGVjdWxlID0gJ01hY3JvTW9sZWN1bGUnLFxuICAgIE51bWJlciA9ICdOdW1iZXInLFxuICB9XG5cbmV4cG9ydCBlbnVtIE51bWJlck1ldHJpY3NOYW1lcyB7XG4gIE51bWVyaWNEaXN0YW5jZSA9ICdOdW1lcmljRGlzdGFuY2UnLFxufVxuXG4iXX0=","/**\n * Generates single random float from 0 to range.\n *\n * @export\n * @param {number} range Max generating value.\n * @return {number} A random float generated.\n */\nexport function randomFloat(range) {\n return Math.random() * range;\n}\n/**\n * Generates single random integer from 0 to range.\n *\n * @export\n * @param {number} range Max generating value.\n * @return {number} A random integer generated.\n */\nexport function randomInt(range) {\n return Math.floor(randomFloat(range));\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZG9tLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicmFuZG9tLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUMsS0FBYTtJQUN2QyxPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUM7QUFDL0IsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUMsS0FBYTtJQUNyQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDeEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVzIHNpbmdsZSByYW5kb20gZmxvYXQgZnJvbSAwIHRvIHJhbmdlLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7bnVtYmVyfSByYW5nZSBNYXggZ2VuZXJhdGluZyB2YWx1ZS5cbiAqIEByZXR1cm4ge251bWJlcn0gQSByYW5kb20gZmxvYXQgZ2VuZXJhdGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmFuZG9tRmxvYXQocmFuZ2U6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLnJhbmRvbSgpICogcmFuZ2U7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIHNpbmdsZSByYW5kb20gaW50ZWdlciBmcm9tIDAgdG8gcmFuZ2UuXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtudW1iZXJ9IHJhbmdlIE1heCBnZW5lcmF0aW5nIHZhbHVlLlxuICogQHJldHVybiB7bnVtYmVyfSBBIHJhbmRvbSBpbnRlZ2VyIGdlbmVyYXRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJhbmRvbUludChyYW5nZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIE1hdGguZmxvb3IocmFuZG9tRmxvYXQocmFuZ2UpKTtcbn1cbiJdfQ==","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 */\nfunction 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 const diff = vectorAdd(p, q, -1);\n const sqdiff = vectorSquare(diff);\n const sqdiffSumm = itemsSum(sqdiff);\n return Math.sqrt(sqdiffSumm);\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 * @param {Vector} data numerical array\n */\nexport function normalize(data) {\n let mean = 0;\n let std = 0;\n for (let i = 0; i < data.length; ++i)\n mean += data[i];\n mean /= data.length;\n for (let i = 0; i < data.length; ++i)\n std += (data[i] - mean) * (data[i] - mean);\n std = Math.sqrt(std / data.length);\n for (let i = 0; i < data.length; ++i)\n data[i] = (data[i] - mean) / std;\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVjdG9yLW9wZXJhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ2ZWN0b3Itb3BlcmF0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVMsTUFBTSxFQUF1QyxNQUFNLHFCQUFxQixDQUFDO0FBQ3pGLE9BQU8sRUFBQyxXQUFXLEVBQUUsU0FBUyxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBRWhEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsTUFBTSxDQUFDLFlBQXFCLEtBQUssRUFBRSxVQUFrQixrQkFBa0I7SUFDckYsSUFBSSxDQUFDLFNBQVM7UUFDWixNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzdCLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQVMsZUFBZSxDQUFDLFVBQWtCLEVBQUUsVUFBa0IsRUFBRSxPQUFlLENBQUM7SUFDL0UsT0FBTyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6RixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsTUFBYztJQUM1QyxPQUFPLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQ3ZDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1B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QUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBQ3JFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge01hdHJpeCwgVmVjdG9yLCBDb29yZGluYXRlcywgVmVjdG9ycywgRGlzdGFuY2VNZXRyaWN9IGZyb20gJy4vdHlwZS1kZWNsYXJhdGlvbnMnO1xuaW1wb3J0IHtyYW5kb21GbG9hdCwgcmFuZG9tSW50fSBmcm9tICcuL3JhbmRvbSc7XG5cbi8qKlxuICogQXNzZXJ0cyBhIGNvbmRpdGlvbiBieSB0aHJvd2luZyBhbiBFcnJvci5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtjb25kaXRpb249ZmFsc2VdIENvbmRpdGlvbiB0byBhc3NlcnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2U9J0Fzc2VydGlvbiBlcnJvci4nXSBNZXNzYWdlIHRvIG91dHB1dC5cbiAqIEB0aHJvd3Mge0Vycm9yfVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0KGNvbmRpdGlvbjogYm9vbGVhbiA9IGZhbHNlLCBtZXNzYWdlOiBzdHJpbmcgPSAnQXNzZXJ0aW9uIGVycm9yLicpIHtcbiAgaWYgKCFjb25kaXRpb24pXG4gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgbmV3IHR3by1kaW1lbnNpb25hbCBhcnJheSBhbmQgZmlsbHMgaXQgd2l0aCB0aGUgdmFsdWUgZ2l2ZW4uXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGRpbWVuc2lvbjEgVGhlIGZpcnN0IGRpbWVuc2lvbiBvZiB0aGUgY29vcmRpbmF0ZXMgKG51bWJlciBvZiByb3dzKS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBkaW1lbnNpb24yIFRoZSBzZWNvbmQgZGltZW5zaW9uIG9mIHRoZSBjb29yZGluYXRlcyAobnVtYmVyIG9mIGNvbHVtbnMpLlxuICogQHBhcmFtIHtudW1iZXJ9IFtmaWxsPTBdIEEgdmFsdWUgdG8gZmlsbCB0aGUgY29vcmRpbmF0ZXMgd2l0aC5cbiAqIEByZXR1cm4ge0Nvb3JkaW5hdGVzfSBBIHR3by1kaW1lbnNpb25hbCBmaWxsZWQgd2l0aCB0aGUgdmFsdWUgZ2l2ZW4uXG4gKiBAdG9kbyBNaWdodCBiZSBzbG93IHNpbmNlIHVzZWQgQXJyYXkubWFwLiBQcm9iYWJseSBuZWVkcyBwZXJmb3JtYW5jZSByZXZpc2lvbi5cbiAqL1xuZnVuY3Rpb24gaW5pdENvb3JkaW5hdGVzKGRpbWVuc2lvbjE6IG51bWJlciwgZGltZW5zaW9uMjogbnVtYmVyLCBmaWxsOiBudW1iZXIgPSAwKTogQ29vcmRpbmF0ZXMge1xuICByZXR1cm4gbmV3IEFycmF5KGRpbWVuc2lvbjEpLmZpbGwoZmlsbCkubWFwKCgpID0+IChuZXcgVmVjdG9yKGRpbWVuc2lvbjIpLmZpbGwoZmlsbCkpKTtcbn1cblxuLyoqXG4gKiBUcmFuc3Bvc2UgbWF0cml4LlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7TWF0cml4fSBtYXRyaXggVGhlIG1hdHJpeCB0byBiZSB0cmFuc3Bvc2VkLlxuICogQHJldHVybiB7TWF0cml4fSBUcmFuc3Bvc2VkIG1hdHJpeC5cbiAqIEB0b2RvIE1pZ2h0IGJlIHNsb3cgc2luY2UgdXNlZCBBcnJheS5tYXAuIFByb2JhYmx5IG5lZWRzIHBlcmZvcm1hbmNlIHJldmlzaW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNwb3NlTWF0cml4KG1hdHJpeDogTWF0cml4KTogTWF0cml4IHtcbiAgcmV0dXJuIG5ldyBBcnJheShtYXRyaXhbMF0ubGVuZ3RoKS5maWxsKDApXG4gICAgLm1hcCgoXywgaSkgPT4gKG5ldyBWZWN0b3IobWF0cml4Lmxlbmd0aCkuZmlsbCgwKS5tYXAoKF8sIGopID0+IChtYXRyaXhbal1baV0pKSkpO1xufVxuXG4vKipcbiAqIEFkZHMgdHdvIHZlY3RvcnMgd2l0aCB0aGUgc2Vjb25kIG9uZSB0byBiZSBtdWx0aXBsaWVkIGJ5IHRoZSBnaXZlbiByYXRpby5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge1ZlY3Rvcn0gcCBUaGUgZmlyc3QgdmVjdG9yIHRvIGFkZC5cbiAqIEBwYXJhbSB7VmVjdG9yfSBxIFRoZSBzZWNvbmQgdmVjdG9yIHRvIGFkZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbbXVsdGlwbGllcj0xXSBBIG11bHRpcGxpZXIgdG8gYmUgdXNlZCBiZWZvcmUgdGhlIHNlY29uZCB2ZWN0b3IgaXMgYWRkZWQuXG4gKiBAcmV0dXJuIHtWZWN0b3J9IE5ldyB2ZWN0b3IgY29udGFpbmVkIHRoZSByZXN1bHQgb2Ygb3BlcmF0aW9uIHArbXVsdGlwbGllcipxLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmVjdG9yQWRkKHA6IFZlY3RvciwgcTogVmVjdG9yLCBtdWx0aXBsaWVyOiBudW1iZXIgPSAxKTogVmVjdG9yIHtcbiAgY29uc3Qgbkl0ZW1zID0gcC5sZW5ndGg7XG5cbiAgYXNzZXJ0KG5JdGVtcyA9PSBxLmxlbmd0aCwgJ1ZlY3RvciBsZW5ndGhzIGRvIG5vdCBtYXRjaC4nKTtcblxuICBjb25zdCB0b3RhbCA9IG5ldyBWZWN0b3Iobkl0ZW1zKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHAubGVuZ3RoOyArK2kpXG4gICAgdG90YWxbaV0gPSBwW2ldICsgbXVsdGlwbGllciAqIHFbaV07XG5cbiAgcmV0dXJuIHRvdGFsO1xufVxuXG4vKipcbiAqIFN1bXMgdGhlIHZlY3RvcidzIGl0ZW1zLlxuICpcbiAqIEBwYXJhbSB7VmVjdG9yfSB2IFRoZSB2ZWN0b3IgdG8gYmUgc3VtbWVkLlxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgdmVjdG9yJ3MgaXRlbXMgc3VtLlxuICovXG5mdW5jdGlvbiBpdGVtc1N1bSh2OiBWZWN0b3IpOiBudW1iZXIge1xuICBsZXQgdG90YWwgPSAwO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdi5sZW5ndGg7ICsraSlcbiAgICB0b3RhbCArPSB2W2ldO1xuXG4gIHJldHVybiB0b3RhbDtcbn1cblxuLyoqXG4gKiBTdXFhcmVzIHRoZSB2ZWN0b3IncyBpdGVtcy5cbiAqXG4gKiBAcGFyYW0ge1ZlY3Rvcn0gdiBUaGUgdmVjdG9yIHRvIHNxdWFyZS5cbiAqIEByZXR1cm4ge1ZlY3Rvcn0gQSBuZXcgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIG9yaWdpbmFsJ3MgaXRlbXMgc3F1YXJlZC5cbiAqL1xuZnVuY3Rpb24gdmVjdG9yU3F1YXJlKHY6IFZlY3Rvcik6IFZlY3RvciB7XG4gIGNvbnN0IG5JdGVtcyA9IHYubGVuZ3RoO1xuICBjb25zdCB0b3RhbCA9IG5ldyBWZWN0b3Iobkl0ZW1zKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHYubGVuZ3RoOyArK2kpXG4gICAgdG90YWxbaV0gPSB2W2ldICogdltpXTtcblxuICByZXR1cm4gdG90YWw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2ZWN0b3JMZW5ndGgodjogVmVjdG9yKTogbnVtYmVyIHtcbiAgbGV0IHNxclN1bTogbnVtYmVyID0gMDtcbiAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHYubGVuZ3RoOyBpKyspXG4gICAgc3FyU3VtICs9IHZbaV0gKiB2W2ldO1xuICByZXR1cm4gTWF0aC5zcXJ0KHNxclN1bSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2ZWN0b3JEb3RQcm9kdWN0KHYxOiBWZWN0b3IsIHYyOiBWZWN0b3IpOiBudW1iZXIge1xuICBpZiAodjEubGVuZ3RoICE9IHYyLmxlbmd0aClcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBkaW1lbnNpb25hbGl0eSBvZiB0aGUgdmVjdG9ycyBtdXN0IG1hdGNoJyk7XG4gIGxldCBwcm9kOiBudW1iZXIgPSAwO1xuICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdjEubGVuZ3RoOyBpKyspXG4gICAgcHJvZCArPSB2MVtpXSAqIHYyW2ldO1xuICByZXR1cm4gcHJvZDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZpbGxlZCB3aXRoIHJhbmRvbSBmbG9hdGluZyBwb2ludCB2YWx1ZXMuXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtudW1iZXJ9IGRpbWVuc2lvbjEgVGhlIGZpcnN0IGRpbWVuc2lvbiBvZiB0aGUgbWF0cml4LlxuICogQHBhcmFtIHtudW1iZXJ9IGRpbWVuc2lvbjIgVGhlIHNlY29uZCBkaW1lbnNpb24gb2YgdGhlIG1hdHJpeC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbc2NhbGU9MS5dIE1heCB2YWx1ZSBnaXZlbiBieSByYW5kb20gZ2VuZXJhdG9yLlxuICogQHJldHVybiB7TWF0cml4fSBBIG5ldyBtYXRyaXggZmlsbGVkIHdpdGggcmFuZG9tIGZsb2F0aW5nIHBvaW50ICB2YWx1ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWxsUmFuZG9tTWF0cml4KGRpbWVuc2lvbjE6IG51bWJlciwgZGltZW5zaW9uMjogbnVtYmVyLCBzY2FsZTogbnVtYmVyID0gMS4pOiBNYXRyaXgge1xuICBjb25zdCBtYXRyaXggPSBpbml0Q29vcmRpbmF0ZXMoZGltZW5zaW9uMSwgZGltZW5zaW9uMik7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaW1lbnNpb24xOyArK2kpIHtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGRpbWVuc2lvbjI7ICsrailcbiAgICAgIG1hdHJpeFtpXVtqXSA9IHJhbmRvbUZsb2F0KHNjYWxlKTtcbiAgfVxuICByZXR1cm4gbWF0cml4O1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZXMgRXVjbGlkZWFuIGRpc3RhbmNlIGJldHdlZW4gdHdvIHZlY3RvcnMuXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtWZWN0b3J9IHAgVGhlIGZpcnN0IHZlY3Rvci5cbiAqIEBwYXJhbSB7VmVjdG9yfSBxIFRoZSBzZWNvbmQgdmVjdG9yLlxuICogQHJldHVybiB7bnVtYmVyfSBFdWNsaWRlYW4gZGlzdGFuY2UgYmV0d2VlbiB0aGUgZ2l2ZW4gdmVjdG9ycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGF0ZUV1Y2xpZGVhbkRpc3RhbmNlKHA6IFZlY3RvciwgcTogVmVjdG9yKTogbnVtYmVyIHtcbiAgY29uc3QgZGlmZiA9IHZlY3RvckFkZChwLCBxLCAtMSk7XG4gIGNvbnN0IHNxZGlmZiA9IHZlY3RvclNxdWFyZShkaWZmKTtcbiAgY29uc3Qgc3FkaWZmU3VtbSA9IGl0ZW1zU3VtKHNxZGlmZik7XG4gIHJldHVybiBNYXRoLnNxcnQoc3FkaWZmU3VtbSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRpc3RhbmNlIG1hdHJpeCB1c2luZyBhIGN1c3RvbSBkaXN0YW5jZSBmdW5jdGlvbi5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge1ZlY3RvcnN9IGRhdGEgSW5wdXQgdmVjdG9ycyB0byBjYWxjdWxhdGUgZGlzdGFuY2VzLlxuICogQHBhcmFtIHtEaXN0YW5jZU1ldHJpY30gZGlzdGFuY2UgQ3VzdG9tIGRpc3RhbmNlIGZ1bmN0aW9uLlxuICogQHJldHVybiB7TWF0cml4fSBDYWxjdWxhdGVkIGN1c3RvbSBkaXN0YW5jZSBtYXRyaXguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWxjRGlzdGFuY2VNYXRyaXgoZGF0YTogVmVjdG9ycywgZGlzdGFuY2U6IERpc3RhbmNlTWV0cmljKTogTWF0cml4IHtcbiAgY29uc3Qgbkl0ZW1zID0gZGF0YS5sZW5ndGg7XG4gIGNvbnN0IG1hdHJpeCA9IGluaXRDb29yZGluYXRlcyhuSXRlbXMsIG5JdGVtcywgMCk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuSXRlbXM7ICsraSkge1xuICAgIGZvciAobGV0IGogPSBpICsgMTsgaiA8IG5JdGVtczsgKytqKSB7XG4gICAgICBjb25zdCBkOiBudW1iZXIgPSAoZGF0YVtpXSA9PSBudWxsKSB8fCAoZGF0YVtqXSA9PSBudWxsKSA/IDAgOiBkaXN0YW5jZShkYXRhW2ldLCBkYXRhW2pdKTtcbiAgICAgIG1hdHJpeFtpXVtqXSA9IG1hdHJpeFtqXVtpXSA9IGQ7XG4gICAgfVxuICB9XG4gIHJldHVybiBtYXRyaXg7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRpc3RhbmNlIG1hdHJpeCB1c2luZyBhIGN1c3RvbSBkaXN0YW5jZSBmdW5jdGlvbi5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge1ZlY3RvcnN9IGRhdGEgSW5wdXQgdmVjdG9ycyB0byBjYWxjdWxhdGUgZGlzdGFuY2VzLlxuICogQHBhcmFtIHtEaXN0YW5jZU1ldHJpY30gZGlzdGFuY2UgQ3VzdG9tIGRpc3RhbmNlIGZ1bmN0aW9uLlxuICogQHJldHVybiB7TWF0cml4fSBDYWxjdWxhdGVkIGN1c3RvbSBkaXN0YW5jZSBtYXRyaXguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWxjTm9ybWFsaXplZERpc3RhbmNlTWF0cml4KGRhdGE6IFZlY3RvcnMsIGRpc3RhbmNlOiBEaXN0YW5jZU1ldHJpYyk6IE1hdHJpeCB7XG4gIGNvbnN0IG5JdGVtcyA9IGRhdGEubGVuZ3RoO1xuICBjb25zdCBtYXRyaXggPSBpbml0Q29vcmRpbmF0ZXMobkl0ZW1zLCBuSXRlbXMsIDApO1xuICBsZXQgbWF4ID0gTnVtYmVyLk1JTl9WQUxVRTtcbiAgbGV0IG1pbiA9IE51bWJlci5NQVhfVkFMVUU7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbkl0ZW1zOyArK2kpIHtcbiAgICBmb3IgKGxldCBqID0gaTsgaiA8IG5JdGVtczsgKytqKSB7XG4gICAgICBjb25zdCBkOiBudW1iZXIgPSAoZGF0YVtpXSA9PSBudWxsKSB8fCAoZGF0YVtqXSA9PSBudWxsIHx8IGkgPT09IGopID8gMCA6IGRpc3RhbmNlKGRhdGFbaV0sIGRhdGFbal0pO1xuICAgICAgbWF0cml4W2ldW2pdID0gbWF0cml4W2pdW2ldID0gZDtcbiAgICAgIGlmIChkID4gbWF4KSBtYXggPSBkO1xuICAgICAgaWYgKGQgPCBtaW4pIG1pbiA9IGQ7XG4gICAgfVxuICB9XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbkl0ZW1zOyArK2kpIHtcbiAgICBmb3IgKGxldCBqID0gaSArIDE7IGogPCBuSXRlbXM7ICsrailcbiAgICAgIG1hdHJpeFtpXVtqXSA9IG1hdHJpeFtqXVtpXSA9IChtYXRyaXhbaV1bal0gLSBtaW4pIC8gKG1heCAtIG1pbik7XG4gIH1cbiAgcmV0dXJuIG1hdHJpeDtcbn1cblxuLyoqIEdlbmVyYXRlcyBhcnJheSBmcm9tIGEgcmFuZ2UgW2JlZ2luOyBlbmRdIG9yIFtiZWdpbjsgZW5kKSBpZiBlbmRFeGNsdXNpdmUuICoqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlblJhbmdlKGJlZ2luOiBudW1iZXIsIGVuZDogbnVtYmVyLCBlbmRFeGNsdXNpdmUgPSBmYWxzZSk6IEludDMyQXJyYXkge1xuICBjb25zdCBuSXRlbXMgPSBlbmQgLSBiZWdpbiArIChlbmRFeGNsdXNpdmUgPyAwIDogMSk7XG4gIGNvbnN0IHNlcmllcyA9IG5ldyBJbnQzMkFycmF5KG5JdGVtcyk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuSXRlbXM7ICsraSlcbiAgICBzZXJpZXNbaV0gPSBiZWdpbiArIGk7XG5cbiAgcmV0dXJuIHNlcmllcztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIG9yZGVyIG9mIHZhbHVlcyBhcyBpZiB0aGV5IGFyZSBzb3J0ZWQuXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHthbnlbXX0gdmFsdWVzIElucHV0IGFycmF5LlxuICogQHBhcmFtIHtib29sZWFufSBbcmV2ZXJzZT1mYWxzZV0gV2hldGhlciB0byByZXR1cm4gcmV2ZXJzZWQgb3JkZXIuXG4gKiBAcmV0dXJuIHtudW1iZXJbXX0gVGhlIG9yZGVyIGNvbXB1dGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXJnU29ydCh2YWx1ZXM6IGFueVtdLCByZXZlcnNlID0gZmFsc2UpOiBudW1iZXJbXSB7XG4gIGNvbnN0IHNvcnRmbiA9IHJldmVyc2UgPyAoYTogYW55W10sIGI6IGFueVtdKSA9PiAoYlswXSAtIGFbMF0pIDogKGE6IGFueVtdLCBiOiBhbnlbXSkgPT4gKGFbMF0gLSBiWzBdKTtcbiAgY29uc3QgZGVjb3IgPSAodjogYW55LCBpOiBudW1iZXIpID0+IFt2LCBpXTsgLy8gc2V0IGluZGV4IHRvIHZhbHVlXG4gIGNvbnN0IHVuZGVjb3IgPSAoYTogYW55W10pID0+IGFbMV07IC8vIGxlYXZlIG9ubHkgaW5kZXhcbiAgY29uc3QgX2FyZ3NvcnQgPSAoYXJyOiBhbnlbXSkgPT4gYXJyLm1hcChkZWNvcikuc29ydChzb3J0Zm4pLm1hcCh1bmRlY29yKTtcbiAgcmV0dXJuIF9hcmdzb3J0KHZhbHVlcyk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgaW5kZXhlcyBvZiB0aGUgbW9zdCBkaXZlcnNlIG9iamVjdHMgYWNjb3JkaW5nIHRvIHRoZSBkaXN0IGZ1bmN0aW9uXG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoIHRvdGFsIG51bWJlciBvZiBvYmplY3RzXG4gKiBAcGFyYW0ge251bWJlcn0gbiBudW1iZXIgb2YgZGl2ZXJzZSBlbGVtZW50cyB0byBmaW5kXG4gKiBAcGFyYW0geyhpMTogbnVtYmVyLCBpMjogbnVtYmVyKSA9PiBudW1iZXJ9IGRpc3QgYSBmdW5jdGlvbiB3aGljaCBjYWxjdWxhdGVzIGRpc3RhbmNlIGJldHdlZW5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0d28gb2JqZWN0cyB1c2luZyB0aGVpciBpbmRleGVzXG4gKiBAcmV0dXJucyB7bnVtYmVyW119IFRoZSBpbmRleGVzIG9mIHRoZSBtb3N0IGRpdmVyc2Ugb2JqZWN0c1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGl2ZXJzZVN1YnNldChsZW5ndGg6IG51bWJlciwgbjogbnVtYmVyLCBkaXN0OiAoaTE6IG51bWJlciwgaTI6IG51bWJlcikgPT4gbnVtYmVyKTogbnVtYmVyW10ge1xuICBmdW5jdGlvbiBtYXhCeSh2YWx1ZXM6IEl0ZXJhYmxlSXRlcmF0b3I8bnVtYmVyPiwgb3JkZXJCeTogKGk6IG51bWJlcikgPT4gbnVtYmVyKSB7XG4gICAgbGV0IG1heFZhbHVlID0gbnVsbDtcbiAgICBsZXQgbWF4T3JkZXJCeSA9IG51bGw7XG5cbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdmFsdWVzKSB7XG4gICAgICBjb25zdCBlbGVtZW50T3JkZXJCeSA9IG9yZGVyQnkoZWxlbWVudCk7XG4gICAgICBpZiAobWF4T3JkZXJCeSA9PSBudWxsIHx8IGVsZW1lbnRPcmRlckJ5ID4gbWF4T3JkZXJCeSkge1xuICAgICAgICBtYXhWYWx1ZSA9IGVsZW1lbnQ7XG4gICAgICAgIG1heE9yZGVyQnkgPSBlbGVtZW50T3JkZXJCeTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1heFZhbHVlO1xuICB9XG5cbiAgY29uc3Qgc3Vic2V0ID0gW3JhbmRvbUludChsZW5ndGggLSAxKV07XG4gIGNvbnN0IGNvbXBsZW1lbnQgPSBuZXcgU2V0KCk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGlmICghc3Vic2V0LmluY2x1ZGVzKGkpKVxuICAgICAgY29tcGxlbWVudC5hZGQoaSk7XG4gIH1cblxuICB3aGlsZSAoc3Vic2V0Lmxlbmd0aCA8IG4pIHtcbiAgICBjb25zdCBpZHggPSBtYXhCeShcbiAgICAgIGNvbXBsZW1lbnQudmFsdWVzKCkgYXMgSXRlcmFibGVJdGVyYXRvcjxudW1iZXI+LFxuICAgICAgKGkpID0+IE1hdGgubWluLmFwcGx5KE1hdGgsIHN1YnNldC5tYXAoZnVuY3Rpb24odmFsLCBpbmRleCkge1xuICAgICAgICByZXR1cm4gZGlzdChpLCB2YWwpO1xuICAgICAgfSkpKTtcbiAgICBpZiAoaWR4KSB7XG4gICAgICBzdWJzZXQucHVzaChpZHgpO1xuICAgICAgY29tcGxlbWVudC5kZWxldGUoaWR4KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN1YnNldDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIG5vcm1hbGl6ZWQgdmVjdG9yXG4gKiBAcGFyYW0ge1ZlY3Rvcn0gZGF0YSBudW1lcmljYWwgYXJyYXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZShkYXRhOiBWZWN0b3IpOiBWZWN0b3Ige1xuICBsZXQgbWVhbiA9IDA7XG4gIGxldCBzdGQgPSAwO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7ICsraSlcbiAgICBtZWFuICs9IGRhdGFbaV07XG5cbiAgbWVhbiAvPSBkYXRhLmxlbmd0aDtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyArK2kpXG4gICAgc3RkICs9IChkYXRhW2ldIC0gbWVhbikgKiAoZGF0YVtpXSAtIG1lYW4pO1xuXG4gIHN0ZCA9IE1hdGguc3FydChzdGQgLyBkYXRhLmxlbmd0aCk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgKytpKVxuICAgIGRhdGFbaV0gPSAoZGF0YVtpXSAtIG1lYW4pIC8gc3RkO1xuXG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIEZpbmRzIHNldCBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIGxpc3RzLlxuICogQHBhcmFtIHthbnlbXX0gYSBUaGUgZmlyc3QgbGlzdC5cbiAqIEBwYXJhbSB7YW55W119IGIgVGhlIHNlY29uZCBsaXN0LlxuICogQHJldHVybiB7YW55W119XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXREaWZmZXJlbmNlKGE6IGFueVtdLCBiOiBhbnlbXSk6IGFueVtdIHtcbiAgY29uc3QgYlNldCA9IG5ldyBTZXQoYik7XG4gIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQoYS5maWx0ZXIoKHgpID0+ICFiU2V0Lmhhcyh4KSkpLnZhbHVlcygpKTtcbn1cbiJdfQ==","/** 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=","export class DistanceMatrixService {\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) {\n return new Promise(async (resolve, reject) => {\n try {\n const len = values.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, fnName, startRow, startCol, chunckSize: end - start });\n promises[i] = new Promise((resolveWorker, rejectWorker) => {\n this._workers[i].onmessage = ({ data: { error, distanceMatrixData, min, max } }) => {\n this._terminateOnComplete && 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzdGFuY2UtbWF0cml4LXNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJkaXN0YW5jZS1tYXRyaXgtc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLE9BQU8scUJBQXFCO0lBSTlCLFlBQW1CLG9CQUFvQixHQUFHLElBQUksRUFBRSxtQkFBbUIsR0FBRyxJQUFJO1FBQ3hFLE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQztRQUNsRCxJQUFJLENBQUMsWUFBWSxHQUFHLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1RSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO2FBQ3BELEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQywwQkFBMEIsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvRSxJQUFJLENBQUMsb0JBQW9CLEdBQUcsbUJBQW1CLENBQUM7SUFDbEQsQ0FBQztJQUFBLENBQUM7SUFFSyxLQUFLLENBQUMsSUFBSSxDQUFJLE1BQStCLEVBQUUsTUFBb0IsRUFDeEUsU0FBUyxHQUFHLElBQUk7UUFDaEIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQzNDLElBQUk7Z0JBQ0YsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztnQkFDMUIsTUFBTSxRQUFRLEdBQUcsSUFBSSxLQUFLLENBQWdCLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDN0QsTUFBTSxXQUFXLEdBQUcsR0FBRyxH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STtvQ0FDWixJQUFJLEdBQUcsR0FBRyxDQUFDO2dDQUNiLGFBQWEsRUFBRSxDQUFDOzZCQUNqQjt3QkFDSCxDQUFDLENBQUM7b0JBQ0osQ0FBQyxDQUFDLENBQUM7aUJBQ0o7Z0JBQ0QsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUM1QixJQUFJLFNBQVM7b0JBQ1gsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN4RyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7YUFDekI7WUFBQyxPQUFPLENBQUMsRUFBRTtnQkFDVixNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDWDtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLFNBQVM7UUFDZCxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDeEQsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtLbm93bk1ldHJpY3N9IGZyb20gJy4uL3R5cGVkLW1ldHJpY3MnO1xuXG5leHBvcnQgY2xhc3MgRGlzdGFuY2VNYXRyaXhTZXJ2aWNlIHtcbiAgICBwcml2YXRlIF93b3JrZXJzOiBXb3JrZXJbXTtcbiAgICBwcml2YXRlIF93b3JrZXJDb3VudDogbnVtYmVyO1xuICAgIHByaXZhdGUgX3Rlcm1pbmF0ZU9uQ29tcGxldGU6IGJvb2xlYW47XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHVzZUNvbmN1cnJlbnRXb3JrZXJzID0gdHJ1ZSwgdGVybWluYXRlT25Db21wbGV0ZSA9IHRydWUpIHtcbiAgICAgIGNvbnN0IHRocmVhZENvdW50ID0gbmF2aWdhdG9yLmhhcmR3YXJlQ29uY3VycmVuY3k7XG4gICAgICB0aGlzLl93b3JrZXJDb3VudCA9IHVzZUNvbmN1cnJlbnRXb3JrZXJzID8gTWF0aC5tYXgodGhyZWFkQ291bnQgLSAyLCAxKSA6IDE7XG4gICAgICB0aGlzLl93b3JrZXJzID0gbmV3IEFycmF5KHRoaXMuX3dvcmtlckNvdW50KS5maWxsKG51bGwpXG4gICAgICAgIC5tYXAoKCkgPT4gbmV3IFdvcmtlcihuZXcgVVJMKCcuL2Rpc3RhbmNlLW1hdHJpeC13b3JrZXInLCBpbXBvcnQubWV0YS51cmwpKSk7XG4gICAgICB0aGlzLl90ZXJtaW5hdGVPbkNvbXBsZXRlID0gdGVybWluYXRlT25Db21wbGV0ZTtcbiAgICB9O1xuXG4gICAgcHVibGljIGFzeW5jIGNhbGM8VD4odmFsdWVzOiBBcnJheTxUPiB8IEFycmF5TGlrZTxUPiwgZm5OYW1lOiBLbm93bk1ldHJpY3MsXG4gICAgICBub3JtYWxpemUgPSB0cnVlKTogUHJvbWlzZTxGbG9hdDMyQXJyYXk+IHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgbGVuID0gdmFsdWVzLmxlbmd0aDtcbiAgICAgICAgICBjb25zdCBwcm9taXNlcyA9IG5ldyBBcnJheTxQcm9taXNlPHZvaWQ+Pih0aGlzLl93b3JrZXJDb3VudCk7XG4gICAgICAgICAgY29uc3QgdG90YWxMZW5ndGggPSBsZW4gKiAobGVuIC0gMSkgLyAyOyAvLyBzaXplIG9mIHJlZHVjZWQgZGlzdGFuY2UgbWF0cml4XG4gICAgICAgICAgdGhpcy5fd29ya2VyQ291bnQgPSBNYXRoLm1pbih0aGlzLl93b3JrZXJDb3VudCwgdG90YWxMZW5ndGgpO1xuICAgICAgICAgIGNvbnN0IGNodW5rU2l6ZSA9IHRvdGFsTGVuZ3RoIC8gdGhpcy5fd29ya2VyQ291bnQ7XG4gICAgICAgICAgY29uc3QgZGlzdGFuY2VNYXRyaXggPSBuZXcgRmxvYXQzMkFycmF5KHRvdGFsTGVuZ3RoKTtcbiAgICAgICAgICBsZXQgZW5kUm93ID0gMDtcbiAgICAgICAgICBsZXQgZW5kQ29sID0gMTtcbiAgICAgICAgICAvLyBtaW5tYXggZm9yIG5vcm1hbGl6YXRpb25cbiAgICAgICAgICBsZXQgbG1pbiA9IDA7XG4gICAgICAgICAgbGV0IGxtYXggPSBOdW1iZXIuTUlOX1ZBTFVFO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fd29ya2VyQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBNYXRoLmZsb29yKGkgKiBjaHVua1NpemUpO1xuICAgICAgICAgICAgY29uc3QgZW5kID0gKGkgPT09IHRoaXMuX3dvcmtlckNvdW50IC0gMSkgPyB0b3RhbExlbmd0aCA6IE1hdGguZmxvb3IoKGkgKyAxKSAqIGNodW5rU2l6ZSk7XG4gICAgICAgICAgICBjb25zdCBzdGFydFJvdyA9IGVuZFJvdztcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0Q29sID0gZW5kQ29sO1xuICAgICAgICAgICAgaWYgKGkgIT09IHRoaXMuX3dvcmtlckNvdW50IC0gMSkge1xuICAgICAgICAgICAgICAvLyBUaGVzZSBmb3JtdWxhcyBtYXAgdGhlIGxpbmVhciBpbmRleCB0byB0aGUgdXBwZXIgdHJpYW5ndWxhciBtYXRyaXggaW5kaWNlc1xuICAgICAgICAgICAgICBlbmRSb3cgPSBsZW4gLSAyIC0gTWF0aC5mbG9vcihNYXRoLnNxcnQoLTggKiBlbmQgKyA0ICogbGVuICogKGxlbiAtIDEpIC0gNykgLyAyIC0gMC41KTtcbiAgICAgICAgICAgICAgZW5kQ29sID0gZW5kIC0gbGVuICogZW5kUm93ICsgTWF0aC5mbG9vcigoZW5kUm93ICsgMSkgKiAoZW5kUm93ICsgMikgLyAyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3dvcmtlcnNbaV0ucG9zdE1lc3NhZ2Uoe3ZhbHVlcywgZm5OYW1lLCBzdGFydFJvdywgc3RhcnRDb2wsIGNodW5ja1NpemU6IGVuZCAtIHN0YXJ0fSk7XG4gICAgICAgICAgICBwcm9taXNlc1tpXSA9IG5ldyBQcm9taXNlKChyZXNvbHZlV29ya2VyLCByZWplY3RXb3JrZXIpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5fd29ya2Vyc1tpXS5vbm1lc3NhZ2UgPSAoe2RhdGE6IHtlcnJvciwgZGlzdGFuY2VNYXRyaXhEYXRhLCBtaW4sIG1heH19KTogdm9pZCA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYXRlT25Db21wbGV0ZSAmJiB0aGlzLl93b3JrZXJzW2ldLnRlcm1pbmF0ZSgpO1xuICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgcmVqZWN0V29ya2VyKGVycm9yKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgZGlzdGFuY2VNYXRyaXguc2V0KGRpc3RhbmNlTWF0cml4RGF0YSwgc3RhcnQpO1xuICAgICAgICAgICAgICAgICAgaWYgKG1pbiA8IGxtaW4pXG4gICAgICAgICAgICAgICAgICAgIGxtaW4gPSBtaW47XG4gICAgICAgICAgICAgICAgICBpZiAobWF4ID4gbG1heClcbiAgICAgICAgICAgICAgICAgICAgbG1heCA9IG1heDtcbiAgICAgICAgICAgICAgICAgIHJlc29sdmVXb3JrZXIoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgICAgICAgIGlmIChub3JtYWxpemUpXG4gICAgICAgICAgICBkaXN0YW5jZU1hdHJpeC5mb3JFYWNoKCh2YWx1ZSwgaW5kZXgpID0+IHsgZGlzdGFuY2VNYXRyaXhbaW5kZXhdID0gKHZhbHVlIC0gbG1pbikgLyAobG1heCAtIGxtaW4pOyB9KTtcbiAgICAgICAgICByZXNvbHZlKGRpc3RhbmNlTWF0cml4KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHRlcm1pbmF0ZSgpOiB2b2lkIHtcbiAgICAgIHRoaXMuX3dvcmtlcnMuZm9yRWFjaCgod29ya2VyKSA9PiB3b3JrZXIudGVybWluYXRlKCkpO1xuICAgIH1cbn1cbiJdfQ==","import { calculateEuclideanDistance, fillRandomMatrix, vectorAdd, } from '@datagrok-libraries/utils/src/vector-operations';\nimport { randomInt } from '@datagrok-libraries/utils/src/random';\nimport { DistanceMatrixService, dmLinearIndex } from './distance-matrix';\n/**\n * Implements stochastic proximity embedding.\n *\n * @export\n * @class SPEBase\n * @link doi:10.1016/S1093-3263(03)00155-4\n */\nclass SPEBase {\n /**\n * Creates an instance of SPEBase.\n * @param {Options} [options] Options to pass to the constructor.\n * @memberof SPEBase\n */\n constructor(options) {\n this.steps = options?.steps ?? 0;\n this.cycles = options?.cycles ?? 1e6;\n // Select a cutoff distance {cutoff} and ...\n this.cutoff = options?.cutoff ?? 0;\n // ... an initial learning rate {lambda} > 0\n this.lambda = options?.lambda ?? 2.0;\n this.dlambda = options?.dlambda ?? 0.01;\n this.lambda2 = this.lambda / 2.;\n this.dlambda2 = this.dlambda / 2.;\n this.epsilon = options?.epsilon ?? 1e-10;\n // eslint-disable-next-line brace-style\n this.distanceFunction = options?.distance ?? calculateEuclideanDistance;\n this.distance = new Float32Array();\n this.distanceFunctionName = options?.distanceFunctionName;\n }\n /**\n * Initializes distance matrix.\n *\n * @param {Vectors} vectors Input vectors to calculate distance between.\n * @memberof SPEBase\n */\n async initDistance(vectors) {\n this.dmIndexFunct = dmLinearIndex(vectors.length);\n const matrixService = new DistanceMatrixService(true, false);\n this.distance = await matrixService.calc(vectors, this.distanceFunctionName);\n matrixService.terminate();\n }\n /**\n * Calculates distance between the two vectors given.\n *\n * @param {Vectors} vectors Set of vectors to calculate distances between.\n * @param {number} index1 Index of the first vector of the pair.\n * @param {number} index2 Index of the second vector of the pair.\n * @return {number} Distance between these two vectors.\n */\n calcDistance(vectors, index1, index2) {\n return this.distance[this.dmIndexFunct(index1, index2)];\n }\n /**\n * Embeds the vectors given into a two-dimensional space.\n *\n * @param {Vectors} vectors D-dimensional coordinates.\n * @return {Coordinates} SPE coordinates in D space.\n */\n async embed(vectors) {\n const nItems = vectors.length;\n const areaWidth = 40;\n // Initialize the D-dimensional coordinates of the N points.\n const coordinates = fillRandomMatrix(nItems, SPEBase.dimension, areaWidth);\n let lambda2 = this.lambda2;\n if (this.steps === 0)\n this.steps = vectors.length - 1;\n await this.initDistance(vectors);\n for (let cycle = 0; cycle < this.cycles; ++cycle) {\n for (let step = 0; step < this.steps; ++step) {\n // Select two points, i and j, at random, ...\n const i = randomInt(nItems);\n let j = randomInt(nItems);\n while (i == j)\n j = randomInt(nItems);\n const rowi = coordinates[i];\n const rowj = coordinates[j];\n // ... retrieve (or evaluate) their proximity in the input space, rij and ...\n const r = this.calcDistance(vectors, i, j);\n // ... compute their Euclidean distance on the D-dimensional map, dij.\n const d = calculateEuclideanDistance(rowi, rowj);\n // If rij <= rc, or if rij > rc and dij < rij ...\n if ((this.cutoff == 0) || (r <= this.cutoff) || (d < r)) {\n const multiplier = lambda2 * (r - d) / (d + this.epsilon);\n // ... update the coordinates xi and xj.\n const diffIJ = vectorAdd(rowi, rowj, -1);\n coordinates[i] = vectorAdd(rowi, diffIJ, multiplier);\n coordinates[j] = vectorAdd(rowj, diffIJ, -multiplier);\n }\n }\n // Decrease the learning rate {lambda} by a prescribed {dlambda}.\n lambda2 -= this.dlambda2;\n if (lambda2 <= 0.)\n break;\n }\n return coordinates;\n }\n}\nSPEBase.dimension = 2;\nexport { SPEBase };\n/**\n * Implements modified stochastic proximity embedding.\n *\n * @export\n * @class PSPEBase\n * @link doi:10.1016/S1093-3263(03)00155-4\n */\nexport class PSPEBase extends SPEBase {\n /**\n * Embeds the vectors given into a two-dimensional space using a modified update rule.\n *\n * @param {Vectors} vectors D-dimensional coordinates.\n * @return {Coordinates} SPE coordinates in D space.\n */\n async embed(vectors) {\n const nItems = vectors.length;\n const areaWidth = 40;\n // Initialize the D-dimensional coordinates of the N points.\n const coordinates = fillRandomMatrix(nItems, PSPEBase.dimension, areaWidth);\n let lambda = this.lambda;\n await this.initDistance(vectors);\n for (let cycle = 0; cycle < this.cycles; ++cycle) {\n // Select a point, i, at random (pivot).\n const i = randomInt(nItems);\n const rowi = coordinates[i];\n // For every point j != i ...\n for (let j = 0; j < nItems; ++j) {\n if (i == j)\n continue;\n const rowj = coordinates[j];\n // ... retrieve (or evaluate) its proximity to i in the input space, rij ...\n const r = this.calcDistance(vectors, i, j);\n // ... and compute their Euclidean distance on the D-dimensional map, dij.\n const d = calculateEuclideanDistance(rowi, rowj);\n // If rij <= rc, or if rij > rc and dij < rij ...\n if ((this.cutoff == 0) || (r <= this.cutoff) || (d < r)) {\n const multiplier = lambda * (r - d) / (d + this.epsilon);\n const diffIJ = vectorAdd(rowi, rowj, -1);\n // ... update the coordinates xj.\n coordinates[j] = vectorAdd(rowj, diffIJ, -multiplier);\n }\n }\n // Decrease the learning rate {lambda} by a prescribed {dlambda}.\n lambda -= this.dlambda;\n if (lambda <= 0.)\n break;\n }\n return coordinates;\n }\n}\n/**\n * Implements modified stochastic proximity embedding.\n *\n * @export\n * @class OriginalSPE\n * @link doi:10.1002/jcc.10234\n */\nexport class OriginalSPE extends SPEBase {\n constructor(options) {\n super(options);\n this.cycles = options?.cycles ?? 1e3;\n this.steps = options?.steps ?? 100000;\n this.radiusPercent = options?.radiusPercent ?? 1.0;\n this.maxDistance = options?.maxDistance ?? null;\n this.maxDistanceSteps = options?.maxDistanceSteps ?? null;\n }\n async embed(vectors) {\n const nItems = vectors.length;\n const areaWidth = 40;\n // Initialize the D-dimensional coordinates of the N points.\n const coordinates = fillRandomMatrix(nItems, OriginalSPE.dimension, areaWidth);\n await this.initDistance(vectors);\n if (this.maxDistanceSteps === null)\n this.maxDistanceSteps = nItems * Math.floor((nItems - 1) / 2);\n if (this.maxDistance === null) {\n this.maxDistance = -1e37;\n for (let n = 0; n < this.maxDistanceSteps; n++) {\n const i = randomInt(nItems);\n let j = randomInt(nItems);\n while (i == j)\n j = randomInt(nItems);\n const d = this.calcDistance(vectors, i, j);\n if (d > this.maxDistance)\n this.maxDistance = d;\n }\n }\n let lambda = this.lambda;\n const radius = (this.radiusPercent == 0.0) ? this.maxDistance : this.maxDistance * this.radiusPercent;\n for (let cycle = 0; cycle < this.cycles; ++cycle) {\n for (let step = 0; step < this.steps; ++step) {\n // Select two points, i and j, at random, ...\n const i = randomInt(nItems);\n let j = randomInt(nItems);\n while (i == j)\n j = randomInt(nItems);\n const rowi = coordinates[i];\n const rowj = coordinates[j];\n // retrieve (or evaluate) their proximity in the input space, rij and ...\n const r = this.calcDistance(vectors, i, j);\n // compute their Euclidean distance on the D-dimensional map, dij.\n const d = calculateEuclideanDistance(rowi, rowj);\n if ((r <= radius) || (d < r)) {\n const multiplier = lambda * 0.5 * (r - d) / (d + this.epsilon);\n // ... update the coordinates xi and xj.\n const diffIJ = vectorAdd(rowi, rowj, -1);\n coordinates[i] = vectorAdd(rowi, diffIJ, multiplier);\n coordinates[j] = vectorAdd(rowj, diffIJ, -multiplier);\n }\n }\n lambda -= ((this.lambda - this.dlambda) / (this.cycles - 1.0));\n ;\n if (lambda < this.dlambda)\n break;\n }\n return coordinates;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3BlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFDTCwwQkFBMEIsRUFDMUIsZ0JBQWdCLEVBQ2hCLFNBQVMsR0FDVixNQUFNLGlEQUFpRCxDQUFDO0FBQ3pELE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQztBQUUvRCxPQUFPLEVBQUMscUJBQXFCLEVBQUUsYUFBYSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFFdkU7Ozs7OztHQU1HO0FBQ0gsTUFBYSxPQUFPO0lBZWxCOzs7O09BSUc7SUFDSCxZQUFZLE9BQWlCO1FBQzNCLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxFQUFFLEtBQUssSUFBSSxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFPLEVBQUUsTUFBTSxJQUFJLEdBQUcsQ0FBQztRQUNyQyw0Q0FBNEM7UUFDNUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUMsQ0FBQztRQUNuQyw0Q0FBNEM7UUFDNUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFPLEVBQUUsTUFBTSxJQUFJLEdBQUcsQ0FBQztRQUNyQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sRUFBRSxPQUFPLElBQUksSUFBSSxDQUFDO1FBQ3hDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNsQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sRUFBRSxPQUFPLElBQUksS0FBSyxDQUFDO1FBQ3pDLHVDQUF1QztRQUN2QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsT0FBTyxFQUFFLFFBQVEsSUFBSSwwQkFBMEIsQ0FBQztRQUN4RSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksWUFBWSxF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IFZlY3RvcnMsIERpc3RhbmNlTWV0cmljfSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy90eXBlLWRlY2xhcmF0aW9ucyc7XG5pbXBvcnQge1xuICBjYWxjdWxhdGVFdWNsaWRlYW5EaXN0YW5jZSxcbiAgZmlsbFJhbmRvbU1hdHJpeCxcbiAgdmVjdG9yQWRkLFxufSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy92ZWN0b3Itb3BlcmF0aW9ucyc7XG5pbXBvcnQge3JhbmRvbUludH0gZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy91dGlscy9zcmMvcmFuZG9tJztcbmltcG9ydCB7S25vd25NZXRyaWNzfSBmcm9tICcuL3R5cGVkLW1ldHJpY3MnO1xuaW1wb3J0IHtEaXN0YW5jZU1hdHJpeFNlcnZpY2UsIGRtTGluZWFySW5kZXh9IGZyb20gJy4vZGlzdGFuY2UtbWF0cml4JztcblxuLyoqXG4gKiBJbXBsZW1lbnRzIHN0b2NoYXN0aWMgcHJveGltaXR5IGVtYmVkZGluZy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgU1BFQmFzZVxuICogQGxpbmsgZG9pOjEwLjEwMTYvUzEwOTMtMzI2MygwMykwMDE1NS00XG4gKi9cbmV4cG9ydCBjbGFzcyBTUEVCYXNlIHtcbiAgcHJvdGVjdGVkIHN0YXRpYyBkaW1lbnNpb24gPSAyO1xuICBwcm90ZWN0ZWQgc3RlcHM6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGN5Y2xlczogbnVtYmVyO1xuICBwcm90ZWN0ZWQgY3V0b2ZmOiBudW1iZXI7XG4gIHByb3RlY3RlZCBsYW1iZGE6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGRsYW1iZGE6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGxhbWJkYTI6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGRsYW1iZGEyOiBudW1iZXI7XG4gIHByb3RlY3RlZCBlcHNpbG9uOiBudW1iZXI7XG4gIHByb3RlY3RlZCBkaXN0YW5jZUZ1bmN0aW9uOiBEaXN0YW5jZU1ldHJpYztcbiAgcHJvdGVjdGVkIGRpc3RhbmNlRnVuY3Rpb25OYW1lOiBLbm93bk1ldHJpY3M7XG4gIGRpc3RhbmNlOiBGbG9hdDMyQXJyYXk7XG4gIHByb3RlY3RlZCBkbUluZGV4RnVuY3Q/OiAoaTogbnVtYmVyLCBqOiBudW1iZXIpID0+IG51bWJlcjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBTUEVCYXNlLlxuICAgKiBAcGFyYW0ge09wdGlvbnN9IFtvcHRpb25zXSBPcHRpb25zIHRvIHBhc3MgdG8gdGhlIGNvbnN0cnVjdG9yLlxuICAgKiBAbWVtYmVyb2YgU1BFQmFzZVxuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0aW9ucz86IE9wdGlvbnMpIHtcbiAgICB0aGlzLnN0ZXBzID0gb3B0aW9ucz8uc3RlcHMgPz8gMDtcbiAgICB0aGlzLmN5Y2xlcyA9IG9wdGlvbnM/LmN5Y2xlcyA/PyAxZTY7XG4gICAgLy8gU2VsZWN0IGEgY3V0b2ZmIGRpc3RhbmNlIHtjdXRvZmZ9IGFuZCAuLi5cbiAgICB0aGlzLmN1dG9mZiA9IG9wdGlvbnM/LmN1dG9mZiA/PyAwO1xuICAgIC8vIC4uLiBhbiBpbml0aWFsIGxlYXJuaW5nIHJhdGUge2xhbWJkYX0gPiAwXG4gICAgdGhpcy5sYW1iZGEgPSBvcHRpb25zPy5sYW1iZGEgPz8gMi4wO1xuICAgIHRoaXMuZGxhbWJkYSA9IG9wdGlvbnM/LmRsYW1iZGEgPz8gMC4wMTtcbiAgICB0aGlzLmxhbWJkYTIgPSB0aGlzLmxhbWJkYSAvIDIuO1xuICAgIHRoaXMuZGxhbWJkYTIgPSB0aGlzLmRsYW1iZGEgLyAyLjtcbiAgICB0aGlzLmVwc2lsb24gPSBvcHRpb25zPy5lcHNpbG9uID8/IDFlLTEwO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBicmFjZS1zdHlsZVxuICAgIHRoaXMuZGlzdGFuY2VGdW5jdGlvbiA9IG9wdGlvbnM/LmRpc3RhbmNlID8/IGNhbGN1bGF0ZUV1Y2xpZGVhbkRpc3RhbmNlO1xuICAgIHRoaXMuZGlzdGFuY2UgPSBuZXcgRmxvYXQzMkFycmF5KCk7XG4gICAgdGhpcy5kaXN0YW5jZUZ1bmN0aW9uTmFtZSA9IG9wdGlvbnM/LmRpc3RhbmNlRnVuY3Rpb25OYW1lITtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBkaXN0YW5jZSBtYXRyaXguXG4gICAqXG4gICAqIEBwYXJhbSB7VmVjdG9yc30gdmVjdG9ycyBJbnB1dCB2ZWN0b3JzIHRvIGNhbGN1bGF0ZSBkaXN0YW5jZSBiZXR3ZWVuLlxuICAgKiBAbWVtYmVyb2YgU1BFQmFzZVxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGluaXREaXN0YW5jZSh2ZWN0b3JzOiBWZWN0b3JzKSB7XG4gICAgdGhpcy5kbUluZGV4RnVuY3QgPSBkbUxpbmVhckluZGV4KHZlY3RvcnMubGVuZ3RoKTtcbiAgICBjb25zdCBtYXRyaXhTZXJ2aWNlID0gbmV3IERpc3RhbmNlTWF0cml4U2VydmljZSh0cnVlLCBmYWxzZSk7XG4gICAgdGhpcy5kaXN0YW5jZSA9IGF3YWl0IG1hdHJpeFNlcnZpY2UuY2FsYyh2ZWN0b3JzLCB0aGlzLmRpc3RhbmNlRnVuY3Rpb25OYW1lKTtcbiAgICBtYXRyaXhTZXJ2aWNlLnRlcm1pbmF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZXMgZGlzdGFuY2UgYmV0d2VlbiB0aGUgdHdvIHZlY3RvcnMgZ2l2ZW4uXG4gICAqXG4gICAqIEBwYXJhbSB7VmVjdG9yc30gdmVjdG9ycyBTZXQgb2YgdmVjdG9ycyB0byBjYWxjdWxhdGUgZGlzdGFuY2VzIGJldHdlZW4uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleDEgSW5kZXggb2YgdGhlIGZpcnN0IHZlY3RvciBvZiB0aGUgcGFpci5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4MiBJbmRleCBvZiB0aGUgc2Vjb25kIHZlY3RvciBvZiB0aGUgcGFpci5cbiAgICogQHJldHVybiB7bnVtYmVyfSBEaXN0YW5jZSBiZXR3ZWVuIHRoZXNlIHR3byB2ZWN0b3JzLlxuICAgKi9cbiAgcHJvdGVjdGVkIGNhbGNEaXN0YW5jZSh2ZWN0b3JzOiBWZWN0b3JzLCBpbmRleDE6IG51bWJlciwgaW5kZXgyOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmRpc3RhbmNlW3RoaXMuZG1JbmRleEZ1bmN0IShpbmRleDEsIGluZGV4MildO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtYmVkcyB0aGUgdmVjdG9ycyBnaXZlbiBpbnRvIGEgdHdvLWRpbWVuc2lvbmFsIHNwYWNlLlxuICAgKlxuICAgKiBAcGFyYW0ge1ZlY3RvcnN9IHZlY3RvcnMgRC1kaW1lbnNpb25hbCBjb29yZGluYXRlcy5cbiAgICogQHJldHVybiB7Q29vcmRpbmF0ZXN9IFNQRSBjb29yZGluYXRlcyBpbiBEIHNwYWNlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGVtYmVkKHZlY3RvcnM6IFZlY3RvcnMpOiBQcm9taXNlPENvb3JkaW5hdGVzPiB7XG4gICAgY29uc3Qgbkl0ZW1zID0gdmVjdG9ycy5sZW5ndGg7XG4gICAgY29uc3QgYXJlYVdpZHRoID0gNDA7XG4gICAgLy8gSW5pdGlhbGl6ZSB0aGUgRC1kaW1lbnNpb25hbCBjb29yZGluYXRlcyBvZiB0aGUgTiBwb2ludHMuXG4gICAgY29uc3QgY29vcmRpbmF0ZXMgPSBmaWxsUmFuZG9tTWF0cml4KG5JdGVtcywgU1BFQmFzZS5kaW1lbnNpb24sIGFyZWFXaWR0aCk7XG5cbiAgICBsZXQgbGFtYmRhMiA9IHRoaXMubGFtYmRhMjtcblxuICAgIGlmICh0aGlzLnN0ZXBzID09PSAwKVxuICAgICAgdGhpcy5zdGVwcyA9IHZlY3RvcnMubGVuZ3RoIC0gMTtcblxuXG4gICAgYXdhaXQgdGhpcy5pbml0RGlzdGFuY2UodmVjdG9ycyk7XG5cbiAgICBmb3IgKGxldCBjeWNsZSA9IDA7IGN5Y2xlIDwgdGhpcy5jeWNsZXM7ICsrY3ljbGUpIHtcbiAgICAgIGZvciAobGV0IHN0ZXAgPSAwOyBzdGVwIDwgdGhpcy5zdGVwczsgKytzdGVwKSB7XG4gICAgICAgIC8vIFNlbGVjdCB0d28gcG9pbnRzLCBpIGFuZCBqLCBhdCByYW5kb20sIC4uLlxuICAgICAgICBjb25zdCBpID0gcmFuZG9tSW50KG5JdGVtcyk7XG4gICAgICAgIGxldCBqID0gcmFuZG9tSW50KG5JdGVtcyk7XG4gICAgICAgIHdoaWxlIChpID09IGopIGogPSByYW5kb21JbnQobkl0ZW1zKTtcblxuICAgICAgICBjb25zdCByb3dpID0gY29vcmRpbmF0ZXNbaV07XG4gICAgICAgIGNvbnN0IHJvd2ogPSBjb29yZGluYXRlc1tqXTtcblxuICAgICAgICAvLyAuLi4gcmV0cmlldmUgKG9yIGV2YWx1YXRlKSB0aGVpciBwcm94aW1pdHkgaW4gdGhlIGlucHV0IHNwYWNlLCByaWogYW5kIC4uLlxuICAgICAgICBjb25zdCByID0gdGhpcy5jYWxjRGlzdGFuY2UodmVjdG9ycywgaSwgaik7XG4gICAgICAgIC8vIC4uLiBjb21wdXRlIHRoZWlyIEV1Y2xpZGVhbiBkaXN0YW5jZSBvbiB0aGUgRC1kaW1lbnNpb25hbCBtYXAsIGRpai5cbiAgICAgICAgY29uc3QgZCA9IGNhbGN1bGF0ZUV1Y2xpZGVhbkRpc3RhbmNlKHJvd2ksIHJvd2opO1xuXG4gICAgICAgIC8vIElmIHJpaiA8PSByYywgb3IgaWYgcmlqID4gcmMgYW5kIGRpaiA8IHJpaiAuLi5cbiAgICAgICAgaWYgKCh0aGlzLmN1dG9mZiA9PSAwKSB8fCAociA8PSB0aGlzLmN1dG9mZikgfHwgKGQgPCByKSkge1xuICAgICAgICAgIGNvbnN0IG11bHRpcGxpZXIgPSBsYW1iZGEyICogKHIgLSBkKSAvIChkICsgdGhpcy5lcHNpbG9uKTtcbiAgICAgICAgICAvLyAuLi4gdXBkYXRlIHRoZSBjb29yZGluYXRlcyB4aSBhbmQgeGouXG4gICAgICAgICAgY29uc3QgZGlmZklKID0gdmVjdG9yQWRkKHJvd2ksIHJvd2osIC0xKTtcbiAgICAgICAgICBjb29yZGluYXRlc1tpXSA9IHZlY3RvckFkZChyb3dpLCBkaWZmSUosIG11bHRpcGxpZXIpO1xuICAgICAgICAgIGNvb3JkaW5hdGVzW2pdID0gdmVjdG9yQWRkKHJvd2osIGRpZmZJSiwgLW11bHRpcGxpZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBEZWNyZWFzZSB0aGUgbGVhcm5pbmcgcmF0ZSB7bGFtYmRhfSBieSBhIHByZXNjcmliZWQge2RsYW1iZGF9LlxuICAgICAgbGFtYmRhMiAtPSB0aGlzLmRsYW1iZGEyO1xuICAgICAgaWYgKGxhbWJkYTIgPD0gMC4pXG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gY29vcmRpbmF0ZXM7XG4gIH1cbn1cblxuLyoqXG4gKiBJbXBsZW1lbnRzIG1vZGlmaWVkIHN0b2NoYXN0aWMgcHJveGltaXR5IGVtYmVkZGluZy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgUFNQRUJhc2VcbiAqIEBsaW5rIGRvaToxMC4xMDE2L1MxMDkzLTMyNjMoMDMpMDAxNTUtNFxuICovXG5leHBvcnQgY2xhc3MgUFNQRUJhc2UgZXh0ZW5kcyBTUEVCYXNlIHtcbiAgLyoqXG4gICAqIEVtYmVkcyB0aGUgdmVjdG9ycyBnaXZlbiBpbnRvIGEgdHdvLWRpbWVuc2lvbmFsIHNwYWNlIHVzaW5nIGEgbW9kaWZpZWQgdXBkYXRlIHJ1bGUuXG4gICAqXG4gICAqIEBwYXJhbSB7VmVjdG9yc30gdmVjdG9ycyBELWRpbWVuc2lvbmFsIGNvb3JkaW5hdGVzLlxuICAgKiBAcmV0dXJuIHtDb29yZGluYXRlc30gU1BFIGNvb3JkaW5hdGVzIGluIEQgc3BhY2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZW1iZWQodmVjdG9yczogVmVjdG9ycyk6IFByb21pc2U8Q29vcmRpbmF0ZXM+IHtcbiAgICBjb25zdCBuSXRlbXMgPSB2ZWN0b3JzLmxlbmd0aDtcbiAgICBjb25zdCBhcmVhV2lkdGggPSA0MDtcbiAgICAvLyAgSW5pdGlhbGl6ZSB0aGUgRC1kaW1lbnNpb25hbCBjb29yZGluYXRlcyBvZiB0aGUgTiBwb2ludHMuXG4gICAgY29uc3QgY29vcmRpbmF0ZXMgPSBmaWxsUmFuZG9tTWF0cml4KG5JdGVtcywgUFNQRUJhc2UuZGltZW5zaW9uLCBhcmVhV2lkdGgpO1xuICAgIGxldCBsYW1iZGEgPSB0aGlzLmxhbWJkYTtcblxuICAgIGF3YWl0IHRoaXMuaW5pdERpc3RhbmNlKHZlY3RvcnMpO1xuXG4gICAgZm9yIChsZXQgY3ljbGUgPSAwOyBjeWNsZSA8IHRoaXMuY3ljbGVzOyArK2N5Y2xlKSB7XG4gICAgICAvLyBTZWxlY3QgYSBwb2ludCwgaSwgYXQgcmFuZG9tIChwaXZvdCkuXG4gICAgICBjb25zdCBpOiBudW1iZXIgPSByYW5kb21JbnQobkl0ZW1zKTtcbiAgICAgIGNvbnN0IHJvd2kgPSBjb29yZGluYXRlc1tpXTtcblxuICAgICAgLy8gRm9yIGV2ZXJ5IHBvaW50IGogIT0gaSAuLi5cbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbkl0ZW1zOyArK2opIHtcbiAgICAgICAgaWYgKGkgPT0gaikgY29udGludWU7XG4gICAgICAgIGNvbnN0IHJvd2ogPSBjb29yZGluYXRlc1tqXTtcbiAgICAgICAgLy8gLi4uIHJldHJpZXZlIChvciBldmFsdWF0ZSkgaXRzIHByb3hpbWl0eSB0byBpIGluIHRoZSBpbnB1dCBzcGFjZSwgcmlqIC4uLlxuICAgICAgICBjb25zdCByID0gdGhpcy5jYWxjRGlzdGFuY2UodmVjdG9ycywgaSwgaik7XG4gICAgICAgIC8vIC4uLiBhbmQgY29tcHV0ZSB0aGVpciBFdWNsaWRlYW4gZGlzdGFuY2Ugb24gdGhlIEQtZGltZW5zaW9uYWwgbWFwLCBkaWouXG4gICAgICAgIGNvbnN0IGQgPSBjYWxjdWxhdGVFdWNsaWRlYW5EaXN0YW5jZShyb3dpLCByb3dqKTtcbiAgICAgICAgLy8gSWYgcmlqIDw9IHJjLCBvciBpZiByaWogPiByYyBhbmQgZGlqIDwgcmlqIC4uLlxuICAgICAgICBpZiAoKHRoaXMuY3V0b2ZmID09IDApIHx8IChyIDw9IHRoaXMuY3V0b2ZmKSB8fCAoZCA8IHIpKSB7XG4gICAgICAgICAgY29uc3QgbXVsdGlwbGllciA9IGxhbWJkYSAqIChyIC0gZCkgLyAoZCArIHRoaXMuZXBzaWxvbik7XG4gICAgICAgICAgY29uc3QgZGlmZklKID0gdmVjdG9yQWRkKHJvd2ksIHJvd2osIC0xKTtcbiAgICAgICAgICAvLyAuLi4gdXBkYXRlIHRoZSBjb29yZGluYXRlcyB4ai5cbiAgICAgICAgICBjb29yZGluYXRlc1tqXSA9IHZlY3RvckFkZChyb3dqLCBkaWZmSUosIC1tdWx0aXBsaWVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gRGVjcmVhc2UgdGhlIGxlYXJuaW5nIHJhdGUge2xhbWJkYX0gYnkgYSBwcmVzY3JpYmVkIHtkbGFtYmRhfS5cbiAgICAgIGxhbWJkYSAtPSB0aGlzLmRsYW1iZGE7XG4gICAgICBpZiAobGFtYmRhIDw9IDAuKVxuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIGNvb3JkaW5hdGVzO1xuICB9XG59XG5cbi8qKlxuICogSW1wbGVtZW50cyBtb2RpZmllZCBzdG9jaGFzdGljIHByb3hpbWl0eSBlbWJlZGRpbmcuXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIE9yaWdpbmFsU1BFXG4gKiBAbGluayBkb2k6MTAuMTAwMi9qY2MuMTAyMzRcbiAqL1xuZXhwb3J0IGNsYXNzIE9yaWdpbmFsU1BFIGV4dGVuZHMgU1BFQmFzZSB7XG4gIC8qKlxuICAgKiBFbWJlZHMgdGhlIHZlY3RvcnMgZ2l2ZW4gaW50byBhIHR3by1kaW1lbnNpb25hbCBzcGFjZSB1c2luZyBhIG1vZGlmaWVkIHVwZGF0ZSBydWxlLlxuICAgKlxuICAgKiBAcGFyYW0ge1ZlY3RvcnN9IHZlY3RvcnMgRC1kaW1lbnNpb25hbCBjb29yZGluYXRlcy5cbiAgICogQHJldHVybiB7Q29vcmRpbmF0ZXN9IFNQRSBjb29yZGluYXRlcyBpbiBEIHNwYWNlLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJhZGl1c1BlcmNlbnQ6IG51bWJlcjtcbiAgcHJvdGVjdGVkIG1heERpc3RhbmNlOiBudW1iZXI7XG4gIHByb3RlY3RlZCBtYXhEaXN0YW5jZVN0ZXBzOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9ucz86IE9wdGlvbnMpIHtcbiAgICBzdXBlcihvcHRpb25zKTtcbiAgICB0aGlzLmN5Y2xlcyA9IG9wdGlvbnM/LmN5Y2xlcyA/PyAxZTM7XG4gICAgdGhpcy5zdGVwcyA9IG9wdGlvbnM/LnN0ZXBzID8/IDEwMDAwMDtcbiAgICB0aGlzLnJhZGl1c1BlcmNlbnQgPSBvcHRpb25zPy5yYWRpdXNQZXJjZW50ID8/IDEuMDtcbiAgICB0aGlzLm1heERpc3RhbmNlID0gb3B0aW9ucz8ubWF4RGlzdGFuY2UgPz8gbnVsbDtcbiAgICB0aGlzLm1heERpc3RhbmNlU3RlcHMgPSBvcHRpb25zPy5tYXhEaXN0YW5jZVN0ZXBzID8/IG51bGw7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZW1iZWQodmVjdG9yczogVmVjdG9ycyk6IFByb21pc2U8Q29vcmRpbmF0ZXM+IHtcbiAgICBjb25zdCBuSXRlbXMgPSB2ZWN0b3JzLmxlbmd0aDtcbiAgICBjb25zdCBhcmVhV2lkdGggPSA0MDtcbiAgICAvLyBJbml0aWFsaXplIHRoZSBELWRpbWVuc2lvbmFsIGNvb3JkaW5hdGVzIG9mIHRoZSBOIHBvaW50cy5cbiAgICBjb25zdCBjb29yZGluYXRlcyA9IGZpbGxSYW5kb21NYXRyaXgobkl0ZW1zLCBPcmlnaW5hbFNQRS5kaW1lbnNpb24sIGFyZWFXaWR0aCk7XG5cbiAgICBhd2FpdCB0aGlzLmluaXREaXN0YW5jZSh2ZWN0b3JzKTtcblxuICAgIGlmICh0aGlzLm1heERpc3RhbmNlU3RlcHMgPT09IG51bGwpXG4gICAgICB0aGlzLm1heERpc3RhbmNlU3RlcHMgPSBuSXRlbXMgKiBNYXRoLmZsb29yKChuSXRlbXMgLSAxKSAvIDIpO1xuXG4gICAgaWYgKHRoaXMubWF4RGlzdGFuY2UgPT09IG51bGwpIHtcbiAgICAgIHRoaXMubWF4RGlzdGFuY2UgPSAtMWUzNztcbiAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgdGhpcy5tYXhEaXN0YW5jZVN0ZXBzOyBuKyspIHtcbiAgICAgICAgY29uc3QgaSA9IHJhbmRvbUludChuSXRlbXMpOyBsZXQgaiA9IHJhbmRvbUludChuSXRlbXMpO1xuICAgICAgICB3aGlsZSAoaSA9PSBqKSBqID0gcmFuZG9tSW50KG5JdGVtcyk7XG5cbiAgICAgICAgY29uc3QgZCA9IHRoaXMuY2FsY0Rpc3RhbmNlKHZlY3RvcnMsIGksIGopO1xuICAgICAgICBpZiAoZCA+IHRoaXMubWF4RGlzdGFuY2UpXG4gICAgICAgICAgdGhpcy5tYXhEaXN0YW5jZSA9IGQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGxhbWJkYSA9IHRoaXMubGFtYmRhO1xuICAgIGNvbnN0IHJhZGl1cyA9ICh0aGlzLnJhZGl1c1BlcmNlbnQgPT0gMC4wKSA/IHRoaXMubWF4RGlzdGFuY2UgOiB0aGlzLm1heERpc3RhbmNlICogdGhpcy5yYWRpdXNQZXJjZW50O1xuXG4gICAgZm9yIChsZXQgY3ljbGUgPSAwOyBjeWNsZSA8IHRoaXMuY3ljbGVzOyArK2N5Y2xlKSB7XG4gICAgICBmb3IgKGxldCBzdGVwID0gMDsgc3RlcCA8IHRoaXMuc3RlcHM7ICsrc3RlcCkge1xuICAgICAgICAvLyBTZWxlY3QgdHdvIHBvaW50cywgaSBhbmQgaiwgYXQgcmFuZG9tLCAuLi5cbiAgICAgICAgY29uc3QgaSA9IHJhbmRvbUludChuSXRlbXMpO1xuICAgICAgICBsZXQgaiA9IHJhbmRvbUludChuSXRlbXMpO1xuICAgICAgICB3aGlsZSAoaSA9PSBqKSBqID0gcmFuZG9tSW50KG5JdGVtcyk7XG5cbiAgICAgICAgY29uc3Qgcm93aSA9IGNvb3JkaW5hdGVzW2ldO1xuICAgICAgICBjb25zdCByb3dqID0gY29vcmRpbmF0ZXNbal07XG5cbiAgICAgICAgLy8gcmV0cmlldmUgKG9yIGV2YWx1YXRlKSB0aGVpciBwcm94aW1pdHkgaW4gdGhlIGlucHV0IHNwYWNlLCByaWogYW5kIC4uLlxuICAgICAgICBjb25zdCByID0gdGhpcy5jYWxjRGlzdGFuY2UodmVjdG9ycywgaSwgaik7XG4gICAgICAgIC8vIGNvbXB1dGUgdGhlaXIgRXVjbGlkZWFuIGRpc3RhbmNlIG9uIHRoZSBELWRpbWVuc2lvbmFsIG1hcCwgZGlqLlxuICAgICAgICBjb25zdCBkID0gY2FsY3VsYXRlRXVjbGlkZWFuRGlzdGFuY2Uocm93aSwgcm93aik7XG5cbiAgICAgICAgaWYgKChyIDw9IHJhZGl1cykgfHwgKGQgPCByKSkge1xuICAgICAgICAgIGNvbnN0IG11bHRpcGxpZXIgPSBsYW1iZGEgKiAwLjUgKiAociAtIGQpIC8gKGQgKyB0aGlzLmVwc2lsb24pO1xuICAgICAgICAgIC8vIC4uLiB1cGRhdGUgdGhlIGNvb3JkaW5hdGVzIHhpIGFuZCB4ai5cbiAgICAgICAgICBjb25zdCBkaWZmSUogPSB2ZWN0b3JBZGQocm93aSwgcm93aiwgLTEpO1xuICAgICAgICAgIGNvb3JkaW5hdGVzW2ldID0gdmVjdG9yQWRkKHJvd2ksIGRpZmZJSiwgbXVsdGlwbGllcik7XG4gICAgICAgICAgY29vcmRpbmF0ZXNbal0gPSB2ZWN0b3JBZGQocm93aiwgZGlmZklKLCAtbXVsdGlwbGllcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxhbWJkYSAtPSAoKHRoaXMubGFtYmRhIC0gdGhpcy5kbGFtYmRhKSAvICh0aGlzLmN5Y2xlcyAtIDEuMCkpOyA7XG4gICAgICBpZiAobGFtYmRhIDwgdGhpcy5kbGFtYmRhKVxuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIGNvb3JkaW5hdGVzO1xuICB9XG59XG4iXX0=","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, } 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 } 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};\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 numberDistanceMetricsMethods = {\n [NumberMetricsNames.NumericDistance]: 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 },\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 },\n [DistanceMetricsSubjects.Number]: {\n [NumberMetricsNames.NumericDistance]: numberDistanceMetricsMethods[NumberMetricsNames.NumericDistance],\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}\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}\n/** Unified class implementing different string measures. */\nexport class Measure {\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) ?\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZWQtbWV0cmljcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInR5cGVkLW1ldHJpY3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMxQyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFFcEQsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixxQkFBcUIsRUFDckIsY0FBYyxFQUNkLFlBQVksRUFDWixpQkFBaUIsRUFDakIsZUFBZSxFQUNmLGtCQUFrQixFQUNsQixvQkFBb0IsRUFDcEIscUJBQXFCLEVBQ3JCLGNBQWMsRUFDZCxhQUFhLEVBQ2IsZ0JBQWdCLEVBQ2hCLGVBQWUsR0FDaEIsTUFBTSw2QkFBNkIsQ0FBQztBQUVyQyxPQUFPLEVBQUMsMEJBQTBCLEVBQUMsTUFBTSxpREFBaUQsQ0FBQztBQUczRixPQUFPLEVBQUMsbUJBQW1CLEVBQUUsd0JBQXdCLEVBQUMsTUFBTSxxQ0FBcUMsQ0FBQztBQUNsRyxPQUFPLEVBQUMsdUJBQXVCLEVBQUUsb0JBQW9CLEVBQ25ELGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFDLE1BQU0sVUFBVSxDQUFDO0FBRzlFLE1BQU0sQ0FBQyxNQUFNLDRCQUE0QixHQUF5RDtJQUNoRyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxFQUFFLDBCQUEwQjtDQUMzRCxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQXlEO0lBQ2hHLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRSxDQUFDLFFBQVE7SUFDN0MsQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsRUFBRSxXQUFXO0lBQzdDLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLEVBQUUsaUJBQWlCO0NBQ2xELENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSw4QkFBOEIsR0FBNkQ7SUFDdEcsQ0FBQyxvQkFBb0IsQ0FBQyxR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WUFDekYsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsSUFBSSxDQUFDLE1BQU0sa0JBQWtCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ25GLE9BQU8scUJBQXFCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDeEMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFxQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDN0UsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFtQixDQUFDO0lBQ3ZELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxRQUE0QjtRQUM1RCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLEtBQUssaUJBQWlCO1FBQzFCLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZsIGZyb20gJ2Zhc3Rlc3QtbGV2ZW5zaHRlaW4nO1xuaW1wb3J0IHtqYXJvV2lua2xlcn0gZnJvbSAnamFyby13aW5rbGVyLXR5cGVzY3JpcHQnO1xuaW1wb3J0IHtEaXN0YW5jZU1ldHJpY30gZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy91dGlscy9zcmMvdHlwZS1kZWNsYXJhdGlvbnMnO1xuaW1wb3J0IHtcbiAgYXN5bW1ldHJpY0Rpc3RhbmNlLFxuICBicmF1bkJsYW5xdWV0RGlzdGFuY2UsXG4gIGNvc2luZURpc3RhbmNlLFxuICBkaWNlRGlzdGFuY2UsXG4gIGV1Y2xpZGVhbkRpc3RhbmNlLFxuICBoYW1taW5nRGlzdGFuY2UsXG4gIGt1bGN6eW5za2lEaXN0YW5jZSxcbiAgbWNDb25uYXVnaGV5RGlzdGFuY2UsXG4gIHJvZ290R29sZGJlcmdEaXN0YW5jZSxcbiAgcnVzc2VsRGlzdGFuY2UsXG4gIHNva2FsRGlzdGFuY2UsXG4gIHRhbmltb3RvRGlzdGFuY2UsXG4gIG51bWVyaWNEaXN0YW5jZSxcbn0gZnJvbSAnLi4vZGlzdGFuY2UtbWV0cmljcy1tZXRob2RzJztcblxuaW1wb3J0IHtjYWxjdWxhdGVFdWNsaWRlYW5EaXN0YW5jZX0gZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy91dGlscy9zcmMvdmVjdG9yLW9wZXJhdGlvbnMnO1xuaW1wb3J0IEJpdEFycmF5IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL2JpdC1hcnJheSc7XG5pbXBvcnQge1ZlY3RvciwgU3RyaW5nRGljdGlvbmFyeX0gZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy91dGlscy9zcmMvdHlwZS1kZWNsYXJhdGlvbnMnO1xuaW1wb3J0IHttbURpc3RhbmNlRnVuY3Rpb25zLCBNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXN9IGZyb20gJy4uL21hY3JvbW9sZWN1bGUtZGlzdGFuY2UtZnVuY3Rpb25zJztcbmltcG9ydCB7RGlzdGFuY2VNZXRyaWNzU3ViamVjdHMsIEJpdEFycmF5TWV0cmljc05hbWVzLFxuICBTdHJpbmdNZXRyaWNzTmFtZXMsIFZlY3Rvck1ldHJpY3NOYW1lcywgTnVtYmVyTWV0cmljc05hbWVzfSBmcm9tICcuL2NvbnN0cyc7XG5cblxuZXhwb3J0IGNvbnN0IHZlY3RvckRpc3RhbmNlTWV0cmljc01ldGhvZHM6IHsgW25hbWU6IHN0cmluZ106ICh4OiBWZWN0b3IsIHk6IFZlY3RvcikgPT4gbnVtYmVyIH0gPSB7XG4gIFtWZWN0b3JNZXRyaWNzTmFtZXMuRXVjbGlkZWFuXTogY2FsY3VsYXRlRXVjbGlkZWFuRGlzdGFuY2UsXG59O1xuXG5leHBvcnQgY29uc3Qgc3RyaW5nRGlzdGFuY2VNZXRyaWNzTWV0aG9kczogeyBbbmFtZTogc3RyaW5nXTogKHg6IHN0cmluZywgeTogc3RyaW5nKSA9PiBudW1iZXIgfSA9IHtcbiAgW1N0cmluZ01ldHJpY3NOYW1lcy5MZXZlbnNodGVpbl06IGZsLmRpc3RhbmNlLFxuICBbU3RyaW5nTWV0cmljc05hbWVzLkphcm9XaW5rbGVyXTogamFyb1dpbmtsZXIsXG4gIFtTdHJpbmdNZXRyaWNzTmFtZXMuTWFuaGF0dGFuXTogbWFuaGF0dGFuRGlzdGFuY2UsXG59O1xuXG5leHBvcnQgY29uc3QgYml0QXJyYXlEaXN0YW5jZU1ldHJpY3NNZXRob2RzOiB7IFtuYW1lOiBzdHJpbmddOiAoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KSA9PiBudW1iZXIgfSA9IHtcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLlRhbmltb3RvXTogdGFuaW1vdG9EaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkRpY2VdOiBkaWNlRGlzdGFuY2UsXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Bc3ltbWV0cmljXTogYXN5bW1ldHJpY0Rpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuQnJhdW5CbGFucXVldF06IGJyYXVuQmxhbnF1ZXREaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkNvc2luZV06IGNvc2luZURpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuS3VsY3p5bnNraV06IGt1bGN6eW5za2lEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLk1jQ29ubmF1Z2hleV06IG1jQ29ubmF1Z2hleURpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuUm9nb3RHb2xkYmVyZ106IHJvZ290R29sZGJlcmdEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLlJ1c3NlbF06IHJ1c3NlbERpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuU29rYWxdOiBzb2thbERpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuSGFtbWluZ106IGhhbW1pbmdEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkV1Y2xpZGVhbl06IGV1Y2xpZGVhbkRpc3RhbmNlLFxufTtcblxuZXhwb3J0IGNvbnN0IG51bWJlckRpc3RhbmNlTWV0cmljc01ldGhvZHM6IHsgW25hbWU6IHN0cmluZ106ICh4OiBudW1iZXIsIHk6IG51bWJlcikgPT4gbnVtYmVyIH0gPSB7XG4gIFtOdW1iZXJNZXRyaWNzTmFtZXMuTnVtZXJpY0Rpc3RhbmNlXTogbnVtZXJpY0Rpc3RhbmNlLFxufTtcblxuZXhwb3J0IGNvbnN0IEF2YWlsYWJsZU1ldHJpY3MgPSB7XG4gIFtEaXN0YW5jZU1ldHJpY3NTdWJqZWN0cy5WZWN0b3JdOiB7XG4gICAgW1ZlY3Rvck1ldHJpY3NOYW1lcy5FdWNsaWRlYW5dOiB2ZWN0b3JEaXN0YW5jZU1ldHJpY3NNZXRob2RzW1ZlY3Rvck1ldHJpY3NOYW1lcy5FdWNsaWRlYW5dLFxuICB9LFxuICBbRGlzdGFuY2VNZXRyaWNzU3ViamVjdHMuU3RyaW5nXToge1xuICAgIFtTdHJpbmdNZXRyaWNzTmFtZXMuTGV2ZW5zaHRlaW5dOiBzdHJpbmdEaXN0YW5jZU1ldHJpY3NNZXRob2RzW1N0cmluZ01ldHJpY3NOYW1lcy5MZXZlbnNodGVpbl0sXG4gICAgW1N0cmluZ01ldHJpY3NOYW1lcy5KYXJvV2lua2xlcl06IHN0cmluZ0Rpc3RhbmNlTWV0cmljc01ldGhvZHNbU3RyaW5nTWV0cmljc05hbWVzLkphcm9XaW5rbGVyXSxcbiAgICBbU3RyaW5nTWV0cmljc05hbWVzLk1hbmhhdHRhbl06IHN0cmluZ0Rpc3RhbmNlTWV0cmljc01ldGhvZHNbU3RyaW5nTWV0cmljc05hbWVzLk1hbmhhdHRhbl0sXG4gIH0sXG4gIFtEaXN0YW5jZU1ldHJpY3NTdWJqZWN0cy5CaXRBcnJheV06IHtcbiAgICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuVGFuaW1vdG9dOiBiaXRBcnJheURpc3RhbmNlTWV0cmljc01ldGhvZHNbQml0QXJyYXlNZXRyaWNzTmFtZXMuVGFuaW1vdG9dLFxuICAgIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5EaWNlXTogYml0QXJyYXlEaXN0YW5jZU1ldHJpY3NNZXRob2RzW0JpdEFycmF5TWV0cmljc05hbWVzLkRpY2VdLFxuICAgIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Bc3ltbWV0cmljXTogYml0QXJyYXlEaXN0YW5jZU1ldHJpY3NNZXRob2RzW0JpdEFycmF5TWV0cmljc05hbWVzLkFzeW1tZXRyaWNdLFxuICAgIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5CcmF1bkJsYW5xdWV0XTogYml0QXJyYXlEaXN0YW5jZU1ldHJpY3NNZXRob2RzW0JpdEFycmF5TWV0cmljc05hbWVzLkJyYXVuQmxhbnF1ZXRdLFxuICAgIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Db3NpbmVdOiBiaXRBcnJheURpc3RhbmNlTWV0cmljc01ldGhvZHNbQml0QXJyYXlNZXRyaWNzTmFtZXMuQ29zaW5lXSxcbiAgICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuS3VsY3p5bnNraV06IGJpdEFycmF5RGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tCaXRBcnJheU1ldHJpY3NOYW1lcy5LdWxjenluc2tpXSxcbiAgICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuTWNDb25uYXVnaGV5XTogYml0QXJyYXlEaXN0YW5jZU1ldHJpY3NNZXRob2RzW0JpdEFycmF5TWV0cmljc05hbWVzLk1jQ29ubmF1Z2hleV0sXG4gICAgW0JpdEFycmF5TWV0cmljc05hbWVzLlJvZ290R29sZGJlcmddOiBiaXRBcnJheURpc3RhbmNlTWV0cmljc01ldGhvZHNbQml0QXJyYXlNZXRyaWNzTmFtZXMuUm9nb3RHb2xkYmVyZ10sXG4gICAgW0JpdEFycmF5TWV0cmljc05hbWVzLlJ1c3NlbF06IGJpdEFycmF5RGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tCaXRBcnJheU1ldHJpY3NOYW1lcy5SdXNzZWxdLFxuICAgIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Tb2thbF06IGJpdEFycmF5RGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tCaXRBcnJheU1ldHJpY3NOYW1lcy5Tb2thbF0sXG4gIH0sXG4gIFtEaXN0YW5jZU1ldHJpY3NTdWJqZWN0cy5NYWNyb01vbGVjdWxlXTogeyAvLyBvcHRpb25hbCBhcmdzIG5lZWRlZCBmb3IgbWFjcm9tb2xlY3VsZSBmdW5jdGlvbnMgd2hpY2ggaW5pdGlhbGl6ZSB0aGVtXG4gICAgW01tRGlzdGFuY2VGdW5jdGlvbnNOYW1lcy5IQU1NSU5HXTogbW1EaXN0YW5jZUZ1bmN0aW9uc1tNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXMuSEFNTUlOR10sXG4gICAgW01tRGlzdGFuY2VGdW5jdGlvbnNOYW1lcy5MRVZFTlNIVEVJTl06IG1tRGlzdGFuY2VGdW5jdGlvbnNbTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzLkxFVkVOU0hURUlOXSxcbiAgICBbTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzLk5FRURMRU1BTk5fV1VOU0NIXTogbW1EaXN0YW5jZUZ1bmN0aW9uc1tNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXMuTkVFRExFTUFOTl9XVU5TQ0hdLFxuICB9LFxuICBbRGlzdGFuY2VNZXRyaWNzU3ViamVjdHMuTnVtYmVyXToge1xuICAgIFtOdW1iZXJNZXRyaWNzTmFtZXMuTnVtZXJpY0Rpc3RhbmNlXTogbnVtYmVyRGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tOdW1iZXJNZXRyaWNzTmFtZXMuTnVtZXJpY0Rpc3RhbmNlXSxcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IE1ldHJpY1RvRGF0YVR5cGU6IFN0cmluZ0RpY3Rpb25hcnkgPSBPYmplY3Qua2V5cyhBdmFpbGFibGVNZXRyaWNzKVxuICAucmVkdWNlKChyZXQ6IFN0cmluZ0RpY3Rpb25hcnksIGtleSkgPT4ge1xuICAgIGZvciAoY29uc3QgdmFsIG9mIE9iamVjdC5rZXlzKEF2YWlsYWJsZU1ldHJpY3Nba2V5IGFzIEF2YWlsYWJsZURhdGFUeXBlc10pKVxuICAgICAgcmV0W3ZhbCBhcyBBdmFpbGFibGVEYXRhVHlwZXNdID0ga2V5O1xuXG4gICAgcmV0dXJuIHJldDtcbiAgfSwge30pO1xuXG5leHBvcnQgdHlwZSBBdmFpbGFibGVEYXRhVHlwZXMgPSBrZXlvZiB0eXBlb2YgQXZhaWxhYmxlTWV0cmljcztcbmV4cG9ydCB0eXBlIFZlY3Rvck1ldHJpY3MgPSBrZXlvZiB0eXBlb2YgQXZhaWxhYmxlTWV0cmljc1tEaXN0YW5jZU1ldHJpY3NTdWJqZWN0cy5WZWN0b3JdO1xuZXhwb3J0IHR5cGUgU3RyaW5nTWV0cmljcyA9IGtleW9mIHR5cGVvZiBBdmFpbGFibGVNZXRyaWNzW0Rpc3RhbmNlTWV0cmljc1N1YmplY3RzLlN0cmluZ107XG5leHBvcnQgdHlwZSBCaXRBcnJheU1ldHJpY3MgPSBrZXlvZiB0eXBlb2YgQXZhaWxhYmxlTWV0cmljc1tEaXN0YW5jZU1ldHJpY3NTdWJqZWN0cy5CaXRBcnJheV07XG5leHBvcnQgdHlwZSBLbm93bk1ldHJpY3MgPSBTdHJpbmdNZXRyaWNzIHwgQml0QXJyYXlNZXRyaWNzIHwgVmVjdG9yTWV0cmljcyB8XG4gIE1tRGlzdGFuY2VGdW5jdGlvbnNOYW1lcyB8IE51bWJlck1ldHJpY3NOYW1lcztcblxuZXhwb3J0IHR5cGUgVmFsaWRUeXBlcyA9XG4gIHsgZGF0YTogc3RyaW5nW10sIG1ldHJpYzogU3RyaW5nTWV0cmljcyB8IE1tRGlzdGFuY2VGdW5jdGlvbnNOYW1lcyB9IHxcbiAgeyBkYXRhOiBWZWN0b3JbXSwgbWV0cmljOiBWZWN0b3JNZXRyaWNzIH0gfFxuICB7IGRhdGE6IEJpdEFycmF5W10sIG1ldHJpYzogQml0QXJyYXlNZXRyaWNzIH0gfFxuICB7IGRhdGE6IG51bWJlcltdLCBtZXRyaWM6IE51bWJlck1ldHJpY3NOYW1lcyB9O1xuXG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmdNZXRyaWMobmFtZTogS25vd25NZXRyaWNzKSB7XG4gIHJldHVybiBNZXRyaWNUb0RhdGFUeXBlW25hbWVdID09ICdTdHJpbmcnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNCaXRBcnJheU1ldHJpYyhuYW1lOiBLbm93bk1ldHJpY3MpIHtcbiAgcmV0dXJuIE1ldHJpY1RvRGF0YVR5cGVbbmFtZV0gPT0gJ0JpdEFycmF5Jztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVmVjdG9yTWV0cmljKG5hbWU6IEtub3duTWV0cmljcykge1xuICByZXR1cm4gTWV0cmljVG9EYXRhVHlwZVtuYW1lXSA9PSAnVmVjdG9yJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTWFjcm9Nb2xlY3VsZU1ldHJpYyhuYW1lOiBLbm93bk1ldHJpY3MpIHtcbiAgcmV0dXJuIE1ldHJpY1RvRGF0YVR5cGVbbmFtZV0gPT0gRGlzdGFuY2VNZXRyaWNzU3ViamVjdHMuTWFjcm9Nb2xlY3VsZS50b1N0cmluZygpO1xufVxuXG4vKiogTWFuaGF0dGFuIGRpc3RhbmNlIGJldHdlZW4gdHdvIHNlcXVlbmNlcyAobWF0Y2ggLSAwLCBtaXNtYXRjaCAtIDEpIG5vcm1hbGl6ZWQgZm9yIGxlbmd0aC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYW5oYXR0YW5EaXN0YW5jZShzMTogc3RyaW5nLCBzMjogc3RyaW5nKTogbnVtYmVyIHtcbiAgaWYgKHMxLmxlbmd0aCAhPT0gczIubGVuZ3RoKSB7XG4gICAgcmV0dXJuIDE7XG4gIH0gZWxzZSB7XG4gICAgbGV0IGRpc3Q6IG51bWJlciA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzMS5sZW5ndGg7IGkrKylcbiAgICAgIGRpc3QgKz0gczFbaV0gPT0gczJbaV0gPyAwIDogMTtcbiAgICByZXR1cm4gZGlzdCAvIHMxLmxlbmd0aDtcbiAgfVxufVxuXG4vKiogVW5pZmllZCBjbGFzcyBpbXBsZW1lbnRpbmcgZGlmZmVyZW50IHN0cmluZyBtZWFzdXJlcy4gKi9cbmV4cG9ydCBjbGFzcyBNZWFzdXJlIHtcbiAgcHJvdGVjdGVkIG1ldGhvZDogS25vd25NZXRyaWNzO1xuICBwcm90ZWN0ZWQgZGF0YVR5cGU6IEF2YWlsYWJsZURhdGFUeXBlcztcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBNZWFzdXJlIHdpdGggLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kIE1ldGhvZCB0byBjYWxjdWxhdGUgZGlzdGFuY2UgYmV0d2VlbiBzdHJpbmdzLlxuICAgKiBAbWVtYmVyb2YgTWVhc3VyZXJcbiAgICovXG4gIGNvbnN0cnVjdG9yKG1ldGhvZDogS25vd25NZXRyaWNzKSB7XG4gICAgdGhpcy5tZXRob2QgPSBtZXRob2Q7XG4gICAgdGhpcy5kYXRhVHlwZSA9IE1ldHJpY1RvRGF0YVR5cGVbbWV0aG9kXSBhcyBBdmFpbGFibGVEYXRhVHlwZXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBjdXN0b20gc3RyaW5nIGRpc3RhbmNlIGZ1bmN0aW9uIHNwZWNpZmllZC5cbiAgICogQHBhcmFtIHtvcHRzfSBvcHRzIE9wdGlvbnMgZm9yIHRoZSBtZWFzdXJlLiB1c2VkIGZvciBtYWNyb21vbGVjdWxlIGRpc3RhbmNlc1xuICAgKiBAcmV0dXJuIHtEaXN0YW5jZU1ldHJpY30gQ2FsbGJhY2sgb2YgdGhlIG1lYXN1cmUgY2hvc2VuLlxuICAgKiBAbWVtYmVyb2YgTWVhc3VyZXJcbiAgICovXG4gIHB1YmxpYyBnZXRNZWFzdXJlKG9wdHM/OiBhbnkpOiBEaXN0YW5jZU1ldHJpYyB7XG4gICAgY29uc3QgZGljdDogeyBba2V5OiBzdHJpbmddOlxuICAgICAge1trZXkyOiBzdHJpbmddOiBEaXN0YW5jZU1ldHJpYyB8ICgob3B0czogYW55KSA9PiBEaXN0YW5jZU1ldHJpYyl9XG4gICAgfSA9IEF2YWlsYWJsZU1ldHJpY3M7XG4gICAgaWYgKCFkaWN0Lmhhc093blByb3BlcnR5KHRoaXMuZGF0YVR5cGUpIHx8ICFkaWN0W3RoaXMuZGF0YVR5cGVdLmhhc093blByb3BlcnR5KHRoaXMubWV0aG9kKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBtZWFzdXJlICR7dGhpcy5tZXRob2R9IGZvciBkYXRhIHR5cGUgJHt0aGlzLmRhdGFUeXBlfWApO1xuICAgIHJldHVybiBpc01hY3JvTW9sZWN1bGVNZXRyaWModGhpcy5tZXRob2QpID9cbiAgICAgIChkaWN0W3RoaXMuZGF0YVR5cGVdW3RoaXMubWV0aG9kXSBhcyAoKG9wdHM6IGFueSkgPT4gRGlzdGFuY2VNZXRyaWMpKShvcHRzKSA6XG4gICAgICBkaWN0W3RoaXMuZGF0YVR5cGVdW3RoaXMubWV0aG9kXSBhcyBEaXN0YW5jZU1ldHJpYztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGN1c3RvbSBzdHJpbmcgZGlzdGFuY2UgYnkgdGhlIGdpdmVuIGRhdGEgdHlwZS5cbiAgICogQHBhcmFtIHtBdmFpbGFibGVEYXRhVHlwZXN9IGRhdGFUeXBlIE1ldHJpYydzIGRhdGEgdHlwZVxuICAgKiBAcmV0dXJuIHtzdHJpbmdbXX0gTWV0cmljIG5hbWVzIHdoaWNoIGV4cGVjdHMgdGhlIGdpdmVuIGRhdGEgdHlwZVxuICAgKiBAbWVtYmVyb2YgTWVhc3VyZXJcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0TWV0cmljQnlEYXRhVHlwZShkYXRhVHlwZTogQXZhaWxhYmxlRGF0YVR5cGVzKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhBdmFpbGFibGVNZXRyaWNzW2RhdGFUeXBlXSk7XG4gIH1cblxuICAvKiogUmV0dXJucyBtZXRyaWMgbmFtZXMgYXZhaWxhYmxlLlxuICAgKiBAbWVtYmVyb2YgTWVhc3VyZXJcbiAgICovXG4gIHN0YXRpYyBnZXQgYXZhaWxhYmxlTWVhc3VyZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhBdmFpbGFibGVNZXRyaWNzKTtcbiAgfVxufVxuIl19","export default class BitArray {\n constructor(arg, defaultValue = false) {\n this._length = 0;\n this._version = 0;\n this._updateLevel = 0;\n this._selectedCount = 0;\n this._selectedCountVersion = -1;\n this._selectedIndexesVersion = -1;\n this._versionedName = '';\n this._versionedNameVersion = -1;\n this.SHRINK_THRESHOLD = 0x100;\n if (typeof arg === 'number') {\n const length = arg;\n const buff = BitArray._createBuffer(length);\n if (defaultValue) {\n for (let i = 0; i < buff.length; i++)\n buff[i] = -1;\n }\n this._data = buff;\n this._length = length;\n }\n else if (arg instanceof Uint32Array) {\n this._data = arg;\n this._length = defaultValue;\n }\n else {\n throw new Error('Invalid constructor');\n }\n }\n getRawData() { return this._data; }\n assureGoez(num, argName) {\n if (num < 0)\n throw new Error(`${argName} should be greater than zero`);\n }\n assureInRange(value, min, max, argName) {\n if ((value < min) || (value > max))\n throw new Error(`Argument ${argName} (${value}) out of range (${min}, ${max})`);\n }\n copy(src, dst, count) {\n for (let i = 0; i < count; i++)\n dst[i] = src[i];\n }\n copyFrom(other) {\n if (this._length != other._length)\n throw new Error(`Lengths differ (${this._length} != ${other._length})`);\n this.copy(other._data, this._data, this.lengthInInts);\n this._version++;\n }\n get length() {\n return this._length;\n }\n get buffer() {\n return this._data;\n }\n set buffer(data) {\n this._data = data;\n this._version++;\n }\n get version() {\n return this._version;\n }\n set version(value) {\n this._version = value;\n }\n incrementVersion(notify = true) {\n this._version++;\n }\n get lengthInInts() {\n return Math.floor((this._length + 0x1f) / 0x20);\n }\n get versionedName() {\n return this._version == this._versionedNameVersion ? this._versionedName : '';\n }\n set versionedName(name) {\n this._versionedName = name;\n this._versionedNameVersion = this._version;\n }\n get self() {\n return this;\n }\n setLength(value) {\n if (value < 0)\n throw new Error('should be >= 0');\n if (value == this._length)\n return;\n const nIntsNeeded = Math.floor((value + 0x1f) / 0x20);\n if ((nIntsNeeded > this._data.length) || ((nIntsNeeded + this.SHRINK_THRESHOLD) < this._data.length)) {\n const newData = new Uint32Array(nIntsNeeded);\n this.copy(this._data, newData, (nIntsNeeded > this._data.length) ? this._data.length : nIntsNeeded);\n this._data = newData;\n }\n if (value > this._length) {\n if (this._length % 0x20 > 0)\n this._data[this.lengthInInts - 1] &= (1 << ((this._length % 0x20) & 0x1f)) - 1;\n this._data.fill(0, this.lengthInInts, nIntsNeeded);\n }\n this._length = value;\n this._version++;\n }\n static fromAnd(set1, set2) {\n if (set1._length != set2._length)\n throw new Error(`Lengths differ (${set1._length} != ${set2._length})`);\n const temp = new BitArray(set1._length);\n temp._length = set1._length;\n temp._data = BitArray._createBuffer(temp._length);\n temp._version = 0;\n const len = set1.lengthInInts;\n for (let i = 0; i < len; i++)\n temp._data[i] = set1._data[i] & set2._data[i];\n return temp;\n }\n static _createBuffer(length) {\n return new Uint32Array(Math.floor((length + 0x1f) / 0x20));\n }\n static fromValues(values) {\n const temp = new BitArray(values.length);\n temp._version = 0;\n for (let i = 0; i < temp._length; i++) {\n if (values[i])\n temp._data[Math.floor(i / 0x20)] |= 1 << ((i % 0x20) & 0x1f);\n }\n return temp;\n }\n /// Constructs a [BitSet] of length [count], where idx-th bit is determined by a call to [flag] (idx).\n static fromSeq(count, flag) {\n const temp = new BitArray(count);\n for (let i = 0; i < count; ++i)\n temp.setBit(i, flag(i));\n temp._version = 0;\n return temp;\n }\n /// Constructs a [BitSet] from a string [s] containing '0' or '1'.\n static fromString(s) {\n return BitArray.fromSeq(s.length, (i) => s.charAt(i) == '1');\n }\n /// Constructs a [BitSet], based on length [_length] and byte array [_data].\n static fromUint32Array(_length, _data) {\n const temp = new BitArray(_length);\n temp._data = _data;\n return temp;\n }\n /// Deserializes a [BitSet] from [bytes].\n static fromBytes(bytes) {\n const len = bytes.length;\n const temp = new BitArray(len * 8);\n temp._data = new Uint32Array(Math.floor((len + 3) / 4));\n temp._length = len * 8;\n let num1 = 0;\n let num2 = 0;\n while ((len - num2) >= 4) {\n temp._data[num1++] = (((bytes[num2] & 0xff) | ((bytes[num2 + 1] & 0xff) << 8)) |\n ((bytes[num2 + 2] & 0xff) << 0x10)) | ((bytes[num2 + 3] & 0xff) << 0x18);\n num2 += 4;\n }\n if (len - num2 == 3)\n temp._data[num1] = (bytes[num2 + 2] & 0xff) << 0x10;\n if (len - num2 == 2)\n temp._data[num1] |= (bytes[num2 + 1] & 0xff) << 8;\n if (len - num2 == 1)\n temp._data[num1] |= bytes[num2] & 0xff;\n temp._version = 0;\n return temp;\n }\n toString() {\n return `${this._length} bits, ${this.countBits(true)} set`;\n }\n /// Performs deep comparison of two bitsets.\n equals(other) {\n if (this == other)\n return true;\n if (other == null)\n return false;\n if (this._length != other._length)\n return false;\n if (this._length == 0)\n return true;\n for (let i = 0; i < this._data.length - 1; i++)\n if (this._data[i] != other._data[i])\n return false;\n for (let i = (this._data.length - 1) * 8; i < this._length; i++) {\n if (this.getBit(i) != other.getBit(i))\n return false;\n }\n return true;\n }\n /** Clones a bitset. */\n clone() {\n const bitArray = new BitArray(0, false);\n bitArray._data = Uint32Array.from(this._data); // effective length: (lengthInInts)\n bitArray._length = this._length;\n bitArray._version = this._version;\n return bitArray;\n }\n /** Initializes a bitset. */\n init(flag, notify) {\n this.setAll(false, false);\n for (let i = 0; i < this._length; i++) {\n if (flag(i))\n this._data[Math.floor(i / 0x20)] |= 1 << ((i % 0x20) & 0x1f);\n }\n this.incrementVersion(notify);\n return this;\n }\n /// Inverts a bitset.\n invert(notify = true) {\n for (let i = 0; i < this._data.length; i++)\n this._data[i] ^= -1;\n this.incrementVersion(notify);\n }\n /// Sets all bits to [value], optionally suppressing notifications.\n setAll(value, notify = false) {\n const flags = value ? -1 : 0;\n const len = this.lengthInInts;\n for (let i = 0; i < len; i++) //todo: optimize\n this._data[i] = flags;\n this.incrementVersion(notify);\n }\n /// Sets bits at [indexes] position to [value].\n /// Clears the bitset if [clear] flag is true.\n /// Change notification is raised when [notify] is true.\n setIndexes(indexes, value = true, clear = true, notify = true) {\n if (clear)\n this.setAll(!value, false);\n for (const i of indexes)\n this.setFast(i, value);\n this.incrementVersion(notify);\n }\n everyIndex(indexes, value = true) {\n for (const index of indexes) {\n if (this.getBit(index) != value)\n return false;\n }\n return true;\n }\n anyIndex(indexes, value = true) {\n for (const index of indexes) {\n if (this.getBit(index) == value)\n return true;\n }\n return false;\n }\n setWhere(check, value = true, clear = true, notify = true, allowClear = true) {\n if (clear && allowClear)\n this.setAll(!value, false);\n if (allowClear) {\n for (let i = 0; i < this._length; i++) {\n if (check(i))\n this.setFast(i, value);\n }\n }\n else {\n for (let i = 0; i < this._length; i++)\n this.setFast(i, check(i) ? value : !value);\n }\n this.incrementVersion(notify);\n }\n getRange(from, to) {\n this.assureInRange(from, 0, this._length - 1, 'from');\n this.assureInRange(to, 0, this._length, 'to');\n const arr = [];\n for (let i = from; i < to; ++i)\n arr.push(this.getBit(i));\n return BitArray.fromValues(arr);\n }\n getRangeAsList(from, to) {\n this.assureInRange(from, 0, this._length - 1, 'from');\n this.assureInRange(to, 0, this._length, 'to');\n const arr = [];\n for (let i = from; i < to; ++i)\n arr.push(this.getBit(i));\n return arr;\n }\n setRange(from, to, value, notify = true) {\n this.assureInRange(from, 0, this._length - 1, 'from');\n this.assureInRange(to, 0, this._length - 1, 'to');\n const start = Math.min(from, to);\n const end = Math.max(from, to);\n //todo: optimize\n if (value) {\n for (let i = start; i <= end; i++)\n this.setTrue(i);\n }\n else {\n for (let i = start; i <= end; i++)\n this.setFalse(i);\n }\n this.incrementVersion(notify);\n return this;\n }\n /// Sets n randomly chosen bits to value, remaining bits to !value.\n setRandom(n, value, notify = true) {\n if (n < 0 || n > this._length)\n throw new Error('n must be >= 0 && <= Count');\n if (n > this._length / 2)\n this.setRandom(this._length - n, !value);\n this.setAll(!value);\n for (let k = 0; k < n;) {\n const i = Math.floor(Math.random() * this._length);\n if (this.getBit(i) == value)\n continue;\n this.setFast(i, value);\n k++;\n }\n this.incrementVersion(notify);\n }\n /// Modifies current bitset by performing the bitwise AND operation against the\n /// corresponding elements in the specified bitset.\n and(value, notify = true) {\n if (this._length != value._length)\n throw new Error('Array lengths differ.');\n for (let i = 0, len = this.lengthInInts; i < len; i++)\n this._data[i] &= value._data[i];\n this.incrementVersion(notify);\n return this;\n }\n /// Performs the bitwise AND NOT operation on the elements in the current bitset\n /// against the corresponding elements in the specified bitset.\n andNot(value, notify = true) {\n if (this._length != value._length)\n throw new Error('Array lengths differ.');\n const len = this.lengthInInts;\n for (let num2 = 0; num2 < len; num2++)\n this._data[num2] &= ~value._data[num2];\n this.incrementVersion(notify);\n return this;\n }\n /// Performs the bitwise NOT AND operation on the elements in the current bitset\n /// against the corresponding elements in the specified bitset.\n notAnd(value, notify = true) {\n if (this._length != value._length)\n throw new Error('Array lengths differ.');\n for (let i = 0, len = this.lengthInInts; i < len; i++)\n this._data[i] = (~this._data[i]) & value._data[i];\n this.incrementVersion(notify);\n return this;\n }\n /// Inverts all bit values in the current bitset\n not(notify = true) {\n for (let i = 0, len = this.lengthInInts; i < len; i++)\n this._data[i] = ~this._data[i];\n this.incrementVersion(notify);\n return this;\n }\n /// Performs the bitwise OR operation on the elements in the current bitset\n /// against the corresponding elements in the specified bitset.\n or(value, notify = true) {\n if (this._length != value._length)\n throw new Error('Array lengths differ.');\n for (let i = 0, len = this.lengthInInts; i < len; i++)\n this._data[i] |= value._data[i];\n this.incrementVersion(notify);\n return this;\n }\n /// Performs the bitwise exclusive OR operation on the elements in the current bitset\n /// against the corresponding elements in the specified bitset.\n xor(value, notify = true) {\n if (this._length != value._length)\n throw new Error('Array lengths differ.');\n for (let i = 0, len = this.lengthInInts; i < len; i++)\n this._data[i] ^= value._data[i];\n this.incrementVersion(notify);\n return this;\n }\n /// Inserts n 0-bits at position pos, resizing self and shifting bits appropriately.\n insertAt(pos, n, flag = false) {\n this.assureInRange(pos, 0, this._length, 'pos');\n if (n == 0)\n return;\n //TODO: optimize\n //the most primitive implementation, optimize it later!\n // beginUpdate();\n const oldlength = this._length;\n this.setLength(this._length + n);\n //if (!contains(!flag)) return; // nothing to do\n for (let i = oldlength - 1; i >= pos; i--)\n this.setBit(i + n, this.getBit(i));\n for (let i = pos; i < pos + n; i++)\n this.setBit(i, flag);\n // endUpdate();\n }\n /// Deletes n bits beginning at position pos, resizing self and shifting remaining\n /// bits appropriately.\n removeAt(pos, n = 1) {\n // the most primitive implementation, optimize it later!\n if (n < 0)\n throw new Error('n cannot be negative');\n this.assureInRange(pos, 0, this._length - n, 'pos');\n if (this.contains(true)) {\n for (let i = pos; i < this._length - n; i++)\n this.setBit(i, this.getBit(i + n));\n }\n this.setLength(this._length - n);\n }\n removeByMask(mask, flag = true) {\n if (this._length != mask.length)\n throw new Error('length != mask.length');\n if (mask == this) { // no need to iterate\n this.setLength(mask.countBits(!flag));\n this.setAll(!flag);\n }\n else {\n let dstIdx = 0;\n for (let srcIdx = -1; (srcIdx = mask.findNext(srcIdx, !flag)) != -1;)\n this.setFast(dstIdx++, this.getBit(srcIdx));\n this._length = dstIdx;\n this._version++;\n }\n return this;\n }\n /// Similar to the [] operator.\n getBit(pos) {\n return (this._data[Math.floor(pos / 0x20)] & (1 << (pos & 0x1f))) != 0;\n }\n /// Similar to the [] operator.\n setBit(pos, bit, notify = true) {\n this.setFast(pos, bit);\n if (notify)\n this._version++;\n else\n this._version++;\n }\n /// Sets [i]-th bit to [value], does not check bounds, does not increment version\n setFast(i, value) {\n if (value)\n this._data[Math.floor(i / 0x20)] |= 1 << (i & 0x1f);\n else\n this._data[Math.floor(i / 0x20)] &= ~(1 << (i & 0x1f));\n }\n setTrue(pos) {\n this._data[Math.floor(pos / 0x20)] |= 1 << (pos & 0x1f);\n }\n setFalse(pos) {\n this._data[Math.floor(pos / 0x20)] &= ~(1 << (pos & 0x1f));\n }\n trueCount() {\n return this.countBits(true);\n }\n falseCount() {\n return this.countBits(false);\n }\n /// Counts bits of the specified value.\n countBits(value) {\n if (this._length == 0)\n return 0;\n if (this._selectedCountVersion != this._version) {\n this._selectedCount = 0;\n const len = this.lengthInInts;\n let i = 0;\n for (; i < len - 1; i++) {\n for (let k = this._data[i]; k != 0; k >>>= 8) { //todo: cast data[i] to uint\n this._selectedCount += BitArray._onBitCount[k & 0xff];\n }\n }\n // The last int.\n let k = this._data[i];\n const remainingBits = this._length & 0x1f;\n if (remainingBits != 0) /* if remainingBits == 0, the last int is fully used and ALL bits should be left as is */\n k &= ~((4294967295) << remainingBits);\n for (; k != 0; k >>>= 8)\n this._selectedCount += BitArray._onBitCount[k & 0xff];\n this._selectedCountVersion = this._version;\n }\n return (value ? this._selectedCount : this._length - this._selectedCount);\n }\n /// Returns a number of set bits where also [check] is true\n countWhere(check) {\n let result = 0;\n if (this.trueCount() == this._length) {\n for (let i = 0; i < this._length; i++)\n result += check(i) ? 1 : 0;\n }\n else {\n for (let i = -1; (i = this.findNext(i, true)) != -1;)\n result += check(i) ? 1 : 0;\n }\n return result;\n }\n /// Performs bit \"and\" and counts bits of the specified value, without bitset modification.\n andWithCountBits(second, value) {\n if (this._length == 0)\n return 0;\n let count = 0;\n const len = this.lengthInInts;\n let i = 0;\n for (; i < len - 1; i++) {\n for (let k = this._data[i] & second._data[i]; k != 0; k >>>= 8)\n count += BitArray._onBitCount[k & 0xff];\n }\n // The last int.\n let k = this._data[i] & second._data[i];\n const remainingBits = this._length & 0x1f;\n if (remainingBits != 0)\n k &= ~((4294967295) << remainingBits);\n for (; k != 0; k >>>= 8)\n count += BitArray._onBitCount[k & 0xff];\n return (value ? count : this._length - count);\n }\n clear() {\n this.setLength(0);\n }\n contains(value) {\n return this.findNext(-1, value) >= 0;\n }\n get allTrue() {\n return this.countBits(true) == this._length;\n }\n get allFalse() {\n return this.countBits(false) == this._length;\n }\n get anyTrue() {\n return this.countBits(true) > 0;\n }\n get anyFalse() {\n return this.countBits(false) > 0;\n }\n /// Returns the position of the next bit of the specified value, starting from the specified position.\n /// Returns -1, if there are no such bits.\n findNext(index, value = true) {\n this.assureInRange(index, -1, this._length, 'index');\n if (index >= this._length - 1)\n return -1;\n index = index < 0 ? 0 : index + 1; // skip start\n let unusedBits = index & 0x1f;\n const numInts = this.lengthInInts;\n for (let i = Math.floor(index / 32); i < numInts; i++) {\n let k = (value ? this._data[i] : ~this._data[i]); // uint cast\n if (unusedBits != 0) {\n k &= ((0xffffffff << unusedBits) & 0xffffffff);\n unusedBits = 0;\n }\n else if (!value && k == -4294967296) /* looking for false, all bits are set */ {\n continue;\n }\n for (let j = 0; k != 0; j += 8, k >>>= 8) {\n const p = BitArray._firstOnBit[k & 0xff];\n if (p >= 0) {\n index = p + (i * 32) + j;\n if (index >= this._length)\n return -1;\n return index;\n }\n }\n }\n return -1;\n }\n /// Finds previous bit of the specified value in the bitset.\n findPrev(index, value = true) {\n if (index == 0)\n return -1;\n this.assureInRange(index, -1, this._length, 'index');\n index = index < 0 ? this._length - 1 : index - 1; // skip start\n const lastIntIdx = Math.floor(index / 0x20);\n let remainingBits = (index + 1) & 0x1f;\n for (let i = lastIntIdx; i >= 0; i--) {\n let k = (value ? this._data[i] : ~this._data[i]); // cast\n if (remainingBits != 0) {\n k &= ~((4294967295) << remainingBits);\n remainingBits = 0;\n }\n for (let j = 24; k != 0; j -= 8, k <<= 8) {\n const p = BitArray._lastOnBit[k >>> 0x18];\n if (p >= 0)\n return p + (i * 32) + j;\n }\n }\n return -1;\n }\n}\nBitArray._onBitCount = Int8Array.from([\n 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,\n 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,\n 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,\n 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,\n 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,\n 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,\n 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,\n 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,\n 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,\n 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,\n 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,\n 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,\n 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,\n 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,\n 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,\n 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8\n]);\nBitArray._firstOnBit = Int8Array.from([\n -1, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0\n]);\nBitArray._lastOnBit = Int8Array.from([\n -1, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,\n 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,\n 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,\n 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,\n 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7\n]);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYml0LWFycmF5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYml0LWFycmF5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxPQUFPLE9BQU8sUUFBUTtJQW9FM0IsWUFBWSxHQUF5QixFQUFFLGVBQWlDLEtBQUs7UUFackUsWUFBTyxHQUFHLENBQUMsQ0FBQztRQUNaLGFBQVEsR0FBRyxDQUFDLENBQUM7UUFDYixpQkFBWSxHQUFHLENBQUMsQ0FBQztRQUNqQixtQkFBYyxHQUFHLENBQUMsQ0FBQztRQUNuQiwwQkFBcUIsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMzQiw0QkFBdUIsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM3QixtQkFBYyxHQUFHLEVBQUUsQ0FBQztRQUNwQiwwQkFBcUIsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNuQyxxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFLdkIsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUU7WUFDM0IsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDO1lBQ25CLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDNUMsSUFBSSxZQUFZLEVBQUU7Z0JBQ2hCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtvQkFDbEMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQ2hCO1lBQ0QsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7WUFDbEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7U0FDdkI7YUFBTSxJQUFJLEdBQUcsWUFBWSxXQUFXLEVBQUU7WUFDckMsSUFBSSxDQUFDLEtBQUssR0FBRyxHQUFrQixDQUFDO1lBQ2hDLElBQUksQ0FBQyxPQUFPLEdBQUcsWUFBc0IsQ0FBQztTQUN2QzthQUFNO1lBQ0wsTUFBTSxJ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QUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FBQyxDQUFDLENBQUM7QUFFNUMsb0JBQVcsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO0lBQ2xDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUMvQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUFDLENBQUMsQ0FBQztBQUU1QyxtQkFBVSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7SUFDakMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQy9DLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgY2xhc3MgQml0QXJyYXkge1xuICBzdGF0aWMgX29uQml0Q291bnQgPSBJbnQ4QXJyYXkuZnJvbShbXG4gICAgMCwgMSwgMSwgMiwgMSwgMiwgMiwgMywgMSwgMiwgMiwgMywgMiwgMywgMywgNCxcbiAgICAxLCAyLCAyLCAzLCAyLCAzLCAzLCA0LCAyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LFxuICAgIDEsIDIsIDIsIDMsIDIsIDMsIDMsIDQsIDIsIDMsIDMsIDQsIDMsIDQsIDQsIDUsXG4gICAgMiwgMywgMywgNCwgMywgNCwgNCwgNSwgMywgNCwgNCwgNSwgNCwgNSwgNSwgNixcbiAgICAxLCAyLCAyLCAzLCAyLCAzLCAzLCA0LCAyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LFxuICAgIDIsIDMsIDMsIDQsIDMsIDQsIDQsIDUsIDMsIDQsIDQsIDUsIDQsIDUsIDUsIDYsXG4gICAgMiwgMywgMywgNCwgMywgNCwgNCwgNSwgMywgNCwgNCwgNSwgNCwgNSwgNSwgNixcbiAgICAzLCA0LCA0LCA1LCA0LCA1LCA1LCA2LCA0LCA1LCA1LCA2LCA1LCA2LCA2LCA3LFxuICAgIDEsIDIsIDIsIDMsIDIsIDMsIDMsIDQsIDIsIDMsIDMsIDQsIDMsIDQsIDQsIDUsXG4gICAgMiwgMywgMywgNCwgMywgNCwgNCwgNSwgMywgNCwgNCwgNSwgNCwgNSwgNSwgNixcbiAgICAyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LCAzLCA0LCA0LCA1LCA0LCA1LCA1LCA2LFxuICAgIDMsIDQsIDQsIDUsIDQsIDUsIDUsIDYsIDQsIDUsIDUsIDYsIDUsIDYsIDYsIDcsXG4gICAgMiwgMywgMywgNCwgMywgNCwgNCwgNSwgMywgNCwgNCwgNSwgNCwgNSwgNSwgNixcbiAgICAzLCA0LCA0LCA1LCA0LCA1LCA1LCA2LCA0LCA1LCA1LCA2LCA1LCA2LCA2LCA3LFxuICAgIDMsIDQsIDQsIDUsIDQsIDUsIDUsIDYsIDQsIDUsIDUsIDYsIDUsIDYsIDYsIDcsXG4gICAgNCwgNSwgNSwgNiwgNSwgNiwgNiwgNywgNSwgNiwgNiwgNywgNiwgNywgNywgOF0pO1xuXG4gIHN0YXRpYyBfZmlyc3RPbkJpdCA9IEludDhBcnJheS5mcm9tKFtcbiAgICAtMSwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcbiAgICA0LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxuICAgIDUsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXG4gICAgNCwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcbiAgICA2LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxuICAgIDQsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXG4gICAgNSwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcbiAgICA0LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxuICAgIDcsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXG4gICAgNCwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcbiAgICA1LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxuICAgIDQsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXG4gICAgNiwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcbiAgICA0LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxuICAgIDUsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXG4gICAgNCwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMF0pO1xuXG4gIHN0YXRpYyBfbGFzdE9uQml0ID0gSW50OEFycmF5LmZyb20oW1xuICAgIC0xLCAwLCAxLCAxLCAyLCAyLCAyLCAyLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLFxuICAgIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsXG4gICAgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSxcbiAgICA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LFxuICAgIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsXG4gICAgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNixcbiAgICA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LFxuICAgIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsXG4gICAgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNyxcbiAgICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LFxuICAgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsXG4gICAgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNyxcbiAgICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LFxuICAgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsXG4gICAgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNyxcbiAgICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3XSk7XG5cbiAgcHJpdmF0ZSBfZGF0YTogVWludDMyQXJyYXk7XG4gIHByaXZhdGUgX2xlbmd0aCA9IDA7XG4gIHByaXZhdGUgX3ZlcnNpb24gPSAwO1xuICBwcml2YXRlIF91cGRhdGVMZXZlbCA9IDA7XG4gIHByaXZhdGUgX3NlbGVjdGVkQ291bnQgPSAwO1xuICBwcml2YXRlIF9zZWxlY3RlZENvdW50VmVyc2lvbiA9IC0xO1xuICBwcml2YXRlIF9zZWxlY3RlZEluZGV4ZXNWZXJzaW9uID0gLTE7XG4gIHByaXZhdGUgX3ZlcnNpb25lZE5hbWUgPSAnJztcbiAgcHJpdmF0ZSBfdmVyc2lvbmVkTmFtZVZlcnNpb24gPSAtMTtcbiAgU0hSSU5LX1RIUkVTSE9MRCA9IDB4MTAwO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IFVpbnQzMkFycmF5LCBsZW5ndGg6IG51bWJlcilcbiAgY29uc3RydWN0b3IobGVuZ3RoOiBudW1iZXIsIGRlZmF1bHRWYWx1ZT86IGJvb2xlYW4pXG4gIGNvbnN0cnVjdG9yKGFyZzogbnVtYmVyIHwgVWludDMyQXJyYXksIGRlZmF1bHRWYWx1ZTogYm9vbGVhbiB8IG51bWJlciA9IGZhbHNlKSB7XG4gICAgaWYgKHR5cGVvZiBhcmcgPT09ICdudW1iZXInKSB7XG4gICAgICBjb25zdCBsZW5ndGggPSBhcmc7XG4gICAgICBjb25zdCBidWZmID0gQml0QXJyYXkuX2NyZWF0ZUJ1ZmZlcihsZW5ndGgpO1xuICAgICAgaWYgKGRlZmF1bHRWYWx1ZSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmYubGVuZ3RoOyBpKyspXG4gICAgICAgICAgYnVmZltpXSA9IC0xO1xuICAgICAgfVxuICAgICAgdGhpcy5fZGF0YSA9IGJ1ZmY7XG4gICAgICB0aGlzLl9sZW5ndGggPSBsZW5ndGg7XG4gICAgfSBlbHNlIGlmIChhcmcgaW5zdGFuY2VvZiBVaW50MzJBcnJheSkge1xuICAgICAgdGhpcy5fZGF0YSA9IGFyZyBhcyBVaW50MzJBcnJheTtcbiAgICAgIHRoaXMuX2xlbmd0aCA9IGRlZmF1bHRWYWx1ZSBhcyBudW1iZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb25zdHJ1Y3RvcicpO1xuICAgIH1cbiAgfVxuXG5cbiAgZ2V0UmF3RGF0YSgpIHsgcmV0dXJuIHRoaXMuX2RhdGE7IH1cblxuICBhc3N1cmVHb2V6KG51bTogbnVtYmVyLCBhcmdOYW1lOiBTdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAobnVtIDwgMCkgdGhyb3cgbmV3IEVycm9yKGAke2FyZ05hbWV9IHNob3VsZCBiZSBncmVhdGVyIHRoYW4gemVyb2ApO1xuICB9XG5cbiAgYXNzdXJlSW5SYW5nZSh2YWx1ZTogbnVtYmVyLCBtaW46IG51bWJlciwgbWF4OiBudW1iZXIsIGFyZ05hbWU6IFN0cmluZyk6IHZvaWQge1xuICAgIGlmICgodmFsdWUgPCBtaW4pIHx8ICh2YWx1ZSA+IG1heCkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFyZ3VtZW50ICR7YXJnTmFtZX0gKCR7dmFsdWV9KSBvdXQgb2YgcmFuZ2UgKCR7bWlufSwgJHttYXh9KWApO1xuICB9XG5cbiAgY29weShzcmM6IFVpbnQzMkFycmF5LCBkc3Q6IFVpbnQzMkFycmF5LCBjb3VudDogbnVtYmVyKTogdm9pZCB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKVxuICAgICAgZHN0W2ldID0gc3JjW2ldO1xuICB9XG5cbiAgY29weUZyb20ob3RoZXI6IEJpdEFycmF5KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2xlbmd0aCAhPSBvdGhlci5fbGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBMZW5ndGhzIGRpZmZlciAoJHt0aGlzLl9sZW5ndGh9ICE9ICR7b3RoZXIuX2xlbmd0aH0pYCk7XG4gICAgdGhpcy5jb3B5KG90aGVyLl9kYXRhLCB0aGlzLl9kYXRhLCB0aGlzLmxlbmd0aEluSW50cyk7XG4gICAgdGhpcy5fdmVyc2lvbisrO1xuICB9XG5cbiAgZ2V0IGxlbmd0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbGVuZ3RoO1xuICB9XG5cbiAgZ2V0IGJ1ZmZlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgfVxuXG4gIHNldCBidWZmZXIoZGF0YTogVWludDMyQXJyYXkpIHtcbiAgICB0aGlzLl9kYXRhID0gZGF0YTtcbiAgICB0aGlzLl92ZXJzaW9uKys7XG4gIH1cblxuICBnZXQgdmVyc2lvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fdmVyc2lvbjtcbiAgfVxuXG4gIHNldCB2ZXJzaW9uKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl92ZXJzaW9uID0gdmFsdWU7XG4gIH1cblxuICBpbmNyZW1lbnRWZXJzaW9uKG5vdGlmeSA9IHRydWUpOiB2b2lkIHtcbiAgICB0aGlzLl92ZXJzaW9uKys7XG4gIH1cblxuICBnZXQgbGVuZ3RoSW5JbnRzKCkge1xuICAgIHJldHVybiBNYXRoLmZsb29yKCh0aGlzLl9sZW5ndGggKyAweDFmKSAvIDB4MjApO1xuICB9XG5cbiAgZ2V0IHZlcnNpb25lZE5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZlcnNpb24gPT0gdGhpcy5fdmVyc2lvbmVkTmFtZVZlcnNpb24gPyB0aGlzLl92ZXJzaW9uZWROYW1lIDogJyc7XG4gIH1cblxuICBzZXQgdmVyc2lvbmVkTmFtZShuYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLl92ZXJzaW9uZWROYW1lID0gbmFtZTtcbiAgICB0aGlzLl92ZXJzaW9uZWROYW1lVmVyc2lvbiA9IHRoaXMuX3ZlcnNpb247XG4gIH1cblxuICBnZXQgc2VsZigpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldExlbmd0aCh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlIDwgMClcbiAgICAgIHRocm93IG5ldyBFcnJvcignc2hvdWxkIGJlID49IDAnKTtcblxuICAgIGlmICh2YWx1ZSA9PSB0aGlzLl9sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCBuSW50c05lZWRlZCA9IE1hdGguZmxvb3IoKHZhbHVlICsgMHgxZikgLyAweDIwKTtcbiAgICBpZiAoKG5JbnRzTmVlZGVkID4gdGhpcy5fZGF0YS5sZW5ndGgpIHx8ICgobkludHNOZWVkZWQgKyB0aGlzLlNIUklOS19USFJFU0hPTEQpIDwgdGhpcy5fZGF0YS5sZW5ndGgpKSB7XG4gICAgICBjb25zdCBuZXdEYXRhID0gbmV3IFVpbnQzMkFycmF5KG5JbnRzTmVlZGVkKTtcbiAgICAgIHRoaXMuY29weSh0aGlzLl9kYXRhLCBuZXdEYXRhLCAobkludHNOZWVkZWQgPiB0aGlzLl9kYXRhLmxlbmd0aCkgPyB0aGlzLl9kYXRhLmxlbmd0aCA6IG5JbnRzTmVlZGVkKTtcbiAgICAgIHRoaXMuX2RhdGEgPSBuZXdEYXRhO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSA+IHRoaXMuX2xlbmd0aCkge1xuICAgICAgaWYgKHRoaXMuX2xlbmd0aCAlIDB4MjAgPiAwKVxuICAgICAgICB0aGlzLl9kYXRhW3RoaXMubGVuZ3RoSW5JbnRzIC0gMV0gJj0gKDEgPDwgKCh0aGlzLl9sZW5ndGggJSAweDIwKSAmIDB4MWYpKSAtIDE7XG5cbiAgICAgIHRoaXMuX2RhdGEuZmlsbCgwLCB0aGlzLmxlbmd0aEluSW50cywgbkludHNOZWVkZWQpO1xuICAgIH1cbiAgICB0aGlzLl9sZW5ndGggPSB2YWx1ZTtcbiAgICB0aGlzLl92ZXJzaW9uKys7XG4gIH1cblxuICBzdGF0aWMgZnJvbUFuZChzZXQxOiBCaXRBcnJheSwgc2V0MjogQml0QXJyYXkpOiBCaXRBcnJheSB7XG4gICAgaWYgKHNldDEuX2xlbmd0aCAhPSBzZXQyLl9sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYExlbmd0aHMgZGlmZmVyICgke3NldDEuX2xlbmd0aH0gIT0gJHtzZXQyLl9sZW5ndGh9KWApO1xuXG4gICAgY29uc3QgdGVtcCA9IG5ldyBCaXRBcnJheShzZXQxLl9sZW5ndGgpO1xuICAgIHRlbXAuX2xlbmd0aCA9IHNldDEuX2xlbmd0aDtcbiAgICB0ZW1wLl9kYXRhID0gQml0QXJyYXkuX2NyZWF0ZUJ1ZmZlcih0ZW1wLl9sZW5ndGgpO1xuICAgIHRlbXAuX3ZlcnNpb24gPSAwO1xuXG4gICAgY29uc3QgbGVuID0gc2V0MS5sZW5ndGhJbkludHM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKylcbiAgICAgIHRlbXAuX2RhdGFbaV0gPSBzZXQxLl9kYXRhW2ldICYgc2V0Mi5fZGF0YVtpXTtcblxuICAgIHJldHVybiB0ZW1wO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX2NyZWF0ZUJ1ZmZlcihsZW5ndGg6IG51bWJlcik6IFVpbnQzMkFycmF5IHtcbiAgICByZXR1cm4gbmV3IFVpbnQzMkFycmF5KE1hdGguZmxvb3IoKGxlbmd0aCArIDB4MWYpIC8gMHgyMCkpO1xuICB9XG5cbiAgc3RhdGljIGZyb21WYWx1ZXModmFsdWVzOiBBcnJheTxib29sZWFuPik6IEJpdEFycmF5IHtcbiAgICBjb25zdCB0ZW1wID0gbmV3IEJpdEFycmF5KHZhbHVlcy5sZW5ndGgpO1xuICAgIHRlbXAuX3ZlcnNpb24gPSAwO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZW1wLl9sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHZhbHVlc1tpXSlcbiAgICAgICAgdGVtcC5fZGF0YVtNYXRoLmZsb29yKGkgLyAweDIwKV0gfD0gMSA8PCAoKGkgJSAweDIwKSAmIDB4MWYpO1xuICAgIH1cbiAgICByZXR1cm4gdGVtcDtcbiAgfVxuXG4gIC8vLyBDb25zdHJ1Y3RzIGEgW0JpdFNldF0gb2YgbGVuZ3RoIFtjb3VudF0sIHdoZXJlIGlkeC10aCBiaXQgaXMgZGV0ZXJtaW5lZCBieSBhIGNhbGwgdG8gW2ZsYWddIChpZHgpLlxuICBzdGF0aWMgZnJvbVNlcShjb3VudDogbnVtYmVyLCBmbGFnOiBGdW5jdGlvbik6IEJpdEFycmF5IHtcbiAgICBjb25zdCB0ZW1wID0gbmV3IEJpdEFycmF5KGNvdW50KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyArK2kpXG4gICAgICB0ZW1wLnNldEJpdChpLCBmbGFnKGkpKTtcblxuICAgIHRlbXAuX3ZlcnNpb24gPSAwO1xuICAgIHJldHVybiB0ZW1wO1xuICB9XG5cbiAgLy8vIENvbnN0cnVjdHMgYSBbQml0U2V0XSBmcm9tIGEgc3RyaW5nIFtzXSBjb250YWluaW5nICcwJyBvciAnMScuXG4gIHN0YXRpYyBmcm9tU3RyaW5nKHM6IHN0cmluZyk6IEJpdEFycmF5IHtcbiAgICByZXR1cm4gQml0QXJyYXkuZnJvbVNlcShzLmxlbmd0aCwgKGk6IG51bWJlcikgPT4gcy5jaGFyQXQoaSkgPT0gJzEnKTtcbiAgfVxuXG4gIC8vLyBDb25zdHJ1Y3RzIGEgW0JpdFNldF0sIGJhc2VkIG9uIGxlbmd0aCBbX2xlbmd0aF0gYW5kIGJ5dGUgYXJyYXkgW19kYXRhXS5cbiAgc3RhdGljIGZyb21VaW50MzJBcnJheShfbGVuZ3RoOiBudW1iZXIsIF9kYXRhOiBVaW50MzJBcnJheSk6IEJpdEFycmF5IHtcbiAgICBjb25zdCB0ZW1wID0gbmV3IEJpdEFycmF5KF9sZW5ndGgpO1xuICAgIHRlbXAuX2RhdGEgPSBfZGF0YTtcbiAgICByZXR1cm4gdGVtcDtcbiAgfVxuXG4gIC8vLyBEZXNlcmlhbGl6ZXMgYSBbQml0U2V0XSBmcm9tIFtieXRlc10uXG4gIHN0YXRpYyBmcm9tQnl0ZXMoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBCaXRBcnJheSB7XG4gICAgY29uc3QgbGVuID0gYnl0ZXMubGVuZ3RoO1xuICAgIGNvbnN0IHRlbXAgPSBuZXcgQml0QXJyYXkobGVuICogOCk7XG4gICAgdGVtcC5fZGF0YSA9IG5ldyBVaW50MzJBcnJheShNYXRoLmZsb29yKChsZW4gKyAzKSAvIDQpKTtcbiAgICB0ZW1wLl9sZW5ndGggPSBsZW4gKiA4O1xuICAgIGxldCBudW0xID0gMDtcbiAgICBsZXQgbnVtMiA9IDA7XG5cbiAgICB3aGlsZSAoKGxlbiAtIG51bTIpID49IDQpIHtcbiAgICAgIHRlbXAuX2RhdGFbbnVtMSsrXSA9IChcbiAgICAgICAgKChieXRlc1tudW0yXSAmIDB4ZmYpIHwgKChieXRlc1tudW0yICsgMV0gJiAweGZmKSA8PCA4KSkgfFxuICAgICAgICAoKGJ5dGVzW251bTIgKyAyXSAmIDB4ZmYpIDw8IDB4MTApXG4gICAgICApIHwgKChieXRlc1tudW0yICsgM10gJiAweGZmKSA8PCAweDE4KTtcblxuICAgICAgbnVtMiArPSA0O1xuICAgIH1cblxuICAgIGlmIChsZW4gLSBudW0yID09IDMpXG4gICAgICB0ZW1wLl9kYXRhW251bTFdID0gKGJ5dGVzW251bTIgKyAyXSAmIDB4ZmYpIDw8IDB4MTA7XG5cbiAgICBpZiAobGVuIC0gbnVtMiA9PSAyKVxuICAgICAgdGVtcC5fZGF0YVtudW0xXSB8PSAoYnl0ZXNbbnVtMiArIDFdICYgMHhmZikgPDwgODtcblxuICAgIGlmIChsZW4gLSBudW0yID09IDEpXG4gICAgICB0ZW1wLl9kYXRhW251bTFdIHw9IGJ5dGVzW251bTJdICYgMHhmZjtcblxuICAgIHRlbXAuX3ZlcnNpb24gPSAwO1xuICAgIHJldHVybiB0ZW1wO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5fbGVuZ3RofSBiaXRzLCAke3RoaXMuY291bnRCaXRzKHRydWUpfSBzZXRgO1xuICB9XG5cbiAgLy8vIFBlcmZvcm1zIGRlZXAgY29tcGFyaXNvbiBvZiB0d28gYml0c2V0cy5cbiAgZXF1YWxzKG90aGVyOiBCaXRBcnJheSk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzID09IG90aGVyKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAob3RoZXIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLl9sZW5ndGggIT0gb3RoZXIuX2xlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLl9sZW5ndGggPT0gMCkgcmV0dXJuIHRydWU7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2RhdGEubGVuZ3RoIC0gMTsgaSsrKVxuICAgICAgaWYgKHRoaXMuX2RhdGFbaV0gIT0gb3RoZXIuX2RhdGFbaV0pIHJldHVybiBmYWxzZTtcblxuICAgIGZvciAobGV0IGkgPSAodGhpcy5fZGF0YS5sZW5ndGggLSAxKSAqIDg7IGkgPCB0aGlzLl9sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuZ2V0Qml0KGkpICE9IG90aGVyLmdldEJpdChpKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBDbG9uZXMgYSBiaXRzZXQuICovXG4gIGNsb25lKCk6IEJpdEFycmF5IHtcbiAgICBjb25zdCBiaXRBcnJheSA9IG5ldyBCaXRBcnJheSgwLCBmYWxzZSk7XG4gICAgYml0QXJyYXkuX2RhdGEgPSBVaW50MzJBcnJheS5mcm9tKHRoaXMuX2RhdGEpOyAvLyBlZmZlY3RpdmUgbGVuZ3RoOiAobGVuZ3RoSW5JbnRzKVxuICAgIGJpdEFycmF5Ll9sZW5ndGggPSB0aGlzLl9sZW5ndGg7XG4gICAgYml0QXJyYXkuX3ZlcnNpb24gPSB0aGlzLl92ZXJzaW9uO1xuICAgIHJldHVybiBiaXRBcnJheTtcbiAgfVxuXG4gIC8qKiBJbml0aWFsaXplcyBhIGJpdHNldC4gKi9cbiAgaW5pdChmbGFnOiBGdW5jdGlvbiwgbm90aWZ5OiBib29sZWFuKTogQml0QXJyYXkge1xuICAgIHRoaXMuc2V0QWxsKGZhbHNlLCBmYWxzZSk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2xlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoZmxhZyhpKSlcbiAgICAgICAgdGhpcy5fZGF0YVtNYXRoLmZsb29yKGkgLyAweDIwKV0gfD0gMSA8PCAoKGkgJSAweDIwKSAmIDB4MWYpO1xuICAgIH1cblxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8vIEludmVydHMgYSBiaXRzZXQuXG4gIGludmVydChub3RpZnkgPSB0cnVlKTogdm9pZCB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9kYXRhLmxlbmd0aDsgaSsrKVxuICAgICAgdGhpcy5fZGF0YVtpXSBePSAtMTtcblxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xuICB9XG5cbiAgLy8vIFNldHMgYWxsIGJpdHMgdG8gW3ZhbHVlXSwgb3B0aW9uYWxseSBzdXBwcmVzc2luZyBub3RpZmljYXRpb25zLlxuICBzZXRBbGwodmFsdWU6IGJvb2xlYW4sIG5vdGlmeSA9IGZhbHNlKTogdm9pZCB7XG4gICAgY29uc3QgZmxhZ3MgPSB2YWx1ZSA/IC0xIDogMDtcbiAgICBjb25zdCBsZW4gPSB0aGlzLmxlbmd0aEluSW50cztcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIC8vdG9kbzogb3B0aW1pemVcbiAgICAgIHRoaXMuX2RhdGFbaV0gPSBmbGFncztcblxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xuICB9XG5cbiAgLy8vIFNldHMgYml0cyBhdCBbaW5kZXhlc10gcG9zaXRpb24gdG8gW3ZhbHVlXS5cbiAgLy8vIENsZWFycyB0aGUgYml0c2V0IGlmIFtjbGVhcl0gZmxhZyBpcyB0cnVlLlxuICAvLy8gQ2hhbmdlIG5vdGlmaWNhdGlvbiBpcyByYWlzZWQgd2hlbiBbbm90aWZ5XSBpcyB0cnVlLlxuICBzZXRJbmRleGVzKGluZGV4ZXM6IEFycmF5PG51bWJlcj4sIHZhbHVlID0gdHJ1ZSwgY2xlYXIgPSB0cnVlLCBub3RpZnkgPSB0cnVlKTogdm9pZCB7XG4gICAgaWYgKGNsZWFyKVxuICAgICAgdGhpcy5zZXRBbGwoIXZhbHVlLCBmYWxzZSk7XG5cbiAgICBmb3IgKGNvbnN0IGkgb2YgaW5kZXhlcylcbiAgICAgIHRoaXMuc2V0RmFzdChpLCB2YWx1ZSk7XG5cbiAgICB0aGlzLmluY3JlbWVudFZlcnNpb24obm90aWZ5KTtcbiAgfVxuXG4gIGV2ZXJ5SW5kZXgoaW5kZXhlczogQXJyYXk8bnVtYmVyPiwgdmFsdWUgPSB0cnVlKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBpbmRleCBvZiBpbmRleGVzKSB7XG4gICAgICBpZiAodGhpcy5nZXRCaXQoaW5kZXgpICE9IHZhbHVlKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgYW55SW5kZXgoaW5kZXhlczogQXJyYXk8bnVtYmVyPiwgdmFsdWUgPSB0cnVlKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBpbmRleCBvZiBpbmRleGVzKSB7XG4gICAgICBpZiAodGhpcy5nZXRCaXQoaW5kZXgpID09IHZhbHVlKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgc2V0V2hlcmUoY2hlY2s6IEZ1bmN0aW9uLCB2YWx1ZSA9IHRydWUsIGNsZWFyID0gdHJ1ZSwgbm90aWZ5ID0gdHJ1ZSwgYWxsb3dDbGVhciA9IHRydWUpOiB2b2lkIHtcbiAgICBpZiAoY2xlYXIgJiYgYWxsb3dDbGVhcilcbiAgICAgIHRoaXMuc2V0QWxsKCF2YWx1ZSwgZmFsc2UpO1xuXG4gICAgaWYgKGFsbG93Q2xlYXIpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGNoZWNrKGkpKVxuICAgICAgICAgIHRoaXMuc2V0RmFzdChpLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fbGVuZ3RoOyBpKyspXG4gICAgICAgIHRoaXMuc2V0RmFzdChpLCBjaGVjayhpKSA/IHZhbHVlIDogIXZhbHVlKTtcbiAgICB9XG5cbiAgICB0aGlzLmluY3JlbWVudFZlcnNpb24obm90aWZ5KTtcbiAgfVxuXG4gIGdldFJhbmdlKGZyb206IG51bWJlciwgdG86IG51bWJlcik6IEJpdEFycmF5IHtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UoZnJvbSwgMCwgdGhpcy5fbGVuZ3RoIC0gMSwgJ2Zyb20nKTtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UodG8sIDAsIHRoaXMuX2xlbmd0aCwgJ3RvJyk7XG4gICAgY29uc3QgYXJyOiBBcnJheTxib29sZWFuPiA9IFtdO1xuICAgIGZvciAobGV0IGkgPSBmcm9tOyBpIDwgdG87ICsraSlcbiAgICAgIGFyci5wdXNoKHRoaXMuZ2V0Qml0KGkpKTtcbiAgICByZXR1cm4gQml0QXJyYXkuZnJvbVZhbHVlcyhhcnIpO1xuICB9XG5cbiAgZ2V0UmFuZ2VBc0xpc3QoZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyKTogYm9vbGVhbltdIHtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UoZnJvbSwgMCwgdGhpcy5fbGVuZ3RoIC0gMSwgJ2Zyb20nKTtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UodG8sIDAsIHRoaXMuX2xlbmd0aCwgJ3RvJyk7XG4gICAgY29uc3QgYXJyOiBib29sZWFuW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gZnJvbTsgaSA8IHRvOyArK2kpXG4gICAgICBhcnIucHVzaCh0aGlzLmdldEJpdChpKSk7XG4gICAgcmV0dXJuIGFycjtcbiAgfVxuXG5cbiAgc2V0UmFuZ2UoZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyLCB2YWx1ZTogYm9vbGVhbiwgbm90aWZ5ID0gdHJ1ZSk6IEJpdEFycmF5IHtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UoZnJvbSwgMCwgdGhpcy5fbGVuZ3RoIC0gMSwgJ2Zyb20nKTtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UodG8sIDAsIHRoaXMuX2xlbmd0aCAtIDEsICd0bycpO1xuXG4gICAgY29uc3Qgc3RhcnQgPSBNYXRoLm1pbihmcm9tLCB0byk7XG4gICAgY29uc3QgZW5kID0gTWF0aC5tYXgoZnJvbSwgdG8pO1xuXG4gICAgLy90b2RvOiBvcHRpbWl6ZVxuICAgIGlmICh2YWx1ZSkge1xuICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSsrKVxuICAgICAgICB0aGlzLnNldFRydWUoaSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKylcbiAgICAgICAgdGhpcy5zZXRGYWxzZShpKTtcbiAgICB9XG5cbiAgICB0aGlzLmluY3JlbWVudFZlcnNpb24obm90aWZ5KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vLyBTZXRzIG4gcmFuZG9tbHkgY2hvc2VuIGJpdHMgdG8gdmFsdWUsIHJlbWFpbmluZyBiaXRzIHRvICF2YWx1ZS5cbiAgc2V0UmFuZG9tKG46IG51bWJlciwgdmFsdWU6IGJvb2xlYW4sIG5vdGlmeSA9IHRydWUpOiB2b2lkIHtcbiAgICBpZiAobiA8IDAgfHwgbiA+IHRoaXMuX2xlbmd0aClcbiAgICAgIHRocm93IG5ldyBFcnJvcignbiBtdXN0IGJlID49IDAgJiYgPD0gQ291bnQnKTtcblxuICAgIGlmIChuID4gdGhpcy5fbGVuZ3RoIC8gMilcbiAgICAgIHRoaXMuc2V0UmFuZG9tKHRoaXMuX2xlbmd0aCAtIG4sICF2YWx1ZSk7XG5cbiAgICB0aGlzLnNldEFsbCghdmFsdWUpO1xuXG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCBuOykge1xuICAgICAgY29uc3QgaSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHRoaXMuX2xlbmd0aCk7XG4gICAgICBpZiAodGhpcy5nZXRCaXQoaSkgPT0gdmFsdWUpIGNvbnRpbnVlO1xuICAgICAgdGhpcy5zZXRGYXN0KGksIHZhbHVlKTtcbiAgICAgIGsrKztcbiAgICB9XG5cbiAgICB0aGlzLmluY3JlbWVudFZlcnNpb24obm90aWZ5KTtcbiAgfVxuXG4gIC8vLyBNb2RpZmllcyBjdXJyZW50IGJpdHNldCBieSBwZXJmb3JtaW5nIHRoZSBiaXR3aXNlIEFORCBvcGVyYXRpb24gYWdhaW5zdCB0aGVcbiAgLy8vIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBiaXRzZXQuXG4gIGFuZCh2YWx1ZTogQml0QXJyYXksIG5vdGlmeSA9IHRydWUpOiBCaXRBcnJheSB7XG4gICAgaWYgKHRoaXMuX2xlbmd0aCAhPSB2YWx1ZS5fbGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcnJheSBsZW5ndGhzIGRpZmZlci4nKTtcblxuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLmxlbmd0aEluSW50czsgaSA8IGxlbjsgaSsrKVxuICAgICAgdGhpcy5fZGF0YVtpXSAmPSB2YWx1ZS5fZGF0YVtpXTtcblxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8vIFBlcmZvcm1zIHRoZSBiaXR3aXNlIEFORCBOT1Qgb3BlcmF0aW9uIG9uIHRoZSBlbGVtZW50cyBpbiB0aGUgY3VycmVudCBiaXRzZXRcbiAgLy8vIGFnYWluc3QgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBiaXRzZXQuXG4gIGFuZE5vdCh2YWx1ZTogQml0QXJyYXksIG5vdGlmeSA9IHRydWUpOiBCaXRBcnJheSB7XG4gICAgaWYgKHRoaXMuX2xlbmd0aCAhPSB2YWx1ZS5fbGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcnJheSBsZW5ndGhzIGRpZmZlci4nKTtcblxuICAgIGNvbnN0IGxlbiA9IHRoaXMubGVuZ3RoSW5JbnRzO1xuICAgIGZvciAobGV0IG51bTIgPSAwOyBudW0yIDwgbGVuOyBudW0yKyspXG4gICAgICB0aGlzLl9kYXRhW251bTJdICY9IH52YWx1ZS5fZGF0YVtudW0yXTtcblxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8vIFBlcmZvcm1zIHRoZSBiaXR3aXNlIE5PVCBBTkQgb3BlcmF0aW9uIG9uIHRoZSBlbGVtZW50cyBpbiB0aGUgY3VycmVudCBiaXRzZXRcbiAgLy8vIGFnYWluc3QgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBiaXRzZXQuXG4gIG5vdEFuZCh2YWx1ZTogQml0QXJyYXksIG5vdGlmeSA9IHRydWUpOiBCaXRBcnJheSB7XG4gICAgaWYgKHRoaXMuX2xlbmd0aCAhPSB2YWx1ZS5fbGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcnJheSBsZW5ndGhzIGRpZmZlci4nKTtcblxuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLmxlbmd0aEluSW50czsgaSA8IGxlbjsgaSsrKVxuICAgICAgdGhpcy5fZGF0YVtpXSA9ICh+dGhpcy5fZGF0YVtpXSkgJiB2YWx1ZS5fZGF0YVtpXTtcblxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8vIEludmVydHMgYWxsIGJpdCB2YWx1ZXMgaW4gdGhlIGN1cnJlbnQgYml0c2V0XG4gIG5vdChub3RpZnkgPSB0cnVlKTogQml0QXJyYXkge1xuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLmxlbmd0aEluSW50czsgaSA8IGxlbjsgaSsrKVxuICAgICAgdGhpcy5fZGF0YVtpXSA9IH50aGlzLl9kYXRhW2ldO1xuXG4gICAgdGhpcy5pbmNyZW1lbnRWZXJzaW9uKG5vdGlmeSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLy8gUGVyZm9ybXMgdGhlIGJpdHdpc2UgT1Igb3BlcmF0aW9uIG9uIHRoZSBlbGVtZW50cyBpbiB0aGUgY3VycmVudCBiaXRzZXRcbiAgLy8vIGFnYWluc3QgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBiaXRzZXQuXG4gIG9yKHZhbHVlOiBCaXRBcnJheSwgbm90aWZ5ID0gdHJ1ZSkge1xuICAgIGlmICh0aGlzLl9sZW5ndGggIT0gdmFsdWUuX2xlbmd0aClcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXJyYXkgbGVuZ3RocyBkaWZmZXIuJyk7XG5cbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gdGhpcy5sZW5ndGhJbkludHM7IGkgPCBsZW47IGkrKylcbiAgICAgIHRoaXMuX2RhdGFbaV0gfD0gdmFsdWUuX2RhdGFbaV07XG5cbiAgICB0aGlzLmluY3JlbWVudFZlcnNpb24obm90aWZ5KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vLyBQZXJmb3JtcyB0aGUgYml0d2lzZSBleGNsdXNpdmUgT1Igb3BlcmF0aW9uIG9uIHRoZSBlbGVtZW50cyBpbiB0aGUgY3VycmVudCBiaXRzZXRcbiAgLy8vIGFnYWluc3QgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBiaXRzZXQuXG4gIHhvcih2YWx1ZTogQml0QXJyYXksIG5vdGlmeSA9IHRydWUpIHtcbiAgICBpZiAodGhpcy5fbGVuZ3RoICE9IHZhbHVlLl9sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FycmF5IGxlbmd0aHMgZGlmZmVyLicpO1xuXG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHRoaXMubGVuZ3RoSW5JbnRzOyBpIDwgbGVuOyBpKyspXG4gICAgICB0aGlzLl9kYXRhW2ldIF49IHZhbHVlLl9kYXRhW2ldO1xuXG4gICAgdGhpcy5pbmNyZW1lbnRWZXJzaW9uKG5vdGlmeSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLy8gSW5zZXJ0cyBuIDAtYml0cyBhdCBwb3NpdGlvbiBwb3MsIHJlc2l6aW5nIHNlbGYgYW5kIHNoaWZ0aW5nIGJpdHMgYXBwcm9wcmlhdGVseS5cbiAgaW5zZXJ0QXQocG9zOiBudW1iZXIsIG46IG51bWJlciwgZmxhZyA9IGZhbHNlKTogdm9pZCB7XG4gICAgdGhpcy5hc3N1cmVJblJhbmdlKHBvcywgMCwgdGhpcy5fbGVuZ3RoLCAncG9zJyk7XG5cbiAgICBpZiAobiA9PSAwKSByZXR1cm47XG5cbiAgICAvL1RPRE86IG9wdGltaXplXG4gICAgLy90aGUgbW9zdCBwcmltaXRpdmUgaW1wbGVtZW50YXRpb24sIG9wdGltaXplIGl0IGxhdGVyIVxuXG4gICAgLy8gYmVnaW5VcGRhdGUoKTtcbiAgICBjb25zdCBvbGRsZW5ndGggPSB0aGlzLl9sZW5ndGg7XG4gICAgdGhpcy5zZXRMZW5ndGgodGhpcy5fbGVuZ3RoICsgbik7XG5cbiAgICAvL2lmICghY29udGFpbnMoIWZsYWcpKSByZXR1cm47IC8vIG5vdGhpbmcgdG8gZG9cblxuICAgIGZvciAobGV0IGkgPSBvbGRsZW5ndGggLSAxOyBpID49IHBvczsgaS0tKVxuICAgICAgdGhpcy5zZXRCaXQoaSArIG4sIHRoaXMuZ2V0Qml0KGkpKTtcblxuICAgIGZvciAobGV0IGkgPSBwb3M7IGkgPCBwb3MgKyBuOyBpKyspXG4gICAgICB0aGlzLnNldEJpdChpLCBmbGFnKTtcblxuICAgIC8vIGVuZFVwZGF0ZSgpO1xuICB9XG5cbiAgLy8vIERlbGV0ZXMgbiBiaXRzIGJlZ2lubmluZyBhdCBwb3NpdGlvbiBwb3MsIHJlc2l6aW5nIHNlbGYgYW5kIHNoaWZ0aW5nIHJlbWFpbmluZ1xuICAvLy8gYml0cyBhcHByb3ByaWF0ZWx5LlxuICByZW1vdmVBdChwb3M6IG51bWJlciwgbiA9IDEpOiB2b2lkIHtcbiAgICAvLyB0aGUgbW9zdCBwcmltaXRpdmUgaW1wbGVtZW50YXRpb24sIG9wdGltaXplIGl0IGxhdGVyIVxuICAgIGlmIChuIDwgMClcbiAgICAgIHRocm93IG5ldyBFcnJvcignbiBjYW5ub3QgYmUgbmVnYXRpdmUnKTtcblxuICAgIHRoaXMuYXNzdXJlSW5SYW5nZShwb3MsIDAsIHRoaXMuX2xlbmd0aCAtIG4sICdwb3MnKTtcblxuICAgIGlmICh0aGlzLmNvbnRhaW5zKHRydWUpKSB7XG4gICAgICBmb3IgKGxldCBpID0gcG9zOyBpIDwgdGhpcy5fbGVuZ3RoIC0gbjsgaSsrKVxuICAgICAgICB0aGlzLnNldEJpdChpLCB0aGlzLmdldEJpdChpICsgbikpO1xuICAgIH1cblxuICAgIHRoaXMuc2V0TGVuZ3RoKHRoaXMuX2xlbmd0aCAtIG4pO1xuICB9XG5cbiAgcmVtb3ZlQnlNYXNrKG1hc2s6IEJpdEFycmF5LCBmbGFnID0gdHJ1ZSk6IEJpdEFycmF5IHtcbiAgICBpZiAodGhpcy5fbGVuZ3RoICE9IG1hc2subGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdsZW5ndGggIT0gbWFzay5sZW5ndGgnKTtcblxuICAgIGlmIChtYXNrID09IHRoaXMpIHsgLy8gbm8gbmVlZCB0byBpdGVyYXRlXG4gICAgICB0aGlzLnNldExlbmd0aChtYXNrLmNvdW50Qml0cyghZmxhZykpO1xuICAgICAgdGhpcy5zZXRBbGwoIWZsYWcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgZHN0SWR4ID0gMDtcblxuICAgICAgZm9yIChsZXQgc3JjSWR4ID0gLTE7IChzcmNJZHggPSBtYXNrLmZpbmROZXh0KHNyY0lkeCwgIWZsYWcpKSAhPSAtMTspXG4gICAgICAgIHRoaXMuc2V0RmFzdChkc3RJZHgrKywgdGhpcy5nZXRCaXQoc3JjSWR4KSk7XG5cbiAgICAgIHRoaXMuX2xlbmd0aCA9IGRzdElkeDtcbiAgICAgIHRoaXMuX3ZlcnNpb24rKztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vLyBTaW1pbGFyIHRvIHRoZSBbXSBvcGVyYXRvci5cbiAgZ2V0Qml0KHBvczogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLl9kYXRhW01hdGguZmxvb3IocG9zIC8gMHgyMCldICYgKDEgPDwgKHBvcyAmIDB4MWYpKSkgIT0gMDtcbiAgfVxuXG4gIC8vLyBTaW1pbGFyIHRvIHRoZSBbXSBvcGVyYXRvci5cbiAgc2V0Qml0KHBvczogbnVtYmVyLCBiaXQ6IGJvb2xlYW4sIG5vdGlmeSA9IHRydWUpIHtcbiAgICB0aGlzLnNldEZhc3QocG9zLCBiaXQpO1xuICAgIGlmIChub3RpZnkpXG4gICAgICB0aGlzLl92ZXJzaW9uKys7XG4gICAgZWxzZVxuICAgICAgdGhpcy5fdmVyc2lvbisrO1xuICB9XG5cbiAgLy8vIFNldHMgW2ldLXRoIGJpdCB0byBbdmFsdWVdLCBkb2VzIG5vdCBjaGVjayBib3VuZHMsIGRvZXMgbm90IGluY3JlbWVudCB2ZXJzaW9uXG4gIHNldEZhc3QoaTogbnVtYmVyLCB2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh2YWx1ZSlcbiAgICAgIHRoaXMuX2RhdGFbTWF0aC5mbG9vcihpIC8gMHgyMCldIHw9IDEgPDwgKGkgJiAweDFmKTtcbiAgICBlbHNlXG4gICAgICB0aGlzLl9kYXRhW01hdGguZmxvb3IoaSAvIDB4MjApXSAmPSB+KDEgPDwgKGkgJiAweDFmKSk7XG4gIH1cblxuICBzZXRUcnVlKHBvczogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fZGF0YVtNYXRoLmZsb29yKHBvcyAvIDB4MjApXSB8PSAxIDw8IChwb3MgJiAweDFmKTtcbiAgfVxuXG4gIHNldEZhbHNlKHBvczogbnVtYmVyKSB7XG4gICAgdGhpcy5fZGF0YVtNYXRoLmZsb29yKHBvcyAvIDB4MjApXSAmPSB+KDEgPDwgKHBvcyAmIDB4MWYpKTtcbiAgfVxuXG4gIHRydWVDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNvdW50Qml0cyh0cnVlKTtcbiAgfVxuXG4gIGZhbHNlQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jb3VudEJpdHMoZmFsc2UpO1xuICB9XG5cbiAgLy8vIENvdW50cyBiaXRzIG9mIHRoZSBzcGVjaWZpZWQgdmFsdWUuXG4gIGNvdW50Qml0cyh2YWx1ZTogYm9vbGVhbik6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuX2xlbmd0aCA9PSAwKSByZXR1cm4gMDtcblxuICAgIGlmICh0aGlzLl9zZWxlY3RlZENvdW50VmVyc2lvbiAhPSB0aGlzLl92ZXJzaW9uKSB7XG4gICAgICB0aGlzLl9zZWxlY3RlZENvdW50ID0gMDtcbiAgICAgIGNvbnN0IGxlbiA9IHRoaXMubGVuZ3RoSW5JbnRzO1xuICAgICAgbGV0IGkgPSAwO1xuICAgICAgZm9yICg7IGkgPCBsZW4gLSAxOyBpKyspIHtcbiAgICAgICAgZm9yIChsZXQgayA9IHRoaXMuX2RhdGFbaV07IGsgIT0gMDsgayA+Pj49IDgpIHsgLy90b2RvOiBjYXN0IGRhdGFbaV0gdG8gdWludFxuICAgICAgICAgIHRoaXMuX3NlbGVjdGVkQ291bnQgKz0gQml0QXJyYXkuX29uQml0Q291bnRbayAmIDB4ZmZdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBsYXN0IGludC5cbiAgICAgIGxldCBrID0gdGhpcy5fZGF0YVtpXTtcbiAgICAgIGNvbnN0IHJlbWFpbmluZ0JpdHMgPSB0aGlzLl9sZW5ndGggJiAweDFmO1xuICAgICAgaWYgKHJlbWFpbmluZ0JpdHMgIT0gMCkgLyogaWYgcmVtYWluaW5nQml0cyA9PSAwLCB0aGUgbGFzdCBpbnQgaXMgZnVsbHkgdXNlZCBhbmQgQUxMIGJpdHMgc2hvdWxkIGJlIGxlZnQgYXMgaXMgKi9cbiAgICAgICAgayAmPSB+KCg0Mjk0OTY3Mjk1KSA8PCByZW1haW5pbmdCaXRzKTtcblxuICAgICAgZm9yICg7IGsgIT0gMDsgayA+Pj49IDgpXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkQ291bnQgKz0gQml0QXJyYXkuX29uQml0Q291bnRbayAmIDB4ZmZdO1xuXG4gICAgICB0aGlzLl9zZWxlY3RlZENvdW50VmVyc2lvbiA9IHRoaXMuX3ZlcnNpb247XG4gICAgfVxuXG4gICAgcmV0dXJuICh2YWx1ZSA/IHRoaXMuX3NlbGVjdGVkQ291bnQgOiB0aGlzLl9sZW5ndGggLSB0aGlzLl9zZWxlY3RlZENvdW50KTtcbiAgfVxuXG4gIC8vLyBSZXR1cm5zIGEgbnVtYmVyIG9mIHNldCBiaXRzIHdoZXJlIGFsc28gW2NoZWNrXSBpcyB0cnVlXG4gIGNvdW50V2hlcmUoY2hlY2s6IEZ1bmN0aW9uKTogbnVtYmVyIHtcbiAgICBsZXQgcmVzdWx0ID0gMDtcbiAgICBpZiAodGhpcy50cnVlQ291bnQoKSA9PSB0aGlzLl9sZW5ndGgpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fbGVuZ3RoOyBpKyspXG4gICAgICAgIHJlc3VsdCArPSBjaGVjayhpKSA/IDEgOiAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBpID0gLTE7IChpID0gdGhpcy5maW5kTmV4dChpLCB0cnVlKSkgIT0gLTE7KVxuICAgICAgICByZXN1bHQgKz0gY2hlY2soaSkgPyAxIDogMDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vLyBQZXJmb3JtcyBiaXQgXCJhbmRcIiBhbmQgY291bnRzIGJpdHMgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZSwgd2l0aG91dCBiaXRzZXQgbW9kaWZpY2F0aW9uLlxuICBhbmRXaXRoQ291bnRCaXRzKHNlY29uZDogQml0QXJyYXksIHZhbHVlOiBib29sZWFuKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5fbGVuZ3RoID09IDApIHJldHVybiAwO1xuXG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICBjb25zdCBsZW4gPSB0aGlzLmxlbmd0aEluSW50cztcbiAgICBsZXQgaSA9IDA7XG4gICAgZm9yICg7IGkgPCBsZW4gLSAxOyBpKyspIHtcbiAgICAgIGZvciAobGV0IGsgPSB0aGlzLl9kYXRhW2ldICYgc2Vjb25kLl9kYXRhW2ldOyBrICE9IDA7IGsgPj4+PSA4KVxuICAgICAgICBjb3VudCArPSBCaXRBcnJheS5fb25CaXRDb3VudFtrICYgMHhmZl07XG4gICAgfVxuXG4gICAgLy8gVGhlIGxhc3QgaW50LlxuICAgIGxldCBrID0gdGhpcy5fZGF0YVtpXSAmIHNlY29uZC5fZGF0YVtpXTtcbiAgICBjb25zdCByZW1haW5pbmdCaXRzID0gdGhpcy5fbGVuZ3RoICYgMHgxZjtcbiAgICBpZiAocmVtYWluaW5nQml0cyAhPSAwKVxuICAgICAgayAmPSB+KCg0Mjk0OTY3Mjk1KSA8PCByZW1haW5pbmdCaXRzKTtcbiAgICBmb3IgKDsgayAhPSAwOyBrID4+Pj0gOClcbiAgICAgIGNvdW50ICs9IEJpdEFycmF5Ll9vbkJpdENvdW50W2sgJiAweGZmXTtcblxuICAgIHJldHVybiAodmFsdWUgPyBjb3VudCA6IHRoaXMuX2xlbmd0aCAtIGNvdW50KTtcbiAgfVxuXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0TGVuZ3RoKDApO1xuICB9XG5cbiAgY29udGFpbnModmFsdWU6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5maW5kTmV4dCgtMSwgdmFsdWUpID49IDA7XG4gIH1cblxuICBnZXQgYWxsVHJ1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jb3VudEJpdHModHJ1ZSkgPT0gdGhpcy5fbGVuZ3RoO1xuICB9XG5cbiAgZ2V0IGFsbEZhbHNlKCkge1xuICAgIHJldHVybiB0aGlzLmNvdW50Qml0cyhmYWxzZSkgPT0gdGhpcy5fbGVuZ3RoO1xuICB9XG5cbiAgZ2V0IGFueVRydWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuY291bnRCaXRzKHRydWUpID4gMDtcbiAgfVxuXG4gIGdldCBhbnlGYWxzZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jb3VudEJpdHMoZmFsc2UpID4gMDtcbiAgfVxuXG4gIC8vLyBSZXR1cm5zIHRoZSBwb3NpdGlvbiBvZiB0aGUgbmV4dCBiaXQgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZSwgc3RhcnRpbmcgZnJvbSB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLlxuICAvLy8gUmV0dXJucyAtMSwgaWYgdGhlcmUgYXJlIG5vIHN1Y2ggYml0cy5cbiAgZmluZE5leHQoaW5kZXg6IG51bWJlciwgdmFsdWUgPSB0cnVlKTogbnVtYmVyIHtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UoaW5kZXgsIC0xLCB0aGlzLl9sZW5ndGgsICdpbmRleCcpO1xuXG4gICAgaWYgKGluZGV4ID49IHRoaXMuX2xlbmd0aCAtIDEpIHJldHVybiAtMTtcbiAgICBpbmRleCA9IGluZGV4IDwgMCA/IDAgOiBpbmRleCArIDE7IC8vIHNraXAgc3RhcnRcbiAgICBsZXQgdW51c2VkQml0cyA9IGluZGV4ICYgMHgxZjtcbiAgICBjb25zdCBudW1JbnRzID0gdGhpcy5sZW5ndGhJbkludHM7XG5cbiAgICBmb3IgKGxldCBpID0gTWF0aC5mbG9vcihpbmRleCAvIDMyKTsgaSA8IG51bUludHM7IGkrKykge1xuICAgICAgbGV0IGsgPSAodmFsdWUgPyB0aGlzLl9kYXRhW2ldIDogfnRoaXMuX2RhdGFbaV0pOyAvLyB1aW50IGNhc3RcbiAgICAgIGlmICh1bnVzZWRCaXRzICE9IDApIHtcbiAgICAgICAgayAmPSAoKDB4ZmZmZmZmZmYgPDwgdW51c2VkQml0cykgJiAweGZmZmZmZmZmKTtcbiAgICAgICAgdW51c2VkQml0cyA9IDA7XG4gICAgICB9IGVsc2UgaWYgKCF2YWx1ZSAmJiBrID09IC00Mjk0OTY3Mjk2KSAvKiBsb29raW5nIGZvciBmYWxzZSwgYWxsIGJpdHMgYXJlIHNldCAqL3tcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGZvciAobGV0IGogPSAwOyBrICE9IDA7IGogKz0gOCwgayA+Pj49IDgpIHtcbiAgICAgICAgY29uc3QgcCA9IEJpdEFycmF5Ll9maXJzdE9uQml0W2sgJiAweGZmXTtcbiAgICAgICAgaWYgKHAgPj0gMCkge1xuICAgICAgICAgIGluZGV4ID0gcCArIChpICogMzIpICsgajtcbiAgICAgICAgICBpZiAoaW5kZXggPj0gdGhpcy5fbGVuZ3RoKSByZXR1cm4gLTE7XG4gICAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8vLyBGaW5kcyBwcmV2aW91cyBiaXQgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZSBpbiB0aGUgYml0c2V0LlxuICBmaW5kUHJldihpbmRleDogbnVtYmVyLCB2YWx1ZSA9IHRydWUpOiBudW1iZXIge1xuICAgIGlmIChpbmRleCA9PSAwKSByZXR1cm4gLTE7XG4gICAgdGhpcy5hc3N1cmVJblJhbmdlKGluZGV4LCAtMSwgdGhpcy5fbGVuZ3RoLCAnaW5kZXgnKTtcblxuICAgIGluZGV4ID0gaW5kZXggPCAwID8gdGhpcy5fbGVuZ3RoIC0gMSA6IGluZGV4IC0gMTsgLy8gc2tpcCBzdGFydFxuXG4gICAgY29uc3QgbGFzdEludElkeCA9IE1hdGguZmxvb3IoaW5kZXggLyAweDIwKTtcbiAgICBsZXQgcmVtYWluaW5nQml0cyA9IChpbmRleCArIDEpICYgMHgxZjtcblxuICAgIGZvciAobGV0IGkgPSBsYXN0SW50SWR4OyBpID49IDA7IGktLSkge1xuICAgICAgbGV0IGsgPSAodmFsdWUgPyB0aGlzLl9kYXRhW2ldIDogfnRoaXMuX2RhdGFbaV0pOyAvLyBjYXN0XG4gICAgICBpZiAocmVtYWluaW5nQml0cyAhPSAwKSB7XG4gICAgICAgIGsgJj0gfigoNDI5NDk2NzI5NSkgPDwgcmVtYWluaW5nQml0cyk7XG4gICAgICAgIHJlbWFpbmluZ0JpdHMgPSAwO1xuICAgICAgfVxuICAgICAgZm9yIChsZXQgaiA9IDI0OyBrICE9IDA7IGogLT0gOCwgayA8PD0gOCkge1xuICAgICAgICBjb25zdCBwID0gQml0QXJyYXkuX2xhc3RPbkJpdFtrID4+PiAweDE4XTtcbiAgICAgICAgaWYgKHAgPj0gMClcbiAgICAgICAgICByZXR1cm4gcCArIChpICogMzIpICsgajtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG59XG4iXX0=","/* eslint-disable max-len */\nimport * as umj from 'umap-js';\nimport { TSNE } from '@keckelt/tsne';\nimport { Vector, } from '@datagrok-libraries/utils/src/type-declarations';\nimport { transposeMatrix, assert, } from '@datagrok-libraries/utils/src/vector-operations';\nimport { SPEBase, PSPEBase, OriginalSPE } from './spe';\nimport { Measure, AvailableMetrics, isBitArrayMetric } from './typed-metrics/typed-metrics';\nimport BitArray from '@datagrok-libraries/utils/src/bit-array';\nimport { DistanceMatrix, DistanceMatrixService, distanceMatrixProxy, dmLinearIndex } from './distance-matrix';\nexport var DimReductionMethods;\n(function (DimReductionMethods) {\n DimReductionMethods[\"UMAP\"] = \"UMAP\";\n DimReductionMethods[\"T_SNE\"] = \"t-SNE\";\n})(DimReductionMethods || (DimReductionMethods = {}));\n/** Umap uses precalculated distance matrix to save time. though for too much data, memory becomes constraint.\n * if we have 100 000 rows, distance matrix will take ~10gb of memory and probably overflow.\n */\nexport const MAX_DISTANCE_MATRIX_ROWS = 20000;\nexport class UMAPOptions {\n constructor() {\n this.learningRate = { uiName: 'Learinig rate', value: 1, tooltip: 'The initial learning rate for the embedding optimization' };\n this.nComponents = { uiName: 'Components', value: 2, tooltip: 'The number of components (dimensions) to project the data to' };\n this.nEpochs = { uiName: 'Epochs', value: 0, tooltip: 'The number of epochs to optimize embeddings via SGD. Computed automatically if set to 0' };\n this.nNeighbors = { uiName: 'Neighbors', value: 15, tooltip: 'The number of nearest neighbors to construct the fuzzy manifold' };\n this.spread = { uiName: 'Spread', value: 1, tooltip: 'The effective scale of embedded points, used with min distance to control the clumped/dispersed nature of the embedding' };\n this.minDist = { uiName: 'Min distance', value: 0.1, tooltip: 'The effective minimum distance between embedded points, used with spread to control the clumped/dispersed nature of the embedding' };\n }\n ;\n}\nexport class TSNEOptions {\n constructor() {\n this.epsilon = { uiName: 'Epsilon', value: 10, tooltip: 'Epsilon is learning rate' };\n this.perplexity = { uiName: 'Perplexity', value: 30, tooltip: 'Roughly how many neighbors each point influences' };\n this.dim = { uiName: 'Dimensionality', value: 2, tooltip: 'Dimensionality of the embedding' };\n }\n ;\n}\n/** Abstract dimensionality reducer */\nclass Reducer {\n constructor(options) {\n this.data = options.data;\n }\n}\n/** t-SNE dimensionality reduction. */\nclass TSNEReducer extends Reducer {\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 this.reducer = new TSNE(options);\n this.iterations = options?.iterations ?? 100;\n this.distanceFname = options.distanceFname;\n this.distanceFn = options.distanceFn;\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(parallelDistanceWorkers) {\n const distance = parallelDistanceWorkers ? await (async () => {\n const matrixService = new DistanceMatrixService(true, false);\n try {\n const dist = await matrixService.calc(this.data, this.distanceFname);\n matrixService.terminate();\n return dist;\n }\n catch (e) {\n matrixService.terminate();\n throw e;\n }\n })() :\n (() => { const ret = DistanceMatrix.calc(this.data, (a, b) => this.distanceFn(a, b)); ret.normalize(); return ret.data; })();\n const matrixProxy = distanceMatrixProxy(distance, this.data.length);\n this.reducer.initDataDist(matrixProxy);\n for (let i = 0; i < this.iterations; ++i)\n this.reducer.step(); // every time you call this, solution gets better\n return { distance: distance, embedding: this.reducer.getSolution() };\n }\n}\n/**\n * Implements UMAP dimensionality reduction.\n *\n * @class UMAPReducer\n * @extends {Reducer}\n */\nclass UMAPReducer extends Reducer {\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 super(options);\n assert('distanceFname' in options);\n assert('distanceFn' in options);\n this.distanceFn = options.distanceFn;\n this.distanceFname = options.distanceFname;\n this.dmIndexFunc = dmLinearIndex(this.data.length);\n //Umap uses vector indexing, so we need to create an array of vectors as indeces.\n this.vectors = new Array(this.data.length).fill(0).map((_, i) => [i]);\n this.usingDistanceMatrix = !(!options.preCalculateDistanceMatrix && this.data.length > MAX_DISTANCE_MATRIX_ROWS);\n if (!this.usingDistanceMatrix)\n options.distanceFn = this._encodedDistance.bind(this);\n else\n options.distanceFn = this._encodedDistanceMatrix.bind(this);\n if (this.data.length < 15)\n options.nNeighbors = this.data.length - 1;\n this.reducer = new umj.UMAP(options);\n // this.reducer.distanceFn = this._encodedDistance.bind(this);\n }\n /**\n * Custom distance wrapper to have numeric inputs instead of string ones.\n *\n * @protected\n * @param {number[]} a The first item.\n * @param {number[]} b The first item.\n * @return {number} Distance metric.\n * @memberof UMAPReducer\n */\n _encodedDistanceMatrix(a, b) {\n if (a[0] === b[0])\n return 0;\n if (a[0] > b[0])\n return this.distanceMatrix[this.dmIndexFunc(b[0], a[0])];\n return this.distanceMatrix[this.dmIndexFunc(a[0], b[0])];\n }\n _encodedDistance(a, b) {\n return this.distanceFn(this.data[a[0]], this.data[b[0]]);\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 if (this.usingDistanceMatrix) {\n this.distanceMatrix = parallelDistanceWorkers ? await (async () => {\n const matrixService = new DistanceMatrixService(true, false);\n try {\n const dist = await matrixService.calc(this.data, this.distanceFname);\n matrixService.terminate();\n return dist;\n }\n catch (e) {\n matrixService.terminate();\n throw e;\n }\n })() :\n (() => { const ret = DistanceMatrix.calc(this.data, (a, b) => this.distanceFn(a, b)); return ret.data; })();\n }\n const embedding = this.reducer.fit(this.vectors);\n function arrayCast2Coordinates(data) {\n return new Array(data.length).fill(0).map((_, i) => (Vector.from(data[i])));\n }\n return { embedding: arrayCast2Coordinates(embedding), ...(this.distanceMatrix ? { distance: this.distanceMatrix } : {}) };\n }\n}\n/**\n * Implements original SPE dimensionality reduction.\n *\n * @class SPEReducer\n * @extends {Reducer}\n */\nclass SPEReducer extends Reducer {\n /**\n * Creates an instance of SPEReducer.\n * @param {Options} options Options to pass to the constructor.\n * @memberof SPEReducer\n */\n constructor(options) {\n super(options);\n this.reducer = new SPEBase(options);\n }\n /**\n * Embeds the data given into the two-dimensional space using the original SPE method.\n * @return {any} Cartesian coordinate of this embedding and distance matrix where applicable.\n */\n async transform() {\n const emb = await this.reducer.embed(this.data);\n return { distance: this.reducer.distance, embedding: emb };\n }\n}\n/**\n * Implements modified SPE dimensionality reduction.\n *\n * @class PSPEReducer\n * @extends {Reducer}\n */\nclass PSPEReducer extends Reducer {\n /**\n * Creates an instance of PSPEReducer.\n * @param {Options} options Options to pass to the constructor.\n * @memberof PSPEReducer\n */\n constructor(options) {\n super(options);\n this.reducer = new PSPEBase(options);\n }\n /**\n * Embeds the data given into the two-dimensional space using the modified SPE method.\n * @return {any} Cartesian coordinate of this embedding and distance matrix where applicable.\n */\n async transform() {\n const emb = await this.reducer.embed(this.data);\n return { distance: this.reducer.distance, embedding: emb };\n }\n}\n/**\n * Implements original SPE dimensionality reduction.\n *\n * @class OriginalSPEReducer\n * @extends {Reducer}\n */\nclass OriginalSPEReducer extends Reducer {\n /**\n * Creates an instance of OriginalSPEReducer.\n * @param {Options} options Options to pass to the constructor.\n * @memberof OriginalSPEReducer\n */\n constructor(options) {\n super(options);\n this.reducer = new OriginalSPE(options);\n }\n /**\n * Embeds the data given into the two-dimensional space using the original SPE method.\n * @return {any} Cartesian coordinate of this embedding and distance matrix where applicable.\n */\n async transform() {\n const emb = await this.reducer.embed(this.data);\n return { distance: this.reducer.distance, embedding: emb };\n }\n}\nconst AvailableReducers = {\n 'UMAP': UMAPReducer,\n 't-SNE': TSNEReducer,\n 'SPE': SPEReducer,\n 'pSPE': PSPEReducer,\n 'OriginalSPE': OriginalSPEReducer,\n};\n/**\n * Unified class implementing different dimensionality reduction methods.\n *\n * @export\n * @class DimensionalityReducer\n */\nexport class DimensionalityReducer {\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, metric, options) {\n const measure = new Measure(metric).getMeasure();\n let specOptions = {};\n if (isBitArrayMetric(metric)) {\n for (let i = 0; i < data.length; ++i)\n data[i] = new BitArray(data[i]._data, data[i]._length);\n }\n if (method == 'UMAP') {\n specOptions = {\n ...{ data: data },\n ...{ distanceFn: measure },\n ...{ distanceFname: metric },\n ...{ nEpochs: options?.cycles },\n ...options,\n };\n }\n else if (method == 't-SNE') {\n specOptions = {\n ...{ data: data },\n ...{ distanceFn: measure },\n ...{ distanceFname: metric },\n ...{ iterations: options?.cycles ?? undefined },\n ...options,\n };\n }\n else if (method == 'SPE') {\n specOptions = { ...{ data: data }, ...{ distance: measure }, distanceFunctionName: metric, ...options };\n }\n else {\n specOptions = { ...{ data: data }, ...{ distance: measure }, distanceFunctionName: metric, ...options };\n }\n this.reducer = new AvailableReducers[method](specOptions);\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, parallelDistanceWorkers) {\n if (this.reducer === undefined)\n throw new Error('Reducer was not defined.');\n let { embedding, distance } = await this.reducer.transform(parallelDistanceWorkers);\n if (transpose)\n embedding = transposeMatrix(embedding);\n return { distance: distance, embedding: 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkdWNlLWRpbWVuc2lvbmFsaXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicmVkdWNlLWRpbWVuc2lvbmFsaXR5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDRCQUE0QjtBQUM1QixPQUFPLEtBQUssR0FBRyxNQUFNLFNBQVMsQ0FBQztBQUMvQixPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ25DLE9BQU8sRUFHTCxNQUFNLEdBR1AsTUFBTSxpREFBaUQsQ0FBQztBQUN6RCxPQUFPLEVBQ0wsZUFBZSxFQUNmLE1BQU0sR0FDUCxNQUFNLGlEQUFpRCxDQUFDO0FBQ3pELE9BQU8sRUFBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUNyRCxPQUFPLEVBQUMsT0FBTyxFQUFnQixnQkFBZ0IsRUFDN0MsZ0JBQWdCLEVBQXFCLE1BQU0sK0JBQStCLENBQUM7QUFDN0UsT0FBTyxRQUFRLE1BQU0seUNBQXlDLENBQUM7QUFFL0QsT0FBTyxFQUFDLGNBQWMsRUFBRSxxQkFBcUIsRUFBRSxtQkFBbUIsRUFBRSxhQUFhLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQU81RyxNQUFNLENBQU4sSUFBWSxtQkFHWDtBQUhELFdBQVksbUJBQW1CO0lBQzdCLG9DQUFhLENBQUE7SUFDYixzQ0FBZSxDQUFBO0FBQ2pCLENBQUMsRUFIVyxtQkFBbUIsS0FBbkIsbUJBQW1CLFFBRzlCO0FBd0JEOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUcsS0FBSyxDQUFDO0FBRTlDLE1BQU0sT0FBTyxXQUFXO0lBUXRCO1FBUEEsaUJBQVksR0FBdUIsRUFBQyxNQUFNLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLDBEQUEwRCxFQUFDLENBQUM7UUFDNUksZ0JBQVcsR0FBdUIsRUFBQyxNQUFNLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxDQUFDLEVB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SUFDSCxNQUFNLEtBQUssZ0JBQWdCO1FBQ3pCLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE1BQU0sS0FBSyxnQkFBZ0I7UUFDekIsSUFBSSxHQUFHLEdBQWEsRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUM5QyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2pDLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUM7UUFDM0IsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi9cbmltcG9ydCAqIGFzIHVtaiBmcm9tICd1bWFwLWpzJztcbmltcG9ydCB7VFNORX0gZnJvbSAnQGtlY2tlbHQvdHNuZSc7XG5pbXBvcnQge1xuICBPcHRpb25zLFxuICBDb29yZGluYXRlcyxcbiAgVmVjdG9yLFxuICBWZWN0b3JzLFxuICBNYXRyaXgsXG59IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL3R5cGUtZGVjbGFyYXRpb25zJztcbmltcG9ydCB7XG4gIHRyYW5zcG9zZU1hdHJpeCxcbiAgYXNzZXJ0LFxufSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy92ZWN0b3Itb3BlcmF0aW9ucyc7XG5pbXBvcnQge1NQRUJhc2UsIFBTUEVCYXNlLCBPcmlnaW5hbFNQRX0gZnJvbSAnLi9zcGUnO1xuaW1wb3J0IHtNZWFzdXJlLCBLbm93bk1ldHJpY3MsIEF2YWlsYWJsZU1ldHJpY3MsXG4gIGlzQml0QXJyYXlNZXRyaWMsIEF2YWlsYWJsZURhdGFUeXBlc30gZnJvbSAnLi90eXBlZC1tZXRyaWNzL3R5cGVkLW1ldHJpY3MnO1xuaW1wb3J0IEJpdEFycmF5IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL2JpdC1hcnJheSc7XG5pbXBvcnQge1VNQVBQYXJhbWV0ZXJzfSBmcm9tICd1bWFwLWpzJztcbmltcG9ydCB7RGlzdGFuY2VNYXRyaXgsIERpc3RhbmNlTWF0cml4U2VydmljZSwgZGlzdGFuY2VNYXRyaXhQcm94eSwgZG1MaW5lYXJJbmRleH0gZnJvbSAnLi9kaXN0YW5jZS1tYXRyaXgnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElSZWR1Y2VEaW1lbnNpb25hbGl0eVJlc3VsdCB7XG4gIGRpc3RhbmNlPzogRmxvYXQzMkFycmF5O1xuICBlbWJlZGRpbmc6IE1hdHJpeDtcbn1cblxuZXhwb3J0IGVudW0gRGltUmVkdWN0aW9uTWV0aG9kc3tcbiAgVU1BUCA9ICdVTUFQJyxcbiAgVF9TTkUgPSAndC1TTkUnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVVNQVBPcHRpb25zIHtcbiAgbGVhcm5pbmdSYXRlPzogbnVtYmVyO1xuICBuQ29tcG9uZW50cz86IG51bWJlcjtcbiAgbkVwb2Nocz86IG51bWJlcjtcbiAgbk5laWdoYm9ycz86IG51bWJlcjtcbiAgc3ByZWFkPzogbnVtYmVyO1xuICBtaW5EaXN0PzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElUU05FT3B0aW9ucyB7XG4gIGVwc2lsb24/OiBudW1iZXI7XG4gIHBlcnBsZXhpdHk/OiBudW1iZXI7XG4gIGRpbT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRGltUmVkdWN0aW9uUGFyYW0ge1xuICB1aU5hbWU6IHN0cmluZztcbiAgdmFsdWU6IG51bWJlciB8IG51bGw7XG4gIHRvb2x0aXA6IHN0cmluZztcbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG59XG5cbi8qKiBVbWFwIHVzZXMgcHJlY2FsY3VsYXRlZCBkaXN0YW5jZSBtYXRyaXggdG8gc2F2ZSB0aW1lLiB0aG91Z2ggZm9yIHRvbyBtdWNoIGRhdGEsIG1lbW9yeSBiZWNvbWVzIGNvbnN0cmFpbnQuXG4gKiBpZiB3ZSBoYXZlIDEwMCAwMDAgcm93cywgZGlzdGFuY2UgbWF0cml4IHdpbGwgdGFrZSB+MTBnYiBvZiBtZW1vcnkgYW5kIHByb2JhYmx5IG92ZXJmbG93LlxuICovXG5leHBvcnQgY29uc3QgTUFYX0RJU1RBTkNFX01BVFJJWF9ST1dTID0gMjAwMDA7XG5cbmV4cG9ydCBjbGFzcyBVTUFQT3B0aW9ucyB7XG4gIGxlYXJuaW5nUmF0ZTogSURpbVJlZHVjdGlvblBhcmFtID0ge3VpTmFtZTogJ0xlYXJpbmlnIHJhdGUnLCB2YWx1ZTogMSwgdG9vbHRpcDogJ1RoZSBpbml0aWFsIGxlYXJuaW5nIHJhdGUgZm9yIHRoZSBlbWJlZGRpbmcgb3B0aW1pemF0aW9uJ307XG4gIG5Db21wb25lbnRzOiBJRGltUmVkdWN0aW9uUGFyYW0gPSB7dWlOYW1lOiAnQ29tcG9uZW50cycsIHZhbHVlOiAyLCB0b29sdGlwOiAnVGhlIG51bWJlciBvZiBjb21wb25lbnRzIChkaW1lbnNpb25zKSB0byBwcm9qZWN0IHRoZSBkYXRhIHRvJ307XG4gIG5FcG9jaHM6IElEaW1SZWR1Y3Rpb25QYXJhbSA9IHt1aU5hbWU6ICdFcG9jaHMnLCB2YWx1ZTogMCwgdG9vbHRpcDogJ1RoZSBudW1iZXIgb2YgZXBvY2hzIHRvIG9wdGltaXplIGVtYmVkZGluZ3MgdmlhIFNHRC4gQ29tcHV0ZWQgYXV0b21hdGljYWxseSBpZiBzZXQgdG8gMCd9O1xuICBuTmVpZ2hib3JzOiBJRGltUmVkdWN0aW9uUGFyYW0gPSB7dWlOYW1lOiAnTmVpZ2hib3JzJywgdmFsdWU6IDE1LCB0b29sdGlwOiAnVGhlIG51bWJlciBvZiBuZWFyZXN0IG5laWdoYm9ycyB0byBjb25zdHJ1Y3QgdGhlIGZ1enp5IG1hbmlmb2xkJ307XG4gIHNwcmVhZDogSURpbVJlZHVjdGlvblBhcmFtID0ge3VpTmFtZTogJ1NwcmVhZCcsIHZhbHVlOiAxLCB0b29sdGlwOiAnVGhlIGVmZmVjdGl2ZSBzY2FsZSBvZiBlbWJlZGRlZCBwb2ludHMsIHVzZWQgd2l0aCBtaW4gZGlzdGFuY2UgdG8gY29udHJvbCB0aGUgY2x1bXBlZC9kaXNwZXJzZWQgbmF0dXJlIG9mIHRoZSBlbWJlZGRpbmcnfTtcbiAgbWluRGlzdDogSURpbVJlZHVjdGlvblBhcmFtID0ge3VpTmFtZTogJ01pbiBkaXN0YW5jZScsIHZhbHVlOiAwLjEsIHRvb2x0aXA6ICdUaGUgZWZmZWN0aXZlIG1pbmltdW0gZGlzdGFuY2UgYmV0d2VlbiBlbWJlZGRlZCBwb2ludHMsIHVzZWQgd2l0aCBzcHJlYWQgdG8gY29udHJvbCB0aGUgY2x1bXBlZC9kaXNwZXJzZWQgbmF0dXJlIG9mIHRoZSBlbWJlZGRpbmcnfTtcblxuICBjb25zdHJ1Y3RvcigpIHt9O1xufVxuXG5leHBvcnQgY2xhc3MgVFNORU9wdGlvbnMge1xuICBlcHNpbG9uOiBJRGltUmVkdWN0aW9uUGFyYW0gPSB7dWlOYW1lOiAnRXBzaWxvbicsIHZhbHVlOiAxMCwgdG9vbHRpcDogJ0Vwc2lsb24gaXMgbGVhcm5pbmcgcmF0ZSd9O1xuICBwZXJwbGV4aXR5OiBJRGltUmVkdWN0aW9uUGFyYW0gPSB7dWlOYW1lOiAnUGVycGxleGl0eScsIHZhbHVlOiAzMCwgdG9vbHRpcDogJ1JvdWdobHkgaG93IG1hbnkgbmVpZ2hib3JzIGVhY2ggcG9pbnQgaW5mbHVlbmNlcyd9O1xuICBkaW06IElEaW1SZWR1Y3Rpb25QYXJhbSA9IHt1aU5hbWU6ICdEaW1lbnNpb25hbGl0eScsIHZhbHVlOiAyLCB0b29sdGlwOiAnRGltZW5zaW9uYWxpdHkgb2YgdGhlIGVtYmVkZGluZyd9O1xuXG4gIGNvbnN0cnVjdG9yKCkge307XG59XG5cbi8qKiBBYnN0cmFjdCBkaW1lbnNpb25hbGl0eSByZWR1Y2VyICovXG5hYnN0cmFjdCBjbGFzcyBSZWR1Y2VyIHtcbiAgcHJvdGVjdGVkIGRhdGE6IFZlY3RvcnM7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogT3B0aW9ucykge1xuICAgIHRoaXMuZGF0YSA9IG9wdGlvbnMuZGF0YTtcbiAgfVxuXG4gIC8qKiBFbWJlZHMgdGhlIGRhdGEgZ2l2ZW4gaW50byB0aGUgdHdvLWRpbWVuc2lvbmFsIHNwYWNlLlxuICAgKiBAcmV0dXJuIHthbnl9IENhcnRlc2lhbiBjb29yZGluYXRlIG9mIHRoaXMgZW1iZWRkaW5nIGFuZCBkaXN0YW5jZSBtYXRyaXggd2hlcmUgYXBwbGljYWJsZS4gKi9cbiAgYWJzdHJhY3QgdHJhbnNmb3JtKHBhcmFsbGVsRGlzdGFuY2VXb3JrZXJzPzogYm9vbGVhbik6IFByb21pc2U8SVJlZHVjZURpbWVuc2lvbmFsaXR5UmVzdWx0Pjtcbn1cblxuLyoqIHQtU05FIGRpbWVuc2lvbmFsaXR5IHJlZHVjdGlvbi4gKi9cbmNsYXNzIFRTTkVSZWR1Y2VyIGV4dGVuZHMgUmVkdWNlciB7XG4gIHByb3RlY3RlZCByZWR1Y2VyOiBUU05FO1xuICBwcm90ZWN0ZWQgaXRlcmF0aW9uczogbnVtYmVyO1xuICBwcm90ZWN0ZWQgZGlzdGFuY2VGbmFtZTogS25vd25NZXRyaWNzO1xuICBwcm90ZWN0ZWQgZGlzdGFuY2VGbjogKGE6IGFueSwgYjogYW55KSA9PiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgVFNORVJlZHVjZXIuXG4gICAqIEBwYXJhbSB7T3B0aW9uc30gb3B0aW9ucyBPcHRpb25zIHRvIHBhc3MgdG8gdGhlIGNvbnN0cnVjdG9yLlxuICAgKiBAbWVtYmVyb2YgVFNORVJlZHVjZXJcbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE9wdGlvbnMpIHtcbiAgICBzdXBlcihvcHRpb25zKTtcbiAgICB0aGlzLnJlZHVjZXIgPSBuZXcgVFNORShvcHRpb25zKTtcbiAgICB0aGlzLml0ZXJhdGlvbnMgPSBvcHRpb25zPy5pdGVyYXRpb25zID8/IDEwMDtcbiAgICB0aGlzLmRpc3RhbmNlRm5hbWUgPSBvcHRpb25zLmRpc3RhbmNlRm5hbWU7XG4gICAgdGhpcy5kaXN0YW5jZUZuID0gb3B0aW9ucy5kaXN0YW5jZUZuO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtYmVkcyB0aGUgZGF0YSBnaXZlbiBpbnRvIHRoZSB0d28tZGltZW5zaW9uYWwgc3BhY2UgdXNpbmcgdC1TTkUgbWV0aG9kLlxcXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BhcmFsbGVsRGlzdGFuY2VXb3JrZXJzXSBXaGV0aGVyIHRvIHVzZSBwYXJhbGxlbCBkaXN0YW5jZSB3b3JrZXJzLlxuICAgKiBAcmV0dXJuIHthbnl9IENhcnRlc2lhbiBjb29yZGluYXRlIG9mIHRoaXMgZW1iZWRkaW5nIGFuZCBkaXN0YW5jZSBtYXRyaXggd2hlcmUgYXBwbGljYWJsZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyB0cmFuc2Zvcm0ocGFyYWxsZWxEaXN0YW5jZVdvcmtlcnM/OiBib29sZWFuKTogUHJvbWlzZTxJUmVkdWNlRGltZW5zaW9uYWxpdHlSZXN1bHQ+IHtcbiAgICBjb25zdCBkaXN0YW5jZSA9IHBhcmFsbGVsRGlzdGFuY2VXb3JrZXJzID8gYXdhaXQgKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG1hdHJpeFNlcnZpY2UgPSBuZXcgRGlzdGFuY2VNYXRyaXhTZXJ2aWNlKHRydWUsIGZhbHNlKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGRpc3QgPSBhd2FpdCBtYXRyaXhTZXJ2aWNlLmNhbGModGhpcy5kYXRhLCB0aGlzLmRpc3RhbmNlRm5hbWUpO1xuICAgICAgICBtYXRyaXhTZXJ2aWNlLnRlcm1pbmF0ZSgpO1xuICAgICAgICByZXR1cm4gZGlzdDtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbWF0cml4U2VydmljZS50ZXJtaW5hdGUoKTtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9KSgpIDpcbiAgICAgICgoKSA9PiB7IGNvbnN0IHJldCA9IERpc3RhbmNlTWF0cml4LmNhbGModGhpcy5kYXRhLCAoYSwgYikgPT4gdGhpcy5kaXN0YW5jZUZuKGEsIGIpKTsgcmV0Lm5vcm1hbGl6ZSgpOyByZXR1cm4gcmV0LmRhdGE7IH0pKCk7XG5cbiAgICBjb25zdCBtYXRyaXhQcm94eSA9IGRpc3RhbmNlTWF0cml4UHJveHkoZGlzdGFuY2UsIHRoaXMuZGF0YS5sZW5ndGgpO1xuICAgIHRoaXMucmVkdWNlci5pbml0RGF0YURpc3QobWF0cml4UHJveHkpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLml0ZXJhdGlvbnM7ICsraSlcbiAgICAgIHRoaXMucmVkdWNlci5zdGVwKCk7IC8vIGV2ZXJ5IHRpbWUgeW91IGNhbGwgdGhpcywgc29sdXRpb24gZ2V0cyBiZXR0ZXJcblxuICAgIHJldHVybiB7ZGlzdGFuY2U6IGRpc3RhbmNlLCBlbWJlZGRpbmc6IHRoaXMucmVkdWNlci5nZXRTb2x1dGlvbigpfTtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBVbWFwT3B0aW9ucyA9IE9wdGlvbnMgJiBVTUFQUGFyYW1ldGVycyAmIHtwcmVDYWxjdWxhdGVEaXN0YW5jZU1hdHJpeD86IGJvb2xlYW59O1xuXG4vKipcbiAqIEltcGxlbWVudHMgVU1BUCBkaW1lbnNpb25hbGl0eSByZWR1Y3Rpb24uXG4gKlxuICogQGNsYXNzIFVNQVBSZWR1Y2VyXG4gKiBAZXh0ZW5kcyB7UmVkdWNlcn1cbiAqL1xuY2xhc3MgVU1BUFJlZHVjZXIgZXh0ZW5kcyBSZWR1Y2VyIHtcbiAgcHJvdGVjdGVkIHJlZHVjZXI6IHVtai5VTUFQO1xuICBwcm90ZWN0ZWQgZGlzdGFuY2VGbmFtZTogS25vd25NZXRyaWNzO1xuICBwcm90ZWN0ZWQgZGlzdGFuY2VGbjogRnVuY3Rpb247XG4gIHByb3RlY3RlZCB2ZWN0b3JzOiBudW1iZXJbXVtdO1xuICBwcm90ZWN0ZWQgZGlzdGFuY2VNYXRyaXg/OiBGbG9hdDMyQXJyYXk7XG4gIHByb3RlY3RlZCB1c2luZ0Rpc3RhbmNlTWF0cml4OiBib29sZWFuO1xuICBwcm90ZWN0ZWQgZG1JbmRleEZ1bmM6IChpOiBudW1iZXIsIGo6IG51bWJlcikgPT4gbnVtYmVyO1xuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBVTUFQUmVkdWNlci5cbiAgICogQHBhcmFtIHtPcHRpb25zfSBvcHRpb25zIE9wdGlvbnMgdG8gcGFzcyB0byB0aGUgY29uc3RydWN0b3IuXG4gICAqIEBtZW1iZXJvZiBVTUFQUmVkdWNlclxuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0aW9uczogVW1hcE9wdGlvbnMpIHtcbiAgICBzdXBlcihvcHRpb25zKTtcbiAgICBhc3NlcnQoJ2Rpc3RhbmNlRm5hbWUnIGluIG9wdGlvbnMpO1xuICAgIGFzc2VydCgnZGlzdGFuY2VGbicgaW4gb3B0aW9ucyk7XG4gICAgdGhpcy5kaXN0YW5jZUZuID0gb3B0aW9ucy5kaXN0YW5jZUZuITtcblxuICAgIHRoaXMuZGlzdGFuY2VGbmFtZSA9IG9wdGlvbnMuZGlzdGFuY2VGbmFtZSE7XG4gICAgdGhpcy5kbUluZGV4RnVuYyA9IGRtTGluZWFySW5kZXgodGhpcy5kYXRhLmxlbmd0aCk7XG4gICAgLy9VbWFwIHVzZXMgdmVjdG9yIGluZGV4aW5nLCBzbyB3ZSBuZWVkIHRvIGNyZWF0ZSBhbiBhcnJheSBvZiB2ZWN0b3JzIGFzIGluZGVjZXMuXG4gICAgdGhpcy52ZWN0b3JzID0gbmV3IEFycmF5KHRoaXMuZGF0YS5sZW5ndGgpLmZpbGwoMCkubWFwKChfLCBpKSA9PiBbaV0pO1xuICAgIHRoaXMudXNpbmdEaXN0YW5jZU1hdHJpeCA9ICEoIW9wdGlvbnMucHJlQ2FsY3VsYXRlRGlzdGFuY2VNYXRyaXggJiYgdGhpcy5kYXRhLmxlbmd0aCA+IE1BWF9ESVNUQU5DRV9NQVRSSVhfUk9XUyk7XG4gICAgaWYgKCF0aGlzLnVzaW5nRGlzdGFuY2VNYXRyaXgpXG4gICAgICBvcHRpb25zLmRpc3RhbmNlRm4gPSB0aGlzLl9lbmNvZGVkRGlzdGFuY2UuYmluZCh0aGlzKTtcbiAgICBlbHNlXG4gICAgICBvcHRpb25zLmRpc3RhbmNlRm4gPSB0aGlzLl9lbmNvZGVkRGlzdGFuY2VNYXRyaXguYmluZCh0aGlzKTtcblxuICAgIGlmICh0aGlzLmRhdGEubGVuZ3RoIDwgMTUpXG4gICAgICBvcHRpb25zLm5OZWlnaGJvcnMgPSB0aGlzLmRhdGEubGVuZ3RoIC0gMTtcbiAgICB0aGlzLnJlZHVjZXIgPSBuZXcgdW1qLlVNQVAob3B0aW9ucyk7XG4gICAgLy8gdGhpcy5yZWR1Y2VyLmRpc3RhbmNlRm4gPSB0aGlzLl9lbmNvZGVkRGlzdGFuY2UuYmluZCh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDdXN0b20gZGlzdGFuY2Ugd3JhcHBlciB0byBoYXZlIG51bWVyaWMgaW5wdXRzIGluc3RlYWQgb2Ygc3RyaW5nIG9uZXMuXG4gICAqXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQHBhcmFtIHtudW1iZXJbXX0gYSBUaGUgZmlyc3QgaXRlbS5cbiAgICogQHBhcmFtIHtudW1iZXJbXX0gYiBUaGUgZmlyc3QgaXRlbS5cbiAgICogQHJldHVybiB7bnVtYmVyfSBEaXN0YW5jZSBtZXRyaWMuXG4gICAqIEBtZW1iZXJvZiBVTUFQUmVkdWNlclxuICAgKi9cbiAgcHJvdGVjdGVkIF9lbmNvZGVkRGlzdGFuY2VNYXRyaXgoYTogbnVtYmVyW10sIGI6IG51bWJlcltdKTogbnVtYmVyIHtcbiAgICBpZiAoYVswXSA9PT0gYlswXSlcbiAgICAgIHJldHVybiAwO1xuICAgIGlmIChhWzBdID4gYlswXSlcbiAgICAgIHJldHVybiB0aGlzLmRpc3RhbmNlTWF0cml4IVt0aGlzLmRtSW5kZXhGdW5jKGJbMF0sIGFbMF0pXTtcbiAgICByZXR1cm4gdGhpcy5kaXN0YW5jZU1hdHJpeCFbdGhpcy5kbUluZGV4RnVuYyhhWzBdLCBiWzBdKV07XG4gIH1cblxuICBwcm90ZWN0ZWQgX2VuY29kZWREaXN0YW5jZShhOiBudW1iZXJbXSwgYjogbnVtYmVyW10pOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmRpc3RhbmNlRm4odGhpcy5kYXRhW2FbMF1dLCB0aGlzLmRhdGFbYlswXV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtYmVkcyB0aGUgZGF0YSBnaXZlbiBpbnRvIHRoZSB0d28tZGltZW5zaW9uYWwgc3BhY2UgdXNpbmcgVU1BUCBtZXRob2QuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BhcmFsbGVsRGlzdGFuY2VXb3JrZXJzXSBXaGV0aGVyIHRvIHVzZSBwYXJhbGxlbCBkaXN0YW5jZSBtYXRyaXggd29ya2Vycy5cbiAgICogQHJldHVybiB7YW55fSBDYXJ0ZXNpYW4gY29vcmRpbmF0ZSBvZiB0aGlzIGVtYmVkZGluZy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyB0cmFuc2Zvcm0ocGFyYWxsZWxEaXN0YW5jZVdvcmtlcnM/OiBib29sZWFuKTogUHJvbWlzZTxJUmVkdWNlRGltZW5zaW9uYWxpdHlSZXN1bHQ+IHtcbiAgICBpZiAodGhpcy51c2luZ0Rpc3RhbmNlTWF0cml4KSB7XG4gICAgICB0aGlzLmRpc3RhbmNlTWF0cml4ID0gcGFyYWxsZWxEaXN0YW5jZVdvcmtlcnMgPyBhd2FpdCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBtYXRyaXhTZXJ2aWNlID0gbmV3IERpc3RhbmNlTWF0cml4U2VydmljZSh0cnVlLCBmYWxzZSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZGlzdCA9IGF3YWl0IG1hdHJpeFNlcnZpY2UuY2FsYyh0aGlzLmRhdGEsIHRoaXMuZGlzdGFuY2VGbmFtZSk7XG4gICAgICAgICAgbWF0cml4U2VydmljZS50ZXJtaW5hdGUoKTtcbiAgICAgICAgICByZXR1cm4gZGlzdDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIG1hdHJpeFNlcnZpY2UudGVybWluYXRlKCk7XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgfSkoKSA6XG4gICAgICAgICgoKSA9PiB7IGNvbnN0IHJldCA9IERpc3RhbmNlTWF0cml4LmNhbGModGhpcy5kYXRhLCAoYSwgYikgPT4gdGhpcy5kaXN0YW5jZUZuKGEsIGIpKTsgcmV0dXJuIHJldC5kYXRhOyB9KSgpO1xuICAgIH1cbiAgICBjb25zdCBlbWJlZGRpbmcgPSB0aGlzLnJlZHVjZXIuZml0KHRoaXMudmVjdG9ycyk7XG5cbiAgICBmdW5jdGlvbiBhcnJheUNhc3QyQ29vcmRpbmF0ZXMoZGF0YTogbnVtYmVyW11bXSk6IENvb3JkaW5hdGVzIHtcbiAgICAgIHJldHVybiBuZXcgQXJyYXkoZGF0YS5sZW5ndGgpLmZpbGwoMCkubWFwKChfLCBpKSA9PiAoVmVjdG9yLmZyb20oZGF0YVtpXSkpKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge2VtYmVkZGluZzogYXJyYXlDYXN0MkNvb3JkaW5hdGVzKGVtYmVkZGluZyksIC4uLih0aGlzLmRpc3RhbmNlTWF0cml4ID8ge2Rpc3RhbmNlOiB0aGlzLmRpc3RhbmNlTWF0cml4fSA6IHt9KX07XG4gIH1cbn1cblxuLyoqXG4gKiBJbXBsZW1lbnRzIG9yaWdpbmFsIFNQRSBkaW1lbnNpb25hbGl0eSByZWR1Y3Rpb24uXG4gKlxuICogQGNsYXNzIFNQRVJlZHVjZXJcbiAqIEBleHRlbmRzIHtSZWR1Y2VyfVxuICovXG5jbGFzcyBTUEVSZWR1Y2VyIGV4dGVuZHMgUmVkdWNlciB7XG4gIHByb3RlY3RlZCByZWR1Y2VyOiBTUEVCYXNlO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIFNQRVJlZHVjZXIuXG4gICAqIEBwYXJhbSB7T3B0aW9uc30gb3B0aW9ucyBPcHRpb25zIHRvIHBhc3MgdG8gdGhlIGNvbnN0cnVjdG9yLlxuICAgKiBAbWVtYmVyb2YgU1BFUmVkdWNlclxuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0aW9uczogT3B0aW9ucykge1xuICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgIHRoaXMucmVkdWNlciA9IG5ldyBTUEVCYXNlKG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtYmVkcyB0aGUgZGF0YSBnaXZlbiBpbnRvIHRoZSB0d28tZGltZW5zaW9uYWwgc3BhY2UgdXNpbmcgdGhlIG9yaWdpbmFsIFNQRSBtZXRob2QuXG4gICAqIEByZXR1cm4ge2FueX0gQ2FydGVzaWFuIGNvb3JkaW5hdGUgb2YgdGhpcyBlbWJlZGRpbmcgYW5kIGRpc3RhbmNlIG1hdHJpeCB3aGVyZSBhcHBsaWNhYmxlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHRyYW5zZm9ybSgpOiBQcm9taXNlPElSZWR1Y2VEaW1lbnNpb25hbGl0eVJlc3VsdD4ge1xuICAgIGNvbnN0IGVtYiA9IGF3YWl0IHRoaXMucmVkdWNlci5lbWJlZCh0aGlzLmRhdGEpO1xuICAgIHJldHVybiB7ZGlzdGFuY2U6IHRoaXMucmVkdWNlci5kaXN0YW5jZSwgZW1iZWRkaW5nOiBlbWJ9O1xuICB9XG59XG5cbi8qKlxuICogSW1wbGVtZW50cyBtb2RpZmllZCBTUEUgZGltZW5zaW9uYWxpdHkgcmVkdWN0aW9uLlxuICpcbiAqIEBjbGFzcyBQU1BFUmVkdWNlclxuICogQGV4dGVuZHMge1JlZHVjZXJ9XG4gKi9cbmNsYXNzIFBTUEVSZWR1Y2VyIGV4dGVuZHMgUmVkdWNlciB7XG4gIHByb3RlY3RlZCByZWR1Y2VyOiBQU1BFQmFzZTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBQU1BFUmVkdWNlci5cbiAgICogQHBhcmFtIHtPcHRpb25zfSBvcHRpb25zIE9wdGlvbnMgdG8gcGFzcyB0byB0aGUgY29uc3RydWN0b3IuXG4gICAqIEBtZW1iZXJvZiBQU1BFUmVkdWNlclxuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0aW9uczogT3B0aW9ucykge1xuICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgIHRoaXMucmVkdWNlciA9IG5ldyBQU1BFQmFzZShvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWJlZHMgdGhlIGRhdGEgZ2l2ZW4gaW50byB0aGUgdHdvLWRpbWVuc2lvbmFsIHNwYWNlIHVzaW5nIHRoZSBtb2RpZmllZCBTUEUgbWV0aG9kLlxuICAgKiBAcmV0dXJuIHthbnl9IENhcnRlc2lhbiBjb29yZGluYXRlIG9mIHRoaXMgZW1iZWRkaW5nIGFuZCBkaXN0YW5jZSBtYXRyaXggd2hlcmUgYXBwbGljYWJsZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyB0cmFuc2Zvcm0oKTogUHJvbWlzZTxJUmVkdWNlRGltZW5zaW9uYWxpdHlSZXN1bHQ+IHtcbiAgICBjb25zdCBlbWIgPSBhd2FpdCB0aGlzLnJlZHVjZXIuZW1iZWQodGhpcy5kYXRhKTtcbiAgICByZXR1cm4ge2Rpc3RhbmNlOiB0aGlzLnJlZHVjZXIuZGlzdGFuY2UsIGVtYmVkZGluZzogZW1ifTtcbiAgfVxufVxuXG4vKipcbiAqIEltcGxlbWVudHMgb3JpZ2luYWwgU1BFIGRpbWVuc2lvbmFsaXR5IHJlZHVjdGlvbi5cbiAqXG4gKiBAY2xhc3MgT3JpZ2luYWxTUEVSZWR1Y2VyXG4gKiBAZXh0ZW5kcyB7UmVkdWNlcn1cbiAqL1xuY2xhc3MgT3JpZ2luYWxTUEVSZWR1Y2VyIGV4dGVuZHMgUmVkdWNlciB7XG4gIHByb3RlY3RlZCByZWR1Y2VyOiBPcmlnaW5hbFNQRTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBPcmlnaW5hbFNQRVJlZHVjZXIuXG4gICAqIEBwYXJhbSB7T3B0aW9uc30gb3B0aW9ucyBPcHRpb25zIHRvIHBhc3MgdG8gdGhlIGNvbnN0cnVjdG9yLlxuICAgKiBAbWVtYmVyb2YgT3JpZ2luYWxTUEVSZWR1Y2VyXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBPcHRpb25zKSB7XG4gICAgc3VwZXIob3B0aW9ucyk7XG4gICAgdGhpcy5yZWR1Y2VyID0gbmV3IE9yaWdpbmFsU1BFKG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtYmVkcyB0aGUgZGF0YSBnaXZlbiBpbnRvIHRoZSB0d28tZGltZW5zaW9uYWwgc3BhY2UgdXNpbmcgdGhlIG9yaWdpbmFsIFNQRSBtZXRob2QuXG4gICAqIEByZXR1cm4ge2FueX0gQ2FydGVzaWFuIGNvb3JkaW5hdGUgb2YgdGhpcyBlbWJlZGRpbmcgYW5kIGRpc3RhbmNlIG1hdHJpeCB3aGVyZSBhcHBsaWNhYmxlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHRyYW5zZm9ybSgpOiBQcm9taXNlPElSZWR1Y2VEaW1lbnNpb25hbGl0eVJlc3VsdD4ge1xuICAgIGNvbnN0IGVtYiA9IGF3YWl0IHRoaXMucmVkdWNlci5lbWJlZCh0aGlzLmRhdGEpO1xuICAgIHJldHVybiB7ZGlzdGFuY2U6IHRoaXMucmVkdWNlci5kaXN0YW5jZSwgZW1iZWRkaW5nOiBlbWJ9O1xuICB9XG59XG5cbmNvbnN0IEF2YWlsYWJsZVJlZHVjZXJzID0ge1xuICAnVU1BUCc6IFVNQVBSZWR1Y2VyLFxuICAndC1TTkUnOiBUU05FUmVkdWNlcixcbiAgJ1NQRSc6IFNQRVJlZHVjZXIsXG4gICdwU1BFJzogUFNQRVJlZHVjZXIsXG4gICdPcmlnaW5hbFNQRSc6IE9yaWdpbmFsU1BFUmVkdWNlcixcbn07XG5cbmV4cG9ydCB0eXBlIEtub3duTWV0aG9kcyA9IGtleW9mIHR5cGVvZiBBdmFpbGFibGVSZWR1Y2VycztcblxuLyoqXG4gKiBVbmlmaWVkIGNsYXNzIGltcGxlbWVudGluZyBkaWZmZXJlbnQgZGltZW5zaW9uYWxpdHkgcmVkdWN0aW9uIG1ldGhvZHMuXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIERpbWVuc2lvbmFsaXR5UmVkdWNlclxuICovXG5leHBvcnQgY2xhc3MgRGltZW5zaW9uYWxpdHlSZWR1Y2VyIHtcbiAgcHJpdmF0ZSByZWR1Y2VyOiBSZWR1Y2VyIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIERpbWVuc2lvbmFsaXR5UmVkdWNlci5cbiAgICogQHBhcmFtIHthbnlbXX0gZGF0YSBWZWN0b3JzIHRvIGVtYmVkLlxuICAgKiBAcGFyYW0ge0tub3duTWV0aG9kc30gbWV0aG9kIEVtYmVkZGluZyBtZXRob2QgdG8gYmUgYXBwbGllZFxuICAgKiBAcGFyYW0ge0tub3duTWV0cmljc30gbWV0cmljIERpc3RhbmNlIG1ldHJpYyB0byBiZSBjb21wdXRlZCBiZXR3ZWVuIGVhY2ggb2YgdGhlIHZlY3RvcnMuXG4gICAqIEBwYXJhbSB7T3B0aW9uc30gW29wdGlvbnNdIE9wdGlvbnMgdG8gcGFzcyB0byB0aGUgaW1wbGVtZW50aW5nIGVtYmVkZGVycy5cbiAgICogQG1lbWJlcm9mIERpbWVuc2lvbmFsaXR5UmVkdWNlclxuICAgKi9cbiAgY29uc3RydWN0b3IoZGF0YTogYW55W10sIG1ldGhvZDogS25vd25NZXRob2RzLCBtZXRyaWM6IEtub3duTWV0cmljcywgb3B0aW9ucz86IE9wdGlvbnMpIHtcbiAgICBjb25zdCBtZWFzdXJlID0gbmV3IE1lYXN1cmUobWV0cmljKS5nZXRNZWFzdXJlKCk7XG4gICAgbGV0IHNwZWNPcHRpb25zID0ge307XG5cbiAgICBpZiAoaXNCaXRBcnJheU1ldHJpYyhtZXRyaWMpKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyArK2kpXG4gICAgICAgIGRhdGFbaV0gPSBuZXcgQml0QXJyYXkoZGF0YVtpXS5fZGF0YSwgZGF0YVtpXS5fbGVuZ3RoKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09ICdVTUFQJykge1xuICAgICAgc3BlY09wdGlvbnMgPSB7XG4gICAgICAgIC4uLntkYXRhOiBkYXRhfSxcbiAgICAgICAgLi4ue2Rpc3RhbmNlRm46IG1lYXN1cmV9LFxuICAgICAgICAuLi57ZGlzdGFuY2VGbmFtZTogbWV0cmljfSxcbiAgICAgICAgLi4ue25FcG9jaHM6IG9wdGlvbnM/LmN5Y2xlc30sXG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAobWV0aG9kID09ICd0LVNORScpIHtcbiAgICAgIHNwZWNPcHRpb25zID0ge1xuICAgICAgICAuLi57ZGF0YTogZGF0YX0sXG4gICAgICAgIC4uLntkaXN0YW5jZUZuOiBtZWFzdXJlfSxcbiAgICAgICAgLi4ue2Rpc3RhbmNlRm5hbWU6IG1ldHJpY30sXG4gICAgICAgIC4uLntpdGVyYXRpb25zOiBvcHRpb25zPy5jeWNsZXMgPz8gdW5kZWZpbmVkfSxcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChtZXRob2QgPT0gJ1NQRScpIHtcbiAgICAgIHNwZWNPcHRpb25zID0gey4uLntkYXRhOiBkYXRhfSwgLi4ue2Rpc3RhbmNlOiBtZWFzdXJlfSwgZGlzdGFuY2VGdW5jdGlvbk5hbWU6IG1ldHJpYywgLi4ub3B0aW9uc307XG4gICAgfSBlbHNlIHtcbiAgICAgIHNwZWNPcHRpb25zID0gey4uLntkYXRhOiBkYXRhfSwgLi4ue2Rpc3RhbmNlOiBtZWFzdXJlfSwgZGlzdGFuY2VGdW5jdGlvbk5hbWU6IG1ldHJpYywgLi4ub3B0aW9uc307XG4gICAgfVxuICAgIHRoaXMucmVkdWNlciA9IG5ldyBBdmFpbGFibGVSZWR1Y2Vyc1ttZXRob2RdKHNwZWNPcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWJlZHMgdGhlIGRhdGEgZ2l2ZW4gaW50byB0aGUgdHdvLWRpbWVuc2lvbmFsIHNwYWNlIHVzaW5nIHRoZSBjaG9zZW4gbWV0aG9kLlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHRyYW5zcG9zZSBXaGV0aGVyIHRvIHRyYW5zZm9ybSBjb29yZGluYXRlcyB0byBoYXZlIGNvbHVtbnMtZmlyc3Qgb3JpZW50YXRpb24uXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gcGFyYWxsZWxEaXN0YW5jZVdvcmtlcnMgV2hldGhlciB0byB1c2UgcGFyYWxsZWwgZGlzdGFuY2UgY29tcHV0YXRpb24uXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgZW1iZWRkaW5nIG1ldGhvZCB3YXMgbm90IGZvdW5kLlxuICAgKiBAcmV0dXJuIHthbnl9IENhcnRlc2lhbiBjb29yZGluYXRlIG9mIHRoaXMgZW1iZWRkaW5nIGFuZCBkaXN0YW5jZSBtYXRyaXggd2hlcmUgYXBwbGljYWJsZS5cbiAgICogQG1lbWJlcm9mIERpbWVuc2lvbmFsaXR5UmVkdWNlclxuICAgKi9cbiAgcHVibGljIGFzeW5jIHRyYW5zZm9ybSh0cmFuc3Bvc2U6IGJvb2xlYW4gPSBmYWxzZSwgcGFyYWxsZWxEaXN0YW5jZVdvcmtlcnM/OiBib29sZWFuKTogUHJvbWlzZTxJUmVkdWNlRGltZW5zaW9uYWxpdHlSZXN1bHQ+IHtcbiAgICBpZiAodGhpcy5yZWR1Y2VyID09PSB1bmRlZmluZWQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlZHVjZXIgd2FzIG5vdCBkZWZpbmVkLicpO1xuXG4gICAgbGV0IHtlbWJlZGRpbmcsIGRpc3RhbmNlfSA9IGF3YWl0IHRoaXMucmVkdWNlci50cmFuc2Zvcm0ocGFyYWxsZWxEaXN0YW5jZVdvcmtlcnMpO1xuXG4gICAgaWYgKHRyYW5zcG9zZSlcbiAgICAgIGVtYmVkZGluZyA9IHRyYW5zcG9zZU1hdHJpeChlbWJlZGRpbmcpO1xuXG4gICAgcmV0dXJuIHtkaXN0YW5jZTogZGlzdGFuY2UsIGVtYmVkZGluZzogZW1iZWRkaW5nfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIG1ldHJpY3MgYXZhaWxhYmxlIGJ5IHR5cGUuXG4gICAqXG4gICAqIEBwYXJhbSB7QXZhaWxhYmxlRGF0YVR5cGVzfSB0eXBlTmFtZSB0eXBlIG5hbWVcbiAgICogQHJldHVybiB7c3RyaW5nW119IE1ldHJpYyBuYW1lcyB3aGljaCBleHBlY3RzIHRoZSBnaXZlbiBkYXRhIHR5cGVcbiAgICogQG1lbWJlcm9mIERpbWVuc2lvbmFsaXR5UmVkdWNlclxuICAgKi9cbiAgc3RhdGljIGF2YWlsYWJsZU1ldHJpY3NCeVR5cGUodHlwZU5hbWU6IEF2YWlsYWJsZURhdGFUeXBlcykge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhBdmFpbGFibGVNZXRyaWNzW3R5cGVOYW1lXSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBkaW1lbnNpb25hbGl0eSByZWR1Y3Rpb24gbWV0aG9kcyBhdmFpbGFibGUuXG4gICAqXG4gICAqIEByZWFkb25seVxuICAgKiBAbWVtYmVyb2YgRGltZW5zaW9uYWxpdHlSZWR1Y2VyXG4gICAqL1xuICBzdGF0aWMgZ2V0IGF2YWlsYWJsZU1ldGhvZHMoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKEF2YWlsYWJsZVJlZHVjZXJzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIG1ldHJpY3MgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBAcmVhZG9ubHlcbiAgICogQG1lbWJlcm9mIERpbWVuc2lvbmFsaXR5UmVkdWNlclxuICAgKi9cbiAgc3RhdGljIGdldCBhdmFpbGFibGVNZXRyaWNzKCkge1xuICAgIGxldCBhbnM6IHN0cmluZ1tdID0gW107XG4gICAgT2JqZWN0LnZhbHVlcyhBdmFpbGFibGVNZXRyaWNzKS5mb3JFYWNoKChvYmopID0+IHtcbiAgICAgIGNvbnN0IGFycmF5ID0gT2JqZWN0LnZhbHVlcyhvYmopO1xuICAgICAgYW5zID0gWy4uLmFucywgLi4uYXJyYXldO1xuICAgIH0pO1xuICAgIHJldHVybiBhbnM7XG4gIH1cbn1cbiJdfQ==","import { isNil } from './utils';\n/** Distance matrix class compatible with data structure of scipy.spatial.distance.pdist */\nexport class DistanceMatrix {\n get data() { return this._data; }\n get size() { return this._size; }\n /**\n * @param {Float32Array} data Distance data\n * @param {number} size Number of original observations\n */\n constructor(data, size) {\n if (size == undefined) {\n if (data == undefined)\n throw new Error('Arguments error: data or size is required.');\n this._data = data;\n this._size = (1 + Math.sqrt(1 + 4 * 2 * this._data.length)) / 2;\n if (this._size != Math.floor(this._size))\n throw new Error(`Invalid data length ${this._data.length} leads to non integer size ${this._size}`);\n }\n else {\n this._size = size;\n const dataLength = size * (size - 1) / 2;\n if (data) {\n if (data.length != dataLength)\n throw new Error(`Invalid data length. Observations size ${size} requires data length ${dataLength}.`);\n this._data = data;\n }\n else {\n this._data = new Float32Array(dataLength);\n }\n }\n }\n _linearizeIJ(i, j) {\n if (!(i < j))\n throw new Error('i must be less than j');\n return this._size * i + j - Math.floor(((i + 2) * (i + 1)) / 2);\n }\n get(i, j) {\n if (i == j)\n return 0;\n else if (i < j)\n return this._data[this._linearizeIJ(i, j)];\n else\n return this._data[this._linearizeIJ(j, i)];\n }\n set(i, j, value) {\n this._data[this._linearizeIJ(i, j)] = value;\n }\n static calc(list, method) {\n const size = list.length;\n const res = new DistanceMatrix(undefined, size);\n for (let i = 0; i < size; i++) {\n for (let j = i + 1; j < size; j++) {\n // if any of the values is null, set distance to 1\n res.set(i, j, !isNil(list[i]) && !isNil(list[j]) ? method(list[i], list[j]) : 1);\n }\n }\n return res;\n }\n // squares each value in matrix in place\n square() {\n for (let i = 0; i < this._data.length; i++)\n this._data[i] = this._data[i] ** 2;\n }\n // adds another matrix to this one in place\n add(other) {\n if (this._size !== other._size)\n throw new Error(`Matrices must have the same size. This size: ${this._size}, other size: ${other._size}`);\n for (let i = 0; i < this._data.length; i++)\n this._data[i] += other._data[i];\n }\n // square root each value in matrix in place\n sqrt() {\n for (let i = 0; i < this._data.length; i++)\n this._data[i] = Math.sqrt(this._data[i]);\n }\n //normilze distance matrix in place\n normalize() {\n let min = 0;\n let max = this._data[0];\n for (let i = 0; i < this._data.length; i++) {\n if (this._data[i] < min)\n min = this._data[i];\n if (this._data[i] > max)\n max = this._data[i];\n }\n const range = max - min;\n for (let i = 0; i < this._data.length; i++)\n this._data[i] = range === 0 ? this._data[i] - min : (this._data[i] - min) / (max - min);\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzdGFuY2UtbWF0cml4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGlzdGFuY2UtbWF0cml4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFFOUIsMkZBQTJGO0FBQzNGLE1BQU0sT0FBTyxjQUFjO0lBSXpCLElBQUksSUFBSSxLQUFtQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBRS9DLElBQUksSUFBSSxLQUFhLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFFekM7OztPQUdHO0lBQ0gsWUFBWSxJQUFtQixFQUFFLElBQWE7UUFDNUMsSUFBSSxJQUFJLElBQUksU0FBUyxFQUFFO1lBQ3JCLElBQUksSUFBSSxJQUFJLFNBQVM7Z0JBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO1lBRXJGLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSyxDQUFDO1lBQ25CLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hFLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7Z0JBQ3RDLE1BQU0sSUFBSSxLQUFLLENBQUMsdUJBQXVCLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSw4QkFBOEIsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7U0FDdkc7YUFBTTtZQUNMLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1lBQ2xCLE1BQU0sVUFBVSxHQUFXLElBQUksR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7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QjtRQUNELE1BQU0sS0FBSyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDeEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtZQUN4QyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDNUYsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZ3JvayBmcm9tICdkYXRhZ3Jvay1hcGkvZ3Jvayc7XG5pbXBvcnQgKiBhcyB1aSBmcm9tICdkYXRhZ3Jvay1hcGkvdWknO1xuaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcbmltcG9ydCB7aXNOaWx9IGZyb20gJy4vdXRpbHMnO1xuXG4vKiogRGlzdGFuY2UgbWF0cml4IGNsYXNzIGNvbXBhdGlibGUgd2l0aCBkYXRhIHN0cnVjdHVyZSBvZiBzY2lweS5zcGF0aWFsLmRpc3RhbmNlLnBkaXN0ICovXG5leHBvcnQgY2xhc3MgRGlzdGFuY2VNYXRyaXgge1xuICBfZGF0YTogRmxvYXQzMkFycmF5O1xuICBfc2l6ZTogbnVtYmVyO1xuXG4gIGdldCBkYXRhKCk6IEZsb2F0MzJBcnJheSB7IHJldHVybiB0aGlzLl9kYXRhOyB9XG5cbiAgZ2V0IHNpemUoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3NpemU7IH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGbG9hdDMyQXJyYXl9IGRhdGEgRGlzdGFuY2UgZGF0YVxuICAgKiBAcGFyYW0ge251bWJlcn0gc2l6ZSBOdW1iZXIgb2Ygb3JpZ2luYWwgb2JzZXJ2YXRpb25zXG4gICAqL1xuICBjb25zdHJ1Y3RvcihkYXRhPzogRmxvYXQzMkFycmF5LCBzaXplPzogbnVtYmVyKSB7XG4gICAgaWYgKHNpemUgPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoZGF0YSA9PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcignQXJndW1lbnRzIGVycm9yOiBkYXRhIG9yIHNpemUgaXMgcmVxdWlyZWQuJyk7XG5cbiAgICAgIHRoaXMuX2RhdGEgPSBkYXRhITtcbiAgICAgIHRoaXMuX3NpemUgPSAoMSArIE1hdGguc3FydCgxICsgNCAqIDIgKiB0aGlzLl9kYXRhLmxlbmd0aCkpIC8gMjtcbiAgICAgIGlmICh0aGlzLl9zaXplICE9IE1hdGguZmxvb3IodGhpcy5fc2l6ZSkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBkYXRhIGxlbmd0aCAke3RoaXMuX2RhdGEubGVuZ3RofSBsZWFkcyB0byBub24gaW50ZWdlciBzaXplICR7dGhpcy5fc2l6ZX1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fc2l6ZSA9IHNpemU7XG4gICAgICBjb25zdCBkYXRhTGVuZ3RoOiBudW1iZXIgPSBzaXplICogKHNpemUgLSAxKSAvIDI7XG4gICAgICBpZiAoZGF0YSkge1xuICAgICAgICBpZiAoZGF0YS5sZW5ndGggIT0gZGF0YUxlbmd0aClcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZGF0YSBsZW5ndGguIE9ic2VydmF0aW9ucyBzaXplICR7c2l6ZX0gcmVxdWlyZXMgZGF0YSBsZW5ndGggJHtkYXRhTGVuZ3RofS5gKTtcbiAgICAgICAgdGhpcy5fZGF0YSA9IGRhdGE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9kYXRhID0gbmV3IEZsb2F0MzJBcnJheShkYXRhTGVuZ3RoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9saW5lYXJpemVJSihpOiBudW1iZXIsIGo6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKCEoaSA8IGopKSB0aHJvdyBuZXcgRXJyb3IoJ2kgbXVzdCBiZSBsZXNzIHRoYW4gaicpO1xuICAgIHJldHVybiB0aGlzLl9zaXplICogaSArIGogLSBNYXRoLmZsb29yKCgoaSArIDIpICogKGkgKyAxKSkgLyAyKTtcbiAgfVxuXG4gIGdldChpOiBudW1iZXIsIGo6IG51bWJlcikge1xuICAgIGlmIChpID09IGopXG4gICAgICByZXR1cm4gMDtcbiAgICBlbHNlIGlmIChpIDwgailcbiAgICAgIHJldHVybiB0aGlzLl9kYXRhW3RoaXMuX2xpbmVhcml6ZUlKKGksIGopXTtcbiAgICBlbHNlXG4gICAgICByZXR1cm4gdGhpcy5fZGF0YVt0aGlzLl9saW5lYXJpemVJSihqLCBpKV07XG4gIH1cblxuICBzZXQoaTogbnVtYmVyLCBqOiBudW1iZXIsIHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9kYXRhW3RoaXMuX2xpbmVhcml6ZUlKKGksIGopXSA9IHZhbHVlO1xuICB9XG5cbiAgc3RhdGljIGNhbGM8VE9iaj4obGlzdDogSW5kZXhhYmxlPFRPYmo+LCBtZXRob2Q6IChhOiBUT2JqLCBiOiBUT2JqKSA9PiBudW1iZXIpOiBEaXN0YW5jZU1hdHJpeCB7XG4gICAgY29uc3Qgc2l6ZTogbnVtYmVyID0gbGlzdC5sZW5ndGg7XG4gICAgY29uc3QgcmVzID0gbmV3IERpc3RhbmNlTWF0cml4KHVuZGVmaW5lZCwgc2l6ZSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcbiAgICAgIGZvciAobGV0IGogPSBpICsgMTsgaiA8IHNpemU7IGorKykge1xuICAgICAgICAvLyBpZiBhbnkgb2YgdGhlIHZhbHVlcyBpcyBudWxsLCBzZXQgZGlzdGFuY2UgdG8gMVxuICAgICAgICByZXMuc2V0KGksIGosICFpc05pbChsaXN0W2ldKSAmJiAhaXNOaWwobGlzdFtqXSkgPyBtZXRob2QobGlzdFtpXSwgbGlzdFtqXSkgOiAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8vIHNxdWFyZXMgZWFjaCB2YWx1ZSBpbiBtYXRyaXggaW4gcGxhY2VcbiAgcHVibGljIHNxdWFyZSgpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2RhdGEubGVuZ3RoOyBpKyspXG4gICAgICB0aGlzLl9kYXRhW2ldID0gdGhpcy5fZGF0YVtpXSAqKiAyO1xuICB9XG5cbiAgLy8gYWRkcyBhbm90aGVyIG1hdHJpeCB0byB0aGlzIG9uZSBpbiBwbGFjZVxuICBwdWJsaWMgYWRkKG90aGVyOiBEaXN0YW5jZU1hdHJpeCkge1xuICAgIGlmICh0aGlzLl9zaXplICE9PSBvdGhlci5fc2l6ZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWF0cmljZXMgbXVzdCBoYXZlIHRoZSBzYW1lIHNpemUuIFRoaXMgc2l6ZTogJHt0aGlzLl9zaXplfSwgb3RoZXIgc2l6ZTogJHtvdGhlci5fc2l6ZX1gKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2RhdGEubGVuZ3RoOyBpKyspXG4gICAgICB0aGlzLl9kYXRhW2ldICs9IG90aGVyLl9kYXRhW2ldO1xuICB9XG5cbiAgLy8gc3F1YXJlIHJvb3QgZWFjaCB2YWx1ZSBpbiBtYXRyaXggaW4gcGxhY2VcbiAgcHVibGljIHNxcnQoKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9kYXRhLmxlbmd0aDsgaSsrKVxuICAgICAgdGhpcy5fZGF0YVtpXSA9IE1hdGguc3FydCh0aGlzLl9kYXRhW2ldKTtcbiAgfVxuXG4gIC8vbm9ybWlsemUgZGlzdGFuY2UgbWF0cml4IGluIHBsYWNlXG4gIHB1YmxpYyBub3JtYWxpemUoKSB7XG4gICAgbGV0IG1pbiA9IDA7XG4gICAgbGV0IG1heCA9IHRoaXMuX2RhdGFbMF07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9kYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5fZGF0YVtpXSA8IG1pbilcbiAgICAgICAgbWluID0gdGhpcy5fZGF0YVtpXTtcbiAgICAgIGlmICh0aGlzLl9kYXRhW2ldID4gbWF4KVxuICAgICAgICBtYXggPSB0aGlzLl9kYXRhW2ldO1xuICAgIH1cbiAgICBjb25zdCByYW5nZSA9IG1heCAtIG1pbjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2RhdGEubGVuZ3RoOyBpKyspXG4gICAgICB0aGlzLl9kYXRhW2ldID0gcmFuZ2UgPT09IDAgPyB0aGlzLl9kYXRhW2ldIC0gbWluIDogKHRoaXMuX2RhdGFbaV0gLSBtaW4pIC8gKG1heCAtIG1pbik7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbmRleGFibGU8VE9iaj4ge1xuICBbaW5kZXg6IG51bWJlcl06IFRPYmo7XG4gIGdldCBsZW5ndGgoKTogbnVtYmVyO1xufVxuIl19","import { DimensionalityReducer } from '../reduce-dimensionality';\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(columnData, method, measure, options, parallelDistanceWorkers) {\n const reducer = new DimensionalityReducer(columnData, method, measure, options);\n return await reducer.transform(true, parallelDistanceWorkers);\n}\nself.onmessage = async ({ data: { columnData, method, measure, options, parallelDistanceWorkers } }) => {\n let data;\n try {\n data = await onMessage(columnData, method, measure, options, parallelDistanceWorkers);\n }\n catch (e) {\n data = { error: e };\n }\n self.postMessage({\n error: data.error,\n distance: data.distance,\n embedding: data.embedding,\n });\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGltZW5zaW9uYWxpdHktcmVkdWNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImRpbWVuc2lvbmFsaXR5LXJlZHVjZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLHFCQUFxQixFQUFlLE1BQU0sMEJBQTBCLENBQUM7QUFHN0U7Ozs7Ozs7OztHQVNHO0FBQ0gsS0FBSyxVQUFVLFNBQVMsQ0FBQyxVQUFpQixFQUFFLE1BQW9CLEVBQUUsT0FBcUIsRUFDckYsT0FBYSxFQUFFLHVCQUFpQztJQUNoRCxNQUFNLE9BQU8sR0FBRyxJQUFJLHFCQUFxQixDQUN2QyxVQUFVLEVBQ1YsTUFBTSxFQUNOLE9BQU8sRUFDUCxPQUFPLENBQ1IsQ0FBQztJQUNGLE9BQU8sTUFBTSxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO0FBQ2hFLENBQUM7QUFFRCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssRUFBRSxFQUFDLElBQUksRUFBRSxFQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSx1QkFBdUIsRUFBQyxFQUFDLEVBQUUsRUFBRTtJQUNqRyxJQUFJLElBQW9ELENBQUM7SUFDekQsSUFBSTtRQUNGLElBQUksR0FBRyxNQUFNLFNBQVMsQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztLQUN2RjtJQUFDLE9BQU8sQ0FBTSxFQUFFO1FBQ2YsSUFBSSxHQUFHLEVBQUMsS0FBSyxFQUFFLENBQUMsRUFBQyxDQUFDO0tBQ25CO0lBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUNmLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztRQUNqQixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7UUFDdkIsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO0tBQzFCLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RGltZW5zaW9uYWxpdHlSZWR1Y2VyLCBLbm93bk1ldGhvZHN9IGZyb20gJy4uL3JlZHVjZS1kaW1lbnNpb25hbGl0eSc7XG5pbXBvcnQge0tub3duTWV0cmljc30gZnJvbSAnLi4vdHlwZWQtbWV0cmljcy90eXBlZC1tZXRyaWNzJztcblxuLyoqXG4gKiBXb3JrZXIgdGhyZWFkIHJlY2VpdmluZyBkYXRhIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7YW55W119IGNvbHVtbkRhdGEgU2FtcGxlcyB0byBwcm9jZXNzLlxuICogQHBhcmFtIHtLbm93bk1ldGhvZHN9IG1ldGhvZCBFbWJlZGRpbmcgbWV0aG9kLlxuICogQHBhcmFtIHtLbm93bk1ldHJpY3N9IG1lYXN1cmUgRGlzdGFuY2UgbWV0cmljLlxuICogQHBhcmFtIHthbnl9IG9wdGlvbnMgT3B0aW9ucyB0byBwYXNzIHRvIGFsZ29yaXRobS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gcGFyYWxsZWxEaXN0YW5jZVdvcmtlcnMgV2hldGhlciB0byB1c2UgcGFyYWxsZWwgZGlzdGFuY2Ugd29ya2Vycy5cbiAqIEByZXR1cm4ge2FueX0gRW1iZWRkaW5nIChhbmQgZGlzdGFuY2UgbWF0cml4IHdoZXJlIGFwcGxpY2FibGUpLlxuICovXG5hc3luYyBmdW5jdGlvbiBvbk1lc3NhZ2UoY29sdW1uRGF0YTogYW55W10sIG1ldGhvZDogS25vd25NZXRob2RzLCBtZWFzdXJlOiBLbm93bk1ldHJpY3MsXG4gIG9wdGlvbnM/OiBhbnksIHBhcmFsbGVsRGlzdGFuY2VXb3JrZXJzPzogYm9vbGVhbik6IFByb21pc2U8e2Rpc3RhbmNlPzogYW55LCBlbWJlZGRpbmc/OiBhbnl9PiB7XG4gIGNvbnN0IHJlZHVjZXIgPSBuZXcgRGltZW5zaW9uYWxpdHlSZWR1Y2VyKFxuICAgIGNvbHVtbkRhdGEsXG4gICAgbWV0aG9kLFxuICAgIG1lYXN1cmUsXG4gICAgb3B0aW9ucyxcbiAgKTtcbiAgcmV0dXJuIGF3YWl0IHJlZHVjZXIudHJhbnNmb3JtKHRydWUsIHBhcmFsbGVsRGlzdGFuY2VXb3JrZXJzKTtcbn1cblxuc2VsZi5vbm1lc3NhZ2UgPSBhc3luYyAoe2RhdGE6IHtjb2x1bW5EYXRhLCBtZXRob2QsIG1lYXN1cmUsIG9wdGlvbnMsIHBhcmFsbGVsRGlzdGFuY2VXb3JrZXJzfX0pID0+IHtcbiAgbGV0IGRhdGE6IHtlcnJvcj86IGFueSwgZGlzdGFuY2U/OiBhbnksIGVtYmVkZGluZz86IGFueX07XG4gIHRyeSB7XG4gICAgZGF0YSA9IGF3YWl0IG9uTWVzc2FnZShjb2x1bW5EYXRhLCBtZXRob2QsIG1lYXN1cmUsIG9wdGlvbnMsIHBhcmFsbGVsRGlzdGFuY2VXb3JrZXJzKTtcbiAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgZGF0YSA9IHtlcnJvcjogZX07XG4gIH1cbiAgc2VsZi5wb3N0TWVzc2FnZSh7XG4gICAgZXJyb3I6IGRhdGEuZXJyb3IsXG4gICAgZGlzdGFuY2U6IGRhdGEuZGlzdGFuY2UsXG4gICAgZW1iZWRkaW5nOiBkYXRhLmVtYmVkZGluZyxcbiAgfSk7XG59O1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TSNE = void 0;\nvar tsne_1 = require(\"./tsne\");\nObject.defineProperty(exports, \"TSNE\", { enumerable: true, get: function () { return tsne_1.TSNE; } });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TSNE = void 0;\nclass TSNE {\n constructor(opt) {\n // return 0 mean unit standard deviation random number\n this.returnV = false;\n this.vValue = 0.0;\n this.iter = 0;\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 }\n assert(condition, message) {\n if (!condition) {\n throw message || 'Assertion failed';\n }\n }\n // syntax sugar\n getopt(opt, field, defaultval) {\n if (opt.hasOwnProperty(field)) {\n return opt[field];\n }\n else {\n return defaultval;\n }\n }\n gaussRandom() {\n if (this.returnV) {\n this.returnV = false;\n return this.vValue;\n }\n const u = 2 * Math.random() - 1;\n const v = 2 * Math.random() - 1;\n const r = u * u + v * v;\n if (r === 0 || r > 1) {\n return this.gaussRandom();\n }\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) { return mu + this.gaussRandom() * std; }\n // utilitity that creates contiguous vector of zeros of size n\n zeros(n) {\n if (typeof (n) === 'undefined' || isNaN(n)) {\n return [];\n }\n if (typeof ArrayBuffer === 'undefined') {\n // lacking browser support\n const arr = new Array(n);\n for (let i = 0; i < n; i++) {\n arr[i] = 0;\n }\n return arr;\n }\n else {\n return new Float64Array(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 = [];\n for (let i = 0; i < n; i++) {\n const xhere = [];\n for (let j = 0; j < d; j++) {\n if (uses) {\n xhere.push(s);\n }\n else {\n xhere.push(this.randn(0.0, 1e-4));\n }\n }\n x.push(xhere);\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 // compute (p_{i|j} + p_{j|i})/(2n)\n d2p(D, perplexity, tol) {\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 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 = 50;\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 let pj = Math.exp(-D[i * n + j] * beta);\n if (i === j) {\n pj = 0;\n } // we dont care about diagonals\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 }\n else {\n pj = prow[j] / psum;\n }\n prow[j] = pj;\n if (pj > 1e-7) {\n nHere -= pj * Math.log(pj);\n }\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 }\n else {\n beta = (beta + betamax) / 2;\n }\n }\n else {\n // converse case. make distrubtion less peaky\n betamax = beta;\n if (betamin === -Infinity) {\n beta = beta / 2;\n }\n else {\n beta = (beta + betamin) / 2;\n }\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 }\n if (num >= maxtries) {\n done = true;\n }\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 }\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 }\n return pOut;\n }\n // helper function\n sign(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; }\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); // 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) {\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 const dists = 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 = D[i][j];\n dists[i * N + j] = d;\n dists[j * N + i] = d;\n }\n }\n this.P = this.d2p(dists, this.perplexity, 1e-4);\n this.N = N;\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;\n } // 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 }\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 // 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 const 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 let dsum = 0.0;\n for (let d = 0; d < dim; d++) {\n const dhere = Y[i][d] - Y[j][d];\n dsum += dhere * dhere;\n }\n const qu = 1.0 / (1.0 + dsum); // Student t-distribution\n quArr[i * N + j] = qu;\n 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 for (let q = 0; q < NN; q++) {\n Q[q] = Math.max(quArr[q] / qsum, 1e-100);\n }\n let cost = 0.0;\n const grad = [];\n for (let i = 0; i < N; i++) {\n const gsum = new Array(dim); // init grad for point i\n for (let d = 0; d < dim; d++) {\n gsum[d] = 0.0;\n }\n for (let j = 0; j < N; j++) {\n cost += -P[i * N + j] * Math.log(Q[i * N + j]); // accumulate cost (the non-constant portion at least...)\n const premult = 4 * (pmul * P[i * N + j] - Q[i * N + j]) * quArr[i * N + j];\n for (let d = 0; d < dim; d++) {\n gsum[d] += premult * (Y[i][d] - Y[j][d]);\n }\n }\n grad.push(gsum);\n }\n return { cost, grad };\n }\n}\nexports.TSNE = TSNE;\n","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","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","\"use strict\";\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n result[\"default\"] = mod;\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils = __importStar(require(\"./utils\"));\nfunction makeHeap(nPoints, size) {\n var makeArrays = function (fillValue) {\n return utils.empty(nPoints).map(function () {\n return utils.filled(size, fillValue);\n });\n };\n var heap = [];\n heap.push(makeArrays(-1));\n heap.push(makeArrays(Infinity));\n heap.push(makeArrays(0));\n return heap;\n}\nexports.makeHeap = makeHeap;\nfunction rejectionSample(nSamples, poolSize, random) {\n var result = utils.zeros(nSamples);\n for (var i = 0; i < nSamples; i++) {\n var rejectSample = true;\n var j = 0;\n while (rejectSample) {\n j = utils.tauRandInt(poolSize, random);\n var broken = false;\n for (var 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}\nexports.rejectionSample = rejectionSample;\nfunction heapPush(heap, row, weight, index, flag) {\n row = Math.floor(row);\n var indices = heap[0][row];\n var weights = heap[1][row];\n var isNew = heap[2][row];\n if (weight >= weights[0]) {\n return 0;\n }\n for (var i = 0; i < indices.length; i++) {\n if (index === indices[i]) {\n return 0;\n }\n }\n return uncheckedHeapPush(heap, row, weight, index, flag);\n}\nexports.heapPush = heapPush;\nfunction uncheckedHeapPush(heap, row, weight, index, flag) {\n var indices = heap[0][row];\n var weights = heap[1][row];\n var isNew = heap[2][row];\n if (weight >= weights[0]) {\n return 0;\n }\n weights[0] = weight;\n indices[0] = index;\n isNew[0] = flag;\n var i = 0;\n var iSwap = 0;\n while (true) {\n var ic1 = 2 * i + 1;\n var ic2 = ic1 + 1;\n var 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 }\n else {\n break;\n }\n }\n else if (weights[ic1] >= weights[ic2]) {\n if (weight < weights[ic1]) {\n iSwap = ic1;\n }\n else {\n break;\n }\n }\n else {\n if (weight < weights[ic2]) {\n iSwap = ic2;\n }\n else {\n break;\n }\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}\nexports.uncheckedHeapPush = uncheckedHeapPush;\nfunction buildCandidates(currentGraph, nVertices, nNeighbors, maxCandidates, random) {\n var candidateNeighbors = makeHeap(nVertices, maxCandidates);\n for (var i = 0; i < nVertices; i++) {\n for (var j = 0; j < nNeighbors; j++) {\n if (currentGraph[0][i][j] < 0) {\n continue;\n }\n var idx = currentGraph[0][i][j];\n var isn = currentGraph[2][i][j];\n var 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}\nexports.buildCandidates = buildCandidates;\nfunction deheapSort(heap) {\n var indices = heap[0];\n var weights = heap[1];\n for (var i = 0; i < indices.length; i++) {\n var indHeap = indices[i];\n var distHeap = weights[i];\n for (var j = 0; j < indHeap.length - 1; j++) {\n var indHeapIndex = indHeap.length - j - 1;\n var distHeapIndex = distHeap.length - j - 1;\n var temp1 = indHeap[0];\n indHeap[0] = indHeap[indHeapIndex];\n indHeap[indHeapIndex] = temp1;\n var temp2 = distHeap[0];\n distHeap[0] = distHeap[distHeapIndex];\n distHeap[distHeapIndex] = temp2;\n siftDown(distHeap, indHeap, distHeapIndex, 0);\n }\n }\n return { indices: indices, weights: weights };\n}\nexports.deheapSort = deheapSort;\nfunction siftDown(heap1, heap2, ceiling, elt) {\n while (elt * 2 + 1 < ceiling) {\n var leftChild = elt * 2 + 1;\n var rightChild = leftChild + 1;\n var swap = elt;\n if (heap1[swap] < heap1[leftChild]) {\n swap = leftChild;\n }\n if (rightChild < ceiling && heap1[swap] < heap1[rightChild]) {\n swap = rightChild;\n }\n if (swap === elt) {\n break;\n }\n else {\n var temp1 = heap1[elt];\n heap1[elt] = heap1[swap];\n heap1[swap] = temp1;\n var temp2 = heap2[elt];\n heap2[elt] = heap2[swap];\n heap2[swap] = temp2;\n elt = swap;\n }\n }\n}\nfunction smallestFlagged(heap, row) {\n var ind = heap[0][row];\n var dist = heap[1][row];\n var flag = heap[2][row];\n var minDist = Infinity;\n var resultIndex = -1;\n for (var 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}\nexports.smallestFlagged = smallestFlagged;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar umap_1 = require(\"./umap\");\nexports.UMAP = umap_1.UMAP;\n","\"use strict\";\nvar __read = (this && this.__read) || function (o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n};\nvar __values = (this && this.__values) || function (o) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator], i = 0;\n if (m) return m.call(o);\n return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n};\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n result[\"default\"] = mod;\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar _a;\nvar utils = __importStar(require(\"./utils\"));\nvar SparseMatrix = (function () {\n function SparseMatrix(rows, cols, values, dims) {\n this.entries = new Map();\n this.nRows = 0;\n this.nCols = 0;\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 this.nRows = dims[0];\n this.nCols = dims[1];\n for (var i = 0; i < values.length; i++) {\n var row = rows[i];\n var col = cols[i];\n this.checkDims(row, col);\n var key = this.makeKey(row, col);\n this.entries.set(key, { value: values[i], row: row, col: col });\n }\n }\n SparseMatrix.prototype.makeKey = function (row, col) {\n return row + \":\" + col;\n };\n SparseMatrix.prototype.checkDims = function (row, col) {\n var 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 };\n SparseMatrix.prototype.set = function (row, col, value) {\n this.checkDims(row, col);\n var key = this.makeKey(row, col);\n if (!this.entries.has(key)) {\n this.entries.set(key, { value: value, row: row, col: col });\n }\n else {\n this.entries.get(key).value = value;\n }\n };\n SparseMatrix.prototype.get = function (row, col, defaultValue) {\n if (defaultValue === void 0) { defaultValue = 0; }\n this.checkDims(row, col);\n var key = this.makeKey(row, col);\n if (this.entries.has(key)) {\n return this.entries.get(key).value;\n }\n else {\n return defaultValue;\n }\n };\n SparseMatrix.prototype.getAll = function (ordered) {\n if (ordered === void 0) { ordered = true; }\n var rowColValues = [];\n this.entries.forEach(function (value) {\n rowColValues.push(value);\n });\n if (ordered) {\n rowColValues.sort(function (a, b) {\n if (a.row === b.row) {\n return a.col - b.col;\n }\n else {\n return a.row - b.row;\n }\n });\n }\n return rowColValues;\n };\n SparseMatrix.prototype.getDims = function () {\n return [this.nRows, this.nCols];\n };\n SparseMatrix.prototype.getRows = function () {\n return Array.from(this.entries, function (_a) {\n var _b = __read(_a, 2), key = _b[0], value = _b[1];\n return value.row;\n });\n };\n SparseMatrix.prototype.getCols = function () {\n return Array.from(this.entries, function (_a) {\n var _b = __read(_a, 2), key = _b[0], value = _b[1];\n return value.col;\n });\n };\n SparseMatrix.prototype.getValues = function () {\n return Array.from(this.entries, function (_a) {\n var _b = __read(_a, 2), key = _b[0], value = _b[1];\n return value.value;\n });\n };\n SparseMatrix.prototype.forEach = function (fn) {\n this.entries.forEach(function (value) { return fn(value.value, value.row, value.col); });\n };\n SparseMatrix.prototype.map = function (fn) {\n var vals = [];\n this.entries.forEach(function (value) {\n vals.push(fn(value.value, value.row, value.col));\n });\n var dims = [this.nRows, this.nCols];\n return new SparseMatrix(this.getRows(), this.getCols(), vals, dims);\n };\n SparseMatrix.prototype.toArray = function () {\n var _this = this;\n var rows = utils.empty(this.nRows);\n var output = rows.map(function () {\n return utils.zeros(_this.nCols);\n });\n this.entries.forEach(function (value) {\n output[value.row][value.col] = value.value;\n });\n return output;\n };\n return SparseMatrix;\n}());\nexports.SparseMatrix = SparseMatrix;\nfunction transpose(matrix) {\n var cols = [];\n var rows = [];\n var vals = [];\n matrix.forEach(function (value, row, col) {\n cols.push(row);\n rows.push(col);\n vals.push(value);\n });\n var dims = [matrix.nCols, matrix.nRows];\n return new SparseMatrix(rows, cols, vals, dims);\n}\nexports.transpose = transpose;\nfunction identity(size) {\n var _a = __read(size, 1), rows = _a[0];\n var matrix = new SparseMatrix([], [], [], size);\n for (var i = 0; i < rows; i++) {\n matrix.set(i, i, 1);\n }\n return matrix;\n}\nexports.identity = identity;\nfunction pairwiseMultiply(a, b) {\n return elementWise(a, b, function (x, y) { return x * y; });\n}\nexports.pairwiseMultiply = pairwiseMultiply;\nfunction add(a, b) {\n return elementWise(a, b, function (x, y) { return x + y; });\n}\nexports.add = add;\nfunction subtract(a, b) {\n return elementWise(a, b, function (x, y) { return x - y; });\n}\nexports.subtract = subtract;\nfunction maximum(a, b) {\n return elementWise(a, b, function (x, y) { return (x > y ? x : y); });\n}\nexports.maximum = maximum;\nfunction multiplyScalar(a, scalar) {\n return a.map(function (value) {\n return value * scalar;\n });\n}\nexports.multiplyScalar = multiplyScalar;\nfunction eliminateZeros(m) {\n var zeroIndices = new Set();\n var values = m.getValues();\n var rows = m.getRows();\n var cols = m.getCols();\n for (var i = 0; i < values.length; i++) {\n if (values[i] === 0) {\n zeroIndices.add(i);\n }\n }\n var removeByZeroIndex = function (_, index) { return !zeroIndices.has(index); };\n var nextValues = values.filter(removeByZeroIndex);\n var nextRows = rows.filter(removeByZeroIndex);\n var nextCols = cols.filter(removeByZeroIndex);\n return new SparseMatrix(nextRows, nextCols, nextValues, m.getDims());\n}\nexports.eliminateZeros = eliminateZeros;\nfunction normalize(m, normType) {\n if (normType === void 0) { normType = \"l2\"; }\n var e_1, _a;\n var normFn = normFns[normType];\n var colsByRow = new Map();\n m.forEach(function (_, row, col) {\n var cols = colsByRow.get(row) || [];\n cols.push(col);\n colsByRow.set(row, cols);\n });\n var nextMatrix = new SparseMatrix([], [], [], m.getDims());\n var _loop_1 = function (row) {\n var cols = colsByRow.get(row).sort();\n var vals = cols.map(function (col) { return m.get(row, col); });\n var norm = normFn(vals);\n for (var i = 0; i < norm.length; i++) {\n nextMatrix.set(row, cols[i], norm[i]);\n }\n };\n try {\n for (var _b = __values(colsByRow.keys()), _c = _b.next(); !_c.done; _c = _b.next()) {\n var row = _c.value;\n _loop_1(row);\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n }\n finally { if (e_1) throw e_1.error; }\n }\n return nextMatrix;\n}\nexports.normalize = normalize;\nvar normFns = (_a = {},\n _a[\"max\"] = function (xs) {\n var max = -Infinity;\n for (var i = 0; i < xs.length; i++) {\n max = xs[i] > max ? xs[i] : max;\n }\n return xs.map(function (x) { return x / max; });\n },\n _a[\"l1\"] = function (xs) {\n var sum = 0;\n for (var i = 0; i < xs.length; i++) {\n sum += xs[i];\n }\n return xs.map(function (x) { return x / sum; });\n },\n _a[\"l2\"] = function (xs) {\n var sum = 0;\n for (var i = 0; i < xs.length; i++) {\n sum += Math.pow(xs[i], 2);\n }\n return xs.map(function (x) { return Math.sqrt(Math.pow(x, 2) / sum); });\n },\n _a);\nfunction elementWise(a, b, op) {\n var visited = new Set();\n var rows = [];\n var cols = [];\n var vals = [];\n var operate = function (row, col) {\n rows.push(row);\n cols.push(col);\n var nextValue = op(a.get(row, col), b.get(row, col));\n vals.push(nextValue);\n };\n var valuesA = a.getValues();\n var rowsA = a.getRows();\n var colsA = a.getCols();\n for (var i = 0; i < valuesA.length; i++) {\n var row = rowsA[i];\n var col = colsA[i];\n var key = row + \":\" + col;\n visited.add(key);\n operate(row, col);\n }\n var valuesB = b.getValues();\n var rowsB = b.getRows();\n var colsB = b.getCols();\n for (var i = 0; i < valuesB.length; i++) {\n var row = rowsB[i];\n var col = colsB[i];\n var key = row + \":\" + col;\n if (visited.has(key))\n continue;\n operate(row, col);\n }\n var dims = [a.nRows, a.nCols];\n return new SparseMatrix(rows, cols, vals, dims);\n}\nfunction getCSR(x) {\n var entries = [];\n x.forEach(function (value, row, col) {\n entries.push({ value: value, row: row, col: col });\n });\n entries.sort(function (a, b) {\n if (a.row === b.row) {\n return a.col - b.col;\n }\n else {\n return a.row - b.row;\n }\n });\n var indices = [];\n var values = [];\n var indptr = [];\n var currentRow = -1;\n for (var i = 0; i < entries.length; i++) {\n var _a = entries[i], row = _a.row, col = _a.col, value = _a.value;\n if (row !== currentRow) {\n currentRow = row;\n indptr.push(i);\n }\n indices.push(col);\n values.push(value);\n }\n return { indices: indices, values: values, indptr: indptr };\n}\nexports.getCSR = getCSR;\n","\"use strict\";\nvar __values = (this && this.__values) || function (o) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator], i = 0;\n if (m) return m.call(o);\n return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n};\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n result[\"default\"] = mod;\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar heap = __importStar(require(\"./heap\"));\nvar matrix = __importStar(require(\"./matrix\"));\nvar tree = __importStar(require(\"./tree\"));\nvar utils = __importStar(require(\"./utils\"));\nfunction makeNNDescent(distanceFn, random) {\n return function nNDescent(data, leafArray, nNeighbors, nIters, maxCandidates, delta, rho, rpTreeInit) {\n if (nIters === void 0) { nIters = 10; }\n if (maxCandidates === void 0) { maxCandidates = 50; }\n if (delta === void 0) { delta = 0.001; }\n if (rho === void 0) { rho = 0.5; }\n if (rpTreeInit === void 0) { rpTreeInit = true; }\n var nVertices = data.length;\n var currentGraph = heap.makeHeap(data.length, nNeighbors);\n for (var i = 0; i < data.length; i++) {\n var indices = heap.rejectionSample(nNeighbors, data.length, random);\n for (var j = 0; j < indices.length; j++) {\n var 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 (var n = 0; n < leafArray.length; n++) {\n for (var i = 0; i < leafArray[n].length; i++) {\n if (leafArray[n][i] < 0) {\n break;\n }\n for (var j = i + 1; j < leafArray[n].length; j++) {\n if (leafArray[n][j] < 0) {\n break;\n }\n var 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 (var n = 0; n < nIters; n++) {\n var candidateNeighbors = heap.buildCandidates(currentGraph, nVertices, nNeighbors, maxCandidates, random);\n var c = 0;\n for (var i = 0; i < nVertices; i++) {\n for (var j = 0; j < maxCandidates; j++) {\n var p = Math.floor(candidateNeighbors[0][i][j]);\n if (p < 0 || utils.tauRand(random) < rho) {\n continue;\n }\n for (var k = 0; k < maxCandidates; k++) {\n var q = Math.floor(candidateNeighbors[0][i][k]);\n var cj = candidateNeighbors[2][i][j];\n var ck = candidateNeighbors[2][i][k];\n if (q < 0 || (!cj && !ck)) {\n continue;\n }\n var 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 }\n var sorted = heap.deheapSort(currentGraph);\n return sorted;\n };\n}\nexports.makeNNDescent = makeNNDescent;\nfunction makeInitializations(distanceFn) {\n function initFromRandom(nNeighbors, data, queryPoints, _heap, random) {\n for (var i = 0; i < queryPoints.length; i++) {\n var indices = utils.rejectionSample(nNeighbors, data.length, random);\n for (var j = 0; j < indices.length; j++) {\n if (indices[j] < 0) {\n continue;\n }\n var 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 (var i = 0; i < queryPoints.length; i++) {\n var indices = tree.searchFlatTree(queryPoints[i], _tree, random);\n for (var j = 0; j < indices.length; j++) {\n if (indices[j] < 0) {\n return;\n }\n var d = distanceFn(data[indices[j]], queryPoints[i]);\n heap.heapPush(_heap, i, d, indices[j], 1);\n }\n }\n return;\n }\n return { initFromRandom: initFromRandom, initFromTree: initFromTree };\n}\nexports.makeInitializations = makeInitializations;\nfunction makeInitializedNNSearch(distanceFn) {\n return function nnSearchFn(data, graph, initialization, queryPoints) {\n var e_1, _a;\n var _b = matrix.getCSR(graph), indices = _b.indices, indptr = _b.indptr;\n for (var i = 0; i < queryPoints.length; i++) {\n var tried = new Set(initialization[0][i]);\n while (true) {\n var vertex = heap.smallestFlagged(initialization, i);\n if (vertex === -1) {\n break;\n }\n var candidates = indices.slice(indptr[vertex], indptr[vertex + 1]);\n try {\n for (var candidates_1 = __values(candidates), candidates_1_1 = candidates_1.next(); !candidates_1_1.done; candidates_1_1 = candidates_1.next()) {\n var candidate = candidates_1_1.value;\n if (candidate === vertex ||\n candidate === -1 ||\n tried.has(candidate)) {\n continue;\n }\n var d = distanceFn(data[candidate], queryPoints[i]);\n heap.uncheckedHeapPush(initialization, i, d, candidate, 1);\n tried.add(candidate);\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (candidates_1_1 && !candidates_1_1.done && (_a = candidates_1.return)) _a.call(candidates_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n }\n }\n return initialization;\n };\n}\nexports.makeInitializedNNSearch = makeInitializedNNSearch;\nfunction initializeSearch(forest, data, queryPoints, nNeighbors, initFromRandom, initFromTree, random) {\n var e_2, _a;\n var results = heap.makeHeap(queryPoints.length, nNeighbors);\n initFromRandom(nNeighbors, data, queryPoints, results, random);\n if (forest) {\n try {\n for (var forest_1 = __values(forest), forest_1_1 = forest_1.next(); !forest_1_1.done; forest_1_1 = forest_1.next()) {\n var tree_1 = forest_1_1.value;\n initFromTree(tree_1, data, queryPoints, results, random);\n }\n }\n catch (e_2_1) { e_2 = { error: e_2_1 }; }\n finally {\n try {\n if (forest_1_1 && !forest_1_1.done && (_a = forest_1.return)) _a.call(forest_1);\n }\n finally { if (e_2) throw e_2.error; }\n }\n }\n return results;\n}\nexports.initializeSearch = initializeSearch;\n","\"use strict\";\nvar __read = (this && this.__read) || function (o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n};\nvar __spread = (this && this.__spread) || function () {\n for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i]));\n return ar;\n};\nvar __values = (this && this.__values) || function (o) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator], i = 0;\n if (m) return m.call(o);\n return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n};\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n result[\"default\"] = mod;\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils = __importStar(require(\"./utils\"));\nvar FlatTree = (function () {\n function FlatTree(hyperplanes, offsets, children, indices) {\n this.hyperplanes = hyperplanes;\n this.offsets = offsets;\n this.children = children;\n this.indices = indices;\n }\n return FlatTree;\n}());\nexports.FlatTree = FlatTree;\nfunction makeForest(data, nNeighbors, nTrees, random) {\n var leafSize = Math.max(10, nNeighbors);\n var trees = utils\n .range(nTrees)\n .map(function (_, i) { return makeTree(data, leafSize, i, random); });\n var forest = trees.map(function (tree) { return flattenTree(tree, leafSize); });\n return forest;\n}\nexports.makeForest = makeForest;\nfunction makeTree(data, leafSize, n, random) {\n if (leafSize === void 0) { leafSize = 30; }\n var indices = utils.range(data.length);\n var tree = makeEuclideanTree(data, indices, leafSize, n, random);\n return tree;\n}\nfunction makeEuclideanTree(data, indices, leafSize, q, random) {\n if (leafSize === void 0) { leafSize = 30; }\n if (indices.length > leafSize) {\n var splitResults = euclideanRandomProjectionSplit(data, indices, random);\n var indicesLeft = splitResults.indicesLeft, indicesRight = splitResults.indicesRight, hyperplane = splitResults.hyperplane, offset = splitResults.offset;\n var leftChild = makeEuclideanTree(data, indicesLeft, leafSize, q + 1, random);\n var rightChild = makeEuclideanTree(data, indicesRight, leafSize, q + 1, random);\n var node = { leftChild: leftChild, rightChild: rightChild, isLeaf: false, hyperplane: hyperplane, offset: offset };\n return node;\n }\n else {\n var node = { indices: indices, isLeaf: true };\n return node;\n }\n}\nfunction euclideanRandomProjectionSplit(data, indices, random) {\n var dim = data[0].length;\n var leftIndex = utils.tauRandInt(indices.length, random);\n var rightIndex = utils.tauRandInt(indices.length, random);\n rightIndex += leftIndex === rightIndex ? 1 : 0;\n rightIndex = rightIndex % indices.length;\n var left = indices[leftIndex];\n var right = indices[rightIndex];\n var hyperplaneOffset = 0;\n var hyperplaneVector = utils.zeros(dim);\n for (var i = 0; i < hyperplaneVector.length; i++) {\n hyperplaneVector[i] = data[left][i] - data[right][i];\n hyperplaneOffset -=\n (hyperplaneVector[i] * (data[left][i] + data[right][i])) / 2.0;\n }\n var nLeft = 0;\n var nRight = 0;\n var side = utils.zeros(indices.length);\n for (var i = 0; i < indices.length; i++) {\n var margin = hyperplaneOffset;\n for (var d = 0; d < dim; d++) {\n margin += hyperplaneVector[d] * data[indices[i]][d];\n }\n if (margin === 0) {\n side[i] = utils.tauRandInt(2, random);\n if (side[i] === 0) {\n nLeft += 1;\n }\n else {\n nRight += 1;\n }\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 var indicesLeft = utils.zeros(nLeft);\n var indicesRight = utils.zeros(nRight);\n nLeft = 0;\n nRight = 0;\n for (var 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: indicesLeft,\n indicesRight: indicesRight,\n hyperplane: hyperplaneVector,\n offset: hyperplaneOffset,\n };\n}\nfunction flattenTree(tree, leafSize) {\n var nNodes = numNodes(tree);\n var nLeaves = numLeaves(tree);\n var hyperplanes = utils\n .range(nNodes)\n .map(function () { return utils.zeros(tree.hyperplane ? tree.hyperplane.length : 0); });\n var offsets = utils.zeros(nNodes);\n var children = utils.range(nNodes).map(function () { return [-1, -1]; });\n var indices = utils\n .range(nLeaves)\n .map(function () { return utils.range(leafSize).map(function () { return -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 var _a;\n if (tree.isLeaf) {\n children[nodeNum][0] = -leafNum;\n (_a = indices[leafNum]).splice.apply(_a, __spread([0, tree.indices.length], tree.indices));\n leafNum += 1;\n return { nodeNum: nodeNum, leafNum: leafNum };\n }\n else {\n hyperplanes[nodeNum] = tree.hyperplane;\n offsets[nodeNum] = tree.offset;\n children[nodeNum][0] = nodeNum + 1;\n var oldNodeNum = nodeNum;\n var 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 }\n else {\n return 1 + numNodes(tree.leftChild) + numNodes(tree.rightChild);\n }\n}\nfunction numLeaves(tree) {\n if (tree.isLeaf) {\n return 1;\n }\n else {\n return numLeaves(tree.leftChild) + numLeaves(tree.rightChild);\n }\n}\nfunction makeLeafArray(rpForest) {\n var e_1, _a;\n if (rpForest.length > 0) {\n var output = [];\n try {\n for (var rpForest_1 = __values(rpForest), rpForest_1_1 = rpForest_1.next(); !rpForest_1_1.done; rpForest_1_1 = rpForest_1.next()) {\n var tree = rpForest_1_1.value;\n output.push.apply(output, __spread(tree.indices));\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (rpForest_1_1 && !rpForest_1_1.done && (_a = rpForest_1.return)) _a.call(rpForest_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n return output;\n }\n else {\n return [[-1]];\n }\n}\nexports.makeLeafArray = makeLeafArray;\nfunction selectSide(hyperplane, offset, point, random) {\n var margin = offset;\n for (var d = 0; d < point.length; d++) {\n margin += hyperplane[d] * point[d];\n }\n if (margin === 0) {\n var 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}\nfunction searchFlatTree(point, tree, random) {\n var node = 0;\n while (tree.children[node][0] > 0) {\n var side = selectSide(tree.hyperplanes[node], tree.offsets[node], point, random);\n if (side === 0) {\n node = tree.children[node][0];\n }\n else {\n node = tree.children[node][1];\n }\n }\n var index = -1 * tree.children[node][0];\n return tree.indices[index];\n}\nexports.searchFlatTree = searchFlatTree;\n","\"use strict\";\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __generator = (this && this.__generator) || function (thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (_) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n};\nvar __read = (this && this.__read) || function (o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n};\nvar __spread = (this && this.__spread) || function () {\n for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i]));\n return ar;\n};\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n result[\"default\"] = mod;\n return result;\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar heap = __importStar(require(\"./heap\"));\nvar matrix = __importStar(require(\"./matrix\"));\nvar nnDescent = __importStar(require(\"./nn_descent\"));\nvar tree = __importStar(require(\"./tree\"));\nvar utils = __importStar(require(\"./utils\"));\nvar ml_levenberg_marquardt_1 = __importDefault(require(\"ml-levenberg-marquardt\"));\nvar SMOOTH_K_TOLERANCE = 1e-5;\nvar MIN_K_DIST_SCALE = 1e-3;\nvar UMAP = (function () {\n function UMAP(params) {\n if (params === void 0) { params = {}; }\n var _this = this;\n this.learningRate = 1.0;\n this.localConnectivity = 1.0;\n this.minDist = 0.1;\n this.nComponents = 2;\n this.nEpochs = 0;\n this.nNeighbors = 15;\n this.negativeSampleRate = 5;\n this.random = Math.random;\n this.repulsionStrength = 1.0;\n this.setOpMixRatio = 1.0;\n this.spread = 1.0;\n this.transformQueueSize = 4.0;\n this.targetMetric = \"categorical\";\n this.targetWeight = 0.5;\n this.targetNNeighbors = this.nNeighbors;\n this.distanceFn = euclidean;\n this.isInitialized = false;\n this.rpForest = [];\n this.embedding = [];\n this.optimizationState = new OptimizationState();\n var setParam = function (key) {\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 }\n UMAP.prototype.fit = function (X) {\n this.initializeFit(X);\n this.optimizeLayout();\n return this.embedding;\n };\n UMAP.prototype.fitAsync = function (X, callback) {\n if (callback === void 0) { callback = function () { return true; }; }\n return __awaiter(this, void 0, void 0, function () {\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n this.initializeFit(X);\n return [4, this.optimizeLayoutAsync(callback)];\n case 1:\n _a.sent();\n return [2, this.embedding];\n }\n });\n });\n };\n UMAP.prototype.setSupervisedProjection = function (Y, params) {\n if (params === void 0) { 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 UMAP.prototype.setPrecomputedKNN = function (knnIndices, knnDistances) {\n this.knnIndices = knnIndices;\n this.knnDistances = knnDistances;\n };\n UMAP.prototype.initializeFit = function (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 }\n if (this.X === X && this.isInitialized) {\n return this.getNEpochs();\n }\n this.X = X;\n if (!this.knnIndices && !this.knnDistances) {\n var 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 this.makeSearchFns();\n this.searchGraph = this.makeSearchGraph(X);\n this.processGraphForSupervisedProjection();\n var _a = this.initializeSimplicialSetEmbedding(), head = _a.head, tail = _a.tail, epochsPerSample = _a.epochsPerSample;\n this.optimizationState.head = head;\n this.optimizationState.tail = tail;\n this.optimizationState.epochsPerSample = epochsPerSample;\n this.initializeOptimization();\n this.prepareForOptimizationLoop();\n this.isInitialized = true;\n return this.getNEpochs();\n };\n UMAP.prototype.makeSearchFns = function () {\n var _a = nnDescent.makeInitializations(this.distanceFn), initFromTree = _a.initFromTree, initFromRandom = _a.initFromRandom;\n this.initFromTree = initFromTree;\n this.initFromRandom = initFromRandom;\n this.search = nnDescent.makeInitializedNNSearch(this.distanceFn);\n };\n UMAP.prototype.makeSearchGraph = function (X) {\n var knnIndices = this.knnIndices;\n var knnDistances = this.knnDistances;\n var dims = [X.length, X.length];\n var searchGraph = new matrix.SparseMatrix([], [], [], dims);\n for (var i = 0; i < knnIndices.length; i++) {\n var knn = knnIndices[i];\n var distances = knnDistances[i];\n for (var j = 0; j < knn.length; j++) {\n var neighbor = knn[j];\n var distance = distances[j];\n if (distance > 0) {\n searchGraph.set(i, neighbor, distance);\n }\n }\n }\n var transpose = matrix.transpose(searchGraph);\n return matrix.maximum(searchGraph, transpose);\n };\n UMAP.prototype.transform = function (toTransform) {\n var _this = this;\n var rawData = this.X;\n if (rawData === undefined || rawData.length === 0) {\n throw new Error('No data has been fit.');\n }\n var nNeighbors = Math.floor(this.nNeighbors * this.transformQueueSize);\n nNeighbors = Math.min(rawData.length, nNeighbors);\n var init = nnDescent.initializeSearch(this.rpForest, rawData, toTransform, nNeighbors, this.initFromRandom, this.initFromTree, this.random);\n var result = this.search(rawData, this.searchGraph, init, toTransform);\n var _a = heap.deheapSort(result), indices = _a.indices, distances = _a.weights;\n indices = indices.map(function (x) { return x.slice(0, _this.nNeighbors); });\n distances = distances.map(function (x) { return x.slice(0, _this.nNeighbors); });\n var adjustedLocalConnectivity = Math.max(0, this.localConnectivity - 1);\n var _b = this.smoothKNNDistance(distances, this.nNeighbors, adjustedLocalConnectivity), sigmas = _b.sigmas, rhos = _b.rhos;\n var _c = this.computeMembershipStrengths(indices, distances, sigmas, rhos), rows = _c.rows, cols = _c.cols, vals = _c.vals;\n var size = [toTransform.length, rawData.length];\n var graph = new matrix.SparseMatrix(rows, cols, vals, size);\n var normed = matrix.normalize(graph, \"l1\");\n var csrMatrix = matrix.getCSR(normed);\n var nPoints = toTransform.length;\n var eIndices = utils.reshape2d(csrMatrix.indices, nPoints, this.nNeighbors);\n var eWeights = utils.reshape2d(csrMatrix.values, nPoints, this.nNeighbors);\n var embedding = initTransform(eIndices, eWeights, this.embedding);\n var nEpochs = this.nEpochs\n ? this.nEpochs / 3\n : graph.nRows <= 10000\n ? 100\n : 30;\n var graphMax = graph\n .getValues()\n .reduce(function (max, val) { return (val > max ? val : max); }, 0);\n graph = graph.map(function (value) { return (value < graphMax / nEpochs ? 0 : value); });\n graph = matrix.eliminateZeros(graph);\n var epochsPerSample = this.makeEpochsPerSample(graph.getValues(), nEpochs);\n var head = graph.getRows();\n var tail = graph.getCols();\n this.assignOptimizationStateParameters({\n headEmbedding: embedding,\n tailEmbedding: this.embedding,\n head: head,\n tail: tail,\n currentEpoch: 0,\n nEpochs: nEpochs,\n nVertices: graph.getDims()[1],\n epochsPerSample: epochsPerSample,\n });\n this.prepareForOptimizationLoop();\n return this.optimizeLayout();\n };\n UMAP.prototype.processGraphForSupervisedProjection = function () {\n var _a = this, Y = _a.Y, X = _a.X;\n if (Y) {\n if (Y.length !== X.length) {\n throw new Error('Length of X and y must be equal');\n }\n if (this.targetMetric === \"categorical\") {\n var lt = this.targetWeight < 1.0;\n var farDist = lt ? 2.5 * (1.0 / (1.0 - this.targetWeight)) : 1.0e12;\n this.graph = this.categoricalSimplicialSetIntersection(this.graph, Y, farDist);\n }\n }\n };\n UMAP.prototype.step = function () {\n var currentEpoch = this.optimizationState.currentEpoch;\n if (currentEpoch < this.getNEpochs()) {\n this.optimizeLayoutStep(currentEpoch);\n }\n return this.optimizationState.currentEpoch;\n };\n UMAP.prototype.getEmbedding = function () {\n return this.embedding;\n };\n UMAP.prototype.nearestNeighbors = function (X) {\n var _a = this, distanceFn = _a.distanceFn, nNeighbors = _a.nNeighbors;\n var log2 = function (n) { return Math.log(n) / Math.log(2); };\n var metricNNDescent = nnDescent.makeNNDescent(distanceFn, this.random);\n var round = function (n) {\n return n === 0.5 ? 0 : Math.round(n);\n };\n var nTrees = 5 + Math.floor(round(Math.pow(X.length, 0.5) / 20.0));\n var nIters = Math.max(5, Math.floor(Math.round(log2(X.length))));\n this.rpForest = tree.makeForest(X, nNeighbors, nTrees, this.random);\n var leafArray = tree.makeLeafArray(this.rpForest);\n var _b = metricNNDescent(X, leafArray, nNeighbors, nIters), indices = _b.indices, weights = _b.weights;\n return { knnIndices: indices, knnDistances: weights };\n };\n UMAP.prototype.fuzzySimplicialSet = function (X, nNeighbors, setOpMixRatio) {\n if (setOpMixRatio === void 0) { setOpMixRatio = 1.0; }\n var _a = this, _b = _a.knnIndices, knnIndices = _b === void 0 ? [] : _b, _c = _a.knnDistances, knnDistances = _c === void 0 ? [] : _c, localConnectivity = _a.localConnectivity;\n var _d = this.smoothKNNDistance(knnDistances, nNeighbors, localConnectivity), sigmas = _d.sigmas, rhos = _d.rhos;\n var _e = this.computeMembershipStrengths(knnIndices, knnDistances, sigmas, rhos), rows = _e.rows, cols = _e.cols, vals = _e.vals;\n var size = [X.length, X.length];\n var sparseMatrix = new matrix.SparseMatrix(rows, cols, vals, size);\n var transpose = matrix.transpose(sparseMatrix);\n var prodMatrix = matrix.pairwiseMultiply(sparseMatrix, transpose);\n var a = matrix.subtract(matrix.add(sparseMatrix, transpose), prodMatrix);\n var b = matrix.multiplyScalar(a, setOpMixRatio);\n var c = matrix.multiplyScalar(prodMatrix, 1.0 - setOpMixRatio);\n var result = matrix.add(b, c);\n return result;\n };\n UMAP.prototype.categoricalSimplicialSetIntersection = function (simplicialSet, target, farDist, unknownDist) {\n if (unknownDist === void 0) { unknownDist = 1.0; }\n var intersection = fastIntersection(simplicialSet, target, unknownDist, farDist);\n intersection = matrix.eliminateZeros(intersection);\n return resetLocalConnectivity(intersection);\n };\n UMAP.prototype.smoothKNNDistance = function (distances, k, localConnectivity, nIter, bandwidth) {\n if (localConnectivity === void 0) { localConnectivity = 1.0; }\n if (nIter === void 0) { nIter = 64; }\n if (bandwidth === void 0) { bandwidth = 1.0; }\n var target = (Math.log(k) / Math.log(2)) * bandwidth;\n var rho = utils.zeros(distances.length);\n var result = utils.zeros(distances.length);\n for (var i = 0; i < distances.length; i++) {\n var lo = 0.0;\n var hi = Infinity;\n var mid = 1.0;\n var ithDistances = distances[i];\n var nonZeroDists = ithDistances.filter(function (d) { return d > 0.0; });\n if (nonZeroDists.length >= localConnectivity) {\n var index = Math.floor(localConnectivity);\n var 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 (var n = 0; n < nIter; n++) {\n var psum = 0.0;\n for (var j = 1; j < distances[i].length; j++) {\n var d = distances[i][j] - rho[i];\n if (d > 0) {\n psum += Math.exp(-(d / mid));\n }\n else {\n psum += 1.0;\n }\n }\n if (Math.abs(psum - target) < SMOOTH_K_TOLERANCE) {\n break;\n }\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 }\n else {\n mid = (lo + hi) / 2.0;\n }\n }\n }\n result[i] = mid;\n if (rho[i] > 0.0) {\n var meanIthDistances = utils.mean(ithDistances);\n if (result[i] < MIN_K_DIST_SCALE * meanIthDistances) {\n result[i] = MIN_K_DIST_SCALE * meanIthDistances;\n }\n }\n else {\n var 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 }\n return { sigmas: result, rhos: rho };\n };\n UMAP.prototype.computeMembershipStrengths = function (knnIndices, knnDistances, sigmas, rhos) {\n var nSamples = knnIndices.length;\n var nNeighbors = knnIndices[0].length;\n var rows = utils.zeros(nSamples * nNeighbors);\n var cols = utils.zeros(nSamples * nNeighbors);\n var vals = utils.zeros(nSamples * nNeighbors);\n for (var i = 0; i < nSamples; i++) {\n for (var j = 0; j < nNeighbors; j++) {\n var val = 0;\n if (knnIndices[i][j] === -1) {\n continue;\n }\n if (knnIndices[i][j] === i) {\n val = 0.0;\n }\n else if (knnDistances[i][j] - rhos[i] <= 0.0) {\n val = 1.0;\n }\n else {\n val = Math.exp(-((knnDistances[i][j] - rhos[i]) / sigmas[i]));\n }\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: rows, cols: cols, vals: vals };\n };\n UMAP.prototype.initializeSimplicialSetEmbedding = function () {\n var _this = this;\n var nEpochs = this.getNEpochs();\n var nComponents = this.nComponents;\n var graphValues = this.graph.getValues();\n var graphMax = 0;\n for (var i = 0; i < graphValues.length; i++) {\n var value = graphValues[i];\n if (graphMax < graphValues[i]) {\n graphMax = value;\n }\n }\n var graph = this.graph.map(function (value) {\n if (value < graphMax / nEpochs) {\n return 0;\n }\n else {\n return value;\n }\n });\n this.embedding = utils.zeros(graph.nRows).map(function () {\n return utils.zeros(nComponents).map(function () {\n return utils.tauRand(_this.random) * 20 + -10;\n });\n });\n var weights = [];\n var head = [];\n var tail = [];\n var rowColValues = graph.getAll();\n for (var i = 0; i < rowColValues.length; i++) {\n var 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 var epochsPerSample = this.makeEpochsPerSample(weights, nEpochs);\n return { head: head, tail: tail, epochsPerSample: epochsPerSample };\n };\n UMAP.prototype.makeEpochsPerSample = function (weights, nEpochs) {\n var result = utils.filled(weights.length, -1.0);\n var max = utils.max(weights);\n var nSamples = weights.map(function (w) { return (w / max) * nEpochs; });\n nSamples.forEach(function (n, i) {\n if (n > 0)\n result[i] = nEpochs / nSamples[i];\n });\n return result;\n };\n UMAP.prototype.assignOptimizationStateParameters = function (state) {\n Object.assign(this.optimizationState, state);\n };\n UMAP.prototype.prepareForOptimizationLoop = function () {\n var _a = this, repulsionStrength = _a.repulsionStrength, learningRate = _a.learningRate, negativeSampleRate = _a.negativeSampleRate;\n var _b = this.optimizationState, epochsPerSample = _b.epochsPerSample, headEmbedding = _b.headEmbedding, tailEmbedding = _b.tailEmbedding;\n var dim = headEmbedding[0].length;\n var moveOther = headEmbedding.length === tailEmbedding.length;\n var epochsPerNegativeSample = epochsPerSample.map(function (e) { return e / negativeSampleRate; });\n var epochOfNextNegativeSample = __spread(epochsPerNegativeSample);\n var epochOfNextSample = __spread(epochsPerSample);\n this.assignOptimizationStateParameters({\n epochOfNextSample: epochOfNextSample,\n epochOfNextNegativeSample: epochOfNextNegativeSample,\n epochsPerNegativeSample: epochsPerNegativeSample,\n moveOther: moveOther,\n initialAlpha: learningRate,\n alpha: learningRate,\n gamma: repulsionStrength,\n dim: dim,\n });\n };\n UMAP.prototype.initializeOptimization = function () {\n var headEmbedding = this.embedding;\n var tailEmbedding = this.embedding;\n var _a = this.optimizationState, head = _a.head, tail = _a.tail, epochsPerSample = _a.epochsPerSample;\n var nEpochs = this.getNEpochs();\n var nVertices = this.graph.nCols;\n var _b = findABParams(this.spread, this.minDist), a = _b.a, b = _b.b;\n this.assignOptimizationStateParameters({\n headEmbedding: headEmbedding,\n tailEmbedding: tailEmbedding,\n head: head,\n tail: tail,\n epochsPerSample: epochsPerSample,\n a: a,\n b: b,\n nEpochs: nEpochs,\n nVertices: nVertices,\n });\n };\n UMAP.prototype.optimizeLayoutStep = function (n) {\n var optimizationState = this.optimizationState;\n var head = optimizationState.head, tail = optimizationState.tail, headEmbedding = optimizationState.headEmbedding, tailEmbedding = optimizationState.tailEmbedding, epochsPerSample = optimizationState.epochsPerSample, epochOfNextSample = optimizationState.epochOfNextSample, epochOfNextNegativeSample = optimizationState.epochOfNextNegativeSample, epochsPerNegativeSample = optimizationState.epochsPerNegativeSample, moveOther = optimizationState.moveOther, initialAlpha = optimizationState.initialAlpha, alpha = optimizationState.alpha, gamma = optimizationState.gamma, a = optimizationState.a, b = optimizationState.b, dim = optimizationState.dim, nEpochs = optimizationState.nEpochs, nVertices = optimizationState.nVertices;\n var clipValue = 4.0;\n for (var i = 0; i < epochsPerSample.length; i++) {\n if (epochOfNextSample[i] > n) {\n continue;\n }\n var j = head[i];\n var k = tail[i];\n var current = headEmbedding[j];\n var other = tailEmbedding[k];\n var distSquared = rDist(current, other);\n var 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 (var d = 0; d < dim; d++) {\n var gradD = clip(gradCoeff * (current[d] - other[d]), clipValue);\n current[d] += gradD * alpha;\n if (moveOther) {\n other[d] += -gradD * alpha;\n }\n }\n epochOfNextSample[i] += epochsPerSample[i];\n var nNegSamples = Math.floor((n - epochOfNextNegativeSample[i]) / epochsPerNegativeSample[i]);\n for (var p = 0; p < nNegSamples; p++) {\n var k_1 = utils.tauRandInt(nVertices, this.random);\n var other_1 = tailEmbedding[k_1];\n var distSquared_1 = rDist(current, other_1);\n var gradCoeff_1 = 0.0;\n if (distSquared_1 > 0.0) {\n gradCoeff_1 = 2.0 * gamma * b;\n gradCoeff_1 /=\n (0.001 + distSquared_1) * (a * Math.pow(distSquared_1, b) + 1);\n }\n else if (j === k_1) {\n continue;\n }\n for (var d = 0; d < dim; d++) {\n var gradD = 4.0;\n if (gradCoeff_1 > 0.0) {\n gradD = clip(gradCoeff_1 * (current[d] - other_1[d]), clipValue);\n }\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 UMAP.prototype.optimizeLayoutAsync = function (epochCallback) {\n var _this = this;\n if (epochCallback === void 0) { epochCallback = function () { return true; }; }\n return new Promise(function (resolve, reject) {\n var step = function () { return __awaiter(_this, void 0, void 0, function () {\n var _a, nEpochs, currentEpoch, epochCompleted, shouldStop, isFinished;\n return __generator(this, function (_b) {\n try {\n _a = this.optimizationState, nEpochs = _a.nEpochs, currentEpoch = _a.currentEpoch;\n this.embedding = this.optimizeLayoutStep(currentEpoch);\n epochCompleted = this.optimizationState.currentEpoch;\n shouldStop = epochCallback(epochCompleted) === false;\n isFinished = epochCompleted === nEpochs;\n if (!shouldStop && !isFinished) {\n setTimeout(function () { return step(); }, 0);\n }\n else {\n return [2, resolve(isFinished)];\n }\n }\n catch (err) {\n reject(err);\n }\n return [2];\n });\n }); };\n setTimeout(function () { return step(); }, 0);\n });\n };\n UMAP.prototype.optimizeLayout = function (epochCallback) {\n if (epochCallback === void 0) { epochCallback = function () { return true; }; }\n var isFinished = false;\n var embedding = [];\n while (!isFinished) {\n var _a = this.optimizationState, nEpochs = _a.nEpochs, currentEpoch = _a.currentEpoch;\n embedding = this.optimizeLayoutStep(currentEpoch);\n var epochCompleted = this.optimizationState.currentEpoch;\n var shouldStop = epochCallback(epochCompleted) === false;\n isFinished = epochCompleted === nEpochs || shouldStop;\n }\n return embedding;\n };\n UMAP.prototype.getNEpochs = function () {\n var graph = this.graph;\n if (this.nEpochs > 0) {\n return this.nEpochs;\n }\n var length = graph.nRows;\n if (length <= 2500) {\n return 500;\n }\n else if (length <= 5000) {\n return 400;\n }\n else if (length <= 7500) {\n return 300;\n }\n else {\n return 200;\n }\n };\n return UMAP;\n}());\nexports.UMAP = UMAP;\nfunction euclidean(x, y) {\n var result = 0;\n for (var i = 0; i < x.length; i++) {\n result += Math.pow((x[i] - y[i]), 2);\n }\n return Math.sqrt(result);\n}\nexports.euclidean = euclidean;\nfunction cosine(x, y) {\n var result = 0.0;\n var normX = 0.0;\n var normY = 0.0;\n for (var i = 0; i < x.length; i++) {\n result += x[i] * y[i];\n normX += Math.pow(x[i], 2);\n normY += Math.pow(y[i], 2);\n }\n if (normX === 0 && normY === 0) {\n return 0;\n }\n else if (normX === 0 || normY === 0) {\n return 1.0;\n }\n else {\n return 1.0 - result / Math.sqrt(normX * normY);\n }\n}\nexports.cosine = cosine;\nvar OptimizationState = (function () {\n function OptimizationState() {\n this.currentEpoch = 0;\n this.headEmbedding = [];\n this.tailEmbedding = [];\n this.head = [];\n this.tail = [];\n this.epochsPerSample = [];\n this.epochOfNextSample = [];\n this.epochOfNextNegativeSample = [];\n this.epochsPerNegativeSample = [];\n this.moveOther = true;\n this.initialAlpha = 1.0;\n this.alpha = 1.0;\n this.gamma = 1.0;\n this.a = 1.5769434603113077;\n this.b = 0.8950608779109733;\n this.dim = 2;\n this.nEpochs = 500;\n this.nVertices = 0;\n }\n return OptimizationState;\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}\nfunction rDist(x, y) {\n var result = 0.0;\n for (var i = 0; i < x.length; i++) {\n result += Math.pow(x[i] - y[i], 2);\n }\n return result;\n}\nfunction findABParams(spread, minDist) {\n var curve = function (_a) {\n var _b = __read(_a, 2), a = _b[0], b = _b[1];\n return function (x) {\n return 1.0 / (1.0 + a * Math.pow(x, (2 * b)));\n };\n };\n var xv = utils\n .linear(0, spread * 3, 300)\n .map(function (val) { return (val < minDist ? 1.0 : val); });\n var yv = utils.zeros(xv.length).map(function (val, index) {\n var gte = xv[index] >= minDist;\n return gte ? Math.exp(-(xv[index] - minDist) / spread) : val;\n });\n var initialValues = [0.5, 0.5];\n var data = { x: xv, y: yv };\n var options = {\n damping: 1.5,\n initialValues: initialValues,\n gradientDifference: 10e-2,\n maxIterations: 100,\n errorTolerance: 10e-3,\n };\n var parameterValues = ml_levenberg_marquardt_1.default(data, curve, options).parameterValues;\n var _a = __read(parameterValues, 2), a = _a[0], b = _a[1];\n return { a: a, b: b };\n}\nexports.findABParams = findABParams;\nfunction fastIntersection(graph, target, unknownDist, farDist) {\n if (unknownDist === void 0) { unknownDist = 1.0; }\n if (farDist === void 0) { farDist = 5.0; }\n return graph.map(function (value, row, col) {\n if (target[row] === -1 || target[col] === -1) {\n return value * Math.exp(-unknownDist);\n }\n else if (target[row] !== target[col]) {\n return value * Math.exp(-farDist);\n }\n else {\n return value;\n }\n });\n}\nexports.fastIntersection = fastIntersection;\nfunction resetLocalConnectivity(simplicialSet) {\n simplicialSet = matrix.normalize(simplicialSet, \"max\");\n var transpose = matrix.transpose(simplicialSet);\n var prodMatrix = matrix.pairwiseMultiply(transpose, simplicialSet);\n simplicialSet = matrix.add(simplicialSet, matrix.subtract(transpose, prodMatrix));\n return matrix.eliminateZeros(simplicialSet);\n}\nexports.resetLocalConnectivity = resetLocalConnectivity;\nfunction initTransform(indices, weights, embedding) {\n var result = utils\n .zeros(indices.length)\n .map(function (z) { return utils.zeros(embedding[0].length); });\n for (var i = 0; i < indices.length; i++) {\n for (var j = 0; j < indices[0].length; j++) {\n for (var d = 0; d < embedding[0].length; d++) {\n var a = indices[i][j];\n result[i][d] += weights[i][j] * embedding[a][d];\n }\n }\n }\n return result;\n}\nexports.initTransform = initTransform;\n","\"use strict\";\nvar __values = (this && this.__values) || function (o) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator], i = 0;\n if (m) return m.call(o);\n return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nfunction tauRandInt(n, random) {\n return Math.floor(random() * n);\n}\nexports.tauRandInt = tauRandInt;\nfunction tauRand(random) {\n return random();\n}\nexports.tauRand = tauRand;\nfunction norm(vec) {\n var e_1, _a;\n var result = 0;\n try {\n for (var vec_1 = __values(vec), vec_1_1 = vec_1.next(); !vec_1_1.done; vec_1_1 = vec_1.next()) {\n var item = vec_1_1.value;\n result += Math.pow(item, 2);\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (vec_1_1 && !vec_1_1.done && (_a = vec_1.return)) _a.call(vec_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n return Math.sqrt(result);\n}\nexports.norm = norm;\nfunction empty(n) {\n var output = [];\n for (var i = 0; i < n; i++) {\n output.push(undefined);\n }\n return output;\n}\nexports.empty = empty;\nfunction range(n) {\n return empty(n).map(function (_, i) { return i; });\n}\nexports.range = range;\nfunction filled(n, v) {\n return empty(n).map(function () { return v; });\n}\nexports.filled = filled;\nfunction zeros(n) {\n return filled(n, 0);\n}\nexports.zeros = zeros;\nfunction ones(n) {\n return filled(n, 1);\n}\nexports.ones = ones;\nfunction linear(a, b, len) {\n return empty(len).map(function (_, i) {\n return a + i * ((b - a) / (len - 1));\n });\n}\nexports.linear = linear;\nfunction sum(input) {\n return input.reduce(function (sum, val) { return sum + val; });\n}\nexports.sum = sum;\nfunction mean(input) {\n return sum(input) / input.length;\n}\nexports.mean = mean;\nfunction max(input) {\n var max = 0;\n for (var i = 0; i < input.length; i++) {\n max = input[i] > max ? input[i] : max;\n }\n return max;\n}\nexports.max = max;\nfunction max2d(input) {\n var max = 0;\n for (var i = 0; i < input.length; i++) {\n for (var j = 0; j < input[i].length; j++) {\n max = input[i][j] > max ? input[i][j] : max;\n }\n }\n return max;\n}\nexports.max2d = max2d;\nfunction rejectionSample(nSamples, poolSize, random) {\n var result = zeros(nSamples);\n for (var i = 0; i < nSamples; i++) {\n var rejectSample = true;\n while (rejectSample) {\n var j = tauRandInt(poolSize, random);\n var broken = false;\n for (var 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 }\n return result;\n}\nexports.rejectionSample = rejectionSample;\nfunction reshape2d(x, a, b) {\n var rows = [];\n var count = 0;\n var index = 0;\n if (x.length !== a * b) {\n throw new Error('Array dimensions must match input length.');\n }\n for (var i = 0; i < a; i++) {\n var col = [];\n for (var 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}\nexports.reshape2d = reshape2d;\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n// the startup function\n__webpack_require__.x = () => {\n\t// Load entry module and return exports\n\t// This entry module depends on other loaded chunks and execution need to be delayed\n\tvar __webpack_exports__ = __webpack_require__.O(undefined, [1,452], () => (__webpack_require__(1729)))\n\t__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n\treturn __webpack_exports__;\n};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".js\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","__webpack_require__.b = self.location + \"\";\n\n// object to store loaded chunks\n// \"1\" means \"already loaded\"\nvar installedChunks = {\n\t729: 1\n};\n\n// importScripts chunk loading\nvar installChunk = (data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\tfor(var moduleId in moreModules) {\n\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t}\n\t}\n\tif(runtime) runtime(__webpack_require__);\n\twhile(chunkIds.length)\n\t\tinstalledChunks[chunkIds.pop()] = 1;\n\tparentChunkLoadingFunction(data);\n};\n__webpack_require__.f.i = (chunkId, promises) => {\n\t// \"1\" is the signal for \"already loaded\"\n\tif(!installedChunks[chunkId]) {\n\t\tif(true) { // all chunks have JS\n\t\t\timportScripts(__webpack_require__.p + __webpack_require__.u(chunkId));\n\t\t}\n\t}\n};\n\nvar chunkLoadingGlobal = self[\"webpackChunkbio\"] = self[\"webpackChunkbio\"] || [];\nvar parentChunkLoadingFunction = chunkLoadingGlobal.push.bind(chunkLoadingGlobal);\nchunkLoadingGlobal.push = installChunk;\n\n// no HMR\n\n// no HMR manifest","// run startup\nvar __webpack_exports__ = __webpack_require__.x();\n"],"names":["deferred","next","StringMetricsNames","VectorMetricsNames","BitArrayMetricsNames","DistanceMetricsSubjects","NumberMetricsNames","randomFloat","range","Math","random","floor","assert","condition","message","Error","vectorAdd","p","q","multiplier","nItems","length","total","i","fillRandomMatrix","dimension1","dimension2","scale","matrix","fill","Array","map","initCoordinates","j","calculateEuclideanDistance","sqdiffSumm","v","itemsSum","vectorSquare","sqrt","dmLinearIndex","size","DistanceMatrixService","constructor","useConcurrentWorkers","terminateOnComplete","threadCount","navigator","hardwareConcurrency","this","_workerCount","max","_workers","Worker","URL","_terminateOnComplete","async","values","fnName","normalize","Promise","resolve","reject","len","promises","totalLength","min","chunkSize","distanceMatrix","Float32Array","endRow","endCol","lmin","lmax","Number","MIN_VALUE","start","end","startRow","startCol","postMessage","chunckSize","resolveWorker","rejectWorker","onmessage","data","error","distanceMatrixData","terminate","set","all","forEach","value","index","e","worker","SPEBase","options","steps","cycles","cutoff","lambda","dlambda","lambda2","dlambda2","epsilon","distanceFunction","distance","distanceFunctionName","vectors","dmIndexFunct","matrixService","calc","calcDistance","index1","index2","coordinates","dimension","initDistance","cycle","step","rowi","rowj","r","d","diffIJ","PSPEBase","OriginalSPE","super","radiusPercent","maxDistance","maxDistanceSteps","n","radius","vectorDistanceMetricsMethods","stringDistanceMetricsMethods","s1","s2","dist","bitArrayDistanceMetricsMethods","numberDistanceMetricsMethods","AvailableMetrics","MetricToDataType","Object","keys","reduce","ret","key","val","Measure","method","dataType","getMeasure","opts","dict","hasOwnProperty","name","static","availableMeasures","BitArray","arg","defaultValue","_length","_version","_updateLevel","_selectedCount","_selectedCountVersion","_selectedIndexesVersion","_versionedName","_versionedNameVersion","SHRINK_THRESHOLD","buff","_createBuffer","_data","Uint32Array","getRawData","assureGoez","num","argName","assureInRange","copy","src","dst","count","copyFrom","other","lengthInInts","buffer","version","incrementVersion","notify","versionedName","self","setLength","nIntsNeeded","newData","set1","set2","temp","flag","setBit","s","fromSeq","charAt","bytes","num1","num2","toString","countBits","equals","getBit","clone","bitArray","from","init","setAll","invert","flags","setIndexes","indexes","clear","setFast","everyIndex","anyIndex","setWhere","check","allowClear","getRange","to","arr","push","fromValues","getRangeAsList","setRange","setTrue","setFalse","setRandom","k","and","andNot","notAnd","not","or","xor","insertAt","pos","oldlength","removeAt","contains","removeByMask","mask","dstIdx","srcIdx","findNext","bit","trueCount","falseCount","_onBitCount","remainingBits","countWhere","result","andWithCountBits","second","allTrue","allFalse","anyTrue","anyFalse","unusedBits","numInts","_firstOnBit","findPrev","_lastOnBit","Int8Array","DimReductionMethods","DistanceMatrix","_size","undefined","dataLength","_linearizeIJ","get","list","res","square","add","Reducer","AvailableReducers","distanceFn","distanceFname","dmIndexFunc","_","usingDistanceMatrix","preCalculateDistanceMatrix","_encodedDistanceMatrix","bind","_encodedDistance","nNeighbors","reducer","u","a","b","parallelDistanceWorkers","embedding","fit","iterations","matrixProxy","condensedArray","linearFunc","linearIndex","iNum","jNum","idx1Handler","target","idx1","_receiver","Proxy","idx2","idx2Handler","distanceMatrixProxy","initDataDist","getSolution","emb","embed","DimensionalityReducer","metric","measure","specOptions","nEpochs","transpose","transform","typeName","availableMethods","availableMetrics","ans","obj","array","columnData","onMessage","exports","tsne_1","defineProperty","enumerable","TSNE","opt","returnV","vValue","iter","perplexity","getopt","dim","field","defaultval","gaussRandom","c","log","randn","mu","std","zeros","isNaN","ArrayBuffer","Float64Array","randn2d","uses","x","xhere","L2","x1","x2","D","x1i","x2i","xtod","X","N","d2p","tol","nf","hTarget","P","prow","betamin","betamax","Infinity","beta","done","maxtries","psum","pj","exp","nHere","abs","pOut","N2","sign","initDataRaw","dists","initSolution","Y","gains","ystep","cg","costGrad","cost","grad","ymean","gid","sid","gainid","newgain","newsid","debugGrad","yold","cg0","cg1","analytic","numerical","console","pmul","quArr","qsum","dsum","dhere","qu","NN","Q","gsum","premult","prototype","isAnyArray","object","call","endsWith","errorCalculation","parameters","parameterizedFunction","func","y","rescale","input","output","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","rows","columns","maxI","maxJ","loop","line","formatNumber","join","inspectData","formatNumber2","padEnd","str","fix","toFixed","startsWith","toExponential","slice","checkRowIndex","outer","checkColumnIndex","checkRowVector","vector","to1DArray","checkColumnVector","checkRange","startColumn","endColumn","checkNumber","newArray","checkNonEmpty","isEmpty","AbstractMatrix","newRows","newColumns","newMatrix","Matrix","row","column","interval","round","l","matrix1","matrix2","checkMatrix","isMatrix","klass","apply","callback","to2DArray","toJSON","isRowVector","isColumnVector","isVector","isSquare","isSymmetric","isEchelonForm","previousColumn","checked","isReducedEchelonForm","echelonForm","h","iMax","swapRows","tmp","reducedEchelonForm","m","maxRow","pivot","setSubMatrix","neg","mulS","getRow","getRowVector","rowVector","setRow","row1","row2","getColumn","getColumnVector","columnVector","setColumn","swapColumns","column1","column2","addRowVector","subRowVector","mulRowVector","divRowVector","addColumnVector","subColumnVector","mulColumnVector","divColumnVector","mulRow","mulColumn","by","NaN","NEGATIVE_INFINITY","maxIndex","idx","POSITIVE_INFINITY","minIndex","maxRowIndex","minRow","minRowIndex","maxColumn","maxColumnIndex","minColumn","minColumnIndex","diag","norm","type","cumulativeSum","sum","dot","vector2","vector1","mmul","Bcolj","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","mat","cols","resultat","warn","blockMult","halfRows","parseInt","halfCols","subMatrix","sub","scaleRows","isFinite","scaleColumns","flipRows","middle","ceil","first","last","flipColumns","kroneckerProduct","kroneckerSum","AxI","eye","IxB","sortRows","compareFunction","compareNumbers","sort","sortColumns","subMatrixRow","indices","subMatrixColumn","selection","rowIndices","columnIndices","checkRowIndices","checkColumnIndices","rowIndex","columnIndex","trace","sumByRow","sumByColumn","sumAll","product","productByRow","productByColumn","productAll","mean","variance","unbiased","sum1","sum2","varianceByRow","varianceByColumn","varianceAll","standardDeviation","center","centerByRow","centerByColumn","centerAll","pow","getScaleByRow","scaleByRow","getScaleByColumn","scaleByColumn","divider","getScaleAll","scaleAll","Symbol","for","rand","randomInt","randInt","diagonal","identity","negate","tensorProduct","nRows","nColumns","arrayData","every","element","removeRow","splice","addRow","removeColumn","newRow","addColumn","addS","addM","subS","subM","subtract","subtractS","subtractM","mul","mulM","multiply","multiplyS","multiplyM","div","divS","divM","divide","divideS","divideM","mod","modS","modM","modulus","modulusS","modulusM","andS","andM","orS","orM","xorS","xorM","leftShift","leftShiftS","leftShiftM","signPropagatingRightShift","signPropagatingRightShiftS","signPropagatingRightShiftM","rightShift","rightShiftS","rightShiftM","zeroFillRightShift","zeroFillRightShiftS","zeroFillRightShiftM","acos","acosh","asin","asinh","atan","atanh","cbrt","clz32","cos","cosh","expm1","fround","log1p","log10","log2","sin","sinh","tan","tanh","trunc","arg0","powS","powM","installMathOperations","WrapperMatrix2D","LuDecomposition","t","LUcolj","kmax","lu","pivotVector","pivotSign","LU","isSingular","col","solve","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","eps","EPSILON","kase","alpha","ks","f","cs","sn","sp","spm1","epm1","sk","ek","shift","g","threshold","scols","Ls","rightSingularVectors","VL","vrows","urows","VLU","solveForDiagonal","inverse","vcols","ucols","norm2","rank","ii","leftSingularVectors","diagonalMatrix","params","damping","gradientDifference","evaluatedData","gradientFunc","paramFunction","param","auxParams","funcParam","point","gradientFunction","matrixFunc","matrixFunction","inverseMatrix","useSVD","leftHandSide","rightHandSide","levenbergMarquardt","maxIterations","errorTolerance","minValues","maxValues","initialValues","parLen","MAX_SAFE_INTEGER","MIN_SAFE_INTEGER","iteration","converged","parameterValues","parameterError","__importStar","__esModule","utils","makeHeap","nPoints","makeArrays","fillValue","empty","filled","heap","heapPush","weight","weights","uncheckedHeapPush","isNew","iSwap","ic1","ic2","heapShape2","siftDown","heap1","heap2","ceiling","elt","leftChild","rightChild","swap","temp1","temp2","rejectionSample","nSamples","poolSize","rejectSample","tauRandInt","broken","buildCandidates","currentGraph","nVertices","maxCandidates","candidateNeighbors","isn","tauRand","deheapSort","indHeap","distHeap","indHeapIndex","distHeapIndex","smallestFlagged","ind","minDist","resultIndex","umap_1","UMAP","_a","__read","o","iterator","ar","__values","SparseMatrix","dims","entries","Map","nCols","checkDims","makeKey","has","getAll","ordered","rowColValues","getDims","getRows","_b","getCols","getValues","fn","vals","toArray","_this","pairwiseMultiply","elementWise","maximum","multiplyScalar","scalar","eliminateZeros","zeroIndices","Set","removeByZeroIndex","nextValues","filter","nextRows","nextCols","normType","e_1","normFn","normFns","colsByRow","nextMatrix","_loop_1","_c","e_1_1","return","xs","op","visited","operate","nextValue","valuesA","rowsA","colsA","valuesB","rowsB","colsB","getCSR","indptr","currentRow","tree","makeNNDescent","leafArray","nIters","delta","rho","rpTreeInit","cj","ck","makeInitializations","initFromRandom","queryPoints","_heap","initFromTree","_tree","searchFlatTree","makeInitializedNNSearch","graph","initialization","tried","vertex","candidates","candidates_1","candidates_1_1","candidate","initializeSearch","forest","e_2","results","forest_1","forest_1_1","e_2_1","__spread","concat","FlatTree","hyperplanes","offsets","children","makeEuclideanTree","leafSize","splitResults","leftIndex","rightIndex","left","right","hyperplaneOffset","hyperplaneVector","nLeft","nRight","side","margin","indicesLeft","indicesRight","hyperplane","offset","euclideanRandomProjectionSplit","isLeaf","recursiveFlatten","nodeNum","leafNum","oldNodeNum","numNodes","numLeaves","selectSide","makeForest","nTrees","makeTree","nNodes","nLeaves","flattenTree","makeLeafArray","rpForest","rpForest_1","rpForest_1_1","node","__awaiter","thisArg","_arguments","generator","fulfilled","rejected","then","__generator","body","label","sent","trys","ops","verb","pop","__importDefault","nnDescent","ml_levenberg_marquardt_1","SMOOTH_K_TOLERANCE","MIN_K_DIST_SCALE","learningRate","localConnectivity","nComponents","negativeSampleRate","repulsionStrength","setOpMixRatio","spread","transformQueueSize","targetMetric","targetWeight","targetNNeighbors","euclidean","isInitialized","optimizationState","OptimizationState","setParam","initializeFit","optimizeLayout","fitAsync","optimizeLayoutAsync","setSupervisedProjection","setPrecomputedKNN","knnIndices","knnDistances","getNEpochs","knnResults","nearestNeighbors","fuzzySimplicialSet","makeSearchFns","searchGraph","makeSearchGraph","processGraphForSupervisedProjection","initializeSimplicialSetEmbedding","head","tail","epochsPerSample","initializeOptimization","prepareForOptimizationLoop","search","knn","distances","neighbor","toTransform","rawData","adjustedLocalConnectivity","smoothKNNDistance","sigmas","rhos","computeMembershipStrengths","normed","csrMatrix","initTransform","reshape2d","graphMax","makeEpochsPerSample","assignOptimizationStateParameters","headEmbedding","tailEmbedding","currentEpoch","farDist","categoricalSimplicialSetIntersection","optimizeLayoutStep","getEmbedding","metricNNDescent","_d","_e","sparseMatrix","prodMatrix","simplicialSet","unknownDist","intersection","fastIntersection","resetLocalConnectivity","nIter","bandwidth","lo","hi","mid","ithDistances","nonZeroDists","interpolation","meanIthDistances","meanDistances","graphValues","entry","w","state","assign","moveOther","epochsPerNegativeSample","epochOfNextNegativeSample","epochOfNextSample","initialAlpha","gamma","findABParams","current","distSquared","rDist","gradCoeff","gradD","clip","nNegSamples","k_1","other_1","distSquared_1","gradCoeff_1","epochCallback","epochCompleted","shouldStop","isFinished","setTimeout","err","cosine","normX","normY","clipValue","xv","linear","yv","default","z","vec","vec_1","vec_1_1","item","ones","max2d","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","module","__webpack_modules__","__webpack_exports__","O","chunkIds","priority","notFulfilled","definition","chunkId","globalThis","Function","window","prop","toStringTag","scriptUrl","importScripts","location","document","currentScript","scripts","getElementsByTagName","replace","installedChunks","chunkLoadingGlobal","parentChunkLoadingFunction","moreModules","runtime"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"729.js","mappings":"+BAAIA,ECAAC,E,kBCAG,IAAIC,EAMAC,EAIAC,EAeAC,EAQAC,E,qDAhCX,SAAWJ,GACPA,EAAgC,YAAI,cACpCA,EAAgC,YAAI,eACpCA,EAA8B,UAAI,WACrC,CAJD,CAIGA,IAAuBA,EAAqB,CAAC,IAEhD,SAAWC,GACPA,EAA8B,UAAI,WACrC,CAFD,CAEGA,IAAuBA,EAAqB,CAAC,IAEhD,SAAWC,GACPA,EAA+B,SAAI,WACnCA,EAA2B,KAAI,OAC/BA,EAAiC,WAAI,aACrCA,EAAoC,cAAI,iBACxCA,EAA6B,OAAI,SACjCA,EAAiC,WAAI,aACrCA,EAAmC,aAAI,gBACvCA,EAAoC,cAAI,iBACxCA,EAA6B,OAAI,SACjCA,EAA4B,MAAI,QAChCA,EAA8B,QAAI,UAClCA,EAAgC,UAAI,WACvC,CAbD,CAaGA,IAAyBA,EAAuB,CAAC,IAEpD,SAAWC,GACPA,EAAgC,OAAI,SACpCA,EAAgC,OAAI,SACpCA,EAAkC,SAAI,WACtCA,EAAuC,cAAI,gBAC3CA,EAAgC,OAAI,QACvC,CAND,CAMGA,IAA4BA,EAA0B,CAAC,IAE1D,SAAWC,GACPA,EAAoC,gBAAI,iBAC3C,CAFD,CAEGA,IAAuBA,EAAqB,CAAC,G,mDC7BzC,SAASC,EAAYC,GACxB,OAAOC,KAAKC,SAAWF,CAC3B,CAQO,SAAS,EAAUA,GACtB,OAAOC,KAAKE,MAAMJ,EAAYC,GAClC,CCTO,SAASI,EAAOC,GAAY,EAAOC,EAAU,oBAChD,IAAKD,EACD,MAAM,IAAIE,MAAMD,EACxB,CAkCO,SAASE,EAAUC,EAAGC,EAAGC,EAAa,GACzC,MAAMC,EAASH,EAAEI,OACjBT,EAAOQ,GAAUF,EAAEG,OAAQ,gCAC3B,MAAMC,EAAQ,IAAI,KAAOF,GACzB,IAAK,IAAIG,EAAI,EAAGA,EAAIN,EAAEI,SAAUE,EAC5BD,EAAMC,GAAKN,EAAEM,GAAKJ,EAAaD,EAAEK,GACrC,OAAOD,CACX,CAiDO,SAASE,EAAiBC,EAAYC,EAAYC,EAAQ,GAC7D,MAAMC,EAjFV,SAAyBH,EAAYC,EAAYG,EAAO,GACpD,OAAO,IAAIC,MAAML,GAAYI,KAAKA,GAAME,KAAI,IAAO,IAAI,KAAOL,GAAYG,KAAKA,IACnF,CA+EmBG,CAAgBP,EAAYC,GAC3C,IAAK,IAAIH,EAAI,EAAGA,EAAIE,IAAcF,EAC9B,IAAK,IAAIU,EAAI,EAAGA,EAAIP,IAAcO,EAC9BL,EAAOL,GAAGU,GAAK1B,EAAYoB,GAEnC,OAAOC,CACX,CASO,SAASM,EAA2BjB,EAAGC,GAC1C,MAEMiB,EA7DV,SAAkBC,GACd,IAAId,EAAQ,EACZ,IAAK,IAAIC,EAAI,EAAGA,EAAIa,EAAEf,SAAUE,EAC5BD,GAASc,EAAEb,GACf,OAAOD,CACX,CAwDuBe,CAjDvB,SAAsBD,GAClB,MAAMhB,EAASgB,EAAEf,OACXC,EAAQ,IAAI,KAAOF,GACzB,IAAK,IAAIG,EAAI,EAAGA,EAAIa,EAAEf,SAAUE,EAC5BD,EAAMC,GAAKa,EAAEb,GAAKa,EAAEb,GACxB,OAAOD,CACX,CA0CmBgB,CADFtB,EAAUC,EAAGC,GAAI,KAG9B,OAAOT,KAAK8B,KAAKJ,EACrB,CC3FO,SAASK,EAAcC,GAC1B,MAAO,CAAClB,EAAGU,IAAMQ,EAAOlB,EAAIU,EAAIxB,KAAKE,OAAQY,EAAI,IAAMA,EAAI,GAAM,EACrE,CCnCO,MAAMmB,EACTC,YAAYC,GAAuB,EAAMC,GAAsB,GAC3D,MAAMC,EAAcC,UAAUC,oBAC9BC,KAAKC,aAAeN,EAAuBnC,KAAK0C,IAAIL,EAAc,EAAG,GAAK,EAC1EG,KAAKG,SAAW,IAAItB,MAAMmB,KAAKC,cAAcrB,KAAK,MAC7CE,KAAI,IAAM,IAAIsB,OAAO,IAAIC,IAAI,oBAClCL,KAAKM,qBAAuBV,CAChC,CAEAW,WAAWC,EAAQC,EAAQC,GAAY,GACnC,OAAO,IAAIC,SAAQJ,MAAOK,EAASC,KAC/B,IACI,MAAMC,EAAMN,EAAOpC,OACb2C,EAAW,IAAIlC,MAAMmB,KAAKC,cAC1Be,EAAcF,GAAOA,EAAM,GAAK,EACtCd,KAAKC,aAAezC,KAAKyD,IAAIjB,KAAKC,aAAce,GAChD,MAAME,EAAYF,EAAchB,KAAKC,aAC/BkB,EAAiB,IAAIC,aAAaJ,GACxC,IAAIK,EAAS,EACTC,EAAS,EAETC,EAAO,EACPC,EAAOC,OAAOC,UAClB,IAAK,IAAIpD,EAAI,EAAGA,EAAI0B,KAAKC,aAAc3B,IAAK,CACxC,MAAMqD,EAAQnE,KAAKE,MAAMY,EAAI4C,GACvBU,EAAOtD,IAAM0B,KAAKC,aAAe,EAAKe,EAAcxD,KAAKE,OAAOY,EAAI,GAAK4C,GACzEW,EAAWR,EACXS,EAAWR,EACbhD,IAAM0B,KAAKC,aAAe,IAE1BoB,EAASP,EAAM,EAAItD,KAAKE,MAAMF,KAAK8B,MAAM,EAAIsC,EAAM,EAAId,GAAOA,EAAM,GAAK,GAAK,EAAI,IAClFQ,EAASM,EAAMd,EAAMO,EAAS7D,KAAKE,OAAO2D,EAAS,IAAMA,EAAS,GAAK,IAE3ErB,KAAKG,SAAS7B,GAAGyD,YAAY,CAAEvB,SAAQC,SAAQoB,WAAUC,WAAUE,WAAYJ,EAAMD,IACrFZ,EAASzC,GAAK,IAAIqC,SAAQ,CAACsB,EAAeC,KACtClC,KAAKG,SAAS7B,GAAG6D,UAAY,EAAGC,MAAQC,QAAOC,qBAAoBrB,MAAKf,WACpEF,KAAKM,sBAAwBN,KAAKG,SAAS7B,GAAGiE,YAC1CF,EACAH,EAAaG,IAGblB,EAAeqB,IAAIF,EAAoBX,GACnCV,EAAMM,IACNA,EAAON,GACPf,EAAMsB,IACNA,EAAOtB,GACX+B,IACJ,CACH,GAET,OACMtB,QAAQ8B,IAAI1B,GACdL,GACAS,EAAeuB,SAAQ,CAACC,EAAOC,KAAYzB,EAAeyB,IAAUD,EAAQpB,IAASC,EAAOD,EAAK,IACrGX,EAAQO,EACZ,CACA,MAAO0B,GACHhC,EAAOgC,EACX,IAER,CACAN,YACIvC,KAAKG,SAASuC,SAASI,GAAWA,EAAOP,aAC7C,ECrDJ,MAAMQ,EAMFrD,YAAYsD,GACRhD,KAAKiD,MAAQD,GAASC,OAAS,EAC/BjD,KAAKkD,OAASF,GAASE,QAAU,IAEjClD,KAAKmD,OAASH,GAASG,QAAU,EAEjCnD,KAAKoD,OAASJ,GAASI,QAAU,EACjCpD,KAAKqD,QAAUL,GAASK,SAAW,IACnCrD,KAAKsD,QAAUtD,KAAKoD,OAAS,EAC7BpD,KAAKuD,SAAWvD,KAAKqD,QAAU,EAC/BrD,KAAKwD,QAAUR,GAASQ,SAAW,MAEnCxD,KAAKyD,iBAAmBT,GAASU,UAAYzE,EAC7Ce,KAAK0D,SAAW,IAAItC,aACpBpB,KAAK2D,qBAAuBX,GAASW,oBACzC,CAOApD,mBAAmBqD,GACf5D,KAAK6D,aAAetE,EAAcqE,EAAQxF,QAC1C,MAAM0F,EAAgB,IAAIrE,GAAsB,GAAM,GACtDO,KAAK0D,eAAiBI,EAAcC,KAAKH,EAAS5D,KAAK2D,sBACvDG,EAAcvB,WAClB,CASAyB,aAAaJ,EAASK,EAAQC,GAC1B,OAAOlE,KAAK0D,SAAS1D,KAAK6D,aAAaI,EAAQC,GACnD,CAOA3D,YAAYqD,GACR,MAAMzF,EAASyF,EAAQxF,OAGjB+F,EAAc5F,EAAiBJ,EAAQ4E,EAAQqB,UAFnC,IAGlB,IAAId,EAAUtD,KAAKsD,QACA,IAAftD,KAAKiD,QACLjD,KAAKiD,MAAQW,EAAQxF,OAAS,SAC5B4B,KAAKqE,aAAaT,GACxB,IAAK,IAAIU,EAAQ,EAAGA,EAAQtE,KAAKkD,SAAUoB,EAAO,CAC9C,IAAK,IAAIC,EAAO,EAAGA,EAAOvE,KAAKiD,QAASsB,EAAM,CAE1C,MAAMjG,EAAI,EAAUH,GACpB,IAAIa,EAAI,EAAUb,GAClB,KAAOG,GAAKU,GACRA,EAAI,EAAUb,GAClB,MAAMqG,EAAOL,EAAY7F,GACnBmG,EAAON,EAAYnF,GAEnB0F,EAAI1E,KAAKgE,aAAaJ,EAAStF,EAAGU,GAElC2F,EAAI1F,EAA2BuF,EAAMC,GAE3C,GAAoB,GAAfzE,KAAKmD,QAAiBuB,GAAK1E,KAAKmD,QAAYwB,EAAID,EAAI,CACrD,MAAMxG,EAAaoF,GAAWoB,EAAIC,IAAMA,EAAI3E,KAAKwD,SAE3CoB,EAAS7G,EAAUyG,EAAMC,GAAO,GACtCN,EAAY7F,GAAKP,EAAUyG,EAAMI,EAAQ1G,GACzCiG,EAAYnF,GAAKjB,EAAU0G,EAAMG,GAAS1G,EAC9C,CACJ,CAGA,GADAoF,GAAWtD,KAAKuD,SACZD,GAAW,EACX,KACR,CACA,OAAOa,CACX,EAEJpB,EAAQqB,UAAY,EASb,MAAMS,UAAiB9B,EAO1BxC,YAAYqD,GACR,MAAMzF,EAASyF,EAAQxF,OAGjB+F,EAAc5F,EAAiBJ,EAAQ0G,EAAST,UAFpC,IAGlB,IAAIhB,EAASpD,KAAKoD,aACZpD,KAAKqE,aAAaT,GACxB,IAAK,IAAIU,EAAQ,EAAGA,EAAQtE,KAAKkD,SAAUoB,EAAO,CAE9C,MAAMhG,EAAI,EAAUH,GACdqG,EAAOL,EAAY7F,GAEzB,IAAK,IAAIU,EAAI,EAAGA,EAAIb,IAAUa,EAAG,CAC7B,GAAIV,GAAKU,EACL,SACJ,MAAMyF,EAAON,EAAYnF,GAEnB0F,EAAI1E,KAAKgE,aAAaJ,EAAStF,EAAGU,GAElC2F,EAAI1F,EAA2BuF,EAAMC,GAE3C,GAAoB,GAAfzE,KAAKmD,QAAiBuB,GAAK1E,KAAKmD,QAAYwB,EAAID,EAAI,CACrD,MAAMxG,EAAakF,GAAUsB,EAAIC,IAAMA,EAAI3E,KAAKwD,SAC1CoB,EAAS7G,EAAUyG,EAAMC,GAAO,GAEtCN,EAAYnF,GAAKjB,EAAU0G,EAAMG,GAAS1G,EAC9C,CACJ,CAGA,GADAkF,GAAUpD,KAAKqD,QACXD,GAAU,EACV,KACR,CACA,OAAOe,CACX,EASG,MAAMW,UAAoB/B,EAC7BrD,YAAYsD,GACR+B,MAAM/B,GACNhD,KAAKkD,OAASF,GAASE,QAAU,IACjClD,KAAKiD,MAAQD,GAASC,OAAS,IAC/BjD,KAAKgF,cAAgBhC,GAASgC,eAAiB,EAC/ChF,KAAKiF,YAAcjC,GAASiC,aAAe,KAC3CjF,KAAKkF,iBAAmBlC,GAASkC,kBAAoB,IACzD,CACA3E,YAAYqD,GACR,MAAMzF,EAASyF,EAAQxF,OAGjB+F,EAAc5F,EAAiBJ,EAAQ2G,EAAYV,UAFvC,IAMlB,SAHMpE,KAAKqE,aAAaT,GACM,OAA1B5D,KAAKkF,mBACLlF,KAAKkF,iBAAmB/G,EAASX,KAAKE,OAAOS,EAAS,GAAK,IACtC,OAArB6B,KAAKiF,YAAsB,CAC3BjF,KAAKiF,aAAe,KACpB,IAAK,IAAIE,EAAI,EAAGA,EAAInF,KAAKkF,iBAAkBC,IAAK,CAC5C,MAAM7G,EAAI,EAAUH,GACpB,IAAIa,EAAI,EAAUb,GAClB,KAAOG,GAAKU,GACRA,EAAI,EAAUb,GAClB,MAAMwG,EAAI3E,KAAKgE,aAAaJ,EAAStF,EAAGU,GACpC2F,EAAI3E,KAAKiF,cACTjF,KAAKiF,YAAcN,EAC3B,CACJ,CACA,IAAIvB,EAASpD,KAAKoD,OAClB,MAAMgC,EAAgC,GAAtBpF,KAAKgF,cAAwBhF,KAAKiF,YAAcjF,KAAKiF,YAAcjF,KAAKgF,cACxF,IAAK,IAAIV,EAAQ,EAAGA,EAAQtE,KAAKkD,SAAUoB,EAAO,CAC9C,IAAK,IAAIC,EAAO,EAAGA,EAAOvE,KAAKiD,QAASsB,EAAM,CAE1C,MAAMjG,EAAI,EAAUH,GACpB,IAAIa,EAAI,EAAUb,GAClB,KAAOG,GAAKU,GACRA,EAAI,EAAUb,GAClB,MAAMqG,EAAOL,EAAY7F,GACnBmG,EAAON,EAAYnF,GAEnB0F,EAAI1E,KAAKgE,aAAaJ,EAAStF,EAAGU,GAElC2F,EAAI1F,EAA2BuF,EAAMC,GAC3C,GAAKC,GAAKU,GAAYT,EAAID,EAAI,CAC1B,MAAMxG,EAAsB,GAATkF,GAAgBsB,EAAIC,IAAMA,EAAI3E,KAAKwD,SAEhDoB,EAAS7G,EAAUyG,EAAMC,GAAO,GACtCN,EAAY7F,GAAKP,EAAUyG,EAAMI,EAAQ1G,GACzCiG,EAAYnF,GAAKjB,EAAU0G,EAAMG,GAAS1G,EAC9C,CACJ,CAGA,GAFAkF,IAAYpD,KAAKoD,OAASpD,KAAKqD,UAAYrD,KAAKkD,OAAS,GAErDE,EAASpD,KAAKqD,QACd,KACR,CACA,OAAOc,CACX,E,qDCnNG,MAAMkB,EAA+B,CACxC,CAAC,KAAmBC,WAAYrG,GAEvBsG,EAA+B,CACxC,CAAC,IAAmBC,aAAc,IAClC,CAAC,IAAmBC,aAAc,KAClC,CAAC,IAAmBC,WAoEjB,SAA2BC,EAAIC,GAClC,GAAID,EAAGvH,SAAWwH,EAAGxH,OACjB,OAAO,EAEN,CACD,IAAIyH,EAAO,EACX,IAAK,IAAIvH,EAAI,EAAGA,EAAIqH,EAAGvH,OAAQE,IAC3BuH,GAAQF,EAAGrH,IAAMsH,EAAGtH,GAAK,EAAI,EACjC,OAAOuH,EAAOF,EAAGvH,MACrB,CACJ,GA5Ea0H,EAAiC,CAC1C,CAAC,KAAqBC,UAAW,KACjC,CAAC,KAAqBC,MAAO,KAC7B,CAAC,KAAqBC,YAAa,KACnC,CAAC,KAAqBC,eAAgB,KACtC,CAAC,KAAqBC,QAAS,KAC/B,CAAC,KAAqBC,YAAa,IACnC,CAAC,KAAqBC,cAAe,KACrC,CAAC,KAAqBC,eAAgB,KACtC,CAAC,KAAqBC,QAAS,KAC/B,CAAC,KAAqBC,OAAQ,KAC9B,CAAC,KAAqBC,SAAU,KAChC,CAAC,KAAqBnB,WAAY,MAEzBoB,EAA+B,CACxC,CAAC,KAAmBC,iBAAkB,MAE7BC,EAAmB,CAC5B,CAAC,KAAwBC,QAAS,CAC9B,CAAC,KAAmBvB,WAAYD,EAA6B,KAAmBC,YAEpF,CAAC,KAAwBwB,QAAS,CAC9B,CAAC,IAAmBtB,aAAcD,EAA6B,IAAmBC,aAClF,CAAC,IAAmBC,aAAcF,EAA6B,IAAmBE,aAClF,CAAC,IAAmBC,WAAYH,EAA6B,IAAmBG,YAEpF,CAAC,KAAwBqB,UAAW,CAChC,CAAC,KAAqBhB,UAAWD,EAA+B,KAAqBC,UACrF,CAAC,KAAqBC,MAAOF,EAA+B,KAAqBE,MACjF,CAAC,KAAqBC,YAAaH,EAA+B,KAAqBG,YACvF,CAAC,KAAqBC,eAAgBJ,EAA+B,KAAqBI,eAC1F,CAAC,KAAqBC,QAASL,EAA+B,KAAqBK,QACnF,CAAC,KAAqBC,YAAaN,EAA+B,KAAqBM,YACvF,CAAC,KAAqBC,cAAeP,EAA+B,KAAqBO,cACzF,CAAC,KAAqBC,eAAgBR,EAA+B,KAAqBQ,eAC1F,CAAC,KAAqBC,QAAST,EAA+B,KAAqBS,QACnF,CAAC,KAAqBC,OAAQV,EAA+B,KAAqBU,QAEtF,CAAC,KAAwBQ,eAAgB,CACrC,CAAC,IAAyBC,SAAU,IAAoB,IAAyBA,SACjF,CAAC,IAAyBC,aAAc,IAAoB,IAAyBA,aACrF,CAAC,IAAyBC,mBAAoB,IAAoB,IAAyBA,oBAE/F,CAAC,KAAwB1F,QAAS,CAC9B,CAAC,KAAmBkF,iBAAkBD,EAA6B,KAAmBC,mBAGjFS,EAAmBC,OAAOC,KAAKV,GACvCW,QAAO,CAACC,EAAKC,KACd,IAAK,MAAMC,KAAOL,OAAOC,KAAKV,EAAiBa,IAC3CD,EAAIE,GAAOD,EACf,OAAOD,CAAG,GACX,CAAC,GA0BG,MAAMG,EAMTjI,YAAYkI,GACR5H,KAAK4H,OAASA,EACd5H,KAAK6H,SAAWT,EAAiBQ,EACrC,CAOAE,WAAWC,GACP,MAAMC,EAAOpB,EACb,IAAKoB,EAAKC,eAAejI,KAAK6H,YAAcG,EAAKhI,KAAK6H,UAAUI,eAAejI,KAAK4H,QAChF,MAAM,IAAI9J,MAAM,mBAAmBkC,KAAK4H,wBAAwB5H,KAAK6H,YACzE,OApC8BK,EAoCDlI,KAAK4H,OAnC/BR,EAAiBc,IAAS,KAAwBlB,cAAcmB,WAoC/DH,EAAKhI,KAAK6H,UAAU7H,KAAK4H,QAAQG,GACjCC,EAAKhI,KAAK6H,UAAU7H,KAAK4H,QAtC9B,IAA+BM,CAuClC,CAOAE,2BAA2BP,GACvB,OAAOR,OAAOC,KAAKV,EAAiBiB,GACxC,CAIWQ,+BACP,OAAOhB,OAAOC,KAAKV,EACvB,EClIW,MAAMG,EACjBrH,YAAY4I,EAAKC,GAAe,GAU5B,GATAvI,KAAKwI,QAAU,EACfxI,KAAKyI,SAAW,EAChBzI,KAAK0I,aAAe,EACpB1I,KAAK2I,eAAiB,EACtB3I,KAAK4I,uBAAyB,EAC9B5I,KAAK6I,yBAA2B,EAChC7I,KAAK8I,eAAiB,GACtB9I,KAAK+I,uBAAyB,EAC9B/I,KAAKgJ,iBAAmB,IACL,iBAARV,EAAkB,CACzB,MAAMlK,EAASkK,EACTW,EAAOlC,EAASmC,cAAc9K,GACpC,GAAImK,EACA,IAAK,IAAIjK,EAAI,EAAGA,EAAI2K,EAAK7K,OAAQE,IAC7B2K,EAAK3K,IAAM,EAEnB0B,KAAKmJ,MAAQF,EACbjJ,KAAKwI,QAAUpK,CACnB,KACK,MAAIkK,aAAec,aAKpB,MAAM,IAAItL,MAAM,uBAJhBkC,KAAKmJ,MAAQb,EACbtI,KAAKwI,QAAUD,CAInB,CACJ,CACAc,aAAe,OAAOrJ,KAAKmJ,KAAO,CAClCG,WAAWC,EAAKC,GACZ,GAAID,EAAM,EACN,MAAM,IAAIzL,MAAM,GAAG0L,gCAC3B,CACAC,cAAc9G,EAAO1B,EAAKf,EAAKsJ,GAC3B,GAAK7G,EAAQ1B,GAAS0B,EAAQzC,EAC1B,MAAM,IAAIpC,MAAM,YAAY0L,MAAY7G,oBAAwB1B,MAAQf,KAChF,CACAwJ,KAAKC,EAAKC,EAAKC,GACX,IAAK,IAAIvL,EAAI,EAAGA,EAAIuL,EAAOvL,IACvBsL,EAAItL,GAAKqL,EAAIrL,EACrB,CACAwL,SAASC,GACL,GAAI/J,KAAKwI,SAAWuB,EAAMvB,QACtB,MAAM,IAAI1K,MAAM,mBAAmBkC,KAAKwI,cAAcuB,EAAMvB,YAChExI,KAAK0J,KAAKK,EAAMZ,MAAOnJ,KAAKmJ,MAAOnJ,KAAKgK,cACxChK,KAAKyI,UACT,CACIrK,aACA,OAAO4B,KAAKwI,OAChB,CACIyB,aACA,OAAOjK,KAAKmJ,KAChB,CACIc,WAAO7H,GACPpC,KAAKmJ,MAAQ/G,EACbpC,KAAKyI,UACT,CACIyB,cACA,OAAOlK,KAAKyI,QAChB,CACIyB,YAAQvH,GACR3C,KAAKyI,SAAW9F,CACpB,CACAwH,iBAAiBC,GAAS,GACtBpK,KAAKyI,UACT,CACIuB,mBACA,OAAOxM,KAAKE,OAAOsC,KAAKwI,QAAU,IAAQ,GAC9C,CACI6B,oBACA,OAAOrK,KAAKyI,UAAYzI,KAAK+I,sBAAwB/I,KAAK8I,eAAiB,EAC/E,CACIuB,kBAAcnC,GACdlI,KAAK8I,eAAiBZ,EACtBlI,KAAK+I,sBAAwB/I,KAAKyI,QACtC,CACI6B,WACA,OAAOtK,IACX,CACAuK,UAAU5H,GACN,GAAIA,EAAQ,EACR,MAAM,IAAI7E,MAAM,kBACpB,GAAI6E,GAAS3C,KAAKwI,QACd,OACJ,MAAMgC,EAAchN,KAAKE,OAAOiF,EAAQ,IAAQ,IAChD,GAAK6H,EAAcxK,KAAKmJ,MAAM/K,QAAaoM,EAAcxK,KAAKgJ,iBAAoBhJ,KAAKmJ,MAAM/K,OAAS,CAClG,MAAMqM,EAAU,IAAIrB,YAAYoB,GAChCxK,KAAK0J,KAAK1J,KAAKmJ,MAAOsB,EAAUD,EAAcxK,KAAKmJ,MAAM/K,OAAU4B,KAAKmJ,MAAM/K,OAASoM,GACvFxK,KAAKmJ,MAAQsB,CACjB,CACI9H,EAAQ3C,KAAKwI,UACTxI,KAAKwI,QAAU,GAAO,IACtBxI,KAAKmJ,MAAMnJ,KAAKgK,aAAe,KAAO,IAAOhK,KAAKwI,QAAU,GAAQ,KAAS,GACjFxI,KAAKmJ,MAAMvK,KAAK,EAAGoB,KAAKgK,aAAcQ,IAE1CxK,KAAKwI,QAAU7F,EACf3C,KAAKyI,UACT,CACAL,eAAesC,EAAMC,GACjB,GAAID,EAAKlC,SAAWmC,EAAKnC,QACrB,MAAM,IAAI1K,MAAM,mBAAmB4M,EAAKlC,cAAcmC,EAAKnC,YAC/D,MAAMoC,EAAO,IAAI7D,EAAS2D,EAAKlC,SAC/BoC,EAAKpC,QAAUkC,EAAKlC,QACpBoC,EAAKzB,MAAQpC,EAASmC,cAAc0B,EAAKpC,SACzCoC,EAAKnC,SAAW,EAChB,MAAM3H,EAAM4J,EAAKV,aACjB,IAAK,IAAI1L,EAAI,EAAGA,EAAIwC,EAAKxC,IACrBsM,EAAKzB,MAAM7K,GAAKoM,EAAKvB,MAAM7K,GAAKqM,EAAKxB,MAAM7K,GAC/C,OAAOsM,CACX,CACAxC,qBAAqBhK,GACjB,OAAO,IAAIgL,YAAY5L,KAAKE,OAAOU,EAAS,IAAQ,IACxD,CACAgK,kBAAkB5H,GACd,MAAMoK,EAAO,IAAI7D,EAASvG,EAAOpC,QACjCwM,EAAKnC,SAAW,EAChB,IAAK,IAAInK,EAAI,EAAGA,EAAIsM,EAAKpC,QAASlK,IAC1BkC,EAAOlC,KACPsM,EAAKzB,MAAM3L,KAAKE,MAAMY,EAAI,MAAU,IAAOA,EAAI,GAAQ,KAE/D,OAAOsM,CACX,CAEAxC,eAAeyB,EAAOgB,GAClB,MAAMD,EAAO,IAAI7D,EAAS8C,GAC1B,IAAK,IAAIvL,EAAI,EAAGA,EAAIuL,IAASvL,EACzBsM,EAAKE,OAAOxM,EAAGuM,EAAKvM,IAExB,OADAsM,EAAKnC,SAAW,EACTmC,CACX,CAEAxC,kBAAkB2C,GACd,OAAOhE,EAASiE,QAAQD,EAAE3M,QAASE,GAAqB,KAAfyM,EAAEE,OAAO3M,IACtD,CAEA8J,uBAAuBI,EAASW,GAC5B,MAAMyB,EAAO,IAAI7D,EAASyB,GAE1B,OADAoC,EAAKzB,MAAQA,EACNyB,CACX,CAEAxC,iBAAiB8C,GACb,MAAMpK,EAAMoK,EAAM9M,OACZwM,EAAO,IAAI7D,EAAe,EAANjG,GAC1B8J,EAAKzB,MAAQ,IAAIC,YAAY5L,KAAKE,OAAOoD,EAAM,GAAK,IACpD8J,EAAKpC,QAAgB,EAAN1H,EACf,IAAIqK,EAAO,EACPC,EAAO,EACX,KAAQtK,EAAMsK,GAAS,GACnBR,EAAKzB,MAAMgC,KAA2B,IAAdD,EAAME,IAAoC,IAAlBF,EAAME,EAAO,KAAc,GACnD,IAAlBF,EAAME,EAAO,KAAc,IAA6B,IAAlBF,EAAME,EAAO,KAAc,GACvEA,GAAQ,EASZ,OAPItK,EAAMsK,GAAQ,IACdR,EAAKzB,MAAMgC,IAA2B,IAAlBD,EAAME,EAAO,KAAc,IAC/CtK,EAAMsK,GAAQ,IACdR,EAAKzB,MAAMgC,KAA4B,IAAlBD,EAAME,EAAO,KAAc,GAChDtK,EAAMsK,GAAQ,IACdR,EAAKzB,MAAMgC,IAAuB,IAAdD,EAAME,IAC9BR,EAAKnC,SAAW,EACTmC,CACX,CACAzC,WACI,MAAO,GAAGnI,KAAKwI,iBAAiBxI,KAAKqL,WAAU,QACnD,CAEAC,OAAOvB,GACH,GAAI/J,MAAQ+J,EACR,OAAO,EACX,GAAa,MAATA,EACA,OAAO,EACX,GAAI/J,KAAKwI,SAAWuB,EAAMvB,QACtB,OAAO,EACX,GAAoB,GAAhBxI,KAAKwI,QACL,OAAO,EACX,IAAK,IAAIlK,EAAI,EAAGA,EAAI0B,KAAKmJ,MAAM/K,OAAS,EAAGE,IACvC,GAAI0B,KAAKmJ,MAAM7K,IAAMyL,EAAMZ,MAAM7K,GAC7B,OAAO,EACf,IAAK,IAAIA,EAA8B,GAAzB0B,KAAKmJ,MAAM/K,OAAS,GAAQE,EAAI0B,KAAKwI,QAASlK,IACxD,GAAI0B,KAAKuL,OAAOjN,IAAMyL,EAAMwB,OAAOjN,GAC/B,OAAO,EAEf,OAAO,CACX,CAEAkN,QACI,MAAMC,EAAW,IAAI1E,EAAS,GAAG,GAIjC,OAHA0E,EAAStC,MAAQC,YAAYsC,KAAK1L,KAAKmJ,OACvCsC,EAASjD,QAAUxI,KAAKwI,QACxBiD,EAAShD,SAAWzI,KAAKyI,SAClBgD,CACX,CAEAE,KAAKd,EAAMT,GACPpK,KAAK4L,QAAO,GAAO,GACnB,IAAK,IAAItN,EAAI,EAAGA,EAAI0B,KAAKwI,QAASlK,IAC1BuM,EAAKvM,KACL0B,KAAKmJ,MAAM3L,KAAKE,MAAMY,EAAI,MAAU,IAAOA,EAAI,GAAQ,KAG/D,OADA0B,KAAKmK,iBAAiBC,GACfpK,IACX,CAEA6L,OAAOzB,GAAS,GACZ,IAAK,IAAI9L,EAAI,EAAGA,EAAI0B,KAAKmJ,MAAM/K,OAAQE,IACnC0B,KAAKmJ,MAAM7K,KAAO,EACtB0B,KAAKmK,iBAAiBC,EAC1B,CAEAwB,OAAOjJ,EAAOyH,GAAS,GACnB,MAAM0B,EAAQnJ,GAAS,EAAI,EACrB7B,EAAMd,KAAKgK,aACjB,IAAK,IAAI1L,EAAI,EAAGA,EAAIwC,EAAKxC,IACrB0B,KAAKmJ,MAAM7K,GAAKwN,EACpB9L,KAAKmK,iBAAiBC,EAC1B,CAIA2B,WAAWC,EAASrJ,GAAQ,EAAMsJ,GAAQ,EAAM7B,GAAS,GACjD6B,GACAjM,KAAK4L,QAAQjJ,GAAO,GACxB,IAAK,MAAMrE,KAAK0N,EACZhM,KAAKkM,QAAQ5N,EAAGqE,GACpB3C,KAAKmK,iBAAiBC,EAC1B,CACA+B,WAAWH,EAASrJ,GAAQ,GACxB,IAAK,MAAMC,KAASoJ,EAChB,GAAIhM,KAAKuL,OAAO3I,IAAUD,EACtB,OAAO,EAEf,OAAO,CACX,CACAyJ,SAASJ,EAASrJ,GAAQ,GACtB,IAAK,MAAMC,KAASoJ,EAChB,GAAIhM,KAAKuL,OAAO3I,IAAUD,EACtB,OAAO,EAEf,OAAO,CACX,CACA0J,SAASC,EAAO3J,GAAQ,EAAMsJ,GAAQ,EAAM7B,GAAS,EAAMmC,GAAa,GAGpE,GAFIN,GAASM,GACTvM,KAAK4L,QAAQjJ,GAAO,GACpB4J,EACA,IAAK,IAAIjO,EAAI,EAAGA,EAAI0B,KAAKwI,QAASlK,IAC1BgO,EAAMhO,IACN0B,KAAKkM,QAAQ5N,EAAGqE,QAIxB,IAAK,IAAIrE,EAAI,EAAGA,EAAI0B,KAAKwI,QAASlK,IAC9B0B,KAAKkM,QAAQ5N,EAAGgO,EAAMhO,GAAKqE,GAASA,GAE5C3C,KAAKmK,iBAAiBC,EAC1B,CACAoC,SAASd,EAAMe,GACXzM,KAAKyJ,cAAciC,EAAM,EAAG1L,KAAKwI,QAAU,EAAG,QAC9CxI,KAAKyJ,cAAcgD,EAAI,EAAGzM,KAAKwI,QAAS,MACxC,MAAMkE,EAAM,GACZ,IAAK,IAAIpO,EAAIoN,EAAMpN,EAAImO,IAAMnO,EACzBoO,EAAIC,KAAK3M,KAAKuL,OAAOjN,IACzB,OAAOyI,EAAS6F,WAAWF,EAC/B,CACAG,eAAenB,EAAMe,GACjBzM,KAAKyJ,cAAciC,EAAM,EAAG1L,KAAKwI,QAAU,EAAG,QAC9CxI,KAAKyJ,cAAcgD,EAAI,EAAGzM,KAAKwI,QAAS,MACxC,MAAMkE,EAAM,GACZ,IAAK,IAAIpO,EAAIoN,EAAMpN,EAAImO,IAAMnO,EACzBoO,EAAIC,KAAK3M,KAAKuL,OAAOjN,IACzB,OAAOoO,CACX,CACAI,SAASpB,EAAMe,EAAI9J,EAAOyH,GAAS,GAC/BpK,KAAKyJ,cAAciC,EAAM,EAAG1L,KAAKwI,QAAU,EAAG,QAC9CxI,KAAKyJ,cAAcgD,EAAI,EAAGzM,KAAKwI,QAAU,EAAG,MAC5C,MAAM7G,EAAQnE,KAAKyD,IAAIyK,EAAMe,GACvB7K,EAAMpE,KAAK0C,IAAIwL,EAAMe,GAE3B,GAAI9J,EACA,IAAK,IAAIrE,EAAIqD,EAAOrD,GAAKsD,EAAKtD,IAC1B0B,KAAK+M,QAAQzO,QAGjB,IAAK,IAAIA,EAAIqD,EAAOrD,GAAKsD,EAAKtD,IAC1B0B,KAAKgN,SAAS1O,GAGtB,OADA0B,KAAKmK,iBAAiBC,GACfpK,IACX,CAEAiN,UAAU9H,EAAGxC,EAAOyH,GAAS,GACzB,GAAIjF,EAAI,GAAKA,EAAInF,KAAKwI,QAClB,MAAM,IAAI1K,MAAM,8BAChBqH,EAAInF,KAAKwI,QAAU,GACnBxI,KAAKiN,UAAUjN,KAAKwI,QAAUrD,GAAIxC,GACtC3C,KAAK4L,QAAQjJ,GACb,IAAK,IAAIuK,EAAI,EAAGA,EAAI/H,GAAI,CACpB,MAAM7G,EAAId,KAAKE,MAAMF,KAAKC,SAAWuC,KAAKwI,SACtCxI,KAAKuL,OAAOjN,IAAMqE,IAEtB3C,KAAKkM,QAAQ5N,EAAGqE,GAChBuK,IACJ,CACAlN,KAAKmK,iBAAiBC,EAC1B,CAGA+C,IAAIxK,EAAOyH,GAAS,GAChB,GAAIpK,KAAKwI,SAAW7F,EAAM6F,QACtB,MAAM,IAAI1K,MAAM,yBACpB,IAAK,IAAIQ,EAAI,EAAGwC,EAAMd,KAAKgK,aAAc1L,EAAIwC,EAAKxC,IAC9C0B,KAAKmJ,MAAM7K,IAAMqE,EAAMwG,MAAM7K,GAEjC,OADA0B,KAAKmK,iBAAiBC,GACfpK,IACX,CAGAoN,OAAOzK,EAAOyH,GAAS,GACnB,GAAIpK,KAAKwI,SAAW7F,EAAM6F,QACtB,MAAM,IAAI1K,MAAM,yBACpB,MAAMgD,EAAMd,KAAKgK,aACjB,IAAK,IAAIoB,EAAO,EAAGA,EAAOtK,EAAKsK,IAC3BpL,KAAKmJ,MAAMiC,KAAUzI,EAAMwG,MAAMiC,GAErC,OADApL,KAAKmK,iBAAiBC,GACfpK,IACX,CAGAqN,OAAO1K,EAAOyH,GAAS,GACnB,GAAIpK,KAAKwI,SAAW7F,EAAM6F,QACtB,MAAM,IAAI1K,MAAM,yBACpB,IAAK,IAAIQ,EAAI,EAAGwC,EAAMd,KAAKgK,aAAc1L,EAAIwC,EAAKxC,IAC9C0B,KAAKmJ,MAAM7K,IAAO0B,KAAKmJ,MAAM7K,GAAMqE,EAAMwG,MAAM7K,GAEnD,OADA0B,KAAKmK,iBAAiBC,GACfpK,IACX,CAEAsN,IAAIlD,GAAS,GACT,IAAK,IAAI9L,EAAI,EAAGwC,EAAMd,KAAKgK,aAAc1L,EAAIwC,EAAKxC,IAC9C0B,KAAKmJ,MAAM7K,IAAM0B,KAAKmJ,MAAM7K,GAEhC,OADA0B,KAAKmK,iBAAiBC,GACfpK,IACX,CAGAuN,GAAG5K,EAAOyH,GAAS,GACf,GAAIpK,KAAKwI,SAAW7F,EAAM6F,QACtB,MAAM,IAAI1K,MAAM,yBACpB,IAAK,IAAIQ,EAAI,EAAGwC,EAAMd,KAAKgK,aAAc1L,EAAIwC,EAAKxC,IAC9C0B,KAAKmJ,MAAM7K,IAAMqE,EAAMwG,MAAM7K,GAEjC,OADA0B,KAAKmK,iBAAiBC,GACfpK,IACX,CAGAwN,IAAI7K,EAAOyH,GAAS,GAChB,GAAIpK,KAAKwI,SAAW7F,EAAM6F,QACtB,MAAM,IAAI1K,MAAM,yBACpB,IAAK,IAAIQ,EAAI,EAAGwC,EAAMd,KAAKgK,aAAc1L,EAAIwC,EAAKxC,IAC9C0B,KAAKmJ,MAAM7K,IAAMqE,EAAMwG,MAAM7K,GAEjC,OADA0B,KAAKmK,iBAAiBC,GACfpK,IACX,CAEAyN,SAASC,EAAKvI,EAAG0F,GAAO,GAEpB,GADA7K,KAAKyJ,cAAciE,EAAK,EAAG1N,KAAKwI,QAAS,OAChC,GAALrD,EACA,OAIJ,MAAMwI,EAAY3N,KAAKwI,QACvBxI,KAAKuK,UAAUvK,KAAKwI,QAAUrD,GAE9B,IAAK,IAAI7G,EAAIqP,EAAY,EAAGrP,GAAKoP,EAAKpP,IAClC0B,KAAK8K,OAAOxM,EAAI6G,EAAGnF,KAAKuL,OAAOjN,IACnC,IAAK,IAAIA,EAAIoP,EAAKpP,EAAIoP,EAAMvI,EAAG7G,IAC3B0B,KAAK8K,OAAOxM,EAAGuM,EAEvB,CAGA+C,SAASF,EAAKvI,EAAI,GAEd,GAAIA,EAAI,EACJ,MAAM,IAAIrH,MAAM,wBAEpB,GADAkC,KAAKyJ,cAAciE,EAAK,EAAG1N,KAAKwI,QAAUrD,EAAG,OACzCnF,KAAK6N,UAAS,GACd,IAAK,IAAIvP,EAAIoP,EAAKpP,EAAI0B,KAAKwI,QAAUrD,EAAG7G,IACpC0B,KAAK8K,OAAOxM,EAAG0B,KAAKuL,OAAOjN,EAAI6G,IAEvCnF,KAAKuK,UAAUvK,KAAKwI,QAAUrD,EAClC,CACA2I,aAAaC,EAAMlD,GAAO,GACtB,GAAI7K,KAAKwI,SAAWuF,EAAK3P,OACrB,MAAM,IAAIN,MAAM,yBACpB,GAAIiQ,GAAQ/N,KACRA,KAAKuK,UAAUwD,EAAK1C,WAAWR,IAC/B7K,KAAK4L,QAAQf,OAEZ,CACD,IAAImD,EAAS,EACb,IAAK,IAAIC,GAAU,GAA+C,IAA3CA,EAASF,EAAKG,SAASD,GAASpD,KACnD7K,KAAKkM,QAAQ8B,IAAUhO,KAAKuL,OAAO0C,IACvCjO,KAAKwI,QAAUwF,EACfhO,KAAKyI,UACT,CACA,OAAOzI,IACX,CAEAuL,OAAOmC,GACH,OAAqE,IAA7D1N,KAAKmJ,MAAM3L,KAAKE,MAAMgQ,EAAM,KAAU,IAAY,GAANA,GACxD,CAEA5C,OAAO4C,EAAKS,EAAK/D,GAAS,GACtBpK,KAAKkM,QAAQwB,EAAKS,GAEdnO,KAAKyI,UAGb,CAEAyD,QAAQ5N,EAAGqE,GACHA,EACA3C,KAAKmJ,MAAM3L,KAAKE,MAAMY,EAAI,MAAU,IAAU,GAAJA,GAE1C0B,KAAKmJ,MAAM3L,KAAKE,MAAMY,EAAI,QAAY,IAAU,GAAJA,GACpD,CACAyO,QAAQW,GACJ1N,KAAKmJ,MAAM3L,KAAKE,MAAMgQ,EAAM,MAAU,IAAY,GAANA,EAChD,CACAV,SAASU,GACL1N,KAAKmJ,MAAM3L,KAAKE,MAAMgQ,EAAM,QAAY,IAAY,GAANA,GAClD,CACAU,YACI,OAAOpO,KAAKqL,WAAU,EAC1B,CACAgD,aACI,OAAOrO,KAAKqL,WAAU,EAC1B,CAEAA,UAAU1I,GACN,GAAoB,GAAhB3C,KAAKwI,QACL,OAAO,EACX,GAAIxI,KAAK4I,uBAAyB5I,KAAKyI,SAAU,CAC7CzI,KAAK2I,eAAiB,EACtB,MAAM7H,EAAMd,KAAKgK,aACjB,IAAI1L,EAAI,EACR,KAAOA,EAAIwC,EAAM,EAAGxC,IAChB,IAAK,IAAI4O,EAAIlN,KAAKmJ,MAAM7K,GAAS,GAAL4O,EAAQA,KAAO,EACvClN,KAAK2I,gBAAkB5B,EAASuH,YAAgB,IAAJpB,GAIpD,IAAIA,EAAIlN,KAAKmJ,MAAM7K,GACnB,MAAMiQ,EAA+B,GAAfvO,KAAKwI,QAG3B,IAFqB,GAAjB+F,IACArB,KAAO,YAAgBqB,IACf,GAALrB,EAAQA,KAAO,EAClBlN,KAAK2I,gBAAkB5B,EAASuH,YAAgB,IAAJpB,GAChDlN,KAAK4I,sBAAwB5I,KAAKyI,QACtC,CACA,OAAQ9F,EAAQ3C,KAAK2I,eAAiB3I,KAAKwI,QAAUxI,KAAK2I,cAC9D,CAEA6F,WAAWlC,GACP,IAAImC,EAAS,EACb,GAAIzO,KAAKoO,aAAepO,KAAKwI,QACzB,IAAK,IAAIlK,EAAI,EAAGA,EAAI0B,KAAKwI,QAASlK,IAC9BmQ,GAAUnC,EAAMhO,GAAK,EAAI,OAG7B,IAAK,IAAIA,GAAK,GAAoC,IAAhCA,EAAI0B,KAAKkO,SAAS5P,GAAG,KACnCmQ,GAAUnC,EAAMhO,GAAK,EAAI,EAEjC,OAAOmQ,CACX,CAEAC,iBAAiBC,EAAQhM,GACrB,GAAoB,GAAhB3C,KAAKwI,QACL,OAAO,EACX,IAAIqB,EAAQ,EACZ,MAAM/I,EAAMd,KAAKgK,aACjB,IAAI1L,EAAI,EACR,KAAOA,EAAIwC,EAAM,EAAGxC,IAChB,IAAK,IAAI4O,EAAIlN,KAAKmJ,MAAM7K,GAAKqQ,EAAOxF,MAAM7K,GAAS,GAAL4O,EAAQA,KAAO,EACzDrD,GAAS9C,EAASuH,YAAgB,IAAJpB,GAGtC,IAAIA,EAAIlN,KAAKmJ,MAAM7K,GAAKqQ,EAAOxF,MAAM7K,GACrC,MAAMiQ,EAA+B,GAAfvO,KAAKwI,QAG3B,IAFqB,GAAjB+F,IACArB,KAAO,YAAgBqB,IACf,GAALrB,EAAQA,KAAO,EAClBrD,GAAS9C,EAASuH,YAAgB,IAAJpB,GAClC,OAAQvK,EAAQkH,EAAQ7J,KAAKwI,QAAUqB,CAC3C,CACAoC,QACIjM,KAAKuK,UAAU,EACnB,CACAsD,SAASlL,GACL,OAAO3C,KAAKkO,UAAU,EAAGvL,IAAU,CACvC,CACIiM,cACA,OAAO5O,KAAKqL,WAAU,IAASrL,KAAKwI,OACxC,CACIqG,eACA,OAAO7O,KAAKqL,WAAU,IAAUrL,KAAKwI,OACzC,CACIsG,cACA,OAAO9O,KAAKqL,WAAU,GAAQ,CAClC,CACI0D,eACA,OAAO/O,KAAKqL,WAAU,GAAS,CACnC,CAGA6C,SAAStL,EAAOD,GAAQ,GAEpB,GADA3C,KAAKyJ,cAAc7G,GAAQ,EAAG5C,KAAKwI,QAAS,SACxC5F,GAAS5C,KAAKwI,QAAU,EACxB,OAAQ,EAEZ,IAAIwG,EAAqB,IADzBpM,EAAQA,EAAQ,EAAI,EAAIA,EAAQ,GAEhC,MAAMqM,EAAUjP,KAAKgK,aACrB,IAAK,IAAI1L,EAAId,KAAKE,MAAMkF,EAAQ,IAAKtE,EAAI2Q,EAAS3Q,IAAK,CACnD,IAAI4O,EAAKvK,EAAQ3C,KAAKmJ,MAAM7K,IAAM0B,KAAKmJ,MAAM7K,GAC7C,GAAkB,GAAd0Q,EACA9B,GAAO,YAAc8B,EAAc,WACnCA,EAAa,OAEZ,IAAKrM,IAAe,YAANuK,EACf,SAEJ,IAAK,IAAIlO,EAAI,EAAQ,GAALkO,EAAQlO,GAAK,EAAGkO,KAAO,EAAG,CACtC,MAAMlP,EAAI+I,EAASmI,YAAgB,IAAJhC,GAC/B,GAAIlP,GAAK,EAEL,OADA4E,EAAQ5E,EAAS,GAAJM,EAAUU,IACVgB,KAAKwI,SACN,EACL5F,CAEf,CACJ,CACA,OAAQ,CACZ,CAEAuM,SAASvM,EAAOD,GAAQ,GACpB,GAAa,GAATC,EACA,OAAQ,EACZ5C,KAAKyJ,cAAc7G,GAAQ,EAAG5C,KAAKwI,QAAS,SAG5C,IAAI+F,EAAyB,GAF7B3L,EAAQA,EAAQ,EAAI5C,KAAKwI,QAAU,EAAI5F,EAAQ,GAEb,GAClC,IAAK,IAAItE,EAFUd,KAAKE,MAAMkF,EAAQ,IAEbtE,GAAK,EAAGA,IAAK,CAClC,IAAI4O,EAAKvK,EAAQ3C,KAAKmJ,MAAM7K,IAAM0B,KAAKmJ,MAAM7K,GACxB,GAAjBiQ,IACArB,KAAO,YAAgBqB,GACvBA,EAAgB,GAEpB,IAAK,IAAIvP,EAAI,GAAS,GAALkO,EAAQlO,GAAK,EAAGkO,IAAM,EAAG,CACtC,MAAMlP,EAAI+I,EAASqI,WAAWlC,IAAM,IACpC,GAAIlP,GAAK,EACL,OAAOA,EAAS,GAAJM,EAAUU,CAC9B,CACJ,CACA,OAAQ,CACZ,EAEJ+H,EAASuH,YAAce,UAAU3D,KAAK,CAClC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAEjD3E,EAASmI,YAAcG,UAAU3D,KAAK,EACjC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC9C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAEjD3E,EAASqI,WAAaC,UAAU3D,KAAK,EAChC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC9C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG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","sources":["webpack://bio/webpack/runtime/chunk loaded","webpack://bio/webpack/runtime/startup chunk dependencies","webpack://bio/./node_modules/@datagrok-libraries/ml/src/typed-metrics/consts.js","webpack://bio/./node_modules/@datagrok-libraries/utils/src/random.js","webpack://bio/./node_modules/@datagrok-libraries/utils/src/vector-operations.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/distance-matrix/proxy.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/distance-matrix/distance-matrix-service.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/spe.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/typed-metrics/typed-metrics.js","webpack://bio/./node_modules/@datagrok-libraries/utils/src/bit-array.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/reduce-dimensionality.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/distance-matrix/distance-matrix.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/workers/dimensionality-reducer.js","webpack://bio/./node_modules/@keckelt/tsne/lib/index.js","webpack://bio/./node_modules/@keckelt/tsne/lib/tsne.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/ml-levenberg-marquardt/src/index.js","webpack://bio/./node_modules/umap-js/dist/heap.js","webpack://bio/./node_modules/umap-js/dist/index.js","webpack://bio/./node_modules/umap-js/dist/matrix.js","webpack://bio/./node_modules/umap-js/dist/nn_descent.js","webpack://bio/./node_modules/umap-js/dist/tree.js","webpack://bio/./node_modules/umap-js/dist/umap.js","webpack://bio/./node_modules/umap-js/dist/utils.js","webpack://bio/webpack/bootstrap","webpack://bio/webpack/runtime/define property getters","webpack://bio/webpack/runtime/ensure chunk","webpack://bio/webpack/runtime/get javascript chunk filename","webpack://bio/webpack/runtime/global","webpack://bio/webpack/runtime/hasOwnProperty shorthand","webpack://bio/webpack/runtime/make namespace object","webpack://bio/webpack/runtime/publicPath","webpack://bio/webpack/runtime/importScripts chunk loading","webpack://bio/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var next = __webpack_require__.x;\n__webpack_require__.x = () => {\n\treturn Promise.all([\n\t\t__webpack_require__.e(1),\n\t\t__webpack_require__.e(452)\n\t]).then(next);\n};","export var StringMetricsNames;\n(function (StringMetricsNames) {\n StringMetricsNames[\"Levenshtein\"] = \"Levenshtein\";\n StringMetricsNames[\"JaroWinkler\"] = \"Jaro-Winkler\";\n StringMetricsNames[\"Manhattan\"] = \"Manhattan\";\n})(StringMetricsNames || (StringMetricsNames = {}));\nexport var VectorMetricsNames;\n(function (VectorMetricsNames) {\n VectorMetricsNames[\"Euclidean\"] = \"Euclidean\";\n})(VectorMetricsNames || (VectorMetricsNames = {}));\nexport var BitArrayMetricsNames;\n(function (BitArrayMetricsNames) {\n BitArrayMetricsNames[\"Tanimoto\"] = \"Tanimoto\";\n BitArrayMetricsNames[\"Dice\"] = \"Dice\";\n BitArrayMetricsNames[\"Asymmetric\"] = \"Asymmetric\";\n BitArrayMetricsNames[\"BraunBlanquet\"] = \"Braun-Blanquet\";\n BitArrayMetricsNames[\"Cosine\"] = \"Cosine\";\n BitArrayMetricsNames[\"Kulczynski\"] = \"Kulczynski\";\n BitArrayMetricsNames[\"McConnaughey\"] = \"Mc-Connaughey\";\n BitArrayMetricsNames[\"RogotGoldberg\"] = \"Rogot-Goldberg\";\n BitArrayMetricsNames[\"Russel\"] = \"Russel\";\n BitArrayMetricsNames[\"Sokal\"] = \"Sokal\";\n BitArrayMetricsNames[\"Hamming\"] = \"Hamming\";\n BitArrayMetricsNames[\"Euclidean\"] = \"Euclidean\";\n})(BitArrayMetricsNames || (BitArrayMetricsNames = {}));\nexport var DistanceMetricsSubjects;\n(function (DistanceMetricsSubjects) {\n DistanceMetricsSubjects[\"Vector\"] = \"Vector\";\n DistanceMetricsSubjects[\"String\"] = \"String\";\n DistanceMetricsSubjects[\"BitArray\"] = \"BitArray\";\n DistanceMetricsSubjects[\"MacroMolecule\"] = \"MacroMolecule\";\n DistanceMetricsSubjects[\"Number\"] = \"Number\";\n})(DistanceMetricsSubjects || (DistanceMetricsSubjects = {}));\nexport var NumberMetricsNames;\n(function (NumberMetricsNames) {\n NumberMetricsNames[\"NumericDistance\"] = \"NumericDistance\";\n})(NumberMetricsNames || (NumberMetricsNames = {}));\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY29uc3RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBTixJQUFZLGtCQUlUO0FBSkgsV0FBWSxrQkFBa0I7SUFDMUIsaURBQTJCLENBQUE7SUFDM0Isa0RBQTRCLENBQUE7SUFDNUIsNkNBQXVCLENBQUE7QUFDekIsQ0FBQyxFQUpTLGtCQUFrQixLQUFsQixrQkFBa0IsUUFJM0I7QUFFSCxNQUFNLENBQU4sSUFBWSxrQkFFVDtBQUZILFdBQVksa0JBQWtCO0lBQzFCLDZDQUF1QixDQUFBO0FBQ3pCLENBQUMsRUFGUyxrQkFBa0IsS0FBbEIsa0JBQWtCLFFBRTNCO0FBRUgsTUFBTSxDQUFOLElBQVksb0JBYVQ7QUFiSCxXQUFZLG9CQUFvQjtJQUM1Qiw2Q0FBcUIsQ0FBQTtJQUNyQixxQ0FBYSxDQUFBO0lBQ2IsaURBQXlCLENBQUE7SUFDekIsd0RBQWdDLENBQUE7SUFDaEMseUNBQWlCLENBQUE7SUFDakIsaURBQXlCLENBQUE7SUFDekIsc0RBQThCLENBQUE7SUFDOUIsd0RBQWdDLENBQUE7SUFDaEMseUNBQWlCLENBQUE7SUFDakIsdUNBQWUsQ0FBQTtJQUNmLDJDQUFtQixDQUFBO0lBQ25CLCtDQUF1QixDQUFBO0FBQ3pCLENBQUMsRUFiUyxvQkFBb0IsS0FBcEIsb0JBQW9CLFFBYTdCO0FBRUgsTUFBTSxDQUFOLElBQVksdUJBTVQ7QUFOSCxXQUFZLHVCQUF1QjtJQUMvQiw0Q0FBaUIsQ0FBQTtJQUNqQiw0Q0FBaUIsQ0FBQTtJQUNqQixnREFBcUIsQ0FBQTtJQUNyQiwwREFBK0IsQ0FBQTtJQUMvQiw0Q0FBaUIsQ0FBQTtBQUNuQixDQUFDLEVBTlMsdUJBQXVCLEtBQXZCLHVCQUF1QixRQU1oQztBQUVILE1BQU0sQ0FBTixJQUFZLGtCQUVYO0FBRkQsV0FBWSxrQkFBa0I7SUFDNUIseURBQW1DLENBQUE7QUFDckMsQ0FBQyxFQUZXLGtCQUFrQixLQUFsQixrQkFBa0IsUUFFN0IiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZW51bSBTdHJpbmdNZXRyaWNzTmFtZXMge1xuICAgIExldmVuc2h0ZWluID0gJ0xldmVuc2h0ZWluJyxcbiAgICBKYXJvV2lua2xlciA9ICdKYXJvLVdpbmtsZXInLFxuICAgIE1hbmhhdHRhbiA9ICdNYW5oYXR0YW4nLFxuICB9XG5cbmV4cG9ydCBlbnVtIFZlY3Rvck1ldHJpY3NOYW1lcyB7XG4gICAgRXVjbGlkZWFuID0gJ0V1Y2xpZGVhbicsXG4gIH1cblxuZXhwb3J0IGVudW0gQml0QXJyYXlNZXRyaWNzTmFtZXMge1xuICAgIFRhbmltb3RvID0gJ1Rhbmltb3RvJyxcbiAgICBEaWNlID0gJ0RpY2UnLFxuICAgIEFzeW1tZXRyaWMgPSAnQXN5bW1ldHJpYycsXG4gICAgQnJhdW5CbGFucXVldCA9ICdCcmF1bi1CbGFucXVldCcsXG4gICAgQ29zaW5lID0gJ0Nvc2luZScsXG4gICAgS3VsY3p5bnNraSA9ICdLdWxjenluc2tpJyxcbiAgICBNY0Nvbm5hdWdoZXkgPSAnTWMtQ29ubmF1Z2hleScsXG4gICAgUm9nb3RHb2xkYmVyZyA9ICdSb2dvdC1Hb2xkYmVyZycsXG4gICAgUnVzc2VsID0gJ1J1c3NlbCcsXG4gICAgU29rYWwgPSAnU29rYWwnLFxuICAgIEhhbW1pbmcgPSAnSGFtbWluZycsXG4gICAgRXVjbGlkZWFuID0gJ0V1Y2xpZGVhbicsXG4gIH1cblxuZXhwb3J0IGVudW0gRGlzdGFuY2VNZXRyaWNzU3ViamVjdHMge1xuICAgIFZlY3RvciA9ICdWZWN0b3InLFxuICAgIFN0cmluZyA9ICdTdHJpbmcnLFxuICAgIEJpdEFycmF5ID0gJ0JpdEFycmF5JyxcbiAgICBNYWNyb01vbGVjdWxlID0gJ01hY3JvTW9sZWN1bGUnLFxuICAgIE51bWJlciA9ICdOdW1iZXInLFxuICB9XG5cbmV4cG9ydCBlbnVtIE51bWJlck1ldHJpY3NOYW1lcyB7XG4gIE51bWVyaWNEaXN0YW5jZSA9ICdOdW1lcmljRGlzdGFuY2UnLFxufVxuXG4iXX0=","/**\n * Generates single random float from 0 to range.\n *\n * @export\n * @param {number} range Max generating value.\n * @return {number} A random float generated.\n */\nexport function randomFloat(range) {\n return Math.random() * range;\n}\n/**\n * Generates single random integer from 0 to range.\n *\n * @export\n * @param {number} range Max generating value.\n * @return {number} A random integer generated.\n */\nexport function randomInt(range) {\n return Math.floor(randomFloat(range));\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZG9tLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicmFuZG9tLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUMsS0FBYTtJQUN2QyxPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUM7QUFDL0IsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUMsS0FBYTtJQUNyQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDeEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVzIHNpbmdsZSByYW5kb20gZmxvYXQgZnJvbSAwIHRvIHJhbmdlLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7bnVtYmVyfSByYW5nZSBNYXggZ2VuZXJhdGluZyB2YWx1ZS5cbiAqIEByZXR1cm4ge251bWJlcn0gQSByYW5kb20gZmxvYXQgZ2VuZXJhdGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmFuZG9tRmxvYXQocmFuZ2U6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLnJhbmRvbSgpICogcmFuZ2U7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIHNpbmdsZSByYW5kb20gaW50ZWdlciBmcm9tIDAgdG8gcmFuZ2UuXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtudW1iZXJ9IHJhbmdlIE1heCBnZW5lcmF0aW5nIHZhbHVlLlxuICogQHJldHVybiB7bnVtYmVyfSBBIHJhbmRvbSBpbnRlZ2VyIGdlbmVyYXRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJhbmRvbUludChyYW5nZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIE1hdGguZmxvb3IocmFuZG9tRmxvYXQocmFuZ2UpKTtcbn1cbiJdfQ==","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 */\nfunction 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 const diff = vectorAdd(p, q, -1);\n const sqdiff = vectorSquare(diff);\n const sqdiffSumm = itemsSum(sqdiff);\n return Math.sqrt(sqdiffSumm);\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 * @param {Vector} data numerical array\n */\nexport function normalize(data) {\n let mean = 0;\n let std = 0;\n for (let i = 0; i < data.length; ++i)\n mean += data[i];\n mean /= data.length;\n for (let i = 0; i < data.length; ++i)\n std += (data[i] - mean) * (data[i] - mean);\n std = Math.sqrt(std / data.length);\n for (let i = 0; i < data.length; ++i)\n data[i] = (data[i] - mean) / std;\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVjdG9yLW9wZXJhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ2ZWN0b3Itb3BlcmF0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVMsTUFBTSxFQUF1QyxNQUFNLHFCQUFxQixDQUFDO0FBQ3pGLE9BQU8sRUFBQyxXQUFXLEVBQUUsU0FBUyxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBRWhEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsTUFBTSxDQUFDLFlBQXFCLEtBQUssRUFBRSxVQUFrQixrQkFBa0I7SUFDckYsSUFBSSxDQUFDLFNBQVM7UUFDWixNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzdCLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQVMsZUFBZSxDQUFDLFVBQWtCLEVBQUUsVUFBa0IsRUFBRSxPQUFlLENBQUM7SUFDL0UsT0FBTyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6RixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsTUFBYztJQUM1QyxPQUFPLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQ3ZDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1B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QUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBQ3JFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge01hdHJpeCwgVmVjdG9yLCBDb29yZGluYXRlcywgVmVjdG9ycywgRGlzdGFuY2VNZXRyaWN9IGZyb20gJy4vdHlwZS1kZWNsYXJhdGlvbnMnO1xuaW1wb3J0IHtyYW5kb21GbG9hdCwgcmFuZG9tSW50fSBmcm9tICcuL3JhbmRvbSc7XG5cbi8qKlxuICogQXNzZXJ0cyBhIGNvbmRpdGlvbiBieSB0aHJvd2luZyBhbiBFcnJvci5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtjb25kaXRpb249ZmFsc2VdIENvbmRpdGlvbiB0byBhc3NlcnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2U9J0Fzc2VydGlvbiBlcnJvci4nXSBNZXNzYWdlIHRvIG91dHB1dC5cbiAqIEB0aHJvd3Mge0Vycm9yfVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0KGNvbmRpdGlvbjogYm9vbGVhbiA9IGZhbHNlLCBtZXNzYWdlOiBzdHJpbmcgPSAnQXNzZXJ0aW9uIGVycm9yLicpIHtcbiAgaWYgKCFjb25kaXRpb24pXG4gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgbmV3IHR3by1kaW1lbnNpb25hbCBhcnJheSBhbmQgZmlsbHMgaXQgd2l0aCB0aGUgdmFsdWUgZ2l2ZW4uXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGRpbWVuc2lvbjEgVGhlIGZpcnN0IGRpbWVuc2lvbiBvZiB0aGUgY29vcmRpbmF0ZXMgKG51bWJlciBvZiByb3dzKS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBkaW1lbnNpb24yIFRoZSBzZWNvbmQgZGltZW5zaW9uIG9mIHRoZSBjb29yZGluYXRlcyAobnVtYmVyIG9mIGNvbHVtbnMpLlxuICogQHBhcmFtIHtudW1iZXJ9IFtmaWxsPTBdIEEgdmFsdWUgdG8gZmlsbCB0aGUgY29vcmRpbmF0ZXMgd2l0aC5cbiAqIEByZXR1cm4ge0Nvb3JkaW5hdGVzfSBBIHR3by1kaW1lbnNpb25hbCBmaWxsZWQgd2l0aCB0aGUgdmFsdWUgZ2l2ZW4uXG4gKiBAdG9kbyBNaWdodCBiZSBzbG93IHNpbmNlIHVzZWQgQXJyYXkubWFwLiBQcm9iYWJseSBuZWVkcyBwZXJmb3JtYW5jZSByZXZpc2lvbi5cbiAqL1xuZnVuY3Rpb24gaW5pdENvb3JkaW5hdGVzKGRpbWVuc2lvbjE6IG51bWJlciwgZGltZW5zaW9uMjogbnVtYmVyLCBmaWxsOiBudW1iZXIgPSAwKTogQ29vcmRpbmF0ZXMge1xuICByZXR1cm4gbmV3IEFycmF5KGRpbWVuc2lvbjEpLmZpbGwoZmlsbCkubWFwKCgpID0+IChuZXcgVmVjdG9yKGRpbWVuc2lvbjIpLmZpbGwoZmlsbCkpKTtcbn1cblxuLyoqXG4gKiBUcmFuc3Bvc2UgbWF0cml4LlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7TWF0cml4fSBtYXRyaXggVGhlIG1hdHJpeCB0byBiZSB0cmFuc3Bvc2VkLlxuICogQHJldHVybiB7TWF0cml4fSBUcmFuc3Bvc2VkIG1hdHJpeC5cbiAqIEB0b2RvIE1pZ2h0IGJlIHNsb3cgc2luY2UgdXNlZCBBcnJheS5tYXAuIFByb2JhYmx5IG5lZWRzIHBlcmZvcm1hbmNlIHJldmlzaW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNwb3NlTWF0cml4KG1hdHJpeDogTWF0cml4KTogTWF0cml4IHtcbiAgcmV0dXJuIG5ldyBBcnJheShtYXRyaXhbMF0ubGVuZ3RoKS5maWxsKDApXG4gICAgLm1hcCgoXywgaSkgPT4gKG5ldyBWZWN0b3IobWF0cml4Lmxlbmd0aCkuZmlsbCgwKS5tYXAoKF8sIGopID0+IChtYXRyaXhbal1baV0pKSkpO1xufVxuXG4vKipcbiAqIEFkZHMgdHdvIHZlY3RvcnMgd2l0aCB0aGUgc2Vjb25kIG9uZSB0byBiZSBtdWx0aXBsaWVkIGJ5IHRoZSBnaXZlbiByYXRpby5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge1ZlY3Rvcn0gcCBUaGUgZmlyc3QgdmVjdG9yIHRvIGFkZC5cbiAqIEBwYXJhbSB7VmVjdG9yfSBxIFRoZSBzZWNvbmQgdmVjdG9yIHRvIGFkZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbbXVsdGlwbGllcj0xXSBBIG11bHRpcGxpZXIgdG8gYmUgdXNlZCBiZWZvcmUgdGhlIHNlY29uZCB2ZWN0b3IgaXMgYWRkZWQuXG4gKiBAcmV0dXJuIHtWZWN0b3J9IE5ldyB2ZWN0b3IgY29udGFpbmVkIHRoZSByZXN1bHQgb2Ygb3BlcmF0aW9uIHArbXVsdGlwbGllcipxLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmVjdG9yQWRkKHA6IFZlY3RvciwgcTogVmVjdG9yLCBtdWx0aXBsaWVyOiBudW1iZXIgPSAxKTogVmVjdG9yIHtcbiAgY29uc3Qgbkl0ZW1zID0gcC5sZW5ndGg7XG5cbiAgYXNzZXJ0KG5JdGVtcyA9PSBxLmxlbmd0aCwgJ1ZlY3RvciBsZW5ndGhzIGRvIG5vdCBtYXRjaC4nKTtcblxuICBjb25zdCB0b3RhbCA9IG5ldyBWZWN0b3Iobkl0ZW1zKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHAubGVuZ3RoOyArK2kpXG4gICAgdG90YWxbaV0gPSBwW2ldICsgbXVsdGlwbGllciAqIHFbaV07XG5cbiAgcmV0dXJuIHRvdGFsO1xufVxuXG4vKipcbiAqIFN1bXMgdGhlIHZlY3RvcidzIGl0ZW1zLlxuICpcbiAqIEBwYXJhbSB7VmVjdG9yfSB2IFRoZSB2ZWN0b3IgdG8gYmUgc3VtbWVkLlxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgdmVjdG9yJ3MgaXRlbXMgc3VtLlxuICovXG5mdW5jdGlvbiBpdGVtc1N1bSh2OiBWZWN0b3IpOiBudW1iZXIge1xuICBsZXQgdG90YWwgPSAwO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdi5sZW5ndGg7ICsraSlcbiAgICB0b3RhbCArPSB2W2ldO1xuXG4gIHJldHVybiB0b3RhbDtcbn1cblxuLyoqXG4gKiBTdXFhcmVzIHRoZSB2ZWN0b3IncyBpdGVtcy5cbiAqXG4gKiBAcGFyYW0ge1ZlY3Rvcn0gdiBUaGUgdmVjdG9yIHRvIHNxdWFyZS5cbiAqIEByZXR1cm4ge1ZlY3Rvcn0gQSBuZXcgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIG9yaWdpbmFsJ3MgaXRlbXMgc3F1YXJlZC5cbiAqL1xuZnVuY3Rpb24gdmVjdG9yU3F1YXJlKHY6IFZlY3Rvcik6IFZlY3RvciB7XG4gIGNvbnN0IG5JdGVtcyA9IHYubGVuZ3RoO1xuICBjb25zdCB0b3RhbCA9IG5ldyBWZWN0b3Iobkl0ZW1zKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHYubGVuZ3RoOyArK2kpXG4gICAgdG90YWxbaV0gPSB2W2ldICogdltpXTtcblxuICByZXR1cm4gdG90YWw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2ZWN0b3JMZW5ndGgodjogVmVjdG9yKTogbnVtYmVyIHtcbiAgbGV0IHNxclN1bTogbnVtYmVyID0gMDtcbiAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHYubGVuZ3RoOyBpKyspXG4gICAgc3FyU3VtICs9IHZbaV0gKiB2W2ldO1xuICByZXR1cm4gTWF0aC5zcXJ0KHNxclN1bSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2ZWN0b3JEb3RQcm9kdWN0KHYxOiBWZWN0b3IsIHYyOiBWZWN0b3IpOiBudW1iZXIge1xuICBpZiAodjEubGVuZ3RoICE9IHYyLmxlbmd0aClcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBkaW1lbnNpb25hbGl0eSBvZiB0aGUgdmVjdG9ycyBtdXN0IG1hdGNoJyk7XG4gIGxldCBwcm9kOiBudW1iZXIgPSAwO1xuICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdjEubGVuZ3RoOyBpKyspXG4gICAgcHJvZCArPSB2MVtpXSAqIHYyW2ldO1xuICByZXR1cm4gcHJvZDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZpbGxlZCB3aXRoIHJhbmRvbSBmbG9hdGluZyBwb2ludCB2YWx1ZXMuXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtudW1iZXJ9IGRpbWVuc2lvbjEgVGhlIGZpcnN0IGRpbWVuc2lvbiBvZiB0aGUgbWF0cml4LlxuICogQHBhcmFtIHtudW1iZXJ9IGRpbWVuc2lvbjIgVGhlIHNlY29uZCBkaW1lbnNpb24gb2YgdGhlIG1hdHJpeC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbc2NhbGU9MS5dIE1heCB2YWx1ZSBnaXZlbiBieSByYW5kb20gZ2VuZXJhdG9yLlxuICogQHJldHVybiB7TWF0cml4fSBBIG5ldyBtYXRyaXggZmlsbGVkIHdpdGggcmFuZG9tIGZsb2F0aW5nIHBvaW50ICB2YWx1ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWxsUmFuZG9tTWF0cml4KGRpbWVuc2lvbjE6IG51bWJlciwgZGltZW5zaW9uMjogbnVtYmVyLCBzY2FsZTogbnVtYmVyID0gMS4pOiBNYXRyaXgge1xuICBjb25zdCBtYXRyaXggPSBpbml0Q29vcmRpbmF0ZXMoZGltZW5zaW9uMSwgZGltZW5zaW9uMik7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaW1lbnNpb24xOyArK2kpIHtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGRpbWVuc2lvbjI7ICsrailcbiAgICAgIG1hdHJpeFtpXVtqXSA9IHJhbmRvbUZsb2F0KHNjYWxlKTtcbiAgfVxuICByZXR1cm4gbWF0cml4O1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZXMgRXVjbGlkZWFuIGRpc3RhbmNlIGJldHdlZW4gdHdvIHZlY3RvcnMuXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtWZWN0b3J9IHAgVGhlIGZpcnN0IHZlY3Rvci5cbiAqIEBwYXJhbSB7VmVjdG9yfSBxIFRoZSBzZWNvbmQgdmVjdG9yLlxuICogQHJldHVybiB7bnVtYmVyfSBFdWNsaWRlYW4gZGlzdGFuY2UgYmV0d2VlbiB0aGUgZ2l2ZW4gdmVjdG9ycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGF0ZUV1Y2xpZGVhbkRpc3RhbmNlKHA6IFZlY3RvciwgcTogVmVjdG9yKTogbnVtYmVyIHtcbiAgY29uc3QgZGlmZiA9IHZlY3RvckFkZChwLCBxLCAtMSk7XG4gIGNvbnN0IHNxZGlmZiA9IHZlY3RvclNxdWFyZShkaWZmKTtcbiAgY29uc3Qgc3FkaWZmU3VtbSA9IGl0ZW1zU3VtKHNxZGlmZik7XG4gIHJldHVybiBNYXRoLnNxcnQoc3FkaWZmU3VtbSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRpc3RhbmNlIG1hdHJpeCB1c2luZyBhIGN1c3RvbSBkaXN0YW5jZSBmdW5jdGlvbi5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge1ZlY3RvcnN9IGRhdGEgSW5wdXQgdmVjdG9ycyB0byBjYWxjdWxhdGUgZGlzdGFuY2VzLlxuICogQHBhcmFtIHtEaXN0YW5jZU1ldHJpY30gZGlzdGFuY2UgQ3VzdG9tIGRpc3RhbmNlIGZ1bmN0aW9uLlxuICogQHJldHVybiB7TWF0cml4fSBDYWxjdWxhdGVkIGN1c3RvbSBkaXN0YW5jZSBtYXRyaXguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWxjRGlzdGFuY2VNYXRyaXgoZGF0YTogVmVjdG9ycywgZGlzdGFuY2U6IERpc3RhbmNlTWV0cmljKTogTWF0cml4IHtcbiAgY29uc3Qgbkl0ZW1zID0gZGF0YS5sZW5ndGg7XG4gIGNvbnN0IG1hdHJpeCA9IGluaXRDb29yZGluYXRlcyhuSXRlbXMsIG5JdGVtcywgMCk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuSXRlbXM7ICsraSkge1xuICAgIGZvciAobGV0IGogPSBpICsgMTsgaiA8IG5JdGVtczsgKytqKSB7XG4gICAgICBjb25zdCBkOiBudW1iZXIgPSAoZGF0YVtpXSA9PSBudWxsKSB8fCAoZGF0YVtqXSA9PSBudWxsKSA/IDAgOiBkaXN0YW5jZShkYXRhW2ldLCBkYXRhW2pdKTtcbiAgICAgIG1hdHJpeFtpXVtqXSA9IG1hdHJpeFtqXVtpXSA9IGQ7XG4gICAgfVxuICB9XG4gIHJldHVybiBtYXRyaXg7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRpc3RhbmNlIG1hdHJpeCB1c2luZyBhIGN1c3RvbSBkaXN0YW5jZSBmdW5jdGlvbi5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge1ZlY3RvcnN9IGRhdGEgSW5wdXQgdmVjdG9ycyB0byBjYWxjdWxhdGUgZGlzdGFuY2VzLlxuICogQHBhcmFtIHtEaXN0YW5jZU1ldHJpY30gZGlzdGFuY2UgQ3VzdG9tIGRpc3RhbmNlIGZ1bmN0aW9uLlxuICogQHJldHVybiB7TWF0cml4fSBDYWxjdWxhdGVkIGN1c3RvbSBkaXN0YW5jZSBtYXRyaXguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWxjTm9ybWFsaXplZERpc3RhbmNlTWF0cml4KGRhdGE6IFZlY3RvcnMsIGRpc3RhbmNlOiBEaXN0YW5jZU1ldHJpYyk6IE1hdHJpeCB7XG4gIGNvbnN0IG5JdGVtcyA9IGRhdGEubGVuZ3RoO1xuICBjb25zdCBtYXRyaXggPSBpbml0Q29vcmRpbmF0ZXMobkl0ZW1zLCBuSXRlbXMsIDApO1xuICBsZXQgbWF4ID0gTnVtYmVyLk1JTl9WQUxVRTtcbiAgbGV0IG1pbiA9IE51bWJlci5NQVhfVkFMVUU7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbkl0ZW1zOyArK2kpIHtcbiAgICBmb3IgKGxldCBqID0gaTsgaiA8IG5JdGVtczsgKytqKSB7XG4gICAgICBjb25zdCBkOiBudW1iZXIgPSAoZGF0YVtpXSA9PSBudWxsKSB8fCAoZGF0YVtqXSA9PSBudWxsIHx8IGkgPT09IGopID8gMCA6IGRpc3RhbmNlKGRhdGFbaV0sIGRhdGFbal0pO1xuICAgICAgbWF0cml4W2ldW2pdID0gbWF0cml4W2pdW2ldID0gZDtcbiAgICAgIGlmIChkID4gbWF4KSBtYXggPSBkO1xuICAgICAgaWYgKGQgPCBtaW4pIG1pbiA9IGQ7XG4gICAgfVxuICB9XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbkl0ZW1zOyArK2kpIHtcbiAgICBmb3IgKGxldCBqID0gaSArIDE7IGogPCBuSXRlbXM7ICsrailcbiAgICAgIG1hdHJpeFtpXVtqXSA9IG1hdHJpeFtqXVtpXSA9IChtYXRyaXhbaV1bal0gLSBtaW4pIC8gKG1heCAtIG1pbik7XG4gIH1cbiAgcmV0dXJuIG1hdHJpeDtcbn1cblxuLyoqIEdlbmVyYXRlcyBhcnJheSBmcm9tIGEgcmFuZ2UgW2JlZ2luOyBlbmRdIG9yIFtiZWdpbjsgZW5kKSBpZiBlbmRFeGNsdXNpdmUuICoqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlblJhbmdlKGJlZ2luOiBudW1iZXIsIGVuZDogbnVtYmVyLCBlbmRFeGNsdXNpdmUgPSBmYWxzZSk6IEludDMyQXJyYXkge1xuICBjb25zdCBuSXRlbXMgPSBlbmQgLSBiZWdpbiArIChlbmRFeGNsdXNpdmUgPyAwIDogMSk7XG4gIGNvbnN0IHNlcmllcyA9IG5ldyBJbnQzMkFycmF5KG5JdGVtcyk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuSXRlbXM7ICsraSlcbiAgICBzZXJpZXNbaV0gPSBiZWdpbiArIGk7XG5cbiAgcmV0dXJuIHNlcmllcztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIG9yZGVyIG9mIHZhbHVlcyBhcyBpZiB0aGV5IGFyZSBzb3J0ZWQuXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHthbnlbXX0gdmFsdWVzIElucHV0IGFycmF5LlxuICogQHBhcmFtIHtib29sZWFufSBbcmV2ZXJzZT1mYWxzZV0gV2hldGhlciB0byByZXR1cm4gcmV2ZXJzZWQgb3JkZXIuXG4gKiBAcmV0dXJuIHtudW1iZXJbXX0gVGhlIG9yZGVyIGNvbXB1dGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXJnU29ydCh2YWx1ZXM6IGFueVtdLCByZXZlcnNlID0gZmFsc2UpOiBudW1iZXJbXSB7XG4gIGNvbnN0IHNvcnRmbiA9IHJldmVyc2UgPyAoYTogYW55W10sIGI6IGFueVtdKSA9PiAoYlswXSAtIGFbMF0pIDogKGE6IGFueVtdLCBiOiBhbnlbXSkgPT4gKGFbMF0gLSBiWzBdKTtcbiAgY29uc3QgZGVjb3IgPSAodjogYW55LCBpOiBudW1iZXIpID0+IFt2LCBpXTsgLy8gc2V0IGluZGV4IHRvIHZhbHVlXG4gIGNvbnN0IHVuZGVjb3IgPSAoYTogYW55W10pID0+IGFbMV07IC8vIGxlYXZlIG9ubHkgaW5kZXhcbiAgY29uc3QgX2FyZ3NvcnQgPSAoYXJyOiBhbnlbXSkgPT4gYXJyLm1hcChkZWNvcikuc29ydChzb3J0Zm4pLm1hcCh1bmRlY29yKTtcbiAgcmV0dXJuIF9hcmdzb3J0KHZhbHVlcyk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgaW5kZXhlcyBvZiB0aGUgbW9zdCBkaXZlcnNlIG9iamVjdHMgYWNjb3JkaW5nIHRvIHRoZSBkaXN0IGZ1bmN0aW9uXG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoIHRvdGFsIG51bWJlciBvZiBvYmplY3RzXG4gKiBAcGFyYW0ge251bWJlcn0gbiBudW1iZXIgb2YgZGl2ZXJzZSBlbGVtZW50cyB0byBmaW5kXG4gKiBAcGFyYW0geyhpMTogbnVtYmVyLCBpMjogbnVtYmVyKSA9PiBudW1iZXJ9IGRpc3QgYSBmdW5jdGlvbiB3aGljaCBjYWxjdWxhdGVzIGRpc3RhbmNlIGJldHdlZW5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0d28gb2JqZWN0cyB1c2luZyB0aGVpciBpbmRleGVzXG4gKiBAcmV0dXJucyB7bnVtYmVyW119IFRoZSBpbmRleGVzIG9mIHRoZSBtb3N0IGRpdmVyc2Ugb2JqZWN0c1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGl2ZXJzZVN1YnNldChsZW5ndGg6IG51bWJlciwgbjogbnVtYmVyLCBkaXN0OiAoaTE6IG51bWJlciwgaTI6IG51bWJlcikgPT4gbnVtYmVyKTogbnVtYmVyW10ge1xuICBmdW5jdGlvbiBtYXhCeSh2YWx1ZXM6IEl0ZXJhYmxlSXRlcmF0b3I8bnVtYmVyPiwgb3JkZXJCeTogKGk6IG51bWJlcikgPT4gbnVtYmVyKSB7XG4gICAgbGV0IG1heFZhbHVlID0gbnVsbDtcbiAgICBsZXQgbWF4T3JkZXJCeSA9IG51bGw7XG5cbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdmFsdWVzKSB7XG4gICAgICBjb25zdCBlbGVtZW50T3JkZXJCeSA9IG9yZGVyQnkoZWxlbWVudCk7XG4gICAgICBpZiAobWF4T3JkZXJCeSA9PSBudWxsIHx8IGVsZW1lbnRPcmRlckJ5ID4gbWF4T3JkZXJCeSkge1xuICAgICAgICBtYXhWYWx1ZSA9IGVsZW1lbnQ7XG4gICAgICAgIG1heE9yZGVyQnkgPSBlbGVtZW50T3JkZXJCeTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1heFZhbHVlO1xuICB9XG5cbiAgY29uc3Qgc3Vic2V0ID0gW3JhbmRvbUludChsZW5ndGggLSAxKV07XG4gIGNvbnN0IGNvbXBsZW1lbnQgPSBuZXcgU2V0KCk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGlmICghc3Vic2V0LmluY2x1ZGVzKGkpKVxuICAgICAgY29tcGxlbWVudC5hZGQoaSk7XG4gIH1cblxuICB3aGlsZSAoc3Vic2V0Lmxlbmd0aCA8IG4pIHtcbiAgICBjb25zdCBpZHggPSBtYXhCeShcbiAgICAgIGNvbXBsZW1lbnQudmFsdWVzKCkgYXMgSXRlcmFibGVJdGVyYXRvcjxudW1iZXI+LFxuICAgICAgKGkpID0+IE1hdGgubWluLmFwcGx5KE1hdGgsIHN1YnNldC5tYXAoZnVuY3Rpb24odmFsLCBpbmRleCkge1xuICAgICAgICByZXR1cm4gZGlzdChpLCB2YWwpO1xuICAgICAgfSkpKTtcbiAgICBpZiAoaWR4KSB7XG4gICAgICBzdWJzZXQucHVzaChpZHgpO1xuICAgICAgY29tcGxlbWVudC5kZWxldGUoaWR4KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN1YnNldDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIG5vcm1hbGl6ZWQgdmVjdG9yXG4gKiBAcGFyYW0ge1ZlY3Rvcn0gZGF0YSBudW1lcmljYWwgYXJyYXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZShkYXRhOiBWZWN0b3IpOiBWZWN0b3Ige1xuICBsZXQgbWVhbiA9IDA7XG4gIGxldCBzdGQgPSAwO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7ICsraSlcbiAgICBtZWFuICs9IGRhdGFbaV07XG5cbiAgbWVhbiAvPSBkYXRhLmxlbmd0aDtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyArK2kpXG4gICAgc3RkICs9IChkYXRhW2ldIC0gbWVhbikgKiAoZGF0YVtpXSAtIG1lYW4pO1xuXG4gIHN0ZCA9IE1hdGguc3FydChzdGQgLyBkYXRhLmxlbmd0aCk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgKytpKVxuICAgIGRhdGFbaV0gPSAoZGF0YVtpXSAtIG1lYW4pIC8gc3RkO1xuXG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIEZpbmRzIHNldCBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIGxpc3RzLlxuICogQHBhcmFtIHthbnlbXX0gYSBUaGUgZmlyc3QgbGlzdC5cbiAqIEBwYXJhbSB7YW55W119IGIgVGhlIHNlY29uZCBsaXN0LlxuICogQHJldHVybiB7YW55W119XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXREaWZmZXJlbmNlKGE6IGFueVtdLCBiOiBhbnlbXSk6IGFueVtdIHtcbiAgY29uc3QgYlNldCA9IG5ldyBTZXQoYik7XG4gIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQoYS5maWx0ZXIoKHgpID0+ICFiU2V0Lmhhcyh4KSkpLnZhbHVlcygpKTtcbn1cbiJdfQ==","/** 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=","export class DistanceMatrixService {\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) {\n return new Promise(async (resolve, reject) => {\n try {\n const len = values.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, fnName, startRow, startCol, chunckSize: end - start });\n promises[i] = new Promise((resolveWorker, rejectWorker) => {\n this._workers[i].onmessage = ({ data: { error, distanceMatrixData, min, max } }) => {\n this._terminateOnComplete && 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzdGFuY2UtbWF0cml4LXNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJkaXN0YW5jZS1tYXRyaXgtc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLE9BQU8scUJBQXFCO0lBSTlCLFlBQW1CLG9CQUFvQixHQUFHLElBQUksRUFBRSxtQkFBbUIsR0FBRyxJQUFJO1FBQ3hFLE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQztRQUNsRCxJQUFJLENBQUMsWUFBWSxHQUFHLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1RSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO2FBQ3BELEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQywwQkFBMEIsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvRSxJQUFJLENBQUMsb0JBQW9CLEdBQUcsbUJBQW1CLENBQUM7SUFDbEQsQ0FBQztJQUFBLENBQUM7SUFFSyxLQUFLLENBQUMsSUFBSSxDQUFJLE1BQStCLEVBQUUsTUFBb0IsRUFDeEUsU0FBUyxHQUFHLElBQUk7UUFDaEIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQzNDLElBQUk7Z0JBQ0YsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztnQkFDMUIsTUFBTSxRQUFRLEdBQUcsSUFBSSxLQUFLLENBQWdCLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDN0QsTUFBTSxXQUFXLEdBQUcsR0FBRyxH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STtvQ0FDWixJQUFJLEdBQUcsR0FBRyxDQUFDO2dDQUNiLGFBQWEsRUFBRSxDQUFDOzZCQUNqQjt3QkFDSCxDQUFDLENBQUM7b0JBQ0osQ0FBQyxDQUFDLENBQUM7aUJBQ0o7Z0JBQ0QsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUM1QixJQUFJLFNBQVM7b0JBQ1gsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN4RyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7YUFDekI7WUFBQyxPQUFPLENBQUMsRUFBRTtnQkFDVixNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDWDtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLFNBQVM7UUFDZCxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDeEQsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtLbm93bk1ldHJpY3N9IGZyb20gJy4uL3R5cGVkLW1ldHJpY3MnO1xuXG5leHBvcnQgY2xhc3MgRGlzdGFuY2VNYXRyaXhTZXJ2aWNlIHtcbiAgICBwcml2YXRlIF93b3JrZXJzOiBXb3JrZXJbXTtcbiAgICBwcml2YXRlIF93b3JrZXJDb3VudDogbnVtYmVyO1xuICAgIHByaXZhdGUgX3Rlcm1pbmF0ZU9uQ29tcGxldGU6IGJvb2xlYW47XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHVzZUNvbmN1cnJlbnRXb3JrZXJzID0gdHJ1ZSwgdGVybWluYXRlT25Db21wbGV0ZSA9IHRydWUpIHtcbiAgICAgIGNvbnN0IHRocmVhZENvdW50ID0gbmF2aWdhdG9yLmhhcmR3YXJlQ29uY3VycmVuY3k7XG4gICAgICB0aGlzLl93b3JrZXJDb3VudCA9IHVzZUNvbmN1cnJlbnRXb3JrZXJzID8gTWF0aC5tYXgodGhyZWFkQ291bnQgLSAyLCAxKSA6IDE7XG4gICAgICB0aGlzLl93b3JrZXJzID0gbmV3IEFycmF5KHRoaXMuX3dvcmtlckNvdW50KS5maWxsKG51bGwpXG4gICAgICAgIC5tYXAoKCkgPT4gbmV3IFdvcmtlcihuZXcgVVJMKCcuL2Rpc3RhbmNlLW1hdHJpeC13b3JrZXInLCBpbXBvcnQubWV0YS51cmwpKSk7XG4gICAgICB0aGlzLl90ZXJtaW5hdGVPbkNvbXBsZXRlID0gdGVybWluYXRlT25Db21wbGV0ZTtcbiAgICB9O1xuXG4gICAgcHVibGljIGFzeW5jIGNhbGM8VD4odmFsdWVzOiBBcnJheTxUPiB8IEFycmF5TGlrZTxUPiwgZm5OYW1lOiBLbm93bk1ldHJpY3MsXG4gICAgICBub3JtYWxpemUgPSB0cnVlKTogUHJvbWlzZTxGbG9hdDMyQXJyYXk+IHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgbGVuID0gdmFsdWVzLmxlbmd0aDtcbiAgICAgICAgICBjb25zdCBwcm9taXNlcyA9IG5ldyBBcnJheTxQcm9taXNlPHZvaWQ+Pih0aGlzLl93b3JrZXJDb3VudCk7XG4gICAgICAgICAgY29uc3QgdG90YWxMZW5ndGggPSBsZW4gKiAobGVuIC0gMSkgLyAyOyAvLyBzaXplIG9mIHJlZHVjZWQgZGlzdGFuY2UgbWF0cml4XG4gICAgICAgICAgdGhpcy5fd29ya2VyQ291bnQgPSBNYXRoLm1pbih0aGlzLl93b3JrZXJDb3VudCwgdG90YWxMZW5ndGgpO1xuICAgICAgICAgIGNvbnN0IGNodW5rU2l6ZSA9IHRvdGFsTGVuZ3RoIC8gdGhpcy5fd29ya2VyQ291bnQ7XG4gICAgICAgICAgY29uc3QgZGlzdGFuY2VNYXRyaXggPSBuZXcgRmxvYXQzMkFycmF5KHRvdGFsTGVuZ3RoKTtcbiAgICAgICAgICBsZXQgZW5kUm93ID0gMDtcbiAgICAgICAgICBsZXQgZW5kQ29sID0gMTtcbiAgICAgICAgICAvLyBtaW5tYXggZm9yIG5vcm1hbGl6YXRpb25cbiAgICAgICAgICBsZXQgbG1pbiA9IDA7XG4gICAgICAgICAgbGV0IGxtYXggPSBOdW1iZXIuTUlOX1ZBTFVFO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fd29ya2VyQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBNYXRoLmZsb29yKGkgKiBjaHVua1NpemUpO1xuICAgICAgICAgICAgY29uc3QgZW5kID0gKGkgPT09IHRoaXMuX3dvcmtlckNvdW50IC0gMSkgPyB0b3RhbExlbmd0aCA6IE1hdGguZmxvb3IoKGkgKyAxKSAqIGNodW5rU2l6ZSk7XG4gICAgICAgICAgICBjb25zdCBzdGFydFJvdyA9IGVuZFJvdztcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0Q29sID0gZW5kQ29sO1xuICAgICAgICAgICAgaWYgKGkgIT09IHRoaXMuX3dvcmtlckNvdW50IC0gMSkge1xuICAgICAgICAgICAgICAvLyBUaGVzZSBmb3JtdWxhcyBtYXAgdGhlIGxpbmVhciBpbmRleCB0byB0aGUgdXBwZXIgdHJpYW5ndWxhciBtYXRyaXggaW5kaWNlc1xuICAgICAgICAgICAgICBlbmRSb3cgPSBsZW4gLSAyIC0gTWF0aC5mbG9vcihNYXRoLnNxcnQoLTggKiBlbmQgKyA0ICogbGVuICogKGxlbiAtIDEpIC0gNykgLyAyIC0gMC41KTtcbiAgICAgICAgICAgICAgZW5kQ29sID0gZW5kIC0gbGVuICogZW5kUm93ICsgTWF0aC5mbG9vcigoZW5kUm93ICsgMSkgKiAoZW5kUm93ICsgMikgLyAyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3dvcmtlcnNbaV0ucG9zdE1lc3NhZ2Uoe3ZhbHVlcywgZm5OYW1lLCBzdGFydFJvdywgc3RhcnRDb2wsIGNodW5ja1NpemU6IGVuZCAtIHN0YXJ0fSk7XG4gICAgICAgICAgICBwcm9taXNlc1tpXSA9IG5ldyBQcm9taXNlKChyZXNvbHZlV29ya2VyLCByZWplY3RXb3JrZXIpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5fd29ya2Vyc1tpXS5vbm1lc3NhZ2UgPSAoe2RhdGE6IHtlcnJvciwgZGlzdGFuY2VNYXRyaXhEYXRhLCBtaW4sIG1heH19KTogdm9pZCA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYXRlT25Db21wbGV0ZSAmJiB0aGlzLl93b3JrZXJzW2ldLnRlcm1pbmF0ZSgpO1xuICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgcmVqZWN0V29ya2VyKGVycm9yKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgZGlzdGFuY2VNYXRyaXguc2V0KGRpc3RhbmNlTWF0cml4RGF0YSwgc3RhcnQpO1xuICAgICAgICAgICAgICAgICAgaWYgKG1pbiA8IGxtaW4pXG4gICAgICAgICAgICAgICAgICAgIGxtaW4gPSBtaW47XG4gICAgICAgICAgICAgICAgICBpZiAobWF4ID4gbG1heClcbiAgICAgICAgICAgICAgICAgICAgbG1heCA9IG1heDtcbiAgICAgICAgICAgICAgICAgIHJlc29sdmVXb3JrZXIoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgICAgICAgIGlmIChub3JtYWxpemUpXG4gICAgICAgICAgICBkaXN0YW5jZU1hdHJpeC5mb3JFYWNoKCh2YWx1ZSwgaW5kZXgpID0+IHsgZGlzdGFuY2VNYXRyaXhbaW5kZXhdID0gKHZhbHVlIC0gbG1pbikgLyAobG1heCAtIGxtaW4pOyB9KTtcbiAgICAgICAgICByZXNvbHZlKGRpc3RhbmNlTWF0cml4KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHRlcm1pbmF0ZSgpOiB2b2lkIHtcbiAgICAgIHRoaXMuX3dvcmtlcnMuZm9yRWFjaCgod29ya2VyKSA9PiB3b3JrZXIudGVybWluYXRlKCkpO1xuICAgIH1cbn1cbiJdfQ==","import { calculateEuclideanDistance, fillRandomMatrix, vectorAdd, } from '@datagrok-libraries/utils/src/vector-operations';\nimport { randomInt } from '@datagrok-libraries/utils/src/random';\nimport { DistanceMatrixService, dmLinearIndex } from './distance-matrix';\n/**\n * Implements stochastic proximity embedding.\n *\n * @export\n * @class SPEBase\n * @link doi:10.1016/S1093-3263(03)00155-4\n */\nclass SPEBase {\n /**\n * Creates an instance of SPEBase.\n * @param {Options} [options] Options to pass to the constructor.\n * @memberof SPEBase\n */\n constructor(options) {\n this.steps = options?.steps ?? 0;\n this.cycles = options?.cycles ?? 1e6;\n // Select a cutoff distance {cutoff} and ...\n this.cutoff = options?.cutoff ?? 0;\n // ... an initial learning rate {lambda} > 0\n this.lambda = options?.lambda ?? 2.0;\n this.dlambda = options?.dlambda ?? 0.01;\n this.lambda2 = this.lambda / 2.;\n this.dlambda2 = this.dlambda / 2.;\n this.epsilon = options?.epsilon ?? 1e-10;\n // eslint-disable-next-line brace-style\n this.distanceFunction = options?.distance ?? calculateEuclideanDistance;\n this.distance = new Float32Array();\n this.distanceFunctionName = options?.distanceFunctionName;\n }\n /**\n * Initializes distance matrix.\n *\n * @param {Vectors} vectors Input vectors to calculate distance between.\n * @memberof SPEBase\n */\n async initDistance(vectors) {\n this.dmIndexFunct = dmLinearIndex(vectors.length);\n const matrixService = new DistanceMatrixService(true, false);\n this.distance = await matrixService.calc(vectors, this.distanceFunctionName);\n matrixService.terminate();\n }\n /**\n * Calculates distance between the two vectors given.\n *\n * @param {Vectors} vectors Set of vectors to calculate distances between.\n * @param {number} index1 Index of the first vector of the pair.\n * @param {number} index2 Index of the second vector of the pair.\n * @return {number} Distance between these two vectors.\n */\n calcDistance(vectors, index1, index2) {\n return this.distance[this.dmIndexFunct(index1, index2)];\n }\n /**\n * Embeds the vectors given into a two-dimensional space.\n *\n * @param {Vectors} vectors D-dimensional coordinates.\n * @return {Coordinates} SPE coordinates in D space.\n */\n async embed(vectors) {\n const nItems = vectors.length;\n const areaWidth = 40;\n // Initialize the D-dimensional coordinates of the N points.\n const coordinates = fillRandomMatrix(nItems, SPEBase.dimension, areaWidth);\n let lambda2 = this.lambda2;\n if (this.steps === 0)\n this.steps = vectors.length - 1;\n await this.initDistance(vectors);\n for (let cycle = 0; cycle < this.cycles; ++cycle) {\n for (let step = 0; step < this.steps; ++step) {\n // Select two points, i and j, at random, ...\n const i = randomInt(nItems);\n let j = randomInt(nItems);\n while (i == j)\n j = randomInt(nItems);\n const rowi = coordinates[i];\n const rowj = coordinates[j];\n // ... retrieve (or evaluate) their proximity in the input space, rij and ...\n const r = this.calcDistance(vectors, i, j);\n // ... compute their Euclidean distance on the D-dimensional map, dij.\n const d = calculateEuclideanDistance(rowi, rowj);\n // If rij <= rc, or if rij > rc and dij < rij ...\n if ((this.cutoff == 0) || (r <= this.cutoff) || (d < r)) {\n const multiplier = lambda2 * (r - d) / (d + this.epsilon);\n // ... update the coordinates xi and xj.\n const diffIJ = vectorAdd(rowi, rowj, -1);\n coordinates[i] = vectorAdd(rowi, diffIJ, multiplier);\n coordinates[j] = vectorAdd(rowj, diffIJ, -multiplier);\n }\n }\n // Decrease the learning rate {lambda} by a prescribed {dlambda}.\n lambda2 -= this.dlambda2;\n if (lambda2 <= 0.)\n break;\n }\n return coordinates;\n }\n}\nSPEBase.dimension = 2;\nexport { SPEBase };\n/**\n * Implements modified stochastic proximity embedding.\n *\n * @export\n * @class PSPEBase\n * @link doi:10.1016/S1093-3263(03)00155-4\n */\nexport class PSPEBase extends SPEBase {\n /**\n * Embeds the vectors given into a two-dimensional space using a modified update rule.\n *\n * @param {Vectors} vectors D-dimensional coordinates.\n * @return {Coordinates} SPE coordinates in D space.\n */\n async embed(vectors) {\n const nItems = vectors.length;\n const areaWidth = 40;\n // Initialize the D-dimensional coordinates of the N points.\n const coordinates = fillRandomMatrix(nItems, PSPEBase.dimension, areaWidth);\n let lambda = this.lambda;\n await this.initDistance(vectors);\n for (let cycle = 0; cycle < this.cycles; ++cycle) {\n // Select a point, i, at random (pivot).\n const i = randomInt(nItems);\n const rowi = coordinates[i];\n // For every point j != i ...\n for (let j = 0; j < nItems; ++j) {\n if (i == j)\n continue;\n const rowj = coordinates[j];\n // ... retrieve (or evaluate) its proximity to i in the input space, rij ...\n const r = this.calcDistance(vectors, i, j);\n // ... and compute their Euclidean distance on the D-dimensional map, dij.\n const d = calculateEuclideanDistance(rowi, rowj);\n // If rij <= rc, or if rij > rc and dij < rij ...\n if ((this.cutoff == 0) || (r <= this.cutoff) || (d < r)) {\n const multiplier = lambda * (r - d) / (d + this.epsilon);\n const diffIJ = vectorAdd(rowi, rowj, -1);\n // ... update the coordinates xj.\n coordinates[j] = vectorAdd(rowj, diffIJ, -multiplier);\n }\n }\n // Decrease the learning rate {lambda} by a prescribed {dlambda}.\n lambda -= this.dlambda;\n if (lambda <= 0.)\n break;\n }\n return coordinates;\n }\n}\n/**\n * Implements modified stochastic proximity embedding.\n *\n * @export\n * @class OriginalSPE\n * @link doi:10.1002/jcc.10234\n */\nexport class OriginalSPE extends SPEBase {\n constructor(options) {\n super(options);\n this.cycles = options?.cycles ?? 1e3;\n this.steps = options?.steps ?? 100000;\n this.radiusPercent = options?.radiusPercent ?? 1.0;\n this.maxDistance = options?.maxDistance ?? null;\n this.maxDistanceSteps = options?.maxDistanceSteps ?? null;\n }\n async embed(vectors) {\n const nItems = vectors.length;\n const areaWidth = 40;\n // Initialize the D-dimensional coordinates of the N points.\n const coordinates = fillRandomMatrix(nItems, OriginalSPE.dimension, areaWidth);\n await this.initDistance(vectors);\n if (this.maxDistanceSteps === null)\n this.maxDistanceSteps = nItems * Math.floor((nItems - 1) / 2);\n if (this.maxDistance === null) {\n this.maxDistance = -1e37;\n for (let n = 0; n < this.maxDistanceSteps; n++) {\n const i = randomInt(nItems);\n let j = randomInt(nItems);\n while (i == j)\n j = randomInt(nItems);\n const d = this.calcDistance(vectors, i, j);\n if (d > this.maxDistance)\n this.maxDistance = d;\n }\n }\n let lambda = this.lambda;\n const radius = (this.radiusPercent == 0.0) ? this.maxDistance : this.maxDistance * this.radiusPercent;\n for (let cycle = 0; cycle < this.cycles; ++cycle) {\n for (let step = 0; step < this.steps; ++step) {\n // Select two points, i and j, at random, ...\n const i = randomInt(nItems);\n let j = randomInt(nItems);\n while (i == j)\n j = randomInt(nItems);\n const rowi = coordinates[i];\n const rowj = coordinates[j];\n // retrieve (or evaluate) their proximity in the input space, rij and ...\n const r = this.calcDistance(vectors, i, j);\n // compute their Euclidean distance on the D-dimensional map, dij.\n const d = calculateEuclideanDistance(rowi, rowj);\n if ((r <= radius) || (d < r)) {\n const multiplier = lambda * 0.5 * (r - d) / (d + this.epsilon);\n // ... update the coordinates xi and xj.\n const diffIJ = vectorAdd(rowi, rowj, -1);\n coordinates[i] = vectorAdd(rowi, diffIJ, multiplier);\n coordinates[j] = vectorAdd(rowj, diffIJ, -multiplier);\n }\n }\n lambda -= ((this.lambda - this.dlambda) / (this.cycles - 1.0));\n ;\n if (lambda < this.dlambda)\n break;\n }\n return coordinates;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3BlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFDTCwwQkFBMEIsRUFDMUIsZ0JBQWdCLEVBQ2hCLFNBQVMsR0FDVixNQUFNLGlEQUFpRCxDQUFDO0FBQ3pELE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQztBQUUvRCxPQUFPLEVBQUMscUJBQXFCLEVBQUUsYUFBYSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFFdkU7Ozs7OztHQU1HO0FBQ0gsTUFBYSxPQUFPO0lBZWxCOzs7O09BSUc7SUFDSCxZQUFZLE9BQWlCO1FBQzNCLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxFQUFFLEtBQUssSUFBSSxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFPLEVBQUUsTUFBTSxJQUFJLEdBQUcsQ0FBQztRQUNyQyw0Q0FBNEM7UUFDNUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUMsQ0FBQztRQUNuQyw0Q0FBNEM7UUFDNUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFPLEVBQUUsTUFBTSxJQUFJLEdBQUcsQ0FBQztRQUNyQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sRUFBRSxPQUFPLElBQUksSUFBSSxDQUFDO1FBQ3hDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNsQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sRUFBRSxPQUFPLElBQUksS0FBSyxDQUFDO1FBQ3pDLHVDQUF1QztRQUN2QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsT0FBTyxFQUFFLFFBQVEsSUFBSSwwQkFBMEIsQ0FBQztRQUN4RSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksWUFBWSxF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IFZlY3RvcnMsIERpc3RhbmNlTWV0cmljfSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy90eXBlLWRlY2xhcmF0aW9ucyc7XG5pbXBvcnQge1xuICBjYWxjdWxhdGVFdWNsaWRlYW5EaXN0YW5jZSxcbiAgZmlsbFJhbmRvbU1hdHJpeCxcbiAgdmVjdG9yQWRkLFxufSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy92ZWN0b3Itb3BlcmF0aW9ucyc7XG5pbXBvcnQge3JhbmRvbUludH0gZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy91dGlscy9zcmMvcmFuZG9tJztcbmltcG9ydCB7S25vd25NZXRyaWNzfSBmcm9tICcuL3R5cGVkLW1ldHJpY3MnO1xuaW1wb3J0IHtEaXN0YW5jZU1hdHJpeFNlcnZpY2UsIGRtTGluZWFySW5kZXh9IGZyb20gJy4vZGlzdGFuY2UtbWF0cml4JztcblxuLyoqXG4gKiBJbXBsZW1lbnRzIHN0b2NoYXN0aWMgcHJveGltaXR5IGVtYmVkZGluZy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgU1BFQmFzZVxuICogQGxpbmsgZG9pOjEwLjEwMTYvUzEwOTMtMzI2MygwMykwMDE1NS00XG4gKi9cbmV4cG9ydCBjbGFzcyBTUEVCYXNlIHtcbiAgcHJvdGVjdGVkIHN0YXRpYyBkaW1lbnNpb24gPSAyO1xuICBwcm90ZWN0ZWQgc3RlcHM6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGN5Y2xlczogbnVtYmVyO1xuICBwcm90ZWN0ZWQgY3V0b2ZmOiBudW1iZXI7XG4gIHByb3RlY3RlZCBsYW1iZGE6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGRsYW1iZGE6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGxhbWJkYTI6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGRsYW1iZGEyOiBudW1iZXI7XG4gIHByb3RlY3RlZCBlcHNpbG9uOiBudW1iZXI7XG4gIHByb3RlY3RlZCBkaXN0YW5jZUZ1bmN0aW9uOiBEaXN0YW5jZU1ldHJpYztcbiAgcHJvdGVjdGVkIGRpc3RhbmNlRnVuY3Rpb25OYW1lOiBLbm93bk1ldHJpY3M7XG4gIGRpc3RhbmNlOiBGbG9hdDMyQXJyYXk7XG4gIHByb3RlY3RlZCBkbUluZGV4RnVuY3Q/OiAoaTogbnVtYmVyLCBqOiBudW1iZXIpID0+IG51bWJlcjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBTUEVCYXNlLlxuICAgKiBAcGFyYW0ge09wdGlvbnN9IFtvcHRpb25zXSBPcHRpb25zIHRvIHBhc3MgdG8gdGhlIGNvbnN0cnVjdG9yLlxuICAgKiBAbWVtYmVyb2YgU1BFQmFzZVxuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0aW9ucz86IE9wdGlvbnMpIHtcbiAgICB0aGlzLnN0ZXBzID0gb3B0aW9ucz8uc3RlcHMgPz8gMDtcbiAgICB0aGlzLmN5Y2xlcyA9IG9wdGlvbnM/LmN5Y2xlcyA/PyAxZTY7XG4gICAgLy8gU2VsZWN0IGEgY3V0b2ZmIGRpc3RhbmNlIHtjdXRvZmZ9IGFuZCAuLi5cbiAgICB0aGlzLmN1dG9mZiA9IG9wdGlvbnM/LmN1dG9mZiA/PyAwO1xuICAgIC8vIC4uLiBhbiBpbml0aWFsIGxlYXJuaW5nIHJhdGUge2xhbWJkYX0gPiAwXG4gICAgdGhpcy5sYW1iZGEgPSBvcHRpb25zPy5sYW1iZGEgPz8gMi4wO1xuICAgIHRoaXMuZGxhbWJkYSA9IG9wdGlvbnM/LmRsYW1iZGEgPz8gMC4wMTtcbiAgICB0aGlzLmxhbWJkYTIgPSB0aGlzLmxhbWJkYSAvIDIuO1xuICAgIHRoaXMuZGxhbWJkYTIgPSB0aGlzLmRsYW1iZGEgLyAyLjtcbiAgICB0aGlzLmVwc2lsb24gPSBvcHRpb25zPy5lcHNpbG9uID8/IDFlLTEwO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBicmFjZS1zdHlsZVxuICAgIHRoaXMuZGlzdGFuY2VGdW5jdGlvbiA9IG9wdGlvbnM/LmRpc3RhbmNlID8/IGNhbGN1bGF0ZUV1Y2xpZGVhbkRpc3RhbmNlO1xuICAgIHRoaXMuZGlzdGFuY2UgPSBuZXcgRmxvYXQzMkFycmF5KCk7XG4gICAgdGhpcy5kaXN0YW5jZUZ1bmN0aW9uTmFtZSA9IG9wdGlvbnM/LmRpc3RhbmNlRnVuY3Rpb25OYW1lITtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBkaXN0YW5jZSBtYXRyaXguXG4gICAqXG4gICAqIEBwYXJhbSB7VmVjdG9yc30gdmVjdG9ycyBJbnB1dCB2ZWN0b3JzIHRvIGNhbGN1bGF0ZSBkaXN0YW5jZSBiZXR3ZWVuLlxuICAgKiBAbWVtYmVyb2YgU1BFQmFzZVxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGluaXREaXN0YW5jZSh2ZWN0b3JzOiBWZWN0b3JzKSB7XG4gICAgdGhpcy5kbUluZGV4RnVuY3QgPSBkbUxpbmVhckluZGV4KHZlY3RvcnMubGVuZ3RoKTtcbiAgICBjb25zdCBtYXRyaXhTZXJ2aWNlID0gbmV3IERpc3RhbmNlTWF0cml4U2VydmljZSh0cnVlLCBmYWxzZSk7XG4gICAgdGhpcy5kaXN0YW5jZSA9IGF3YWl0IG1hdHJpeFNlcnZpY2UuY2FsYyh2ZWN0b3JzLCB0aGlzLmRpc3RhbmNlRnVuY3Rpb25OYW1lKTtcbiAgICBtYXRyaXhTZXJ2aWNlLnRlcm1pbmF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZXMgZGlzdGFuY2UgYmV0d2VlbiB0aGUgdHdvIHZlY3RvcnMgZ2l2ZW4uXG4gICAqXG4gICAqIEBwYXJhbSB7VmVjdG9yc30gdmVjdG9ycyBTZXQgb2YgdmVjdG9ycyB0byBjYWxjdWxhdGUgZGlzdGFuY2VzIGJldHdlZW4uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleDEgSW5kZXggb2YgdGhlIGZpcnN0IHZlY3RvciBvZiB0aGUgcGFpci5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4MiBJbmRleCBvZiB0aGUgc2Vjb25kIHZlY3RvciBvZiB0aGUgcGFpci5cbiAgICogQHJldHVybiB7bnVtYmVyfSBEaXN0YW5jZSBiZXR3ZWVuIHRoZXNlIHR3byB2ZWN0b3JzLlxuICAgKi9cbiAgcHJvdGVjdGVkIGNhbGNEaXN0YW5jZSh2ZWN0b3JzOiBWZWN0b3JzLCBpbmRleDE6IG51bWJlciwgaW5kZXgyOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmRpc3RhbmNlW3RoaXMuZG1JbmRleEZ1bmN0IShpbmRleDEsIGluZGV4MildO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtYmVkcyB0aGUgdmVjdG9ycyBnaXZlbiBpbnRvIGEgdHdvLWRpbWVuc2lvbmFsIHNwYWNlLlxuICAgKlxuICAgKiBAcGFyYW0ge1ZlY3RvcnN9IHZlY3RvcnMgRC1kaW1lbnNpb25hbCBjb29yZGluYXRlcy5cbiAgICogQHJldHVybiB7Q29vcmRpbmF0ZXN9IFNQRSBjb29yZGluYXRlcyBpbiBEIHNwYWNlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGVtYmVkKHZlY3RvcnM6IFZlY3RvcnMpOiBQcm9taXNlPENvb3JkaW5hdGVzPiB7XG4gICAgY29uc3Qgbkl0ZW1zID0gdmVjdG9ycy5sZW5ndGg7XG4gICAgY29uc3QgYXJlYVdpZHRoID0gNDA7XG4gICAgLy8gSW5pdGlhbGl6ZSB0aGUgRC1kaW1lbnNpb25hbCBjb29yZGluYXRlcyBvZiB0aGUgTiBwb2ludHMuXG4gICAgY29uc3QgY29vcmRpbmF0ZXMgPSBmaWxsUmFuZG9tTWF0cml4KG5JdGVtcywgU1BFQmFzZS5kaW1lbnNpb24sIGFyZWFXaWR0aCk7XG5cbiAgICBsZXQgbGFtYmRhMiA9IHRoaXMubGFtYmRhMjtcblxuICAgIGlmICh0aGlzLnN0ZXBzID09PSAwKVxuICAgICAgdGhpcy5zdGVwcyA9IHZlY3RvcnMubGVuZ3RoIC0gMTtcblxuXG4gICAgYXdhaXQgdGhpcy5pbml0RGlzdGFuY2UodmVjdG9ycyk7XG5cbiAgICBmb3IgKGxldCBjeWNsZSA9IDA7IGN5Y2xlIDwgdGhpcy5jeWNsZXM7ICsrY3ljbGUpIHtcbiAgICAgIGZvciAobGV0IHN0ZXAgPSAwOyBzdGVwIDwgdGhpcy5zdGVwczsgKytzdGVwKSB7XG4gICAgICAgIC8vIFNlbGVjdCB0d28gcG9pbnRzLCBpIGFuZCBqLCBhdCByYW5kb20sIC4uLlxuICAgICAgICBjb25zdCBpID0gcmFuZG9tSW50KG5JdGVtcyk7XG4gICAgICAgIGxldCBqID0gcmFuZG9tSW50KG5JdGVtcyk7XG4gICAgICAgIHdoaWxlIChpID09IGopIGogPSByYW5kb21JbnQobkl0ZW1zKTtcblxuICAgICAgICBjb25zdCByb3dpID0gY29vcmRpbmF0ZXNbaV07XG4gICAgICAgIGNvbnN0IHJvd2ogPSBjb29yZGluYXRlc1tqXTtcblxuICAgICAgICAvLyAuLi4gcmV0cmlldmUgKG9yIGV2YWx1YXRlKSB0aGVpciBwcm94aW1pdHkgaW4gdGhlIGlucHV0IHNwYWNlLCByaWogYW5kIC4uLlxuICAgICAgICBjb25zdCByID0gdGhpcy5jYWxjRGlzdGFuY2UodmVjdG9ycywgaSwgaik7XG4gICAgICAgIC8vIC4uLiBjb21wdXRlIHRoZWlyIEV1Y2xpZGVhbiBkaXN0YW5jZSBvbiB0aGUgRC1kaW1lbnNpb25hbCBtYXAsIGRpai5cbiAgICAgICAgY29uc3QgZCA9IGNhbGN1bGF0ZUV1Y2xpZGVhbkRpc3RhbmNlKHJvd2ksIHJvd2opO1xuXG4gICAgICAgIC8vIElmIHJpaiA8PSByYywgb3IgaWYgcmlqID4gcmMgYW5kIGRpaiA8IHJpaiAuLi5cbiAgICAgICAgaWYgKCh0aGlzLmN1dG9mZiA9PSAwKSB8fCAociA8PSB0aGlzLmN1dG9mZikgfHwgKGQgPCByKSkge1xuICAgICAgICAgIGNvbnN0IG11bHRpcGxpZXIgPSBsYW1iZGEyICogKHIgLSBkKSAvIChkICsgdGhpcy5lcHNpbG9uKTtcbiAgICAgICAgICAvLyAuLi4gdXBkYXRlIHRoZSBjb29yZGluYXRlcyB4aSBhbmQgeGouXG4gICAgICAgICAgY29uc3QgZGlmZklKID0gdmVjdG9yQWRkKHJvd2ksIHJvd2osIC0xKTtcbiAgICAgICAgICBjb29yZGluYXRlc1tpXSA9IHZlY3RvckFkZChyb3dpLCBkaWZmSUosIG11bHRpcGxpZXIpO1xuICAgICAgICAgIGNvb3JkaW5hdGVzW2pdID0gdmVjdG9yQWRkKHJvd2osIGRpZmZJSiwgLW11bHRpcGxpZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBEZWNyZWFzZSB0aGUgbGVhcm5pbmcgcmF0ZSB7bGFtYmRhfSBieSBhIHByZXNjcmliZWQge2RsYW1iZGF9LlxuICAgICAgbGFtYmRhMiAtPSB0aGlzLmRsYW1iZGEyO1xuICAgICAgaWYgKGxhbWJkYTIgPD0gMC4pXG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gY29vcmRpbmF0ZXM7XG4gIH1cbn1cblxuLyoqXG4gKiBJbXBsZW1lbnRzIG1vZGlmaWVkIHN0b2NoYXN0aWMgcHJveGltaXR5IGVtYmVkZGluZy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgUFNQRUJhc2VcbiAqIEBsaW5rIGRvaToxMC4xMDE2L1MxMDkzLTMyNjMoMDMpMDAxNTUtNFxuICovXG5leHBvcnQgY2xhc3MgUFNQRUJhc2UgZXh0ZW5kcyBTUEVCYXNlIHtcbiAgLyoqXG4gICAqIEVtYmVkcyB0aGUgdmVjdG9ycyBnaXZlbiBpbnRvIGEgdHdvLWRpbWVuc2lvbmFsIHNwYWNlIHVzaW5nIGEgbW9kaWZpZWQgdXBkYXRlIHJ1bGUuXG4gICAqXG4gICAqIEBwYXJhbSB7VmVjdG9yc30gdmVjdG9ycyBELWRpbWVuc2lvbmFsIGNvb3JkaW5hdGVzLlxuICAgKiBAcmV0dXJuIHtDb29yZGluYXRlc30gU1BFIGNvb3JkaW5hdGVzIGluIEQgc3BhY2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZW1iZWQodmVjdG9yczogVmVjdG9ycyk6IFByb21pc2U8Q29vcmRpbmF0ZXM+IHtcbiAgICBjb25zdCBuSXRlbXMgPSB2ZWN0b3JzLmxlbmd0aDtcbiAgICBjb25zdCBhcmVhV2lkdGggPSA0MDtcbiAgICAvLyAgSW5pdGlhbGl6ZSB0aGUgRC1kaW1lbnNpb25hbCBjb29yZGluYXRlcyBvZiB0aGUgTiBwb2ludHMuXG4gICAgY29uc3QgY29vcmRpbmF0ZXMgPSBmaWxsUmFuZG9tTWF0cml4KG5JdGVtcywgUFNQRUJhc2UuZGltZW5zaW9uLCBhcmVhV2lkdGgpO1xuICAgIGxldCBsYW1iZGEgPSB0aGlzLmxhbWJkYTtcblxuICAgIGF3YWl0IHRoaXMuaW5pdERpc3RhbmNlKHZlY3RvcnMpO1xuXG4gICAgZm9yIChsZXQgY3ljbGUgPSAwOyBjeWNsZSA8IHRoaXMuY3ljbGVzOyArK2N5Y2xlKSB7XG4gICAgICAvLyBTZWxlY3QgYSBwb2ludCwgaSwgYXQgcmFuZG9tIChwaXZvdCkuXG4gICAgICBjb25zdCBpOiBudW1iZXIgPSByYW5kb21JbnQobkl0ZW1zKTtcbiAgICAgIGNvbnN0IHJvd2kgPSBjb29yZGluYXRlc1tpXTtcblxuICAgICAgLy8gRm9yIGV2ZXJ5IHBvaW50IGogIT0gaSAuLi5cbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbkl0ZW1zOyArK2opIHtcbiAgICAgICAgaWYgKGkgPT0gaikgY29udGludWU7XG4gICAgICAgIGNvbnN0IHJvd2ogPSBjb29yZGluYXRlc1tqXTtcbiAgICAgICAgLy8gLi4uIHJldHJpZXZlIChvciBldmFsdWF0ZSkgaXRzIHByb3hpbWl0eSB0byBpIGluIHRoZSBpbnB1dCBzcGFjZSwgcmlqIC4uLlxuICAgICAgICBjb25zdCByID0gdGhpcy5jYWxjRGlzdGFuY2UodmVjdG9ycywgaSwgaik7XG4gICAgICAgIC8vIC4uLiBhbmQgY29tcHV0ZSB0aGVpciBFdWNsaWRlYW4gZGlzdGFuY2Ugb24gdGhlIEQtZGltZW5zaW9uYWwgbWFwLCBkaWouXG4gICAgICAgIGNvbnN0IGQgPSBjYWxjdWxhdGVFdWNsaWRlYW5EaXN0YW5jZShyb3dpLCByb3dqKTtcbiAgICAgICAgLy8gSWYgcmlqIDw9IHJjLCBvciBpZiByaWogPiByYyBhbmQgZGlqIDwgcmlqIC4uLlxuICAgICAgICBpZiAoKHRoaXMuY3V0b2ZmID09IDApIHx8IChyIDw9IHRoaXMuY3V0b2ZmKSB8fCAoZCA8IHIpKSB7XG4gICAgICAgICAgY29uc3QgbXVsdGlwbGllciA9IGxhbWJkYSAqIChyIC0gZCkgLyAoZCArIHRoaXMuZXBzaWxvbik7XG4gICAgICAgICAgY29uc3QgZGlmZklKID0gdmVjdG9yQWRkKHJvd2ksIHJvd2osIC0xKTtcbiAgICAgICAgICAvLyAuLi4gdXBkYXRlIHRoZSBjb29yZGluYXRlcyB4ai5cbiAgICAgICAgICBjb29yZGluYXRlc1tqXSA9IHZlY3RvckFkZChyb3dqLCBkaWZmSUosIC1tdWx0aXBsaWVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gRGVjcmVhc2UgdGhlIGxlYXJuaW5nIHJhdGUge2xhbWJkYX0gYnkgYSBwcmVzY3JpYmVkIHtkbGFtYmRhfS5cbiAgICAgIGxhbWJkYSAtPSB0aGlzLmRsYW1iZGE7XG4gICAgICBpZiAobGFtYmRhIDw9IDAuKVxuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIGNvb3JkaW5hdGVzO1xuICB9XG59XG5cbi8qKlxuICogSW1wbGVtZW50cyBtb2RpZmllZCBzdG9jaGFzdGljIHByb3hpbWl0eSBlbWJlZGRpbmcuXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIE9yaWdpbmFsU1BFXG4gKiBAbGluayBkb2k6MTAuMTAwMi9qY2MuMTAyMzRcbiAqL1xuZXhwb3J0IGNsYXNzIE9yaWdpbmFsU1BFIGV4dGVuZHMgU1BFQmFzZSB7XG4gIC8qKlxuICAgKiBFbWJlZHMgdGhlIHZlY3RvcnMgZ2l2ZW4gaW50byBhIHR3by1kaW1lbnNpb25hbCBzcGFjZSB1c2luZyBhIG1vZGlmaWVkIHVwZGF0ZSBydWxlLlxuICAgKlxuICAgKiBAcGFyYW0ge1ZlY3RvcnN9IHZlY3RvcnMgRC1kaW1lbnNpb25hbCBjb29yZGluYXRlcy5cbiAgICogQHJldHVybiB7Q29vcmRpbmF0ZXN9IFNQRSBjb29yZGluYXRlcyBpbiBEIHNwYWNlLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJhZGl1c1BlcmNlbnQ6IG51bWJlcjtcbiAgcHJvdGVjdGVkIG1heERpc3RhbmNlOiBudW1iZXI7XG4gIHByb3RlY3RlZCBtYXhEaXN0YW5jZVN0ZXBzOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9ucz86IE9wdGlvbnMpIHtcbiAgICBzdXBlcihvcHRpb25zKTtcbiAgICB0aGlzLmN5Y2xlcyA9IG9wdGlvbnM/LmN5Y2xlcyA/PyAxZTM7XG4gICAgdGhpcy5zdGVwcyA9IG9wdGlvbnM/LnN0ZXBzID8/IDEwMDAwMDtcbiAgICB0aGlzLnJhZGl1c1BlcmNlbnQgPSBvcHRpb25zPy5yYWRpdXNQZXJjZW50ID8/IDEuMDtcbiAgICB0aGlzLm1heERpc3RhbmNlID0gb3B0aW9ucz8ubWF4RGlzdGFuY2UgPz8gbnVsbDtcbiAgICB0aGlzLm1heERpc3RhbmNlU3RlcHMgPSBvcHRpb25zPy5tYXhEaXN0YW5jZVN0ZXBzID8/IG51bGw7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZW1iZWQodmVjdG9yczogVmVjdG9ycyk6IFByb21pc2U8Q29vcmRpbmF0ZXM+IHtcbiAgICBjb25zdCBuSXRlbXMgPSB2ZWN0b3JzLmxlbmd0aDtcbiAgICBjb25zdCBhcmVhV2lkdGggPSA0MDtcbiAgICAvLyBJbml0aWFsaXplIHRoZSBELWRpbWVuc2lvbmFsIGNvb3JkaW5hdGVzIG9mIHRoZSBOIHBvaW50cy5cbiAgICBjb25zdCBjb29yZGluYXRlcyA9IGZpbGxSYW5kb21NYXRyaXgobkl0ZW1zLCBPcmlnaW5hbFNQRS5kaW1lbnNpb24sIGFyZWFXaWR0aCk7XG5cbiAgICBhd2FpdCB0aGlzLmluaXREaXN0YW5jZSh2ZWN0b3JzKTtcblxuICAgIGlmICh0aGlzLm1heERpc3RhbmNlU3RlcHMgPT09IG51bGwpXG4gICAgICB0aGlzLm1heERpc3RhbmNlU3RlcHMgPSBuSXRlbXMgKiBNYXRoLmZsb29yKChuSXRlbXMgLSAxKSAvIDIpO1xuXG4gICAgaWYgKHRoaXMubWF4RGlzdGFuY2UgPT09IG51bGwpIHtcbiAgICAgIHRoaXMubWF4RGlzdGFuY2UgPSAtMWUzNztcbiAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgdGhpcy5tYXhEaXN0YW5jZVN0ZXBzOyBuKyspIHtcbiAgICAgICAgY29uc3QgaSA9IHJhbmRvbUludChuSXRlbXMpOyBsZXQgaiA9IHJhbmRvbUludChuSXRlbXMpO1xuICAgICAgICB3aGlsZSAoaSA9PSBqKSBqID0gcmFuZG9tSW50KG5JdGVtcyk7XG5cbiAgICAgICAgY29uc3QgZCA9IHRoaXMuY2FsY0Rpc3RhbmNlKHZlY3RvcnMsIGksIGopO1xuICAgICAgICBpZiAoZCA+IHRoaXMubWF4RGlzdGFuY2UpXG4gICAgICAgICAgdGhpcy5tYXhEaXN0YW5jZSA9IGQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGxhbWJkYSA9IHRoaXMubGFtYmRhO1xuICAgIGNvbnN0IHJhZGl1cyA9ICh0aGlzLnJhZGl1c1BlcmNlbnQgPT0gMC4wKSA/IHRoaXMubWF4RGlzdGFuY2UgOiB0aGlzLm1heERpc3RhbmNlICogdGhpcy5yYWRpdXNQZXJjZW50O1xuXG4gICAgZm9yIChsZXQgY3ljbGUgPSAwOyBjeWNsZSA8IHRoaXMuY3ljbGVzOyArK2N5Y2xlKSB7XG4gICAgICBmb3IgKGxldCBzdGVwID0gMDsgc3RlcCA8IHRoaXMuc3RlcHM7ICsrc3RlcCkge1xuICAgICAgICAvLyBTZWxlY3QgdHdvIHBvaW50cywgaSBhbmQgaiwgYXQgcmFuZG9tLCAuLi5cbiAgICAgICAgY29uc3QgaSA9IHJhbmRvbUludChuSXRlbXMpO1xuICAgICAgICBsZXQgaiA9IHJhbmRvbUludChuSXRlbXMpO1xuICAgICAgICB3aGlsZSAoaSA9PSBqKSBqID0gcmFuZG9tSW50KG5JdGVtcyk7XG5cbiAgICAgICAgY29uc3Qgcm93aSA9IGNvb3JkaW5hdGVzW2ldO1xuICAgICAgICBjb25zdCByb3dqID0gY29vcmRpbmF0ZXNbal07XG5cbiAgICAgICAgLy8gcmV0cmlldmUgKG9yIGV2YWx1YXRlKSB0aGVpciBwcm94aW1pdHkgaW4gdGhlIGlucHV0IHNwYWNlLCByaWogYW5kIC4uLlxuICAgICAgICBjb25zdCByID0gdGhpcy5jYWxjRGlzdGFuY2UodmVjdG9ycywgaSwgaik7XG4gICAgICAgIC8vIGNvbXB1dGUgdGhlaXIgRXVjbGlkZWFuIGRpc3RhbmNlIG9uIHRoZSBELWRpbWVuc2lvbmFsIG1hcCwgZGlqLlxuICAgICAgICBjb25zdCBkID0gY2FsY3VsYXRlRXVjbGlkZWFuRGlzdGFuY2Uocm93aSwgcm93aik7XG5cbiAgICAgICAgaWYgKChyIDw9IHJhZGl1cykgfHwgKGQgPCByKSkge1xuICAgICAgICAgIGNvbnN0IG11bHRpcGxpZXIgPSBsYW1iZGEgKiAwLjUgKiAociAtIGQpIC8gKGQgKyB0aGlzLmVwc2lsb24pO1xuICAgICAgICAgIC8vIC4uLiB1cGRhdGUgdGhlIGNvb3JkaW5hdGVzIHhpIGFuZCB4ai5cbiAgICAgICAgICBjb25zdCBkaWZmSUogPSB2ZWN0b3JBZGQocm93aSwgcm93aiwgLTEpO1xuICAgICAgICAgIGNvb3JkaW5hdGVzW2ldID0gdmVjdG9yQWRkKHJvd2ksIGRpZmZJSiwgbXVsdGlwbGllcik7XG4gICAgICAgICAgY29vcmRpbmF0ZXNbal0gPSB2ZWN0b3JBZGQocm93aiwgZGlmZklKLCAtbXVsdGlwbGllcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxhbWJkYSAtPSAoKHRoaXMubGFtYmRhIC0gdGhpcy5kbGFtYmRhKSAvICh0aGlzLmN5Y2xlcyAtIDEuMCkpOyA7XG4gICAgICBpZiAobGFtYmRhIDwgdGhpcy5kbGFtYmRhKVxuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIGNvb3JkaW5hdGVzO1xuICB9XG59XG4iXX0=","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, } 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 } 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};\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 numberDistanceMetricsMethods = {\n [NumberMetricsNames.NumericDistance]: 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 },\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 },\n [DistanceMetricsSubjects.Number]: {\n [NumberMetricsNames.NumericDistance]: numberDistanceMetricsMethods[NumberMetricsNames.NumericDistance],\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}\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}\n/** Unified class implementing different string measures. */\nexport class Measure {\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) ?\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZWQtbWV0cmljcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInR5cGVkLW1ldHJpY3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMxQyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFFcEQsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixxQkFBcUIsRUFDckIsY0FBYyxFQUNkLFlBQVksRUFDWixpQkFBaUIsRUFDakIsZUFBZSxFQUNmLGtCQUFrQixFQUNsQixvQkFBb0IsRUFDcEIscUJBQXFCLEVBQ3JCLGNBQWMsRUFDZCxhQUFhLEVBQ2IsZ0JBQWdCLEVBQ2hCLGVBQWUsR0FDaEIsTUFBTSw2QkFBNkIsQ0FBQztBQUVyQyxPQUFPLEVBQUMsMEJBQTBCLEVBQUMsTUFBTSxpREFBaUQsQ0FBQztBQUczRixPQUFPLEVBQUMsbUJBQW1CLEVBQUUsd0JBQXdCLEVBQUMsTUFBTSxxQ0FBcUMsQ0FBQztBQUNsRyxPQUFPLEVBQUMsdUJBQXVCLEVBQUUsb0JBQW9CLEVBQ25ELGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFDLE1BQU0sVUFBVSxDQUFDO0FBRzlFLE1BQU0sQ0FBQyxNQUFNLDRCQUE0QixHQUF5RDtJQUNoRyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxFQUFFLDBCQUEwQjtDQUMzRCxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQXlEO0lBQ2hHLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRSxDQUFDLFFBQVE7SUFDN0MsQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsRUFBRSxXQUFXO0lBQzdDLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLEVBQUUsaUJBQWlCO0NBQ2xELENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSw4QkFBOEIsR0FBNkQ7SUFDdEcsQ0FBQyxvQkFBb0IsQ0FBQyxR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WUFDekYsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsSUFBSSxDQUFDLE1BQU0sa0JBQWtCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ25GLE9BQU8scUJBQXFCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDeEMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFxQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDN0UsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFtQixDQUFDO0lBQ3ZELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxRQUE0QjtRQUM1RCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLEtBQUssaUJBQWlCO1FBQzFCLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZsIGZyb20gJ2Zhc3Rlc3QtbGV2ZW5zaHRlaW4nO1xuaW1wb3J0IHtqYXJvV2lua2xlcn0gZnJvbSAnamFyby13aW5rbGVyLXR5cGVzY3JpcHQnO1xuaW1wb3J0IHtEaXN0YW5jZU1ldHJpY30gZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy91dGlscy9zcmMvdHlwZS1kZWNsYXJhdGlvbnMnO1xuaW1wb3J0IHtcbiAgYXN5bW1ldHJpY0Rpc3RhbmNlLFxuICBicmF1bkJsYW5xdWV0RGlzdGFuY2UsXG4gIGNvc2luZURpc3RhbmNlLFxuICBkaWNlRGlzdGFuY2UsXG4gIGV1Y2xpZGVhbkRpc3RhbmNlLFxuICBoYW1taW5nRGlzdGFuY2UsXG4gIGt1bGN6eW5za2lEaXN0YW5jZSxcbiAgbWNDb25uYXVnaGV5RGlzdGFuY2UsXG4gIHJvZ290R29sZGJlcmdEaXN0YW5jZSxcbiAgcnVzc2VsRGlzdGFuY2UsXG4gIHNva2FsRGlzdGFuY2UsXG4gIHRhbmltb3RvRGlzdGFuY2UsXG4gIG51bWVyaWNEaXN0YW5jZSxcbn0gZnJvbSAnLi4vZGlzdGFuY2UtbWV0cmljcy1tZXRob2RzJztcblxuaW1wb3J0IHtjYWxjdWxhdGVFdWNsaWRlYW5EaXN0YW5jZX0gZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy91dGlscy9zcmMvdmVjdG9yLW9wZXJhdGlvbnMnO1xuaW1wb3J0IEJpdEFycmF5IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL2JpdC1hcnJheSc7XG5pbXBvcnQge1ZlY3RvciwgU3RyaW5nRGljdGlvbmFyeX0gZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy91dGlscy9zcmMvdHlwZS1kZWNsYXJhdGlvbnMnO1xuaW1wb3J0IHttbURpc3RhbmNlRnVuY3Rpb25zLCBNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXN9IGZyb20gJy4uL21hY3JvbW9sZWN1bGUtZGlzdGFuY2UtZnVuY3Rpb25zJztcbmltcG9ydCB7RGlzdGFuY2VNZXRyaWNzU3ViamVjdHMsIEJpdEFycmF5TWV0cmljc05hbWVzLFxuICBTdHJpbmdNZXRyaWNzTmFtZXMsIFZlY3Rvck1ldHJpY3NOYW1lcywgTnVtYmVyTWV0cmljc05hbWVzfSBmcm9tICcuL2NvbnN0cyc7XG5cblxuZXhwb3J0IGNvbnN0IHZlY3RvckRpc3RhbmNlTWV0cmljc01ldGhvZHM6IHsgW25hbWU6IHN0cmluZ106ICh4OiBWZWN0b3IsIHk6IFZlY3RvcikgPT4gbnVtYmVyIH0gPSB7XG4gIFtWZWN0b3JNZXRyaWNzTmFtZXMuRXVjbGlkZWFuXTogY2FsY3VsYXRlRXVjbGlkZWFuRGlzdGFuY2UsXG59O1xuXG5leHBvcnQgY29uc3Qgc3RyaW5nRGlzdGFuY2VNZXRyaWNzTWV0aG9kczogeyBbbmFtZTogc3RyaW5nXTogKHg6IHN0cmluZywgeTogc3RyaW5nKSA9PiBudW1iZXIgfSA9IHtcbiAgW1N0cmluZ01ldHJpY3NOYW1lcy5MZXZlbnNodGVpbl06IGZsLmRpc3RhbmNlLFxuICBbU3RyaW5nTWV0cmljc05hbWVzLkphcm9XaW5rbGVyXTogamFyb1dpbmtsZXIsXG4gIFtTdHJpbmdNZXRyaWNzTmFtZXMuTWFuaGF0dGFuXTogbWFuaGF0dGFuRGlzdGFuY2UsXG59O1xuXG5leHBvcnQgY29uc3QgYml0QXJyYXlEaXN0YW5jZU1ldHJpY3NNZXRob2RzOiB7IFtuYW1lOiBzdHJpbmddOiAoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KSA9PiBudW1iZXIgfSA9IHtcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLlRhbmltb3RvXTogdGFuaW1vdG9EaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkRpY2VdOiBkaWNlRGlzdGFuY2UsXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Bc3ltbWV0cmljXTogYXN5bW1ldHJpY0Rpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuQnJhdW5CbGFucXVldF06IGJyYXVuQmxhbnF1ZXREaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkNvc2luZV06IGNvc2luZURpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuS3VsY3p5bnNraV06IGt1bGN6eW5za2lEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLk1jQ29ubmF1Z2hleV06IG1jQ29ubmF1Z2hleURpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuUm9nb3RHb2xkYmVyZ106IHJvZ290R29sZGJlcmdEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLlJ1c3NlbF06IHJ1c3NlbERpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuU29rYWxdOiBzb2thbERpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuSGFtbWluZ106IGhhbW1pbmdEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkV1Y2xpZGVhbl06IGV1Y2xpZGVhbkRpc3RhbmNlLFxufTtcblxuZXhwb3J0IGNvbnN0IG51bWJlckRpc3RhbmNlTWV0cmljc01ldGhvZHM6IHsgW25hbWU6IHN0cmluZ106ICh4OiBudW1iZXIsIHk6IG51bWJlcikgPT4gbnVtYmVyIH0gPSB7XG4gIFtOdW1iZXJNZXRyaWNzTmFtZXMuTnVtZXJpY0Rpc3RhbmNlXTogbnVtZXJpY0Rpc3RhbmNlLFxufTtcblxuZXhwb3J0IGNvbnN0IEF2YWlsYWJsZU1ldHJpY3MgPSB7XG4gIFtEaXN0YW5jZU1ldHJpY3NTdWJqZWN0cy5WZWN0b3JdOiB7XG4gICAgW1ZlY3Rvck1ldHJpY3NOYW1lcy5FdWNsaWRlYW5dOiB2ZWN0b3JEaXN0YW5jZU1ldHJpY3NNZXRob2RzW1ZlY3Rvck1ldHJpY3NOYW1lcy5FdWNsaWRlYW5dLFxuICB9LFxuICBbRGlzdGFuY2VNZXRyaWNzU3ViamVjdHMuU3RyaW5nXToge1xuICAgIFtTdHJpbmdNZXRyaWNzTmFtZXMuTGV2ZW5zaHRlaW5dOiBzdHJpbmdEaXN0YW5jZU1ldHJpY3NNZXRob2RzW1N0cmluZ01ldHJpY3NOYW1lcy5MZXZlbnNodGVpbl0sXG4gICAgW1N0cmluZ01ldHJpY3NOYW1lcy5KYXJvV2lua2xlcl06IHN0cmluZ0Rpc3RhbmNlTWV0cmljc01ldGhvZHNbU3RyaW5nTWV0cmljc05hbWVzLkphcm9XaW5rbGVyXSxcbiAgICBbU3RyaW5nTWV0cmljc05hbWVzLk1hbmhhdHRhbl06IHN0cmluZ0Rpc3RhbmNlTWV0cmljc01ldGhvZHNbU3RyaW5nTWV0cmljc05hbWVzLk1hbmhhdHRhbl0sXG4gIH0sXG4gIFtEaXN0YW5jZU1ldHJpY3NTdWJqZWN0cy5CaXRBcnJheV06IHtcbiAgICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuVGFuaW1vdG9dOiBiaXRBcnJheURpc3RhbmNlTWV0cmljc01ldGhvZHNbQml0QXJyYXlNZXRyaWNzTmFtZXMuVGFuaW1vdG9dLFxuICAgIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5EaWNlXTogYml0QXJyYXlEaXN0YW5jZU1ldHJpY3NNZXRob2RzW0JpdEFycmF5TWV0cmljc05hbWVzLkRpY2VdLFxuICAgIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Bc3ltbWV0cmljXTogYml0QXJyYXlEaXN0YW5jZU1ldHJpY3NNZXRob2RzW0JpdEFycmF5TWV0cmljc05hbWVzLkFzeW1tZXRyaWNdLFxuICAgIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5CcmF1bkJsYW5xdWV0XTogYml0QXJyYXlEaXN0YW5jZU1ldHJpY3NNZXRob2RzW0JpdEFycmF5TWV0cmljc05hbWVzLkJyYXVuQmxhbnF1ZXRdLFxuICAgIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Db3NpbmVdOiBiaXRBcnJheURpc3RhbmNlTWV0cmljc01ldGhvZHNbQml0QXJyYXlNZXRyaWNzTmFtZXMuQ29zaW5lXSxcbiAgICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuS3VsY3p5bnNraV06IGJpdEFycmF5RGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tCaXRBcnJheU1ldHJpY3NOYW1lcy5LdWxjenluc2tpXSxcbiAgICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuTWNDb25uYXVnaGV5XTogYml0QXJyYXlEaXN0YW5jZU1ldHJpY3NNZXRob2RzW0JpdEFycmF5TWV0cmljc05hbWVzLk1jQ29ubmF1Z2hleV0sXG4gICAgW0JpdEFycmF5TWV0cmljc05hbWVzLlJvZ290R29sZGJlcmddOiBiaXRBcnJheURpc3RhbmNlTWV0cmljc01ldGhvZHNbQml0QXJyYXlNZXRyaWNzTmFtZXMuUm9nb3RHb2xkYmVyZ10sXG4gICAgW0JpdEFycmF5TWV0cmljc05hbWVzLlJ1c3NlbF06IGJpdEFycmF5RGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tCaXRBcnJheU1ldHJpY3NOYW1lcy5SdXNzZWxdLFxuICAgIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Tb2thbF06IGJpdEFycmF5RGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tCaXRBcnJheU1ldHJpY3NOYW1lcy5Tb2thbF0sXG4gIH0sXG4gIFtEaXN0YW5jZU1ldHJpY3NTdWJqZWN0cy5NYWNyb01vbGVjdWxlXTogeyAvLyBvcHRpb25hbCBhcmdzIG5lZWRlZCBmb3IgbWFjcm9tb2xlY3VsZSBmdW5jdGlvbnMgd2hpY2ggaW5pdGlhbGl6ZSB0aGVtXG4gICAgW01tRGlzdGFuY2VGdW5jdGlvbnNOYW1lcy5IQU1NSU5HXTogbW1EaXN0YW5jZUZ1bmN0aW9uc1tNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXMuSEFNTUlOR10sXG4gICAgW01tRGlzdGFuY2VGdW5jdGlvbnNOYW1lcy5MRVZFTlNIVEVJTl06IG1tRGlzdGFuY2VGdW5jdGlvbnNbTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzLkxFVkVOU0hURUlOXSxcbiAgICBbTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzLk5FRURMRU1BTk5fV1VOU0NIXTogbW1EaXN0YW5jZUZ1bmN0aW9uc1tNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXMuTkVFRExFTUFOTl9XVU5TQ0hdLFxuICB9LFxuICBbRGlzdGFuY2VNZXRyaWNzU3ViamVjdHMuTnVtYmVyXToge1xuICAgIFtOdW1iZXJNZXRyaWNzTmFtZXMuTnVtZXJpY0Rpc3RhbmNlXTogbnVtYmVyRGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tOdW1iZXJNZXRyaWNzTmFtZXMuTnVtZXJpY0Rpc3RhbmNlXSxcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IE1ldHJpY1RvRGF0YVR5cGU6IFN0cmluZ0RpY3Rpb25hcnkgPSBPYmplY3Qua2V5cyhBdmFpbGFibGVNZXRyaWNzKVxuICAucmVkdWNlKChyZXQ6IFN0cmluZ0RpY3Rpb25hcnksIGtleSkgPT4ge1xuICAgIGZvciAoY29uc3QgdmFsIG9mIE9iamVjdC5rZXlzKEF2YWlsYWJsZU1ldHJpY3Nba2V5IGFzIEF2YWlsYWJsZURhdGFUeXBlc10pKVxuICAgICAgcmV0W3ZhbCBhcyBBdmFpbGFibGVEYXRhVHlwZXNdID0ga2V5O1xuXG4gICAgcmV0dXJuIHJldDtcbiAgfSwge30pO1xuXG5leHBvcnQgdHlwZSBBdmFpbGFibGVEYXRhVHlwZXMgPSBrZXlvZiB0eXBlb2YgQXZhaWxhYmxlTWV0cmljcztcbmV4cG9ydCB0eXBlIFZlY3Rvck1ldHJpY3MgPSBrZXlvZiB0eXBlb2YgQXZhaWxhYmxlTWV0cmljc1tEaXN0YW5jZU1ldHJpY3NTdWJqZWN0cy5WZWN0b3JdO1xuZXhwb3J0IHR5cGUgU3RyaW5nTWV0cmljcyA9IGtleW9mIHR5cGVvZiBBdmFpbGFibGVNZXRyaWNzW0Rpc3RhbmNlTWV0cmljc1N1YmplY3RzLlN0cmluZ107XG5leHBvcnQgdHlwZSBCaXRBcnJheU1ldHJpY3MgPSBrZXlvZiB0eXBlb2YgQXZhaWxhYmxlTWV0cmljc1tEaXN0YW5jZU1ldHJpY3NTdWJqZWN0cy5CaXRBcnJheV07XG5leHBvcnQgdHlwZSBLbm93bk1ldHJpY3MgPSBTdHJpbmdNZXRyaWNzIHwgQml0QXJyYXlNZXRyaWNzIHwgVmVjdG9yTWV0cmljcyB8XG4gIE1tRGlzdGFuY2VGdW5jdGlvbnNOYW1lcyB8IE51bWJlck1ldHJpY3NOYW1lcztcblxuZXhwb3J0IHR5cGUgVmFsaWRUeXBlcyA9XG4gIHsgZGF0YTogc3RyaW5nW10sIG1ldHJpYzogU3RyaW5nTWV0cmljcyB8IE1tRGlzdGFuY2VGdW5jdGlvbnNOYW1lcyB9IHxcbiAgeyBkYXRhOiBWZWN0b3JbXSwgbWV0cmljOiBWZWN0b3JNZXRyaWNzIH0gfFxuICB7IGRhdGE6IEJpdEFycmF5W10sIG1ldHJpYzogQml0QXJyYXlNZXRyaWNzIH0gfFxuICB7IGRhdGE6IG51bWJlcltdLCBtZXRyaWM6IE51bWJlck1ldHJpY3NOYW1lcyB9O1xuXG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmdNZXRyaWMobmFtZTogS25vd25NZXRyaWNzKSB7XG4gIHJldHVybiBNZXRyaWNUb0RhdGFUeXBlW25hbWVdID09ICdTdHJpbmcnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNCaXRBcnJheU1ldHJpYyhuYW1lOiBLbm93bk1ldHJpY3MpIHtcbiAgcmV0dXJuIE1ldHJpY1RvRGF0YVR5cGVbbmFtZV0gPT0gJ0JpdEFycmF5Jztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVmVjdG9yTWV0cmljKG5hbWU6IEtub3duTWV0cmljcykge1xuICByZXR1cm4gTWV0cmljVG9EYXRhVHlwZVtuYW1lXSA9PSAnVmVjdG9yJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTWFjcm9Nb2xlY3VsZU1ldHJpYyhuYW1lOiBLbm93bk1ldHJpY3MpIHtcbiAgcmV0dXJuIE1ldHJpY1RvRGF0YVR5cGVbbmFtZV0gPT0gRGlzdGFuY2VNZXRyaWNzU3ViamVjdHMuTWFjcm9Nb2xlY3VsZS50b1N0cmluZygpO1xufVxuXG4vKiogTWFuaGF0dGFuIGRpc3RhbmNlIGJldHdlZW4gdHdvIHNlcXVlbmNlcyAobWF0Y2ggLSAwLCBtaXNtYXRjaCAtIDEpIG5vcm1hbGl6ZWQgZm9yIGxlbmd0aC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYW5oYXR0YW5EaXN0YW5jZShzMTogc3RyaW5nLCBzMjogc3RyaW5nKTogbnVtYmVyIHtcbiAgaWYgKHMxLmxlbmd0aCAhPT0gczIubGVuZ3RoKSB7XG4gICAgcmV0dXJuIDE7XG4gIH0gZWxzZSB7XG4gICAgbGV0IGRpc3Q6IG51bWJlciA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzMS5sZW5ndGg7IGkrKylcbiAgICAgIGRpc3QgKz0gczFbaV0gPT0gczJbaV0gPyAwIDogMTtcbiAgICByZXR1cm4gZGlzdCAvIHMxLmxlbmd0aDtcbiAgfVxufVxuXG4vKiogVW5pZmllZCBjbGFzcyBpbXBsZW1lbnRpbmcgZGlmZmVyZW50IHN0cmluZyBtZWFzdXJlcy4gKi9cbmV4cG9ydCBjbGFzcyBNZWFzdXJlIHtcbiAgcHJvdGVjdGVkIG1ldGhvZDogS25vd25NZXRyaWNzO1xuICBwcm90ZWN0ZWQgZGF0YVR5cGU6IEF2YWlsYWJsZURhdGFUeXBlcztcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBNZWFzdXJlIHdpdGggLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kIE1ldGhvZCB0byBjYWxjdWxhdGUgZGlzdGFuY2UgYmV0d2VlbiBzdHJpbmdzLlxuICAgKiBAbWVtYmVyb2YgTWVhc3VyZXJcbiAgICovXG4gIGNvbnN0cnVjdG9yKG1ldGhvZDogS25vd25NZXRyaWNzKSB7XG4gICAgdGhpcy5tZXRob2QgPSBtZXRob2Q7XG4gICAgdGhpcy5kYXRhVHlwZSA9IE1ldHJpY1RvRGF0YVR5cGVbbWV0aG9kXSBhcyBBdmFpbGFibGVEYXRhVHlwZXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBjdXN0b20gc3RyaW5nIGRpc3RhbmNlIGZ1bmN0aW9uIHNwZWNpZmllZC5cbiAgICogQHBhcmFtIHtvcHRzfSBvcHRzIE9wdGlvbnMgZm9yIHRoZSBtZWFzdXJlLiB1c2VkIGZvciBtYWNyb21vbGVjdWxlIGRpc3RhbmNlc1xuICAgKiBAcmV0dXJuIHtEaXN0YW5jZU1ldHJpY30gQ2FsbGJhY2sgb2YgdGhlIG1lYXN1cmUgY2hvc2VuLlxuICAgKiBAbWVtYmVyb2YgTWVhc3VyZXJcbiAgICovXG4gIHB1YmxpYyBnZXRNZWFzdXJlKG9wdHM/OiBhbnkpOiBEaXN0YW5jZU1ldHJpYyB7XG4gICAgY29uc3QgZGljdDogeyBba2V5OiBzdHJpbmddOlxuICAgICAge1trZXkyOiBzdHJpbmddOiBEaXN0YW5jZU1ldHJpYyB8ICgob3B0czogYW55KSA9PiBEaXN0YW5jZU1ldHJpYyl9XG4gICAgfSA9IEF2YWlsYWJsZU1ldHJpY3M7XG4gICAgaWYgKCFkaWN0Lmhhc093blByb3BlcnR5KHRoaXMuZGF0YVR5cGUpIHx8ICFkaWN0W3RoaXMuZGF0YVR5cGVdLmhhc093blByb3BlcnR5KHRoaXMubWV0aG9kKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBtZWFzdXJlICR7dGhpcy5tZXRob2R9IGZvciBkYXRhIHR5cGUgJHt0aGlzLmRhdGFUeXBlfWApO1xuICAgIHJldHVybiBpc01hY3JvTW9sZWN1bGVNZXRyaWModGhpcy5tZXRob2QpID9cbiAgICAgIChkaWN0W3RoaXMuZGF0YVR5cGVdW3RoaXMubWV0aG9kXSBhcyAoKG9wdHM6IGFueSkgPT4gRGlzdGFuY2VNZXRyaWMpKShvcHRzKSA6XG4gICAgICBkaWN0W3RoaXMuZGF0YVR5cGVdW3RoaXMubWV0aG9kXSBhcyBEaXN0YW5jZU1ldHJpYztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGN1c3RvbSBzdHJpbmcgZGlzdGFuY2UgYnkgdGhlIGdpdmVuIGRhdGEgdHlwZS5cbiAgICogQHBhcmFtIHtBdmFpbGFibGVEYXRhVHlwZXN9IGRhdGFUeXBlIE1ldHJpYydzIGRhdGEgdHlwZVxuICAgKiBAcmV0dXJuIHtzdHJpbmdbXX0gTWV0cmljIG5hbWVzIHdoaWNoIGV4cGVjdHMgdGhlIGdpdmVuIGRhdGEgdHlwZVxuICAgKiBAbWVtYmVyb2YgTWVhc3VyZXJcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0TWV0cmljQnlEYXRhVHlwZShkYXRhVHlwZTogQXZhaWxhYmxlRGF0YVR5cGVzKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhBdmFpbGFibGVNZXRyaWNzW2RhdGFUeXBlXSk7XG4gIH1cblxuICAvKiogUmV0dXJucyBtZXRyaWMgbmFtZXMgYXZhaWxhYmxlLlxuICAgKiBAbWVtYmVyb2YgTWVhc3VyZXJcbiAgICovXG4gIHN0YXRpYyBnZXQgYXZhaWxhYmxlTWVhc3VyZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhBdmFpbGFibGVNZXRyaWNzKTtcbiAgfVxufVxuIl19","export default class BitArray {\n constructor(arg, defaultValue = false) {\n this._length = 0;\n this._version = 0;\n this._updateLevel = 0;\n this._selectedCount = 0;\n this._selectedCountVersion = -1;\n this._selectedIndexesVersion = -1;\n this._versionedName = '';\n this._versionedNameVersion = -1;\n this.SHRINK_THRESHOLD = 0x100;\n if (typeof arg === 'number') {\n const length = arg;\n const buff = BitArray._createBuffer(length);\n if (defaultValue) {\n for (let i = 0; i < buff.length; i++)\n buff[i] = -1;\n }\n this._data = buff;\n this._length = length;\n }\n else if (arg instanceof Uint32Array) {\n this._data = arg;\n this._length = defaultValue;\n }\n else {\n throw new Error('Invalid constructor');\n }\n }\n getRawData() { return this._data; }\n assureGoez(num, argName) {\n if (num < 0)\n throw new Error(`${argName} should be greater than zero`);\n }\n assureInRange(value, min, max, argName) {\n if ((value < min) || (value > max))\n throw new Error(`Argument ${argName} (${value}) out of range (${min}, ${max})`);\n }\n copy(src, dst, count) {\n for (let i = 0; i < count; i++)\n dst[i] = src[i];\n }\n copyFrom(other) {\n if (this._length != other._length)\n throw new Error(`Lengths differ (${this._length} != ${other._length})`);\n this.copy(other._data, this._data, this.lengthInInts);\n this._version++;\n }\n get length() {\n return this._length;\n }\n get buffer() {\n return this._data;\n }\n set buffer(data) {\n this._data = data;\n this._version++;\n }\n get version() {\n return this._version;\n }\n set version(value) {\n this._version = value;\n }\n incrementVersion(notify = true) {\n this._version++;\n }\n get lengthInInts() {\n return Math.floor((this._length + 0x1f) / 0x20);\n }\n get versionedName() {\n return this._version == this._versionedNameVersion ? this._versionedName : '';\n }\n set versionedName(name) {\n this._versionedName = name;\n this._versionedNameVersion = this._version;\n }\n get self() {\n return this;\n }\n setLength(value) {\n if (value < 0)\n throw new Error('should be >= 0');\n if (value == this._length)\n return;\n const nIntsNeeded = Math.floor((value + 0x1f) / 0x20);\n if ((nIntsNeeded > this._data.length) || ((nIntsNeeded + this.SHRINK_THRESHOLD) < this._data.length)) {\n const newData = new Uint32Array(nIntsNeeded);\n this.copy(this._data, newData, (nIntsNeeded > this._data.length) ? this._data.length : nIntsNeeded);\n this._data = newData;\n }\n if (value > this._length) {\n if (this._length % 0x20 > 0)\n this._data[this.lengthInInts - 1] &= (1 << ((this._length % 0x20) & 0x1f)) - 1;\n this._data.fill(0, this.lengthInInts, nIntsNeeded);\n }\n this._length = value;\n this._version++;\n }\n static fromAnd(set1, set2) {\n if (set1._length != set2._length)\n throw new Error(`Lengths differ (${set1._length} != ${set2._length})`);\n const temp = new BitArray(set1._length);\n temp._length = set1._length;\n temp._data = BitArray._createBuffer(temp._length);\n temp._version = 0;\n const len = set1.lengthInInts;\n for (let i = 0; i < len; i++)\n temp._data[i] = set1._data[i] & set2._data[i];\n return temp;\n }\n static _createBuffer(length) {\n return new Uint32Array(Math.floor((length + 0x1f) / 0x20));\n }\n static fromValues(values) {\n const temp = new BitArray(values.length);\n temp._version = 0;\n for (let i = 0; i < temp._length; i++) {\n if (values[i])\n temp._data[Math.floor(i / 0x20)] |= 1 << ((i % 0x20) & 0x1f);\n }\n return temp;\n }\n /// Constructs a [BitSet] of length [count], where idx-th bit is determined by a call to [flag] (idx).\n static fromSeq(count, flag) {\n const temp = new BitArray(count);\n for (let i = 0; i < count; ++i)\n temp.setBit(i, flag(i));\n temp._version = 0;\n return temp;\n }\n /// Constructs a [BitSet] from a string [s] containing '0' or '1'.\n static fromString(s) {\n return BitArray.fromSeq(s.length, (i) => s.charAt(i) == '1');\n }\n /// Constructs a [BitSet], based on length [_length] and byte array [_data].\n static fromUint32Array(_length, _data) {\n const temp = new BitArray(_length);\n temp._data = _data;\n return temp;\n }\n /// Deserializes a [BitSet] from [bytes].\n static fromBytes(bytes) {\n const len = bytes.length;\n const temp = new BitArray(len * 8);\n temp._data = new Uint32Array(Math.floor((len + 3) / 4));\n temp._length = len * 8;\n let num1 = 0;\n let num2 = 0;\n while ((len - num2) >= 4) {\n temp._data[num1++] = (((bytes[num2] & 0xff) | ((bytes[num2 + 1] & 0xff) << 8)) |\n ((bytes[num2 + 2] & 0xff) << 0x10)) | ((bytes[num2 + 3] & 0xff) << 0x18);\n num2 += 4;\n }\n if (len - num2 == 3)\n temp._data[num1] = (bytes[num2 + 2] & 0xff) << 0x10;\n if (len - num2 == 2)\n temp._data[num1] |= (bytes[num2 + 1] & 0xff) << 8;\n if (len - num2 == 1)\n temp._data[num1] |= bytes[num2] & 0xff;\n temp._version = 0;\n return temp;\n }\n toString() {\n return `${this._length} bits, ${this.countBits(true)} set`;\n }\n /// Performs deep comparison of two bitsets.\n equals(other) {\n if (this == other)\n return true;\n if (other == null)\n return false;\n if (this._length != other._length)\n return false;\n if (this._length == 0)\n return true;\n for (let i = 0; i < this._data.length - 1; i++)\n if (this._data[i] != other._data[i])\n return false;\n for (let i = (this._data.length - 1) * 8; i < this._length; i++) {\n if (this.getBit(i) != other.getBit(i))\n return false;\n }\n return true;\n }\n /** Clones a bitset. */\n clone() {\n const bitArray = new BitArray(0, false);\n bitArray._data = Uint32Array.from(this._data); // effective length: (lengthInInts)\n bitArray._length = this._length;\n bitArray._version = this._version;\n return bitArray;\n }\n /** Initializes a bitset. */\n init(flag, notify) {\n this.setAll(false, false);\n for (let i = 0; i < this._length; i++) {\n if (flag(i))\n this._data[Math.floor(i / 0x20)] |= 1 << ((i % 0x20) & 0x1f);\n }\n this.incrementVersion(notify);\n return this;\n }\n /// Inverts a bitset.\n invert(notify = true) {\n for (let i = 0; i < this._data.length; i++)\n this._data[i] ^= -1;\n this.incrementVersion(notify);\n }\n /// Sets all bits to [value], optionally suppressing notifications.\n setAll(value, notify = false) {\n const flags = value ? -1 : 0;\n const len = this.lengthInInts;\n for (let i = 0; i < len; i++) //todo: optimize\n this._data[i] = flags;\n this.incrementVersion(notify);\n }\n /// Sets bits at [indexes] position to [value].\n /// Clears the bitset if [clear] flag is true.\n /// Change notification is raised when [notify] is true.\n setIndexes(indexes, value = true, clear = true, notify = true) {\n if (clear)\n this.setAll(!value, false);\n for (const i of indexes)\n this.setFast(i, value);\n this.incrementVersion(notify);\n }\n everyIndex(indexes, value = true) {\n for (const index of indexes) {\n if (this.getBit(index) != value)\n return false;\n }\n return true;\n }\n anyIndex(indexes, value = true) {\n for (const index of indexes) {\n if (this.getBit(index) == value)\n return true;\n }\n return false;\n }\n setWhere(check, value = true, clear = true, notify = true, allowClear = true) {\n if (clear && allowClear)\n this.setAll(!value, false);\n if (allowClear) {\n for (let i = 0; i < this._length; i++) {\n if (check(i))\n this.setFast(i, value);\n }\n }\n else {\n for (let i = 0; i < this._length; i++)\n this.setFast(i, check(i) ? value : !value);\n }\n this.incrementVersion(notify);\n }\n getRange(from, to) {\n this.assureInRange(from, 0, this._length - 1, 'from');\n this.assureInRange(to, 0, this._length, 'to');\n const arr = [];\n for (let i = from; i < to; ++i)\n arr.push(this.getBit(i));\n return BitArray.fromValues(arr);\n }\n getRangeAsList(from, to) {\n this.assureInRange(from, 0, this._length - 1, 'from');\n this.assureInRange(to, 0, this._length, 'to');\n const arr = [];\n for (let i = from; i < to; ++i)\n arr.push(this.getBit(i));\n return arr;\n }\n setRange(from, to, value, notify = true) {\n this.assureInRange(from, 0, this._length - 1, 'from');\n this.assureInRange(to, 0, this._length - 1, 'to');\n const start = Math.min(from, to);\n const end = Math.max(from, to);\n //todo: optimize\n if (value) {\n for (let i = start; i <= end; i++)\n this.setTrue(i);\n }\n else {\n for (let i = start; i <= end; i++)\n this.setFalse(i);\n }\n this.incrementVersion(notify);\n return this;\n }\n /// Sets n randomly chosen bits to value, remaining bits to !value.\n setRandom(n, value, notify = true) {\n if (n < 0 || n > this._length)\n throw new Error('n must be >= 0 && <= Count');\n if (n > this._length / 2)\n this.setRandom(this._length - n, !value);\n this.setAll(!value);\n for (let k = 0; k < n;) {\n const i = Math.floor(Math.random() * this._length);\n if (this.getBit(i) == value)\n continue;\n this.setFast(i, value);\n k++;\n }\n this.incrementVersion(notify);\n }\n /// Modifies current bitset by performing the bitwise AND operation against the\n /// corresponding elements in the specified bitset.\n and(value, notify = true) {\n if (this._length != value._length)\n throw new Error('Array lengths differ.');\n for (let i = 0, len = this.lengthInInts; i < len; i++)\n this._data[i] &= value._data[i];\n this.incrementVersion(notify);\n return this;\n }\n /// Performs the bitwise AND NOT operation on the elements in the current bitset\n /// against the corresponding elements in the specified bitset.\n andNot(value, notify = true) {\n if (this._length != value._length)\n throw new Error('Array lengths differ.');\n const len = this.lengthInInts;\n for (let num2 = 0; num2 < len; num2++)\n this._data[num2] &= ~value._data[num2];\n this.incrementVersion(notify);\n return this;\n }\n /// Performs the bitwise NOT AND operation on the elements in the current bitset\n /// against the corresponding elements in the specified bitset.\n notAnd(value, notify = true) {\n if (this._length != value._length)\n throw new Error('Array lengths differ.');\n for (let i = 0, len = this.lengthInInts; i < len; i++)\n this._data[i] = (~this._data[i]) & value._data[i];\n this.incrementVersion(notify);\n return this;\n }\n /// Inverts all bit values in the current bitset\n not(notify = true) {\n for (let i = 0, len = this.lengthInInts; i < len; i++)\n this._data[i] = ~this._data[i];\n this.incrementVersion(notify);\n return this;\n }\n /// Performs the bitwise OR operation on the elements in the current bitset\n /// against the corresponding elements in the specified bitset.\n or(value, notify = true) {\n if (this._length != value._length)\n throw new Error('Array lengths differ.');\n for (let i = 0, len = this.lengthInInts; i < len; i++)\n this._data[i] |= value._data[i];\n this.incrementVersion(notify);\n return this;\n }\n /// Performs the bitwise exclusive OR operation on the elements in the current bitset\n /// against the corresponding elements in the specified bitset.\n xor(value, notify = true) {\n if (this._length != value._length)\n throw new Error('Array lengths differ.');\n for (let i = 0, len = this.lengthInInts; i < len; i++)\n this._data[i] ^= value._data[i];\n this.incrementVersion(notify);\n return this;\n }\n /// Inserts n 0-bits at position pos, resizing self and shifting bits appropriately.\n insertAt(pos, n, flag = false) {\n this.assureInRange(pos, 0, this._length, 'pos');\n if (n == 0)\n return;\n //TODO: optimize\n //the most primitive implementation, optimize it later!\n // beginUpdate();\n const oldlength = this._length;\n this.setLength(this._length + n);\n //if (!contains(!flag)) return; // nothing to do\n for (let i = oldlength - 1; i >= pos; i--)\n this.setBit(i + n, this.getBit(i));\n for (let i = pos; i < pos + n; i++)\n this.setBit(i, flag);\n // endUpdate();\n }\n /// Deletes n bits beginning at position pos, resizing self and shifting remaining\n /// bits appropriately.\n removeAt(pos, n = 1) {\n // the most primitive implementation, optimize it later!\n if (n < 0)\n throw new Error('n cannot be negative');\n this.assureInRange(pos, 0, this._length - n, 'pos');\n if (this.contains(true)) {\n for (let i = pos; i < this._length - n; i++)\n this.setBit(i, this.getBit(i + n));\n }\n this.setLength(this._length - n);\n }\n removeByMask(mask, flag = true) {\n if (this._length != mask.length)\n throw new Error('length != mask.length');\n if (mask == this) { // no need to iterate\n this.setLength(mask.countBits(!flag));\n this.setAll(!flag);\n }\n else {\n let dstIdx = 0;\n for (let srcIdx = -1; (srcIdx = mask.findNext(srcIdx, !flag)) != -1;)\n this.setFast(dstIdx++, this.getBit(srcIdx));\n this._length = dstIdx;\n this._version++;\n }\n return this;\n }\n /// Similar to the [] operator.\n getBit(pos) {\n return (this._data[Math.floor(pos / 0x20)] & (1 << (pos & 0x1f))) != 0;\n }\n /// Similar to the [] operator.\n setBit(pos, bit, notify = true) {\n this.setFast(pos, bit);\n if (notify)\n this._version++;\n else\n this._version++;\n }\n /// Sets [i]-th bit to [value], does not check bounds, does not increment version\n setFast(i, value) {\n if (value)\n this._data[Math.floor(i / 0x20)] |= 1 << (i & 0x1f);\n else\n this._data[Math.floor(i / 0x20)] &= ~(1 << (i & 0x1f));\n }\n setTrue(pos) {\n this._data[Math.floor(pos / 0x20)] |= 1 << (pos & 0x1f);\n }\n setFalse(pos) {\n this._data[Math.floor(pos / 0x20)] &= ~(1 << (pos & 0x1f));\n }\n trueCount() {\n return this.countBits(true);\n }\n falseCount() {\n return this.countBits(false);\n }\n /// Counts bits of the specified value.\n countBits(value) {\n if (this._length == 0)\n return 0;\n if (this._selectedCountVersion != this._version) {\n this._selectedCount = 0;\n const len = this.lengthInInts;\n let i = 0;\n for (; i < len - 1; i++) {\n for (let k = this._data[i]; k != 0; k >>>= 8) { //todo: cast data[i] to uint\n this._selectedCount += BitArray._onBitCount[k & 0xff];\n }\n }\n // The last int.\n let k = this._data[i];\n const remainingBits = this._length & 0x1f;\n if (remainingBits != 0) /* if remainingBits == 0, the last int is fully used and ALL bits should be left as is */\n k &= ~((4294967295) << remainingBits);\n for (; k != 0; k >>>= 8)\n this._selectedCount += BitArray._onBitCount[k & 0xff];\n this._selectedCountVersion = this._version;\n }\n return (value ? this._selectedCount : this._length - this._selectedCount);\n }\n /// Returns a number of set bits where also [check] is true\n countWhere(check) {\n let result = 0;\n if (this.trueCount() == this._length) {\n for (let i = 0; i < this._length; i++)\n result += check(i) ? 1 : 0;\n }\n else {\n for (let i = -1; (i = this.findNext(i, true)) != -1;)\n result += check(i) ? 1 : 0;\n }\n return result;\n }\n /// Performs bit \"and\" and counts bits of the specified value, without bitset modification.\n andWithCountBits(second, value) {\n if (this._length == 0)\n return 0;\n let count = 0;\n const len = this.lengthInInts;\n let i = 0;\n for (; i < len - 1; i++) {\n for (let k = this._data[i] & second._data[i]; k != 0; k >>>= 8)\n count += BitArray._onBitCount[k & 0xff];\n }\n // The last int.\n let k = this._data[i] & second._data[i];\n const remainingBits = this._length & 0x1f;\n if (remainingBits != 0)\n k &= ~((4294967295) << remainingBits);\n for (; k != 0; k >>>= 8)\n count += BitArray._onBitCount[k & 0xff];\n return (value ? count : this._length - count);\n }\n clear() {\n this.setLength(0);\n }\n contains(value) {\n return this.findNext(-1, value) >= 0;\n }\n get allTrue() {\n return this.countBits(true) == this._length;\n }\n get allFalse() {\n return this.countBits(false) == this._length;\n }\n get anyTrue() {\n return this.countBits(true) > 0;\n }\n get anyFalse() {\n return this.countBits(false) > 0;\n }\n /// Returns the position of the next bit of the specified value, starting from the specified position.\n /// Returns -1, if there are no such bits.\n findNext(index, value = true) {\n this.assureInRange(index, -1, this._length, 'index');\n if (index >= this._length - 1)\n return -1;\n index = index < 0 ? 0 : index + 1; // skip start\n let unusedBits = index & 0x1f;\n const numInts = this.lengthInInts;\n for (let i = Math.floor(index / 32); i < numInts; i++) {\n let k = (value ? this._data[i] : ~this._data[i]); // uint cast\n if (unusedBits != 0) {\n k &= ((0xffffffff << unusedBits) & 0xffffffff);\n unusedBits = 0;\n }\n else if (!value && k == -4294967296) /* looking for false, all bits are set */ {\n continue;\n }\n for (let j = 0; k != 0; j += 8, k >>>= 8) {\n const p = BitArray._firstOnBit[k & 0xff];\n if (p >= 0) {\n index = p + (i * 32) + j;\n if (index >= this._length)\n return -1;\n return index;\n }\n }\n }\n return -1;\n }\n /// Finds previous bit of the specified value in the bitset.\n findPrev(index, value = true) {\n if (index == 0)\n return -1;\n this.assureInRange(index, -1, this._length, 'index');\n index = index < 0 ? this._length - 1 : index - 1; // skip start\n const lastIntIdx = Math.floor(index / 0x20);\n let remainingBits = (index + 1) & 0x1f;\n for (let i = lastIntIdx; i >= 0; i--) {\n let k = (value ? this._data[i] : ~this._data[i]); // cast\n if (remainingBits != 0) {\n k &= ~((4294967295) << remainingBits);\n remainingBits = 0;\n }\n for (let j = 24; k != 0; j -= 8, k <<= 8) {\n const p = BitArray._lastOnBit[k >>> 0x18];\n if (p >= 0)\n return p + (i * 32) + j;\n }\n }\n return -1;\n }\n}\nBitArray._onBitCount = Int8Array.from([\n 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,\n 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,\n 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,\n 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,\n 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,\n 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,\n 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,\n 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,\n 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,\n 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,\n 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,\n 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,\n 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,\n 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,\n 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,\n 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8\n]);\nBitArray._firstOnBit = Int8Array.from([\n -1, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0\n]);\nBitArray._lastOnBit = Int8Array.from([\n -1, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,\n 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,\n 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,\n 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,\n 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7\n]);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYml0LWFycmF5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYml0LWFycmF5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxPQUFPLE9BQU8sUUFBUTtJQW9FM0IsWUFBWSxHQUF5QixFQUFFLGVBQWlDLEtBQUs7UUFackUsWUFBTyxHQUFHLENBQUMsQ0FBQztRQUNaLGFBQVEsR0FBRyxDQUFDLENBQUM7UUFDYixpQkFBWSxHQUFHLENBQUMsQ0FBQztRQUNqQixtQkFBYyxHQUFHLENBQUMsQ0FBQztRQUNuQiwwQkFBcUIsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMzQiw0QkFBdUIsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM3QixtQkFBYyxHQUFHLEVBQUUsQ0FBQztRQUNwQiwwQkFBcUIsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNuQyxxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFLdkIsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUU7WUFDM0IsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDO1lBQ25CLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDNUMsSUFBSSxZQUFZLEVBQUU7Z0JBQ2hCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtvQkFDbEMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQ2hCO1lBQ0QsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7WUFDbEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7U0FDdkI7YUFBTSxJQUFJLEdBQUcsWUFBWSxXQUFXLEVBQUU7WUFDckMsSUFBSSxDQUFDLEtBQUssR0FBRyxHQUFrQixDQUFDO1lBQ2hDLElBQUksQ0FBQyxPQUFPLEdBQUcsWUFBc0IsQ0FBQztTQUN2QzthQUFNO1lBQ0wsTUFBTSxJ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QUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FBQyxDQUFDLENBQUM7QUFFNUMsb0JBQVcsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO0lBQ2xDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUMvQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUFDLENBQUMsQ0FBQztBQUU1QyxtQkFBVSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7SUFDakMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQy9DLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgY2xhc3MgQml0QXJyYXkge1xuICBzdGF0aWMgX29uQml0Q291bnQgPSBJbnQ4QXJyYXkuZnJvbShbXG4gICAgMCwgMSwgMSwgMiwgMSwgMiwgMiwgMywgMSwgMiwgMiwgMywgMiwgMywgMywgNCxcbiAgICAxLCAyLCAyLCAzLCAyLCAzLCAzLCA0LCAyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LFxuICAgIDEsIDIsIDIsIDMsIDIsIDMsIDMsIDQsIDIsIDMsIDMsIDQsIDMsIDQsIDQsIDUsXG4gICAgMiwgMywgMywgNCwgMywgNCwgNCwgNSwgMywgNCwgNCwgNSwgNCwgNSwgNSwgNixcbiAgICAxLCAyLCAyLCAzLCAyLCAzLCAzLCA0LCAyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LFxuICAgIDIsIDMsIDMsIDQsIDMsIDQsIDQsIDUsIDMsIDQsIDQsIDUsIDQsIDUsIDUsIDYsXG4gICAgMiwgMywgMywgNCwgMywgNCwgNCwgNSwgMywgNCwgNCwgNSwgNCwgNSwgNSwgNixcbiAgICAzLCA0LCA0LCA1LCA0LCA1LCA1LCA2LCA0LCA1LCA1LCA2LCA1LCA2LCA2LCA3LFxuICAgIDEsIDIsIDIsIDMsIDIsIDMsIDMsIDQsIDIsIDMsIDMsIDQsIDMsIDQsIDQsIDUsXG4gICAgMiwgMywgMywgNCwgMywgNCwgNCwgNSwgMywgNCwgNCwgNSwgNCwgNSwgNSwgNixcbiAgICAyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LCAzLCA0LCA0LCA1LCA0LCA1LCA1LCA2LFxuICAgIDMsIDQsIDQsIDUsIDQsIDUsIDUsIDYsIDQsIDUsIDUsIDYsIDUsIDYsIDYsIDcsXG4gICAgMiwgMywgMywgNCwgMywgNCwgNCwgNSwgMywgNCwgNCwgNSwgNCwgNSwgNSwgNixcbiAgICAzLCA0LCA0LCA1LCA0LCA1LCA1LCA2LCA0LCA1LCA1LCA2LCA1LCA2LCA2LCA3LFxuICAgIDMsIDQsIDQsIDUsIDQsIDUsIDUsIDYsIDQsIDUsIDUsIDYsIDUsIDYsIDYsIDcsXG4gICAgNCwgNSwgNSwgNiwgNSwgNiwgNiwgNywgNSwgNiwgNiwgNywgNiwgNywgNywgOF0pO1xuXG4gIHN0YXRpYyBfZmlyc3RPbkJpdCA9IEludDhBcnJheS5mcm9tKFtcbiAgICAtMSwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcbiAgICA0LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxuICAgIDUsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXG4gICAgNCwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcbiAgICA2LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxuICAgIDQsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXG4gICAgNSwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcbiAgICA0LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxuICAgIDcsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXG4gICAgNCwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcbiAgICA1LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxuICAgIDQsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXG4gICAgNiwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcbiAgICA0LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxuICAgIDUsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXG4gICAgNCwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMF0pO1xuXG4gIHN0YXRpYyBfbGFzdE9uQml0ID0gSW50OEFycmF5LmZyb20oW1xuICAgIC0xLCAwLCAxLCAxLCAyLCAyLCAyLCAyLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLFxuICAgIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsXG4gICAgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSxcbiAgICA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LFxuICAgIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsXG4gICAgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNixcbiAgICA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LFxuICAgIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsXG4gICAgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNyxcbiAgICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LFxuICAgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsXG4gICAgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNyxcbiAgICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LFxuICAgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsXG4gICAgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNyxcbiAgICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3XSk7XG5cbiAgcHJpdmF0ZSBfZGF0YTogVWludDMyQXJyYXk7XG4gIHByaXZhdGUgX2xlbmd0aCA9IDA7XG4gIHByaXZhdGUgX3ZlcnNpb24gPSAwO1xuICBwcml2YXRlIF91cGRhdGVMZXZlbCA9IDA7XG4gIHByaXZhdGUgX3NlbGVjdGVkQ291bnQgPSAwO1xuICBwcml2YXRlIF9zZWxlY3RlZENvdW50VmVyc2lvbiA9IC0xO1xuICBwcml2YXRlIF9zZWxlY3RlZEluZGV4ZXNWZXJzaW9uID0gLTE7XG4gIHByaXZhdGUgX3ZlcnNpb25lZE5hbWUgPSAnJztcbiAgcHJpdmF0ZSBfdmVyc2lvbmVkTmFtZVZlcnNpb24gPSAtMTtcbiAgU0hSSU5LX1RIUkVTSE9MRCA9IDB4MTAwO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IFVpbnQzMkFycmF5LCBsZW5ndGg6IG51bWJlcilcbiAgY29uc3RydWN0b3IobGVuZ3RoOiBudW1iZXIsIGRlZmF1bHRWYWx1ZT86IGJvb2xlYW4pXG4gIGNvbnN0cnVjdG9yKGFyZzogbnVtYmVyIHwgVWludDMyQXJyYXksIGRlZmF1bHRWYWx1ZTogYm9vbGVhbiB8IG51bWJlciA9IGZhbHNlKSB7XG4gICAgaWYgKHR5cGVvZiBhcmcgPT09ICdudW1iZXInKSB7XG4gICAgICBjb25zdCBsZW5ndGggPSBhcmc7XG4gICAgICBjb25zdCBidWZmID0gQml0QXJyYXkuX2NyZWF0ZUJ1ZmZlcihsZW5ndGgpO1xuICAgICAgaWYgKGRlZmF1bHRWYWx1ZSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmYubGVuZ3RoOyBpKyspXG4gICAgICAgICAgYnVmZltpXSA9IC0xO1xuICAgICAgfVxuICAgICAgdGhpcy5fZGF0YSA9IGJ1ZmY7XG4gICAgICB0aGlzLl9sZW5ndGggPSBsZW5ndGg7XG4gICAgfSBlbHNlIGlmIChhcmcgaW5zdGFuY2VvZiBVaW50MzJBcnJheSkge1xuICAgICAgdGhpcy5fZGF0YSA9IGFyZyBhcyBVaW50MzJBcnJheTtcbiAgICAgIHRoaXMuX2xlbmd0aCA9IGRlZmF1bHRWYWx1ZSBhcyBudW1iZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb25zdHJ1Y3RvcicpO1xuICAgIH1cbiAgfVxuXG5cbiAgZ2V0UmF3RGF0YSgpIHsgcmV0dXJuIHRoaXMuX2RhdGE7IH1cblxuICBhc3N1cmVHb2V6KG51bTogbnVtYmVyLCBhcmdOYW1lOiBTdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAobnVtIDwgMCkgdGhyb3cgbmV3IEVycm9yKGAke2FyZ05hbWV9IHNob3VsZCBiZSBncmVhdGVyIHRoYW4gemVyb2ApO1xuICB9XG5cbiAgYXNzdXJlSW5SYW5nZSh2YWx1ZTogbnVtYmVyLCBtaW46IG51bWJlciwgbWF4OiBudW1iZXIsIGFyZ05hbWU6IFN0cmluZyk6IHZvaWQge1xuICAgIGlmICgodmFsdWUgPCBtaW4pIHx8ICh2YWx1ZSA+IG1heCkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFyZ3VtZW50ICR7YXJnTmFtZX0gKCR7dmFsdWV9KSBvdXQgb2YgcmFuZ2UgKCR7bWlufSwgJHttYXh9KWApO1xuICB9XG5cbiAgY29weShzcmM6IFVpbnQzMkFycmF5LCBkc3Q6IFVpbnQzMkFycmF5LCBjb3VudDogbnVtYmVyKTogdm9pZCB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKVxuICAgICAgZHN0W2ldID0gc3JjW2ldO1xuICB9XG5cbiAgY29weUZyb20ob3RoZXI6IEJpdEFycmF5KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2xlbmd0aCAhPSBvdGhlci5fbGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBMZW5ndGhzIGRpZmZlciAoJHt0aGlzLl9sZW5ndGh9ICE9ICR7b3RoZXIuX2xlbmd0aH0pYCk7XG4gICAgdGhpcy5jb3B5KG90aGVyLl9kYXRhLCB0aGlzLl9kYXRhLCB0aGlzLmxlbmd0aEluSW50cyk7XG4gICAgdGhpcy5fdmVyc2lvbisrO1xuICB9XG5cbiAgZ2V0IGxlbmd0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbGVuZ3RoO1xuICB9XG5cbiAgZ2V0IGJ1ZmZlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgfVxuXG4gIHNldCBidWZmZXIoZGF0YTogVWludDMyQXJyYXkpIHtcbiAgICB0aGlzLl9kYXRhID0gZGF0YTtcbiAgICB0aGlzLl92ZXJzaW9uKys7XG4gIH1cblxuICBnZXQgdmVyc2lvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fdmVyc2lvbjtcbiAgfVxuXG4gIHNldCB2ZXJzaW9uKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl92ZXJzaW9uID0gdmFsdWU7XG4gIH1cblxuICBpbmNyZW1lbnRWZXJzaW9uKG5vdGlmeSA9IHRydWUpOiB2b2lkIHtcbiAgICB0aGlzLl92ZXJzaW9uKys7XG4gIH1cblxuICBnZXQgbGVuZ3RoSW5JbnRzKCkge1xuICAgIHJldHVybiBNYXRoLmZsb29yKCh0aGlzLl9sZW5ndGggKyAweDFmKSAvIDB4MjApO1xuICB9XG5cbiAgZ2V0IHZlcnNpb25lZE5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZlcnNpb24gPT0gdGhpcy5fdmVyc2lvbmVkTmFtZVZlcnNpb24gPyB0aGlzLl92ZXJzaW9uZWROYW1lIDogJyc7XG4gIH1cblxuICBzZXQgdmVyc2lvbmVkTmFtZShuYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLl92ZXJzaW9uZWROYW1lID0gbmFtZTtcbiAgICB0aGlzLl92ZXJzaW9uZWROYW1lVmVyc2lvbiA9IHRoaXMuX3ZlcnNpb247XG4gIH1cblxuICBnZXQgc2VsZigpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldExlbmd0aCh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlIDwgMClcbiAgICAgIHRocm93IG5ldyBFcnJvcignc2hvdWxkIGJlID49IDAnKTtcblxuICAgIGlmICh2YWx1ZSA9PSB0aGlzLl9sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCBuSW50c05lZWRlZCA9IE1hdGguZmxvb3IoKHZhbHVlICsgMHgxZikgLyAweDIwKTtcbiAgICBpZiAoKG5JbnRzTmVlZGVkID4gdGhpcy5fZGF0YS5sZW5ndGgpIHx8ICgobkludHNOZWVkZWQgKyB0aGlzLlNIUklOS19USFJFU0hPTEQpIDwgdGhpcy5fZGF0YS5sZW5ndGgpKSB7XG4gICAgICBjb25zdCBuZXdEYXRhID0gbmV3IFVpbnQzMkFycmF5KG5JbnRzTmVlZGVkKTtcbiAgICAgIHRoaXMuY29weSh0aGlzLl9kYXRhLCBuZXdEYXRhLCAobkludHNOZWVkZWQgPiB0aGlzLl9kYXRhLmxlbmd0aCkgPyB0aGlzLl9kYXRhLmxlbmd0aCA6IG5JbnRzTmVlZGVkKTtcbiAgICAgIHRoaXMuX2RhdGEgPSBuZXdEYXRhO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSA+IHRoaXMuX2xlbmd0aCkge1xuICAgICAgaWYgKHRoaXMuX2xlbmd0aCAlIDB4MjAgPiAwKVxuICAgICAgICB0aGlzLl9kYXRhW3RoaXMubGVuZ3RoSW5JbnRzIC0gMV0gJj0gKDEgPDwgKCh0aGlzLl9sZW5ndGggJSAweDIwKSAmIDB4MWYpKSAtIDE7XG5cbiAgICAgIHRoaXMuX2RhdGEuZmlsbCgwLCB0aGlzLmxlbmd0aEluSW50cywgbkludHNOZWVkZWQpO1xuICAgIH1cbiAgICB0aGlzLl9sZW5ndGggPSB2YWx1ZTtcbiAgICB0aGlzLl92ZXJzaW9uKys7XG4gIH1cblxuICBzdGF0aWMgZnJvbUFuZChzZXQxOiBCaXRBcnJheSwgc2V0MjogQml0QXJyYXkpOiBCaXRBcnJheSB7XG4gICAgaWYgKHNldDEuX2xlbmd0aCAhPSBzZXQyLl9sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYExlbmd0aHMgZGlmZmVyICgke3NldDEuX2xlbmd0aH0gIT0gJHtzZXQyLl9sZW5ndGh9KWApO1xuXG4gICAgY29uc3QgdGVtcCA9IG5ldyBCaXRBcnJheShzZXQxLl9sZW5ndGgpO1xuICAgIHRlbXAuX2xlbmd0aCA9IHNldDEuX2xlbmd0aDtcbiAgICB0ZW1wLl9kYXRhID0gQml0QXJyYXkuX2NyZWF0ZUJ1ZmZlcih0ZW1wLl9sZW5ndGgpO1xuICAgIHRlbXAuX3ZlcnNpb24gPSAwO1xuXG4gICAgY29uc3QgbGVuID0gc2V0MS5sZW5ndGhJbkludHM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKylcbiAgICAgIHRlbXAuX2RhdGFbaV0gPSBzZXQxLl9kYXRhW2ldICYgc2V0Mi5fZGF0YVtpXTtcblxuICAgIHJldHVybiB0ZW1wO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX2NyZWF0ZUJ1ZmZlcihsZW5ndGg6IG51bWJlcik6IFVpbnQzMkFycmF5IHtcbiAgICByZXR1cm4gbmV3IFVpbnQzMkFycmF5KE1hdGguZmxvb3IoKGxlbmd0aCArIDB4MWYpIC8gMHgyMCkpO1xuICB9XG5cbiAgc3RhdGljIGZyb21WYWx1ZXModmFsdWVzOiBBcnJheTxib29sZWFuPik6IEJpdEFycmF5IHtcbiAgICBjb25zdCB0ZW1wID0gbmV3IEJpdEFycmF5KHZhbHVlcy5sZW5ndGgpO1xuICAgIHRlbXAuX3ZlcnNpb24gPSAwO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZW1wLl9sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHZhbHVlc1tpXSlcbiAgICAgICAgdGVtcC5fZGF0YVtNYXRoLmZsb29yKGkgLyAweDIwKV0gfD0gMSA8PCAoKGkgJSAweDIwKSAmIDB4MWYpO1xuICAgIH1cbiAgICByZXR1cm4gdGVtcDtcbiAgfVxuXG4gIC8vLyBDb25zdHJ1Y3RzIGEgW0JpdFNldF0gb2YgbGVuZ3RoIFtjb3VudF0sIHdoZXJlIGlkeC10aCBiaXQgaXMgZGV0ZXJtaW5lZCBieSBhIGNhbGwgdG8gW2ZsYWddIChpZHgpLlxuICBzdGF0aWMgZnJvbVNlcShjb3VudDogbnVtYmVyLCBmbGFnOiBGdW5jdGlvbik6IEJpdEFycmF5IHtcbiAgICBjb25zdCB0ZW1wID0gbmV3IEJpdEFycmF5KGNvdW50KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyArK2kpXG4gICAgICB0ZW1wLnNldEJpdChpLCBmbGFnKGkpKTtcblxuICAgIHRlbXAuX3ZlcnNpb24gPSAwO1xuICAgIHJldHVybiB0ZW1wO1xuICB9XG5cbiAgLy8vIENvbnN0cnVjdHMgYSBbQml0U2V0XSBmcm9tIGEgc3RyaW5nIFtzXSBjb250YWluaW5nICcwJyBvciAnMScuXG4gIHN0YXRpYyBmcm9tU3RyaW5nKHM6IHN0cmluZyk6IEJpdEFycmF5IHtcbiAgICByZXR1cm4gQml0QXJyYXkuZnJvbVNlcShzLmxlbmd0aCwgKGk6IG51bWJlcikgPT4gcy5jaGFyQXQoaSkgPT0gJzEnKTtcbiAgfVxuXG4gIC8vLyBDb25zdHJ1Y3RzIGEgW0JpdFNldF0sIGJhc2VkIG9uIGxlbmd0aCBbX2xlbmd0aF0gYW5kIGJ5dGUgYXJyYXkgW19kYXRhXS5cbiAgc3RhdGljIGZyb21VaW50MzJBcnJheShfbGVuZ3RoOiBudW1iZXIsIF9kYXRhOiBVaW50MzJBcnJheSk6IEJpdEFycmF5IHtcbiAgICBjb25zdCB0ZW1wID0gbmV3IEJpdEFycmF5KF9sZW5ndGgpO1xuICAgIHRlbXAuX2RhdGEgPSBfZGF0YTtcbiAgICByZXR1cm4gdGVtcDtcbiAgfVxuXG4gIC8vLyBEZXNlcmlhbGl6ZXMgYSBbQml0U2V0XSBmcm9tIFtieXRlc10uXG4gIHN0YXRpYyBmcm9tQnl0ZXMoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBCaXRBcnJheSB7XG4gICAgY29uc3QgbGVuID0gYnl0ZXMubGVuZ3RoO1xuICAgIGNvbnN0IHRlbXAgPSBuZXcgQml0QXJyYXkobGVuICogOCk7XG4gICAgdGVtcC5fZGF0YSA9IG5ldyBVaW50MzJBcnJheShNYXRoLmZsb29yKChsZW4gKyAzKSAvIDQpKTtcbiAgICB0ZW1wLl9sZW5ndGggPSBsZW4gKiA4O1xuICAgIGxldCBudW0xID0gMDtcbiAgICBsZXQgbnVtMiA9IDA7XG5cbiAgICB3aGlsZSAoKGxlbiAtIG51bTIpID49IDQpIHtcbiAgICAgIHRlbXAuX2RhdGFbbnVtMSsrXSA9IChcbiAgICAgICAgKChieXRlc1tudW0yXSAmIDB4ZmYpIHwgKChieXRlc1tudW0yICsgMV0gJiAweGZmKSA8PCA4KSkgfFxuICAgICAgICAoKGJ5dGVzW251bTIgKyAyXSAmIDB4ZmYpIDw8IDB4MTApXG4gICAgICApIHwgKChieXRlc1tudW0yICsgM10gJiAweGZmKSA8PCAweDE4KTtcblxuICAgICAgbnVtMiArPSA0O1xuICAgIH1cblxuICAgIGlmIChsZW4gLSBudW0yID09IDMpXG4gICAgICB0ZW1wLl9kYXRhW251bTFdID0gKGJ5dGVzW251bTIgKyAyXSAmIDB4ZmYpIDw8IDB4MTA7XG5cbiAgICBpZiAobGVuIC0gbnVtMiA9PSAyKVxuICAgICAgdGVtcC5fZGF0YVtudW0xXSB8PSAoYnl0ZXNbbnVtMiArIDFdICYgMHhmZikgPDwgODtcblxuICAgIGlmIChsZW4gLSBudW0yID09IDEpXG4gICAgICB0ZW1wLl9kYXRhW251bTFdIHw9IGJ5dGVzW251bTJdICYgMHhmZjtcblxuICAgIHRlbXAuX3ZlcnNpb24gPSAwO1xuICAgIHJldHVybiB0ZW1wO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5fbGVuZ3RofSBiaXRzLCAke3RoaXMuY291bnRCaXRzKHRydWUpfSBzZXRgO1xuICB9XG5cbiAgLy8vIFBlcmZvcm1zIGRlZXAgY29tcGFyaXNvbiBvZiB0d28gYml0c2V0cy5cbiAgZXF1YWxzKG90aGVyOiBCaXRBcnJheSk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzID09IG90aGVyKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAob3RoZXIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLl9sZW5ndGggIT0gb3RoZXIuX2xlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLl9sZW5ndGggPT0gMCkgcmV0dXJuIHRydWU7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2RhdGEubGVuZ3RoIC0gMTsgaSsrKVxuICAgICAgaWYgKHRoaXMuX2RhdGFbaV0gIT0gb3RoZXIuX2RhdGFbaV0pIHJldHVybiBmYWxzZTtcblxuICAgIGZvciAobGV0IGkgPSAodGhpcy5fZGF0YS5sZW5ndGggLSAxKSAqIDg7IGkgPCB0aGlzLl9sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuZ2V0Qml0KGkpICE9IG90aGVyLmdldEJpdChpKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBDbG9uZXMgYSBiaXRzZXQuICovXG4gIGNsb25lKCk6IEJpdEFycmF5IHtcbiAgICBjb25zdCBiaXRBcnJheSA9IG5ldyBCaXRBcnJheSgwLCBmYWxzZSk7XG4gICAgYml0QXJyYXkuX2RhdGEgPSBVaW50MzJBcnJheS5mcm9tKHRoaXMuX2RhdGEpOyAvLyBlZmZlY3RpdmUgbGVuZ3RoOiAobGVuZ3RoSW5JbnRzKVxuICAgIGJpdEFycmF5Ll9sZW5ndGggPSB0aGlzLl9sZW5ndGg7XG4gICAgYml0QXJyYXkuX3ZlcnNpb24gPSB0aGlzLl92ZXJzaW9uO1xuICAgIHJldHVybiBiaXRBcnJheTtcbiAgfVxuXG4gIC8qKiBJbml0aWFsaXplcyBhIGJpdHNldC4gKi9cbiAgaW5pdChmbGFnOiBGdW5jdGlvbiwgbm90aWZ5OiBib29sZWFuKTogQml0QXJyYXkge1xuICAgIHRoaXMuc2V0QWxsKGZhbHNlLCBmYWxzZSk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2xlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoZmxhZyhpKSlcbiAgICAgICAgdGhpcy5fZGF0YVtNYXRoLmZsb29yKGkgLyAweDIwKV0gfD0gMSA8PCAoKGkgJSAweDIwKSAmIDB4MWYpO1xuICAgIH1cblxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8vIEludmVydHMgYSBiaXRzZXQuXG4gIGludmVydChub3RpZnkgPSB0cnVlKTogdm9pZCB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9kYXRhLmxlbmd0aDsgaSsrKVxuICAgICAgdGhpcy5fZGF0YVtpXSBePSAtMTtcblxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xuICB9XG5cbiAgLy8vIFNldHMgYWxsIGJpdHMgdG8gW3ZhbHVlXSwgb3B0aW9uYWxseSBzdXBwcmVzc2luZyBub3RpZmljYXRpb25zLlxuICBzZXRBbGwodmFsdWU6IGJvb2xlYW4sIG5vdGlmeSA9IGZhbHNlKTogdm9pZCB7XG4gICAgY29uc3QgZmxhZ3MgPSB2YWx1ZSA/IC0xIDogMDtcbiAgICBjb25zdCBsZW4gPSB0aGlzLmxlbmd0aEluSW50cztcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIC8vdG9kbzogb3B0aW1pemVcbiAgICAgIHRoaXMuX2RhdGFbaV0gPSBmbGFncztcblxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xuICB9XG5cbiAgLy8vIFNldHMgYml0cyBhdCBbaW5kZXhlc10gcG9zaXRpb24gdG8gW3ZhbHVlXS5cbiAgLy8vIENsZWFycyB0aGUgYml0c2V0IGlmIFtjbGVhcl0gZmxhZyBpcyB0cnVlLlxuICAvLy8gQ2hhbmdlIG5vdGlmaWNhdGlvbiBpcyByYWlzZWQgd2hlbiBbbm90aWZ5XSBpcyB0cnVlLlxuICBzZXRJbmRleGVzKGluZGV4ZXM6IEFycmF5PG51bWJlcj4sIHZhbHVlID0gdHJ1ZSwgY2xlYXIgPSB0cnVlLCBub3RpZnkgPSB0cnVlKTogdm9pZCB7XG4gICAgaWYgKGNsZWFyKVxuICAgICAgdGhpcy5zZXRBbGwoIXZhbHVlLCBmYWxzZSk7XG5cbiAgICBmb3IgKGNvbnN0IGkgb2YgaW5kZXhlcylcbiAgICAgIHRoaXMuc2V0RmFzdChpLCB2YWx1ZSk7XG5cbiAgICB0aGlzLmluY3JlbWVudFZlcnNpb24obm90aWZ5KTtcbiAgfVxuXG4gIGV2ZXJ5SW5kZXgoaW5kZXhlczogQXJyYXk8bnVtYmVyPiwgdmFsdWUgPSB0cnVlKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBpbmRleCBvZiBpbmRleGVzKSB7XG4gICAgICBpZiAodGhpcy5nZXRCaXQoaW5kZXgpICE9IHZhbHVlKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgYW55SW5kZXgoaW5kZXhlczogQXJyYXk8bnVtYmVyPiwgdmFsdWUgPSB0cnVlKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBpbmRleCBvZiBpbmRleGVzKSB7XG4gICAgICBpZiAodGhpcy5nZXRCaXQoaW5kZXgpID09IHZhbHVlKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgc2V0V2hlcmUoY2hlY2s6IEZ1bmN0aW9uLCB2YWx1ZSA9IHRydWUsIGNsZWFyID0gdHJ1ZSwgbm90aWZ5ID0gdHJ1ZSwgYWxsb3dDbGVhciA9IHRydWUpOiB2b2lkIHtcbiAgICBpZiAoY2xlYXIgJiYgYWxsb3dDbGVhcilcbiAgICAgIHRoaXMuc2V0QWxsKCF2YWx1ZSwgZmFsc2UpO1xuXG4gICAgaWYgKGFsbG93Q2xlYXIpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGNoZWNrKGkpKVxuICAgICAgICAgIHRoaXMuc2V0RmFzdChpLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fbGVuZ3RoOyBpKyspXG4gICAgICAgIHRoaXMuc2V0RmFzdChpLCBjaGVjayhpKSA/IHZhbHVlIDogIXZhbHVlKTtcbiAgICB9XG5cbiAgICB0aGlzLmluY3JlbWVudFZlcnNpb24obm90aWZ5KTtcbiAgfVxuXG4gIGdldFJhbmdlKGZyb206IG51bWJlciwgdG86IG51bWJlcik6IEJpdEFycmF5IHtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UoZnJvbSwgMCwgdGhpcy5fbGVuZ3RoIC0gMSwgJ2Zyb20nKTtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UodG8sIDAsIHRoaXMuX2xlbmd0aCwgJ3RvJyk7XG4gICAgY29uc3QgYXJyOiBBcnJheTxib29sZWFuPiA9IFtdO1xuICAgIGZvciAobGV0IGkgPSBmcm9tOyBpIDwgdG87ICsraSlcbiAgICAgIGFyci5wdXNoKHRoaXMuZ2V0Qml0KGkpKTtcbiAgICByZXR1cm4gQml0QXJyYXkuZnJvbVZhbHVlcyhhcnIpO1xuICB9XG5cbiAgZ2V0UmFuZ2VBc0xpc3QoZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyKTogYm9vbGVhbltdIHtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UoZnJvbSwgMCwgdGhpcy5fbGVuZ3RoIC0gMSwgJ2Zyb20nKTtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UodG8sIDAsIHRoaXMuX2xlbmd0aCwgJ3RvJyk7XG4gICAgY29uc3QgYXJyOiBib29sZWFuW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gZnJvbTsgaSA8IHRvOyArK2kpXG4gICAgICBhcnIucHVzaCh0aGlzLmdldEJpdChpKSk7XG4gICAgcmV0dXJuIGFycjtcbiAgfVxuXG5cbiAgc2V0UmFuZ2UoZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyLCB2YWx1ZTogYm9vbGVhbiwgbm90aWZ5ID0gdHJ1ZSk6IEJpdEFycmF5IHtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UoZnJvbSwgMCwgdGhpcy5fbGVuZ3RoIC0gMSwgJ2Zyb20nKTtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UodG8sIDAsIHRoaXMuX2xlbmd0aCAtIDEsICd0bycpO1xuXG4gICAgY29uc3Qgc3RhcnQgPSBNYXRoLm1pbihmcm9tLCB0byk7XG4gICAgY29uc3QgZW5kID0gTWF0aC5tYXgoZnJvbSwgdG8pO1xuXG4gICAgLy90b2RvOiBvcHRpbWl6ZVxuICAgIGlmICh2YWx1ZSkge1xuICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSsrKVxuICAgICAgICB0aGlzLnNldFRydWUoaSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKylcbiAgICAgICAgdGhpcy5zZXRGYWxzZShpKTtcbiAgICB9XG5cbiAgICB0aGlzLmluY3JlbWVudFZlcnNpb24obm90aWZ5KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vLyBTZXRzIG4gcmFuZG9tbHkgY2hvc2VuIGJpdHMgdG8gdmFsdWUsIHJlbWFpbmluZyBiaXRzIHRvICF2YWx1ZS5cbiAgc2V0UmFuZG9tKG46IG51bWJlciwgdmFsdWU6IGJvb2xlYW4sIG5vdGlmeSA9IHRydWUpOiB2b2lkIHtcbiAgICBpZiAobiA8IDAgfHwgbiA+IHRoaXMuX2xlbmd0aClcbiAgICAgIHRocm93IG5ldyBFcnJvcignbiBtdXN0IGJlID49IDAgJiYgPD0gQ291bnQnKTtcblxuICAgIGlmIChuID4gdGhpcy5fbGVuZ3RoIC8gMilcbiAgICAgIHRoaXMuc2V0UmFuZG9tKHRoaXMuX2xlbmd0aCAtIG4sICF2YWx1ZSk7XG5cbiAgICB0aGlzLnNldEFsbCghdmFsdWUpO1xuXG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCBuOykge1xuICAgICAgY29uc3QgaSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHRoaXMuX2xlbmd0aCk7XG4gICAgICBpZiAodGhpcy5nZXRCaXQoaSkgPT0gdmFsdWUpIGNvbnRpbnVlO1xuICAgICAgdGhpcy5zZXRGYXN0KGksIHZhbHVlKTtcbiAgICAgIGsrKztcbiAgICB9XG5cbiAgICB0aGlzLmluY3JlbWVudFZlcnNpb24obm90aWZ5KTtcbiAgfVxuXG4gIC8vLyBNb2RpZmllcyBjdXJyZW50IGJpdHNldCBieSBwZXJmb3JtaW5nIHRoZSBiaXR3aXNlIEFORCBvcGVyYXRpb24gYWdhaW5zdCB0aGVcbiAgLy8vIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBiaXRzZXQuXG4gIGFuZCh2YWx1ZTogQml0QXJyYXksIG5vdGlmeSA9IHRydWUpOiBCaXRBcnJheSB7XG4gICAgaWYgKHRoaXMuX2xlbmd0aCAhPSB2YWx1ZS5fbGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcnJheSBsZW5ndGhzIGRpZmZlci4nKTtcblxuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLmxlbmd0aEluSW50czsgaSA8IGxlbjsgaSsrKVxuICAgICAgdGhpcy5fZGF0YVtpXSAmPSB2YWx1ZS5fZGF0YVtpXTtcblxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8vIFBlcmZvcm1zIHRoZSBiaXR3aXNlIEFORCBOT1Qgb3BlcmF0aW9uIG9uIHRoZSBlbGVtZW50cyBpbiB0aGUgY3VycmVudCBiaXRzZXRcbiAgLy8vIGFnYWluc3QgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBiaXRzZXQuXG4gIGFuZE5vdCh2YWx1ZTogQml0QXJyYXksIG5vdGlmeSA9IHRydWUpOiBCaXRBcnJheSB7XG4gICAgaWYgKHRoaXMuX2xlbmd0aCAhPSB2YWx1ZS5fbGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcnJheSBsZW5ndGhzIGRpZmZlci4nKTtcblxuICAgIGNvbnN0IGxlbiA9IHRoaXMubGVuZ3RoSW5JbnRzO1xuICAgIGZvciAobGV0IG51bTIgPSAwOyBudW0yIDwgbGVuOyBudW0yKyspXG4gICAgICB0aGlzLl9kYXRhW251bTJdICY9IH52YWx1ZS5fZGF0YVtudW0yXTtcblxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8vIFBlcmZvcm1zIHRoZSBiaXR3aXNlIE5PVCBBTkQgb3BlcmF0aW9uIG9uIHRoZSBlbGVtZW50cyBpbiB0aGUgY3VycmVudCBiaXRzZXRcbiAgLy8vIGFnYWluc3QgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBiaXRzZXQuXG4gIG5vdEFuZCh2YWx1ZTogQml0QXJyYXksIG5vdGlmeSA9IHRydWUpOiBCaXRBcnJheSB7XG4gICAgaWYgKHRoaXMuX2xlbmd0aCAhPSB2YWx1ZS5fbGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcnJheSBsZW5ndGhzIGRpZmZlci4nKTtcblxuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLmxlbmd0aEluSW50czsgaSA8IGxlbjsgaSsrKVxuICAgICAgdGhpcy5fZGF0YVtpXSA9ICh+dGhpcy5fZGF0YVtpXSkgJiB2YWx1ZS5fZGF0YVtpXTtcblxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8vIEludmVydHMgYWxsIGJpdCB2YWx1ZXMgaW4gdGhlIGN1cnJlbnQgYml0c2V0XG4gIG5vdChub3RpZnkgPSB0cnVlKTogQml0QXJyYXkge1xuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLmxlbmd0aEluSW50czsgaSA8IGxlbjsgaSsrKVxuICAgICAgdGhpcy5fZGF0YVtpXSA9IH50aGlzLl9kYXRhW2ldO1xuXG4gICAgdGhpcy5pbmNyZW1lbnRWZXJzaW9uKG5vdGlmeSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLy8gUGVyZm9ybXMgdGhlIGJpdHdpc2UgT1Igb3BlcmF0aW9uIG9uIHRoZSBlbGVtZW50cyBpbiB0aGUgY3VycmVudCBiaXRzZXRcbiAgLy8vIGFnYWluc3QgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBiaXRzZXQuXG4gIG9yKHZhbHVlOiBCaXRBcnJheSwgbm90aWZ5ID0gdHJ1ZSkge1xuICAgIGlmICh0aGlzLl9sZW5ndGggIT0gdmFsdWUuX2xlbmd0aClcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXJyYXkgbGVuZ3RocyBkaWZmZXIuJyk7XG5cbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gdGhpcy5sZW5ndGhJbkludHM7IGkgPCBsZW47IGkrKylcbiAgICAgIHRoaXMuX2RhdGFbaV0gfD0gdmFsdWUuX2RhdGFbaV07XG5cbiAgICB0aGlzLmluY3JlbWVudFZlcnNpb24obm90aWZ5KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vLyBQZXJmb3JtcyB0aGUgYml0d2lzZSBleGNsdXNpdmUgT1Igb3BlcmF0aW9uIG9uIHRoZSBlbGVtZW50cyBpbiB0aGUgY3VycmVudCBiaXRzZXRcbiAgLy8vIGFnYWluc3QgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBiaXRzZXQuXG4gIHhvcih2YWx1ZTogQml0QXJyYXksIG5vdGlmeSA9IHRydWUpIHtcbiAgICBpZiAodGhpcy5fbGVuZ3RoICE9IHZhbHVlLl9sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FycmF5IGxlbmd0aHMgZGlmZmVyLicpO1xuXG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHRoaXMubGVuZ3RoSW5JbnRzOyBpIDwgbGVuOyBpKyspXG4gICAgICB0aGlzLl9kYXRhW2ldIF49IHZhbHVlLl9kYXRhW2ldO1xuXG4gICAgdGhpcy5pbmNyZW1lbnRWZXJzaW9uKG5vdGlmeSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLy8gSW5zZXJ0cyBuIDAtYml0cyBhdCBwb3NpdGlvbiBwb3MsIHJlc2l6aW5nIHNlbGYgYW5kIHNoaWZ0aW5nIGJpdHMgYXBwcm9wcmlhdGVseS5cbiAgaW5zZXJ0QXQocG9zOiBudW1iZXIsIG46IG51bWJlciwgZmxhZyA9IGZhbHNlKTogdm9pZCB7XG4gICAgdGhpcy5hc3N1cmVJblJhbmdlKHBvcywgMCwgdGhpcy5fbGVuZ3RoLCAncG9zJyk7XG5cbiAgICBpZiAobiA9PSAwKSByZXR1cm47XG5cbiAgICAvL1RPRE86IG9wdGltaXplXG4gICAgLy90aGUgbW9zdCBwcmltaXRpdmUgaW1wbGVtZW50YXRpb24sIG9wdGltaXplIGl0IGxhdGVyIVxuXG4gICAgLy8gYmVnaW5VcGRhdGUoKTtcbiAgICBjb25zdCBvbGRsZW5ndGggPSB0aGlzLl9sZW5ndGg7XG4gICAgdGhpcy5zZXRMZW5ndGgodGhpcy5fbGVuZ3RoICsgbik7XG5cbiAgICAvL2lmICghY29udGFpbnMoIWZsYWcpKSByZXR1cm47IC8vIG5vdGhpbmcgdG8gZG9cblxuICAgIGZvciAobGV0IGkgPSBvbGRsZW5ndGggLSAxOyBpID49IHBvczsgaS0tKVxuICAgICAgdGhpcy5zZXRCaXQoaSArIG4sIHRoaXMuZ2V0Qml0KGkpKTtcblxuICAgIGZvciAobGV0IGkgPSBwb3M7IGkgPCBwb3MgKyBuOyBpKyspXG4gICAgICB0aGlzLnNldEJpdChpLCBmbGFnKTtcblxuICAgIC8vIGVuZFVwZGF0ZSgpO1xuICB9XG5cbiAgLy8vIERlbGV0ZXMgbiBiaXRzIGJlZ2lubmluZyBhdCBwb3NpdGlvbiBwb3MsIHJlc2l6aW5nIHNlbGYgYW5kIHNoaWZ0aW5nIHJlbWFpbmluZ1xuICAvLy8gYml0cyBhcHByb3ByaWF0ZWx5LlxuICByZW1vdmVBdChwb3M6IG51bWJlciwgbiA9IDEpOiB2b2lkIHtcbiAgICAvLyB0aGUgbW9zdCBwcmltaXRpdmUgaW1wbGVtZW50YXRpb24sIG9wdGltaXplIGl0IGxhdGVyIVxuICAgIGlmIChuIDwgMClcbiAgICAgIHRocm93IG5ldyBFcnJvcignbiBjYW5ub3QgYmUgbmVnYXRpdmUnKTtcblxuICAgIHRoaXMuYXNzdXJlSW5SYW5nZShwb3MsIDAsIHRoaXMuX2xlbmd0aCAtIG4sICdwb3MnKTtcblxuICAgIGlmICh0aGlzLmNvbnRhaW5zKHRydWUpKSB7XG4gICAgICBmb3IgKGxldCBpID0gcG9zOyBpIDwgdGhpcy5fbGVuZ3RoIC0gbjsgaSsrKVxuICAgICAgICB0aGlzLnNldEJpdChpLCB0aGlzLmdldEJpdChpICsgbikpO1xuICAgIH1cblxuICAgIHRoaXMuc2V0TGVuZ3RoKHRoaXMuX2xlbmd0aCAtIG4pO1xuICB9XG5cbiAgcmVtb3ZlQnlNYXNrKG1hc2s6IEJpdEFycmF5LCBmbGFnID0gdHJ1ZSk6IEJpdEFycmF5IHtcbiAgICBpZiAodGhpcy5fbGVuZ3RoICE9IG1hc2subGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdsZW5ndGggIT0gbWFzay5sZW5ndGgnKTtcblxuICAgIGlmIChtYXNrID09IHRoaXMpIHsgLy8gbm8gbmVlZCB0byBpdGVyYXRlXG4gICAgICB0aGlzLnNldExlbmd0aChtYXNrLmNvdW50Qml0cyghZmxhZykpO1xuICAgICAgdGhpcy5zZXRBbGwoIWZsYWcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgZHN0SWR4ID0gMDtcblxuICAgICAgZm9yIChsZXQgc3JjSWR4ID0gLTE7IChzcmNJZHggPSBtYXNrLmZpbmROZXh0KHNyY0lkeCwgIWZsYWcpKSAhPSAtMTspXG4gICAgICAgIHRoaXMuc2V0RmFzdChkc3RJZHgrKywgdGhpcy5nZXRCaXQoc3JjSWR4KSk7XG5cbiAgICAgIHRoaXMuX2xlbmd0aCA9IGRzdElkeDtcbiAgICAgIHRoaXMuX3ZlcnNpb24rKztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vLyBTaW1pbGFyIHRvIHRoZSBbXSBvcGVyYXRvci5cbiAgZ2V0Qml0KHBvczogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLl9kYXRhW01hdGguZmxvb3IocG9zIC8gMHgyMCldICYgKDEgPDwgKHBvcyAmIDB4MWYpKSkgIT0gMDtcbiAgfVxuXG4gIC8vLyBTaW1pbGFyIHRvIHRoZSBbXSBvcGVyYXRvci5cbiAgc2V0Qml0KHBvczogbnVtYmVyLCBiaXQ6IGJvb2xlYW4sIG5vdGlmeSA9IHRydWUpIHtcbiAgICB0aGlzLnNldEZhc3QocG9zLCBiaXQpO1xuICAgIGlmIChub3RpZnkpXG4gICAgICB0aGlzLl92ZXJzaW9uKys7XG4gICAgZWxzZVxuICAgICAgdGhpcy5fdmVyc2lvbisrO1xuICB9XG5cbiAgLy8vIFNldHMgW2ldLXRoIGJpdCB0byBbdmFsdWVdLCBkb2VzIG5vdCBjaGVjayBib3VuZHMsIGRvZXMgbm90IGluY3JlbWVudCB2ZXJzaW9uXG4gIHNldEZhc3QoaTogbnVtYmVyLCB2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh2YWx1ZSlcbiAgICAgIHRoaXMuX2RhdGFbTWF0aC5mbG9vcihpIC8gMHgyMCldIHw9IDEgPDwgKGkgJiAweDFmKTtcbiAgICBlbHNlXG4gICAgICB0aGlzLl9kYXRhW01hdGguZmxvb3IoaSAvIDB4MjApXSAmPSB+KDEgPDwgKGkgJiAweDFmKSk7XG4gIH1cblxuICBzZXRUcnVlKHBvczogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fZGF0YVtNYXRoLmZsb29yKHBvcyAvIDB4MjApXSB8PSAxIDw8IChwb3MgJiAweDFmKTtcbiAgfVxuXG4gIHNldEZhbHNlKHBvczogbnVtYmVyKSB7XG4gICAgdGhpcy5fZGF0YVtNYXRoLmZsb29yKHBvcyAvIDB4MjApXSAmPSB+KDEgPDwgKHBvcyAmIDB4MWYpKTtcbiAgfVxuXG4gIHRydWVDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNvdW50Qml0cyh0cnVlKTtcbiAgfVxuXG4gIGZhbHNlQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jb3VudEJpdHMoZmFsc2UpO1xuICB9XG5cbiAgLy8vIENvdW50cyBiaXRzIG9mIHRoZSBzcGVjaWZpZWQgdmFsdWUuXG4gIGNvdW50Qml0cyh2YWx1ZTogYm9vbGVhbik6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuX2xlbmd0aCA9PSAwKSByZXR1cm4gMDtcblxuICAgIGlmICh0aGlzLl9zZWxlY3RlZENvdW50VmVyc2lvbiAhPSB0aGlzLl92ZXJzaW9uKSB7XG4gICAgICB0aGlzLl9zZWxlY3RlZENvdW50ID0gMDtcbiAgICAgIGNvbnN0IGxlbiA9IHRoaXMubGVuZ3RoSW5JbnRzO1xuICAgICAgbGV0IGkgPSAwO1xuICAgICAgZm9yICg7IGkgPCBsZW4gLSAxOyBpKyspIHtcbiAgICAgICAgZm9yIChsZXQgayA9IHRoaXMuX2RhdGFbaV07IGsgIT0gMDsgayA+Pj49IDgpIHsgLy90b2RvOiBjYXN0IGRhdGFbaV0gdG8gdWludFxuICAgICAgICAgIHRoaXMuX3NlbGVjdGVkQ291bnQgKz0gQml0QXJyYXkuX29uQml0Q291bnRbayAmIDB4ZmZdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBsYXN0IGludC5cbiAgICAgIGxldCBrID0gdGhpcy5fZGF0YVtpXTtcbiAgICAgIGNvbnN0IHJlbWFpbmluZ0JpdHMgPSB0aGlzLl9sZW5ndGggJiAweDFmO1xuICAgICAgaWYgKHJlbWFpbmluZ0JpdHMgIT0gMCkgLyogaWYgcmVtYWluaW5nQml0cyA9PSAwLCB0aGUgbGFzdCBpbnQgaXMgZnVsbHkgdXNlZCBhbmQgQUxMIGJpdHMgc2hvdWxkIGJlIGxlZnQgYXMgaXMgKi9cbiAgICAgICAgayAmPSB+KCg0Mjk0OTY3Mjk1KSA8PCByZW1haW5pbmdCaXRzKTtcblxuICAgICAgZm9yICg7IGsgIT0gMDsgayA+Pj49IDgpXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkQ291bnQgKz0gQml0QXJyYXkuX29uQml0Q291bnRbayAmIDB4ZmZdO1xuXG4gICAgICB0aGlzLl9zZWxlY3RlZENvdW50VmVyc2lvbiA9IHRoaXMuX3ZlcnNpb247XG4gICAgfVxuXG4gICAgcmV0dXJuICh2YWx1ZSA/IHRoaXMuX3NlbGVjdGVkQ291bnQgOiB0aGlzLl9sZW5ndGggLSB0aGlzLl9zZWxlY3RlZENvdW50KTtcbiAgfVxuXG4gIC8vLyBSZXR1cm5zIGEgbnVtYmVyIG9mIHNldCBiaXRzIHdoZXJlIGFsc28gW2NoZWNrXSBpcyB0cnVlXG4gIGNvdW50V2hlcmUoY2hlY2s6IEZ1bmN0aW9uKTogbnVtYmVyIHtcbiAgICBsZXQgcmVzdWx0ID0gMDtcbiAgICBpZiAodGhpcy50cnVlQ291bnQoKSA9PSB0aGlzLl9sZW5ndGgpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fbGVuZ3RoOyBpKyspXG4gICAgICAgIHJlc3VsdCArPSBjaGVjayhpKSA/IDEgOiAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBpID0gLTE7IChpID0gdGhpcy5maW5kTmV4dChpLCB0cnVlKSkgIT0gLTE7KVxuICAgICAgICByZXN1bHQgKz0gY2hlY2soaSkgPyAxIDogMDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vLyBQZXJmb3JtcyBiaXQgXCJhbmRcIiBhbmQgY291bnRzIGJpdHMgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZSwgd2l0aG91dCBiaXRzZXQgbW9kaWZpY2F0aW9uLlxuICBhbmRXaXRoQ291bnRCaXRzKHNlY29uZDogQml0QXJyYXksIHZhbHVlOiBib29sZWFuKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5fbGVuZ3RoID09IDApIHJldHVybiAwO1xuXG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICBjb25zdCBsZW4gPSB0aGlzLmxlbmd0aEluSW50cztcbiAgICBsZXQgaSA9IDA7XG4gICAgZm9yICg7IGkgPCBsZW4gLSAxOyBpKyspIHtcbiAgICAgIGZvciAobGV0IGsgPSB0aGlzLl9kYXRhW2ldICYgc2Vjb25kLl9kYXRhW2ldOyBrICE9IDA7IGsgPj4+PSA4KVxuICAgICAgICBjb3VudCArPSBCaXRBcnJheS5fb25CaXRDb3VudFtrICYgMHhmZl07XG4gICAgfVxuXG4gICAgLy8gVGhlIGxhc3QgaW50LlxuICAgIGxldCBrID0gdGhpcy5fZGF0YVtpXSAmIHNlY29uZC5fZGF0YVtpXTtcbiAgICBjb25zdCByZW1haW5pbmdCaXRzID0gdGhpcy5fbGVuZ3RoICYgMHgxZjtcbiAgICBpZiAocmVtYWluaW5nQml0cyAhPSAwKVxuICAgICAgayAmPSB+KCg0Mjk0OTY3Mjk1KSA8PCByZW1haW5pbmdCaXRzKTtcbiAgICBmb3IgKDsgayAhPSAwOyBrID4+Pj0gOClcbiAgICAgIGNvdW50ICs9IEJpdEFycmF5Ll9vbkJpdENvdW50W2sgJiAweGZmXTtcblxuICAgIHJldHVybiAodmFsdWUgPyBjb3VudCA6IHRoaXMuX2xlbmd0aCAtIGNvdW50KTtcbiAgfVxuXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0TGVuZ3RoKDApO1xuICB9XG5cbiAgY29udGFpbnModmFsdWU6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5maW5kTmV4dCgtMSwgdmFsdWUpID49IDA7XG4gIH1cblxuICBnZXQgYWxsVHJ1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jb3VudEJpdHModHJ1ZSkgPT0gdGhpcy5fbGVuZ3RoO1xuICB9XG5cbiAgZ2V0IGFsbEZhbHNlKCkge1xuICAgIHJldHVybiB0aGlzLmNvdW50Qml0cyhmYWxzZSkgPT0gdGhpcy5fbGVuZ3RoO1xuICB9XG5cbiAgZ2V0IGFueVRydWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuY291bnRCaXRzKHRydWUpID4gMDtcbiAgfVxuXG4gIGdldCBhbnlGYWxzZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jb3VudEJpdHMoZmFsc2UpID4gMDtcbiAgfVxuXG4gIC8vLyBSZXR1cm5zIHRoZSBwb3NpdGlvbiBvZiB0aGUgbmV4dCBiaXQgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZSwgc3RhcnRpbmcgZnJvbSB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLlxuICAvLy8gUmV0dXJucyAtMSwgaWYgdGhlcmUgYXJlIG5vIHN1Y2ggYml0cy5cbiAgZmluZE5leHQoaW5kZXg6IG51bWJlciwgdmFsdWUgPSB0cnVlKTogbnVtYmVyIHtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UoaW5kZXgsIC0xLCB0aGlzLl9sZW5ndGgsICdpbmRleCcpO1xuXG4gICAgaWYgKGluZGV4ID49IHRoaXMuX2xlbmd0aCAtIDEpIHJldHVybiAtMTtcbiAgICBpbmRleCA9IGluZGV4IDwgMCA/IDAgOiBpbmRleCArIDE7IC8vIHNraXAgc3RhcnRcbiAgICBsZXQgdW51c2VkQml0cyA9IGluZGV4ICYgMHgxZjtcbiAgICBjb25zdCBudW1JbnRzID0gdGhpcy5sZW5ndGhJbkludHM7XG5cbiAgICBmb3IgKGxldCBpID0gTWF0aC5mbG9vcihpbmRleCAvIDMyKTsgaSA8IG51bUludHM7IGkrKykge1xuICAgICAgbGV0IGsgPSAodmFsdWUgPyB0aGlzLl9kYXRhW2ldIDogfnRoaXMuX2RhdGFbaV0pOyAvLyB1aW50IGNhc3RcbiAgICAgIGlmICh1bnVzZWRCaXRzICE9IDApIHtcbiAgICAgICAgayAmPSAoKDB4ZmZmZmZmZmYgPDwgdW51c2VkQml0cykgJiAweGZmZmZmZmZmKTtcbiAgICAgICAgdW51c2VkQml0cyA9IDA7XG4gICAgICB9IGVsc2UgaWYgKCF2YWx1ZSAmJiBrID09IC00Mjk0OTY3Mjk2KSAvKiBsb29raW5nIGZvciBmYWxzZSwgYWxsIGJpdHMgYXJlIHNldCAqL3tcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGZvciAobGV0IGogPSAwOyBrICE9IDA7IGogKz0gOCwgayA+Pj49IDgpIHtcbiAgICAgICAgY29uc3QgcCA9IEJpdEFycmF5Ll9maXJzdE9uQml0W2sgJiAweGZmXTtcbiAgICAgICAgaWYgKHAgPj0gMCkge1xuICAgICAgICAgIGluZGV4ID0gcCArIChpICogMzIpICsgajtcbiAgICAgICAgICBpZiAoaW5kZXggPj0gdGhpcy5fbGVuZ3RoKSByZXR1cm4gLTE7XG4gICAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8vLyBGaW5kcyBwcmV2aW91cyBiaXQgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZSBpbiB0aGUgYml0c2V0LlxuICBmaW5kUHJldihpbmRleDogbnVtYmVyLCB2YWx1ZSA9IHRydWUpOiBudW1iZXIge1xuICAgIGlmIChpbmRleCA9PSAwKSByZXR1cm4gLTE7XG4gICAgdGhpcy5hc3N1cmVJblJhbmdlKGluZGV4LCAtMSwgdGhpcy5fbGVuZ3RoLCAnaW5kZXgnKTtcblxuICAgIGluZGV4ID0gaW5kZXggPCAwID8gdGhpcy5fbGVuZ3RoIC0gMSA6IGluZGV4IC0gMTsgLy8gc2tpcCBzdGFydFxuXG4gICAgY29uc3QgbGFzdEludElkeCA9IE1hdGguZmxvb3IoaW5kZXggLyAweDIwKTtcbiAgICBsZXQgcmVtYWluaW5nQml0cyA9IChpbmRleCArIDEpICYgMHgxZjtcblxuICAgIGZvciAobGV0IGkgPSBsYXN0SW50SWR4OyBpID49IDA7IGktLSkge1xuICAgICAgbGV0IGsgPSAodmFsdWUgPyB0aGlzLl9kYXRhW2ldIDogfnRoaXMuX2RhdGFbaV0pOyAvLyBjYXN0XG4gICAgICBpZiAocmVtYWluaW5nQml0cyAhPSAwKSB7XG4gICAgICAgIGsgJj0gfigoNDI5NDk2NzI5NSkgPDwgcmVtYWluaW5nQml0cyk7XG4gICAgICAgIHJlbWFpbmluZ0JpdHMgPSAwO1xuICAgICAgfVxuICAgICAgZm9yIChsZXQgaiA9IDI0OyBrICE9IDA7IGogLT0gOCwgayA8PD0gOCkge1xuICAgICAgICBjb25zdCBwID0gQml0QXJyYXkuX2xhc3RPbkJpdFtrID4+PiAweDE4XTtcbiAgICAgICAgaWYgKHAgPj0gMClcbiAgICAgICAgICByZXR1cm4gcCArIChpICogMzIpICsgajtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG59XG4iXX0=","/* eslint-disable max-len */\nimport * as umj from 'umap-js';\nimport { TSNE } from '@keckelt/tsne';\nimport { Vector, } from '@datagrok-libraries/utils/src/type-declarations';\nimport { transposeMatrix, assert, } from '@datagrok-libraries/utils/src/vector-operations';\nimport { SPEBase, PSPEBase, OriginalSPE } from './spe';\nimport { Measure, AvailableMetrics, isBitArrayMetric } from './typed-metrics/typed-metrics';\nimport BitArray from '@datagrok-libraries/utils/src/bit-array';\nimport { DistanceMatrix, DistanceMatrixService, distanceMatrixProxy, dmLinearIndex } from './distance-matrix';\nexport var DimReductionMethods;\n(function (DimReductionMethods) {\n DimReductionMethods[\"UMAP\"] = \"UMAP\";\n DimReductionMethods[\"T_SNE\"] = \"t-SNE\";\n})(DimReductionMethods || (DimReductionMethods = {}));\n/** Umap uses precalculated distance matrix to save time. though for too much data, memory becomes constraint.\n * if we have 100 000 rows, distance matrix will take ~10gb of memory and probably overflow.\n */\nexport const MAX_DISTANCE_MATRIX_ROWS = 20000;\nexport class UMAPOptions {\n constructor() {\n this.learningRate = { uiName: 'Learinig rate', value: 1, tooltip: 'The initial learning rate for the embedding optimization' };\n this.nComponents = { uiName: 'Components', value: 2, tooltip: 'The number of components (dimensions) to project the data to' };\n this.nEpochs = { uiName: 'Epochs', value: 0, tooltip: 'The number of epochs to optimize embeddings via SGD. Computed automatically if set to 0' };\n this.nNeighbors = { uiName: 'Neighbors', value: 15, tooltip: 'The number of nearest neighbors to construct the fuzzy manifold' };\n this.spread = { uiName: 'Spread', value: 1, tooltip: 'The effective scale of embedded points, used with min distance to control the clumped/dispersed nature of the embedding' };\n this.minDist = { uiName: 'Min distance', value: 0.1, tooltip: 'The effective minimum distance between embedded points, used with spread to control the clumped/dispersed nature of the embedding' };\n }\n ;\n}\nexport class TSNEOptions {\n constructor() {\n this.epsilon = { uiName: 'Epsilon', value: 10, tooltip: 'Epsilon is learning rate' };\n this.perplexity = { uiName: 'Perplexity', value: 30, tooltip: 'Roughly how many neighbors each point influences' };\n this.dim = { uiName: 'Dimensionality', value: 2, tooltip: 'Dimensionality of the embedding' };\n }\n ;\n}\n/** Abstract dimensionality reducer */\nclass Reducer {\n constructor(options) {\n this.data = options.data;\n }\n}\n/** t-SNE dimensionality reduction. */\nclass TSNEReducer extends Reducer {\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 this.reducer = new TSNE(options);\n this.iterations = options?.iterations ?? 100;\n this.distanceFname = options.distanceFname;\n this.distanceFn = options.distanceFn;\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(parallelDistanceWorkers) {\n const distance = parallelDistanceWorkers ? await (async () => {\n const matrixService = new DistanceMatrixService(true, false);\n try {\n const dist = await matrixService.calc(this.data, this.distanceFname);\n matrixService.terminate();\n return dist;\n }\n catch (e) {\n matrixService.terminate();\n throw e;\n }\n })() :\n (() => { const ret = DistanceMatrix.calc(this.data, (a, b) => this.distanceFn(a, b)); ret.normalize(); return ret.data; })();\n const matrixProxy = distanceMatrixProxy(distance, this.data.length);\n this.reducer.initDataDist(matrixProxy);\n for (let i = 0; i < this.iterations; ++i)\n this.reducer.step(); // every time you call this, solution gets better\n return { distance: distance, embedding: this.reducer.getSolution() };\n }\n}\n/**\n * Implements UMAP dimensionality reduction.\n *\n * @class UMAPReducer\n * @extends {Reducer}\n */\nclass UMAPReducer extends Reducer {\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 super(options);\n assert('distanceFname' in options);\n assert('distanceFn' in options);\n this.distanceFn = options.distanceFn;\n this.distanceFname = options.distanceFname;\n this.dmIndexFunc = dmLinearIndex(this.data.length);\n //Umap uses vector indexing, so we need to create an array of vectors as indeces.\n this.vectors = new Array(this.data.length).fill(0).map((_, i) => [i]);\n this.usingDistanceMatrix = !(!options.preCalculateDistanceMatrix && this.data.length > MAX_DISTANCE_MATRIX_ROWS);\n if (!this.usingDistanceMatrix)\n options.distanceFn = this._encodedDistance.bind(this);\n else\n options.distanceFn = this._encodedDistanceMatrix.bind(this);\n if (this.data.length < 15)\n options.nNeighbors = this.data.length - 1;\n this.reducer = new umj.UMAP(options);\n // this.reducer.distanceFn = this._encodedDistance.bind(this);\n }\n /**\n * Custom distance wrapper to have numeric inputs instead of string ones.\n *\n * @protected\n * @param {number[]} a The first item.\n * @param {number[]} b The first item.\n * @return {number} Distance metric.\n * @memberof UMAPReducer\n */\n _encodedDistanceMatrix(a, b) {\n if (a[0] === b[0])\n return 0;\n if (a[0] > b[0])\n return this.distanceMatrix[this.dmIndexFunc(b[0], a[0])];\n return this.distanceMatrix[this.dmIndexFunc(a[0], b[0])];\n }\n _encodedDistance(a, b) {\n return this.distanceFn(this.data[a[0]], this.data[b[0]]);\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 if (this.usingDistanceMatrix) {\n this.distanceMatrix = parallelDistanceWorkers ? await (async () => {\n const matrixService = new DistanceMatrixService(true, false);\n try {\n const dist = await matrixService.calc(this.data, this.distanceFname);\n matrixService.terminate();\n return dist;\n }\n catch (e) {\n matrixService.terminate();\n throw e;\n }\n })() :\n (() => { const ret = DistanceMatrix.calc(this.data, (a, b) => this.distanceFn(a, b)); return ret.data; })();\n }\n const embedding = this.reducer.fit(this.vectors);\n function arrayCast2Coordinates(data) {\n return new Array(data.length).fill(0).map((_, i) => (Vector.from(data[i])));\n }\n return { embedding: arrayCast2Coordinates(embedding), ...(this.distanceMatrix ? { distance: this.distanceMatrix } : {}) };\n }\n}\n/**\n * Implements original SPE dimensionality reduction.\n *\n * @class SPEReducer\n * @extends {Reducer}\n */\nclass SPEReducer extends Reducer {\n /**\n * Creates an instance of SPEReducer.\n * @param {Options} options Options to pass to the constructor.\n * @memberof SPEReducer\n */\n constructor(options) {\n super(options);\n this.reducer = new SPEBase(options);\n }\n /**\n * Embeds the data given into the two-dimensional space using the original SPE method.\n * @return {any} Cartesian coordinate of this embedding and distance matrix where applicable.\n */\n async transform() {\n const emb = await this.reducer.embed(this.data);\n return { distance: this.reducer.distance, embedding: emb };\n }\n}\n/**\n * Implements modified SPE dimensionality reduction.\n *\n * @class PSPEReducer\n * @extends {Reducer}\n */\nclass PSPEReducer extends Reducer {\n /**\n * Creates an instance of PSPEReducer.\n * @param {Options} options Options to pass to the constructor.\n * @memberof PSPEReducer\n */\n constructor(options) {\n super(options);\n this.reducer = new PSPEBase(options);\n }\n /**\n * Embeds the data given into the two-dimensional space using the modified SPE method.\n * @return {any} Cartesian coordinate of this embedding and distance matrix where applicable.\n */\n async transform() {\n const emb = await this.reducer.embed(this.data);\n return { distance: this.reducer.distance, embedding: emb };\n }\n}\n/**\n * Implements original SPE dimensionality reduction.\n *\n * @class OriginalSPEReducer\n * @extends {Reducer}\n */\nclass OriginalSPEReducer extends Reducer {\n /**\n * Creates an instance of OriginalSPEReducer.\n * @param {Options} options Options to pass to the constructor.\n * @memberof OriginalSPEReducer\n */\n constructor(options) {\n super(options);\n this.reducer = new OriginalSPE(options);\n }\n /**\n * Embeds the data given into the two-dimensional space using the original SPE method.\n * @return {any} Cartesian coordinate of this embedding and distance matrix where applicable.\n */\n async transform() {\n const emb = await this.reducer.embed(this.data);\n return { distance: this.reducer.distance, embedding: emb };\n }\n}\nconst AvailableReducers = {\n 'UMAP': UMAPReducer,\n 't-SNE': TSNEReducer,\n 'SPE': SPEReducer,\n 'pSPE': PSPEReducer,\n 'OriginalSPE': OriginalSPEReducer,\n};\n/**\n * Unified class implementing different dimensionality reduction methods.\n *\n * @export\n * @class DimensionalityReducer\n */\nexport class DimensionalityReducer {\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, metric, options) {\n const measure = new Measure(metric).getMeasure();\n let specOptions = {};\n if (isBitArrayMetric(metric)) {\n for (let i = 0; i < data.length; ++i)\n data[i] = new BitArray(data[i]._data, data[i]._length);\n }\n if (method == 'UMAP') {\n specOptions = {\n ...{ data: data },\n ...{ distanceFn: measure },\n ...{ distanceFname: metric },\n ...{ nEpochs: options?.cycles },\n ...options,\n };\n }\n else if (method == 't-SNE') {\n specOptions = {\n ...{ data: data },\n ...{ distanceFn: measure },\n ...{ distanceFname: metric },\n ...{ iterations: options?.cycles ?? undefined },\n ...options,\n };\n }\n else if (method == 'SPE') {\n specOptions = { ...{ data: data }, ...{ distance: measure }, distanceFunctionName: metric, ...options };\n }\n else {\n specOptions = { ...{ data: data }, ...{ distance: measure }, distanceFunctionName: metric, ...options };\n }\n this.reducer = new AvailableReducers[method](specOptions);\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, parallelDistanceWorkers) {\n if (this.reducer === undefined)\n throw new Error('Reducer was not defined.');\n let { embedding, distance } = await this.reducer.transform(parallelDistanceWorkers);\n if (transpose)\n embedding = transposeMatrix(embedding);\n return { distance: distance, embedding: 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkdWNlLWRpbWVuc2lvbmFsaXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicmVkdWNlLWRpbWVuc2lvbmFsaXR5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDRCQUE0QjtBQUM1QixPQUFPLEtBQUssR0FBRyxNQUFNLFNBQVMsQ0FBQztBQUMvQixPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ25DLE9BQU8sRUFHTCxNQUFNLEdBR1AsTUFBTSxpREFBaUQsQ0FBQztBQUN6RCxPQUFPLEVBQ0wsZUFBZSxFQUNmLE1BQU0sR0FDUCxNQUFNLGlEQUFpRCxDQUFDO0FBQ3pELE9BQU8sRUFBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUNyRCxPQUFPLEVBQUMsT0FBTyxFQUFnQixnQkFBZ0IsRUFDN0MsZ0JBQWdCLEVBQXFCLE1BQU0sK0JBQStCLENBQUM7QUFDN0UsT0FBTyxRQUFRLE1BQU0seUNBQXlDLENBQUM7QUFFL0QsT0FBTyxFQUFDLGNBQWMsRUFBRSxxQkFBcUIsRUFBRSxtQkFBbUIsRUFBRSxhQUFhLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQU81RyxNQUFNLENBQU4sSUFBWSxtQkFHWDtBQUhELFdBQVksbUJBQW1CO0lBQzdCLG9DQUFhLENBQUE7SUFDYixzQ0FBZSxDQUFBO0FBQ2pCLENBQUMsRUFIVyxtQkFBbUIsS0FBbkIsbUJBQW1CLFFBRzlCO0FBd0JEOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUcsS0FBSyxDQUFDO0FBRTlDLE1BQU0sT0FBTyxXQUFXO0lBUXRCO1FBUEEsaUJBQVksR0FBdUIsRUFBQyxNQUFNLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLDBEQUEwRCxFQUFDLENBQUM7UUFDNUksZ0JBQVcsR0FBdUIsRUFBQyxNQUFNLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxDQUFDLEVB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SUFDSCxNQUFNLEtBQUssZ0JBQWdCO1FBQ3pCLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE1BQU0sS0FBSyxnQkFBZ0I7UUFDekIsSUFBSSxHQUFHLEdBQWEsRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUM5QyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2pDLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUM7UUFDM0IsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi9cbmltcG9ydCAqIGFzIHVtaiBmcm9tICd1bWFwLWpzJztcbmltcG9ydCB7VFNORX0gZnJvbSAnQGtlY2tlbHQvdHNuZSc7XG5pbXBvcnQge1xuICBPcHRpb25zLFxuICBDb29yZGluYXRlcyxcbiAgVmVjdG9yLFxuICBWZWN0b3JzLFxuICBNYXRyaXgsXG59IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL3R5cGUtZGVjbGFyYXRpb25zJztcbmltcG9ydCB7XG4gIHRyYW5zcG9zZU1hdHJpeCxcbiAgYXNzZXJ0LFxufSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy92ZWN0b3Itb3BlcmF0aW9ucyc7XG5pbXBvcnQge1NQRUJhc2UsIFBTUEVCYXNlLCBPcmlnaW5hbFNQRX0gZnJvbSAnLi9zcGUnO1xuaW1wb3J0IHtNZWFzdXJlLCBLbm93bk1ldHJpY3MsIEF2YWlsYWJsZU1ldHJpY3MsXG4gIGlzQml0QXJyYXlNZXRyaWMsIEF2YWlsYWJsZURhdGFUeXBlc30gZnJvbSAnLi90eXBlZC1tZXRyaWNzL3R5cGVkLW1ldHJpY3MnO1xuaW1wb3J0IEJpdEFycmF5IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL2JpdC1hcnJheSc7XG5pbXBvcnQge1VNQVBQYXJhbWV0ZXJzfSBmcm9tICd1bWFwLWpzJztcbmltcG9ydCB7RGlzdGFuY2VNYXRyaXgsIERpc3RhbmNlTWF0cml4U2VydmljZSwgZGlzdGFuY2VNYXRyaXhQcm94eSwgZG1MaW5lYXJJbmRleH0gZnJvbSAnLi9kaXN0YW5jZS1tYXRyaXgnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElSZWR1Y2VEaW1lbnNpb25hbGl0eVJlc3VsdCB7XG4gIGRpc3RhbmNlPzogRmxvYXQzMkFycmF5O1xuICBlbWJlZGRpbmc6IE1hdHJpeDtcbn1cblxuZXhwb3J0IGVudW0gRGltUmVkdWN0aW9uTWV0aG9kc3tcbiAgVU1BUCA9ICdVTUFQJyxcbiAgVF9TTkUgPSAndC1TTkUnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVVNQVBPcHRpb25zIHtcbiAgbGVhcm5pbmdSYXRlPzogbnVtYmVyO1xuICBuQ29tcG9uZW50cz86IG51bWJlcjtcbiAgbkVwb2Nocz86IG51bWJlcjtcbiAgbk5laWdoYm9ycz86IG51bWJlcjtcbiAgc3ByZWFkPzogbnVtYmVyO1xuICBtaW5EaXN0PzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElUU05FT3B0aW9ucyB7XG4gIGVwc2lsb24/OiBudW1iZXI7XG4gIHBlcnBsZXhpdHk/OiBudW1iZXI7XG4gIGRpbT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRGltUmVkdWN0aW9uUGFyYW0ge1xuICB1aU5hbWU6IHN0cmluZztcbiAgdmFsdWU6IG51bWJlciB8IG51bGw7XG4gIHRvb2x0aXA6IHN0cmluZztcbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG59XG5cbi8qKiBVbWFwIHVzZXMgcHJlY2FsY3VsYXRlZCBkaXN0YW5jZSBtYXRyaXggdG8gc2F2ZSB0aW1lLiB0aG91Z2ggZm9yIHRvbyBtdWNoIGRhdGEsIG1lbW9yeSBiZWNvbWVzIGNvbnN0cmFpbnQuXG4gKiBpZiB3ZSBoYXZlIDEwMCAwMDAgcm93cywgZGlzdGFuY2UgbWF0cml4IHdpbGwgdGFrZSB+MTBnYiBvZiBtZW1vcnkgYW5kIHByb2JhYmx5IG92ZXJmbG93LlxuICovXG5leHBvcnQgY29uc3QgTUFYX0RJU1RBTkNFX01BVFJJWF9ST1dTID0gMjAwMDA7XG5cbmV4cG9ydCBjbGFzcyBVTUFQT3B0aW9ucyB7XG4gIGxlYXJuaW5nUmF0ZTogSURpbVJlZHVjdGlvblBhcmFtID0ge3VpTmFtZTogJ0xlYXJpbmlnIHJhdGUnLCB2YWx1ZTogMSwgdG9vbHRpcDogJ1RoZSBpbml0aWFsIGxlYXJuaW5nIHJhdGUgZm9yIHRoZSBlbWJlZGRpbmcgb3B0aW1pemF0aW9uJ307XG4gIG5Db21wb25lbnRzOiBJRGltUmVkdWN0aW9uUGFyYW0gPSB7dWlOYW1lOiAnQ29tcG9uZW50cycsIHZhbHVlOiAyLCB0b29sdGlwOiAnVGhlIG51bWJlciBvZiBjb21wb25lbnRzIChkaW1lbnNpb25zKSB0byBwcm9qZWN0IHRoZSBkYXRhIHRvJ307XG4gIG5FcG9jaHM6IElEaW1SZWR1Y3Rpb25QYXJhbSA9IHt1aU5hbWU6ICdFcG9jaHMnLCB2YWx1ZTogMCwgdG9vbHRpcDogJ1RoZSBudW1iZXIgb2YgZXBvY2hzIHRvIG9wdGltaXplIGVtYmVkZGluZ3MgdmlhIFNHRC4gQ29tcHV0ZWQgYXV0b21hdGljYWxseSBpZiBzZXQgdG8gMCd9O1xuICBuTmVpZ2hib3JzOiBJRGltUmVkdWN0aW9uUGFyYW0gPSB7dWlOYW1lOiAnTmVpZ2hib3JzJywgdmFsdWU6IDE1LCB0b29sdGlwOiAnVGhlIG51bWJlciBvZiBuZWFyZXN0IG5laWdoYm9ycyB0byBjb25zdHJ1Y3QgdGhlIGZ1enp5IG1hbmlmb2xkJ307XG4gIHNwcmVhZDogSURpbVJlZHVjdGlvblBhcmFtID0ge3VpTmFtZTogJ1NwcmVhZCcsIHZhbHVlOiAxLCB0b29sdGlwOiAnVGhlIGVmZmVjdGl2ZSBzY2FsZSBvZiBlbWJlZGRlZCBwb2ludHMsIHVzZWQgd2l0aCBtaW4gZGlzdGFuY2UgdG8gY29udHJvbCB0aGUgY2x1bXBlZC9kaXNwZXJzZWQgbmF0dXJlIG9mIHRoZSBlbWJlZGRpbmcnfTtcbiAgbWluRGlzdDogSURpbVJlZHVjdGlvblBhcmFtID0ge3VpTmFtZTogJ01pbiBkaXN0YW5jZScsIHZhbHVlOiAwLjEsIHRvb2x0aXA6ICdUaGUgZWZmZWN0aXZlIG1pbmltdW0gZGlzdGFuY2UgYmV0d2VlbiBlbWJlZGRlZCBwb2ludHMsIHVzZWQgd2l0aCBzcHJlYWQgdG8gY29udHJvbCB0aGUgY2x1bXBlZC9kaXNwZXJzZWQgbmF0dXJlIG9mIHRoZSBlbWJlZGRpbmcnfTtcblxuICBjb25zdHJ1Y3RvcigpIHt9O1xufVxuXG5leHBvcnQgY2xhc3MgVFNORU9wdGlvbnMge1xuICBlcHNpbG9uOiBJRGltUmVkdWN0aW9uUGFyYW0gPSB7dWlOYW1lOiAnRXBzaWxvbicsIHZhbHVlOiAxMCwgdG9vbHRpcDogJ0Vwc2lsb24gaXMgbGVhcm5pbmcgcmF0ZSd9O1xuICBwZXJwbGV4aXR5OiBJRGltUmVkdWN0aW9uUGFyYW0gPSB7dWlOYW1lOiAnUGVycGxleGl0eScsIHZhbHVlOiAzMCwgdG9vbHRpcDogJ1JvdWdobHkgaG93IG1hbnkgbmVpZ2hib3JzIGVhY2ggcG9pbnQgaW5mbHVlbmNlcyd9O1xuICBkaW06IElEaW1SZWR1Y3Rpb25QYXJhbSA9IHt1aU5hbWU6ICdEaW1lbnNpb25hbGl0eScsIHZhbHVlOiAyLCB0b29sdGlwOiAnRGltZW5zaW9uYWxpdHkgb2YgdGhlIGVtYmVkZGluZyd9O1xuXG4gIGNvbnN0cnVjdG9yKCkge307XG59XG5cbi8qKiBBYnN0cmFjdCBkaW1lbnNpb25hbGl0eSByZWR1Y2VyICovXG5hYnN0cmFjdCBjbGFzcyBSZWR1Y2VyIHtcbiAgcHJvdGVjdGVkIGRhdGE6IFZlY3RvcnM7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogT3B0aW9ucykge1xuICAgIHRoaXMuZGF0YSA9IG9wdGlvbnMuZGF0YTtcbiAgfVxuXG4gIC8qKiBFbWJlZHMgdGhlIGRhdGEgZ2l2ZW4gaW50byB0aGUgdHdvLWRpbWVuc2lvbmFsIHNwYWNlLlxuICAgKiBAcmV0dXJuIHthbnl9IENhcnRlc2lhbiBjb29yZGluYXRlIG9mIHRoaXMgZW1iZWRkaW5nIGFuZCBkaXN0YW5jZSBtYXRyaXggd2hlcmUgYXBwbGljYWJsZS4gKi9cbiAgYWJzdHJhY3QgdHJhbnNmb3JtKHBhcmFsbGVsRGlzdGFuY2VXb3JrZXJzPzogYm9vbGVhbik6IFByb21pc2U8SVJlZHVjZURpbWVuc2lvbmFsaXR5UmVzdWx0Pjtcbn1cblxuLyoqIHQtU05FIGRpbWVuc2lvbmFsaXR5IHJlZHVjdGlvbi4gKi9cbmNsYXNzIFRTTkVSZWR1Y2VyIGV4dGVuZHMgUmVkdWNlciB7XG4gIHByb3RlY3RlZCByZWR1Y2VyOiBUU05FO1xuICBwcm90ZWN0ZWQgaXRlcmF0aW9uczogbnVtYmVyO1xuICBwcm90ZWN0ZWQgZGlzdGFuY2VGbmFtZTogS25vd25NZXRyaWNzO1xuICBwcm90ZWN0ZWQgZGlzdGFuY2VGbjogKGE6IGFueSwgYjogYW55KSA9PiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgVFNORVJlZHVjZXIuXG4gICAqIEBwYXJhbSB7T3B0aW9uc30gb3B0aW9ucyBPcHRpb25zIHRvIHBhc3MgdG8gdGhlIGNvbnN0cnVjdG9yLlxuICAgKiBAbWVtYmVyb2YgVFNORVJlZHVjZXJcbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE9wdGlvbnMpIHtcbiAgICBzdXBlcihvcHRpb25zKTtcbiAgICB0aGlzLnJlZHVjZXIgPSBuZXcgVFNORShvcHRpb25zKTtcbiAgICB0aGlzLml0ZXJhdGlvbnMgPSBvcHRpb25zPy5pdGVyYXRpb25zID8/IDEwMDtcbiAgICB0aGlzLmRpc3RhbmNlRm5hbWUgPSBvcHRpb25zLmRpc3RhbmNlRm5hbWU7XG4gICAgdGhpcy5kaXN0YW5jZUZuID0gb3B0aW9ucy5kaXN0YW5jZUZuO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtYmVkcyB0aGUgZGF0YSBnaXZlbiBpbnRvIHRoZSB0d28tZGltZW5zaW9uYWwgc3BhY2UgdXNpbmcgdC1TTkUgbWV0aG9kLlxcXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BhcmFsbGVsRGlzdGFuY2VXb3JrZXJzXSBXaGV0aGVyIHRvIHVzZSBwYXJhbGxlbCBkaXN0YW5jZSB3b3JrZXJzLlxuICAgKiBAcmV0dXJuIHthbnl9IENhcnRlc2lhbiBjb29yZGluYXRlIG9mIHRoaXMgZW1iZWRkaW5nIGFuZCBkaXN0YW5jZSBtYXRyaXggd2hlcmUgYXBwbGljYWJsZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyB0cmFuc2Zvcm0ocGFyYWxsZWxEaXN0YW5jZVdvcmtlcnM/OiBib29sZWFuKTogUHJvbWlzZTxJUmVkdWNlRGltZW5zaW9uYWxpdHlSZXN1bHQ+IHtcbiAgICBjb25zdCBkaXN0YW5jZSA9IHBhcmFsbGVsRGlzdGFuY2VXb3JrZXJzID8gYXdhaXQgKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG1hdHJpeFNlcnZpY2UgPSBuZXcgRGlzdGFuY2VNYXRyaXhTZXJ2aWNlKHRydWUsIGZhbHNlKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGRpc3QgPSBhd2FpdCBtYXRyaXhTZXJ2aWNlLmNhbGModGhpcy5kYXRhLCB0aGlzLmRpc3RhbmNlRm5hbWUpO1xuICAgICAgICBtYXRyaXhTZXJ2aWNlLnRlcm1pbmF0ZSgpO1xuICAgICAgICByZXR1cm4gZGlzdDtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbWF0cml4U2VydmljZS50ZXJtaW5hdGUoKTtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9KSgpIDpcbiAgICAgICgoKSA9PiB7IGNvbnN0IHJldCA9IERpc3RhbmNlTWF0cml4LmNhbGModGhpcy5kYXRhLCAoYSwgYikgPT4gdGhpcy5kaXN0YW5jZUZuKGEsIGIpKTsgcmV0Lm5vcm1hbGl6ZSgpOyByZXR1cm4gcmV0LmRhdGE7IH0pKCk7XG5cbiAgICBjb25zdCBtYXRyaXhQcm94eSA9IGRpc3RhbmNlTWF0cml4UHJveHkoZGlzdGFuY2UsIHRoaXMuZGF0YS5sZW5ndGgpO1xuICAgIHRoaXMucmVkdWNlci5pbml0RGF0YURpc3QobWF0cml4UHJveHkpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLml0ZXJhdGlvbnM7ICsraSlcbiAgICAgIHRoaXMucmVkdWNlci5zdGVwKCk7IC8vIGV2ZXJ5IHRpbWUgeW91IGNhbGwgdGhpcywgc29sdXRpb24gZ2V0cyBiZXR0ZXJcblxuICAgIHJldHVybiB7ZGlzdGFuY2U6IGRpc3RhbmNlLCBlbWJlZGRpbmc6IHRoaXMucmVkdWNlci5nZXRTb2x1dGlvbigpfTtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBVbWFwT3B0aW9ucyA9IE9wdGlvbnMgJiBVTUFQUGFyYW1ldGVycyAmIHtwcmVDYWxjdWxhdGVEaXN0YW5jZU1hdHJpeD86IGJvb2xlYW59O1xuXG4vKipcbiAqIEltcGxlbWVudHMgVU1BUCBkaW1lbnNpb25hbGl0eSByZWR1Y3Rpb24uXG4gKlxuICogQGNsYXNzIFVNQVBSZWR1Y2VyXG4gKiBAZXh0ZW5kcyB7UmVkdWNlcn1cbiAqL1xuY2xhc3MgVU1BUFJlZHVjZXIgZXh0ZW5kcyBSZWR1Y2VyIHtcbiAgcHJvdGVjdGVkIHJlZHVjZXI6IHVtai5VTUFQO1xuICBwcm90ZWN0ZWQgZGlzdGFuY2VGbmFtZTogS25vd25NZXRyaWNzO1xuICBwcm90ZWN0ZWQgZGlzdGFuY2VGbjogRnVuY3Rpb247XG4gIHByb3RlY3RlZCB2ZWN0b3JzOiBudW1iZXJbXVtdO1xuICBwcm90ZWN0ZWQgZGlzdGFuY2VNYXRyaXg/OiBGbG9hdDMyQXJyYXk7XG4gIHByb3RlY3RlZCB1c2luZ0Rpc3RhbmNlTWF0cml4OiBib29sZWFuO1xuICBwcm90ZWN0ZWQgZG1JbmRleEZ1bmM6IChpOiBudW1iZXIsIGo6IG51bWJlcikgPT4gbnVtYmVyO1xuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBVTUFQUmVkdWNlci5cbiAgICogQHBhcmFtIHtPcHRpb25zfSBvcHRpb25zIE9wdGlvbnMgdG8gcGFzcyB0byB0aGUgY29uc3RydWN0b3IuXG4gICAqIEBtZW1iZXJvZiBVTUFQUmVkdWNlclxuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0aW9uczogVW1hcE9wdGlvbnMpIHtcbiAgICBzdXBlcihvcHRpb25zKTtcbiAgICBhc3NlcnQoJ2Rpc3RhbmNlRm5hbWUnIGluIG9wdGlvbnMpO1xuICAgIGFzc2VydCgnZGlzdGFuY2VGbicgaW4gb3B0aW9ucyk7XG4gICAgdGhpcy5kaXN0YW5jZUZuID0gb3B0aW9ucy5kaXN0YW5jZUZuITtcblxuICAgIHRoaXMuZGlzdGFuY2VGbmFtZSA9IG9wdGlvbnMuZGlzdGFuY2VGbmFtZSE7XG4gICAgdGhpcy5kbUluZGV4RnVuYyA9IGRtTGluZWFySW5kZXgodGhpcy5kYXRhLmxlbmd0aCk7XG4gICAgLy9VbWFwIHVzZXMgdmVjdG9yIGluZGV4aW5nLCBzbyB3ZSBuZWVkIHRvIGNyZWF0ZSBhbiBhcnJheSBvZiB2ZWN0b3JzIGFzIGluZGVjZXMuXG4gICAgdGhpcy52ZWN0b3JzID0gbmV3IEFycmF5KHRoaXMuZGF0YS5sZW5ndGgpLmZpbGwoMCkubWFwKChfLCBpKSA9PiBbaV0pO1xuICAgIHRoaXMudXNpbmdEaXN0YW5jZU1hdHJpeCA9ICEoIW9wdGlvbnMucHJlQ2FsY3VsYXRlRGlzdGFuY2VNYXRyaXggJiYgdGhpcy5kYXRhLmxlbmd0aCA+IE1BWF9ESVNUQU5DRV9NQVRSSVhfUk9XUyk7XG4gICAgaWYgKCF0aGlzLnVzaW5nRGlzdGFuY2VNYXRyaXgpXG4gICAgICBvcHRpb25zLmRpc3RhbmNlRm4gPSB0aGlzLl9lbmNvZGVkRGlzdGFuY2UuYmluZCh0aGlzKTtcbiAgICBlbHNlXG4gICAgICBvcHRpb25zLmRpc3RhbmNlRm4gPSB0aGlzLl9lbmNvZGVkRGlzdGFuY2VNYXRyaXguYmluZCh0aGlzKTtcblxuICAgIGlmICh0aGlzLmRhdGEubGVuZ3RoIDwgMTUpXG4gICAgICBvcHRpb25zLm5OZWlnaGJvcnMgPSB0aGlzLmRhdGEubGVuZ3RoIC0gMTtcbiAgICB0aGlzLnJlZHVjZXIgPSBuZXcgdW1qLlVNQVAob3B0aW9ucyk7XG4gICAgLy8gdGhpcy5yZWR1Y2VyLmRpc3RhbmNlRm4gPSB0aGlzLl9lbmNvZGVkRGlzdGFuY2UuYmluZCh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDdXN0b20gZGlzdGFuY2Ugd3JhcHBlciB0byBoYXZlIG51bWVyaWMgaW5wdXRzIGluc3RlYWQgb2Ygc3RyaW5nIG9uZXMuXG4gICAqXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQHBhcmFtIHtudW1iZXJbXX0gYSBUaGUgZmlyc3QgaXRlbS5cbiAgICogQHBhcmFtIHtudW1iZXJbXX0gYiBUaGUgZmlyc3QgaXRlbS5cbiAgICogQHJldHVybiB7bnVtYmVyfSBEaXN0YW5jZSBtZXRyaWMuXG4gICAqIEBtZW1iZXJvZiBVTUFQUmVkdWNlclxuICAgKi9cbiAgcHJvdGVjdGVkIF9lbmNvZGVkRGlzdGFuY2VNYXRyaXgoYTogbnVtYmVyW10sIGI6IG51bWJlcltdKTogbnVtYmVyIHtcbiAgICBpZiAoYVswXSA9PT0gYlswXSlcbiAgICAgIHJldHVybiAwO1xuICAgIGlmIChhWzBdID4gYlswXSlcbiAgICAgIHJldHVybiB0aGlzLmRpc3RhbmNlTWF0cml4IVt0aGlzLmRtSW5kZXhGdW5jKGJbMF0sIGFbMF0pXTtcbiAgICByZXR1cm4gdGhpcy5kaXN0YW5jZU1hdHJpeCFbdGhpcy5kbUluZGV4RnVuYyhhWzBdLCBiWzBdKV07XG4gIH1cblxuICBwcm90ZWN0ZWQgX2VuY29kZWREaXN0YW5jZShhOiBudW1iZXJbXSwgYjogbnVtYmVyW10pOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmRpc3RhbmNlRm4odGhpcy5kYXRhW2FbMF1dLCB0aGlzLmRhdGFbYlswXV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtYmVkcyB0aGUgZGF0YSBnaXZlbiBpbnRvIHRoZSB0d28tZGltZW5zaW9uYWwgc3BhY2UgdXNpbmcgVU1BUCBtZXRob2QuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BhcmFsbGVsRGlzdGFuY2VXb3JrZXJzXSBXaGV0aGVyIHRvIHVzZSBwYXJhbGxlbCBkaXN0YW5jZSBtYXRyaXggd29ya2Vycy5cbiAgICogQHJldHVybiB7YW55fSBDYXJ0ZXNpYW4gY29vcmRpbmF0ZSBvZiB0aGlzIGVtYmVkZGluZy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyB0cmFuc2Zvcm0ocGFyYWxsZWxEaXN0YW5jZVdvcmtlcnM/OiBib29sZWFuKTogUHJvbWlzZTxJUmVkdWNlRGltZW5zaW9uYWxpdHlSZXN1bHQ+IHtcbiAgICBpZiAodGhpcy51c2luZ0Rpc3RhbmNlTWF0cml4KSB7XG4gICAgICB0aGlzLmRpc3RhbmNlTWF0cml4ID0gcGFyYWxsZWxEaXN0YW5jZVdvcmtlcnMgPyBhd2FpdCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBtYXRyaXhTZXJ2aWNlID0gbmV3IERpc3RhbmNlTWF0cml4U2VydmljZSh0cnVlLCBmYWxzZSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZGlzdCA9IGF3YWl0IG1hdHJpeFNlcnZpY2UuY2FsYyh0aGlzLmRhdGEsIHRoaXMuZGlzdGFuY2VGbmFtZSk7XG4gICAgICAgICAgbWF0cml4U2VydmljZS50ZXJtaW5hdGUoKTtcbiAgICAgICAgICByZXR1cm4gZGlzdDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIG1hdHJpeFNlcnZpY2UudGVybWluYXRlKCk7XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgfSkoKSA6XG4gICAgICAgICgoKSA9PiB7IGNvbnN0IHJldCA9IERpc3RhbmNlTWF0cml4LmNhbGModGhpcy5kYXRhLCAoYSwgYikgPT4gdGhpcy5kaXN0YW5jZUZuKGEsIGIpKTsgcmV0dXJuIHJldC5kYXRhOyB9KSgpO1xuICAgIH1cbiAgICBjb25zdCBlbWJlZGRpbmcgPSB0aGlzLnJlZHVjZXIuZml0KHRoaXMudmVjdG9ycyk7XG5cbiAgICBmdW5jdGlvbiBhcnJheUNhc3QyQ29vcmRpbmF0ZXMoZGF0YTogbnVtYmVyW11bXSk6IENvb3JkaW5hdGVzIHtcbiAgICAgIHJldHVybiBuZXcgQXJyYXkoZGF0YS5sZW5ndGgpLmZpbGwoMCkubWFwKChfLCBpKSA9PiAoVmVjdG9yLmZyb20oZGF0YVtpXSkpKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge2VtYmVkZGluZzogYXJyYXlDYXN0MkNvb3JkaW5hdGVzKGVtYmVkZGluZyksIC4uLih0aGlzLmRpc3RhbmNlTWF0cml4ID8ge2Rpc3RhbmNlOiB0aGlzLmRpc3RhbmNlTWF0cml4fSA6IHt9KX07XG4gIH1cbn1cblxuLyoqXG4gKiBJbXBsZW1lbnRzIG9yaWdpbmFsIFNQRSBkaW1lbnNpb25hbGl0eSByZWR1Y3Rpb24uXG4gKlxuICogQGNsYXNzIFNQRVJlZHVjZXJcbiAqIEBleHRlbmRzIHtSZWR1Y2VyfVxuICovXG5jbGFzcyBTUEVSZWR1Y2VyIGV4dGVuZHMgUmVkdWNlciB7XG4gIHByb3RlY3RlZCByZWR1Y2VyOiBTUEVCYXNlO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIFNQRVJlZHVjZXIuXG4gICAqIEBwYXJhbSB7T3B0aW9uc30gb3B0aW9ucyBPcHRpb25zIHRvIHBhc3MgdG8gdGhlIGNvbnN0cnVjdG9yLlxuICAgKiBAbWVtYmVyb2YgU1BFUmVkdWNlclxuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0aW9uczogT3B0aW9ucykge1xuICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgIHRoaXMucmVkdWNlciA9IG5ldyBTUEVCYXNlKG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtYmVkcyB0aGUgZGF0YSBnaXZlbiBpbnRvIHRoZSB0d28tZGltZW5zaW9uYWwgc3BhY2UgdXNpbmcgdGhlIG9yaWdpbmFsIFNQRSBtZXRob2QuXG4gICAqIEByZXR1cm4ge2FueX0gQ2FydGVzaWFuIGNvb3JkaW5hdGUgb2YgdGhpcyBlbWJlZGRpbmcgYW5kIGRpc3RhbmNlIG1hdHJpeCB3aGVyZSBhcHBsaWNhYmxlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHRyYW5zZm9ybSgpOiBQcm9taXNlPElSZWR1Y2VEaW1lbnNpb25hbGl0eVJlc3VsdD4ge1xuICAgIGNvbnN0IGVtYiA9IGF3YWl0IHRoaXMucmVkdWNlci5lbWJlZCh0aGlzLmRhdGEpO1xuICAgIHJldHVybiB7ZGlzdGFuY2U6IHRoaXMucmVkdWNlci5kaXN0YW5jZSwgZW1iZWRkaW5nOiBlbWJ9O1xuICB9XG59XG5cbi8qKlxuICogSW1wbGVtZW50cyBtb2RpZmllZCBTUEUgZGltZW5zaW9uYWxpdHkgcmVkdWN0aW9uLlxuICpcbiAqIEBjbGFzcyBQU1BFUmVkdWNlclxuICogQGV4dGVuZHMge1JlZHVjZXJ9XG4gKi9cbmNsYXNzIFBTUEVSZWR1Y2VyIGV4dGVuZHMgUmVkdWNlciB7XG4gIHByb3RlY3RlZCByZWR1Y2VyOiBQU1BFQmFzZTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBQU1BFUmVkdWNlci5cbiAgICogQHBhcmFtIHtPcHRpb25zfSBvcHRpb25zIE9wdGlvbnMgdG8gcGFzcyB0byB0aGUgY29uc3RydWN0b3IuXG4gICAqIEBtZW1iZXJvZiBQU1BFUmVkdWNlclxuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0aW9uczogT3B0aW9ucykge1xuICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgIHRoaXMucmVkdWNlciA9IG5ldyBQU1BFQmFzZShvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWJlZHMgdGhlIGRhdGEgZ2l2ZW4gaW50byB0aGUgdHdvLWRpbWVuc2lvbmFsIHNwYWNlIHVzaW5nIHRoZSBtb2RpZmllZCBTUEUgbWV0aG9kLlxuICAgKiBAcmV0dXJuIHthbnl9IENhcnRlc2lhbiBjb29yZGluYXRlIG9mIHRoaXMgZW1iZWRkaW5nIGFuZCBkaXN0YW5jZSBtYXRyaXggd2hlcmUgYXBwbGljYWJsZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyB0cmFuc2Zvcm0oKTogUHJvbWlzZTxJUmVkdWNlRGltZW5zaW9uYWxpdHlSZXN1bHQ+IHtcbiAgICBjb25zdCBlbWIgPSBhd2FpdCB0aGlzLnJlZHVjZXIuZW1iZWQodGhpcy5kYXRhKTtcbiAgICByZXR1cm4ge2Rpc3RhbmNlOiB0aGlzLnJlZHVjZXIuZGlzdGFuY2UsIGVtYmVkZGluZzogZW1ifTtcbiAgfVxufVxuXG4vKipcbiAqIEltcGxlbWVudHMgb3JpZ2luYWwgU1BFIGRpbWVuc2lvbmFsaXR5IHJlZHVjdGlvbi5cbiAqXG4gKiBAY2xhc3MgT3JpZ2luYWxTUEVSZWR1Y2VyXG4gKiBAZXh0ZW5kcyB7UmVkdWNlcn1cbiAqL1xuY2xhc3MgT3JpZ2luYWxTUEVSZWR1Y2VyIGV4dGVuZHMgUmVkdWNlciB7XG4gIHByb3RlY3RlZCByZWR1Y2VyOiBPcmlnaW5hbFNQRTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBPcmlnaW5hbFNQRVJlZHVjZXIuXG4gICAqIEBwYXJhbSB7T3B0aW9uc30gb3B0aW9ucyBPcHRpb25zIHRvIHBhc3MgdG8gdGhlIGNvbnN0cnVjdG9yLlxuICAgKiBAbWVtYmVyb2YgT3JpZ2luYWxTUEVSZWR1Y2VyXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBPcHRpb25zKSB7XG4gICAgc3VwZXIob3B0aW9ucyk7XG4gICAgdGhpcy5yZWR1Y2VyID0gbmV3IE9yaWdpbmFsU1BFKG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtYmVkcyB0aGUgZGF0YSBnaXZlbiBpbnRvIHRoZSB0d28tZGltZW5zaW9uYWwgc3BhY2UgdXNpbmcgdGhlIG9yaWdpbmFsIFNQRSBtZXRob2QuXG4gICAqIEByZXR1cm4ge2FueX0gQ2FydGVzaWFuIGNvb3JkaW5hdGUgb2YgdGhpcyBlbWJlZGRpbmcgYW5kIGRpc3RhbmNlIG1hdHJpeCB3aGVyZSBhcHBsaWNhYmxlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHRyYW5zZm9ybSgpOiBQcm9taXNlPElSZWR1Y2VEaW1lbnNpb25hbGl0eVJlc3VsdD4ge1xuICAgIGNvbnN0IGVtYiA9IGF3YWl0IHRoaXMucmVkdWNlci5lbWJlZCh0aGlzLmRhdGEpO1xuICAgIHJldHVybiB7ZGlzdGFuY2U6IHRoaXMucmVkdWNlci5kaXN0YW5jZSwgZW1iZWRkaW5nOiBlbWJ9O1xuICB9XG59XG5cbmNvbnN0IEF2YWlsYWJsZVJlZHVjZXJzID0ge1xuICAnVU1BUCc6IFVNQVBSZWR1Y2VyLFxuICAndC1TTkUnOiBUU05FUmVkdWNlcixcbiAgJ1NQRSc6IFNQRVJlZHVjZXIsXG4gICdwU1BFJzogUFNQRVJlZHVjZXIsXG4gICdPcmlnaW5hbFNQRSc6IE9yaWdpbmFsU1BFUmVkdWNlcixcbn07XG5cbmV4cG9ydCB0eXBlIEtub3duTWV0aG9kcyA9IGtleW9mIHR5cGVvZiBBdmFpbGFibGVSZWR1Y2VycztcblxuLyoqXG4gKiBVbmlmaWVkIGNsYXNzIGltcGxlbWVudGluZyBkaWZmZXJlbnQgZGltZW5zaW9uYWxpdHkgcmVkdWN0aW9uIG1ldGhvZHMuXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIERpbWVuc2lvbmFsaXR5UmVkdWNlclxuICovXG5leHBvcnQgY2xhc3MgRGltZW5zaW9uYWxpdHlSZWR1Y2VyIHtcbiAgcHJpdmF0ZSByZWR1Y2VyOiBSZWR1Y2VyIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIERpbWVuc2lvbmFsaXR5UmVkdWNlci5cbiAgICogQHBhcmFtIHthbnlbXX0gZGF0YSBWZWN0b3JzIHRvIGVtYmVkLlxuICAgKiBAcGFyYW0ge0tub3duTWV0aG9kc30gbWV0aG9kIEVtYmVkZGluZyBtZXRob2QgdG8gYmUgYXBwbGllZFxuICAgKiBAcGFyYW0ge0tub3duTWV0cmljc30gbWV0cmljIERpc3RhbmNlIG1ldHJpYyB0byBiZSBjb21wdXRlZCBiZXR3ZWVuIGVhY2ggb2YgdGhlIHZlY3RvcnMuXG4gICAqIEBwYXJhbSB7T3B0aW9uc30gW29wdGlvbnNdIE9wdGlvbnMgdG8gcGFzcyB0byB0aGUgaW1wbGVtZW50aW5nIGVtYmVkZGVycy5cbiAgICogQG1lbWJlcm9mIERpbWVuc2lvbmFsaXR5UmVkdWNlclxuICAgKi9cbiAgY29uc3RydWN0b3IoZGF0YTogYW55W10sIG1ldGhvZDogS25vd25NZXRob2RzLCBtZXRyaWM6IEtub3duTWV0cmljcywgb3B0aW9ucz86IE9wdGlvbnMpIHtcbiAgICBjb25zdCBtZWFzdXJlID0gbmV3IE1lYXN1cmUobWV0cmljKS5nZXRNZWFzdXJlKCk7XG4gICAgbGV0IHNwZWNPcHRpb25zID0ge307XG5cbiAgICBpZiAoaXNCaXRBcnJheU1ldHJpYyhtZXRyaWMpKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyArK2kpXG4gICAgICAgIGRhdGFbaV0gPSBuZXcgQml0QXJyYXkoZGF0YVtpXS5fZGF0YSwgZGF0YVtpXS5fbGVuZ3RoKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09ICdVTUFQJykge1xuICAgICAgc3BlY09wdGlvbnMgPSB7XG4gICAgICAgIC4uLntkYXRhOiBkYXRhfSxcbiAgICAgICAgLi4ue2Rpc3RhbmNlRm46IG1lYXN1cmV9LFxuICAgICAgICAuLi57ZGlzdGFuY2VGbmFtZTogbWV0cmljfSxcbiAgICAgICAgLi4ue25FcG9jaHM6IG9wdGlvbnM/LmN5Y2xlc30sXG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAobWV0aG9kID09ICd0LVNORScpIHtcbiAgICAgIHNwZWNPcHRpb25zID0ge1xuICAgICAgICAuLi57ZGF0YTogZGF0YX0sXG4gICAgICAgIC4uLntkaXN0YW5jZUZuOiBtZWFzdXJlfSxcbiAgICAgICAgLi4ue2Rpc3RhbmNlRm5hbWU6IG1ldHJpY30sXG4gICAgICAgIC4uLntpdGVyYXRpb25zOiBvcHRpb25zPy5jeWNsZXMgPz8gdW5kZWZpbmVkfSxcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChtZXRob2QgPT0gJ1NQRScpIHtcbiAgICAgIHNwZWNPcHRpb25zID0gey4uLntkYXRhOiBkYXRhfSwgLi4ue2Rpc3RhbmNlOiBtZWFzdXJlfSwgZGlzdGFuY2VGdW5jdGlvbk5hbWU6IG1ldHJpYywgLi4ub3B0aW9uc307XG4gICAgfSBlbHNlIHtcbiAgICAgIHNwZWNPcHRpb25zID0gey4uLntkYXRhOiBkYXRhfSwgLi4ue2Rpc3RhbmNlOiBtZWFzdXJlfSwgZGlzdGFuY2VGdW5jdGlvbk5hbWU6IG1ldHJpYywgLi4ub3B0aW9uc307XG4gICAgfVxuICAgIHRoaXMucmVkdWNlciA9IG5ldyBBdmFpbGFibGVSZWR1Y2Vyc1ttZXRob2RdKHNwZWNPcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWJlZHMgdGhlIGRhdGEgZ2l2ZW4gaW50byB0aGUgdHdvLWRpbWVuc2lvbmFsIHNwYWNlIHVzaW5nIHRoZSBjaG9zZW4gbWV0aG9kLlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHRyYW5zcG9zZSBXaGV0aGVyIHRvIHRyYW5zZm9ybSBjb29yZGluYXRlcyB0byBoYXZlIGNvbHVtbnMtZmlyc3Qgb3JpZW50YXRpb24uXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gcGFyYWxsZWxEaXN0YW5jZVdvcmtlcnMgV2hldGhlciB0byB1c2UgcGFyYWxsZWwgZGlzdGFuY2UgY29tcHV0YXRpb24uXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgZW1iZWRkaW5nIG1ldGhvZCB3YXMgbm90IGZvdW5kLlxuICAgKiBAcmV0dXJuIHthbnl9IENhcnRlc2lhbiBjb29yZGluYXRlIG9mIHRoaXMgZW1iZWRkaW5nIGFuZCBkaXN0YW5jZSBtYXRyaXggd2hlcmUgYXBwbGljYWJsZS5cbiAgICogQG1lbWJlcm9mIERpbWVuc2lvbmFsaXR5UmVkdWNlclxuICAgKi9cbiAgcHVibGljIGFzeW5jIHRyYW5zZm9ybSh0cmFuc3Bvc2U6IGJvb2xlYW4gPSBmYWxzZSwgcGFyYWxsZWxEaXN0YW5jZVdvcmtlcnM/OiBib29sZWFuKTogUHJvbWlzZTxJUmVkdWNlRGltZW5zaW9uYWxpdHlSZXN1bHQ+IHtcbiAgICBpZiAodGhpcy5yZWR1Y2VyID09PSB1bmRlZmluZWQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlZHVjZXIgd2FzIG5vdCBkZWZpbmVkLicpO1xuXG4gICAgbGV0IHtlbWJlZGRpbmcsIGRpc3RhbmNlfSA9IGF3YWl0IHRoaXMucmVkdWNlci50cmFuc2Zvcm0ocGFyYWxsZWxEaXN0YW5jZVdvcmtlcnMpO1xuXG4gICAgaWYgKHRyYW5zcG9zZSlcbiAgICAgIGVtYmVkZGluZyA9IHRyYW5zcG9zZU1hdHJpeChlbWJlZGRpbmcpO1xuXG4gICAgcmV0dXJuIHtkaXN0YW5jZTogZGlzdGFuY2UsIGVtYmVkZGluZzogZW1iZWRkaW5nfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIG1ldHJpY3MgYXZhaWxhYmxlIGJ5IHR5cGUuXG4gICAqXG4gICAqIEBwYXJhbSB7QXZhaWxhYmxlRGF0YVR5cGVzfSB0eXBlTmFtZSB0eXBlIG5hbWVcbiAgICogQHJldHVybiB7c3RyaW5nW119IE1ldHJpYyBuYW1lcyB3aGljaCBleHBlY3RzIHRoZSBnaXZlbiBkYXRhIHR5cGVcbiAgICogQG1lbWJlcm9mIERpbWVuc2lvbmFsaXR5UmVkdWNlclxuICAgKi9cbiAgc3RhdGljIGF2YWlsYWJsZU1ldHJpY3NCeVR5cGUodHlwZU5hbWU6IEF2YWlsYWJsZURhdGFUeXBlcykge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhBdmFpbGFibGVNZXRyaWNzW3R5cGVOYW1lXSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBkaW1lbnNpb25hbGl0eSByZWR1Y3Rpb24gbWV0aG9kcyBhdmFpbGFibGUuXG4gICAqXG4gICAqIEByZWFkb25seVxuICAgKiBAbWVtYmVyb2YgRGltZW5zaW9uYWxpdHlSZWR1Y2VyXG4gICAqL1xuICBzdGF0aWMgZ2V0IGF2YWlsYWJsZU1ldGhvZHMoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKEF2YWlsYWJsZVJlZHVjZXJzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIG1ldHJpY3MgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBAcmVhZG9ubHlcbiAgICogQG1lbWJlcm9mIERpbWVuc2lvbmFsaXR5UmVkdWNlclxuICAgKi9cbiAgc3RhdGljIGdldCBhdmFpbGFibGVNZXRyaWNzKCkge1xuICAgIGxldCBhbnM6IHN0cmluZ1tdID0gW107XG4gICAgT2JqZWN0LnZhbHVlcyhBdmFpbGFibGVNZXRyaWNzKS5mb3JFYWNoKChvYmopID0+IHtcbiAgICAgIGNvbnN0IGFycmF5ID0gT2JqZWN0LnZhbHVlcyhvYmopO1xuICAgICAgYW5zID0gWy4uLmFucywgLi4uYXJyYXldO1xuICAgIH0pO1xuICAgIHJldHVybiBhbnM7XG4gIH1cbn1cbiJdfQ==","import { isNil } from './utils';\n/** Distance matrix class compatible with data structure of scipy.spatial.distance.pdist */\nexport class DistanceMatrix {\n get data() { return this._data; }\n get size() { return this._size; }\n /**\n * @param {Float32Array} data Distance data\n * @param {number} size Number of original observations\n */\n constructor(data, size) {\n if (size == undefined) {\n if (data == undefined)\n throw new Error('Arguments error: data or size is required.');\n this._data = data;\n this._size = (1 + Math.sqrt(1 + 4 * 2 * this._data.length)) / 2;\n if (this._size != Math.floor(this._size))\n throw new Error(`Invalid data length ${this._data.length} leads to non integer size ${this._size}`);\n }\n else {\n this._size = size;\n const dataLength = size * (size - 1) / 2;\n if (data) {\n if (data.length != dataLength)\n throw new Error(`Invalid data length. Observations size ${size} requires data length ${dataLength}.`);\n this._data = data;\n }\n else {\n this._data = new Float32Array(dataLength);\n }\n }\n }\n _linearizeIJ(i, j) {\n if (!(i < j))\n throw new Error('i must be less than j');\n return this._size * i + j - Math.floor(((i + 2) * (i + 1)) / 2);\n }\n get(i, j) {\n if (i == j)\n return 0;\n else if (i < j)\n return this._data[this._linearizeIJ(i, j)];\n else\n return this._data[this._linearizeIJ(j, i)];\n }\n set(i, j, value) {\n this._data[this._linearizeIJ(i, j)] = value;\n }\n static calc(list, method) {\n const size = list.length;\n const res = new DistanceMatrix(undefined, size);\n for (let i = 0; i < size; i++) {\n for (let j = i + 1; j < size; j++) {\n // if any of the values is null, set distance to 1\n res.set(i, j, !isNil(list[i]) && !isNil(list[j]) ? method(list[i], list[j]) : 1);\n }\n }\n return res;\n }\n // squares each value in matrix in place\n square() {\n for (let i = 0; i < this._data.length; i++)\n this._data[i] = this._data[i] ** 2;\n }\n // adds another matrix to this one in place\n add(other) {\n if (this._size !== other._size)\n throw new Error(`Matrices must have the same size. This size: ${this._size}, other size: ${other._size}`);\n for (let i = 0; i < this._data.length; i++)\n this._data[i] += other._data[i];\n }\n // square root each value in matrix in place\n sqrt() {\n for (let i = 0; i < this._data.length; i++)\n this._data[i] = Math.sqrt(this._data[i]);\n }\n //normilze distance matrix in place\n normalize() {\n let min = 0;\n let max = this._data[0];\n for (let i = 0; i < this._data.length; i++) {\n if (this._data[i] < min)\n min = this._data[i];\n if (this._data[i] > max)\n max = this._data[i];\n }\n const range = max - min;\n for (let i = 0; i < this._data.length; i++)\n this._data[i] = range === 0 ? this._data[i] - min : (this._data[i] - min) / (max - min);\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzdGFuY2UtbWF0cml4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGlzdGFuY2UtbWF0cml4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFFOUIsMkZBQTJGO0FBQzNGLE1BQU0sT0FBTyxjQUFjO0lBSXpCLElBQUksSUFBSSxLQUFtQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBRS9DLElBQUksSUFBSSxLQUFhLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFFekM7OztPQUdHO0lBQ0gsWUFBWSxJQUFtQixFQUFFLElBQWE7UUFDNUMsSUFBSSxJQUFJLElBQUksU0FBUyxFQUFFO1lBQ3JCLElBQUksSUFBSSxJQUFJLFNBQVM7Z0JBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO1lBRXJGLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSyxDQUFDO1lBQ25CLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hFLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7Z0JBQ3RDLE1BQU0sSUFBSSxLQUFLLENBQUMsdUJBQXVCLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSw4QkFBOEIsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7U0FDdkc7YUFBTTtZQUNMLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1lBQ2xCLE1BQU0sVUFBVSxHQUFXLElBQUksR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7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QjtRQUNELE1BQU0sS0FBSyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDeEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtZQUN4QyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDNUYsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZ3JvayBmcm9tICdkYXRhZ3Jvay1hcGkvZ3Jvayc7XG5pbXBvcnQgKiBhcyB1aSBmcm9tICdkYXRhZ3Jvay1hcGkvdWknO1xuaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcbmltcG9ydCB7aXNOaWx9IGZyb20gJy4vdXRpbHMnO1xuXG4vKiogRGlzdGFuY2UgbWF0cml4IGNsYXNzIGNvbXBhdGlibGUgd2l0aCBkYXRhIHN0cnVjdHVyZSBvZiBzY2lweS5zcGF0aWFsLmRpc3RhbmNlLnBkaXN0ICovXG5leHBvcnQgY2xhc3MgRGlzdGFuY2VNYXRyaXgge1xuICBfZGF0YTogRmxvYXQzMkFycmF5O1xuICBfc2l6ZTogbnVtYmVyO1xuXG4gIGdldCBkYXRhKCk6IEZsb2F0MzJBcnJheSB7IHJldHVybiB0aGlzLl9kYXRhOyB9XG5cbiAgZ2V0IHNpemUoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3NpemU7IH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGbG9hdDMyQXJyYXl9IGRhdGEgRGlzdGFuY2UgZGF0YVxuICAgKiBAcGFyYW0ge251bWJlcn0gc2l6ZSBOdW1iZXIgb2Ygb3JpZ2luYWwgb2JzZXJ2YXRpb25zXG4gICAqL1xuICBjb25zdHJ1Y3RvcihkYXRhPzogRmxvYXQzMkFycmF5LCBzaXplPzogbnVtYmVyKSB7XG4gICAgaWYgKHNpemUgPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoZGF0YSA9PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcignQXJndW1lbnRzIGVycm9yOiBkYXRhIG9yIHNpemUgaXMgcmVxdWlyZWQuJyk7XG5cbiAgICAgIHRoaXMuX2RhdGEgPSBkYXRhITtcbiAgICAgIHRoaXMuX3NpemUgPSAoMSArIE1hdGguc3FydCgxICsgNCAqIDIgKiB0aGlzLl9kYXRhLmxlbmd0aCkpIC8gMjtcbiAgICAgIGlmICh0aGlzLl9zaXplICE9IE1hdGguZmxvb3IodGhpcy5fc2l6ZSkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBkYXRhIGxlbmd0aCAke3RoaXMuX2RhdGEubGVuZ3RofSBsZWFkcyB0byBub24gaW50ZWdlciBzaXplICR7dGhpcy5fc2l6ZX1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fc2l6ZSA9IHNpemU7XG4gICAgICBjb25zdCBkYXRhTGVuZ3RoOiBudW1iZXIgPSBzaXplICogKHNpemUgLSAxKSAvIDI7XG4gICAgICBpZiAoZGF0YSkge1xuICAgICAgICBpZiAoZGF0YS5sZW5ndGggIT0gZGF0YUxlbmd0aClcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZGF0YSBsZW5ndGguIE9ic2VydmF0aW9ucyBzaXplICR7c2l6ZX0gcmVxdWlyZXMgZGF0YSBsZW5ndGggJHtkYXRhTGVuZ3RofS5gKTtcbiAgICAgICAgdGhpcy5fZGF0YSA9IGRhdGE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9kYXRhID0gbmV3IEZsb2F0MzJBcnJheShkYXRhTGVuZ3RoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9saW5lYXJpemVJSihpOiBudW1iZXIsIGo6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKCEoaSA8IGopKSB0aHJvdyBuZXcgRXJyb3IoJ2kgbXVzdCBiZSBsZXNzIHRoYW4gaicpO1xuICAgIHJldHVybiB0aGlzLl9zaXplICogaSArIGogLSBNYXRoLmZsb29yKCgoaSArIDIpICogKGkgKyAxKSkgLyAyKTtcbiAgfVxuXG4gIGdldChpOiBudW1iZXIsIGo6IG51bWJlcikge1xuICAgIGlmIChpID09IGopXG4gICAgICByZXR1cm4gMDtcbiAgICBlbHNlIGlmIChpIDwgailcbiAgICAgIHJldHVybiB0aGlzLl9kYXRhW3RoaXMuX2xpbmVhcml6ZUlKKGksIGopXTtcbiAgICBlbHNlXG4gICAgICByZXR1cm4gdGhpcy5fZGF0YVt0aGlzLl9saW5lYXJpemVJSihqLCBpKV07XG4gIH1cblxuICBzZXQoaTogbnVtYmVyLCBqOiBudW1iZXIsIHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9kYXRhW3RoaXMuX2xpbmVhcml6ZUlKKGksIGopXSA9IHZhbHVlO1xuICB9XG5cbiAgc3RhdGljIGNhbGM8VE9iaj4obGlzdDogSW5kZXhhYmxlPFRPYmo+LCBtZXRob2Q6IChhOiBUT2JqLCBiOiBUT2JqKSA9PiBudW1iZXIpOiBEaXN0YW5jZU1hdHJpeCB7XG4gICAgY29uc3Qgc2l6ZTogbnVtYmVyID0gbGlzdC5sZW5ndGg7XG4gICAgY29uc3QgcmVzID0gbmV3IERpc3RhbmNlTWF0cml4KHVuZGVmaW5lZCwgc2l6ZSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcbiAgICAgIGZvciAobGV0IGogPSBpICsgMTsgaiA8IHNpemU7IGorKykge1xuICAgICAgICAvLyBpZiBhbnkgb2YgdGhlIHZhbHVlcyBpcyBudWxsLCBzZXQgZGlzdGFuY2UgdG8gMVxuICAgICAgICByZXMuc2V0KGksIGosICFpc05pbChsaXN0W2ldKSAmJiAhaXNOaWwobGlzdFtqXSkgPyBtZXRob2QobGlzdFtpXSwgbGlzdFtqXSkgOiAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8vIHNxdWFyZXMgZWFjaCB2YWx1ZSBpbiBtYXRyaXggaW4gcGxhY2VcbiAgcHVibGljIHNxdWFyZSgpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2RhdGEubGVuZ3RoOyBpKyspXG4gICAgICB0aGlzLl9kYXRhW2ldID0gdGhpcy5fZGF0YVtpXSAqKiAyO1xuICB9XG5cbiAgLy8gYWRkcyBhbm90aGVyIG1hdHJpeCB0byB0aGlzIG9uZSBpbiBwbGFjZVxuICBwdWJsaWMgYWRkKG90aGVyOiBEaXN0YW5jZU1hdHJpeCkge1xuICAgIGlmICh0aGlzLl9zaXplICE9PSBvdGhlci5fc2l6ZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWF0cmljZXMgbXVzdCBoYXZlIHRoZSBzYW1lIHNpemUuIFRoaXMgc2l6ZTogJHt0aGlzLl9zaXplfSwgb3RoZXIgc2l6ZTogJHtvdGhlci5fc2l6ZX1gKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2RhdGEubGVuZ3RoOyBpKyspXG4gICAgICB0aGlzLl9kYXRhW2ldICs9IG90aGVyLl9kYXRhW2ldO1xuICB9XG5cbiAgLy8gc3F1YXJlIHJvb3QgZWFjaCB2YWx1ZSBpbiBtYXRyaXggaW4gcGxhY2VcbiAgcHVibGljIHNxcnQoKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9kYXRhLmxlbmd0aDsgaSsrKVxuICAgICAgdGhpcy5fZGF0YVtpXSA9IE1hdGguc3FydCh0aGlzLl9kYXRhW2ldKTtcbiAgfVxuXG4gIC8vbm9ybWlsemUgZGlzdGFuY2UgbWF0cml4IGluIHBsYWNlXG4gIHB1YmxpYyBub3JtYWxpemUoKSB7XG4gICAgbGV0IG1pbiA9IDA7XG4gICAgbGV0IG1heCA9IHRoaXMuX2RhdGFbMF07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9kYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5fZGF0YVtpXSA8IG1pbilcbiAgICAgICAgbWluID0gdGhpcy5fZGF0YVtpXTtcbiAgICAgIGlmICh0aGlzLl9kYXRhW2ldID4gbWF4KVxuICAgICAgICBtYXggPSB0aGlzLl9kYXRhW2ldO1xuICAgIH1cbiAgICBjb25zdCByYW5nZSA9IG1heCAtIG1pbjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2RhdGEubGVuZ3RoOyBpKyspXG4gICAgICB0aGlzLl9kYXRhW2ldID0gcmFuZ2UgPT09IDAgPyB0aGlzLl9kYXRhW2ldIC0gbWluIDogKHRoaXMuX2RhdGFbaV0gLSBtaW4pIC8gKG1heCAtIG1pbik7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbmRleGFibGU8VE9iaj4ge1xuICBbaW5kZXg6IG51bWJlcl06IFRPYmo7XG4gIGdldCBsZW5ndGgoKTogbnVtYmVyO1xufVxuIl19","import { DimensionalityReducer } from '../reduce-dimensionality';\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(columnData, method, measure, options, parallelDistanceWorkers) {\n const reducer = new DimensionalityReducer(columnData, method, measure, options);\n return await reducer.transform(true, parallelDistanceWorkers);\n}\nself.onmessage = async ({ data: { columnData, method, measure, options, parallelDistanceWorkers } }) => {\n let data;\n try {\n data = await onMessage(columnData, method, measure, options, parallelDistanceWorkers);\n }\n catch (e) {\n data = { error: e };\n }\n self.postMessage({\n error: data.error,\n distance: data.distance,\n embedding: data.embedding,\n });\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGltZW5zaW9uYWxpdHktcmVkdWNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImRpbWVuc2lvbmFsaXR5LXJlZHVjZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLHFCQUFxQixFQUFlLE1BQU0sMEJBQTBCLENBQUM7QUFHN0U7Ozs7Ozs7OztHQVNHO0FBQ0gsS0FBSyxVQUFVLFNBQVMsQ0FBQyxVQUFpQixFQUFFLE1BQW9CLEVBQUUsT0FBcUIsRUFDckYsT0FBYSxFQUFFLHVCQUFpQztJQUNoRCxNQUFNLE9BQU8sR0FBRyxJQUFJLHFCQUFxQixDQUN2QyxVQUFVLEVBQ1YsTUFBTSxFQUNOLE9BQU8sRUFDUCxPQUFPLENBQ1IsQ0FBQztJQUNGLE9BQU8sTUFBTSxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO0FBQ2hFLENBQUM7QUFFRCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssRUFBRSxFQUFDLElBQUksRUFBRSxFQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSx1QkFBdUIsRUFBQyxFQUFDLEVBQUUsRUFBRTtJQUNqRyxJQUFJLElBQW9ELENBQUM7SUFDekQsSUFBSTtRQUNGLElBQUksR0FBRyxNQUFNLFNBQVMsQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztLQUN2RjtJQUFDLE9BQU8sQ0FBTSxFQUFFO1FBQ2YsSUFBSSxHQUFHLEVBQUMsS0FBSyxFQUFFLENBQUMsRUFBQyxDQUFDO0tBQ25CO0lBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUNmLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztRQUNqQixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7UUFDdkIsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO0tBQzFCLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RGltZW5zaW9uYWxpdHlSZWR1Y2VyLCBLbm93bk1ldGhvZHN9IGZyb20gJy4uL3JlZHVjZS1kaW1lbnNpb25hbGl0eSc7XG5pbXBvcnQge0tub3duTWV0cmljc30gZnJvbSAnLi4vdHlwZWQtbWV0cmljcy90eXBlZC1tZXRyaWNzJztcblxuLyoqXG4gKiBXb3JrZXIgdGhyZWFkIHJlY2VpdmluZyBkYXRhIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7YW55W119IGNvbHVtbkRhdGEgU2FtcGxlcyB0byBwcm9jZXNzLlxuICogQHBhcmFtIHtLbm93bk1ldGhvZHN9IG1ldGhvZCBFbWJlZGRpbmcgbWV0aG9kLlxuICogQHBhcmFtIHtLbm93bk1ldHJpY3N9IG1lYXN1cmUgRGlzdGFuY2UgbWV0cmljLlxuICogQHBhcmFtIHthbnl9IG9wdGlvbnMgT3B0aW9ucyB0byBwYXNzIHRvIGFsZ29yaXRobS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gcGFyYWxsZWxEaXN0YW5jZVdvcmtlcnMgV2hldGhlciB0byB1c2UgcGFyYWxsZWwgZGlzdGFuY2Ugd29ya2Vycy5cbiAqIEByZXR1cm4ge2FueX0gRW1iZWRkaW5nIChhbmQgZGlzdGFuY2UgbWF0cml4IHdoZXJlIGFwcGxpY2FibGUpLlxuICovXG5hc3luYyBmdW5jdGlvbiBvbk1lc3NhZ2UoY29sdW1uRGF0YTogYW55W10sIG1ldGhvZDogS25vd25NZXRob2RzLCBtZWFzdXJlOiBLbm93bk1ldHJpY3MsXG4gIG9wdGlvbnM/OiBhbnksIHBhcmFsbGVsRGlzdGFuY2VXb3JrZXJzPzogYm9vbGVhbik6IFByb21pc2U8e2Rpc3RhbmNlPzogYW55LCBlbWJlZGRpbmc/OiBhbnl9PiB7XG4gIGNvbnN0IHJlZHVjZXIgPSBuZXcgRGltZW5zaW9uYWxpdHlSZWR1Y2VyKFxuICAgIGNvbHVtbkRhdGEsXG4gICAgbWV0aG9kLFxuICAgIG1lYXN1cmUsXG4gICAgb3B0aW9ucyxcbiAgKTtcbiAgcmV0dXJuIGF3YWl0IHJlZHVjZXIudHJhbnNmb3JtKHRydWUsIHBhcmFsbGVsRGlzdGFuY2VXb3JrZXJzKTtcbn1cblxuc2VsZi5vbm1lc3NhZ2UgPSBhc3luYyAoe2RhdGE6IHtjb2x1bW5EYXRhLCBtZXRob2QsIG1lYXN1cmUsIG9wdGlvbnMsIHBhcmFsbGVsRGlzdGFuY2VXb3JrZXJzfX0pID0+IHtcbiAgbGV0IGRhdGE6IHtlcnJvcj86IGFueSwgZGlzdGFuY2U/OiBhbnksIGVtYmVkZGluZz86IGFueX07XG4gIHRyeSB7XG4gICAgZGF0YSA9IGF3YWl0IG9uTWVzc2FnZShjb2x1bW5EYXRhLCBtZXRob2QsIG1lYXN1cmUsIG9wdGlvbnMsIHBhcmFsbGVsRGlzdGFuY2VXb3JrZXJzKTtcbiAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgZGF0YSA9IHtlcnJvcjogZX07XG4gIH1cbiAgc2VsZi5wb3N0TWVzc2FnZSh7XG4gICAgZXJyb3I6IGRhdGEuZXJyb3IsXG4gICAgZGlzdGFuY2U6IGRhdGEuZGlzdGFuY2UsXG4gICAgZW1iZWRkaW5nOiBkYXRhLmVtYmVkZGluZyxcbiAgfSk7XG59O1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TSNE = void 0;\nvar tsne_1 = require(\"./tsne\");\nObject.defineProperty(exports, \"TSNE\", { enumerable: true, get: function () { return tsne_1.TSNE; } });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TSNE = void 0;\nclass TSNE {\n constructor(opt) {\n // return 0 mean unit standard deviation random number\n this.returnV = false;\n this.vValue = 0.0;\n this.iter = 0;\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 }\n assert(condition, message) {\n if (!condition) {\n throw message || 'Assertion failed';\n }\n }\n // syntax sugar\n getopt(opt, field, defaultval) {\n if (opt.hasOwnProperty(field)) {\n return opt[field];\n }\n else {\n return defaultval;\n }\n }\n gaussRandom() {\n if (this.returnV) {\n this.returnV = false;\n return this.vValue;\n }\n const u = 2 * Math.random() - 1;\n const v = 2 * Math.random() - 1;\n const r = u * u + v * v;\n if (r === 0 || r > 1) {\n return this.gaussRandom();\n }\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) { return mu + this.gaussRandom() * std; }\n // utilitity that creates contiguous vector of zeros of size n\n zeros(n) {\n if (typeof (n) === 'undefined' || isNaN(n)) {\n return [];\n }\n if (typeof ArrayBuffer === 'undefined') {\n // lacking browser support\n const arr = new Array(n);\n for (let i = 0; i < n; i++) {\n arr[i] = 0;\n }\n return arr;\n }\n else {\n return new Float64Array(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 = [];\n for (let i = 0; i < n; i++) {\n const xhere = [];\n for (let j = 0; j < d; j++) {\n if (uses) {\n xhere.push(s);\n }\n else {\n xhere.push(this.randn(0.0, 1e-4));\n }\n }\n x.push(xhere);\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 // compute (p_{i|j} + p_{j|i})/(2n)\n d2p(D, perplexity, tol) {\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 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 = 50;\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 let pj = Math.exp(-D[i * n + j] * beta);\n if (i === j) {\n pj = 0;\n } // we dont care about diagonals\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 }\n else {\n pj = prow[j] / psum;\n }\n prow[j] = pj;\n if (pj > 1e-7) {\n nHere -= pj * Math.log(pj);\n }\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 }\n else {\n beta = (beta + betamax) / 2;\n }\n }\n else {\n // converse case. make distrubtion less peaky\n betamax = beta;\n if (betamin === -Infinity) {\n beta = beta / 2;\n }\n else {\n beta = (beta + betamin) / 2;\n }\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 }\n if (num >= maxtries) {\n done = true;\n }\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 }\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 }\n return pOut;\n }\n // helper function\n sign(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; }\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); // 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) {\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 const dists = 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 = D[i][j];\n dists[i * N + j] = d;\n dists[j * N + i] = d;\n }\n }\n this.P = this.d2p(dists, this.perplexity, 1e-4);\n this.N = N;\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;\n } // 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 }\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 // 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 const 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 let dsum = 0.0;\n for (let d = 0; d < dim; d++) {\n const dhere = Y[i][d] - Y[j][d];\n dsum += dhere * dhere;\n }\n const qu = 1.0 / (1.0 + dsum); // Student t-distribution\n quArr[i * N + j] = qu;\n 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 for (let q = 0; q < NN; q++) {\n Q[q] = Math.max(quArr[q] / qsum, 1e-100);\n }\n let cost = 0.0;\n const grad = [];\n for (let i = 0; i < N; i++) {\n const gsum = new Array(dim); // init grad for point i\n for (let d = 0; d < dim; d++) {\n gsum[d] = 0.0;\n }\n for (let j = 0; j < N; j++) {\n cost += -P[i * N + j] * Math.log(Q[i * N + j]); // accumulate cost (the non-constant portion at least...)\n const premult = 4 * (pmul * P[i * N + j] - Q[i * N + j]) * quArr[i * N + j];\n for (let d = 0; d < dim; d++) {\n gsum[d] += premult * (Y[i][d] - Y[j][d]);\n }\n }\n grad.push(gsum);\n }\n return { cost, grad };\n }\n}\nexports.TSNE = TSNE;\n","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","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","\"use strict\";\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n result[\"default\"] = mod;\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils = __importStar(require(\"./utils\"));\nfunction makeHeap(nPoints, size) {\n var makeArrays = function (fillValue) {\n return utils.empty(nPoints).map(function () {\n return utils.filled(size, fillValue);\n });\n };\n var heap = [];\n heap.push(makeArrays(-1));\n heap.push(makeArrays(Infinity));\n heap.push(makeArrays(0));\n return heap;\n}\nexports.makeHeap = makeHeap;\nfunction rejectionSample(nSamples, poolSize, random) {\n var result = utils.zeros(nSamples);\n for (var i = 0; i < nSamples; i++) {\n var rejectSample = true;\n var j = 0;\n while (rejectSample) {\n j = utils.tauRandInt(poolSize, random);\n var broken = false;\n for (var 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}\nexports.rejectionSample = rejectionSample;\nfunction heapPush(heap, row, weight, index, flag) {\n row = Math.floor(row);\n var indices = heap[0][row];\n var weights = heap[1][row];\n var isNew = heap[2][row];\n if (weight >= weights[0]) {\n return 0;\n }\n for (var i = 0; i < indices.length; i++) {\n if (index === indices[i]) {\n return 0;\n }\n }\n return uncheckedHeapPush(heap, row, weight, index, flag);\n}\nexports.heapPush = heapPush;\nfunction uncheckedHeapPush(heap, row, weight, index, flag) {\n var indices = heap[0][row];\n var weights = heap[1][row];\n var isNew = heap[2][row];\n if (weight >= weights[0]) {\n return 0;\n }\n weights[0] = weight;\n indices[0] = index;\n isNew[0] = flag;\n var i = 0;\n var iSwap = 0;\n while (true) {\n var ic1 = 2 * i + 1;\n var ic2 = ic1 + 1;\n var 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 }\n else {\n break;\n }\n }\n else if (weights[ic1] >= weights[ic2]) {\n if (weight < weights[ic1]) {\n iSwap = ic1;\n }\n else {\n break;\n }\n }\n else {\n if (weight < weights[ic2]) {\n iSwap = ic2;\n }\n else {\n break;\n }\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}\nexports.uncheckedHeapPush = uncheckedHeapPush;\nfunction buildCandidates(currentGraph, nVertices, nNeighbors, maxCandidates, random) {\n var candidateNeighbors = makeHeap(nVertices, maxCandidates);\n for (var i = 0; i < nVertices; i++) {\n for (var j = 0; j < nNeighbors; j++) {\n if (currentGraph[0][i][j] < 0) {\n continue;\n }\n var idx = currentGraph[0][i][j];\n var isn = currentGraph[2][i][j];\n var 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}\nexports.buildCandidates = buildCandidates;\nfunction deheapSort(heap) {\n var indices = heap[0];\n var weights = heap[1];\n for (var i = 0; i < indices.length; i++) {\n var indHeap = indices[i];\n var distHeap = weights[i];\n for (var j = 0; j < indHeap.length - 1; j++) {\n var indHeapIndex = indHeap.length - j - 1;\n var distHeapIndex = distHeap.length - j - 1;\n var temp1 = indHeap[0];\n indHeap[0] = indHeap[indHeapIndex];\n indHeap[indHeapIndex] = temp1;\n var temp2 = distHeap[0];\n distHeap[0] = distHeap[distHeapIndex];\n distHeap[distHeapIndex] = temp2;\n siftDown(distHeap, indHeap, distHeapIndex, 0);\n }\n }\n return { indices: indices, weights: weights };\n}\nexports.deheapSort = deheapSort;\nfunction siftDown(heap1, heap2, ceiling, elt) {\n while (elt * 2 + 1 < ceiling) {\n var leftChild = elt * 2 + 1;\n var rightChild = leftChild + 1;\n var swap = elt;\n if (heap1[swap] < heap1[leftChild]) {\n swap = leftChild;\n }\n if (rightChild < ceiling && heap1[swap] < heap1[rightChild]) {\n swap = rightChild;\n }\n if (swap === elt) {\n break;\n }\n else {\n var temp1 = heap1[elt];\n heap1[elt] = heap1[swap];\n heap1[swap] = temp1;\n var temp2 = heap2[elt];\n heap2[elt] = heap2[swap];\n heap2[swap] = temp2;\n elt = swap;\n }\n }\n}\nfunction smallestFlagged(heap, row) {\n var ind = heap[0][row];\n var dist = heap[1][row];\n var flag = heap[2][row];\n var minDist = Infinity;\n var resultIndex = -1;\n for (var 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}\nexports.smallestFlagged = smallestFlagged;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar umap_1 = require(\"./umap\");\nexports.UMAP = umap_1.UMAP;\n","\"use strict\";\nvar __read = (this && this.__read) || function (o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n};\nvar __values = (this && this.__values) || function (o) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator], i = 0;\n if (m) return m.call(o);\n return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n};\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n result[\"default\"] = mod;\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar _a;\nvar utils = __importStar(require(\"./utils\"));\nvar SparseMatrix = (function () {\n function SparseMatrix(rows, cols, values, dims) {\n this.entries = new Map();\n this.nRows = 0;\n this.nCols = 0;\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 this.nRows = dims[0];\n this.nCols = dims[1];\n for (var i = 0; i < values.length; i++) {\n var row = rows[i];\n var col = cols[i];\n this.checkDims(row, col);\n var key = this.makeKey(row, col);\n this.entries.set(key, { value: values[i], row: row, col: col });\n }\n }\n SparseMatrix.prototype.makeKey = function (row, col) {\n return row + \":\" + col;\n };\n SparseMatrix.prototype.checkDims = function (row, col) {\n var 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 };\n SparseMatrix.prototype.set = function (row, col, value) {\n this.checkDims(row, col);\n var key = this.makeKey(row, col);\n if (!this.entries.has(key)) {\n this.entries.set(key, { value: value, row: row, col: col });\n }\n else {\n this.entries.get(key).value = value;\n }\n };\n SparseMatrix.prototype.get = function (row, col, defaultValue) {\n if (defaultValue === void 0) { defaultValue = 0; }\n this.checkDims(row, col);\n var key = this.makeKey(row, col);\n if (this.entries.has(key)) {\n return this.entries.get(key).value;\n }\n else {\n return defaultValue;\n }\n };\n SparseMatrix.prototype.getAll = function (ordered) {\n if (ordered === void 0) { ordered = true; }\n var rowColValues = [];\n this.entries.forEach(function (value) {\n rowColValues.push(value);\n });\n if (ordered) {\n rowColValues.sort(function (a, b) {\n if (a.row === b.row) {\n return a.col - b.col;\n }\n else {\n return a.row - b.row;\n }\n });\n }\n return rowColValues;\n };\n SparseMatrix.prototype.getDims = function () {\n return [this.nRows, this.nCols];\n };\n SparseMatrix.prototype.getRows = function () {\n return Array.from(this.entries, function (_a) {\n var _b = __read(_a, 2), key = _b[0], value = _b[1];\n return value.row;\n });\n };\n SparseMatrix.prototype.getCols = function () {\n return Array.from(this.entries, function (_a) {\n var _b = __read(_a, 2), key = _b[0], value = _b[1];\n return value.col;\n });\n };\n SparseMatrix.prototype.getValues = function () {\n return Array.from(this.entries, function (_a) {\n var _b = __read(_a, 2), key = _b[0], value = _b[1];\n return value.value;\n });\n };\n SparseMatrix.prototype.forEach = function (fn) {\n this.entries.forEach(function (value) { return fn(value.value, value.row, value.col); });\n };\n SparseMatrix.prototype.map = function (fn) {\n var vals = [];\n this.entries.forEach(function (value) {\n vals.push(fn(value.value, value.row, value.col));\n });\n var dims = [this.nRows, this.nCols];\n return new SparseMatrix(this.getRows(), this.getCols(), vals, dims);\n };\n SparseMatrix.prototype.toArray = function () {\n var _this = this;\n var rows = utils.empty(this.nRows);\n var output = rows.map(function () {\n return utils.zeros(_this.nCols);\n });\n this.entries.forEach(function (value) {\n output[value.row][value.col] = value.value;\n });\n return output;\n };\n return SparseMatrix;\n}());\nexports.SparseMatrix = SparseMatrix;\nfunction transpose(matrix) {\n var cols = [];\n var rows = [];\n var vals = [];\n matrix.forEach(function (value, row, col) {\n cols.push(row);\n rows.push(col);\n vals.push(value);\n });\n var dims = [matrix.nCols, matrix.nRows];\n return new SparseMatrix(rows, cols, vals, dims);\n}\nexports.transpose = transpose;\nfunction identity(size) {\n var _a = __read(size, 1), rows = _a[0];\n var matrix = new SparseMatrix([], [], [], size);\n for (var i = 0; i < rows; i++) {\n matrix.set(i, i, 1);\n }\n return matrix;\n}\nexports.identity = identity;\nfunction pairwiseMultiply(a, b) {\n return elementWise(a, b, function (x, y) { return x * y; });\n}\nexports.pairwiseMultiply = pairwiseMultiply;\nfunction add(a, b) {\n return elementWise(a, b, function (x, y) { return x + y; });\n}\nexports.add = add;\nfunction subtract(a, b) {\n return elementWise(a, b, function (x, y) { return x - y; });\n}\nexports.subtract = subtract;\nfunction maximum(a, b) {\n return elementWise(a, b, function (x, y) { return (x > y ? x : y); });\n}\nexports.maximum = maximum;\nfunction multiplyScalar(a, scalar) {\n return a.map(function (value) {\n return value * scalar;\n });\n}\nexports.multiplyScalar = multiplyScalar;\nfunction eliminateZeros(m) {\n var zeroIndices = new Set();\n var values = m.getValues();\n var rows = m.getRows();\n var cols = m.getCols();\n for (var i = 0; i < values.length; i++) {\n if (values[i] === 0) {\n zeroIndices.add(i);\n }\n }\n var removeByZeroIndex = function (_, index) { return !zeroIndices.has(index); };\n var nextValues = values.filter(removeByZeroIndex);\n var nextRows = rows.filter(removeByZeroIndex);\n var nextCols = cols.filter(removeByZeroIndex);\n return new SparseMatrix(nextRows, nextCols, nextValues, m.getDims());\n}\nexports.eliminateZeros = eliminateZeros;\nfunction normalize(m, normType) {\n if (normType === void 0) { normType = \"l2\"; }\n var e_1, _a;\n var normFn = normFns[normType];\n var colsByRow = new Map();\n m.forEach(function (_, row, col) {\n var cols = colsByRow.get(row) || [];\n cols.push(col);\n colsByRow.set(row, cols);\n });\n var nextMatrix = new SparseMatrix([], [], [], m.getDims());\n var _loop_1 = function (row) {\n var cols = colsByRow.get(row).sort();\n var vals = cols.map(function (col) { return m.get(row, col); });\n var norm = normFn(vals);\n for (var i = 0; i < norm.length; i++) {\n nextMatrix.set(row, cols[i], norm[i]);\n }\n };\n try {\n for (var _b = __values(colsByRow.keys()), _c = _b.next(); !_c.done; _c = _b.next()) {\n var row = _c.value;\n _loop_1(row);\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n }\n finally { if (e_1) throw e_1.error; }\n }\n return nextMatrix;\n}\nexports.normalize = normalize;\nvar normFns = (_a = {},\n _a[\"max\"] = function (xs) {\n var max = -Infinity;\n for (var i = 0; i < xs.length; i++) {\n max = xs[i] > max ? xs[i] : max;\n }\n return xs.map(function (x) { return x / max; });\n },\n _a[\"l1\"] = function (xs) {\n var sum = 0;\n for (var i = 0; i < xs.length; i++) {\n sum += xs[i];\n }\n return xs.map(function (x) { return x / sum; });\n },\n _a[\"l2\"] = function (xs) {\n var sum = 0;\n for (var i = 0; i < xs.length; i++) {\n sum += Math.pow(xs[i], 2);\n }\n return xs.map(function (x) { return Math.sqrt(Math.pow(x, 2) / sum); });\n },\n _a);\nfunction elementWise(a, b, op) {\n var visited = new Set();\n var rows = [];\n var cols = [];\n var vals = [];\n var operate = function (row, col) {\n rows.push(row);\n cols.push(col);\n var nextValue = op(a.get(row, col), b.get(row, col));\n vals.push(nextValue);\n };\n var valuesA = a.getValues();\n var rowsA = a.getRows();\n var colsA = a.getCols();\n for (var i = 0; i < valuesA.length; i++) {\n var row = rowsA[i];\n var col = colsA[i];\n var key = row + \":\" + col;\n visited.add(key);\n operate(row, col);\n }\n var valuesB = b.getValues();\n var rowsB = b.getRows();\n var colsB = b.getCols();\n for (var i = 0; i < valuesB.length; i++) {\n var row = rowsB[i];\n var col = colsB[i];\n var key = row + \":\" + col;\n if (visited.has(key))\n continue;\n operate(row, col);\n }\n var dims = [a.nRows, a.nCols];\n return new SparseMatrix(rows, cols, vals, dims);\n}\nfunction getCSR(x) {\n var entries = [];\n x.forEach(function (value, row, col) {\n entries.push({ value: value, row: row, col: col });\n });\n entries.sort(function (a, b) {\n if (a.row === b.row) {\n return a.col - b.col;\n }\n else {\n return a.row - b.row;\n }\n });\n var indices = [];\n var values = [];\n var indptr = [];\n var currentRow = -1;\n for (var i = 0; i < entries.length; i++) {\n var _a = entries[i], row = _a.row, col = _a.col, value = _a.value;\n if (row !== currentRow) {\n currentRow = row;\n indptr.push(i);\n }\n indices.push(col);\n values.push(value);\n }\n return { indices: indices, values: values, indptr: indptr };\n}\nexports.getCSR = getCSR;\n","\"use strict\";\nvar __values = (this && this.__values) || function (o) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator], i = 0;\n if (m) return m.call(o);\n return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n};\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n result[\"default\"] = mod;\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar heap = __importStar(require(\"./heap\"));\nvar matrix = __importStar(require(\"./matrix\"));\nvar tree = __importStar(require(\"./tree\"));\nvar utils = __importStar(require(\"./utils\"));\nfunction makeNNDescent(distanceFn, random) {\n return function nNDescent(data, leafArray, nNeighbors, nIters, maxCandidates, delta, rho, rpTreeInit) {\n if (nIters === void 0) { nIters = 10; }\n if (maxCandidates === void 0) { maxCandidates = 50; }\n if (delta === void 0) { delta = 0.001; }\n if (rho === void 0) { rho = 0.5; }\n if (rpTreeInit === void 0) { rpTreeInit = true; }\n var nVertices = data.length;\n var currentGraph = heap.makeHeap(data.length, nNeighbors);\n for (var i = 0; i < data.length; i++) {\n var indices = heap.rejectionSample(nNeighbors, data.length, random);\n for (var j = 0; j < indices.length; j++) {\n var 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 (var n = 0; n < leafArray.length; n++) {\n for (var i = 0; i < leafArray[n].length; i++) {\n if (leafArray[n][i] < 0) {\n break;\n }\n for (var j = i + 1; j < leafArray[n].length; j++) {\n if (leafArray[n][j] < 0) {\n break;\n }\n var 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 (var n = 0; n < nIters; n++) {\n var candidateNeighbors = heap.buildCandidates(currentGraph, nVertices, nNeighbors, maxCandidates, random);\n var c = 0;\n for (var i = 0; i < nVertices; i++) {\n for (var j = 0; j < maxCandidates; j++) {\n var p = Math.floor(candidateNeighbors[0][i][j]);\n if (p < 0 || utils.tauRand(random) < rho) {\n continue;\n }\n for (var k = 0; k < maxCandidates; k++) {\n var q = Math.floor(candidateNeighbors[0][i][k]);\n var cj = candidateNeighbors[2][i][j];\n var ck = candidateNeighbors[2][i][k];\n if (q < 0 || (!cj && !ck)) {\n continue;\n }\n var 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 }\n var sorted = heap.deheapSort(currentGraph);\n return sorted;\n };\n}\nexports.makeNNDescent = makeNNDescent;\nfunction makeInitializations(distanceFn) {\n function initFromRandom(nNeighbors, data, queryPoints, _heap, random) {\n for (var i = 0; i < queryPoints.length; i++) {\n var indices = utils.rejectionSample(nNeighbors, data.length, random);\n for (var j = 0; j < indices.length; j++) {\n if (indices[j] < 0) {\n continue;\n }\n var 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 (var i = 0; i < queryPoints.length; i++) {\n var indices = tree.searchFlatTree(queryPoints[i], _tree, random);\n for (var j = 0; j < indices.length; j++) {\n if (indices[j] < 0) {\n return;\n }\n var d = distanceFn(data[indices[j]], queryPoints[i]);\n heap.heapPush(_heap, i, d, indices[j], 1);\n }\n }\n return;\n }\n return { initFromRandom: initFromRandom, initFromTree: initFromTree };\n}\nexports.makeInitializations = makeInitializations;\nfunction makeInitializedNNSearch(distanceFn) {\n return function nnSearchFn(data, graph, initialization, queryPoints) {\n var e_1, _a;\n var _b = matrix.getCSR(graph), indices = _b.indices, indptr = _b.indptr;\n for (var i = 0; i < queryPoints.length; i++) {\n var tried = new Set(initialization[0][i]);\n while (true) {\n var vertex = heap.smallestFlagged(initialization, i);\n if (vertex === -1) {\n break;\n }\n var candidates = indices.slice(indptr[vertex], indptr[vertex + 1]);\n try {\n for (var candidates_1 = __values(candidates), candidates_1_1 = candidates_1.next(); !candidates_1_1.done; candidates_1_1 = candidates_1.next()) {\n var candidate = candidates_1_1.value;\n if (candidate === vertex ||\n candidate === -1 ||\n tried.has(candidate)) {\n continue;\n }\n var d = distanceFn(data[candidate], queryPoints[i]);\n heap.uncheckedHeapPush(initialization, i, d, candidate, 1);\n tried.add(candidate);\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (candidates_1_1 && !candidates_1_1.done && (_a = candidates_1.return)) _a.call(candidates_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n }\n }\n return initialization;\n };\n}\nexports.makeInitializedNNSearch = makeInitializedNNSearch;\nfunction initializeSearch(forest, data, queryPoints, nNeighbors, initFromRandom, initFromTree, random) {\n var e_2, _a;\n var results = heap.makeHeap(queryPoints.length, nNeighbors);\n initFromRandom(nNeighbors, data, queryPoints, results, random);\n if (forest) {\n try {\n for (var forest_1 = __values(forest), forest_1_1 = forest_1.next(); !forest_1_1.done; forest_1_1 = forest_1.next()) {\n var tree_1 = forest_1_1.value;\n initFromTree(tree_1, data, queryPoints, results, random);\n }\n }\n catch (e_2_1) { e_2 = { error: e_2_1 }; }\n finally {\n try {\n if (forest_1_1 && !forest_1_1.done && (_a = forest_1.return)) _a.call(forest_1);\n }\n finally { if (e_2) throw e_2.error; }\n }\n }\n return results;\n}\nexports.initializeSearch = initializeSearch;\n","\"use strict\";\nvar __read = (this && this.__read) || function (o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n};\nvar __spread = (this && this.__spread) || function () {\n for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i]));\n return ar;\n};\nvar __values = (this && this.__values) || function (o) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator], i = 0;\n if (m) return m.call(o);\n return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n};\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n result[\"default\"] = mod;\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils = __importStar(require(\"./utils\"));\nvar FlatTree = (function () {\n function FlatTree(hyperplanes, offsets, children, indices) {\n this.hyperplanes = hyperplanes;\n this.offsets = offsets;\n this.children = children;\n this.indices = indices;\n }\n return FlatTree;\n}());\nexports.FlatTree = FlatTree;\nfunction makeForest(data, nNeighbors, nTrees, random) {\n var leafSize = Math.max(10, nNeighbors);\n var trees = utils\n .range(nTrees)\n .map(function (_, i) { return makeTree(data, leafSize, i, random); });\n var forest = trees.map(function (tree) { return flattenTree(tree, leafSize); });\n return forest;\n}\nexports.makeForest = makeForest;\nfunction makeTree(data, leafSize, n, random) {\n if (leafSize === void 0) { leafSize = 30; }\n var indices = utils.range(data.length);\n var tree = makeEuclideanTree(data, indices, leafSize, n, random);\n return tree;\n}\nfunction makeEuclideanTree(data, indices, leafSize, q, random) {\n if (leafSize === void 0) { leafSize = 30; }\n if (indices.length > leafSize) {\n var splitResults = euclideanRandomProjectionSplit(data, indices, random);\n var indicesLeft = splitResults.indicesLeft, indicesRight = splitResults.indicesRight, hyperplane = splitResults.hyperplane, offset = splitResults.offset;\n var leftChild = makeEuclideanTree(data, indicesLeft, leafSize, q + 1, random);\n var rightChild = makeEuclideanTree(data, indicesRight, leafSize, q + 1, random);\n var node = { leftChild: leftChild, rightChild: rightChild, isLeaf: false, hyperplane: hyperplane, offset: offset };\n return node;\n }\n else {\n var node = { indices: indices, isLeaf: true };\n return node;\n }\n}\nfunction euclideanRandomProjectionSplit(data, indices, random) {\n var dim = data[0].length;\n var leftIndex = utils.tauRandInt(indices.length, random);\n var rightIndex = utils.tauRandInt(indices.length, random);\n rightIndex += leftIndex === rightIndex ? 1 : 0;\n rightIndex = rightIndex % indices.length;\n var left = indices[leftIndex];\n var right = indices[rightIndex];\n var hyperplaneOffset = 0;\n var hyperplaneVector = utils.zeros(dim);\n for (var i = 0; i < hyperplaneVector.length; i++) {\n hyperplaneVector[i] = data[left][i] - data[right][i];\n hyperplaneOffset -=\n (hyperplaneVector[i] * (data[left][i] + data[right][i])) / 2.0;\n }\n var nLeft = 0;\n var nRight = 0;\n var side = utils.zeros(indices.length);\n for (var i = 0; i < indices.length; i++) {\n var margin = hyperplaneOffset;\n for (var d = 0; d < dim; d++) {\n margin += hyperplaneVector[d] * data[indices[i]][d];\n }\n if (margin === 0) {\n side[i] = utils.tauRandInt(2, random);\n if (side[i] === 0) {\n nLeft += 1;\n }\n else {\n nRight += 1;\n }\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 var indicesLeft = utils.zeros(nLeft);\n var indicesRight = utils.zeros(nRight);\n nLeft = 0;\n nRight = 0;\n for (var 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: indicesLeft,\n indicesRight: indicesRight,\n hyperplane: hyperplaneVector,\n offset: hyperplaneOffset,\n };\n}\nfunction flattenTree(tree, leafSize) {\n var nNodes = numNodes(tree);\n var nLeaves = numLeaves(tree);\n var hyperplanes = utils\n .range(nNodes)\n .map(function () { return utils.zeros(tree.hyperplane ? tree.hyperplane.length : 0); });\n var offsets = utils.zeros(nNodes);\n var children = utils.range(nNodes).map(function () { return [-1, -1]; });\n var indices = utils\n .range(nLeaves)\n .map(function () { return utils.range(leafSize).map(function () { return -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 var _a;\n if (tree.isLeaf) {\n children[nodeNum][0] = -leafNum;\n (_a = indices[leafNum]).splice.apply(_a, __spread([0, tree.indices.length], tree.indices));\n leafNum += 1;\n return { nodeNum: nodeNum, leafNum: leafNum };\n }\n else {\n hyperplanes[nodeNum] = tree.hyperplane;\n offsets[nodeNum] = tree.offset;\n children[nodeNum][0] = nodeNum + 1;\n var oldNodeNum = nodeNum;\n var 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 }\n else {\n return 1 + numNodes(tree.leftChild) + numNodes(tree.rightChild);\n }\n}\nfunction numLeaves(tree) {\n if (tree.isLeaf) {\n return 1;\n }\n else {\n return numLeaves(tree.leftChild) + numLeaves(tree.rightChild);\n }\n}\nfunction makeLeafArray(rpForest) {\n var e_1, _a;\n if (rpForest.length > 0) {\n var output = [];\n try {\n for (var rpForest_1 = __values(rpForest), rpForest_1_1 = rpForest_1.next(); !rpForest_1_1.done; rpForest_1_1 = rpForest_1.next()) {\n var tree = rpForest_1_1.value;\n output.push.apply(output, __spread(tree.indices));\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (rpForest_1_1 && !rpForest_1_1.done && (_a = rpForest_1.return)) _a.call(rpForest_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n return output;\n }\n else {\n return [[-1]];\n }\n}\nexports.makeLeafArray = makeLeafArray;\nfunction selectSide(hyperplane, offset, point, random) {\n var margin = offset;\n for (var d = 0; d < point.length; d++) {\n margin += hyperplane[d] * point[d];\n }\n if (margin === 0) {\n var 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}\nfunction searchFlatTree(point, tree, random) {\n var node = 0;\n while (tree.children[node][0] > 0) {\n var side = selectSide(tree.hyperplanes[node], tree.offsets[node], point, random);\n if (side === 0) {\n node = tree.children[node][0];\n }\n else {\n node = tree.children[node][1];\n }\n }\n var index = -1 * tree.children[node][0];\n return tree.indices[index];\n}\nexports.searchFlatTree = searchFlatTree;\n","\"use strict\";\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __generator = (this && this.__generator) || function (thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (_) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n};\nvar __read = (this && this.__read) || function (o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n};\nvar __spread = (this && this.__spread) || function () {\n for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i]));\n return ar;\n};\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n result[\"default\"] = mod;\n return result;\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar heap = __importStar(require(\"./heap\"));\nvar matrix = __importStar(require(\"./matrix\"));\nvar nnDescent = __importStar(require(\"./nn_descent\"));\nvar tree = __importStar(require(\"./tree\"));\nvar utils = __importStar(require(\"./utils\"));\nvar ml_levenberg_marquardt_1 = __importDefault(require(\"ml-levenberg-marquardt\"));\nvar SMOOTH_K_TOLERANCE = 1e-5;\nvar MIN_K_DIST_SCALE = 1e-3;\nvar UMAP = (function () {\n function UMAP(params) {\n if (params === void 0) { params = {}; }\n var _this = this;\n this.learningRate = 1.0;\n this.localConnectivity = 1.0;\n this.minDist = 0.1;\n this.nComponents = 2;\n this.nEpochs = 0;\n this.nNeighbors = 15;\n this.negativeSampleRate = 5;\n this.random = Math.random;\n this.repulsionStrength = 1.0;\n this.setOpMixRatio = 1.0;\n this.spread = 1.0;\n this.transformQueueSize = 4.0;\n this.targetMetric = \"categorical\";\n this.targetWeight = 0.5;\n this.targetNNeighbors = this.nNeighbors;\n this.distanceFn = euclidean;\n this.isInitialized = false;\n this.rpForest = [];\n this.embedding = [];\n this.optimizationState = new OptimizationState();\n var setParam = function (key) {\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 }\n UMAP.prototype.fit = function (X) {\n this.initializeFit(X);\n this.optimizeLayout();\n return this.embedding;\n };\n UMAP.prototype.fitAsync = function (X, callback) {\n if (callback === void 0) { callback = function () { return true; }; }\n return __awaiter(this, void 0, void 0, function () {\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n this.initializeFit(X);\n return [4, this.optimizeLayoutAsync(callback)];\n case 1:\n _a.sent();\n return [2, this.embedding];\n }\n });\n });\n };\n UMAP.prototype.setSupervisedProjection = function (Y, params) {\n if (params === void 0) { 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 UMAP.prototype.setPrecomputedKNN = function (knnIndices, knnDistances) {\n this.knnIndices = knnIndices;\n this.knnDistances = knnDistances;\n };\n UMAP.prototype.initializeFit = function (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 }\n if (this.X === X && this.isInitialized) {\n return this.getNEpochs();\n }\n this.X = X;\n if (!this.knnIndices && !this.knnDistances) {\n var 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 this.makeSearchFns();\n this.searchGraph = this.makeSearchGraph(X);\n this.processGraphForSupervisedProjection();\n var _a = this.initializeSimplicialSetEmbedding(), head = _a.head, tail = _a.tail, epochsPerSample = _a.epochsPerSample;\n this.optimizationState.head = head;\n this.optimizationState.tail = tail;\n this.optimizationState.epochsPerSample = epochsPerSample;\n this.initializeOptimization();\n this.prepareForOptimizationLoop();\n this.isInitialized = true;\n return this.getNEpochs();\n };\n UMAP.prototype.makeSearchFns = function () {\n var _a = nnDescent.makeInitializations(this.distanceFn), initFromTree = _a.initFromTree, initFromRandom = _a.initFromRandom;\n this.initFromTree = initFromTree;\n this.initFromRandom = initFromRandom;\n this.search = nnDescent.makeInitializedNNSearch(this.distanceFn);\n };\n UMAP.prototype.makeSearchGraph = function (X) {\n var knnIndices = this.knnIndices;\n var knnDistances = this.knnDistances;\n var dims = [X.length, X.length];\n var searchGraph = new matrix.SparseMatrix([], [], [], dims);\n for (var i = 0; i < knnIndices.length; i++) {\n var knn = knnIndices[i];\n var distances = knnDistances[i];\n for (var j = 0; j < knn.length; j++) {\n var neighbor = knn[j];\n var distance = distances[j];\n if (distance > 0) {\n searchGraph.set(i, neighbor, distance);\n }\n }\n }\n var transpose = matrix.transpose(searchGraph);\n return matrix.maximum(searchGraph, transpose);\n };\n UMAP.prototype.transform = function (toTransform) {\n var _this = this;\n var rawData = this.X;\n if (rawData === undefined || rawData.length === 0) {\n throw new Error('No data has been fit.');\n }\n var nNeighbors = Math.floor(this.nNeighbors * this.transformQueueSize);\n nNeighbors = Math.min(rawData.length, nNeighbors);\n var init = nnDescent.initializeSearch(this.rpForest, rawData, toTransform, nNeighbors, this.initFromRandom, this.initFromTree, this.random);\n var result = this.search(rawData, this.searchGraph, init, toTransform);\n var _a = heap.deheapSort(result), indices = _a.indices, distances = _a.weights;\n indices = indices.map(function (x) { return x.slice(0, _this.nNeighbors); });\n distances = distances.map(function (x) { return x.slice(0, _this.nNeighbors); });\n var adjustedLocalConnectivity = Math.max(0, this.localConnectivity - 1);\n var _b = this.smoothKNNDistance(distances, this.nNeighbors, adjustedLocalConnectivity), sigmas = _b.sigmas, rhos = _b.rhos;\n var _c = this.computeMembershipStrengths(indices, distances, sigmas, rhos), rows = _c.rows, cols = _c.cols, vals = _c.vals;\n var size = [toTransform.length, rawData.length];\n var graph = new matrix.SparseMatrix(rows, cols, vals, size);\n var normed = matrix.normalize(graph, \"l1\");\n var csrMatrix = matrix.getCSR(normed);\n var nPoints = toTransform.length;\n var eIndices = utils.reshape2d(csrMatrix.indices, nPoints, this.nNeighbors);\n var eWeights = utils.reshape2d(csrMatrix.values, nPoints, this.nNeighbors);\n var embedding = initTransform(eIndices, eWeights, this.embedding);\n var nEpochs = this.nEpochs\n ? this.nEpochs / 3\n : graph.nRows <= 10000\n ? 100\n : 30;\n var graphMax = graph\n .getValues()\n .reduce(function (max, val) { return (val > max ? val : max); }, 0);\n graph = graph.map(function (value) { return (value < graphMax / nEpochs ? 0 : value); });\n graph = matrix.eliminateZeros(graph);\n var epochsPerSample = this.makeEpochsPerSample(graph.getValues(), nEpochs);\n var head = graph.getRows();\n var tail = graph.getCols();\n this.assignOptimizationStateParameters({\n headEmbedding: embedding,\n tailEmbedding: this.embedding,\n head: head,\n tail: tail,\n currentEpoch: 0,\n nEpochs: nEpochs,\n nVertices: graph.getDims()[1],\n epochsPerSample: epochsPerSample,\n });\n this.prepareForOptimizationLoop();\n return this.optimizeLayout();\n };\n UMAP.prototype.processGraphForSupervisedProjection = function () {\n var _a = this, Y = _a.Y, X = _a.X;\n if (Y) {\n if (Y.length !== X.length) {\n throw new Error('Length of X and y must be equal');\n }\n if (this.targetMetric === \"categorical\") {\n var lt = this.targetWeight < 1.0;\n var farDist = lt ? 2.5 * (1.0 / (1.0 - this.targetWeight)) : 1.0e12;\n this.graph = this.categoricalSimplicialSetIntersection(this.graph, Y, farDist);\n }\n }\n };\n UMAP.prototype.step = function () {\n var currentEpoch = this.optimizationState.currentEpoch;\n if (currentEpoch < this.getNEpochs()) {\n this.optimizeLayoutStep(currentEpoch);\n }\n return this.optimizationState.currentEpoch;\n };\n UMAP.prototype.getEmbedding = function () {\n return this.embedding;\n };\n UMAP.prototype.nearestNeighbors = function (X) {\n var _a = this, distanceFn = _a.distanceFn, nNeighbors = _a.nNeighbors;\n var log2 = function (n) { return Math.log(n) / Math.log(2); };\n var metricNNDescent = nnDescent.makeNNDescent(distanceFn, this.random);\n var round = function (n) {\n return n === 0.5 ? 0 : Math.round(n);\n };\n var nTrees = 5 + Math.floor(round(Math.pow(X.length, 0.5) / 20.0));\n var nIters = Math.max(5, Math.floor(Math.round(log2(X.length))));\n this.rpForest = tree.makeForest(X, nNeighbors, nTrees, this.random);\n var leafArray = tree.makeLeafArray(this.rpForest);\n var _b = metricNNDescent(X, leafArray, nNeighbors, nIters), indices = _b.indices, weights = _b.weights;\n return { knnIndices: indices, knnDistances: weights };\n };\n UMAP.prototype.fuzzySimplicialSet = function (X, nNeighbors, setOpMixRatio) {\n if (setOpMixRatio === void 0) { setOpMixRatio = 1.0; }\n var _a = this, _b = _a.knnIndices, knnIndices = _b === void 0 ? [] : _b, _c = _a.knnDistances, knnDistances = _c === void 0 ? [] : _c, localConnectivity = _a.localConnectivity;\n var _d = this.smoothKNNDistance(knnDistances, nNeighbors, localConnectivity), sigmas = _d.sigmas, rhos = _d.rhos;\n var _e = this.computeMembershipStrengths(knnIndices, knnDistances, sigmas, rhos), rows = _e.rows, cols = _e.cols, vals = _e.vals;\n var size = [X.length, X.length];\n var sparseMatrix = new matrix.SparseMatrix(rows, cols, vals, size);\n var transpose = matrix.transpose(sparseMatrix);\n var prodMatrix = matrix.pairwiseMultiply(sparseMatrix, transpose);\n var a = matrix.subtract(matrix.add(sparseMatrix, transpose), prodMatrix);\n var b = matrix.multiplyScalar(a, setOpMixRatio);\n var c = matrix.multiplyScalar(prodMatrix, 1.0 - setOpMixRatio);\n var result = matrix.add(b, c);\n return result;\n };\n UMAP.prototype.categoricalSimplicialSetIntersection = function (simplicialSet, target, farDist, unknownDist) {\n if (unknownDist === void 0) { unknownDist = 1.0; }\n var intersection = fastIntersection(simplicialSet, target, unknownDist, farDist);\n intersection = matrix.eliminateZeros(intersection);\n return resetLocalConnectivity(intersection);\n };\n UMAP.prototype.smoothKNNDistance = function (distances, k, localConnectivity, nIter, bandwidth) {\n if (localConnectivity === void 0) { localConnectivity = 1.0; }\n if (nIter === void 0) { nIter = 64; }\n if (bandwidth === void 0) { bandwidth = 1.0; }\n var target = (Math.log(k) / Math.log(2)) * bandwidth;\n var rho = utils.zeros(distances.length);\n var result = utils.zeros(distances.length);\n for (var i = 0; i < distances.length; i++) {\n var lo = 0.0;\n var hi = Infinity;\n var mid = 1.0;\n var ithDistances = distances[i];\n var nonZeroDists = ithDistances.filter(function (d) { return d > 0.0; });\n if (nonZeroDists.length >= localConnectivity) {\n var index = Math.floor(localConnectivity);\n var 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 (var n = 0; n < nIter; n++) {\n var psum = 0.0;\n for (var j = 1; j < distances[i].length; j++) {\n var d = distances[i][j] - rho[i];\n if (d > 0) {\n psum += Math.exp(-(d / mid));\n }\n else {\n psum += 1.0;\n }\n }\n if (Math.abs(psum - target) < SMOOTH_K_TOLERANCE) {\n break;\n }\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 }\n else {\n mid = (lo + hi) / 2.0;\n }\n }\n }\n result[i] = mid;\n if (rho[i] > 0.0) {\n var meanIthDistances = utils.mean(ithDistances);\n if (result[i] < MIN_K_DIST_SCALE * meanIthDistances) {\n result[i] = MIN_K_DIST_SCALE * meanIthDistances;\n }\n }\n else {\n var 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 }\n return { sigmas: result, rhos: rho };\n };\n UMAP.prototype.computeMembershipStrengths = function (knnIndices, knnDistances, sigmas, rhos) {\n var nSamples = knnIndices.length;\n var nNeighbors = knnIndices[0].length;\n var rows = utils.zeros(nSamples * nNeighbors);\n var cols = utils.zeros(nSamples * nNeighbors);\n var vals = utils.zeros(nSamples * nNeighbors);\n for (var i = 0; i < nSamples; i++) {\n for (var j = 0; j < nNeighbors; j++) {\n var val = 0;\n if (knnIndices[i][j] === -1) {\n continue;\n }\n if (knnIndices[i][j] === i) {\n val = 0.0;\n }\n else if (knnDistances[i][j] - rhos[i] <= 0.0) {\n val = 1.0;\n }\n else {\n val = Math.exp(-((knnDistances[i][j] - rhos[i]) / sigmas[i]));\n }\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: rows, cols: cols, vals: vals };\n };\n UMAP.prototype.initializeSimplicialSetEmbedding = function () {\n var _this = this;\n var nEpochs = this.getNEpochs();\n var nComponents = this.nComponents;\n var graphValues = this.graph.getValues();\n var graphMax = 0;\n for (var i = 0; i < graphValues.length; i++) {\n var value = graphValues[i];\n if (graphMax < graphValues[i]) {\n graphMax = value;\n }\n }\n var graph = this.graph.map(function (value) {\n if (value < graphMax / nEpochs) {\n return 0;\n }\n else {\n return value;\n }\n });\n this.embedding = utils.zeros(graph.nRows).map(function () {\n return utils.zeros(nComponents).map(function () {\n return utils.tauRand(_this.random) * 20 + -10;\n });\n });\n var weights = [];\n var head = [];\n var tail = [];\n var rowColValues = graph.getAll();\n for (var i = 0; i < rowColValues.length; i++) {\n var 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 var epochsPerSample = this.makeEpochsPerSample(weights, nEpochs);\n return { head: head, tail: tail, epochsPerSample: epochsPerSample };\n };\n UMAP.prototype.makeEpochsPerSample = function (weights, nEpochs) {\n var result = utils.filled(weights.length, -1.0);\n var max = utils.max(weights);\n var nSamples = weights.map(function (w) { return (w / max) * nEpochs; });\n nSamples.forEach(function (n, i) {\n if (n > 0)\n result[i] = nEpochs / nSamples[i];\n });\n return result;\n };\n UMAP.prototype.assignOptimizationStateParameters = function (state) {\n Object.assign(this.optimizationState, state);\n };\n UMAP.prototype.prepareForOptimizationLoop = function () {\n var _a = this, repulsionStrength = _a.repulsionStrength, learningRate = _a.learningRate, negativeSampleRate = _a.negativeSampleRate;\n var _b = this.optimizationState, epochsPerSample = _b.epochsPerSample, headEmbedding = _b.headEmbedding, tailEmbedding = _b.tailEmbedding;\n var dim = headEmbedding[0].length;\n var moveOther = headEmbedding.length === tailEmbedding.length;\n var epochsPerNegativeSample = epochsPerSample.map(function (e) { return e / negativeSampleRate; });\n var epochOfNextNegativeSample = __spread(epochsPerNegativeSample);\n var epochOfNextSample = __spread(epochsPerSample);\n this.assignOptimizationStateParameters({\n epochOfNextSample: epochOfNextSample,\n epochOfNextNegativeSample: epochOfNextNegativeSample,\n epochsPerNegativeSample: epochsPerNegativeSample,\n moveOther: moveOther,\n initialAlpha: learningRate,\n alpha: learningRate,\n gamma: repulsionStrength,\n dim: dim,\n });\n };\n UMAP.prototype.initializeOptimization = function () {\n var headEmbedding = this.embedding;\n var tailEmbedding = this.embedding;\n var _a = this.optimizationState, head = _a.head, tail = _a.tail, epochsPerSample = _a.epochsPerSample;\n var nEpochs = this.getNEpochs();\n var nVertices = this.graph.nCols;\n var _b = findABParams(this.spread, this.minDist), a = _b.a, b = _b.b;\n this.assignOptimizationStateParameters({\n headEmbedding: headEmbedding,\n tailEmbedding: tailEmbedding,\n head: head,\n tail: tail,\n epochsPerSample: epochsPerSample,\n a: a,\n b: b,\n nEpochs: nEpochs,\n nVertices: nVertices,\n });\n };\n UMAP.prototype.optimizeLayoutStep = function (n) {\n var optimizationState = this.optimizationState;\n var head = optimizationState.head, tail = optimizationState.tail, headEmbedding = optimizationState.headEmbedding, tailEmbedding = optimizationState.tailEmbedding, epochsPerSample = optimizationState.epochsPerSample, epochOfNextSample = optimizationState.epochOfNextSample, epochOfNextNegativeSample = optimizationState.epochOfNextNegativeSample, epochsPerNegativeSample = optimizationState.epochsPerNegativeSample, moveOther = optimizationState.moveOther, initialAlpha = optimizationState.initialAlpha, alpha = optimizationState.alpha, gamma = optimizationState.gamma, a = optimizationState.a, b = optimizationState.b, dim = optimizationState.dim, nEpochs = optimizationState.nEpochs, nVertices = optimizationState.nVertices;\n var clipValue = 4.0;\n for (var i = 0; i < epochsPerSample.length; i++) {\n if (epochOfNextSample[i] > n) {\n continue;\n }\n var j = head[i];\n var k = tail[i];\n var current = headEmbedding[j];\n var other = tailEmbedding[k];\n var distSquared = rDist(current, other);\n var 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 (var d = 0; d < dim; d++) {\n var gradD = clip(gradCoeff * (current[d] - other[d]), clipValue);\n current[d] += gradD * alpha;\n if (moveOther) {\n other[d] += -gradD * alpha;\n }\n }\n epochOfNextSample[i] += epochsPerSample[i];\n var nNegSamples = Math.floor((n - epochOfNextNegativeSample[i]) / epochsPerNegativeSample[i]);\n for (var p = 0; p < nNegSamples; p++) {\n var k_1 = utils.tauRandInt(nVertices, this.random);\n var other_1 = tailEmbedding[k_1];\n var distSquared_1 = rDist(current, other_1);\n var gradCoeff_1 = 0.0;\n if (distSquared_1 > 0.0) {\n gradCoeff_1 = 2.0 * gamma * b;\n gradCoeff_1 /=\n (0.001 + distSquared_1) * (a * Math.pow(distSquared_1, b) + 1);\n }\n else if (j === k_1) {\n continue;\n }\n for (var d = 0; d < dim; d++) {\n var gradD = 4.0;\n if (gradCoeff_1 > 0.0) {\n gradD = clip(gradCoeff_1 * (current[d] - other_1[d]), clipValue);\n }\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 UMAP.prototype.optimizeLayoutAsync = function (epochCallback) {\n var _this = this;\n if (epochCallback === void 0) { epochCallback = function () { return true; }; }\n return new Promise(function (resolve, reject) {\n var step = function () { return __awaiter(_this, void 0, void 0, function () {\n var _a, nEpochs, currentEpoch, epochCompleted, shouldStop, isFinished;\n return __generator(this, function (_b) {\n try {\n _a = this.optimizationState, nEpochs = _a.nEpochs, currentEpoch = _a.currentEpoch;\n this.embedding = this.optimizeLayoutStep(currentEpoch);\n epochCompleted = this.optimizationState.currentEpoch;\n shouldStop = epochCallback(epochCompleted) === false;\n isFinished = epochCompleted === nEpochs;\n if (!shouldStop && !isFinished) {\n setTimeout(function () { return step(); }, 0);\n }\n else {\n return [2, resolve(isFinished)];\n }\n }\n catch (err) {\n reject(err);\n }\n return [2];\n });\n }); };\n setTimeout(function () { return step(); }, 0);\n });\n };\n UMAP.prototype.optimizeLayout = function (epochCallback) {\n if (epochCallback === void 0) { epochCallback = function () { return true; }; }\n var isFinished = false;\n var embedding = [];\n while (!isFinished) {\n var _a = this.optimizationState, nEpochs = _a.nEpochs, currentEpoch = _a.currentEpoch;\n embedding = this.optimizeLayoutStep(currentEpoch);\n var epochCompleted = this.optimizationState.currentEpoch;\n var shouldStop = epochCallback(epochCompleted) === false;\n isFinished = epochCompleted === nEpochs || shouldStop;\n }\n return embedding;\n };\n UMAP.prototype.getNEpochs = function () {\n var graph = this.graph;\n if (this.nEpochs > 0) {\n return this.nEpochs;\n }\n var length = graph.nRows;\n if (length <= 2500) {\n return 500;\n }\n else if (length <= 5000) {\n return 400;\n }\n else if (length <= 7500) {\n return 300;\n }\n else {\n return 200;\n }\n };\n return UMAP;\n}());\nexports.UMAP = UMAP;\nfunction euclidean(x, y) {\n var result = 0;\n for (var i = 0; i < x.length; i++) {\n result += Math.pow((x[i] - y[i]), 2);\n }\n return Math.sqrt(result);\n}\nexports.euclidean = euclidean;\nfunction cosine(x, y) {\n var result = 0.0;\n var normX = 0.0;\n var normY = 0.0;\n for (var i = 0; i < x.length; i++) {\n result += x[i] * y[i];\n normX += Math.pow(x[i], 2);\n normY += Math.pow(y[i], 2);\n }\n if (normX === 0 && normY === 0) {\n return 0;\n }\n else if (normX === 0 || normY === 0) {\n return 1.0;\n }\n else {\n return 1.0 - result / Math.sqrt(normX * normY);\n }\n}\nexports.cosine = cosine;\nvar OptimizationState = (function () {\n function OptimizationState() {\n this.currentEpoch = 0;\n this.headEmbedding = [];\n this.tailEmbedding = [];\n this.head = [];\n this.tail = [];\n this.epochsPerSample = [];\n this.epochOfNextSample = [];\n this.epochOfNextNegativeSample = [];\n this.epochsPerNegativeSample = [];\n this.moveOther = true;\n this.initialAlpha = 1.0;\n this.alpha = 1.0;\n this.gamma = 1.0;\n this.a = 1.5769434603113077;\n this.b = 0.8950608779109733;\n this.dim = 2;\n this.nEpochs = 500;\n this.nVertices = 0;\n }\n return OptimizationState;\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}\nfunction rDist(x, y) {\n var result = 0.0;\n for (var i = 0; i < x.length; i++) {\n result += Math.pow(x[i] - y[i], 2);\n }\n return result;\n}\nfunction findABParams(spread, minDist) {\n var curve = function (_a) {\n var _b = __read(_a, 2), a = _b[0], b = _b[1];\n return function (x) {\n return 1.0 / (1.0 + a * Math.pow(x, (2 * b)));\n };\n };\n var xv = utils\n .linear(0, spread * 3, 300)\n .map(function (val) { return (val < minDist ? 1.0 : val); });\n var yv = utils.zeros(xv.length).map(function (val, index) {\n var gte = xv[index] >= minDist;\n return gte ? Math.exp(-(xv[index] - minDist) / spread) : val;\n });\n var initialValues = [0.5, 0.5];\n var data = { x: xv, y: yv };\n var options = {\n damping: 1.5,\n initialValues: initialValues,\n gradientDifference: 10e-2,\n maxIterations: 100,\n errorTolerance: 10e-3,\n };\n var parameterValues = ml_levenberg_marquardt_1.default(data, curve, options).parameterValues;\n var _a = __read(parameterValues, 2), a = _a[0], b = _a[1];\n return { a: a, b: b };\n}\nexports.findABParams = findABParams;\nfunction fastIntersection(graph, target, unknownDist, farDist) {\n if (unknownDist === void 0) { unknownDist = 1.0; }\n if (farDist === void 0) { farDist = 5.0; }\n return graph.map(function (value, row, col) {\n if (target[row] === -1 || target[col] === -1) {\n return value * Math.exp(-unknownDist);\n }\n else if (target[row] !== target[col]) {\n return value * Math.exp(-farDist);\n }\n else {\n return value;\n }\n });\n}\nexports.fastIntersection = fastIntersection;\nfunction resetLocalConnectivity(simplicialSet) {\n simplicialSet = matrix.normalize(simplicialSet, \"max\");\n var transpose = matrix.transpose(simplicialSet);\n var prodMatrix = matrix.pairwiseMultiply(transpose, simplicialSet);\n simplicialSet = matrix.add(simplicialSet, matrix.subtract(transpose, prodMatrix));\n return matrix.eliminateZeros(simplicialSet);\n}\nexports.resetLocalConnectivity = resetLocalConnectivity;\nfunction initTransform(indices, weights, embedding) {\n var result = utils\n .zeros(indices.length)\n .map(function (z) { return utils.zeros(embedding[0].length); });\n for (var i = 0; i < indices.length; i++) {\n for (var j = 0; j < indices[0].length; j++) {\n for (var d = 0; d < embedding[0].length; d++) {\n var a = indices[i][j];\n result[i][d] += weights[i][j] * embedding[a][d];\n }\n }\n }\n return result;\n}\nexports.initTransform = initTransform;\n","\"use strict\";\nvar __values = (this && this.__values) || function (o) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator], i = 0;\n if (m) return m.call(o);\n return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nfunction tauRandInt(n, random) {\n return Math.floor(random() * n);\n}\nexports.tauRandInt = tauRandInt;\nfunction tauRand(random) {\n return random();\n}\nexports.tauRand = tauRand;\nfunction norm(vec) {\n var e_1, _a;\n var result = 0;\n try {\n for (var vec_1 = __values(vec), vec_1_1 = vec_1.next(); !vec_1_1.done; vec_1_1 = vec_1.next()) {\n var item = vec_1_1.value;\n result += Math.pow(item, 2);\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (vec_1_1 && !vec_1_1.done && (_a = vec_1.return)) _a.call(vec_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n return Math.sqrt(result);\n}\nexports.norm = norm;\nfunction empty(n) {\n var output = [];\n for (var i = 0; i < n; i++) {\n output.push(undefined);\n }\n return output;\n}\nexports.empty = empty;\nfunction range(n) {\n return empty(n).map(function (_, i) { return i; });\n}\nexports.range = range;\nfunction filled(n, v) {\n return empty(n).map(function () { return v; });\n}\nexports.filled = filled;\nfunction zeros(n) {\n return filled(n, 0);\n}\nexports.zeros = zeros;\nfunction ones(n) {\n return filled(n, 1);\n}\nexports.ones = ones;\nfunction linear(a, b, len) {\n return empty(len).map(function (_, i) {\n return a + i * ((b - a) / (len - 1));\n });\n}\nexports.linear = linear;\nfunction sum(input) {\n return input.reduce(function (sum, val) { return sum + val; });\n}\nexports.sum = sum;\nfunction mean(input) {\n return sum(input) / input.length;\n}\nexports.mean = mean;\nfunction max(input) {\n var max = 0;\n for (var i = 0; i < input.length; i++) {\n max = input[i] > max ? input[i] : max;\n }\n return max;\n}\nexports.max = max;\nfunction max2d(input) {\n var max = 0;\n for (var i = 0; i < input.length; i++) {\n for (var j = 0; j < input[i].length; j++) {\n max = input[i][j] > max ? input[i][j] : max;\n }\n }\n return max;\n}\nexports.max2d = max2d;\nfunction rejectionSample(nSamples, poolSize, random) {\n var result = zeros(nSamples);\n for (var i = 0; i < nSamples; i++) {\n var rejectSample = true;\n while (rejectSample) {\n var j = tauRandInt(poolSize, random);\n var broken = false;\n for (var 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 }\n return result;\n}\nexports.rejectionSample = rejectionSample;\nfunction reshape2d(x, a, b) {\n var rows = [];\n var count = 0;\n var index = 0;\n if (x.length !== a * b) {\n throw new Error('Array dimensions must match input length.');\n }\n for (var i = 0; i < a; i++) {\n var col = [];\n for (var 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}\nexports.reshape2d = reshape2d;\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n// the startup function\n__webpack_require__.x = () => {\n\t// Load entry module and return exports\n\t// This entry module depends on other loaded chunks and execution need to be delayed\n\tvar __webpack_exports__ = __webpack_require__.O(undefined, [1,452], () => (__webpack_require__(1729)))\n\t__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n\treturn __webpack_exports__;\n};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".js\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) {\n\t\t\tvar i = scripts.length - 1;\n\t\t\twhile (i > -1 && !scriptUrl) scriptUrl = scripts[i--].src;\n\t\t}\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","__webpack_require__.b = self.location + \"\";\n\n// object to store loaded chunks\n// \"1\" means \"already loaded\"\nvar installedChunks = {\n\t729: 1\n};\n\n// importScripts chunk loading\nvar installChunk = (data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\tfor(var moduleId in moreModules) {\n\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t}\n\t}\n\tif(runtime) runtime(__webpack_require__);\n\twhile(chunkIds.length)\n\t\tinstalledChunks[chunkIds.pop()] = 1;\n\tparentChunkLoadingFunction(data);\n};\n__webpack_require__.f.i = (chunkId, promises) => {\n\t// \"1\" is the signal for \"already loaded\"\n\tif(!installedChunks[chunkId]) {\n\t\tif(true) { // all chunks have JS\n\t\t\timportScripts(__webpack_require__.p + __webpack_require__.u(chunkId));\n\t\t}\n\t}\n};\n\nvar chunkLoadingGlobal = self[\"webpackChunkbio\"] = self[\"webpackChunkbio\"] || [];\nvar parentChunkLoadingFunction = chunkLoadingGlobal.push.bind(chunkLoadingGlobal);\nchunkLoadingGlobal.push = installChunk;\n\n// no HMR\n\n// no HMR manifest","// run startup\nvar __webpack_exports__ = __webpack_require__.x();\n"],"names":["deferred","next","StringMetricsNames","VectorMetricsNames","BitArrayMetricsNames","DistanceMetricsSubjects","NumberMetricsNames","randomFloat","range","Math","random","floor","assert","condition","message","Error","vectorAdd","p","q","multiplier","nItems","length","total","i","fillRandomMatrix","dimension1","dimension2","scale","matrix","fill","Array","map","initCoordinates","j","calculateEuclideanDistance","sqdiffSumm","v","itemsSum","vectorSquare","sqrt","dmLinearIndex","size","DistanceMatrixService","constructor","useConcurrentWorkers","terminateOnComplete","threadCount","navigator","hardwareConcurrency","this","_workerCount","max","_workers","Worker","URL","_terminateOnComplete","async","values","fnName","normalize","Promise","resolve","reject","len","promises","totalLength","min","chunkSize","distanceMatrix","Float32Array","endRow","endCol","lmin","lmax","Number","MIN_VALUE","start","end","startRow","startCol","postMessage","chunckSize","resolveWorker","rejectWorker","onmessage","data","error","distanceMatrixData","terminate","set","all","forEach","value","index","e","worker","SPEBase","options","steps","cycles","cutoff","lambda","dlambda","lambda2","dlambda2","epsilon","distanceFunction","distance","distanceFunctionName","vectors","dmIndexFunct","matrixService","calc","calcDistance","index1","index2","coordinates","dimension","initDistance","cycle","step","rowi","rowj","r","d","diffIJ","PSPEBase","OriginalSPE","super","radiusPercent","maxDistance","maxDistanceSteps","n","radius","vectorDistanceMetricsMethods","Euclidean","stringDistanceMetricsMethods","Levenshtein","JaroWinkler","Manhattan","s1","s2","dist","bitArrayDistanceMetricsMethods","Tanimoto","Dice","Asymmetric","BraunBlanquet","Cosine","Kulczynski","McConnaughey","RogotGoldberg","Russel","Sokal","Hamming","numberDistanceMetricsMethods","NumericDistance","AvailableMetrics","Vector","String","BitArray","MacroMolecule","HAMMING","LEVENSHTEIN","NEEDLEMANN_WUNSCH","MetricToDataType","Object","keys","reduce","ret","key","val","Measure","method","dataType","getMeasure","opts","dict","hasOwnProperty","name","toString","static","availableMeasures","arg","defaultValue","_length","_version","_updateLevel","_selectedCount","_selectedCountVersion","_selectedIndexesVersion","_versionedName","_versionedNameVersion","SHRINK_THRESHOLD","buff","_createBuffer","_data","Uint32Array","getRawData","assureGoez","num","argName","assureInRange","copy","src","dst","count","copyFrom","other","lengthInInts","buffer","version","incrementVersion","notify","versionedName","self","setLength","nIntsNeeded","newData","set1","set2","temp","flag","setBit","s","fromSeq","charAt","bytes","num1","num2","countBits","equals","getBit","clone","bitArray","from","init","setAll","invert","flags","setIndexes","indexes","clear","setFast","everyIndex","anyIndex","setWhere","check","allowClear","getRange","to","arr","push","fromValues","getRangeAsList","setRange","setTrue","setFalse","setRandom","k","and","andNot","notAnd","not","or","xor","insertAt","pos","oldlength","removeAt","contains","removeByMask","mask","dstIdx","srcIdx","findNext","bit","trueCount","falseCount","_onBitCount","remainingBits","countWhere","result","andWithCountBits","second","allTrue","allFalse","anyTrue","anyFalse","unusedBits","numInts","_firstOnBit","findPrev","_lastOnBit","Int8Array","DimReductionMethods","DistanceMatrix","_size","undefined","dataLength","_linearizeIJ","get","list","res","square","add","Reducer","AvailableReducers","distanceFn","distanceFname","dmIndexFunc","_","usingDistanceMatrix","preCalculateDistanceMatrix","_encodedDistanceMatrix","bind","_encodedDistance","nNeighbors","reducer","u","a","b","parallelDistanceWorkers","embedding","fit","iterations","matrixProxy","condensedArray","linearFunc","linearIndex","iNum","jNum","idx1Handler","target","idx1","_receiver","Proxy","idx2","idx2Handler","distanceMatrixProxy","initDataDist","getSolution","emb","embed","DimensionalityReducer","metric","measure","specOptions","nEpochs","transpose","transform","typeName","availableMethods","availableMetrics","ans","obj","array","columnData","onMessage","exports","tsne_1","defineProperty","enumerable","TSNE","opt","returnV","vValue","iter","perplexity","getopt","dim","field","defaultval","gaussRandom","c","log","randn","mu","std","zeros","isNaN","ArrayBuffer","Float64Array","randn2d","uses","x","xhere","L2","x1","x2","D","x1i","x2i","xtod","X","N","d2p","tol","nf","hTarget","P","prow","betamin","betamax","Infinity","beta","done","maxtries","psum","pj","exp","nHere","abs","pOut","N2","sign","initDataRaw","dists","initSolution","Y","gains","ystep","cg","costGrad","cost","grad","ymean","gid","sid","gainid","newgain","newsid","debugGrad","yold","cg0","cg1","analytic","numerical","console","pmul","quArr","qsum","dsum","dhere","qu","NN","Q","gsum","premult","prototype","isAnyArray","object","call","endsWith","errorCalculation","parameters","parameterizedFunction","func","y","rescale","input","output","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","rows","columns","maxI","maxJ","loop","line","formatNumber","join","inspectData","formatNumber2","padEnd","str","fix","toFixed","startsWith","toExponential","slice","checkRowIndex","outer","checkColumnIndex","checkRowVector","vector","to1DArray","checkColumnVector","checkRange","startColumn","endColumn","checkNumber","newArray","checkNonEmpty","isEmpty","AbstractMatrix","newRows","newColumns","newMatrix","Matrix","row","column","interval","round","l","matrix1","matrix2","checkMatrix","isMatrix","klass","apply","callback","to2DArray","toJSON","isRowVector","isColumnVector","isVector","isSquare","isSymmetric","isEchelonForm","previousColumn","checked","isReducedEchelonForm","echelonForm","h","iMax","swapRows","tmp","reducedEchelonForm","m","maxRow","pivot","setSubMatrix","neg","mulS","getRow","getRowVector","rowVector","setRow","row1","row2","getColumn","getColumnVector","columnVector","setColumn","swapColumns","column1","column2","addRowVector","subRowVector","mulRowVector","divRowVector","addColumnVector","subColumnVector","mulColumnVector","divColumnVector","mulRow","mulColumn","by","NaN","NEGATIVE_INFINITY","maxIndex","idx","POSITIVE_INFINITY","minIndex","maxRowIndex","minRow","minRowIndex","maxColumn","maxColumnIndex","minColumn","minColumnIndex","diag","norm","type","cumulativeSum","sum","dot","vector2","vector1","mmul","Bcolj","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","mat","cols","resultat","warn","blockMult","halfRows","parseInt","halfCols","subMatrix","sub","scaleRows","isFinite","scaleColumns","flipRows","middle","ceil","first","last","flipColumns","kroneckerProduct","kroneckerSum","AxI","eye","IxB","sortRows","compareFunction","compareNumbers","sort","sortColumns","subMatrixRow","indices","subMatrixColumn","selection","rowIndices","columnIndices","checkRowIndices","checkColumnIndices","rowIndex","columnIndex","trace","sumByRow","sumByColumn","sumAll","product","productByRow","productByColumn","productAll","mean","variance","unbiased","sum1","sum2","varianceByRow","varianceByColumn","varianceAll","standardDeviation","center","centerByRow","centerByColumn","centerAll","pow","getScaleByRow","scaleByRow","getScaleByColumn","scaleByColumn","divider","getScaleAll","scaleAll","Symbol","for","rand","randomInt","randInt","diagonal","identity","negate","tensorProduct","nRows","nColumns","arrayData","every","element","removeRow","splice","addRow","removeColumn","newRow","addColumn","addS","addM","subS","subM","subtract","subtractS","subtractM","mul","mulM","multiply","multiplyS","multiplyM","div","divS","divM","divide","divideS","divideM","mod","modS","modM","modulus","modulusS","modulusM","andS","andM","orS","orM","xorS","xorM","leftShift","leftShiftS","leftShiftM","signPropagatingRightShift","signPropagatingRightShiftS","signPropagatingRightShiftM","rightShift","rightShiftS","rightShiftM","zeroFillRightShift","zeroFillRightShiftS","zeroFillRightShiftM","acos","acosh","asin","asinh","atan","atanh","cbrt","clz32","cos","cosh","expm1","fround","log1p","log10","log2","sin","sinh","tan","tanh","trunc","arg0","powS","powM","installMathOperations","WrapperMatrix2D","LuDecomposition","t","LUcolj","kmax","lu","pivotVector","pivotSign","LU","isSingular","col","solve","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","eps","EPSILON","kase","alpha","ks","f","cs","sn","sp","spm1","epm1","sk","ek","shift","g","threshold","scols","Ls","rightSingularVectors","VL","vrows","urows","VLU","solveForDiagonal","inverse","vcols","ucols","norm2","rank","ii","leftSingularVectors","diagonalMatrix","params","damping","gradientDifference","evaluatedData","gradientFunc","paramFunction","param","auxParams","funcParam","point","gradientFunction","matrixFunc","matrixFunction","inverseMatrix","useSVD","leftHandSide","rightHandSide","levenbergMarquardt","maxIterations","errorTolerance","minValues","maxValues","initialValues","parLen","MAX_SAFE_INTEGER","MIN_SAFE_INTEGER","iteration","converged","parameterValues","parameterError","__importStar","__esModule","utils","makeHeap","nPoints","makeArrays","fillValue","empty","filled","heap","heapPush","weight","weights","uncheckedHeapPush","isNew","iSwap","ic1","ic2","heapShape2","siftDown","heap1","heap2","ceiling","elt","leftChild","rightChild","swap","temp1","temp2","rejectionSample","nSamples","poolSize","rejectSample","tauRandInt","broken","buildCandidates","currentGraph","nVertices","maxCandidates","candidateNeighbors","isn","tauRand","deheapSort","indHeap","distHeap","indHeapIndex","distHeapIndex","smallestFlagged","ind","minDist","resultIndex","umap_1","UMAP","_a","__read","o","iterator","ar","__values","SparseMatrix","dims","entries","Map","nCols","checkDims","makeKey","has","getAll","ordered","rowColValues","getDims","getRows","_b","getCols","getValues","fn","vals","toArray","_this","pairwiseMultiply","elementWise","maximum","multiplyScalar","scalar","eliminateZeros","zeroIndices","Set","removeByZeroIndex","nextValues","filter","nextRows","nextCols","normType","e_1","normFn","normFns","colsByRow","nextMatrix","_loop_1","_c","e_1_1","return","xs","op","visited","operate","nextValue","valuesA","rowsA","colsA","valuesB","rowsB","colsB","getCSR","indptr","currentRow","tree","makeNNDescent","leafArray","nIters","delta","rho","rpTreeInit","cj","ck","makeInitializations","initFromRandom","queryPoints","_heap","initFromTree","_tree","searchFlatTree","makeInitializedNNSearch","graph","initialization","tried","vertex","candidates","candidates_1","candidates_1_1","candidate","initializeSearch","forest","e_2","results","forest_1","forest_1_1","e_2_1","__spread","concat","FlatTree","hyperplanes","offsets","children","makeEuclideanTree","leafSize","splitResults","leftIndex","rightIndex","left","right","hyperplaneOffset","hyperplaneVector","nLeft","nRight","side","margin","indicesLeft","indicesRight","hyperplane","offset","euclideanRandomProjectionSplit","isLeaf","recursiveFlatten","nodeNum","leafNum","oldNodeNum","numNodes","numLeaves","selectSide","makeForest","nTrees","makeTree","nNodes","nLeaves","flattenTree","makeLeafArray","rpForest","rpForest_1","rpForest_1_1","node","__awaiter","thisArg","_arguments","generator","fulfilled","rejected","then","__generator","body","label","sent","trys","ops","verb","pop","__importDefault","nnDescent","ml_levenberg_marquardt_1","SMOOTH_K_TOLERANCE","MIN_K_DIST_SCALE","learningRate","localConnectivity","nComponents","negativeSampleRate","repulsionStrength","setOpMixRatio","spread","transformQueueSize","targetMetric","targetWeight","targetNNeighbors","euclidean","isInitialized","optimizationState","OptimizationState","setParam","initializeFit","optimizeLayout","fitAsync","optimizeLayoutAsync","setSupervisedProjection","setPrecomputedKNN","knnIndices","knnDistances","getNEpochs","knnResults","nearestNeighbors","fuzzySimplicialSet","makeSearchFns","searchGraph","makeSearchGraph","processGraphForSupervisedProjection","initializeSimplicialSetEmbedding","head","tail","epochsPerSample","initializeOptimization","prepareForOptimizationLoop","search","knn","distances","neighbor","toTransform","rawData","adjustedLocalConnectivity","smoothKNNDistance","sigmas","rhos","computeMembershipStrengths","normed","csrMatrix","initTransform","reshape2d","graphMax","makeEpochsPerSample","assignOptimizationStateParameters","headEmbedding","tailEmbedding","currentEpoch","farDist","categoricalSimplicialSetIntersection","optimizeLayoutStep","getEmbedding","metricNNDescent","_d","_e","sparseMatrix","prodMatrix","simplicialSet","unknownDist","intersection","fastIntersection","resetLocalConnectivity","nIter","bandwidth","lo","hi","mid","ithDistances","nonZeroDists","interpolation","meanIthDistances","meanDistances","graphValues","entry","w","state","assign","moveOther","epochsPerNegativeSample","epochOfNextNegativeSample","epochOfNextSample","initialAlpha","gamma","findABParams","current","distSquared","rDist","gradCoeff","gradD","clip","nNegSamples","k_1","other_1","distSquared_1","gradCoeff_1","epochCallback","epochCompleted","shouldStop","isFinished","setTimeout","err","cosine","normX","normY","clipValue","xv","linear","yv","default","z","vec","vec_1","vec_1_1","item","ones","max2d","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","module","__webpack_modules__","__webpack_exports__","O","chunkIds","priority","notFulfilled","definition","chunkId","globalThis","Function","window","prop","toStringTag","scriptUrl","importScripts","location","document","currentScript","scripts","getElementsByTagName","replace","installedChunks","chunkLoadingGlobal","parentChunkLoadingFunction","moreModules","runtime"],"sourceRoot":""}
|