mathjs 13.1.0 → 13.2.0

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.
Files changed (46) hide show
  1. package/HISTORY.md +30 -0
  2. package/bin/cli.js +24 -10
  3. package/lib/browser/math.js +1 -1
  4. package/lib/browser/math.js.LICENSE.txt +2 -2
  5. package/lib/browser/math.js.map +1 -1
  6. package/lib/cjs/core/function/typed.js +1 -0
  7. package/lib/cjs/expression/node/FunctionNode.js +9 -1
  8. package/lib/cjs/expression/parse.js +1 -1
  9. package/lib/cjs/expression/transform/filter.transform.js +28 -40
  10. package/lib/cjs/expression/transform/forEach.transform.js +29 -30
  11. package/lib/cjs/expression/transform/map.transform.js +8 -93
  12. package/lib/cjs/expression/transform/utils/transformCallback.js +101 -0
  13. package/lib/cjs/function/algebra/derivative.js +10 -11
  14. package/lib/cjs/function/matrix/filter.js +3 -2
  15. package/lib/cjs/function/matrix/forEach.js +3 -14
  16. package/lib/cjs/function/matrix/map.js +11 -33
  17. package/lib/cjs/header.js +2 -2
  18. package/lib/cjs/type/matrix/DenseMatrix.js +73 -29
  19. package/lib/cjs/type/matrix/SparseMatrix.js +7 -4
  20. package/lib/cjs/utils/array.js +22 -0
  21. package/lib/cjs/utils/customs.js +5 -12
  22. package/lib/cjs/utils/map.js +5 -3
  23. package/lib/cjs/utils/optimizeCallback.js +94 -0
  24. package/lib/cjs/version.js +1 -1
  25. package/lib/esm/core/function/typed.js +1 -0
  26. package/lib/esm/expression/node/FunctionNode.js +9 -1
  27. package/lib/esm/expression/parse.js +1 -1
  28. package/lib/esm/expression/transform/filter.transform.js +28 -40
  29. package/lib/esm/expression/transform/forEach.transform.js +29 -30
  30. package/lib/esm/expression/transform/map.transform.js +8 -93
  31. package/lib/esm/expression/transform/utils/transformCallback.js +95 -0
  32. package/lib/esm/function/algebra/derivative.js +10 -11
  33. package/lib/esm/function/matrix/filter.js +3 -2
  34. package/lib/esm/function/matrix/forEach.js +3 -14
  35. package/lib/esm/function/matrix/map.js +12 -34
  36. package/lib/esm/type/matrix/DenseMatrix.js +75 -32
  37. package/lib/esm/type/matrix/SparseMatrix.js +7 -4
  38. package/lib/esm/utils/array.js +21 -0
  39. package/lib/esm/utils/customs.js +5 -12
  40. package/lib/esm/utils/map.js +6 -4
  41. package/lib/esm/utils/optimizeCallback.js +88 -0
  42. package/lib/esm/version.js +1 -1
  43. package/package.json +7 -7
  44. package/types/index.d.ts +50 -12
  45. package/lib/cjs/utils/applyCallback.js +0 -73
  46. package/lib/esm/utils/applyCallback.js +0 -67
@@ -11,7 +11,9 @@ var _number = require("../../utils/number.js");
11
11
  var _object = require("../../utils/object.js");
12
12
  var _DimensionError = require("../../error/DimensionError.js");
13
13
  var _factory = require("../../utils/factory.js");
14
- var _applyCallback = require("../../utils/applyCallback.js");
14
+ var _optimizeCallback = require("../../utils/optimizeCallback.js");
15
+ // deno-lint-ignore-file no-this-alias
16
+
15
17
  const name = 'DenseMatrix';
16
18
  const dependencies = ['Matrix'];
