You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@echarts.apache.org by ov...@apache.org on 2022/06/09 09:48:02 UTC

[echarts] 02/02: chore: release 5.3.3

This is an automated email from the ASF dual-hosted git repository.

ovilia pushed a commit to branch release-dev
in repository https://gitbox.apache.org/repos/asf/echarts.git

commit 21f220f60da797c286b602afeb891cf1ec074e5b
Author: Ovilia <zw...@gmail.com>
AuthorDate: Thu Jun 9 17:47:04 2022 +0800

    chore: release 5.3.3
---
 dist/echarts.common.js         | 6161 ++++++++++++++-------------
 dist/echarts.common.js.map     |    2 +-
 dist/echarts.common.min.js     |    4 +-
 dist/echarts.esm.js            | 9197 ++++++++++++++++++++--------------------
 dist/echarts.esm.js.map        |    2 +-
 dist/echarts.esm.min.js        |    2 +-
 dist/echarts.js                | 9197 ++++++++++++++++++++--------------------
 dist/echarts.js.map            |    2 +-
 dist/echarts.min.js            |    2 +-
 dist/echarts.simple.js         | 4702 ++++++++++----------
 dist/echarts.simple.js.map     |    2 +-
 dist/echarts.simple.min.js     |    2 +-
 dist/extension/bmap.js.map     |    2 +-
 dist/extension/dataTool.js.map |    2 +-
 package-lock.json              |   18 +-
 package.json                   |    4 +-
 src/core/echarts.ts            |    2 +-
 17 files changed, 14727 insertions(+), 14576 deletions(-)

diff --git a/dist/echarts.common.js b/dist/echarts.common.js
index 024720412..90535c6f4 100644
--- a/dist/echarts.common.js
+++ b/dist/echarts.common.js
@@ -7160,7 +7160,7 @@
     function registerPainter(name, Ctor) {
         painterCtors[name] = Ctor;
     }
-    var version = '5.3.0';
+    var version = '5.3.2';
 
     var zrender = /*#__PURE__*/Object.freeze({
         __proto__: null,
@@ -7180,12 +7180,12 @@
     function _trim(str) {
       return str.replace(/^\s+|\s+$/g, '');
     }
-    /**
-     * Linear mapping a value from domain to range
-     * @param  val
-     * @param  domain Domain extent domain[0] can be bigger than domain[1]
-     * @param  range  Range extent range[0] can be bigger than range[1]
-     * @param  clamp Default to be false
+    /**
+     * Linear mapping a value from domain to range
+     * @param  val
+     * @param  domain Domain extent domain[0] can be bigger than domain[1]
+     * @param  range  Range extent range[0] can be bigger than range[1]
+     * @param  clamp Default to be false
      */
 
 
@@ -7232,9 +7232,9 @@
 
       return (val - d0) / subDomain * subRange + r0;
     }
-    /**
-     * Convert a percent string to absolute number.
-     * Returns NaN if percent is not a valid string or number
+    /**
+     * Convert a percent string to absolute number.
+     * Returns NaN if percent is not a valid string or number
      */
 
     function parsePercent$1(percent, all) {
@@ -7276,9 +7276,9 @@
       x = (+x).toFixed(precision);
       return returnStr ? x : +x;
     }
-    /**
-     * Inplacd asc sort arr.
-     * The input arr will be modified.
+    /**
+     * Inplacd asc sort arr.
+     * The input arr will be modified.
      */
 
     function asc(arr) {
@@ -7287,8 +7287,8 @@
       });
       return arr;
     }
-    /**
-     * Get precision.
+    /**
+     * Get precision.
      */
 
     function getPrecision(val) {
@@ -7319,8 +7319,8 @@
 
       return getPrecisionSafe(val);
     }
-    /**
-     * Get precision with slow but safe method
+    /**
+     * Get precision with slow but safe method
      */
 
     function getPrecisionSafe(val) {
@@ -7334,8 +7334,8 @@
       var decimalPartLen = dotIndex < 0 ? 0 : significandPartLen - 1 - dotIndex;
       return Math.max(0, decimalPartLen - exp);
     }
-    /**
-     * Minimal dicernible data precisioin according to a single pixel.
+    /**
+     * Minimal dicernible data precisioin according to a single pixel.
      */
 
     function getPixelPrecision(dataExtent, pixelExtent) {
@@ -7347,16 +7347,16 @@
       var precision = Math.min(Math.max(-dataQuantity + sizeQuantity, 0), 20);
       return !isFinite(precision) ? 20 : precision;
     }
-    /**
-     * Get a data of given precision, assuring the sum of percentages
-     * in valueList is 1.
-     * The largest remainer method is used.
-     * https://en.wikipedia.org/wiki/Largest_remainder_method
-     *
-     * @param valueList a list of all data
-     * @param idx index of the data to be processed in valueList
-     * @param precision integer number showing digits of precision
-     * @return percent ranging from 0 to 100
+    /**
+     * Get a data of given precision, assuring the sum of percentages
+     * in valueList is 1.
+     * The largest remainer method is used.
+     * https://en.wikipedia.org/wiki/Largest_remainder_method
+     *
+     * @param valueList a list of all data
+     * @param idx index of the data to be processed in valueList
+     * @param precision integer number showing digits of precision
+     * @return percent ranging from 0 to 100
      */
 
     function getPercentWithPrecision(valueList, idx, precision) {
@@ -7408,9 +7408,9 @@
 
       return seats[idx] / digits;
     }
-    /**
-     * Solve the floating point adding problem like 0.1 + 0.2 === 0.30000000000000004
-     * See <http://0.30000000000000004.com/>
+    /**
+     * Solve the floating point adding problem like 0.1 + 0.2 === 0.30000000000000004
+     * See <http://0.30000000000000004.com/>
      */
 
     function addSafe(val0, val1) {
@@ -7423,17 +7423,17 @@
     } // Number.MAX_SAFE_INTEGER, ie do not support.
 
     var MAX_SAFE_INTEGER = 9007199254740991;
-    /**
-     * To 0 - 2 * PI, considering negative radian.
+    /**
+     * To 0 - 2 * PI, considering negative radian.
      */
 
     function remRadian(radian) {
       var pi2 = Math.PI * 2;
       return (radian % pi2 + pi2) % pi2;
     }
-    /**
-     * @param {type} radian
-     * @return {boolean}
+    /**
+     * @param {type} radian
+     * @return {boolean}
      */
 
     function isRadianAroundZero(val) {
@@ -7442,21 +7442,21 @@
 
     var TIME_REG = /^(?:(\d{4})(?:[-\/](\d{1,2})(?:[-\/](\d{1,2})(?:[T ](\d{1,2})(?::(\d{1,2})(?::(\d{1,2})(?:[.,](\d+))?)?)?(Z|[\+\-]\d\d:?\d\d)?)?)?)?)?$/; // jshint ignore:line
 
-    /**
-     * @param value valid type: number | string | Date, otherwise return `new Date(NaN)`
-     *   These values can be accepted:
-     *   + An instance of Date, represent a time in its own time zone.
-     *   + Or string in a subset of ISO 8601, only including:
-     *     + only year, month, date: '2012-03', '2012-03-01', '2012-03-01 05', '2012-03-01 05:06',
-     *     + separated with T or space: '2012-03-01T12:22:33.123', '2012-03-01 12:22:33.123',
-     *     + time zone: '2012-03-01T12:22:33Z', '2012-03-01T12:22:33+8000', '2012-03-01T12:22:33-05:00',
-     *     all of which will be treated as local time if time zone is not specified
-     *     (see <https://momentjs.com/>).
-     *   + Or other string format, including (all of which will be treated as loacal time):
-     *     '2012', '2012-3-1', '2012/3/1', '2012/03/01',
-     *     '2009/6/12 2:00', '2009/6/12 2:05:08', '2009/6/12 2:05:08.123'
-     *   + a timestamp, which represent a time in UTC.
-     * @return date Never be null/undefined. If invalid, return `new Date(NaN)`.
+    /**
+     * @param value valid type: number | string | Date, otherwise return `new Date(NaN)`
+     *   These values can be accepted:
+     *   + An instance of Date, represent a time in its own time zone.
+     *   + Or string in a subset of ISO 8601, only including:
+     *     + only year, month, date: '2012-03', '2012-03-01', '2012-03-01 05', '2012-03-01 05:06',
+     *     + separated with T or space: '2012-03-01T12:22:33.123', '2012-03-01 12:22:33.123',
+     *     + time zone: '2012-03-01T12:22:33Z', '2012-03-01T12:22:33+8000', '2012-03-01T12:22:33-05:00',
+     *     all of which will be treated as local time if time zone is not specified
+     *     (see <https://momentjs.com/>).
+     *   + Or other string format, including (all of which will be treated as loacal time):
+     *     '2012', '2012-3-1', '2012/3/1', '2012/03/01',
+     *     '2009/6/12 2:00', '2009/6/12 2:05:08', '2009/6/12 2:05:08.123'
+     *   + a timestamp, which represent a time in UTC.
+     * @return date Never be null/undefined. If invalid, return `new Date(NaN)`.
      */
 
     function parseDate(value) {
@@ -7502,22 +7502,22 @@
 
       return new Date(Math.round(value));
     }
-    /**
-     * Quantity of a number. e.g. 0.1, 1, 10, 100
-     *
-     * @param val
-     * @return
+    /**
+     * Quantity of a number. e.g. 0.1, 1, 10, 100
+     *
+     * @param val
+     * @return
      */
 
     function quantity(val) {
       return Math.pow(10, quantityExponent(val));
     }
-    /**
-     * Exponent of the quantity of a number
-     * e.g., 1234 equals to 1.234*10^3, so quantityExponent(1234) is 3
-     *
-     * @param val non-negative value
-     * @return
+    /**
+     * Exponent of the quantity of a number
+     * e.g., 1234 equals to 1.234*10^3, so quantityExponent(1234) is 3
+     *
+     * @param val non-negative value
+     * @return
      */
 
     function quantityExponent(val) {
@@ -7526,10 +7526,10 @@
       }
 
       var exp = Math.floor(Math.log(val) / Math.LN10);
-      /**
-       * exp is expected to be the rounded-down result of the base-10 log of val.
-       * But due to the precision loss with Math.log(val), we need to restore it
-       * using 10^exp to make sure we can get val back from exp. #11249
+      /**
+       * exp is expected to be the rounded-down result of the base-10 log of val.
+       * But due to the precision loss with Math.log(val), we need to restore it
+       * using 10^exp to make sure we can get val back from exp. #11249
        */
 
       if (val / Math.pow(10, exp) >= 10) {
@@ -7538,16 +7538,16 @@
 
       return exp;
     }
-    /**
-     * find a “nice” number approximately equal to x. Round the number if round = true,
-     * take ceiling if round = false. The primary observation is that the “nicest”
-     * numbers in decimal are 1, 2, and 5, and all power-of-ten multiples of these numbers.
-     *
-     * See "Nice Numbers for Graph Labels" of Graphic Gems.
-     *
-     * @param  val Non-negative value.
-     * @param  round
-     * @return Niced number
+    /**
+     * find a “nice” number approximately equal to x. Round the number if round = true,
+     * take ceiling if round = false. The primary observation is that the “nicest”
+     * numbers in decimal are 1, 2, and 5, and all power-of-ten multiples of these numbers.
+     *
+     * See "Nice Numbers for Graph Labels" of Graphic Gems.
+     *
+     * @param  val Non-negative value.
+     * @param  round
+     * @return Niced number
      */
 
     function nice(val, round) {
@@ -7588,11 +7588,11 @@
 
       return exponent >= -20 ? +val.toFixed(exponent < 0 ? -exponent : 0) : val;
     }
-    /**
-     * This code was copied from "d3.js"
-     * <https://github.com/d3/d3/blob/9cc9a875e636a1dcf36cc1e07bdf77e1ad6e2c74/src/arrays/quantile.js>.
-     * See the license statement at the head of this file.
-     * @param ascArr
+    /**
+     * This code was copied from "d3.js"
+     * <https://github.com/d3/d3/blob/9cc9a875e636a1dcf36cc1e07bdf77e1ad6e2c74/src/arrays/quantile.js>.
+     * See the license statement at the head of this file.
+     * @param ascArr
      */
 
     function quantile(ascArr, p) {
@@ -7602,27 +7602,27 @@
       var e = H - h;
       return e ? v + e * (ascArr[h] - v) : v;
     }
-    /**
-     * Order intervals asc, and split them when overlap.
-     * expect(numberUtil.reformIntervals([
-     *     {interval: [18, 62], close: [1, 1]},
-     *     {interval: [-Infinity, -70], close: [0, 0]},
-     *     {interval: [-70, -26], close: [1, 1]},
-     *     {interval: [-26, 18], close: [1, 1]},
-     *     {interval: [62, 150], close: [1, 1]},
-     *     {interval: [106, 150], close: [1, 1]},
-     *     {interval: [150, Infinity], close: [0, 0]}
-     * ])).toEqual([
-     *     {interval: [-Infinity, -70], close: [0, 0]},
-     *     {interval: [-70, -26], close: [1, 1]},
-     *     {interval: [-26, 18], close: [0, 1]},
-     *     {interval: [18, 62], close: [0, 1]},
-     *     {interval: [62, 150], close: [0, 1]},
-     *     {interval: [150, Infinity], close: [0, 0]}
-     * ]);
-     * @param list, where `close` mean open or close
-     *        of the interval, and Infinity can be used.
-     * @return The origin list, which has been reformed.
+    /**
+     * Order intervals asc, and split them when overlap.
+     * expect(numberUtil.reformIntervals([
+     *     {interval: [18, 62], close: [1, 1]},
+     *     {interval: [-Infinity, -70], close: [0, 0]},
+     *     {interval: [-70, -26], close: [1, 1]},
+     *     {interval: [-26, 18], close: [1, 1]},
+     *     {interval: [62, 150], close: [1, 1]},
+     *     {interval: [106, 150], close: [1, 1]},
+     *     {interval: [150, Infinity], close: [0, 0]}
+     * ])).toEqual([
+     *     {interval: [-Infinity, -70], close: [0, 0]},
+     *     {interval: [-70, -26], close: [1, 1]},
+     *     {interval: [-26, 18], close: [0, 1]},
+     *     {interval: [18, 62], close: [0, 1]},
+     *     {interval: [62, 150], close: [0, 1]},
+     *     {interval: [150, Infinity], close: [0, 0]}
+     * ]);
+     * @param list, where `close` mean open or close
+     *        of the interval, and Infinity can be used.
+     * @return The origin list, which has been reformed.
      */
 
     function reformIntervals(list) {
@@ -7659,21 +7659,21 @@
         return a.interval[lg] < b.interval[lg] || a.interval[lg] === b.interval[lg] && (a.close[lg] - b.close[lg] === (!lg ? 1 : -1) || !lg && littleThan(a, b, 1));
       }
     }
-    /**
-     * [Numberic is defined as]:
-     *     `parseFloat(val) == val`
-     * For example:
-     * numeric:
-     *     typeof number except NaN, '-123', '123', '2e3', '-2e3', '011', 'Infinity', Infinity,
-     *     and they rounded by white-spaces or line-terminal like ' -123 \n ' (see es spec)
-     * not-numeric:
-     *     null, undefined, [], {}, true, false, 'NaN', NaN, '123ab',
-     *     empty string, string with only white-spaces or line-terminal (see es spec),
-     *     0x12, '0x12', '-0x12', 012, '012', '-012',
-     *     non-string, ...
-     *
-     * @test See full test cases in `test/ut/spec/util/number.js`.
-     * @return Must be a typeof number. If not numeric, return NaN.
+    /**
+     * [Numberic is defined as]:
+     *     `parseFloat(val) == val`
+     * For example:
+     * numeric:
+     *     typeof number except NaN, '-123', '123', '2e3', '-2e3', '011', 'Infinity', Infinity,
+     *     and they rounded by white-spaces or line-terminal like ' -123 \n ' (see es spec)
+     * not-numeric:
+     *     null, undefined, [], {}, true, false, 'NaN', NaN, '123ab',
+     *     empty string, string with only white-spaces or line-terminal (see es spec),
+     *     0x12, '0x12', '-0x12', 012, '012', '-012',
+     *     non-string, ...
+     *
+     * @test See full test cases in `test/ut/spec/util/number.js`.
+     * @return Must be a typeof number. If not numeric, return NaN.
      */
 
     function numericToNumber(val) {
@@ -7682,27 +7682,27 @@
       && (valFloat !== 0 || !isString(val) || val.indexOf('x') <= 0) // For case ' 0x0 '.
       ? valFloat : NaN;
     }
-    /**
-     * Definition of "numeric": see `numericToNumber`.
+    /**
+     * Definition of "numeric": see `numericToNumber`.
      */
 
     function isNumeric(val) {
       return !isNaN(numericToNumber(val));
     }
-    /**
-     * Use random base to prevent users hard code depending on
-     * this auto generated marker id.
-     * @return An positive integer.
+    /**
+     * Use random base to prevent users hard code depending on
+     * this auto generated marker id.
+     * @return An positive integer.
      */
 
     function getRandomIdBase() {
       return Math.round(Math.random() * 9);
     }
-    /**
-     * Get the greatest common dividor
-     *
-     * @param {number} a one number
-     * @param {number} b the other number
+    /**
+     * Get the greatest common dividor
+     *
+     * @param {number} a one number
+     * @param {number} b the other number
      */
 
     function getGreatestCommonDividor(a, b) {
@@ -7712,11 +7712,11 @@
 
       return getGreatestCommonDividor(b, a % b);
     }
-    /**
-     * Get the least common multiple
-     *
-     * @param {number} a one number
-     * @param {number} b the other number
+    /**
+     * Get the least common multiple
+     *
+     * @param {number} a one number
+     * @param {number} b the other number
      */
 
     function getLeastCommonMultiple(a, b) {
@@ -7771,14 +7771,14 @@
         deprecateLog((scope ? "[" + scope + "]" : '') + (oldOpt + " is deprecated, use " + newOpt + " instead."));
       }
     }
-    /**
-     * If in __DEV__ environment, get console printable message for users hint.
-     * Parameters are separated by ' '.
-     * @usuage
-     * makePrintable('This is an error on', someVar, someObj);
-     *
-     * @param hintInfo anything about the current execution context to hint users.
-     * @throws Error
+    /**
+     * If in __DEV__ environment, get console printable message for users hint.
+     * Parameters are separated by ' '.
+     * @usuage
+     * makePrintable('This is an error on', someVar, someObj);
+     *
+     * @param hintInfo anything about the current execution context to hint users.
+     * @throws Error
      */
 
     function makePrintable() {
@@ -7824,8 +7824,8 @@
 
       return msg;
     }
-    /**
-     * @throws Error
+    /**
+     * @throws Error
      */
 
     function throwError(msg) {
@@ -7835,35 +7835,35 @@
     function interpolateNumber$1(p0, p1, percent) {
       return (p1 - p0) * percent + p0;
     }
-    /**
-     * Make the name displayable. But we should
-     * make sure it is not duplicated with user
-     * specified name, so use '\0';
+    /**
+     * Make the name displayable. But we should
+     * make sure it is not duplicated with user
+     * specified name, so use '\0';
      */
 
 
     var DUMMY_COMPONENT_NAME_PREFIX = 'series\0';
     var INTERNAL_COMPONENT_ID_PREFIX = '\0_ec_\0';
-    /**
-     * If value is not array, then translate it to array.
-     * @param  {*} value
-     * @return {Array} [value] or value
+    /**
+     * If value is not array, then translate it to array.
+     * @param  {*} value
+     * @return {Array} [value] or value
      */
 
     function normalizeToArray(value) {
       return value instanceof Array ? value : value == null ? [] : [value];
     }
-    /**
-     * Sync default option between normal and emphasis like `position` and `show`
-     * In case some one will write code like
-     *     label: {
-     *          show: false,
-     *          position: 'outside',
-     *          fontSize: 18
-     *     },
-     *     emphasis: {
-     *          label: { show: true }
-     *     }
+    /**
+     * Sync default option between normal and emphasis like `position` and `show`
+     * In case some one will write code like
+     *     label: {
+     *          show: false,
+     *          position: 'outside',
+     *          fontSize: 18
+     *     },
+     *     emphasis: {
+     *          label: { show: true }
+     *     }
      */
 
     function defaultEmphasis(opt, key, subOpts) {
@@ -7889,52 +7889,52 @@
     //     'textStyle'
     // ]);
 
-    /**
-     * The method do not ensure performance.
-     * data could be [12, 2323, {value: 223}, [1221, 23], {value: [2, 23]}]
-     * This helper method retieves value from data.
+    /**
+     * The method do not ensure performance.
+     * data could be [12, 2323, {value: 223}, [1221, 23], {value: [2, 23]}]
+     * This helper method retieves value from data.
      */
 
     function getDataItemValue(dataItem) {
       return isObject(dataItem) && !isArray(dataItem) && !(dataItem instanceof Date) ? dataItem.value : dataItem;
     }
-    /**
-     * data could be [12, 2323, {value: 223}, [1221, 23], {value: [2, 23]}]
-     * This helper method determine if dataItem has extra option besides value
+    /**
+     * data could be [12, 2323, {value: 223}, [1221, 23], {value: [2, 23]}]
+     * This helper method determine if dataItem has extra option besides value
      */
 
     function isDataItemOption(dataItem) {
       return isObject(dataItem) && !(dataItem instanceof Array); // // markLine data can be array
       // && !(dataItem[0] && isObject(dataItem[0]) && !(dataItem[0] instanceof Array));
     }
-    /**
-     * Mapping to existings for merge.
-     *
-     * Mode "normalMege":
-     *     The mapping result (merge result) will keep the order of the existing
-     *     component, rather than the order of new option. Because we should ensure
-     *     some specified index reference (like xAxisIndex) keep work.
-     *     And in most cases, "merge option" is used to update partial option but not
-     *     be expected to change the order.
-     *
-     * Mode "replaceMege":
-     *     (1) Only the id mapped components will be merged.
-     *     (2) Other existing components (except internal compoonets) will be removed.
-     *     (3) Other new options will be used to create new component.
-     *     (4) The index of the existing compoents will not be modified.
-     *     That means their might be "hole" after the removal.
-     *     The new components are created first at those available index.
-     *
-     * Mode "replaceAll":
-     *     This mode try to support that reproduce an echarts instance from another
-     *     echarts instance (via `getOption`) in some simple cases.
-     *     In this senario, the `result` index are exactly the consistent with the `newCmptOptions`,
-     *     which ensures the compoennt index referring (like `xAxisIndex: ?`) corrent. That is,
-     *     the "hole" in `newCmptOptions` will also be kept.
-     *     On the contrary, other modes try best to eliminate holes.
-     *     PENDING: This is an experimental mode yet.
-     *
-     * @return See the comment of <MappingResult>.
+    /**
+     * Mapping to existings for merge.
+     *
+     * Mode "normalMege":
+     *     The mapping result (merge result) will keep the order of the existing
+     *     component, rather than the order of new option. Because we should ensure
+     *     some specified index reference (like xAxisIndex) keep work.
+     *     And in most cases, "merge option" is used to update partial option but not
+     *     be expected to change the order.
+     *
+     * Mode "replaceMege":
+     *     (1) Only the id mapped components will be merged.
+     *     (2) Other existing components (except internal compoonets) will be removed.
+     *     (3) Other new options will be used to create new component.
+     *     (4) The index of the existing compoents will not be modified.
+     *     That means their might be "hole" after the removal.
+     *     The new components are created first at those available index.
+     *
+     * Mode "replaceAll":
+     *     This mode try to support that reproduce an echarts instance from another
+     *     echarts instance (via `getOption`) in some simple cases.
+     *     In this senario, the `result` index are exactly the consistent with the `newCmptOptions`,
+     *     which ensures the compoennt index referring (like `xAxisIndex: ?`) corrent. That is,
+     *     the "hole" in `newCmptOptions` will also be kept.
+     *     On the contrary, other modes try best to eliminate holes.
+     *     PENDING: This is an experimental mode yet.
+     *
+     * @return See the comment of <MappingResult>.
      */
 
     function mappingToExists(existings, newCmptOptions, mode) {
@@ -8110,9 +8110,9 @@
         });
       });
     }
-    /**
-     * Make id and name for mapping result (result of mappingToExists)
-     * into `keyInfo` field.
+    /**
+     * Make id and name for mapping result (result of mappingToExists)
+     * into `keyInfo` field.
      */
 
 
@@ -8183,8 +8183,8 @@
 
       return key1 != null && key2 != null && key1 === key2;
     }
-    /**
-     * @return return null if not exist.
+    /**
+     * @return return null if not exist.
      */
 
 
@@ -8221,10 +8221,10 @@
 
       return !!(name && name.indexOf(DUMMY_COMPONENT_NAME_PREFIX));
     }
-    /**
-     * @public
-     * @param {Object} cmptOption
-     * @return {boolean}
+    /**
+     * @public
+     * @param {Object} cmptOption
+     * @return {boolean}
      */
 
     function isComponentIdInternal(cmptOption) {
@@ -8251,10 +8251,10 @@
 
       return subType;
     }
-    /**
-     * @param payload Contains dataIndex (means rawIndex) / dataIndexInside / name
-     *                         each of which can be Array or primary type.
-     * @return dataIndex If not found, return undefined/null.
+    /**
+     * @param payload Contains dataIndex (means rawIndex) / dataIndexInside / name
+     *                         each of which can be Array or primary type.
+     * @return dataIndex If not found, return undefined/null.
      */
 
     function queryDataIndex(data, payload) {
@@ -8270,25 +8270,25 @@
         }) : data.indexOfName(payload.name);
       }
     }
-    /**
-     * Enable property storage to any host object.
-     * Notice: Serialization is not supported.
-     *
-     * For example:
-     * let inner = zrUitl.makeInner();
-     *
-     * function some1(hostObj) {
-     *      inner(hostObj).someProperty = 1212;
-     *      ...
-     * }
-     * function some2() {
-     *      let fields = inner(this);
-     *      fields.someProperty1 = 1212;
-     *      fields.someProperty2 = 'xx';
-     *      ...
-     * }
-     *
-     * @return {Function}
+    /**
+     * Enable property storage to any host object.
+     * Notice: Serialization is not supported.
+     *
+     * For example:
+     * let inner = zrUitl.makeInner();
+     *
+     * function some1(hostObj) {
+     *      inner(hostObj).someProperty = 1212;
+     *      ...
+     * }
+     * function some2() {
+     *      let fields = inner(this);
+     *      fields.someProperty1 = 1212;
+     *      fields.someProperty2 = 'xx';
+     *      ...
+     * }
+     *
+     * @return {Function}
      */
 
     function makeInner() {
@@ -8298,8 +8298,8 @@
       };
     }
     var innerUniqueIndex = getRandomIdBase();
-    /**
-     * The same behavior as `component.getReferringComponents`.
+    /**
+     * The same behavior as `component.getReferringComponents`.
      */
 
     function parseFinder(ecModel, finderInput, opt) {
@@ -8427,19 +8427,19 @@
         return renderModeOption || 'html';
       }
     }
-    /**
-     * Interpolate raw values of a series with percent
-     *
-     * @param data         data
-     * @param labelModel   label model of the text element
-     * @param sourceValue  start value. May be null/undefined when init.
-     * @param targetValue  end value
-     * @param percent      0~1 percentage; 0 uses start value while 1 uses end value
-     * @return             interpolated values
-     *                     If `sourceValue` and `targetValue` are `number`, return `number`.
-     *                     If `sourceValue` and `targetValue` are `string`, return `string`.
-     *                     If `sourceValue` and `targetValue` are `(string | number)[]`, return `(string | number)[]`.
-     *                     Other cases do not supported.
+    /**
+     * Interpolate raw values of a series with percent
+     *
+     * @param data         data
+     * @param labelModel   label model of the text element
+     * @param sourceValue  start value. May be null/undefined when init.
+     * @param targetValue  end value
+     * @param percent      0~1 percentage; 0 uses start value while 1 uses end value
+     * @return             interpolated values
+     *                     If `sourceValue` and `targetValue` are `number`, return `number`.
+     *                     If `sourceValue` and `targetValue` are `string`, return `string`.
+     *                     If `sourceValue` and `targetValue` are `(string | number)[]`, return `(string | number)[]`.
+     *                     Other cases do not supported.
      */
 
     function interpolateRawValues(data, precision, sourceValue, targetValue, percent) {
@@ -8481,9 +8481,9 @@
     var TYPE_DELIMITER = '.';
     var IS_CONTAINER = '___EC__COMPONENT__CONTAINER___';
     var IS_EXTENDED_CLASS = '___EC__EXTENDED_CLASS___';
-    /**
-     * Notice, parseClassType('') should returns {main: '', sub: ''}
-     * @public
+    /**
+     * Notice, parseClassType('') should returns {main: '', sub: ''}
+     * @public
      */
 
     function parseClassType(componentType) {
@@ -8500,8 +8500,8 @@
 
       return ret;
     }
-    /**
-     * @public
+    /**
+     * @public
      */
 
     function checkClassType(componentType) {
@@ -8511,15 +8511,15 @@
     function isExtendedClass(clz) {
       return !!(clz && clz[IS_EXTENDED_CLASS]);
     }
-    /**
-     * Implements `ExtendableConstructor` for `rootClz`.
-     *
-     * @usage
-     * ```ts
-     * class Xxx {}
-     * type XxxConstructor = typeof Xxx & ExtendableConstructor
-     * enableClassExtend(Xxx as XxxConstructor);
-     * ```
+    /**
+     * Implements `ExtendableConstructor` for `rootClz`.
+     *
+     * @usage
+     * ```ts
+     * class Xxx {}
+     * type XxxConstructor = typeof Xxx & ExtendableConstructor
+     * enableClassExtend(Xxx as XxxConstructor);
+     * ```
      */
 
     function enableClassExtend(rootClz, mandatoryMethods) {
@@ -8577,19 +8577,19 @@
     function isESClass(fn) {
       return isFunction(fn) && /^class\s/.test(Function.prototype.toString.call(fn));
     }
-    /**
-     * A work around to both support ts extend and this extend mechanism.
-     * on sub-class.
-     * @usage
-     * ```ts
-     * class Component { ... }
-     * classUtil.enableClassExtend(Component);
-     * classUtil.enableClassManagement(Component, {registerWhenExtend: true});
-     *
-     * class Series extends Component { ... }
-     * // Without calling `markExtend`, `registerWhenExtend` will not work.
-     * Component.markExtend(Series);
-     * ```
+    /**
+     * A work around to both support ts extend and this extend mechanism.
+     * on sub-class.
+     * @usage
+     * ```ts
+     * class Component { ... }
+     * classUtil.enableClassExtend(Component);
+     * classUtil.enableClassManagement(Component, {registerWhenExtend: true});
+     *
+     * class Series extends Component { ... }
+     * // Without calling `markExtend`, `registerWhenExtend` will not work.
+     * Component.markExtend(Series);
+     * ```
      */
 
 
@@ -8598,18 +8598,18 @@
     } // A random offset.
 
     var classBase = Math.round(Math.random() * 10);
-    /**
-     * Implements `CheckableConstructor` for `target`.
-     * Can not use instanceof, consider different scope by
-     * cross domain or es module import in ec extensions.
-     * Mount a method "isInstance()" to Clz.
-     *
-     * @usage
-     * ```ts
-     * class Xxx {}
-     * type XxxConstructor = typeof Xxx & CheckableConstructor;
-     * enableClassCheck(Xxx as XxxConstructor)
-     * ```
+    /**
+     * Implements `CheckableConstructor` for `target`.
+     * Can not use instanceof, consider different scope by
+     * cross domain or es module import in ec extensions.
+     * Mount a method "isInstance()" to Clz.
+     *
+     * @usage
+     * ```ts
+     * class Xxx {}
+     * type XxxConstructor = typeof Xxx & CheckableConstructor;
+     * enableClassCheck(Xxx as XxxConstructor)
+     * ```
      */
 
     function enableClassCheck(target) {
@@ -8643,25 +8643,25 @@
     function superApply(context, methodName, args) {
       return this.superClass.prototype[methodName].apply(context, args);
     }
-    /**
-     * Implements `ClassManager` for `target`
-     *
-     * @usage
-     * ```ts
-     * class Xxx {}
-     * type XxxConstructor = typeof Xxx & ClassManager
-     * enableClassManagement(Xxx as XxxConstructor);
-     * ```
+    /**
+     * Implements `ClassManager` for `target`
+     *
+     * @usage
+     * ```ts
+     * class Xxx {}
+     * type XxxConstructor = typeof Xxx & ClassManager
+     * enableClassManagement(Xxx as XxxConstructor);
+     * ```
      */
 
 
     function enableClassManagement(target) {
-      /**
-       * Component model classes
-       * key: componentType,
-       * value:
-       *     componentClass, when componentType is 'xxx'
-       *     or Object.<subKey, componentClass>, when componentType is 'xxx.yy'
+      /**
+       * Component model classes
+       * key: componentType,
+       * value:
+       *     componentClass, when componentType is 'a'
+       *     or Object.<subKey, componentClass>, when componentType is 'a.b'
        */
       var storage = {};
 
@@ -8731,8 +8731,8 @@
         var componentTypeInfo = parseClassType(componentType);
         return !!storage[componentTypeInfo.main];
       };
-      /**
-       * @return Like ['aa', 'bb'], but can not be ['aa.xx']
+      /**
+       * @return Like ['aa', 'bb'], but can not be ['aa.xx']
        */
 
 
@@ -8743,8 +8743,8 @@
         });
         return types;
       };
-      /**
-       * If a main type is container and has sub types
+      /**
+       * If a main type is container and has sub types
        */
 
 
@@ -8857,10 +8857,10 @@
                 !isImageReady(image) && cachedImgObj.pending.push(pendingWrap);
             }
             else {
-                var image_1 = platformApi.loadImage(newImageOrSrc, imageOnLoad, imageOnLoad);
-                image_1.__zrImageSrc = newImageOrSrc;
-                globalImageCache.put(newImageOrSrc, image_1.__cachedImgObj = {
-                    image: image_1,
+                image = platformApi.loadImage(newImageOrSrc, imageOnLoad, imageOnLoad);
+                image.__zrImageSrc = newImageOrSrc;
+                globalImageCache.put(newImageOrSrc, image.__cachedImgObj = {
+                    image: image,
                     pending: [pendingWrap]
                 });
             }
@@ -12385,10 +12385,10 @@
 
       return state;
     }
-    /**FI
-     * Set hover style (namely "emphasis style") of element.
-     * @param el Should not be `zrender/graphic/Group`.
-     * @param focus 'self' | 'selfInSeries' | 'series'
+    /**FI
+     * Set hover style (namely "emphasis style") of element.
+     * @param el Should not be `zrender/graphic/Group`.
+     * @param focus 'self' | 'selfInSeries' | 'series'
      */
 
 
@@ -12744,12 +12744,12 @@
       });
       return ret;
     }
-    /**
-     * Enable the function that mouseover will trigger the emphasis state.
-     *
-     * NOTE:
-     * This function should be used on the element with dataIndex, seriesIndex.
-     *
+    /**
+     * Enable the function that mouseover will trigger the emphasis state.
+     *
+     * NOTE:
+     * This function should be used on the element with dataIndex, seriesIndex.
+     *
      */
 
     function enableHoverEmphasis(el, focus, blurScope) {
@@ -12786,8 +12786,8 @@
       lineStyle: 'getLineStyle',
       areaStyle: 'getAreaStyle'
     };
-    /**
-     * Set emphasis/blur/selected states of element.
+    /**
+     * Set emphasis/blur/selected states of element.
      */
 
     function setStatesStylesFromModel(el, itemModel, styleType, // default itemStyle
@@ -12802,24 +12802,24 @@
         state.style = getter ? getter(model) : model[defaultStyleGetterMap[styleType]]();
       }
     }
-    /**
-     *
-     * Set element as highlight / downplay dispatcher.
-     * It will be checked when element recieved mouseover event or from highlight action.
-     * It's in change of all highlight/downplay behavior of it's children.
-     *
-     * @param el
-     * @param el.highDownSilentOnTouch
-     *        In touch device, mouseover event will be trigger on touchstart event
-     *        (see module:zrender/dom/HandlerProxy). By this mechanism, we can
-     *        conveniently use hoverStyle when tap on touch screen without additional
-     *        code for compatibility.
-     *        But if the chart/component has select feature, which usually also use
-     *        hoverStyle, there might be conflict between 'select-highlight' and
-     *        'hover-highlight' especially when roam is enabled (see geo for example).
-     *        In this case, `highDownSilentOnTouch` should be used to disable
-     *        hover-highlight on touch device.
-     * @param asDispatcher If `false`, do not set as "highDownDispatcher".
+    /**
+     *
+     * Set element as highlight / downplay dispatcher.
+     * It will be checked when element recieved mouseover event or from highlight action.
+     * It's in change of all highlight/downplay behavior of it's children.
+     *
+     * @param el
+     * @param el.highDownSilentOnTouch
+     *        In touch device, mouseover event will be trigger on touchstart event
+     *        (see module:zrender/dom/HandlerProxy). By this mechanism, we can
+     *        conveniently use hoverStyle when tap on touch screen without additional
+     *        code for compatibility.
+     *        But if the chart/component has select feature, which usually also use
+     *        hoverStyle, there might be conflict between 'select-highlight' and
+     *        'hover-highlight' especially when roam is enabled (see geo for example).
+     *        In this case, `highDownSilentOnTouch` should be used to disable
+     *        hover-highlight on touch device.
+     * @param asDispatcher If `false`, do not set as "highDownDispatcher".
      */
 
     function setAsHighDownDispatcher(el, asDispatcher) {
@@ -12844,13 +12844,13 @@
     function isHighDownDispatcher(el) {
       return !!(el && el.__highDownDispatcher);
     }
-    /**
-     * Support hightlight/downplay record on each elements.
-     * For the case: hover highlight/downplay (legend, visualMap, ...) and
-     * user triggerred hightlight/downplay should not conflict.
-     * Only all of the highlightDigit cleared, return to normal.
-     * @param {string} highlightKey
-     * @return {number} highlightDigit
+    /**
+     * Support hightlight/downplay record on each elements.
+     * For the case: hover highlight/downplay (legend, visualMap, ...) and
+     * user triggerred hightlight/downplay should not conflict.
+     * Only all of the highlightDigit cleared, return to normal.
+     * @param {string} highlightKey
+     * @return {number} highlightDigit
      */
 
     function getHighlightDigit(highlightKey) {
@@ -14306,8 +14306,8 @@
     }(Displayable));
 
     var transitionStore = makeInner();
-    /**
-     * Return null if animation is disabled.
+    /**
+     * Return null if animation is disabled.
      */
 
     function getAnimationConfig(animationType, animatableModel, dataIndex, // Extra opts can override the option in animatable model.
@@ -14417,21 +14417,21 @@
         cb && cb();
       }
     }
-    /**
-     * Update graphic element properties with or without animation according to the
-     * configuration in series.
-     *
-     * Caution: this method will stop previous animation.
-     * So do not use this method to one element twice before
-     * animation starts, unless you know what you are doing.
-     * @example
-     *     graphic.updateProps(el, {
-     *         position: [100, 100]
-     *     }, seriesModel, dataIndex, function () { console.log('Animation done!'); });
-     *     // Or
-     *     graphic.updateProps(el, {
-     *         position: [100, 100]
-     *     }, seriesModel, function () { console.log('Animation done!'); });
+    /**
+     * Update graphic element properties with or without animation according to the
+     * configuration in series.
+     *
+     * Caution: this method will stop previous animation.
+     * So do not use this method to one element twice before
+     * animation starts, unless you know what you are doing.
+     * @example
+     *     graphic.updateProps(el, {
+     *         position: [100, 100]
+     *     }, seriesModel, dataIndex, function () { console.log('Animation done!'); });
+     *     // Or
+     *     graphic.updateProps(el, {
+     *         position: [100, 100]
+     *     }, seriesModel, function () { console.log('Animation done!'); });
      */
 
 
