
/*
* 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(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e(t.echarts={})}(this,function(t){"use strict";var e=2311,n=function(){return e++},m="object"==typeof wx&&"function"==typeof wx.getSystemInfoSync?{browser:{},os:{},node:!1,wxa:!0,canvasSupported:!0,svgSupported:!1,touchEventsSupported:!0,domSupported:!1}:"undefined"==typeof document&&"undefined"!=typeof self?{browser:{},os:{},node:!1,worker:!0,canvasSupported:!0,domSupported:!1}:"undefined"==typeof navigator?{browser:{},os:{},node:!0,worker:!1,canvasSupported:!0,svgSupported:!0,domSupported:!1}:function(t){var e={},n=t.match(/Firefox\/([\d.]+)/),i=t.match(/MSIE\s([\d.]+)/)||t.match(/Trident\/.+?rv:(([\d.]+))/),r=t.match(/Edge\/([\d.]+)/),a=/micromessenger/i.test(t);n&&(e.firefox=!0,e.version=n[1]);i&&(e.ie=!0,e.version=i[1]);r&&(e.edge=!0,e.version=r[1]);a&&(e.weChat=!0);return{browser:e,os:{},node:!1,canvasSupported:!!document.createElement("canvas").getContext,svgSupported:"undefined"!=typeof SVGRect,touchEventsSupported:"ontouchstart"in window&&!e.ie&&!e.edge,pointerEventsSupported:"onpointerdown"in window&&(e.edge||e.ie&&11<=e.version),domSupported:"undefined"!=typeof document}}(navigator.userAgent);var s={"[object Function]":1,"[object RegExp]":1,"[object Date]":1,"[object Error]":1,"[object CanvasGradient]":1,"[object CanvasPattern]":1,"[object Image]":1,"[object Canvas]":1},l={"[object Int8Array]":1,"[object Uint8Array]":1,"[object Uint8ClampedArray]":1,"[object Int16Array]":1,"[object Uint16Array]":1,"[object Int32Array]":1,"[object Uint32Array]":1,"[object Float32Array]":1,"[object Float64Array]":1},h=Object.prototype.toString,i=Array.prototype,o=i.forEach,u=i.filter,r=i.slice,c=i.map,d=i.reduce,a={};function b(t){if(null==t||"object"!=typeof t)return t;var e=t,n=h.call(t);if("[object Array]"===n){if(!U(t)){e=[];for(var i=0,r=t.length;i<r;i++)e[i]=b(t[i])}}else if(l[n]){if(!U(t)){var a=t.constructor;if(t.constructor.from)e=a.from(t);else{e=new a(t.length);for(i=0,r=t.length;i<r;i++)e[i]=b(t[i])}}}else if(!s[n]&&!U(t)&&!B(t))for(var o in e={},t)t.hasOwnProperty(o)&&(e[o]=b(t[o]));return e}function f(t,e,n){if(!O(e)||!O(t))return n?b(e):t;for(var i in e)if(e.hasOwnProperty(i)){var r=t[i],a=e[i];!O(a)||!O(r)||A(a)||A(r)||B(a)||B(r)||E(a)||E(r)||U(a)||U(r)?!n&&i in t||(t[i]=b(e[i])):f(r,a,n)}return t}function S(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}function C(t,e,n){for(var i in e)e.hasOwnProperty(i)&&(n?null!=e[i]:null==t[i])&&(t[i]=e[i]);return t}function p(){return a.createCanvas()}var g;function v(t,e){if(t){if(t.indexOf)return t.indexOf(e);for(var n=0,i=t.length;n<i;n++)if(t[n]===e)return n}return-1}function y(t,e){var n=t.prototype;function i(){}for(var r in i.prototype=e.prototype,t.prototype=new i,n)t.prototype[r]=n[r];(t.prototype.constructor=t).superClass=e}function _(t,e,n){C(t="prototype"in t?t.prototype:t,e="prototype"in e?e.prototype:e,n)}function P(t){if(t)return"string"!=typeof t&&"number"==typeof t.length}function k(t,e,n){if(t&&e)if(t.forEach&&t.forEach===o)t.forEach(e,n);else if(t.length===+t.length)for(var i=0,r=t.length;i<r;i++)e.call(n,t[i],i,t);else for(var a in t)t.hasOwnProperty(a)&&e.call(n,t[a],a,t)}function D(t,e,n){if(t&&e){if(t.map&&t.map===c)return t.map(e,n);for(var i=[],r=0,a=t.length;r<a;r++)i.push(e.call(n,t[r],r,t));return i}}function M(t,e,n,i){if(t&&e){if(t.reduce&&t.reduce===d)return t.reduce(e,n,i);for(var r=0,a=t.length;r<a;r++)n=e.call(i,n,t[r],r,t);return n}}function x(t,e,n){if(t&&e){if(t.filter&&t.filter===u)return t.filter(e,n);for(var i=[],r=0,a=t.length;r<a;r++)e.call(n,t[r],r,t)&&i.push(t[r]);return i}}function w(t,e){var n=r.call(arguments,2);return function(){return t.apply(e,n.concat(r.call(arguments)))}}function I(t){var e=r.call(arguments,1);return function(){return t.apply(this,e.concat(r.call(arguments)))}}function A(t){return"[object Array]"===h.call(t)}function T(t){return"function"==typeof t}function L(t){return"[object String]"===h.call(t)}function O(t){var e=typeof t;return"function"==e||!!t&&"object"==e}function E(t){return!!s[h.call(t)]}function N(t){return!!l[h.call(t)]}function B(t){return"object"==typeof t&&"number"==typeof t.nodeType&&"object"==typeof t.ownerDocument}function z(t){return t!=t}function R(){for(var t=0,e=arguments.length;t<e;t++)if(null!=arguments[t])return arguments[t]}function F(t,e){return null!=t?t:e}function V(t,e,n){return null!=t?t:null!=e?e:n}function W(){return Function.call.apply(r,arguments)}function H(t){if("number"==typeof t)return[t,t,t,t];var e=t.length;return 2===e?[t[0],t[1],t[0],t[1]]:3===e?[t[0],t[1],t[2],t[1]]:t}function G(t,e){if(!t)throw new Error(e)}function X(t){return null==t?null:"function"==typeof t.trim?t.trim():t.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}a.createCanvas=function(){return document.createElement("canvas")};var q="__ec_primitive__";function Y(t){t[q]=!0}function U(t){return t[q]}function j(t){var n=A(t);this.data={};var i=this;function e(t,e){n?i.set(t,e):i.set(e,t)}t instanceof j?t.each(e):t&&k(t,e)}function Z(t){return new j(t)}function $(){}j.prototype={constructor:j,get:function(t){return this.data.hasOwnProperty(t)?this.data[t]:null},set:function(t,e){return this.data[t]=e},each:function(t,e){for(var n in void 0!==e&&(t=w(t,e)),this.data)this.data.hasOwnProperty(n)&&t(this.data[n],n)},removeKey:function(t){delete this.data[t]}};var K="undefined"==typeof Float32Array?Array:Float32Array;function Q(t,e){var n=new K(2);return null==t&&(t=0),null==e&&(e=0),n[0]=t,n[1]=e,n}function J(t){var e=new K(2);return e[0]=t[0],e[1]=t[1],e}function tt(t,e,n){return t[0]=e[0]+n[0],t[1]=e[1]+n[1],t}function et(t,e,n){return t[0]=e[0]-n[0],t[1]=e[1]-n[1],t}function nt(t,e,n){return t[0]=e[0]*n,t[1]=e[1]*n,t}function it(t,e){var n=function(t){return Math.sqrt(function(t){return t[0]*t[0]+t[1]*t[1]}(t))}(e);return 0===n?(t[0]=0,t[1]=0):(t[0]=e[0]/n,t[1]=e[1]/n),t}function rt(t,e){return Math.sqrt((t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1]))}var at=rt;var ot=function(t,e){return(t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1])};function st(t,e,n){var i=e[0],r=e[1];return t[0]=n[0]*i+n[2]*r+n[4],t[1]=n[1]*i+n[3]*r+n[5],t}function lt(t,e,n){return t[0]=Math.min(e[0],n[0]),t[1]=Math.min(e[1],n[1]),t}function ht(t,e,n){return t[0]=Math.max(e[0],n[0]),t[1]=Math.max(e[1],n[1]),t}function ut(){this.on("mousedown",this._dragStart,this),this.on("mousemove",this._drag,this),this.on("mouseup",this._dragEnd,this),this.on("globalout",this._dragEnd,this)}function ct(t,e){return{target:t,topTarget:e&&e.topTarget}}ut.prototype={constructor:ut,_dragStart:function(t){var e=t.target;e&&e.draggable&&((this._draggingTarget=e).dragging=!0,this._x=t.offsetX,this._y=t.offsetY,this.dispatchToElement(ct(e,t),"dragstart",t.event))},_drag:function(t){var e=this._draggingTarget;if(e){var n=t.offsetX,i=t.offsetY,r=n-this._x,a=i-this._y;this._x=n,this._y=i,e.drift(r,a,t),this.dispatchToElement(ct(e,t),"drag",t.event);var o=this.findHover(n,i,e).target,s=this._dropTarget;e!==(this._dropTarget=o)&&(s&&o!==s&&this.dispatchToElement(ct(s,t),"dragleave",t.event),o&&o!==s&&this.dispatchToElement(ct(o,t),"dragenter",t.event))}},_dragEnd:function(t){var e=this._draggingTarget;e&&(e.dragging=!1),this.dispatchToElement(ct(e,t),"dragend",t.event),this._dropTarget&&this.dispatchToElement(ct(this._dropTarget,t),"drop",t.event),this._draggingTarget=null,this._dropTarget=null}};var dt=Array.prototype.slice,ft=function(t){this._$handlers={},this._$eventProcessor=t};function pt(t,e,n,i,r,a){var o=t._$handlers;if("function"==typeof n&&(r=i,i=n,n=null),!i||!e)return t;n=function(t,e){var n=t._$eventProcessor;return null!=e&&n&&n.normalizeQuery&&(e=n.normalizeQuery(e)),e}(t,n),o[e]||(o[e]=[]);for(var s=0;s<o[e].length;s++)if(o[e][s].h===i)return t;var l={h:i,one:a,query:n,ctx:r||t,callAtLast:i.zrEventfulCallAtLast},h=o[e].length-1,u=o[e][h];return u&&u.callAtLast?o[e].splice(h,0,l):o[e].push(l),t}ft.prototype={constructor:ft,one:function(t,e,n,i){return pt(this,t,e,n,i,!0)},on:function(t,e,n,i){return pt(this,t,e,n,i,!1)},isSilent:function(t){var e=this._$handlers;return!e[t]||!e[t].length},off:function(t,e){var n=this._$handlers;if(!t)return this._$handlers={},this;if(e){if(n[t]){for(var i=[],r=0,a=n[t].length;r<a;r++)n[t][r].h!==e&&i.push(n[t][r]);n[t]=i}n[t]&&0===n[t].length&&delete n[t]}else delete n[t];return this},trigger:function(t){var e=this._$handlers[t],n=this._$eventProcessor;if(e){var i=arguments,r=i.length;3<r&&(i=dt.call(i,1));for(var a=e.length,o=0;o<a;){var s=e[o];if(n&&n.filter&&null!=s.query&&!n.filter(t,s.query))o++;else{switch(r){case 1:s.h.call(s.ctx);break;case 2:s.h.call(s.ctx,i[1]);break;case 3:s.h.call(s.ctx,i[1],i[2]);break;default:s.h.apply(s.ctx,i)}s.one?(e.splice(o,1),a--):o++}}}return n&&n.afterTrigger&&n.afterTrigger(t),this},triggerWithContext:function(t){var e=this._$handlers[t],n=this._$eventProcessor;if(e){var i=arguments,r=i.length;4<r&&(i=dt.call(i,1,i.length-1));for(var a=i[i.length-1],o=e.length,s=0;s<o;){var l=e[s];if(n&&n.filter&&null!=l.query&&!n.filter(t,l.query))s++;else{switch(r){case 1:l.h.call(a);break;case 2:l.h.call(a,i[1]);break;case 3:l.h.call(a,i[1],i[2]);break;default:l.h.apply(a,i)}l.one?(e.splice(s,1),o--):s++}}}return n&&n.afterTrigger&&n.afterTrigger(t),this}};var gt=Math.log(2);function vt(t,e,n,i,r,a){var o=i+"-"+r,s=t.length;if(a.hasOwnProperty(o))return a[o];if(1===e){var l=Math.round(Math.log((1<<s)-1&~r)/gt);return t[n][l]}for(var h=i|1<<n,u=n+1;i&1<<u;)u++;for(var c=0,d=0,f=0;d<s;d++){var p=1<<d;p&r||(c+=(f%2?-1:1)*t[n][d]*vt(t,e-1,u,h,r|p,a),f++)}return a[o]=c}var mt="undefined"!=typeof window&&!!window.addEventListener,yt=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,_t="___zrEVENTSAVED",xt=[];function wt(t,e,n,i){return n=n||{},i||!m.canvasSupported?bt(t,e,n):m.browser.firefox&&null!=e.layerX&&e.layerX!==e.offsetX?(n.zrX=e.layerX,n.zrY=e.layerY):null!=e.offsetX?(n.zrX=e.offsetX,n.zrY=e.offsetY):bt(t,e,n),n}function bt(t,e,n){if(t.getBoundingClientRect&&m.domSupported){var i=e.clientX,r=e.clientY;if("CANVAS"===t.nodeName.toUpperCase()){var a=t.getBoundingClientRect();return n.zrX=i-a.left,void(n.zrY=r-a.top)}var o=t[_t]||(t[_t]={}),s=function(t,e){for(var n=e.transformer,i=e.srcCoords,r=!0,a=[],o=[],s=0;s<4;s++){var l=t[s].getBoundingClientRect(),h=2*s,u=l.left,c=l.top;a.push(u,c),r&=i&&u===i[h]&&c===i[1+h],o.push(t[s].offsetLeft,t[s].offsetTop)}return r?n:(e.srcCoords=a,e.transformer=function(t,e){var n=[[t[0],t[1],1,0,0,0,-e[0]*t[0],-e[0]*t[1]],[0,0,0,t[0],t[1],1,-e[1]*t[0],-e[1]*t[1]],[t[2],t[3],1,0,0,0,-e[2]*t[2],-e[2]*t[3]],[0,0,0,t[2],t[3],1,-e[3]*t[2],-e[3]*t[3]],[t[4],t[5],1,0,0,0,-e[4]*t[4],-e[4]*t[5]],[0,0,0,t[4],t[5],1,-e[5]*t[4],-e[5]*t[5]],[t[6],t[7],1,0,0,0,-e[6]*t[6],-e[6]*t[7]],[0,0,0,t[6],t[7],1,-e[7]*t[6],-e[7]*t[7]]],i={},r=vt(n,8,0,0,0,i);if(0!==r){for(var a=[],o=0;o<8;o++)for(var s=0;s<8;s++)null==a[s]&&(a[s]=0),a[s]+=((o+s)%2?-1:1)*vt(n,7,0===o?1:0,1<<o,1<<s,i)/r*e[o];return function(t,e,n){var i=e*a[6]+n*a[7]+1;t[0]=(e*a[0]+n*a[1]+a[2])/i,t[1]=(e*a[3]+n*a[4]+a[5])/i}}}(a,o))}(function(t,e){var n=e.markers;if(n)return n;n=e.markers=[];for(var i=["left","right"],r=["top","bottom"],a=0;a<4;a++){var o=document.createElement("div"),s=o.style,l=a%2,h=(a>>1)%2;s.cssText=["position:absolute","visibility: hidden","padding: 0","margin: 0","border-width: 0","width:0","height:0",i[l]+":0",r[h]+":0",i[1-l]+":auto",r[1-h]+":auto",""].join("!important;"),t.appendChild(o),n.push(o)}return n}(t,o),o);if(s)return s(xt,i,r),n.zrX=xt[0],void(n.zrY=xt[1])}n.zrX=n.zrY=0}function St(t,e,n){if(null!=(e=e||window.event).zrX)return e;var i=e.type;if(i&&0<=i.indexOf("touch")){var r="touchend"!==i?e.targetTouches[0]:e.changedTouches[0];r&&wt(t,r,e,n)}else wt(t,e,e,n),e.zrDelta=e.wheelDelta?e.wheelDelta/120:-(e.detail||0)/3;var a=e.button;return null==e.which&&void 0!==a&&yt.test(e.type)&&(e.which=1&a?1:2&a?3:4&a?2:0),e}function Mt(){this._track=[]}var It=mt?function(t){t.preventDefault(),t.stopPropagation(),t.cancelBubble=!0}:function(t){t.returnValue=!1,t.cancelBubble=!0};function Tt(t){var e=t[1][0]-t[0][0],n=t[1][1]-t[0][1];return Math.sqrt(e*e+n*n)}Mt.prototype={constructor:Mt,recognize:function(t,e,n){return this._doTrack(t,e,n),this._recognize(t)},clear:function(){return this._track.length=0,this},_doTrack:function(t,e,n){var i=t.touches;if(i){for(var r={points:[],touches:[],target:e,event:t},a=0,o=i.length;a<o;a++){var s=i[a],l=wt(n,s,{});r.points.push([l.zrX,l.zrY]),r.touches.push(s)}this._track.push(r)}},_recognize:function(t){for(var e in Ct)if(Ct.hasOwnProperty(e)){var n=Ct[e](this._track,t);if(n)return n}}};var Ct={pinch:function(t,e){var n=t.length;if(n){var i=(t[n-1]||{}).points,r=(t[n-2]||{}).points||i;if(r&&1<r.length&&i&&1<i.length){var a=Tt(i)/Tt(r);isFinite(a)||(a=1),e.pinchScale=a;var o=function(t){return[(t[0][0]+t[1][0])/2,(t[0][1]+t[1][1])/2]}(i);return e.pinchX=o[0],e.pinchY=o[1],{type:"pinch",target:t[0].target,event:e}}}}},kt="silent";function Dt(t){It(this.event)}function At(){}At.prototype.dispose=function(){};function Lt(t,e,n,i){ft.call(this),this.storage=t,this.painter=e,this.painterRoot=i,n=n||new At,this.proxy=null,this._hovered={},this._lastTouchMoment,this._lastX,this._lastY,this._gestureMgr,ut.call(this),this.setHandlerProxy(n)}var Pt=["click","dblclick","mousewheel","mouseout","mouseup","mousedown","mousemove","contextmenu"];function Ot(t,e,n){if(t[t.rectHover?"rectContain":"contain"](e,n)){for(var i,r=t;r;){if(r.clipPath&&!r.clipPath.contain(e,n))return!1;r.silent&&(i=!0),r=r.parent}return!i||kt}return!1}Lt.prototype={constructor:Lt,setHandlerProxy:function(e){this.proxy&&this.proxy.dispose(),e&&(k(Pt,function(t){e.on&&e.on(t,this[t],this)},this),e.handler=this),this.proxy=e},mousemove:function(t){var e=t.zrX,n=t.zrY,i=this._hovered,r=i.target;r&&!r.__zr&&(r=(i=this.findHover(i.x,i.y)).target);var a=this._hovered=this.findHover(e,n),o=a.target,s=this.proxy;s.setCursor&&s.setCursor(o?o.cursor:"default"),r&&o!==r&&this.dispatchToElement(i,"mouseout",t),this.dispatchToElement(a,"mousemove",t),o&&o!==r&&this.dispatchToElement(a,"mouseover",t)},mouseout:function(t){this.dispatchToElement(this._hovered,"mouseout",t);for(var e,n=t.toElement||t.relatedTarget;(n=n&&n.parentNode)&&9!==n.nodeType&&!(e=n===this.painterRoot););e||this.trigger("globalout",{event:t})},resize:function(t){this._hovered={}},dispatch:function(t,e){var n=this[t];n&&n.call(this,e)},dispose:function(){this.proxy.dispose(),this.storage=this.proxy=this.painter=null},setCursorStyle:function(t){var e=this.proxy;e.setCursor&&e.setCursor(t)},dispatchToElement:function(t,e,n){var i=(t=t||{}).target;if(!i||!i.silent){for(var r="on"+e,a=function(t,e,n){return{type:t,event:n,target:e.target,topTarget:e.topTarget,cancelBubble:!1,offsetX:n.zrX,offsetY:n.zrY,gestureEvent:n.gestureEvent,pinchX:n.pinchX,pinchY:n.pinchY,pinchScale:n.pinchScale,wheelDelta:n.zrDelta,zrByTouch:n.zrByTouch,which:n.which,stop:Dt}}(e,t,n);i&&(i[r]&&(a.cancelBubble=i[r].call(i,a)),i.trigger(e,a),i=i.parent,!a.cancelBubble););a.cancelBubble||(this.trigger(e,a),this.painter&&this.painter.eachOtherLayer(function(t){"function"==typeof t[r]&&t[r].call(t,a),t.trigger&&t.trigger(e,a)}))}},findHover:function(t,e,n){for(var i=this.storage.getDisplayList(),r={x:t,y:e},a=i.length-1;0<=a;a--){var o;if(i[a]!==n&&!i[a].ignore&&(o=Ot(i[a],t,e))&&(r.topTarget||(r.topTarget=i[a]),o!==kt)){r.target=i[a];break}}return r},processGesture:function(t,e){this._gestureMgr||(this._gestureMgr=new Mt);var n=this._gestureMgr;"start"===e&&n.clear();var i=n.recognize(t,this.findHover(t.zrX,t.zrY,null).target,this.proxy.dom);if("end"===e&&n.clear(),i){var r=i.type;t.gestureEvent=r,this.dispatchToElement({target:i.target},r,i.event)}}},k(["click","mousedown","mouseup","mousewheel","dblclick","contextmenu"],function(i){Lt.prototype[i]=function(t){var e=this.findHover(t.zrX,t.zrY),n=e.target;if("mousedown"===i)this._downEl=n,this._downPoint=[t.zrX,t.zrY],this._upEl=n;else if("mouseup"===i)this._upEl=n;else if("click"===i){if(this._downEl!==this._upEl||!this._downPoint||4<at(this._downPoint,[t.zrX,t.zrY]))return;this._downPoint=null}this.dispatchToElement(e,i,t)}}),_(Lt,ft),_(Lt,ut);var Et="undefined"==typeof Float32Array?Array:Float32Array;function Nt(){var t=new Et(6);return Bt(t),t}function Bt(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,t}function zt(t,e,n){var i=e[0]*n[0]+e[2]*n[1],r=e[1]*n[0]+e[3]*n[1],a=e[0]*n[2]+e[2]*n[3],o=e[1]*n[2]+e[3]*n[3],s=e[0]*n[4]+e[2]*n[5]+e[4],l=e[1]*n[4]+e[3]*n[5]+e[5];return t[0]=i,t[1]=r,t[2]=a,t[3]=o,t[4]=s,t[5]=l,t}function Rt(t,e,n){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4]+n[0],t[5]=e[5]+n[1],t}function Ft(t,e,n){var i=e[0],r=e[2],a=e[4],o=e[1],s=e[3],l=e[5],h=Math.sin(n),u=Math.cos(n);return t[0]=i*u+o*h,t[1]=-i*h+o*u,t[2]=r*u+s*h,t[3]=-r*h+u*s,t[4]=u*a+h*l,t[5]=u*l-h*a,t}function Vt(t,e,n){var i=n[0],r=n[1];return t[0]=e[0]*i,t[1]=e[1]*r,t[2]=e[2]*i,t[3]=e[3]*r,t[4]=e[4]*i,t[5]=e[5]*r,t}function Wt(t,e){var n=e[0],i=e[2],r=e[4],a=e[1],o=e[3],s=e[5],l=n*o-a*i;return l?(l=1/l,t[0]=o*l,t[1]=-a*l,t[2]=-i*l,t[3]=n*l,t[4]=(i*s-o*r)*l,t[5]=(a*r-n*s)*l,t):null}var Ht=Bt;function Gt(t){return 5e-5<t||t<-5e-5}var Xt=function(t){(t=t||{}).position||(this.position=[0,0]),null==t.rotation&&(this.rotation=0),t.scale||(this.scale=[1,1]),this.origin=this.origin||null},qt=Xt.prototype;qt.transform=null,qt.needLocalTransform=function(){return Gt(this.rotation)||Gt(this.position[0])||Gt(this.position[1])||Gt(this.scale[0]-1)||Gt(this.scale[1]-1)};var Yt=[];qt.updateTransform=function(){var t=this.parent,e=t&&t.transform,n=this.needLocalTransform(),i=this.transform;if(n||e){i=i||Nt(),n?this.getLocalTransform(i):Ht(i),e&&(n?zt(i,t.transform,i):function(t,e){t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5]}(i,t.transform)),this.transform=i;var r=this.globalScaleRatio;if(null!=r&&1!==r){this.getGlobalScale(Yt);var a=Yt[0]<0?-1:1,o=Yt[1]<0?-1:1,s=((Yt[0]-a)*r+a)/Yt[0]||0,l=((Yt[1]-o)*r+o)/Yt[1]||0;i[0]*=s,i[1]*=s,i[2]*=l,i[3]*=l}this.invTransform=this.invTransform||Nt(),Wt(this.invTransform,i)}else i&&Ht(i)},qt.getLocalTransform=function(t){return Xt.getLocalTransform(this,t)},qt.setTransform=function(t){var e=this.transform,n=t.dpr||1;e?t.setTransform(n*e[0],n*e[1],n*e[2],n*e[3],n*e[4],n*e[5]):t.setTransform(n,0,0,n,0,0)},qt.restoreTransform=function(t){var e=t.dpr||1;t.setTransform(e,0,0,e,0,0)};var Ut=[],jt=Nt();qt.setLocalTransform=function(t){if(t){var e=t[0]*t[0]+t[1]*t[1],n=t[2]*t[2]+t[3]*t[3],i=this.position,r=this.scale;Gt(e-1)&&(e=Math.sqrt(e)),Gt(n-1)&&(n=Math.sqrt(n)),t[0]<0&&(e=-e),t[3]<0&&(n=-n),i[0]=t[4],i[1]=t[5],r[0]=e,r[1]=n,this.rotation=Math.atan2(-t[1]/n,t[0]/e)}},qt.decomposeTransform=function(){if(this.transform){var t=this.parent,e=this.transform;t&&t.transform&&(zt(Ut,t.invTransform,e),e=Ut);var n=this.origin;n&&(n[0]||n[1])&&(jt[4]=n[0],jt[5]=n[1],zt(Ut,e,jt),Ut[4]-=n[0],Ut[5]-=n[1],e=Ut),this.setLocalTransform(e)}},qt.getGlobalScale=function(t){var e=this.transform;return t=t||[],e?(t[0]=Math.sqrt(e[0]*e[0]+e[1]*e[1]),t[1]=Math.sqrt(e[2]*e[2]+e[3]*e[3]),e[0]<0&&(t[0]=-t[0]),e[3]<0&&(t[1]=-t[1])):(t[0]=1,t[1]=1),t},qt.transformCoordToLocal=function(t,e){var n=[t,e],i=this.invTransform;return i&&st(n,n,i),n},qt.transformCoordToGlobal=function(t,e){var n=[t,e],i=this.transform;return i&&st(n,n,i),n},Xt.getLocalTransform=function(t,e){Ht(e=e||[]);var n=t.origin,i=t.scale||[1,1],r=t.rotation||0,a=t.position||[0,0];return n&&(e[4]-=n[0],e[5]-=n[1]),Vt(e,e,i),r&&Ft(e,e,r),n&&(e[4]+=n[0],e[5]+=n[1]),e[4]+=a[0],e[5]+=a[1],e};var Zt={linear:function(t){return t},quadraticIn:function(t){return t*t},quadraticOut:function(t){return t*(2-t)},quadraticInOut:function(t){return(t*=2)<1?.5*t*t:-.5*(--t*(t-2)-1)},cubicIn:function(t){return t*t*t},cubicOut:function(t){return--t*t*t+1},cubicInOut:function(t){return(t*=2)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},quarticIn:function(t){return t*t*t*t},quarticOut:function(t){return 1- --t*t*t*t},quarticInOut:function(t){return(t*=2)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)},quinticIn:function(t){return t*t*t*t*t},quinticOut:function(t){return--t*t*t*t*t+1},quinticInOut:function(t){return(t*=2)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},sinusoidalIn:function(t){return 1-Math.cos(t*Math.PI/2)},sinusoidalOut:function(t){return Math.sin(t*Math.PI/2)},sinusoidalInOut:function(t){return.5*(1-Math.cos(Math.PI*t))},exponentialIn:function(t){return 0===t?0:Math.pow(1024,t-1)},exponentialOut:function(t){return 1===t?1:1-Math.pow(2,-10*t)},exponentialInOut:function(t){return 0===t?0:1===t?1:(t*=2)<1?.5*Math.pow(1024,t-1):.5*(2-Math.pow(2,-10*(t-1)))},circularIn:function(t){return 1-Math.sqrt(1-t*t)},circularOut:function(t){return Math.sqrt(1- --t*t)},circularInOut:function(t){return(t*=2)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},elasticIn:function(t){var e,n=.1;return 0===t?0:1===t?1:(e=!n||n<1?(n=1,.1):.4*Math.asin(1/n)/(2*Math.PI),-n*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/.4))},elasticOut:function(t){var e,n=.1;return 0===t?0:1===t?1:(e=!n||n<1?(n=1,.1):.4*Math.asin(1/n)/(2*Math.PI),n*Math.pow(2,-10*t)*Math.sin((t-e)*(2*Math.PI)/.4)+1)},elasticInOut:function(t){var e,n=.1;return 0===t?0:1===t?1:(e=!n||n<1?(n=1,.1):.4*Math.asin(1/n)/(2*Math.PI),(t*=2)<1?n*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/.4)*-.5:n*Math.pow(2,-10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/.4)*.5+1)},backIn:function(t){return t*t*(2.70158*t-1.70158)},backOut:function(t){return--t*t*(2.70158*t+1.70158)+1},backInOut:function(t){var e=2.5949095;return(t*=2)<1?t*t*((1+e)*t-e)*.5:.5*((t-=2)*t*((1+e)*t+e)+2)},bounceIn:function(t){return 1-Zt.bounceOut(1-t)},bounceOut:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},bounceInOut:function(t){return t<.5?.5*Zt.bounceIn(2*t):.5*Zt.bounceOut(2*t-1)+.5}};function $t(t){this._target=t.target,this._life=t.life||1e3,this._delay=t.delay||0,this._initialized=!1,this.loop=null!=t.loop&&t.loop,this.gap=t.gap||0,this.easing=t.easing||"Linear",this.onframe=t.onframe,this.ondestroy=t.ondestroy,this.onrestart=t.onrestart,this._pausedTime=0,this._paused=!1}$t.prototype={constructor:$t,step:function(t,e){if(this._initialized||(this._startTime=t+this._delay,this._initialized=!0),this._paused)this._pausedTime+=e;else{var n=(t-this._startTime-this._pausedTime)/this._life;if(!(n<0)){n=Math.min(n,1);var i=this.easing,r="string"==typeof i?Zt[i]:i,a="function"==typeof r?r(n):n;return this.fire("frame",a),1===n?this.loop?(this.restart(t),"restart"):(this._needsRemove=!0,"destroy"):null}}},restart:function(t){var e=(t-this._startTime-this._pausedTime)%this._life;this._startTime=t-e+this.gap,this._pausedTime=0,this._needsRemove=!1},fire:function(t,e){this[t="on"+t]&&this[t](this._target,e)},pause:function(){this._paused=!0},resume:function(){this._paused=!1}};function Kt(){this.head=null,this.tail=null,this._len=0}var Qt=Kt.prototype;Qt.insert=function(t){var e=new te(t);return this.insertEntry(e),e},Qt.insertEntry=function(t){this.head?((this.tail.next=t).prev=this.tail,t.next=null,this.tail=t):this.head=this.tail=t,this._len++},Qt.remove=function(t){var e=t.prev,n=t.next;e?e.next=n:this.head=n,n?n.prev=e:this.tail=e,t.next=t.prev=null,this._len--},Qt.len=function(){return this._len},Qt.clear=function(){this.head=this.tail=null,this._len=0};function Jt(t){this._list=new Kt,this._map={},this._maxSize=t||10,this._lastRemovedEntry=null}var te=function(t){this.value=t,this.next,this.prev},ee=Jt.prototype;ee.put=function(t,e){var n=this._list,i=this._map,r=null;if(null==i[t]){var a=n.len(),o=this._lastRemovedEntry;if(a>=this._maxSize&&0<a){var s=n.head;n.remove(s),delete i[s.key],r=s.value,this._lastRemovedEntry=s}o?o.value=e:o=new te(e),o.key=t,n.insertEntry(o),i[t]=o}return r},ee.get=function(t){var e=this._map[t],n=this._list;if(null!=e)return e!==n.tail&&(n.remove(e),n.insertEntry(e)),e.value},ee.clear=function(){this._list.clear(),this._map={}};var ne={transparent:[0,0,0,0],aliceblue:[240,248,255,1],antiquewhite:[250,235,215,1],aqua:[0,255,255,1],aquamarine:[127,255,212,1],azure:[240,255,255,1],beige:[245,245,220,1],bisque:[255,228,196,1],black:[0,0,0,1],blanchedalmond:[255,235,205,1],blue:[0,0,255,1],blueviolet:[138,43,226,1],brown:[165,42,42,1],burlywood:[222,184,135,1],cadetblue:[95,158,160,1],chartreuse:[127,255,0,1],chocolate:[210,105,30,1],coral:[255,127,80,1],cornflowerblue:[100,149,237,1],cornsilk:[255,248,220,1],crimson:[220,20,60,1],cyan:[0,255,255,1],darkblue:[0,0,139,1],darkcyan:[0,139,139,1],darkgoldenrod:[184,134,11,1],darkgray:[169,169,169,1],darkgreen:[0,100,0,1],darkgrey:[169,169,169,1],darkkhaki:[189,183,107,1],darkmagenta:[139,0,139,1],darkolivegreen:[85,107,47,1],darkorange:[255,140,0,1],darkorchid:[153,50,204,1],darkred:[139,0,0,1],darksalmon:[233,150,122,1],darkseagreen:[143,188,143,1],darkslateblue:[72,61,139,1],darkslategray:[47,79,79,1],darkslategrey:[47,79,79,1],darkturquoise:[0,206,209,1],darkviolet:[148,0,211,1],deeppink:[255,20,147,1],deepskyblue:[0,191,255,1],dimgray:[105,105,105,1],dimgrey:[105,105,105,1],dodgerblue:[30,144,255,1],firebrick:[178,34,34,1],floralwhite:[255,250,240,1],forestgreen:[34,139,34,1],fuchsia:[255,0,255,1],gainsboro:[220,220,220,1],ghostwhite:[248,248,255,1],gold:[255,215,0,1],goldenrod:[218,165,32,1],gray:[128,128,128,1],green:[0,128,0,1],greenyellow:[173,255,47,1],grey:[128,128,128,1],honeydew:[240,255,240,1],hotpink:[255,105,180,1],indianred:[205,92,92,1],indigo:[75,0,130,1],ivory:[255,255,240,1],khaki:[240,230,140,1],lavender:[230,230,250,1],lavenderblush:[255,240,245,1],lawngreen:[124,252,0,1],lemonchiffon:[255,250,205,1],lightblue:[173,216,230,1],lightcoral:[240,128,128,1],lightcyan:[224,255,255,1],lightgoldenrodyellow:[250,250,210,1],lightgray:[211,211,211,1],lightgreen:[144,238,144,1],lightgrey:[211,211,211,1],lightpink:[255,182,193,1],lightsalmon:[255,160,122,1],lightseagreen:[32,178,170,1],lightskyblue:[135,206,250,1],lightslategray:[119,136,153,1],lightslategrey:[119,136,153,1],lightsteelblue:[176,196,222,1],lightyellow:[255,255,224,1],lime:[0,255,0,1],limegreen:[50,205,50,1],linen:[250,240,230,1],magenta:[255,0,255,1],maroon:[128,0,0,1],mediumaquamarine:[102,205,170,1],mediumblue:[0,0,205,1],mediumorchid:[186,85,211,1],mediumpurple:[147,112,219,1],mediumseagreen:[60,179,113,1],mediumslateblue:[123,104,238,1],mediumspringgreen:[0,250,154,1],mediumturquoise:[72,209,204,1],mediumvioletred:[199,21,133,1],midnightblue:[25,25,112,1],mintcream:[245,255,250,1],mistyrose:[255,228,225,1],moccasin:[255,228,181,1],navajowhite:[255,222,173,1],navy:[0,0,128,1],oldlace:[253,245,230,1],olive:[128,128,0,1],olivedrab:[107,142,35,1],orange:[255,165,0,1],orangered:[255,69,0,1],orchid:[218,112,214,1],palegoldenrod:[238,232,170,1],palegreen:[152,251,152,1],paleturquoise:[175,238,238,1],palevioletred:[219,112,147,1],papayawhip:[255,239,213,1],peachpuff:[255,218,185,1],peru:[205,133,63,1],pink:[255,192,203,1],plum:[221,160,221,1],powderblue:[176,224,230,1],purple:[128,0,128,1],red:[255,0,0,1],rosybrown:[188,143,143,1],royalblue:[65,105,225,1],saddlebrown:[139,69,19,1],salmon:[250,128,114,1],sandybrown:[244,164,96,1],seagreen:[46,139,87,1],seashell:[255,245,238,1],sienna:[160,82,45,1],silver:[192,192,192,1],skyblue:[135,206,235,1],slateblue:[106,90,205,1],slategray:[112,128,144,1],slategrey:[112,128,144,1],snow:[255,250,250,1],springgreen:[0,255,127,1],steelblue:[70,130,180,1],tan:[210,180,140,1],teal:[0,128,128,1],thistle:[216,191,216,1],tomato:[255,99,71,1],turquoise:[64,224,208,1],violet:[238,130,238,1],wheat:[245,222,179,1],white:[255,255,255,1],whitesmoke:[245,245,245,1],yellow:[255,255,0,1],yellowgreen:[154,205,50,1]};function ie(t){return(t=Math.round(t))<0?0:255<t?255:t}function re(t){return t<0?0:1<t?1:t}function ae(t){return t.length&&"%"===t.charAt(t.length-1)?ie(parseFloat(t)/100*255):ie(parseInt(t,10))}function oe(t){return t.length&&"%"===t.charAt(t.length-1)?re(parseFloat(t)/100):re(parseFloat(t))}function se(t,e,n){return n<0?n+=1:1<n&&(n-=1),6*n<1?t+(e-t)*n*6:2*n<1?e:3*n<2?t+(e-t)*(2/3-n)*6:t}function le(t,e,n,i,r){return t[0]=e,t[1]=n,t[2]=i,t[3]=r,t}function he(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t}var ue=new Jt(20),ce=null;function de(t,e){ce&&he(ce,e),ce=ue.put(t,ce||e.slice())}function fe(t,e){if(t){e=e||[];var n=ue.get(t);if(n)return he(e,n);var i,r=(t+="").replace(/ /g,"").toLowerCase();if(r in ne)return he(e,ne[r]),de(t,e),e;if("#"===r.charAt(0))return 4===r.length?0<=(i=parseInt(r.substr(1),16))&&i<=4095?(le(e,(3840&i)>>4|(3840&i)>>8,240&i|(240&i)>>4,15&i|(15&i)<<4,1),de(t,e),e):void le(e,0,0,0,1):7===r.length?0<=(i=parseInt(r.substr(1),16))&&i<=16777215?(le(e,(16711680&i)>>16,(65280&i)>>8,255&i,1),de(t,e),e):void le(e,0,0,0,1):void 0;var a=r.indexOf("("),o=r.indexOf(")");if(-1!==a&&o+1===r.length){var s=r.substr(0,a),l=r.substr(a+1,o-(a+1)).split(","),h=1;switch(s){case"rgba":if(4!==l.length)return void le(e,0,0,0,1);h=oe(l.pop());case"rgb":return 3!==l.length?void le(e,0,0,0,1):(le(e,ae(l[0]),ae(l[1]),ae(l[2]),h),de(t,e),e);case"hsla":return 4!==l.length?void le(e,0,0,0,1):(l[3]=oe(l[3]),pe(l,e),de(t,e),e);case"hsl":return 3!==l.length?void le(e,0,0,0,1):(pe(l,e),de(t,e),e);default:return}}le(e,0,0,0,1)}}function pe(t,e){var n=(parseFloat(t[0])%360+360)%360/360,i=oe(t[1]),r=oe(t[2]),a=r<=.5?r*(i+1):r+i-r*i,o=2*r-a;return le(e=e||[],ie(255*se(o,a,n+1/3)),ie(255*se(o,a,n)),ie(255*se(o,a,n-1/3)),1),4===t.length&&(e[3]=t[3]),e}function ge(t,e){if(t&&t.length){var n=t[0]+","+t[1]+","+t[2];return"rgba"!==e&&"hsva"!==e&&"hsla"!==e||(n+=","+t[3]),e+"("+n+")"}}var ve=Array.prototype.slice;function me(t,e){return t[e]}function ye(t,e,n){t[e]=n}function _e(t,e,n){return(e-t)*n+t}function xe(t,e,n){return.5<n?e:t}function we(t,e,n,i,r){var a=t.length;if(1===r)for(var o=0;o<a;o++)i[o]=_e(t[o],e[o],n);else{var s=a&&t[0].length;for(o=0;o<a;o++)for(var l=0;l<s;l++)i[o][l]=_e(t[o][l],e[o][l],n)}}function be(t,e,n){var i=t.length,r=e.length;if(i!==r)if(r<i)t.length=r;else for(var a=i;a<r;a++)t.push(1===n?e[a]:ve.call(e[a]));var o=t[0]&&t[0].length;for(a=0;a<t.length;a++)if(1===n)isNaN(t[a])&&(t[a]=e[a]);else for(var s=0;s<o;s++)isNaN(t[a][s])&&(t[a][s]=e[a][s])}function Se(t,e,n){if(t===e)return!0;var i=t.length;if(i!==e.length)return!1;if(1===n){for(var r=0;r<i;r++)if(t[r]!==e[r])return!1}else{var a=t[0].length;for(r=0;r<i;r++)for(var o=0;o<a;o++)if(t[r][o]!==e[r][o])return!1}return!0}function Me(t,e,n,i,r,a,o,s,l){var h=t.length;if(1===l)for(var u=0;u<h;u++)s[u]=Ie(t[u],e[u],n[u],i[u],r,a,o);else{var c=t[0].length;for(u=0;u<h;u++)for(var d=0;d<c;d++)s[u][d]=Ie(t[u][d],e[u][d],n[u][d],i[u][d],r,a,o)}}function Ie(t,e,n,i,r,a,o){var s=.5*(n-t),l=.5*(i-e);return(2*(e-n)+s+l)*o+(-3*(e-n)-2*s-l)*a+s*r+e}function Te(t){if(P(t)){var e=t.length;if(P(t[0])){for(var n=[],i=0;i<e;i++)n.push(ve.call(t[i]));return n}return ve.call(t)}return t}function Ce(t){return t[0]=Math.floor(t[0]),t[1]=Math.floor(t[1]),t[2]=Math.floor(t[2]),"rgba("+t.join(",")+")"}function ke(t,e,n,i,a,r){var o=t._getter,s=t._setter,l="spline"===e,h=i.length;if(h){var u,c=P(i[0].value),d=!1,f=!1,p=c?function(t){var e=t[t.length-1].value;return P(e&&e[0])?2:1}(i):0;i.sort(function(t,e){return t.time-e.time}),u=i[h-1].time;for(var g=[],v=[],m=i[0].value,y=!0,_=0;_<h;_++){g.push(i[_].time/u);var x=i[_].value;if(c&&Se(x,m,p)||!c&&x===m||(y=!1),"string"==typeof(m=x)){var w=fe(x);w?(x=w,d=!0):f=!0}v.push(x)}if(r||!y){var b=v[h-1];for(_=0;_<h-1;_++)c?be(v[_],b,p):!isNaN(v[_])||isNaN(b)||f||d||(v[_]=b);c&&be(o(t._target,a),b,p);var S,M,I,T,C,k=0,D=0;if(d)var A=[0,0,0,0];var L=new $t({target:t._target,life:u,loop:t._loop,delay:t._delay,onframe:function(t,e){var n;if(e<0)n=0;else if(e<D){for(n=Math.min(k+1,h-1);0<=n&&!(g[n]<=e);n--);n=Math.min(n,h-2)}else{for(n=k;n<h&&!(g[n]>e);n++);n=Math.min(n-1,h-2)}D=e;var i=g[(k=n)+1]-g[n];if(0!=i)if(S=(e-g[n])/i,l)if(I=v[n],M=v[0===n?n:n-1],T=v[h-2<n?h-1:n+1],C=v[h-3<n?h-1:n+2],c)Me(M,I,T,C,S,S*S,S*S*S,o(t,a),p);else{if(d)r=Me(M,I,T,C,S,S*S,S*S*S,A,1),r=Ce(A);else{if(f)return xe(I,T,S);r=Ie(M,I,T,C,S,S*S,S*S*S)}s(t,a,r)}else if(c)we(v[n],v[n+1],S,o(t,a),p);else{var r;if(d)we(v[n],v[n+1],S,A,1),r=Ce(A);else{if(f)return xe(v[n],v[n+1],S);r=_e(v[n],v[n+1],S)}s(t,a,r)}},ondestroy:n});return e&&"spline"!==e&&(L.easing=e),L}}}function De(t,e,n,i){this._tracks={},this._target=t,this._loop=e||!1,this._getter=n||me,this._setter=i||ye,this._clipCount=0,this._delay=0,this._doneList=[],this._onframeList=[],this._clipList=[]}De.prototype={when:function(t,e){var n=this._tracks;for(var i in e)if(e.hasOwnProperty(i)){if(!n[i]){n[i]=[];var r=this._getter(this._target,i);if(null==r)continue;0!==t&&n[i].push({time:0,value:Te(r)})}n[i].push({time:t,value:e[i]})}return this},during:function(t){return this._onframeList.push(t),this},pause:function(){for(var t=0;t<this._clipList.length;t++)this._clipList[t].pause();this._paused=!0},resume:function(){for(var t=0;t<this._clipList.length;t++)this._clipList[t].resume();this._paused=!1},isPaused:function(){return!!this._paused},_doneCallback:function(){this._tracks={},this._clipList.length=0;for(var t=this._doneList,e=t.length,n=0;n<e;n++)t[n].call(this)},start:function(t,e){function n(){--a||r._doneCallback()}var i,r=this,a=0;for(var o in this._tracks)if(this._tracks.hasOwnProperty(o)){var s=ke(this,t,n,this._tracks[o],o,e);s&&(this._clipList.push(s),a++,this.animation&&this.animation.addClip(s),i=s)}if(i){var l=i.onframe;i.onframe=function(t,e){l(t,e);for(var n=0;n<r._onframeList.length;n++)r._onframeList[n](t,e)}}return a||this._doneCallback(),this},stop:function(t){for(var e=this._clipList,n=this.animation,i=0;i<e.length;i++){var r=e[i];t&&r.onframe(this._target,1),n&&n.removeClip(r)}e.length=0},delay:function(t){return this._delay=t,this},done:function(t){return t&&this._doneList.push(t),this},getClips:function(){return this._clipList}};var Ae=1;"undefined"!=typeof window&&(Ae=Math.max(window.devicePixelRatio||1,1));var Le=Ae,Pe=function(){};function Oe(){this.animators=[]}var Ee=Pe;function Ne(t,e,n,i,r,a,o,s){L(i)?(a=r,r=i,i=0):T(r)?(a=r,r="linear",i=0):T(i)?(a=i,i=0):n=T(n)?(a=n,500):n||500,t.stopAnimation(),function t(e,n,i,r,a,o,s){var l={};var h=0;for(var u in r)r.hasOwnProperty(u)&&(null!=i[u]?O(r[u])&&!P(r[u])?t(e,n?n+"."+u:u,i[u],r[u],a,o,s):(s?(l[u]=i[u],Be(e,n,u,r[u])):l[u]=r[u],h++):null==r[u]||s||Be(e,n,u,r[u]));0<h&&e.animate(n,!1).when(null==a?500:a,l).delay(o||0)}(t,"",t,e,n,i,s);var l=t.animators.slice(),h=l.length;function u(){--h||a&&a()}h||a&&a();for(var c=0;c<l.length;c++)l[c].done(u).start(r,o)}function Be(t,e,n,i){if(e){var r={};r[e]={},r[e][n]=i,t.attr(r)}else t.attr(n,i)}Oe.prototype={constructor:Oe,animate:function(t,e){var n,i=!1,r=this,a=this.__zr;if(t){var o=t.split("."),s=r;i="shape"===o[0];for(var l=0,h=o.length;l<h;l++)s=s&&s[o[l]];s&&(n=s)}else n=r;if(n){var u=r.animators,c=new De(n,e);return c.during(function(t){r.dirty(i)}).done(function(){u.splice(v(u,c),1)}),u.push(c),a&&a.animation.addAnimator(c),c}Ee('Property "'+t+'" is not existed in element '+r.id)},stopAnimation:function(t){for(var e=this.animators,n=e.length,i=0;i<n;i++)e[i].stop(t);return e.length=0,this},animateTo:function(t,e,n,i,r,a){Ne(this,t,e,n,i,r,a)},animateFrom:function(t,e,n,i,r,a){Ne(this,t,e,n,i,r,a,!0)}};var ze=function(t){Xt.call(this,t),ft.call(this,t),Oe.call(this,t),this.id=t.id||n()};ze.prototype={type:"element",name:"",__zr:null,ignore:!1,clipPath:null,isGroup:!1,drift:function(t,e){switch(this.draggable){case"horizontal":e=0;break;case"vertical":t=0}var n=this.transform;(n=n||(this.transform=[1,0,0,1,0,0]))[4]+=t,n[5]+=e,this.decomposeTransform(),this.dirty(!1)},beforeUpdate:function(){},afterUpdate:function(){},update:function(){this.updateTransform()},traverse:function(t,e){},attrKV:function(t,e){if("position"===t||"scale"===t||"origin"===t){if(e){var n=this[t];(n=n||(this[t]=[]))[0]=e[0],n[1]=e[1]}}else this[t]=e},hide:function(){this.ignore=!0,this.__zr&&this.__zr.refresh()},show:function(){this.ignore=!1,this.__zr&&this.__zr.refresh()},attr:function(t,e){if("string"==typeof t)this.attrKV(t,e);else if(O(t))for(var n in t)t.hasOwnProperty(n)&&this.attrKV(n,t[n]);return this.dirty(!1),this},setClipPath:function(t){var e=this.__zr;e&&t.addSelfToZr(e),this.clipPath&&this.clipPath!==t&&this.removeClipPath(),(this.clipPath=t).__zr=e,(t.__clipTarget=this).dirty(!1)},removeClipPath:function(){var t=this.clipPath;t&&(t.__zr&&t.removeSelfFromZr(t.__zr),t.__zr=null,t.__clipTarget=null,this.clipPath=null,this.dirty(!1))},addSelfToZr:function(t){this.__zr=t;var e=this.animators;if(e)for(var n=0;n<e.length;n++)t.animation.addAnimator(e[n]);this.clipPath&&this.clipPath.addSelfToZr(t)},removeSelfFromZr:function(t){this.__zr=null;var e=this.animators;if(e)for(var n=0;n<e.length;n++)t.animation.removeAnimator(e[n]);this.clipPath&&this.clipPath.removeSelfFromZr(t)}},_(ze,Oe),_(ze,Xt),_(ze,ft);var Re,Fe,Ve,We,He=st,Ge=Math.min,Xe=Math.max;function qe(t,e,n,i){n<0&&(t+=n,n=-n),i<0&&(e+=i,i=-i),this.x=t,this.y=e,this.width=n,this.height=i}qe.prototype={constructor:qe,union:function(t){var e=Ge(t.x,this.x),n=Ge(t.y,this.y);this.width=Xe(t.x+t.width,this.x+this.width)-e,this.height=Xe(t.y+t.height,this.y+this.height)-n,this.x=e,this.y=n},applyTransform:(Re=[],Fe=[],Ve=[],We=[],function(t){if(t){Re[0]=Ve[0]=this.x,Re[1]=We[1]=this.y,Fe[0]=We[0]=this.x+this.width,Fe[1]=Ve[1]=this.y+this.height,He(Re,Re,t),He(Fe,Fe,t),He(Ve,Ve,t),He(We,We,t),this.x=Ge(Re[0],Fe[0],Ve[0],We[0]),this.y=Ge(Re[1],Fe[1],Ve[1],We[1]);var e=Xe(Re[0],Fe[0],Ve[0],We[0]),n=Xe(Re[1],Fe[1],Ve[1],We[1]);this.width=e-this.x,this.height=n-this.y}}),calculateTransform:function(t){var e=t.width/this.width,n=t.height/this.height,i=Nt();return Rt(i,i,[-this.x,-this.y]),Vt(i,i,[e,n]),Rt(i,i,[t.x,t.y]),i},intersect:function(t){if(!t)return!1;t instanceof qe||(t=qe.create(t));var e=this,n=e.x,i=e.x+e.width,r=e.y,a=e.y+e.height,o=t.x,s=t.x+t.width,l=t.y,h=t.y+t.height;return!(i<o||s<n||a<l||h<r)},contain:function(t,e){var n=this;return t>=n.x&&t<=n.x+n.width&&e>=n.y&&e<=n.y+n.height},clone:function(){return new qe(this.x,this.y,this.width,this.height)},copy:function(t){this.x=t.x,this.y=t.y,this.width=t.width,this.height=t.height},plain:function(){return{x:this.x,y:this.y,width:this.width,height:this.height}}},qe.create=function(t){return new qe(t.x,t.y,t.width,t.height)};var Ye=function(t){for(var e in t=t||{},ze.call(this,t),t)t.hasOwnProperty(e)&&(this[e]=t[e]);this._children=[],this.__storage=null,this.__dirty=!0};Ye.prototype={constructor:Ye,isGroup:!0,type:"group",silent:!1,children:function(){return this._children.slice()},childAt:function(t){return this._children[t]},childOfName:function(t){for(var e=this._children,n=0;n<e.length;n++)if(e[n].name===t)return e[n]},childCount:function(){return this._children.length},add:function(t){return t&&t!==this&&t.parent!==this&&(this._children.push(t),this._doAdd(t)),this},addBefore:function(t,e){if(t&&t!==this&&t.parent!==this&&e&&e.parent===this){var n=this._children,i=n.indexOf(e);0<=i&&(n.splice(i,0,t),this._doAdd(t))}return this},_doAdd:function(t){t.parent&&t.parent.remove(t);var e=(t.parent=this).__storage,n=this.__zr;e&&e!==t.__storage&&(e.addToStorage(t),t instanceof Ye&&t.addChildrenToStorage(e)),n&&n.refresh()},remove:function(t){var e=this.__zr,n=this.__storage,i=this._children,r=v(i,t);return r<0||(i.splice(r,1),t.parent=null,n&&(n.delFromStorage(t),t instanceof Ye&&t.delChildrenFromStorage(n)),e&&e.refresh()),this},removeAll:function(){var t,e,n=this._children,i=this.__storage;for(e=0;e<n.length;e++)t=n[e],i&&(i.delFromStorage(t),t instanceof Ye&&t.delChildrenFromStorage(i)),t.parent=null;return n.length=0,this},eachChild:function(t,e){for(var n=this._children,i=0;i<n.length;i++){var r=n[i];t.call(e,r,i)}return this},traverse:function(t,e){for(var n=0;n<this._children.length;n++){var i=this._children[n];t.call(e,i),"group"===i.type&&i.traverse(t,e)}return this},addChildrenToStorage:function(t){for(var e=0;e<this._children.length;e++){var n=this._children[e];t.addToStorage(n),n instanceof Ye&&n.addChildrenToStorage(t)}},delChildrenFromStorage:function(t){for(var e=0;e<this._children.length;e++){var n=this._children[e];t.delFromStorage(n),n instanceof Ye&&n.delChildrenFromStorage(t)}},dirty:function(){return this.__dirty=!0,this.__zr&&this.__zr.refresh(),this},getBoundingRect:function(t){for(var e=null,n=new qe(0,0,0,0),i=t||this._children,r=[],a=0;a<i.length;a++){var o=i[a];if(!o.ignore&&!o.invisible){var s=o.getBoundingRect(),l=o.getLocalTransform(r);l?(n.copy(s),n.applyTransform(l),(e=e||n.clone()).union(n)):(e=e||s.clone()).union(s)}}return e||n}},y(Ye,ze);var Ue=32,je=7;function Ze(t,e,n,i){var r=e+1;if(r===n)return 1;if(i(t[r++],t[e])<0){for(;r<n&&i(t[r],t[r-1])<0;)r++;!function(t,e,n){n--;for(;e<n;){var i=t[e];t[e++]=t[n],t[n--]=i}}(t,e,r)}else for(;r<n&&0<=i(t[r],t[r-1]);)r++;return r-e}function $e(t,e,n,i,r){for(i===e&&i++;i<n;i++){for(var a,o=t[i],s=e,l=i;s<l;)r(o,t[a=s+l>>>1])<0?l=a:s=1+a;var h=i-s;switch(h){case 3:t[s+3]=t[s+2];case 2:t[s+2]=t[s+1];case 1:t[s+1]=t[s];break;default:for(;0<h;)t[s+h]=t[s+h-1],h--}t[s]=o}}function Ke(t,e,n,i,r,a){var o=0,s=0,l=1;if(0<a(t,e[n+r])){for(s=i-r;l<s&&0<a(t,e[n+r+l]);)(l=1+((o=l)<<1))<=0&&(l=s);s<l&&(l=s),o+=r,l+=r}else{for(s=r+1;l<s&&a(t,e[n+r-l])<=0;)(l=1+((o=l)<<1))<=0&&(l=s);s<l&&(l=s);var h=o;o=r-l,l=r-h}for(o++;o<l;){var u=o+(l-o>>>1);0<a(t,e[n+u])?o=u+1:l=u}return l}function Qe(t,e,n,i,r,a){var o=0,s=0,l=1;if(a(t,e[n+r])<0){for(s=r+1;l<s&&a(t,e[n+r-l])<0;)(l=1+((o=l)<<1))<=0&&(l=s);s<l&&(l=s);var h=o;o=r-l,l=r-h}else{for(s=i-r;l<s&&0<=a(t,e[n+r+l]);)(l=1+((o=l)<<1))<=0&&(l=s);s<l&&(l=s),o+=r,l+=r}for(o++;o<l;){var u=o+(l-o>>>1);a(t,e[n+u])<0?l=u:o=u+1}return l}function Je(p,g){var o,s,v=je,l=0,m=[];function e(t){var e=o[t],n=s[t],i=o[t+1],r=s[t+1];s[t]=n+r,t===l-3&&(o[t+1]=o[t+2],s[t+1]=s[t+2]),l--;var a=Qe(p[i],p,e,n,0,g);e+=a,0!==(n-=a)&&0!==(r=Ke(p[e+n-1],p,i,r,r-1,g))&&(n<=r?function(t,e,n,i){var r=0;for(r=0;r<e;r++)m[r]=p[t+r];var a=0,o=n,s=t;if(p[s++]=p[o++],0==--i){for(r=0;r<e;r++)p[s+r]=m[a+r];return}if(1===e){for(r=0;r<i;r++)p[s+r]=p[o+r];return p[s+i]=m[a]}var l,h,u,c=v;for(;;){h=l=0,u=!1;do{if(g(p[o],m[a])<0){if(p[s++]=p[o++],h++,(l=0)==--i){u=!0;break}}else if(p[s++]=m[a++],l++,h=0,1==--e){u=!0;break}}while((l|h)<c);if(u)break;do{if(0!==(l=Qe(p[o],m,a,e,0,g))){for(r=0;r<l;r++)p[s+r]=m[a+r];if(s+=l,a+=l,(e-=l)<=1){u=!0;break}}if(p[s++]=p[o++],0==--i){u=!0;break}if(0!==(h=Ke(m[a],p,o,i,0,g))){for(r=0;r<h;r++)p[s+r]=p[o+r];if(s+=h,o+=h,0===(i-=h)){u=!0;break}}if(p[s++]=m[a++],1==--e){u=!0;break}c--}while(je<=l||je<=h);if(u)break;c<0&&(c=0),c+=2}if((v=c)<1&&(v=1),1===e){for(r=0;r<i;r++)p[s+r]=p[o+r];p[s+i]=m[a]}else{if(0===e)throw new Error;for(r=0;r<e;r++)p[s+r]=m[a+r]}}(e,n,i,r):function(t,e,n,i){var r=0;for(r=0;r<i;r++)m[r]=p[n+r];var a=t+e-1,o=i-1,s=n+i-1,l=0,h=0;if(p[s--]=p[a--],0==--e){for(l=s-(i-1),r=0;r<i;r++)p[l+r]=m[r];return}if(1===i){for(h=(s-=e)+1,l=(a-=e)+1,r=e-1;0<=r;r--)p[h+r]=p[l+r];return p[s]=m[o]}var u=v;for(;;){var c=0,d=0,f=!1;do{if(g(m[o],p[a])<0){if(p[s--]=p[a--],c++,(d=0)==--e){f=!0;break}}else if(p[s--]=m[o--],d++,c=0,1==--i){f=!0;break}}while((c|d)<u);if(f)break;do{if(0!==(c=e-Qe(m[o],p,t,e,e-1,g))){for(e-=c,h=(s-=c)+1,l=(a-=c)+1,r=c-1;0<=r;r--)p[h+r]=p[l+r];if(0===e){f=!0;break}}if(p[s--]=m[o--],1==--i){f=!0;break}if(0!==(d=i-Ke(p[a],m,0,i,i-1,g))){for(i-=d,h=(s-=d)+1,l=(o-=d)+1,r=0;r<d;r++)p[h+r]=m[l+r];if(i<=1){f=!0;break}}if(p[s--]=p[a--],0==--e){f=!0;break}u--}while(je<=c||je<=d);if(f)break;u<0&&(u=0),u+=2}(v=u)<1&&(v=1);if(1===i){for(h=(s-=e)+1,l=(a-=e)+1,r=e-1;0<=r;r--)p[h+r]=p[l+r];p[s]=m[o]}else{if(0===i)throw new Error;for(l=s-(i-1),r=0;r<i;r++)p[l+r]=m[r]}}(e,n,i,r))}o=[],s=[],this.mergeRuns=function(){for(;1<l;){var t=l-2;if(1<=t&&s[t-1]<=s[t]+s[t+1]||2<=t&&s[t-2]<=s[t]+s[t-1])s[t-1]<s[t+1]&&t--;else if(s[t]>s[t+1])break;e(t)}},this.forceMergeRuns=function(){for(;1<l;){var t=l-2;0<t&&s[t-1]<s[t+1]&&t--,e(t)}},this.pushRun=function(t,e){o[l]=t,s[l]=e,l+=1}}function tn(t,e,n,i){n=n||0;var r=(i=i||t.length)-n;if(!(r<2)){var a=0;if(r<Ue)$e(t,n,i,n+(a=Ze(t,n,i,e)),e);else{var o=new Je(t,e),s=function(t){for(var e=0;Ue<=t;)e|=1&t,t>>=1;return t+e}(r);do{if((a=Ze(t,n,i,e))<s){var l=r;s<l&&(l=s),$e(t,n,n+l,n+a,e),a=l}o.pushRun(n,a),o.mergeRuns(),r-=a,n+=a}while(0!==r);o.forceMergeRuns()}}}function en(t,e){return t.zlevel===e.zlevel?t.z===e.z?t.z2-e.z2:t.z-e.z:t.zlevel-e.zlevel}function nn(){this._roots=[],this._displayList=[],this._displayListLen=0}nn.prototype={constructor:nn,traverse:function(t,e){for(var n=0;n<this._roots.length;n++)this._roots[n].traverse(t,e)},getDisplayList:function(t,e){return e=e||!1,t&&this.updateDisplayList(e),this._displayList},updateDisplayList:function(t){this._displayListLen=0;for(var e=this._roots,n=this._displayList,i=0,r=e.length;i<r;i++)this._updateAndAddDisplayable(e[i],null,t);n.length=this._displayListLen,m.canvasSupported&&tn(n,en)},_updateAndAddDisplayable:function(t,e,n){if(!t.ignore||n){t.beforeUpdate(),t.__dirty&&t.update(),t.afterUpdate();var i=t.clipPath;if(i){e=e?e.slice():[];for(var r=i,a=t;r;)r.parent=a,r.updateTransform(),e.push(r),r=(a=r).clipPath}if(t.isGroup){for(var o=t._children,s=0;s<o.length;s++){var l=o[s];t.__dirty&&(l.__dirty=!0),this._updateAndAddDisplayable(l,e,n)}t.__dirty=!1}else t.__clipPaths=e,this._displayList[this._displayListLen++]=t}},addRoot:function(t){t.__storage!==this&&(t instanceof Ye&&t.addChildrenToStorage(this),this.addToStorage(t),this._roots.push(t))},delRoot:function(t){if(null==t){for(var e=0;e<this._roots.length;e++){var n=this._roots[e];n instanceof Ye&&n.delChildrenFromStorage(this)}return this._roots=[],this._displayList=[],void(this._displayListLen=0)}if(t instanceof Array){e=0;for(var i=t.length;e<i;e++)this.delRoot(t[e])}else{var r=v(this._roots,t);0<=r&&(this.delFromStorage(t),this._roots.splice(r,1),t instanceof Ye&&t.delChildrenFromStorage(this))}},addToStorage:function(t){return t&&(t.__storage=this,t.dirty(!1)),this},delFromStorage:function(t){return t&&(t.__storage=null),this},dispose:function(){this._renderList=this._roots=null},displayableSortFunc:en};var rn={shadowBlur:1,shadowOffsetX:1,shadowOffsetY:1,textShadowBlur:1,textShadowOffsetX:1,textShadowOffsetY:1,textBoxShadowBlur:1,textBoxShadowOffsetX:1,textBoxShadowOffsetY:1},an=function(t,e,n){return rn.hasOwnProperty(e)?n*t.dpr:n},on={NONE:0,STYLE_BIND:1,PLAIN_TEXT:2},sn=9,ln=[["shadowBlur",0],["shadowOffsetX",0],["shadowOffsetY",0],["shadowColor","#000"],["lineCap","butt"],["lineJoin","miter"],["miterLimit",10]],hn=function(t){this.extendFrom(t,!1)};function un(t,e,n){var i=null==e.x?0:e.x,r=null==e.x2?1:e.x2,a=null==e.y?0:e.y,o=null==e.y2?0:e.y2;return e.global||(i=i*n.width+n.x,r=r*n.width+n.x,a=a*n.height+n.y,o=o*n.height+n.y),i=isNaN(i)?0:i,r=isNaN(r)?1:r,a=isNaN(a)?0:a,o=isNaN(o)?0:o,t.createLinearGradient(i,a,r,o)}function cn(t,e,n){var i=n.width,r=n.height,a=Math.min(i,r),o=null==e.x?.5:e.x,s=null==e.y?.5:e.y,l=null==e.r?.5:e.r;return e.global||(o=o*i+n.x,s=s*r+n.y,l*=a),t.createRadialGradient(o,s,0,o,s,l)}hn.prototype={constructor:hn,fill:"#000",stroke:null,opacity:1,fillOpacity:null,strokeOpacity:null,lineDash:null,lineDashOffset:0,shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0,lineWidth:1,strokeNoScale:!1,text:null,font:null,textFont:null,fontStyle:null,fontWeight:null,fontSize:null,fontFamily:null,textTag:null,textFill:"#000",textStroke:null,textWidth:null,textHeight:null,textStrokeWidth:0,textLineHeight:null,textPosition:"inside",textRect:null,textOffset:null,textAlign:null,textVerticalAlign:null,textDistance:5,textShadowColor:"transparent",textShadowBlur:0,textShadowOffsetX:0,textShadowOffsetY:0,textBoxShadowColor:"transparent",textBoxShadowBlur:0,textBoxShadowOffsetX:0,textBoxShadowOffsetY:0,transformText:!1,textRotation:0,textOrigin:null,textBackgroundColor:null,textBorderColor:null,textBorderWidth:0,textBorderRadius:0,textPadding:null,rich:null,truncate:null,blend:null,bind:function(t,e,n){var i=this,r=n&&n.style,a=!r||t.__attrCachedBy!==on.STYLE_BIND;t.__attrCachedBy=on.STYLE_BIND;for(var o=0;o<ln.length;o++){var s=ln[o],l=s[0];!a&&i[l]===r[l]||(t[l]=an(t,l,i[l]||s[1]))}if(!a&&i.fill===r.fill||(t.fillStyle=i.fill),!a&&i.stroke===r.stroke||(t.strokeStyle=i.stroke),!a&&i.opacity===r.opacity||(t.globalAlpha=null==i.opacity?1:i.opacity),!a&&i.blend===r.blend||(t.globalCompositeOperation=i.blend||"source-over"),this.hasStroke()){var h=i.lineWidth;t.lineWidth=h/(this.strokeNoScale&&e&&e.getLineScale?e.getLineScale():1)}},hasFill:function(){var t=this.fill;return null!=t&&"none"!==t},hasStroke:function(){var t=this.stroke;return null!=t&&"none"!==t&&0<this.lineWidth},extendFrom:function(t,e){if(t)for(var n in t)!t.hasOwnProperty(n)||!0!==e&&(!1===e?this.hasOwnProperty(n):null==t[n])||(this[n]=t[n])},set:function(t,e){"string"==typeof t?this[t]=e:this.extendFrom(t,!0)},clone:function(){var t=new this.constructor;return t.extendFrom(this,!0),t},getGradient:function(t,e,n){for(var i=("radial"===e.type?cn:un)(t,e,n),r=e.colorStops,a=0;a<r.length;a++)i.addColorStop(r[a].offset,r[a].color);return i}};for(var dn=hn.prototype,fn=0;fn<ln.length;fn++){var pn=ln[fn];pn[0]in dn||(dn[pn[0]]=pn[1])}hn.getGradient=dn.getGradient;function gn(t,e){this.image=t,this.repeat=e,this.type="pattern"}function vn(){return!1}function mn(t,e,n){var i=p(),r=e.getWidth(),a=e.getHeight(),o=i.style;return o&&(o.position="absolute",o.left=0,o.top=0,o.width=r+"px",o.height=a+"px",i.setAttribute("data-zr-dom-id",t)),i.width=r*n,i.height=a*n,i}function yn(t,e,n){var i;n=n||Le,"string"==typeof t?i=mn(t,e,n):O(t)&&(t=(i=t).id),this.id=t;var r=(this.dom=i).style;r&&(i.onselectstart=vn,r["-webkit-user-select"]="none",r["user-select"]="none",r["-webkit-touch-callout"]="none",r["-webkit-tap-highlight-color"]="rgba(0,0,0,0)",r.padding=0,r.margin=0,r["border-width"]=0),this.domBack=null,this.ctxBack=null,this.painter=e,this.config=null,this.clearColor=0,this.motionBlur=!1,this.lastFrameAlpha=.7,this.dpr=n}yn.prototype={constructor:yn,__dirty:!0,__used:!(gn.prototype.getCanvasPattern=function(t){return t.createPattern(this.image,this.repeat||"repeat")}),__drawIndex:0,__startIndex:0,__endIndex:0,incremental:!1,getElementCount:function(){return this.__endIndex-this.__startIndex},initContext:function(){this.ctx=this.dom.getContext("2d"),this.ctx.dpr=this.dpr},createBackBuffer:function(){var t=this.dpr;this.domBack=mn("back-"+this.id,this.painter,t),this.ctxBack=this.domBack.getContext("2d"),1!==t&&this.ctxBack.scale(t,t)},resize:function(t,e){var n=this.dpr,i=this.dom,r=i.style,a=this.domBack;r&&(r.width=t+"px",r.height=e+"px"),i.width=t*n,i.height=e*n,a&&(a.width=t*n,a.height=e*n,1!==n&&this.ctxBack.scale(n,n))},clear:function(t,e){var n,i=this.dom,r=this.ctx,a=i.width,o=i.height,s=(e=e||this.clearColor,this.motionBlur&&!t),l=this.lastFrameAlpha,h=this.dpr;s&&(this.domBack||this.createBackBuffer(),this.ctxBack.globalCompositeOperation="copy",this.ctxBack.drawImage(i,0,0,a/h,o/h)),r.clearRect(0,0,a,o),e&&"transparent"!==e&&(e.colorStops?(n=e.__canvasGradient||hn.getGradient(r,e,{x:0,y:0,width:a,height:o}),e.__canvasGradient=n):e.image&&(n=gn.prototype.getCanvasPattern.call(e,r)),r.save(),r.fillStyle=n||e,r.fillRect(0,0,a,o),r.restore());if(s){var u=this.domBack;r.save(),r.globalAlpha=l,r.drawImage(u,0,0,a,o),r.restore()}}};var _n="undefined"!=typeof window&&(window.requestAnimationFrame&&window.requestAnimationFrame.bind(window)||window.msRequestAnimationFrame&&window.msRequestAnimationFrame.bind(window)||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame)||function(t){setTimeout(t,16)},xn=new Jt(50);function wn(t){if("string"!=typeof t)return t;var e=xn.get(t);return e&&e.image}function bn(t,e,n,i,r){if(t){if("string"!=typeof t)return t;if(e&&e.__zrImageSrc===t||!n)return e;var a=xn.get(t),o={hostEl:n,cb:i,cbPayload:r};return a?Mn(e=a.image)||a.pending.push(o):((e=new Image).onload=e.onerror=Sn,xn.put(t,e.__cachedImgObj={image:e,pending:[o]}),e.src=e.__zrImageSrc=t),e}return e}function Sn(){var t=this.__cachedImgObj;this.onload=this.onerror=this.__cachedImgObj=null;for(var e=0;e<t.pending.length;e++){var n=t.pending[e],i=n.cb;i&&i(this,n.cbPayload),n.hostEl.dirty()}t.pending.length=0}function Mn(t){return t&&t.width&&t.height}var In={},Tn=0,Cn=5e3,kn=/\{([a-zA-Z0-9_]+)\|([^}]*)\}/g,Dn="12px sans-serif",An={};function Ln(t,e){var n=t+":"+(e=e||Dn);if(In[n])return In[n];for(var i,r,a=(t+"").split("\n"),o=0,s=0,l=a.length;s<l;s++)o=Math.max((i=a[s],r=e,An.measureText(i,r)).width,o);return Cn<Tn&&(Tn=0,In={}),Tn++,In[n]=o}function Pn(t,e,n,i,r,a,o,s){return o?function(t,e,n,i,r,a,o,s){var l=Hn(t,{rich:o,truncate:s,font:e,textAlign:n,textPadding:r,textLineHeight:a}),h=l.outerWidth,u=l.outerHeight,c=On(0,h,n),d=En(0,u,i);return new qe(c,d,h,u)}(t,e,n,i,r,a,o,s):function(t,e,n,i,r,a,o){var s=Wn(t,e,r,a,o),l=Ln(t,e);r&&(l+=r[1]+r[3]);var h=s.outerHeight,u=On(0,l,n),c=En(0,h,i),d=new qe(u,c,l,h);return d.lineHeight=s.lineHeight,d}(t,e,n,i,r,a,s)}function On(t,e,n){return"right"===n?t-=e:"center"===n&&(t-=e/2),t}function En(t,e,n){return"middle"===n?t-=e/2:"bottom"===n&&(t-=e),t}function Nn(t,e,n){var i=e.textPosition,r=e.textDistance,a=n.x,o=n.y,s=n.height,l=n.width,h=s/2,u="left",c="top";switch(i){case"left":a-=r,o+=h,u="right",c="middle";break;case"right":a+=r+l,o+=h,c="middle";break;case"top":a+=l/2,o-=r,u="center",c="bottom";break;case"bottom":a+=l/2,o+=s+r,u="center";break;case"inside":a+=l/2,o+=h,u="center",c="middle";break;case"insideLeft":a+=r,o+=h,c="middle";break;case"insideRight":a+=l-r,o+=h,u="right",c="middle";break;case"insideTop":a+=l/2,o+=r,u="center";break;case"insideBottom":a+=l/2,o+=s-r,u="center",c="bottom";break;case"insideTopLeft":a+=r,o+=r;break;case"insideTopRight":a+=l-r,o+=r,u="right";break;case"insideBottomLeft":a+=r,o+=s-r,c="bottom";break;case"insideBottomRight":a+=l-r,o+=s-r,u="right",c="bottom"}return(t=t||{}).x=a,t.y=o,t.textAlign=u,t.textVerticalAlign=c,t}function Bn(t,e,n,i,r){if(!e)return"";var a=(t+"").split("\n");r=zn(e,n,i,r);for(var o=0,s=a.length;o<s;o++)a[o]=Rn(a[o],r);return a.join("\n")}function zn(t,e,n,i){(i=S({},i)).font=e;n=F(n,"...");i.maxIterations=F(i.maxIterations,2);var r=i.minChar=F(i.minChar,0);i.cnCharWidth=Ln("国",e);var a=i.ascCharWidth=Ln("a",e);i.placeholder=F(i.placeholder,"");for(var o=t=Math.max(0,t-1),s=0;s<r&&a<=o;s++)o-=a;var l=Ln(n,e);return o<l&&(n="",l=0),o=t-l,i.ellipsis=n,i.ellipsisWidth=l,i.contentWidth=o,i.containerWidth=t,i}function Rn(t,e){var n=e.containerWidth,i=e.font,r=e.contentWidth;if(!n)return"";var a=Ln(t,i);if(a<=n)return t;for(var o=0;;o++){if(a<=r||o>=e.maxIterations){t+=e.ellipsis;break}var s=0===o?Fn(t,r,e.ascCharWidth,e.cnCharWidth):0<a?Math.floor(t.length*r/a):0;a=Ln(t=t.substr(0,s),i)}return""===t&&(t=e.placeholder),t}function Fn(t,e,n,i){for(var r=0,a=0,o=t.length;a<o&&r<e;a++){var s=t.charCodeAt(a);r+=0<=s&&s<=127?n:i}return a}function Vn(t){return Ln("国",t)}function Wn(t,e,n,i,r){null!=t&&(t+="");var a=F(i,Vn(e)),o=t?t.split("\n"):[],s=o.length*a,l=s;if(n&&(l+=n[0]+n[2]),t&&r){var h=r.outerHeight,u=r.outerWidth;if(null!=h&&h<l)t="",o=[];else if(null!=u)for(var c=zn(u-(n?n[1]+n[3]:0),e,r.ellipsis,{minChar:r.minChar,placeholder:r.placeholder}),d=0,f=o.length;d<f;d++)o[d]=Rn(o[d],c)}return{lines:o,height:s,outerHeight:l,lineHeight:a}}function Hn(t,e){var n={lines:[],width:0,height:0};if(null!=t&&(t+=""),!t)return n;for(var i,r=kn.lastIndex=0;null!=(i=kn.exec(t));){var a=i.index;r<a&&Gn(n,t.substring(r,a)),Gn(n,i[2],i[1]),r=kn.lastIndex}r<t.length&&Gn(n,t.substring(r,t.length));var o=n.lines,s=0,l=0,h=[],u=e.textPadding,c=e.truncate,d=c&&c.outerWidth,f=c&&c.outerHeight;u&&(null!=d&&(d-=u[1]+u[3]),null!=f&&(f-=u[0]+u[2]));for(var p=0;p<o.length;p++){for(var g=o[p],v=0,m=0,y=0;y<g.tokens.length;y++){var _=(D=g.tokens[y]).styleName&&e.rich[D.styleName]||{},x=D.textPadding=_.textPadding,w=D.font=_.font||e.font,b=D.textHeight=F(_.textHeight,Vn(w));if(x&&(b+=x[0]+x[2]),D.height=b,D.lineHeight=V(_.textLineHeight,e.textLineHeight,b),D.textAlign=_&&_.textAlign||e.textAlign,D.textVerticalAlign=_&&_.textVerticalAlign||"middle",null!=f&&s+D.lineHeight>f)return{lines:[],width:0,height:0};D.textWidth=Ln(D.text,w);var S=_.textWidth,M=null==S||"auto"===S;if("string"==typeof S&&"%"===S.charAt(S.length-1))D.percentWidth=S,h.push(D),S=0;else{if(M){S=D.textWidth;var I=_.textBackgroundColor,T=I&&I.image;T&&Mn(T=wn(T))&&(S=Math.max(S,T.width*b/T.height))}var C=x?x[1]+x[3]:0;S+=C;var k=null!=d?d-m:null;null!=k&&k<S&&(!M||k<C?(D.text="",D.textWidth=S=0):(D.text=Bn(D.text,k-C,w,c.ellipsis,{minChar:c.minChar}),D.textWidth=Ln(D.text,w),S=D.textWidth+C))}m+=D.width=S,_&&(v=Math.max(v,D.lineHeight))}g.width=m,s+=g.lineHeight=v,l=Math.max(l,m)}n.outerWidth=n.width=F(e.textWidth,l),n.outerHeight=n.height=F(e.textHeight,s),u&&(n.outerWidth+=u[1]+u[3],n.outerHeight+=u[0]+u[2]);for(p=0;p<h.length;p++){var D,A=(D=h[p]).percentWidth;D.width=parseInt(A,10)/100*l}return n}function Gn(t,e,n){for(var i=""===e,r=e.split("\n"),a=t.lines,o=0;o<r.length;o++){var s=r[o],l={styleName:n,text:s,isLineHolder:!s&&!i};if(o)a.push({tokens:[l]});else{var h=(a[a.length-1]||(a[0]={tokens:[]})).tokens,u=h.length;1===u&&h[0].isLineHolder?h[0]=l:!s&&u&&!i||h.push(l)}}}function Xn(t,e){var n,i,r,a,o,s=e.x,l=e.y,h=e.width,u=e.height,c=e.r;h<0&&(s+=h,h=-h),u<0&&(l+=u,u=-u),"number"==typeof c?n=i=r=a=c:c instanceof Array?1===c.length?n=i=r=a=c[0]:2===c.length?(n=r=c[0],i=a=c[1]):3===c.length?(n=c[0],i=a=c[1],r=c[2]):(n=c[0],i=c[1],r=c[2],a=c[3]):n=i=r=a=0,h<n+i&&(n*=h/(o=n+i),i*=h/o),h<r+a&&(r*=h/(o=r+a),a*=h/o),u<i+r&&(i*=u/(o=i+r),r*=u/o),u<n+a&&(n*=u/(o=n+a),a*=u/o),t.moveTo(s+n,l),t.lineTo(s+h-i,l),0!==i&&t.arc(s+h-i,l+i,i,-Math.PI/2,0),t.lineTo(s+h,l+u-r),0!==r&&t.arc(s+h-r,l+u-r,r,0,Math.PI/2),t.lineTo(s+a,l+u),0!==a&&t.arc(s+a,l+u-a,a,Math.PI/2,Math.PI),t.lineTo(s,l+n),0!==n&&t.arc(s+n,l+n,n,Math.PI,1.5*Math.PI)}An.measureText=function(t,e){var n=g=g||p().getContext("2d");return n.font=e||Dn,n.measureText(t)};var qn=Dn,Yn={left:1,right:1,center:1},Un={top:1,bottom:1,middle:1},jn=[["textShadowBlur","shadowBlur",0],["textShadowOffsetX","shadowOffsetX",0],["textShadowOffsetY","shadowOffsetY",0],["textShadowColor","shadowColor","transparent"]],Zn={},$n={};function Kn(t){return Qn(t),k(t.rich,Qn),t}function Qn(t){if(t){t.font=function(t){var e=(t.fontSize||t.fontFamily)&&[t.fontStyle,t.fontWeight,(t.fontSize||12)+"px",t.fontFamily||"sans-serif"].join(" ");return e&&X(e)||t.textFont||t.font}(t);var e=t.textAlign;"middle"===e&&(e="center"),t.textAlign=null==e||Yn[e]?e:"left";var n=t.textVerticalAlign||t.textBaseline;"center"===n&&(n="middle"),t.textVerticalAlign=null==n||Un[n]?n:"top",t.textPadding&&(t.textPadding=H(t.textPadding))}}function Jn(t,e,n,i,r,a){i.rich?function(t,e,n,i,r,a){a!==sn&&(e.__attrCachedBy=on.NONE);var o=t.__textCotentBlock;o&&!t.__dirtyText||(o=t.__textCotentBlock=Hn(n,i));!function(t,e,n,i,r){var a=n.width,o=n.outerWidth,s=n.outerHeight,l=i.textPadding,h=ai($n,t,i,r),u=h.baseX,c=h.baseY,d=h.textAlign,f=h.textVerticalAlign;ti(e,i,r,u,c);var p=On(u,o,d),g=En(c,s,f),v=p,m=g;l&&(v+=l[3],m+=l[0]);var y=v+a;ni(i)&&ii(t,e,i,p,g,o,s);for(var _=0;_<n.lines.length;_++){for(var x,w=n.lines[_],b=w.tokens,S=b.length,M=w.lineHeight,I=w.width,T=0,C=v,k=y,D=S-1;T<S&&(!(x=b[T]).textAlign||"left"===x.textAlign);)ei(t,e,x,i,M,m,C,"left"),I-=x.width,C+=x.width,T++;for(;0<=D&&"right"===(x=b[D]).textAlign;)ei(t,e,x,i,M,m,k,"right"),I-=x.width,k-=x.width,D--;for(C+=(a-(C-v)-(y-k)-I)/2;T<=D;)x=b[T],ei(t,e,x,i,M,m,C+x.width/2,"center"),C+=x.width,T++;m+=M}}(t,e,o,i,r)}(t,e,n,i,r,a):function(t,e,n,i,r,a){var o,s=ni(i),l=!1,h=e.__attrCachedBy===on.PLAIN_TEXT;a!==sn?(a&&(o=a.style,l=!s&&h&&o),e.__attrCachedBy=s?on.NONE:on.PLAIN_TEXT):h&&(e.__attrCachedBy=on.NONE);var u=i.font||qn;l&&u===(o.font||qn)||(e.font=u);var c=t.__computedFont;t.__styleFont!==u&&(t.__styleFont=u,c=t.__computedFont=e.font);var d=i.textPadding,f=i.textLineHeight,p=t.__textCotentBlock;p&&!t.__dirtyText||(p=t.__textCotentBlock=Wn(n,c,d,f,i.truncate));var g=p.outerHeight,v=p.lines,m=p.lineHeight,y=ai($n,t,i,r),_=y.baseX,x=y.baseY,w=y.textAlign||"left",b=y.textVerticalAlign;ti(e,i,r,_,x);var S=En(x,g,b),M=_,I=S;if(s||d){var T=Ln(n,c);d&&(T+=d[1]+d[3]);var C=On(_,T,w);s&&ii(t,e,i,C,S,T,g),d&&(M=ui(_,w,d),I+=d[0])}e.textAlign=w,e.textBaseline="middle",e.globalAlpha=i.opacity||1;for(var k=0;k<jn.length;k++){var D=jn[k],A=D[0],L=D[1],P=i[A];l&&P===o[A]||(e[L]=an(e,L,P||D[2]))}I+=m/2;var O=i.textStrokeWidth,E=l?o.textStrokeWidth:null,N=!l||O!==E,B=!l||N||i.textStroke!==o.textStroke,z=si(i.textStroke,O),R=li(i.textFill);z&&(N&&(e.lineWidth=O),B&&(e.strokeStyle=z));R&&(l&&i.textFill===o.textFill||(e.fillStyle=R));if(1===v.length)z&&e.strokeText(v[0],M,I),R&&e.fillText(v[0],M,I);else for(k=0;k<v.length;k++)z&&e.strokeText(v[k],M,I),R&&e.fillText(v[k],M,I),I+=m}(t,e,n,i,r,a)}function ti(t,e,n,i,r){if(n&&e.textRotation){var a=e.textOrigin;"center"===a?(i=n.width/2+n.x,r=n.height/2+n.y):a&&(i=a[0]+n.x,r=a[1]+n.y),t.translate(i,r),t.rotate(-e.textRotation),t.translate(-i,-r)}}function ei(t,e,n,i,r,a,o,s){var l=i.rich[n.styleName]||{};l.text=n.text;var h=n.textVerticalAlign,u=a+r/2;"top"===h?u=a+n.height/2:"bottom"===h&&(u=a+r-n.height/2),!n.isLineHolder&&ni(l)&&ii(t,e,l,"right"===s?o-n.width:"center"===s?o-n.width/2:o,u-n.height/2,n.width,n.height);var c=n.textPadding;c&&(o=ui(o,s,c),u-=n.height/2-c[2]-n.textHeight/2),oi(e,"shadowBlur",V(l.textShadowBlur,i.textShadowBlur,0)),oi(e,"shadowColor",l.textShadowColor||i.textShadowColor||"transparent"),oi(e,"shadowOffsetX",V(l.textShadowOffsetX,i.textShadowOffsetX,0)),oi(e,"shadowOffsetY",V(l.textShadowOffsetY,i.textShadowOffsetY,0)),oi(e,"textAlign",s),oi(e,"textBaseline","middle"),oi(e,"font",n.font||qn);var d=si(l.textStroke||i.textStroke,p),f=li(l.textFill||i.textFill),p=F(l.textStrokeWidth,i.textStrokeWidth);d&&(oi(e,"lineWidth",p),oi(e,"strokeStyle",d),e.strokeText(n.text,o,u)),f&&(oi(e,"fillStyle",f),e.fillText(n.text,o,u))}function ni(t){return!!(t.textBackgroundColor||t.textBorderWidth&&t.textBorderColor)}function ii(t,e,n,i,r,a,o){var s=n.textBackgroundColor,l=n.textBorderWidth,h=n.textBorderColor,u=L(s);if(oi(e,"shadowBlur",n.textBoxShadowBlur||0),oi(e,"shadowColor",n.textBoxShadowColor||"transparent"),oi(e,"shadowOffsetX",n.textBoxShadowOffsetX||0),oi(e,"shadowOffsetY",n.textBoxShadowOffsetY||0),u||l&&h){e.beginPath();var c=n.textBorderRadius;c?Xn(e,{x:i,y:r,width:a,height:o,r:c}):e.rect(i,r,a,o),e.closePath()}if(u)if(oi(e,"fillStyle",s),null!=n.fillOpacity){var d=e.globalAlpha;e.globalAlpha=n.fillOpacity*n.opacity,e.fill(),e.globalAlpha=d}else e.fill();else if(O(s)){var f=s.image;(f=bn(f,null,t,ri,s))&&Mn(f)&&e.drawImage(f,i,r,a,o)}if(l&&h)if(oi(e,"lineWidth",l),oi(e,"strokeStyle",h),null!=n.strokeOpacity){d=e.globalAlpha;e.globalAlpha=n.strokeOpacity*n.opacity,e.stroke(),e.globalAlpha=d}else e.stroke()}function ri(t,e){e.image=t}function ai(t,e,n,i){var r=n.x||0,a=n.y||0,o=n.textAlign,s=n.textVerticalAlign;if(i){var l=n.textPosition;if(l instanceof Array)r=i.x+hi(l[0],i.width),a=i.y+hi(l[1],i.height);else{var h=e&&e.calculateTextPosition?e.calculateTextPosition(Zn,n,i):Nn(Zn,n,i);r=h.x,a=h.y,o=o||h.textAlign,s=s||h.textVerticalAlign}var u=n.textOffset;u&&(r+=u[0],a+=u[1])}return(t=t||{}).baseX=r,t.baseY=a,t.textAlign=o,t.textVerticalAlign=s,t}function oi(t,e,n){return t[e]=an(t,e,n),t[e]}function si(t,e){return null==t||e<=0||"transparent"===t||"none"===t?null:t.image||t.colorStops?"#000":t}function li(t){return null==t||"none"===t?null:t.image||t.colorStops?"#000":t}function hi(t,e){return"string"==typeof t?0<=t.lastIndexOf("%")?parseFloat(t)/100*e:parseFloat(t):t}function ui(t,e,n){return"right"===e?t-n[1]:"center"===e?t+n[3]/2-n[1]/2:t+n[3]}function ci(t,e){return null!=t&&(t||e.textBackgroundColor||e.textBorderWidth&&e.textBorderColor||e.textPadding)}function di(){}var fi=new qe;function pi(t){for(var e in t=t||{},ze.call(this,t),t)t.hasOwnProperty(e)&&"style"!==e&&(this[e]=t[e]);this.style=new hn(t.style,this),this._rect=null,this.__clipPaths=null}function gi(t){pi.call(this,t)}pi.prototype={constructor:pi,type:"displayable",__dirty:!0,invisible:!(di.prototype={constructor:di,drawRectText:function(t,e){var n=this.style;e=n.textRect||e,this.__dirty&&Kn(n);var i=n.text;if(null!=i&&(i+=""),ci(i,n)){t.save();var r=this.transform;n.transformText?this.setTransform(t):r&&(fi.copy(e),fi.applyTransform(r),e=fi),Jn(this,t,i,n,e,sn),t.restore()}}}),z:0,z2:0,zlevel:0,draggable:!1,dragging:!1,silent:!1,culling:!1,cursor:"pointer",rectHover:!1,progressive:!1,incremental:!1,globalScaleRatio:1,beforeBrush:function(t){},afterBrush:function(t){},brush:function(t,e){},getBoundingRect:function(){},contain:function(t,e){return this.rectContain(t,e)},traverse:function(t,e){t.call(e,this)},rectContain:function(t,e){var n=this.transformCoordToLocal(t,e);return this.getBoundingRect().contain(n[0],n[1])},dirty:function(){this.__dirty=this.__dirtyText=!0,this._rect=null,this.__zr&&this.__zr.refresh()},animateStyle:function(t){return this.animate("style",t)},attrKV:function(t,e){"style"!==t?ze.prototype.attrKV.call(this,t,e):this.style.set(e)},setStyle:function(t,e){return this.style.set(t,e),this.dirty(!1),this},useStyle:function(t){return this.style=new hn(t,this),this.dirty(!1),this},calculateTextPosition:null},y(pi,ze),_(pi,di),gi.prototype={constructor:gi,type:"image",brush:function(t,e){var n=this.style,i=n.image;n.bind(t,this,e);var r=this._image=bn(i,this._image,this,this.onload);if(r&&Mn(r)){var a=n.x||0,o=n.y||0,s=n.width,l=n.height,h=r.width/r.height;if(null==s&&null!=l?s=l*h:null==l&&null!=s?l=s/h:null==s&&null==l&&(s=r.width,l=r.height),this.setTransform(t),n.sWidth&&n.sHeight){var u=n.sx||0,c=n.sy||0;t.drawImage(r,u,c,n.sWidth,n.sHeight,a,o,s,l)}else if(n.sx&&n.sy){var d=s-(u=n.sx),f=l-(c=n.sy);t.drawImage(r,u,c,d,f,a,o,s,l)}else t.drawImage(r,a,o,s,l);null!=n.text&&(this.restoreTransform(t),this.drawRectText(t,this.getBoundingRect()))}},getBoundingRect:function(){var t=this.style;return this._rect||(this._rect=new qe(t.x||0,t.y||0,t.width||0,t.height||0)),this._rect}},y(gi,pi);var vi=314159;function mi(t){return parseInt(t,10)}var yi=new qe(0,0,0,0),_i=new qe(0,0,0,0);function xi(t,e,n){this.type="canvas";var i=!t.nodeName||"CANVAS"===t.nodeName.toUpperCase();this._opts=n=S({},n||{}),this.dpr=n.devicePixelRatio||Le,this._singleCanvas=i;var r=(this.root=t).style;r&&(r["-webkit-tap-highlight-color"]="transparent",r["-webkit-user-select"]=r["user-select"]=r["-webkit-touch-callout"]="none",t.innerHTML=""),this.storage=e;var a=this._zlevelList=[],o=this._layers={};if(this._layerConfig={},this._needsManuallyCompositing=!1,i){var s=t.width,l=t.height;null!=n.width&&(s=n.width),null!=n.height&&(l=n.height),this.dpr=n.devicePixelRatio||1,t.width=s*this.dpr,t.height=l*this.dpr,this._width=s,this._height=l;var h=new yn(t,this,this.dpr);h.__builtin__=!0,h.initContext(),(o[vi]=h).zlevel=vi,a.push(vi),this._domRoot=t}else{this._width=this._getSize(0),this._height=this._getSize(1);var u=this._domRoot=function(t,e){var n=document.createElement("div");return n.style.cssText=["position:relative","overflow:hidden","width:"+t+"px","height:"+e+"px","padding:0","margin:0","border-width:0"].join(";")+";",n}(this._width,this._height);t.appendChild(u)}this._hoverlayer=null,this._hoverElements=[]}xi.prototype={constructor:xi,getType:function(){return"canvas"},isSingleCanvas:function(){return this._singleCanvas},getViewportRoot:function(){return this._domRoot},getViewportRootOffset:function(){var t=this.getViewportRoot();if(t)return{offsetLeft:t.offsetLeft||0,offsetTop:t.offsetTop||0}},refresh:function(t){var e=this.storage.getDisplayList(!0),n=this._zlevelList;this._redrawId=Math.random(),this._paintList(e,t,this._redrawId);for(var i=0;i<n.length;i++){var r=n[i],a=this._layers[r];if(!a.__builtin__&&a.refresh){var o=0===i?this._backgroundColor:null;a.refresh(o)}}return this.refreshHover(),this},addHover:function(t,e){if(!t.__hoverMir){var n=new t.constructor({style:t.style,shape:t.shape,z:t.z,z2:t.z2,silent:t.silent});return(n.__from=t).__hoverMir=n,e&&n.setStyle(e),this._hoverElements.push(n),n}},removeHover:function(t){var e=t.__hoverMir,n=this._hoverElements,i=v(n,e);0<=i&&n.splice(i,1),t.__hoverMir=null},clearHover:function(t){for(var e=this._hoverElements,n=0;n<e.length;n++){var i=e[n].__from;i&&(i.__hoverMir=null)}e.length=0},refreshHover:function(){var t=this._hoverElements,e=t.length,n=this._hoverlayer;if(n&&n.clear(),e){tn(t,this.storage.displayableSortFunc);var i={};(n=n||(this._hoverlayer=this.getLayer(1e5))).ctx.save();for(var r=0;r<e;){var a=t[r],o=a.__from;o&&o.__zr?(r++,o.invisible||(a.transform=o.transform,a.invTransform=o.invTransform,a.__clipPaths=o.__clipPaths,this._doPaintEl(a,n,!0,i))):(t.splice(r,1),o.__hoverMir=null,e--)}n.ctx.restore()}},getHoverLayer:function(){return this.getLayer(1e5)},_paintList:function(t,e,n){if(this._redrawId===n){e=e||!1,this._updateLayerStatus(t);var i=this._doPaintList(t,e);if(this._needsManuallyCompositing&&this._compositeManually(),!i){var r=this;_n(function(){r._paintList(t,e,n)})}}},_compositeManually:function(){var e=this.getLayer(vi).ctx,n=this._domRoot.width,i=this._domRoot.height;e.clearRect(0,0,n,i),this.eachBuiltinLayer(function(t){t.virtual&&e.drawImage(t.dom,0,0,n,i)})},_doPaintList:function(t,e){for(var n=[],i=0;i<this._zlevelList.length;i++){var r=this._zlevelList[i];(s=this._layers[r]).__builtin__&&s!==this._hoverlayer&&(s.__dirty||e)&&n.push(s)}for(var a=!0,o=0;o<n.length;o++){var s,l=(s=n[o]).ctx,h={};l.save();var u=e?s.__startIndex:s.__drawIndex,c=!e&&s.incremental&&Date.now,d=c&&Date.now(),f=s.zlevel===this._zlevelList[0]?this._backgroundColor:null;if(s.__startIndex===s.__endIndex)s.clear(!1,f);else if(u===s.__startIndex){var p=t[u];p.incremental&&p.notClear&&!e||s.clear(!1,f)}-1===u&&(console.error("For some unknown reason. drawIndex is -1"),u=s.__startIndex);for(var g=u;g<s.__endIndex;g++){var v=t[g];if(this._doPaintEl(v,s,e,h),v.__dirty=v.__dirtyText=!1,c)if(15<Date.now()-d)break}s.__drawIndex=g,s.__drawIndex<s.__endIndex&&(a=!1),h.prevElClipPaths&&l.restore(),l.restore()}return m.wxa&&k(this._layers,function(t){t&&t.ctx&&t.ctx.draw&&t.ctx.draw()}),a},_doPaintEl:function(t,e,n,i){var r=e.ctx,a=t.transform;if((e.__dirty||n)&&!t.invisible&&0!==t.style.opacity&&(!a||a[0]||a[3])&&(!t.culling||!function(t,e,n){return yi.copy(t.getBoundingRect()),t.transform&&yi.applyTransform(t.transform),_i.width=e,_i.height=n,!yi.intersect(_i)}(t,this._width,this._height))){var o=t.__clipPaths,s=i.prevElClipPaths;s&&!function(t,e){if(t===e)return!1;if(!t||!e||t.length!==e.length)return!0;for(var n=0;n<t.length;n++)if(t[n]!==e[n])return!0;return!1}(o,s)||(s&&(r.restore(),i.prevElClipPaths=null,i.prevEl=null),o&&(r.save(),function(t,e){for(var n=0;n<t.length;n++){var i=t[n];i.setTransform(e),e.beginPath(),i.buildPath(e,i.shape),e.clip(),i.restoreTransform(e)}}(o,r),i.prevElClipPaths=o)),t.beforeBrush&&t.beforeBrush(r),t.brush(r,i.prevEl||null),(i.prevEl=t).afterBrush&&t.afterBrush(r)}},getLayer:function(t,e){this._singleCanvas&&!this._needsManuallyCompositing&&(t=vi);var n=this._layers[t];return n||((n=new yn("zr_"+t,this,this.dpr)).zlevel=t,n.__builtin__=!0,this._layerConfig[t]&&f(n,this._layerConfig[t],!0),e&&(n.virtual=e),this.insertLayer(t,n),n.initContext()),n},insertLayer:function(t,e){var n=this._layers,i=this._zlevelList,r=i.length,a=null,o=-1,s=this._domRoot;if(n[t])Ee("ZLevel "+t+" has been used already");else if(function(t){return!!t&&(!!t.__builtin__||"function"==typeof t.resize&&"function"==typeof t.refresh)}(e)){if(0<r&&t>i[0]){for(o=0;o<r-1&&!(i[o]<t&&i[o+1]>t);o++);a=n[i[o]]}if(i.splice(o+1,0,t),!(n[t]=e).virtual)if(a){var l=a.dom;l.nextSibling?s.insertBefore(e.dom,l.nextSibling):s.appendChild(e.dom)}else s.firstChild?s.insertBefore(e.dom,s.firstChild):s.appendChild(e.dom)}else Ee("Layer of zlevel "+t+" is not valid")},eachLayer:function(t,e){var n,i,r=this._zlevelList;for(i=0;i<r.length;i++)n=r[i],t.call(e,this._layers[n],n)},eachBuiltinLayer:function(t,e){var n,i,r,a=this._zlevelList;for(r=0;r<a.length;r++)i=a[r],(n=this._layers[i]).__builtin__&&t.call(e,n,i)},eachOtherLayer:function(t,e){var n,i,r,a=this._zlevelList;for(r=0;r<a.length;r++)i=a[r],(n=this._layers[i]).__builtin__||t.call(e,n,i)},getLayers:function(){return this._layers},_updateLayerStatus:function(t){function e(t){i&&(i.__endIndex!==t&&(i.__dirty=!0),i.__endIndex=t)}if(this.eachBuiltinLayer(function(t,e){t.__dirty=t.__used=!1}),this._singleCanvas)for(var n=1;n<t.length;n++){if((a=t[n]).zlevel!==t[n-1].zlevel||a.incremental){this._needsManuallyCompositing=!0;break}}var i=null,r=0;for(n=0;n<t.length;n++){var a,o,s=(a=t[n]).zlevel;a.incremental?((o=this.getLayer(s+.001,this._needsManuallyCompositing)).incremental=!0,r=1):o=this.getLayer(s+(0<r?.01:0),this._needsManuallyCompositing),o.__builtin__||Ee("ZLevel "+s+" has been used by unkown layer "+o.id),o!==i&&(o.__used=!0,o.__startIndex!==n&&(o.__dirty=!0),o.__startIndex=n,o.incremental?o.__drawIndex=-1:o.__drawIndex=n,e(n),i=o),a.__dirty&&(o.__dirty=!0,o.incremental&&o.__drawIndex<0&&(o.__drawIndex=n))}e(n),this.eachBuiltinLayer(function(t,e){!t.__used&&0<t.getElementCount()&&(t.__dirty=!0,t.__startIndex=t.__endIndex=t.__drawIndex=0),t.__dirty&&t.__drawIndex<0&&(t.__drawIndex=t.__startIndex)})},clear:function(){return this.eachBuiltinLayer(this._clearLayer),this},_clearLayer:function(t){t.clear()},setBackgroundColor:function(t){this._backgroundColor=t},configLayer:function(t,e){if(e){var n=this._layerConfig;n[t]?f(n[t],e,!0):n[t]=e;for(var i=0;i<this._zlevelList.length;i++){var r=this._zlevelList[i];if(r===t||r===t+.01)f(this._layers[r],n[t],!0)}}},delLayer:function(t){var e=this._layers,n=this._zlevelList,i=e[t];i&&(i.dom.parentNode.removeChild(i.dom),delete e[t],n.splice(v(n,t),1))},resize:function(e,n){if(this._domRoot.style){var t=this._domRoot;t.style.display="none";var i=this._opts;if(null!=e&&(i.width=e),null!=n&&(i.height=n),e=this._getSize(0),n=this._getSize(1),t.style.display="",this._width!==e||n!==this._height){for(var r in t.style.width=e+"px",t.style.height=n+"px",this._layers)this._layers.hasOwnProperty(r)&&this._layers[r].resize(e,n);k(this._progressiveLayers,function(t){t.resize(e,n)}),this.refresh(!0)}this._width=e,this._height=n}else{if(null==e||null==n)return;this._width=e,this._height=n,this.getLayer(vi).resize(e,n)}return this},clearLayer:function(t){var e=this._layers[t];e&&e.clear()},dispose:function(){this.root.innerHTML="",this.root=this.storage=this._domRoot=this._layers=null},getRenderedCanvas:function(t){if(t=t||{},this._singleCanvas&&!this._compositeManually)return this._layers[vi].dom;var e=new yn("image",this,t.pixelRatio||this.dpr);if(e.initContext(),e.clear(!1,t.backgroundColor||this._backgroundColor),t.pixelRatio<=this.dpr){this.refresh();var n=e.dom.width,i=e.dom.height,r=e.ctx;this.eachLayer(function(t){t.__builtin__?r.drawImage(t.dom,0,0,n,i):t.renderToCanvas&&(e.ctx.save(),t.renderToCanvas(e.ctx),e.ctx.restore())})}else for(var a={},o=this.storage.getDisplayList(!0),s=0;s<o.length;s++){var l=o[s];this._doPaintEl(l,e,!0,a)}return e.dom},getWidth:function(){return this._width},getHeight:function(){return this._height},_getSize:function(t){var e=this._opts,n=["width","height"][t],i=["clientWidth","clientHeight"][t],r=["paddingLeft","paddingTop"][t],a=["paddingRight","paddingBottom"][t];if(null!=e[n]&&"auto"!==e[n])return parseFloat(e[n]);var o=this.root,s=document.defaultView.getComputedStyle(o);return(o[i]||mi(s[n])||mi(o.style[n]))-(mi(s[r])||0)-(mi(s[a])||0)|0},pathToImage:function(t,e){e=e||this.dpr;var n=document.createElement("canvas"),i=n.getContext("2d"),r=t.getBoundingRect(),a=t.style,o=a.shadowBlur*e,s=a.shadowOffsetX*e,l=a.shadowOffsetY*e,h=a.hasStroke()?a.lineWidth:0,u=Math.max(h/2,o-s),c=Math.max(h/2,s+o),d=Math.max(h/2,o-l),f=Math.max(h/2,l+o),p=r.width+u+c,g=r.height+d+f;n.width=p*e,n.height=g*e,i.scale(e,e),i.clearRect(0,0,p,g),i.dpr=e;var v={position:t.position,rotation:t.rotation,scale:t.scale};t.position=[u-r.x,d-r.y],t.rotation=0,t.scale=[1,1],t.updateTransform(),t&&t.brush(i);var m=new gi({style:{x:0,y:0,image:n}});return null!=v.position&&(m.position=t.position=v.position),null!=v.rotation&&(m.rotation=t.rotation=v.rotation),null!=v.scale&&(m.scale=t.scale=v.scale),m}};function wi(t){t=t||{},this.stage=t.stage||{},this.onframe=t.onframe||function(){},this._clips=[],this._running=!1,this._time,this._pausedTime,this._pauseStart,this._paused=!1,ft.call(this)}wi.prototype={constructor:wi,addClip:function(t){this._clips.push(t)},addAnimator:function(t){t.animation=this;for(var e=t.getClips(),n=0;n<e.length;n++)this.addClip(e[n])},removeClip:function(t){var e=v(this._clips,t);0<=e&&this._clips.splice(e,1)},removeAnimator:function(t){for(var e=t.getClips(),n=0;n<e.length;n++)this.removeClip(e[n]);t.animation=null},_update:function(){for(var t=(new Date).getTime()-this._pausedTime,e=t-this._time,n=this._clips,i=n.length,r=[],a=[],o=0;o<i;o++){var s=n[o],l=s.step(t,e);l&&(r.push(l),a.push(s))}for(o=0;o<i;)n[o]._needsRemove?(n[o]=n[i-1],n.pop(),i--):o++;i=r.length;for(o=0;o<i;o++)a[o].fire(r[o]);this._time=t,this.onframe(e),this.trigger("frame",e),this.stage.update&&this.stage.update()},_startLoop:function(){var e=this;this._running=!0,_n(function t(){e._running&&(_n(t),e._paused||e._update())})},start:function(){this._time=(new Date).getTime(),this._pausedTime=0,this._startLoop()},stop:function(){this._running=!1},pause:function(){this._paused||(this._pauseStart=(new Date).getTime(),this._paused=!0)},resume:function(){this._paused&&(this._pausedTime+=(new Date).getTime()-this._pauseStart,this._paused=!1)},clear:function(){this._clips=[]},isFinished:function(){return!this._clips.length},animate:function(t,e){var n=new De(t,(e=e||{}).loop,e.getter,e.setter);return this.addAnimator(n),n}},_(wi,ft);var bi=["click","dblclick","mousewheel","mouseout","mouseup","mousedown","mousemove","contextmenu"],Si=["touchstart","touchend","touchmove"],Mi={pointerdown:1,pointerup:1,pointermove:1,pointerout:1},Ii=D(bi,function(t){var e=t.replace("mouse","pointer");return Mi[e]?e:t});function Ti(t){return"mousewheel"===t&&m.browser.firefox?"DOMMouseScroll":t}function Ci(t){t._touching=!0,clearTimeout(t._touchTimer),t._touchTimer=setTimeout(function(){t._touching=!1},700)}var ki={mousemove:function(t){t=St(this.dom,t),this.trigger("mousemove",t)},mouseout:function(t){var e=(t=St(this.dom,t)).toElement||t.relatedTarget;if(e!==this.dom)for(;e&&9!==e.nodeType;){if(e===this.dom)return;e=e.parentNode}this.trigger("mouseout",t)},touchstart:function(t){(t=St(this.dom,t)).zrByTouch=!0,this._lastTouchMoment=new Date,this.handler.processGesture(this,t,"start"),ki.mousemove.call(this,t),ki.mousedown.call(this,t),Ci(this)},touchmove:function(t){(t=St(this.dom,t)).zrByTouch=!0,this.handler.processGesture(this,t,"change"),ki.mousemove.call(this,t),Ci(this)},touchend:function(t){(t=St(this.dom,t)).zrByTouch=!0,this.handler.processGesture(this,t,"end"),ki.mouseup.call(this,t),+new Date-this._lastTouchMoment<300&&ki.click.call(this,t),Ci(this)},pointerdown:function(t){ki.mousedown.call(this,t)},pointermove:function(t){Di(t)||ki.mousemove.call(this,t)},pointerup:function(t){ki.mouseup.call(this,t)},pointerout:function(t){Di(t)||ki.mouseout.call(this,t)}};function Di(t){var e=t.pointerType;return"pen"===e||"touch"===e}function Ai(n){function t(t,e){k(t,function(t){!function(t,e,n){mt?t.addEventListener(e,n):t.attachEvent("on"+e,n)}(n,Ti(t),e._handlers[t])},e)}ft.call(this),this.dom=n,this._touching=!1,this._touchTimer,this._handlers={},function(e){k(Si,function(t){e._handlers[t]=w(ki[t],e)}),k(Ii,function(t){e._handlers[t]=w(ki[t],e)}),k(bi,function(t){e._handlers[t]=function(t,e){return function(){if(!e._touching)return t.apply(e,arguments)}}(ki[t],e)})}(this),m.pointerEventsSupported?t(Ii,this):(m.touchEventsSupported&&t(Si,this),t(bi,this))}k(["click","mousedown","mouseup","mousewheel","dblclick","contextmenu"],function(e){ki[e]=function(t){t=St(this.dom,t),this.trigger(e,t)}});var Li=Ai.prototype;Li.dispose=function(){for(var t,e,n,i=bi.concat(Si),r=0;r<i.length;r++){var a=i[r];t=this.dom,e=Ti(a),n=this._handlers[a],mt?t.removeEventListener(e,n):t.detachEvent("on"+e,n)}},Li.setCursor=function(t){this.dom.style&&(this.dom.style.cursor=t||"default")},_(Ai,ft);var Pi=!m.canvasSupported,Oi={canvas:xi};function Ei(t,e){return new Ni(n(),t,e)}var Ni=function(t,e,n){n=n||{},this.dom=e,this.id=t;var i=this,r=new nn,a=n.renderer;if(Pi){if(!Oi.vml)throw new Error("You need to require 'zrender/vml/vml' to support IE8");a="vml"}else a&&Oi[a]||(a="canvas");var o=new Oi[a](e,r,n,t);this.storage=r,this.painter=o;var s=m.node||m.worker?null:new Ai(o.getViewportRoot());this.handler=new Lt(r,o,s,o.root),this.animation=new wi({stage:{update:w(this.flush,this)}}),this.animation.start(),this._needsRefresh;var l=r.delFromStorage,h=r.addToStorage;r.delFromStorage=function(t){l.call(r,t),t&&t.removeSelfFromZr(i)},r.addToStorage=function(t){h.call(r,t),t.addSelfToZr(i)}};Ni.prototype={constructor:Ni,getId:function(){return this.id},add:function(t){this.storage.addRoot(t),this._needsRefresh=!0},remove:function(t){this.storage.delRoot(t),this._needsRefresh=!0},configLayer:function(t,e){this.painter.configLayer&&this.painter.configLayer(t,e),this._needsRefresh=!0},setBackgroundColor:function(t){this.painter.setBackgroundColor&&this.painter.setBackgroundColor(t),this._needsRefresh=!0},refreshImmediately:function(){this._needsRefresh=this._needsRefreshHover=!1,this.painter.refresh(),this._needsRefresh=this._needsRefreshHover=!1},refresh:function(){this._needsRefresh=!0},flush:function(){var t;this._needsRefresh&&(t=!0,this.refreshImmediately()),this._needsRefreshHover&&(t=!0,this.refreshHoverImmediately()),t&&this.trigger("rendered")},addHover:function(t,e){if(this.painter.addHover){var n=this.painter.addHover(t,e);return this.refreshHover(),n}},removeHover:function(t){this.painter.removeHover&&(this.painter.removeHover(t),this.refreshHover())},clearHover:function(){this.painter.clearHover&&(this.painter.clearHover(),this.refreshHover())},refreshHover:function(){this._needsRefreshHover=!0},refreshHoverImmediately:function(){this._needsRefreshHover=!1,this.painter.refreshHover&&this.painter.refreshHover()},resize:function(t){t=t||{},this.painter.resize(t.width,t.height),this.handler.resize()},clearAnimation:function(){this.animation.clear()},getWidth:function(){return this.painter.getWidth()},getHeight:function(){return this.painter.getHeight()},pathToImage:function(t,e){return this.painter.pathToImage(t,e)},setCursorStyle:function(t){this.handler.setCursorStyle(t)},findHover:function(t,e){return this.handler.findHover(t,e)},on:function(t,e,n){this.handler.on(t,e,n)},off:function(t,e){this.handler.off(t,e)},trigger:function(t,e){this.handler.trigger(t,e)},clear:function(){this.storage.delRoot(),this.painter.clear()},dispose:function(){this.animation.stop(),this.clear(),this.storage.dispose(),this.painter.dispose(),this.handler.dispose(),this.animation=this.storage=this.painter=this.handler=null}};var Bi=k,zi=O,Ri=A,Fi="series\0";function Vi(t){return t instanceof Array?t:null==t?[]:[t]}function Wi(t,e,n){if(t){t[e]=t[e]||{},t.emphasis=t.emphasis||{},t.emphasis[e]=t.emphasis[e]||{};for(var i=0,r=n.length;i<r;i++){var a=n[i];!t.emphasis[e].hasOwnProperty(a)&&t[e].hasOwnProperty(a)&&(t.emphasis[e][a]=t[e][a])}}}var Hi=["fontStyle","fontWeight","fontSize","fontFamily","rich","tag","color","textBorderColor","textBorderWidth","width","height","lineHeight","align","verticalAlign","baseline","shadowColor","shadowBlur","shadowOffsetX","shadowOffsetY","textShadowColor","textShadowBlur","textShadowOffsetX","textShadowOffsetY","backgroundColor","borderColor","borderWidth","borderRadius","padding"];function Gi(t){return!zi(t)||Ri(t)||t instanceof Date?t:t.value}function Xi(t,r){r=(r||[]).slice();var a=D(t||[],function(t,e){return{exist:t}});return Bi(r,function(t,e){if(zi(t)){for(var n=0;n<a.length;n++)if(!a[n].option&&null!=t.id&&a[n].exist.id===t.id+"")return a[n].option=t,void(r[e]=null);for(n=0;n<a.length;n++){var i=a[n].exist;if(!(a[n].option||null!=i.id&&null!=t.id||null==t.name||Yi(t)||Yi(i)||i.name!==t.name+""))return a[n].option=t,void(r[e]=null)}}}),Bi(r,function(t,e){if(zi(t)){for(var n=0;n<a.length;n++){var i=a[n].exist;if(!a[n].option&&!Yi(i)&&null==t.id){a[n].option=t;break}}n>=a.length&&a.push({option:t})}}),a}function qi(t){var e=t.name;return!(!e||!e.indexOf(Fi))}function Yi(t){return zi(t)&&t.id&&0===(t.id+"").indexOf("\0_ec_\0")}function Ui(e,t){return null!=t.dataIndexInside?t.dataIndexInside:null!=t.dataIndex?A(t.dataIndex)?D(t.dataIndex,function(t){return e.indexOfRawIndex(t)}):e.indexOfRawIndex(t.dataIndex):null!=t.name?A(t.name)?D(t.name,function(t){return e.indexOfName(t)}):e.indexOfName(t.name):void 0}function ji(){var e="__\0ec_inner_"+Zi+++"_"+Math.random().toFixed(5);return function(t){return t[e]||(t[e]={})}}var Zi=0;function $i(s,l,h){if(L(l)){var t={};t[l+"Index"]=0,l=t}var e=h&&h.defaultMainType;!e||Ki(l,e+"Index")||Ki(l,e+"Id")||Ki(l,e+"Name")||(l[e+"Index"]=0);var u={};return Bi(l,function(t,e){t=l[e];if("dataIndex"!==e&&"dataIndexInside"!==e){var n=e.match(/^(\w+)(Index|Id|Name)$/)||[],i=n[1],r=(n[2]||"").toLowerCase();if(!(!i||!r||null==t||"index"===r&&"none"===t||h&&h.includeMainTypes&&v(h.includeMainTypes,i)<0)){var a={mainType:i};"index"===r&&"all"===t||(a[r]=t);var o=s.queryComponents(a);u[i+"Models"]=o,u[i+"Model"]=o[0]}}else u[e]=t}),u}function Ki(t,e){return t&&t.hasOwnProperty(e)}function Qi(t,e,n){t.setAttribute?t.setAttribute(e,n):t[e]=n}var Ji=".",tr="___EC__COMPONENT__CONTAINER___";function er(t){var e={main:"",sub:""};return t&&(t=t.split(Ji),e.main=t[0]||"",e.sub=t[1]||""),e}function nr(t){(t.$constructor=t).extend=function(t){function e(){t.$constructor?t.$constructor.apply(this,arguments):n.apply(this,arguments)}var n=this;return S(e.prototype,t),e.extend=this.extend,e.superCall=ar,e.superApply=or,y(e,this),e.superClass=n,e}}var ir=0;function rr(t){var e=["__\0is_clz",ir++,Math.random().toFixed(3)].join("_");t.prototype[e]=!0,t.isInstance=function(t){return!(!t||!t[e])}}function ar(t,e){var n=W(arguments,2);return this.superClass.prototype[e].apply(t,n)}function or(t,e,n){return this.superClass.prototype[e].apply(t,n)}function sr(n,t){t=t||{};var r={};if(n.registerClass=function(t,e){if(e)if(function(t){G(/^[a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)?$/.test(t),'componentType "'+t+'" illegal')}(e),(e=er(e)).sub){if(e.sub!==tr){(function(t){var e=r[t.main];e&&e[tr]||((e=r[t.main]={})[tr]=!0);return e})(e)[e.sub]=t}}else r[e.main]=t;return t},n.getClass=function(t,e,n){var i=r[t];if(i&&i[tr]&&(i=e?i[e]:null),n&&!i)throw new Error(e?"Component "+t+"."+(e||"")+" not exists. Load it first.":t+".type should be specified.");return i},n.getClassesByMainType=function(t){t=er(t);var n=[],e=r[t.main];return e&&e[tr]?k(e,function(t,e){e!==tr&&n.push(t)}):n.push(e),n},n.hasClass=function(t){return t=er(t),!!r[t.main]},n.getAllClassMainTypes=function(){var n=[];return k(r,function(t,e){n.push(e)}),n},n.hasSubTypes=function(t){t=er(t);var e=r[t.main];return e&&e[tr]},n.parseClassType=er,t.registerWhenExtend){var i=n.extend;i&&(n.extend=function(t){var e=i.call(this,t);return n.registerClass(e,t.type)})}return n}function lr(s){for(var t=0;t<s.length;t++)s[t][1]||(s[t][1]=s[t][0]);return function(t,e,n){for(var i={},r=0;r<s.length;r++){var a=s[r][1];if(!(e&&0<=v(e,a)||n&&v(n,a)<0)){var o=t.getShallow(a);null!=o&&(i[s[r][0]]=o)}}return i}}var hr=lr([["lineWidth","width"],["stroke","color"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"]]),ur={getLineStyle:function(t){var e=hr(this,t);return e.lineDash=this.getLineDash(e.lineWidth),e},getLineDash:function(t){null==t&&(t=1);var e=this.get("type"),n=Math.max(t,2),i=4*t;return"solid"!==e&&null!=e&&("dashed"===e?[i,i]:[n,n])}},cr=lr([["fill","color"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["opacity"],["shadowColor"]]),dr={getAreaStyle:function(t,e){return cr(this,t,e)}},fr=Math.pow,pr=Math.sqrt,gr=1e-8,vr=1e-4,mr=pr(3),yr=1/3,_r=Q(),xr=Q(),wr=Q();function br(t){return-gr<t&&t<gr}function Sr(t){return gr<t||t<-gr}function Mr(t,e,n,i,r){var a=1-r;return a*a*(a*t+3*r*e)+r*r*(r*i+3*a*n)}function Ir(t,e,n,i,r){var a=1-r;return 3*(((e-t)*a+2*(n-e)*r)*a+(i-n)*r*r)}function Tr(t,e,n,i,r){var a=6*n-12*e+6*t,o=9*e+3*i-3*t-9*n,s=3*e-3*t,l=0;if(br(o)){if(Sr(a))0<=(u=-s/a)&&u<=1&&(r[l++]=u)}else{var h=a*a-4*o*s;if(br(h))r[0]=-a/(2*o);else if(0<h){var u,c=pr(h),d=(-a-c)/(2*o);0<=(u=(-a+c)/(2*o))&&u<=1&&(r[l++]=u),0<=d&&d<=1&&(r[l++]=d)}}return l}function Cr(t,e,n,i,r,a){var o=(e-t)*r+t,s=(n-e)*r+e,l=(i-n)*r+n,h=(s-o)*r+o,u=(l-s)*r+s,c=(u-h)*r+h;a[0]=t,a[1]=o,a[2]=h,a[3]=c,a[4]=c,a[5]=u,a[6]=l,a[7]=i}function kr(t,e,n,i){var r=1-i;return r*(r*t+2*i*e)+i*i*n}function Dr(t,e,n,i){return 2*((1-i)*(e-t)+i*(n-e))}function Ar(t,e,n){var i=t+n-2*e;return 0==i?.5:(t-e)/i}function Lr(t,e,n,i,r){var a=(e-t)*i+t,o=(n-e)*i+e,s=(o-a)*i+a;r[0]=t,r[1]=a,r[2]=s,r[3]=s,r[4]=o,r[5]=n}var Pr=Math.min,Or=Math.max,Er=Math.sin,Nr=Math.cos,Br=2*Math.PI,zr=Q(),Rr=Q(),Fr=Q();function Vr(t,e,n,i,r,a){r[0]=Pr(t,n),r[1]=Pr(e,i),a[0]=Or(t,n),a[1]=Or(e,i)}var Wr=[],Hr=[];function Gr(t,e,n,i,r,a,o,s,l,h){var u,c=Tr,d=Mr,f=c(t,n,r,o,Wr);for(l[0]=1/0,l[1]=1/0,h[0]=-1/0,h[1]=-1/0,u=0;u<f;u++){var p=d(t,n,r,o,Wr[u]);l[0]=Pr(p,l[0]),h[0]=Or(p,h[0])}for(f=c(e,i,a,s,Hr),u=0;u<f;u++){var g=d(e,i,a,s,Hr[u]);l[1]=Pr(g,l[1]),h[1]=Or(g,h[1])}l[0]=Pr(t,l[0]),h[0]=Or(t,h[0]),l[0]=Pr(o,l[0]),h[0]=Or(o,h[0]),l[1]=Pr(e,l[1]),h[1]=Or(e,h[1]),l[1]=Pr(s,l[1]),h[1]=Or(s,h[1])}function Xr(t,e,n,i,r,a,o,s,l){var h=lt,u=ht,c=Math.abs(r-a);if(c%Br<1e-4&&1e-4<c)return s[0]=t-n,s[1]=e-i,l[0]=t+n,void(l[1]=e+i);if(zr[0]=Nr(r)*n+t,zr[1]=Er(r)*i+e,Rr[0]=Nr(a)*n+t,Rr[1]=Er(a)*i+e,h(s,zr,Rr),u(l,zr,Rr),(r%=Br)<0&&(r+=Br),(a%=Br)<0&&(a+=Br),a<r&&!o?a+=Br:r<a&&o&&(r+=Br),o){var d=a;a=r,r=d}for(var f=0;f<a;f+=Math.PI/2)r<f&&(Fr[0]=Nr(f)*n+t,Fr[1]=Er(f)*i+e,h(s,Fr,s),u(l,Fr,l))}var qr={M:1,L:2,C:3,Q:4,A:5,Z:6,R:7},Yr=[],Ur=[],jr=[],Zr=[],$r=Math.min,Kr=Math.max,Qr=Math.cos,Jr=Math.sin,ta=Math.sqrt,ea=Math.abs,na="undefined"!=typeof Float32Array,ia=function(t){this._saveData=!t,this._saveData&&(this.data=[]),this._ctx=null};function ra(t,e,n,i,r,a,o){if(0===r)return!1;var s=r,l=0;if(e+s<o&&i+s<o||o<e-s&&o<i-s||t+s<a&&n+s<a||a<t-s&&a<n-s)return!1;if(t===n)return Math.abs(a-t)<=s/2;var h=(l=(e-i)/(t-n))*a-o+(t*i-n*e)/(t-n);return h*h/(l*l+1)<=s/2*s/2}function aa(t,e,n,i,r,a,o,s,l,h,u){if(0===l)return!1;var c=l;return!(e+c<u&&i+c<u&&a+c<u&&s+c<u||u<e-c&&u<i-c&&u<a-c&&u<s-c||t+c<h&&n+c<h&&r+c<h&&o+c<h||h<t-c&&h<n-c&&h<r-c&&h<o-c)&&function(t,e,n,i,r,a,o,s,l,h,u){var c,d,f,p,g,v=.005,m=1/0;_r[0]=l,_r[1]=h;for(var y=0;y<1;y+=.05)xr[0]=Mr(t,n,r,o,y),xr[1]=Mr(e,i,a,s,y),(p=ot(_r,xr))<m&&(c=y,m=p);m=1/0;for(var _=0;_<32&&!(v<vr);_++)d=c-v,f=c+v,xr[0]=Mr(t,n,r,o,d),xr[1]=Mr(e,i,a,s,d),p=ot(xr,_r),0<=d&&p<m?(c=d,m=p):(wr[0]=Mr(t,n,r,o,f),wr[1]=Mr(e,i,a,s,f),g=ot(wr,_r),f<=1&&g<m?(c=f,m=g):v*=.5);return u&&(u[0]=Mr(t,n,r,o,c),u[1]=Mr(e,i,a,s,c)),pr(m)}(t,e,n,i,r,a,o,s,h,u,null)<=c/2}function oa(t,e,n,i,r,a,o,s,l){if(0===o)return!1;var h=o;return!(e+h<l&&i+h<l&&a+h<l||l<e-h&&l<i-h&&l<a-h||t+h<s&&n+h<s&&r+h<s||s<t-h&&s<n-h&&s<r-h)&&function(t,e,n,i,r,a,o,s,l){var h,u=.005,c=1/0;_r[0]=o,_r[1]=s;for(var d=0;d<1;d+=.05){xr[0]=kr(t,n,r,d),xr[1]=kr(e,i,a,d),(v=ot(_r,xr))<c&&(h=d,c=v)}c=1/0;for(var f=0;f<32&&!(u<vr);f++){var p=h-u,g=h+u;xr[0]=kr(t,n,r,p),xr[1]=kr(e,i,a,p);var v=ot(xr,_r);if(0<=p&&v<c)h=p,c=v;else{wr[0]=kr(t,n,r,g),wr[1]=kr(e,i,a,g);var m=ot(wr,_r);g<=1&&m<c?(h=g,c=m):u*=.5}}return l&&(l[0]=kr(t,n,r,h),l[1]=kr(e,i,a,h)),pr(c)}(t,e,n,i,r,a,s,l,null)<=h/2}ia.prototype={constructor:ia,_xi:0,_yi:0,_x0:0,_y0:0,_ux:0,_uy:0,_len:0,_lineDash:null,_dashOffset:0,_dashIdx:0,_dashSum:0,setScale:function(t,e,n){n=n||0,this._ux=ea(n/Le/t)||0,this._uy=ea(n/Le/e)||0},getContext:function(){return this._ctx},beginPath:function(t){return(this._ctx=t)&&t.beginPath(),t&&(this.dpr=t.dpr),this._saveData&&(this._len=0),this._lineDash&&(this._lineDash=null,this._dashOffset=0),this},moveTo:function(t,e){return this.addData(qr.M,t,e),this._ctx&&this._ctx.moveTo(t,e),this._x0=t,this._y0=e,this._xi=t,this._yi=e,this},lineTo:function(t,e){var n=ea(t-this._xi)>this._ux||ea(e-this._yi)>this._uy||this._len<5;return this.addData(qr.L,t,e),this._ctx&&n&&(this._needsDash()?this._dashedLineTo(t,e):this._ctx.lineTo(t,e)),n&&(this._xi=t,this._yi=e),this},bezierCurveTo:function(t,e,n,i,r,a){return this.addData(qr.C,t,e,n,i,r,a),this._ctx&&(this._needsDash()?this._dashedBezierTo(t,e,n,i,r,a):this._ctx.bezierCurveTo(t,e,n,i,r,a)),this._xi=r,this._yi=a,this},quadraticCurveTo:function(t,e,n,i){return this.addData(qr.Q,t,e,n,i),this._ctx&&(this._needsDash()?this._dashedQuadraticTo(t,e,n,i):this._ctx.quadraticCurveTo(t,e,n,i)),this._xi=n,this._yi=i,this},arc:function(t,e,n,i,r,a){return this.addData(qr.A,t,e,n,n,i,r-i,0,a?0:1),this._ctx&&this._ctx.arc(t,e,n,i,r,a),this._xi=Qr(r)*n+t,this._yi=Jr(r)*n+e,this},arcTo:function(t,e,n,i,r){return this._ctx&&this._ctx.arcTo(t,e,n,i,r),this},rect:function(t,e,n,i){return this._ctx&&this._ctx.rect(t,e,n,i),this.addData(qr.R,t,e,n,i),this},closePath:function(){this.addData(qr.Z);var t=this._ctx,e=this._x0,n=this._y0;return t&&(this._needsDash()&&this._dashedLineTo(e,n),t.closePath()),this._xi=e,this._yi=n,this},fill:function(t){t&&t.fill(),this.toStatic()},stroke:function(t){t&&t.stroke(),this.toStatic()},setLineDash:function(t){if(t instanceof Array){this._lineDash=t;for(var e=this._dashIdx=0,n=0;n<t.length;n++)e+=t[n];this._dashSum=e}return this},setLineDashOffset:function(t){return this._dashOffset=t,this},len:function(){return this._len},setData:function(t){var e=t.length;this.data&&this.data.length===e||!na||(this.data=new Float32Array(e));for(var n=0;n<e;n++)this.data[n]=t[n];this._len=e},appendPath:function(t){t instanceof Array||(t=[t]);for(var e=t.length,n=0,i=this._len,r=0;r<e;r++)n+=t[r].len();na&&this.data instanceof Float32Array&&(this.data=new Float32Array(i+n));for(r=0;r<e;r++)for(var a=t[r].data,o=0;o<a.length;o++)this.data[i++]=a[o];this._len=i},addData:function(t){if(this._saveData){var e=this.data;this._len+arguments.length>e.length&&(this._expandData(),e=this.data);for(var n=0;n<arguments.length;n++)e[this._len++]=arguments[n];this._prevCmd=t}},_expandData:function(){if(!(this.data instanceof Array)){for(var t=[],e=0;e<this._len;e++)t[e]=this.data[e];this.data=t}},_needsDash:function(){return this._lineDash},_dashedLineTo:function(t,e){var n,i,r=this._dashSum,a=this._dashOffset,o=this._lineDash,s=this._ctx,l=this._xi,h=this._yi,u=t-l,c=e-h,d=ta(u*u+c*c),f=l,p=h,g=o.length;for(a<0&&(a=r+a),f-=(a%=r)*(u/=d),p-=a*(c/=d);0<u&&f<=t||u<0&&t<=f||0===u&&(0<c&&p<=e||c<0&&e<=p);)f+=u*(n=o[i=this._dashIdx]),p+=c*n,this._dashIdx=(i+1)%g,0<u&&f<l||u<0&&l<f||0<c&&p<h||c<0&&h<p||s[i%2?"moveTo":"lineTo"](0<=u?$r(f,t):Kr(f,t),0<=c?$r(p,e):Kr(p,e));u=f-t,c=p-e,this._dashOffset=-ta(u*u+c*c)},_dashedBezierTo:function(t,e,n,i,r,a){var o,s,l,h,u,c=this._dashSum,d=this._dashOffset,f=this._lineDash,p=this._ctx,g=this._xi,v=this._yi,m=Mr,y=0,_=this._dashIdx,x=f.length,w=0;for(d<0&&(d=c+d),d%=c,o=0;o<1;o+=.1)s=m(g,t,n,r,o+.1)-m(g,t,n,r,o),l=m(v,e,i,a,o+.1)-m(v,e,i,a,o),y+=ta(s*s+l*l);for(;_<x&&!(d<(w+=f[_]));_++);for(o=(w-d)/y;o<=1;)h=m(g,t,n,r,o),u=m(v,e,i,a,o),_%2?p.moveTo(h,u):p.lineTo(h,u),o+=f[_]/y,_=(_+1)%x;_%2!=0&&p.lineTo(r,a),s=r-h,l=a-u,this._dashOffset=-ta(s*s+l*l)},_dashedQuadraticTo:function(t,e,n,i){var r=n,a=i;n=(n+2*t)/3,i=(i+2*e)/3,t=(this._xi+2*t)/3,e=(this._yi+2*e)/3,this._dashedBezierTo(t,e,n,i,r,a)},toStatic:function(){var t=this.data;t instanceof Array&&(t.length=this._len,na&&(this.data=new Float32Array(t)))},getBoundingRect:function(){Yr[0]=Yr[1]=jr[0]=jr[1]=Number.MAX_VALUE,Ur[0]=Ur[1]=Zr[0]=Zr[1]=-Number.MAX_VALUE;for(var t,e,n,i,r,a,o,s,l,h,u,c,d,f,p=this.data,g=0,v=0,m=0,y=0,_=0;_<p.length;){var x=p[_++];switch(1===_&&(m=g=p[_],y=v=p[_+1]),x){case qr.M:g=m=p[_++],v=y=p[_++],jr[0]=m,jr[1]=y,Zr[0]=m,Zr[1]=y;break;case qr.L:Vr(g,v,p[_],p[_+1],jr,Zr),g=p[_++],v=p[_++];break;case qr.C:Gr(g,v,p[_++],p[_++],p[_++],p[_++],p[_],p[_+1],jr,Zr),g=p[_++],v=p[_++];break;case qr.Q:t=g,e=v,n=p[_++],i=p[_++],r=p[_],a=p[_+1],o=jr,s=Zr,h=l=void 0,h=kr,u=Or(Pr((l=Ar)(t,n,r),1),0),c=Or(Pr(l(e,i,a),1),0),d=h(t,n,r,u),f=h(e,i,a,c),o[0]=Pr(t,r,d),o[1]=Pr(e,a,f),s[0]=Or(t,r,d),s[1]=Or(e,a,f),g=p[_++],v=p[_++];break;case qr.A:var w=p[_++],b=p[_++],S=p[_++],M=p[_++],I=p[_++],T=p[_++]+I;_+=1;var C=1-p[_++];1===_&&(m=Qr(I)*S+w,y=Jr(I)*M+b),Xr(w,b,S,M,I,T,C,jr,Zr),g=Qr(T)*S+w,v=Jr(T)*M+b;break;case qr.R:Vr(m=g=p[_++],y=v=p[_++],m+p[_++],y+p[_++],jr,Zr);break;case qr.Z:g=m,v=y}lt(Yr,Yr,jr),ht(Ur,Ur,Zr)}return 0===_&&(Yr[0]=Yr[1]=Ur[0]=Ur[1]=0),new qe(Yr[0],Yr[1],Ur[0]-Yr[0],Ur[1]-Yr[1])},rebuildPath:function(t){for(var e,n,i,r,a,o,s=this.data,l=this._ux,h=this._uy,u=this._len,c=0;c<u;){var d=s[c++];switch(1===c&&(e=i=s[c],n=r=s[c+1]),d){case qr.M:e=i=s[c++],n=r=s[c++],t.moveTo(i,r);break;case qr.L:a=s[c++],o=s[c++],(ea(a-i)>l||ea(o-r)>h||c===u-1)&&(t.lineTo(a,o),i=a,r=o);break;case qr.C:t.bezierCurveTo(s[c++],s[c++],s[c++],s[c++],s[c++],s[c++]),i=s[c-2],r=s[c-1];break;case qr.Q:t.quadraticCurveTo(s[c++],s[c++],s[c++],s[c++]),i=s[c-2],r=s[c-1];break;case qr.A:var f=s[c++],p=s[c++],g=s[c++],v=s[c++],m=s[c++],y=s[c++],_=s[c++],x=s[c++],w=v<g?g:v,b=v<g?1:g/v,S=v<g?v/g:1,M=m+y;.001<Math.abs(g-v)?(t.translate(f,p),t.rotate(_),t.scale(b,S),t.arc(0,0,w,m,M,1-x),t.scale(1/b,1/S),t.rotate(-_),t.translate(-f,-p)):t.arc(f,p,w,m,M,1-x),1===c&&(e=Qr(m)*g+f,n=Jr(m)*v+p),i=Qr(M)*g+f,r=Jr(M)*v+p;break;case qr.R:e=i=s[c],n=r=s[c+1],t.rect(s[c++],s[c++],s[c++],s[c++]);break;case qr.Z:t.closePath(),i=e,r=n}}}},ia.CMD=qr;var sa=2*Math.PI;function la(t){return(t%=sa)<0&&(t+=sa),t}var ha=2*Math.PI;function ua(t,e,n,i,r,a,o,s,l){if(0===o)return!1;var h=o;s-=t,l-=e;var u=Math.sqrt(s*s+l*l);if(n<u-h||u+h<n)return!1;if(Math.abs(i-r)%ha<1e-4)return!0;if(a){var c=i;i=la(r),r=la(c)}else i=la(i),r=la(r);r<i&&(r+=ha);var d=Math.atan2(l,s);return d<0&&(d+=ha),i<=d&&d<=r||i<=d+ha&&d+ha<=r}function ca(t,e,n,i,r,a){if(e<a&&i<a||a<e&&a<i)return 0;if(i===e)return 0;var o=i<e?1:-1,s=(a-e)/(i-e);1!=s&&0!=s||(o=i<e?.5:-.5);var l=s*(n-t)+t;return l===r?1/0:r<l?o:0}var da=ia.CMD,fa=2*Math.PI,pa=1e-4;var ga=[-1,-1,-1],va=[-1,-1];function ma(t,e,n,i,r,a,o,s,l,h){if(e<h&&i<h&&a<h&&s<h||h<e&&h<i&&h<a&&h<s)return 0;var u,c=function(t,e,n,i,r,a){var o=i+3*(e-n)-t,s=3*(n-2*e+t),l=3*(e-t),h=t-r,u=s*s-3*o*l,c=s*l-9*o*h,d=l*l-3*s*h,f=0;if(br(u)&&br(c)){if(br(s))a[0]=0;else 0<=(M=-l/s)&&M<=1&&(a[f++]=M)}else{var p=c*c-4*u*d;if(br(p)){var g=c/u,v=-g/2;0<=(M=-s/o+g)&&M<=1&&(a[f++]=M),0<=v&&v<=1&&(a[f++]=v)}else if(0<p){var m=pr(p),y=u*s+1.5*o*(-c+m),_=u*s+1.5*o*(-c-m);0<=(M=(-s-((y=y<0?-fr(-y,yr):fr(y,yr))+(_=_<0?-fr(-_,yr):fr(_,yr))))/(3*o))&&M<=1&&(a[f++]=M)}else{var x=(2*u*s-3*o*c)/(2*pr(u*u*u)),w=Math.acos(x)/3,b=pr(u),S=Math.cos(w),M=(-s-2*b*S)/(3*o),I=(v=(-s+b*(S+mr*Math.sin(w)))/(3*o),(-s+b*(S-mr*Math.sin(w)))/(3*o));0<=M&&M<=1&&(a[f++]=M),0<=v&&v<=1&&(a[f++]=v),0<=I&&I<=1&&(a[f++]=I)}}return f}(e,i,a,s,h,ga);if(0===c)return 0;for(var d,f,p=0,g=-1,v=0;v<c;v++){var m=ga[v],y=0===m||1===m?.5:1;Mr(t,n,r,o,m)<l||(g<0&&(g=Tr(e,i,a,s,va),va[1]<va[0]&&1<g&&(void 0,u=va[0],va[0]=va[1],va[1]=u),d=Mr(e,i,a,s,va[0]),1<g&&(f=Mr(e,i,a,s,va[1]))),2===g?m<va[0]?p+=d<e?y:-y:m<va[1]?p+=f<d?y:-y:p+=s<f?y:-y:m<va[0]?p+=d<e?y:-y:p+=s<d?y:-y)}return p}function ya(t,e,n,i,r,a,o,s){if(e<s&&i<s&&a<s||s<e&&s<i&&s<a)return 0;var l=function(t,e,n,i,r){var a=t-2*e+n,o=2*(e-t),s=t-i,l=0;if(br(a)){if(Sr(o))0<=(u=-s/o)&&u<=1&&(r[l++]=u)}else{var h=o*o-4*a*s;if(br(h))0<=(u=-o/(2*a))&&u<=1&&(r[l++]=u);else if(0<h){var u,c=pr(h),d=(-o-c)/(2*a);0<=(u=(-o+c)/(2*a))&&u<=1&&(r[l++]=u),0<=d&&d<=1&&(r[l++]=d)}}return l}(e,i,a,s,ga);if(0===l)return 0;var h=Ar(e,i,a);if(0<=h&&h<=1){for(var u=0,c=kr(e,i,a,h),d=0;d<l;d++){var f=0===ga[d]||1===ga[d]?.5:1;kr(t,n,r,ga[d])<o||(ga[d]<h?u+=c<e?f:-f:u+=a<c?f:-f)}return u}f=0===ga[0]||1===ga[0]?.5:1;return kr(t,n,r,ga[0])<o?0:a<e?f:-f}function _a(t,e,n,i,r,a,o,s){if(n<(s-=e)||s<-n)return 0;var l=Math.sqrt(n*n-s*s);ga[0]=-l,ga[1]=l;var h=Math.abs(i-r);if(h<1e-4)return 0;if(h%fa<1e-4){r=fa;var u=a?1:-1;return o>=ga[i=0]+t&&o<=ga[1]+t?u:0}if(a){l=i;i=la(r),r=la(l)}else i=la(i),r=la(r);r<i&&(r+=fa);for(var c=0,d=0;d<2;d++){var f=ga[d];if(o<f+t){var p=Math.atan2(s,f);u=a?1:-1;p<0&&(p=fa+p),(i<=p&&p<=r||i<=p+fa&&p+fa<=r)&&(p>Math.PI/2&&p<1.5*Math.PI&&(u=-u),c+=u)}}return c}function xa(t,e,n,i,r){for(var a=0,o=0,s=0,l=0,h=0,u=0;u<t.length;){var c=t[u++];switch(c===da.M&&1<u&&(n||(a+=ca(o,s,l,h,i,r))),1===u&&(l=o=t[u],h=s=t[u+1]),c){case da.M:o=l=t[u++],s=h=t[u++];break;case da.L:if(n){if(ra(o,s,t[u],t[u+1],e,i,r))return!0}else a+=ca(o,s,t[u],t[u+1],i,r)||0;o=t[u++],s=t[u++];break;case da.C:if(n){if(aa(o,s,t[u++],t[u++],t[u++],t[u++],t[u],t[u+1],e,i,r))return!0}else a+=ma(o,s,t[u++],t[u++],t[u++],t[u++],t[u],t[u+1],i,r)||0;o=t[u++],s=t[u++];break;case da.Q:if(n){if(oa(o,s,t[u++],t[u++],t[u],t[u+1],e,i,r))return!0}else a+=ya(o,s,t[u++],t[u++],t[u],t[u+1],i,r)||0;o=t[u++],s=t[u++];break;case da.A:var d=t[u++],f=t[u++],p=t[u++],g=t[u++],v=t[u++],m=t[u++];u+=1;var y=1-t[u++],_=Math.cos(v)*p+d,x=Math.sin(v)*g+f;1<u?a+=ca(o,s,_,x,i,r):(l=_,h=x);var w=(i-d)*g/p+d;if(n){if(ua(d,f,g,v,v+m,y,e,w,r))return!0}else a+=_a(d,f,g,v,v+m,y,w,r);o=Math.cos(v+m)*p+d,s=Math.sin(v+m)*g+f;break;case da.R:l=o=t[u++],h=s=t[u++];_=l+t[u++],x=h+t[u++];if(n){if(ra(l,h,_,h,e,i,r)||ra(_,h,_,x,e,i,r)||ra(_,x,l,x,e,i,r)||ra(l,x,l,h,e,i,r))return!0}else a+=ca(_,h,_,x,i,r),a+=ca(l,x,l,h,i,r);break;case da.Z:if(n){if(ra(o,s,l,h,e,i,r))return!0}else a+=ca(o,s,l,h,i,r);o=l,s=h}}return n||function(t,e){return Math.abs(t-e)<pa}(s,h)||(a+=ca(o,s,l,h,i,r)||0),0!==a}var wa=gn.prototype.getCanvasPattern,ba=Math.abs,Sa=new ia(!0);function Ma(t){pi.call(this,t),this.path=null}Ma.prototype={constructor:Ma,type:"path",__dirtyPath:!0,strokeContainThreshold:5,segmentIgnoreThreshold:0,subPixelOptimize:!1,brush:function(t,e){var n,i=this.style,r=this.path||Sa,a=i.hasStroke(),o=i.hasFill(),s=i.fill,l=i.stroke,h=o&&!!s.colorStops,u=a&&!!l.colorStops,c=o&&!!s.image,d=a&&!!l.image;i.bind(t,this,e),this.setTransform(t),this.__dirty&&(h&&(n=n||this.getBoundingRect(),this._fillGradient=i.getGradient(t,s,n)),u&&(n=n||this.getBoundingRect(),this._strokeGradient=i.getGradient(t,l,n)));h?t.fillStyle=this._fillGradient:c&&(t.fillStyle=wa.call(s,t)),u?t.strokeStyle=this._strokeGradient:d&&(t.strokeStyle=wa.call(l,t));var f=i.lineDash,p=i.lineDashOffset,g=!!t.setLineDash,v=this.getGlobalScale();if(r.setScale(v[0],v[1],this.segmentIgnoreThreshold),this.__dirtyPath||f&&!g&&a?(r.beginPath(t),f&&!g&&(r.setLineDash(f),r.setLineDashOffset(p)),this.buildPath(r,this.shape,!1),this.path&&(this.__dirtyPath=!1)):(t.beginPath(),this.path.rebuildPath(t)),o)if(null!=i.fillOpacity){var m=t.globalAlpha;t.globalAlpha=i.fillOpacity*i.opacity,r.fill(t),t.globalAlpha=m}else r.fill(t);if(f&&g&&(t.setLineDash(f),t.lineDashOffset=p),a)if(null!=i.strokeOpacity){m=t.globalAlpha;t.globalAlpha=i.strokeOpacity*i.opacity,r.stroke(t),t.globalAlpha=m}else r.stroke(t);f&&g&&t.setLineDash([]),null!=i.text&&(this.restoreTransform(t),this.drawRectText(t,this.getBoundingRect()))},buildPath:function(t,e,n){},createPathProxy:function(){this.path=new ia},getBoundingRect:function(){var t=this._rect,e=this.style,n=!t;if(n){var i=this.path;i=i||(this.path=new ia),this.__dirtyPath&&(i.beginPath(),this.buildPath(i,this.shape,!1)),t=i.getBoundingRect()}if(this._rect=t,e.hasStroke()){var r=this._rectWithStroke||(this._rectWithStroke=t.clone());if(this.__dirty||n){r.copy(t);var a=e.lineWidth,o=e.strokeNoScale?this.getLineScale():1;e.hasFill()||(a=Math.max(a,this.strokeContainThreshold||4)),1e-10<o&&(r.width+=a/o,r.height+=a/o,r.x-=a/o/2,r.y-=a/o/2)}return r}return t},contain:function(t,e){var n=this.transformCoordToLocal(t,e),i=this.getBoundingRect(),r=this.style;if(t=n[0],e=n[1],i.contain(t,e)){var a=this.path.data;if(r.hasStroke()){var o=r.lineWidth,s=r.strokeNoScale?this.getLineScale():1;if(1e-10<s&&(r.hasFill()||(o=Math.max(o,this.strokeContainThreshold)),function(t,e,n,i){return xa(t,e,!0,n,i)}(a,o/s,t,e)))return!0}if(r.hasFill())return function(t,e,n){return xa(t,0,!1,e,n)}(a,t,e)}return!1},dirty:function(t){null==t&&(t=!0),t&&(this.__dirtyPath=t,this._rect=null),this.__dirty=this.__dirtyText=!0,this.__zr&&this.__zr.refresh(),this.__clipTarget&&this.__clipTarget.dirty()},animateShape:function(t){return this.animate("shape",t)},attrKV:function(t,e){"shape"===t?(this.setShape(e),this.__dirtyPath=!0,this._rect=null):pi.prototype.attrKV.call(this,t,e)},setShape:function(t,e){var n=this.shape;if(n){if(O(t))for(var i in t)t.hasOwnProperty(i)&&(n[i]=t[i]);else n[t]=e;this.dirty(!0)}return this},getLineScale:function(){var t=this.transform;return t&&1e-10<ba(t[0]-1)&&1e-10<ba(t[3]-1)?Math.sqrt(ba(t[0]*t[3]-t[2]*t[1])):1}},Ma.extend=function(r){function t(t){Ma.call(this,t),r.style&&this.style.extendFrom(r.style,!1);var e=r.shape;if(e){this.shape=this.shape||{};var n=this.shape;for(var i in e)!n.hasOwnProperty(i)&&e.hasOwnProperty(i)&&(n[i]=e[i])}r.init&&r.init.call(this,t)}for(var e in y(t,Ma),r)"style"!==e&&"shape"!==e&&(t.prototype[e]=r[e]);return t},y(Ma,pi);function Ia(t){return Math.sqrt(t[0]*t[0]+t[1]*t[1])}var Ta=ia.CMD,Ca=[[],[],[]],ka=Math.sqrt,Da=Math.atan2,Aa=function(t,e){var n,i,r,a,o,s=t.data,l=Ta.M,h=Ta.C,u=Ta.L,c=Ta.R,d=Ta.A,f=Ta.Q;for(a=r=0;r<s.length;){switch(n=s[r++],a=r,i=0,n){case l:case u:i=1;break;case h:i=3;break;case f:i=2;break;case d:var p=e[4],g=e[5],v=ka(e[0]*e[0]+e[1]*e[1]),m=ka(e[2]*e[2]+e[3]*e[3]),y=Da(-e[1]/m,e[0]/v);s[r]*=v,s[r++]+=p,s[r]*=m,s[r++]+=g,s[r++]*=v,s[r++]*=m,s[r++]+=y,s[r++]+=y,a=r+=2;break;case c:_[0]=s[r++],_[1]=s[r++],st(_,_,e),s[a++]=_[0],s[a++]=_[1],_[0]+=s[r++],_[1]+=s[r++],st(_,_,e),s[a++]=_[0],s[a++]=_[1]}for(o=0;o<i;o++){var _;(_=Ca[o])[0]=s[r++],_[1]=s[r++],st(_,_,e),s[a++]=_[0],s[a++]=_[1]}}},La=Math.sqrt,Pa=Math.sin,Oa=Math.cos,Ea=Math.PI,Na=function(t,e){return(t[0]*e[0]+t[1]*e[1])/(Ia(t)*Ia(e))},Ba=function(t,e){return(t[0]*e[1]<t[1]*e[0]?-1:1)*Math.acos(Na(t,e))};function za(t,e,n,i,r,a,o,s,l,h,u){var c=l*(Ea/180),d=Oa(c)*(t-n)/2+Pa(c)*(e-i)/2,f=-1*Pa(c)*(t-n)/2+Oa(c)*(e-i)/2,p=d*d/(o*o)+f*f/(s*s);1<p&&(o*=La(p),s*=La(p));var g=(r===a?-1:1)*La((o*o*(s*s)-o*o*(f*f)-s*s*(d*d))/(o*o*(f*f)+s*s*(d*d)))||0,v=g*o*f/s,m=g*-s*d/o,y=(t+n)/2+Oa(c)*v-Pa(c)*m,_=(e+i)/2+Pa(c)*v+Oa(c)*m,x=Ba([1,0],[(d-v)/o,(f-m)/s]),w=[(d-v)/o,(f-m)/s],b=[(-1*d-v)/o,(-1*f-m)/s],S=Ba(w,b);Na(w,b)<=-1&&(S=Ea),1<=Na(w,b)&&(S=0),0===a&&0<S&&(S-=2*Ea),1===a&&S<0&&(S+=2*Ea),u.addData(h,y,_,o,s,x,S,c,a)}var Ra=/([mlvhzcqtsa])([^mlvhzcqtsa]*)/gi,Fa=/-?([0-9]*\.)?[0-9]+([eE]-?[0-9]+)?/g;function Va(t,e){var n=function(t){if(!t)return new ia;for(var e,n=0,i=0,r=n,a=i,o=new ia,s=ia.CMD,l=t.match(Ra),h=0;h<l.length;h++){for(var u,c=l[h],d=c.charAt(0),f=c.match(Fa)||[],p=f.length,g=0;g<p;g++)f[g]=parseFloat(f[g]);for(var v=0;v<p;){var m,y,_,x,w,b,S,M=n,I=i;switch(d){case"l":n+=f[v++],i+=f[v++],u=s.L,o.addData(u,n,i);break;case"L":n=f[v++],i=f[v++],u=s.L,o.addData(u,n,i);break;case"m":n+=f[v++],i+=f[v++],u=s.M,o.addData(u,n,i),r=n,a=i,d="l";break;case"M":n=f[v++],i=f[v++],u=s.M,o.addData(u,n,i),r=n,a=i,d="L";break;case"h":n+=f[v++],u=s.L,o.addData(u,n,i);break;case"H":n=f[v++],u=s.L,o.addData(u,n,i);break;case"v":i+=f[v++],u=s.L,o.addData(u,n,i);break;case"V":i=f[v++],u=s.L,o.addData(u,n,i);break;case"C":u=s.C,o.addData(u,f[v++],f[v++],f[v++],f[v++],f[v++],f[v++]),n=f[v-2],i=f[v-1];break;case"c":u=s.C,o.addData(u,f[v++]+n,f[v++]+i,f[v++]+n,f[v++]+i,f[v++]+n,f[v++]+i),n+=f[v-2],i+=f[v-1];break;case"S":m=n,y=i;var T=o.len(),C=o.data;e===s.C&&(m+=n-C[T-4],y+=i-C[T-3]),u=s.C,M=f[v++],I=f[v++],n=f[v++],i=f[v++],o.addData(u,m,y,M,I,n,i);break;case"s":m=n,y=i;T=o.len(),C=o.data;e===s.C&&(m+=n-C[T-4],y+=i-C[T-3]),u=s.C,M=n+f[v++],I=i+f[v++],n+=f[v++],i+=f[v++],o.addData(u,m,y,M,I,n,i);break;case"Q":M=f[v++],I=f[v++],n=f[v++],i=f[v++],u=s.Q,o.addData(u,M,I,n,i);break;case"q":M=f[v++]+n,I=f[v++]+i,n+=f[v++],i+=f[v++],u=s.Q,o.addData(u,M,I,n,i);break;case"T":m=n,y=i;T=o.len(),C=o.data;e===s.Q&&(m+=n-C[T-4],y+=i-C[T-3]),n=f[v++],i=f[v++],u=s.Q,o.addData(u,m,y,n,i);break;case"t":m=n,y=i;T=o.len(),C=o.data;e===s.Q&&(m+=n-C[T-4],y+=i-C[T-3]),n+=f[v++],i+=f[v++],u=s.Q,o.addData(u,m,y,n,i);break;case"A":_=f[v++],x=f[v++],w=f[v++],b=f[v++],S=f[v++],za(M=n,I=i,n=f[v++],i=f[v++],b,S,_,x,w,u=s.A,o);break;case"a":_=f[v++],x=f[v++],w=f[v++],b=f[v++],S=f[v++],za(M=n,I=i,n+=f[v++],i+=f[v++],b,S,_,x,w,u=s.A,o)}}"z"!==d&&"Z"!==d||(u=s.Z,o.addData(u),n=r,i=a),e=u}return o.toStatic(),o}(t);return(e=e||{}).buildPath=function(t){if(t.setData){t.setData(n.data),(e=t.getContext())&&t.rebuildPath(e)}else{var e=t;n.rebuildPath(e)}},e.applyTransform=function(t){Aa(n,t),this.dirty(!0)},e}function Wa(t,e){return new Ma(Va(t,e))}function Ha(t){pi.call(this,t)}Ha.prototype={constructor:Ha,type:"text",brush:function(t,e){var n=this.style;this.__dirty&&Kn(n),n.fill=n.stroke=n.shadowBlur=n.shadowColor=n.shadowOffsetX=n.shadowOffsetY=null;var i=n.text;null!=i&&(i+=""),ci(i,n)?(this.setTransform(t),Jn(this,t,i,n,null,e),this.restoreTransform(t)):t.__attrCachedBy=on.NONE},getBoundingRect:function(){var t=this.style;if(this.__dirty&&Kn(t),!this._rect){var e=t.text;null!=e?e+="":e="";var n=Pn(t.text+"",t.font,t.textAlign,t.textVerticalAlign,t.textPadding,t.textLineHeight,t.rich);if(n.x+=t.x||0,n.y+=t.y||0,si(t.textStroke,t.textStrokeWidth)){var i=t.textStrokeWidth;n.x-=i/2,n.y-=i/2,n.width+=i,n.height+=i}this._rect=n}return this._rect}},y(Ha,pi);function Ga(l){return m.browser.ie&&11<=m.browser.version?function(){var t,e=this.__clipPaths,n=this.style;if(e)for(var i=0;i<e.length;i++){var r=e[i],a=r&&r.shape,o=r&&r.type;if(a&&("sector"===o&&a.startAngle===a.endAngle||"rect"===o&&(!a.width||!a.height))){for(var s=0;s<qa.length;s++)qa[s][2]=n[qa[s][0]],n[qa[s][0]]=qa[s][1];t=!0;break}}if(l.apply(this,arguments),t)for(s=0;s<qa.length;s++)n[qa[s][0]]=qa[s][2]}:l}var Xa=Ma.extend({type:"circle",shape:{cx:0,cy:0,r:0},buildPath:function(t,e,n){n&&t.moveTo(e.cx+e.r,e.cy),t.arc(e.cx,e.cy,e.r,0,2*Math.PI,!0)}}),qa=[["shadowBlur",0],["shadowColor","#000"],["shadowOffsetX",0],["shadowOffsetY",0]],Ya=Ma.extend({type:"sector",shape:{cx:0,cy:0,r0:0,r:0,startAngle:0,endAngle:2*Math.PI,clockwise:!0},brush:Ga(Ma.prototype.brush),buildPath:function(t,e){var n=e.cx,i=e.cy,r=Math.max(e.r0||0,0),a=Math.max(e.r,0),o=e.startAngle,s=e.endAngle,l=e.clockwise,h=Math.cos(o),u=Math.sin(o);t.moveTo(h*r+n,u*r+i),t.lineTo(h*a+n,u*a+i),t.arc(n,i,a,o,s,!l),t.lineTo(Math.cos(s)*r+n,Math.sin(s)*r+i),0!==r&&t.arc(n,i,r,s,o,l),t.closePath()}}),Ua=Ma.extend({type:"ring",shape:{cx:0,cy:0,r:0,r0:0},buildPath:function(t,e){var n=e.cx,i=e.cy,r=2*Math.PI;t.moveTo(n+e.r,i),t.arc(n,i,e.r,0,r,!1),t.moveTo(n+e.r0,i),t.arc(n,i,e.r0,0,r,!0)}});function ja(t,e,n,i,r,a,o){var s=.5*(n-t),l=.5*(i-e);return(2*(e-n)+s+l)*o+(-3*(e-n)-2*s-l)*a+s*r+e}function Za(t,e,n){var i=e.points,r=e.smooth;if(i&&2<=i.length){if(r&&"spline"!==r){var a=function(t,e,n,i){var r,a,o,s,l=[],h=[],u=[],c=[];if(i){o=[1/0,1/0],s=[-1/0,-1/0];for(var d=0,f=t.length;d<f;d++)lt(o,o,t[d]),ht(s,s,t[d]);lt(o,o,i[0]),ht(s,s,i[1])}for(d=0,f=t.length;d<f;d++){var p=t[d];if(n)r=t[d?d-1:f-1],a=t[(d+1)%f];else{if(0===d||d===f-1){l.push(J(t[d]));continue}r=t[d-1],a=t[d+1]}et(h,a,r),nt(h,h,e);var g=rt(p,r),v=rt(p,a),m=g+v;0!==m&&(g/=m,v/=m),nt(u,h,-g),nt(c,h,v);var y=tt([],p,u),_=tt([],p,c);i&&(ht(y,y,o),lt(y,y,s),ht(_,_,o),lt(_,_,s)),l.push(y),l.push(_)}return n&&l.push(l.shift()),l}(i,r,n,e.smoothConstraint);t.moveTo(i[0][0],i[0][1]);for(var o=i.length,s=0;s<(n?o:o-1);s++){var l=a[2*s],h=a[2*s+1],u=i[(s+1)%o];t.bezierCurveTo(l[0],l[1],h[0],h[1],u[0],u[1])}}else{"spline"===r&&(i=function(t,e){for(var n=t.length,i=[],r=0,a=1;a<n;a++)r+=rt(t[a-1],t[a]);var o=r/2;o=o<n?n:o;for(a=0;a<o;a++){var s,l,h,u=a/(o-1)*(e?n:n-1),c=Math.floor(u),d=u-c,f=t[c%n];h=e?(s=t[(c-1+n)%n],l=t[(c+1)%n],t[(c+2)%n]):(s=t[0===c?c:c-1],l=t[n-2<c?n-1:c+1],t[n-3<c?n-1:c+2]);var p=d*d,g=d*p;i.push([ja(s[0],f[0],l[0],h[0],d,p,g),ja(s[1],f[1],l[1],h[1],d,p,g)])}return i}(i,n)),t.moveTo(i[0][0],i[0][1]);s=1;for(var c=i.length;s<c;s++)t.lineTo(i[s][0],i[s][1])}n&&t.closePath()}}var $a=Ma.extend({type:"polygon",shape:{points:null,smooth:!1,smoothConstraint:null},buildPath:function(t,e){Za(t,e,!0)}}),Ka=Ma.extend({type:"polyline",shape:{points:null,smooth:!1,smoothConstraint:null},style:{stroke:"#000",fill:null},buildPath:function(t,e){Za(t,e,!1)}}),Qa=Math.round;function Ja(t,e,n){var i=n&&n.lineWidth;if(e&&i){var r=e.x1,a=e.x2,o=e.y1,s=e.y2;Qa(2*r)===Qa(2*a)?t.x1=t.x2=eo(r,i,!0):(t.x1=r,t.x2=a),Qa(2*o)===Qa(2*s)?t.y1=t.y2=eo(o,i,!0):(t.y1=o,t.y2=s)}}function to(t,e,n){var i=n&&n.lineWidth;if(e&&i){var r=e.x,a=e.y,o=e.width,s=e.height;t.x=eo(r,i,!0),t.y=eo(a,i,!0),t.width=Math.max(eo(r+o,i,!1)-t.x,0===o?0:1),t.height=Math.max(eo(a+s,i,!1)-t.y,0===s?0:1)}}function eo(t,e,n){var i=Qa(2*t);return(i+Qa(e))%2==0?i/2:(i+(n?1:-1))/2}var no={},io=Ma.extend({type:"rect",shape:{r:0,x:0,y:0,width:0,height:0},buildPath:function(t,e){var n,i,r,a;this.subPixelOptimize?(to(no,e,this.style),n=no.x,i=no.y,r=no.width,a=no.height,no.r=e.r,e=no):(n=e.x,i=e.y,r=e.width,a=e.height),e.r?Xn(t,e):t.rect(n,i,r,a),t.closePath()}}),ro={},ao=Ma.extend({type:"line",shape:{x1:0,y1:0,x2:0,y2:0,percent:1},style:{stroke:"#000",fill:null},buildPath:function(t,e){var n,i,r,a;a=this.subPixelOptimize?(Ja(ro,e,this.style),n=ro.x1,i=ro.y1,r=ro.x2,ro.y2):(n=e.x1,i=e.y1,r=e.x2,e.y2);var o=e.percent;0!==o&&(t.moveTo(n,i),o<1&&(r=n*(1-o)+r*o,a=i*(1-o)+a*o),t.lineTo(r,a))},pointAt:function(t){var e=this.shape;return[e.x1*(1-t)+e.x2*t,e.y1*(1-t)+e.y2*t]}}),oo=[];function so(t,e,n){var i=t.cpx2,r=t.cpy2;return null===i||null===r?[(n?Ir:Mr)(t.x1,t.cpx1,t.cpx2,t.x2,e),(n?Ir:Mr)(t.y1,t.cpy1,t.cpy2,t.y2,e)]:[(n?Dr:kr)(t.x1,t.cpx1,t.x2,e),(n?Dr:kr)(t.y1,t.cpy1,t.y2,e)]}function lo(t){this.colorStops=t||[]}var ho=Ma.extend({type:"bezier-curve",shape:{x1:0,y1:0,x2:0,y2:0,cpx1:0,cpy1:0,percent:1},style:{stroke:"#000",fill:null},buildPath:function(t,e){var n=e.x1,i=e.y1,r=e.x2,a=e.y2,o=e.cpx1,s=e.cpy1,l=e.cpx2,h=e.cpy2,u=e.percent;0!==u&&(t.moveTo(n,i),null==l||null==h?(u<1&&(Lr(n,o,r,u,oo),o=oo[1],r=oo[2],Lr(i,s,a,u,oo),s=oo[1],a=oo[2]),t.quadraticCurveTo(o,s,r,a)):(u<1&&(Cr(n,o,l,r,u,oo),o=oo[1],l=oo[2],r=oo[3],Cr(i,s,h,a,u,oo),s=oo[1],h=oo[2],a=oo[3]),t.bezierCurveTo(o,s,l,h,r,a)))},pointAt:function(t){return so(this.shape,t,!1)},tangentAt:function(t){var e=so(this.shape,t,!0);return it(e,e)}}),uo=Ma.extend({type:"arc",shape:{cx:0,cy:0,r:0,startAngle:0,endAngle:2*Math.PI,clockwise:!0},style:{stroke:"#000",fill:null},buildPath:function(t,e){var n=e.cx,i=e.cy,r=Math.max(e.r,0),a=e.startAngle,o=e.endAngle,s=e.clockwise,l=Math.cos(a),h=Math.sin(a);t.moveTo(l*r+n,h*r+i),t.arc(n,i,r,a,o,!s)}}),co=Ma.extend({type:"compound",shape:{paths:null},_updatePathDirty:function(){for(var t=this.__dirtyPath,e=this.shape.paths,n=0;n<e.length;n++)t=t||e[n].__dirtyPath;this.__dirtyPath=t,this.__dirty=this.__dirty||t},beforeBrush:function(){this._updatePathDirty();for(var t=this.shape.paths||[],e=this.getGlobalScale(),n=0;n<t.length;n++)t[n].path||t[n].createPathProxy(),t[n].path.setScale(e[0],e[1],t[n].segmentIgnoreThreshold)},buildPath:function(t,e){for(var n=e.paths||[],i=0;i<n.length;i++)n[i].buildPath(t,n[i].shape,!0)},afterBrush:function(){for(var t=this.shape.paths||[],e=0;e<t.length;e++)t[e].__dirtyPath=!1},getBoundingRect:function(){return this._updatePathDirty(),Ma.prototype.getBoundingRect.call(this)}});lo.prototype={constructor:lo,addColorStop:function(t,e){this.colorStops.push({offset:t,color:e})}};function fo(t,e,n,i,r,a){this.x=null==t?0:t,this.y=null==e?0:e,this.x2=null==n?1:n,this.y2=null==i?0:i,this.type="linear",this.global=a||!1,lo.call(this,r)}fo.prototype={constructor:fo},y(fo,lo);function po(t,e,n,i,r){this.x=null==t?.5:t,this.y=null==e?.5:e,this.r=null==n?.5:n,this.type="radial",this.global=r||!1,lo.call(this,i)}function go(t){pi.call(this,t),this._displayables=[],this._temporaryDisplayables=[],this._cursor=0,this.notClear=!0}po.prototype={constructor:po},y(po,lo),go.prototype.incremental=!0,go.prototype.clearDisplaybles=function(){this._displayables=[],this._temporaryDisplayables=[],this._cursor=0,this.dirty(),this.notClear=!1},go.prototype.addDisplayable=function(t,e){e?this._temporaryDisplayables.push(t):this._displayables.push(t),this.dirty()},go.prototype.addDisplayables=function(t,e){e=e||!1;for(var n=0;n<t.length;n++)this.addDisplayable(t[n],e)},go.prototype.eachPendingDisplayable=function(t){for(var e=this._cursor;e<this._displayables.length;e++)t&&t(this._displayables[e]);for(e=0;e<this._temporaryDisplayables.length;e++)t&&t(this._temporaryDisplayables[e])},go.prototype.update=function(){this.updateTransform();for(var t=this._cursor;t<this._displayables.length;t++){(e=this._displayables[t]).parent=this,e.update(),e.parent=null}for(t=0;t<this._temporaryDisplayables.length;t++){var e;(e=this._temporaryDisplayables[t]).parent=this,e.update(),e.parent=null}},go.prototype.brush=function(t,e){for(var n=this._cursor;n<this._displayables.length;n++){(i=this._displayables[n]).beforeBrush&&i.beforeBrush(t),i.brush(t,n===this._cursor?null:this._displayables[n-1]),i.afterBrush&&i.afterBrush(t)}this._cursor=n;for(n=0;n<this._temporaryDisplayables.length;n++){var i;(i=this._temporaryDisplayables[n]).beforeBrush&&i.beforeBrush(t),i.brush(t,0===n?null:this._temporaryDisplayables[n-1]),i.afterBrush&&i.afterBrush(t)}this._temporaryDisplayables=[],this.notClear=!0};var vo=[];go.prototype.getBoundingRect=function(){if(!this._rect){for(var t=new qe(1/0,1/0,-1/0,-1/0),e=0;e<this._displayables.length;e++){var n=this._displayables[e],i=n.getBoundingRect().clone();n.needLocalTransform()&&i.applyTransform(n.getLocalTransform(vo)),t.union(i)}this._rect=t}return this._rect},go.prototype.contain=function(t,e){var n=this.transformCoordToLocal(t,e);if(this.getBoundingRect().contain(n[0],n[1]))for(var i=0;i<this._displayables.length;i++){if(this._displayables[i].contain(t,e))return!0}return!1},y(go,pi);var mo=Math.max,yo=Math.min,_o={},xo=1,wo="emphasis",bo="normal",So=1,Mo={};function Io(t){return Ma.extend(t)}function To(t,e,n,i){var r=Wa(t,e);return n&&("center"===i&&(n=ko(n,r.getBoundingRect())),Ao(r,n)),r}function Co(t,n,i){var r=new gi({style:{image:t,x:n.x,y:n.y,width:n.width,height:n.height},onload:function(t){if("center"===i){var e={width:t.width,height:t.height};r.setStyle(ko(n,e))}}});return r}function ko(t,e){var n,i=e.width/e.height,r=t.height*i;return n=r<=t.width?t.height:(r=t.width)/i,{x:t.x+t.width/2-r/2,y:t.y+t.height/2-n/2,width:r,height:n}}function Do(t,e){for(var n=[],i=t.length,r=0;r<i;r++){var a=t[r];a.path||a.createPathProxy(),a.__dirtyPath&&a.buildPath(a.path,a.shape,!0),n.push(a.path)}var o=new Ma(e);return o.createPathProxy(),o.buildPath=function(t){t.appendPath(n);var e=t.getContext();e&&t.rebuildPath(e)},o}function Ao(t,e){if(t.applyTransform){var n=t.getBoundingRect().calculateTransform(e);t.applyTransform(n)}}var Lo=eo;function Po(t){return null!=t&&"none"!==t}var Oo=Z(),Eo=0;function No(t){if("string"!=typeof t)return t;var e=Oo.get(t);return e||(e=function(t,e){var n=fe(t);if(n){for(var i=0;i<3;i++)n[i]=e<0?n[i]*(1-e)|0:(255-n[i])*e+n[i]|0,255<n[i]?n[i]=255:t[i]<0&&(n[i]=0);return ge(n,4===n.length?"rgba":"rgb")}}(t,-.1),Eo<1e4&&(Oo.set(t,e),Eo++)),e}function Bo(t){var e=t.__hoverStl;if(e&&!t.__highlighted){var n=t.useHoverLayer;t.__highlighted=n?"layer":"plain";var i=t.__zr;if(!(t.isGroup||!i&&n)){var r=t,a=t.style;n&&(a=(r=i.addHover(t)).style),ns(a),n||function(t){if(t.__hoverStlDirty){t.__hoverStlDirty=!1;var e=t.__hoverStl;if(e){var n=t.__cachedNormalStl={};t.__cachedNormalZ2=t.z2;var i=t.style;for(var r in e)null!=e[r]&&(n[r]=i[r]);n.fill=i.fill,n.stroke=i.stroke}else t.__cachedNormalStl=t.__cachedNormalZ2=null}}(r),a.extendFrom(e),zo(a,e,"fill"),zo(a,e,"stroke"),es(a),n||(t.dirty(!1),t.z2+=xo)}}}function zo(t,e,n){!Po(e[n])&&Po(t[n])&&(t[n]=No(t[n]))}function Ro(t){var e=t.__highlighted;if(e&&(t.__highlighted=!1,!t.isGroup))if("layer"===e)t.__zr&&t.__zr.removeHover(t);else{var n=t.style,i=t.__cachedNormalStl;i&&(ns(n),t.setStyle(i),es(n));var r=t.__cachedNormalZ2;null!=r&&t.z2-r===xo&&(t.z2=r)}}function Fo(t,e,n){var i,r=bo,a=bo;t.__highlighted&&(r=wo,i=!0),e(t,n),t.__highlighted&&(a=wo,i=!0),t.isGroup&&t.traverse(function(t){t.isGroup||e(t,n)}),i&&t.__highDownOnUpdate&&t.__highDownOnUpdate(r,a)}function Vo(t,e){e=t.__hoverStl=!1!==e&&(t.hoverStyle||e||{}),t.__hoverStlDirty=!0,t.__highlighted&&(t.__cachedNormalStl=null,Ro(t),Bo(t))}function Wo(t){qo(this,t)||this.__highByOuter||Fo(this,Bo)}function Ho(t){qo(this,t)||this.__highByOuter||Fo(this,Ro)}function Go(t){this.__highByOuter|=1<<(t||0),Fo(this,Bo)}function Xo(t){(this.__highByOuter&=~(1<<(t||0)))||Fo(this,Ro)}function qo(t,e){return t.__highDownSilentOnTouch&&e.zrByTouch}function Yo(t,e){Uo(t,!0),Fo(t,Vo,e)}function Uo(t,e){var n=!1===e;if(t.__highDownSilentOnTouch=t.highDownSilentOnTouch,t.__highDownOnUpdate=t.highDownOnUpdate,!n||t.__highDownDispatcher){var i=n?"off":"on";t[i]("mouseover",Wo)[i]("mouseout",Ho),t[i]("emphasis",Go)[i]("normal",Xo),t.__highByOuter=t.__highByOuter||0,t.__highDownDispatcher=!n}}function jo(t){return!(!t||!t.__highDownDispatcher)}function Zo(t){var e=Mo[t];return null==e&&So<=32&&(e=Mo[t]=So++),e}function $o(t,e,n,i,r,a,o){var s,l=(r=r||_o).labelFetcher,h=r.labelDataIndex,u=r.labelDimIndex,c=n.getShallow("show"),d=i.getShallow("show");(c||d)&&(l&&(s=l.getFormattedLabel(h,"normal",null,u)),null==s&&(s=T(r.defaultText)?r.defaultText(h,r):r.defaultText));var f=c?s:null,p=d?F(l?l.getFormattedLabel(h,"emphasis",null,u):null,s):null;null==f&&null==p||(Ko(t,n,a,r),Ko(e,i,o,r,!0)),t.text=f,e.text=p}function Ko(t,e,n,i,r){return Qo(t,e,i,r),n&&S(t,n),t}function Qo(t,e,n,i){if((n=n||_o).isRectText){var r=e.getShallow("position")||(i?null:"inside");"outside"===r&&(r="top"),t.textPosition=r,t.textOffset=e.getShallow("offset");var a=e.getShallow("rotate");null!=a&&(a*=Math.PI/180),t.textRotation=a,t.textDistance=F(e.getShallow("distance"),i?null:5)}var o,s=e.ecModel,l=s&&s.option.textStyle,h=function(t){var e;for(;t&&t!==t.ecModel;){var n=(t.option||_o).rich;if(n)for(var i in e=e||{},n)n.hasOwnProperty(i)&&(e[i]=1);t=t.parentModel}return e}(e);if(h)for(var u in o={},h)if(h.hasOwnProperty(u)){var c=e.getModel(["rich",u]);Jo(o[u]={},c,l,n,i)}return t.rich=o,Jo(t,e,l,n,i,!0),n.forceRich&&!n.textStyle&&(n.textStyle={}),t}function Jo(t,e,n,i,r,a){n=!r&&n||_o,t.textFill=ts(e.getShallow("color"),i)||n.color,t.textStroke=ts(e.getShallow("textBorderColor"),i)||n.textBorderColor,t.textStrokeWidth=F(e.getShallow("textBorderWidth"),n.textBorderWidth),r||(a&&(t.insideRollbackOpt=i,es(t)),null==t.textFill&&(t.textFill=i.autoColor)),t.fontStyle=e.getShallow("fontStyle")||n.fontStyle,t.fontWeight=e.getShallow("fontWeight")||n.fontWeight,t.fontSize=e.getShallow("fontSize")||n.fontSize,t.fontFamily=e.getShallow("fontFamily")||n.fontFamily,t.textAlign=e.getShallow("align"),t.textVerticalAlign=e.getShallow("verticalAlign")||e.getShallow("baseline"),t.textLineHeight=e.getShallow("lineHeight"),t.textWidth=e.getShallow("width"),t.textHeight=e.getShallow("height"),t.textTag=e.getShallow("tag"),a&&i.disableBox||(t.textBackgroundColor=ts(e.getShallow("backgroundColor"),i),t.textPadding=e.getShallow("padding"),t.textBorderColor=ts(e.getShallow("borderColor"),i),t.textBorderWidth=e.getShallow("borderWidth"),t.textBorderRadius=e.getShallow("borderRadius"),t.textBoxShadowColor=e.getShallow("shadowColor"),t.textBoxShadowBlur=e.getShallow("shadowBlur"),t.textBoxShadowOffsetX=e.getShallow("shadowOffsetX"),t.textBoxShadowOffsetY=e.getShallow("shadowOffsetY")),t.textShadowColor=e.getShallow("textShadowColor")||n.textShadowColor,t.textShadowBlur=e.getShallow("textShadowBlur")||n.textShadowBlur,t.textShadowOffsetX=e.getShallow("textShadowOffsetX")||n.textShadowOffsetX,t.textShadowOffsetY=e.getShallow("textShadowOffsetY")||n.textShadowOffsetY}function ts(t,e){return"auto"!==t?t:e&&e.autoColor?e.autoColor:null}function es(t){var e,n=t.textPosition,i=t.insideRollbackOpt;if(i&&null==t.textFill){var r=i.autoColor,a=i.isRectText,o=i.useInsideStyle,s=!1!==o&&(!0===o||a&&n&&"string"==typeof n&&0<=n.indexOf("inside")),l=!s&&null!=r;(s||l)&&(e={textFill:t.textFill,textStroke:t.textStroke,textStrokeWidth:t.textStrokeWidth}),s&&(t.textFill="#fff",null==t.textStroke&&(t.textStroke=r,null==t.textStrokeWidth&&(t.textStrokeWidth=2))),l&&(t.textFill=r)}t.insideRollback=e}function ns(t){var e=t.insideRollback;e&&(t.textFill=e.textFill,t.textStroke=e.textStroke,t.textStrokeWidth=e.textStrokeWidth,t.insideRollback=null)}function is(t,e){var n=e||e.getModel("textStyle");return X([t.fontStyle||n&&n.getShallow("fontStyle")||"",t.fontWeight||n&&n.getShallow("fontWeight")||"",(t.fontSize||n&&n.getShallow("fontSize")||12)+"px",t.fontFamily||n&&n.getShallow("fontFamily")||"sans-serif"].join(" "))}function rs(t,e,n,i,r,a){if("function"==typeof r&&(a=r,r=null),i&&i.isAnimationEnabled()){var o=t?"Update":"",s=i.getShallow("animationDuration"+o),l=i.getShallow("animationEasing"+o),h=i.getShallow("animationDelay"+o);"function"==typeof h&&(h=h(r,i.getAnimationDelayParams?i.getAnimationDelayParams(e,r):null)),"function"==typeof s&&(s=s(r)),0<s?e.animateTo(n,s,h||0,l,a,!!a):(e.stopAnimation(),e.attr(n),a&&a())}else e.stopAnimation(),e.attr(n),a&&a()}function as(t,e,n,i,r){rs(!0,t,e,n,i,r)}function os(t,e,n,i,r){rs(!1,t,e,n,i,r)}function ss(t,e,n){return e&&!P(e)&&(e=Xt.getLocalTransform(e)),n&&(e=Wt([],e)),st([],t,e)}function ls(t,e,i,n){if(t&&e){var r,a=(r={},t.traverse(function(t){!t.isGroup&&t.anid&&(r[t.anid]=t)}),r);e.traverse(function(t){if(!t.isGroup&&t.anid){var e=a[t.anid];if(e){var n=o(t);t.attr(o(e)),as(t,n,i,t.dataIndex)}}})}function o(t){var e={position:J(t.position),rotation:t.rotation};return t.shape&&(e.shape=S({},t.shape)),e}}var hs=(Object.freeze||Object)({Z2_EMPHASIS_LIFT:xo,CACHED_LABEL_STYLE_PROPERTIES:{color:"textFill",textBorderColor:"textStroke",textBorderWidth:"textStrokeWidth"},extendShape:Io,extendPath:function(t,e){return function(t,e){return Ma.extend(Va(t,e))}(t,e)},makePath:To,makeImage:Co,mergePath:Do,resizePath:Ao,subPixelOptimizeLine:function(t){return Ja(t.shape,t.shape,t.style),t},subPixelOptimizeRect:function(t){return to(t.shape,t.shape,t.style),t},subPixelOptimize:Lo,setElementHoverStyle:Vo,setHoverStyle:Yo,setAsHighDownDispatcher:Uo,isHighDownDispatcher:jo,getHighlightDigit:Zo,setLabelStyle:$o,modifyLabelStyle:function(t,e,n){var i=t.style;e&&(ns(i),t.setStyle(e),es(i)),i=t.__hoverStl,n&&i&&(ns(i),S(i,n),es(i))},setTextStyle:Ko,setText:function(t,e,n){var i,r={isRectText:!0};!1===n?i=!0:r.autoColor=n,Qo(t,e,r,i)},getFont:is,updateProps:as,initProps:os,getTransform:function(t,e){for(var n=Bt([]);t&&t!==e;)zt(n,t.getLocalTransform(),n),t=t.parent;return n},applyTransform:ss,transformDirection:function(t,e,n){var i=0===e[4]||0===e[5]||0===e[0]?1:Math.abs(2*e[4]/e[0]),r=0===e[4]||0===e[5]||0===e[2]?1:Math.abs(2*e[4]/e[2]),a=["left"===t?-i:"right"===t?i:0,"top"===t?-r:"bottom"===t?r:0];return a=ss(a,e,n),Math.abs(a[0])>Math.abs(a[1])?0<a[0]?"right":"left":0<a[1]?"bottom":"top"},groupTransition:ls,clipPointsByRect:function(t,i){return D(t,function(t){var e=t[0];e=mo(e,i.x),e=yo(e,i.x+i.width);var n=t[1];return n=mo(n,i.y),[e,n=yo(n,i.y+i.height)]})},clipRectByRect:function(t,e){var n=mo(t.x,e.x),i=yo(t.x+t.width,e.x+e.width),r=mo(t.y,e.y),a=yo(t.y+t.height,e.y+e.height);if(n<=i&&r<=a)return{x:n,y:r,width:i-n,height:a-r}},createIcon:function(t,e,n){var i=(e=S({rectHover:!0},e)).style={strokeNoScale:!0};if(n=n||{x:-1,y:-1,width:2,height:2},t)return 0===t.indexOf("image://")?(i.image=t.slice(8),C(i,n),new gi(e)):To(t.replace("path://",""),e,n,"center")},Group:Ye,Image:gi,Text:Ha,Circle:Xa,Sector:Ya,Ring:Ua,Polygon:$a,Polyline:Ka,Rect:io,Line:ao,BezierCurve:ho,Arc:uo,IncrementalDisplayable:go,CompoundPath:co,LinearGradient:fo,RadialGradient:po,BoundingRect:qe}),us=["textStyle","color"],cs={getTextColor:function(t){var e=this.ecModel;return this.getShallow("color")||(!t&&e?e.get(us):null)},getFont:function(){return is({fontStyle:this.getShallow("fontStyle"),fontWeight:this.getShallow("fontWeight"),fontSize:this.getShallow("fontSize"),fontFamily:this.getShallow("fontFamily")},this.ecModel)},getTextRect:function(t){return Pn(t,this.getFont(),this.getShallow("align"),this.getShallow("verticalAlign")||this.getShallow("baseline"),this.getShallow("padding"),this.getShallow("lineHeight"),this.getShallow("rich"),this.getShallow("truncateText"))}},ds=lr([["fill","color"],["stroke","borderColor"],["lineWidth","borderWidth"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"],["textPosition"],["textAlign"]]),fs={getItemStyle:function(t,e){var n=ds(this,t,e),i=this.getBorderLineDash();return i&&(n.lineDash=i),n},getBorderLineDash:function(){var t=this.get("borderType");return"solid"===t||null==t?null:"dashed"===t?[5,5]:[1,1]}},ps=_,gs=ji();function vs(t,e,n){this.parentModel=e,this.ecModel=n,this.option=t}function ms(t,e,n){for(var i=0;i<e.length&&(!e[i]||null!=(t=t&&"object"==typeof t?t[e[i]]:null));i++);return null==t&&n&&(t=n.get(e)),t}function ys(t,e){var n=gs(t).getParent;return n?n.call(t,e):t.parentModel}vs.prototype={constructor:vs,init:null,mergeOption:function(t){f(this.option,t,!0)},get:function(t,e){return null==t?this.option:ms(this.option,this.parsePath(t),!e&&ys(this,t))},getShallow:function(t,e){var n=this.option,i=null==n?n:n[t],r=!e&&ys(this,t);return null==i&&r&&(i=r.getShallow(t)),i},getModel:function(t,e){var n;return new vs(null==t?this.option:ms(this.option,t=this.parsePath(t)),e=e||(n=ys(this,t))&&n.getModel(t),this.ecModel)},isEmpty:function(){return null==this.option},restoreData:function(){},clone:function(){return new this.constructor(b(this.option))},setReadOnly:function(t){},parsePath:function(t){return"string"==typeof t&&(t=t.split(".")),t},customizeGetParent:function(t){gs(this).getParent=t},isAnimationEnabled:function(){if(!m.node){if(null!=this.option.animation)return!!this.option.animation;if(this.parentModel)return this.parentModel.isAnimationEnabled()}}},nr(vs),rr(vs),ps(vs,ur),ps(vs,dr),ps(vs,cs),ps(vs,fs);var _s=0;function xs(t){return[t||"",_s++,Math.random().toFixed(5)].join("_")}var ws=1e-4;function bs(t,e,n,i){var r=e[1]-e[0],a=n[1]-n[0];if(0==r)return 0==a?n[0]:(n[0]+n[1])/2;if(i)if(0<r){if(t<=e[0])return n[0];if(t>=e[1])return n[1]}else{if(t>=e[0])return n[0];if(t<=e[1])return n[1]}else{if(t===e[0])return n[0];if(t===e[1])return n[1]}return(t-e[0])/r*a+n[0]}function Ss(t,e){switch(t){case"center":case"middle":t="50%";break;case"left":case"top":t="0%";break;case"right":case"bottom":t="100%"}return"string"==typeof t?function(t){return t.replace(/^\s+/,"").replace(/\s+$/,"")}(t).match(/%$/)?parseFloat(t)/100*e:parseFloat(t):null==t?NaN:+t}function Ms(t,e,n){return null==e&&(e=10),e=Math.min(Math.max(0,e),20),t=(+t).toFixed(e),n?t:+t}function Is(t){var e=t.toString(),n=e.indexOf("e");if(0<n){var i=+e.slice(n+1);return i<0?-i:0}var r=e.indexOf(".");return r<0?0:e.length-1-r}function Ts(t){var e=2*Math.PI;return(t%e+e)%e}function Cs(t){return-ws<t&&t<ws}var ks=/^(?:(\d{4})(?:[-\/](\d{1,2})(?:[-\/](\d{1,2})(?:[T ](\d{1,2})(?::(\d\d)(?::(\d\d)(?:[.,](\d+))?)?)?(Z|[\+\-]\d\d:?\d\d)?)?)?)?)?$/;function Ds(t){if(t instanceof Date)return t;if("string"!=typeof t)return null==t?new Date(NaN):new Date(Math.round(t));var e=ks.exec(t);if(!e)return new Date(NaN);if(e[8]){var n=+e[4]||0;return"Z"!==e[8].toUpperCase()&&(n-=e[8].slice(0,3)),new Date(Date.UTC(+e[1],+(e[2]||1)-1,+e[3]||1,n,+(e[5]||0),+e[6]||0,+e[7]||0))}return new Date(+e[1],+(e[2]||1)-1,+e[3]||1,+e[4]||0,+(e[5]||0),+e[6]||0,+e[7]||0)}function As(t){return Math.floor(Math.log(t)/Math.LN10)}function Ls(t,e){var n=As(t),i=Math.pow(10,n),r=t/i;return t=(e?r<1.5?1:r<2.5?2:r<4?3:r<7?5:10:r<1?1:r<2?2:r<3?3:r<5?5:10)*i,-20<=n?+t.toFixed(n<0?-n:0):t}function Ps(t){return isNaN(t)?"-":(t=(t+"").split("."))[0].replace(/(\d{1,3})(?=(?:\d{3})+(?!\d))/g,"$1,")+(1<t.length?"."+t[1]:"")}var Os=H,Es=/([&<>"'])/g,Ns={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"};function Bs(t){return null==t?"":(t+"").replace(Es,function(t,e){return Ns[e]})}function zs(t,e){return"{"+t+(null==e?"":e)+"}"}var Rs=["a","b","c","d","e","f","g"];function Fs(t,e){var n=(t=L(t)?{color:t,extraCssText:e}:t||{}).color,i=t.type,r=(e=t.extraCssText,t.renderMode||"html"),a=t.markerId||"X";return n?"html"===r?"subItem"===i?'<span style="display:inline-block;vertical-align:middle;margin-right:8px;margin-left:3px;border-radius:4px;width:4px;height:4px;background-color:'+Bs(n)+";"+(e||"")+'"></span>':'<span style="display:inline-block;margin-right:5px;border-radius:10px;width:10px;height:10px;background-color:'+Bs(n)+";"+(e||"")+'"></span>':{renderMode:r,content:"{marker"+a+"|}  ",style:{color:n}}:""}function Vs(t,e){return"0000".substr(0,e-(t+="").length)+t}function Ws(t,e,n){"week"!==t&&"month"!==t&&"quarter"!==t&&"half-year"!==t&&"year"!==t||(t="MM-dd\nyyyy");var i=Ds(e),r=n?"UTC":"",a=i["get"+r+"FullYear"](),o=i["get"+r+"Month"]()+1,s=i["get"+r+"Date"](),l=i["get"+r+"Hours"](),h=i["get"+r+"Minutes"](),u=i["get"+r+"Seconds"](),c=i["get"+r+"Milliseconds"]();return t=t.replace("MM",Vs(o,2)).replace("M",o).replace("yyyy",a).replace("yy",a%100).replace("dd",Vs(s,2)).replace("d",s).replace("hh",Vs(l,2)).replace("h",l).replace("mm",Vs(h,2)).replace("m",h).replace("ss",Vs(u,2)).replace("s",u).replace("SSS",Vs(c,3))}var Hs=Bn,Gs=k,Xs=["left","right","top","bottom","width","height"],qs=[["width","left","right"],["height","top","bottom"]];function Ys(u,c,d,f,p){var g=0,v=0;null==f&&(f=1/0),null==p&&(p=1/0);var m=0;c.eachChild(function(t,e){var n,i,r=t.position,a=t.getBoundingRect(),o=c.childAt(e+1),s=o&&o.getBoundingRect();if("horizontal"===u){var l=a.width+(s?-s.x+a.x:0);m=f<(n=g+l)||t.newline?(g=0,n=l,v+=m+d,a.height):Math.max(m,a.height)}else{var h=a.height+(s?-s.y+a.y:0);m=p<(i=v+h)||t.newline?(g+=m+d,v=0,i=h,a.width):Math.max(m,a.width)}t.newline||(r[0]=g,r[1]=v,"horizontal"===u?g=n+d:v=i+d)})}I(Ys,"vertical"),I(Ys,"horizontal");function Us(l,h,t){O(t)||(t={});var u=t.ignoreSize;A(u)||(u=[u,u]);var e=i(qs[0],0),n=i(qs[1],1);function i(t,e){var n={},i=0,r={},a=0;if(Gs(t,function(t){r[t]=l[t]}),Gs(t,function(t){c(h,t)&&(n[t]=r[t]=h[t]),d(n,t)&&i++,d(r,t)&&a++}),u[e])return d(h,t[1])?r[t[2]]=null:d(h,t[2])&&(r[t[1]]=null),r;if(2!==a&&i){if(2<=i)return n;for(var o=0;o<t.length;o++){var s=t[o];if(!c(n,s)&&c(l,s)){n[s]=l[s];break}}return n}return r}function c(t,e){return t.hasOwnProperty(e)}function d(t,e){return null!=t[e]&&"auto"!==t[e]}function r(t,e,n){Gs(t,function(t){e[t]=n[t]})}r(qs[0],l,e),r(qs[1],l,n)}function js(t){return function(e,n){return n&&e&&Gs(Xs,function(t){n.hasOwnProperty(t)&&(e[t]=n[t])}),e}({},t)}var Zs,$s,Ks,Qs=ji(),Js=vs.extend({type:"component",id:"",name:"",mainType:"",subType:"",componentIndex:0,defaultOption:null,ecModel:null,dependentModels:[],uid:null,layoutMode:null,$constructor:function(t,e,n,i){vs.call(this,t,e,n,i),this.uid=xs("ec_cpt_model")},init:function(t,e,n,i){this.mergeDefaultAndTheme(t,n)},mergeDefaultAndTheme:function(t,e){var n=this.layoutMode,i=n?js(t):{};f(t,e.getTheme().get(this.mainType)),f(t,this.getDefaultOption()),n&&Us(t,i,n)},mergeOption:function(t,e){f(this.option,t,!0);var n=this.layoutMode;n&&Us(this.option,t,n)},optionUpdated:function(t,e){},getDefaultOption:function(){var t=Qs(this);if(!t.defaultOption){for(var e=[],n=this.constructor;n;){var i=n.prototype.defaultOption;i&&e.push(i),n=n.superClass}for(var r={},a=e.length-1;0<=a;a--)r=f(r,e[a],!0);t.defaultOption=r}return t.defaultOption},getReferringComponents:function(t){return this.ecModel.queryComponents({mainType:t,index:this.get(t+"Index",!0),id:this.get(t+"Id",!0)})}});function tl(t,e){return t[e]||(t[e]={predecessor:[],successor:[]}),t[e]}sr(Js,{registerWhenExtend:!0}),$s={},(Zs=Js).registerSubTypeDefaulter=function(t,e){t=er(t),$s[t.main]=e},Zs.determineSubType=function(t,e){var n=e.type;if(!n){var i=er(t).main;Zs.hasSubTypes(t)&&$s[i]&&(n=$s[i](e))}return n},Ks=function(t){var e=[];k(Js.getClassesByMainType(t),function(t){e=e.concat(t.prototype.dependencies||[])}),e=D(e,function(t){return er(t).main}),"dataset"!==t&&v(e,"dataset")<=0&&e.unshift("dataset");return e},Js.topologicalTravel=function(t,e,n,i){if(t.length){var r=function(e){var r={},a=[];return k(e,function(n){var i=tl(r,n),t=function(t,e){var n=[];return k(t,function(t){0<=v(e,t)&&n.push(t)}),n}(i.originalDeps=Ks(n),e);i.entryCount=t.length,0===i.entryCount&&a.push(n),k(t,function(t){v(i.predecessor,t)<0&&i.predecessor.push(t);var e=tl(r,t);v(e.successor,t)<0&&e.successor.push(n)})}),{graph:r,noEntryList:a}}(e),a=r.graph,o=r.noEntryList,s={};for(k(t,function(t){s[t]=!0});o.length;){var l=o.pop(),h=a[l],u=!!s[l];u&&(n.call(i,l,h.originalDeps.slice()),delete s[l]),k(h.successor,u?d:c)}k(s,function(){throw new Error("Circle dependency may exists")})}function c(t){a[t].entryCount--,0===a[t].entryCount&&o.push(t)}function d(t){s[t]=!0,c(t)}},_(Js,{getBoxLayoutParams:function(){return{left:this.get("left"),top:this.get("top"),right:this.get("right"),bottom:this.get("bottom"),width:this.get("width"),height:this.get("height")}}});var el="";"undefined"!=typeof navigator&&(el=navigator.platform||"");var nl={color:["#c23531","#2f4554","#61a0a8","#d48265","#91c7ae","#749f83","#ca8622","#bda29a","#6e7074","#546570","#c4ccd3"],gradientColor:["#f6efa6","#d88273","#bf444c"],textStyle:{fontFamily:el.match(/^Win/)?"Microsoft YaHei":"sans-serif",fontSize:12,fontStyle:"normal",fontWeight:"normal"},blendMode:null,animation:"auto",animationDuration:1e3,animationDurationUpdate:300,animationEasing:"exponentialOut",animationEasingUpdate:"cubicOut",animationThreshold:2e3,progressiveThreshold:3e3,progressive:400,hoverLayerThreshold:3e3,useUTC:!1},il=ji();var rl={clearColorPalette:function(){il(this).colorIdx=0,il(this).colorNameMap={}},getColorFromPalette:function(t,e,n){var i=il(e=e||this),r=i.colorIdx||0,a=i.colorNameMap=i.colorNameMap||{};if(a.hasOwnProperty(t))return a[t];var o=Vi(this.get("color",!0)),s=this.get("colorLayer",!0),l=null!=n&&s?function(t,e){for(var n=t.length,i=0;i<n;i++)if(t[i].length>e)return t[i];return t[n-1]}(s,n):o;if((l=l||o)&&l.length){var h=l[r];return t&&(a[t]=h),i.colorIdx=(r+1)%l.length,h}}};function al(t){var e=t.get("coordinateSystem"),n={coordSysName:e,coordSysDims:[],axisMap:Z(),categoryAxisMap:Z()},i=ol[e];if(i)return i(t,n,n.axisMap,n.categoryAxisMap),n}var ol={cartesian2d:function(t,e,n,i){var r=t.getReferringComponents("xAxis")[0],a=t.getReferringComponents("yAxis")[0];e.coordSysDims=["x","y"],n.set("x",r),n.set("y",a),sl(r)&&(i.set("x",r),e.firstCategoryDimIndex=0),sl(a)&&(i.set("y",a),e.firstCategoryDimIndex=1)},singleAxis:function(t,e,n,i){var r=t.getReferringComponents("singleAxis")[0];e.coordSysDims=["single"],n.set("single",r),sl(r)&&(i.set("single",r),e.firstCategoryDimIndex=0)},polar:function(t,e,n,i){var r=t.getReferringComponents("polar")[0],a=r.findAxisModel("radiusAxis"),o=r.findAxisModel("angleAxis");e.coordSysDims=["radius","angle"],n.set("radius",a),n.set("angle",o),sl(a)&&(i.set("radius",a),e.firstCategoryDimIndex=0),sl(o)&&(i.set("angle",o),e.firstCategoryDimIndex=1)},geo:function(t,e,n,i){e.coordSysDims=["lng","lat"]},parallel:function(t,r,a,o){var s=t.ecModel,e=s.getComponent("parallel",t.get("parallelIndex")),l=r.coordSysDims=e.dimensions.slice();k(e.parallelAxisIndex,function(t,e){var n=s.getComponent("parallelAxis",t),i=l[e];a.set(i,n),sl(n)&&null==r.firstCategoryDimIndex&&(o.set(i,n),r.firstCategoryDimIndex=e)})}};function sl(t){return"category"===t.get("type")}var ll="original",hl="arrayRows",ul="objectRows",cl="keyedColumns",dl="unknown",fl="typedArray",pl="column",gl="row";function vl(t){this.fromDataset=t.fromDataset,this.data=t.data||(t.sourceFormat===cl?{}:[]),this.sourceFormat=t.sourceFormat||dl,this.seriesLayoutBy=t.seriesLayoutBy||pl,this.dimensionsDefine=t.dimensionsDefine,this.encodeDefine=t.encodeDefine&&Z(t.encodeDefine),this.startIndex=t.startIndex||0,this.dimensionsDetectCount=t.dimensionsDetectCount}vl.seriesDataToSource=function(t){return new vl({data:t,sourceFormat:N(t)?fl:ll,fromDataset:!1})},rr(vl);var ml=ji();function yl(t){var e=t.option,n=e.data,i=N(n)?fl:ll,r=!1,a=e.seriesLayoutBy,o=e.sourceHeader,s=e.dimensions,l=function(t){var e=t.option;if(!e.data)return t.ecModel.getComponent("dataset",e.datasetIndex||0)}(t);if(l){var h=l.option;n=h.source,i=ml(l).sourceFormat,r=!0,a=a||h.seriesLayoutBy,null==o&&(o=h.sourceHeader),s=s||h.dimensions}var u=function(t,e,n,i,r){if(!t)return{dimensionsDefine:_l(r)};var a,o,s,l;if(e===hl)"auto"===i||null==i?xl(function(t){null!=t&&"-"!==t&&(L(t)?null==o&&(o=1):o=0)},n,t,10):o=i?1:0,r||1!==o||(r=[],xl(function(t,e){r[e]=null!=t?t:""},n,t)),a=r?r.length:n===gl?t.length:t[0]?t[0].length:null;else if(e===ul)r||(r=function(t){var e,n=0;for(;n<t.length&&!(e=t[n++]););if(e){var i=[];return k(e,function(t,e){i.push(e)}),i}}(t),s=!0);else if(e===cl)r||(r=[],s=!0,k(t,function(t,e){r.push(e)}));else if(e===ll){var h=Gi(t[0]);a=A(h)&&h.length||1}s&&k(r,function(t,e){"name"===(O(t)?t.name:t)&&(l=e)});return{startIndex:o,dimensionsDefine:_l(r),dimensionsDetectCount:a,potentialNameDimIndex:l}}(n,i,a,o,s),c=e.encode;!c&&l&&(c=function(t,e,n,i,r,a){var o=al(t),s={},l=[],h=[],u=t.subType,c=Z(["pie","map","funnel"]),d=Z(["line","bar","pictorialBar","scatter","effectScatter","candlestick","boxplot"]);if(o&&null!=d.get(u)){var f=t.ecModel,p=ml(f).datasetMap,g=e.uid+"_"+r,v=p.get(g)||p.set(g,{categoryWayDim:1,valueWayDim:0});k(o.coordSysDims,function(t){if(null==o.firstCategoryDimIndex){var e=v.valueWayDim++;s[t]=e,h.push(e)}else if(o.categoryAxisMap.get(t))s[t]=0,l.push(0);else{e=v.categoryWayDim++;s[t]=e,h.push(e)}})}else if(null!=c.get(u)){for(var m,y=0;y<5&&null==m;y++)wl(n,i,r,a.dimensionsDefine,a.startIndex,y)||(m=y);if(null!=m){s.value=m;var _=a.potentialNameDimIndex||Math.max(m-1,0);h.push(_),l.push(_)}}return l.length&&(s.itemName=l),h.length&&(s.seriesName=h),s}(t,l,n,i,a,u)),ml(t).source=new vl({data:n,fromDataset:r,seriesLayoutBy:a,sourceFormat:i,dimensionsDefine:u.dimensionsDefine,startIndex:u.startIndex,dimensionsDetectCount:u.dimensionsDetectCount,encodeDefine:c})}function _l(t){if(t){var i=Z();return D(t,function(t,e){if(null==(t=S({},O(t)?t:{name:t})).name)return t;t.name+="",null==t.displayName&&(t.displayName=t.name);var n=i.get(t.name);return n?t.name+="-"+n.count++:i.set(t.name,{count:1}),t})}}function xl(t,e,n,i){if(null==i&&(i=1/0),e===gl)for(var r=0;r<n.length&&r<i;r++)t(n[r]?n[r][0]:null,r);else{var a=n[0]||[];for(r=0;r<a.length&&r<i;r++)t(a[r],r)}}function wl(t,e,n,i,r,a){var o,s;if(N(t))return!1;if(i&&(s=O(s=i[a])?s.name:s),e===hl)if(n===gl){for(var l=t[a],h=0;h<(l||[]).length&&h<5;h++)if(null!=(o=f(l[r+h])))return o}else for(h=0;h<t.length&&h<5;h++){var u=t[r+h];if(u&&null!=(o=f(u[a])))return o}else if(e===ul){if(!s)return;for(h=0;h<t.length&&h<5;h++){if((c=t[h])&&null!=(o=f(c[s])))return o}}else if(e===cl){if(!s)return;if(!(l=t[s])||N(l))return!1;for(h=0;h<l.length&&h<5;h++)if(null!=(o=f(l[h])))return o}else if(e===ll)for(h=0;h<t.length&&h<5;h++){var c,d=Gi(c=t[h]);if(!A(d))return!1;if(null!=(o=f(d[a])))return o}function f(t){return(null==t||!isFinite(t)||""===t)&&(!(!L(t)||"-"===t)||void 0)}return!1}var bl="\0_ec_inner",Sl=vs.extend({init:function(t,e,n,i){n=n||{},this.option=null,this._theme=new vs(n),this._optionManager=i},setOption:function(t,e){G(!(bl in t),"please use chart.getOption()"),this._optionManager.setOption(t,e),this.resetOption(null)},resetOption:function(t){var e=!1,n=this._optionManager;if(!t||"recreate"===t){var i=n.mountOption("recreate"===t);this.option&&"recreate"!==t?(this.restoreData(),this.mergeOption(i)):function(t){t=t,this.option={},this.option[bl]=1,this._componentsMap=Z({series:[]}),this._seriesIndices,this._seriesIndicesMap,function(n,t){var i=n.color&&!n.colorLayer;k(t,function(t,e){"colorLayer"===e&&i||Js.hasClass(e)||("object"==typeof t?n[e]=n[e]?f(n[e],t,!1):b(t):null==n[e]&&(n[e]=t))})}(t,this._theme.option),f(t,nl,!1),this.mergeOption(t)}.call(this,i),e=!0}if("timeline"!==t&&"media"!==t||this.restoreData(),!t||"recreate"===t||"timeline"===t){var r=n.getTimelineOption(this);r&&(this.mergeOption(r),e=!0)}if(!t||"recreate"===t||"media"===t){var a=n.getMediaOption(this,this._api);a.length&&k(a,function(t){this.mergeOption(t,e=!0)},this)}return e},mergeOption:function(i){var l=this.option,h=this._componentsMap,n=[];!function(t){ml(t).datasetMap=Z()}(this),k(i,function(t,e){null!=t&&(Js.hasClass(e)?e&&n.push(e):l[e]=null==l[e]?b(t):f(l[e],t,!0))}),Js.topologicalTravel(n,Js.getAllClassMainTypes(),function(o,t){var e=Vi(i[o]),n=Xi(h.get(o),e);(function(t){var o=Z();Bi(t,function(t,e){var n=t.exist;n&&o.set(n.id,t)}),Bi(t,function(t,e){var n=t.option;G(!n||null==n.id||!o.get(n.id)||o.get(n.id)===t,"id duplicates: "+(n&&n.id)),n&&null!=n.id&&o.set(n.id,t),t.keyInfo||(t.keyInfo={})}),Bi(t,function(t,e){var n=t.exist,i=t.option,r=t.keyInfo;if(zi(i)){if(r.name=null!=i.name?i.name+"":n?n.name:Fi+e,n)r.id=n.id;else if(null!=i.id)r.id=i.id+"";else for(var a=0;r.id="\0"+r.name+"\0"+a++,o.get(r.id););o.set(r.id,t)}})})(n),k(n,function(t,e){var n=t.option;O(n)&&(t.keyInfo.mainType=o,t.keyInfo.subType=function(t,e,n){return e.type?e.type:n?n.subType:Js.determineSubType(t,e)}(o,n,t.exist))});var s=function(e,t){A(t)||(t=t?[t]:[]);var n={};return k(t,function(t){n[t]=(e.get(t)||[]).slice()}),n}(h,t);l[o]=[],h.set(o,[]),k(n,function(t,e){var n=t.exist,i=t.option;if(G(O(i)||n,"Empty component definition"),i){var r=Js.getClass(o,t.keyInfo.subType,!0);if(n&&n instanceof r)n.name=t.keyInfo.name,n.mergeOption(i,this),n.optionUpdated(i,!1);else{var a=S({dependentModels:s,componentIndex:e},t.keyInfo);S(n=new r(i,this,this,a),a),n.init(i,this,this,a),n.optionUpdated(null,!0)}}else n.mergeOption({},this),n.optionUpdated({},!1);h.get(o)[e]=n,l[o][e]=n.option},this),"series"===o&&Ml(this,h.get("series"))},this),this._seriesIndicesMap=Z(this._seriesIndices=this._seriesIndices||[])},getOption:function(){var i=b(this.option);return k(i,function(t,e){if(Js.hasClass(e)){for(var n=(t=Vi(t)).length-1;0<=n;n--)Yi(t[n])&&t.splice(n,1);i[e]=t}}),delete i[bl],i},getTheme:function(){return this._theme},getComponent:function(t,e){var n=this._componentsMap.get(t);if(n)return n[e||0]},queryComponents:function(t){var e=t.mainType;if(!e)return[];var n,i=t.index,r=t.id,a=t.name,o=this._componentsMap.get(e);if(!o||!o.length)return[];if(null!=i)A(i)||(i=[i]),n=x(D(i,function(t){return o[t]}),function(t){return!!t});else if(null!=r){var s=A(r);n=x(o,function(t){return s&&0<=v(r,t.id)||!s&&t.id===r})}else if(null!=a){var l=A(a);n=x(o,function(t){return l&&0<=v(a,t.name)||!l&&t.name===a})}else n=o.slice();return Il(n,t)},findComponents:function(t){var e,n,i,r,a,o=t.query,s=t.mainType,l=(n=s+"Index",i=s+"Id",r=s+"Name",!(e=o)||null==e[n]&&null==e[i]&&null==e[r]?null:{mainType:s,index:e[n],id:e[i],name:e[r]}),h=l?this.queryComponents(l):this._componentsMap.get(s);return a=Il(h,t),t.filter?x(a,t.filter):a},eachComponent:function(t,i,r){var e=this._componentsMap;if("function"==typeof t)r=i,i=t,e.each(function(t,n){k(t,function(t,e){i.call(r,n,t,e)})});else if(L(t))k(e.get(t),i,r);else if(O(t)){k(this.findComponents(t),i,r)}},getSeriesByName:function(e){return x(this._componentsMap.get("series"),function(t){return t.name===e})},getSeriesByIndex:function(t){return this._componentsMap.get("series")[t]},getSeriesByType:function(e){return x(this._componentsMap.get("series"),function(t){return t.subType===e})},getSeries:function(){return this._componentsMap.get("series").slice()},getSeriesCount:function(){return this._componentsMap.get("series").length},eachSeries:function(n,i){k(this._seriesIndices,function(t){var e=this._componentsMap.get("series")[t];n.call(i,e,t)},this)},eachRawSeries:function(t,e){k(this._componentsMap.get("series"),t,e)},eachSeriesByType:function(n,i,r){k(this._seriesIndices,function(t){var e=this._componentsMap.get("series")[t];e.subType===n&&i.call(r,e,t)},this)},eachRawSeriesByType:function(t,e,n){return k(this.getSeriesByType(t),e,n)},isSeriesFiltered:function(t){return null==this._seriesIndicesMap.get(t.componentIndex)},getCurrentSeriesIndices:function(){return(this._seriesIndices||[]).slice()},filterSeries:function(t,e){var n=x(this._componentsMap.get("series"),t,e);Ml(this,n)},restoreData:function(n){var i=this._componentsMap;Ml(this,i.get("series"));var r=[];i.each(function(t,e){r.push(e)}),Js.topologicalTravel(r,Js.getAllClassMainTypes(),function(e,t){k(i.get(e),function(t){"series"===e&&function(t,e){if(e){var n=e.seiresIndex,i=e.seriesId,r=e.seriesName;return null!=n&&t.componentIndex!==n||null!=i&&t.id!==i||null!=r&&t.name!==r}}(t,n)||t.restoreData()})})}});function Ml(t,e){t._seriesIndicesMap=Z(t._seriesIndices=D(e,function(t){return t.componentIndex})||[])}function Il(t,e){return e.hasOwnProperty("subType")?x(t,function(t){return t.subType===e.subType}):t}_(Sl,rl);var Tl=["getDom","getZr","getWidth","getHeight","getDevicePixelRatio","dispatchAction","isDisposed","on","off","getDataURL","getConnectedDataURL","getModel","getOption","getViewOfComponentModel","getViewOfSeriesModel"];function Cl(e){k(Tl,function(t){this[t]=w(e[t],e)},this)}var kl={};function Dl(){this._coordinateSystems=[]}Dl.prototype={constructor:Dl,create:function(i,r){var a=[];k(kl,function(t,e){var n=t.create(i,r);a=a.concat(n||[])}),this._coordinateSystems=a},update:function(e,n){k(this._coordinateSystems,function(t){t.update&&t.update(e,n)})},getCoordinateSystems:function(){return this._coordinateSystems.slice()}},Dl.register=function(t,e){kl[t]=e},Dl.get=function(t){return kl[t]};var Al=k,Ll=b,Pl=D,Ol=f,El=/^(min|max)?(.+)$/;function Nl(t){this._api=t,this._timelineOptions=[],this._mediaList=[],this._mediaDefault,this._currentMediaIndices=[],this._optionBackup,this._newBaseOption}function Bl(t,e,n){var a={width:e,height:n,aspectratio:e/n},o=!0;return k(t,function(t,e){var n=e.match(El);if(n&&n[1]&&n[2]){var i=n[1],r=n[2].toLowerCase();!function(t,e,n){return"min"===n?e<=t:"max"===n?t<=e:t===e}(a[r],t,i)&&(o=!1)}}),o}Nl.prototype={constructor:Nl,setOption:function(t,e){t&&k(Vi(t.series),function(t){t&&t.data&&N(t.data)&&Y(t.data)}),t=Ll(t);var n=this._optionBackup,i=function(t,n,i){var e,r,a=[],o=[],s=t.timeline;t.baseOption&&(r=t.baseOption);(s||t.options)&&(r=r||{},a=(t.options||[]).slice());if(t.media){r=r||{};var l=t.media;Al(l,function(t){t&&t.option&&(t.query?o.push(t):e=e||t)})}r=r||t;r.timeline||(r.timeline=s);return Al([r].concat(a).concat(D(o,function(t){return t.option})),function(e){Al(n,function(t){t(e,i)})}),{baseOption:r,timelineOptions:a,mediaDefault:e,mediaList:o}}.call(this,t,e,!n);this._newBaseOption=i.baseOption,n?(function(r,t){Al(t=t||{},function(t,e){if(null!=t){var n=r[e];if(Js.hasClass(e)){t=Vi(t);var i=Xi(n=Vi(n),t);r[e]=Pl(i,function(t){return t.option&&t.exist?Ol(t.exist,t.option,!0):t.exist||t.option})}else r[e]=Ol(n,t,!0)}})}(n.baseOption,i.baseOption),i.timelineOptions.length&&(n.timelineOptions=i.timelineOptions),i.mediaList.length&&(n.mediaList=i.mediaList),i.mediaDefault&&(n.mediaDefault=i.mediaDefault)):this._optionBackup=i},mountOption:function(t){var e=this._optionBackup;return this._timelineOptions=Pl(e.timelineOptions,Ll),this._mediaList=Pl(e.mediaList,Ll),this._mediaDefault=Ll(e.mediaDefault),this._currentMediaIndices=[],Ll(t?e.baseOption:this._newBaseOption)},getTimelineOption:function(t){var e,n=this._timelineOptions;if(n.length){var i=t.getComponent("timeline");i&&(e=Ll(n[i.getCurrentIndex()],!0))}return e},getMediaOption:function(t){var e=this._api.getWidth(),n=this._api.getHeight(),i=this._mediaList,r=this._mediaDefault,a=[],o=[];if(!i.length&&!r)return o;for(var s=0,l=i.length;s<l;s++)Bl(i[s].query,e,n)&&a.push(s);return!a.length&&r&&(a=[-1]),a.length&&!function(t,e){return t.join(",")===e.join(",")}(a,this._currentMediaIndices)&&(o=Pl(a,function(t){return Ll(-1===t?r.option:i[t].option)})),this._currentMediaIndices=a,o}};var zl=k,Rl=O,Fl=["areaStyle","lineStyle","nodeStyle","linkStyle","chordStyle","label","labelLine"];function Vl(t){var e=t&&t.itemStyle;if(e)for(var n=0,i=Fl.length;n<i;n++){var r=Fl[n],a=e.normal,o=e.emphasis;a&&a[r]&&(t[r]=t[r]||{},t[r].normal?f(t[r].normal,a[r]):t[r].normal=a[r],a[r]=null),o&&o[r]&&(t[r]=t[r]||{},t[r].emphasis?f(t[r].emphasis,o[r]):t[r].emphasis=o[r],o[r]=null)}}function Wl(t,e,n){if(t&&t[e]&&(t[e].normal||t[e].emphasis)){var i=t[e].normal,r=t[e].emphasis;i&&(n?(t[e].normal=t[e].emphasis=null,C(t[e],i)):t[e]=i),r&&(t.emphasis=t.emphasis||{},t.emphasis[e]=r)}}function Hl(t){Wl(t,"itemStyle"),Wl(t,"lineStyle"),Wl(t,"areaStyle"),Wl(t,"label"),Wl(t,"labelLine"),Wl(t,"upperLabel"),Wl(t,"edgeLabel")}function Gl(t,e){var n=Rl(t)&&t[e],i=Rl(n)&&n.textStyle;if(i)for(var r=0,a=Hi.length;r<a;r++){e=Hi[r];i.hasOwnProperty(e)&&(n[e]=i[e])}}function Xl(t){t&&(Hl(t),Gl(t,"label"),t.emphasis&&Gl(t.emphasis,"label"))}function ql(t){return A(t)?t:t?[t]:[]}function Yl(t){return(A(t)?t[0]:t)||{}}function Ul(e,t){zl(ql(e.series),function(t){Rl(t)&&function(t){if(Rl(t)){Vl(t),Hl(t),Gl(t,"label"),Gl(t,"upperLabel"),Gl(t,"edgeLabel"),t.emphasis&&(Gl(t.emphasis,"label"),Gl(t.emphasis,"upperLabel"),Gl(t.emphasis,"edgeLabel")),(n=t.markPoint)&&(Vl(n),Xl(n)),(i=t.markLine)&&(Vl(i),Xl(i));var e=t.markArea;e&&Xl(e);var n,i,r=t.data;if("graph"===t.type){r=r||t.nodes;var a=t.links||t.edges;if(a&&!N(a))for(var o=0;o<a.length;o++)Xl(a[o]);k(t.categories,function(t){Hl(t)})}if(r&&!N(r))for(o=0;o<r.length;o++)Xl(r[o]);if((n=t.markPoint)&&n.data){var s=n.data;for(o=0;o<s.length;o++)Xl(s[o])}if((i=t.markLine)&&i.data){var l=i.data;for(o=0;o<l.length;o++)A(l[o])?(Xl(l[o][0]),Xl(l[o][1])):Xl(l[o])}"gauge"===t.type?(Gl(t,"axisLabel"),Gl(t,"title"),Gl(t,"detail")):"treemap"===t.type?(Wl(t.breadcrumb,"itemStyle"),k(t.levels,function(t){Hl(t)})):"tree"===t.type&&Hl(t.leaves)}}(t)});var n=["xAxis","yAxis","radiusAxis","angleAxis","singleAxis","parallelAxis","radar"];t&&n.push("valueAxis","categoryAxis","logAxis","timeAxis"),zl(n,function(t){zl(ql(e[t]),function(t){t&&(Gl(t,"axisLabel"),Gl(t.axisPointer,"label"))})}),zl(ql(e.parallel),function(t){var e=t&&t.parallelAxisDefault;Gl(e,"axisLabel"),Gl(e&&e.axisPointer,"label")}),zl(ql(e.calendar),function(t){Wl(t,"itemStyle"),Gl(t,"dayLabel"),Gl(t,"monthLabel"),Gl(t,"yearLabel")}),zl(ql(e.radar),function(t){Gl(t,"name")}),zl(ql(e.geo),function(t){Rl(t)&&(Xl(t),zl(ql(t.regions),function(t){Xl(t)}))}),zl(ql(e.timeline),function(t){Xl(t),Wl(t,"label"),Wl(t,"itemStyle"),Wl(t,"controlStyle",!0);var e=t.data;A(e)&&k(e,function(t){O(t)&&(Wl(t,"label"),Wl(t,"itemStyle"))})}),zl(ql(e.toolbox),function(t){Wl(t,"iconStyle"),zl(t.feature,function(t){Wl(t,"iconStyle")})}),Gl(Yl(e.axisPointer),"label"),Gl(Yl(e.tooltip).axisPointer,"label")}function jl(e){k(Zl,function(t){t[0]in e&&!(t[1]in e)&&(e[t[1]]=e[t[0]])})}var Zl=[["x","left"],["y","top"],["x2","right"],["y2","bottom"]],$l=["grid","geo","parallel","legend","toolbox","title","visualMap","dataZoom","timeline"],Kl=function(n,t){Ul(n,t),n.series=Vi(n.series),k(n.series,function(t){if(O(t)){var e=t.type;if("pie"!==e&&"gauge"!==e||null!=t.clockWise&&(t.clockwise=t.clockWise),"gauge"===e){var n=function(t,e){e=e.split(",");for(var n=t,i=0;i<e.length&&null!=(n=n&&n[e[i]]);i++);return n}(t,"pointer.color");null!=n&&function(t,e,n,i){e=e.split(",");for(var r,a=t,o=0;o<e.length-1;o++)null==a[r=e[o]]&&(a[r]={}),a=a[r];!i&&null!=a[e[o]]||(a[e[o]]=n)}(t,"itemStyle.color",n)}jl(t)}}),n.dataRange&&(n.visualMap=n.dataRange),k($l,function(t){var e=n[t];e&&(A(e)||(e=[e]),k(e,function(t){jl(t)}))})};function Ql(v){k(v,function(u,c){var d=[],f=[NaN,NaN],t=[u.stackResultDimension,u.stackedOverDimension],p=u.data,g=u.isStackedByIndex,e=p.map(t,function(t,e,n){var i,r,a=p.get(u.stackedDimension,n);if(isNaN(a))return f;g?r=p.getRawIndex(n):i=p.get(u.stackedByDimension,n);for(var o=NaN,s=c-1;0<=s;s--){var l=v[s];if(g||(r=l.data.rawIndexOf(l.stackedByDimension,i)),0<=r){var h=l.data.getByRawIndex(l.stackResultDimension,r);if(0<=a&&0<h||a<=0&&h<0){a+=h,o=h;break}}}return d[0]=a,d[1]=o,d});p.hostModel.setData(e),u.data=e})}function Jl(t,e){vl.isInstance(t)||(t=vl.seriesDataToSource(t)),this._source=t;var n=this._data=t.data,i=t.sourceFormat;i===fl&&(this._offset=0,this._dimSize=e,this._data=n),S(this,eh[i===hl?i+"_"+t.seriesLayoutBy:i])}var th=Jl.prototype;th.pure=!1;var eh={arrayRows_column:{pure:th.persistent=!0,count:function(){return Math.max(0,this._data.length-this._source.startIndex)},getItem:function(t){return this._data[t+this._source.startIndex]},appendData:rh},arrayRows_row:{pure:!0,count:function(){var t=this._data[0];return t?Math.max(0,t.length-this._source.startIndex):0},getItem:function(t){t+=this._source.startIndex;for(var e=[],n=this._data,i=0;i<n.length;i++){var r=n[i];e.push(r?r[t]:null)}return e},appendData:function(){throw new Error('Do not support appendData when set seriesLayoutBy: "row".')}},objectRows:{pure:!0,count:nh,getItem:ih,appendData:rh},keyedColumns:{pure:!0,count:function(){var t=this._source.dimensionsDefine[0].name,e=this._data[t];return e?e.length:0},getItem:function(t){for(var e=[],n=this._source.dimensionsDefine,i=0;i<n.length;i++){var r=this._data[n[i].name];e.push(r?r[t]:null)}return e},appendData:function(t){var r=this._data;k(t,function(t,e){for(var n=r[e]||(r[e]=[]),i=0;i<(t||[]).length;i++)n.push(t[i])})}},original:{count:nh,getItem:ih,appendData:rh},typedArray:{persistent:!(th.getSource=function(){return this._source}),pure:!0,count:function(){return this._data?this._data.length/this._dimSize:0},getItem:function(t,e){t-=this._offset,e=e||[];for(var n=this._dimSize*t,i=0;i<this._dimSize;i++)e[i]=this._data[n+i];return e},appendData:function(t){this._data=t},clean:function(){this._offset+=this.count(),this._data=null}}};function nh(){return this._data.length}function ih(t){return this._data[t]}function rh(t){for(var e=0;e<t.length;e++)this._data.push(t[e])}var ah={arrayRows:oh,objectRows:function(t,e,n,i){return null!=n?t[i]:t},keyedColumns:oh,original:function(t,e,n,i){var r=Gi(t);return null!=n&&r instanceof Array?r[n]:r},typedArray:oh};function oh(t,e,n,i){return null!=n?t[n]:t}var sh={arrayRows:lh,objectRows:function(t,e,n,i){return hh(t[e],this._dimensionInfos[e])},keyedColumns:lh,original:function(t,e,n,i){var r=t&&(null==t.value?t:t.value);return!this._rawData.pure&&function(t){return zi(t)&&!(t instanceof Array)}(t)&&(this.hasItemOption=!0),hh(r instanceof Array?r[i]:r,this._dimensionInfos[e])},typedArray:function(t,e,n,i){return t[i]}};function lh(t,e,n,i){return hh(t[i],this._dimensionInfos[e])}function hh(t,e){var n=e&&e.type;if("ordinal"!==n)return"time"===n&&"number"!=typeof t&&null!=t&&"-"!==t&&(t=+Ds(t)),null==t||""===t?NaN:+t;var i=e&&e.ordinalMeta;return i?i.parseAndCollect(t):t}function uh(t,e,n){if(t){var i=t.getRawDataItem(e);if(null!=i){var r,a,o=t.getProvider().getSource().sourceFormat,s=t.getDimensionInfo(n);return s&&(r=s.name,a=s.index),ah[o](i,e,a,r)}}}function ch(t,e,n){if(t){var i=t.getProvider().getSource().sourceFormat;if(i===ll||i===ul){var r=t.getRawDataItem(e);return i!==ll||O(r)||(r=null),r?r[n]:void 0}}}var dh=/\{@(.+?)\}/g,fh={getDataParams:function(t,e){var n=this.getData(e),i=this.getRawValue(t,e),r=n.getRawIndex(t),a=n.getName(t),o=n.getRawDataItem(t),s=n.getItemVisual(t,"color"),l=this.ecModel.getComponent("tooltip"),h=function(t){return"auto"===t?m.domSupported?"html":"richText":t||"html"}(l&&l.get("renderMode")),u=this.mainType,c="series"===u,d=n.userOutput;return{componentType:u,componentSubType:this.subType,componentIndex:this.componentIndex,seriesType:c?this.subType:null,seriesIndex:this.seriesIndex,seriesId:c?this.id:null,seriesName:c?this.name:null,name:a,dataIndex:r,data:o,dataType:e,value:i,color:s,dimensionNames:d?d.dimensionNames:null,encode:d?d.encode:null,marker:Fs({color:s,renderMode:h}),$vars:["seriesName","name","value"]}},getFormattedLabel:function(i,t,e,n,r){t=t||"normal";var a=this.getData(e),o=a.getItemModel(i),s=this.getDataParams(i,e);null!=n&&s.value instanceof Array&&(s.value=s.value[n]);var l=o.get("normal"===t?[r||"label","formatter"]:[t,r||"label","formatter"]);return"function"==typeof l?(s.status=t,s.dimensionIndex=n,l(s)):"string"==typeof l?function(t,e,n){A(e)||(e=[e]);var i=e.length;if(!i)return"";for(var r=e[0].$vars||[],a=0;a<r.length;a++){var o=Rs[a];t=t.replace(zs(o),zs(o,0))}for(var s=0;s<i;s++)for(var l=0;l<r.length;l++){var h=e[s][r[l]];t=t.replace(zs(Rs[l],s),n?Bs(h):h)}return t}(l,s).replace(dh,function(t,e){var n=e.length;return"["===e.charAt(0)&&"]"===e.charAt(n-1)&&(e=+e.slice(1,n-1)),uh(a,i,e)}):void 0},getRawValue:function(t,e){return uh(this.getData(e),t)},formatTooltip:function(){}};function ph(t){return new gh(t)}function gh(t){t=t||{},this._reset=t.reset,this._plan=t.plan,this._count=t.count,this._onDirty=t.onDirty,this._dirty=!0,this.context}var vh=gh.prototype;vh.perform=function(t){var e,n=this._upstream,i=t&&t.skip;if(this._dirty&&n){var r=this.context;r.data=r.outputData=n.context.outputData}this.__pipeline&&(this.__pipeline.currentTask=this),this._plan&&!i&&(e=this._plan(this.context));var a,o=u(this._modBy),s=this._modDataCount||0,l=u(t&&t.modBy),h=t&&t.modDataCount||0;function u(t){return 1<=t||(t=1),t}o===l&&s===h||(e="reset"),!this._dirty&&"reset"!==e||(this._dirty=!1,a=function(t,e){var n,i;t._dueIndex=t._outputDueEnd=t._dueEnd=0,t._settedOutputEnd=null,!e&&t._reset&&((n=t._reset(t.context))&&n.progress&&(i=n.forceFirstProgress,n=n.progress),A(n)&&!n.length&&(n=null));t._progress=n,t._modBy=t._modDataCount=null;var r=t._downstream;return r&&r.dirty(),i}(this,i)),this._modBy=l,this._modDataCount=h;var c=t&&t.step;if(this._dueEnd=n?n._outputDueEnd:this._count?this._count(this.context):1/0,this._progress){var d=this._dueIndex,f=Math.min(null!=c?this._dueIndex+c:1/0,this._dueEnd);if(!i&&(a||d<f)){var p=this._progress;if(A(p))for(var g=0;g<p.length;g++)Th(this,p[g],d,f,l,h);else Th(this,p,d,f,l,h)}this._dueIndex=f;var v=null!=this._settedOutputEnd?this._settedOutputEnd:f;this._outputDueEnd=v}else this._dueIndex=this._outputDueEnd=null!=this._settedOutputEnd?this._settedOutputEnd:this._dueEnd;return this.unfinished()};var mh,yh,_h,xh,wh,bh,Sh=bh={reset:function(t,e,n,i){yh=t,mh=e,_h=n,xh=i,wh=Math.ceil(xh/_h),bh.next=1<_h&&0<xh?Ih:Mh}};function Mh(){return yh<mh?yh++:null}function Ih(){var t=yh%wh*_h+Math.ceil(yh/wh),e=mh<=yh?null:t<xh?t:yh;return yh++,e}function Th(t,e,n,i,r,a){Sh.reset(n,i,r,a),t._callingProgress=e,t._callingProgress({start:n,end:i,count:i-n,next:Sh.next},t.context)}vh.dirty=function(){this._dirty=!0,this._onDirty&&this._onDirty(this.context)},vh.unfinished=function(){return this._progress&&this._dueIndex<this._dueEnd},vh.pipe=function(t){this._downstream===t&&!this._dirty||((this._downstream=t)._upstream=this,t.dirty())},vh.dispose=function(){this._disposed||(this._upstream&&(this._upstream._downstream=null),this._downstream&&(this._downstream._upstream=null),this._dirty=!1,this._disposed=!0)},vh.getUpstream=function(){return this._upstream},vh.getDownstream=function(){return this._downstream},vh.setOutputEnd=function(t){this._outputDueEnd=this._settedOutputEnd=t};var Ch=ji(),kh=Js.extend({type:"series.__base__",seriesIndex:0,coordinateSystem:null,defaultOption:null,legendDataProvider:null,visualColorAccessPath:"itemStyle.color",layoutMode:null,init:function(t,e,n,i){this.seriesIndex=this.componentIndex,this.dataTask=ph({count:Ah,reset:Lh}),this.dataTask.context={model:this},this.mergeDefaultAndTheme(t,n),yl(this);var r=this.getInitialData(t,n);Oh(r,this),this.dataTask.context.data=r,Ch(this).dataBeforeProcessed=r,Dh(this)},mergeDefaultAndTheme:function(t,e){var n=this.layoutMode,i=n?js(t):{},r=this.subType;Js.hasClass(r)&&(r+="Series"),f(t,e.getTheme().get(this.subType)),f(t,this.getDefaultOption()),Wi(t,"label",["show"]),this.fillDataTextStyle(t.data),n&&Us(t,i,n)},mergeOption:function(t,e){t=f(this.option,t,!0),this.fillDataTextStyle(t.data);var n=this.layoutMode;n&&Us(this.option,t,n),yl(this);var i=this.getInitialData(t,e);Oh(i,this),this.dataTask.dirty(),this.dataTask.context.data=i,Ch(this).dataBeforeProcessed=i,Dh(this)},fillDataTextStyle:function(t){if(t&&!N(t))for(var e=["show"],n=0;n<t.length;n++)t[n]&&t[n].label&&Wi(t[n],"label",e)},getInitialData:function(){},appendData:function(t){this.getRawData().appendData(t.data)},getData:function(t){var e=Nh(this);if(e){var n=e.context.data;return null==t?n:n.getLinkedData(t)}return Ch(this).data},setData:function(t){var e=Nh(this);if(e){var n=e.context;n.data!==t&&e.modifyOutputEnd&&e.setOutputEnd(t.count()),n.outputData=t,e!==this.dataTask&&(n.data=t)}Ch(this).data=t},getSource:function(){return function(t){return ml(t).source}(this)},getRawData:function(){return Ch(this).dataBeforeProcessed},getBaseAxis:function(){var t=this.coordinateSystem;return t&&t.getBaseAxis&&t.getBaseAxis()},formatTooltip:function(r,u,t,c){var d=this,e="html"===(c=c||"html")?"<br/>":"\n",f="richText"===c,p={},g=0;function n(t){return{renderMode:c,content:Bs(Ps(t)),style:p}}var v=this.getData(),a=v.mapDimension("defaultedTooltip",!0),i=a.length,o=this.getRawValue(r),s=A(o),m=v.getItemVisual(r,"color");O(m)&&m.colorStops&&(m=(m.colorStops[0]||{}).color),m=m||"transparent";var l=(1<i||s&&!i?function(t){var l=M(t,function(t,e,n){var i=v.getDimensionInfo(n);return t|(i&&!1!==i.tooltip&&null!=i.displayName)},0),h=[];function e(t,e){var n=v.getDimensionInfo(e);if(n&&!1!==n.otherDims.tooltip){var i=n.type,r="sub"+d.seriesIndex+"at"+g,a=Fs({color:m,type:"subItem",renderMode:c,markerId:r}),o="string"==typeof a?a:a.content,s=(l?o+Bs(n.displayName||"-")+": ":"")+Bs("ordinal"===i?t+"":"time"===i?u?"":Ws("yyyy/MM/dd hh:mm:ss",t):Ps(t));s&&h.push(s),f&&(p[r]=m,++g)}}a.length?k(a,function(t){e(uh(v,r,t),t)}):k(t,e);var n=l?f?"\n":"<br/>":"",i=n+h.join(n||", ");return{renderMode:c,content:i,style:p}}(o):n(i?uh(v,r,a[0]):s?o[0]:o)).content,h=d.seriesIndex+"at"+g,y=Fs({color:m,type:"item",renderMode:c,markerId:h});p[h]=m,++g;var _=v.getName(r),x=this.name;qi(this)||(x=""),x=x?Bs(x)+(u?": ":e):"";var w="string"==typeof y?y:y.content;return{html:u?w+x+l:x+w+(_?Bs(_)+": "+l:l),markers:p}},isAnimationEnabled:function(){if(m.node)return!1;var t=this.getShallow("animation");return t&&this.getData().count()>this.getShallow("animationThreshold")&&(t=!1),t},restoreData:function(){this.dataTask.dirty()},getColorFromPalette:function(t,e,n){var i=this.ecModel,r=rl.getColorFromPalette.call(this,t,e,n);return r=r||i.getColorFromPalette(t,e,n)},coordDimToDataDim:function(t){return this.getRawData().mapDimension(t,!0)},getProgressive:function(){return this.get("progressive")},getProgressiveThreshold:function(){return this.get("progressiveThreshold")},getAxisTooltipData:null,getTooltipPosition:null,pipeTask:null,preventIncremental:null,pipelineContext:null});function Dh(t){var e=t.name;qi(t)||(t.name=function(t){var n=t.getRawData(),e=n.mapDimension("seriesName",!0),i=[];return k(e,function(t){var e=n.getDimensionInfo(t);e.displayName&&i.push(e.displayName)}),i.join(" ")}(t)||e)}function Ah(t){return t.model.getRawData().count()}function Lh(t){var e=t.model;return e.setData(e.getRawData().cloneShallow()),Ph}function Ph(t,e){t.end>e.outputData.count()&&e.model.getRawData().cloneShallow(e.outputData)}function Oh(e,n){k(e.CHANGABLE_METHODS,function(t){e.wrapMethod(t,I(Eh,n))})}function Eh(t){var e=Nh(t);e&&e.setOutputEnd(this.count())}function Nh(t){var e=(t.ecModel||{}).scheduler,n=e&&e.getPipeline(t.uid);if(n){var i=n.currentTask;if(i){var r=i.agentStubMap;r&&(i=r.get(t.uid))}return i}}_(kh,fh),_(kh,rl);var Bh=function(){this.group=new Ye,this.uid=xs("viewComponent")};Bh.prototype={constructor:Bh,init:function(t,e){},render:function(t,e,n,i){},dispose:function(){},filterForExposedEvent:null};var zh=Bh.prototype;zh.updateView=zh.updateLayout=zh.updateVisual=function(t,e,n,i){},nr(Bh),sr(Bh,{registerWhenExtend:!0});function Rh(){var s=ji();return function(t){var e=s(t),n=t.pipelineContext,i=e.large,r=e.progressiveRender,a=e.large=n.large,o=e.progressiveRender=n.progressiveRender;return!!(i^a||r^o)&&"reset"}}var Fh=ji(),Vh=Rh();function Wh(){this.group=new Ye,this.uid=xs("viewChart"),this.renderTask=ph({plan:qh,reset:Yh}),this.renderTask.context={view:this}}var Hh=Wh.prototype={type:"chart",init:function(t,e){},render:function(t,e,n,i){},highlight:function(t,e,n,i){Xh(t.getData(),i,"emphasis")},downplay:function(t,e,n,i){Xh(t.getData(),i,"normal")},remove:function(t,e){this.group.removeAll()},dispose:function(){},incrementalPrepareRender:null,incrementalRender:null,updateTransform:null,filterForExposedEvent:null};function Gh(t,e,n){if(t&&(t.trigger(e,n),t.isGroup&&!jo(t)))for(var i=0,r=t.childCount();i<r;i++)Gh(t.childAt(i),e,n)}function Xh(e,t,n){var i=Ui(e,t),r=t&&null!=t.highlightKey?Zo(t.highlightKey):null;null!=i?k(Vi(i),function(t){Gh(e.getItemGraphicEl(t),n,r)}):e.eachItemGraphicEl(function(t){Gh(t,n,r)})}function qh(t){return Vh(t.model)}function Yh(t){var e=t.model,n=t.ecModel,i=t.api,r=t.payload,a=e.pipelineContext.progressiveRender,o=t.view,s=r&&Fh(r).updateMethod,l=a?"incrementalPrepareRender":s&&o[s]?s:"render";return"render"!==l&&o[l](e,n,i,r),Uh[l]}Hh.updateView=Hh.updateLayout=Hh.updateVisual=function(t,e,n,i){this.render(t,e,n,i)},nr(Wh),sr(Wh,{registerWhenExtend:!0}),Wh.markUpdateMethod=function(t,e){Fh(t).updateMethod=e};var Uh={incrementalPrepareRender:{progress:function(t,e){e.view.incrementalRender(t,e.model,e.ecModel,e.api,e.payload)}},render:{forceFirstProgress:!0,progress:function(t,e){e.view.render(e.model,e.ecModel,e.api,e.payload)}}};function jh(t,n,i){var r,a,o,s,l,h=0,u=0,c=null;function d(){u=(new Date).getTime(),c=null,t.apply(o,s||[])}n=n||0;function e(){r=(new Date).getTime(),o=this,s=arguments;var t=l||n,e=l||i;l=null,a=r-(e?h:u)-t,clearTimeout(c),e?c=setTimeout(d,t):0<=a?d():c=setTimeout(d,-a),h=r}return e.clear=function(){c&&(clearTimeout(c),c=null)},e.debounceNextCall=function(t){l=t},e}var Zh={createOnAllSeries:!0,performRawSeries:!0,reset:function(e,t){var n=e.getData(),i=(e.visualColorAccessPath||"itemStyle.color").split("."),r=e.get(i)||e.getColorFromPalette(e.name,null,t.getSeriesCount());if(n.setVisual("color",r),!t.isSeriesFiltered(e)){"function"!=typeof r||r instanceof lo||n.each(function(t){n.setItemVisual(t,"color",r(e.getDataParams(t)))});return{dataEach:n.hasItemOption?function(t,e){var n=t.getItemModel(e).get(i,!0);null!=n&&t.setItemVisual(e,"color",n)}:null}}}},$h={toolbox:{brush:{title:{rect:"矩形选择",polygon:"圈选",lineX:"横向选择",lineY:"纵向选择",keep:"保持选择",clear:"清除选择"}},dataView:{title:"数据视图",lang:["数据视图","关闭","刷新"]},dataZoom:{title:{zoom:"区域缩放",back:"区域缩放还原"}},magicType:{title:{line:"切换为折线图",bar:"切换为柱状图",stack:"切换为堆叠",tiled:"切换为平铺"}},restore:{title:"还原"},saveAsImage:{title:"保存为图片",lang:["右键另存为图片"]}},series:{typeNames:{pie:"饼图",bar:"柱状图",line:"折线图",scatter:"散点图",effectScatter:"涟漪散点图",radar:"雷达图",tree:"树图",treemap:"矩形树图",boxplot:"箱型图",candlestick:"K线图",k:"K线图",heatmap:"热力图",map:"地图",parallel:"平行坐标图",lines:"线图",graph:"关系图",sankey:"桑基图",funnel:"漏斗图",gauge:"仪表盘图",pictorialBar:"象形柱图",themeRiver:"主题河流图",sunburst:"旭日图"}},aria:{general:{withTitle:"这是一个关于“{title}”的图表。",withoutTitle:"这是一个图表，"},series:{single:{prefix:"",withName:"图表类型是{seriesType}，表示{seriesName}。",withoutName:"图表类型是{seriesType}。"},multiple:{prefix:"它由{seriesCount}个图表系列组成。",withName:"第{seriesId}个系列是一个表示{seriesName}的{seriesType}，",withoutName:"第{seriesId}个系列是一个{seriesType}，",separator:{middle:"；",end:"。"}}},data:{allData:"其数据是——",partialData:"其中，前{displayCnt}项是——",withName:"{name}的数据是{value}",withoutName:"{value}",separator:{middle:"，",end:""}}}},Kh=function(t,e){var a=e.getModel("aria");if(a.get("show"))if(a.get("description"))t.setAttribute("aria-label",a.get("description"));else{var u=0;e.eachSeries(function(t,e){++u},this);var n,c=a.get("data.maxCount")||10,i=a.get("series.maxCount")||10,d=Math.min(u,i);if(!(u<1)){var r=function(){var t=e.getModel("title").option;t&&t.length&&(t=t[0]);return t&&t.text}();n=r?p(g("general.withTitle"),{title:r}):g("general.withoutTitle");var f=[];n+=p(g(1<u?"series.multiple.prefix":"series.single.prefix"),{seriesCount:u}),e.eachSeries(function(t,e){if(e<d){var n,i=t.get("name"),r="series."+(1<u?"multiple":"single")+".";n=p(n=g(i?r+"withName":r+"withoutName"),{seriesId:t.seriesIndex,seriesName:t.get("name"),seriesType:function(t){return $h.series.typeNames[t]||"自定义图"}(t.subType)});var a=t.getData();(window.data=a).count()>c?n+=p(g("data.partialData"),{displayCnt:c}):n+=g("data.allData");for(var o=[],s=0;s<a.count();s++)if(s<c){var l=a.getName(s),h=uh(a,s);o.push(p(g(l?"data.withName":"data.withoutName"),{name:l,value:h}))}n+=o.join(g("data.separator.middle"))+g("data.separator.end"),f.push(n)}}),n+=f.join(g("series.multiple.separator.middle"))+g("series.multiple.separator.end"),t.setAttribute("aria-label",n)}}function p(t,e){if("string"!=typeof t)return t;var n=t;return k(e,function(t,e){n=n.replace(new RegExp("\\{\\s*"+e+"\\s*\\}","g"),t)}),n}function g(t){var e=a.get(t);if(null!=e)return e;for(var n=t.split("."),i=$h.aria,r=0;r<n.length;++r)i=i[n[r]];return i}},Qh=Math.PI;function Jh(t,e,n,i){this.ecInstance=t,this.api=e,this.unfinished;n=this._dataProcessorHandlers=n.slice(),i=this._visualHandlers=i.slice();this._allHandlers=n.concat(i),this._stageTaskMap=Z()}var tu=Jh.prototype;function eu(l,t,h,u,c){var d;function f(t,e){return t.setDirty&&(!t.dirtyMap||t.dirtyMap.get(e.__pipeline.id))}c=c||{},k(t,function(i,t){if(!c.visualType||c.visualType===i.visualType){var e=l._stageTaskMap.get(i.uid),n=e.seriesTaskMap,r=e.overallTask;if(r){var a,o=r.agentStubMap;o.each(function(t){f(c,t)&&(t.dirty(),a=!0)}),a&&r.dirty(),nu(r,u);var s=l.getPerformArgs(r,c.block);o.each(function(t){t.perform(s)}),d|=r.perform(s)}else n&&n.each(function(t,e){f(c,t)&&t.dirty();var n=l.getPerformArgs(t,c.block);n.skip=!i.performRawSeries&&h.isSeriesFiltered(t.context.model),nu(t,u),d|=t.perform(n)})}}),l.unfinished|=d}tu.restoreData=function(t,e){t.restoreData(e),this._stageTaskMap.each(function(t){var e=t.overallTask;e&&e.dirty()})},tu.getPerformArgs=function(t,e){if(t.__pipeline){var n=this._pipelineMap.get(t.__pipeline.id),i=n.context,r=!e&&n.progressiveEnabled&&(!i||i.progressiveRender)&&t.__idxInPipeline>n.blockIndex?n.step:null,a=i&&i.modDataCount;return{step:r,modBy:null!=a?Math.ceil(a/r):null,modDataCount:a}}},tu.getPipeline=function(t){return this._pipelineMap.get(t)},tu.updateStreamModes=function(t,e){var n=this._pipelineMap.get(t.uid),i=t.getData().count(),r=n.progressiveEnabled&&e.incrementalPrepareRender&&i>=n.threshold,a=t.get("large")&&i>=t.get("largeThreshold"),o="mod"===t.get("progressiveChunkMode")?i:null;t.pipelineContext=n.context={progressiveRender:r,modDataCount:o,large:a}},tu.restorePipelines=function(t){var i=this,r=i._pipelineMap=Z();t.eachSeries(function(t){var e=t.getProgressive(),n=t.uid;r.set(n,{id:n,head:null,tail:null,threshold:t.getProgressiveThreshold(),progressiveEnabled:e&&!(t.preventIncremental&&t.preventIncremental()),blockIndex:-1,step:Math.round(e||700),count:0}),du(i,t,t.dataTask)})},tu.prepareStageTasks=function(){var n=this._stageTaskMap,i=this.ecInstance.getModel(),r=this.api;k(this._allHandlers,function(t){var e=n.get(t.uid)||n.set(t.uid,[]);t.reset&&function(i,r,t,a,o){var s=t.seriesTaskMap||(t.seriesTaskMap=Z()),e=r.seriesType,n=r.getTargetSeries;r.createOnAllSeries?a.eachRawSeries(l):e?a.eachRawSeriesByType(e,l):n&&n(a,o).each(l);function l(t){var e=t.uid,n=s.get(e)||s.set(e,ph({plan:su,reset:lu,count:cu}));n.context={model:t,ecModel:a,api:o,useClearVisual:r.isVisual&&!r.isLayout,plan:r.plan,reset:r.reset,scheduler:i},du(i,t,n)}var h=i._pipelineMap;s.each(function(t,e){h.get(e)||(t.dispose(),s.removeKey(e))})}(this,t,e,i,r),t.overallReset&&function(i,t,e,n,r){var a=e.overallTask=e.overallTask||ph({reset:iu});a.context={ecModel:n,api:r,overallReset:t.overallReset,scheduler:i};var o=a.agentStubMap=a.agentStubMap||Z(),s=t.seriesType,l=t.getTargetSeries,h=!0,u=t.modifyOutputEnd;s?n.eachRawSeriesByType(s,c):l?l(n,r).each(c):(h=!1,k(n.getSeries(),c));function c(t){var e=t.uid,n=o.get(e);n||(n=o.set(e,ph({reset:ru,onDirty:ou})),a.dirty()),n.context={model:t,overallProgress:h,modifyOutputEnd:u},n.agent=a,n.__block=h,du(i,t,n)}var d=i._pipelineMap;o.each(function(t,e){d.get(e)||(t.dispose(),a.dirty(),o.removeKey(e))})}(this,t,e,i,r)},this)},tu.prepareView=function(t,e,n,i){var r=t.renderTask,a=r.context;a.model=e,a.ecModel=n,a.api=i,r.__block=!t.incrementalPrepareRender,du(this,e,r)},tu.performDataProcessorTasks=function(t,e){eu(this,this._dataProcessorHandlers,t,e,{block:!0})},tu.performVisualTasks=function(t,e,n){eu(this,this._visualHandlers,t,e,n)},tu.performSeriesTasks=function(t){var e;t.eachSeries(function(t){e|=t.dataTask.perform()}),this.unfinished|=e},tu.plan=function(){this._pipelineMap.each(function(t){var e=t.tail;do{if(e.__block){t.blockIndex=e.__idxInPipeline;break}e=e.getUpstream()}while(e)})};var nu=tu.updatePayload=function(t,e){"remain"!==e&&(t.context.payload=e)};function iu(t){t.overallReset(t.ecModel,t.api,t.payload)}function ru(t,e){return t.overallProgress&&au}function au(){this.agent.dirty(),this.getDownstream().dirty()}function ou(){this.agent&&this.agent.dirty()}function su(t){return t.plan&&t.plan(t.model,t.ecModel,t.api,t.payload)}function lu(t){t.useClearVisual&&t.data.clearAllVisual();var e=t.resetDefines=Vi(t.reset(t.model,t.ecModel,t.api,t.payload));return 1<e.length?D(e,function(t,e){return uu(e)}):hu}var hu=uu(0);function uu(a){return function(t,e){var n=e.data,i=e.resetDefines[a];if(i&&i.dataEach)for(var r=t.start;r<t.end;r++)i.dataEach(n,r);else i&&i.progress&&i.progress(t,n)}}function cu(t){return t.data.count()}function du(t,e,n){var i=e.uid,r=t._pipelineMap.get(i);r.head||(r.head=n),r.tail&&r.tail.pipe(n),(r.tail=n).__idxInPipeline=r.count++,n.__pipeline=r}Jh.wrapStageHandler=function(t,e){return T(t)&&(t={overallReset:t,seriesType:function(t){fu=null;try{t(pu,gu)}catch(t){}return fu}(t)}),t.uid=xs("stageHandler"),e&&(t.visualType=e),t};var fu,pu={},gu={};function vu(t,e){for(var n in e.prototype)t[n]=$}vu(pu,Sl),vu(gu,Cl),pu.eachSeriesByType=pu.eachRawSeriesByType=function(t){fu=t},pu.eachComponent=function(t){"series"===t.mainType&&t.subType&&(fu=t.subType)};function mu(){return{axisLine:{lineStyle:{color:xu}},axisTick:{lineStyle:{color:xu}},axisLabel:{textStyle:{color:xu}},splitLine:{lineStyle:{type:"dashed",color:"#aaa"}},splitArea:{areaStyle:{color:xu}}}}var yu=["#37A2DA","#32C5E9","#67E0E3","#9FE6B8","#FFDB5C","#ff9f7f","#fb7293","#E062AE","#E690D1","#e7bcf3","#9d96f5","#8378EA","#96BFFF"],_u={color:yu,colorLayer:[["#37A2DA","#ffd85c","#fd7b5f"],["#37A2DA","#67E0E3","#FFDB5C","#ff9f7f","#E062AE","#9d96f5"],["#37A2DA","#32C5E9","#9FE6B8","#FFDB5C","#ff9f7f","#fb7293","#e7bcf3","#8378EA","#96BFFF"],yu]},xu="#eee",wu=["#dd6b66","#759aa0","#e69d87","#8dc1a9","#ea7e53","#eedd78","#73a373","#73b9bc","#7289ab","#91ca8c","#f49f42"],bu={color:wu,backgroundColor:"#333",tooltip:{axisPointer:{lineStyle:{color:xu},crossStyle:{color:xu}}},legend:{textStyle:{color:xu}},textStyle:{color:xu},title:{textStyle:{color:xu}},toolbox:{iconStyle:{normal:{borderColor:xu}}},dataZoom:{textStyle:{color:xu}},visualMap:{textStyle:{color:xu}},timeline:{lineStyle:{color:xu},itemStyle:{normal:{color:wu[1]}},label:{normal:{textStyle:{color:xu}}},controlStyle:{normal:{color:xu,borderColor:xu}}},timeAxis:mu(),logAxis:mu(),valueAxis:mu(),categoryAxis:mu(),line:{symbol:"circle"},graph:{color:wu},gauge:{title:{textStyle:{color:xu}}},candlestick:{itemStyle:{normal:{color:"#FD1050",color0:"#0CF49B",borderColor:"#FD1050",borderColor0:"#0CF49B"}}}};bu.categoryAxis.splitLine.show=!1,Js.extend({type:"dataset",defaultOption:{seriesLayoutBy:pl,sourceHeader:null,dimensions:null,source:null},optionUpdated:function(){!function(t){var e=t.option.source,n=dl;if(N(e))n=fl;else if(A(e)){0===e.length&&(n=hl);for(var i=0,r=e.length;i<r;i++){var a=e[i];if(null!=a){if(A(a)){n=hl;break}if(O(a)){n=ul;break}}}}else if(O(e)){for(var o in e)if(e.hasOwnProperty(o)&&P(e[o])){n=cl;break}}else if(null!=e)throw new Error("Invalid data");ml(t).sourceFormat=n}(this)}}),Bh.extend({type:"dataset"});var Su=Ma.extend({type:"ellipse",shape:{cx:0,cy:0,rx:0,ry:0},buildPath:function(t,e){var n=e.cx,i=e.cy,r=e.rx,a=e.ry,o=.5522848*r,s=.5522848*a;t.moveTo(n-r,i),t.bezierCurveTo(n-r,i-s,n-o,i-a,n,i-a),t.bezierCurveTo(n+o,i-a,n+r,i-s,n+r,i),t.bezierCurveTo(n+r,i+s,n+o,i+a,n,i+a),t.bezierCurveTo(n-o,i+a,n-r,i+s,n-r,i),t.closePath()}}),Mu=/[\s,]+/;function Iu(t){L(t)&&(t=(new DOMParser).parseFromString(t,"text/xml"));for(9===t.nodeType&&(t=t.firstChild);"svg"!==t.nodeName.toLowerCase()||1!==t.nodeType;)t=t.nextSibling;return t}var Tu={g:function(t,e){var n=new Ye;return ku(e,n),Lu(t,n,this._defs),n},rect:function(t,e){var n=new io;return ku(e,n),Lu(t,n,this._defs),n.setShape({x:parseFloat(t.getAttribute("x")||0),y:parseFloat(t.getAttribute("y")||0),width:parseFloat(t.getAttribute("width")||0),height:parseFloat(t.getAttribute("height")||0)}),n},circle:function(t,e){var n=new Xa;return ku(e,n),Lu(t,n,this._defs),n.setShape({cx:parseFloat(t.getAttribute("cx")||0),cy:parseFloat(t.getAttribute("cy")||0),r:parseFloat(t.getAttribute("r")||0)}),n},line:function(t,e){var n=new ao;return ku(e,n),Lu(t,n,this._defs),n.setShape({x1:parseFloat(t.getAttribute("x1")||0),y1:parseFloat(t.getAttribute("y1")||0),x2:parseFloat(t.getAttribute("x2")||0),y2:parseFloat(t.getAttribute("y2")||0)}),n},ellipse:function(t,e){var n=new Su;return ku(e,n),Lu(t,n,this._defs),n.setShape({cx:parseFloat(t.getAttribute("cx")||0),cy:parseFloat(t.getAttribute("cy")||0),rx:parseFloat(t.getAttribute("rx")||0),ry:parseFloat(t.getAttribute("ry")||0)}),n},polygon:function(t,e){var n=t.getAttribute("points");n=n&&Du(n);var i=new $a({shape:{points:n||[]}});return ku(e,i),Lu(t,i,this._defs),i},polyline:function(t,e){var n=new Ma;ku(e,n),Lu(t,n,this._defs);var i=t.getAttribute("points");return i=i&&Du(i),new Ka({shape:{points:i||[]}})},image:function(t,e){var n=new gi;return ku(e,n),Lu(t,n,this._defs),n.setStyle({image:t.getAttribute("xlink:href"),x:t.getAttribute("x"),y:t.getAttribute("y"),width:t.getAttribute("width"),height:t.getAttribute("height")}),n},text:function(t,e){var n=t.getAttribute("x")||0,i=t.getAttribute("y")||0,r=t.getAttribute("dx")||0,a=t.getAttribute("dy")||0;this._textX=parseFloat(n)+parseFloat(r),this._textY=parseFloat(i)+parseFloat(a);var o=new Ye;return ku(e,o),Lu(t,o,this._defs),o},tspan:function(t,e){var n=t.getAttribute("x"),i=t.getAttribute("y");null!=n&&(this._textX=parseFloat(n)),null!=i&&(this._textY=parseFloat(i));var r=t.getAttribute("dx")||0,a=t.getAttribute("dy")||0,o=new Ye;return ku(e,o),Lu(t,o,this._defs),this._textX+=r,this._textY+=a,o},path:function(t,e){var n=Wa(t.getAttribute("d")||"");return ku(e,n),Lu(t,n,this._defs),n}},Cu={lineargradient:function(t){var e=parseInt(t.getAttribute("x1")||0,10),n=parseInt(t.getAttribute("y1")||0,10),i=parseInt(t.getAttribute("x2")||10,10),r=parseInt(t.getAttribute("y2")||0,10),a=new fo(e,n,i,r);return function(t,e){var n=t.firstChild;for(;n;){if(1===n.nodeType){var i=n.getAttribute("offset");i=0<i.indexOf("%")?parseInt(i,10)/100:i?parseFloat(i):0;var r=n.getAttribute("stop-color")||"#000000";e.addColorStop(i,r)}n=n.nextSibling}}(t,a),a},radialgradient:function(t){}};function ku(t,e){t&&t.__inheritedStyle&&(e.__inheritedStyle||(e.__inheritedStyle={}),C(e.__inheritedStyle,t.__inheritedStyle))}function Du(t){for(var e=X(t).split(Mu),n=[],i=0;i<e.length;i+=2){var r=parseFloat(e[i]),a=parseFloat(e[i+1]);n.push([r,a])}return n}var Au={fill:"fill",stroke:"stroke","stroke-width":"lineWidth",opacity:"opacity","fill-opacity":"fillOpacity","stroke-opacity":"strokeOpacity","stroke-dasharray":"lineDash","stroke-dashoffset":"lineDashOffset","stroke-linecap":"lineCap","stroke-linejoin":"lineJoin","stroke-miterlimit":"miterLimit","font-family":"fontFamily","font-size":"fontSize","font-style":"fontStyle","font-weight":"fontWeight","text-align":"textAlign","alignment-baseline":"textBaseline"};function Lu(t,e,n,i){var r=e.__inheritedStyle||{},a="text"===e.type;if(1===t.nodeType&&(function(t,e){var n=t.getAttribute("transform");if(n){n=n.replace(/,/g," ");var i=null,r=[];n.replace(Eu,function(t,e,n){r.push(e,n)});for(var a=r.length-1;0<a;a-=2){var o=r[a],s=r[a-1];switch(i=i||Nt(),s){case"translate":o=X(o).split(Mu),Rt(i,i,[parseFloat(o[0]),parseFloat(o[1]||0)]);break;case"scale":o=X(o).split(Mu),Vt(i,i,[parseFloat(o[0]),parseFloat(o[1]||o[0])]);break;case"rotate":o=X(o).split(Mu),Ft(i,i,parseFloat(o[0]));break;case"skew":o=X(o).split(Mu),console.warn("Skew transform is not supported yet");break;case"matrix":o=X(o).split(Mu);i[0]=parseFloat(o[0]),i[1]=parseFloat(o[1]),i[2]=parseFloat(o[2]),i[3]=parseFloat(o[3]),i[4]=parseFloat(o[4]),i[5]=parseFloat(o[5])}}e.setLocalTransform(i)}}(t,e),S(r,function(t){var e=t.getAttribute("style"),n={};if(!e)return n;var i,r={};Nu.lastIndex=0;for(;null!=(i=Nu.exec(e));)r[i[1]]=i[2];for(var a in Au)Au.hasOwnProperty(a)&&null!=r[a]&&(n[Au[a]]=r[a]);return n}(t)),!i))for(var o in Au)if(Au.hasOwnProperty(o)){var s=t.getAttribute(o);null!=s&&(r[Au[o]]=s)}var l=a?"textFill":"fill",h=a?"textStroke":"stroke";e.style=e.style||new hn;var u=e.style;null!=r.fill&&u.set(l,Ou(r.fill,n)),null!=r.stroke&&u.set(h,Ou(r.stroke,n)),k(["lineWidth","opacity","fillOpacity","strokeOpacity","miterLimit","fontSize"],function(t){var e="lineWidth"===t&&a?"textStrokeWidth":t;null!=r[t]&&u.set(e,parseFloat(r[t]))}),r.textBaseline&&"auto"!==r.textBaseline||(r.textBaseline="alphabetic"),"alphabetic"===r.textBaseline&&(r.textBaseline="bottom"),"start"===r.textAlign&&(r.textAlign="left"),"end"===r.textAlign&&(r.textAlign="right"),k(["lineDashOffset","lineCap","lineJoin","fontWeight","fontFamily","fontStyle","textAlign","textBaseline"],function(t){null!=r[t]&&u.set(t,r[t])}),r.lineDash&&(e.style.lineDash=X(r.lineDash).split(Mu)),u[h]&&"none"!==u[h]&&(e[h]=!0),e.__inheritedStyle=r}var Pu=/url\(\s*#(.*?)\)/;function Ou(t,e){var n=e&&t&&t.match(Pu);return n?e[X(n[1])]:t}var Eu=/(translate|scale|rotate|skewX|skewY|matrix)\(([\-\s0-9\.e,]*)\)/g;var Nu=/([^\s:;]+)\s*:\s*([^:;]+)/g;var Bu=Z(),zu=function(t,e,n){var i;return k(i=A(e)?e:e.svg?[{type:"svg",source:e.svg,specialAreas:e.specialAreas}]:(e.geoJson&&!e.features&&(n=e.specialAreas,e=e.geoJson),[{type:"geoJSON",source:e,specialAreas:n}]),function(t){var e=t.type;"geoJson"===e&&(e=t.type="geoJSON"),(0,Fu[e])(t)}),Bu.set(t,i)},Ru=function(t){return Bu.get(t)},Fu={geoJSON:function(t){var e=t.source;t.geoJSON=L(e)?"undefined"!=typeof JSON&&JSON.parse?JSON.parse(e):new Function("return ("+e+");")():e},svg:function(t){t.svgXML=Iu(t.source)}},Vu=G,Wu=k,Hu=T,Gu=O,Xu=Js.parseClassType,qu={PROCESSOR:{FILTER:1e3,STATISTIC:5e3},VISUAL:{LAYOUT:1e3,PROGRESSIVE_LAYOUT:1100,GLOBAL:2e3,CHART:3e3,POST_CHART_LAYOUT:3500,COMPONENT:4e3,BRUSH:5e3}},Yu="__flagInMainProcess",Uu="__optionUpdated",ju=/^[a-zA-Z0-9_]+$/;function Zu(i){return function(t,e,n){t=t&&t.toLowerCase(),ft.prototype[i].call(this,t,e,n)}}function $u(){ft.call(this)}function Ku(t,e,n){n=n||{},"string"==typeof e&&(e=wc[e]),this.id,this.group,this._dom=t;var i=this._zr=Ei(t,{renderer:n.renderer||"canvas",devicePixelRatio:n.devicePixelRatio,width:n.width,height:n.height});this._throttledZrFlush=jh(w(i.flush,i),17),(e=b(e))&&Kl(e,!0),this._theme=e,this._chartsViews=[],this._chartsMap={},this._componentsViews=[],this._componentsMap={},this._coordSysMgr=new Dl;var r=this._api=function(n){var t=n._coordSysMgr;return S(new Cl(n),{getCoordinateSystems:w(t.getCoordinateSystems,t),getComponentByElement:function(t){for(;t;){var e=t.__ecComponentInfo;if(null!=e)return n._model.getComponent(e.mainType,e.index);t=t.parent}}})}(this);function a(t,e){return t.__prio-e.__prio}tn(xc,a),tn(mc,a),this._scheduler=new Jh(this,r,mc,xc),ft.call(this,this._ecEventProcessor=new pc),this._messageCenter=new $u,this._initEvents(),this.resize=w(this.resize,this),this._pendingActions=[],i.animation.on("frame",this._onframe,this),function(t,e){t.on("rendered",function(){e.trigger("rendered"),!t.animation.isFinished()||e[Uu]||e._scheduler.unfinished||e._pendingActions.length||e.trigger("finished")})}(i,this),Y(this)}$u.prototype.on=Zu("on"),$u.prototype.off=Zu("off"),$u.prototype.one=Zu("one"),_($u,ft);var Qu=Ku.prototype;function Ju(t,e,n){var i,r=this._model,a=this._coordSysMgr.getCoordinateSystems();e=$i(r,e);for(var o=0;o<a.length;o++){var s=a[o];if(s[t]&&null!=(i=s[t](r,e,n)))return i}}Qu._onframe=function(){if(!this._disposed){var t=this._scheduler;if(this[Uu]){var e=this[Uu].silent;this[Yu]=!0,ec(this),tc.update.call(this),this[Yu]=!1,this[Uu]=!1,ac.call(this,e),oc.call(this,e)}else if(t.unfinished){var n=1,i=this._model,r=this._api;t.unfinished=!1;do{var a=+new Date;t.performSeriesTasks(i),t.performDataProcessorTasks(i),ic(this,i),t.performVisualTasks(i),uc(this,this._model,r,"remain"),n-=+new Date-a}while(0<n&&t.unfinished);t.unfinished||this._zr.flush()}}},Qu.getDom=function(){return this._dom},Qu.getZr=function(){return this._zr},Qu.setOption=function(t,e,n){var i;if(Gu(e)&&(n=e.lazyUpdate,i=e.silent,e=e.notMerge),this[Yu]=!0,!this._model||e){var r=new Nl(this._api),a=this._theme,o=this._model=new Sl;o.scheduler=this._scheduler,o.init(null,null,a,r)}this._model.setOption(t,yc),n?(this[Uu]={silent:i},this[Yu]=!1):(ec(this),tc.update.call(this),this._zr.flush(),this[Uu]=!1,this[Yu]=!1,ac.call(this,i),oc.call(this,i))},Qu.setTheme=function(){console.error("ECharts#setTheme() is DEPRECATED in ECharts 3.0")},Qu.getModel=function(){return this._model},Qu.getOption=function(){return this._model&&this._model.getOption()},Qu.getWidth=function(){return this._zr.getWidth()},Qu.getHeight=function(){return this._zr.getHeight()},Qu.getDevicePixelRatio=function(){return this._zr.painter.dpr||window.devicePixelRatio||1},Qu.getRenderedCanvas=function(t){if(m.canvasSupported)return(t=t||{}).pixelRatio=t.pixelRatio||1,t.backgroundColor=t.backgroundColor||this._model.get("backgroundColor"),this._zr.painter.getRenderedCanvas(t)},Qu.getSvgDataUrl=function(){if(m.svgSupported){var t=this._zr;return k(t.storage.getDisplayList(),function(t){t.stopAnimation(!0)}),t.painter.pathToDataUrl()}},Qu.getDataURL=function(t){var e=(t=t||{}).excludeComponents,n=this._model,i=[],r=this;Wu(e,function(t){n.eachComponent({mainType:t},function(t){var e=r._componentsMap[t.__viewId];e.group.ignore||(i.push(e),e.group.ignore=!0)})});var a="svg"===this._zr.painter.getType()?this.getSvgDataUrl():this.getRenderedCanvas(t).toDataURL("image/"+(t&&t.type||"png"));return Wu(i,function(t){t.group.ignore=!1}),a},Qu.getConnectedDataURL=function(r){if(m.canvasSupported){var a=this.group,o=Math.min,s=Math.max;if(Mc[a]){var l=1/0,h=1/0,u=-1/0,c=-1/0,d=[],n=r&&r.pixelRatio||1;k(Sc,function(t,e){if(t.group===a){var n=t.getRenderedCanvas(b(r)),i=t.getDom().getBoundingClientRect();l=o(i.left,l),h=o(i.top,h),u=s(i.right,u),c=s(i.bottom,c),d.push({dom:n,left:i.left,top:i.top})}});var t=(u*=n)-(l*=n),e=(c*=n)-(h*=n),i=p();i.width=t,i.height=e;var f=Ei(i);return r.connectedBackgroundColor&&f.add(new io({shape:{x:0,y:0,width:t,height:e},style:{fill:r.connectedBackgroundColor}})),Wu(d,function(t){var e=new gi({style:{x:t.left*n-l,y:t.top*n-h,image:t.dom}});f.add(e)}),f.refreshImmediately(),i.toDataURL("image/"+(r&&r.type||"png"))}return this.getDataURL(r)}},Qu.convertToPixel=I(Ju,"convertToPixel"),Qu.convertFromPixel=I(Ju,"convertFromPixel"),Qu.containPixel=function(t,r){var a;return k(t=$i(this._model,t),function(t,i){0<=i.indexOf("Models")&&k(t,function(t){var e=t.coordinateSystem;if(e&&e.containPoint)a|=!!e.containPoint(r);else if("seriesModels"===i){var n=this._chartsMap[t.__viewId];n&&n.containPoint&&(a|=n.containPoint(r,t))}},this)},this),!!a},Qu.getVisual=function(t,e){var n=(t=$i(this._model,t,{defaultMainType:"series"})).seriesModel.getData(),i=t.hasOwnProperty("dataIndexInside")?t.dataIndexInside:t.hasOwnProperty("dataIndex")?n.indexOfRawIndex(t.dataIndex):null;return null!=i?n.getItemVisual(i,e):n.getVisual(e)},Qu.getViewOfComponentModel=function(t){return this._componentsMap[t.__viewId]},Qu.getViewOfSeriesModel=function(t){return this._chartsMap[t.__viewId]};var tc={prepareAndUpdate:function(t){ec(this),tc.update.call(this,t)},update:function(t){var e=this._model,n=this._api,i=this._zr,r=this._coordSysMgr,a=this._scheduler;if(e){a.restoreData(e,t),a.performSeriesTasks(e),r.create(e,n),a.performDataProcessorTasks(e,t),ic(this,e),r.update(e,n),lc(e),a.performVisualTasks(e,t),hc(this,e,n,t);var o=e.get("backgroundColor")||"transparent";if(m.canvasSupported)i.setBackgroundColor(o);else{var s=fe(o);o=ge(s,"rgb"),0===s[3]&&(o="transparent")}cc(e,n)}},updateTransform:function(r){var a=this._model,o=this,s=this._api;if(a){var l=[];a.eachComponent(function(t,e){var n=o.getViewOfComponentModel(e);if(n&&n.__alive)if(n.updateTransform){var i=n.updateTransform(e,a,s,r);i&&i.update&&l.push(n)}else l.push(n)});var i=Z();a.eachSeries(function(t){var e=o._chartsMap[t.__viewId];if(e.updateTransform){var n=e.updateTransform(t,a,s,r);n&&n.update&&i.set(t.uid,1)}else i.set(t.uid,1)}),lc(a),this._scheduler.performVisualTasks(a,r,{setDirty:!0,dirtyMap:i}),uc(o,a,s,r,i),cc(a,this._api)}},updateView:function(t){var e=this._model;e&&(Wh.markUpdateMethod(t,"updateView"),lc(e),this._scheduler.performVisualTasks(e,t,{setDirty:!0}),hc(this,this._model,this._api,t),cc(e,this._api))},updateVisual:function(t){tc.update.call(this,t)},updateLayout:function(t){tc.update.call(this,t)}};function ec(t){var e=t._model,n=t._scheduler;n.restorePipelines(e),n.prepareStageTasks(),sc(t,"component",e,n),sc(t,"chart",e,n),n.plan()}function nc(e,n,i,r,t){var a=e._model;if(r){var o={};o[r+"Id"]=i[r+"Id"],o[r+"Index"]=i[r+"Index"],o[r+"Name"]=i[r+"Name"];var s={mainType:r,query:o};t&&(s.subType=t);var l=i.excludeSeriesId;null!=l&&(l=Z(Vi(l))),a&&a.eachComponent(s,function(t){l&&null!=l.get(t.id)||h(e["series"===r?"_chartsMap":"_componentsMap"][t.__viewId])},e)}else Wu(e._componentsViews.concat(e._chartsViews),h);function h(t){t&&t.__alive&&t[n]&&t[n](t.__model,a,e._api,i)}}function ic(t,e){var n=t._chartsMap,i=t._scheduler;e.eachSeries(function(t){i.updateStreamModes(t,n[t.__viewId])})}function rc(e,t){var n=e.type,i=e.escapeConnect,r=gc[n],a=r.actionInfo,o=(a.update||"update").split(":"),s=o.pop();o=null!=o[0]&&Xu(o[0]),this[Yu]=!0;var l=[e],h=!1;e.batch&&(h=!0,l=D(e.batch,function(t){return(t=C(S({},t),e)).batch=null,t}));var u,c=[],d="highlight"===n||"downplay"===n;Wu(l,function(t){(u=(u=r.action(t,this._model,this._api))||S({},t)).type=a.event||u.type,c.push(u),d?nc(this,s,t,"series"):o&&nc(this,s,t,o.main,o.sub)},this),"none"===s||d||o||(this[Uu]?(ec(this),tc.update.call(this,e),this[Uu]=!1):tc[s].call(this,e)),u=h?{type:a.event||n,escapeConnect:i,batch:c}:c[0],this[Yu]=!1,t||this._messageCenter.trigger(u.type,u)}function ac(t){for(var e=this._pendingActions;e.length;){var n=e.shift();rc.call(this,n,t)}}function oc(t){t||this.trigger("updated")}function sc(t,e,r,a){for(var o="component"===e,s=o?t._componentsViews:t._chartsViews,l=o?t._componentsMap:t._chartsMap,h=t._zr,u=t._api,n=0;n<s.length;n++)s[n].__alive=!1;function i(t){var e="_ec_"+t.id+"_"+t.type,n=l[e];if(!n){var i=Xu(t.type);(n=new(o?Bh.getClass(i.main,i.sub):Wh.getClass(i.sub))).init(r,u),l[e]=n,s.push(n),h.add(n.group)}t.__viewId=n.__id=e,n.__alive=!0,n.__model=t,n.group.__ecComponentInfo={mainType:t.mainType,index:t.componentIndex},o||a.prepareView(n,t,r,u)}o?r.eachComponent(function(t,e){"series"!==t&&i(e)}):r.eachSeries(i);for(n=0;n<s.length;){var c=s[n];c.__alive?n++:(o||c.renderTask.dispose(),h.remove(c.group),c.dispose(r,u),s.splice(n,1),delete l[c.__id],c.__id=c.group.__ecComponentInfo=null)}}function lc(t){t.clearColorPalette(),t.eachSeries(function(t){t.clearColorPalette()})}function hc(t,e,n,i){!function(t,n,i,r,e){Wu(e||t._componentsViews,function(t){var e=t.__model;t.render(e,n,i,r),fc(e,t)})}(t,e,n,i),Wu(t._chartsViews,function(t){t.__alive=!1}),uc(t,e,n,i),Wu(t._chartsViews,function(t){t.__alive||t.remove(e,n)})}function uc(i,t,e,r,a){var o,s=i._scheduler;t.eachSeries(function(t){var e=i._chartsMap[t.__viewId];e.__alive=!0;var n=e.renderTask;s.updatePayload(n,r),a&&a.get(t.uid)&&n.dirty(),o|=n.perform(s.getPerformArgs(n)),e.group.silent=!!t.get("silent"),fc(t,e),function(t,e){var n=t.get("blendMode")||null;e.group.traverse(function(t){t.isGroup||t.style.blend!==n&&t.setStyle("blend",n),t.eachPendingDisplayable&&t.eachPendingDisplayable(function(t){t.setStyle("blend",n)})})}(t,e)}),s.unfinished|=o,function(n,t){var e=n._zr.storage,i=0;e.traverse(function(t){i++}),i>t.get("hoverLayerThreshold")&&!m.node&&t.eachSeries(function(t){if(!t.preventUsingHoverLayer){var e=n._chartsMap[t.__viewId];e.__alive&&e.group.traverse(function(t){t.useHoverLayer=!0})}})}(i,t),Kh(i._zr.dom,t)}function cc(e,n){Wu(_c,function(t){t(e,n)})}Qu.resize=function(t){this._zr.resize(t);var e=this._model;if(this._loadingFX&&this._loadingFX.resize(),e){var n=e.resetOption("media"),i=t&&t.silent;this[Yu]=!0,n&&ec(this),tc.update.call(this),this[Yu]=!1,ac.call(this,i),oc.call(this,i)}},Qu.showLoading=function(t,e){if(Gu(t)&&(e=t,t=""),t=t||"default",this.hideLoading(),bc[t]){var n=bc[t](this._api,e),i=this._zr;this._loadingFX=n,i.add(n)}},Qu.hideLoading=function(){this._loadingFX&&this._zr.remove(this._loadingFX),this._loadingFX=null},Qu.makeActionFromEvent=function(t){var e=S({},t);return e.type=vc[t.type],e},Qu.dispatchAction=function(t,e){Gu(e)||(e={silent:!!e}),gc[t.type]&&this._model&&(this[Yu]?this._pendingActions.push(t):(rc.call(this,t,e.silent),e.flush?this._zr.flush(!0):!1!==e.flush&&m.browser.weChat&&this._throttledZrFlush(),ac.call(this,e.silent),oc.call(this,e.silent)))},Qu.appendData=function(t){var e=t.seriesIndex;this.getModel().getSeriesByIndex(e).appendData(t),this._scheduler.unfinished=!0},Qu.on=Zu("on"),Qu.off=Zu("off"),Qu.one=Zu("one");var dc=["click","dblclick","mouseover","mouseout","mousemove","mousedown","mouseup","globalout","contextmenu"];function fc(t,e){var n=t.get("z"),i=t.get("zlevel");e.group.traverse(function(t){"group"!==t.type&&(null!=n&&(t.z=n),null!=i&&(t.zlevel=i))})}function pc(){this.eventInfo}Qu._initEvents=function(){Wu(dc,function(h){function t(t){var e,n=this.getModel(),i=t.target;if("globalout"===h)e={};else if(i&&null!=i.dataIndex){var r=i.dataModel||n.getSeriesByIndex(i.seriesIndex);e=r&&r.getDataParams(i.dataIndex,i.dataType,i)||{}}else i&&i.eventData&&(e=S({},i.eventData));if(e){var a=e.componentType,o=e.componentIndex;"markLine"!==a&&"markPoint"!==a&&"markArea"!==a||(a="series",o=e.seriesIndex);var s=a&&null!=o&&n.getComponent(a,o),l=s&&this["series"===s.mainType?"_chartsMap":"_componentsMap"][s.__viewId];e.event=t,e.type=h,this._ecEventProcessor.eventInfo={targetEl:i,packedEvent:e,model:s,view:l},this.trigger(h,e)}}t.zrEventfulCallAtLast=!0,this._zr.on(h,t,this)},this),Wu(vc,function(t,e){this._messageCenter.on(e,function(t){this.trigger(e,t)},this)},this)},Qu.isDisposed=function(){return this._disposed},Qu.clear=function(){this.setOption({series:[]},!0)},Qu.dispose=function(){if(!this._disposed){this._disposed=!0,Qi(this.getDom(),Cc,"");var e=this._api,n=this._model;Wu(this._componentsViews,function(t){t.dispose(n,e)}),Wu(this._chartsViews,function(t){t.dispose(n,e)}),this._zr.dispose(),delete Sc[this.id]}},_(Ku,ft),pc.prototype={constructor:pc,normalizeQuery:function(t){var s={},l={},h={};if(L(t)){var e=Xu(t);s.mainType=e.main||null,s.subType=e.sub||null}else{var u=["Index","Name","Id"],c={name:1,dataIndex:1,dataType:1};k(t,function(t,e){for(var n=!1,i=0;i<u.length;i++){var r=u[i],a=e.lastIndexOf(r);if(0<a&&a===e.length-r.length){var o=e.slice(0,a);"data"!==o&&(s.mainType=o,s[r.toLowerCase()]=t,n=!0)}}c.hasOwnProperty(e)&&(l[e]=t,n=!0),n||(h[e]=t)})}return{cptQuery:s,dataQuery:l,otherQuery:h}},filter:function(t,e,n){var i=this.eventInfo;if(!i)return!0;var r=i.targetEl,a=i.packedEvent,o=i.model,s=i.view;if(!o||!s)return!0;var l=e.cptQuery,h=e.dataQuery;return u(l,o,"mainType")&&u(l,o,"subType")&&u(l,o,"index","componentIndex")&&u(l,o,"name")&&u(l,o,"id")&&u(h,a,"name")&&u(h,a,"dataIndex")&&u(h,a,"dataType")&&(!s.filterForExposedEvent||s.filterForExposedEvent(t,e.otherQuery,r,a));function u(t,e,n,i){return null==t[n]||e[i||n]===t[n]}},afterTrigger:function(){this.eventInfo=null}};var gc={},vc={},mc=[],yc=[],_c=[],xc=[],wc={},bc={},Sc={},Mc={},Ic=new Date-0,Tc=new Date-0,Cc="_echarts_instance_";function kc(t){Mc[t]=!1}var Dc=kc;function Ac(t){return Sc[function(t,e){return t.getAttribute?t.getAttribute(e):t[e]}(t,Cc)]}function Lc(t,e){wc[t]=e}function Pc(t){yc.push(t)}function Oc(t,e){zc(mc,t,e,1e3)}function Ec(t,e,n){"function"==typeof e&&(n=e,e="");var i=Gu(t)?t.type:[t,t={event:e}][0];t.event=(t.event||i).toLowerCase(),e=t.event,Vu(ju.test(i)&&ju.test(e)),gc[i]||(gc[i]={action:n,actionInfo:t}),vc[e]=i}function Nc(t,e){zc(xc,t,e,1e3,"layout")}function Bc(t,e){zc(xc,t,e,3e3,"visual")}function zc(t,e,n,i,r){(Hu(e)||Gu(e))&&(n=e,e=i);var a=Jh.wrapStageHandler(n,r);return a.__prio=e,a.__raw=n,t.push(a),a}function Rc(t,e){bc[t]=e}function Fc(t){return Bh.extend(t)}function Vc(t){return kh.extend(t)}function Wc(t){return Wh.extend(t)}Bc(2e3,Zh),Pc(Kl),Oc(5e3,function(t){var a=Z();t.eachSeries(function(t){var e=t.get("stack");if(e){var n=a.get(e)||a.set(e,[]),i=t.getData(),r={stackResultDimension:i.getCalculationInfo("stackResultDimension"),stackedOverDimension:i.getCalculationInfo("stackedOverDimension"),stackedDimension:i.getCalculationInfo("stackedDimension"),stackedByDimension:i.getCalculationInfo("stackedByDimension"),isStackedByIndex:i.getCalculationInfo("isStackedByIndex"),data:i,seriesModel:t};if(!r.stackedDimension||!r.isStackedByIndex&&!r.stackedByDimension)return;n.length&&i.setCalculationInfo("stackedOnSeries",n[n.length-1].seriesModel),n.push(r)}}),a.each(Ql)}),Rc("default",function(i,t){C(t=t||{},{text:"loading",color:"#c23531",textColor:"#000",maskColor:"rgba(255, 255, 255, 0.8)",zlevel:0});var r=new io({style:{fill:t.maskColor},zlevel:t.zlevel,z:1e4}),a=new uo({shape:{startAngle:-Qh/2,endAngle:-Qh/2+.1,r:10},style:{stroke:t.color,lineCap:"round",lineWidth:5},zlevel:t.zlevel,z:10001}),o=new io({style:{fill:"none",text:t.text,textPosition:"right",textDistance:10,textFill:t.textColor},zlevel:t.zlevel,z:10001});a.animateShape(!0).when(1e3,{endAngle:3*Qh/2}).start("circularInOut"),a.animateShape(!0).when(1e3,{startAngle:3*Qh/2}).delay(300).start("circularInOut");var e=new Ye;return e.add(a),e.add(o),e.add(r),e.resize=function(){var t=i.getWidth()/2,e=i.getHeight()/2;a.setShape({cx:t,cy:e});var n=a.shape.r;o.setShape({x:t-n,y:e-n,width:2*n,height:2*n}),r.setShape({x:0,y:0,width:i.getWidth(),height:i.getHeight()})},e.resize(),e}),Ec({type:"highlight",event:"highlight",update:"highlight"},$),Ec({type:"downplay",event:"downplay",update:"downplay"},$),Lc("light",_u),Lc("dark",bu);function Hc(t){return t}function Gc(t,e,n,i,r){this._old=t,this._new=e,this._oldKeyGetter=n||Hc,this._newKeyGetter=i||Hc,this.context=r}function Xc(t,e,n,i,r){for(var a=0;a<t.length;a++){var o="_ec_"+r[i](t[a],a),s=e[o];null==s?(n.push(o),e[o]=a):(s.length||(e[o]=s=[s]),s.push(a))}}Gc.prototype={constructor:Gc,add:function(t){return this._add=t,this},update:function(t){return this._update=t,this},remove:function(t){return this._remove=t,this},execute:function(){var t=this._old,e=this._new,n={},i=[],r=[];for(Xc(t,{},i,"_oldKeyGetter",this),Xc(e,n,r,"_newKeyGetter",this),a=0;a<t.length;a++){if(null!=(s=n[o=i[a]]))(h=s.length)?(1===h&&(n[o]=null),s=s.unshift()):n[o]=null,this._update&&this._update(s,a);else this._remove&&this._remove(a)}for(var a=0;a<r.length;a++){var o=r[a];if(n.hasOwnProperty(o)){var s;if(null==(s=n[o]))continue;if(s.length)for(var l=0,h=s.length;l<h;l++)this._add&&this._add(s[l]);else this._add&&this._add(s)}}}};var qc=Z(["tooltip","label","itemName","itemId","seriesName"]);function Yc(t,e){return t.hasOwnProperty(e)||(t[e]=[]),t[e]}var Uc=O,jc="undefined",Zc={float:typeof Float64Array==jc?Array:Float64Array,int:typeof Int32Array==jc?Array:Int32Array,ordinal:Array,number:Array,time:Array},$c=typeof Uint32Array==jc?Array:Uint32Array,Kc=typeof Int32Array==jc?Array:Int32Array,Qc=typeof Uint16Array==jc?Array:Uint16Array;function Jc(t){return 65535<t._rawCount?$c:Qc}var td=["hasItemOption","_nameList","_idList","_invertedIndicesMap","_rawData","_chunkSize","_chunkCount","_dimValueGetter","_count","_rawCount","_nameDimIdx","_idDimIdx"],ed=["_extent","_approximateExtent","_rawExtent"];function nd(e,n){k(td.concat(n.__wrappedMethods||[]),function(t){n.hasOwnProperty(t)&&(e[t]=n[t])}),e.__wrappedMethods=n.__wrappedMethods,k(ed,function(t){e[t]=b(n[t])}),e._calculationInfo=S(n._calculationInfo)}function id(t,e){t=t||["x","y"];for(var n={},i=[],r={},a=0;a<t.length;a++){var o=t[a];L(o)&&(o={name:o});var s=o.name;o.type=o.type||"float",o.coordDim||(o.coordDim=s,o.coordDimIndex=0),o.otherDims=o.otherDims||{},i.push(s),(n[s]=o).index=a,o.createInvertedIndices&&(r[s]=[])}this.dimensions=i,this._dimensionInfos=n,this.hostModel=e,this.dataType,this._indices=null,this._count=0,this._rawCount=0,this._storage={},this._nameList=[],this._idList=[],this._optionModels=[],this._visual={},this._layout={},this._itemVisuals=[],this.hasItemVisual={},this._itemLayouts=[],this._graphicEls=[],this._chunkSize=1e5,this._chunkCount=0,this._rawData,this._rawExtent={},this._extent={},this._approximateExtent={},this._dimensionsSummary=function(i){var t={},a=t.encode={},o=Z(),s=[],l=[],h=t.userOutput={dimensionNames:i.dimensions.slice(),encode:{}};k(i.dimensions,function(t){var r=i.getDimensionInfo(t),e=r.coordDim;if(e){var n=r.coordDimIndex;Yc(a,e)[n]=t,r.isExtraCoord||(o.set(e,1),function(t){return!("ordinal"===t||"time"===t)}(r.type)&&(s[0]=t),Yc(h.encode,e)[n]=r.index),r.defaultTooltip&&l.push(t)}qc.each(function(t,e){var n=Yc(a,e),i=r.otherDims[e];null!=i&&!1!==i&&(n[i]=r.name)})});var r=[],u={};o.each(function(t,e){var n=a[e];u[e]=n[0],r=r.concat(n)}),t.dataDimsOnCoord=r,t.encodeFirstDimNotExtra=u;var e=a.label;e&&e.length&&(s=e.slice());var n=a.tooltip;return n&&n.length?l=n.slice():l.length||(l=s.slice()),a.defaultedLabel=s,a.defaultedTooltip=l,t}(this),this._invertedIndicesMap=r,this._calculationInfo={},this.userOutput=this._dimensionsSummary.userOutput}var rd=id.prototype;function ad(t,e,n,i,r){var a=Zc[e.type],o=i-1,s=e.name,l=t[s][o];if(l&&l.length<n){for(var h=new a(Math.min(r-o*n,n)),u=0;u<l.length;u++)h[u]=l[u];t[s][o]=h}for(var c=i*n;c<r;c+=n)t[s].push(new a(Math.min(r-c,n)))}function od(r){var a=r._invertedIndicesMap;k(a,function(t,e){var n=r._dimensionInfos[e].ordinalMeta;if(n){t=a[e]=new Kc(n.categories.length);for(var i=0;i<t.length;i++)t[i]=-1;for(i=0;i<r._count;i++)t[r.get(e,i)]=i}})}function sd(t,e,n){var i;if(null!=e){var r=t._chunkSize,a=Math.floor(n/r),o=n%r,s=t.dimensions[e],l=t._storage[s][a];if(l){i=l[o];var h=t._dimensionInfos[s].ordinalMeta;h&&h.categories.length&&(i=h.categories[i])}}return i}function ld(t){return t}function hd(t){return t<this._count&&0<=t?this._indices[t]:-1}function ud(t,e){var n=t._idList[e];return null==n&&(n=sd(t,t._idDimIdx,e)),null==n&&(n="e\0\0"+e),n}function cd(t){return A(t)||(t=[t]),t}function dd(t,e){var n=t.dimensions,i=new id(D(n,t.getDimensionInfo,t),t.hostModel);nd(i,t);for(var r=i._storage={},a=t._storage,o=0;o<n.length;o++){var s=n[o];a[s]&&(0<=v(e,s)?(r[s]=fd(a[s]),i._rawExtent[s]=pd(),i._extent[s]=null):r[s]=a[s])}return i}function fd(t){for(var e,n,i=new Array(t.length),r=0;r<t.length;r++)i[r]=(e=t[r],n=void 0,(n=e.constructor)===Array?e.slice():new n(e));return i}function pd(){return[1/0,-1/0]}rd.type="list",rd.hasItemOption=!0,rd.getDimension=function(t){return"number"!=typeof t&&(isNaN(t)||this._dimensionInfos.hasOwnProperty(t))||(t=this.dimensions[t]),t},rd.getDimensionInfo=function(t){return this._dimensionInfos[this.getDimension(t)]},rd.getDimensionsOnCoord=function(){return this._dimensionsSummary.dataDimsOnCoord.slice()},rd.mapDimension=function(t,e){var n=this._dimensionsSummary;if(null==e)return n.encodeFirstDimNotExtra[t];var i=n.encode[t];return!0===e?(i||[]).slice():i&&i[e]},rd.initData=function(t,e,n){(vl.isInstance(t)||P(t))&&(t=new Jl(t,this.dimensions.length)),this._rawData=t,this._storage={},this._indices=null,this._nameList=e||[],this._idList=[],this._nameRepeatCount={},n||(this.hasItemOption=!1),this.defaultDimValueGetter=sh[this._rawData.getSource().sourceFormat],this._dimValueGetter=n=n||this.defaultDimValueGetter,this._dimValueGetterArrayRows=sh.arrayRows,this._rawExtent={},this._initDataFromProvider(0,t.count()),t.pure&&(this.hasItemOption=!1)},rd.getProvider=function(){return this._rawData},rd.appendData=function(t){var e=this._rawData,n=this.count();e.appendData(t);var i=e.count();e.persistent||(i+=n),this._initDataFromProvider(n,i)},rd.appendValues=function(t,e){for(var n=this._chunkSize,i=this._storage,r=this.dimensions,a=r.length,o=this._rawExtent,s=this.count(),l=s+Math.max(t.length,e?e.length:0),h=this._chunkCount,u=0;u<a;u++){o[m=r[u]]||(o[m]=pd()),i[m]||(i[m]=[]),ad(i,this._dimensionInfos[m],n,h,l),this._chunkCount=i[m].length}for(var c=new Array(a),d=s;d<l;d++){for(var f=d-s,p=Math.floor(d/n),g=d%n,v=0;v<a;v++){var m=r[v],y=this._dimValueGetterArrayRows(t[f]||c,m,f,v);i[m][p][g]=y;var _=o[m];y<_[0]&&(_[0]=y),y>_[1]&&(_[1]=y)}e&&(this._nameList[d]=e[f])}this._rawCount=this._count=l,this._extent={},od(this)},rd._initDataFromProvider=function(t,e){if(!(e<=t)){for(var n,i=this._chunkSize,r=this._rawData,a=this._storage,o=this.dimensions,s=o.length,l=this._dimensionInfos,h=this._nameList,u=this._idList,c=this._rawExtent,d=this._nameRepeatCount={},f=this._chunkCount,p=0;p<s;p++){c[w=o[p]]||(c[w]=pd());var g=l[w];0===g.otherDims.itemName&&(n=this._nameDimIdx=p),0===g.otherDims.itemId&&(this._idDimIdx=p),a[w]||(a[w]=[]),ad(a,g,i,f,e),this._chunkCount=a[w].length}for(var v=new Array(s),m=t;m<e;m++){v=r.getItem(m,v);for(var y=Math.floor(m/i),_=m%i,x=0;x<s;x++){var w,b=a[w=o[x]][y],S=this._dimValueGetter(v,w,m,x);b[_]=S;var M=c[w];S<M[0]&&(M[0]=S),S>M[1]&&(M[1]=S)}if(!r.pure){var I=h[m];if(v&&null==I)if(null!=v.name)h[m]=I=v.name;else if(null!=n){var T=o[n],C=a[T][y];if(C){I=C[_];var k=l[T].ordinalMeta;k&&k.categories.length&&(I=k.categories[I])}}var D=null==v?null:v.id;null==D&&null!=I&&(d[I]=d[I]||0,0<d[D=I]&&(D+="__ec__"+d[I]),d[I]++),null!=D&&(u[m]=D)}}!r.persistent&&r.clean&&r.clean(),this._rawCount=this._count=e,this._extent={},od(this)}},rd.count=function(){return this._count},rd.getIndices=function(){var t=this._indices;if(t){var e=t.constructor,n=this._count;if(e===Array){r=new e(n);for(var i=0;i<n;i++)r[i]=t[i]}else r=new e(t.buffer,0,n)}else{var r=new(e=Jc(this))(this.count());for(i=0;i<r.length;i++)r[i]=i}return r},rd.get=function(t,e){if(!(0<=e&&e<this._count))return NaN;var n=this._storage;if(!n[t])return NaN;e=this.getRawIndex(e);var i=Math.floor(e/this._chunkSize),r=e%this._chunkSize;return n[t][i][r]},rd.getByRawIndex=function(t,e){if(!(0<=e&&e<this._rawCount))return NaN;var n=this._storage[t];if(!n)return NaN;var i=Math.floor(e/this._chunkSize),r=e%this._chunkSize;return n[i][r]},rd._getFast=function(t,e){var n=Math.floor(e/this._chunkSize),i=e%this._chunkSize;return this._storage[t][n][i]},rd.getValues=function(t,e){var n=[];A(t)||(e=t,t=this.dimensions);for(var i=0,r=t.length;i<r;i++)n.push(this.get(t[i],e));return n},rd.hasValue=function(t){for(var e=this._dimensionsSummary.dataDimsOnCoord,n=0,i=e.length;n<i;n++)if(isNaN(this.get(e[n],t)))return!1;return!0},rd.getDataExtent=function(t){t=this.getDimension(t);var e=this._storage[t],n=pd();if(!e)return n;var i,r=this.count();if(!this._indices)return this._rawExtent[t].slice();if(i=this._extent[t])return i.slice();for(var a=(i=n)[0],o=i[1],s=0;s<r;s++){var l=this._getFast(t,this.getRawIndex(s));l<a&&(a=l),o<l&&(o=l)}return i=[a,o],this._extent[t]=i},rd.getApproximateExtent=function(t){return t=this.getDimension(t),this._approximateExtent[t]||this.getDataExtent(t)},rd.setApproximateExtent=function(t,e){e=this.getDimension(e),this._approximateExtent[e]=t.slice()},rd.getCalculationInfo=function(t){return this._calculationInfo[t]},rd.setCalculationInfo=function(t,e){Uc(t)?S(this._calculationInfo,t):this._calculationInfo[t]=e},rd.getSum=function(t){var e=0;if(this._storage[t])for(var n=0,i=this.count();n<i;n++){var r=this.get(t,n);isNaN(r)||(e+=r)}return e},rd.getMedian=function(t){var n=[];this.each(t,function(t,e){isNaN(t)||n.push(t)});var e=[].concat(n).sort(function(t,e){return t-e}),i=this.count();return 0===i?0:i%2==1?e[(i-1)/2]:(e[i/2]+e[i/2-1])/2},rd.rawIndexOf=function(t,e){var n=(t&&this._invertedIndicesMap[t])[e];return null==n||isNaN(n)?-1:n},rd.indexOfName=function(t){for(var e=0,n=this.count();e<n;e++)if(this.getName(e)===t)return e;return-1},rd.indexOfRawIndex=function(t){if(!this._indices)return t;if(t>=this._rawCount||t<0)return-1;var e=this._indices,n=e[t];if(null!=n&&n<this._count&&n===t)return t;for(var i=0,r=this._count-1;i<=r;){var a=(i+r)/2|0;if(e[a]<t)i=1+a;else{if(!(e[a]>t))return a;r=a-1}}return-1},rd.indicesOfNearest=function(t,e,n){var i=[];if(!this._storage[t])return i;null==n&&(n=1/0);for(var r=Number.MAX_VALUE,a=-1,o=0,s=this.count();o<s;o++){var l=e-this.get(t,o),h=Math.abs(l);l<=n&&h<=r&&((h<r||0<=l&&a<0)&&(r=h,a=l,i.length=0),i.push(o))}return i},rd.getRawIndex=ld,rd.getRawDataItem=function(t){if(this._rawData.persistent)return this._rawData.getItem(this.getRawIndex(t));for(var e=[],n=0;n<this.dimensions.length;n++){var i=this.dimensions[n];e.push(this.get(i,t))}return e},rd.getName=function(t){var e=this.getRawIndex(t);return this._nameList[e]||sd(this,this._nameDimIdx,e)||""},rd.getId=function(t){return ud(this,this.getRawIndex(t))},rd.each=function(t,e,n,i){if(this._count){"function"==typeof t&&(i=n,n=e,e=t,t=[]),n=n||i||this;for(var r=(t=D(cd(t),this.getDimension,this)).length,a=0;a<this.count();a++)switch(r){case 0:e.call(n,a);break;case 1:e.call(n,this.get(t[0],a),a);break;case 2:e.call(n,this.get(t[0],a),this.get(t[1],a),a);break;default:for(var o=0,s=[];o<r;o++)s[o]=this.get(t[o],a);s[o]=a,e.apply(n,s)}}},rd.filterSelf=function(t,e,n,i){if(this._count){"function"==typeof t&&(i=n,n=e,e=t,t=[]),n=n||i||this,t=D(cd(t),this.getDimension,this);for(var r=this.count(),a=new(Jc(this))(r),o=[],s=t.length,l=0,h=t[0],u=0;u<r;u++){var c,d=this.getRawIndex(u);if(0===s)c=e.call(n,u);else if(1===s){var f=this._getFast(h,d);c=e.call(n,f,u)}else{for(var p=0;p<s;p++)o[p]=this._getFast(h,d);o[p]=u,c=e.apply(n,o)}c&&(a[l++]=d)}return l<r&&(this._indices=a),this._count=l,this._extent={},this.getRawIndex=this._indices?hd:ld,this}},rd.selectRange=function(t){if(this._count){var e=[];for(var n in t)t.hasOwnProperty(n)&&e.push(n);var i=e.length;if(i){var r=this.count(),a=new(Jc(this))(r),o=0,s=e[0],l=t[s][0],h=t[s][1],u=!1;if(!this._indices){var c=0;if(1===i){for(var d=this._storage[e[0]],f=0;f<this._chunkCount;f++)for(var p=d[f],g=Math.min(this._count-f*this._chunkSize,this._chunkSize),v=0;v<g;v++){(l<=(w=p[v])&&w<=h||isNaN(w))&&(a[o++]=c),c++}u=!0}else if(2===i){d=this._storage[s];var m=this._storage[e[1]],y=t[e[1]][0],_=t[e[1]][1];for(f=0;f<this._chunkCount;f++){p=d[f];var x=m[f];for(g=Math.min(this._count-f*this._chunkSize,this._chunkSize),v=0;v<g;v++){var w=p[v],b=x[v];(l<=w&&w<=h||isNaN(w))&&(y<=b&&b<=_||isNaN(b))&&(a[o++]=c),c++}}u=!0}}if(!u)if(1===i)for(v=0;v<r;v++){var S=this.getRawIndex(v);(l<=(w=this._getFast(s,S))&&w<=h||isNaN(w))&&(a[o++]=S)}else for(v=0;v<r;v++){var M=!0;for(S=this.getRawIndex(v),f=0;f<i;f++){var I=e[f];((w=this._getFast(n,S))<t[I][0]||w>t[I][1])&&(M=!1)}M&&(a[o++]=this.getRawIndex(v))}return o<r&&(this._indices=a),this._count=o,this._extent={},this.getRawIndex=this._indices?hd:ld,this}}},rd.mapArray=function(t,e,n,i){"function"==typeof t&&(i=n,n=e,e=t,t=[]),n=n||i||this;var r=[];return this.each(t,function(){r.push(e&&e.apply(this,arguments))},n),r},rd.map=function(t,e,n,i){n=n||i||this;var r=dd(this,t=D(cd(t),this.getDimension,this));r._indices=this._indices,r.getRawIndex=r._indices?hd:ld;for(var a=r._storage,o=[],s=this._chunkSize,l=t.length,h=this.count(),u=[],c=r._rawExtent,d=0;d<h;d++){for(var f=0;f<l;f++)u[f]=this.get(t[f],d);u[l]=d;var p=e&&e.apply(n,u);if(null!=p){"object"!=typeof p&&(o[0]=p,p=o);for(var g=this.getRawIndex(d),v=Math.floor(g/s),m=g%s,y=0;y<p.length;y++){var _=t[y],x=p[y],w=c[_],b=a[_];b&&(b[v][m]=x),x<w[0]&&(w[0]=x),x>w[1]&&(w[1]=x)}}}return r},rd.downSample=function(t,e,n,i){for(var r=dd(this,[t]),a=r._storage,o=[],s=Math.floor(1/e),l=a[t],h=this.count(),u=this._chunkSize,c=r._rawExtent[t],d=new(Jc(this))(h),f=0,p=0;p<h;p+=s){h-p<s&&(s=h-p,o.length=s);for(var g=0;g<s;g++){var v=this.getRawIndex(p+g),m=Math.floor(v/u),y=v%u;o[g]=l[m][y]}var _=n(o),x=this.getRawIndex(Math.min(p+i(o,_)||0,h-1)),w=x%u;(l[Math.floor(x/u)][w]=_)<c[0]&&(c[0]=_),_>c[1]&&(c[1]=_),d[f++]=x}return r._count=f,r._indices=d,r.getRawIndex=hd,r},rd.getItemModel=function(t){var e=this.hostModel;return new vs(this.getRawDataItem(t),e,e&&e.ecModel)},rd.diff=function(e){var n=this;return new Gc(e?e.getIndices():[],this.getIndices(),function(t){return ud(e,t)},function(t){return ud(n,t)})},rd.getVisual=function(t){var e=this._visual;return e&&e[t]},rd.setVisual=function(t,e){if(Uc(t))for(var n in t)t.hasOwnProperty(n)&&this.setVisual(n,t[n]);else this._visual=this._visual||{},this._visual[t]=e},rd.setLayout=function(t,e){if(Uc(t))for(var n in t)t.hasOwnProperty(n)&&this.setLayout(n,t[n]);else this._layout[t]=e},rd.getLayout=function(t){return this._layout[t]},rd.getItemLayout=function(t){return this._itemLayouts[t]},rd.setItemLayout=function(t,e,n){this._itemLayouts[t]=n?S(this._itemLayouts[t]||{},e):e},rd.clearItemLayouts=function(){this._itemLayouts.length=0},rd.getItemVisual=function(t,e,n){var i=this._itemVisuals[t],r=i&&i[e];return null!=r||n?r:this.getVisual(e)},rd.setItemVisual=function(t,e,n){var i=this._itemVisuals[t]||{},r=this.hasItemVisual;if(this._itemVisuals[t]=i,Uc(e))for(var a in e)e.hasOwnProperty(a)&&(i[a]=e[a],r[a]=!0);else i[e]=n,r[e]=!0},rd.clearAllVisual=function(){this._visual={},this._itemVisuals=[],this.hasItemVisual={}};function gd(t){t.seriesIndex=this.seriesIndex,t.dataIndex=this.dataIndex,t.dataType=this.dataType}function vd(t,e,n){vl.isInstance(e)||(e=vl.seriesDataToSource(e)),n=n||{},t=(t||[]).slice();for(var i=(n.dimsDef||[]).slice(),l=Z(n.encodeDef),r=Z(),a=Z(),h=[],o=function(t,e,n,i){var r=Math.max(t.dimensionsDetectCount||1,e.length,n.length,i||0);return k(e,function(t){var e=t.dimsDef;e&&(r=Math.max(r,e.length))}),r}(e,t,i,n.dimCount),s=0;s<o;s++){var u=i[s]=S({},O(i[s])?i[s]:{name:i[s]}),c=u.name,d=h[s]={otherDims:{}};null!=c&&null==r.get(c)&&(d.name=d.displayName=c,r.set(c,s)),null!=u.type&&(d.type=u.type),null!=u.displayName&&(d.displayName=u.displayName)}l.each(function(t,n){if(1===(t=Vi(t).slice()).length&&!L(t[0])&&t[0]<0)l.set(n,!1);else{var i=l.set(n,[]);k(t,function(t,e){L(t)&&(t=r.get(t)),null!=t&&t<o&&(i[e]=t,p(h[t],n,e))})}});var f=0;function p(t,e,n){null!=qc.get(e)?t.otherDims[e]=n:(t.coordDim=e,t.coordDimIndex=n,a.set(e,!0))}k(t,function(r,t){var a,o,s;if(L(r))a=r,r={};else{a=r.name;var e=r.ordinalMeta;r.ordinalMeta=null,(r=b(r)).ordinalMeta=e,o=r.dimsDef,s=r.otherDims,r.name=r.coordDim=r.coordDimIndex=r.dimsDef=r.otherDims=null}if(!1!==(n=l.get(a))){var n;if(!(n=Vi(n)).length)for(var i=0;i<(o&&o.length||1);i++){for(;f<h.length&&null!=h[f].coordDim;)f++;f<h.length&&n.push(f++)}k(n,function(t,e){var n=h[t];if(p(C(n,r),a,e),null==n.name&&o){var i=o[e];O(i)||(i={name:i}),n.name=n.displayName=i.name,n.defaultTooltip=i.defaultTooltip}s&&C(n.otherDims,s)})}});var g=n.generateCoord,v=n.generateCoordCount,m=null!=v;v=g?v||1:0;for(var y,_,x=g||"value",w=0;w<o;w++){null==(d=h[w]=h[w]||{}).coordDim&&(d.coordDim=md(x,a,m),d.coordDimIndex=0,(!g||v<=0)&&(d.isExtraCoord=!0),v--),null==d.name&&(d.name=md(d.coordDim,r)),null==d.type&&(y=e,_=w,d.name,wl(y.data,y.sourceFormat,y.seriesLayoutBy,y.dimensionsDefine,y.startIndex,_))&&(d.type="ordinal")}return h}function md(t,e,n){if(n||null!=e.get(t)){for(var i=0;null!=e.get(t+i);)i++;t+=i}return e.set(t,!0),t}rd.setItemGraphicEl=function(t,e){var n=this.hostModel;e&&(e.dataIndex=t,e.dataType=this.dataType,e.seriesIndex=n&&n.seriesIndex,"group"===e.type&&e.traverse(gd,e)),this._graphicEls[t]=e},rd.getItemGraphicEl=function(t){return this._graphicEls[t]},rd.eachItemGraphicEl=function(n,i){k(this._graphicEls,function(t,e){t&&n&&n.call(i,t,e)})},rd.cloneShallow=function(t){if(!t){var e=D(this.dimensions,this.getDimensionInfo,this);t=new id(e,this.hostModel)}if(t._storage=this._storage,nd(t,this),this._indices){var n=this._indices.constructor;t._indices=new n(this._indices)}else t._indices=null;return t.getRawIndex=t._indices?hd:ld,t},rd.wrapMethod=function(t,e){var n=this[t];"function"==typeof n&&(this.__wrappedMethods=this.__wrappedMethods||[],this.__wrappedMethods.push(t),this[t]=function(){var t=n.apply(this,arguments);return e.apply(this,[t].concat(W(arguments)))})},rd.TRANSFERABLE_METHODS=["cloneShallow","downSample","map"],rd.CHANGABLE_METHODS=["filterSelf","selectRange"];function yd(t,e){return vd((e=e||{}).coordDimensions||[],t,{dimsDef:e.dimensionsDefine||t.dimensionsDefine,encodeDef:e.encodeDefine||t.encodeDefine,dimCount:e.dimensionsCount,generateCoord:e.generateCoord,generateCoordCount:e.generateCoordCount})}function _d(t,e){return!!e&&e===t.getCalculationInfo("stackedDimension")}function xd(t,e,n){n=n||{},vl.isInstance(t)||(t=vl.seriesDataToSource(t));var i,r=e.get("coordinateSystem"),a=Dl.get(r),o=al(e);o&&(i=D(o.coordSysDims,function(t){var e={name:t},n=o.axisMap.get(t);if(n){var i=n.get("type");e.type=function(t){return"category"===t?"ordinal":"time"===t?"time":"float"}(i)}return e})),i=i||(a&&(a.getDimensionsInfo?a.getDimensionsInfo():a.dimensions.slice())||["x","y"]);var s,l,h=yd(t,{coordDimensions:i,generateCoord:n.generateCoord});o&&k(h,function(t,e){var n=t.coordDim,i=o.categoryAxisMap.get(n);i&&(null==s&&(s=e),t.ordinalMeta=i.getOrdinalMeta()),null!=t.otherDims.itemName&&(l=!0)}),l||null==s||(h[s].otherDims.itemName=0);var u=function(t,n,e){var i,r,a,o,s=(e=e||{}).byIndex,l=e.stackedCoordDimension,h=!(!t||!t.get("stack"));if(k(n,function(t,e){L(t)&&(n[e]=t={name:t}),h&&!t.isExtraCoord&&(s||i||!t.ordinalMeta||(i=t),r||"ordinal"===t.type||"time"===t.type||l&&l!==t.coordDim||(r=t))}),!r||s||i||(s=!0),r){a="__\0ecstackresult",o="__\0ecstackedover",i&&(i.createInvertedIndices=!0);var u=r.coordDim,c=r.type,d=0;k(n,function(t){t.coordDim===u&&d++}),n.push({name:a,coordDim:u,coordDimIndex:d,type:c,isExtraCoord:!0,isCalculationCoord:!0}),d++,n.push({name:o,coordDim:o,coordDimIndex:d,type:c,isExtraCoord:!0,isCalculationCoord:!0})}return{stackedDimension:r&&r.name,stackedByDimension:i&&i.name,isStackedByIndex:s,stackedOverDimension:o,stackResultDimension:a}}(e,h),c=new id(h,e);c.setCalculationInfo(u);var d=null!=s&&function(t){if(t.sourceFormat===ll){var e=function(t){var e=0;for(;e<t.length&&null==t[e];)e++;return t[e]}(t.data||[]);return null!=e&&!A(Gi(e))}}(t)?function(t,e,n,i){return i===s?n:this.defaultDimValueGetter(t,e,n,i)}:null;return c.hasItemOption=!1,c.initData(t,null,d),c}kh.extend({type:"series.line",dependencies:["grid","polar"],getInitialData:function(t,e){return xd(this.getSource(),this)},defaultOption:{zlevel:0,z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,hoverAnimation:!0,clipOverflow:!0,label:{position:"top"},lineStyle:{width:2,type:"solid"},step:!1,smooth:!1,smoothMonotone:null,symbol:"emptyCircle",symbolSize:4,symbolRotate:null,showSymbol:!0,showAllSymbol:"auto",connectNulls:!1,sampling:"none",animationEasing:"linear",progressive:0,hoverLayerThreshold:1/0}});var wd=Io({type:"triangle",shape:{cx:0,cy:0,width:0,height:0},buildPath:function(t,e){var n=e.cx,i=e.cy,r=e.width/2,a=e.height/2;t.moveTo(n,i-a),t.lineTo(n+r,i+a),t.lineTo(n-r,i+a),t.closePath()}}),bd=Io({type:"diamond",shape:{cx:0,cy:0,width:0,height:0},buildPath:function(t,e){var n=e.cx,i=e.cy,r=e.width/2,a=e.height/2;t.moveTo(n,i-a),t.lineTo(n+r,i),t.lineTo(n,i+a),t.lineTo(n-r,i),t.closePath()}}),Sd=Io({type:"pin",shape:{x:0,y:0,width:0,height:0},buildPath:function(t,e){var n=e.x,i=e.y,r=e.width/5*3,a=Math.max(r,e.height),o=r/2,s=o*o/(a-o),l=i-a+o+s,h=Math.asin(s/o),u=Math.cos(h)*o,c=Math.sin(h),d=Math.cos(h),f=.6*o,p=.7*o;t.moveTo(n-u,l+s),t.arc(n,l,o,Math.PI-h,2*Math.PI+h),t.bezierCurveTo(n+u-c*f,l+s+d*f,n,i-p,n,i),t.bezierCurveTo(n,i-p,n-u+c*f,l+s+d*f,n-u,l+s),t.closePath()}}),Md=Io({type:"arrow",shape:{x:0,y:0,width:0,height:0},buildPath:function(t,e){var n=e.height,i=e.width,r=e.x,a=e.y,o=i/3*2;t.moveTo(r,a),t.lineTo(r+o,a+n),t.lineTo(r,a+n/4*3),t.lineTo(r-o,a+n),t.lineTo(r,a),t.closePath()}}),Id={line:function(t,e,n,i,r){r.x1=t,r.y1=e+i/2,r.x2=t+n,r.y2=e+i/2},rect:function(t,e,n,i,r){r.x=t,r.y=e,r.width=n,r.height=i},roundRect:function(t,e,n,i,r){r.x=t,r.y=e,r.width=n,r.height=i,r.r=Math.min(n,i)/4},square:function(t,e,n,i,r){var a=Math.min(n,i);r.x=t,r.y=e,r.width=a,r.height=a},circle:function(t,e,n,i,r){r.cx=t+n/2,r.cy=e+i/2,r.r=Math.min(n,i)/2},diamond:function(t,e,n,i,r){r.cx=t+n/2,r.cy=e+i/2,r.width=n,r.height=i},pin:function(t,e,n,i,r){r.x=t+n/2,r.y=e+i/2,r.width=n,r.height=i},arrow:function(t,e,n,i,r){r.x=t+n/2,r.y=e+i/2,r.width=n,r.height=i},triangle:function(t,e,n,i,r){r.cx=t+n/2,r.cy=e+i/2,r.width=n,r.height=i}},Td={};k({line:ao,rect:io,roundRect:io,square:io,circle:Xa,diamond:bd,pin:Sd,arrow:Md,triangle:wd},function(t,e){Td[e]=new t});var Cd=Io({type:"symbol",shape:{symbolType:"",x:0,y:0,width:0,height:0},calculateTextPosition:function(t,e,n){var i=Nn(t,e,n),r=this.shape;return r&&"pin"===r.symbolType&&"inside"===e.textPosition&&(i.y=n.y+.4*n.height),i},buildPath:function(t,e,n){var i=e.symbolType;if("none"!==i){var r=Td[i];r=r||Td[i="rect"],Id[i](e.x,e.y,e.width,e.height,r.shape),r.buildPath(t,r.shape,n)}}});function kd(t,e){if("image"!==this.type){var n=this.style,i=this.shape;i&&"line"===i.symbolType?n.stroke=t:this.__isEmptyBrush?(n.stroke=t,n.fill=e||"#fff"):(n.fill&&(n.fill=t),n.stroke&&(n.stroke=t)),this.dirty(!1)}}function Dd(t,e,n,i,r,a,o){var s,l=0===t.indexOf("empty");return l&&(t=t.substr(5,1).toLowerCase()+t.substr(6)),(s=0===t.indexOf("image://")?Co(t.slice(8),new qe(e,n,i,r),o?"center":"cover"):0===t.indexOf("path://")?To(t.slice(7),{},new qe(e,n,i,r),o?"center":"cover"):new Cd({shape:{symbolType:t,x:e,y:n,width:i,height:r}})).__isEmptyBrush=l,s.setColor=kd,s.setColor(a),s}function Ad(t,e){var n=t.mapDimension("defaultedLabel",!0),i=n.length;if(1===i)return uh(t,e,n[0]);if(i){for(var r=[],a=0;a<n.length;a++){var o=uh(t,e,n[a]);r.push(o)}return r.join(" ")}}function Ld(t,e,n){Ye.call(this),this.updateData(t,e,n)}var Pd=Ld.prototype,Od=Ld.getSymbolSize=function(t,e){var n=t.getItemVisual(e,"symbolSize");return n instanceof Array?n.slice():[+n,+n]};function Ed(t){return[t[0]/2,t[1]/2]}function Nd(t,e){this.parent.drift(t,e)}Pd._createSymbol=function(t,e,n,i,r){this.removeAll();var a=Dd(t,-1,-1,2,2,e.getItemVisual(n,"color"),r);a.attr({z2:100,culling:!0,scale:Ed(i)}),a.drift=Nd,this._symbolType=t,this.add(a)},Pd.stopSymbolAnimation=function(t){this.childAt(0).stopAnimation(t)},Pd.getSymbolPath=function(){return this.childAt(0)},Pd.getScale=function(){return this.childAt(0).scale},Pd.highlight=function(){this.childAt(0).trigger("emphasis")},Pd.downplay=function(){this.childAt(0).trigger("normal")},Pd.setZ=function(t,e){var n=this.childAt(0);n.zlevel=t,n.z=e},Pd.setDraggable=function(t){var e=this.childAt(0);e.draggable=t,e.cursor=t?"move":e.cursor},Pd.updateData=function(t,e,n){this.silent=!1;var i=t.getItemVisual(e,"symbol")||"circle",r=t.hostModel,a=Od(t,e),o=i!==this._symbolType;if(o){var s=t.getItemVisual(e,"symbolKeepAspect");this._createSymbol(i,t,e,a,s)}else{(l=this.childAt(0)).silent=!1,as(l,{scale:Ed(a)},r,e)}if(this._updateCommon(t,e,a,n),o){var l=this.childAt(0),h=n&&n.fadeIn,u={scale:l.scale.slice()};h&&(u.style={opacity:l.style.opacity}),l.scale=[0,0],h&&(l.style.opacity=0),os(l,u,r,e)}this._seriesModel=r};var Bd=["itemStyle"],zd=["emphasis","itemStyle"],Rd=["label"],Fd=["emphasis","label"];function Vd(t,e){if(!this.incremental&&!this.useHoverLayer)if("emphasis"===e){var n=this.__symbolOriginalScale,i=n[1]/n[0],r={scale:[Math.max(1.1*n[0],n[0]+3),Math.max(1.1*n[1],n[1]+3*i)]};this.animateTo(r,400,"elasticOut")}else"normal"===e&&this.animateTo({scale:this.__symbolOriginalScale},400,"elasticOut")}function Wd(t){this.group=new Ye,this._symbolCtor=t||Ld}Pd._updateCommon=function(n,t,e,i){var r=this.childAt(0),a=n.hostModel,o=n.getItemVisual(t,"color");"image"!==r.type&&r.useStyle({strokeNoScale:!0});var s=i&&i.itemStyle,l=i&&i.hoverItemStyle,h=i&&i.symbolRotate,u=i&&i.symbolOffset,c=i&&i.labelModel,d=i&&i.hoverLabelModel,f=i&&i.hoverAnimation,p=i&&i.cursorStyle;if(!i||n.hasItemOption){var g=i&&i.itemModel?i.itemModel:n.getItemModel(t);s=g.getModel(Bd).getItemStyle(["color"]),l=g.getModel(zd).getItemStyle(),h=g.getShallow("symbolRotate"),u=g.getShallow("symbolOffset"),c=g.getModel(Rd),d=g.getModel(Fd),f=g.getShallow("hoverAnimation"),p=g.getShallow("cursor")}else l=S({},l);var v=r.style;r.attr("rotation",(h||0)*Math.PI/180||0),u&&r.attr("position",[Ss(u[0],e[0]),Ss(u[1],e[1])]),p&&r.attr("cursor",p),r.setColor(o,i&&i.symbolInnerColor),r.setStyle(s);var m=n.getItemVisual(t,"opacity");null!=m&&(v.opacity=m);var y=n.getItemVisual(t,"liftZ"),_=r.__z2Origin;null!=y?null==_&&(r.__z2Origin=r.z2,r.z2+=y):null!=_&&(r.z2=_,r.__z2Origin=null);var x=i&&i.useNameLabel;$o(v,l,c,d,{labelFetcher:a,labelDataIndex:t,defaultText:function(t,e){return x?n.getName(t):Ad(n,t)},isRectText:!0,autoColor:o}),r.__symbolOriginalScale=Ed(e),r.hoverStyle=l,r.highDownOnUpdate=f&&a.isAnimationEnabled()?Vd:null,Yo(r)},Pd.fadeOut=function(t,e){var n=this.childAt(0);this.silent=n.silent=!0,e&&e.keepLabel||(n.style.text=null),as(n,{style:{opacity:0},scale:[0,0]},this._seriesModel,this.dataIndex,t)},y(Ld,Ye);var Hd=Wd.prototype;function Gd(t,e,n,i){return e&&!isNaN(e[0])&&!isNaN(e[1])&&!(i.isIgnore&&i.isIgnore(n))&&!(i.clipShape&&!i.clipShape.contain(e[0],e[1]))&&"none"!==t.getItemVisual(n,"symbol")}function Xd(t){return null==t||O(t)||(t={isIgnore:t}),t||{}}function qd(t){var e=t.hostModel;return{itemStyle:e.getModel("itemStyle").getItemStyle(["color"]),hoverItemStyle:e.getModel("emphasis.itemStyle").getItemStyle(),symbolRotate:e.get("symbolRotate"),symbolOffset:e.get("symbolOffset"),hoverAnimation:e.get("hoverAnimation"),labelModel:e.getModel("label"),hoverLabelModel:e.getModel("emphasis.label"),cursorStyle:e.get("cursor")}}function Yd(t,e,n){var i,r=t.getBaseAxis(),a=t.getOtherAxis(r),o=function(t,e){var n=0,i=t.scale.getExtent();"start"===e?n=i[0]:"end"===e?n=i[1]:0<i[0]?n=i[0]:i[1]<0&&(n=i[1]);return n}(a,n),s=r.dim,l=a.dim,h=e.mapDimension(l),u=e.mapDimension(s),c="x"===l||"radius"===l?1:0,d=D(t.dimensions,function(t){return e.mapDimension(t)}),f=e.getCalculationInfo("stackResultDimension");return(i|=_d(e,d[0]))&&(d[0]=f),(i|=_d(e,d[1]))&&(d[1]=f),{dataDimsForPoint:d,valueStart:o,valueAxisDim:l,baseAxisDim:s,stacked:!!i,valueDim:h,baseDim:u,baseDataOffset:c,stackedOverDimension:e.getCalculationInfo("stackedOverDimension")}}function Ud(t,e,n,i){var r=NaN;t.stacked&&(r=n.get(n.getCalculationInfo("stackedOverDimension"),i)),isNaN(r)&&(r=t.valueStart);var a=t.baseDataOffset,o=[];return o[a]=n.get(t.baseDim,i),o[1-a]=r,e.dataToPoint(o)}Hd.updateData=function(r,a){a=Xd(a);var o=this.group,s=r.hostModel,l=this._data,h=this._symbolCtor,u=qd(r);l||o.removeAll(),r.diff(l).add(function(t){var e=r.getItemLayout(t);if(Gd(r,e,t,a)){var n=new h(r,t,u);n.attr("position",e),r.setItemGraphicEl(t,n),o.add(n)}}).update(function(t,e){var n=l.getItemGraphicEl(e),i=r.getItemLayout(t);Gd(r,i,t,a)?(n?(n.updateData(r,t,u),as(n,{position:i},s)):(n=new h(r,t)).attr("position",i),o.add(n),r.setItemGraphicEl(t,n)):o.remove(n)}).remove(function(t){var e=l.getItemGraphicEl(t);e&&e.fadeOut(function(){o.remove(e)})}).execute(),this._data=r},Hd.isPersistent=function(){return!0},Hd.updateLayout=function(){var i=this._data;i&&i.eachItemGraphicEl(function(t,e){var n=i.getItemLayout(e);t.attr("position",n)})},Hd.incrementalPrepareUpdate=function(t){this._seriesScope=qd(t),this._data=null,this.group.removeAll()},Hd.incrementalUpdate=function(t,e,n){function i(t){t.isGroup||(t.incremental=t.useHoverLayer=!0)}n=Xd(n);for(var r=t.start;r<t.end;r++){var a=e.getItemLayout(r);if(Gd(e,a,r,n)){var o=new this._symbolCtor(e,r,this._seriesScope);o.traverse(i),o.attr("position",a),this.group.add(o),e.setItemGraphicEl(r,o)}}},Hd.remove=function(t){var e=this.group,n=this._data;n&&t?n.eachItemGraphicEl(function(t){t.fadeOut(function(){e.remove(t)})}):e.removeAll()};var jd=lt,Zd=ht,$d=function(t,e,n,i){return t[0]=e[0]+n[0]*i,t[1]=e[1]+n[1]*i,t},Kd=function(t,e){return t[0]=e[0],t[1]=e[1],t},Qd=[],Jd=[],tf=[];function ef(t){return isNaN(t[0])||isNaN(t[1])}function nf(t,e,n,i,r,a,o,s,l,h){return"none"!==h&&h?function(t,e,n,i,r,a,o,s,l,h,u){for(var c=0,d=n,f=0;f<i;f++){var p=e[d];if(r<=d||d<0)break;if(ef(p)){if(u){d+=a;continue}break}if(d===n)t[0<a?"moveTo":"lineTo"](p[0],p[1]);else if(0<l){var g=e[c],v="y"===h?1:0,m=(p[v]-g[v])*l;Kd(Jd,g),Jd[v]=g[v]+m,Kd(tf,p),tf[v]=p[v]-m,t.bezierCurveTo(Jd[0],Jd[1],tf[0],tf[1],p[0],p[1])}else t.lineTo(p[0],p[1]);c=d,d+=a}return f}.apply(this,arguments):function(t,e,n,i,r,a,o,s,l,h,u){for(var c=0,d=n,f=0;f<i;f++){var p=e[d];if(r<=d||d<0)break;if(ef(p)){if(u){d+=a;continue}break}if(d===n)t[0<a?"moveTo":"lineTo"](p[0],p[1]),Kd(Jd,p);else if(0<l){var g=d+a,v=e[g];if(u)for(;v&&ef(e[g]);)v=e[g+=a];var m=.5,y=e[c];if(!(v=e[g])||ef(v))Kd(tf,p);else{var _,x;if(ef(v)&&!u&&(v=p),et(Qd,v,y),"x"===h||"y"===h){var w="x"===h?0:1;_=Math.abs(p[w]-y[w]),x=Math.abs(p[w]-v[w])}else _=at(p,y),x=at(p,v);$d(tf,p,Qd,-l*(1-(m=x/(x+_))))}jd(Jd,Jd,s),Zd(Jd,Jd,o),jd(tf,tf,s),Zd(tf,tf,o),t.bezierCurveTo(Jd[0],Jd[1],tf[0],tf[1],p[0],p[1]),$d(Jd,p,Qd,l*m)}else t.lineTo(p[0],p[1]);c=d,d+=a}return f}.apply(this,arguments)}function rf(t,e){var n=[1/0,1/0],i=[-1/0,-1/0];if(e)for(var r=0;r<t.length;r++){var a=t[r];a[0]<n[0]&&(n[0]=a[0]),a[1]<n[1]&&(n[1]=a[1]),a[0]>i[0]&&(i[0]=a[0]),a[1]>i[1]&&(i[1]=a[1])}return{min:e?n:i,max:e?i:n}}var af=Ma.extend({type:"ec-polyline",shape:{points:[],smooth:0,smoothConstraint:!0,smoothMonotone:null,connectNulls:!1},style:{fill:null,stroke:"#000"},brush:Ga(Ma.prototype.brush),buildPath:function(t,e){var n=e.points,i=0,r=n.length,a=rf(n,e.smoothConstraint);if(e.connectNulls){for(;0<r&&ef(n[r-1]);r--);for(;i<r&&ef(n[i]);i++);}for(;i<r;)i+=nf(t,n,i,r,r,1,a.min,a.max,e.smooth,e.smoothMonotone,e.connectNulls)+1}}),of=Ma.extend({type:"ec-polygon",shape:{points:[],stackedOnPoints:[],smooth:0,stackedOnSmooth:0,smoothConstraint:!0,smoothMonotone:null,connectNulls:!1},brush:Ga(Ma.prototype.brush),buildPath:function(t,e){var n=e.points,i=e.stackedOnPoints,r=0,a=n.length,o=e.smoothMonotone,s=rf(n,e.smoothConstraint),l=rf(i,e.smoothConstraint);if(e.connectNulls){for(;0<a&&ef(n[a-1]);a--);for(;r<a&&ef(n[r]);r++);}for(;r<a;){var h=nf(t,n,r,a,a,1,s.min,s.max,e.smooth,o,e.connectNulls);nf(t,i,r+h-1,h,a,-1,l.min,l.max,e.stackedOnSmooth,o,e.connectNulls),r+=h+1,t.closePath()}}});function sf(t,e){if(t.length===e.length){for(var n=0;n<t.length;n++){var i=t[n],r=e[n];if(i[0]!==r[0]||i[1]!==r[1])return}return!0}}function lf(t){return"number"==typeof t?t:t?.5:0}function hf(t){var e=t.getGlobalExtent();if(t.onBand){var n=t.getBandWidth()/2-1,i=e[1]>e[0]?1:-1;e[0]+=i*n,e[1]-=i*n}return e}function uf(t,e,n,i){return"polar"===t.type?function(t,e,n,i){var r=t.getAngleAxis(),a=t.getRadiusAxis().getExtent().slice();a[0]>a[1]&&a.reverse();var o=r.getExtent(),s=Math.PI/180;n&&(a[0]-=.5,a[1]+=.5);var l=new Ya({shape:{cx:Ms(t.cx,1),cy:Ms(t.cy,1),r0:Ms(a[0],1),r:Ms(a[1],1),startAngle:-o[0]*s,endAngle:-o[1]*s,clockwise:r.inverse}});return e&&(l.shape.endAngle=-o[0]*s,os(l,{shape:{endAngle:-o[1]*s}},i)),l}(t,e,n,i):function(t,e,n,i){var r=hf(t.getAxis("x")),a=hf(t.getAxis("y")),o=t.getBaseAxis().isHorizontal(),s=Math.min(r[0],r[1]),l=Math.min(a[0],a[1]),h=Math.max(r[0],r[1])-s,u=Math.max(a[0],a[1])-l;if(n)s-=.5,h+=.5,l-=.5,u+=.5;else{var c=i.get("lineStyle.width")||2,d=i.get("clipOverflow")?c/2:Math.max(h,u);o?(l-=d,u+=2*d):(s-=d,h+=2*d)}var f=new io({shape:{x:s,y:l,width:h,height:u}});return e&&(f.shape[o?"width":"height"]=0,os(f,{shape:{width:h,height:u}},i)),f}(t,e,n,i)}function cf(t,e,n){for(var i=e.getBaseAxis(),r="x"===i.dim||"radius"===i.dim?0:1,a=[],o=0;o<t.length-1;o++){var s=t[o+1],l=t[o];a.push(l);var h=[];switch(n){case"end":h[r]=s[r],h[1-r]=l[1-r],a.push(h);break;case"middle":var u=(l[r]+s[r])/2,c=[];h[r]=c[r]=u,h[1-r]=l[1-r],c[1-r]=s[1-r],a.push(h),a.push(c);break;default:h[r]=l[r],h[1-r]=s[1-r],a.push(h)}}return t[o]&&a.push(t[o]),a}function df(t,e,n){var i=t.get("showAllSymbol"),r="auto"===i;if(!i||r){var a=n.getAxesByScale("ordinal")[0];if(a&&(!r||!function(t,e){var n=t.getExtent(),i=Math.abs(n[1]-n[0])/t.scale.count();isNaN(i)&&(i=0);for(var r=e.count(),a=Math.max(1,Math.round(r/5)),o=0;o<r;o+=a)if(1.5*Ld.getSymbolSize(e,o)[t.isHorizontal()?1:0]>i)return!1;return!0}(a,e))){var o=e.mapDimension(a.dim),s={};return k(a.getViewLabels(),function(t){s[t.tickValue]=1}),function(t){return!s.hasOwnProperty(e.get(o,t))}}}}Wh.extend({type:"line",init:function(){var t=new Ye,e=new Wd;this.group.add(e.group),this._symbolDraw=e,this._lineGroup=t},render:function(t,e,n){var i=t.coordinateSystem,r=this.group,a=t.getData(),o=t.getModel("lineStyle"),s=t.getModel("areaStyle"),l=a.mapArray(a.getItemLayout),h="polar"===i.type,u=this._coordSys,c=this._symbolDraw,d=this._polyline,f=this._polygon,p=this._lineGroup,g=t.get("animation"),v=!s.isEmpty(),m=s.get("origin"),y=function(t,e,n){if(!n.valueDim)return[];for(var i=[],r=0,a=e.count();r<a;r++)i.push(Ud(n,t,e,r));return i}(i,a,Yd(i,a,m)),_=t.get("showSymbol"),x=_&&!h&&df(t,a,i),w=this._data;w&&w.eachItemGraphicEl(function(t,e){t.__temp&&(r.remove(t),w.setItemGraphicEl(e,null))}),_||c.remove(),r.add(p);var b=!h&&t.get("step");d&&u.type===i.type&&b===this._step?(v&&!f?f=this._newPolygon(l,y,i,g):f&&!v&&(p.remove(f),f=this._polygon=null),p.setClipPath(uf(i,!1,!1,t)),_&&c.updateData(a,{isIgnore:x,clipShape:uf(i,!1,!0,t)}),a.eachItemGraphicEl(function(t){t.stopAnimation(!0)}),sf(this._stackedOnPoints,y)&&sf(this._points,l)||(g?this._updateAnimation(a,y,i,n,b,m):(b&&(l=cf(l,i,b),y=cf(y,i,b)),d.setShape({points:l}),f&&f.setShape({points:l,stackedOnPoints:y})))):(_&&c.updateData(a,{isIgnore:x,clipShape:uf(i,!1,!0,t)}),b&&(l=cf(l,i,b),y=cf(y,i,b)),d=this._newPolyline(l,i,g),v&&(f=this._newPolygon(l,y,i,g)),p.setClipPath(uf(i,!0,!1,t)));var S=function(t,e){var n=t.getVisual("visualMeta");if(n&&n.length&&t.count()&&"cartesian2d"===e.type){for(var i,r,a=n.length-1;0<=a;a--){var o=n[a].dimension,s=t.dimensions[o],l=t.getDimensionInfo(s);if("x"===(i=l&&l.coordDim)||"y"===i){r=n[a];break}}if(r){var h=e.getAxis(i),u=D(r.stops,function(t){return{coord:h.toGlobalCoord(h.dataToCoord(t.value)),color:t.color}}),c=u.length,d=r.outerColors.slice();c&&u[0].coord>u[c-1].coord&&(u.reverse(),d.reverse());var f=u[0].coord-10,p=u[c-1].coord+10,g=p-f;if(g<.001)return"transparent";k(u,function(t){t.offset=(t.coord-f)/g}),u.push({offset:c?u[c-1].offset:.5,color:d[1]||"transparent"}),u.unshift({offset:c?u[0].offset:.5,color:d[0]||"transparent"});var v=new fo(0,0,0,0,u,!0);return v[i]=f,v[i+"2"]=p,v}}}(a,i)||a.getVisual("color");d.useStyle(C(o.getLineStyle(),{fill:"none",stroke:S,lineJoin:"bevel"}));var M=t.get("smooth");if(M=lf(t.get("smooth")),d.setShape({smooth:M,smoothMonotone:t.get("smoothMonotone"),connectNulls:t.get("connectNulls")}),f){var I=a.getCalculationInfo("stackedOnSeries"),T=0;f.useStyle(C(s.getAreaStyle(),{fill:S,opacity:.7,lineJoin:"bevel"})),I&&(T=lf(I.get("smooth"))),f.setShape({smooth:M,stackedOnSmooth:T,smoothMonotone:t.get("smoothMonotone"),connectNulls:t.get("connectNulls")})}this._data=a,this._coordSys=i,this._stackedOnPoints=y,this._points=l,this._step=b,this._valueOrigin=m},dispose:function(){},highlight:function(t,e,n,i){var r=t.getData(),a=Ui(r,i);if(!(a instanceof Array)&&null!=a&&0<=a){var o=r.getItemGraphicEl(a);if(!o){var s=r.getItemLayout(a);if(!s)return;(o=new Ld(r,a)).position=s,o.setZ(t.get("zlevel"),t.get("z")),o.ignore=isNaN(s[0])||isNaN(s[1]),o.__temp=!0,r.setItemGraphicEl(a,o),o.stopSymbolAnimation(!0),this.group.add(o)}o.highlight()}else Wh.prototype.highlight.call(this,t,e,n,i)},downplay:function(t,e,n,i){var r=t.getData(),a=Ui(r,i);if(null!=a&&0<=a){var o=r.getItemGraphicEl(a);o&&(o.__temp?(r.setItemGraphicEl(a,null),this.group.remove(o)):o.downplay())}else Wh.prototype.downplay.call(this,t,e,n,i)},_newPolyline:function(t){var e=this._polyline;return e&&this._lineGroup.remove(e),e=new af({shape:{points:t},silent:!0,z2:10}),this._lineGroup.add(e),this._polyline=e},_newPolygon:function(t,e){var n=this._polygon;return n&&this._lineGroup.remove(n),n=new of({shape:{points:t,stackedOnPoints:e},silent:!0}),this._lineGroup.add(n),this._polygon=n},_updateAnimation:function(t,e,n,i,r,a){var o=this._polyline,s=this._polygon,l=t.hostModel,h=function(t,e,n,i,r,a,o,s){for(var l=function(t,e){var n=[];return e.diff(t).add(function(t){n.push({cmd:"+",idx:t})}).update(function(t,e){n.push({cmd:"=",idx:e,idx1:t})}).remove(function(t){n.push({cmd:"-",idx:t})}).execute(),n}(t,e),h=[],u=[],c=[],d=[],f=[],p=[],g=[],v=Yd(r,e,o),m=Yd(a,t,s),y=0;y<l.length;y++){var _=l[y],x=!0;switch(_.cmd){case"=":var w=t.getItemLayout(_.idx),b=e.getItemLayout(_.idx1);(isNaN(w[0])||isNaN(w[1]))&&(w=b.slice()),h.push(w),u.push(b),c.push(n[_.idx]),d.push(i[_.idx1]),g.push(e.getRawIndex(_.idx1));break;case"+":var S=_.idx;h.push(r.dataToPoint([e.get(v.dataDimsForPoint[0],S),e.get(v.dataDimsForPoint[1],S)])),u.push(e.getItemLayout(S).slice()),c.push(Ud(v,r,e,S)),d.push(i[S]),g.push(e.getRawIndex(S));break;case"-":S=_.idx;var M=t.getRawIndex(S);M!==S?(h.push(t.getItemLayout(S)),u.push(a.dataToPoint([t.get(m.dataDimsForPoint[0],S),t.get(m.dataDimsForPoint[1],S)])),c.push(n[S]),d.push(Ud(m,a,t,S)),g.push(M)):x=!1}x&&(f.push(_),p.push(p.length))}p.sort(function(t,e){return g[t]-g[e]});var I=[],T=[],C=[],k=[],D=[];for(y=0;y<p.length;y++){S=p[y];I[y]=h[S],T[y]=u[S],C[y]=c[S],k[y]=d[S],D[y]=f[S]}return{current:I,next:T,stackedOnCurrent:C,stackedOnNext:k,status:D}}(this._data,t,this._stackedOnPoints,e,this._coordSys,n,this._valueOrigin,a),u=h.current,c=h.stackedOnCurrent,d=h.next,f=h.stackedOnNext;r&&(u=cf(h.current,n,r),c=cf(h.stackedOnCurrent,n,r),d=cf(h.next,n,r),f=cf(h.stackedOnNext,n,r)),o.shape.__points=h.current,o.shape.points=u,as(o,{shape:{points:d}},l),s&&(s.setShape({points:u,stackedOnPoints:c}),as(s,{shape:{points:d,stackedOnPoints:f}},l));for(var p=[],g=h.status,v=0;v<g.length;v++){if("="===g[v].cmd){var m=t.getItemGraphicEl(g[v].idx1);m&&p.push({el:m,ptIdx:v})}}o.animators&&o.animators.length&&o.animators[0].during(function(){for(var t=0;t<p.length;t++){p[t].el.attr("position",o.shape.__points[p[t].ptIdx])}})},remove:function(t){var n=this.group,i=this._data;this._lineGroup.removeAll(),this._symbolDraw.remove(!0),i&&i.eachItemGraphicEl(function(t,e){t.__temp&&(n.remove(t),i.setItemGraphicEl(e,null))}),this._polyline=this._polygon=this._coordSys=this._points=this._stackedOnPoints=this._data=null}});function ff(t,e){return Math.round(t.length/2)}var pf={average:function(t){for(var e=0,n=0,i=0;i<t.length;i++)isNaN(t[i])||(e+=t[i],n++);return 0===n?NaN:e/n},sum:function(t){for(var e=0,n=0;n<t.length;n++)e+=t[n]||0;return e},max:function(t){for(var e=-1/0,n=0;n<t.length;n++)t[n]>e&&(e=t[n]);return isFinite(e)?e:NaN},min:function(t){for(var e=1/0,n=0;n<t.length;n++)t[n]<e&&(e=t[n]);return isFinite(e)?e:NaN},nearest:function(t){return t[0]}};function gf(t){this._setting=t||{},this._extent=[1/0,-1/0],this._interval=0,this.init&&this.init.apply(this,arguments)}function vf(t){this.categories=t.categories||[],this._needCollect=t.needCollect,this._deduplication=t.deduplication,this._map}gf.prototype.parse=function(t){return t},gf.prototype.getSetting=function(t){return this._setting[t]},gf.prototype.contain=function(t){var e=this._extent;return t>=e[0]&&t<=e[1]},gf.prototype.normalize=function(t){var e=this._extent;return e[1]===e[0]?.5:(t-e[0])/(e[1]-e[0])},gf.prototype.scale=function(t){var e=this._extent;return t*(e[1]-e[0])+e[0]},gf.prototype.unionExtent=function(t){var e=this._extent;t[0]<e[0]&&(e[0]=t[0]),t[1]>e[1]&&(e[1]=t[1])},gf.prototype.unionExtentFromData=function(t,e){this.unionExtent(t.getApproximateExtent(e))},gf.prototype.getExtent=function(){return this._extent.slice()},gf.prototype.setExtent=function(t,e){var n=this._extent;isNaN(t)||(n[0]=t),isNaN(e)||(n[1]=e)},gf.prototype.isBlank=function(){return this._isBlank},gf.prototype.setBlank=function(t){this._isBlank=t},gf.prototype.getLabel=null,nr(gf),sr(gf,{registerWhenExtend:!0}),vf.createByAxisModel=function(t){var e=t.option,n=e.data,i=n&&D(n,_f);return new vf({categories:i,needCollect:!i,deduplication:!1!==e.dedplication})};var mf=vf.prototype;function yf(t){return t._map||(t._map=Z(t.categories))}function _f(t){return O(t)&&null!=t.value?t.value:t+""}mf.getOrdinal=function(t){return yf(this).get(t)},mf.parseAndCollect=function(t){var e,n=this._needCollect;if("string"!=typeof t&&!n)return t;if(n&&!this._deduplication)return e=this.categories.length,this.categories[e]=t,e;var i=yf(this);return null==(e=i.get(t))&&(n?(e=this.categories.length,this.categories[e]=t,i.set(t,e)):e=NaN),e};var xf=gf.prototype,wf=gf.extend({type:"ordinal",init:function(t,e){t&&!A(t)||(t=new vf({categories:t})),this._ordinalMeta=t,this._extent=e||[0,t.categories.length-1]},parse:function(t){return"string"==typeof t?this._ordinalMeta.getOrdinal(t):Math.round(t)},contain:function(t){return t=this.parse(t),xf.contain.call(this,t)&&null!=this._ordinalMeta.categories[t]},normalize:function(t){return xf.normalize.call(this,this.parse(t))},scale:function(t){return Math.round(xf.scale.call(this,t))},getTicks:function(){for(var t=[],e=this._extent,n=e[0];n<=e[1];)t.push(n),n++;return t},getLabel:function(t){if(!this.isBlank())return this._ordinalMeta.categories[t]},count:function(){return this._extent[1]-this._extent[0]+1},unionExtentFromData:function(t,e){this.unionExtent(t.getApproximateExtent(e))},getOrdinalMeta:function(){return this._ordinalMeta},niceTicks:$,niceExtent:$});wf.create=function(){return new wf};var bf=Ms;function Sf(t){return Is(t)+2}function Mf(t,e,n){t[e]=Math.max(Math.min(t[e],n[1]),n[0])}function If(t,e){isFinite(t[0])||(t[0]=e[0]),isFinite(t[1])||(t[1]=e[1]),Mf(t,0,e),Mf(t,1,e),t[0]>t[1]&&(t[0]=t[1])}var Tf=Ms,Cf=gf.extend({type:"interval",_interval:0,_intervalPrecision:2,setExtent:function(t,e){var n=this._extent;isNaN(t)||(n[0]=parseFloat(t)),isNaN(e)||(n[1]=parseFloat(e))},unionExtent:function(t){var e=this._extent;t[0]<e[0]&&(e[0]=t[0]),t[1]>e[1]&&(e[1]=t[1]),Cf.prototype.setExtent.call(this,e[0],e[1])},getInterval:function(){return this._interval},setInterval:function(t){this._interval=t,this._niceExtent=this._extent.slice(),this._intervalPrecision=Sf(t)},getTicks:function(){return function(t,e,n,i){var r=[];if(!t)return r;e[0]<n[0]&&r.push(e[0]);for(var a=n[0];a<=n[1]&&(r.push(a),(a=bf(a+t,i))!==r[r.length-1]);)if(1e4<r.length)return[];return e[1]>(r.length?r[r.length-1]:n[1])&&r.push(e[1]),r}(this._interval,this._extent,this._niceExtent,this._intervalPrecision)},getLabel:function(t,e){if(null==t)return"";var n=e&&e.precision;return null==n?n=Is(t)||0:"auto"===n&&(n=this._intervalPrecision),Ps(t=Tf(t,n,!0))},niceTicks:function(t,e,n){t=t||5;var i=this._extent,r=i[1]-i[0];if(isFinite(r)){r<0&&(r=-r,i.reverse());var a=function(t,e,n,i){var r={},a=t[1]-t[0],o=r.interval=Ls(a/e,!0);null!=n&&o<n&&(o=r.interval=n),null!=i&&i<o&&(o=r.interval=i);var s=r.intervalPrecision=Sf(o);return If(r.niceTickExtent=[bf(Math.ceil(t[0]/o)*o,s),bf(Math.floor(t[1]/o)*o,s)],t),r}(i,t,e,n);this._intervalPrecision=a.intervalPrecision,this._interval=a.interval,this._niceExtent=a.niceTickExtent}},niceExtent:function(t){var e=this._extent;if(e[0]===e[1])if(0!==e[0]){var n=e[0];t.fixMax||(e[1]+=n/2),e[0]-=n/2}else e[1]=1;var i=e[1]-e[0];isFinite(i)||(e[0]=0,e[1]=1),this.niceTicks(t.splitNumber,t.minInterval,t.maxInterval);var r=this._interval;t.fixMin||(e[0]=Tf(Math.floor(e[0]/r)*r)),t.fixMax||(e[1]=Tf(Math.ceil(e[1]/r)*r))}});Cf.create=function(){return new Cf};var kf="__ec_stack_",Df="undefined"!=typeof Float32Array?Float32Array:Array;function Af(t){return t.get("stack")||kf+t.seriesIndex}function Lf(t){return t.dim+t.index}function Pf(t,e){var n=[];return e.eachSeriesByType(t,function(t){Bf(t)&&!zf(t)&&n.push(t)}),n}function Of(t){var h=[];return k(t,function(t){var e=t.getData(),n=t.coordinateSystem.getBaseAxis(),i=n.getExtent(),r="category"===n.type?n.getBandWidth():Math.abs(i[1]-i[0])/e.count(),a=Ss(t.get("barWidth"),r),o=Ss(t.get("barMaxWidth"),r),s=t.get("barGap"),l=t.get("barCategoryGap");h.push({bandWidth:r,barWidth:a,barMaxWidth:o,barGap:s,barCategoryGap:l,axisKey:Lf(n),stackId:Af(t)})}),function(t){var c={};k(t,function(t,e){var n=t.axisKey,i=t.bandWidth,r=c[n]||{bandWidth:i,remainedWidth:i,autoWidthCount:0,categoryGap:"20%",gap:"30%",stacks:{}},a=r.stacks;c[n]=r;var o=t.stackId;a[o]||r.autoWidthCount++,a[o]=a[o]||{width:0,maxWidth:0};var s=t.barWidth;s&&!a[o].width&&(a[o].width=s,s=Math.min(r.remainedWidth,s),r.remainedWidth-=s);var l=t.barMaxWidth;l&&(a[o].maxWidth=l);var h=t.barGap;null!=h&&(r.gap=h);var u=t.barCategoryGap;null!=u&&(r.categoryGap=u)});var d={};return k(c,function(t,n){d[n]={};var e=t.stacks,i=t.bandWidth,r=Ss(t.categoryGap,i),a=Ss(t.gap,1),o=t.remainedWidth,s=t.autoWidthCount,l=(o-r)/(s+(s-1)*a);l=Math.max(l,0),k(e,function(t,e){var n=t.maxWidth;n&&n<l&&(n=Math.min(n,o),t.width&&(n=Math.min(n,t.width)),o-=n,t.width=n,s--)}),l=(o-r)/(s+(s-1)*a),l=Math.max(l,0);var h,u=0;k(e,function(t,e){t.width||(t.width=l),u+=(h=t).width*(1+a)}),h&&(u-=h.width*a);var c=-u/2;k(e,function(t,e){d[n][e]=d[n][e]||{offset:c,width:t.width},c+=t.width*(1+a)})}),d}(h)}function Ef(t,e,n){if(t&&e){var i=t[Lf(e)];return null!=i&&null!=n&&(i=i[Af(n)]),i}}var Nf={seriesType:"bar",plan:Rh(),reset:function(t){if(Bf(t)&&zf(t)){var e=t.getData(),u=t.coordinateSystem,c=u.getBaseAxis(),d=u.getOtherAxis(c),f=e.mapDimension(d.dim),p=e.mapDimension(c.dim),g=d.isHorizontal(),v=g?0:1,m=Ef(Of([t]),c,t).width;return.5<m||(m=.5),{progress:function(t,e){var n,i=t.count,r=new Df(2*i),a=new Df(i),o=[],s=[],l=0,h=0;for(;null!=(n=t.next());)s[v]=e.get(f,n),s[1-v]=e.get(p,n),o=u.dataToPoint(s,null,o),r[l++]=o[0],r[l++]=o[1],a[h++]=n;e.setLayout({largePoints:r,largeDataIndices:a,barWidth:m,valueAxisStart:Rf(c,d,!1),valueAxisHorizontal:g})}}}}};function Bf(t){return t.coordinateSystem&&"cartesian2d"===t.coordinateSystem.type}function zf(t){return t.pipelineContext&&t.pipelineContext.large}function Rf(t,e){var n,i,r=e.getGlobalExtent();i=r[0]>r[1]?(n=r[1],r[0]):(n=r[0],r[1]);var a=e.toGlobalCoord(e.dataToCoord(0));return a<n&&(a=n),i<a&&(a=i),a}var Ff=Cf.prototype,Vf=Math.ceil,Wf=Math.floor,Hf=36e5,Gf=864e5,Xf=Cf.extend({type:"time",getLabel:function(t){var e=this._stepLvl,n=new Date(t);return Ws(e[0],n,this.getSetting("useUTC"))},niceExtent:function(t){var e=this._extent;if(e[0]===e[1]&&(e[0]-=Gf,e[1]+=Gf),e[1]===-1/0&&e[0]===1/0){var n=new Date;e[1]=+new Date(n.getFullYear(),n.getMonth(),n.getDate()),e[0]=e[1]-Gf}this.niceTicks(t.splitNumber,t.minInterval,t.maxInterval);var i=this._interval;t.fixMin||(e[0]=Ms(Wf(e[0]/i)*i)),t.fixMax||(e[1]=Ms(Vf(e[1]/i)*i))},niceTicks:function(t,e,n){t=t||10;var i=this._extent,r=i[1]-i[0],a=r/t;null!=e&&a<e&&(a=e),null!=n&&n<a&&(a=n);var o=qf.length,s=function(t,e,n,i){for(;n<i;){var r=n+i>>>1;t[r][1]<e?n=1+r:i=r}return n}(qf,a,0,o),l=qf[Math.min(s,o-1)],h=l[1];"year"===l[0]&&(h*=Ls(r/h/t,!0));var u=this.getSetting("useUTC")?0:60*new Date(+i[0]||+i[1]).getTimezoneOffset()*1e3,c=[Math.round(Vf((i[0]-u)/h)*h+u),Math.round(Wf((i[1]-u)/h)*h+u)];If(c,i),this._stepLvl=l,this._interval=h,this._niceExtent=c},parse:function(t){return+Ds(t)}});k(["contain","normalize"],function(e){Xf.prototype[e]=function(t){return Ff[e].call(this,this.parse(t))}});var qf=[["hh:mm:ss",1e3],["hh:mm:ss",5e3],["hh:mm:ss",1e4],["hh:mm:ss",15e3],["hh:mm:ss",3e4],["hh:mm\nMM-dd",6e4],["hh:mm\nMM-dd",3e5],["hh:mm\nMM-dd",6e5],["hh:mm\nMM-dd",9e5],["hh:mm\nMM-dd",18e5],["hh:mm\nMM-dd",Hf],["hh:mm\nMM-dd",72e5],["hh:mm\nMM-dd",6*Hf],["hh:mm\nMM-dd",432e5],["MM-dd\nyyyy",Gf],["MM-dd\nyyyy",2*Gf],["MM-dd\nyyyy",3*Gf],["MM-dd\nyyyy",4*Gf],["MM-dd\nyyyy",5*Gf],["MM-dd\nyyyy",6*Gf],["week",7*Gf],["MM-dd\nyyyy",864e6],["week",14*Gf],["week",21*Gf],["month",31*Gf],["week",42*Gf],["month",62*Gf],["week",70*Gf],["quarter",95*Gf],["month",31*Gf*4],["month",13392e6],["half-year",16416e6],["month",31*Gf*8],["month",26784e6],["year",380*Gf]];Xf.create=function(t){return new Xf({useUTC:t.ecModel.get("useUTC")})};var Yf=gf.prototype,Uf=Cf.prototype,jf=Is,Zf=Ms,$f=Math.floor,Kf=Math.ceil,Qf=Math.pow,Jf=Math.log,tp=gf.extend({type:"log",base:10,$constructor:function(){gf.apply(this,arguments),this._originalScale=new Cf},getTicks:function(){var n=this._originalScale,i=this._extent,r=n.getExtent();return D(Uf.getTicks.call(this),function(t){var e=Ms(Qf(this.base,t));return e=t===i[0]&&n.__fixMin?ep(e,r[0]):e,e=t===i[1]&&n.__fixMax?ep(e,r[1]):e},this)},getLabel:Uf.getLabel,scale:function(t){return t=Yf.scale.call(this,t),Qf(this.base,t)},setExtent:function(t,e){var n=this.base;t=Jf(t)/Jf(n),e=Jf(e)/Jf(n),Uf.setExtent.call(this,t,e)},getExtent:function(){var t=this.base,e=Yf.getExtent.call(this);e[0]=Qf(t,e[0]),e[1]=Qf(t,e[1]);var n=this._originalScale,i=n.getExtent();return n.__fixMin&&(e[0]=ep(e[0],i[0])),n.__fixMax&&(e[1]=ep(e[1],i[1])),e},unionExtent:function(t){this._originalScale.unionExtent(t);var e=this.base;t[0]=Jf(t[0])/Jf(e),t[1]=Jf(t[1])/Jf(e),Yf.unionExtent.call(this,t)},unionExtentFromData:function(t,e){this.unionExtent(t.getApproximateExtent(e))},niceTicks:function(t){t=t||10;var e=this._extent,n=e[1]-e[0];if(!(n==1/0||n<=0)){var i=function(t){return Math.pow(10,As(t))}(n);for(t/n*i<=.5&&(i*=10);!isNaN(i)&&Math.abs(i)<1&&0<Math.abs(i);)i*=10;var r=[Ms(Kf(e[0]/i)*i),Ms($f(e[1]/i)*i)];this._interval=i,this._niceExtent=r}},niceExtent:function(t){Uf.niceExtent.call(this,t);var e=this._originalScale;e.__fixMin=t.fixMin,e.__fixMax=t.fixMax}});function ep(t,e){return Zf(t,jf(e))}function np(t,e){var n,i,r,a=t.type,o=e.getMin(),s=e.getMax(),l=null!=o,h=null!=s,u=t.getExtent();"ordinal"===a?n=e.getCategories().length:(A(i=e.get("boundaryGap"))||(i=[i||0,i||0]),"boolean"==typeof i[0]&&(i=[0,0]),i[0]=Ss(i[0],1),i[1]=Ss(i[1],1),r=u[1]-u[0]||Math.abs(u[0])),null==o&&(o="ordinal"===a?n?0:NaN:u[0]-i[0]*r),null==s&&(s="ordinal"===a?n?n-1:NaN:u[1]+i[1]*r),"dataMin"===o?o=u[0]:"function"==typeof o&&(o=o({min:u[0],max:u[1]})),"dataMax"===s?s=u[1]:"function"==typeof s&&(s=s({min:u[0],max:u[1]})),null!=o&&isFinite(o)||(o=NaN),null!=s&&isFinite(s)||(s=NaN),t.setBlank(z(o)||z(s)||"ordinal"===a&&!t.getOrdinalMeta().categories.length),e.getNeedCrossZero()&&(0<o&&0<s&&!l&&(o=0),o<0&&s<0&&!h&&(s=0));var c=e.ecModel;if(c&&"time"===a){var d,f=Pf("bar",c);if(k(f,function(t){d|=t.getBaseAxis()===e.axis}),d){var p=Of(f),g=function(t,e,n,i){var r=n.axis.getExtent(),a=r[1]-r[0],o=Ef(i,n.axis);if(void 0===o)return{min:t,max:e};var s=1/0;k(o,function(t){s=Math.min(t.offset,s)});var l=-1/0;k(o,function(t){l=Math.max(t.offset+t.width,l)}),s=Math.abs(s),l=Math.abs(l);var h=s+l,u=e-t,c=u/(1-(s+l)/a)-u;return{min:t-=s/h*c,max:e+=l/h*c}}(o,s,e,p);o=g.min,s=g.max}}return[o,s]}function ip(t,e){var n=np(t,e),i=null!=e.getMin(),r=null!=e.getMax(),a=e.get("splitNumber");"log"===t.type&&(t.base=e.get("logBase"));var o=t.type;t.setExtent(n[0],n[1]),t.niceExtent({splitNumber:a,fixMin:i,fixMax:r,minInterval:"interval"===o||"time"===o?e.get("minInterval"):null,maxInterval:"interval"===o||"time"===o?e.get("maxInterval"):null});var s=e.get("interval");null!=s&&t.setInterval&&t.setInterval(s)}function rp(n){var e,i=n.getLabelModel().get("formatter"),r="category"===n.type?n.scale.getExtent()[0]:null;return"string"==typeof i?(e=i,i=function(t){return t=n.scale.getLabel(t),e.replace("{value}",null!=t?t:"")}):"function"==typeof i?function(t,e){return null!=r&&(e=t-r),i(function(t,e){return"category"===t.type?t.scale.getLabel(e):e}(n,t),e)}:function(t){return n.scale.getLabel(t)}}function ap(t){var e=t.get("interval");return null==e?"auto":e}function op(t){return"category"===t.type&&0===ap(t.getLabelModel())}function sp(t){return this._axes[t]}k(["contain","normalize"],function(e){tp.prototype[e]=function(t){return t=Jf(t)/Jf(this.base),Yf[e].call(this,t)}}),tp.create=function(){return new tp};function lp(t){this._axes={},this._dimList=[],this.name=t||""}function hp(t){lp.call(this,t)}lp.prototype={constructor:lp,type:"cartesian",getAxis:function(t){return this._axes[t]},getAxes:function(){return D(this._dimList,sp,this)},getAxesByScale:function(e){return e=e.toLowerCase(),x(this.getAxes(),function(t){return t.scale.type===e})},addAxis:function(t){var e=t.dim;this._axes[e]=t,this._dimList.push(e)},dataToCoord:function(t){return this._dataCoordConvert(t,"dataToCoord")},coordToData:function(t){return this._dataCoordConvert(t,"coordToData")},_dataCoordConvert:function(t,e){for(var n=this._dimList,i=t instanceof Array?[]:{},r=0;r<n.length;r++){var a=n[r],o=this._axes[a];i[a]=o[e](t[a])}return i}},hp.prototype={constructor:hp,type:"cartesian2d",dimensions:["x","y"],getBaseAxis:function(){return this.getAxesByScale("ordinal")[0]||this.getAxesByScale("time")[0]||this.getAxis("x")},containPoint:function(t){var e=this.getAxis("x"),n=this.getAxis("y");return e.contain(e.toLocalCoord(t[0]))&&n.contain(n.toLocalCoord(t[1]))},containData:function(t){return this.getAxis("x").containData(t[0])&&this.getAxis("y").containData(t[1])},dataToPoint:function(t,e,n){var i=this.getAxis("x"),r=this.getAxis("y");return(n=n||[])[0]=i.toGlobalCoord(i.dataToCoord(t[0])),n[1]=r.toGlobalCoord(r.dataToCoord(t[1])),n},clampData:function(t,e){var n=this.getAxis("x").scale,i=this.getAxis("y").scale,r=n.getExtent(),a=i.getExtent(),o=n.parse(t[0]),s=i.parse(t[1]);return(e=e||[])[0]=Math.min(Math.max(Math.min(r[0],r[1]),o),Math.max(r[0],r[1])),e[1]=Math.min(Math.max(Math.min(a[0],a[1]),s),Math.max(a[0],a[1])),e},pointToData:function(t,e){var n=this.getAxis("x"),i=this.getAxis("y");return(e=e||[])[0]=n.coordToData(n.toLocalCoord(t[0])),e[1]=i.coordToData(i.toLocalCoord(t[1])),e},getOtherAxis:function(t){return this.getAxis("x"===t.dim?"y":"x")}},y(hp,lp);var up=ji();function cp(t){return"category"===t.type?function(t){var e=t.getLabelModel(),n=fp(t,e);return!e.get("show")||t.scale.isBlank()?{labels:[],labelCategoryInterval:n.labelCategoryInterval}:n}(t):function(n){var t=n.scale.getTicks(),i=rp(n);return{labels:D(t,function(t,e){return{formattedLabel:i(t,e),rawLabel:n.scale.getLabel(t),tickValue:t}})}}(t)}function dp(t,e){return"category"===t.type?function(t,e){var n,i,r=pp(t,"ticks"),a=ap(e),o=gp(r,a);if(o)return o;e.get("show")&&!t.scale.isBlank()||(n=[]);if(T(a))n=yp(t,a,!0);else if("auto"===a){var s=fp(t,t.getLabelModel());i=s.labelCategoryInterval,n=D(s.labels,function(t){return t.tickValue})}else n=mp(t,i=a,!0);return vp(r,a,{ticks:n,tickCategoryInterval:i})}(t,e):{ticks:t.scale.getTicks()}}function fp(t,e){var n,i=pp(t,"labels"),r=ap(e),a=gp(i,r);return a||vp(i,r,{labels:T(r)?yp(t,r):mp(t,n="auto"===r?function(t){var e=up(t).autoInterval;return null!=e?e:up(t).autoInterval=t.calculateCategoryInterval()}(t):r),labelCategoryInterval:n})}function pp(t,e){return up(t)[e]||(up(t)[e]=[])}function gp(t,e){for(var n=0;n<t.length;n++)if(t[n].key===e)return t[n].value}function vp(t,e,n){return t.push({key:e,value:n}),n}function mp(t,e,n){var i=rp(t),r=t.scale,a=r.getExtent(),o=t.getLabelModel(),s=[],l=Math.max((e||0)+1,1),h=a[0],u=r.count();0!==h&&1<l&&2<u/l&&(h=Math.round(Math.ceil(h/l)*l));var c=op(t),d=o.get("showMinLabel")||c,f=o.get("showMaxLabel")||c;d&&h!==a[0]&&g(a[0]);for(var p=h;p<=a[1];p+=l)g(p);function g(t){s.push(n?t:{formattedLabel:i(t),rawLabel:r.getLabel(t),tickValue:t})}return f&&p-l!==a[1]&&g(a[1]),s}function yp(t,n,i){var r=t.scale,a=rp(t),o=[];return k(r.getTicks(),function(t){var e=r.getLabel(t);n(t,e)&&o.push(i?t:{formattedLabel:a(t),rawLabel:e,tickValue:t})}),o}function _p(t,e,n){this.dim=t,this.scale=e,this._extent=n||[0,0],this.inverse=!1,this.onBand=!1}var xp=[0,1];function wp(t,e){var n=(t[1]-t[0])/e/2;t[0]+=n,t[1]-=n}_p.prototype={constructor:_p,contain:function(t){var e=this._extent,n=Math.min(e[0],e[1]),i=Math.max(e[0],e[1]);return n<=t&&t<=i},containData:function(t){return this.contain(this.dataToCoord(t))},getExtent:function(){return this._extent.slice()},getPixelPrecision:function(t){return function(t,e){var n=Math.log,i=Math.LN10,r=Math.floor(n(t[1]-t[0])/i),a=Math.round(n(Math.abs(e[1]-e[0]))/i),o=Math.min(Math.max(-r+a,0),20);return isFinite(o)?o:20}(t||this.scale.getExtent(),this._extent)},setExtent:function(t,e){var n=this._extent;n[0]=t,n[1]=e},dataToCoord:function(t,e){var n=this._extent,i=this.scale;return t=i.normalize(t),this.onBand&&"ordinal"===i.type&&wp(n=n.slice(),i.count()),bs(t,xp,n,e)},coordToData:function(t,e){var n=this._extent,i=this.scale;this.onBand&&"ordinal"===i.type&&wp(n=n.slice(),i.count());var r=bs(t,n,xp,e);return this.scale.scale(r)},pointToData:function(t,e){},getTicksCoords:function(t){var e=(t=t||{}).tickModel||this.getTickModel(),n=dp(this,e),i=D(n.ticks,function(t){return{coord:this.dataToCoord(t),tickValue:t}},this),r=e.get("alignWithLabel");return function(t,e,n,i,r){var a=e.length;if(!t.onBand||i||!a)return;var o,s=t.getExtent();if(1===a)e[0].coord=s[0],o=e[1]={coord:s[0]};else{var l=e[1].coord-e[0].coord;k(e,function(t){t.coord-=l/2;var e=e||0;0<e%2&&(t.coord-=l/(2*(e+1)))}),o={coord:e[a-1].coord+l},e.push(o)}var h=s[0]>s[1];u(e[0].coord,s[0])&&(r?e[0].coord=s[0]:e.shift());r&&u(s[0],e[0].coord)&&e.unshift({coord:s[0]});u(s[1],o.coord)&&(r?o.coord=s[1]:e.pop());r&&u(o.coord,s[1])&&e.push({coord:s[1]});function u(t,e){return h?e<t:t<e}}(this,i,n.tickCategoryInterval,r,t.clamp),i},getViewLabels:function(){return cp(this).labels},getLabelModel:function(){return this.model.getModel("axisLabel")},getTickModel:function(){return this.model.getModel("axisTick")},getBandWidth:function(){var t=this._extent,e=this.scale.getExtent(),n=e[1]-e[0]+(this.onBand?1:0);0===n&&(n=1);var i=Math.abs(t[1]-t[0]);return Math.abs(i)/n},isHorizontal:null,getRotate:null,calculateCategoryInterval:function(){return function(t){var e=function(t){var e=t.getLabelModel();return{axisRotate:t.getRotate?t.getRotate():t.isHorizontal&&!t.isHorizontal()?90:0,labelRotate:e.get("rotate")||0,font:e.getFont()}}(t),n=rp(t),i=(e.axisRotate-e.labelRotate)/180*Math.PI,r=t.scale,a=r.getExtent(),o=r.count();if(a[1]-a[0]<1)return 0;var s=1;40<o&&(s=Math.max(1,Math.floor(o/40)));for(var l=a[0],h=t.dataToCoord(l+1)-t.dataToCoord(l),u=Math.abs(h*Math.cos(i)),c=Math.abs(h*Math.sin(i)),d=0,f=0;l<=a[1];l+=s){var p,g,v=Pn(n(l),e.font,"center","top");p=1.3*v.width,g=1.3*v.height,d=Math.max(d,p,7),f=Math.max(f,g,7)}var m=d/u,y=f/c;isNaN(m)&&(m=1/0),isNaN(y)&&(y=1/0);var _=Math.max(0,Math.floor(Math.min(m,y))),x=up(t.model),w=x.lastAutoInterval,b=x.lastTickCount;return null!=w&&null!=b&&Math.abs(w-_)<=1&&Math.abs(b-o)<=1&&_<w?_=w:(x.lastTickCount=o,x.lastAutoInterval=_),_}(this)}};function bp(t,e,n,i,r){_p.call(this,t,e,n),this.type=i||"value",this.position=r||"bottom"}bp.prototype={constructor:bp,index:0,getAxesOnZeroOf:null,model:null,isHorizontal:function(){var t=this.position;return"top"===t||"bottom"===t},getGlobalExtent:function(t){var e=this.getExtent();return e[0]=this.toGlobalCoord(e[0]),e[1]=this.toGlobalCoord(e[1]),t&&e[0]>e[1]&&e.reverse(),e},getOtherAxis:function(){this.grid.getOtherAxis()},pointToData:function(t,e){return this.coordToData(this.toLocalCoord(t["x"===this.dim?0:1]),e)},toLocalCoord:null,toGlobalCoord:null},y(bp,_p);var Sp={show:!0,zlevel:0,z:0,inverse:!1,name:"",nameLocation:"end",nameRotate:null,nameTruncate:{maxWidth:null,ellipsis:"...",placeholder:"."},nameTextStyle:{},nameGap:15,silent:!1,triggerEvent:!1,tooltip:{show:!1},axisPointer:{},axisLine:{show:!0,onZero:!0,onZeroAxisIndex:null,lineStyle:{color:"#333",width:1,type:"solid"},symbol:["none","none"],symbolSize:[10,15]},axisTick:{show:!0,inside:!1,length:5,lineStyle:{width:1}},axisLabel:{show:!0,inside:!1,rotate:0,showMinLabel:null,showMaxLabel:null,margin:8,fontSize:12},splitLine:{show:!0,lineStyle:{color:["#ccc"],width:1,type:"solid"}},splitArea:{show:!1,areaStyle:{color:["rgba(250,250,250,0.3)","rgba(200,200,200,0.3)"]}}},Mp={};Mp.categoryAxis=f({boundaryGap:!0,deduplication:null,splitLine:{show:!1},axisTick:{alignWithLabel:!1,interval:"auto"},axisLabel:{interval:"auto"}},Sp),Mp.valueAxis=f({boundaryGap:[0,0],splitNumber:5},Sp),Mp.timeAxis=C({scale:!0,min:"dataMin",max:"dataMax"},Mp.valueAxis),Mp.logAxis=C({scale:!0,logBase:10},Mp.valueAxis);function Ip(a,t,o,e){k(Tp,function(r){t.extend({type:a+"Axis."+r,mergeDefaultAndTheme:function(t,e){var n=this.layoutMode,i=n?js(t):{};f(t,e.getTheme().get(r+"Axis")),f(t,this.getDefaultOption()),t.type=o(a,t),n&&Us(t,i,n)},optionUpdated:function(){"category"===this.option.type&&(this.__ordinalMeta=vf.createByAxisModel(this))},getCategories:function(t){var e=this.option;if("category"===e.type)return t?e.data:this.__ordinalMeta.categories},getOrdinalMeta:function(){return this.__ordinalMeta},defaultOption:function(t,e){for(var n=t[0],i=1,r=t.length;i<r;i++)n=f(n,t[i],e);return n}([{},Mp[r+"Axis"],e],!0)})}),Js.registerSubTypeDefaulter(a+"Axis",I(o,a))}var Tp=["value","category","time","log"],Cp={getMin:function(t){var e=this.option,n=t||null==e.rangeStart?e.min:e.rangeStart;return this.axis&&null!=n&&"dataMin"!==n&&"function"!=typeof n&&!z(n)&&(n=this.axis.scale.parse(n)),n},getMax:function(t){var e=this.option,n=t||null==e.rangeEnd?e.max:e.rangeEnd;return this.axis&&null!=n&&"dataMax"!==n&&"function"!=typeof n&&!z(n)&&(n=this.axis.scale.parse(n)),n},getNeedCrossZero:function(){var t=this.option;return null==t.rangeStart&&null==t.rangeEnd&&!t.scale},getCoordSysModel:$,setRange:function(t,e){this.option.rangeStart=t,this.option.rangeEnd=e},resetRange:function(){this.option.rangeStart=this.option.rangeEnd=null}},kp=Js.extend({type:"cartesian2dAxis",axis:null,init:function(){kp.superApply(this,"init",arguments),this.resetRange()},mergeOption:function(){kp.superApply(this,"mergeOption",arguments),this.resetRange()},restoreData:function(){kp.superApply(this,"restoreData",arguments),this.resetRange()},getCoordSysModel:function(){return this.ecModel.queryComponents({mainType:"grid",index:this.option.gridIndex,id:this.option.gridId})[0]}});function Dp(t,e){return e.type||(e.data?"category":"value")}f(kp.prototype,Cp);var Ap={offset:0};function Lp(t,e){return t.getCoordSysModel()===e}function Pp(t,e,n){this._coordsMap={},this._coordsList=[],this._axesMap={},this._axesList=[],this._initCartesian(t,e,n),this.model=t}Ip("x",kp,Dp,Ap),Ip("y",kp,Dp,Ap),Js.extend({type:"grid",dependencies:["xAxis","yAxis"],layoutMode:"box",coordinateSystem:null,defaultOption:{show:!1,zlevel:0,z:0,left:"10%",top:60,right:"10%",bottom:60,containLabel:!1,backgroundColor:"rgba(0,0,0,0)",borderWidth:1,borderColor:"#ccc"}});var Op=Pp.prototype;function Ep(t,e,n,i){n.getAxesOnZeroOf=function(){return r?[r]:[]};var r,a=t[e],o=n.model,s=o.get("axisLine.onZero"),l=o.get("axisLine.onZeroAxisIndex");if(s){if(null!=l)Np(a[l])&&(r=a[l]);else for(var h in a)if(a.hasOwnProperty(h)&&Np(a[h])&&!i[u(a[h])]){r=a[h];break}r&&(i[u(r)]=!0)}function u(t){return t.dim+"_"+t.index}}function Np(t){return t&&"category"!==t.type&&"time"!==t.type&&function(t){var e=t.scale.getExtent(),n=e[0],i=e[1];return!(0<n&&0<i||n<0&&i<0)}(t)}Op.type="grid",Op.axisPointerEnabled=!0,Op.getRect=function(){return this._rect},Op.update=function(t,e){var n=this._axesMap;this._updateScale(t,this.model),k(n.x,function(t){ip(t.scale,t.model)}),k(n.y,function(t){ip(t.scale,t.model)});var i={};k(n.x,function(t){Ep(n,"y",t,i)}),k(n.y,function(t){Ep(n,"x",t,i)}),this.resize(this.model,e)},Op.resize=function(t,e,n){var r=function(t,e,n){n=Os(n||0);var i=e.width,r=e.height,a=Ss(t.left,i),o=Ss(t.top,r),s=Ss(t.right,i),l=Ss(t.bottom,r),h=Ss(t.width,i),u=Ss(t.height,r),c=n[2]+n[0],d=n[1]+n[3],f=t.aspect;switch(isNaN(h)&&(h=i-s-d-a),isNaN(u)&&(u=r-l-c-o),null!=f&&(isNaN(h)&&isNaN(u)&&(i/r<f?h=.8*i:u=.8*r),isNaN(h)&&(h=f*u),isNaN(u)&&(u=h/f)),isNaN(a)&&(a=i-s-h-d),isNaN(o)&&(o=r-l-u-c),t.left||t.right){case"center":a=i/2-h/2-n[3];break;case"right":a=i-h-d}switch(t.top||t.bottom){case"middle":case"center":o=r/2-u/2-n[0];break;case"bottom":o=r-u-c}a=a||0,o=o||0,isNaN(h)&&(h=i-d-a-(s||0)),isNaN(u)&&(u=r-c-o-(l||0));var p=new qe(a+n[3],o+n[0],h,u);return p.margin=n,p}(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()});this._rect=r;var i=this._axesList;function a(){k(i,function(t){var e=t.isHorizontal(),n=e?[0,r.width]:[0,r.height],i=t.inverse?1:0;t.setExtent(n[i],n[1-i]),function(t,e){var n=t.getExtent(),i=n[0]+n[1];t.toGlobalCoord="x"===t.dim?function(t){return t+e}:function(t){return i-t+e},t.toLocalCoord="x"===t.dim?function(t){return t-e}:function(t){return i-t+e}}(t,e?r.x:r.y)})}a(),!n&&t.get("containLabel")&&(k(i,function(t){if(!t.model.get("axisLabel.inside")){var e=function(t){var e=t.model,n=t.scale;if(e.get("axisLabel.show")&&!n.isBlank()){var i,r,a="category"===t.type,o=n.getExtent();r=a?n.count():(i=n.getTicks()).length;var s,l,h,u,c,d,f,p,g,v=t.getLabelModel(),m=rp(t),y=1;40<r&&(y=Math.ceil(r/40));for(var _=0;_<r;_+=y){var x=m(i?i[_]:o[0]+_),w=v.getTextRect(x),b=(l=w,h=v.get("rotate")||0,void 0,u=h*Math.PI/180,c=l.plain(),d=c.width,f=c.height,p=d*Math.cos(u)+f*Math.sin(u),g=d*Math.sin(u)+f*Math.cos(u),new qe(c.x,c.y,p,g));s?s.union(b):s=b}return s}}(t);if(e){var n=t.isHorizontal()?"height":"width",i=t.model.get("axisLabel.margin");r[n]-=e[n]+i,"top"===t.position?r.y+=e.height+i:"left"===t.position&&(r.x+=e.width+i)}}}),a())},Op.getAxis=function(t,e){var n=this._axesMap[t];if(null!=n){if(null==e)for(var i in n)if(n.hasOwnProperty(i))return n[i];return n[e]}},Op.getAxes=function(){return this._axesList.slice()},Op.getCartesian=function(t,e){if(null!=t&&null!=e){var n="x"+t+"y"+e;return this._coordsMap[n]}O(t)&&(e=t.yAxisIndex,t=t.xAxisIndex);for(var i=0,r=this._coordsList;i<r.length;i++)if(r[i].getAxis("x").index===t||r[i].getAxis("y").index===e)return r[i]},Op.getCartesians=function(){return this._coordsList.slice()},Op.convertToPixel=function(t,e,n){var i=this._findConvertTarget(t,e);return i.cartesian?i.cartesian.dataToPoint(n):i.axis?i.axis.toGlobalCoord(i.axis.dataToCoord(n)):null},Op.convertFromPixel=function(t,e,n){var i=this._findConvertTarget(t,e);return i.cartesian?i.cartesian.pointToData(n):i.axis?i.axis.coordToData(i.axis.toLocalCoord(n)):null},Op._findConvertTarget=function(t,e){var n,i,r=e.seriesModel,a=e.xAxisModel||r&&r.getReferringComponents("xAxis")[0],o=e.yAxisModel||r&&r.getReferringComponents("yAxis")[0],s=e.gridModel,l=this._coordsList;if(r)v(l,n=r.coordinateSystem)<0&&(n=null);else if(a&&o)n=this.getCartesian(a.componentIndex,o.componentIndex);else if(a)i=this.getAxis("x",a.componentIndex);else if(o)i=this.getAxis("y",o.componentIndex);else if(s){s.coordinateSystem===this&&(n=this._coordsList[0])}return{cartesian:n,axis:i}},Op.containPoint=function(t){var e=this._coordsList[0];if(e)return e.containPoint(t)},Op._initCartesian=function(o,t,e){var s={left:!1,right:!1,top:!1,bottom:!1},l={x:{},y:{}},h={x:0,y:0};if(t.eachComponent("xAxis",n("x"),this),t.eachComponent("yAxis",n("y"),this),!h.x||!h.y)return this._axesMap={},void(this._axesList=[]);function n(a){return function(t,e){if(Lp(t,o)){var n=t.get("position");"x"===a?"top"!==n&&"bottom"!==n&&(n=s.bottom?"top":"bottom"):"left"!==n&&"right"!==n&&(n=s.left?"right":"left"),s[n]=!0;var i=new bp(a,function(t,e){if(e=e||t.get("type"))switch(e){case"category":return new wf(t.getOrdinalMeta?t.getOrdinalMeta():t.getCategories(),[1/0,-1/0]);case"value":return new Cf;default:return(gf.getClass(e)||Cf).create(t)}}(t),[0,0],t.get("type"),n),r="category"===i.type;i.onBand=r&&t.get("boundaryGap"),i.inverse=t.get("inverse"),(t.axis=i).model=t,i.grid=this,i.index=e,this._axesList.push(i),l[a][e]=i,h[a]++}}}k((this._axesMap=l).x,function(r,a){k(l.y,function(t,e){var n="x"+a+"y"+e,i=new hp(n);i.grid=this,i.model=o,this._coordsMap[n]=i,this._coordsList.push(i),i.addAxis(r),i.addAxis(t)},this)},this)},Op._updateScale=function(l,h){function u(e,n){k(e.mapDimension(n.dim,!0),function(t){n.scale.unionExtentFromData(e,function(t,e){return _d(t,e)?t.getCalculationInfo("stackResultDimension"):e}(e,t))})}k(this._axesList,function(t){t.scale.setExtent(1/0,-1/0)}),l.eachSeries(function(t){if(Rp(t)){var e=zp(t,l),n=e[0],i=e[1];if(!Lp(n,h)||!Lp(i,h))return;var r=this.getCartesian(n.componentIndex,i.componentIndex),a=t.getData(),o=r.getAxis("x"),s=r.getAxis("y");"list"===a.type&&(u(a,o,t),u(a,s,t))}},this)},Op.getTooltipAxes=function(i){var r=[],a=[];return k(this.getCartesians(),function(t){var e=null!=i&&"auto"!==i?t.getAxis(i):t.getBaseAxis(),n=t.getOtherAxis(e);v(r,e)<0&&r.push(e),v(a,n)<0&&a.push(n)}),{baseAxes:r,otherAxes:a}};var Bp=["xAxis","yAxis"];function zp(e){return D(Bp,function(t){return e.getReferringComponents(t)[0]})}function Rp(t){return"cartesian2d"===t.get("coordinateSystem")}Pp.create=function(i,r){var a=[];return i.eachComponent("grid",function(t,e){var n=new Pp(t,i,r);n.name="grid_"+e,n.resize(t,r,!0),t.coordinateSystem=n,a.push(n)}),i.eachSeries(function(t){if(Rp(t)){var e=zp(t),n=e[0],i=e[1],r=n.getCoordSysModel().coordinateSystem;t.coordinateSystem=r.getCartesian(n.componentIndex,i.componentIndex)}}),a},Pp.dimensions=Pp.prototype.dimensions=hp.prototype.dimensions,Dl.register("cartesian2d",Pp);function Fp(t,e){this.opt=e,this.axisModel=t,C(e,{labelOffset:0,nameDirection:1,tickDirection:1,labelDirection:1,silent:!0}),this.group=new Ye;var n=new Ye({position:e.position.slice(),rotation:e.rotation});n.updateTransform(),this._transform=n.transform,this._dumbGroup=n}var Vp=Math.PI;Fp.prototype={constructor:Fp,hasBuilder:function(t){return!!Wp[t]},add:function(t){Wp[t].call(this)},getGroup:function(){return this.group}};var Wp={axisLine:function(){var a=this.opt,t=this.axisModel;if(t.get("axisLine.show")){var e=this.axisModel.axis.getExtent(),n=this._transform,o=[e[0],0],i=[e[1],0];n&&(st(o,o,n),st(i,i,n));var s=S({lineCap:"round"},t.getModel("axisLine.lineStyle").getLineStyle());this.group.add(new ao({anid:"line",subPixelOptimize:!0,shape:{x1:o[0],y1:o[1],x2:i[0],y2:i[1]},style:s,strokeContainThreshold:a.strokeContainThreshold||5,silent:!0,z2:1}));var l=t.get("axisLine.symbol"),r=t.get("axisLine.symbolSize"),h=t.get("axisLine.symbolOffset")||0;if("number"==typeof h&&(h=[h,h]),null!=l){"string"==typeof l&&(l=[l,l]),"string"!=typeof r&&"number"!=typeof r||(r=[r,r]);var u=r[0],c=r[1];k([{rotate:a.rotation+Math.PI/2,offset:h[0],r:0},{rotate:a.rotation-Math.PI/2,offset:h[1],r:Math.sqrt((o[0]-i[0])*(o[0]-i[0])+(o[1]-i[1])*(o[1]-i[1]))}],function(t,e){if("none"!==l[e]&&null!=l[e]){var n=Dd(l[e],-u/2,-c/2,u,c,s.stroke,!0),i=t.r+t.offset,r=[o[0]+i*Math.cos(a.rotation),o[1]-i*Math.sin(a.rotation)];n.attr({rotation:t.rotate,position:r,silent:!0,z2:11}),this.group.add(n)}},this)}}},axisTickLabel:function(){var t=this.axisModel,e=this.opt,n=function(t,e,n){var i=e.axis;if(!e.get("axisTick.show")||i.scale.isBlank())return;for(var r=e.getModel("axisTick"),a=r.getModel("lineStyle"),o=r.get("length"),s=i.getTicksCoords(),l=[],h=[],u=t._transform,c=[],d=0;d<s.length;d++){var f=s[d].coord;l[0]=f,l[1]=0,h[0]=f,h[1]=n.tickDirection*o,u&&(st(l,l,u),st(h,h,u));var p=new ao({anid:"tick_"+s[d].tickValue,subPixelOptimize:!0,shape:{x1:l[0],y1:l[1],x2:h[0],y2:h[1]},style:C(a.getLineStyle(),{stroke:e.get("axisLine.lineStyle.color")}),z2:2,silent:!0});t.group.add(p),c.push(p)}return c}(this,t,e);!function(t,e,n){if(op(t.axis))return;var i=t.get("axisLabel.showMinLabel"),r=t.get("axisLabel.showMaxLabel");n=n||[];var a=(e=e||[])[0],o=e[1],s=e[e.length-1],l=e[e.length-2],h=n[0],u=n[1],c=n[n.length-1],d=n[n.length-2];!1===i?(qp(a),qp(h)):Yp(a,o)&&(i?(qp(o),qp(u)):(qp(a),qp(h)));!1===r?(qp(s),qp(c)):Yp(l,s)&&(r?(qp(l),qp(d)):(qp(s),qp(c)))}(t,function(h,u,c){var d=u.axis;if(!R(c.axisLabelShow,u.get("axisLabel.show"))||d.scale.isBlank())return;var f=u.getModel("axisLabel"),p=f.get("margin"),t=d.getViewLabels(),e=(R(c.labelRotate,f.get("rotate"))||0)*Vp/180,g=Gp(c.rotation,e,c.labelDirection),v=u.getCategories&&u.getCategories(!0),m=[],y=Xp(u),_=u.get("triggerEvent");return k(t,function(t,e){var n=t.tickValue,i=t.formattedLabel,r=t.rawLabel,a=f;v&&v[n]&&v[n].textStyle&&(a=new vs(v[n].textStyle,f,u.ecModel));var o=a.getTextColor()||u.get("axisLine.lineStyle.color"),s=[d.dataToCoord(n),c.labelOffset+c.labelDirection*p],l=new Ha({anid:"label_"+n,position:s,rotation:g.rotation,silent:y,z2:10});Ko(l.style,a,{text:i,textAlign:a.getShallow("align",!0)||g.textAlign,textVerticalAlign:a.getShallow("verticalAlign",!0)||a.getShallow("baseline",!0)||g.textVerticalAlign,textFill:"function"==typeof o?o("category"===d.type?r:"value"===d.type?n+"":n,e):o}),_&&(l.eventData=Hp(u),l.eventData.targetType="axisLabel",l.eventData.value=r),h._dumbGroup.add(l),l.updateTransform(),m.push(l),h.group.add(l),l.decomposeTransform()}),m}(this,t,e),n)},axisName:function(){var t=this.opt,e=this.axisModel,n=R(t.axisName,e.get("name"));if(n){var i,r,a=e.get("nameLocation"),o=t.nameDirection,s=e.getModel("nameTextStyle"),l=e.get("nameGap")||0,h=this.axisModel.axis.getExtent(),u=h[0]>h[1]?-1:1,c=["start"===a?h[0]-u*l:"end"===a?h[1]+u*l:(h[0]+h[1])/2,Up(a)?t.labelOffset+o*l:0],d=e.get("nameRotate");null!=d&&(d=d*Vp/180),Up(a)?i=Gp(t.rotation,null!=d?d:t.rotation,o):(i=function(t,e,n,i){var r,a,o=Ts(n-t.rotation),s=i[0]>i[1],l="start"===e&&!s||"start"!==e&&s;r=Cs(o-Vp/2)?(a=l?"bottom":"top","center"):Cs(o-1.5*Vp)?(a=l?"top":"bottom","center"):(a="middle",o<1.5*Vp&&Vp/2<o?l?"left":"right":l?"right":"left");return{rotation:o,textAlign:r,textVerticalAlign:a}}(t,a,d||0,h),null!=(r=t.axisNameAvailableWidth)&&(r=Math.abs(r/Math.sin(i.rotation)),isFinite(r)||(r=null)));var f=s.getFont(),p=e.get("nameTruncate",!0)||{},g=p.ellipsis,v=R(t.nameTruncateMaxWidth,p.maxWidth,r),m=null!=g&&null!=v?Hs(n,v,f,g,{minChar:2,placeholder:p.placeholder}):n,y=e.get("tooltip",!0),_=e.mainType,x={componentType:_,name:n,$vars:["name"]};x[_+"Index"]=e.componentIndex;var w=new Ha({anid:"name",__fullText:n,__truncatedText:m,position:c,rotation:i.rotation,silent:Xp(e),z2:1,tooltip:y&&y.show?S({content:n,formatter:function(){return n},formatterParams:x},y):null});Ko(w.style,s,{text:m,textFont:f,textFill:s.getTextColor()||e.get("axisLine.lineStyle.color"),textAlign:s.get("align")||i.textAlign,textVerticalAlign:s.get("verticalAlign")||i.textVerticalAlign}),e.get("triggerEvent")&&(w.eventData=Hp(e),w.eventData.targetType="axisName",w.eventData.name=n),this._dumbGroup.add(w),w.updateTransform(),this.group.add(w),w.decomposeTransform()}}},Hp=Fp.makeAxisEventDataBase=function(t){var e={componentType:t.mainType,componentIndex:t.componentIndex};return e[t.mainType+"Index"]=t.componentIndex,e},Gp=Fp.innerTextLayout=function(t,e,n){var i,r=Ts(e-t);return{rotation:r,textAlign:Cs(r)?(i=0<n?"top":"bottom","center"):Cs(r-Vp)?(i=0<n?"bottom":"top","center"):(i="middle",0<r&&r<Vp?0<n?"right":"left":0<n?"left":"right"),textVerticalAlign:i}};var Xp=Fp.isLabelSilent=function(t){var e=t.get("tooltip");return t.get("silent")||!(t.get("triggerEvent")||e&&e.show)};function qp(t){t&&(t.ignore=!0)}function Yp(t,e){var n=t&&t.getBoundingRect().clone(),i=e&&e.getBoundingRect().clone();if(n&&i){var r=Bt([]);return Ft(r,r,-t.rotation),n.applyTransform(zt([],r,t.getLocalTransform())),i.applyTransform(zt([],r,e.getLocalTransform())),n.intersect(i)}}function Up(t){return"middle"===t||"center"===t}function jp(t){var e=(t.ecModel.getComponent("axisPointer")||{}).coordSysAxesInfo;return e&&e.axesInfo[function(t){return t.type+"||"+t.id}(t)]}var Zp=Fc({type:"axis",_axisPointer:null,axisPointerClass:null,render:function(t,e,n,i){this.axisPointerClass&&function(t){var e=jp(t);if(e){var n=e.axisPointerModel,i=e.axis.scale,r=n.option,a=n.get("status"),o=n.get("value");null!=o&&(o=i.parse(o));var s=function(t){return!!t.get("handle.show")}(n);null==a&&(r.status=s?"show":"hide");var l=i.getExtent().slice();l[0]>l[1]&&l.reverse(),(null==o||o>l[1])&&(o=l[1]),o<l[0]&&(o=l[0]),r.value=o,s&&(r.status=e.axis.scale.isBlank()?"hide":"show")}}(t),Zp.superApply(this,"render",arguments),$p(this,t,e,n,i,!0)},updateAxisPointer:function(t,e,n,i,r){$p(this,t,e,n,i,!1)},remove:function(t,e){var n=this._axisPointer;n&&n.remove(e),Zp.superApply(this,"remove",arguments)},dispose:function(t,e){Kp(this,e),Zp.superApply(this,"dispose",arguments)}});function $p(t,e,n,i,r,a){var o=Zp.getAxisPointerClass(t.axisPointerClass);if(o){var s=function(t){var e=jp(t);return e&&e.axisPointerModel}(e);s?(t._axisPointer||(t._axisPointer=new o)).render(e,s,i,a):Kp(t,i)}}function Kp(t,e,n){var i=t._axisPointer;i&&i.dispose(e,n),t._axisPointer=null}var Qp=[];Zp.registerAxisPointerClass=function(t,e){Qp[t]=e},Zp.getAxisPointerClass=function(t){return t&&Qp[t]};var Jp,tg,eg,ng=["axisLine","axisTickLabel","axisName"],ig=["splitArea","splitLine"],rg=Zp.extend({type:"cartesianAxis",axisPointerClass:"CartesianAxisPointer",render:function(e,t,n,i){this.group.removeAll();var r=this._axisGroup;if(this._axisGroup=new Ye,this.group.add(this._axisGroup),e.get("show")){var a=e.getCoordSysModel(),o=function(t,e,n){n=n||{};var i=t.coordinateSystem,r=e.axis,a={},o=r.getAxesOnZeroOf()[0],s=r.position,l=o?"onZero":s,h=r.dim,u=i.getRect(),c=[u.x,u.x+u.width,u.y,u.y+u.height],d={left:0,right:1,top:0,bottom:1,onZero:2},f=e.get("offset")||0,p="x"===h?[c[2]-f,c[3]+f]:[c[0]-f,c[1]+f];if(o){var g=o.toGlobalCoord(o.dataToCoord(0));p[d.onZero]=Math.max(Math.min(g,p[1]),p[0])}a.position=["y"===h?p[d[l]]:c[0],"x"===h?p[d[l]]:c[3]],a.rotation=Math.PI/2*("x"===h?0:1),a.labelDirection=a.tickDirection=a.nameDirection={top:-1,bottom:1,left:-1,right:1}[s],a.labelOffset=o?p[d[s]]-p[d.onZero]:0,e.get("axisTick.inside")&&(a.tickDirection=-a.tickDirection),R(n.labelInside,e.get("axisLabel.inside"))&&(a.labelDirection=-a.labelDirection);var v=e.get("axisLabel.rotate");return a.labelRotate="top"===l?-v:v,a.z2=1,a}(a,e),s=new Fp(e,o);k(ng,s.add,s),this._axisGroup.add(s.getGroup()),k(ig,function(t){e.get(t+".show")&&this["_"+t](e,a)},this),ls(r,this._axisGroup,e),rg.superCall(this,"render",e,t,n,i)}},remove:function(){this._splitAreaColors=null},_splitLine:function(t,e){var n=t.axis;if(!n.scale.isBlank()){var i=t.getModel("splitLine"),r=i.getModel("lineStyle"),a=r.get("color");a=A(a)?a:[a];for(var o=e.coordinateSystem.getRect(),s=n.isHorizontal(),l=0,h=n.getTicksCoords({tickModel:i}),u=[],c=[],d=r.getLineStyle(),f=0;f<h.length;f++){var p=n.toGlobalCoord(h[f].coord);s?(u[0]=p,u[1]=o.y,c[0]=p,c[1]=o.y+o.height):(u[0]=o.x,u[1]=p,c[0]=o.x+o.width,c[1]=p);var g=l++%a.length,v=h[f].tickValue;this._axisGroup.add(new ao({anid:null!=v?"line_"+h[f].tickValue:null,subPixelOptimize:!0,shape:{x1:u[0],y1:u[1],x2:c[0],y2:c[1]},style:C({stroke:a[g]},d),silent:!0}))}}},_splitArea:function(t,e){var n=t.axis;if(!n.scale.isBlank()){var i=t.getModel("splitArea"),r=i.getModel("areaStyle"),a=r.get("color"),o=e.coordinateSystem.getRect(),s=n.getTicksCoords({tickModel:i,clamp:!0});if(s.length){var l=a.length,h=this._splitAreaColors,u=Z(),c=0;if(h)for(var d=0;d<s.length;d++){var f=h.get(s[d].tickValue);if(null!=f){c=(f+(l-1)*d)%l;break}}var p=n.toGlobalCoord(s[0].coord),g=r.getAreaStyle();a=A(a)?a:[a];for(d=1;d<s.length;d++){var v,m,y,_,x=n.toGlobalCoord(s[d].coord);p=n.isHorizontal()?(v=p,m=o.y,y=x-v,_=o.height,v+y):(v=o.x,m=p,y=o.width,m+(_=x-m));var w=s[d-1].tickValue;null!=w&&u.set(w,c),this._axisGroup.add(new io({anid:null!=w?"area_"+w:null,shape:{x:v,y:m,width:y,height:_},style:C({fill:a[c]},g),silent:!0})),c=(c+1)%l}this._splitAreaColors=u}}}});function ag(t,e){"outside"===t.textPosition&&(t.textPosition=e)}rg.extend({type:"xAxis"}),rg.extend({type:"yAxis"}),Fc({type:"grid",render:function(t,e){this.group.removeAll(),t.get("show")&&this.group.add(new io({shape:t.coordinateSystem.getRect(),style:C({fill:t.get("backgroundColor")},t.getItemStyle()),silent:!0,z2:-1}))}}),Pc(function(t){t.xAxis&&t.yAxis&&!t.grid&&(t.grid={})}),Bc((tg="circle",eg=Jp="line",{seriesType:Jp,performRawSeries:!0,reset:function(l,t,e){var n=l.getData(),h=l.get("symbol"),u=l.get("symbolSize"),i=l.get("symbolKeepAspect"),c=T(h),d=T(u),f=c||d,r=!c&&h?h:tg,a=d?null:u;if(n.setVisual({legendSymbol:eg||r,symbol:r,symbolSize:a,symbolKeepAspect:i}),!t.isSeriesFiltered(l))return{dataEach:n.hasItemOption||f?function(t,e){if(f){var n=l.getRawValue(e),i=l.getDataParams(e);c&&t.setItemVisual(e,"symbol",h(n,i)),d&&t.setItemVisual(e,"symbolSize",u(n,i))}if(t.hasItemOption){var r=t.getItemModel(e),a=r.getShallow("symbol",!0),o=r.getShallow("symbolSize",!0),s=r.getShallow("symbolKeepAspect",!0);null!=a&&t.setItemVisual(e,"symbol",a),null!=o&&t.setItemVisual(e,"symbolSize",o),null!=s&&t.setItemVisual(e,"symbolKeepAspect",s)}}:null}}})),Nc({seriesType:"line",plan:Rh(),reset:function(t){var e=t.getData(),c=t.coordinateSystem,d=t.pipelineContext.large;if(c){var f=D(c.dimensions,function(t){return e.mapDimension(t)}).slice(0,2),p=f.length,n=e.getCalculationInfo("stackResultDimension");return _d(e,f[0])&&(f[0]=n),_d(e,f[1])&&(f[1]=n),p&&{progress:function(t,e){for(var n=t.end-t.start,i=d&&new Float32Array(n*p),r=t.start,a=0,o=[],s=[];r<t.end;r++){var l;if(1===p){var h=e.get(f[0],r);l=!isNaN(h)&&c.dataToPoint(h,null,s)}else{h=o[0]=e.get(f[0],r);var u=o[1]=e.get(f[1],r);l=!isNaN(h)&&!isNaN(u)&&c.dataToPoint(o,null,s)}d?(i[a++]=l?l[0]:NaN,i[a++]=l?l[1]:NaN):e.setItemLayout(r,l&&l.slice()||[NaN,NaN])}d&&e.setLayout("symbolPoints",i)}}}}}),Oc(qu.PROCESSOR.STATISTIC,{seriesType:"line",modifyOutputEnd:!0,reset:function(t,e,n){var i=t.getData(),r=t.get("sampling"),a=t.coordinateSystem;if("cartesian2d"===a.type&&r){var o,s=a.getBaseAxis(),l=a.getOtherAxis(s),h=s.getExtent(),u=h[1]-h[0],c=Math.round(i.count()/u);1<c&&("string"==typeof r?o=pf[r]:"function"==typeof r&&(o=r),o&&t.setData(i.downSample(i.mapDimension(l.dim),1/c,o,ff)))}}}),kh.extend({type:"series.__base_bar__",getInitialData:function(t,e){return xd(this.getSource(),this)},getMarkerPosition:function(t){var e=this.coordinateSystem;if(e){var n=e.dataToPoint(e.clampData(t)),i=this.getData(),r=i.getLayout("offset"),a=i.getLayout("size");return n[e.getBaseAxis().isHorizontal()?0:1]+=r+a/2,n}return[NaN,NaN]},defaultOption:{zlevel:0,z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,barMinHeight:0,barMinAngle:0,large:!1,largeThreshold:400,progressive:3e3,progressiveChunkMode:"mod",itemStyle:{},emphasis:{}}}).extend({type:"series.bar",dependencies:["grid","polar"],brushSelector:"rect",getProgressive:function(){return!!this.get("large")&&this.get("progressive")},getProgressiveThreshold:function(){var t=this.get("progressiveThreshold"),e=this.get("largeThreshold");return t<e&&(t=e),t}});var og=lr([["fill","color"],["stroke","borderColor"],["lineWidth","borderWidth"],["stroke","barBorderColor"],["lineWidth","barBorderWidth"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"]]),sg=["itemStyle","barBorderWidth"],lg=[0,0];S(vs.prototype,{getBarItemStyle:function(t){var e=og(this,t);if(this.getBorderLineDash){var n=this.getBorderLineDash();n&&(e.lineDash=n)}return e}}),Wc({type:"bar",render:function(t,e,n){this._updateDrawMode(t);var i=t.get("coordinateSystem");return"cartesian2d"!==i&&"polar"!==i||(this._isLargeDraw?this._renderLarge(t,e,n):this._renderNormal(t,e,n)),this.group},incrementalPrepareRender:function(t,e,n){this._clear(),this._updateDrawMode(t)},incrementalRender:function(t,e,n,i){this._incrementalRenderLarge(t,e)},_updateDrawMode:function(t){var e=t.pipelineContext.large;(null==this._isLargeDraw||e^this._isLargeDraw)&&(this._isLargeDraw=e,this._clear())},_renderNormal:function(a,t,e){var o,s=this.group,l=a.getData(),h=this._data,u=a.coordinateSystem,n=u.getBaseAxis();"cartesian2d"===u.type?o=n.isHorizontal():"polar"===u.type&&(o="angle"===n.dim);var c=a.isAnimationEnabled()?a:null;l.diff(h).add(function(t){if(l.hasValue(t)){var e=l.getItemModel(t),n=dg[u.type](l,t,e),i=hg[u.type](l,t,e,n,o,c);l.setItemGraphicEl(t,i),s.add(i),fg(i,l,t,e,n,a,o,"polar"===u.type)}}).update(function(t,e){var n=h.getItemGraphicEl(e);if(l.hasValue(t)){var i=l.getItemModel(t),r=dg[u.type](l,t,i);n?as(n,{shape:r},c,t):n=hg[u.type](l,t,i,r,o,c,!0),l.setItemGraphicEl(t,n),s.add(n),fg(n,l,t,i,r,a,o,"polar"===u.type)}else s.remove(n)}).remove(function(t){var e=h.getItemGraphicEl(t);"cartesian2d"===u.type?e&&ug(t,c,e):e&&cg(t,c,e)}).execute(),this._data=l},_renderLarge:function(t,e,n){this._clear(),gg(t,this.group)},_incrementalRenderLarge:function(t,e){gg(e,this.group,!0)},dispose:$,remove:function(t){this._clear(t)},_clear:function(e){var t=this.group,n=this._data;e&&e.get("animation")&&n&&!this._isLargeDraw?n.eachItemGraphicEl(function(t){"sector"===t.type?cg(t.dataIndex,e,t):ug(t.dataIndex,e,t)}):t.removeAll(),this._data=null}});var hg={cartesian2d:function(t,e,n,i,r,a,o){var s=new io({shape:S({},i)});if(a){var l=r?"height":"width",h={};s.shape[l]=0,h[l]=i[l],hs[o?"updateProps":"initProps"](s,{shape:h},a,e)}return s},polar:function(t,e,n,i,r,a,o){var s=i.startAngle<i.endAngle,l=new Ya({shape:C({clockwise:s},i)});if(a){var h=r?"r":"endAngle",u={};l.shape[h]=r?0:i.startAngle,u[h]=i[h],hs[o?"updateProps":"initProps"](l,{shape:u},a,e)}return l}};function ug(t,e,n){n.style.text=null,as(n,{shape:{width:0}},e,t,function(){n.parent&&n.parent.remove(n)})}function cg(t,e,n){n.style.text=null,as(n,{shape:{r:n.shape.r0}},e,t,function(){n.parent&&n.parent.remove(n)})}var dg={cartesian2d:function(t,e,n){var i=t.getItemLayout(e),r=function(t,e){var n=t.get(sg)||0;return Math.min(n,Math.abs(e.width),Math.abs(e.height))}(n,i),a=0<i.width?1:-1,o=0<i.height?1:-1;return{x:i.x+a*r/2,y:i.y+o*r/2,width:i.width-a*r,height:i.height-o*r}},polar:function(t,e,n){var i=t.getItemLayout(e);return{cx:i.cx,cy:i.cy,r0:i.r0,r:i.r,startAngle:i.startAngle,endAngle:i.endAngle}}};function fg(t,e,n,i,r,a,o,s){var l=e.getItemVisual(n,"color"),h=e.getItemVisual(n,"opacity"),u=i.getModel("itemStyle"),c=i.getModel("emphasis.itemStyle").getBarItemStyle();s||t.setShape("r",u.get("barBorderRadius")||0),t.useStyle(C({fill:l,opacity:h},u.getBarItemStyle()));var d=i.getShallow("cursor");d&&t.attr("cursor",d);o?r.height:r.width;s||function(t,e,n,i,r,a){$o(t,e,n.getModel("label"),n.getModel("emphasis.label"),{labelFetcher:r,labelDataIndex:a,defaultText:Ad(r.getData(),a),isRectText:!0,autoColor:i}),ag(t),ag(e)}(t.style,c,i,l,a,n),Yo(t,c)}var pg=Ma.extend({type:"largeBar",shape:{points:[]},buildPath:function(t,e){for(var n=e.points,i=this.__startPoint,r=this.__baseDimIdx,a=0;a<n.length;a+=2)i[r]=n[a+r],t.moveTo(i[0],i[1]),t.lineTo(n[a],n[a+1])}});function gg(t,e,n){var i=t.getData(),r=[],a=i.getLayout("valueAxisHorizontal")?1:0;r[1-a]=i.getLayout("valueAxisStart");var o=new pg({shape:{points:i.getLayout("largePoints")},incremental:!!n,__startPoint:r,__baseDimIdx:a,__largeDataIndices:i.getLayout("largeDataIndices"),__barWidth:i.getLayout("barWidth")});e.add(o),function(t,e,n){var i=n.getVisual("borderColor")||n.getVisual("color"),r=e.getModel("itemStyle").getItemStyle(["color","borderColor"]);t.useStyle(r),t.style.fill=null,t.style.stroke=i,t.style.lineWidth=n.getLayout("barWidth")}(o,t,i),o.seriesIndex=t.seriesIndex,t.get("silent")||(o.on("mousedown",vg),o.on("mousemove",vg))}var vg=jh(function(t){var e=function(t,e,n){var i=t.__baseDimIdx,r=1-i,a=t.shape.points,o=t.__largeDataIndices,s=Math.abs(t.__barWidth/2),l=t.__startPoint[r];lg[0]=e,lg[1]=n;for(var h=lg[i],u=lg[1-i],c=h-s,d=h+s,f=0,p=a.length/2;f<p;f++){var g=2*f,v=a[g+i],m=a[g+r];if(c<=v&&v<=d&&(l<=m?l<=u&&u<=m:m<=u&&u<=l))return o[f]}return-1}(this,t.offsetX,t.offsetY);this.dataIndex=0<=e?e:null},30,!1);Nc(qu.VISUAL.LAYOUT,I(function(t,e){var n=Pf(t,e),T=Of(n),C={};k(n,function(t){var e=t.getData(),n=t.coordinateSystem,i=n.getBaseAxis(),r=Af(t),a=T[Lf(i)][r],o=a.offset,s=a.width,l=n.getOtherAxis(i),h=t.get("barMinHeight")||0;C[r]=C[r]||[],e.setLayout({offset:o,size:s});for(var u=e.mapDimension(l.dim),c=e.mapDimension(i.dim),d=_d(e,u),f=l.isHorizontal(),p=Rf(i,l,d),g=0,v=e.count();g<v;g++){var m=e.get(u,g),y=e.get(c,g);if(!isNaN(m)&&!isNaN(y)){var _,x,w,b,S,M=0<=m?"p":"n",I=p;if(d&&(C[r][y]||(C[r][y]={p:p,n:p}),I=C[r][y][M]),f)_=I,x=(S=n.dataToPoint([m,y]))[1]+o,w=S[0]-p,b=s,Math.abs(w)<h&&(w=(w<0?-1:1)*h),d&&(C[r][y][M]+=w);else _=(S=n.dataToPoint([y,m]))[0]+o,x=I,w=s,b=S[1]-p,Math.abs(b)<h&&(b=(b<=0?-1:1)*h),d&&(C[r][y][M]+=b);e.setItemLayout(g,{x:_,y:x,width:w,height:b})}}},this)},"bar")),Nc(qu.VISUAL.PROGRESSIVE_LAYOUT,Nf),Bc({seriesType:"bar",reset:function(t){t.getData().setVisual("legendSymbol","roundRect")}});var mg={updateSelectedMap:function(t){this._targetList=A(t)?t.slice():[],this._selectTargetMap=M(t||[],function(t,e){return t.set(e.name,e),t},Z())},select:function(t,e){var n=null!=e?this._targetList[e]:this._selectTargetMap.get(t);"single"===this.get("selectedMode")&&this._selectTargetMap.each(function(t){t.selected=!1}),n&&(n.selected=!0)},unSelect:function(t,e){var n=null!=e?this._targetList[e]:this._selectTargetMap.get(t);n&&(n.selected=!1)},toggleSelected:function(t,e){var n=null!=e?this._targetList[e]:this._selectTargetMap.get(t);if(null!=n)return this[n.selected?"unSelect":"select"](t,e),n.selected},isSelected:function(t,e){var n=null!=e?this._targetList[e]:this._selectTargetMap.get(t);return n&&n.selected}},yg=Vc({type:"series.pie",init:function(t){yg.superApply(this,"init",arguments),this.legendDataProvider=function(){return this.getRawData()},this.updateSelectedMap(this._createSelectableList()),this._defaultLabelLine(t)},mergeOption:function(t){yg.superCall(this,"mergeOption",t),this.updateSelectedMap(this._createSelectableList())},getInitialData:function(t,e){return function(t,e,n){e=A(e)&&{coordDimensions:e}||S({},e);var i=t.getSource(),r=yd(i,e),a=new id(r,t);return a.initData(i,n),a}(this,["value"])},_createSelectableList:function(){for(var t=this.getRawData(),e=t.mapDimension("value"),n=[],i=0,r=t.count();i<r;i++)n.push({name:t.getName(i),value:t.get(e,i),selected:ch(t,i,"selected")});return n},getDataParams:function(t){var e=this.getData(),n=yg.superCall(this,"getDataParams",t),i=[];return e.each(e.mapDimension("value"),function(t){i.push(t)}),n.percent=function(t,e,n){if(!t[e])return 0;var i=M(t,function(t,e){return t+(isNaN(e)?0:e)},0);if(0===i)return 0;for(var r=Math.pow(10,n),a=D(t,function(t){return(isNaN(t)?0:t)/i*r*100}),o=100*r,s=D(a,function(t){return Math.floor(t)}),l=M(s,function(t,e){return t+e},0),h=D(a,function(t,e){return t-s[e]});l<o;){for(var u=Number.NEGATIVE_INFINITY,c=null,d=0,f=h.length;d<f;++d)h[d]>u&&(u=h[d],c=d);++s[c],h[c]=0,++l}return s[e]/r}(i,t,e.hostModel.get("percentPrecision")),n.$vars.push("percent"),n},_defaultLabelLine:function(t){Wi(t,"labelLine",["show"]);var e=t.labelLine,n=t.emphasis.labelLine;e.show=e.show&&t.label.show,n.show=n.show&&t.emphasis.label.show},defaultOption:{zlevel:0,z:2,legendHoverLink:!0,hoverAnimation:!0,center:["50%","50%"],radius:[0,"75%"],clockwise:!0,startAngle:90,minAngle:0,minShowLabelAngle:0,selectedOffset:10,hoverOffset:10,avoidLabelOverlap:!0,percentPrecision:2,stillShowZeroSum:!0,label:{rotate:!1,show:!0,position:"outer"},labelLine:{show:!0,length:15,length2:15,smooth:!1,lineStyle:{width:1,type:"solid"}},itemStyle:{borderWidth:1},animationType:"expansion",animationEasing:"cubicOut"}});function _g(t,e,n,i){var r=e.getData(),a=this.dataIndex,o=r.getName(a),s=e.get("selectedOffset");i.dispatchAction({type:"pieToggleSelect",from:t,name:o,seriesId:e.id}),r.each(function(t){xg(r.getItemGraphicEl(t),r.getItemLayout(t),e.isSelected(r.getName(t)),s,n)})}function xg(t,e,n,i,r){var a=(e.startAngle+e.endAngle)/2,o=n?i:0,s=[Math.cos(a)*o,Math.sin(a)*o];r?t.animate().when(200,{position:s}).start("bounceOut"):t.attr("position",s)}function wg(t,e){Ye.call(this);var n=new Ya({z2:2}),i=new Ka,r=new Ha;this.add(n),this.add(i),this.add(r),this.updateData(t,e,!0)}_(yg,mg);var bg=wg.prototype;bg.updateData=function(t,e,n){var i=this.childAt(0),r=this.childAt(1),a=this.childAt(2),o=t.hostModel,s=t.getItemModel(e),l=t.getItemLayout(e),h=S({},l);(h.label=null,n)?(i.setShape(h),"scale"===o.getShallow("animationType")?(i.shape.r=l.r0,os(i,{shape:{r:l.r}},o,e)):(i.shape.endAngle=l.startAngle,as(i,{shape:{endAngle:l.endAngle}},o,e))):as(i,{shape:h},o,e);var u=t.getItemVisual(e,"color");i.useStyle(C({lineJoin:"bevel",fill:u},s.getModel("itemStyle").getItemStyle())),i.hoverStyle=s.getModel("emphasis.itemStyle").getItemStyle();var c=s.getShallow("cursor");c&&i.attr("cursor",c),xg(this,t.getItemLayout(e),o.isSelected(null,e),o.get("selectedOffset"),o.get("animation")),this._updateLabel(t,e),this.highDownOnUpdate=s.get("hoverAnimation")&&o.isAnimationEnabled()?function(t,e){"emphasis"===e?(r.ignore=r.hoverIgnore,a.ignore=a.hoverIgnore,i.stopAnimation(!0),i.animateTo({shape:{r:l.r+o.get("hoverOffset")}},300,"elasticOut")):(r.ignore=r.normalIgnore,a.ignore=a.normalIgnore,i.stopAnimation(!0),i.animateTo({shape:{r:l.r}},300,"elasticOut"))}:null,Yo(this)},bg._updateLabel=function(t,e){var n=this.childAt(1),i=this.childAt(2),r=t.hostModel,a=t.getItemModel(e),o=t.getItemLayout(e).label,s=t.getItemVisual(e,"color");if(!o||isNaN(o.x)||isNaN(o.y))i.ignore=i.normalIgnore=i.hoverIgnore=n.ignore=n.normalIgnore=n.hoverIgnore=!0;else{as(n,{shape:{points:o.linePoints||[[o.x,o.y],[o.x,o.y],[o.x,o.y]]}},r,e),as(i,{style:{x:o.x,y:o.y}},r,e),i.attr({rotation:o.rotation,origin:[o.x,o.y],z2:10});var l=a.getModel("label"),h=a.getModel("emphasis.label"),u=a.getModel("labelLine"),c=a.getModel("emphasis.labelLine");s=t.getItemVisual(e,"color");$o(i.style,i.hoverStyle={},l,h,{labelFetcher:t.hostModel,labelDataIndex:e,defaultText:t.getName(e),autoColor:s,useInsideStyle:!!o.inside},{textAlign:o.textAlign,textVerticalAlign:o.verticalAlign,opacity:t.getItemVisual(e,"opacity")}),i.ignore=i.normalIgnore=!l.get("show"),i.hoverIgnore=!h.get("show"),n.ignore=n.normalIgnore=!u.get("show"),n.hoverIgnore=!c.get("show"),n.setStyle({stroke:s,opacity:t.getItemVisual(e,"opacity")}),n.setStyle(u.getModel("lineStyle").getLineStyle()),n.hoverStyle=c.getModel("lineStyle").getLineStyle();var d=u.get("smooth");d&&!0===d&&(d=.4),n.setShape({smooth:d})}},y(wg,Ye);Wh.extend({type:"pie",init:function(){var t=new Ye;this._sectorGroup=t},render:function(t,e,n,i){if(!i||i.from!==this.uid){var r=t.getData(),a=this._data,o=this.group,s=e.get("animation"),l=!a,h=t.get("animationType"),u=I(_g,this.uid,t,s,n),c=t.get("selectedMode");if(r.diff(a).add(function(t){var e=new wg(r,t);l&&"scale"!==h&&e.eachChild(function(t){t.stopAnimation(!0)}),c&&e.on("click",u),r.setItemGraphicEl(t,e),o.add(e)}).update(function(t,e){var n=a.getItemGraphicEl(e);n.updateData(r,t),n.off("click"),c&&n.on("click",u),o.add(n),r.setItemGraphicEl(t,n)}).remove(function(t){var e=a.getItemGraphicEl(t);o.remove(e)}).execute(),s&&l&&0<r.count()&&"scale"!==h){for(var d=r.getItemLayout(0),f=1;isNaN(d.startAngle)&&f<r.count();++f)d=r.getItemLayout(f);var p=Math.max(n.getWidth(),n.getHeight())/2,g=w(o.removeClipPath,o);o.setClipPath(this._createClipPath(d.cx,d.cy,p,d.startAngle,d.clockwise,g,t))}else o.removeClipPath();this._data=r}},dispose:function(){},_createClipPath:function(t,e,n,i,r,a,o){var s=new Ya({shape:{cx:t,cy:e,r0:0,r:n,startAngle:i,endAngle:i,clockwise:r}});return os(s,{shape:{endAngle:i+(r?1:-1)*Math.PI*2}},o,a),s},containPoint:function(t,e){var n=e.getData().getItemLayout(0);if(n){var i=t[0]-n.cx,r=t[1]-n.cy,a=Math.sqrt(i*i+r*r);return a<=n.r&&a>=n.r0}}});var Sg=Math.PI/180;function Mg(r,t,e,n,i,a,o){function s(t,e,n){for(var i=t;i<e;i++)if(r[i].y+=n,t<i&&i+1<e&&r[i+1].y>r[i].y+r[i].height)return void l(i,n/2);l(e-1,n/2)}function l(t,e){for(var n=t;0<=n&&(r[n].y-=e,!(0<n&&r[n].y>r[n-1].y+r[n-1].height));n--);}function h(t,e,n,i,r,a){for(var o=e?Number.MAX_VALUE:0,s=0,l=t.length;s<l;s++){var h=Math.abs(t[s].y-i),u=t[s].len,c=t[s].len2,d=h<r+u?Math.sqrt((r+u+c)*(r+u+c)-h*h):Math.abs(t[s].x-n);e&&o<=d&&(d=o-10),!e&&d<=o&&(d=o+10),t[s].x=n+d*a,o=d}}r.sort(function(t,e){return t.y-e.y});for(var u,c=0,d=r.length,f=[],p=[],g=0;g<d;g++)(u=r[g].y-c)<0&&s(g,d,-u),c=r[g].y+r[g].height;o-c<0&&l(d-1,c-o);for(g=0;g<d;g++)r[g].y>=e?p.push(r[g]):f.push(r[g]);h(f,!1,t,e,n,i),h(p,!0,t,e,n,i)}function Ig(t){return"center"===t.position}function Tg(I,T,t,e,n){var C,k,D=I.getData(),A=[],L=!1,P=(I.get("minShowLabelAngle")||0)*Sg;D.each(function(t){var e=D.getItemLayout(t),n=D.getItemModel(t),i=n.getModel("label"),r=i.get("position")||n.get("emphasis.label.position"),a=n.getModel("labelLine"),o=a.get("length"),s=a.get("length2");if(!(e.angle<P)){var l,h,u,c,d=(e.startAngle+e.endAngle)/2,f=Math.cos(d),p=Math.sin(d);C=e.cx,k=e.cy;var g="inside"===r||"inner"===r;if("center"===r)l=e.cx,h=e.cy,c="center";else{var v=(g?(e.r+e.r0)/2*f:e.r*f)+C,m=(g?(e.r+e.r0)/2*p:e.r*p)+k;if(l=v+3*f,h=m+3*p,!g){var y=v+f*(o+T-e.r),_=m+p*(o+T-e.r),x=y+(f<0?-1:1)*s;l=x+(f<0?-5:5),u=[[v,m],[y,_],[x,h=_]]}c=g?"center":0<f?"left":"right"}var w,b=i.getFont(),S=i.get("rotate");w="number"==typeof S?S*(Math.PI/180):S?f<0?-d+Math.PI:-d:0;var M=Pn(I.getFormattedLabel(t,"normal")||D.getName(t),b,c,"top");L=!!w,e.label={x:l,y:h,position:r,height:M.height,len:o,len2:s,linePoints:u,textAlign:c,verticalAlign:"middle",rotation:w,inside:g},g||A.push(e.label)}}),!L&&I.get("avoidLabelOverlap")&&function(t,e,n,i,r,a){for(var o=[],s=[],l=0;l<t.length;l++)Ig(t[l])||(t[l].x<e?o.push(t[l]):s.push(t[l]));for(Mg(s,e,n,i,1,0,a),Mg(o,e,n,i,-1,0,a),l=0;l<t.length;l++)if(!Ig(t[l])){var h=t[l].linePoints;if(h){var u=h[1][0]-h[2][0];t[l].x<e?h[2][0]=t[l].x+3:h[2][0]=t[l].x-3,h[1][1]=h[2][1]=t[l].y,h[1][0]=h[2][0]+u}}}(A,C,k,T,0,e)}var Cg,kg,Dg=2*Math.PI,Ag=Math.PI/180;Cg="pie",k([{type:"pieToggleSelect",event:"pieselectchanged",method:"toggleSelected"},{type:"pieSelect",event:"pieselected",method:"select"},{type:"pieUnSelect",event:"pieunselected",method:"unSelect"}],function(a){a.update="updateView",Ec(a,function(t,e){var r={};return e.eachComponent({mainType:"series",subType:Cg,query:t},function(n){n[a.method]&&n[a.method](t.name,t.dataIndex);var i=n.getData();i.each(function(t){var e=i.getName(t);r[e]=n.isSelected(e)||!1})}),{name:t.name,selected:r,seriesId:t.seriesId}})}),Bc((kg="pie",{getTargetSeries:function(t){var e={},n=Z();return t.eachSeriesByType(kg,function(t){t.__paletteScope=e,n.set(t.uid,t)}),n},reset:function(r,t){var a=r.getRawData(),o={},s=r.getData();s.each(function(t){var e=s.getRawIndex(t);o[e]=t}),a.each(function(t){var e=o[t],n=null!=e&&s.getItemVisual(e,"color",!0);if(n)a.setItemVisual(t,"color",n);else{var i=a.getItemModel(t).get("itemStyle.color")||r.getColorFromPalette(a.getName(t)||t+"",r.__paletteScope,a.count());a.setItemVisual(t,"color",i),null!=e&&s.setItemVisual(e,"color",i)}})}})),Nc(I(function(t,e,T,n){e.eachSeriesByType(t,function(t){var r=t.getData(),e=r.mapDimension("value"),n=t.get("center"),i=t.get("radius");A(i)||(i=[0,i]),A(n)||(n=[n,n]);var a=T.getWidth(),o=T.getHeight(),s=Math.min(a,o),l=Ss(n[0],a),h=Ss(n[1],o),u=Ss(i[0],s/2),c=Ss(i[1],s/2),d=-t.get("startAngle")*Ag,f=t.get("minAngle")*Ag,p=0;r.each(e,function(t){isNaN(t)||p++});var g=r.getSum(e),v=Math.PI/(g||p)*2,m=t.get("clockwise"),y=t.get("roseType"),_=t.get("stillShowZeroSum"),x=r.getDataExtent(e);x[0]=0;var w=Dg,b=0,S=d,M=m?1:-1;if(r.each(e,function(t,e){var n;if(isNaN(t))r.setItemLayout(e,{angle:NaN,startAngle:NaN,endAngle:NaN,clockwise:m,cx:l,cy:h,r0:u,r:y?NaN:c});else{(n="area"!==y?0===g&&_?v:t*v:Dg/p)<f?w-=n=f:b+=t;var i=S+M*n;r.setItemLayout(e,{angle:n,startAngle:S,endAngle:i,clockwise:m,cx:l,cy:h,r0:u,r:y?bs(t,x,[u,c]):c}),S=i}}),w<Dg&&p)if(w<=.001){var I=Dg/p;r.each(e,function(t,e){if(!isNaN(t)){var n=r.getItemLayout(e);n.angle=I,n.startAngle=d+M*e*I,n.endAngle=d+M*(e+1)*I}})}else v=w/b,S=d,r.each(e,function(t,e){if(!isNaN(t)){var n=r.getItemLayout(e),i=n.angle===f?f:t*v;n.startAngle=S,n.endAngle=S+M*i,S+=M*i}});Tg(t,c,0,o)})},"pie")),Oc({seriesType:"pie",reset:function(t,e){var i=e.findComponents({mainType:"legend"});if(i&&i.length){var r=t.getData();r.filterSelf(function(t){for(var e=r.getName(t),n=0;n<i.length;n++)if(!i[n].isSelected(e))return!1;return!0})}}}),t.version="4.3.0",t.dependencies={zrender:"4.1.0"},t.PRIORITY=qu,t.init=function(t,e,n){var i=Ac(t);if(i)return i;var r=new Ku(t,e,n);return r.id="ec_"+Ic++,Sc[r.id]=r,Qi(t,Cc,r.id),function(i){var r="__connectUpdateStatus";function a(t,e){for(var n=0;n<t.length;n++){t[n][r]=e}}Wu(vc,function(t,e){i._messageCenter.on(e,function(t){if(Mc[i.group]&&0!==i[r]){if(t&&t.escapeConnect)return;var e=i.makeActionFromEvent(t),n=[];Wu(Sc,function(t){t!==i&&t.group===i.group&&n.push(t)}),a(n,0),Wu(n,function(t){1!==t[r]&&t.dispatchAction(e)}),a(n,2)}})})}(r),r},t.connect=function(e){if(A(e)){var t=e;e=null,Wu(t,function(t){null!=t.group&&(e=t.group)}),e=e||"g_"+Tc++,Wu(t,function(t){t.group=e})}return Mc[e]=!0,e},t.disConnect=kc,t.disconnect=Dc,t.dispose=function(t){"string"==typeof t?t=Sc[t]:t instanceof Ku||(t=Ac(t)),t instanceof Ku&&!t.isDisposed()&&t.dispose()},t.getInstanceByDom=Ac,t.getInstanceById=function(t){return Sc[t]},t.registerTheme=Lc,t.registerPreprocessor=Pc,t.registerProcessor=Oc,t.registerPostUpdate=function(t){_c.push(t)},t.registerAction=Ec,t.registerCoordinateSystem=function(t,e){Dl.register(t,e)},t.getCoordinateSystemDimensions=function(t){var e=Dl.get(t);if(e)return e.getDimensionsInfo?e.getDimensionsInfo():e.dimensions.slice()},t.registerLayout=Nc,t.registerVisual=Bc,t.registerLoading=Rc,t.extendComponentModel=function(t){return Js.extend(t)},t.extendComponentView=Fc,t.extendSeriesModel=Vc,t.extendChartView=Wc,t.setCanvasCreator=function(t){!function(t,e){"createCanvas"===t&&(g=null),a[t]=e}("createCanvas",t)},t.registerMap=function(t,e,n){zu(t,e,n)},t.getMap=function(t){var e=Ru(t);return e&&e[0]&&{geoJson:e[0].geoJSON,specialAreas:e[0].specialAreas}},t.dataTool={}});