17
19
  const createDenseMatrixClass = exports.createDenseMatrixClass = /* #__PURE__ */(0, _factory.factory)(name, dependencies, _ref => {
@@ -522,6 +524,66 @@ const createDenseMatrixClass = exports.createDenseMatrixClass = /* #__PURE__ */(
522
524
  return this._size.slice(0); // return a clone of _size
523
525
  };
524
526
 
527
+ /**
528
+ * Applies a callback function to a reference to each element of the matrix
529
+ * @memberof DenseMatrix
530
+ * @param {Function} callback The callback function is invoked with three
531
+ * parameters: an array, an integer index to that
532
+ * array, and the Matrix being traversed.
533
+ */
534
+ DenseMatrix.prototype._forEach = function (callback) {
535
+ // matrix instance
536
+ const me = this;
537
+ const s = me.size();
538
+
539
+ // if there is only one dimension, just loop through it
540
+ if (s.length === 1) {
541
+ for (let i = 0; i < s[0]; i++) {
542
+ callback(me._data, i, [i]);
543
+ }
544
+ return;
545
+ }
546
+
547
+ // keep track of the current index permutation
548
+ const index = Array(s.length).fill(0);
549
+
550
+ // store a reference of each dimension of the matrix for faster access
551
+ const data = Array(s.length - 1);
552
+ const last = data.length - 1;
553
+ data[0] = me._data[0];
554
+ for (let i = 0; i < last; i++) {
555
+ data[i + 1] = data[i][0];
556
+ }
557
+ index[last] = -1;
558
+ while (true) {
559
+ let i;
560
+ for (i = last; i >= 0; i--) {
561
+ // march index to the next permutation
562
+ index[i]++;
563
+ if (index[i] === s[i]) {
564
+ index[i] = 0;
565
+ continue;
566
+ }
567
+
568
+ // update references to matrix dimensions
569
+ data[i] = i === 0 ? me._data[index[i]] : data[i - 1][index[i]];
570
+ for (let j = i; j < last; j++) {
571
+ data[j + 1] = data[j][0];
572
+ }
573
+
574
+ // loop through the last dimension and map each value
575
+ for (let j = 0; j < s[data.length]; j++) {
576
+ index[data.length] = j;
577
+ callback(data[last], j, index.slice(0));
578
+ }
579
+ break;
580
+ }
581
+ if (i === -1) {
582
+ break;
583
+ }
584
+ }
585
+ };
586
+
525
587
  /**
526
588
  * Create a new matrix with the results of the callback function executed on
527
589
  * each entry of the matrix.
@@ -533,24 +595,13 @@ const createDenseMatrixClass = exports.createDenseMatrixClass = /* #__PURE__ */(
533
595
  * @return {DenseMatrix} matrix
534
596
  */
535
597
  DenseMatrix.prototype.map = function (callback) {
536
- // matrix instance
537
598
  const me = this;
538
- const recurse = function (value, index) {
539
- if ((0, _is.isArray)(value)) {
540
- return value.map(function (child, i) {
541
- return recurse(child, index.concat(i));
542
- });
543
- } else {
544
- // invoke the callback function with the right number of arguments
545
- return (0, _applyCallback.applyCallback)(callback, value, index, me, 'map');
546
- }
547
- };
548
-
549
- // determine the new datatype when the original matrix has datatype defined
550
- // TODO: should be done in matrix constructor instead
551
- const data = recurse(this._data, []);
552
- const datatype = this._datatype !== undefined ? (0, _array.getArrayDataType)(data, _is.typeOf) : undefined;
553
- return new DenseMatrix(data, datatype);
599
+ const result = new DenseMatrix(me);
600
+ const fastCallback = (0, _optimizeCallback.optimizeCallback)(callback, me._data, 'map');
601
+ result._forEach(function (arr, i, index) {
602
+ arr[i] = fastCallback(arr[i], index, me);
603
+ });
604
+ return result;
554
605
  };
555
606
 
556
607
  /**
@@ -561,18 +612,11 @@ const createDenseMatrixClass = exports.createDenseMatrixClass = /* #__PURE__ */(
561
612
  * of the element, and the Matrix being traversed.
562
613
  */
563
614
  DenseMatrix.prototype.forEach = function (callback) {
564
- // matrix instance
565
615
  const me = this;
566
- const recurse = function (value, index) {
567
- if ((0, _is.isArray)(value)) {
568
- value.forEach(function (child, i) {
569
- recurse(child, index.concat(i));
570
- });
571
- } else {
572
- callback(value, index, me);
573
- }
574
- };
575
- recurse(this._data, []);
616
+ const fastCallback = (0, _optimizeCallback.optimizeCallback)(callback, me._data, 'map');
617
+ me._forEach(function (arr, i, index) {
618
+ fastCallback(arr[i], index, me);
619
+ });
576
620
  };
577
621
 
578
622
  /**
@@ -11,7 +11,7 @@ var _object = require("../../utils/object.js");
11
11
  var _array = require("../../utils/array.js");
12
12
  var _factory = require("../../utils/factory.js");
13
13
  var _DimensionError = require("../../error/DimensionError.js");
14
- var _applyCallback = require("../../utils/applyCallback.js");
14
+ var _optimizeCallback = require("../../utils/optimizeCallback.js");
15
15
  const name = 'SparseMatrix';
16
16
  const dependencies = ['typed', 'equalScalar', 'Matrix'];
17
17
  const createSparseMatrixClass = exports.createSparseMatrixClass = /* #__PURE__ */(0, _factory.factory)(name, dependencies, _ref => {
@@ -878,10 +878,11 @@ const createSparseMatrixClass = exports.createSparseMatrixClass = /* #__PURE__ *
878
878
  // rows and columns
879
879
  const rows = this._size[0];
880
880
  const columns = this._size[1];
881
+ const fastCallback = (0, _optimizeCallback.optimizeCallback)(callback, me, 'map');
881
882
  // invoke callback
882
883
  const invoke = function (v, i, j) {
883
884
  // invoke callback
884
- return (0, _applyCallback.applyCallback)(callback, v, [i, j], me, 'map');
885
+ return fastCallback(v, [i, j], me);
885
886
  };
886
887
  // invoke _map
887
888
  return _map(this, 0, rows - 1, 0, columns - 1, invoke, skipZeros);
@@ -986,6 +987,7 @@ const createSparseMatrixClass = exports.createSparseMatrixClass = /* #__PURE__ *
986
987
  // rows and columns
987
988
  const rows = this._size[0];
988
989
  const columns = this._size[1];
990
+ const fastCallback = (0, _optimizeCallback.optimizeCallback)(callback, me, 'forEach');
989
991
  // loop columns
990
992
  for (let j = 0; j < columns; j++) {
991
993
  // k0 <= k < k1 where k0 = _ptr[j] && k1 = _ptr[j+1]
@@ -998,7 +1000,7 @@ const createSparseMatrixClass = exports.createSparseMatrixClass = /* #__PURE__ *
998
1000
  const i = this._index[k];
999
1001
 
1000
1002
  // value @ k
1001
- callback(this._values[k], [i, j], me);
1003
+ fastCallback(this._values[k], [i, j], me);
1002
1004
  }
1003
1005
  } else {
1004
1006
  // create a cache holding all defined values
@@ -1012,7 +1014,7 @@ const createSparseMatrixClass = exports.createSparseMatrixClass = /* #__PURE__ *
1012
1014
  // and either read the value or zero
1013
1015
  for (let i = 0; i < rows; i++) {
1014
1016
  const value = i in values ? values[i] : 0;
1015
- callback(value, [i, j], me);
1017
+ fastCallback(value, [i, j], me);
1016
1018
  }
1017
1019
  }
1018
1020
  }
@@ -1411,6 +1413,7 @@ const createSparseMatrixClass = exports.createSparseMatrixClass = /* #__PURE__ *
1411
1413
  // indeces for column j
1412
1414
  const k0 = ptr[j];
1413
1415
  const k1 = ptr[j + 1];
1416
+
1414
1417
  // loop
1415
1418
  for (let k = k0; k < k1; k++) {
1416
1419
  // invoke callback
@@ -25,6 +25,7 @@ exports.join = join;
25
25
  exports.last = last;
26
26
  exports.map = map;
27
27
  exports.processSizesWildcard = processSizesWildcard;
28
+ exports.recurse = recurse;
28
29
  exports.reshape = reshape;
29
30
  exports.resize = resize;
30
31
  exports.squeeze = squeeze;
@@ -840,6 +841,27 @@ function get(array, index) {
840
841
  return index.reduce((acc, curr) => acc[curr], array);
841
842
  }
842
843
 
844
+ /**
845
+ * Recursive function to map a multi-dimensional array.
846
+ *
847
+ * @param {*} value - The current value being processed in the array.
848
+ * @param {Array} index - The index of the current value being processed in the array.
849
+ * @param {Array} array - The array being processed.
850
+ * @param {Function} callback - Function that produces the element of the new Array, taking three arguments: the value of the element, the index of the element, and the Array being processed.
851
+ * @returns {*} The new array with each element being the result of the callback function.
852
+ */
853
+ function recurse(value, index, array, callback) {
854
+ if (Array.isArray(value)) {
855
+ return value.map(function (child, i) {
856
+ // we create a copy of the index array and append the new index value
857
+ return recurse(child, index.concat(i), array, callback);
858
+ });
859
+ } else {
860
+ // invoke the callback function with the right number of arguments
861
+ return callback(value, index, array);
862
+ }
863
+ }
864
+
843
865
  /**
844
866
  * Deep clones a multidimensional array
845
867
  * @param {Array} array
@@ -4,9 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.getSafeMethod = getSafeMethod;
7
- exports.getSafeProperties = getSafeProperties;
8
7
  exports.getSafeProperty = getSafeProperty;
9
- exports.hasSafeProperty = hasSafeProperty;
10
8
  exports.isPlainObject = isPlainObject;
11
9
  exports.isSafeMethod = isSafeMethod;
12
10
  exports.isSafeProperty = isSafeProperty;
@@ -22,7 +20,7 @@ var _object = require("./object.js");
22
20
  */
23
21
  function getSafeProperty(object, prop) {
24
22
  // only allow getting safe properties of a plain object
25
- if (isPlainObject(object) && isSafeProperty(object, prop)) {
23
+ if (isSafeProperty(object, prop)) {
26
24
  return object[prop];
27
25
  }
28
26
  if (typeof object[prop] === 'function' && isSafeMethod(object, prop)) {
@@ -43,27 +41,22 @@ function getSafeProperty(object, prop) {
43
41
  // TODO: merge this function into access.js?
44
42
  function setSafeProperty(object, prop, value) {
45
43
  // only allow setting safe properties of a plain object
46
- if (isPlainObject(object) && isSafeProperty(object, prop)) {
44
+ if (isSafeProperty(object, prop)) {
47
45
  object[prop] = value;
48
46
  return value;
49
47
  }
50
48
  throw new Error('No access to property "' + prop + '"');
51
49
  }
52
- function getSafeProperties(object) {
53
- return Object.keys(object).filter(prop => (0, _object.hasOwnProperty)(object, prop));
54
- }
55
- function hasSafeProperty(object, prop) {
56
- return prop in object;
57
- }
58
50
 
59
51
  /**
60
- * Test whether a property is safe to use for an object.
52
+ * Test whether a property is safe to use on an object or Array.
61
53
  * For example .toString and .constructor are not safe
54
+ * @param {Object | Array} object
62
55
  * @param {string} prop
63
56
  * @return {boolean} Returns true when safe
64
57
  */
65
58
  function isSafeProperty(object, prop) {
66
- if (!object || typeof object !== 'object') {
59
+ if (!isPlainObject(object) && !Array.isArray(object)) {
67
60
  return false;
68
61
  }
69
62
  // SAFE: whitelisted
@@ -24,7 +24,7 @@ class ObjectWrappingMap {
24
24
  this[Symbol.iterator] = this.entries;
25
25
  }
26
26
  keys() {
27
- return Object.keys(this.wrappedObject).values();
27
+ return Object.keys(this.wrappedObject).filter(key => this.has(key)).values();
28
28
  }
29
29
  get(key) {
30
30
  return (0, _customs.getSafeProperty)(this.wrappedObject, key);
@@ -34,7 +34,7 @@ class ObjectWrappingMap {
34
34
  return this;
35
35
  }
36
36
  has(key) {
37
- return (0, _customs.hasSafeProperty)(this.wrappedObject, key);
37
+ return (0, _customs.isSafeProperty)(this.wrappedObject, key) && key in this.wrappedObject;
38
38
  }
39
39
  entries() {
40
40
  return mapIterator(this.keys(), key => [key, this.get(key)]);
@@ -45,7 +45,9 @@ class ObjectWrappingMap {
45
45
  }
46
46
  }
47
47
  delete(key) {
48
- delete this.wrappedObject[key];
48
+ if ((0, _customs.isSafeProperty)(this.wrappedObject, key)) {
49
+ delete this.wrappedObject[key];
50
+ }
49
51
  }
50
52
  clear() {
51
53
  for (const key of this.keys()) {
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.optimizeCallback = optimizeCallback;
8
+ var _typedFunction = _interopRequireDefault(require("typed-function"));
9
+ var _array = require("./array.js");
10
+ var _is = require("./is.js");
11
+ /**
12
+ * Simplifies a callback function by reducing its complexity and potentially improving its performance.
13
+ *
14
+ * @param {Function} callback The original callback function to simplify.
15
+ * @param {Array|Matrix} array The array that will be used with the callback function.
16
+ * @param {string} name The name of the function that is using the callback.
17
+ * @returns {Function} Returns a simplified version of the callback function.
18
+ */
19
+ function optimizeCallback(callback, array, name) {
20
+ if (_typedFunction.default.isTypedFunction(callback)) {
21
+ const firstIndex = (array.isMatrix ? array.size() : (0, _array.arraySize)(array)).map(() => 0);
22
+ const firstValue = array.isMatrix ? array.get(firstIndex) : (0, _array.get)(array, firstIndex);
23
+ const hasSingleSignature = Object.keys(callback.signatures).length === 1;
24
+ const numberOfArguments = _findNumberOfArguments(callback, firstValue, firstIndex, array);
25
+ const fastCallback = hasSingleSignature ? Object.values(callback.signatures)[0] : callback;
26
+ if (numberOfArguments >= 1 && numberOfArguments <= 3) {
27
+ return function () {
28
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
29
+ args[_key] = arguments[_key];
30
+ }
31
+ return _tryFunctionWithArgs(fastCallback, args.slice(0, numberOfArguments), name, callback.name);
32
+ };
33
+ }
34
+ return function () {
35
+ for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
36
+ args[_key2] = arguments[_key2];
37
+ }
38
+ return _tryFunctionWithArgs(fastCallback, args, name, callback.name);
39
+ };
40
+ }
41
+ return callback;
42
+ }
43
+ function _findNumberOfArguments(callback, value, index, array) {
44
+ const testArgs = [value, index, array];
45
+ for (let i = 3; i > 0; i--) {
46
+ const args = testArgs.slice(0, i);
47
+ if (_typedFunction.default.resolve(callback, args) !== null) {
48
+ return i;
49
+ }
50
+ }
51
+ }
52
+
53
+ /**
54
+ * @param {function} func The selected function taken from one of the signatures of the callback function
55
+ * @param {Array} args List with arguments to apply to the selected signature
56
+ * @param {string} mappingFnName the name of the function that is using the callback
57
+ * @param {string} callbackName the name of the callback function
58
+ * @returns {*} Returns the return value of the invoked signature
59
+ * @throws {TypeError} Throws an error when no matching signature was found
60
+ */
61
+ function _tryFunctionWithArgs(func, args, mappingFnName, callbackName) {
62
+ try {
63
+ return func(...args);
64
+ } catch (err) {
65
+ _createCallbackError(err, args, mappingFnName, callbackName);
66
+ }
67
+ }
68
+
69
+ /**
70
+ * Creates and throws a detailed TypeError when a callback function fails.
71
+ *
72
+ * @param {Error} err The original error thrown by the callback function.
73
+ * @param {Array} args The arguments that were passed to the callback function.
74
+ * @param {string} mappingFnName The name of the function that is using the callback.
75
+ * @param {string} callbackName The name of the callback function.
76
+ * @throws {TypeError} Throws a detailed TypeError with enriched error message.
77
+ */
78
+ function _createCallbackError(err, args, mappingFnName, callbackName) {
79
+ var _err$data;
80
+ // Enrich the error message so the user understands that it took place inside the callback function
81
+ if (err instanceof TypeError && ((_err$data = err.data) === null || _err$data === void 0 ? void 0 : _err$data.category) === 'wrongType') {
82
+ const argsDesc = [];
83
+ argsDesc.push(`value: ${(0, _is.typeOf)(args[0])}`);
84
+ if (args.length >= 2) {
85
+ argsDesc.push(`index: ${(0, _is.typeOf)(args[1])}`);
86
+ }
87
+ if (args.length >= 3) {
88
+ argsDesc.push(`array: ${(0, _is.typeOf)(args[2])}`);
89
+ }
90
+ throw new TypeError(`Function ${mappingFnName} cannot apply callback arguments ` + `${callbackName}(${argsDesc.join(', ')}) at index ${JSON.stringify(args[1])}`);
91
+ } else {
92
+ throw new TypeError(`Function ${mappingFnName} cannot apply callback arguments ` + `to function ${callbackName}: ${err.message}`);
93
+ }
94
+ }
@@ -4,6 +4,6 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.version = void 0;
7
- const version = exports.version = '13.1.0';
7
+ const version = exports.version = '13.2.0';
8
8
  // Note: This file is automatically generated when building math.js.
9
9
  // Changes made in this file will be overwritten.
@@ -94,6 +94,7 @@ export var createTyped = /* #__PURE__ */factory('typed', dependencies, function
94
94
  // string starting with an alphabetic character. It is used (at least)
95
95
  // in the definition of the derivative() function, as the argument telling
96
96
  // what to differentiate over must (currently) be a variable.
97
+ // TODO: deprecate the identifier type (it's not used anymore, see https://github.com/josdejong/mathjs/issues/3253)
97
98
  {
98
99
  name: 'identifier',
99
100
  test: s => isString && /^(?:[A-Za-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u0870-\u0887\u0889-\u088E\u08A0-\u08C9\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C5D\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u1711\u171F-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4C\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BF\u31F0-\u31FF\u3400-\u4DBF\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA7CA\uA7D0\uA7D1\uA7D3\uA7D5-\uA7D9\uA7F2-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF40\uDF42-\uDF49\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67\uDF80-\uDF85\uDF87-\uDFB0\uDFB2-\uDFBA]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDD00-\uDD23\uDE80-\uDEA9\uDEB0\uDEB1\uDF00-\uDF1C\uDF27\uDF30-\uDF45\uDF70-\uDF81\uDFB0-\uDFC4\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC71\uDC72\uDC75\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE3F\uDE40\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDEB8\uDF00-\uDF1A\uDF40-\uDF46]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCDF\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEB0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDEE0-\uDEF2\uDF02\uDF04-\uDF10\uDF12-\uDF33\uDFB0]|\uD808[\uDC00-\uDF99]|\uD809[\uDC80-\uDD43]|\uD80B[\uDF90-\uDFF0]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883\uD885-\uD887][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2F\uDC41-\uDC46]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE70-\uDEBE\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE7F\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82B[\uDFF0-\uDFF3\uDFF5-\uDFFB\uDFFD\uDFFE]|\uD82C[\uDC00-\uDD22\uDD32\uDD50-\uDD52\uDD55\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD837[\uDF00-\uDF1E\uDF25-\uDF2A]|\uD838[\uDC30-\uDC6D\uDD00-\uDD2C\uDD37-\uDD3D\uDD4E\uDE90-\uDEAD\uDEC0-\uDEEB]|\uD839[\uDCD0-\uDCEB\uDFE0-\uDFE6\uDFE8-\uDFEB\uDFED\uDFEE\uDFF0-\uDFFE]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43\uDD4B]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDEDF\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF39\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0\uDFF0-\uDFFF]|\uD87B[\uDC00-\uDE5D]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A\uDF50-\uDFFF]|\uD888[\uDC00-\uDFAF])(?:[0-9A-Za-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u0870-\u0887\u0889-\u088E\u08A0-\u08C9\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C5D\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u1711\u171F-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4C\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BF\u31F0-\u31FF\u3400-\u4DBF\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA7CA\uA7D0\uA7D1\uA7D3\uA7D5-\uA7D9\uA7F2-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF40\uDF42-\uDF49\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67\uDF80-\uDF85\uDF87-\uDFB0\uDFB2-\uDFBA]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDD00-\uDD23\uDE80-\uDEA9\uDEB0\uDEB1\uDF00-\uDF1C\uDF27\uDF30-\uDF45\uDF70-\uDF81\uDFB0-\uDFC4\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC71\uDC72\uDC75\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE3F\uDE40\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDEB8\uDF00-\uDF1A\uDF40-\uDF46]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCDF\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEB0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDEE0-\uDEF2\uDF02\uDF04-\uDF10\uDF12-\uDF33\uDFB0]|\uD808[\uDC00-\uDF99]|\uD809[\uDC80-\uDD43]|\uD80B[\uDF90-\uDFF0]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883\uD885-\uD887][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2F\uDC41-\uDC46]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE70-\uDEBE\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE7F\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82B[\uDFF0-\uDFF3\uDFF5-\uDFFB\uDFFD\uDFFE]|\uD82C[\uDC00-\uDD22\uDD32\uDD50-\uDD52\uDD55\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD837[\uDF00-\uDF1E\uDF25-\uDF2A]|\uD838[\uDC30-\uDC6D\uDD00-\uDD2C\uDD37-\uDD3D\uDD4E\uDE90-\uDEAD\uDEC0-\uDEEB]|\uD839[\uDCD0-\uDCEB\uDFE0-\uDFE6\uDFE8-\uDFEB\uDFED\uDFEE\uDFF0-\uDFFE]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43\uDD4B]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDEDF\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF39\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0\uDFF0-\uDFFF]|\uD87B[\uDC00-\uDE5D]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A\uDF50-\uDFFF]|\uD888[\uDC00-\uDFAF])*$/.test(s)
@@ -169,7 +169,15 @@ export var createFunctionNode = /* #__PURE__ */factory(name, dependencies, _ref
169
169
  var rawArgs = this.args;
170
170
  return function evalFunctionNode(scope, args, context) {
171
171
  var fn = resolveFn(scope);
172
- return fn(rawArgs, math, createSubScope(scope, args));
172
+
173
+ // the original function can be overwritten in the scope with a non-rawArgs function
174
+ if (fn.rawArgs === true) {
175
+ return fn(rawArgs, math, createSubScope(scope, args));
176
+ } else {
177
+ // "regular" evaluation
178
+ var values = evalArgs.map(evalArg => evalArg(scope, args, context));
179
+ return fn(...values);
180
+ }
173
181
  };
174
182
  } else {
175
183
  // "regular" evaluation
@@ -992,7 +992,7 @@ export var createParse = /* #__PURE__ */factory(name, dependencies, _ref => {
992
992
  node = parseRule2(state);
993
993
  last = node;
994
994
  while (true) {
995
- if (state.tokenType === TOKENTYPE.SYMBOL || state.token === 'in' && isConstantNode(node) || state.tokenType === TOKENTYPE.NUMBER && !isConstantNode(last) && (!isOperatorNode(last) || last.op === '!') || state.token === '(') {
995
+ if (state.tokenType === TOKENTYPE.SYMBOL || state.token === 'in' && isConstantNode(node) || state.token === 'in' && isOperatorNode(node) && node.fn === 'unaryMinus' && isConstantNode(node.args[0]) || state.tokenType === TOKENTYPE.NUMBER && !isConstantNode(last) && (!isOperatorNode(last) || last.op === '!') || state.token === '(') {
996
996
  // parse implicit multiplication
997
997
  //
998
998
  // symbol: implicit multiplication like '2a', '(2+3)a', 'a b'
@@ -1,8 +1,8 @@
1
- import { applyCallback } from '../../utils/applyCallback.js';
2
- import { filter, filterRegExp } from '../../utils/array.js';
1
+ import { createFilter } from '../../function/matrix/filter.js';
3
2
  import { factory } from '../../utils/factory.js';
4
3
  import { isFunctionAssignmentNode, isSymbolNode } from '../../utils/is.js';
5
4
  import { compileInlineExpression } from './utils/compileInlineExpression.js';
5
+ import { createTransformCallback } from './utils/transformCallback.js';
6
6
  var name = 'filter';
7
7
  var dependencies = ['typed'];
8
8
  export var createFilterTransform = /* #__PURE__ */factory(name, dependencies, _ref => {
@@ -17,52 +17,40 @@ export var createFilterTransform = /* #__PURE__ */factory(name, dependencies, _r
17
17
  * so you can do something like 'filter([3, -2, 5], x > 0)'.
18
18
  */
19
19
  function filterTransform(args, math, scope) {
20
- var x, callback;
21
- if (args[0]) {
22
- x = args[0].compile().evaluate(scope);
20
+ var filter = createFilter({
21
+ typed
22
+ });
23
+ var transformCallback = createTransformCallback({
24
+ typed
25
+ });
26
+ if (args.length === 0) {
27
+ return filter();
23
28
  }
24
- if (args[1]) {
25
- if (isSymbolNode(args[1]) || isFunctionAssignmentNode(args[1])) {
29
+ var x = args[0];
30
+ if (args.length === 1) {
31
+ return filter(x);
32
+ }
33
+ var N = args.length - 1;
34
+ var callback = args[N];
35
+ if (x) {
36
+ x = _compileAndEvaluate(x, scope);
37
+ }
38
+ if (callback) {
39
+ if (isSymbolNode(callback) || isFunctionAssignmentNode(callback)) {
26
40
  // a function pointer, like filter([3, -2, 5], myTestFunction)
27
- callback = args[1].compile().evaluate(scope);
41
+ callback = _compileAndEvaluate(callback, scope);
28
42
  } else {
29
43
  // an expression like filter([3, -2, 5], x > 0)
30
- callback = compileInlineExpression(args[1], math, scope);
44
+ callback = compileInlineExpression(callback, math, scope);
31
45
  }
32
46
  }
33
- return filter(x, callback);
47
+ return filter(x, transformCallback(callback, N));
34
48
  }
35
49
  filterTransform.rawArgs = true;
36
-
37
- // one based version of function filter
38
- var filter = typed('filter', {
39
- 'Array, function': _filter,
40
- 'Matrix, function': function Matrix_function(x, test) {
41
- return x.create(_filter(x.toArray(), test), x.datatype());
42
- },
43
- 'Array, RegExp': filterRegExp,
44
- 'Matrix, RegExp': function Matrix_RegExp(x, test) {
45
- return x.create(filterRegExp(x.toArray(), test), x.datatype());
46
- }
47
- });
50
+ function _compileAndEvaluate(arg, scope) {
51
+ return arg.compile().evaluate(scope);
52
+ }
48
53
  return filterTransform;
49
54
  }, {
50
55
  isTransformFunction: true
51
- });
52
-
53
- /**
54
- * Filter values in a callback given a callback function
55
- *
56
- * !!! Passes a one-based index !!!
57
- *
58
- * @param {Array} x
59
- * @param {Function} callback
60
- * @return {Array} Returns the filtered array
61
- * @private
62
- */
63
- function _filter(x, callback) {
64
- return filter(x, function (value, index, array) {
65
- // invoke the callback function with the right number of arguments
66
- return applyCallback(callback, value, [index + 1], array, 'filter');
67
- });
68
- }
56
+ });
@@ -1,5 +1,5 @@
1
- import { applyCallback } from '../../utils/applyCallback.js';
2
- import { forEach } from '../../utils/array.js';
1
+ import { createForEach } from '../../function/matrix/forEach.js';
2
+ import { createTransformCallback } from './utils/transformCallback.js';
3
3
  import { factory } from '../../utils/factory.js';
4
4
  import { isFunctionAssignmentNode, isSymbolNode } from '../../utils/is.js';
5
5
  import { compileInlineExpression } from './utils/compileInlineExpression.js';
@@ -15,41 +15,40 @@ export var createForEachTransform = /* #__PURE__ */factory(name, dependencies, _
15
15
  *
16
16
  * This transform creates a one-based index instead of a zero-based index
17
17
  */
18
+ var forEach = createForEach({
19
+ typed
20
+ });
21
+ var transformCallback = createTransformCallback({
22
+ typed
23
+ });
18
24
  function forEachTransform(args, math, scope) {
19
- var x, callback;
20
- if (args[0]) {
21
- x = args[0].compile().evaluate(scope);
25
+ if (args.length === 0) {
26
+ return forEach();
27
+ }
28
+ var x = args[0];
29
+ if (args.length === 1) {
30
+ return forEach(x);
22
31
  }
23
- if (args[1]) {
24
- if (isSymbolNode(args[1]) || isFunctionAssignmentNode(args[1])) {
25
- // a function pointer, like forEach([3, -2, 5], myTestFunction)
26
- callback = args[1].compile().evaluate(scope);
32
+ var N = args.length - 1;
33
+ var callback = args[N];
34
+ if (x) {
35
+ x = _compileAndEvaluate(x, scope);
36
+ }
37
+ if (callback) {
38
+ if (isSymbolNode(callback) || isFunctionAssignmentNode(callback)) {
39
+ // a function pointer, like filter([3, -2, 5], myTestFunction)
40
+ callback = _compileAndEvaluate(callback, scope);
27
41
  } else {
28
- // an expression like forEach([3, -2, 5], x > 0 ? callback1(x) : callback2(x) )
29
- callback = compileInlineExpression(args[1], math, scope);
42
+ // an expression like filter([3, -2, 5], x > 0)
43
+ callback = compileInlineExpression(callback, math, scope);
30
44
  }
31
45
  }
32
- return _forEach(x, callback);
46
+ return forEach(x, transformCallback(callback, N));
33
47
  }
34
48
  forEachTransform.rawArgs = true;
35
-
36
- // one-based version of forEach
37
- var _forEach = typed('forEach', {
38
- 'Array | Matrix, function': function Array__Matrix_function(array, callback) {
39
- var _recurse = function recurse(value, index) {
40
- if (Array.isArray(value)) {
41
- forEach(value, function (child, i) {
42
- // we create a copy of the index array and append the new index value
43
- _recurse(child, index.concat(i + 1)); // one based index, hence i+1
44
- });
45
- } else {
46
- // invoke the callback function with the right number of arguments
47
- return applyCallback(callback, value, index, array, 'forEach');
48
- }
49
- };
50
- _recurse(array.valueOf(), []); // pass Array
51
- }
52
- });
49
+ function _compileAndEvaluate(arg, scope) {
50
+ return arg.compile().evaluate(scope);
51
+ }
53
52
  return forEachTransform;
54
53
  }, {
55
54
  isTransformFunction: true