@@ -14439,21 +14439,21 @@
     animatableModel, dataIndex, cb, during) {
       animateOrSetProps('update', el, props, animatableModel, dataIndex, cb, during);
     }
-    /**
-     * Init graphic element properties with or without animation according to the
-     * configuration in series.
-     *
-     * Caution: this method will stop previous animation.
-     * So do not use this method to one element twice before
-     * animation starts, unless you know what you are doing.
+    /**
+     * Init graphic element properties with or without animation according to the
+     * configuration in series.
+     *
+     * Caution: this method will stop previous animation.
+     * So do not use this method to one element twice before
+     * animation starts, unless you know what you are doing.
      */
 
     function initProps(el, props, animatableModel, dataIndex, cb, during) {
       animateOrSetProps('enter', el, props, animatableModel, dataIndex, cb, during);
     }
-    /**
-     * If element is removed.
-     * It can determine if element is having remove animation.
+    /**
+     * If element is removed.
+     * It can determine if element is having remove animation.
      */
 
     function isElementRemoved(el) {
@@ -14471,8 +14471,8 @@
 
       return false;
     }
-    /**
-     * Remove graphic element
+    /**
+     * Remove graphic element
      */
 
     function removeElement(el, props, animatableModel, dataIndex, cb, during) {
@@ -14512,11 +14512,11 @@
         });
       }
     }
-    /**
-     * Save old style for style transition in universalTransition module.
-     * It's used when element will be reused in each render.
-     * For chart like map, heatmap, which will always create new element.
-     * We don't need to save this because universalTransition can get old style from the old element
+    /**
+     * Save old style for style transition in universalTransition module.
+     * It's used when element will be reused in each render.
+     * For chart like map, heatmap, which will always create new element.
+     * We don't need to save this because universalTransition can get old style from the old element
      */
 
     function saveOldStyle(el) {
@@ -14526,62 +14526,62 @@
     var mathMax$4 = Math.max;
     var mathMin$4 = Math.min;
     var _customShapeMap = {};
-    /**
-     * Extend shape with parameters
+    /**
+     * Extend shape with parameters
      */
 
     function extendShape(opts) {
       return Path.extend(opts);
     }
     var extendPathFromString = extendFromString;
-    /**
-     * Extend path
+    /**
+     * Extend path
      */
 
     function extendPath(pathData, opts) {
       return extendPathFromString(pathData, opts);
     }
-    /**
-     * Register a user defined shape.
-     * The shape class can be fetched by `getShapeClass`
-     * This method will overwrite the registered shapes, including
-     * the registered built-in shapes, if using the same `name`.
-     * The shape can be used in `custom series` and
-     * `graphic component` by declaring `{type: name}`.
-     *
-     * @param name
-     * @param ShapeClass Can be generated by `extendShape`.
+    /**
+     * Register a user defined shape.
+     * The shape class can be fetched by `getShapeClass`
+     * This method will overwrite the registered shapes, including
+     * the registered built-in shapes, if using the same `name`.
+     * The shape can be used in `custom series` and
+     * `graphic component` by declaring `{type: name}`.
+     *
+     * @param name
+     * @param ShapeClass Can be generated by `extendShape`.
      */
 
     function registerShape(name, ShapeClass) {
       _customShapeMap[name] = ShapeClass;
     }
-    /**
-     * Find shape class registered by `registerShape`. Usually used in
-     * fetching user defined shape.
-     *
-     * [Caution]:
-     * (1) This method **MUST NOT be used inside echarts !!!**, unless it is prepared
-     * to use user registered shapes.
-     * Because the built-in shape (see `getBuiltInShape`) will be registered by
-     * `registerShape` by default. That enables users to get both built-in
-     * shapes as well as the shapes belonging to themsleves. But users can overwrite
-     * the built-in shapes by using names like 'circle', 'rect' via calling
-     * `registerShape`. So the echarts inner featrues should not fetch shapes from here
-     * in case that it is overwritten by users, except that some features, like
-     * `custom series`, `graphic component`, do it deliberately.
-     *
-     * (2) In the features like `custom series`, `graphic component`, the user input
-     * `{tpye: 'xxx'}` does not only specify shapes but also specify other graphic
-     * elements like `'group'`, `'text'`, `'image'` or event `'path'`. Those names
-     * are reserved names, that is, if some user register a shape named `'image'`,
-     * the shape will not be used. If we intending to add some more reserved names
-     * in feature, that might bring break changes (disable some existing user shape
-     * names). But that case probably rearly happen. So we dont make more mechanism
-     * to resolve this issue here.
-     *
-     * @param name
-     * @return The shape class. If not found, return nothing.
+    /**
+     * Find shape class registered by `registerShape`. Usually used in
+     * fetching user defined shape.
+     *
+     * [Caution]:
+     * (1) This method **MUST NOT be used inside echarts !!!**, unless it is prepared
+     * to use user registered shapes.
+     * Because the built-in shape (see `getBuiltInShape`) will be registered by
+     * `registerShape` by default. That enables users to get both built-in
+     * shapes as well as the shapes belonging to themsleves. But users can overwrite
+     * the built-in shapes by using names like 'circle', 'rect' via calling
+     * `registerShape`. So the echarts inner featrues should not fetch shapes from here
+     * in case that it is overwritten by users, except that some features, like
+     * `custom series`, `graphic component`, do it deliberately.
+     *
+     * (2) In the features like `custom series`, `graphic component`, the user input
+     * `{tpye: 'xxx'}` does not only specify shapes but also specify other graphic
+     * elements like `'group'`, `'text'`, `'image'` or event `'path'`. Those names
+     * are reserved names, that is, if some user register a shape named `'image'`,
+     * the shape will not be used. If we intending to add some more reserved names
+     * in feature, that might bring break changes (disable some existing user shape
+     * names). But that case probably rearly happen. So we dont make more mechanism
+     * to resolve this issue here.
+     *
+     * @param name
+     * @return The shape class. If not found, return nothing.
      */
 
     function getShapeClass(name) {
@@ -14589,12 +14589,12 @@
         return _customShapeMap[name];
       }
     }
-    /**
-     * Create a path element from path data string
-     * @param pathData
-     * @param opts
-     * @param rect
-     * @param layout 'center' or 'cover' default to be cover
+    /**
+     * Create a path element from path data string
+     * @param pathData
+     * @param opts
+     * @param rect
+     * @param layout 'center' or 'cover' default to be cover
      */
 
     function makePath(pathData, opts, rect, layout) {
@@ -14610,12 +14610,12 @@
 
       return path;
     }
-    /**
-     * Create a image element from image url
-     * @param imageUrl image url
-     * @param opts options
-     * @param rect constrain rect
-     * @param layout 'center' or 'cover'. Default to be 'cover'
+    /**
+     * Create a image element from image url
+     * @param imageUrl image url
+     * @param opts options
+     * @param rect constrain rect
+     * @param layout 'center' or 'cover'. Default to be 'cover'
      */
 
     function makeImage(imageUrl, rect, layout) {
@@ -14639,12 +14639,12 @@
       });
       return zrImg;
     }
-    /**
-     * Get position of centered element in bounding box.
-     *
-     * @param  rect         element local bounding box
-     * @param  boundingRect constraint bounding box
-     * @return element position containing x, y, width, and height
+    /**
+     * Get position of centered element in bounding box.
+     *
+     * @param  rect         element local bounding box
+     * @param  boundingRect constraint bounding box
+     * @return element position containing x, y, width, and height
      */
 
     function centerGraphic(rect, boundingRect) {
@@ -14671,10 +14671,10 @@
     }
 
     var mergePath$1 = mergePath;
-    /**
-     * Resize a path to fit the rect
-     * @param path
-     * @param rect
+    /**
+     * Resize a path to fit the rect
+     * @param path
+     * @param rect
      */
 
     function resizePath(path, rect) {
@@ -14686,38 +14686,38 @@
       var m = pathRect.calculateTransform(rect);
       path.applyTransform(m);
     }
-    /**
-     * Sub pixel optimize line for canvas
+    /**
+     * Sub pixel optimize line for canvas
      */
 
     function subPixelOptimizeLine$1(param) {
       subPixelOptimizeLine(param.shape, param.shape, param.style);
       return param;
     }
-    /**
-     * Sub pixel optimize rect for canvas
+    /**
+     * Sub pixel optimize rect for canvas
      */
 
     function subPixelOptimizeRect$1(param) {
       subPixelOptimizeRect(param.shape, param.shape, param.style);
       return param;
     }
-    /**
-     * Sub pixel optimize for canvas
-     *
-     * @param position Coordinate, such as x, y
-     * @param lineWidth Should be nonnegative integer.
-     * @param positiveOrNegative Default false (negative).
-     * @return Optimized position.
+    /**
+     * Sub pixel optimize for canvas
+     *
+     * @param position Coordinate, such as x, y
+     * @param lineWidth Should be nonnegative integer.
+     * @param positiveOrNegative Default false (negative).
+     * @return Optimized position.
      */
 
     var subPixelOptimize$1 = subPixelOptimize;
-    /**
-     * Get transform matrix of target (param target),
-     * in coordinate of its ancestor (param ancestor)
-     *
-     * @param target
-     * @param [ancestor]
+    /**
+     * Get transform matrix of target (param target),
+     * in coordinate of its ancestor (param ancestor)
+     *
+     * @param target
+     * @param [ancestor]
      */
 
     function getTransform(target, ancestor) {
@@ -14730,14 +14730,14 @@
 
       return mat;
     }
-    /**
-     * Apply transform to an vertex.
-     * @param target [x, y]
-     * @param transform Can be:
-     *      + Transform matrix: like [1, 0, 0, 1, 0, 0]
-     *      + {position, rotation, scale}, the same as `zrender/Transformable`.
-     * @param invert Whether use invert matrix.
-     * @return [x, y]
+    /**
+     * Apply transform to an vertex.
+     * @param target [x, y]
+     * @param transform Can be:
+     *      + Transform matrix: like [1, 0, 0, 1, 0, 0]
+     *      + {position, rotation, scale}, the same as `zrender/Transformable`.
+     * @param invert Whether use invert matrix.
+     * @return [x, y]
      */
 
     function applyTransform$1(target, transform, invert$1) {
@@ -14751,11 +14751,11 @@
 
       return applyTransform([], target, transform);
     }
-    /**
-     * @param direction 'left' 'right' 'top' 'bottom'
-     * @param transform Transform matrix: like [1, 0, 0, 1, 0, 0]
-     * @param invert Whether use invert matrix.
-     * @return Transformed direction. 'left' 'right' 'top' 'bottom'
+    /**
+     * @param direction 'left' 'right' 'top' 'bottom'
+     * @param transform Transform matrix: like [1, 0, 0, 1, 0, 0]
+     * @param invert Whether use invert matrix.
+     * @return Transformed direction. 'left' 'right' 'top' 'bottom'
      */
 
     function transformDirection(direction, transform, invert) {
@@ -14774,9 +14774,9 @@
     function isPath(el) {
       return el.shape != null;
     }
-    /**
-     * Apply group transition animation from g1 to g2.
-     * If no animatableModel, no animation.
+    /**
+     * Apply group transition animation from g1 to g2.
+     * If no animatableModel, no animation.
      */
 
 
@@ -14835,8 +14835,8 @@
         return [x, y];
       });
     }
-    /**
-     * Return a new clipped rect. If rect size are negative, return undefined.
+    /**
+     * Return a new clipped rect. If rect size are negative, return undefined.
      */
 
     function clipRectByRect(targetRect, rect) {
@@ -14874,11 +14874,11 @@
         return iconStr.indexOf('image://') === 0 ? (style.image = iconStr.slice(8), defaults(style, rect), new ZRImage(innerOpts)) : makePath(iconStr.replace('path://', ''), innerOpts, rect, 'center');
       }
     }
-    /**
-     * Return `true` if the given line (line `a`) and the given polygon
-     * are intersect.
-     * Note that we do not count colinear as intersect here because no
-     * requirement for that. We could do that if required in future.
+    /**
+     * Return `true` if the given line (line `a`) and the given polygon
+     * are intersect.
+     * Note that we do not count colinear as intersect here because no
+     * requirement for that. We could do that if required in future.
      */
 
     function linePolygonIntersect(a1x, a1y, a2x, a2y, points) {
@@ -14892,11 +14892,11 @@
         p2 = p;
       }
     }
-    /**
-     * Return `true` if the given two lines (line `a` and line `b`)
-     * are intersect.
-     * Note that we do not count colinear as intersect here because no
-     * requirement for that. We could do that if required in future.
+    /**
+     * Return `true` if the given two lines (line `a` and line `b`)
+     * are intersect.
+     * Note that we do not count colinear as intersect here because no
+     * requirement for that. We could do that if required in future.
      */
 
     function lineLineIntersect(a1x, a1y, a2x, a2y, b1x, b1y, b2x, b2y) {
@@ -14933,8 +14933,8 @@
 
       return true;
     }
-    /**
-     * Cross product of 2-dimension vector.
+    /**
+     * Cross product of 2-dimension vector.
      */
 
     function crossProduct2d(x1, y1, x2, y2) {
@@ -15228,8 +15228,8 @@
 
       return statesModels;
     }
-    /**
-     * Set basic textStyle properties.
+    /**
+     * Set basic textStyle properties.
      */
 
     function createTextStyle(textStyleModel, specifiedTextStyle, // Fixed style in the code. Can't be set by model.
@@ -15274,14 +15274,14 @@
       textConfig.outsideFill = textStyleModel.get('color') === 'inherit' ? opt.inheritColor || null : 'auto';
       return textConfig;
     }
-    /**
-     * The uniform entry of set text style, that is, retrieve style definitions
-     * from `model` and set to `textStyle` object.
-     *
-     * Never in merge mode, but in overwrite mode, that is, all of the text style
-     * properties will be set. (Consider the states of normal and emphasis and
-     * default value can be adopted, merge would make the logic too complicated
-     * to manage.)
+    /**
+     * The uniform entry of set text style, that is, retrieve style definitions
+     * from `model` and set to `textStyle` object.
+     *
+     * Never in merge mode, but in overwrite mode, that is, all of the text style
+     * properties will be set. (Consider the states of normal and emphasis and
+     * default value can be adopted, merge would make the logic too complicated
+     * to manage.)
      */
 
     function setTextStyleCommon(textStyle, textStyleModel, opt, isNotNormal, isAttached) {
@@ -15569,8 +15569,8 @@
     /** @class */
     function () {
       function TextStyleMixin() {}
-      /**
-       * Get color property or get color from option.textStyle.color
+      /**
+       * Get color property or get color from option.textStyle.color
        */
       // TODO Callback
 
@@ -15579,9 +15579,9 @@
         var ecModel = this.ecModel;
         return this.getShallow('color') || (!isEmphasis && ecModel ? ecModel.get(PATH_COLOR) : null);
       };
-      /**
-       * Create font string from fontStyle, fontWeight, fontSize, fontFamily
-       * @return {string}
+      /**
+       * Create font string from fontStyle, fontWeight, fontSize, fontFamily
+       * @return {string}
        */
 
 
@@ -15670,14 +15670,14 @@
           rest[_i - 3] = arguments[_i];
         }
       };
-      /**
-       * Merge the input option to me.
+      /**
+       * Merge the input option to me.
        */
 
 
       Model.prototype.mergeOption = function (option, ecModel) {
         merge(this.option, option, true);
-      }; // `path` can be 'xxx.yyy.zzz', so the return value type have to be `ModelOption`
+      }; // `path` can be 'a.b.c', so the return value type have to be `ModelOption`
       // TODO: TYPE strict key check?
       // get(path: string | string[], ignoreParent?: boolean): ModelOption;
 
@@ -15704,9 +15704,9 @@
         }
 
         return val;
-      }; // `path` can be 'xxx.yyy.zzz', so the return value type have to be `Model<ModelOption>`
+      }; // `path` can be 'a.b.c', so the return value type have to be `Model<ModelOption>`
       // getModel(path: string | string[], parentModel?: Model): Model;
-      // TODO 'xxx.yyy.zzz' is deprecated
+      // TODO 'a.b.c' is deprecated
 
 
       Model.prototype.getModel = function (path, parentModel) {
@@ -15716,8 +15716,8 @@
         parentModel = parentModel || this.parentModel && this.parentModel.getModel(this.resolveParentPath(pathFinal));
         return new Model(obj, parentModel, this.ecModel);
       };
-      /**
-       * If model has option
+      /**
+       * If model has option
        */
 
 
@@ -15802,10 +15802,10 @@
     mixin(Model, TextStyleMixin);
 
     var base = Math.round(Math.random() * 10);
-    /**
-     * @public
-     * @param {string} type
-     * @return {string}
+    /**
+     * @public
+     * @param {string} type
+     * @return {string}
      */
 
     function getUID(type) {
@@ -15813,8 +15813,8 @@
       // use Math.random to make id as unique as possible.
       return [type || '', base++].join('_');
     }
-    /**
-     * Implements `SubTypeDefaulterManager` for `target`.
+    /**
+     * Implements `SubTypeDefaulterManager` for `target`.
      */
 
     function enableSubTypeDefaulter(target) {
@@ -15839,22 +15839,22 @@
         return type;
       };
     }
-    /**
-     * Implements `TopologicalTravelable<any>` for `entity`.
-     *
-     * Topological travel on Activity Network (Activity On Vertices).
-     * Dependencies is defined in Model.prototype.dependencies, like ['xAxis', 'yAxis'].
-     * If 'xAxis' or 'yAxis' is absent in componentTypeList, just ignore it in topology.
-     * If there is circular dependencey, Error will be thrown.
+    /**
+     * Implements `TopologicalTravelable<any>` for `entity`.
+     *
+     * Topological travel on Activity Network (Activity On Vertices).
+     * Dependencies is defined in Model.prototype.dependencies, like ['xAxis', 'yAxis'].
+     * If 'xAxis' or 'yAxis' is absent in componentTypeList, just ignore it in topology.
+     * If there is circular dependencey, Error will be thrown.
      */
 
     function enableTopologicalTravel(entity, dependencyGetter) {
-      /**
-       * @param targetNameList Target Component type list.
-       *                       Can be ['aa', 'bb', 'aa.xx']
-       * @param fullNameList By which we can build dependency graph.
-       * @param callback Params: componentType, dependencies.
-       * @param context Scope of callback.
+      /**
+       * @param targetNameList Target Component type list.
+       *                       Can be ['aa', 'bb', 'aa.xx']
+       * @param fullNameList By which we can build dependency graph.
+       * @param callback Params: componentType, dependencies.
+       * @param context Scope of callback.
        */
       entity.topologicalTravel = function (targetNameList, fullNameList, callback, context) {
         if (!targetNameList.length) {
@@ -15991,27 +15991,27 @@
      * AUTO-GENERATED FILE. DO NOT MODIFY.
      */
 
-    /*
-    * Licensed to the Apache Software Foundation (ASF) under one
-    * or more contributor license agreements.  See the NOTICE file
-    * distributed with this work for additional information
-    * regarding copyright ownership.  The ASF licenses this file
-    * to you under the Apache License, Version 2.0 (the
-    * "License"); you may not use this file except in compliance
-    * with the License.  You may obtain a copy of the License at
-    *
-    *   http://www.apache.org/licenses/LICENSE-2.0
-    *
-    * Unless required by applicable law or agreed to in writing,
-    * software distributed under the License is distributed on an
-    * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    * KIND, either express or implied.  See the License for the
-    * specific language governing permissions and limitations
-    * under the License.
+    /*
+    * Licensed to the Apache Software Foundation (ASF) under one
+    * or more contributor license agreements.  See the NOTICE file
+    * distributed with this work for additional information
+    * regarding copyright ownership.  The ASF licenses this file
+    * to you under the Apache License, Version 2.0 (the
+    * "License"); you may not use this file except in compliance
+    * with the License.  You may obtain a copy of the License at
+    *
+    *   http://www.apache.org/licenses/LICENSE-2.0
+    *
+    * Unless required by applicable law or agreed to in writing,
+    * software distributed under the License is distributed on an
+    * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    * KIND, either express or implied.  See the License for the
+    * specific language governing permissions and limitations
+    * under the License.
     */
 
-    /**
-     * Language: English.
+    /**
+     * Language: English.
      */
     var langEN = {
       time: {
@@ -16147,23 +16147,23 @@
      * AUTO-GENERATED FILE. DO NOT MODIFY.
      */
 
-    /*
-     * Licensed to the Apache Software Foundation (ASF) under one
-     * or more contributor license agreements.  See the NOTICE file
-     * distributed with this work for additional information
-     * regarding copyright ownership.  The ASF licenses this file
-     * to you under the Apache License, Version 2.0 (the
-     * "License"); you may not use this file except in compliance
-     * with the License.  You may obtain a copy of the License at
-     *
-     *   http://www.apache.org/licenses/LICENSE-2.0
-     *
-     * Unless required by applicable law or agreed to in writing,
-     * software distributed under the License is distributed on an
-     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-     * KIND, either express or implied.  See the License for the
-     * specific language governing permissions and limitations
-     * under the License.
+    /*
+     * Licensed to the Apache Software Foundation (ASF) under one
+     * or more contributor license agreements.  See the NOTICE file
+     * distributed with this work for additional information
+     * regarding copyright ownership.  The ASF licenses this file
+     * to you under the Apache License, Version 2.0 (the
+     * "License"); you may not use this file except in compliance
+     * with the License.  You may obtain a copy of the License at
+     *
+     *   http://www.apache.org/licenses/LICENSE-2.0
+     *
+     * Unless required by applicable law or agreed to in writing,
+     * software distributed under the License is distributed on an
+     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+     * KIND, either express or implied.  See the License for the
+     * specific language governing permissions and limitations
+     * under the License.
      */
     var langZH = {
       time: {
@@ -16390,7 +16390,7 @@
       var date = parseDate(time);
       var y = date[fullYearGetterName(isUTC)]();
       var M = date[monthGetterName(isUTC)]() + 1;
-      var q = Math.floor((M - 1) / 4) + 1;
+      var q = Math.floor((M - 1) / 3) + 1;
       var d = date[dateGetterName(isUTC)]();
       var e = date['get' + (isUTC ? 'UTC' : '') + 'Day']();
       var H = date[hoursGetterName(isUTC)]();
@@ -16581,8 +16581,8 @@
       return textEl.getBoundingRect();
     }
 
-    /**
-     * Add a comma each three digit.
+    /**
+     * Add a comma each three digit.
      */
 
     function addCommas(x) {
@@ -16618,12 +16618,12 @@
         return replaceMap[c];
       });
     }
-    /**
-     * Make value user readable for tooltip and label.
-     * "User readable":
-     *     Try to not print programmer-specific text like NaN, Infinity, null, undefined.
-     *     Avoid to display an empty string, which users can not recognize there is
-     *     a value and it might look like a bug.
+    /**
+     * Make value user readable for tooltip and label.
+     * "User readable":
+     *     Try to not print programmer-specific text like NaN, Infinity, null, undefined.
+     *     Avoid to display an empty string, which users can not recognize there is
+     *     a value and it might look like a bug.
      */
 
     function makeValueReadable(value, valueType, useUTC) {
@@ -16664,9 +16664,9 @@
     var wrapVar = function (varName, seriesIdx) {
       return '{' + varName + (seriesIdx == null ? '' : seriesIdx) + '}';
     };
-    /**
-     * Template formatter
-     * @param {Array.<Object>|Object} paramsList
+    /**
+     * Template formatter
+     * @param {Array.<Object>|Object} paramsList
      */
 
 
@@ -16737,15 +16737,15 @@
         };
       }
     }
-    /**
-     * @deprecated Use `time/format` instead.
-     * ISO Date format
-     * @param {string} tpl
-     * @param {number} value
-     * @param {boolean} [isUTC=false] Default in local time.
-     *           see `module:echarts/scale/Time`
-     *           and `module:echarts/util/number#parseDate`.
-     * @inner
+    /**
+     * @deprecated Use `time/format` instead.
+     * ISO Date format
+     * @param {string} tpl
+     * @param {number} value
+     * @param {boolean} [isUTC=false] Default in local time.
+     *           see `module:echarts/scale/Time`
+     *           and `module:echarts/util/number#parseDate`.
+     * @inner
      */
 
     function formatTime(tpl, value, isUTC) {
@@ -16766,30 +16766,30 @@
       var m = date[getUTC + 'Minutes']();
       var s = date[getUTC + 'Seconds']();
       var S = date[getUTC + 'Milliseconds']();
-      tpl = tpl.replace('MM', pad(M, 2)).replace('M', M).replace('yyyy', y).replace('yy', y % 100 + '').replace('dd', pad(d, 2)).replace('d', d).replace('hh', pad(h, 2)).replace('h', h).replace('mm', pad(m, 2)).replace('m', m).replace('ss', pad(s, 2)).replace('s', s).replace('SSS', pad(S, 3));
+      tpl = tpl.replace('MM', pad(M, 2)).replace('M', M).replace('yyyy', y).replace('yy', pad(y % 100 + '', 2)).replace('dd', pad(d, 2)).replace('d', d).replace('hh', pad(h, 2)).replace('h', h).replace('mm', pad(m, 2)).replace('m', m).replace('ss', pad(s, 2)).replace('s', s).replace('SSS', pad(S, 3));
       return tpl;
     }
-    /**
-     * Capital first
-     * @param {string} str
-     * @return {string}
+    /**
+     * Capital first
+     * @param {string} str
+     * @return {string}
      */
 
     function capitalFirst(str) {
       return str ? str.charAt(0).toUpperCase() + str.substr(1) : str;
     }
-    /**
-     * @return Never be null/undefined.
+    /**
+     * @return Never be null/undefined.
      */
 
     function convertToColorString(color, defaultColor) {
       defaultColor = defaultColor || 'transparent';
       return isString(color) ? color : isObject(color) ? color.colorStops && (color.colorStops[0] || {}).color || defaultColor : defaultColor;
     }
-    /**
-     * open new tab
-     * @param link url
-     * @param target blank or self
+    /**
+     * open new tab
+     * @param link url
+     * @param target blank or self
      */
 
     function windowOpen(link, target) {
@@ -16804,13 +16804,13 @@
     }
 
     var each$1 = each;
-    /**
-     * @public
+    /**
+     * @public
      */
 
     var LOCATION_PARAMS = ['left', 'right', 'top', 'bottom', 'width', 'height'];
-    /**
-     * @public
+    /**
+     * @public
      */
 
     var HV_NAMES = [['width', 'left', 'right'], ['height', 'top', 'bottom']];
@@ -16873,37 +16873,37 @@
         orient === 'horizontal' ? x = nextX + gap : y = nextY + gap;
       });
     }
-    /**
-     * VBox or HBox layouting
-     * @param {string} orient
-     * @param {module:zrender/graphic/Group} group
-     * @param {number} gap
-     * @param {number} [width=Infinity]
-     * @param {number} [height=Infinity]
+    /**
+     * VBox or HBox layouting
+     * @param {string} orient
+     * @param {module:zrender/graphic/Group} group
+     * @param {number} gap
+     * @param {number} [width=Infinity]
+     * @param {number} [height=Infinity]
      */
 
 
     var box = boxLayout;
-    /**
-     * VBox layouting
-     * @param {module:zrender/graphic/Group} group
-     * @param {number} gap
-     * @param {number} [width=Infinity]
-     * @param {number} [height=Infinity]
+    /**
+     * VBox layouting
+     * @param {module:zrender/graphic/Group} group
+     * @param {number} gap
+     * @param {number} [width=Infinity]
+     * @param {number} [height=Infinity]
      */
 
     var vbox = curry(boxLayout, 'vertical');
-    /**
-     * HBox layouting
-     * @param {module:zrender/graphic/Group} group
-     * @param {number} gap
-     * @param {number} [width=Infinity]
-     * @param {number} [height=Infinity]
+    /**
+     * HBox layouting
+     * @param {module:zrender/graphic/Group} group
+     * @param {number} gap
+     * @param {number} [width=Infinity]
+     * @param {number} [height=Infinity]
      */
 
     var hbox = curry(boxLayout, 'horizontal');
-    /**
-     * Parse position info.
+    /**
+     * Parse position info.
      */
 
     function getLayoutRect(positionInfo, containerRect, margin) {
@@ -17003,45 +17003,45 @@
       rect.margin = margin;
       return rect;
     }
-    /**
-     * Position a zr element in viewport
-     *  Group position is specified by either
-     *  {left, top}, {right, bottom}
-     *  If all properties exists, right and bottom will be igonred.
-     *
-     * Logic:
-     *     1. Scale (against origin point in parent coord)
-     *     2. Rotate (against origin point in parent coord)
-     *     3. Traslate (with el.position by this method)
-     * So this method only fixes the last step 'Traslate', which does not affect
-     * scaling and rotating.
-     *
-     * If be called repeatly with the same input el, the same result will be gotten.
-     *
-     * Return true if the layout happend.
-     *
-     * @param el Should have `getBoundingRect` method.
-     * @param positionInfo
-     * @param positionInfo.left
-     * @param positionInfo.top
-     * @param positionInfo.right
-     * @param positionInfo.bottom
-     * @param positionInfo.width Only for opt.boundingModel: 'raw'
-     * @param positionInfo.height Only for opt.boundingModel: 'raw'
-     * @param containerRect
-     * @param margin
-     * @param opt
-     * @param opt.hv Only horizontal or only vertical. Default to be [1, 1]
-     * @param opt.boundingMode
-     *        Specify how to calculate boundingRect when locating.
-     *        'all': Position the boundingRect that is transformed and uioned
-     *               both itself and its descendants.
-     *               This mode simplies confine the elements in the bounding
-     *               of their container (e.g., using 'right: 0').
-     *        'raw': Position the boundingRect that is not transformed and only itself.
-     *               This mode is useful when you want a element can overflow its
-     *               container. (Consider a rotated circle needs to be located in a corner.)
-     *               In this mode positionInfo.width/height can only be number.
+    /**
+     * Position a zr element in viewport
+     *  Group position is specified by either
+     *  {left, top}, {right, bottom}
+     *  If all properties exists, right and bottom will be igonred.
+     *
+     * Logic:
+     *     1. Scale (against origin point in parent coord)
+     *     2. Rotate (against origin point in parent coord)
+     *     3. Traslate (with el.position by this method)
+     * So this method only fixes the last step 'Traslate', which does not affect
+     * scaling and rotating.
+     *
+     * If be called repeatly with the same input el, the same result will be gotten.
+     *
+     * Return true if the layout happend.
+     *
+     * @param el Should have `getBoundingRect` method.
+     * @param positionInfo
+     * @param positionInfo.left
+     * @param positionInfo.top
+     * @param positionInfo.right
+     * @param positionInfo.bottom
+     * @param positionInfo.width Only for opt.boundingModel: 'raw'
+     * @param positionInfo.height Only for opt.boundingModel: 'raw'
+     * @param containerRect
+     * @param margin
+     * @param opt
+     * @param opt.hv Only horizontal or only vertical. Default to be [1, 1]
+     * @param opt.boundingMode
+     *        Specify how to calculate boundingRect when locating.
+     *        'all': Position the boundingRect that is transformed and uioned
+     *               both itself and its descendants.
+     *               This mode simplies confine the elements in the bounding
+     *               of their container (e.g., using 'right: 0').
+     *        'raw': Position the boundingRect that is not transformed and only itself.
+     *               This mode is useful when you want a element can overflow its
+     *               container. (Consider a rotated circle needs to be located in a corner.)
+     *               In this mode positionInfo.width/height can only be number.
      */
 
     function positionElement(el, positionInfo, containerRect, margin, opt, out) {
@@ -17103,28 +17103,28 @@
         type: layoutMode
       } : null;
     }
-    /**
-     * Consider Case:
-     * When default option has {left: 0, width: 100}, and we set {right: 0}
-     * through setOption or media query, using normal zrUtil.merge will cause
-     * {right: 0} does not take effect.
-     *
-     * @example
-     * ComponentModel.extend({
-     *     init: function () {
-     *         ...
-     *         let inputPositionParams = layout.getLayoutParams(option);
-     *         this.mergeOption(inputPositionParams);
-     *     },
-     *     mergeOption: function (newOption) {
-     *         newOption && zrUtil.merge(thisOption, newOption, true);
-     *         layout.mergeLayoutParam(thisOption, newOption);
-     *     }
-     * });
-     *
-     * @param targetOption
-     * @param newOption
-     * @param opt
+    /**
+     * Consider Case:
+     * When default option has {left: 0, width: 100}, and we set {right: 0}
+     * through setOption or media query, using normal zrUtil.merge will cause
+     * {right: 0} does not take effect.
+     *
+     * @example
+     * ComponentModel.extend({
+     *     init: function () {
+     *         ...
+     *         let inputPositionParams = layout.getLayoutParams(option);
+     *         this.mergeOption(inputPositionParams);
+     *     },
+     *     mergeOption: function (newOption) {
+     *         newOption && zrUtil.merge(thisOption, newOption, true);
+     *         layout.mergeLayoutParam(thisOption, newOption);
+     *     }
+     * });
+     *
+     * @param targetOption
+     * @param newOption
+     * @param opt
      */
 
     function mergeLayoutParam(targetOption, newOption, opt) {
@@ -17203,17 +17203,17 @@
         });
       }
     }
-    /**
-     * Retrieve 'left', 'right', 'top', 'bottom', 'width', 'height' from object.
+    /**
+     * Retrieve 'left', 'right', 'top', 'bottom', 'width', 'height' from object.
      */
 
     function getLayoutParams(source) {
       return copyLayoutParams({}, source);
     }
-    /**
-     * Retrieve 'left', 'right', 'top', 'bottom', 'width', 'height' from object.
-     * @param {Object} source
-     * @return {Object} Result contains those props.
+    /**
+     * Retrieve 'left', 'right', 'top', 'bottom', 'width', 'height' from object.
+     * @param {Object} source
+     * @return {Object} Result contains those props.
      */
 
     function copyLayoutParams(target, source) {
@@ -17261,65 +17261,65 @@
           mergeLayoutParam(this.option, option, layoutMode);
         }
       };
-      /**
-       * Called immediately after `init` or `mergeOption` of this instance called.
+      /**
+       * Called immediately after `init` or `mergeOption` of this instance called.
        */
 
 
       ComponentModel.prototype.optionUpdated = function (newCptOption, isInit) {};
-      /**
-       * [How to declare defaultOption]:
-       *
-       * (A) If using class declaration in typescript (since echarts 5):
-       * ```ts
-       * import {ComponentOption} from '../model/option.js';
-       * export interface XxxOption extends ComponentOption {
-       *     aaa: number
-       * }
-       * export class XxxModel extends Component {
-       *     static type = 'xxx';
-       *     static defaultOption: XxxOption = {
-       *         aaa: 123
-       *     }
-       * }
-       * Component.registerClass(XxxModel);
-       * ```
-       * ```ts
-       * import {inheritDefaultOption} from '../util/component.js';
-       * import {XxxModel, XxxOption} from './XxxModel.js';
-       * export interface XxxSubOption extends XxxOption {
-       *     bbb: number
-       * }
-       * class XxxSubModel extends XxxModel {
-       *     static defaultOption: XxxSubOption = inheritDefaultOption(XxxModel.defaultOption, {
-       *         bbb: 456
-       *     })
-       *     fn() {
-       *         let opt = this.getDefaultOption();
-       *         // opt is {aaa: 123, bbb: 456}
-       *     }
-       * }
-       * ```
-       *
-       * (B) If using class extend (previous approach in echarts 3 & 4):
-       * ```js
-       * let XxxComponent = Component.extend({
-       *     defaultOption: {
-       *         xx: 123
-       *     }
-       * })
-       * ```
-       * ```js
-       * let XxxSubComponent = XxxComponent.extend({
-       *     defaultOption: {
-       *         yy: 456
-       *     },
-       *     fn: function () {
-       *         let opt = this.getDefaultOption();
-       *         // opt is {xx: 123, yy: 456}
-       *     }
-       * })
-       * ```
+      /**
+       * [How to declare defaultOption]:
+       *
+       * (A) If using class declaration in typescript (since echarts 5):
+       * ```ts
+       * import {ComponentOption} from '../model/option.js';
+       * export interface XxxOption extends ComponentOption {
+       *     aaa: number
+       * }
+       * export class XxxModel extends Component {
+       *     static type = 'xxx';
+       *     static defaultOption: XxxOption = {
+       *         aaa: 123
+       *     }
+       * }
+       * Component.registerClass(XxxModel);
+       * ```
+       * ```ts
+       * import {inheritDefaultOption} from '../util/component.js';
+       * import {XxxModel, XxxOption} from './XxxModel.js';
+       * export interface XxxSubOption extends XxxOption {
+       *     bbb: number
+       * }
+       * class XxxSubModel extends XxxModel {
+       *     static defaultOption: XxxSubOption = inheritDefaultOption(XxxModel.defaultOption, {
+       *         bbb: 456
+       *     })
+       *     fn() {
+       *         let opt = this.getDefaultOption();
+       *         // opt is {aaa: 123, bbb: 456}
+       *     }
+       * }
+       * ```
+       *
+       * (B) If using class extend (previous approach in echarts 3 & 4):
+       * ```js
+       * let XxxComponent = Component.extend({
+       *     defaultOption: {
+       *         xx: 123
+       *     }
+       * })
+       * ```
+       * ```js
+       * let XxxSubComponent = XxxComponent.extend({
+       *     defaultOption: {
+       *         yy: 456
+       *     },
+       *     fn: function () {
+       *         let opt = this.getDefaultOption();
+       *         // opt is {xx: 123, yy: 456}
+       *     }
+       * })
+       * ```
        */
 
 
@@ -17357,13 +17357,13 @@
 
         return fields.defaultOption;
       };
-      /**
-       * Notice: always force to input param `useDefault` in case that forget to consider it.
-       * The same behavior as `modelUtil.parseFinder`.
-       *
-       * @param useDefault In many cases like series refer axis and axis refer grid,
-       *        If axis index / axis id not specified, use the first target as default.
-       *        In other cases like dataZoom refer axis, if not specified, measn no refer.
+      /**
+       * Notice: always force to input param `useDefault` in case that forget to consider it.
+       * The same behavior as `modelUtil.parseFinder`.
+       *
+       * @param useDefault In many cases like series refer axis and axis refer grid,
+       *        If axis index / axis id not specified, use the first target as default.
+       *        In other cases like dataZoom refer axis, if not specified, measn no refer.
        */
 
 
@@ -17388,10 +17388,10 @@
           height: boxLayoutModel.get('height')
         };
       };
-      /**
-       * Get key for zlevel.
-       * If developers don't configure zlevel. We will assign zlevel to series based on the key.
-       * For example, lines with trail effect and progressive series will in an individual zlevel.
+      /**
+       * Get key for zlevel.
+       * If developers don't configure zlevel. We will assign zlevel to series based on the key.
+       * For example, lines with trail effect and progressive series will in an individual zlevel.
        */
 
 
@@ -17462,23 +17462,23 @@
      * AUTO-GENERATED FILE. DO NOT MODIFY.
      */
 
-    /*
-    * Licensed to the Apache Software Foundation (ASF) under one
-    * or more contributor license agreements.  See the NOTICE file
-    * distributed with this work for additional information
-    * regarding copyright ownership.  The ASF licenses this file
-    * to you under the Apache License, Version 2.0 (the
-    * "License"); you may not use this file except in compliance
-    * with the License.  You may obtain a copy of the License at
-    *
-    *   http://www.apache.org/licenses/LICENSE-2.0
-    *
-    * Unless required by applicable law or agreed to in writing,
-    * software distributed under the License is distributed on an
-    * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    * KIND, either express or implied.  See the License for the
-    * specific language governing permissions and limitations
-    * under the License.
+    /*
+    * Licensed to the Apache Software Foundation (ASF) under one
+    * or more contributor license agreements.  See the NOTICE file
+    * distributed with this work for additional information
+    * regarding copyright ownership.  The ASF licenses this file
+    * to you under the Apache License, Version 2.0 (the
+    * "License"); you may not use this file except in compliance
+    * with the License.  You may obtain a copy of the License at
+    *
+    *   http://www.apache.org/licenses/LICENSE-2.0
+    *
+    * Unless required by applicable law or agreed to in writing,
+    * software distributed under the License is distributed on an
+    * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    * KIND, either express or implied.  See the License for the
+    * specific language governing permissions and limitations
+    * under the License.
     */
     var platform = ''; // Navigator not exists in node
 
@@ -17587,28 +17587,28 @@
 
     };
     var innerGlobalModel = makeInner();
-    /**
-     * MUST be called before mergeOption of all series.
+    /**
+     * MUST be called before mergeOption of all series.
      */
 
     function resetSourceDefaulter(ecModel) {
       // `datasetMap` is used to make default encode.
       innerGlobalModel(ecModel).datasetMap = createHashMap();
     }
-    /**
-     * [The strategy of the arrengment of data dimensions for dataset]:
-     * "value way": all axes are non-category axes. So series one by one take
-     *     several (the number is coordSysDims.length) dimensions from dataset.
-     *     The result of data arrengment of data dimensions like:
-     *     | ser0_x | ser0_y | ser1_x | ser1_y | ser2_x | ser2_y |
-     * "category way": at least one axis is category axis. So the the first data
-     *     dimension is always mapped to the first category axis and shared by
-     *     all of the series. The other data dimensions are taken by series like
-     *     "value way" does.
-     *     The result of data arrengment of data dimensions like:
-     *     | ser_shared_x | ser0_y | ser1_y | ser2_y |
-     *
-     * @return encode Never be `null/undefined`.
+    /**
+     * [The strategy of the arrengment of data dimensions for dataset]:
+     * "value way": all axes are non-category axes. So series one by one take
+     *     several (the number is coordSysDims.length) dimensions from dataset.
+     *     The result of data arrengment of data dimensions like:
+     *     | ser0_x | ser0_y | ser1_x | ser1_y | ser2_x | ser2_y |
+     * "category way": at least one axis is category axis. So the the first data
+     *     dimension is always mapped to the first category axis and shared by
+     *     all of the series. The other data dimensions are taken by series like
+     *     "value way" does.
+     *     The result of data arrengment of data dimensions like:
+     *     | ser_shared_x | ser0_y | ser1_y | ser2_y |
+     *
+     * @return encode Never be `null/undefined`.
      */
 
     function makeSeriesEncodeForAxisCoordSys(coordDimensions, seriesModel, source) {
@@ -17687,10 +17687,10 @@
       encodeSeriesName.length && (encode.seriesName = encodeSeriesName);
       return encode;
     }
-    /**
-     * Work for data like [{name: ..., value: ...}, ...].
-     *
-     * @return encode Never be `null/undefined`.
+    /**
+     * Work for data like [{name: ..., value: ...}, ...].
+     *
+     * @return encode Never be `null/undefined`.
      */
 
     function makeSeriesEncodeForNameBased(seriesModel, source, dimCount) {
@@ -17773,8 +17773,8 @@
 
       return encode;
     }
-    /**
-     * @return If return null/undefined, indicate that should not use datasetModel.
+    /**
+     * @return If return null/undefined, indicate that should not use datasetModel.
      */
 
     function querySeriesUpstreamDatasetModel(seriesModel) {
@@ -17792,8 +17792,8 @@
         }, SINGLE_REFERRING).models[0];
       }
     }
-    /**
-     * @return Always return an array event empty.
+    /**
+     * @return Always return an array event empty.
      */
 
     function queryDatasetUpstreamDatasetModels(datasetModel) {
@@ -17808,10 +17808,10 @@
         id: datasetModel.get('fromDatasetId', true)
       }, SINGLE_REFERRING).models;
     }
-    /**
-     * The rule should not be complex, otherwise user might not
-     * be able to known where the data is wrong.
-     * The code is ugly, but how to make it neat?
+    /**
+     * The rule should not be complex, otherwise user might not
+     * be able to known where the data is wrong.
+     * The code is ugly, but how to make it neat?
      */
 
     function guessOrdinal(source, dimIndex) {
@@ -17995,11 +17995,11 @@
 
       return palettes[paletteNum - 1];
     }
-    /**
-     * @param name MUST NOT be null/undefined. Otherwise call this function
-     *             twise with the same parameters will get different result.
-     * @param scope default this.
-     * @return Can be null/undefined
+    /**
+     * @param name MUST NOT be null/undefined. Otherwise call this function
+     *             twise with the same parameters will get different result.
+     * @param scope default this.
+     * @return Can be null/undefined
      */
 
 
@@ -18141,12 +18141,12 @@
 
         this._resetOption(null, innerOpt);
       };
-      /**
-       * @param type null/undefined: reset all.
-       *        'recreate': force recreate all.
-       *        'timeline': only reset timeline option
-       *        'media': only reset media query option
-       * @return Whether option changed.
+      /**
+       * @param type null/undefined: reset all.
+       *        'recreate': force recreate all.
+       *        'timeline': only reset timeline option
+       *        'media': only reset media query option
+       * @return Whether option changed.
        */
 
 
@@ -18381,8 +18381,8 @@
           reCreateSeriesIndices(this);
         }
       };
-      /**
-       * Get option for output (cloned option and inner info removed)
+      /**
+       * Get option for output (cloned option and inner info removed)
        */
 
 
@@ -18430,8 +18430,8 @@
       GlobalModel.prototype.getUpdatePayload = function () {
         return this._payload;
       };
-      /**
-       * @param idx If not specified, return the first one.
+      /**
+       * @param idx If not specified, return the first one.
        */
 
 
@@ -18452,8 +18452,8 @@
           }
         }
       };
-      /**
-       * @return Never be null/undefined.
+      /**
+       * @return Never be null/undefined.
        */
 
 
@@ -18494,22 +18494,22 @@
 
         return filterBySubType(result, condition);
       };
-      /**
-       * The interface is different from queryComponents,
-       * which is convenient for inner usage.
-       *
-       * @usage
-       * let result = findComponents(
-       *     {mainType: 'dataZoom', query: {dataZoomId: 'abc'}}
-       * );
-       * let result = findComponents(
-       *     {mainType: 'series', subType: 'pie', query: {seriesName: 'uio'}}
-       * );
-       * let result = findComponents(
-       *     {mainType: 'series',
-       *     filter: function (model, index) {...}}
-       * );
-       * // result like [component0, componnet1, ...]
+      /**
+       * The interface is different from queryComponents,
+       * which is convenient for inner usage.
+       *
+       * @usage
+       * let result = findComponents(
+       *     {mainType: 'dataZoom', query: {dataZoomId: 'abc'}}
+       * );
+       * let result = findComponents(
+       *     {mainType: 'series', subType: 'pie', query: {seriesName: 'uio'}}
+       * );
+       * let result = findComponents(
+       *     {mainType: 'series',
+       *     filter: function (model, index) {...}}
+       * );
+       * // result like [component0, componnet1, ...]
        */
 
 
@@ -18562,8 +18562,8 @@
           }
         }
       };
-      /**
-       * Get series list before filtered by name.
+      /**
+       * Get series list before filtered by name.
        */
 
 
@@ -18573,17 +18573,17 @@
           return !!oneSeries && nameStr != null && oneSeries.name === nameStr;
         });
       };
-      /**
-       * Get series list before filtered by index.
+      /**
+       * Get series list before filtered by index.
        */
 
 
       GlobalModel.prototype.getSeriesByIndex = function (seriesIndex) {
         return this._componentsMap.get('series')[seriesIndex];
       };
-      /**
-       * Get series list before filtered by type.
-       * FIXME: rename to getRawSeriesByType?
+      /**
+       * Get series list before filtered by type.
+       * FIXME: rename to getRawSeriesByType?
        */
 
 
@@ -18592,8 +18592,8 @@
           return !!oneSeries && oneSeries.subType === subType;
         });
       };
-      /**
-       * Get all series before filtered.
+      /**
+       * Get all series before filtered.
        */
 
 
@@ -18602,17 +18602,17 @@
           return !!oneSeries;
         });
       };
-      /**
-       * Count series before filtered.
+      /**
+       * Count series before filtered.
        */
 
 
       GlobalModel.prototype.getSeriesCount = function () {
         return this._componentsCount.get('series');
       };
-      /**
-       * After filtering, series may be different
-       * frome raw series.
+      /**
+       * After filtering, series may be different
+       * frome raw series.
        */
 
 
@@ -18624,11 +18624,11 @@
           cb.call(context, series, rawSeriesIndex);
         }, this);
       };
-      /**
-       * Iterate raw series before filtered.
-       *
-       * @param {Function} cb
-       * @param {*} context
+      /**
+       * Iterate raw series before filtered.
+       *
+       * @param {Function} cb
+       * @param {*} context
        */
 
 
@@ -18637,9 +18637,9 @@
           series && cb.call(context, series, series.componentIndex);
         });
       };
-      /**
-       * After filtering, series may be different.
-       * frome raw series.
+      /**
+       * After filtering, series may be different.
+       * frome raw series.
        */
 
 
@@ -18653,8 +18653,8 @@
           }
         }, this);
       };
-      /**
-       * Iterate raw series before filtered of given type.
+      /**
+       * Iterate raw series before filtered of given type.
        */
 
 
@@ -18888,9 +18888,9 @@
     var QUERY_REG = /^(min|max)?(.+)$/; // Key: mainType
     // type FakeComponentsMap = HashMap<(MappingExistingItem & { subType: string })[]>;
 
-    /**
-     * TERM EXPLANATIONS:
-     * See `ECOption` and `ECUnitOption` in `src/util/types.ts`.
+    /**
+     * TERM EXPLANATIONS:
+     * See `ECOption` and `ECUnitOption` in `src/util/types.ts`.
      */
 
     var OptionManager =
@@ -18907,9 +18907,9 @@
       function OptionManager(api) {
         this._timelineOptions = [];
         this._mediaList = [];
-        /**
-         * -1, means default.
-         * empty means no media.
+        /**
+         * -1, means default.
+         * empty means no media.
          */
 
         this._currentMediaIndices = [];
@@ -19044,66 +19044,66 @@
 
       return OptionManager;
     }();
-    /**
-     * [RAW_OPTION_PATTERNS]
-     * (Note: "series: []" represents all other props in `ECUnitOption`)
-     *
-     * (1) No prop "baseOption" declared:
-     * Root option is used as "baseOption" (except prop "options" and "media").
-     * ```js
-     * option = {
-     *     series: [],
-     *     timeline: {},
-     *     options: [],
-     * };
-     * option = {
-     *     series: [],
-     *     media: {},
-     * };
-     * option = {
-     *     series: [],
-     *     timeline: {},
-     *     options: [],
-     *     media: {},
-     * }
-     * ```
-     *
-     * (2) Prop "baseOption" declared:
-     * If "baseOption" declared, `ECUnitOption` props can only be declared
-     * inside "baseOption" except prop "timeline" (compat ec2).
-     * ```js
-     * option = {
-     *     baseOption: {
-     *         timeline: {},
-     *         series: [],
-     *     },
-     *     options: []
-     * };
-     * option = {
-     *     baseOption: {
-     *         series: [],
-     *     },
-     *     media: []
-     * };
-     * option = {
-     *     baseOption: {
-     *         timeline: {},
-     *         series: [],
-     *     },
-     *     options: []
-     *     media: []
-     * };
-     * option = {
-     *     // ec3 compat ec2: allow (only) `timeline` declared
-     *     // outside baseOption. Keep this setting for compat.
-     *     timeline: {},
-     *     baseOption: {
-     *         series: [],
-     *     },
-     *     options: [],
-     *     media: []
-     * };
-     * ```
+    /**
+     * [RAW_OPTION_PATTERNS]
+     * (Note: "series: []" represents all other props in `ECUnitOption`)
+     *
+     * (1) No prop "baseOption" declared:
+     * Root option is used as "baseOption" (except prop "options" and "media").
+     * ```js
+     * option = {
+     *     series: [],
+     *     timeline: {},
+     *     options: [],
+     * };
+     * option = {
+     *     series: [],
+     *     media: {},
+     * };
+     * option = {
+     *     series: [],
+     *     timeline: {},
+     *     options: [],
+     *     media: {},
+     * }
+     * ```
+     *
+     * (2) Prop "baseOption" declared:
+     * If "baseOption" declared, `ECUnitOption` props can only be declared
+     * inside "baseOption" except prop "timeline" (compat ec2).
+     * ```js
+     * option = {
+     *     baseOption: {
+     *         timeline: {},
+     *         series: [],
+     *     },
+     *     options: []
+     * };
+     * option = {
+     *     baseOption: {
+     *         series: [],
+     *     },
+     *     media: []
+     * };
+     * option = {
+     *     baseOption: {
+     *         timeline: {},
+     *         series: [],
+     *     },
+     *     options: []
+     *     media: []
+     * };
+     * option = {
+     *     // ec3 compat ec2: allow (only) `timeline` declared
+     *     // outside baseOption. Keep this setting for compat.
+     *     timeline: {},
+     *     baseOption: {
+     *         series: [],
+     *     },
+     *     options: [],
+     *     media: []
+     * };
+     * ```
      */
 
 
@@ -19184,10 +19184,10 @@
         mediaList: mediaList
       };
     }
-    /**
-     * @see <http://www.w3.org/TR/css3-mediaqueries/#media1>
-     * Support: width, height, aspectRatio
-     * Can use max or min as prefix.
+    /**
+     * @see <http://www.w3.org/TR/css3-mediaqueries/#media1>
+     * Support: width, height, aspectRatio
+     * Can use max or min as prefix.
      */
 
 
@@ -19826,13 +19826,13 @@
 
     //     data processing stage is blocked in stream.
     //     See <module:echarts/stream/Scheduler#performDataProcessorTasks>
-    // (2) Only register once when import repeatly.
-    //     Should be executed after series filtered and before stack calculation.
+    // (2) Only register once when import repeatedly.
+    //     Should be executed after series is filtered and before stack calculation.
 
     function dataStack(ecModel) {
       var stackInfoMap = createHashMap();
       ecModel.eachSeries(function (seriesModel) {
-        var stack = seriesModel.get('stack'); // Compatibal: when `stack` is set as '', do not stack.
+        var stack = seriesModel.get('stack'); // Compatible: when `stack` is set as '', do not stack.
 
         if (stack) {
           var stackInfoList = stackInfoMap.get(stack) || stackInfoMap.set(stack, []);
@@ -19866,7 +19866,8 @@
         var resultNaN = [NaN, NaN];
         var dims = [targetStackInfo.stackResultDimension, targetStackInfo.stackedOverDimension];
         var targetData = targetStackInfo.data;
-        var isStackedByIndex = targetStackInfo.isStackedByIndex; // Should not write on raw data, because stack series model list changes
+        var isStackedByIndex = targetStackInfo.isStackedByIndex;
+        var stackStrategy = targetStackInfo.seriesModel.get('stackStrategy') || 'samesign'; // Should not write on raw data, because stack series model list changes
         // depending on legend selection.
 
         targetData.modify(dims, function (v0, v1, dataIndex) {
@@ -19899,12 +19900,13 @@
             if (stackedDataRawIndex >= 0) {
               var val = stackInfo.data.getByRawIndex(stackInfo.stackResultDimension, stackedDataRawIndex); // Considering positive stack, negative stack and empty data
 
-              if (sum >= 0 && val > 0 || // Positive stack
-              sum <= 0 && val < 0 // Negative stack
+              if (stackStrategy === 'all' // single stack group
+              || stackStrategy === 'positive' && val > 0 || stackStrategy === 'negative' && val < 0 || stackStrategy === 'samesign' && sum >= 0 && val > 0 // All positive stack
+              || stackStrategy === 'samesign' && sum <= 0 && val < 0 // All negative stack
               ) {
-                  // The sum should be as less as possible to be effected
-                  // by floating arithmetic problem. A wrong result probably
-                  // filtered incorrectly by axis min/max.
+                  // The sum has to be very small to be affected by the
+                  // floating arithmetic problem. An incorrect result will probably
+                  // cause axis min/max to be filtered incorrectly.
                   sum = addSafe(sum, val);
                   stackedOver = val;
                   break;
@@ -19951,9 +19953,9 @@
     function isSourceInstance(val) {
       return val instanceof SourceImpl;
     }
-    /**
-     * Create a source from option.
-     * NOTE: Created source is immutable. Don't change any properties in it.
+    /**
+     * Create a source from option.
+     * NOTE: Created source is immutable. Don't change any properties in it.
      */
 
     function createSource(sourceData, thisMetaRawOption, // can be null. If not provided, auto detect it from `sourceData`.
@@ -19972,8 +19974,8 @@
       });
       return source;
     }
-    /**
-     * Wrap original series data for some compatibility cases.
+    /**
+     * Wrap original series data for some compatibility cases.
      */
 
     function createSourceFromSeriesDataOption(data) {
@@ -19982,8 +19984,8 @@
         sourceFormat: isTypedArray(data) ? SOURCE_FORMAT_TYPED_ARRAY : SOURCE_FORMAT_ORIGINAL
       });
     }
-    /**
-     * Clone source but excludes source data.
+    /**
+     * Clone source but excludes source data.
      */
 
     function cloneSourceShallow(source) {
@@ -19996,8 +19998,8 @@
         dimensionsDetectedCount: source.dimensionsDetectedCount
       });
     }
-    /**
-     * Note: An empty array will be detected as `SOURCE_FORMAT_ARRAY_ROWS`.
+    /**
+     * Note: An empty array will be detected as `SOURCE_FORMAT_ARRAY_ROWS`.
      */
 
     function detectSourceFormat(data) {
@@ -20035,9 +20037,9 @@
 
       return sourceFormat;
     }
-    /**
-     * Determine the source definitions from data standalone dimensions definitions
-     * are not specified.
+    /**
+     * Determine the source definitions from data standalone dimensions definitions
+     * are not specified.
      */
 
     function determineSourceDimensions(data, sourceFormat, seriesLayoutBy, sourceHeader, // standalone raw dimensions definition, like:
@@ -20228,30 +20230,30 @@
      * AUTO-GENERATED FILE. DO NOT MODIFY.
      */
 
-    /*
-    * Licensed to the Apache Software Foundation (ASF) under one
-    * or more contributor license agreements.  See the NOTICE file
-    * distributed with this work for additional information
-    * regarding copyright ownership.  The ASF licenses this file
-    * to you under the Apache License, Version 2.0 (the
-    * "License"); you may not use this file except in compliance
-    * with the License.  You may obtain a copy of the License at
-    *
-    *   http://www.apache.org/licenses/LICENSE-2.0
-    *
-    * Unless required by applicable law or agreed to in writing,
-    * software distributed under the License is distributed on an
-    * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    * KIND, either express or implied.  See the License for the
-    * specific language governing permissions and limitations
-    * under the License.
+    /*
+    * Licensed to the Apache Software Foundation (ASF) under one
+    * or more contributor license agreements.  See the NOTICE file
+    * distributed with this work for additional information
+    * regarding copyright ownership.  The ASF licenses this file
+    * to you under the Apache License, Version 2.0 (the
+    * "License"); you may not use this file except in compliance
+    * with the License.  You may obtain a copy of the License at
+    *
+    *   http://www.apache.org/licenses/LICENSE-2.0
+    *
+    * Unless required by applicable law or agreed to in writing,
+    * software distributed under the License is distributed on an
+    * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    * KIND, either express or implied.  See the License for the
+    * specific language governing permissions and limitations
+    * under the License.
     */
     var _a, _b, _c; // TODO
     var providerMethods;
     var mountMethods;
-    /**
-     * If normal array used, mutable chunk size is supported.
-     * If typed array used, chunk size must be fixed.
+    /**
+     * If normal array used, mutable chunk size is supported.
+     * If typed array used, chunk size must be fixed.
      */
 
     var DefaultDataProvider =
@@ -20573,8 +20575,8 @@
     /** @class */
     function () {
       function DataFormatMixin() {}
-      /**
-       * Get params for formatter
+      /**
+       * Get params for formatter
        */
 
 
@@ -20611,15 +20613,15 @@
           $vars: ['seriesName', 'name', 'value']
         };
       };
-      /**
-       * Format label
-       * @param dataIndex
-       * @param status 'normal' by default
-       * @param dataType
-       * @param labelDimIndex Only used in some chart that
-       *        use formatter in different dimensions, like radar.
-       * @param formatter Formatter given outside.
-       * @return return null/undefined if no formatter
+      /**
+       * Format label
+       * @param dataIndex
+       * @param status 'normal' by default
+       * @param dataType
+       * @param labelDimIndex Only used in some chart that
+       *        use formatter in different dimensions, like radar.
+       * @param formatter Formatter given outside.
+       * @return return null/undefined if no formatter
        */
 
 
@@ -20678,19 +20680,19 @@
           });
         }
       };
-      /**
-       * Get raw value in option
+      /**
+       * Get raw value in option
        */
 
 
       DataFormatMixin.prototype.getRawValue = function (idx, dataType) {
         return retrieveRawValue(this.getData(dataType), idx);
       };
-      /**
-       * Should be implemented.
-       * @param {number} dataIndex
-       * @param {boolean} [multipleSeries=false]
-       * @param {string} [dataType]
+      /**
+       * Should be implemented.
+       * @param {number} dataIndex
+       * @param {boolean} [multipleSeries=false]
+       * @param {string} [dataType]
        */
 
 
@@ -20711,8 +20713,8 @@
     //     markers: Dictionary<ColorString>;
     // };
 
-    /**
-     * For backward compat, normalize the return from `formatTooltip`.
+    /**
+     * For backward compat, normalize the return from `formatTooltip`.
      */
 
     function normalizeTooltipFormatResult(result) {
@@ -20746,9 +20748,9 @@
       };
     }
 
-    /**
-     * @param {Object} define
-     * @return See the return of `createTask`.
+    /**
+     * @param {Object} define
+     * @return See the return of `createTask`.
      */
 
     function createTask(define) {
@@ -20766,12 +20768,12 @@
         this._onDirty = define.onDirty;
         this._dirty = true;
       }
-      /**
-       * @param step Specified step.
-       * @param skip Skip customer perform call.
-       * @param modBy Sampling window size.
-       * @param modDataCount Sampling count.
-       * @return whether unfinished.
+      /**
+       * @param step Specified step.
+       * @param skip Skip customer perform call.
+       * @param modBy Sampling window size.
+       * @param modDataCount Sampling count.
+       * @return whether unfinished.
        */
 
 
@@ -20925,9 +20927,9 @@
       Task.prototype.unfinished = function () {
         return this._progress && this._dueIndex < this._dueEnd;
       };
-      /**
-       * @param downTask The downstream task.
-       * @return The downstream task.
+      /**
+       * @param downTask The downstream task.
+       * @return The downstream task.
        */
 
 
@@ -21090,13 +21092,13 @@
     //     }
     // };
 
-    /**
-     * Convert raw the value in to inner value in List.
-     *
-     * [Performance sensitive]
-     *
-     * [Caution]: this is the key logic of user value parser.
-     * For backward compatibiliy, do not modify it until have to!
+    /**
+     * Convert raw the value in to inner value in List.
+     *
+     * [Performance sensitive]
+     *
+     * [Caution]: this is the key logic of user value parser.
+     * For backward compatibiliy, do not modify it until have to!
      */
 
     function parseDataValue(value, // For high performance, do not omit the second param.
@@ -21142,11 +21144,11 @@
     var SortOrderComparator =
     /** @class */
     function () {
-      /**
-       * @param order by defualt: 'asc'
-       * @param incomparable by defualt: Always on the tail.
-       *        That is, if 'asc' => 'max', if 'desc' => 'min'
-       *        See the definition of "incomparable" in [SORT_COMPARISON_RULE]
+      /**
+       * @param order by defualt: 'asc'
+       * @param incomparable by defualt: Always on the tail.
+       *        That is, if 'asc' => 'max', if 'desc' => 'min'
+       *        See the definition of "incomparable" in [SORT_COMPARISON_RULE]
        */
       function SortOrderComparator(order, incomparable) {
         var isDesc = order === 'desc';
@@ -21195,9 +21197,9 @@
       return SortOrderComparator;
     }();
 
-    /**
-     * TODO: disable writable.
-     * This structure will be exposed to users.
+    /**
+     * TODO: disable writable.
+     * This structure will be exposed to users.
      */
 
     var ExternalSource =
@@ -21218,22 +21220,22 @@
       ExternalSource.prototype.cloneRawData = function () {
         return;
       };
-      /**
-       * @return If dimension not found, return null/undefined.
+      /**
+       * @return If dimension not found, return null/undefined.
        */
 
 
       ExternalSource.prototype.getDimensionInfo = function (dim) {
         return;
       };
-      /**
-       * dimensions defined if and only if either:
-       * (a) dataset.dimensions are declared.
-       * (b) dataset data include dimensions definitions in data (detected or via specified `sourceHeader`).
-       * If dimensions are defined, `dimensionInfoAll` is corresponding to
-       * the defined dimensions.
-       * Otherwise, `dimensionInfoAll` is determined by data columns.
-       * @return Always return an array (even empty array).
+      /**
+       * dimensions defined if and only if either:
+       * (a) dataset.dimensions are declared.
+       * (b) dataset data include dimensions definitions in data (detected or via specified `sourceHeader`).
+       * If dimensions are defined, `dimensionInfoAll` is corresponding to
+       * the defined dimensions.
+       * Otherwise, `dimensionInfoAll` is determined by data columns.
+       * @return Always return an array (even empty array).
        */
 
 
@@ -21244,10 +21246,10 @@
       ExternalSource.prototype.count = function () {
         return;
       };
-      /**
-       * Only support by dimension index.
-       * No need to support by dimension name in transform function,
-       * becuase transform function is not case-specific, no need to use name literally.
+      /**
+       * Only support by dimension index.
+       * No need to support by dimension name in transform function,
+       * becuase transform function is not case-specific, no need to use name literally.
        */
 
 
@@ -21585,27 +21587,27 @@
 
         var resultMetaRawOption;
         var firstUpSource = upSourceList[0];
-        /**
-         * Intuitively, the end users known the content of the original `dataset.source`,
-         * calucating the transform result in mind.
-         * Suppose the original `dataset.source` is:
-         * ```js
-         * [
-         *     ['product', '2012', '2013', '2014', '2015'],
-         *     ['AAA', 41.1, 30.4, 65.1, 53.3],
-         *     ['BBB', 86.5, 92.1, 85.7, 83.1],
-         *     ['CCC', 24.1, 67.2, 79.5, 86.4]
-         * ]
-         * ```
-         * The dimension info have to be detected from the source data.
-         * Some of the transformers (like filter, sort) will follow the dimension info
-         * of upstream, while others use new dimensions (like aggregate).
-         * Transformer can output a field `dimensions` to define the its own output dimensions.
-         * We also allow transformers to ignore the output `dimensions` field, and
-         * inherit the upstream dimensions definition. It can reduce the burden of handling
-         * dimensions in transformers.
-         *
-         * See also [DIMENSION_INHERIT_RULE] in `sourceManager.ts`.
+        /**
+         * Intuitively, the end users known the content of the original `dataset.source`,
+         * calucating the transform result in mind.
+         * Suppose the original `dataset.source` is:
+         * ```js
+         * [
+         *     ['product', '2012', '2013', '2014', '2015'],
+         *     ['AAA', 41.1, 30.4, 65.1, 53.3],
+         *     ['BBB', 86.5, 92.1, 85.7, 83.1],
+         *     ['CCC', 24.1, 67.2, 79.5, 86.4]
+         * ]
+         * ```
+         * The dimension info have to be detected from the source data.
+         * Some of the transformers (like filter, sort) will follow the dimension info
+         * of upstream, while others use new dimensions (like aggregate).
+         * Transformer can output a field `dimensions` to define the its own output dimensions.
+         * We also allow transformers to ignore the output `dimensions` field, and
+         * inherit the upstream dimensions definition. It can reduce the burden of handling
+         * dimensions in transformers.
+         *
+         * See also [DIMENSION_INHERIT_RULE] in `sourceManager.ts`.
          */
 
         if (firstUpSource && resultIndex === 0 // If transformer returns `dimensions`, it means that the transformer has different
@@ -21652,8 +21654,8 @@
     var CtorUint16Array = typeof Uint16Array === UNDEFINED ? Array : Uint16Array;
     var CtorInt32Array = typeof Int32Array === UNDEFINED ? Array : Int32Array;
     var CtorFloat64Array = typeof Float64Array === UNDEFINED ? Array : Float64Array;
-    /**
-     * Multi dimensional data store
+    /**
+     * Multi dimensional data store
      */
 
     var dataCtors = {
@@ -21702,8 +21704,8 @@
         store[dimIdx] = new DataCtor(end);
       }
     }
-    /**
-     * Basically, DataStore API keep immutable.
+    /**
+     * Basically, DataStore API keep immutable.
      */
 
     var DataStore =
@@ -21718,14 +21720,14 @@
         this._rawCount = 0;
         this._calcDimNameToIdx = createHashMap();
       }
-      /**
-       * Initialize from data
+      /**
+       * Initialize from data
        */
 
 
       DataStore.prototype.initData = function (provider, inputDimensions, dimValueGetter) {
         if ("development" !== 'production') {
-          assert(isFunction(provider.getItem) && isFunction(provider.count), 'Inavlid data provider.');
+          assert(isFunction(provider.getItem) && isFunction(provider.count), 'Invalid data provider.');
         }
 
         this._provider = provider; // Clear
@@ -21760,20 +21762,20 @@
       DataStore.prototype.getProvider = function () {
         return this._provider;
       };
-      /**
-       * Caution: even when a `source` instance owned by a series, the created data store
-       * may still be shared by different sereis (the source hash does not use all `source`
-       * props, see `sourceManager`). In this case, the `source` props that are not used in
-       * hash (like `source.dimensionDefine`) probably only belongs to a certain series and
-       * thus should not be fetch here.
+      /**
+       * Caution: even when a `source` instance owned by a series, the created data store
+       * may still be shared by different sereis (the source hash does not use all `source`
+       * props, see `sourceManager`). In this case, the `source` props that are not used in
+       * hash (like `source.dimensionDefine`) probably only belongs to a certain series and
+       * thus should not be fetch here.
        */
 
 
       DataStore.prototype.getSource = function () {
         return this._provider.getSource();
       };
-      /**
-       * @caution Only used in dataStack.
+      /**
+       * @caution Only used in dataStack.
        */
 
 
@@ -21838,8 +21840,8 @@
         var item = this._dimensions[dimIndex];
         return item && item.property;
       };
-      /**
-       * Caution: Can be only called on raw data (before `this._indices` created).
+      /**
+       * Caution: Can be only called on raw data (before `this._indices` created).
        */
 
 
@@ -21960,8 +21962,8 @@
       DataStore.prototype.count = function () {
         return this._count;
       };
-      /**
-       * Get value. Return NaN if idx is out of range.
+      /**
+       * Get value. Return NaN if idx is out of range.
        */
 
 
@@ -21996,8 +21998,8 @@
 
         return values;
       };
-      /**
-       * @param dim concrete dim
+      /**
+       * @param dim concrete dim
        */
 
 
@@ -22009,8 +22011,8 @@
         var dimStore = this._chunks[dim];
         return dimStore ? dimStore[rawIdx] : NaN;
       };
-      /**
-       * Get sum of data in one dimension
+      /**
+       * Get sum of data in one dimension
        */
 
 
@@ -22030,8 +22032,8 @@
 
         return sum;
       };
-      /**
-       * Get median of data in one dimension
+      /**
+       * Get median of data in one dimension
        */
 
 
@@ -22052,8 +22054,8 @@
 
         return len === 0 ? 0 : len % 2 === 1 ? sortedDimDataArray[(len - 1) / 2] : (sortedDimDataArray[len / 2] + sortedDimDataArray[len / 2 - 1]) / 2;
       };
-      /**
-       * Retreive the index with given raw data index
+      /**
+       * Retreive the index with given raw data index
        */
 
 
@@ -22092,13 +22094,13 @@
 
         return -1;
       };
-      /**
-       * Retreive the index of nearest value
-       * @param dim
-       * @param value
-       * @param [maxDistance=Infinity]
-       * @return If and only if multiple indices has
-       *         the same value, they are put to the result.
+      /**
+       * Retreive the index of nearest value
+       * @param dim
+       * @param value
+       * @param [maxDistance=Infinity]
+       * @return If and only if multiple indices has
+       *         the same value, they are put to the result.
        */
 
 
@@ -22175,8 +22177,8 @@
 
         return newIndices;
       };
-      /**
-       * Data filter.
+      /**
+       * Data filter.
        */
 
 
@@ -22233,9 +22235,9 @@
 
         return newStore;
       };
-      /**
-       * Select data in range. (For optimization of filter)
-       * (Manually inline code, support 5 million data filtering in data zoom.)
+      /**
+       * Select data in range. (For optimization of filter)
+       * (Manually inline code, support 5 million data filtering in data zoom.)
        */
 
 
@@ -22361,8 +22363,8 @@
       //     return result;
       // }
 
-      /**
-       * Data mapping to a new List with given dimensions
+      /**
+       * Data mapping to a new List with given dimensions
        */
 
 
@@ -22374,8 +22376,8 @@
 
         return target;
       };
-      /**
-       * @caution Danger!! Only used in dataStack.
+      /**
+       * @caution Danger!! Only used in dataStack.
        */
 
 
@@ -22433,10 +22435,10 @@
           }
         }
       };
-      /**
-       * Large data down sampling using largest-triangle-three-buckets
-       * @param {string} valueDimension
-       * @param {number} targetCount
+      /**
+       * Large data down sampling using largest-triangle-three-buckets
+       * @param {string} valueDimension
+       * @param {number} targetCount
        */
 
 
@@ -22524,9 +22526,9 @@
         target.getRawIndex = this._getRawIdx;
         return target;
       };
-      /**
-       * Large data down sampling on given dimension
-       * @param sampleIndex Sample index for name and id
+      /**
+       * Large data down sampling on given dimension
+       * @param sampleIndex Sample index for name and id
        */
 
 
@@ -22576,13 +22578,13 @@
 
         return target;
       };
-      /**
-       * Data iteration
-       * @param ctx default this
-       * @example
-       *  list.each('x', function (x, idx) {});
-       *  list.each(['x', 'y'], function (x, y, idx) {});
-       *  list.each(function (idx) {})
+      /**
+       * Data iteration
+       * @param ctx default this
+       * @example
+       *  list.each('x', function (x, idx) {});
+       *  list.each(['x', 'y'], function (x, y, idx) {});
+       *  list.each(function (idx) {})
        */
 
 
@@ -22624,8 +22626,8 @@
           }
         }
       };
-      /**
-       * Get extent of data in one dimension
+      /**
+       * Get extent of data in one dimension
        */
 
 
@@ -22671,8 +22673,8 @@
         this._extent[dim] = dimExtent;
         return dimExtent;
       };
-      /**
-       * Get raw data item
+      /**
+       * Get raw data item
        */
 
 
@@ -22692,10 +22694,10 @@
           return this._provider.getItem(rawIdx);
         }
       };
-      /**
-       * Clone shallow.
-       *
-       * @param clonedDims Determine which dims to clone. Will share the data if not specified.
+      /**
+       * Clone shallow.
+       *
+       * @param clonedDims Determine which dims to clone. Will share the data if not specified.
        */
 
 
@@ -22803,95 +22805,95 @@
       return DataStore;
     }();
 
-    /**
-     * [REQUIREMENT_MEMO]:
-     * (0) `metaRawOption` means `dimensions`/`sourceHeader`/`seriesLayoutBy` in raw option.
-     * (1) Keep support the feature: `metaRawOption` can be specified both on `series` and
-     * `root-dataset`. Them on `series` has higher priority.
-     * (2) Do not support to set `metaRawOption` on a `non-root-dataset`, because it might
-     * confuse users: whether those props indicate how to visit the upstream source or visit
-     * the transform result source, and some transforms has nothing to do with these props,
-     * and some transforms might have multiple upstream.
-     * (3) Transforms should specify `metaRawOption` in each output, just like they can be
-     * declared in `root-dataset`.
-     * (4) At present only support visit source in `SERIES_LAYOUT_BY_COLUMN` in transforms.
-     * That is for reducing complexity in transfroms.
-     * PENDING: Whether to provide transposition transform?
-     *
-     * [IMPLEMENTAION_MEMO]:
-     * "sourceVisitConfig" are calculated from `metaRawOption` and `data`.
-     * They will not be calculated until `source` is about to be visited (to prevent from
-     * duplicate calcuation). `source` is visited only in series and input to transforms.
-     *
-     * [DIMENSION_INHERIT_RULE]:
-     * By default the dimensions are inherited from ancestors, unless a transform return
-     * a new dimensions definition.
-     * Consider the case:
-     * ```js
-     * dataset: [{
-     *     source: [ ['Product', 'Sales', 'Prise'], ['Cookies', 321, 44.21], ...]
-     * }, {
-     *     transform: { type: 'filter', ... }
-     * }]
-     * dataset: [{
-     *     dimension: ['Product', 'Sales', 'Prise'],
-     *     source: [ ['Cookies', 321, 44.21], ...]
-     * }, {
-     *     transform: { type: 'filter', ... }
-     * }]
-     * ```
-     * The two types of option should have the same behavior after transform.
-     *
-     *
-     * [SCENARIO]:
-     * (1) Provide source data directly:
-     * ```js
-     * series: {
-     *     encode: {...},
-     *     dimensions: [...]
-     *     seriesLayoutBy: 'row',
-     *     data: [[...]]
-     * }
-     * ```
-     * (2) Series refer to dataset.
-     * ```js
-     * series: [{
-     *     encode: {...}
-     *     // Ignore datasetIndex means `datasetIndex: 0`
-     *     // and the dimensions defination in dataset is used
-     * }, {
-     *     encode: {...},
-     *     seriesLayoutBy: 'column',
-     *     datasetIndex: 1
-     * }]
-     * ```
-     * (3) dataset transform
-     * ```js
-     * dataset: [{
-     *     source: [...]
-     * }, {
-     *     source: [...]
-     * }, {
-     *     // By default from 0.
-     *     transform: { type: 'filter', config: {...} }
-     * }, {
-     *     // Piped.
-     *     transform: [
-     *         { type: 'filter', config: {...} },
-     *         { type: 'sort', config: {...} }
-     *     ]
-     * }, {
-     *     id: 'regressionData',
-     *     fromDatasetIndex: 1,
-     *     // Third-party transform
-     *     transform: { type: 'ecStat:regression', config: {...} }
-     * }, {
-     *     // retrieve the extra result.
-     *     id: 'regressionFormula',
-     *     fromDatasetId: 'regressionData',
-     *     fromTransformResult: 1
-     * }]
-     * ```
+    /**
+     * [REQUIREMENT_MEMO]:
+     * (0) `metaRawOption` means `dimensions`/`sourceHeader`/`seriesLayoutBy` in raw option.
+     * (1) Keep support the feature: `metaRawOption` can be specified both on `series` and
+     * `root-dataset`. Them on `series` has higher priority.
+     * (2) Do not support to set `metaRawOption` on a `non-root-dataset`, because it might
+     * confuse users: whether those props indicate how to visit the upstream source or visit
+     * the transform result source, and some transforms has nothing to do with these props,
+     * and some transforms might have multiple upstream.
+     * (3) Transforms should specify `metaRawOption` in each output, just like they can be
+     * declared in `root-dataset`.
+     * (4) At present only support visit source in `SERIES_LAYOUT_BY_COLUMN` in transforms.
+     * That is for reducing complexity in transfroms.
+     * PENDING: Whether to provide transposition transform?
+     *
+     * [IMPLEMENTAION_MEMO]:
+     * "sourceVisitConfig" are calculated from `metaRawOption` and `data`.
+     * They will not be calculated until `source` is about to be visited (to prevent from
+     * duplicate calcuation). `source` is visited only in series and input to transforms.
+     *
+     * [DIMENSION_INHERIT_RULE]:
+     * By default the dimensions are inherited from ancestors, unless a transform return
+     * a new dimensions definition.
+     * Consider the case:
+     * ```js
+     * dataset: [{
+     *     source: [ ['Product', 'Sales', 'Prise'], ['Cookies', 321, 44.21], ...]
+     * }, {
+     *     transform: { type: 'filter', ... }
+     * }]
+     * dataset: [{
+     *     dimension: ['Product', 'Sales', 'Prise'],
+     *     source: [ ['Cookies', 321, 44.21], ...]
+     * }, {
+     *     transform: { type: 'filter', ... }
+     * }]
+     * ```
+     * The two types of option should have the same behavior after transform.
+     *
+     *
+     * [SCENARIO]:
+     * (1) Provide source data directly:
+     * ```js
+     * series: {
+     *     encode: {...},
+     *     dimensions: [...]
+     *     seriesLayoutBy: 'row',
+     *     data: [[...]]
+     * }
+     * ```
+     * (2) Series refer to dataset.
+     * ```js
+     * series: [{
+     *     encode: {...}
+     *     // Ignore datasetIndex means `datasetIndex: 0`
+     *     // and the dimensions defination in dataset is used
+     * }, {
+     *     encode: {...},
+     *     seriesLayoutBy: 'column',
+     *     datasetIndex: 1
+     * }]
+     * ```
+     * (3) dataset transform
+     * ```js
+     * dataset: [{
+     *     source: [...]
+     * }, {
+     *     source: [...]
+     * }, {
+     *     // By default from 0.
+     *     transform: { type: 'filter', config: {...} }
+     * }, {
+     *     // Piped.
+     *     transform: [
+     *         { type: 'filter', config: {...} },
+     *         { type: 'sort', config: {...} }
+     *     ]
+     * }, {
+     *     id: 'regressionData',
+     *     fromDatasetIndex: 1,
+     *     // Third-party transform
+     *     transform: { type: 'ecStat:regression', config: {...} }
+     * }, {
+     *     // retrieve the extra result.
+     *     id: 'regressionFormula',
+     *     fromDatasetId: 'regressionData',
+     *     fromTransformResult: 1
+     * }]
+     * ```
      */
 
     var SourceManager =
@@ -22907,8 +22909,8 @@
         this._dirty = true;
         this._sourceHost = sourceHost;
       }
-      /**
-       * Mark dirty.
+      /**
+       * Mark dirty.
        */
 
 
@@ -22928,17 +22930,17 @@
           this._versionSignBase = 0;
         }
       };
-      /**
-       * For detecting whether the upstream source is dirty, so that
-       * the local cached source (in `_sourceList`) should be discarded.
+      /**
+       * For detecting whether the upstream source is dirty, so that
+       * the local cached source (in `_sourceList`) should be discarded.
        */
 
 
       SourceManager.prototype._getVersionSign = function () {
         return this._sourceHost.uid + '_' + this._versionSignBase;
       };
-      /**
-       * Always return a source instance. Otherwise throw error.
+      /**
+       * Always return a source instance. Otherwise throw error.
        */
 
 
@@ -23096,9 +23098,9 @@
           }
         }
       };
-      /**
-       * @param sourceIndex By defualt 0, means "main source".
-       *                    Most cases there is only one source.
+      /**
+       * @param sourceIndex By defualt 0, means "main source".
+       *                    Most cases there is only one source.
        */
 
 
@@ -23115,13 +23117,13 @@
 
         return source;
       };
-      /**
-       *
-       * Get a data store which can be shared across series.
-       * Only available for series.
-       *
-       * @param seriesDimRequest Dimensions that are generated in series.
-       *        Should have been sorted by `storeDimIndex` asc.
+      /**
+       *
+       * Get a data store which can be shared across series.
+       * Only available for series.
+       *
+       * @param seriesDimRequest Dimensions that are generated in series.
+       *        Should have been sorted by `storeDimIndex` asc.
        */
 
 
@@ -23162,9 +23164,9 @@
 
         return cachedStore;
       };
-      /**
-       * PEDING: Is it fast enough?
-       * If no upstream, return empty array.
+      /**
+       * PEDING: Is it fast enough?
+       * If no upstream, return empty array.
        */
 
 
@@ -23386,8 +23388,8 @@
       return renderMode === 'richText' ? (noMarker ? '' : markerStr) + (noName ? '' : wrapInlineNameRichText(ctx, readableName, nameStyle)) // Value has commas inside, so use ' ' as delimiter for multiple values.
       + (noValue ? '' : wrapInlineValueRichText(ctx, readableValueList, valueAlignRight, valueCloseToMarker, valueStyle)) : wrapBlockHTML((noMarker ? '' : markerStr) + (noName ? '' : wrapInlineNameHTML(readableName, !noMarker, nameStyle)) + (noValue ? '' : wrapInlineValueHTML(readableValueList, valueAlignRight, valueCloseToMarker, valueStyle)), topMarginForOuterGap);
     }
-    /**
-     * @return markupText. null/undefined means no content.
+    /**
+     * @return markupText. null/undefined means no content.
      */
 
 
@@ -23461,10 +23463,10 @@
       return padding != null ? padding // We give slightly different to look pretty.
       : renderMode === 'richText' ? [8, 10] : 10;
     }
-    /**
-     * The major feature is generate styles for `renderMode: 'richText'`.
-     * But it also serves `renderMode: 'html'` to provide
-     * "renderMode-independent" API.
+    /**
+     * The major feature is generate styles for `renderMode: 'richText'`.
+     * But it also serves `renderMode: 'html'` to provide
+     * "renderMode-independent" API.
      */
 
     var TooltipMarkupStyleCreator =
@@ -23502,20 +23504,20 @@
           return marker.content;
         }
       };
-      /**
-       * @usage
-       * ```ts
-       * const styledText = markupStyleCreator.wrapRichTextStyle([
-       *     // The styles will be auto merged.
-       *     {
-       *         fontSize: 12,
-       *         color: 'blue'
-       *     },
-       *     {
-       *         padding: 20
-       *     }
-       * ]);
-       * ```
+      /**
+       * @usage
+       * ```ts
+       * const styledText = markupStyleCreator.wrapRichTextStyle([
+       *     // The styles will be auto merged.
+       *     {
+       *         fontSize: 12,
+       *         color: 'blue'
+       *     },
+       *     {
+       *         padding: 20
+       *     }
+       * ]);
+       * ```
        */
 
 
@@ -23706,8 +23708,8 @@
 
         this._initSelectedMapFromData(data);
       };
-      /**
-       * Util for merge default and theme to option
+      /**
+       * Util for merge default and theme to option
        */
 
 
@@ -23772,17 +23774,17 @@
           }
         }
       };
-      /**
-       * Init a data structure from data related option in series
-       * Must be overriden.
+      /**
+       * Init a data structure from data related option in series
+       * Must be overriden.
        */
 
 
       SeriesModel.prototype.getInitialData = function (option, ecModel) {
         return;
       };
-      /**
-       * Append data to list
+      /**
+       * Append data to list
        */
 
 
@@ -23793,11 +23795,11 @@
         var data = this.getRawData();
         data.appendData(params.data);
       };
-      /**
-       * Consider some method like `filter`, `map` need make new data,
-       * We should make sure that `seriesModel.getData()` get correct
-       * data in the stream procedure. So we fetch data from upstream
-       * each time `task.perform` called.
+      /**
+       * Consider some method like `filter`, `map` need make new data,
+       * We should make sure that `seriesModel.getData()` get correct
+       * data in the stream procedure. So we fetch data from upstream
+       * each time `task.perform` called.
        */
 
 
@@ -23865,8 +23867,8 @@
       SeriesModel.prototype.getSource = function () {
         return this.getSourceManager().getSource();
       };
-      /**
-       * Get data before processed
+      /**
+       * Get data before processed
        */
 
 
@@ -23882,11 +23884,11 @@
       SeriesModel.prototype.isColorBySeries = function () {
         return this.getColorBy() === 'series';
       };
-      /**
-       * Get base axis if has coordinate system and has axis.
-       * By default use coordSys.getBaseAxis();
-       * Can be overrided for some chart.
-       * @return {type} description
+      /**
+       * Get base axis if has coordinate system and has axis.
+       * By default use coordSys.getBaseAxis();
+       * Can be overrided for some chart.
+       * @return {type} description
        */
 
 
@@ -23895,19 +23897,19 @@
 
         return coordSys && coordSys.getBaseAxis && coordSys.getBaseAxis();
       };
-      /**
-       * Default tooltip formatter
-       *
-       * @param dataIndex
-       * @param multipleSeries
-       * @param dataType
-       * @param renderMode valid values: 'html'(by default) and 'richText'.
-       *        'html' is used for rendering tooltip in extra DOM form, and the result
-       *        string is used as DOM HTML content.
-       *        'richText' is used for rendering tooltip in rich text form, for those where
-       *        DOM operation is not supported.
-       * @return formatted tooltip with `html` and `markers`
-       *        Notice: The override method can also return string
+      /**
+       * Default tooltip formatter
+       *
+       * @param dataIndex
+       * @param multipleSeries
+       * @param dataType
+       * @param renderMode valid values: 'html'(by default) and 'richText'.
+       *        'html' is used for rendering tooltip in extra DOM form, and the result
+       *        string is used as DOM HTML content.
+       *        'richText' is used for rendering tooltip in rich text form, for those where
+       *        DOM operation is not supported.
+       * @return formatted tooltip with `html` and `markers`
+       *        Notice: The override method can also return string
        */
 
 
@@ -23953,25 +23955,25 @@
 
         return color;
       };
-      /**
-       * Use `data.mapDimensionsAll(coordDim)` instead.
-       * @deprecated
+      /**
+       * Use `data.mapDimensionsAll(coordDim)` instead.
+       * @deprecated
        */
 
 
       SeriesModel.prototype.coordDimToDataDim = function (coordDim) {
         return this.getRawData().mapDimensionsAll(coordDim);
       };
-      /**
-       * Get progressive rendering count each step
+      /**
+       * Get progressive rendering count each step
        */
 
 
       SeriesModel.prototype.getProgressive = function () {
         return this.get('progressive');
       };
-      /**
-       * Get progressive rendering count each step
+      /**
+       * Get progressive rendering count each step
        */
 
 
@@ -24152,10 +24154,10 @@
     mixin(SeriesModel, DataFormatMixin);
     mixin(SeriesModel, PaletteMixin);
     mountExtend(SeriesModel, ComponentModel);
-    /**
-     * MUST be called after `prepareSource` called
-     * Here we need to make auto series, especially for auto legend. But we
-     * do not modify series.name in option to avoid side effects.
+    /**
+     * MUST be called after `prepareSource` called
+     * Here we need to make auto series, especially for auto legend. But we
+     * do not modify series.name in option to avoid side effects.
      */
 
     function autoSeriesName(seriesModel) {
@@ -24257,19 +24259,19 @@
 
       ComponentView.prototype.updateVisual = function (model, ecModel, api, payload) {// Do nothing;
       };
-      /**
-       * Hook for toggle blur target series.
-       * Can be used in marker for blur or leave blur the markers
+      /**
+       * Hook for toggle blur target series.
+       * Can be used in marker for blur or leave blur the markers
        */
 
 
       ComponentView.prototype.toggleBlurSeries = function (seriesModels, isBlur, ecModel) {// Do nothing;
       };
-      /**
-       * Traverse the new rendered elements.
-       *
-       * It will traverse the new added element in progressive rendering.
-       * And traverse all in normal rendering.
+      /**
+       * Traverse the new rendered elements.
+       *
+       * It will traverse the new added element in progressive rendering.
+       * And traverse all in normal rendering.
        */
 
 
@@ -24286,8 +24288,8 @@
     enableClassExtend(ComponentView);
     enableClassManagement(ComponentView);
 
-    /**
-     * @return {string} If large mode changed, return string 'reset';
+    /**
+     * @return {string} If large mode changed, return string 'reset';
      */
 
     function createRenderPlanner() {
@@ -24331,8 +24333,8 @@
           throw new Error('render method must been implemented');
         }
       };
-      /**
-       * Highlight series or specified data item.
+      /**
+       * Highlight series or specified data item.
        */
 
 
@@ -24349,8 +24351,8 @@
 
         toggleHighlight(data, payload, 'emphasis');
       };
-      /**
-       * Downplay series or specified data item.
+      /**
+       * Downplay series or specified data item.
        */
 
 
@@ -24367,16 +24369,16 @@
 
         toggleHighlight(data, payload, 'normal');
       };
-      /**
-       * Remove self.
+      /**
+       * Remove self.
        */
 
 
       ChartView.prototype.remove = function (ecModel, api) {
         this.group.removeAll();
       };
-      /**
-       * Dispose self.
+      /**
+       * Dispose self.
        */
 
 
@@ -24395,11 +24397,11 @@
       ChartView.prototype.updateVisual = function (seriesModel, ecModel, api, payload) {
         this.render(seriesModel, ecModel, api, payload);
       };
-      /**
-       * Traverse the new rendered elements.
-       *
-       * It will traverse the new added element in progressive rendering.
-       * And traverse all in normal rendering.
+      /**
+       * Traverse the new rendered elements.
+       *
+       * It will traverse the new added element in progressive rendering.
+       * And traverse all in normal rendering.
        */
 
 
@@ -24418,8 +24420,8 @@
 
       return ChartView;
     }();
-    /**
-     * Set state of single element
+    /**
+     * Set state of single element
      */
 
     function elSetState(el, state, highlightDigit) {
@@ -24512,35 +24514,35 @@
      * AUTO-GENERATED FILE. DO NOT MODIFY.
      */
 
-    /*
-    * Licensed to the Apache Software Foundation (ASF) under one
-    * or more contributor license agreements.  See the NOTICE file
-    * distributed with this work for additional information
-    * regarding copyright ownership.  The ASF licenses this file
-    * to you under the Apache License, Version 2.0 (the
-    * "License"); you may not use this file except in compliance
-    * with the License.  You may obtain a copy of the License at
-    *
-    *   http://www.apache.org/licenses/LICENSE-2.0
-    *
-    * Unless required by applicable law or agreed to in writing,
-    * software distributed under the License is distributed on an
-    * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    * KIND, either express or implied.  See the License for the
-    * specific language governing permissions and limitations
-    * under the License.
+    /*
+    * Licensed to the Apache Software Foundation (ASF) under one
+    * or more contributor license agreements.  See the NOTICE file
+    * distributed with this work for additional information
+    * regarding copyright ownership.  The ASF licenses this file
+    * to you under the Apache License, Version 2.0 (the
+    * "License"); you may not use this file except in compliance
+    * with the License.  You may obtain a copy of the License at
+    *
+    *   http://www.apache.org/licenses/LICENSE-2.0
+    *
+    * Unless required by applicable law or agreed to in writing,
+    * software distributed under the License is distributed on an
+    * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    * KIND, either express or implied.  See the License for the
+    * specific language governing permissions and limitations
+    * under the License.
     */
     var ORIGIN_METHOD = '\0__throttleOriginMethod';
     var RATE = '\0__throttleRate';
     var THROTTLE_TYPE = '\0__throttleType';
-    /**
-     * @public
-     * @param {(Function)} fn
-     * @param {number} [delay=0] Unit: ms.
-     * @param {boolean} [debounce=false]
-     *        true: If call interval less than `delay`, only the last call works.
-     *        false: If call interval less than `delay, call works on fixed rate.
-     * @return {(Function)} throttled fn.
+    /**
+     * @public
+     * @param {(Function)} fn
+     * @param {number} [delay=0] Unit: ms.
+     * @param {boolean} [debounce=false]
+     *        true: If call interval less than `delay`, only the last call works.
+     *        false: If call interval less than `delay, call works on fixed rate.
+     * @return {(Function)} throttled fn.
      */
 
     function throttle(fn, delay, debounce) {
@@ -24595,9 +24597,9 @@
 
         lastCall = currCall;
       };
-      /**
-       * Clear throttle.
-       * @public
+      /**
+       * Clear throttle.
+       * @public
        */
 
 
@@ -24607,8 +24609,8 @@
           timer = null;
         }
       };
-      /**
-       * Enable debounce once.
+      /**
+       * Enable debounce once.
        */
 
 
@@ -24618,26 +24620,26 @@
 
       return cb;
     }
-    /**
-     * Create throttle method or update throttle rate.
-     *
-     * @example
-     * ComponentView.prototype.render = function () {
-     *     ...
-     *     throttle.createOrUpdate(
-     *         this,
-     *         '_dispatchAction',
-     *         this.model.get('throttle'),
-     *         'fixRate'
-     *     );
-     * };
-     * ComponentView.prototype.remove = function () {
-     *     throttle.clear(this, '_dispatchAction');
-     * };
-     * ComponentView.prototype.dispose = function () {
-     *     throttle.clear(this, '_dispatchAction');
-     * };
-     *
+    /**
+     * Create throttle method or update throttle rate.
+     *
+     * @example
+     * ComponentView.prototype.render = function () {
+     *     ...
+     *     throttle.createOrUpdate(
+     *         this,
+     *         '_dispatchAction',
+     *         this.model.get('throttle'),
+     *         'fixRate'
+     *     );
+     * };
+     * ComponentView.prototype.remove = function () {
+     *     throttle.clear(this, '_dispatchAction');
+     * };
+     * ComponentView.prototype.dispose = function () {
+     *     throttle.clear(this, '_dispatchAction');
+     * };
+     *
      */
 
     function createOrUpdate(obj, fnAttr, rate, throttleType) {
@@ -24664,8 +24666,8 @@
 
       return fn;
     }
-    /**
-     * Clear throttle. Example see throttle.createOrUpdate.
+    /**
+     * Clear throttle. Example see throttle.createOrUpdate.
      */
 
     function clear(obj, fnAttr) {
@@ -24866,13 +24868,13 @@
     };
 
     var PI$3 = Math.PI;
-    /**
-     * @param {module:echarts/ExtensionAPI} api
-     * @param {Object} [opts]
-     * @param {string} [opts.text]
-     * @param {string} [opts.color]
-     * @param {string} [opts.textColor]
-     * @return {module:zrender/Element}
+    /**
+     * @param {module:echarts/ExtensionAPI} api
+     * @param {Object} [opts]
+     * @param {string} [opts.text]
+     * @param {string} [opts.color]
+     * @param {string} [opts.textColor]
+     * @return {module:zrender/Element}
      */
 
     function defaultLoading(api, opts) {
@@ -25055,12 +25057,12 @@
       Scheduler.prototype.getPipeline = function (pipelineId) {
         return this._pipelineMap.get(pipelineId);
       };
-      /**
-       * Current, progressive rendering starts from visual and layout.
-       * Always detect render mode in the same stage, avoiding that incorrect
-       * detection caused by data filtering.
-       * Caution:
-       * `updateStreamModes` use `seriesModel.getData()`.
+      /**
+       * Current, progressive rendering starts from visual and layout.
+       * Always detect render mode in the same stage, avoiding that incorrect
+       * detection caused by data filtering.
+       * Caution:
+       * `updateStreamModes` use `seriesModel.getData()`.
        */
 
 
@@ -25440,12 +25442,12 @@
     function seriesTaskCount(context) {
       return context.data.count();
     }
-    /**
-     * Only some legacy stage handlers (usually in echarts extensions) are pure function.
-     * To ensure that they can work normally, they should work in block mode, that is,
-     * they should not be started util the previous tasks finished. So they cause the
-     * progressive rendering disabled. We try to detect the series type, to narrow down
-     * the block range to only the series type they concern, but not all series.
+    /**
+     * Only some legacy stage handlers (usually in echarts extensions) are pure function.
+     * To ensure that they can work normally, they should work in block mode, that is,
+     * they should not be started util the previous tasks finished. So they cause the
+     * progressive rendering disabled. We try to detect the series type, to narrow down
+     * the block range to only the series type they concern, but not all series.
      */
 
 
@@ -25510,23 +25512,23 @@
      * AUTO-GENERATED FILE. DO NOT MODIFY.
      */
 
-    /*
-    * Licensed to the Apache Software Foundation (ASF) under one
-    * or more contributor license agreements.  See the NOTICE file
-    * distributed with this work for additional information
-    * regarding copyright ownership.  The ASF licenses this file
-    * to you under the Apache License, Version 2.0 (the
-    * "License"); you may not use this file except in compliance
-    * with the License.  You may obtain a copy of the License at
-    *
-    *   http://www.apache.org/licenses/LICENSE-2.0
-    *
-    * Unless required by applicable law or agreed to in writing,
-    * software distributed under the License is distributed on an
-    * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    * KIND, either express or implied.  See the License for the
-    * specific language governing permissions and limitations
-    * under the License.
+    /*
+    * Licensed to the Apache Software Foundation (ASF) under one
+    * or more contributor license agreements.  See the NOTICE file
+    * distributed with this work for additional information
+    * regarding copyright ownership.  The ASF licenses this file
+    * to you under the Apache License, Version 2.0 (the
+    * "License"); you may not use this file except in compliance
+    * with the License.  You may obtain a copy of the License at
+    *
+    *   http://www.apache.org/licenses/LICENSE-2.0
+    *
+    * Unless required by applicable law or agreed to in writing,
+    * software distributed under the License is distributed on an
+    * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    * KIND, either express or implied.  See the License for the
+    * specific language governing permissions and limitations
+    * under the License.
     */
     var colorAll = ['#37A2DA', '#32C5E9', '#67E0E3', '#9FE6B8', '#FFDB5C', '#ff9f7f', '#fb7293', '#E062AE', '#E690D1', '#e7bcf3', '#9d96f5', '#8378EA', '#96BFFF'];
     var lightTheme = {
@@ -25558,23 +25560,23 @@
      * AUTO-GENERATED FILE. DO NOT MODIFY.
      */
 
-    /*
-    * Licensed to the Apache Software Foundation (ASF) under one
-    * or more contributor license agreements.  See the NOTICE file
-    * distributed with this work for additional information
-    * regarding copyright ownership.  The ASF licenses this file
-    * to you under the Apache License, Version 2.0 (the
-    * "License"); you may not use this file except in compliance
-    * with the License.  You may obtain a copy of the License at
-    *
-    *   http://www.apache.org/licenses/LICENSE-2.0
-    *
-    * Unless required by applicable law or agreed to in writing,
-    * software distributed under the License is distributed on an
-    * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    * KIND, either express or implied.  See the License for the
-    * specific language governing permissions and limitations
-    * under the License.
+    /*
+    * Licensed to the Apache Software Foundation (ASF) under one
+    * or more contributor license agreements.  See the NOTICE file
+    * distributed with this work for additional information
+    * regarding copyright ownership.  The ASF licenses this file
+    * to you under the Apache License, Version 2.0 (the
+    * "License"); you may not use this file except in compliance
+    * with the License.  You may obtain a copy of the License at
+    *
+    *   http://www.apache.org/licenses/LICENSE-2.0
+    *
+    * Unless required by applicable law or agreed to in writing,
+    * software distributed under the License is distributed on an
+    * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    * KIND, either express or implied.  See the License for the
+    * specific language governing permissions and limitations
+    * under the License.
     */
     var contrastColor = '#B9B8CE';
     var backgroundColor = '#100C2A';
@@ -25757,22 +25759,22 @@
     };
     theme.categoryAxis.splitLine.show = false;
 
-    /**
-     * Usage of query:
-     * `chart.on('click', query, handler);`
-     * The `query` can be:
-     * + The component type query string, only `mainType` or `mainType.subType`,
-     *   like: 'xAxis', 'series', 'xAxis.category' or 'series.line'.
-     * + The component query object, like:
-     *   `{seriesIndex: 2}`, `{seriesName: 'xx'}`, `{seriesId: 'some'}`,
-     *   `{xAxisIndex: 2}`, `{xAxisName: 'xx'}`, `{xAxisId: 'some'}`.
-     * + The data query object, like:
-     *   `{dataIndex: 123}`, `{dataType: 'link'}`, `{name: 'some'}`.
-     * + The other query object (cmponent customized query), like:
-     *   `{element: 'some'}` (only available in custom series).
-     *
-     * Caveat: If a prop in the `query` object is `null/undefined`, it is the
-     * same as there is no such prop in the `query` object.
+    /**
+     * Usage of query:
+     * `chart.on('click', query, handler);`
+     * The `query` can be:
+     * + The component type query string, only `mainType` or `mainType.subType`,
+     *   like: 'xAxis', 'series', 'xAxis.category' or 'series.line'.
+     * + The component query object, like:
+     *   `{seriesIndex: 2}`, `{seriesName: 'xx'}`, `{seriesId: 'some'}`,
+     *   `{xAxisIndex: 2}`, `{xAxisName: 'xx'}`, `{xAxisId: 'some'}`.
+     * + The data query object, like:
+     *   `{dataIndex: 123}`, `{dataType: 'link'}`, `{name: 'some'}`.
+     * + The other query object (cmponent customized query), like:
+     *   `{element: 'some'}` (only available in custom series).
+     *
+     * Caveat: If a prop in the `query` object is `null/undefined`, it is the
+     * same as there is no such prop in the `query` object.
      */
 
     var ECEventProcessor =
@@ -25990,23 +25992,23 @@
      * AUTO-GENERATED FILE. DO NOT MODIFY.
      */
 
-    /*
-    * Licensed to the Apache Software Foundation (ASF) under one
-    * or more contributor license agreements.  See the NOTICE file
-    * distributed with this work for additional information
-    * regarding copyright ownership.  The ASF licenses this file
-    * to you under the Apache License, Version 2.0 (the
-    * "License"); you may not use this file except in compliance
-    * with the License.  You may obtain a copy of the License at
-    *
-    *   http://www.apache.org/licenses/LICENSE-2.0
-    *
-    * Unless required by applicable law or agreed to in writing,
-    * software distributed under the License is distributed on an
-    * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    * KIND, either express or implied.  See the License for the
-    * specific language governing permissions and limitations
-    * under the License.
+    /*
+    * Licensed to the Apache Software Foundation (ASF) under one
+    * or more contributor license agreements.  See the NOTICE file
+    * distributed with this work for additional information
+    * regarding copyright ownership.  The ASF licenses this file
+    * to you under the Apache License, Version 2.0 (the
+    * "License"); you may not use this file except in compliance
+    * with the License.  You may obtain a copy of the License at
+    *
+    *   http://www.apache.org/licenses/LICENSE-2.0
+    *
+    * Unless required by applicable law or agreed to in writing,
+    * software distributed under the License is distributed on an
+    * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    * KIND, either express or implied.  See the License for the
+    * specific language governing permissions and limitations
+    * under the License.
     */
     function getItemVisualFromData(data, dataIndex, key) {
       switch (key) {
@@ -26155,23 +26157,23 @@
      * AUTO-GENERATED FILE. DO NOT MODIFY.
      */
 
-    /*
-    * Licensed to the Apache Software Foundation (ASF) under one
-    * or more contributor license agreements.  See the NOTICE file
-    * distributed with this work for additional information
-    * regarding copyright ownership.  The ASF licenses this file
-    * to you under the Apache License, Version 2.0 (the
-    * "License"); you may not use this file except in compliance
-    * with the License.  You may obtain a copy of the License at
-    *
-    *   http://www.apache.org/licenses/LICENSE-2.0
-    *
-    * Unless required by applicable law or agreed to in writing,
-    * software distributed under the License is distributed on an
-    * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    * KIND, either express or implied.  See the License for the
-    * specific language governing permissions and limitations
-    * under the License.
+    /*
+    * Licensed to the Apache Software Foundation (ASF) under one
+    * or more contributor license agreements.  See the NOTICE file
+    * distributed with this work for additional information
+    * regarding copyright ownership.  The ASF licenses this file
+    * to you under the Apache License, Version 2.0 (the
+    * "License"); you may not use this file except in compliance
+    * with the License.  You may obtain a copy of the License at
+    *
+    *   http://www.apache.org/licenses/LICENSE-2.0
+    *
+    * Unless required by applicable law or agreed to in writing,
+    * software distributed under the License is distributed on an
+    * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    * KIND, either express or implied.  See the License for the
+    * specific language governing permissions and limitations
+    * under the License.
     */
     function findEventDispatcher(target, det, returnFirstMatch) {
       var found;
@@ -26233,9 +26235,9 @@
         return WeakMap;
     }());
 
-    /**
-     * Triangle shape
-     * @inner
+    /**
+     * Triangle shape
+     * @inner
      */
 
     var Triangle = Path.extend({
@@ -26257,9 +26259,9 @@
         path.closePath();
       }
     });
-    /**
-     * Diamond shape
-     * @inner
+    /**
+     * Diamond shape
+     * @inner
      */
 
     var Diamond = Path.extend({
@@ -26282,9 +26284,9 @@
         path.closePath();
       }
     });
-    /**
-     * Pin shape
-     * @inner
+    /**
+     * Pin shape
+     * @inner
      */
 
     var Pin = Path.extend({
@@ -26320,9 +26322,9 @@
         path.closePath();
       }
     });
-    /**
-     * Arrow shape
-     * @inner
+    /**
+     * Arrow shape
+     * @inner
      */
 
     var Arrow = Path.extend({
@@ -26347,8 +26349,8 @@
         ctx.closePath();
       }
     });
-    /**
-     * Map of path contructors
+    /**
+     * Map of path contructors
      */
     // TODO Use function to build symbol path.
 
@@ -26480,8 +26482,8 @@
         this.markRedraw();
       }
     }
-    /**
-     * Create a symbol element with given symbol configuration: shape, x, y, width, height, color
+    /**
+     * Create a symbol element with given symbol configuration: shape, x, y, width, height, color
      */
 
 
@@ -26541,6 +26543,9 @@
       return [parsePercent$1(symbolOffset[0], symbolSize[0]) || 0, parsePercent$1(retrieve2(symbolOffset[1], symbolOffset[0]), symbolSize[1]) || 0];
     }
 
+    function isSafeNum(num) {
+        return isFinite(num);
+    }
     function createLinearGradient(ctx, obj, rect) {
         var x = obj.x == null ? 0 : obj.x;
         var x2 = obj.x2 == null ? 1 : obj.x2;
@@ -26552,10 +26557,10 @@
             y = y * rect.height + rect.y;
             y2 = y2 * rect.height + rect.y;
         }
-        x = isNaN(x) ? 0 : x;
-        x2 = isNaN(x2) ? 1 : x2;
-        y = isNaN(y) ? 0 : y;
-        y2 = isNaN(y2) ? 0 : y2;
+        x = isSafeNum(x) ? x : 0;
+        x2 = isSafeNum(x2) ? x2 : 1;
+        y = isSafeNum(y) ? y : 0;
+        y2 = isSafeNum(y2) ? y2 : 0;
         var canvasGradient = ctx.createLinearGradient(x, y, x2, y2);
         return canvasGradient;
     }
@@ -26571,6 +26576,9 @@
             y = y * height + rect.y;
             r = r * min;
         }
+        x = isSafeNum(x) ? x : 0.5;
+        y = isSafeNum(y) ? y : 0.5;
+        r = r >= 0 && isSafeNum(r) ? r : 0.5;
         var canvasGradient = ctx.createRadialGradient(x, y, 0, x, y, r);
         return canvasGradient;
     }
@@ -27193,11 +27201,11 @@
     var decalMap = new WeakMap();
     var decalCache = new LRU(100);
     var decalKeys = ['symbol', 'symbolSize', 'symbolKeepAspect', 'color', 'backgroundColor', 'dashArrayX', 'dashArrayY', 'maxTileWidth', 'maxTileHeight'];
-    /**
-     * Create or update pattern image from decal options
-     *
-     * @param {InnerDecalObject | 'none'} decalObject decal options, 'none' if no decal
-     * @return {Pattern} pattern with generated image, null if no decal
+    /**
+     * Create or update pattern image from decal options
+     *
+     * @param {InnerDecalObject | 'none'} decalObject decal options, 'none' if no decal
+     * @return {Pattern} pattern with generated image, null if no decal
      */
 
     function createOrUpdatePatternFromDecal(decalObject, api) {
@@ -27303,23 +27311,23 @@
         pattern.svgElement = svgRoot;
         pattern.svgWidth = pSize.width;
         pattern.svgHeight = pSize.height;
-        /**
-         * Get minumum length that can make a repeatable pattern.
-         *
-         * @return {Object} pattern width and height
+        /**
+         * Get minumum length that can make a repeatable pattern.
+         *
+         * @return {Object} pattern width and height
          */
 
         function getPatternSize() {
-          /**
-           * For example, if dash is [[3, 2], [2, 1]] for X, it looks like
-           * |---  ---  ---  ---  --- ...
-           * |-- -- -- -- -- -- -- -- ...
-           * |---  ---  ---  ---  --- ...
-           * |-- -- -- -- -- -- -- -- ...
-           * So the minumum length of X is 15,
-           * which is the least common multiple of `3 + 2` and `2 + 1`
-           * |---  ---  ---  |---  --- ...
-           * |-- -- -- -- -- |-- -- -- ...
+          /**
+           * For example, if dash is [[3, 2], [2, 1]] for X, it looks like
+           * |---  ---  ---  ---  --- ...
+           * |-- -- -- -- -- -- -- -- ...
+           * |---  ---  ---  ---  --- ...
+           * |-- -- -- -- -- -- -- -- ...
+           * So the minumum length of X is 15,
+           * which is the least common multiple of `3 + 2` and `2 + 1`
+           * |---  ---  ---  |---  --- ...
+           * |-- -- -- -- -- |-- -- -- ...
            */
           var width = 1;
 
@@ -27456,11 +27464,11 @@
         }
       }
     }
-    /**
-     * Convert symbol array into normalized array
-     *
-     * @param {string | (string | string[])[]} symbol symbol input
-     * @return {string[][]} normolized symbol array
+    /**
+     * Convert symbol array into normalized array
+     *
+     * @param {string | (string | string[])[]} symbol symbol input
+     * @return {string[][]} normolized symbol array
      */
 
     function normalizeSymbolArray(symbol) {
@@ -27497,11 +27505,11 @@
 
       return result;
     }
-    /**
-     * Convert dash input into dashArray
-     *
-     * @param {DecalDashArrayX} dash dash input
-     * @return {number[][]} normolized dash array
+    /**
+     * Convert dash input into dashArray
+     *
+     * @param {DecalDashArrayX} dash dash input
+     * @return {number[][]} normolized dash array
      */
 
 
@@ -27514,9 +27522,9 @@
         var dashValue = Math.ceil(dash);
         return [[dashValue, dashValue]];
       }
-      /**
-       * [20, 5] should be normalized into [[20, 5]],
-       * while [20, [5, 10]] should be normalized into [[20, 20], [5, 10]]
+      /**
+       * [20, 5] should be normalized into [[20, 5]],
+       * while [20, [5, 10]] should be normalized into [[20, 20], [5, 10]]
        */
 
 
@@ -27556,11 +27564,11 @@
 
       return result;
     }
-    /**
-     * Convert dash input into dashArray
-     *
-     * @param {DecalDashArrayY} dash dash input
-     * @return {number[]} normolized dash array
+    /**
+     * Convert dash input into dashArray
+     *
+     * @param {DecalDashArrayY} dash dash input
+     * @return {number[]} normolized dash array
      */
 
 
@@ -27579,13 +27587,13 @@
       });
       return dash.length % 2 ? dashValue.concat(dashValue) : dashValue;
     }
-    /**
-     * Get block length of each line. A block is the length of dash line and space.
-     * For example, a line with [4, 1] has a dash line of 4 and a space of 1 after
-     * that, so the block length of this line is 5.
-     *
-     * @param {number[][]} dash dash arrary of X or Y
-     * @return {number[]} block length of each line
+    /**
+     * Get block length of each line. A block is the length of dash line and space.
+     * For example, a line with [4, 1] has a dash line of 4 and a space of 1 after
+     * that, so the block length of this line is 5.
+     *
+     * @param {number[][]} dash dash arrary of X or Y
+     * @return {number[]} block length of each line
      */
 
 
@@ -27666,7 +27674,7 @@
     }
 
     var hasWindow = typeof window !== 'undefined';
-    var version$1 = '5.3.2';
+    var version$1 = '5.3.3';
     var dependencies = {
       zrender: '5.3.1'
     };
@@ -28036,8 +28044,8 @@
           triggerUpdatedEvent.call(this, silent);
         }
       };
-      /**
-       * @deprecated
+      /**
+       * @deprecated
        */
 
 
@@ -28067,9 +28075,9 @@
         /* eslint-disable-next-line */
         || hasWindow && window.devicePixelRatio || 1;
       };
-      /**
-       * Get canvas which has all thing rendered
-       * @deprecated Use renderToCanvas instead.
+      /**
+       * Get canvas which has all thing rendered
+       * @deprecated Use renderToCanvas instead.
        */
 
 
@@ -28111,8 +28119,8 @@
           useViewBox: opts.useViewBox
         });
       };
-      /**
-       * Get svg data url
+      /**
+       * Get svg data url
        */
 
 
@@ -28265,10 +28273,10 @@
       ECharts.prototype.convertFromPixel = function (finder, value) {
         return doConvertPixel(this, 'convertFromPixel', finder, value);
       };
-      /**
-       * Is the specified coordinate systems or components contain the given pixel point.
-       * @param {Array|number} value
-       * @return {boolean} result
+      /**
+       * Is the specified coordinate systems or components contain the given pixel point.
+       * @param {Array|number} value
+       * @return {boolean} result
        */
 
 
@@ -28306,20 +28314,20 @@
         }, this);
         return !!result;
       };
-      /**
-       * Get visual from series or data.
-       * @param finder
-       *        If string, e.g., 'series', means {seriesIndex: 0}.
-       *        If Object, could contain some of these properties below:
-       *        {
-       *            seriesIndex / seriesId / seriesName,
-       *            dataIndex / dataIndexInside
-       *        }
-       *        If dataIndex is not specified, series visual will be fetched,
-       *        but not data item visual.
-       *        If all of seriesIndex, seriesId, seriesName are not specified,
-       *        visual will be fetched from first series.
-       * @param visualType 'color', 'symbol', 'symbolSize'
+      /**
+       * Get visual from series or data.
+       * @param finder
+       *        If string, e.g., 'series', means {seriesIndex: 0}.
+       *        If Object, could contain some of these properties below:
+       *        {
+       *            seriesIndex / seriesId / seriesName,
+       *            dataIndex / dataIndexInside
+       *        }
+       *        If dataIndex is not specified, series visual will be fetched,
+       *        but not data item visual.
+       *        If all of seriesIndex, seriesId, seriesName are not specified,
+       *        visual will be fetched from first series.
+       * @param visualType 'color', 'symbol', 'symbolSize'
        */
 
 
@@ -28340,16 +28348,16 @@
         var dataIndexInside = parsedFinder.hasOwnProperty('dataIndexInside') ? parsedFinder.dataIndexInside : parsedFinder.hasOwnProperty('dataIndex') ? data.indexOfRawIndex(parsedFinder.dataIndex) : null;
         return dataIndexInside != null ? getItemVisualFromData(data, dataIndexInside, visualType) : getVisualFromData(data, visualType);
       };
-      /**
-       * Get view of corresponding component model
+      /**
+       * Get view of corresponding component model
        */
 
 
       ECharts.prototype.getViewOfComponentModel = function (componentModel) {
         return this._componentsMap[componentModel.__viewId];
       };
-      /**
-       * Get view of corresponding series model
+      /**
+       * Get view of corresponding series model
        */
 
 
@@ -28500,8 +28508,8 @@
         chart._dom = chart._model = chart._chartsMap = chart._componentsMap = chart._chartsViews = chart._componentsViews = chart._scheduler = chart._api = chart._zr = chart._throttledZrFlush = chart._theme = chart._coordSysMgr = chart._messageCenter = null;
         delete instances$1[chart.id];
       };
-      /**
-       * Resize the chart
+      /**
+       * Resize the chart
        */
 
 
@@ -28591,8 +28599,8 @@
         this._loadingFX = el;
         zr.add(el);
       };
-      /**
-       * Hide loading effect
+      /**
+       * Hide loading effect
        */
 
 
@@ -28611,14 +28619,14 @@
         payload.type = eventActionMap[eventObj.type];
         return payload;
       };
-      /**
-       * @param opt If pass boolean, means opt.silent
-       * @param opt.silent Default `false`. Whether trigger events.
-       * @param opt.flush Default `undefined`.
-       *        true: Flush immediately, and then pixel in canvas can be fetched
-       *            immediately. Caution: it might affect performance.
-       *        false: Not flush.
-       *        undefined: Auto decide whether perform flush.
+      /**
+       * @param opt If pass boolean, means opt.silent
+       * @param opt.silent Default `false`. Whether trigger events.
+       * @param opt.flush Default `undefined`.
+       *        true: Flush immediately, and then pixel in canvas can be fetched
+       *            immediately. Caution: it might affect performance.
+       *        false: Not flush.
+       *        undefined: Auto decide whether perform flush.
        */
 
 
@@ -28714,8 +28722,8 @@
           prepareView(ecIns, false);
           scheduler.plan();
         };
-        /**
-         * Prepare view instances of charts and components
+        /**
+         * Prepare view instances of charts and components
          */
 
 
@@ -29210,17 +29218,17 @@
         triggerUpdatedEvent = function (silent) {
           !silent && this.trigger('updated');
         };
-        /**
-         * Event `rendered` is triggered when zr
-         * rendered. It is useful for realtime
-         * snapshot (reflect animation).
-         *
-         * Event `finished` is triggered when:
-         * (1) zrender rendering finished.
-         * (2) initial animation finished.
-         * (3) progressive rendering finished.
-         * (4) no pending action.
-         * (5) no delayed setOption needs to be processed.
+        /**
+         * Event `rendered` is triggered when zr
+         * rendered. It is useful for realtime
+         * snapshot (reflect animation).
+         *
+         * Event `finished` is triggered when:
+         * (1) zrender rendering finished.
+         * (2) initial animation finished.
+         * (3) progressive rendering finished.
+         * (4) no pending action.
+         * (5) no delayed setOption needs to be processed.
          */
 
 
@@ -29368,8 +29376,8 @@
             updateStates(componentModel, componentView);
           });
         };
-        /**
-         * Render each chart and component
+        /**
+         * Render each chart and component
          */
 
 
@@ -29498,8 +29506,8 @@
             });
           }
         }
-        /**
-         * Update chart and blend.
+        /**
+         * Update chart and blend.
          */
 
         function updateBlend(seriesModel, chartView) {
@@ -29768,8 +29776,8 @@
     var echartsProto = ECharts.prototype;
     echartsProto.on = createRegisterEventWithLowercaseECharts('on');
     echartsProto.off = createRegisterEventWithLowercaseECharts('off');
-    /**
-     * @deprecated
+    /**
+     * @deprecated
      */
     // @ts-ignore
 
@@ -29801,8 +29809,8 @@
     }
 
     var actions = {};
-    /**
-     * Map eventType to actionType
+    /**
+     * Map eventType to actionType
      */
 
     var eventActionMap = {};
@@ -29816,15 +29824,15 @@
     var idBase = +new Date() - 0;
     var groupIdBase = +new Date() - 0;
     var DOM_ATTRIBUTE_KEY = '_echarts_instance_';
-    /**
-     * @param opts.devicePixelRatio Use window.devicePixelRatio by default
-     * @param opts.renderer Can choose 'canvas' or 'svg' to render the chart.
-     * @param opts.width Use clientWidth of the input `dom` by default.
-     *        Can be 'auto' (the same as null/undefined)
-     * @param opts.height Use clientHeight of the input `dom` by default.
-     *        Can be 'auto' (the same as null/undefined)
-     * @param opts.locale Specify the locale.
-     * @param opts.useDirtyRect Enable dirty rectangle rendering or not.
+    /**
+     * @param opts.devicePixelRatio Use window.devicePixelRatio by default
+     * @param opts.renderer Can choose 'canvas' or 'svg' to render the chart.
+     * @param opts.width Use clientWidth of the input `dom` by default.
+     *        Can be 'auto' (the same as null/undefined)
+     * @param opts.height Use clientHeight of the input `dom` by default.
+     *        Can be 'auto' (the same as null/undefined)
+     * @param opts.locale Specify the locale.
+     * @param opts.useDirtyRect Enable dirty rectangle rendering or not.
      */
 
     function init$1(dom, theme, opts) {
@@ -29862,22 +29870,22 @@
       lifecycle.trigger('afterinit', chart);
       return chart;
     }
-    /**
-     * @usage
-     * (A)
-     * ```js
-     * let chart1 = echarts.init(dom1);
-     * let chart2 = echarts.init(dom2);
-     * chart1.group = 'xxx';
-     * chart2.group = 'xxx';
-     * echarts.connect('xxx');
-     * ```
-     * (B)
-     * ```js
-     * let chart1 = echarts.init(dom1);
-     * let chart2 = echarts.init(dom2);
-     * echarts.connect('xxx', [chart1, chart2]);
-     * ```
+    /**
+     * @usage
+     * (A)
+     * ```js
+     * let chart1 = echarts.init(dom1);
+     * let chart2 = echarts.init(dom2);
+     * chart1.group = 'xxx';
+     * chart2.group = 'xxx';
+     * echarts.connect('xxx');
+     * ```
+     * (B)
+     * ```js
+     * let chart1 = echarts.init(dom1);
+     * let chart2 = echarts.init(dom2);
+     * echarts.connect('xxx', [chart1, chart2]);
+     * ```
      */
 
     function connect(groupId) {
@@ -29900,20 +29908,20 @@
       connectedGroups[groupId] = true;
       return groupId;
     }
-    /**
-     * @deprecated
+    /**
+     * @deprecated
      */
 
     function disConnect(groupId) {
       connectedGroups[groupId] = false;
     }
-    /**
-     * Alias and backword compat
+    /**
+     * Alias and backword compat
      */
 
     var disconnect = disConnect;
-    /**
-     * Dispose a chart instance
+    /**
+     * Dispose a chart instance
      */
 
     function dispose$1(chart) {
@@ -29934,15 +29942,15 @@
     function getInstanceById(key) {
       return instances$1[key];
     }
-    /**
-     * Register theme
+    /**
+     * Register theme
      */
 
     function registerTheme(name, theme) {
       themeStorage[name] = theme;
     }
-    /**
-     * Register option preprocessor
+    /**
+     * Register option preprocessor
      */
 
     function registerPreprocessor(preprocessorFunc) {
@@ -29953,17 +29961,17 @@
     function registerProcessor(priority, processor) {
       normalizeRegister(dataProcessorFuncs, priority, processor, PRIORITY_PROCESSOR_DEFAULT);
     }
-    /**
-     * Register postIniter
-     * @param {Function} postInitFunc
+    /**
+     * Register postIniter
+     * @param {Function} postInitFunc
      */
 
     function registerPostInit(postInitFunc) {
       registerUpdateLifecycle('afterinit', postInitFunc);
     }
-    /**
-     * Register postUpdater
-     * @param {Function} postUpdateFunc
+    /**
+     * Register postUpdater
+     * @param {Function} postUpdateFunc
      */
 
     function registerPostUpdate(postUpdateFunc) {
@@ -30005,10 +30013,10 @@
     function registerCoordinateSystem(type, coordSysCreator) {
       CoordinateSystemManager.register(type, coordSysCreator);
     }
-    /**
-     * Get dimensions of specified coordinate system.
-     * @param {string} type
-     * @return {Array.<string|Object>}
+    /**
+     * Get dimensions of specified coordinate system.
+     * @param {string} type
+     * @return {Array.<string|Object>}
      */
 
     function getCoordinateSystemDimensions(type) {
@@ -30060,21 +30068,21 @@
     function registerLoading(name, loadingFx) {
       loadingEffects[name] = loadingFx;
     }
-    /**
-     * ZRender need a canvas context to do measureText.
-     * But in node environment canvas may be created by node-canvas.
-     * So we need to specify how to create a canvas instead of using document.createElement('canvas')
-     *
-     *
-     * @deprecated use setPlatformAPI({ createCanvas }) instead.
-     *
-     * @example
-     *     let Canvas = require('canvas');
-     *     let echarts = require('echarts');
-     *     echarts.setCanvasCreator(function () {
-     *         // Small size is enough.
-     *         return new Canvas(32, 32);
-     *     });
+    /**
+     * ZRender need a canvas context to do measureText.
+     * But in node environment canvas may be created by node-canvas.
+     * So we need to specify how to create a canvas instead of using document.createElement('canvas')
+     *
+     *
+     * @deprecated use setPlatformAPI({ createCanvas }) instead.
+     *
+     * @example
+     *     let Canvas = require('canvas');
+     *     let echarts = require('echarts');
+     *     echarts.setCanvasCreator(function () {
+     *         // Small size is enough.
+     *         return new Canvas(32, 32);
+     *     });
      */
 
     function setCanvasCreator(creator) {
@@ -30086,9 +30094,9 @@
         createCanvas: creator
       });
     }
-    /**
-     * The parameters and usage: see `geoSourceManager.registerMap`.
-     * Compatible with previous `echarts.registerMap`.
+    /**
+     * The parameters and usage: see `geoSourceManager.registerMap`.
+     * Compatible with previous `echarts.registerMap`.
      */
 
     function registerMap(mapName, geoJson, specialAreas) {
@@ -30100,8 +30108,8 @@
       return getMap && getMap(mapName);
     }
     var registerTransform = registerExternalTransform;
-    /**
-     * Globa dispatchAction to a specified chart instance.
+    /**
+     * Globa dispatchAction to a specified chart instance.
      */
     // export function dispatchAction(payload: { chartId: string } & Payload, opt?: Parameters<ECharts['dispatchAction']>[1]) {
     //     if (!payload || !payload.chartId) {
@@ -30245,23 +30253,23 @@
      * AUTO-GENERATED FILE. DO NOT MODIFY.
      */
 
-    /*
-    * Licensed to the Apache Software Foundation (ASF) under one
-    * or more contributor license agreements.  See the NOTICE file
-    * distributed with this work for additional information
-    * regarding copyright ownership.  The ASF licenses this file
-    * to you under the Apache License, Version 2.0 (the
-    * "License"); you may not use this file except in compliance
-    * with the License.  You may obtain a copy of the License at
-    *
-    *   http://www.apache.org/licenses/LICENSE-2.0
-    *
-    * Unless required by applicable law or agreed to in writing,
-    * software distributed under the License is distributed on an
-    * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    * KIND, either express or implied.  See the License for the
-    * specific language governing permissions and limitations
-    * under the License.
+    /*
+    * Licensed to the Apache Software Foundation (ASF) under one
+    * or more contributor license agreements.  See the NOTICE file
+    * distributed with this work for additional information
+    * regarding copyright ownership.  The ASF licenses this file
+    * to you under the Apache License, Version 2.0 (the
+    * "License"); you may not use this file except in compliance
+    * with the License.  You may obtain a copy of the License at
+    *
+    *   http://www.apache.org/licenses/LICENSE-2.0
+    *
+    * Unless required by applicable law or agreed to in writing,
+    * software distributed under the License is distributed on an
+    * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    * KIND, either express or implied.  See the License for the
+    * specific language governing permissions and limitations
+    * under the License.
     */
     function dataIndexMapValueLength(valNumOrArrLengthMoreThan2) {
       return valNumOrArrLengthMoreThan2 == null ? 0 : valNumOrArrLengthMoreThan2.length || 1;
@@ -30274,8 +30282,8 @@
     var DataDiffer =
     /** @class */
     function () {
-      /**
-       * @param context Can be visited by this.context in callback.
+      /**
+       * @param context Can be visited by this.context in callback.
        */
       function DataDiffer(oldArr, newArr, oldKeyGetter, newKeyGetter, context, // By default: 'oneToOne'.
       diffMode) {
@@ -30287,8 +30295,8 @@
         this.context = context;
         this._diffModeMultiple = diffMode === 'multiple';
       }
-      /**
-       * Callback function when add a data
+      /**
+       * Callback function when add a data
        */
 
 
@@ -30296,8 +30304,8 @@
         this._add = func;
         return this;
       };
-      /**
-       * Callback function when update a data
+      /**
+       * Callback function when update a data
        */
 
 
@@ -30305,8 +30313,8 @@
         this._update = func;
         return this;
       };
-      /**
-       * Callback function when update a data and only work in `cbMode: 'byKey'`.
+      /**
+       * Callback function when update a data and only work in `cbMode: 'byKey'`.
        */
 
 
@@ -30314,8 +30322,8 @@
         this._updateManyToOne = func;
         return this;
       };
-      /**
-       * Callback function when update a data and only work in `cbMode: 'byKey'`.
+      /**
+       * Callback function when update a data and only work in `cbMode: 'byKey'`.
        */
 
 
@@ -30323,8 +30331,8 @@
         this._updateOneToMany = func;
         return this;
       };
-      /**
-       * Callback function when update a data and only work in `cbMode: 'byKey'`.
+      /**
+       * Callback function when update a data and only work in `cbMode: 'byKey'`.
        */
 
 
@@ -30332,8 +30340,8 @@
         this._updateManyToMany = func;
         return this;
       };
-      /**
-       * Callback function when remove a data
+      /**
+       * Callback function when remove a data
        */
 
 
@@ -30382,30 +30390,30 @@
 
         this._performRestAdd(newDataKeyArr, newDataIndexMap);
       };
-      /**
-       * For example, consider the case:
-       * oldData: [o0, o1, o2, o3, o4, o5, o6, o7],
-       * newData: [n0, n1, n2, n3, n4, n5, n6, n7, n8],
-       * Where:
-       *     o0, o1, n0 has key 'a' (many to one)
-       *     o5, n4, n5, n6 has key 'b' (one to many)
-       *     o2, n1 has key 'c' (one to one)
-       *     n2, n3 has key 'd' (add)
-       *     o3, o4 has key 'e' (remove)
-       *     o6, o7, n7, n8 has key 'f' (many to many, treated as add and remove)
-       * Then:
-       *     (The order of the following directives are not ensured.)
-       *     this._updateManyToOne(n0, [o0, o1]);
-       *     this._updateOneToMany([n4, n5, n6], o5);
-       *     this._update(n1, o2);
-       *     this._remove(o3);
-       *     this._remove(o4);
-       *     this._remove(o6);
-       *     this._remove(o7);
-       *     this._add(n2);
-       *     this._add(n3);
-       *     this._add(n7);
-       *     this._add(n8);
+      /**
+       * For example, consider the case:
+       * oldData: [o0, o1, o2, o3, o4, o5, o6, o7],
+       * newData: [n0, n1, n2, n3, n4, n5, n6, n7, n8],
+       * Where:
+       *     o0, o1, n0 has key 'a' (many to one)
+       *     o5, n4, n5, n6 has key 'b' (one to many)
+       *     o2, n1 has key 'c' (one to one)
+       *     n2, n3 has key 'd' (add)
+       *     o3, o4 has key 'e' (remove)
+       *     o6, o7, n7, n8 has key 'f' (many to many, treated as add and remove)
+       * Then:
+       *     (The order of the following directives are not ensured.)
+       *     this._updateManyToOne(n0, [o0, o1]);
+       *     this._updateOneToMany([n4, n5, n6], o5);
+       *     this._update(n1, o2);
+       *     this._remove(o3);
+       *     this._remove(o4);
+       *     this._remove(o6);
+       *     this._remove(o7);
+       *     this._add(n2);
+       *     this._add(n3);
+       *     this._add(n7);
+       *     this._add(n8);
        */
 
 
@@ -30527,12 +30535,12 @@
           encode: this._encode
         };
       };
-      /**
-       * Get all data store dimension names.
-       * Theoretically a series data store is defined both by series and used dataset (if any).
-       * If some dimensions are omitted for performance reason in `this.dimensions`,
-       * the dimension name may not be auto-generated if user does not specify a dimension name.
-       * In this case, the dimension name is `null`/`undefined`.
+      /**
+       * Get all data store dimension names.
+       * Theoretically a series data store is defined both by series and used dataset (if any).
+       * If some dimensions are omitted for performance reason in `this.dimensions`,
+       * the dimension name may not be auto-generated if user does not specify a dimension name.
+       * In this case, the dimension name is `null`/`undefined`.
        */
 
 
@@ -30662,42 +30670,42 @@
     var SeriesDimensionDefine =
     /** @class */
     function () {
-      /**
-       * @param opt All of the fields will be shallow copied.
+      /**
+       * @param opt All of the fields will be shallow copied.
        */
       function SeriesDimensionDefine(opt) {
-        /**
-         * The format of `otherDims` is:
-         * ```js
-         * {
-         *     tooltip?: number
-         *     label?: number
-         *     itemName?: number
-         *     seriesName?: number
-         * }
-         * ```
-         *
-         * A `series.encode` can specified these fields:
-         * ```js
-         * encode: {
-         *     // "3, 1, 5" is the index of data dimension.
-         *     tooltip: [3, 1, 5],
-         *     label: [0, 3],
-         *     ...
-         * }
-         * ```
-         * `otherDims` is the parse result of the `series.encode` above, like:
-         * ```js
-         * // Suppose the index of this data dimension is `3`.
-         * this.otherDims = {
-         *     // `3` is at the index `0` of the `encode.tooltip`
-         *     tooltip: 0,
-         *     // `3` is at the index `1` of the `encode.label`
-         *     label: 1
-         * };
-         * ```
-         *
-         * This prop should never be `null`/`undefined` after initialized.
+        /**
+         * The format of `otherDims` is:
+         * ```js
+         * {
+         *     tooltip?: number
+         *     label?: number
+         *     itemName?: number
+         *     seriesName?: number
+         * }
+         * ```
+         *
+         * A `series.encode` can specified these fields:
+         * ```js
+         * encode: {
+         *     // "3, 1, 5" is the index of data dimension.
+         *     tooltip: [3, 1, 5],
+         *     label: [0, 3],
+         *     ...
+         * }
+         * ```
+         * `otherDims` is the parse result of the `series.encode` above, like:
+         * ```js
+         * // Suppose the index of this data dimension is `3`.
+         * this.otherDims = {
+         *     // `3` is at the index `0` of the `encode.tooltip`
+         *     tooltip: 0,
+         *     // `3` is at the index `1` of the `encode.label`
+         *     label: 1
+         * };
+         * ```
+         *
+         * This prop should never be `null`/`undefined` after initialized.
          */
         this.otherDims = {};
 
@@ -30717,16 +30725,16 @@
       number: 'n',
       time: 't'
     };
-    /**
-     * Represents the dimension requirement of a series.
-     *
-     * NOTICE:
-     * When there are too many dimensions in dataset and many series, only the used dimensions
-     * (i.e., used by coord sys and declared in `series.encode`) are add to `dimensionDefineList`.
-     * But users may query data by other unused dimension names.
-     * In this case, users can only query data if and only if they have defined dimension names
-     * via ec option, so we provide `getDimensionIndexFromSource`, which only query them from
-     * `source` dimensions.
+    /**
+     * Represents the dimension requirement of a series.
+     *
+     * NOTICE:
+     * When there are too many dimensions in dataset and many series, only the used dimensions
+     * (i.e., used by coord sys and declared in `series.encode`) are add to `dimensionDefineList`.
+     * But users may query data by other unused dimension names.
+     * In this case, users can only query data if and only if they have defined dimension names
+     * via ec option, so we provide `getDimensionIndexFromSource`, which only query them from
+     * `source` dimensions.
      */
 
     var SeriesDataSchema =
@@ -30756,22 +30764,22 @@
           this._dimNameMap = ensureSourceDimNameMap(this.source);
         }
       };
-      /**
-       * @caution Can only be used when `dimensionOmitted: true`.
-       *
-       * Get index by user defined dimension name (i.e., not internal generate name).
-       * That is, get index from `dimensionsDefine`.
-       * If no `dimensionsDefine`, or no name get, return -1.
+      /**
+       * @caution Can only be used when `dimensionOmitted: true`.
+       *
+       * Get index by user defined dimension name (i.e., not internal generate name).
+       * That is, get index from `dimensionsDefine`.
+       * If no `dimensionsDefine`, or no name get, return -1.
        */
 
 
       SeriesDataSchema.prototype.getSourceDimensionIndex = function (dimName) {
         return retrieve2(this._dimNameMap.get(dimName), -1);
       };
-      /**
-       * @caution Can only be used when `dimensionOmitted: true`.
-       *
-       * Notice: may return `null`/`undefined` if user not specify dimension names.
+      /**
+       * @caution Can only be used when `dimensionOmitted: true`.
+       *
+       * Notice: may return `null`/`undefined` if user not specify dimension names.
        */
 
 
@@ -30940,10 +30948,10 @@
     var SeriesData =
     /** @class */
     function () {
-      /**
-       * @param dimensionsInput.dimensions
-       *        For example, ['someDimName', {name: 'someDimName', type: 'someDimType'}, ...].
-       *        Dimensions should be concrete names like x, y, z, lng, lat, angle, radius
+      /**
+       * @param dimensionsInput.dimensions
+       *        For example, ['someDimName', {name: 'someDimName', type: 'someDimType'}, ...].
+       *        Dimensions should be concrete names like x, y, z, lng, lat, angle, radius
        */
       function SeriesData(dimensionsInput, hostModel) {
         this.type = 'list';
@@ -31054,22 +31062,22 @@
           });
         }
       }
-      /**
-       *
-       * Get concrete dimension name by dimension name or dimension index.
-       * If input a dimension name, do not validate whether the dimension name exits.
-       *
-       * @caution
-       * @param dim Must make sure the dimension is `SeriesDimensionLoose`.
-       * Because only those dimensions will have auto-generated dimension names if not
-       * have a user-specified name, and other dimensions will get a return of null/undefined.
-       *
-       * @notice Becuause of this reason, should better use `getDimensionIndex` instead, for examples:
-       * ```js
-       * const val = data.getStore().get(data.getDimensionIndex(dim), dataIdx);
-       * ```
-       *
-       * @return Concrete dim name.
+      /**
+       *
+       * Get concrete dimension name by dimension name or dimension index.
+       * If input a dimension name, do not validate whether the dimension name exits.
+       *
+       * @caution
+       * @param dim Must make sure the dimension is `SeriesDimensionLoose`.
+       * Because only those dimensions will have auto-generated dimension names if not
+       * have a user-specified name, and other dimensions will get a return of null/undefined.
+       *
+       * @notice Becuause of this reason, should better use `getDimensionIndex` instead, for examples:
+       * ```js
+       * const val = data.getStore().get(data.getDimensionIndex(dim), dataIdx);
+       * ```
+       *
+       * @return Concrete dim name.
        */
 
 
@@ -31100,9 +31108,9 @@
           return sourceDimDef.name;
         }
       };
-      /**
-       * Get dimension index in data store. Return -1 if not found.
-       * Can be used to index value from getRawValue.
+      /**
+       * Get dimension index in data store. Return -1 if not found.
+       * Can be used to index value from getRawValue.
        */
 
 
@@ -31121,24 +31129,24 @@
 
         return dimInfo ? dimInfo.storeDimIndex : this._dimOmitted ? this._schema.getSourceDimensionIndex(dim) : -1;
       };
-      /**
-       * The meanings of the input parameter `dim`:
-       *
-       * + If dim is a number (e.g., `1`), it means the index of the dimension.
-       *   For example, `getDimension(0)` will return 'x' or 'lng' or 'radius'.
-       * + If dim is a number-like string (e.g., `"1"`):
-       *     + If there is the same concrete dim name defined in `series.dimensions` or `dataset.dimensions`,
-       *        it means that concrete name.
-       *     + If not, it will be converted to a number, which means the index of the dimension.
-       *        (why? because of the backward compatbility. We have been tolerating number-like string in
-       *        dimension setting, although now it seems that it is not a good idea.)
-       *     For example, `visualMap[i].dimension: "1"` is the same meaning as `visualMap[i].dimension: 1`,
-       *     if no dimension name is defined as `"1"`.
-       * + If dim is a not-number-like string, it means the concrete dim name.
-       *   For example, it can be be default name `"x"`, `"y"`, `"z"`, `"lng"`, `"lat"`, `"angle"`, `"radius"`,
-       *   or customized in `dimensions` property of option like `"age"`.
-       *
-       * @return recogonized `DimensionIndex`. Otherwise return null/undefined (means that dim is `DimensionName`).
+      /**
+       * The meanings of the input parameter `dim`:
+       *
+       * + If dim is a number (e.g., `1`), it means the index of the dimension.
+       *   For example, `getDimension(0)` will return 'x' or 'lng' or 'radius'.
+       * + If dim is a number-like string (e.g., `"1"`):
+       *     + If there is the same concrete dim name defined in `series.dimensions` or `dataset.dimensions`,
+       *        it means that concrete name.
+       *     + If not, it will be converted to a number, which means the index of the dimension.
+       *        (why? because of the backward compatbility. We have been tolerating number-like string in
+       *        dimension setting, although now it seems that it is not a good idea.)
+       *     For example, `visualMap[i].dimension: "1"` is the same meaning as `visualMap[i].dimension: 1`,
+       *     if no dimension name is defined as `"1"`.
+       * + If dim is a not-number-like string, it means the concrete dim name.
+       *   For example, it can be be default name `"x"`, `"y"`, `"z"`, `"lng"`, `"lat"`, `"angle"`, `"radius"`,
+       *   or customized in `dimensions` property of option like `"age"`.
+       *
+       * @return recogonized `DimensionIndex`. Otherwise return null/undefined (means that dim is `DimensionName`).
        */
 
 
@@ -31160,11 +31168,11 @@
 
         return dimIdx;
       };
-      /**
-       * Get type and calculation info of particular dimension
-       * @param dim
-       *        Dimension can be concrete names like x, y, z, lng, lat, angle, radius
-       *        Or a ordinal number. For example getDimensionInfo(0) will return 'x' or 'lng' or 'radius'
+      /**
+       * Get type and calculation info of particular dimension
+       * @param dim
+       *        Dimension can be concrete names like x, y, z, lng, lat, angle, radius
+       *        Or a ordinal number. For example getDimensionInfo(0) will return 'x' or 'lng' or 'radius'
        */
 
 
@@ -31181,8 +31189,8 @@
           return dimensionInfos[dimName];
         };
       };
-      /**
-       * concrete dimension name list on coord.
+      /**
+       * concrete dimension name list on coord.
        */
 
 
@@ -31210,14 +31218,14 @@
       SeriesData.prototype.getStore = function () {
         return this._store;
       };
-      /**
-       * Initialize from data
-       * @param data source or data or data store.
-       * @param nameList The name of a datum is used on data diff and
-       *        default label/tooltip.
-       *        A name can be specified in encode.itemName,
-       *        or dataItem.name (only for series option data),
-       *        or provided in nameList from outside.
+      /**
+       * Initialize from data
+       * @param data source or data or data store.
+       * @param nameList The name of a datum is used on data diff and
+       *        default label/tooltip.
+       *        A name can be specified in encode.itemName,
+       *        or dataItem.name (only for series option data),
+       *        or provided in nameList from outside.
        */
 
 
@@ -31256,8 +31264,8 @@
         this._dimSummary = summarizeDimensions(this, this._schema);
         this.userOutput = this._dimSummary.userOutput;
       };
-      /**
-       * Caution: Can be only called on raw data (before `this._indices` created).
+      /**
+       * Caution: Can be only called on raw data (before `this._indices` created).
        */
 
 
@@ -31266,20 +31274,20 @@
 
         this._doInit(range[0], range[1]);
       };
-      /**
-       * Caution: Can be only called on raw data (before `this._indices` created).
-       * This method does not modify `rawData` (`dataProvider`), but only
-       * add values to store.
-       *
-       * The final count will be increased by `Math.max(values.length, names.length)`.
-       *
-       * @param values That is the SourceType: 'arrayRows', like
-       *        [
-       *            [12, 33, 44],
-       *            [NaN, 43, 1],
-       *            ['-', 'asdf', 0]
-       *        ]
-       *        Each item is exaclty cooresponding to a dimension.
+      /**
+       * Caution: Can be only called on raw data (before `this._indices` created).
+       * This method does not modify `rawData` (`dataProvider`), but only
+       * add values to store.
+       *
+       * The final count will be increased by `Math.max(values.length, names.length)`.
+       *
+       * @param values That is the SourceType: 'arrayRows', like
+       *        [
+       *            [12, 33, 44],
+       *            [NaN, 43, 1],
+       *            ['-', 'asdf', 0]
+       *        ]
+       *        Each item is exaclty cooresponding to a dimension.
        */
 
 
@@ -31380,28 +31388,28 @@
 
         prepareInvertedIndex(this);
       };
-      /**
-       * PENDING: In fact currently this function is only used to short-circuit
-       * the calling of `scale.unionExtentFromData` when data have been filtered by modules
-       * like "dataZoom". `scale.unionExtentFromData` is used to calculate data extent for series on
-       * an axis, but if a "axis related data filter module" is used, the extent of the axis have
-       * been fixed and no need to calling `scale.unionExtentFromData` actually.
-       * But if we add "custom data filter" in future, which is not "axis related", this method may
-       * be still needed.
-       *
-       * Optimize for the scenario that data is filtered by a given extent.
-       * Consider that if data amount is more than hundreds of thousand,
-       * extent calculation will cost more than 10ms and the cache will
-       * be erased because of the filtering.
+      /**
+       * PENDING: In fact currently this function is only used to short-circuit
+       * the calling of `scale.unionExtentFromData` when data have been filtered by modules
+       * like "dataZoom". `scale.unionExtentFromData` is used to calculate data extent for series on
+       * an axis, but if a "axis related data filter module" is used, the extent of the axis have
+       * been fixed and no need to calling `scale.unionExtentFromData` actually.
+       * But if we add "custom data filter" in future, which is not "axis related", this method may
+       * be still needed.
+       *
+       * Optimize for the scenario that data is filtered by a given extent.
+       * Consider that if data amount is more than hundreds of thousand,
+       * extent calculation will cost more than 10ms and the cache will
+       * be erased because of the filtering.
        */
 
 
       SeriesData.prototype.getApproximateExtent = function (dim) {
         return this._approximateExtent[dim] || this._store.getDataExtent(this._getStoreDimIndex(dim));
       };
-      /**
-       * Calculate extent on a filtered data might be time consuming.
-       * Approximate extent is only used for: calculte extent of filtered data outside.
+      /**
+       * Calculate extent on a filtered data might be time consuming.
+       * Approximate extent is only used for: calculte extent of filtered data outside.
        */
 
 
@@ -31417,11 +31425,11 @@
       SeriesData.prototype.setCalculationInfo = function (key, value) {
         isObject$2(key) ? extend(this._calculationInfo, key) : this._calculationInfo[key] = value;
       };
-      /**
-       * @return Never be null/undefined. `number` will be converted to string. Becuase:
-       * In most cases, name is used in display, where returning a string is more convenient.
-       * In other cases, name is used in query (see `indexOfName`), where we can keep the
-       * rule that name `2` equals to name `'2'`.
+      /**
+       * @return Never be null/undefined. `number` will be converted to string. Becuase:
+       * In most cases, name is used in display, where returning a string is more convenient.
+       * In other cases, name is used in query (see `indexOfName`), where we can keep the
+       * rule that name `2` equals to name `'2'`.
        */
 
 
@@ -31451,11 +31459,11 @@
 
         return ordinal;
       };
-      /**
-       * @return Never null/undefined. `number` will be converted to string. Becuase:
-       * In all cases having encountered at present, id is used in making diff comparison, which
-       * are usually based on hash map. We can keep the rule that the internal id are always string
-       * (treat `2` is the same as `'2'`) to make the related logic simple.
+      /**
+       * @return Never null/undefined. `number` will be converted to string. Becuase:
+       * In all cases having encountered at present, id is used in making diff comparison, which
+       * are usually based on hash map. We can keep the rule that the internal id are always string
+       * (treat `2` is the same as `'2'`) to make the related logic simple.
        */
 
 
@@ -31466,10 +31474,10 @@
       SeriesData.prototype.count = function () {
         return this._store.count();
       };
-      /**
-       * Get value. Return NaN if idx is out of range.
-       *
-       * @notice Should better to use `data.getStore().get(dimIndex, dataIdx)` instead.
+      /**
+       * Get value. Return NaN if idx is out of range.
+       *
+       * @notice Should better to use `data.getStore().get(dimIndex, dataIdx)` instead.
        */
 
 
@@ -31481,8 +31489,8 @@
           return store.get(dimInfo.storeDimIndex, idx);
         }
       };
-      /**
-       * @notice Should better to use `data.getStore().getByRawIndex(dimIndex, dataIdx)` instead.
+      /**
+       * @notice Should better to use `data.getStore().getByRawIndex(dimIndex, dataIdx)` instead.
        */
 
 
@@ -31519,9 +31527,9 @@
           return _this._getStoreDimIndex(dim);
         }), idx) : store.getValues(dimensions);
       };
-      /**
-       * If value is NaN. Inlcuding '-'
-       * Only check the coord dimensions.
+      /**
+       * If value is NaN. Inlcuding '-'
+       * Only check the coord dimensions.
        */
 
 
@@ -31539,8 +31547,8 @@
 
         return true;
       };
-      /**
-       * Retreive the index with given name
+      /**
+       * Retreive the index with given name
        */
 
 
@@ -31561,12 +31569,12 @@
       SeriesData.prototype.indexOfRawIndex = function (rawIndex) {
         return this._store.indexOfRawIndex(rawIndex);
       };
-      /**
-       * Only support the dimension which inverted index created.
-       * Do not support other cases until required.
-       * @param dim concrete dim
-       * @param value ordinal index
-       * @return rawIndex
+      /**
+       * Only support the dimension which inverted index created.
+       * Do not support other cases until required.
+       * @param dim concrete dim
+       * @param value ordinal index
+       * @return rawIndex
        */
 
 
@@ -31587,13 +31595,13 @@
 
         return rawIndex;
       };
-      /**
-       * Retreive the index of nearest value
-       * @param dim
-       * @param value
-       * @param [maxDistance=Infinity]
-       * @return If and only if multiple indices has
-       *         the same value, they are put to the result.
+      /**
+       * Retreive the index of nearest value
+       * @param dim
+       * @param value
+       * @param [maxDistance=Infinity]
+       * @return If and only if multiple indices has
+       *         the same value, they are put to the result.
        */
 
 
@@ -31630,9 +31638,9 @@
         this._store = this._store.filter(dimIndices, fCtx ? bind(cb, fCtx) : cb);
         return this;
       };
-      /**
-       * Select data in range. (For optimization of filter)
-       * (Manually inline code, support 5 million data filtering in data zoom.)
+      /**
+       * Select data in range. (For optimization of filter)
+       * (Manually inline code, support 5 million data filtering in data zoom.)
        */
 
 
@@ -31702,9 +31710,9 @@
 
         this._store.modify(dimIndices, fCtx ? bind(cb, fCtx) : cb);
       };
-      /**
-       * Large data down sampling on given dimension
-       * @param sampleIndex Sample index for name and id
+      /**
+       * Large data down sampling on given dimension
+       * @param sampleIndex Sample index for name and id
        */
 
 
@@ -31713,10 +31721,10 @@
         list._store = this._store.downSample(this._getStoreDimIndex(dimension), rate, sampleValue, sampleIndex);
         return list;
       };
-      /**
-       * Large data down sampling using largest-triangle-three-buckets
-       * @param {string} valueDimension
-       * @param {number} targetCount
+      /**
+       * Large data down sampling using largest-triangle-three-buckets
+       * @param {string} valueDimension
+       * @param {number} targetCount
        */
 
 
@@ -31729,8 +31737,8 @@
       SeriesData.prototype.getRawDataItem = function (idx) {
         return this._store.getRawDataItem(idx);
       };
-      /**
-       * Get model of one data item.
+      /**
+       * Get model of one data item.
        */
       // TODO: Type of data item
 
@@ -31740,8 +31748,8 @@
         var dataItem = this.getRawDataItem(idx);
         return new Model(dataItem, hostModel, hostModel && hostModel.ecModel);
       };
-      /**
-       * Create a data differ
+      /**
+       * Create a data differ
        */
 
 
@@ -31753,8 +31761,8 @@
           return getId(thisList, idx);
         });
       };
-      /**
-       * Get visual property.
+      /**
+       * Get visual property.
        */
 
 
@@ -31772,8 +31780,8 @@
           this._visual[kvObj] = val;
         }
       };
-      /**
-       * Get visual property of single data item
+      /**
+       * Get visual property of single data item
        */
       // eslint-disable-next-line
 
@@ -31789,16 +31797,16 @@
 
         return val;
       };
-      /**
-       * If exists visual property of single data item
+      /**
+       * If exists visual property of single data item
        */
 
 
       SeriesData.prototype.hasItemVisual = function () {
         return this._itemVisuals.length > 0;
       };
-      /**
-       * Make sure itemVisual property is unique
+      /**
+       * Make sure itemVisual property is unique
        */
       // TODO: use key to save visual to reduce memory.
 
@@ -31839,8 +31847,8 @@
           itemVisual[key] = value;
         }
       };
-      /**
-       * Clear itemVisuals and list visual.
+      /**
+       * Clear itemVisuals and list visual.
        */
 
 
@@ -31852,40 +31860,40 @@
       SeriesData.prototype.setLayout = function (key, val) {
         isObject$2(key) ? extend(this._layout, key) : this._layout[key] = val;
       };
-      /**
-       * Get layout property.
+      /**
+       * Get layout property.
        */
 
 
       SeriesData.prototype.getLayout = function (key) {
         return this._layout[key];
       };
-      /**
-       * Get layout of single data item
+      /**
+       * Get layout of single data item
        */
 
 
       SeriesData.prototype.getItemLayout = function (idx) {
         return this._itemLayouts[idx];
       };
-      /**
-       * Set layout of single data item
+      /**
+       * Set layout of single data item
        */
 
 
       SeriesData.prototype.setItemLayout = function (idx, layout, merge) {
         this._itemLayouts[idx] = merge ? extend(this._itemLayouts[idx] || {}, layout) : layout;
       };
-      /**
-       * Clear all layout of single data item
+      /**
+       * Clear all layout of single data item
        */
 
 
       SeriesData.prototype.clearItemLayouts = function () {
         this._itemLayouts.length = 0;
       };
-      /**
-       * Set graphic element relative to data. It can be set as null
+      /**
+       * Set graphic element relative to data. It can be set as null
        */
 
 
@@ -31906,9 +31914,9 @@
           }
         });
       };
-      /**
-       * Shallow clone a new list except visual and layout properties, and graph elements.
-       * New list only change the indices.
+      /**
+       * Shallow clone a new list except visual and layout properties, and graph elements.
+       * New list only change the indices.
        */
 
 
@@ -31921,8 +31929,8 @@
         list._store = this._store;
         return list;
       };
-      /**
-       * Wrap some method to add more feature
+      /**
+       * Wrap some method to add more feature
        */
 
 
@@ -31974,8 +31982,8 @@
         getIdNameFromStore = function (data, dimIdx, idx) {
           return convertOptionIdName(data._getCategory(dimIdx, idx), null);
         };
-        /**
-         * @see the comment of `List['getId']`.
+        /**
+         * @see the comment of `List['getId']`.
          */
 
 
@@ -32000,8 +32008,8 @@
 
           return dimensions;
         };
-        /**
-         * Data in excludeDimensions is copied, otherwise transfered.
+        /**
+         * Data in excludeDimensions is copied, otherwise transfered.
          */
 
 
@@ -32058,24 +32066,24 @@
       return SeriesData;
     }();
 
-    /**
-     * For outside usage compat (like echarts-gl are using it).
+    /**
+     * For outside usage compat (like echarts-gl are using it).
      */
 
     function createDimensions(source, opt) {
       return prepareSeriesDataSchema(source, opt).dimensions;
     }
-    /**
-     * This method builds the relationship between:
-     * + "what the coord sys or series requires (see `coordDimensions`)",
-     * + "what the user defines (in `encode` and `dimensions`, see `opt.dimensionsDefine` and `opt.encodeDefine`)"
-     * + "what the data source provids (see `source`)".
-     *
-     * Some guess strategy will be adapted if user does not define something.
-     * If no 'value' dimension specified, the first no-named dimension will be
-     * named as 'value'.
-     *
-     * @return The results are always sorted by `storeDimIndex` asc.
+    /**
+     * This method builds the relationship between:
+     * + "what the coord sys or series requires (see `coordDimensions`)",
+     * + "what the user defines (in `encode` and `dimensions`, see `opt.dimensionsDefine` and `opt.encodeDefine`)"
+     * + "what the data source provids (see `source`)".
+     *
+     * Some guess strategy will be adapted if user does not define something.
+     * If no 'value' dimension specified, the first no-named dimension will be
+     * named as 'value'.
+     *
+     * @return The results are always sorted by `storeDimIndex` asc.
      */
 
     function prepareSeriesDataSchema( // TODO: TYPE completeDimensions type
@@ -32372,25 +32380,25 @@
       return name;
     }
 
-    /**
-     * @class
-     * For example:
-     * {
-     *     coordSysName: 'cartesian2d',
-     *     coordSysDims: ['x', 'y', ...],
-     *     axisMap: HashMap({
-     *         x: xAxisModel,
-     *         y: yAxisModel
-     *     }),
-     *     categoryAxisMap: HashMap({
-     *         x: xAxisModel,
-     *         y: undefined
-     *     }),
-     *     // The index of the first category axis in `coordSysDims`.
-     *     // `null/undefined` means no category axis exists.
-     *     firstCategoryDimIndex: 1,
-     *     // To replace user specified encode.
-     * }
+    /**
+     * @class
+     * For example:
+     * {
+     *     coordSysName: 'cartesian2d',
+     *     coordSysDims: ['x', 'y', ...],
+     *     axisMap: HashMap({
+     *         x: xAxisModel,
+     *         y: yAxisModel
+     *     }),
+     *     categoryAxisMap: HashMap({
+     *         x: xAxisModel,
+     *         y: undefined
+     *     }),
+     *     // The index of the first category axis in `coordSysDims`.
+     *     // `null/undefined` means no category axis exists.
+     *     firstCategoryDimIndex: 1,
+     *     // To replace user specified encode.
+     * }
      */
 
     var CoordSysInfo =
@@ -32518,25 +32526,25 @@
       return axisModel.get('type') === 'category';
     }
 
-    /**
-     * Note that it is too complicated to support 3d stack by value
-     * (have to create two-dimension inverted index), so in 3d case
-     * we just support that stacked by index.
-     *
-     * @param seriesModel
-     * @param dimensionsInput The same as the input of <module:echarts/data/SeriesData>.
-     *        The input will be modified.
-     * @param opt
-     * @param opt.stackedCoordDimension Specify a coord dimension if needed.
-     * @param opt.byIndex=false
-     * @return calculationInfo
-     * {
-     *     stackedDimension: string
-     *     stackedByDimension: string
-     *     isStackedByIndex: boolean
-     *     stackedOverDimension: string
-     *     stackResultDimension: string
-     * }
+    /**
+     * Note that it is too complicated to support 3d stack by value
+     * (have to create two-dimension inverted index), so in 3d case
+     * we just support that stacked by index.
+     *
+     * @param seriesModel
+     * @param dimensionsInput The same as the input of <module:echarts/data/SeriesData>.
+     *        The input will be modified.
+     * @param opt
+     * @param opt.stackedCoordDimension Specify a coord dimension if needed.
+     * @param opt.byIndex=false
+     * @return calculationInfo
+     * {
+     *     stackedDimension: string
+     *     stackedByDimension: string
+     *     isStackedByIndex: boolean
+     *     stackedOverDimension: string
+     *     stackResultDimension: string
+     * }
      */
 
     function enableDataStack(seriesModel, dimensionsInput, opt) {
@@ -32725,9 +32733,9 @@
 
       return firstCategoryDimIndex;
     }
-    /**
-     * Caution: there are side effects to `sourceManager` in this method.
-     * Should better only be called in `Series['getInitialData']`.
+    /**
+     * Caution: there are side effects to `sourceManager` in this method.
+     * Should better only be called in `Series['getInitialData']`.
      */
 
 
@@ -32804,8 +32812,8 @@
       Scale.prototype.getSetting = function (name) {
         return this._setting[name];
       };
-      /**
-       * Set extent from data
+      /**
+       * Set extent from data
        */
 
 
@@ -32815,26 +32823,26 @@
         other[1] > extent[1] && (extent[1] = other[1]); // not setExtent because in log axis it may transformed to power
         // this.setExtent(extent[0], extent[1]);
       };
-      /**
-       * Set extent from data
+      /**
+       * Set extent from data
        */
 
 
       Scale.prototype.unionExtentFromData = function (data, dim) {
         this.unionExtent(data.getApproximateExtent(dim));
       };
-      /**
-       * Get extent
-       *
-       * Extent is always in increase order.
+      /**
+       * Get extent
+       *
+       * Extent is always in increase order.
        */
 
 
       Scale.prototype.getExtent = function () {
         return this._extent.slice();
       };
-      /**
-       * Set extent
+      /**
+       * Set extent
        */
 
 
@@ -32849,26 +32857,26 @@
           thisExtent[1] = end;
         }
       };
-      /**
-       * If value is in extent range
+      /**
+       * If value is in extent range
        */
 
 
       Scale.prototype.isInExtentRange = function (value) {
         return this._extent[0] <= value && this._extent[1] >= value;
       };
-      /**
-       * When axis extent depends on data and no data exists,
-       * axis ticks should not be drawn, which is named 'blank'.
+      /**
+       * When axis extent depends on data and no data exists,
+       * axis ticks should not be drawn, which is named 'blank'.
        */
 
 
       Scale.prototype.isBlank = function () {
         return this._isBlank;
       };
-      /**
-       * When axis extent depends on data and no data exists,
-       * axis ticks should not be drawn, which is named 'blank'.
+      /**
+       * When axis extent depends on data and no data exists,
+       * axis ticks should not be drawn, which is named 'blank'.
        */
 
 
@@ -32909,8 +32917,8 @@
         // @ts-ignore
         return this._getOrCreateMap().get(category);
       };
-      /**
-       * @return The ordinal. If not found, return NaN.
+      /**
+       * @return The ordinal. If not found, return NaN.
        */
 
 
@@ -32983,10 +32991,10 @@
     function isIntervalOrLogScale(scale) {
       return scale.type === 'interval' || scale.type === 'log';
     }
-    /**
-     * @param extent Both extent[0] and extent[1] should be valid number.
-     *               Should be extent[0] < extent[1].
-     * @param splitNumber splitNumber should be >= 1.
+    /**
+     * @param extent Both extent[0] and extent[1] should be valid number.
+     *               Should be extent[0] < extent[1].
+     * @param splitNumber splitNumber should be >= 1.
      */
 
     function intervalScaleNiceTicks(extent, splitNumber, minInterval, maxInterval) {
@@ -33027,8 +33035,8 @@
 
       return round(f * exp10);
     }
-    /**
-     * @return interval precision
+    /**
+     * @return interval precision
      */
 
     function getIntervalPrecision(interval) {
@@ -33110,10 +33118,10 @@
         rank = this.parse(rank);
         return contain$1(rank, this._extent) && this._ordinalMeta.categories[rank] != null;
       };
-      /**
-       * Normalize given rank or name to linear [0, 1]
-       * @param val raw ordinal number.
-       * @return normalized value in [0, 1].
+      /**
+       * Normalize given rank or name to linear [0, 1]
+       * @param val raw ordinal number.
+       * @return normalized value in [0, 1].
        */
 
 
@@ -33121,9 +33129,9 @@
         val = this._getTickNumber(this.parse(val));
         return normalize$1(val, this._extent);
       };
-      /**
-       * @param val normalized value in [0, 1].
-       * @return raw ordinal number.
+      /**
+       * @param val normalized value in [0, 1].
+       * @return raw ordinal number.
        */
 
 
@@ -33151,8 +33159,8 @@
         // Not support.
         return;
       };
-      /**
-       * @see `Ordinal['_ordinalNumbersByTick']`
+      /**
+       * @see `Ordinal['_ordinalNumbersByTick']`
        */
 
 
@@ -33193,20 +33201,20 @@
 
         return ticksByOrdinalNumber && ordinal >= 0 && ordinal < ticksByOrdinalNumber.length ? ticksByOrdinalNumber[ordinal] : ordinal;
       };
-      /**
-       * @usage
-       * ```js
-       * const ordinalNumber = ordinalScale.getRawOrdinalNumber(tickVal);
-       *
-       * // case0
-       * const rawOrdinalValue = axisModel.getCategories()[ordinalNumber];
-       * // case1
-       * const rawOrdinalValue = this._ordinalMeta.categories[ordinalNumber];
-       * // case2
-       * const coord = axis.dataToCoord(ordinalNumber);
-       * ```
-       *
-       * @param {OrdinalNumber} tickNumber index of display
+      /**
+       * @usage
+       * ```js
+       * const ordinalNumber = ordinalScale.getRawOrdinalNumber(tickVal);
+       *
+       * // case0
+       * const rawOrdinalValue = axisModel.getCategories()[ordinalNumber];
+       * // case1
+       * const rawOrdinalValue = this._ordinalMeta.categories[ordinalNumber];
+       * // case2
+       * const coord = axis.dataToCoord(ordinalNumber);
+       * ```
+       *
+       * @param {OrdinalNumber} tickNumber index of display
        */
 
 
@@ -33216,8 +33224,8 @@
 
         return ordinalNumbersByTick && tickNumber >= 0 && tickNumber < ordinalNumbersByTick.length ? ordinalNumbersByTick[tickNumber] : tickNumber;
       };
-      /**
-       * Get item on tick
+      /**
+       * Get item on tick
        */
 
 
@@ -33238,9 +33246,9 @@
       OrdinalScale.prototype.unionExtentFromData = function (data, dim) {
         this.unionExtent(data.getApproximateExtent(dim));
       };
-      /**
-       * @override
-       * If value is in extent range
+      /**
+       * @override
+       * If value is in extent range
        */
 
 
@@ -33327,8 +33335,8 @@
         this._niceExtent = this._extent.slice();
         this._intervalPrecision = getIntervalPrecision(interval);
       };
-      /**
-       * @param expandToNicedExtent Whether expand the ticks to niced extent.
+      /**
+       * @param expandToNicedExtent Whether expand the ticks to niced extent.
        */
 
 
@@ -33425,9 +33433,9 @@
 
         return minorTicks;
       };
-      /**
-       * @param opt.precision If 'auto', use nice presision.
-       * @param opt.pad returns 1.50 but not 1.5 if precision is 2.
+      /**
+       * @param opt.precision If 'auto', use nice presision.
+       * @param opt.pad returns 1.50 but not 1.5 if precision is 2.
        */
 
 
@@ -33450,8 +33458,8 @@
         var dataNum = roundNumber(data.value, precision, true);
         return addCommas(dataNum);
       };
-      /**
-       * @param splitNumber By default `5`.
+      /**
+       * @param splitNumber By default `5`.
        */
 
 
@@ -33563,22 +33571,22 @@
       });
       return seriesModels;
     }
-    /**
-     * Map from (baseAxis.dim + '_' + baseAxis.index) to min gap of two adjacent
-     * values.
-     * This works for time axes, value axes, and log axes.
-     * For a single time axis, return value is in the form like
-     * {'x_0': [1000000]}.
-     * The value of 1000000 is in milliseconds.
+    /**
+     * Map from (baseAxis.dim + '_' + baseAxis.index) to min gap of two adjacent
+     * values.
+     * This works for time axes, value axes, and log axes.
+     * For a single time axis, return value is in the form like
+     * {'x_0': [1000000]}.
+     * The value of 1000000 is in milliseconds.
      */
 
     function getValueAxesMinGaps(barSeries) {
-      /**
-       * Map from axis.index to values.
-       * For a single time axis, axisValues is in the form like
-       * {'x_0': [1495555200000, 1495641600000, 1495728000000]}.
-       * Items in axisValues[x], e.g. 1495555200000, are time values of all
-       * series.
+      /**
+       * Map from axis.index to values.
+       * For a single time axis, axisValues is in the form like
+       * {'x_0': [1495555200000, 1495641600000, 1495728000000]}.
+       * Items in axisValues[x], e.g. 1495555200000, are time values of all
+       * series.
        */
       var axisValues = {};
       each(barSeries, function (seriesModel) {
@@ -34023,8 +34031,8 @@
         _this.type = 'time';
         return _this;
       }
-      /**
-       * Get label is mainly for other components like dataZoom, tooltip.
+      /**
+       * Get label is mainly for other components like dataZoom, tooltip.
        */
 
 
@@ -34038,8 +34046,8 @@
         var lang = this.getSetting('locale');
         return leveledFormat(tick, idx, labelFormatter, lang, isUTC);
       };
-      /**
-       * @override
+      /**
+       * @override
        */
 
 
@@ -34128,11 +34136,11 @@
       TimeScale.type = 'time';
       return TimeScale;
     }(IntervalScale);
-    /**
-     * This implementation was originally copied from "d3.js"
-     * <https://github.com/d3/d3/blob/b516d77fb8566b576088e73410437494717ada26/src/time/scale.js>
-     * with some modifications made for this program.
-     * See the license statement at the head of this file.
+    /**
+     * This implementation was originally copied from "d3.js"
+     * <https://github.com/d3/d3/blob/b516d77fb8566b576088e73410437494717ada26/src/time/scale.js>
+     * with some modifications made for this program.
+     * See the license statement at the head of this file.
      */
 
 
@@ -34556,8 +34564,8 @@
         _this._interval = 0;
         return _this;
       }
-      /**
-       * @param Whether expand the ticks to niced extent.
+      /**
+       * @param Whether expand the ticks to niced extent.
        */
 
 
@@ -34584,8 +34592,8 @@
         end = mathLog(end) / mathLog(base);
         intervalScaleProto.setExtent.call(this, start, end);
       };
-      /**
-       * @return {number} end
+      /**
+       * @return {number} end
        */
 
 
@@ -34616,9 +34624,9 @@
         // filter value that <= 0
         this.unionExtent(data.getApproximateExtent(dim));
       };
-      /**
-       * Update interval and extent of intervals for nice ticks
-       * @param approxTickNum default 10 Given approx tick number
+      /**
+       * Update interval and extent of intervals for nice ticks
+       * @param approxTickNum default 10 Given approx tick number
        */
 
 
@@ -34694,9 +34702,9 @@
       originalExtent) {
         this._prepareParams(scale, model, originalExtent);
       }
-      /**
-       * Parameters depending on ouside (like model, user callback)
-       * are prepared and fixed here.
+      /**
+       * Parameters depending on ouside (like model, user callback)
+       * are prepared and fixed here.
        */
 
 
@@ -34754,11 +34762,11 @@
           }
         }
       };
-      /**
-       * Calculate extent by prepared parameters.
-       * This method has no external dependency and can be called duplicatedly,
-       * getting the same result.
-       * If parameters changed, should call this method to recalcuate.
+      /**
+       * Calculate extent by prepared parameters.
+       * This method has no external dependency and can be called duplicatedly,
+       * getting the same result.
+       * If parameters changed, should call this method to recalcuate.
        */
 
 
@@ -34872,20 +34880,20 @@
       min: '_dataMin',
       max: '_dataMax'
     };
-    /**
-     * Get scale min max and related info only depends on model settings.
-     * This method can be called after coordinate system created.
-     * For example, in data processing stage.
-     *
-     * Scale extent info probably be required multiple times during a workflow.
-     * For example:
-     * (1) `dataZoom` depends it to get the axis extent in "100%" state.
-     * (2) `processor/extentCalculator` depends it to make sure whether axis extent is specified.
-     * (3) `coordSys.update` use it to finally decide the scale extent.
-     * But the callback of `min`/`max` should not be called multiple times.
-     * The code below should not be implemented repeatedly either.
-     * So we cache the result in the scale instance, which will be recreated at the begining
-     * of the workflow (because `scale` instance will be recreated each round of the workflow).
+    /**
+     * Get scale min max and related info only depends on model settings.
+     * This method can be called after coordinate system created.
+     * For example, in data processing stage.
+     *
+     * Scale extent info probably be required multiple times during a workflow.
+     * For example:
+     * (1) `dataZoom` depends it to get the axis extent in "100%" state.
+     * (2) `processor/extentCalculator` depends it to make sure whether axis extent is specified.
+     * (3) `coordSys.update` use it to finally decide the scale extent.
+     * But the callback of `min`/`max` should not be called multiple times.
+     * The code below should not be implemented repeatedly either.
+     * So we cache the result in the scale instance, which will be recreated at the begining
+     * of the workflow (because `scale` instance will be recreated each round of the workflow).
      */
 
     function ensureScaleRawExtentInfo(scale, model, // Usually: data extent from all series on this axis.
@@ -34906,14 +34914,14 @@
       return minMax == null ? null : eqNaN(minMax) ? NaN : scale.parse(minMax);
     }
 
-    /**
-     * Get axis scale extent before niced.
-     * Item of returned array can only be number (including Infinity and NaN).
-     *
-     * Caution:
-     * Precondition of calling this method:
-     * The scale extent has been initialized using series data extent via
-     * `scale.setExtent` or `scale.unionExtentFromData`;
+    /**
+     * Get axis scale extent before niced.
+     * Item of returned array can only be number (including Infinity and NaN).
+     *
+     * Caution:
+     * Precondition of calling this method:
+     * The scale extent has been initialized using series data extent via
+     * `scale.setExtent` or `scale.unionExtentFromData`;
      */
 
     function getScaleExtent(scale, model) {
@@ -35033,8 +35041,8 @@
         scale.setInterval && scale.setInterval(interval);
       }
     }
-    /**
-     * @param axisType Default retrieve from model.type
+    /**
+     * @param axisType Default retrieve from model.type
      */
 
     function createScaleByModel(model, axisType) {
@@ -35061,8 +35069,8 @@
         }
       }
     }
-    /**
-     * Check if the axis cross 0
+    /**
+     * Check if the axis cross 0
      */
 
     function ifAxisCrossZero(axis) {
@@ -35071,13 +35079,13 @@
       var max = dataExtent[1];
       return !(min > 0 && max > 0 || min < 0 && max < 0);
     }
-    /**
-     * @param axis
-     * @return Label formatter function.
-     *         param: {number} tickValue,
-     *         param: {number} idx, the index in all ticks.
-     *                         If category axis, this param is not required.
-     *         return: {string} label string.
+    /**
+     * @param axis
+     * @return Label formatter function.
+     *         param: {number} tickValue,
+     *         param: {number} idx, the index in all ticks.
+     *                         If category axis, this param is not required.
+     *         return: {string} label string.
      */
 
     function makeLabelFormatter(axis) {
@@ -35130,9 +35138,9 @@
       // in category axis.
       return axis.type === 'category' ? axis.scale.getLabel(tick) : tick.value;
     }
-    /**
-     * @param axis
-     * @return Be null/undefined if no labels.
+    /**
+     * @param axis
+     * @return Be null/undefined if no labels.
      */
 
     function estimateLabelUnionRect(axis) {
@@ -35185,9 +35193,9 @@
       var rotatedRect = new BoundingRect(textRect.x, textRect.y, afterWidth, afterHeight);
       return rotatedRect;
     }
-    /**
-     * @param model axisLabelModel or axisTickModel
-     * @return {number|String} Can be null|'auto'|number|function
+    /**
+     * @param model axisLabelModel or axisTickModel
+     * @return {number|String} Can be null|'auto'|number|function
      */
 
 
@@ -35195,10 +35203,10 @@
       var interval = model.get('interval');
       return interval == null ? 'auto' : interval;
     }
-    /**
-     * Set `categoryInterval` as 0 implicitly indicates that
-     * show all labels reguardless of overlap.
-     * @param {Object} axis axisModel.axis
+    /**
+     * Set `categoryInterval` as 0 implicitly indicates that
+     * show all labels reguardless of overlap.
+     * @param {Object} axis axisModel.axis
      */
 
     function shouldShowAllLabels(axis) {
@@ -35255,23 +35263,23 @@
      * AUTO-GENERATED FILE. DO NOT MODIFY.
      */
 
-    /*
-    * Licensed to the Apache Software Foundation (ASF) under one
-    * or more contributor license agreements.  See the NOTICE file
-    * distributed with this work for additional information
-    * regarding copyright ownership.  The ASF licenses this file
-    * to you under the Apache License, Version 2.0 (the
-    * "License"); you may not use this file except in compliance
-    * with the License.  You may obtain a copy of the License at
-    *
-    *   http://www.apache.org/licenses/LICENSE-2.0
-    *
-    * Unless required by applicable law or agreed to in writing,
-    * software distributed under the License is distributed on an
-    * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    * KIND, either express or implied.  See the License for the
-    * specific language governing permissions and limitations
-    * under the License.
+    /*
+    * Licensed to the Apache Software Foundation (ASF) under one
+    * or more contributor license agreements.  See the NOTICE file
+    * distributed with this work for additional information
+    * regarding copyright ownership.  The ASF licenses this file
+    * to you under the Apache License, Version 2.0 (the
+    * "License"); you may not use this file except in compliance
+    * with the License.  You may obtain a copy of the License at
+    *
+    *   http://www.apache.org/licenses/LICENSE-2.0
+    *
+    * Unless required by applicable law or agreed to in writing,
+    * software distributed under the License is distributed on an
+    * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    * KIND, either express or implied.  See the License for the
+    * specific language governing permissions and limitations
+    * under the License.
     */
     // eslint-disable-next-line @typescript-eslint/no-unused-vars
     var AxisModelCommonMixin =
@@ -35283,9 +35291,9 @@
         var option = this.option;
         return !option.scale;
       };
-      /**
-       * Should be implemented by each axis model if necessary.
-       * @return coordinate system model
+      /**
+       * Should be implemented by each axis model if necessary.
+       * @return coordinate system model
        */
 
 
@@ -35296,8 +35304,8 @@
       return AxisModelCommonMixin;
     }();
 
-    /**
-     * Create a muti dimension List structure from seriesModel.
+    /**
+     * Create a muti dimension List structure from seriesModel.
      */
 
     function createList(seriesModel) {
@@ -35308,11 +35316,11 @@
       enableDataStack: enableDataStack,
       getStackedDimension: getStackedDimension
     };
-    /**
-     * Create scale
-     * @param {Array.<number>} dataExtent
-     * @param {Object|module:echarts/Model} option If `optoin.type`
-     *        is secified, it can only be `'value'` currently.
+    /**
+     * Create scale
+     * @param {Array.<number>} dataExtent
+     * @param {Object|module:echarts/Model} option If `optoin.type`
+     *        is secified, it can only be `'value'` currently.
      */
 
     function createScale(dataExtent, option) {
@@ -35334,15 +35342,15 @@
       niceScaleExtent(scale, axisModel);
       return scale;
     }
-    /**
-     * Mixin common methods to axis model,
-     *
-     * Inlcude methods
-     * `getFormattedLabels() => Array.<string>`
-     * `getCategories() => Array.<string>`
-     * `getMin(origin: boolean) => number`
-     * `getMax(origin: boolean) => number`
-     * `getNeedCrossZero() => boolean`
+    /**
+     * Mixin common methods to axis model,
+     *
+     * Inlcude methods
+     * `getFormattedLabels() => Array.<string>`
+     * `getCategories() => Array.<string>`
+     * `getMin(origin: boolean) => number`
+     * `getMax(origin: boolean) => number`
+     * `getNeedCrossZero() => boolean`
      */
 
     function mixinAxisModelCommonMethods(Model) {
@@ -35445,10 +35453,10 @@
       Region.prototype.setCenter = function (center) {
         this._center = center;
       };
-      /**
-       * Get center point in data unit. That is,
-       * for GeoJSONRegion, the unit is lat/lng,
-       * for GeoSVGRegion, the unit is SVG local coord.
+      /**
+       * Get center point in data unit. That is,
+       * for GeoJSONRegion, the unit is lat/lng,
+       * for GeoSVGRegion, the unit is SVG local coord.
        */
 
 
@@ -35597,12 +35605,12 @@
 
         return false;
       };
-      /**
-       * Transform the raw coords to target bounding.
-       * @param x
-       * @param y
-       * @param width
-       * @param height
+      /**
+       * Transform the raw coords to target bounding.
+       * @param x
+       * @param y
+       * @param width
+       * @param height
        */
 
 
@@ -35905,13 +35913,13 @@
       // Only ordinal scale support tick interval
       return axis.type === 'category' ? makeCategoryLabels(axis) : makeRealNumberLabels(axis);
     }
-    /**
-     * @param {module:echats/coord/Axis} axis
-     * @param {module:echarts/model/Model} tickModel For example, can be axisTick, splitLine, splitArea.
-     * @return {Object} {
-     *     ticks: Array.<number>
-     *     tickCategoryInterval: number
-     * }
+    /**
+     * @param {module:echats/coord/Axis} axis
+     * @param {module:echarts/model/Model} tickModel For example, can be axisTick, splitLine, splitArea.
+     * @return {Object} {
+     *     ticks: Array.<number>
+     *     tickCategoryInterval: number
+     * }
      */
 
     function createAxisTicks(axis, tickModel) {
@@ -36038,10 +36046,10 @@
       var result = inner$5(axis).autoInterval;
       return result != null ? result : inner$5(axis).autoInterval = axis.calculateCategoryInterval();
     }
-    /**
-     * Calculate interval for category axis ticks and labels.
-     * To get precise result, at least one of `getRotate` and `isHorizontal`
-     * should be implemented in axis.
+    /**
+     * Calculate interval for category axis ticks and labels.
+     * To get precise result, at least one of `getRotate` and `isHorizontal`
+     * should be implemented in axis.
      */
 
 
@@ -36209,8 +36217,8 @@
     }
 
     var NORMALIZED_EXTENT = [0, 1];
-    /**
-     * Base class of Axis.
+    /**
+     * Base class of Axis.
      */
 
     var Axis =
@@ -36223,8 +36231,8 @@
         this.scale = scale;
         this._extent = extent || [0, 0];
       }
-      /**
-       * If axis extent contain given coord
+      /**
+       * If axis extent contain given coord
        */
 
 
@@ -36234,32 +36242,32 @@
         var max = Math.max(extent[0], extent[1]);
         return coord >= min && coord <= max;
       };
-      /**
-       * If axis extent contain given data
+      /**
+       * If axis extent contain given data
        */
 
 
       Axis.prototype.containData = function (data) {
         return this.scale.contain(data);
       };
-      /**
-       * Get coord extent.
+      /**
+       * Get coord extent.
        */
 
 
       Axis.prototype.getExtent = function () {
         return this._extent.slice();
       };
-      /**
-       * Get precision used for formatting
+      /**
+       * Get precision used for formatting
        */
 
 
       Axis.prototype.getPixelPrecision = function (dataExtent) {
         return getPixelPrecision(dataExtent || this.scale.getExtent(), this._extent);
       };
-      /**
-       * Set coord extent
+      /**
+       * Set coord extent
        */
 
 
@@ -36268,8 +36276,8 @@
         extent[0] = start;
         extent[1] = end;
       };
-      /**
-       * Convert data to coord. Data is the rank if it has an ordinal scale
+      /**
+       * Convert data to coord. Data is the rank if it has an ordinal scale
        */
 
 
@@ -36285,8 +36293,8 @@
 
         return linearMap(data, NORMALIZED_EXTENT, extent, clamp);
       };
-      /**
-       * Convert coord to data. Data is the rank if it has an ordinal scale
+      /**
+       * Convert coord to data. Data is the rank if it has an ordinal scale
        */
 
 
@@ -36302,8 +36310,8 @@
         var t = linearMap(coord, extent, NORMALIZED_EXTENT, clamp);
         return this.scale.scale(t);
       };
-      /**
-       * Convert pixel point to data in axis
+      /**
+       * Convert pixel point to data in axis
        */
 
 
@@ -36311,14 +36319,14 @@
         // Should be implemented in derived class if necessary.
         return;
       };
-      /**
-       * Different from `zrUtil.map(axis.getTicks(), axis.dataToCoord, axis)`,
-       * `axis.getTicksCoords` considers `onBand`, which is used by
-       * `boundaryGap:true` of category axis and splitLine and splitArea.
-       * @param opt.tickModel default: axis.model.getModel('axisTick')
-       * @param opt.clamp If `true`, the first and the last
-       *        tick must be at the axis end points. Otherwise, clip ticks
-       *        that outside the axis extent.
+      /**
+       * Different from `zrUtil.map(axis.getTicks(), axis.dataToCoord, axis)`,
+       * `axis.getTicksCoords` considers `onBand`, which is used by
+       * `boundaryGap:true` of category axis and splitLine and splitArea.
+       * @param opt.tickModel default: axis.model.getModel('axisTick')
+       * @param opt.clamp If `true`, the first and the last
+       *        tick must be at the axis end points. Otherwise, clip ticks
+       *        that outside the axis extent.
        */
 
 
@@ -36370,20 +36378,20 @@
       Axis.prototype.getLabelModel = function () {
         return this.model.getModel('axisLabel');
       };
-      /**
-       * Notice here we only get the default tick model. For splitLine
-       * or splitArea, we should pass the splitLineModel or splitAreaModel
-       * manually when calling `getTicksCoords`.
-       * In GL, this method may be overrided to:
-       * `axisModel.getModel('axisTick', grid3DModel.getModel('axisTick'));`
+      /**
+       * Notice here we only get the default tick model. For splitLine
+       * or splitArea, we should pass the splitLineModel or splitAreaModel
+       * manually when calling `getTicksCoords`.
+       * In GL, this method may be overrided to:
+       * `axisModel.getModel('axisTick', grid3DModel.getModel('axisTick'));`
        */
 
 
       Axis.prototype.getTickModel = function () {
         return this.model.getModel('axisTick');
       };
-      /**
-       * Get width of band
+      /**
+       * Get width of band
        */
 
 
@@ -36396,10 +36404,10 @@
         var size = Math.abs(axisExtent[1] - axisExtent[0]);
         return Math.abs(size) / len;
       };
-      /**
-       * Only be called in category axis.
-       * Can be overrided, consider other axes like in 3D.
-       * @return Auto interval for cateogry axis tick and label
+      /**
+       * Only be called in category axis.
+       * Can be overrided, consider other axes like in 3D.
+       * @return Auto interval for cateogry axis tick and label
        */
 
 
@@ -36546,10 +36554,10 @@
 
     var tmpArr = [];
     var tmpProjPoint = new Point();
-    /**
-     * Reduce the line segment attached to the label to limit the turn angle between two segments.
-     * @param linePoints
-     * @param minTurnAngle Radian of minimum turn angle. 0 - 180
+    /**
+     * Reduce the line segment attached to the label to limit the turn angle between two segments.
+     * @param linePoints
+     * @param minTurnAngle Radian of minimum turn angle. 0 - 180
      */
 
     function limitTurnAngle(linePoints, minTurnAngle) {
@@ -36602,9 +36610,9 @@
         tmpProjPoint.toArray(linePoints[1]);
       }
     }
-    /**
-     * Limit the angle of line and the surface
-     * @param maxSurfaceAngle Radian of minimum turn angle. 0 - 180. 0 is same direction to normal. 180 is opposite
+    /**
+     * Limit the angle of line and the surface
+     * @param maxSurfaceAngle Radian of minimum turn angle. 0 - 180. 0 is same direction to normal. 180 is opposite
      */
 
     function limitSurfaceAngle(linePoints, surfaceNormal, maxSurfaceAngle) {
@@ -36716,8 +36724,8 @@
         }
       }
     }
-    /**
-     * Create a label line if necessary and set it's style.
+    /**
+     * Create a label line if necessary and set it's style.
      */
 
 
@@ -36974,9 +36982,9 @@
           }
         }
       }
-      /**
-       * Squeeze to allow overlap if there is no more space available.
-       * Let other overlapping strategy like hideOverlap do the job instead of keep exceeding the bounds.
+      /**
+       * Squeeze to allow overlap if there is no more space available.
+       * Let other overlapping strategy like hideOverlap do the job instead of keep exceeding the bounds.
        */
 
 
@@ -37004,8 +37012,8 @@
 
       return adjusted;
     }
-    /**
-     * Adjust labels on y direction to avoid overlap.
+    /**
+     * Adjust labels on y direction to avoid overlap.
      */
 
     function shiftLayoutOnY(list, topBound, bottomBound, // If average the shifts on all labels and add them to 0
@@ -39579,8 +39587,8 @@
       return LineSeriesModel;
     }(SeriesModel);
 
-    /**
-     * @return label string. Not null/undefined
+    /**
+     * @return label string. Not null/undefined
      */
 
     function getDefaultLabel(data, dataIndex) {
@@ -39654,9 +39662,9 @@
         this._symbolType = symbolType;
         this.add(symbolPath);
       };
-      /**
-       * Stop animation
-       * @param {boolean} toLastFrame
+      /**
+       * Stop animation
+       * @param {boolean} toLastFrame
        */
 
 
@@ -39667,39 +39675,39 @@
       Symbol.prototype.getSymbolType = function () {
         return this._symbolType;
       };
-      /**
-       * FIXME:
-       * Caution: This method breaks the encapsulation of this module,
-       * but it indeed brings convenience. So do not use the method
-       * unless you detailedly know all the implements of `Symbol`,
-       * especially animation.
-       *
-       * Get symbol path element.
+      /**
+       * FIXME:
+       * Caution: This method breaks the encapsulation of this module,
+       * but it indeed brings convenience. So do not use the method
+       * unless you detailedly know all the implements of `Symbol`,
+       * especially animation.
+       *
+       * Get symbol path element.
        */
 
 
       Symbol.prototype.getSymbolPath = function () {
         return this.childAt(0);
       };
-      /**
-       * Highlight symbol
+      /**
+       * Highlight symbol
        */
 
 
       Symbol.prototype.highlight = function () {
         enterEmphasis(this.childAt(0));
       };
-      /**
-       * Downplay symbol
+      /**
+       * Downplay symbol
        */
 
 
       Symbol.prototype.downplay = function () {
         leaveEmphasis(this.childAt(0));
       };
-      /**
-       * @param {number} zlevel
-       * @param {number} z
+      /**
+       * @param {number} zlevel
+       * @param {number} z
        */
 
 
@@ -39709,13 +39717,13 @@
         symbolPath.z = z;
       };
 
-      Symbol.prototype.setDraggable = function (draggable) {
+      Symbol.prototype.setDraggable = function (draggable, hasCursorOption) {
         var symbolPath = this.childAt(0);
         symbolPath.draggable = draggable;
-        symbolPath.cursor = draggable ? 'move' : symbolPath.cursor;
+        symbolPath.cursor = !hasCursorOption && draggable ? 'move' : symbolPath.cursor;
       };
-      /**
-       * Update symbol properties
+      /**
+       * Update symbol properties
        */
 
 
@@ -39984,8 +39992,8 @@
         this.group = new Group();
         this._SymbolCtor = SymbolCtor || Symbol;
       }
-      /**
-       * Update symbols draw by new data
+      /**
+       * Update symbols draw by new data
        */
 
 
@@ -40082,8 +40090,8 @@
         this._data = null;
         this.group.removeAll();
       };
-      /**
-       * Update symbols draw by new data
+      /**
+       * Update symbols draw by new data
        */
 
       SymbolDraw.prototype.incrementalUpdate = function (taskParams, data, opt) {
@@ -40359,10 +40367,10 @@
     function isPointNull(x, y) {
       return isNaN(x) || isNaN(y);
     }
-    /**
-     * Draw smoothed line in non-monotone, in may cause undesired curve in extreme
-     * situations. This should be used when points are non-monotone neither in x or
-     * y dimension.
+    /**
+     * Draw smoothed line in non-monotone, in may cause undesired curve in extreme
+     * situations. This should be used when points are non-monotone neither in x or
+     * y dimension.
      */
 
 
@@ -40847,23 +40855,23 @@
      * AUTO-GENERATED FILE. DO NOT MODIFY.
      */
 
-    /*
-    * Licensed to the Apache Software Foundation (ASF) under one
-    * or more contributor license agreements.  See the NOTICE file
-    * distributed with this work for additional information
-    * regarding copyright ownership.  The ASF licenses this file
-    * to you under the Apache License, Version 2.0 (the
-    * "License"); you may not use this file except in compliance
-    * with the License.  You may obtain a copy of the License at
-    *
-    *   http://www.apache.org/licenses/LICENSE-2.0
-    *
-    * Unless required by applicable law or agreed to in writing,
-    * software distributed under the License is distributed on an
-    * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    * KIND, either express or implied.  See the License for the
-    * specific language governing permissions and limitations
-    * under the License.
+    /*
+    * Licensed to the Apache Software Foundation (ASF) under one
+    * or more contributor license agreements.  See the NOTICE file
+    * distributed with this work for additional information
+    * regarding copyright ownership.  The ASF licenses this file
+    * to you under the Apache License, Version 2.0 (the
+    * "License"); you may not use this file except in compliance
+    * with the License.  You may obtain a copy of the License at
+    *
+    *   http://www.apache.org/licenses/LICENSE-2.0
+    *
+    * Unless required by applicable law or agreed to in writing,
+    * software distributed under the License is distributed on an
+    * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    * KIND, either express or implied.  See the License for the
+    * specific language governing permissions and limitations
+    * under the License.
     */
     function isCoordinateSystemType(coordSys, type) {
       return coordSys.type === type;
@@ -40997,11 +41005,11 @@
       stepPoints.push(points[i++], points[i++]);
       return stepPoints;
     }
-    /**
-     * Clip color stops to edge. Avoid creating too large gradients.
-     * Which may lead to blurry when GPU acceleration is enabled. See #15680
-     *
-     * The stops has been sorted from small to large.
+    /**
+     * Clip color stops to edge. Avoid creating too large gradients.
+     * Which may lead to blurry when GPU acceleration is enabled. See #15680
+     *
+     * The stops has been sorted from small to large.
      */
 
 
@@ -41445,7 +41453,11 @@
 
           if (isAreaChart) {
             polygon = this._newPolygon(points, stackedOnPoints);
-          } // NOTE: Must update _endLabel before setClipPath.
+          } // If areaStyle is removed
+          else if (polygon) {
+              lineGroup.remove(polygon);
+              polygon = this._polygon = null;
+            } // NOTE: Must update _endLabel before setClipPath.
 
 
           if (!isCoordSysPolar) {
@@ -41948,8 +41960,8 @@
           }
         }
       };
-      /**
-       * @private
+      /**
+       * @private
        */
       // FIXME Two value axis
 
@@ -42350,8 +42362,8 @@
           createInvertedIndices: !!this.get('realtimeSort', true) || null
         });
       };
-      /**
-       * @override
+      /**
+       * @override
        */
 
 
@@ -42359,8 +42371,8 @@
         // Do not support progressive in normal mode.
         return this.get('large') ? this.get('progressive') : false;
       };
-      /**
-       * @override
+      /**
+       * @override
        */
 
 
@@ -42410,8 +42422,8 @@
       return BarSeriesModel;
     }(BaseBarSeriesModel);
 
-    /**
-     * Sausage: similar to sector, but have half circle on both sides
+    /**
+     * Sausage: similar to sector, but have half circle on both sides
      */
 
     var SausageShape =
@@ -42643,12 +42655,12 @@
       }
 
       var rotate = Math.PI * 1.5 - anchorAngle;
-      /**
-       * TODO: labels with rotate > Math.PI / 2 should be rotate another
-       * half round flipped to increase readability. However, only middle
-       * position supports this for now, because in other positions, the
-       * anchor point is not at the center of the text, so the positions
-       * after rotating is not as expected.
+      /**
+       * TODO: labels with rotate > Math.PI / 2 should be rotate another
+       * half round flipped to increase readability. However, only middle
+       * position supports this for now, because in other positions, the
+       * anchor point is not at the center of the text, so the positions
+       * after rotating is not as expected.
        */
 
       if (mappedSectorPosition === 'middle' && rotate > Math.PI / 2 && rotate < Math.PI * 1.5) {
@@ -42829,13 +42841,13 @@
           var el = elementCreator[coord.type](seriesModel, data, dataIndex, layout, isHorizontalOrRadial, animationModel, baseAxis.model, false, roundCap);
 
           if (realtimeSortCfg) {
-            /**
-             * Force label animation because even if the element is
-             * ignored because it's clipped, it may not be clipped after
-             * changing order. Then, if not using forceLabelAnimation,
-             * the label animation was never started, in which case,
-             * the label will be the final value and doesn't have label
-             * animation.
+            /**
+             * Force label animation because even if the element is
+             * ignored because it's clipped, it may not be clipped after
+             * changing order. Then, if not using forceLabelAnimation,
+             * the label animation was never started, in which case,
+             * the label will be the final value and doesn't have label
+             * animation.
              */
             el.forceLabelAnimation = true;
           }
@@ -42918,11 +42930,11 @@
               var labelInnerStore = labelInner(textEl);
 
               if (labelInnerStore.prevValue != null) {
-                /**
-                 * Set preValue to be value so that no new label
-                 * should be started, otherwise, it will take a full
-                 * `animationDurationUpdate` time to finish the
-                 * animation, which is not expected.
+                /**
+                 * Set preValue to be value so that no new label
+                 * should be started, otherwise, it will take a full
+                 * `animationDurationUpdate` time to finish the
+                 * animation, which is not expected.
                  */
                 labelInnerStore.prevValue = labelInnerStore.value;
               }
@@ -43064,10 +43076,10 @@
 
         return false;
       };
-      /*
-       * Consider the case when A and B changed order, whose representing
-       * bars are both out of sight, we don't wish to trigger reorder action
-       * as long as the order in the view doesn't change.
+      /*
+       * Consider the case when A and B changed order, whose representing
+       * bars are both out of sight, we don't wish to trigger reorder action
+       * as long as the order in the view doesn't change.
        */
 
 
@@ -43645,14 +43657,14 @@
       registers.registerLayout(registers.PRIORITY.VISUAL.PROGRESSIVE_LAYOUT, createProgressiveLayout('bar')); // Down sample after filter
 
       registers.registerProcessor(registers.PRIORITY.PROCESSOR.STATISTIC, dataSample('bar'));
-      /**
-       * @payload
-       * @property {string} [componentType=series]
-       * @property {number} [dx]
-       * @property {number} [dy]
-       * @property {number} [zoom]
-       * @property {number} [originX]
-       * @property {number} [originY]
+      /**
+       * @payload
+       * @property {string} [componentType=series]
+       * @property {number} [dx]
+       * @property {number} [dy]
+       * @property {number} [zoom]
+       * @property {number} [originX]
+       * @property {number} [originY]
        */
 
       registers.registerAction({
@@ -43845,23 +43857,23 @@
      * AUTO-GENERATED FILE. DO NOT MODIFY.
      */
 
-    /*
-    * Licensed to the Apache Software Foundation (ASF) under one
-    * or more contributor license agreements.  See the NOTICE file
-    * distributed with this work for additional information
-    * regarding copyright ownership.  The ASF licenses this file
-    * to you under the Apache License, Version 2.0 (the
-    * "License"); you may not use this file except in compliance
-    * with the License.  You may obtain a copy of the License at
-    *
-    *   http://www.apache.org/licenses/LICENSE-2.0
-    *
-    * Unless required by applicable law or agreed to in writing,
-    * software distributed under the License is distributed on an
-    * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    * KIND, either express or implied.  See the License for the
-    * specific language governing permissions and limitations
-    * under the License.
+    /*
+    * Licensed to the Apache Software Foundation (ASF) under one
+    * or more contributor license agreements.  See the NOTICE file
+    * distributed with this work for additional information
+    * regarding copyright ownership.  The ASF licenses this file
+    * to you under the Apache License, Version 2.0 (the
+    * "License"); you may not use this file except in compliance
+    * with the License.  You may obtain a copy of the License at
+    *
+    *   http://www.apache.org/licenses/LICENSE-2.0
+    *
+    * Unless required by applicable law or agreed to in writing,
+    * software distributed under the License is distributed on an
+    * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    * KIND, either express or implied.  See the License for the
+    * specific language governing permissions and limitations
+    * under the License.
     */
     function dataFilter(seriesType) {
       return {
@@ -44069,15 +44081,15 @@
         }
       }
     }
-    /**
-     * Set max width of each label, and then wrap each label to the max width.
-     *
-     * @param layout label layout
-     * @param availableWidth max width for the label to display
-     * @param forceRecalculate recaculate the text layout even if the current width
-     * is smaller than `availableWidth`. This is useful when the text was previously
-     * wrapped by calling `constrainTextWidth` but now `availableWidth` changed, in
-     * which case, previous wrapping should be redo.
+    /**
+     * Set max width of each label, and then wrap each label to the max width.
+     *
+     * @param layout label layout
+     * @param availableWidth max width for the label to display
+     * @param forceRecalculate recaculate the text layout even if the current width
+     * is smaller than `availableWidth`. This is useful when the text was previously
+     * wrapped by calling `constrainTextWidth` but now `availableWidth` changed, in
+     * which case, previous wrapping should be redo.
      */
 
 
@@ -44395,8 +44407,8 @@
       };
     }
 
-    /**
-     * Piece of pie including Sector, Label, LabelLine
+    /**
+     * Piece of pie including Sector, Label, LabelLine
      */
 
     var PiePiece =
@@ -44656,15 +44668,15 @@
       return PieView;
     }(ChartView);
 
-    /**
-     * [Usage]:
-     * (1)
-     * createListSimply(seriesModel, ['value']);
-     * (2)
-     * createListSimply(seriesModel, {
-     *     coordDimensions: ['value'],
-     *     dimensionsCount: 5
-     * });
+    /**
+     * [Usage]:
+     * (1)
+     * createListSimply(seriesModel, ['value']);
+     * (2)
+     * createListSimply(seriesModel, {
+     *     coordDimensions: ['value'],
+     *     dimensionsCount: 5
+     * });
      */
 
     function createSeriesDataSimply(seriesModel, opt, nameList) {
@@ -44704,28 +44716,28 @@
      * AUTO-GENERATED FILE. DO NOT MODIFY.
      */
 
-    /*
-    * Licensed to the Apache Software Foundation (ASF) under one
-    * or more contributor license agreements.  See the NOTICE file
-    * distributed with this work for additional information
-    * regarding copyright ownership.  The ASF licenses this file
-    * to you under the Apache License, Version 2.0 (the
-    * "License"); you may not use this file except in compliance
-    * with the License.  You may obtain a copy of the License at
-    *
-    *   http://www.apache.org/licenses/LICENSE-2.0
-    *
-    * Unless required by applicable law or agreed to in writing,
-    * software distributed under the License is distributed on an
-    * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    * KIND, either express or implied.  See the License for the
-    * specific language governing permissions and limitations
-    * under the License.
+    /*
+    * Licensed to the Apache Software Foundation (ASF) under one
+    * or more contributor license agreements.  See the NOTICE file
+    * distributed with this work for additional information
+    * regarding copyright ownership.  The ASF licenses this file
+    * to you under the Apache License, Version 2.0 (the
+    * "License"); you may not use this file except in compliance
+    * with the License.  You may obtain a copy of the License at
+    *
+    *   http://www.apache.org/licenses/LICENSE-2.0
+    *
+    * Unless required by applicable law or agreed to in writing,
+    * software distributed under the License is distributed on an
+    * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    * KIND, either express or implied.  See the License for the
+    * specific language governing permissions and limitations
+    * under the License.
     */
 
-    /**
-     * LegendVisualProvider is an bridge that pick encoded color from data and
-     * provide to the legend component.
+    /**
+     * LegendVisualProvider is an bridge that pick encoded color from data and
+     * provide to the legend component.
      */
     var LegendVisualProvider =
     /** @class */
@@ -44778,8 +44790,8 @@
       function PieSeriesModel() {
         return _super !== null && _super.apply(this, arguments) || this;
       }
-      /**
-       * @overwrite
+      /**
+       * @overwrite
        */
 
 
@@ -44792,16 +44804,16 @@
 
         this._defaultLabelLine(option);
       };
-      /**
-       * @overwrite
+      /**
+       * @overwrite
        */
 
 
       PieSeriesModel.prototype.mergeOption = function () {
         _super.prototype.mergeOption.apply(this, arguments);
       };
-      /**
-       * @overwrite
+      /**
+       * @overwrite
        */
 
 
@@ -44811,8 +44823,8 @@
           encodeDefaulter: curry(makeSeriesEncodeForNameBased, this)
         });
       };
-      /**
-       * @overwrite
+      /**
+       * @overwrite
        */
 
 
@@ -45246,8 +45258,8 @@
       function LargeSymbolDraw() {
         this.group = new Group();
       }
-      /**
-       * Update symbols draw by new data
+      /**
+       * Update symbols draw by new data
        */
 
 
@@ -45715,23 +45727,23 @@
      * AUTO-GENERATED FILE. DO NOT MODIFY.
      */
 
-    /*
-    * Licensed to the Apache Software Foundation (ASF) under one
-    * or more contributor license agreements.  See the NOTICE file
-    * distributed with this work for additional information
-    * regarding copyright ownership.  The ASF licenses this file
-    * to you under the Apache License, Version 2.0 (the
-    * "License"); you may not use this file except in compliance
-    * with the License.  You may obtain a copy of the License at
-    *
-    *   http://www.apache.org/licenses/LICENSE-2.0
-    *
-    * Unless required by applicable law or agreed to in writing,
-    * software distributed under the License is distributed on an
-    * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    * KIND, either express or implied.  See the License for the
-    * specific language governing permissions and limitations
-    * under the License.
+    /*
+    * Licensed to the Apache Software Foundation (ASF) under one
+    * or more contributor license agreements.  See the NOTICE file
+    * distributed with this work for additional information
+    * regarding copyright ownership.  The ASF licenses this file
+    * to you under the Apache License, Version 2.0 (the
+    * "License"); you may not use this file except in compliance
+    * with the License.  You may obtain a copy of the License at
+    *
+    *   http://www.apache.org/licenses/LICENSE-2.0
+    *
+    * Unless required by applicable law or agreed to in writing,
+    * software distributed under the License is distributed on an
+    * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    * KIND, either express or implied.  See the License for the
+    * specific language governing permissions and limitations
+    * under the License.
     */
     var AXIS_TYPES = {
       value: 1,
@@ -45740,9 +45752,9 @@
       log: 1
     };
 
-    /**
-     * Generate sub axis model class
-     * @param axisName 'x' 'y' 'radius' 'angle' 'parallel' ...
+    /**
+     * Generate sub axis model class
+     * @param axisName 'x' 'y' 'radius' 'angle' 'parallel' ...
      */
 
     function axisModelCreator(registers, axisName, BaseAxisModelClass, extraDefaultOption) {
@@ -45781,9 +45793,9 @@
               this.__ordinalMeta = OrdinalMeta.createByAxisModel(this);
             }
           };
-          /**
-           * Should not be called before all of 'getInitailData' finished.
-           * Because categories are collected during initializing data.
+          /**
+           * Should not be called before all of 'getInitailData' finished.
+           * Because categories are collected during initializing data.
            */
 
 
@@ -45874,9 +45886,9 @@
         _this.dimensions = cartesian2DDimensions;
         return _this;
       }
-      /**
-       * Calculate an affine transform matrix if two axes are time or value.
-       * It's mainly for accelartion on the large time series data.
+      /**
+       * Calculate an affine transform matrix if two axes are time or value.
+       * It's mainly for accelartion on the large time series data.
        */
 
 
@@ -45908,8 +45920,8 @@
         var m = this._transform = [scaleX, 0, 0, scaleY, translateX, translateY];
         this._invTransform = invert([], m);
       };
-      /**
-       * Base axis will be used on stacking.
+      /**
+       * Base axis will be used on stacking.
        */
 
 
@@ -45927,6 +45939,14 @@
         return this.getAxis('x').containData(data[0]) && this.getAxis('y').containData(data[1]);
       };
 
+      Cartesian2D.prototype.containZone = function (data1, data2) {
+        var zoneDiag1 = this.dataToPoint(data1);
+        var zoneDiag2 = this.dataToPoint(data2);
+        var area = this.getArea();
+        var zone = new BoundingRect(zoneDiag1[0], zoneDiag1[1], zoneDiag2[0] - zoneDiag1[0], zoneDiag2[1] - zoneDiag1[1]);
+        return area.intersect(zone);
+      };
+
       Cartesian2D.prototype.dataToPoint = function (data, clamp, out) {
         out = out || [];
         var xVal = data[0];
@@ -45974,9 +45994,9 @@
       Cartesian2D.prototype.getOtherAxis = function (axis) {
         return this.getAxis(axis.dim === 'x' ? 'y' : 'x');
       };
-      /**
-       * Get rect area of cartesian.
-       * Area will have a contain function to determine if a point is in the coordinate system.
+      /**
+       * Get rect area of cartesian.
+       * Area will have a contain function to determine if a point is in the coordinate system.
        */
 
 
@@ -46000,9 +46020,9 @@
 
       function Axis2D(dim, scale, coordExtent, axisType, position) {
         var _this = _super.call(this, dim, scale, coordExtent) || this;
-        /**
-         * Index of axis, can be used as key
-         * Injected outside.
+        /**
+         * Index of axis, can be used as key
+         * Injected outside.
          */
 
 
@@ -46016,13 +46036,13 @@
         var position = this.position;
         return position === 'top' || position === 'bottom';
       };
-      /**
-       * Each item cooresponds to this.getExtent(), which
-       * means globalExtent[0] may greater than globalExtent[1],
-       * unless `asc` is input.
-       *
-       * @param {boolean} [asc]
-       * @return {Array.<number>}
+      /**
+       * Each item cooresponds to this.getExtent(), which
+       * means globalExtent[0] may greater than globalExtent[1],
+       * unless `asc` is input.
+       *
+       * @param {boolean} [asc]
+       * @return {Array.<number>}
        */
 
 
@@ -46037,9 +46057,9 @@
       Axis2D.prototype.pointToData = function (point, clamp) {
         return this.coordToData(this.toLocalCoord(point[this.dim === 'x' ? 0 : 1]), clamp);
       };
-      /**
-       * Set ordinalSortInfo
-       * @param info new OrdinalSortInfo
+      /**
+       * Set ordinalSortInfo
+       * @param info new OrdinalSortInfo
        */
 
 
@@ -46055,9 +46075,9 @@
       return Axis2D;
     }(Axis);
 
-    /**
-     * Can only be called after coordinate system creation stage.
-     * (Can be called before coordinate system update stage).
+    /**
+     * Can only be called after coordinate system creation stage.
+     * (Can be called before coordinate system update stage).
      */
 
     function layout$1(gridModel, axisModel, opt) {
@@ -46325,8 +46345,8 @@
 
         this.resize(this.model, api);
       };
-      /**
-       * Resize the grid
+      /**
+       * Resize the grid
        */
 
 
@@ -46412,8 +46432,8 @@
       Grid.prototype.getCartesians = function () {
         return this._coordsList.slice();
       };
-      /**
-       * @implements
+      /**
+       * @implements
        */
 
 
@@ -46422,8 +46442,8 @@
 
         return target.cartesian ? target.cartesian.dataToPoint(value) : target.axis ? target.axis.toGlobalCoord(target.axis.dataToCoord(value)) : null;
       };
-      /**
-       * @implements
+      /**
+       * @implements
        */
 
 
@@ -46465,8 +46485,8 @@
           axis: axis
         };
       };
-      /**
-       * @implements
+      /**
+       * @implements
        */
 
 
@@ -46477,8 +46497,8 @@
           return coord.containPoint(point);
         }
       };
-      /**
-       * Initialize cartesian coordinate systems
+      /**
+       * Initialize cartesian coordinate systems
        */
 
 
@@ -46571,8 +46591,8 @@
           };
         }
       };
-      /**
-       * Update cartesian properties from series.
+      /**
+       * Update cartesian properties from series.
        */
 
 
@@ -46611,8 +46631,8 @@
           });
         }
       };
-      /**
-       * @param dim 'x' or 'y' or 'auto' or null/undefined
+      /**
+       * @param dim 'x' or 'y' or 'auto' or null/undefined
        */
 
 
@@ -46673,8 +46693,8 @@
       Grid.dimensions = cartesian2DDimensions;
       return Grid;
     }();
-    /**
-     * Check if the axis is used in the specified grid.
+    /**
+     * Check if the axis is used in the specified grid.
      */
 
 
@@ -46749,27 +46769,27 @@
     }
 
     var PI$5 = Math.PI;
-    /**
-     * A final axis is translated and rotated from a "standard axis".
-     * So opt.position and opt.rotation is required.
-     *
-     * A standard axis is and axis from [0, 0] to [0, axisExtent[1]],
-     * for example: (0, 0) ------------> (0, 50)
-     *
-     * nameDirection or tickDirection or labelDirection is 1 means tick
-     * or label is below the standard axis, whereas is -1 means above
-     * the standard axis. labelOffset means offset between label and axis,
-     * which is useful when 'onZero', where axisLabel is in the grid and
-     * label in outside grid.
-     *
-     * Tips: like always,
-     * positive rotation represents anticlockwise, and negative rotation
-     * represents clockwise.
-     * The direction of position coordinate is the same as the direction
-     * of screen coordinate.
-     *
-     * Do not need to consider axis 'inverse', which is auto processed by
-     * axis extent.
+    /**
+     * A final axis is translated and rotated from a "standard axis".
+     * So opt.position and opt.rotation is required.
+     *
+     * A standard axis is and axis from [0, 0] to [0, axisExtent[1]],
+     * for example: (0, 0) ------------> (0, 50)
+     *
+     * nameDirection or tickDirection or labelDirection is 1 means tick
+     * or label is below the standard axis, whereas is -1 means above
+     * the standard axis. labelOffset means offset between label and axis,
+     * which is useful when 'onZero', where axisLabel is in the grid and
+     * label in outside grid.
+     *
+     * Tips: like always,
+     * positive rotation represents anticlockwise, and negative rotation
+     * represents clockwise.
+     * The direction of position coordinate is the same as the direction
+     * of screen coordinate.
+     *
+     * Do not need to consider axis 'inverse', which is auto processed by
+     * axis extent.
      */
 
     var AxisBuilder =
@@ -47330,25 +47350,25 @@
 
     function collect(ecModel, api) {
       var result = {
-        /**
-         * key: makeKey(axis.model)
-         * value: {
-         *      axis,
-         *      coordSys,
-         *      axisPointerModel,
-         *      triggerTooltip,
-         *      involveSeries,
-         *      snap,
-         *      seriesModels,
-         *      seriesDataCount
-         * }
+        /**
+         * key: makeKey(axis.model)
+         * value: {
+         *      axis,
+         *      coordSys,
+         *      axisPointerModel,
+         *      triggerTooltip,
+         *      involveSeries,
+         *      snap,
+         *      seriesModels,
+         *      seriesDataCount
+         * }
          */
         axesInfo: {},
         seriesInvolved: false,
 
-        /**
-         * key: makeKey(coordSys.model)
-         * value: Object: key makeKey(axis.model), value: axisInfo
+        /**
+         * key: makeKey(coordSys.model)
+         * value: Object: key makeKey(axis.model), value: axisInfo
          */
         coordSysAxesInfo: {},
         coordSysMap: {}
@@ -47506,19 +47526,19 @@
         });
       });
     }
-    /**
-     * For example:
-     * {
-     *     axisPointer: {
-     *         links: [{
-     *             xAxisIndex: [2, 4],
-     *             yAxisIndex: 'all'
-     *         }, {
-     *             xAxisId: ['a5', 'a7'],
-     *             xAxisName: 'xxx'
-     *         }]
-     *     }
-     * }
+    /**
+     * For example:
+     * {
+     *     axisPointer: {
+     *         links: [{
+     *             xAxisIndex: [2, 4],
+     *             yAxisIndex: 'all'
+     *         }, {
+     *             xAxisId: ['a5', 'a7'],
+     *             xAxisName: 'xxx'
+     *         }]
+     *     }
+     * }
      */
 
 
@@ -47596,9 +47616,9 @@
     function isHandleTrigger(axisPointerModel) {
       return !!axisPointerModel.get(['handle', 'show']);
     }
-    /**
-     * @param {module:echarts/model/Model} model
-     * @return {string} unique key
+    /**
+     * @param {module:echarts/model/Model} model
+     * @return {string} unique key
      */
 
 
@@ -47607,8 +47627,8 @@
     }
 
     var axisPointerClazz = {};
-    /**
-     * Base class of AxisView.
+    /**
+     * Base class of AxisView.
      */
 
     var AxisView =
@@ -47622,8 +47642,8 @@
         _this.type = AxisView.type;
         return _this;
       }
-      /**
-       * @override
+      /**
+       * @override
        */
 
 
@@ -47639,16 +47659,16 @@
 
         this._doUpdateAxisPointerClass(axisModel, api, true);
       };
-      /**
-       * Action handler.
+      /**
+       * Action handler.
        */
 
 
       AxisView.prototype.updateAxisPointer = function (axisModel, ecModel, api, payload) {
         this._doUpdateAxisPointerClass(axisModel, api, false);
       };
-      /**
-       * @override
+      /**
+       * @override
        */
 
 
@@ -47656,8 +47676,8 @@
         var axisPointer = this._axisPointer;
         axisPointer && axisPointer.remove(api);
       };
-      /**
-       * @override
+      /**
+       * @override
        */
 
 
@@ -47805,8 +47825,8 @@
         _this.axisPointerClass = 'CartesianAxisPointer';
         return _this;
       }
-      /**
-       * @override
+      /**
+       * @override
        */
 
 
@@ -48070,8 +48090,8 @@
     var inner$7 = makeInner();
     var clone$3 = clone;
     var bind$1 = bind;
-    /**
-     * Base axis pointer class in 2D.
+    /**
+     * Base axis pointer class in 2D.
      */
 
     var BaseAxisPointer =
@@ -48079,15 +48099,15 @@
     function () {
       function BaseAxisPointer() {
         this._dragging = false;
-        /**
-         * In px, arbitrary value. Do not set too small,
-         * no animation is ok for most cases.
+        /**
+         * In px, arbitrary value. Do not set too small,
+         * no animation is ok for most cases.
          */
 
         this.animationThreshold = 15;
       }
-      /**
-       * @implement
+      /**
+       * @implement
        */
 
 
@@ -48148,24 +48168,24 @@
 
         this._renderHandle(value);
       };
-      /**
-       * @implement
+      /**
+       * @implement
        */
 
 
       BaseAxisPointer.prototype.remove = function (api) {
         this.clear(api);
       };
-      /**
-       * @implement
+      /**
+       * @implement
        */
 
 
       BaseAxisPointer.prototype.dispose = function (api) {
         this.clear(api);
       };
-      /**
-       * @protected
+      /**
+       * @protected
        */
 
 
@@ -48201,16 +48221,16 @@
 
         return animation === true;
       };
-      /**
-       * add {pointer, label, graphicKey} to elOption
-       * @protected
+      /**
+       * add {pointer, label, graphicKey} to elOption
+       * @protected
        */
 
 
       BaseAxisPointer.prototype.makeElOption = function (elOption, value, axisModel, axisPointerModel, api) {// Shoule be implemenented by sub-class.
       };
-      /**
-       * @protected
+      /**
+       * @protected
        */
 
 
@@ -48222,8 +48242,8 @@
           group.add(pointerEl);
         }
       };
-      /**
-       * @protected
+      /**
+       * @protected
        */
 
 
@@ -48234,8 +48254,8 @@
           updateLabelShowHide(labelEl, axisPointerModel);
         }
       };
-      /**
-       * @protected
+      /**
+       * @protected
        */
 
 
@@ -48249,8 +48269,8 @@
           });
         }
       };
-      /**
-       * @protected
+      /**
+       * @protected
        */
 
 
@@ -48270,8 +48290,8 @@
           updateLabelShowHide(labelEl, axisPointerModel);
         }
       };
-      /**
-       * @private
+      /**
+       * @private
        */
 
 
@@ -48350,8 +48370,8 @@
 
         this._doDispatchAxisPointer();
       };
-      /**
-       * Throttled method.
+      /**
+       * Throttled method.
        */
 
 
@@ -48398,8 +48418,8 @@
           type: 'hideTip'
         });
       };
-      /**
-       * @private
+      /**
+       * @private
        */
 
 
@@ -48421,8 +48441,8 @@
 
         clear(this, '_doDispatchAxisPointer');
       };
-      /**
-       * @protected
+      /**
+       * @protected
        */
 
 
@@ -48501,8 +48521,8 @@
 
       return style;
     }
-    /**
-     * @param {Function} labelPos {align, verticalAlign, position}
+    /**
+     * @param {Function} labelPos {align, verticalAlign, position}
      */
 
     function buildLabelElOption(elOption, axisModel, axisPointerModel, api, labelPos) {
@@ -48637,8 +48657,8 @@
       function CartesianAxisPointer() {
         return _super !== null && _super.apply(this, arguments) || this;
       }
-      /**
-       * @override
+      /**
+       * @override
        */
 
 
@@ -48661,8 +48681,8 @@
         buildCartesianSingleLabelElOption( // @ts-ignore
         value, elOption, layoutInfo, axisModel, axisPointerModel, api);
       };
-      /**
-       * @override
+      /**
+       * @override
        */
 
 
@@ -48679,8 +48699,8 @@
           rotation: layoutInfo.rotation + (layoutInfo.labelDirection < 0 ? Math.PI : 0)
         };
       };
-      /**
-       * @override
+      /**
+       * @override
        */
 
 
@@ -48817,12 +48837,12 @@
 
     var inner$8 = makeInner();
     var each$3 = each;
-    /**
-     * @param {string} key
-     * @param {module:echarts/ExtensionAPI} api
-     * @param {Function} handler
-     *      param: {string} currTrigger
-     *      param: {Array.<number>} point
+    /**
+     * @param {string} key
+     * @param {module:echarts/ExtensionAPI} api
+     * @param {Function} handler
+     *      param: {string} currTrigger
+     *      param: {Array.<number>} point
      */
 
     function register(key, api, handler) {
@@ -48966,10 +48986,10 @@
       return AxisPointerView;
     }(ComponentView);
 
-    /**
-     * @param finder contains {seriesIndex, dataIndex, dataIndexInside}
-     * @param ecModel
-     * @return  {point: [x, y], el: ...} point Will not be null.
+    /**
+     * @param finder contains {seriesIndex, dataIndex, dataIndexInside}
+     * @param ecModel
+     * @return  {point: [x, y], el: ...} point Will not be null.
      */
 
     function findPointFromSeries(finder, ecModel) {
@@ -49028,11 +49048,11 @@
     }
 
     var inner$9 = makeInner();
-    /**
-     * Basic logic: check all axis, if they do not demand show/highlight,
-     * then hide/downplay them.
-     *
-     * @return content of event obj for echarts.connect.
+    /**
+     * Basic logic: check all axis, if they do not demand show/highlight,
+     * then hide/downplay them.
+     *
+     * @return content of event obj for echarts.connect.
      */
 
     function axisTrigger(payload, ecModel, api) {
@@ -49603,19 +49623,19 @@
           return item != null;
         });
       };
-      /**
-       * Convert
-       * [{
-       *  type: 'group',
-       *  id: 'xx',
-       *  children: [{type: 'circle'}, {type: 'polygon'}]
-       * }]
-       * to
-       * [
-       *  {type: 'group', id: 'xx'},
-       *  {type: 'circle', parentId: 'xx'},
-       *  {type: 'polygon', parentId: 'xx'}
-       * ]
+      /**
+       * Convert
+       * [{
+       *  type: 'group',
+       *  id: 'xx',
+       *  children: [{type: 'circle'}, {type: 'polygon'}]
+       * }]
+       * to
+       * [
+       *  {type: 'group', id: 'xx'},
+       *  {type: 'circle', parentId: 'xx'},
+       *  {type: 'polygon', parentId: 'xx'}
+       * ]
        */
 
 
@@ -49630,9 +49650,10 @@
           }
 
           result.push(option);
-          var children = option.children;
+          var children = option.children; // here we don't judge if option.type is `group`
+          // when new option doesn't provide `type`, it will cause that the children can't be updated.
 
-          if (option.type === 'group' && children) {
+          if (children && children.length) {
             this._flatten(children, result, option);
           } // Deleting for JSON output, and for not affecting group creation.
 
@@ -49658,8 +49679,8 @@
       return GraphicComponentModel;
     }(ComponentModel);
 
-    /**
-     * Whether need to call `convertEC4CompatibleStyle`.
+    /**
+     * Whether need to call `convertEC4CompatibleStyle`.
      */
 
     function isEC4CompatibleStyle(style, elType, hasOwnTextContentOption, hasOwnTextConfig) {
@@ -49675,12 +49696,12 @@
       return style && (style.legacy || style.legacy !== false && !hasOwnTextContentOption && !hasOwnTextConfig && elType !== 'tspan' // Difficult to detect whether legacy for a "text" el.
       && (elType === 'text' || hasOwn(style, 'text')));
     }
-    /**
-     * `EC4CompatibleStyle` is style that might be in echarts4 format or echarts5 format.
-     * @param hostStyle The properties might be modified.
-     * @return If be text el, `textContentStyle` and `textConfig` will not be retured.
-     *         Otherwise a `textContentStyle` and `textConfig` will be created, whose props area
-     *         retried from the `hostStyle`.
+    /**
+     * `EC4CompatibleStyle` is style that might be in echarts4 format or echarts5 format.
+     * @param hostStyle The properties might be modified.
+     * @return If be text el, `textContentStyle` and `textConfig` will not be retured.
+     *         Otherwise a `textContentStyle` and `textConfig` will be created, whose props area
+     *         retried from the `hostStyle`.
      */
 
     function convertFromEC4CompatibleStyle(hostStyle, elType, isNormal) {
@@ -49735,8 +49756,8 @@
         textContent: textContent
       };
     }
-    /**
-     * The result will be set to `out`.
+    /**
+     * The result will be set to `out`.
      */
 
     function convertEC4CompatibleRichItem(out, richItem) {
@@ -50276,9 +50297,9 @@
 
     var getStateToRestore = makeInner();
     var KEYFRAME_EXCLUDE_KEYS = ['percent', 'easing', 'shape', 'style', 'extra'];
-    /**
-     * Stop previous keyframe animation and restore the attributes.
-     * Avoid new keyframe animation starts with wrong internal state when the percent: 0 is not set.
+    /**
+     * Stop previous keyframe animation and restore the attributes.
+     * Avoid new keyframe animation starts with wrong internal state when the percent: 0 is not set.
      */
 
     function stopPreviousKeyframeAnimationAndRestore(el) {
@@ -50437,8 +50458,8 @@
 
         this._relocate(graphicModel, api);
       };
-      /**
-       * Update graphic elements.
+      /**
+       * Update graphic elements.
        */
 
 
@@ -50578,8 +50599,8 @@
           }
         });
       };
-      /**
-       * Locate graphic elements.
+      /**
+       * Locate graphic elements.
        */
 
 
@@ -50659,8 +50680,8 @@
           }
         }
       };
-      /**
-       * Clear all elements.
+      /**
+       * Clear all elements.
        */
 
 
@@ -50723,26 +50744,33 @@
 
     function updateCommonAttrs(el, elOption, defaultZ, defaultZlevel) {
       if (!el.isGroup) {
-        var elDisplayable = el;
-        elDisplayable.cursor = retrieve2(elOption.cursor, Displayable.prototype.cursor); // We should not support configure z and zlevel in the element level.
+        each([['cursor', Displayable.prototype.cursor], // We should not support configure z and zlevel in the element level.
         // But seems we didn't limit it previously. So here still use it to avoid breaking.
+        ['zlevel', defaultZlevel || 0], ['z', defaultZ || 0], // z2 must not be null/undefined, otherwise sort error may occur.
+        ['z2', 0]], function (item) {
+          var prop = item[0];
 
-        elDisplayable.z = retrieve2(elOption.z, defaultZ || 0);
-        elDisplayable.zlevel = retrieve2(elOption.zlevel, defaultZlevel || 0); // z2 must not be null/undefined, otherwise sort error may occur.
-
-        var optZ2 = elOption.z2;
-        optZ2 != null && (elDisplayable.z2 = optZ2 || 0);
+          if (hasOwn(elOption, prop)) {
+            el[prop] = retrieve2(elOption[prop], item[1]);
+          } else if (el[prop] == null) {
+            el[prop] = item[1];
+          }
+        });
       }
 
       each(keys(elOption), function (key) {
-        var val = elOption[key]; // Assign event handlers.
+        // Assign event handlers.
         // PENDING: should enumerate all event names or use pattern matching?
-
-        if (key.indexOf('on') === 0 && isFunction(val)) {
-          el[key] = val;
+        if (key.indexOf('on') === 0) {
+          var val = elOption[key];
+          el[key] = isFunction(val) ? val : null;
         }
       });
-      el.draggable = elOption.draggable; // Other attributes
+
+      if (hasOwn(elOption, 'draggable')) {
+        el.draggable = elOption.draggable;
+      } // Other attributes
+
 
       elOption.name != null && (el.name = elOption.name);
       elOption.id != null && (el.id = elOption.id);
@@ -50819,9 +50847,9 @@
 
       return axisDim + 'Axis';
     }
-    /**
-     * If two dataZoomModels has the same axis controlled, we say that they are 'linked'.
-     * This function finds all linked dataZoomModels start from the given payload.
+    /**
+     * If two dataZoomModels has the same axis controlled, we say that they are 'linked'.
+     * This function finds all linked dataZoomModels start from the given payload.
      */
 
     function findEffectedDataZooms(ecModel, payload) {
@@ -50881,24 +50909,24 @@
 
       return effectedModels;
     }
-    /**
-     * Find the first target coordinate system.
-     * Available after model built.
-     *
-     * @return Like {
-     *                  grid: [
-     *                      {model: coord0, axisModels: [axis1, axis3], coordIndex: 1},
-     *                      {model: coord1, axisModels: [axis0, axis2], coordIndex: 0},
-     *                      ...
-     *                  ],  // cartesians must not be null/undefined.
-     *                  polar: [
-     *                      {model: coord0, axisModels: [axis4], coordIndex: 0},
-     *                      ...
-     *                  ],  // polars must not be null/undefined.
-     *                  singleAxis: [
-     *                      {model: coord0, axisModels: [], coordIndex: 0}
-     *                  ]
-     *              }
+    /**
+     * Find the first target coordinate system.
+     * Available after model built.
+     *
+     * @return Like {
+     *                  grid: [
+     *                      {model: coord0, axisModels: [axis1, axis3], coordIndex: 1},
+     *                      {model: coord1, axisModels: [axis0, axis2], coordIndex: 0},
+     *                      ...
+     *                  ],  // cartesians must not be null/undefined.
+     *                  polar: [
+     *                      {model: coord0, axisModels: [axis4], coordIndex: 0},
+     *                      ...
+     *                  ],  // polars must not be null/undefined.
+     *                  singleAxis: [
+     *                      {model: coord0, axisModels: [], coordIndex: 0}
+     *                  ]
+     *              }
      */
 
     function collectReferCoordSysModelInfo(dataZoomModel) {
@@ -50967,21 +50995,21 @@
         _this.type = DataZoomModel.type;
         _this._autoThrottle = true;
         _this._noTarget = true;
-        /**
-         * It is `[rangeModeForMin, rangeModeForMax]`.
-         * The optional values for `rangeMode`:
-         * + `'value'` mode: the axis extent will always be determined by
-         *     `dataZoom.startValue` and `dataZoom.endValue`, despite
-         *     how data like and how `axis.min` and `axis.max` are.
-         * + `'percent'` mode: `100` represents 100% of the `[dMin, dMax]`,
-         *     where `dMin` is `axis.min` if `axis.min` specified, otherwise `data.extent[0]`,
-         *     and `dMax` is `axis.max` if `axis.max` specified, otherwise `data.extent[1]`.
-         *     Axis extent will be determined by the result of the percent of `[dMin, dMax]`.
-         *
-         * For example, when users are using dynamic data (update data periodically via `setOption`),
-         * if in `'value`' mode, the window will be kept in a fixed value range despite how
-         * data are appended, while if in `'percent'` mode, whe window range will be changed alone with
-         * the appended data (suppose `axis.min` and `axis.max` are not specified).
+        /**
+         * It is `[rangeModeForMin, rangeModeForMax]`.
+         * The optional values for `rangeMode`:
+         * + `'value'` mode: the axis extent will always be determined by
+         *     `dataZoom.startValue` and `dataZoom.endValue`, despite
+         *     how data like and how `axis.min` and `axis.max` are.
+         * + `'percent'` mode: `100` represents 100% of the `[dMin, dMax]`,
+         *     where `dMin` is `axis.min` if `axis.min` specified, otherwise `data.extent[0]`,
+         *     and `dMax` is `axis.max` if `axis.max` specified, otherwise `data.extent[1]`.
+         *     Axis extent will be determined by the result of the percent of `[dMin, dMax]`.
+         *
+         * For example, when users are using dynamic data (update data periodically via `setOption`),
+         * if in `'value`' mode, the window will be kept in a fixed value range despite how
+         * data are appended, while if in `'percent'` mode, whe window range will be changed alone with
+         * the appended data (suppose `axis.min` and `axis.max` are not specified).
          */
 
         _this._rangePropMode = ['percent', 'percent'];
@@ -50990,26 +51018,26 @@
 
       DataZoomModel.prototype.init = function (option, parentModel, ecModel) {
         var inputRawOption = retrieveRawOption(option);
-        /**
-         * Suppose a "main process" start at the point that model prepared (that is,
-         * model initialized or merged or method called in `action`).
-         * We should keep the `main process` idempotent, that is, given a set of values
-         * on `option`, we get the same result.
-         *
-         * But sometimes, values on `option` will be updated for providing users
-         * a "final calculated value" (`dataZoomProcessor` will do that). Those value
-         * should not be the base/input of the `main process`.
-         *
-         * So in that case we should save and keep the input of the `main process`
-         * separately, called `settledOption`.
-         *
-         * For example, consider the case:
-         * (Step_1) brush zoom the grid by `toolbox.dataZoom`,
-         *     where the original input `option.startValue`, `option.endValue` are earsed by
-         *     calculated value.
-         * (Step)2) click the legend to hide and show a series,
-         *     where the new range is calculated by the earsed `startValue` and `endValue`,
-         *     which brings incorrect result.
+        /**
+         * Suppose a "main process" start at the point that model prepared (that is,
+         * model initialized or merged or method called in `action`).
+         * We should keep the `main process` idempotent, that is, given a set of values
+         * on `option`, we get the same result.
+         *
+         * But sometimes, values on `option` will be updated for providing users
+         * a "final calculated value" (`dataZoomProcessor` will do that). Those value
+         * should not be the base/input of the `main process`.
+         *
+         * So in that case we should save and keep the input of the `main process`
+         * separately, called `settledOption`.
+         *
+         * For example, consider the case:
+         * (Step_1) brush zoom the grid by `toolbox.dataZoom`,
+         *     where the original input `option.startValue`, `option.endValue` are earsed by
+         *     calculated value.
+         * (Step)2) click the legend to hide and show a series,
+         *     where the new range is calculated by the earsed `startValue` and `endValue`,
+         *     which brings incorrect result.
          */
 
         this.settledOption = inputRawOption;
@@ -51216,8 +51244,8 @@
         }, this);
         return firstAxisModel;
       };
-      /**
-       * @param {Function} callback param: axisModel, dimNames, axisIndex, dataZoomModel, ecModel
+      /**
+       * @param {Function} callback param: axisModel, dimNames, axisIndex, dataZoomModel, ecModel
        */
 
 
@@ -51228,8 +51256,8 @@
           });
         });
       };
-      /**
-       * @return If not found, return null/undefined.
+      /**
+       * @return If not found, return null/undefined.
        */
 
 
@@ -51240,8 +51268,8 @@
           return axisModel.__dzAxisProxy;
         }
       };
-      /**
-       * @return If not found, return null/undefined.
+      /**
+       * @return If not found, return null/undefined.
        */
 
 
@@ -51256,8 +51284,8 @@
           return this.ecModel.getComponent(getAxisMainType(axisDim), axisIndex);
         }
       };
-      /**
-       * If not specified, set to undefined.
+      /**
+       * If not specified, set to undefined.
        */
 
 
@@ -51297,10 +51325,10 @@
           return axisProxy.getDataPercentWindow();
         }
       };
-      /**
-       * For example, chart.getModel().getComponent('dataZoom').getValueRange('y', 0);
-       *
-       * @return [startValue, endValue] value can only be '-' or finite number.
+      /**
+       * For example, chart.getModel().getComponent('dataZoom').getValueRange('y', 0);
+       *
+       * @return [startValue, endValue] value can only be '-' or finite number.
        */
 
 
@@ -51315,9 +51343,9 @@
           return this.getAxisProxy(axisDim, axisIndex).getDataValueWindow();
         }
       };
-      /**
-       * @param axisModel If axisModel given, find axisProxy
-       *      corresponding to the axisModel
+      /**
+       * @param axisModel If axisModel given, find axisProxy
+       *      corresponding to the axisModel
        */
 
 
@@ -51379,10 +51407,10 @@
       };
       return DataZoomModel;
     }(ComponentModel);
-    /**
-     * Retrieve the those raw params from option, which will be cached separately.
-     * becasue they will be overwritten by normalized/calculated values in the main
-     * process.
+    /**
+     * Retrieve the those raw params from option, which will be cached separately.
+     * becasue they will be overwritten by normalized/calculated values in the main
+     * process.
      */
 
 
@@ -51472,44 +51500,44 @@
      * AUTO-GENERATED FILE. DO NOT MODIFY.
      */
 
-    /*
-    * Licensed to the Apache Software Foundation (ASF) under one
-    * or more contributor license agreements.  See the NOTICE file
-    * distributed with this work for additional information
-    * regarding copyright ownership.  The ASF licenses this file
-    * to you under the Apache License, Version 2.0 (the
-    * "License"); you may not use this file except in compliance
-    * with the License.  You may obtain a copy of the License at
-    *
-    *   http://www.apache.org/licenses/LICENSE-2.0
-    *
-    * Unless required by applicable law or agreed to in writing,
-    * software distributed under the License is distributed on an
-    * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    * KIND, either express or implied.  See the License for the
-    * specific language governing permissions and limitations
-    * under the License.
+    /*
+    * Licensed to the Apache Software Foundation (ASF) under one
+    * or more contributor license agreements.  See the NOTICE file
+    * distributed with this work for additional information
+    * regarding copyright ownership.  The ASF licenses this file
+    * to you under the Apache License, Version 2.0 (the
+    * "License"); you may not use this file except in compliance
+    * with the License.  You may obtain a copy of the License at
+    *
+    *   http://www.apache.org/licenses/LICENSE-2.0
+    *
+    * Unless required by applicable law or agreed to in writing,
+    * software distributed under the License is distributed on an
+    * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    * KIND, either express or implied.  See the License for the
+    * specific language governing permissions and limitations
+    * under the License.
     */
 
-    /**
-     * Calculate slider move result.
-     * Usage:
-     * (1) If both handle0 and handle1 are needed to be moved, set minSpan the same as
-     * maxSpan and the same as `Math.abs(handleEnd[1] - handleEnds[0])`.
-     * (2) If handle0 is forbidden to cross handle1, set minSpan as `0`.
-     *
-     * @param delta Move length.
-     * @param handleEnds handleEnds[0] can be bigger then handleEnds[1].
-     *              handleEnds will be modified in this method.
-     * @param extent handleEnds is restricted by extent.
-     *              extent[0] should less or equals than extent[1].
-     * @param handleIndex Can be 'all', means that both move the two handleEnds.
-     * @param minSpan The range of dataZoom can not be smaller than that.
-     *              If not set, handle0 and cross handle1. If set as a non-negative
-     *              number (including `0`), handles will push each other when reaching
-     *              the minSpan.
-     * @param maxSpan The range of dataZoom can not be larger than that.
-     * @return The input handleEnds.
+    /**
+     * Calculate slider move result.
+     * Usage:
+     * (1) If both handle0 and handle1 are needed to be moved, set minSpan the same as
+     * maxSpan and the same as `Math.abs(handleEnd[1] - handleEnds[0])`.
+     * (2) If handle0 is forbidden to cross handle1, set minSpan as `0`.
+     *
+     * @param delta Move length.
+     * @param handleEnds handleEnds[0] can be bigger then handleEnds[1].
+     *              handleEnds will be modified in this method.
+     * @param extent handleEnds is restricted by extent.
+     *              extent[0] should less or equals than extent[1].
+     * @param handleIndex Can be 'all', means that both move the two handleEnds.
+     * @param minSpan The range of dataZoom can not be smaller than that.
+     *              If not set, handle0 and cross handle1. If set as a non-negative
+     *              number (including `0`), handles will push each other when reaching
+     *              the minSpan.
+     * @param maxSpan The range of dataZoom can not be larger than that.
+     * @return The input handleEnds.
      */
     function sliderMove(delta, handleEnds, extent, handleIndex, minSpan, maxSpan) {
       delta = delta || 0;
@@ -51574,12 +51602,12 @@
 
     var each$4 = each;
     var asc$1 = asc;
-    /**
-     * Operate single axis.
-     * One axis can only operated by one axis operator.
-     * Different dataZoomModels may be defined to operate the same axis.
-     * (i.e. 'inside' data zoom and 'slider' data zoom components)
-     * So dataZoomModels share one axisProxy in that case.
+    /**
+     * Operate single axis.
+     * One axis can only operated by one axis operator.
+     * Different dataZoomModels may be defined to operate the same axis.
+     * (i.e. 'inside' data zoom and 'slider' data zoom components)
+     * So dataZoomModels share one axisProxy in that case.
      */
 
     var AxisProxy =
@@ -51595,24 +51623,24 @@
         //  */
         // this.hasSeriesStacked;
       }
-      /**
-       * Whether the axisProxy is hosted by dataZoomModel.
+      /**
+       * Whether the axisProxy is hosted by dataZoomModel.
        */
 
 
       AxisProxy.prototype.hostedBy = function (dataZoomModel) {
         return this._dataZoomModel === dataZoomModel;
       };
-      /**
-       * @return Value can only be NaN or finite value.
+      /**
+       * @return Value can only be NaN or finite value.
        */
 
 
       AxisProxy.prototype.getDataValueWindow = function () {
         return this._valueWindow.slice();
       };
-      /**
-       * @return {Array.<number>}
+      /**
+       * @return {Array.<number>}
        */
 
 
@@ -51642,8 +51670,8 @@
       AxisProxy.prototype.getMinMaxSpan = function () {
         return clone(this._minMaxSpan);
       };
-      /**
-       * Only calculate by given range and this._dataExtent, do not change anything.
+      /**
+       * Only calculate by given range and this._dataExtent, do not change anything.
        */
 
 
@@ -51717,10 +51745,10 @@
           percentWindow: percentWindow
         };
       };
-      /**
-       * Notice: reset should not be called before series.restoreData() called,
-       * so it is recommanded to be called in "process stage" but not "model init
-       * stage".
+      /**
+       * Notice: reset should not be called before series.restoreData() called,
+       * so it is recommanded to be called in "process stage" but not "model init
+       * stage".
        */
 
 
@@ -52137,12 +52165,12 @@
       return ToolboxModel;
     }(ComponentModel);
 
-    /**
-     * Layout list like component.
-     * It will box layout each items in group of component and then position the whole group in the viewport
-     * @param {module:zrender/group/Group} group
-     * @param {module:echarts/model/Component} componentModel
-     * @param {module:echarts/ExtensionAPI}
+    /**
+     * Layout list like component.
+     * It will box layout each items in group of component and then position the whole group in the viewport
+     * @param {module:zrender/group/Group} group
+     * @param {module:echarts/model/Component} componentModel
+     * @param {module:echarts/ExtensionAPI}
      */
 
     function layout$2(group, componentModel, api) {
@@ -52738,10 +52766,10 @@
 
     var BLOCK_SPLITER = new Array(60).join('-');
     var ITEM_SPLITER = '\t';
-    /**
-     * Group series into two types
-     *  1. on category axis, like line, bar
-     *  2. others, like scatter, pie
+    /**
+     * Group series into two types
+     *  1. on category axis, like line, bar
+     *  2. others, like scatter, pie
      */
 
     function groupSeries(ecModel) {
@@ -52784,9 +52812,9 @@
         meta: meta
       };
     }
-    /**
-     * Assemble content of series on cateogory axis
-     * @inner
+    /**
+     * Assemble content of series on cateogory axis
+     * @inner
      */
 
 
@@ -52824,8 +52852,8 @@
       });
       return tables.join('\n\n' + BLOCK_SPLITER + '\n\n');
     }
-    /**
-     * Assemble content of other series
+    /**
+     * Assemble content of other series
      */
 
 
@@ -52862,8 +52890,8 @@
     function trim$1(str) {
       return str.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
     }
-    /**
-     * If a block is tsv format
+    /**
+     * If a block is tsv format
      */
 
 
@@ -52877,9 +52905,9 @@
     }
 
     var itemSplitRegex = new RegExp('[' + ITEM_SPLITER + ']+', 'g');
-    /**
-     * @param {string} tsv
-     * @return {Object}
+    /**
+     * @param {string} tsv
+     * @return {Object}
      */
 
     function parseTSVContents(tsv) {
@@ -53136,8 +53164,8 @@
 
       return DataView;
     }(ToolboxFeature);
-    /**
-     * @inner
+    /**
+     * @inner
      */
 
 
@@ -53198,9 +53226,9 @@
 
     var each$5 = each;
     var inner$b = makeInner();
-    /**
-     * @param ecModel
-     * @param newSnapshot key is dataZoomId
+    /**
+     * @param ecModel
+     * @param newSnapshot key is dataZoomId
      */
 
     function push(ecModel, newSnapshot) {
@@ -53262,9 +53290,9 @@
     function count(ecModel) {
       return getStoreSnapshots(ecModel).length;
     }
-    /**
-     * History length of each dataZoom may be different.
-     * this._history[0] is used to store origin range.
+    /**
+     * History length of each dataZoom may be different.
+     * this._history[0] is used to store origin range.
      */
 
     function getStoreSnapshots(ecModel) {
@@ -53336,12 +53364,12 @@
     function getStore(zr) {
       return zr[ATTR] || (zr[ATTR] = {});
     }
-    /**
-     * payload: {
-     *     type: 'takeGlobalCursor',
-     *     key: 'dataZoomSelect', or 'brush', or ...,
-     *         If no userKey, release global cursor.
-     * }
+    /**
+     * payload: {
+     *     type: 'takeGlobalCursor',
+     *     key: 'dataZoomSelect', or 'brush', or ...,
+     *         If no userKey, release global cursor.
+     * }
      */
     // TODO: SELF REGISTERED.
 
@@ -53387,14 +53415,14 @@
       removeOnClick: false
     };
     var baseUID = 0;
-    /**
-     * params:
-     *     areas: Array.<Array>, coord relates to container group,
-     *                             If no container specified, to global.
-     *     opt {
-     *         isEnd: boolean,
-     *         removeOnClick: boolean
-     *     }
+    /**
+     * params:
+     *     areas: Array.<Array>, coord relates to container group,
+     *                             If no container specified, to global.
+     *     opt {
+     *         isEnd: boolean,
+     *         removeOnClick: boolean
+     *     }
      */
 
     var BrushController =
@@ -53404,14 +53432,14 @@
 
       function BrushController(zr) {
         var _this = _super.call(this) || this;
-        /**
-         * @internal
+        /**
+         * @internal
          */
 
 
         _this._track = [];
-        /**
-         * @internal
+        /**
+         * @internal
          */
 
         _this._covers = [];
@@ -53429,8 +53457,8 @@
         }, _this);
         return _this;
       }
-      /**
-       * If set to `false`, select disabled.
+      /**
+       * If set to `false`, select disabled.
        */
 
 
@@ -53466,8 +53494,8 @@
         });
         this._brushType = this._brushOption = null;
       };
-      /**
-       * @param panelOpts If not pass, it is global brush.
+      /**
+       * @param panelOpts If not pass, it is global brush.
        */
 
 
@@ -53509,10 +53537,10 @@
       //     each(this._covers, cb, context);
       // }
 
-      /**
-       * Update covers.
-       * @param coverConfigList
-       *        If coverConfigList is null/undefined, all covers removed.
+      /**
+       * Update covers.
+       * @param coverConfigList
+       *        If coverConfigList is null/undefined, all covers removed.
        */
 
 
@@ -54038,8 +54066,8 @@
       var zr = controller._zr;
       return x < 0 || x > zr.getWidth() || y < 0 || y > zr.getHeight();
     }
-    /**
-     * key: brushType
+    /**
+     * key: brushType
      */
 
 
@@ -54169,32 +54197,32 @@
      * AUTO-GENERATED FILE. DO NOT MODIFY.
      */
 
-    /*
-    * Licensed to the Apache Software Foundation (ASF) under one
-    * or more contributor license agreements.  See the NOTICE file
-    * distributed with this work for additional information
-    * regarding copyright ownership.  The ASF licenses this file
-    * to you under the Apache License, Version 2.0 (the
-    * "License"); you may not use this file except in compliance
-    * with the License.  You may obtain a copy of the License at
-    *
-    *   http://www.apache.org/licenses/LICENSE-2.0
-    *
-    * Unless required by applicable law or agreed to in writing,
-    * software distributed under the License is distributed on an
-    * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    * KIND, either express or implied.  See the License for the
-    * specific language governing permissions and limitations
-    * under the License.
+    /*
+    * Licensed to the Apache Software Foundation (ASF) under one
+    * or more contributor license agreements.  See the NOTICE file
+    * distributed with this work for additional information
+    * regarding copyright ownership.  The ASF licenses this file
+    * to you under the Apache License, Version 2.0 (the
+    * "License"); you may not use this file except in compliance
+    * with the License.  You may obtain a copy of the License at
+    *
+    *   http://www.apache.org/licenses/LICENSE-2.0
+    *
+    * Unless required by applicable law or agreed to in writing,
+    * software distributed under the License is distributed on an
+    * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    * KIND, either express or implied.  See the License for the
+    * specific language governing permissions and limitations
+    * under the License.
     */
     var IRRELEVANT_EXCLUDES = {
       'axisPointer': 1,
       'tooltip': 1,
       'brush': 1
     };
-    /**
-     * Avoid that: mouse click on a elements that is over geo or graph,
-     * but roam is triggered.
+    /**
+     * Avoid that: mouse click on a elements that is over geo or graph,
+     * but roam is triggered.
      */
 
     function onIrrelevantElement(e, api, targetCoordSysModel) {
@@ -54237,10 +54265,10 @@
     var BrushTargetManager =
     /** @class */
     function () {
-      /**
-       * @param finder contains Index/Id/Name of xAxis/yAxis/geo/grid
-       *        Each can be {number|Array.<number>}. like: {xAxisIndex: [3, 4]}
-       * @param opt.include include coordinate system types.
+      /**
+       * @param finder contains Index/Id/Name of xAxis/yAxis/geo/grid
+       *        Each can be {number|Array.<number>}. like: {xAxisIndex: [3, 4]}
+       * @param opt.include include coordinate system types.
        */
       function BrushTargetManager(finder, ecModel, opt) {
         var _this = this;
@@ -54287,10 +54315,10 @@
           }
         }, this);
       };
-      /**
-       * the `areas` is `BrushModel.areas`.
-       * Called in layout stage.
-       * convert `area.coordRange` to global range and set panelId to `area.range`.
+      /**
+       * the `areas` is `BrushModel.areas`.
+       * Called in layout stage.
+       * convert `area.coordRange` to global range and set panelId to `area.range`.
        */
 
 
@@ -54339,10 +54367,10 @@
         var targetInfo = this.findTargetInfo(area, ecModel);
         return targetInfo === true || targetInfo && indexOf(targetInfo.coordSyses, seriesModel.coordinateSystem) >= 0;
       };
-      /**
-       * If return Object, a coord found.
-       * If reutrn true, global found.
-       * Otherwise nothing found.
+      /**
+       * If return Object, a coord found.
+       * If reutrn true, global found.
+       * Otherwise nothing found.
        */
 
 
@@ -54996,10 +55024,10 @@
       var translate = "translate" + (is3d ? '3d' : '') + "(" + x0 + "," + y0 + (is3d ? ',0' : '') + ")";
       return toString ? 'top:0;left:0;' + CSS_TRANSFORM_VENDOR + ':' + translate + ';' : [['top', 0], ['left', 0], [TRANSFORM_VENDOR, translate]];
     }
-    /**
-     * @param {Object} textStyle
-     * @return {string}
-     * @inner
+    /**
+     * @param {Object} textStyle
+     * @return {string}
+     * @inner
      */
 
 
@@ -55160,8 +55188,8 @@
           }
         };
       }
-      /**
-       * Update when tooltip is rendered
+      /**
+       * Update when tooltip is rendered
        */
 
 
@@ -55271,9 +55299,9 @@
           });
         }
       };
-      /**
-       * when `alwaysShowContent` is true,
-       * move the tooltip after chart resized
+      /**
+       * when `alwaysShowContent` is true,
+       * move the tooltip after chart resized
        */
 
 
@@ -55332,8 +55360,8 @@
         this._zr = api.getZr();
         makeStyleCoord$1(this._styleCoord, this._zr, api.getWidth() / 2, api.getHeight() / 2);
       }
-      /**
-       * Update when tooltip is rendered
+      /**
+       * Update when tooltip is rendered
        */
 
 
@@ -55350,8 +55378,8 @@
         this.el.show();
         this._show = true;
       };
-      /**
-       * Set tooltip content
+      /**
+       * Set tooltip content
        */
 
 
@@ -55442,9 +55470,9 @@
           el.markRedraw();
         }
       };
-      /**
-       * when `alwaysShowContent` is true,
-       * move the tooltip after chart resized
+      /**
+       * when `alwaysShowContent` is true,
+       * move the tooltip after chart resized
        */
 
 
@@ -55554,9 +55582,9 @@
         this._tooltipModel = tooltipModel;
         this._ecModel = ecModel;
         this._api = api;
-        /**
-         * @private
-         * @type {boolean}
+        /**
+         * @private
+         * @type {boolean}
          */
 
         this._alwaysShowContent = tooltipModel.get('alwaysShowContent');
@@ -55599,12 +55627,13 @@
       TooltipView.prototype._keepShow = function () {
         var tooltipModel = this._tooltipModel;
         var ecModel = this._ecModel;
-        var api = this._api; // Try to keep the tooltip show when refreshing
+        var api = this._api;
+        var triggerOn = tooltipModel.get('triggerOn'); // Try to keep the tooltip show when refreshing
 
         if (this._lastX != null && this._lastY != null // When user is willing to control tooltip totally using API,
         // self.manuallyShowTip({x, y}) might cause tooltip hide,
         // which is not expected.
-        && tooltipModel.get('triggerOn') !== 'none') {
+        && triggerOn !== 'none' && triggerOn !== 'click') {
           var self_1 = this;
           clearTimeout(this._refreshUpdateTimeout);
           this._refreshUpdateTimeout = setTimeout(function () {
@@ -55619,21 +55648,21 @@
           });
         }
       };
-      /**
-       * Show tip manually by
-       * dispatchAction({
-       *     type: 'showTip',
-       *     x: 10,
-       *     y: 10
-       * });
-       * Or
-       * dispatchAction({
-       *      type: 'showTip',
-       *      seriesIndex: 0,
-       *      dataIndex or dataIndexInside or name
-       * });
-       *
-       *  TODO Batch
+      /**
+       * Show tip manually by
+       * dispatchAction({
+       *     type: 'showTip',
+       *     x: 10,
+       *     y: 10
+       * });
+       * Or
+       * dispatchAction({
+       *      type: 'showTip',
+       *      seriesIndex: 0,
+       *      dataIndex or dataIndexInside or name
+       * });
+       *
+       *  TODO Batch
        */
 
 
@@ -56221,8 +56250,8 @@
       TooltipView.type = 'tooltip';
       return TooltipView;
     }(ComponentView);
-    /**
-     * From top to bottom. (the last one should be globalTooltipModel);
+    /**
+     * From top to bottom. (the last one should be globalTooltipModel);
      */
 
 
@@ -56350,16 +56379,16 @@
     function isCenterAlign(align) {
       return align === 'center' || align === 'middle';
     }
-    /**
-     * Find target component by payload like:
-     * ```js
-     * { legendId: 'some_id', name: 'xxx' }
-     * { toolboxIndex: 1, name: 'xxx' }
-     * { geoName: 'some_name', name: 'xxx' }
-     * ```
-     * PENDING: at present only
-     *
-     * If not found, return null/undefined.
+    /**
+     * Find target component by payload like:
+     * ```js
+     * { legendId: 'some_id', name: 'xxx' }
+     * { toolboxIndex: 1, name: 'xxx' }
+     * { geoName: 'some_name', name: 'xxx' }
+     * ```
+     * PENDING: at present only
+     *
+     * If not found, return null/undefined.
      */
 
 
@@ -56406,13 +56435,13 @@
       use(install$7);
       registers.registerComponentModel(TooltipModel);
       registers.registerComponentView(TooltipView);
-      /**
-       * @action
-       * @property {string} type
-       * @property {number} seriesIndex
-       * @property {number} dataIndex
-       * @property {number} [x]
-       * @property {number} [y]
+      /**
+       * @action
+       * @property {string} type
+       * @property {number} seriesIndex
+       * @property {number} dataIndex
+       * @property {number} [x]
+       * @property {number} [y]
        */
 
       registers.registerAction({
@@ -56656,15 +56685,15 @@
         var _this = _super !== null && _super.apply(this, arguments) || this;
 
         _this.type = MarkerModel.type;
-        /**
-         * If marker model is created by self from series
+        /**
+         * If marker model is created by self from series
          */
 
         _this.createdBySelf = false;
         return _this;
       }
-      /**
-       * @overrite
+      /**
+       * @overrite
        */
 
 
@@ -56688,8 +56717,8 @@
         var hostSeries = this.__hostSeries;
         return this.getShallow('animation') && hostSeries && hostSeries.isAnimationEnabled();
       };
-      /**
-       * @overrite
+      /**
+       * @overrite
        */
 
 
@@ -56862,10 +56891,10 @@
       average: curry(markerTypeCalculatorWithExtent, 'average'),
       median: curry(markerTypeCalculatorWithExtent, 'median')
     };
-    /**
-     * Transform markPoint data item to format used in List by do the following
-     * 1. Calculate statistic like `max`, `min`, `average`
-     * 2. Convert `item.xAxis`, `item.yAxis` to `item.coord` array
+    /**
+     * Transform markPoint data item to format used in List by do the following
+     * 1. Calculate statistic like `max`, `min`, `average`
+     * 2. Convert `item.xAxis`, `item.yAxis` to `item.coord` array
      */
 
     function dataTransform(seriesModel, item) {
@@ -56928,9 +56957,9 @@
       var dimItem = seriesModel.getData().getDimensionInfo(dataDim);
       return dimItem && dimItem.coordDim;
     }
-    /**
-     * Filter data which is out of coordinateSystem range
-     * [dataFilter description]
+    /**
+     * Filter data which is out of coordinateSystem range
+     * [dataFilter description]
      */
 
 
@@ -56939,6 +56968,11 @@
       // Alwalys return true if there is no coordSys
       return coordSys && coordSys.containData && item.coord && !hasXOrY(item) ? coordSys.containData(item.coord) : true;
     }
+    function zoneFilter( // Currently only polar and cartesian has containData.
+    coordSys, item1, item2) {
+      // Alwalys return true if there is no coordSys
+      return coordSys && coordSys.containZone && item1.coord && item2.coord && !hasXOrY(item1) && !hasXOrY(item2) ? coordSys.containZone(item1.coord, item2.coord) : true;
+    }
     function createMarkerDimValueGetter(inCoordSys, dims) {
       return inCoordSys ? function (item, dimName, dataIndex, dimIndex) {
         var rawVal = dimIndex < 2 // x, y, radius, angle
@@ -57336,8 +57370,8 @@
     function makeSymbolTypeKey(symbolCategory) {
       return '_' + symbolCategory + 'Type';
     }
-    /**
-     * @inner
+    /**
+     * @inner
      */
 
 
@@ -58154,7 +58188,8 @@
         lineDraw.updateData(lineData); // Set host model for tooltip
         // FIXME
 
-        mlData.line.eachItemGraphicEl(function (el, idx) {
+        mlData.line.eachItemGraphicEl(function (el) {
+          getECData(el).dataModel = mlModel;
           el.traverse(function (child) {
             getECData(child).dataModel = mlModel;
           });
@@ -58329,6 +58364,16 @@
     function markAreaFilter(coordSys, item) {
       var fromCoord = item.coord[0];
       var toCoord = item.coord[1];
+      var item0 = {
+        coord: fromCoord,
+        x: item.x0,
+        y: item.y0
+      };
+      var item1 = {
+        coord: toCoord,
+        x: item.x1,
+        y: item.y1
+      };
 
       if (isCoordinateSystemType(coordSys, 'cartesian2d')) {
         // In case
@@ -58339,18 +58384,17 @@
         // }
         if (fromCoord && toCoord && (ifMarkAreaHasOnlyDim(1, fromCoord, toCoord) || ifMarkAreaHasOnlyDim(0, fromCoord, toCoord))) {
           return true;
-        }
+        } //Directly returning true may also do the work,
+        //because markArea will not be shown automatically
+        //when it's not included in coordinate system.
+        //But filtering ahead can avoid keeping rendering markArea
+        //when there are too many of them.
+
+
+        return zoneFilter(coordSys, item0, item1);
       }
 
-      return dataFilter$1(coordSys, {
-        coord: fromCoord,
-        x: item.x0,
-        y: item.y0
-      }) || dataFilter$1(coordSys, {
-        coord: toCoord,
-        x: item.x1,
-        y: item.y1
-      });
+      return dataFilter$1(coordSys, item0) || dataFilter$1(coordSys, item1);
     } // dims can be ['x0', 'y0'], ['x1', 'y1'], ['x0', 'y1'], ['x1', 'y0']
 
 
@@ -58732,9 +58776,9 @@
             potentialData.push(seriesModel.name);
           }
         });
-        /**
-         * @type {Array.<string>}
-         * @private
+        /**
+         * @type {Array.<string>}
+         * @private
          */
 
         this._availableNames = availableNames; // If legend.data not specified in option, use availableNames as data,
@@ -58751,9 +58795,9 @@
 
           return new Model(dataItem, this, this.ecModel);
         }, this);
-        /**
-         * @type {Array.<module:echarts/model/Model>}
-         * @private
+        /**
+         * @type {Array.<module:echarts/model/Model>}
+         * @private
          */
 
         this._data = legendData;
@@ -58931,24 +58975,24 @@
         this.group.add(this._selectorGroup = new Group$1());
         this._isFirstRender = true;
       };
-      /**
-       * @protected
+      /**
+       * @protected
        */
 
 
       LegendView.prototype.getContentGroup = function () {
         return this._contentGroup;
       };
-      /**
-       * @protected
+      /**
+       * @protected
        */
 
 
       LegendView.prototype.getSelectorGroup = function () {
         return this._selectorGroup;
       };
-      /**
-       * @override
+      /**
+       * @override
        */
 
 
@@ -59036,14 +59080,14 @@
             var data = seriesModel.getData();
             var lineVisualStyle = data.getVisual('legendLineStyle') || {};
             var legendIcon = data.getVisual('legendIcon');
-            /**
-             * `data.getVisual('style')` may be the color from the register
-             * in series. For example, for line series,
+            /**
+             * `data.getVisual('style')` may be the color from the register
+             * in series. For example, for line series,
              */
 
             var style = data.getVisual('style');
 
-            var itemGroup = this._createItem(seriesModel, name, dataIndex, legendItemModel, legendModel, itemAlign, lineVisualStyle, style, legendIcon, selectMode);
+            var itemGroup = this._createItem(seriesModel, name, dataIndex, legendItemModel, legendModel, itemAlign, lineVisualStyle, style, legendIcon, selectMode, api);
 
             itemGroup.on('click', curry$1(dispatchSelectAction, name, null, api, excludeSeriesId)).on('mouseover', curry$1(dispatchHighlightAction, seriesModel.name, null, api, excludeSeriesId)).on('mouseout', curry$1(dispatchDownplayAction, seriesModel.name, null, api, excludeSeriesId));
             legendDrawnMap.set(name, true);
@@ -59076,7 +59120,7 @@
                   });
                 }
 
-                var itemGroup = this._createItem(seriesModel, name, dataIndex, legendItemModel, legendModel, itemAlign, {}, style, legendIcon, selectMode); // FIXME: consider different series has items with the same name.
+                var itemGroup = this._createItem(seriesModel, name, dataIndex, legendItemModel, legendModel, itemAlign, {}, style, legendIcon, selectMode, api); // FIXME: consider different series has items with the same name.
 
 
                 itemGroup.on('click', curry$1(dispatchSelectAction, null, name, api, excludeSeriesId)) // Should not specify the series name, consider legend controls
@@ -59129,7 +59173,7 @@
         });
       };
 
-      LegendView.prototype._createItem = function (seriesModel, name, dataIndex, legendItemModel, legendModel, itemAlign, lineVisualStyle, itemVisualStyle, legendIcon, selectMode) {
+      LegendView.prototype._createItem = function (seriesModel, name, dataIndex, legendItemModel, legendModel, itemAlign, lineVisualStyle, itemVisualStyle, legendIcon, selectMode, api) {
         var drawType = seriesModel.visualDrawType;
         var itemWidth = legendModel.get('itemWidth');
         var itemHeight = legendModel.get('itemHeight');
@@ -59138,7 +59182,7 @@
         var symbolKeepAspect = legendItemModel.get('symbolKeepAspect');
         var legendIconType = legendItemModel.get('icon');
         legendIcon = legendIconType || legendIcon || 'roundRect';
-        var style = getLegendStyle(legendIcon, legendItemModel, lineVisualStyle, itemVisualStyle, drawType, isSelected);
+        var style = getLegendStyle(legendIcon, legendItemModel, lineVisualStyle, itemVisualStyle, drawType, isSelected, api);
         var itemGroup = new Group$1();
         var textStyleModel = legendItemModel.getModel('textStyle');
 
@@ -59266,8 +59310,8 @@
           return this.group.getBoundingRect();
         }
       };
-      /**
-       * @protected
+      /**
+       * @protected
        */
 
 
@@ -59280,10 +59324,10 @@
       return LegendView;
     }(ComponentView);
 
-    function getLegendStyle(iconType, legendModel, lineVisualStyle, itemVisualStyle, drawType, isSelected) {
-      /**
-       * Use series style if is inherit;
-       * elsewise, use legend style
+    function getLegendStyle(iconType, legendItemModel, lineVisualStyle, itemVisualStyle, drawType, isSelected, api) {
+      /**
+       * Use series style if is inherit;
+       * elsewise, use legend style
        */
       function handleCommonProps(style, visualStyle) {
         // If lineStyle.width is 'auto', it is set to be 2 if series has border
@@ -59297,37 +59341,38 @@
       } // itemStyle
 
 
-      var legendItemModel = legendModel.getModel('itemStyle');
-      var itemStyle = legendItemModel.getItemStyle();
+      var itemStyleModel = legendItemModel.getModel('itemStyle');
+      var itemStyle = itemStyleModel.getItemStyle();
       var iconBrushType = iconType.lastIndexOf('empty', 0) === 0 ? 'fill' : 'stroke';
-      itemStyle.decal = itemVisualStyle.decal;
+      var decalStyle = itemStyleModel.getShallow('decal');
+      itemStyle.decal = !decalStyle || decalStyle === 'inherit' ? itemVisualStyle.decal : createOrUpdatePatternFromDecal(decalStyle, api);
 
       if (itemStyle.fill === 'inherit') {
-        /**
-         * Series with visualDrawType as 'stroke' should have
-         * series stroke as legend fill
+        /**
+         * Series with visualDrawType as 'stroke' should have
+         * series stroke as legend fill
          */
         itemStyle.fill = itemVisualStyle[drawType];
       }
 
       if (itemStyle.stroke === 'inherit') {
-        /**
-         * icon type with "emptyXXX" should use fill color
-         * in visual style
+        /**
+         * icon type with "emptyXXX" should use fill color
+         * in visual style
          */
         itemStyle.stroke = itemVisualStyle[iconBrushType];
       }
 
       if (itemStyle.opacity === 'inherit') {
-        /**
-         * Use lineStyle.opacity if drawType is stroke
+        /**
+         * Use lineStyle.opacity if drawType is stroke
          */
         itemStyle.opacity = (drawType === 'fill' ? itemVisualStyle : lineVisualStyle).opacity;
       }
 
       handleCommonProps(itemStyle, itemVisualStyle); // lineStyle
 
-      var legendLineModel = legendModel.getModel('lineStyle');
+      var legendLineModel = legendItemModel.getModel('lineStyle');
       var lineStyle = legendLineModel.getLineStyle();
       handleCommonProps(lineStyle, lineVisualStyle); // Fix auto color to real color
 
@@ -59336,17 +59381,17 @@
       lineStyle.stroke === 'auto' && (lineStyle.stroke = itemVisualStyle.fill);
 
       if (!isSelected) {
-        var borderWidth = legendModel.get('inactiveBorderWidth');
-        /**
-         * Since stroke is set to be inactiveBorderColor, it may occur that
-         * there is no border in series but border in legend, so we need to
-         * use border only when series has border if is set to be auto
+        var borderWidth = legendItemModel.get('inactiveBorderWidth');
+        /**
+         * Since stroke is set to be inactiveBorderColor, it may occur that
+         * there is no border in series but border in legend, so we need to
+         * use border only when series has border if is set to be auto
          */
 
         var visualHasBorder = itemStyle[iconBrushType];
         itemStyle.lineWidth = borderWidth === 'auto' ? itemVisualStyle.lineWidth > 0 && visualHasBorder ? 2 : 0 : itemStyle.lineWidth;
-        itemStyle.fill = legendModel.get('inactiveColor');
-        itemStyle.stroke = legendModel.get('inactiveBorderColor');
+        itemStyle.fill = legendItemModel.get('inactiveColor');
+        itemStyle.stroke = legendItemModel.get('inactiveBorderColor');
         lineStyle.stroke = legendLineModel.get('inactiveColor');
         lineStyle.lineWidth = legendLineModel.get('inactiveWidth');
       }
@@ -59446,23 +59491,23 @@
      * AUTO-GENERATED FILE. DO NOT MODIFY.
      */
 
-    /*
-    * Licensed to the Apache Software Foundation (ASF) under one
-    * or more contributor license agreements.  See the NOTICE file
-    * distributed with this work for additional information
-    * regarding copyright ownership.  The ASF licenses this file
-    * to you under the Apache License, Version 2.0 (the
-    * "License"); you may not use this file except in compliance
-    * with the License.  You may obtain a copy of the License at
-    *
-    *   http://www.apache.org/licenses/LICENSE-2.0
-    *
-    * Unless required by applicable law or agreed to in writing,
-    * software distributed under the License is distributed on an
-    * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    * KIND, either express or implied.  See the License for the
-    * specific language governing permissions and limitations
-    * under the License.
+    /*
+    * Licensed to the Apache Software Foundation (ASF) under one
+    * or more contributor license agreements.  See the NOTICE file
+    * distributed with this work for additional information
+    * regarding copyright ownership.  The ASF licenses this file
+    * to you under the Apache License, Version 2.0 (the
+    * "License"); you may not use this file except in compliance
+    * with the License.  You may obtain a copy of the License at
+    *
+    *   http://www.apache.org/licenses/LICENSE-2.0
+    *
+    * Unless required by applicable law or agreed to in writing,
+    * software distributed under the License is distributed on an
+    * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    * KIND, either express or implied.  See the License for the
+    * specific language governing permissions and limitations
+    * under the License.
     */
     function legendFilter(ecModel) {
       var legendModels = ecModel.findComponents({
@@ -59531,29 +59576,29 @@
     }
 
     function installLegendAction(registers) {
-      /**
-       * @event legendToggleSelect
-       * @type {Object}
-       * @property {string} type 'legendToggleSelect'
-       * @property {string} [from]
-       * @property {string} name Series name or data item name
+      /**
+       * @event legendToggleSelect
+       * @type {Object}
+       * @property {string} type 'legendToggleSelect'
+       * @property {string} [from]
+       * @property {string} name Series name or data item name
        */
       registers.registerAction('legendToggleSelect', 'legendselectchanged', curry(legendSelectActionHandler, 'toggleSelected'));
       registers.registerAction('legendAllSelect', 'legendselectall', curry(legendSelectActionHandler, 'allSelect'));
       registers.registerAction('legendInverseSelect', 'legendinverseselect', curry(legendSelectActionHandler, 'inverseSelect'));
-      /**
-       * @event legendSelect
-       * @type {Object}
-       * @property {string} type 'legendSelect'
-       * @property {string} name Series name or data item name
+      /**
+       * @event legendSelect
+       * @type {Object}
+       * @property {string} type 'legendSelect'
+       * @property {string} name Series name or data item name
        */
 
       registers.registerAction('legendSelect', 'legendselected', curry(legendSelectActionHandler, 'select'));
-      /**
-       * @event legendUnSelect
-       * @type {Object}
-       * @property {string} type 'legendUnSelect'
-       * @property {string} name Series name or data item name
... 39715 lines suppressed ...


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@echarts.apache.org
For additional commands, e-mail: commits-help@echarts.apache.org