{"version":3,"sources":["webpack:///./node_modules/zrender/lib/core/timsort.js","webpack:///./node_modules/zrender/lib/core/GestureMgr.js","webpack:///./node_modules/zrender/lib/core/matrix.js","webpack:///./node_modules/zrender/lib/core/PathProxy.js","webpack:///./node_modules/zrender/lib/core/env.js","webpack:///./node_modules/zrender/lib/core/vector.js","webpack:///./node_modules/zrender/lib/core/log.js","webpack:///./node_modules/zrender/lib/core/curve.js","webpack:///./node_modules/zrender/lib/core/event.js","webpack:///./node_modules/zrender/lib/core/dom.js","webpack:///./node_modules/zrender/lib/core/util.js","webpack:///./node_modules/zrender/lib/core/fourPointsTransform.js","webpack:///./node_modules/zrender/lib/core/BoundingRect.js","webpack:///./node_modules/zrender/lib/dom/HandlerProxy.js","webpack:///./node_modules/zrender/lib/core/LRU.js","webpack:///./node_modules/zrender/lib/core/guid.js","webpack:///./node_modules/zrender/lib/core/bbox.js"],"names":["DEFAULT_MIN_MERGE","DEFAULT_MIN_GALLOPING","minRunLength","n","r","makeAscendingRun","array","lo","hi","compare","runHi","reverseRun","t","binaryInsertionSort","start","mid","pivot","left","right","gallopLeft","value","length","hint","lastOffset","maxOffset","offset","tmp","m","gallopRight","TimSort","runStart","runLength","minGallop","stackSize","pushRun","_runStart","_runLength","mergeRuns","mergeAt","forceMergeRuns","i","start1","length1","start2","length2","k","mergeLow","mergeHigh","cursor1","cursor2","dest","count1","count2","exit","_minGallop","Error","customCursor","customDest","this","sort","remaining","ts","minRun","force","module","exports","eventUtil","GestureMgr","_track","dist","pointPair","dx","dy","Math","sqrt","center","prototype","constructor","recognize","event","target","root","_doTrack","_recognize","clear","touches","trackItem","points","len","touch","pos","clientToLocal","push","zrX","zrY","eventName","recognizers","hasOwnProperty","gestureInfo","pinch","track","trackLen","pinchEnd","pinchPre","pinchScale","isFinite","pinchCenter","pinchX","pinchY","type","_default","ArrayCtor","Float32Array","Array","create","out","identity","copy","mul","m1","m2","out0","out1","out2","out3","out4","out5","translate","a","v","rotate","rad","aa","ac","atx","ab","ad","aty","st","sin","ct","cos","scale","vx","vy","invert","det","clone","b","curve","vec2","bbox","BoundingRect","_config","dpr","devicePixelRatio","CMD","M","L","C","Q","A","Z","R","min","max","min2","max2","mathMin","mathMax","mathCos","mathSin","mathSqrt","mathAbs","abs","hasTypedArray","PathProxy","notSaveData","_saveData","data","_ctx","_xi","_yi","_x0","_y0","_ux","_uy","_len","_lineDash","_dashOffset","_dashIdx","_dashSum","setScale","sx","sy","segmentIgnoreThreshold","getContext","beginPath","ctx","moveTo","x","y","addData","lineTo","exceedUnit","_needsDash","_dashedLineTo","bezierCurveTo","x1","y1","x2","y2","x3","y3","_dashedBezierTo","quadraticCurveTo","_dashedQuadraticTo","arc","cx","cy","startAngle","endAngle","anticlockwise","arcTo","radius","rect","w","h","closePath","x0","y0","fill","toStatic","stroke","setLineDash","lineDash","lineDashSum","setLineDashOffset","setData","appendPath","path","appendSize","appendPathData","cmd","arguments","_expandData","_prevCmd","newData","dash","idx","dashSum","nDash","cubicAt","bezierLen","tmpLen","getBoundingRect","Number","MAX_VALUE","xi","yi","fromLine","fromCubic","fromQuadratic","rx","ry","fromArc","width","height","rebuildPath","d","ux","uy","theta","dTheta","psi","fs","scaleX","scaleY","isEllipse","env","wx","getSystemInfoSync","browser","os","node","wxa","canvasSupported","svgSupported","touchEventsSupported","domSupported","document","self","worker","navigator","detect","userAgent","ua","firefox","match","ie","edge","weChat","test","version","createElement","SVGRect","window","pointerEventsSupported","set","add","v1","v2","scaleAndAdd","sub","lenSquare","lengthSquare","div","dot","s","normalize","distance","distanceSquare","distSquare","negate","lerp","applyTransform","debugMode","logError","console","error","_vector","v2Create","v2DistSquare","mathPow","pow","EPSILON","EPSILON_NUMERIC","THREE_SQRT","ONE_THIRD","_v0","_v1","_v2","isAroundZero","val","isNotAroundZero","p0","p1","p2","p3","onet","cubicDerivativeAt","cubicRootAt","roots","c","B","t1","disc","K","t2","discSqrt","Y1","Y2","T","acos","ASqrt","t3","cubicExtrema","extrema","cubicSubdivide","p01","p12","p23","p012","p123","p0123","cubicProjectPoint","prev","next","d1","d2","interval","Infinity","_t","quadraticAt","quadraticDerivativeAt","quadraticRootAt","quadraticExtremum","divider","quadraticSubdivide","quadraticProjectPoint","Eventful","Dispatcher","_dom","isCanvasEl","transformCoordWithViewport","isDomLevel2","addEventListener","MOUSE_EVENT_REG","_calcOut","el","e","calculate","calculateZrXY","layerX","offsetX","layerY","offsetY","getBoundingClientRect","ex","clientX","ey","clientY","box","top","getNativeEvent","normalizeEvent","eventType","isTouch","indexOf","targetTouches","changedTouches","zrDelta","wheelDelta","detail","button","which","undefined","name","handler","opt","attachEvent","removeEventListener","detachEvent","stop","preventDefault","stopPropagation","cancelBubble","returnValue","isMiddleOrRightButtonOnMouseUpDown","notLeftMouse","_fourPointsTransform","buildTransformer","EVENT_SAVED_PROP","transformLocalCoord","elFrom","elTarget","inX","inY","inverse","saved","markers","prepareCoordMarkers","transformer","preparePointerTransformer","propLR","propTB","marker","stl","style","idxLR","idxTB","cssText","join","appendChild","transformerName","oldSrcCoords","srcCoords","oldCoordTheSame","destCoords","ii","offsetLeft","offsetTop","nodeName","toUpperCase","BUILTIN_OBJECT","TYPED_ARRAY","objToString","Object","toString","arrayProto","nativeForEach","forEach","nativeFilter","filter","nativeSlice","slice","nativeMap","map","nativeReduce","reduce","methods","$override","fn","source","result","typeStr","call","isPrimitive","Ctor","from","isDom","key","merge","overwrite","isObject","targetProp","sourceProp","isArray","isBuiltInObject","mergeAll","targetAndSources","extend","defaults","overlay","createCanvas","inherits","clazz","baseClazz","clazzPrototype","F","prop","superClass","mixin","isArrayLike","each","obj","cb","context","memo","find","bind","func","args","apply","concat","curry","isFunction","isString","isTypedArray","nodeType","ownerDocument","eqNaN","retrieve","values","retrieve2","value0","value1","retrieve3","value2","Function","normalizeCssArray","assert","condition","message","trim","str","replace","primitiveKey","setAsPrimitive","HashMap","isArr","thisMap","visit","createHashMap","concatArray","newArray","noop","get","removeKey","LN2","log","determinant","rows","rank","rowStart","rowMask","colMask","detCache","cacheKey","fullRank","colStart","round","subRowMask","subRowStart","sum","j","colLocalIdx","colTag","src","mA","vh","srcPointX","srcPointY","pk","matrix","v2ApplyTransform","union","other","lt","rb","lb","rt","maxX","maxY","calculateTransform","intersect","ax0","ax1","ay0","ay1","bx0","bx1","by0","by1","contain","plain","_event","zrUtil","TOUCH_CLICK_DELAY","globalEventSupported","localNativeListenerNames","mouseHandlerNames","touchHandlerNames","pointerEventNameMap","pointerdown","pointerup","pointermove","pointerout","pointerHandlerNames","nm","mouse","pointer","globalNativeListenerNames","eventNameFix","isPointerFromTouch","pointerType","setTouchTimer","scope","touching","touchTimer","clearTimeout","setTimeout","markTouch","zrByTouch","normalizeGlobalEvent","instance","dom","FakeGlobalEvent","isLocalEl","elTmp","isLocal","domBelongToZr","painterRoot","parentNode","currentTarget","fakeGlobalEventProto","stopImmediatePropagation","localDOMHandlers","mousedown","_mayPointerCapture","trigger","mousemove","downPoint","togglePointerCapture","mouseup","mouseout","_pointerCapturing","zrEventControl","element","toElement","relatedTarget","zrIsToLocalDOM","touchstart","_lastTouchMoment","Date","processGesture","touchmove","touchend","click","globalDOMHandlers","pointerCaptureReleasing","mountLocalDOMEventListeners","domHandlers","nativeEventName","mountSingleDOMEventListener","mountGlobalDOMEventListeners","mount","nativeEventListener","capture","listener","mounted","listenerOpts","domTarget","unmountDOMEventListeners","isPointerCapturing","globalHandlerScope","_globalHandlerScope","DOMHandlerScope","HandlerDomProxy","_localHandlerScope","handlerDomProxyProto","dispose","setCursor","cursorStyle","cursor","LinkedList","head","tail","linkedListProto","insert","entry","Entry","insertEntry","remove","LRU","maxSize","_list","_map","_maxSize","_lastRemovedEntry","LRUProto","put","list","removed","leastUsedEntry","idStart","PI2","PI","end","extremity","fromPoints","p","bottom","xDim","yDim","tx","ty","vec2Min","vec2Max","diff","angle"],"mappings":"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","file":"js/chunk-40ee8a22.b832c5e4.js","sourcesContent":["// https://github.com/mziccard/node-timsort\nvar DEFAULT_MIN_MERGE = 32;\nvar DEFAULT_MIN_GALLOPING = 7;\nvar DEFAULT_TMP_STORAGE_LENGTH = 256;\n\nfunction minRunLength(n) {\n var r = 0;\n\n while (n >= DEFAULT_MIN_MERGE) {\n r |= n & 1;\n n >>= 1;\n }\n\n return n + r;\n}\n\nfunction makeAscendingRun(array, lo, hi, compare) {\n var runHi = lo + 1;\n\n if (runHi === hi) {\n return 1;\n }\n\n if (compare(array[runHi++], array[lo]) < 0) {\n while (runHi < hi && compare(array[runHi], array[runHi - 1]) < 0) {\n runHi++;\n }\n\n reverseRun(array, lo, runHi);\n } else {\n while (runHi < hi && compare(array[runHi], array[runHi - 1]) >= 0) {\n runHi++;\n }\n }\n\n return runHi - lo;\n}\n\nfunction reverseRun(array, lo, hi) {\n hi--;\n\n while (lo < hi) {\n var t = array[lo];\n array[lo++] = array[hi];\n array[hi--] = t;\n }\n}\n\nfunction binaryInsertionSort(array, lo, hi, start, compare) {\n if (start === lo) {\n start++;\n }\n\n for (; start < hi; start++) {\n var pivot = array[start];\n var left = lo;\n var right = start;\n var mid;\n\n while (left < right) {\n mid = left + right >>> 1;\n\n if (compare(pivot, array[mid]) < 0) {\n right = mid;\n } else {\n left = mid + 1;\n }\n }\n\n var n = start - left;\n\n switch (n) {\n case 3:\n array[left + 3] = array[left + 2];\n\n case 2:\n array[left + 2] = array[left + 1];\n\n case 1:\n array[left + 1] = array[left];\n break;\n\n default:\n while (n > 0) {\n array[left + n] = array[left + n - 1];\n n--;\n }\n\n }\n\n array[left] = pivot;\n }\n}\n\nfunction gallopLeft(value, array, start, length, hint, compare) {\n var lastOffset = 0;\n var maxOffset = 0;\n var offset = 1;\n\n if (compare(value, array[start + hint]) > 0) {\n maxOffset = length - hint;\n\n while (offset < maxOffset && compare(value, array[start + hint + offset]) > 0) {\n lastOffset = offset;\n offset = (offset << 1) + 1;\n\n if (offset <= 0) {\n offset = maxOffset;\n }\n }\n\n if (offset > maxOffset) {\n offset = maxOffset;\n }\n\n lastOffset += hint;\n offset += hint;\n } else {\n maxOffset = hint + 1;\n\n while (offset < maxOffset && compare(value, array[start + hint - offset]) <= 0) {\n lastOffset = offset;\n offset = (offset << 1) + 1;\n\n if (offset <= 0) {\n offset = maxOffset;\n }\n }\n\n if (offset > maxOffset) {\n offset = maxOffset;\n }\n\n var tmp = lastOffset;\n lastOffset = hint - offset;\n offset = hint - tmp;\n }\n\n lastOffset++;\n\n while (lastOffset < offset) {\n var m = lastOffset + (offset - lastOffset >>> 1);\n\n if (compare(value, array[start + m]) > 0) {\n lastOffset = m + 1;\n } else {\n offset = m;\n }\n }\n\n return offset;\n}\n\nfunction gallopRight(value, array, start, length, hint, compare) {\n var lastOffset = 0;\n var maxOffset = 0;\n var offset = 1;\n\n if (compare(value, array[start + hint]) < 0) {\n maxOffset = hint + 1;\n\n while (offset < maxOffset && compare(value, array[start + hint - offset]) < 0) {\n lastOffset = offset;\n offset = (offset << 1) + 1;\n\n if (offset <= 0) {\n offset = maxOffset;\n }\n }\n\n if (offset > maxOffset) {\n offset = maxOffset;\n }\n\n var tmp = lastOffset;\n lastOffset = hint - offset;\n offset = hint - tmp;\n } else {\n maxOffset = length - hint;\n\n while (offset < maxOffset && compare(value, array[start + hint + offset]) >= 0) {\n lastOffset = offset;\n offset = (offset << 1) + 1;\n\n if (offset <= 0) {\n offset = maxOffset;\n }\n }\n\n if (offset > maxOffset) {\n offset = maxOffset;\n }\n\n lastOffset += hint;\n offset += hint;\n }\n\n lastOffset++;\n\n while (lastOffset < offset) {\n var m = lastOffset + (offset - lastOffset >>> 1);\n\n if (compare(value, array[start + m]) < 0) {\n offset = m;\n } else {\n lastOffset = m + 1;\n }\n }\n\n return offset;\n}\n\nfunction TimSort(array, compare) {\n var minGallop = DEFAULT_MIN_GALLOPING;\n var length = 0;\n var tmpStorageLength = DEFAULT_TMP_STORAGE_LENGTH;\n var stackLength = 0;\n var runStart;\n var runLength;\n var stackSize = 0;\n length = array.length;\n\n if (length < 2 * DEFAULT_TMP_STORAGE_LENGTH) {\n tmpStorageLength = length >>> 1;\n }\n\n var tmp = [];\n stackLength = length < 120 ? 5 : length < 1542 ? 10 : length < 119151 ? 19 : 40;\n runStart = [];\n runLength = [];\n\n function pushRun(_runStart, _runLength) {\n runStart[stackSize] = _runStart;\n runLength[stackSize] = _runLength;\n stackSize += 1;\n }\n\n function mergeRuns() {\n while (stackSize > 1) {\n var n = stackSize - 2;\n\n if (n >= 1 && runLength[n - 1] <= runLength[n] + runLength[n + 1] || n >= 2 && runLength[n - 2] <= runLength[n] + runLength[n - 1]) {\n if (runLength[n - 1] < runLength[n + 1]) {\n n--;\n }\n } else if (runLength[n] > runLength[n + 1]) {\n break;\n }\n\n mergeAt(n);\n }\n }\n\n function forceMergeRuns() {\n while (stackSize > 1) {\n var n = stackSize - 2;\n\n if (n > 0 && runLength[n - 1] < runLength[n + 1]) {\n n--;\n }\n\n mergeAt(n);\n }\n }\n\n function mergeAt(i) {\n var start1 = runStart[i];\n var length1 = runLength[i];\n var start2 = runStart[i + 1];\n var length2 = runLength[i + 1];\n runLength[i] = length1 + length2;\n\n if (i === stackSize - 3) {\n runStart[i + 1] = runStart[i + 2];\n runLength[i + 1] = runLength[i + 2];\n }\n\n stackSize--;\n var k = gallopRight(array[start2], array, start1, length1, 0, compare);\n start1 += k;\n length1 -= k;\n\n if (length1 === 0) {\n return;\n }\n\n length2 = gallopLeft(array[start1 + length1 - 1], array, start2, length2, length2 - 1, compare);\n\n if (length2 === 0) {\n return;\n }\n\n if (length1 <= length2) {\n mergeLow(start1, length1, start2, length2);\n } else {\n mergeHigh(start1, length1, start2, length2);\n }\n }\n\n function mergeLow(start1, length1, start2, length2) {\n var i = 0;\n\n for (i = 0; i < length1; i++) {\n tmp[i] = array[start1 + i];\n }\n\n var cursor1 = 0;\n var cursor2 = start2;\n var dest = start1;\n array[dest++] = array[cursor2++];\n\n if (--length2 === 0) {\n for (i = 0; i < length1; i++) {\n array[dest + i] = tmp[cursor1 + i];\n }\n\n return;\n }\n\n if (length1 === 1) {\n for (i = 0; i < length2; i++) {\n array[dest + i] = array[cursor2 + i];\n }\n\n array[dest + length2] = tmp[cursor1];\n return;\n }\n\n var _minGallop = minGallop;\n var count1;\n var count2;\n var exit;\n\n while (1) {\n count1 = 0;\n count2 = 0;\n exit = false;\n\n do {\n if (compare(array[cursor2], tmp[cursor1]) < 0) {\n array[dest++] = array[cursor2++];\n count2++;\n count1 = 0;\n\n if (--length2 === 0) {\n exit = true;\n break;\n }\n } else {\n array[dest++] = tmp[cursor1++];\n count1++;\n count2 = 0;\n\n if (--length1 === 1) {\n exit = true;\n break;\n }\n }\n } while ((count1 | count2) < _minGallop);\n\n if (exit) {\n break;\n }\n\n do {\n count1 = gallopRight(array[cursor2], tmp, cursor1, length1, 0, compare);\n\n if (count1 !== 0) {\n for (i = 0; i < count1; i++) {\n array[dest + i] = tmp[cursor1 + i];\n }\n\n dest += count1;\n cursor1 += count1;\n length1 -= count1;\n\n if (length1 <= 1) {\n exit = true;\n break;\n }\n }\n\n array[dest++] = array[cursor2++];\n\n if (--length2 === 0) {\n exit = true;\n break;\n }\n\n count2 = gallopLeft(tmp[cursor1], array, cursor2, length2, 0, compare);\n\n if (count2 !== 0) {\n for (i = 0; i < count2; i++) {\n array[dest + i] = array[cursor2 + i];\n }\n\n dest += count2;\n cursor2 += count2;\n length2 -= count2;\n\n if (length2 === 0) {\n exit = true;\n break;\n }\n }\n\n array[dest++] = tmp[cursor1++];\n\n if (--length1 === 1) {\n exit = true;\n break;\n }\n\n _minGallop--;\n } while (count1 >= DEFAULT_MIN_GALLOPING || count2 >= DEFAULT_MIN_GALLOPING);\n\n if (exit) {\n break;\n }\n\n if (_minGallop < 0) {\n _minGallop = 0;\n }\n\n _minGallop += 2;\n }\n\n minGallop = _minGallop;\n minGallop < 1 && (minGallop = 1);\n\n if (length1 === 1) {\n for (i = 0; i < length2; i++) {\n array[dest + i] = array[cursor2 + i];\n }\n\n array[dest + length2] = tmp[cursor1];\n } else if (length1 === 0) {\n throw new Error(); // throw new Error('mergeLow preconditions were not respected');\n } else {\n for (i = 0; i < length1; i++) {\n array[dest + i] = tmp[cursor1 + i];\n }\n }\n }\n\n function mergeHigh(start1, length1, start2, length2) {\n var i = 0;\n\n for (i = 0; i < length2; i++) {\n tmp[i] = array[start2 + i];\n }\n\n var cursor1 = start1 + length1 - 1;\n var cursor2 = length2 - 1;\n var dest = start2 + length2 - 1;\n var customCursor = 0;\n var customDest = 0;\n array[dest--] = array[cursor1--];\n\n if (--length1 === 0) {\n customCursor = dest - (length2 - 1);\n\n for (i = 0; i < length2; i++) {\n array[customCursor + i] = tmp[i];\n }\n\n return;\n }\n\n if (length2 === 1) {\n dest -= length1;\n cursor1 -= length1;\n customDest = dest + 1;\n customCursor = cursor1 + 1;\n\n for (i = length1 - 1; i >= 0; i--) {\n array[customDest + i] = array[customCursor + i];\n }\n\n array[dest] = tmp[cursor2];\n return;\n }\n\n var _minGallop = minGallop;\n\n while (true) {\n var count1 = 0;\n var count2 = 0;\n var exit = false;\n\n do {\n if (compare(tmp[cursor2], array[cursor1]) < 0) {\n array[dest--] = array[cursor1--];\n count1++;\n count2 = 0;\n\n if (--length1 === 0) {\n exit = true;\n break;\n }\n } else {\n array[dest--] = tmp[cursor2--];\n count2++;\n count1 = 0;\n\n if (--length2 === 1) {\n exit = true;\n break;\n }\n }\n } while ((count1 | count2) < _minGallop);\n\n if (exit) {\n break;\n }\n\n do {\n count1 = length1 - gallopRight(tmp[cursor2], array, start1, length1, length1 - 1, compare);\n\n if (count1 !== 0) {\n dest -= count1;\n cursor1 -= count1;\n length1 -= count1;\n customDest = dest + 1;\n customCursor = cursor1 + 1;\n\n for (i = count1 - 1; i >= 0; i--) {\n array[customDest + i] = array[customCursor + i];\n }\n\n if (length1 === 0) {\n exit = true;\n break;\n }\n }\n\n array[dest--] = tmp[cursor2--];\n\n if (--length2 === 1) {\n exit = true;\n break;\n }\n\n count2 = length2 - gallopLeft(array[cursor1], tmp, 0, length2, length2 - 1, compare);\n\n if (count2 !== 0) {\n dest -= count2;\n cursor2 -= count2;\n length2 -= count2;\n customDest = dest + 1;\n customCursor = cursor2 + 1;\n\n for (i = 0; i < count2; i++) {\n array[customDest + i] = tmp[customCursor + i];\n }\n\n if (length2 <= 1) {\n exit = true;\n break;\n }\n }\n\n array[dest--] = array[cursor1--];\n\n if (--length1 === 0) {\n exit = true;\n break;\n }\n\n _minGallop--;\n } while (count1 >= DEFAULT_MIN_GALLOPING || count2 >= DEFAULT_MIN_GALLOPING);\n\n if (exit) {\n break;\n }\n\n if (_minGallop < 0) {\n _minGallop = 0;\n }\n\n _minGallop += 2;\n }\n\n minGallop = _minGallop;\n\n if (minGallop < 1) {\n minGallop = 1;\n }\n\n if (length2 === 1) {\n dest -= length1;\n cursor1 -= length1;\n customDest = dest + 1;\n customCursor = cursor1 + 1;\n\n for (i = length1 - 1; i >= 0; i--) {\n array[customDest + i] = array[customCursor + i];\n }\n\n array[dest] = tmp[cursor2];\n } else if (length2 === 0) {\n throw new Error(); // throw new Error('mergeHigh preconditions were not respected');\n } else {\n customCursor = dest - (length2 - 1);\n\n for (i = 0; i < length2; i++) {\n array[customCursor + i] = tmp[i];\n }\n }\n }\n\n this.mergeRuns = mergeRuns;\n this.forceMergeRuns = forceMergeRuns;\n this.pushRun = pushRun;\n}\n\nfunction sort(array, compare, lo, hi) {\n if (!lo) {\n lo = 0;\n }\n\n if (!hi) {\n hi = array.length;\n }\n\n var remaining = hi - lo;\n\n if (remaining < 2) {\n return;\n }\n\n var runLength = 0;\n\n if (remaining < DEFAULT_MIN_MERGE) {\n runLength = makeAscendingRun(array, lo, hi, compare);\n binaryInsertionSort(array, lo, hi, lo + runLength, compare);\n return;\n }\n\n var ts = new TimSort(array, compare);\n var minRun = minRunLength(remaining);\n\n do {\n runLength = makeAscendingRun(array, lo, hi, compare);\n\n if (runLength < minRun) {\n var force = remaining;\n\n if (force > minRun) {\n force = minRun;\n }\n\n binaryInsertionSort(array, lo, lo + force, lo + runLength, compare);\n runLength = force;\n }\n\n ts.pushRun(lo, runLength);\n ts.mergeRuns();\n remaining -= runLength;\n lo += runLength;\n } while (remaining !== 0);\n\n ts.forceMergeRuns();\n}\n\nmodule.exports = sort;","var eventUtil = require(\"./event\");\n\n/**\n * Only implements needed gestures for mobile.\n */\nvar GestureMgr = function () {\n /**\n * @private\n * @type {Array.}\n */\n this._track = [];\n};\n\nGestureMgr.prototype = {\n constructor: GestureMgr,\n recognize: function (event, target, root) {\n this._doTrack(event, target, root);\n\n return this._recognize(event);\n },\n clear: function () {\n this._track.length = 0;\n return this;\n },\n _doTrack: function (event, target, root) {\n var touches = event.touches;\n\n if (!touches) {\n return;\n }\n\n var trackItem = {\n points: [],\n touches: [],\n target: target,\n event: event\n };\n\n for (var i = 0, len = touches.length; i < len; i++) {\n var touch = touches[i];\n var pos = eventUtil.clientToLocal(root, touch, {});\n trackItem.points.push([pos.zrX, pos.zrY]);\n trackItem.touches.push(touch);\n }\n\n this._track.push(trackItem);\n },\n _recognize: function (event) {\n for (var eventName in recognizers) {\n if (recognizers.hasOwnProperty(eventName)) {\n var gestureInfo = recognizers[eventName](this._track, event);\n\n if (gestureInfo) {\n return gestureInfo;\n }\n }\n }\n }\n};\n\nfunction dist(pointPair) {\n var dx = pointPair[1][0] - pointPair[0][0];\n var dy = pointPair[1][1] - pointPair[0][1];\n return Math.sqrt(dx * dx + dy * dy);\n}\n\nfunction center(pointPair) {\n return [(pointPair[0][0] + pointPair[1][0]) / 2, (pointPair[0][1] + pointPair[1][1]) / 2];\n}\n\nvar recognizers = {\n pinch: function (track, event) {\n var trackLen = track.length;\n\n if (!trackLen) {\n return;\n }\n\n var pinchEnd = (track[trackLen - 1] || {}).points;\n var pinchPre = (track[trackLen - 2] || {}).points || pinchEnd;\n\n if (pinchPre && pinchPre.length > 1 && pinchEnd && pinchEnd.length > 1) {\n var pinchScale = dist(pinchEnd) / dist(pinchPre);\n !isFinite(pinchScale) && (pinchScale = 1);\n event.pinchScale = pinchScale;\n var pinchCenter = center(pinchEnd);\n event.pinchX = pinchCenter[0];\n event.pinchY = pinchCenter[1];\n return {\n type: 'pinch',\n target: track[0].target,\n event: event\n };\n }\n } // Only pinch currently.\n\n};\nvar _default = GestureMgr;\nmodule.exports = _default;","/**\n * 3x2矩阵操作类\n * @exports zrender/tool/matrix\n */\n\n/* global Float32Array */\nvar ArrayCtor = typeof Float32Array === 'undefined' ? Array : Float32Array;\n/**\n * Create a identity matrix.\n * @return {Float32Array|Array.}\n */\n\nfunction create() {\n var out = new ArrayCtor(6);\n identity(out);\n return out;\n}\n/**\n * 设置矩阵为单位矩阵\n * @param {Float32Array|Array.} out\n */\n\n\nfunction identity(out) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n out[4] = 0;\n out[5] = 0;\n return out;\n}\n/**\n * 复制矩阵\n * @param {Float32Array|Array.} out\n * @param {Float32Array|Array.} m\n */\n\n\nfunction copy(out, m) {\n out[0] = m[0];\n out[1] = m[1];\n out[2] = m[2];\n out[3] = m[3];\n out[4] = m[4];\n out[5] = m[5];\n return out;\n}\n/**\n * 矩阵相乘\n * @param {Float32Array|Array.} out\n * @param {Float32Array|Array.} m1\n * @param {Float32Array|Array.} m2\n */\n\n\nfunction mul(out, m1, m2) {\n // Consider matrix.mul(m, m2, m);\n // where out is the same as m2.\n // So use temp variable to escape error.\n var out0 = m1[0] * m2[0] + m1[2] * m2[1];\n var out1 = m1[1] * m2[0] + m1[3] * m2[1];\n var out2 = m1[0] * m2[2] + m1[2] * m2[3];\n var out3 = m1[1] * m2[2] + m1[3] * m2[3];\n var out4 = m1[0] * m2[4] + m1[2] * m2[5] + m1[4];\n var out5 = m1[1] * m2[4] + m1[3] * m2[5] + m1[5];\n out[0] = out0;\n out[1] = out1;\n out[2] = out2;\n out[3] = out3;\n out[4] = out4;\n out[5] = out5;\n return out;\n}\n/**\n * 平移变换\n * @param {Float32Array|Array.} out\n * @param {Float32Array|Array.} a\n * @param {Float32Array|Array.} v\n */\n\n\nfunction translate(out, a, v) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4] + v[0];\n out[5] = a[5] + v[1];\n return out;\n}\n/**\n * 旋转变换\n * @param {Float32Array|Array.} out\n * @param {Float32Array|Array.} a\n * @param {number} rad\n */\n\n\nfunction rotate(out, a, rad) {\n var aa = a[0];\n var ac = a[2];\n var atx = a[4];\n var ab = a[1];\n var ad = a[3];\n var aty = a[5];\n var st = Math.sin(rad);\n var ct = Math.cos(rad);\n out[0] = aa * ct + ab * st;\n out[1] = -aa * st + ab * ct;\n out[2] = ac * ct + ad * st;\n out[3] = -ac * st + ct * ad;\n out[4] = ct * atx + st * aty;\n out[5] = ct * aty - st * atx;\n return out;\n}\n/**\n * 缩放变换\n * @param {Float32Array|Array.} out\n * @param {Float32Array|Array.} a\n * @param {Float32Array|Array.} v\n */\n\n\nfunction scale(out, a, v) {\n var vx = v[0];\n var vy = v[1];\n out[0] = a[0] * vx;\n out[1] = a[1] * vy;\n out[2] = a[2] * vx;\n out[3] = a[3] * vy;\n out[4] = a[4] * vx;\n out[5] = a[5] * vy;\n return out;\n}\n/**\n * 求逆矩阵\n * @param {Float32Array|Array.} out\n * @param {Float32Array|Array.} a\n */\n\n\nfunction invert(out, a) {\n var aa = a[0];\n var ac = a[2];\n var atx = a[4];\n var ab = a[1];\n var ad = a[3];\n var aty = a[5];\n var det = aa * ad - ab * ac;\n\n if (!det) {\n return null;\n }\n\n det = 1.0 / det;\n out[0] = ad * det;\n out[1] = -ab * det;\n out[2] = -ac * det;\n out[3] = aa * det;\n out[4] = (ac * aty - ad * atx) * det;\n out[5] = (ab * atx - aa * aty) * det;\n return out;\n}\n/**\n * Clone a new matrix.\n * @param {Float32Array|Array.} a\n */\n\n\nfunction clone(a) {\n var b = create();\n copy(b, a);\n return b;\n}\n\nexports.create = create;\nexports.identity = identity;\nexports.copy = copy;\nexports.mul = mul;\nexports.translate = translate;\nexports.rotate = rotate;\nexports.scale = scale;\nexports.invert = invert;\nexports.clone = clone;","var curve = require(\"./curve\");\n\nvar vec2 = require(\"./vector\");\n\nvar bbox = require(\"./bbox\");\n\nvar BoundingRect = require(\"./BoundingRect\");\n\nvar _config = require(\"../config\");\n\nvar dpr = _config.devicePixelRatio;\n\n/**\n * Path 代理,可以在`buildPath`中用于替代`ctx`, 会保存每个path操作的命令到pathCommands属性中\n * 可以用于 isInsidePath 判断以及获取boundingRect\n *\n * @module zrender/core/PathProxy\n * @author Yi Shen (http://www.github.com/pissang)\n */\n// TODO getTotalLength, getPointAtLength\n\n/* global Float32Array */\nvar CMD = {\n M: 1,\n L: 2,\n C: 3,\n Q: 4,\n A: 5,\n Z: 6,\n // Rect\n R: 7\n}; // var CMD_MEM_SIZE = {\n// M: 3,\n// L: 3,\n// C: 7,\n// Q: 5,\n// A: 9,\n// R: 5,\n// Z: 1\n// };\n\nvar min = [];\nvar max = [];\nvar min2 = [];\nvar max2 = [];\nvar mathMin = Math.min;\nvar mathMax = Math.max;\nvar mathCos = Math.cos;\nvar mathSin = Math.sin;\nvar mathSqrt = Math.sqrt;\nvar mathAbs = Math.abs;\nvar hasTypedArray = typeof Float32Array !== 'undefined';\n/**\n * @alias module:zrender/core/PathProxy\n * @constructor\n */\n\nvar PathProxy = function (notSaveData) {\n this._saveData = !(notSaveData || false);\n\n if (this._saveData) {\n /**\n * Path data. Stored as flat array\n * @type {Array.}\n */\n this.data = [];\n }\n\n this._ctx = null;\n};\n/**\n * 快速计算Path包围盒(并不是最小包围盒)\n * @return {Object}\n */\n\n\nPathProxy.prototype = {\n constructor: PathProxy,\n _xi: 0,\n _yi: 0,\n _x0: 0,\n _y0: 0,\n // Unit x, Unit y. Provide for avoiding drawing that too short line segment\n _ux: 0,\n _uy: 0,\n _len: 0,\n _lineDash: null,\n _dashOffset: 0,\n _dashIdx: 0,\n _dashSum: 0,\n\n /**\n * @readOnly\n */\n setScale: function (sx, sy, segmentIgnoreThreshold) {\n // Compat. Previously there is no segmentIgnoreThreshold.\n segmentIgnoreThreshold = segmentIgnoreThreshold || 0;\n this._ux = mathAbs(segmentIgnoreThreshold / dpr / sx) || 0;\n this._uy = mathAbs(segmentIgnoreThreshold / dpr / sy) || 0;\n },\n getContext: function () {\n return this._ctx;\n },\n\n /**\n * @param {CanvasRenderingContext2D} ctx\n * @return {module:zrender/core/PathProxy}\n */\n beginPath: function (ctx) {\n this._ctx = ctx;\n ctx && ctx.beginPath();\n ctx && (this.dpr = ctx.dpr); // Reset\n\n if (this._saveData) {\n this._len = 0;\n }\n\n if (this._lineDash) {\n this._lineDash = null;\n this._dashOffset = 0;\n }\n\n return this;\n },\n\n /**\n * @param {number} x\n * @param {number} y\n * @return {module:zrender/core/PathProxy}\n */\n moveTo: function (x, y) {\n this.addData(CMD.M, x, y);\n this._ctx && this._ctx.moveTo(x, y); // x0, y0, xi, yi 是记录在 _dashedXXXXTo 方法中使用\n // xi, yi 记录当前点, x0, y0 在 closePath 的时候回到起始点。\n // 有可能在 beginPath 之后直接调用 lineTo,这时候 x0, y0 需要\n // 在 lineTo 方法中记录,这里先不考虑这种情况,dashed line 也只在 IE10- 中不支持\n\n this._x0 = x;\n this._y0 = y;\n this._xi = x;\n this._yi = y;\n return this;\n },\n\n /**\n * @param {number} x\n * @param {number} y\n * @return {module:zrender/core/PathProxy}\n */\n lineTo: function (x, y) {\n var exceedUnit = mathAbs(x - this._xi) > this._ux || mathAbs(y - this._yi) > this._uy // Force draw the first segment\n || this._len < 5;\n this.addData(CMD.L, x, y);\n\n if (this._ctx && exceedUnit) {\n this._needsDash() ? this._dashedLineTo(x, y) : this._ctx.lineTo(x, y);\n }\n\n if (exceedUnit) {\n this._xi = x;\n this._yi = y;\n }\n\n return this;\n },\n\n /**\n * @param {number} x1\n * @param {number} y1\n * @param {number} x2\n * @param {number} y2\n * @param {number} x3\n * @param {number} y3\n * @return {module:zrender/core/PathProxy}\n */\n bezierCurveTo: function (x1, y1, x2, y2, x3, y3) {\n this.addData(CMD.C, x1, y1, x2, y2, x3, y3);\n\n if (this._ctx) {\n this._needsDash() ? this._dashedBezierTo(x1, y1, x2, y2, x3, y3) : this._ctx.bezierCurveTo(x1, y1, x2, y2, x3, y3);\n }\n\n this._xi = x3;\n this._yi = y3;\n return this;\n },\n\n /**\n * @param {number} x1\n * @param {number} y1\n * @param {number} x2\n * @param {number} y2\n * @return {module:zrender/core/PathProxy}\n */\n quadraticCurveTo: function (x1, y1, x2, y2) {\n this.addData(CMD.Q, x1, y1, x2, y2);\n\n if (this._ctx) {\n this._needsDash() ? this._dashedQuadraticTo(x1, y1, x2, y2) : this._ctx.quadraticCurveTo(x1, y1, x2, y2);\n }\n\n this._xi = x2;\n this._yi = y2;\n return this;\n },\n\n /**\n * @param {number} cx\n * @param {number} cy\n * @param {number} r\n * @param {number} startAngle\n * @param {number} endAngle\n * @param {boolean} anticlockwise\n * @return {module:zrender/core/PathProxy}\n */\n arc: function (cx, cy, r, startAngle, endAngle, anticlockwise) {\n this.addData(CMD.A, cx, cy, r, r, startAngle, endAngle - startAngle, 0, anticlockwise ? 0 : 1);\n this._ctx && this._ctx.arc(cx, cy, r, startAngle, endAngle, anticlockwise);\n this._xi = mathCos(endAngle) * r + cx;\n this._yi = mathSin(endAngle) * r + cy;\n return this;\n },\n // TODO\n arcTo: function (x1, y1, x2, y2, radius) {\n if (this._ctx) {\n this._ctx.arcTo(x1, y1, x2, y2, radius);\n }\n\n return this;\n },\n // TODO\n rect: function (x, y, w, h) {\n this._ctx && this._ctx.rect(x, y, w, h);\n this.addData(CMD.R, x, y, w, h);\n return this;\n },\n\n /**\n * @return {module:zrender/core/PathProxy}\n */\n closePath: function () {\n this.addData(CMD.Z);\n var ctx = this._ctx;\n var x0 = this._x0;\n var y0 = this._y0;\n\n if (ctx) {\n this._needsDash() && this._dashedLineTo(x0, y0);\n ctx.closePath();\n }\n\n this._xi = x0;\n this._yi = y0;\n return this;\n },\n\n /**\n * Context 从外部传入,因为有可能是 rebuildPath 完之后再 fill。\n * stroke 同样\n * @param {CanvasRenderingContext2D} ctx\n * @return {module:zrender/core/PathProxy}\n */\n fill: function (ctx) {\n ctx && ctx.fill();\n this.toStatic();\n },\n\n /**\n * @param {CanvasRenderingContext2D} ctx\n * @return {module:zrender/core/PathProxy}\n */\n stroke: function (ctx) {\n ctx && ctx.stroke();\n this.toStatic();\n },\n\n /**\n * 必须在其它绘制命令前调用\n * Must be invoked before all other path drawing methods\n * @return {module:zrender/core/PathProxy}\n */\n setLineDash: function (lineDash) {\n if (lineDash instanceof Array) {\n this._lineDash = lineDash;\n this._dashIdx = 0;\n var lineDashSum = 0;\n\n for (var i = 0; i < lineDash.length; i++) {\n lineDashSum += lineDash[i];\n }\n\n this._dashSum = lineDashSum;\n }\n\n return this;\n },\n\n /**\n * 必须在其它绘制命令前调用\n * Must be invoked before all other path drawing methods\n * @return {module:zrender/core/PathProxy}\n */\n setLineDashOffset: function (offset) {\n this._dashOffset = offset;\n return this;\n },\n\n /**\n *\n * @return {boolean}\n */\n len: function () {\n return this._len;\n },\n\n /**\n * 直接设置 Path 数据\n */\n setData: function (data) {\n var len = data.length;\n\n if (!(this.data && this.data.length === len) && hasTypedArray) {\n this.data = new Float32Array(len);\n }\n\n for (var i = 0; i < len; i++) {\n this.data[i] = data[i];\n }\n\n this._len = len;\n },\n\n /**\n * 添加子路径\n * @param {module:zrender/core/PathProxy|Array.} path\n */\n appendPath: function (path) {\n if (!(path instanceof Array)) {\n path = [path];\n }\n\n var len = path.length;\n var appendSize = 0;\n var offset = this._len;\n\n for (var i = 0; i < len; i++) {\n appendSize += path[i].len();\n }\n\n if (hasTypedArray && this.data instanceof Float32Array) {\n this.data = new Float32Array(offset + appendSize);\n }\n\n for (var i = 0; i < len; i++) {\n var appendPathData = path[i].data;\n\n for (var k = 0; k < appendPathData.length; k++) {\n this.data[offset++] = appendPathData[k];\n }\n }\n\n this._len = offset;\n },\n\n /**\n * 填充 Path 数据。\n * 尽量复用而不申明新的数组。大部分图形重绘的指令数据长度都是不变的。\n */\n addData: function (cmd) {\n if (!this._saveData) {\n return;\n }\n\n var data = this.data;\n\n if (this._len + arguments.length > data.length) {\n // 因为之前的数组已经转换成静态的 Float32Array\n // 所以不够用时需要扩展一个新的动态数组\n this._expandData();\n\n data = this.data;\n }\n\n for (var i = 0; i < arguments.length; i++) {\n data[this._len++] = arguments[i];\n }\n\n this._prevCmd = cmd;\n },\n _expandData: function () {\n // Only if data is Float32Array\n if (!(this.data instanceof Array)) {\n var newData = [];\n\n for (var i = 0; i < this._len; i++) {\n newData[i] = this.data[i];\n }\n\n this.data = newData;\n }\n },\n\n /**\n * If needs js implemented dashed line\n * @return {boolean}\n * @private\n */\n _needsDash: function () {\n return this._lineDash;\n },\n _dashedLineTo: function (x1, y1) {\n var dashSum = this._dashSum;\n var offset = this._dashOffset;\n var lineDash = this._lineDash;\n var ctx = this._ctx;\n var x0 = this._xi;\n var y0 = this._yi;\n var dx = x1 - x0;\n var dy = y1 - y0;\n var dist = mathSqrt(dx * dx + dy * dy);\n var x = x0;\n var y = y0;\n var dash;\n var nDash = lineDash.length;\n var idx;\n dx /= dist;\n dy /= dist;\n\n if (offset < 0) {\n // Convert to positive offset\n offset = dashSum + offset;\n }\n\n offset %= dashSum;\n x -= offset * dx;\n y -= offset * dy;\n\n while (dx > 0 && x <= x1 || dx < 0 && x >= x1 || dx === 0 && (dy > 0 && y <= y1 || dy < 0 && y >= y1)) {\n idx = this._dashIdx;\n dash = lineDash[idx];\n x += dx * dash;\n y += dy * dash;\n this._dashIdx = (idx + 1) % nDash; // Skip positive offset\n\n if (dx > 0 && x < x0 || dx < 0 && x > x0 || dy > 0 && y < y0 || dy < 0 && y > y0) {\n continue;\n }\n\n ctx[idx % 2 ? 'moveTo' : 'lineTo'](dx >= 0 ? mathMin(x, x1) : mathMax(x, x1), dy >= 0 ? mathMin(y, y1) : mathMax(y, y1));\n } // Offset for next lineTo\n\n\n dx = x - x1;\n dy = y - y1;\n this._dashOffset = -mathSqrt(dx * dx + dy * dy);\n },\n // Not accurate dashed line to\n _dashedBezierTo: function (x1, y1, x2, y2, x3, y3) {\n var dashSum = this._dashSum;\n var offset = this._dashOffset;\n var lineDash = this._lineDash;\n var ctx = this._ctx;\n var x0 = this._xi;\n var y0 = this._yi;\n var t;\n var dx;\n var dy;\n var cubicAt = curve.cubicAt;\n var bezierLen = 0;\n var idx = this._dashIdx;\n var nDash = lineDash.length;\n var x;\n var y;\n var tmpLen = 0;\n\n if (offset < 0) {\n // Convert to positive offset\n offset = dashSum + offset;\n }\n\n offset %= dashSum; // Bezier approx length\n\n for (t = 0; t < 1; t += 0.1) {\n dx = cubicAt(x0, x1, x2, x3, t + 0.1) - cubicAt(x0, x1, x2, x3, t);\n dy = cubicAt(y0, y1, y2, y3, t + 0.1) - cubicAt(y0, y1, y2, y3, t);\n bezierLen += mathSqrt(dx * dx + dy * dy);\n } // Find idx after add offset\n\n\n for (; idx < nDash; idx++) {\n tmpLen += lineDash[idx];\n\n if (tmpLen > offset) {\n break;\n }\n }\n\n t = (tmpLen - offset) / bezierLen;\n\n while (t <= 1) {\n x = cubicAt(x0, x1, x2, x3, t);\n y = cubicAt(y0, y1, y2, y3, t); // Use line to approximate dashed bezier\n // Bad result if dash is long\n\n idx % 2 ? ctx.moveTo(x, y) : ctx.lineTo(x, y);\n t += lineDash[idx] / bezierLen;\n idx = (idx + 1) % nDash;\n } // Finish the last segment and calculate the new offset\n\n\n idx % 2 !== 0 && ctx.lineTo(x3, y3);\n dx = x3 - x;\n dy = y3 - y;\n this._dashOffset = -mathSqrt(dx * dx + dy * dy);\n },\n _dashedQuadraticTo: function (x1, y1, x2, y2) {\n // Convert quadratic to cubic using degree elevation\n var x3 = x2;\n var y3 = y2;\n x2 = (x2 + 2 * x1) / 3;\n y2 = (y2 + 2 * y1) / 3;\n x1 = (this._xi + 2 * x1) / 3;\n y1 = (this._yi + 2 * y1) / 3;\n\n this._dashedBezierTo(x1, y1, x2, y2, x3, y3);\n },\n\n /**\n * 转成静态的 Float32Array 减少堆内存占用\n * Convert dynamic array to static Float32Array\n */\n toStatic: function () {\n var data = this.data;\n\n if (data instanceof Array) {\n data.length = this._len;\n\n if (hasTypedArray) {\n this.data = new Float32Array(data);\n }\n }\n },\n\n /**\n * @return {module:zrender/core/BoundingRect}\n */\n getBoundingRect: function () {\n min[0] = min[1] = min2[0] = min2[1] = Number.MAX_VALUE;\n max[0] = max[1] = max2[0] = max2[1] = -Number.MAX_VALUE;\n var data = this.data;\n var xi = 0;\n var yi = 0;\n var x0 = 0;\n var y0 = 0;\n\n for (var i = 0; i < data.length;) {\n var cmd = data[i++];\n\n if (i === 1) {\n // 如果第一个命令是 L, C, Q\n // 则 previous point 同绘制命令的第一个 point\n //\n // 第一个命令为 Arc 的情况下会在后面特殊处理\n xi = data[i];\n yi = data[i + 1];\n x0 = xi;\n y0 = yi;\n }\n\n switch (cmd) {\n case CMD.M:\n // moveTo 命令重新创建一个新的 subpath, 并且更新新的起点\n // 在 closePath 的时候使用\n x0 = data[i++];\n y0 = data[i++];\n xi = x0;\n yi = y0;\n min2[0] = x0;\n min2[1] = y0;\n max2[0] = x0;\n max2[1] = y0;\n break;\n\n case CMD.L:\n bbox.fromLine(xi, yi, data[i], data[i + 1], min2, max2);\n xi = data[i++];\n yi = data[i++];\n break;\n\n case CMD.C:\n bbox.fromCubic(xi, yi, data[i++], data[i++], data[i++], data[i++], data[i], data[i + 1], min2, max2);\n xi = data[i++];\n yi = data[i++];\n break;\n\n case CMD.Q:\n bbox.fromQuadratic(xi, yi, data[i++], data[i++], data[i], data[i + 1], min2, max2);\n xi = data[i++];\n yi = data[i++];\n break;\n\n case CMD.A:\n // TODO Arc 判断的开销比较大\n var cx = data[i++];\n var cy = data[i++];\n var rx = data[i++];\n var ry = data[i++];\n var startAngle = data[i++];\n var endAngle = data[i++] + startAngle; // TODO Arc 旋转\n\n i += 1;\n var anticlockwise = 1 - data[i++];\n\n if (i === 1) {\n // 直接使用 arc 命令\n // 第一个命令起点还未定义\n x0 = mathCos(startAngle) * rx + cx;\n y0 = mathSin(startAngle) * ry + cy;\n }\n\n bbox.fromArc(cx, cy, rx, ry, startAngle, endAngle, anticlockwise, min2, max2);\n xi = mathCos(endAngle) * rx + cx;\n yi = mathSin(endAngle) * ry + cy;\n break;\n\n case CMD.R:\n x0 = xi = data[i++];\n y0 = yi = data[i++];\n var width = data[i++];\n var height = data[i++]; // Use fromLine\n\n bbox.fromLine(x0, y0, x0 + width, y0 + height, min2, max2);\n break;\n\n case CMD.Z:\n xi = x0;\n yi = y0;\n break;\n } // Union\n\n\n vec2.min(min, min, min2);\n vec2.max(max, max, max2);\n } // No data\n\n\n if (i === 0) {\n min[0] = min[1] = max[0] = max[1] = 0;\n }\n\n return new BoundingRect(min[0], min[1], max[0] - min[0], max[1] - min[1]);\n },\n\n /**\n * Rebuild path from current data\n * Rebuild path will not consider javascript implemented line dash.\n * @param {CanvasRenderingContext2D} ctx\n */\n rebuildPath: function (ctx) {\n var d = this.data;\n var x0;\n var y0;\n var xi;\n var yi;\n var x;\n var y;\n var ux = this._ux;\n var uy = this._uy;\n var len = this._len;\n\n for (var i = 0; i < len;) {\n var cmd = d[i++];\n\n if (i === 1) {\n // 如果第一个命令是 L, C, Q\n // 则 previous point 同绘制命令的第一个 point\n //\n // 第一个命令为 Arc 的情况下会在后面特殊处理\n xi = d[i];\n yi = d[i + 1];\n x0 = xi;\n y0 = yi;\n }\n\n switch (cmd) {\n case CMD.M:\n x0 = xi = d[i++];\n y0 = yi = d[i++];\n ctx.moveTo(xi, yi);\n break;\n\n case CMD.L:\n x = d[i++];\n y = d[i++]; // Not draw too small seg between\n\n if (mathAbs(x - xi) > ux || mathAbs(y - yi) > uy || i === len - 1) {\n ctx.lineTo(x, y);\n xi = x;\n yi = y;\n }\n\n break;\n\n case CMD.C:\n ctx.bezierCurveTo(d[i++], d[i++], d[i++], d[i++], d[i++], d[i++]);\n xi = d[i - 2];\n yi = d[i - 1];\n break;\n\n case CMD.Q:\n ctx.quadraticCurveTo(d[i++], d[i++], d[i++], d[i++]);\n xi = d[i - 2];\n yi = d[i - 1];\n break;\n\n case CMD.A:\n var cx = d[i++];\n var cy = d[i++];\n var rx = d[i++];\n var ry = d[i++];\n var theta = d[i++];\n var dTheta = d[i++];\n var psi = d[i++];\n var fs = d[i++];\n var r = rx > ry ? rx : ry;\n var scaleX = rx > ry ? 1 : rx / ry;\n var scaleY = rx > ry ? ry / rx : 1;\n var isEllipse = Math.abs(rx - ry) > 1e-3;\n var endAngle = theta + dTheta;\n\n if (isEllipse) {\n ctx.translate(cx, cy);\n ctx.rotate(psi);\n ctx.scale(scaleX, scaleY);\n ctx.arc(0, 0, r, theta, endAngle, 1 - fs);\n ctx.scale(1 / scaleX, 1 / scaleY);\n ctx.rotate(-psi);\n ctx.translate(-cx, -cy);\n } else {\n ctx.arc(cx, cy, r, theta, endAngle, 1 - fs);\n }\n\n if (i === 1) {\n // 直接使用 arc 命令\n // 第一个命令起点还未定义\n x0 = mathCos(theta) * rx + cx;\n y0 = mathSin(theta) * ry + cy;\n }\n\n xi = mathCos(endAngle) * rx + cx;\n yi = mathSin(endAngle) * ry + cy;\n break;\n\n case CMD.R:\n x0 = xi = d[i];\n y0 = yi = d[i + 1];\n ctx.rect(d[i++], d[i++], d[i++], d[i++]);\n break;\n\n case CMD.Z:\n ctx.closePath();\n xi = x0;\n yi = y0;\n }\n }\n }\n};\nPathProxy.CMD = CMD;\nvar _default = PathProxy;\nmodule.exports = _default;","/**\n * echarts设备环境识别\n *\n * @desc echarts基于Canvas,纯Javascript图表库,提供直观,生动,可交互,可个性化定制的数据统计图表。\n * @author firede[firede@firede.us]\n * @desc thanks zepto.\n */\n\n/* global wx */\nvar env = {};\n\nif (typeof wx === 'object' && typeof wx.getSystemInfoSync === 'function') {\n // In Weixin Application\n env = {\n browser: {},\n os: {},\n node: false,\n wxa: true,\n // Weixin Application\n canvasSupported: true,\n svgSupported: false,\n touchEventsSupported: true,\n domSupported: false\n };\n} else if (typeof document === 'undefined' && typeof self !== 'undefined') {\n // In worker\n env = {\n browser: {},\n os: {},\n node: false,\n worker: true,\n canvasSupported: true,\n domSupported: false\n };\n} else if (typeof navigator === 'undefined') {\n // In node\n env = {\n browser: {},\n os: {},\n node: true,\n worker: false,\n // Assume canvas is supported\n canvasSupported: true,\n svgSupported: true,\n domSupported: false\n };\n} else {\n env = detect(navigator.userAgent);\n}\n\nvar _default = env; // Zepto.js\n// (c) 2010-2013 Thomas Fuchs\n// Zepto.js may be freely distributed under the MIT license.\n\nfunction detect(ua) {\n var os = {};\n var browser = {}; // var webkit = ua.match(/Web[kK]it[\\/]{0,1}([\\d.]+)/);\n // var android = ua.match(/(Android);?[\\s\\/]+([\\d.]+)?/);\n // var ipad = ua.match(/(iPad).*OS\\s([\\d_]+)/);\n // var ipod = ua.match(/(iPod)(.*OS\\s([\\d_]+))?/);\n // var iphone = !ipad && ua.match(/(iPhone\\sOS)\\s([\\d_]+)/);\n // var webos = ua.match(/(webOS|hpwOS)[\\s\\/]([\\d.]+)/);\n // var touchpad = webos && ua.match(/TouchPad/);\n // var kindle = ua.match(/Kindle\\/([\\d.]+)/);\n // var silk = ua.match(/Silk\\/([\\d._]+)/);\n // var blackberry = ua.match(/(BlackBerry).*Version\\/([\\d.]+)/);\n // var bb10 = ua.match(/(BB10).*Version\\/([\\d.]+)/);\n // var rimtabletos = ua.match(/(RIM\\sTablet\\sOS)\\s([\\d.]+)/);\n // var playbook = ua.match(/PlayBook/);\n // var chrome = ua.match(/Chrome\\/([\\d.]+)/) || ua.match(/CriOS\\/([\\d.]+)/);\n\n var firefox = ua.match(/Firefox\\/([\\d.]+)/); // var safari = webkit && ua.match(/Mobile\\//) && !chrome;\n // var webview = ua.match(/(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/) && !chrome;\n\n var ie = ua.match(/MSIE\\s([\\d.]+)/) // IE 11 Trident/7.0; rv:11.0\n || ua.match(/Trident\\/.+?rv:(([\\d.]+))/);\n var edge = ua.match(/Edge\\/([\\d.]+)/); // IE 12 and 12+\n\n var weChat = /micromessenger/i.test(ua); // Todo: clean this up with a better OS/browser seperation:\n // - discern (more) between multiple browsers on android\n // - decide if kindle fire in silk mode is android or not\n // - Firefox on Android doesn't specify the Android version\n // - possibly devide in os, device and browser hashes\n // if (browser.webkit = !!webkit) browser.version = webkit[1];\n // if (android) os.android = true, os.version = android[2];\n // if (iphone && !ipod) os.ios = os.iphone = true, os.version = iphone[2].replace(/_/g, '.');\n // if (ipad) os.ios = os.ipad = true, os.version = ipad[2].replace(/_/g, '.');\n // if (ipod) os.ios = os.ipod = true, os.version = ipod[3] ? ipod[3].replace(/_/g, '.') : null;\n // if (webos) os.webos = true, os.version = webos[2];\n // if (touchpad) os.touchpad = true;\n // if (blackberry) os.blackberry = true, os.version = blackberry[2];\n // if (bb10) os.bb10 = true, os.version = bb10[2];\n // if (rimtabletos) os.rimtabletos = true, os.version = rimtabletos[2];\n // if (playbook) browser.playbook = true;\n // if (kindle) os.kindle = true, os.version = kindle[1];\n // if (silk) browser.silk = true, browser.version = silk[1];\n // if (!silk && os.android && ua.match(/Kindle Fire/)) browser.silk = true;\n // if (chrome) browser.chrome = true, browser.version = chrome[1];\n\n if (firefox) {\n browser.firefox = true;\n browser.version = firefox[1];\n } // if (safari && (ua.match(/Safari/) || !!os.ios)) browser.safari = true;\n // if (webview) browser.webview = true;\n\n\n if (ie) {\n browser.ie = true;\n browser.version = ie[1];\n }\n\n if (edge) {\n browser.edge = true;\n browser.version = edge[1];\n } // It is difficult to detect WeChat in Win Phone precisely, because ua can\n // not be set on win phone. So we do not consider Win Phone.\n\n\n if (weChat) {\n browser.weChat = true;\n } // os.tablet = !!(ipad || playbook || (android && !ua.match(/Mobile/)) ||\n // (firefox && ua.match(/Tablet/)) || (ie && !ua.match(/Phone/) && ua.match(/Touch/)));\n // os.phone = !!(!os.tablet && !os.ipod && (android || iphone || webos ||\n // (chrome && ua.match(/Android/)) || (chrome && ua.match(/CriOS\\/([\\d.]+)/)) ||\n // (firefox && ua.match(/Mobile/)) || (ie && ua.match(/Touch/))));\n\n\n return {\n browser: browser,\n os: os,\n node: false,\n // 原生canvas支持,改极端点了\n // canvasSupported : !(browser.ie && parseFloat(browser.version) < 9)\n canvasSupported: !!document.createElement('canvas').getContext,\n svgSupported: typeof SVGRect !== 'undefined',\n // works on most browsers\n // IE10/11 does not support touch event, and MS Edge supports them but not by\n // default, so we dont check navigator.maxTouchPoints for them here.\n touchEventsSupported: 'ontouchstart' in window && !browser.ie && !browser.edge,\n // .\n pointerEventsSupported: // (1) Firefox supports pointer but not by default, only MS browsers are reliable on pointer\n // events currently. So we dont use that on other browsers unless tested sufficiently.\n // For example, in iOS 13 Mobile Chromium 78, if the touching behavior starts page\n // scroll, the `pointermove` event can not be fired any more. That will break some\n // features like \"pan horizontally to move something and pan vertically to page scroll\".\n // The horizontal pan probably be interrupted by the casually triggered page scroll.\n // (2) Although IE 10 supports pointer event, it use old style and is different from the\n // standard. So we exclude that. (IE 10 is hardly used on touch device)\n 'onpointerdown' in window && (browser.edge || browser.ie && browser.version >= 11),\n // passiveSupported: detectPassiveSupport()\n domSupported: typeof document !== 'undefined'\n };\n} // See https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md#feature-detection\n// function detectPassiveSupport() {\n// // Test via a getter in the options object to see if the passive property is accessed\n// var supportsPassive = false;\n// try {\n// var opts = Object.defineProperty({}, 'passive', {\n// get: function() {\n// supportsPassive = true;\n// }\n// });\n// window.addEventListener('testPassive', function() {}, opts);\n// } catch (e) {\n// }\n// return supportsPassive;\n// }\n\n\nmodule.exports = _default;","/* global Float32Array */\nvar ArrayCtor = typeof Float32Array === 'undefined' ? Array : Float32Array;\n/**\n * 创建一个向量\n * @param {number} [x=0]\n * @param {number} [y=0]\n * @return {Vector2}\n */\n\nfunction create(x, y) {\n var out = new ArrayCtor(2);\n\n if (x == null) {\n x = 0;\n }\n\n if (y == null) {\n y = 0;\n }\n\n out[0] = x;\n out[1] = y;\n return out;\n}\n/**\n * 复制向量数据\n * @param {Vector2} out\n * @param {Vector2} v\n * @return {Vector2}\n */\n\n\nfunction copy(out, v) {\n out[0] = v[0];\n out[1] = v[1];\n return out;\n}\n/**\n * 克隆一个向量\n * @param {Vector2} v\n * @return {Vector2}\n */\n\n\nfunction clone(v) {\n var out = new ArrayCtor(2);\n out[0] = v[0];\n out[1] = v[1];\n return out;\n}\n/**\n * 设置向量的两个项\n * @param {Vector2} out\n * @param {number} a\n * @param {number} b\n * @return {Vector2} 结果\n */\n\n\nfunction set(out, a, b) {\n out[0] = a;\n out[1] = b;\n return out;\n}\n/**\n * 向量相加\n * @param {Vector2} out\n * @param {Vector2} v1\n * @param {Vector2} v2\n */\n\n\nfunction add(out, v1, v2) {\n out[0] = v1[0] + v2[0];\n out[1] = v1[1] + v2[1];\n return out;\n}\n/**\n * 向量缩放后相加\n * @param {Vector2} out\n * @param {Vector2} v1\n * @param {Vector2} v2\n * @param {number} a\n */\n\n\nfunction scaleAndAdd(out, v1, v2, a) {\n out[0] = v1[0] + v2[0] * a;\n out[1] = v1[1] + v2[1] * a;\n return out;\n}\n/**\n * 向量相减\n * @param {Vector2} out\n * @param {Vector2} v1\n * @param {Vector2} v2\n */\n\n\nfunction sub(out, v1, v2) {\n out[0] = v1[0] - v2[0];\n out[1] = v1[1] - v2[1];\n return out;\n}\n/**\n * 向量长度\n * @param {Vector2} v\n * @return {number}\n */\n\n\nfunction len(v) {\n return Math.sqrt(lenSquare(v));\n}\n\nvar length = len; // jshint ignore:line\n\n/**\n * 向量长度平方\n * @param {Vector2} v\n * @return {number}\n */\n\nfunction lenSquare(v) {\n return v[0] * v[0] + v[1] * v[1];\n}\n\nvar lengthSquare = lenSquare;\n/**\n * 向量乘法\n * @param {Vector2} out\n * @param {Vector2} v1\n * @param {Vector2} v2\n */\n\nfunction mul(out, v1, v2) {\n out[0] = v1[0] * v2[0];\n out[1] = v1[1] * v2[1];\n return out;\n}\n/**\n * 向量除法\n * @param {Vector2} out\n * @param {Vector2} v1\n * @param {Vector2} v2\n */\n\n\nfunction div(out, v1, v2) {\n out[0] = v1[0] / v2[0];\n out[1] = v1[1] / v2[1];\n return out;\n}\n/**\n * 向量点乘\n * @param {Vector2} v1\n * @param {Vector2} v2\n * @return {number}\n */\n\n\nfunction dot(v1, v2) {\n return v1[0] * v2[0] + v1[1] * v2[1];\n}\n/**\n * 向量缩放\n * @param {Vector2} out\n * @param {Vector2} v\n * @param {number} s\n */\n\n\nfunction scale(out, v, s) {\n out[0] = v[0] * s;\n out[1] = v[1] * s;\n return out;\n}\n/**\n * 向量归一化\n * @param {Vector2} out\n * @param {Vector2} v\n */\n\n\nfunction normalize(out, v) {\n var d = len(v);\n\n if (d === 0) {\n out[0] = 0;\n out[1] = 0;\n } else {\n out[0] = v[0] / d;\n out[1] = v[1] / d;\n }\n\n return out;\n}\n/**\n * 计算向量间距离\n * @param {Vector2} v1\n * @param {Vector2} v2\n * @return {number}\n */\n\n\nfunction distance(v1, v2) {\n return Math.sqrt((v1[0] - v2[0]) * (v1[0] - v2[0]) + (v1[1] - v2[1]) * (v1[1] - v2[1]));\n}\n\nvar dist = distance;\n/**\n * 向量距离平方\n * @param {Vector2} v1\n * @param {Vector2} v2\n * @return {number}\n */\n\nfunction distanceSquare(v1, v2) {\n return (v1[0] - v2[0]) * (v1[0] - v2[0]) + (v1[1] - v2[1]) * (v1[1] - v2[1]);\n}\n\nvar distSquare = distanceSquare;\n/**\n * 求负向量\n * @param {Vector2} out\n * @param {Vector2} v\n */\n\nfunction negate(out, v) {\n out[0] = -v[0];\n out[1] = -v[1];\n return out;\n}\n/**\n * 插值两个点\n * @param {Vector2} out\n * @param {Vector2} v1\n * @param {Vector2} v2\n * @param {number} t\n */\n\n\nfunction lerp(out, v1, v2, t) {\n out[0] = v1[0] + t * (v2[0] - v1[0]);\n out[1] = v1[1] + t * (v2[1] - v1[1]);\n return out;\n}\n/**\n * 矩阵左乘向量\n * @param {Vector2} out\n * @param {Vector2} v\n * @param {Vector2} m\n */\n\n\nfunction applyTransform(out, v, m) {\n var x = v[0];\n var y = v[1];\n out[0] = m[0] * x + m[2] * y + m[4];\n out[1] = m[1] * x + m[3] * y + m[5];\n return out;\n}\n/**\n * 求两个向量最小值\n * @param {Vector2} out\n * @param {Vector2} v1\n * @param {Vector2} v2\n */\n\n\nfunction min(out, v1, v2) {\n out[0] = Math.min(v1[0], v2[0]);\n out[1] = Math.min(v1[1], v2[1]);\n return out;\n}\n/**\n * 求两个向量最大值\n * @param {Vector2} out\n * @param {Vector2} v1\n * @param {Vector2} v2\n */\n\n\nfunction max(out, v1, v2) {\n out[0] = Math.max(v1[0], v2[0]);\n out[1] = Math.max(v1[1], v2[1]);\n return out;\n}\n\nexports.create = create;\nexports.copy = copy;\nexports.clone = clone;\nexports.set = set;\nexports.add = add;\nexports.scaleAndAdd = scaleAndAdd;\nexports.sub = sub;\nexports.len = len;\nexports.length = length;\nexports.lenSquare = lenSquare;\nexports.lengthSquare = lengthSquare;\nexports.mul = mul;\nexports.div = div;\nexports.dot = dot;\nexports.scale = scale;\nexports.normalize = normalize;\nexports.distance = distance;\nexports.dist = dist;\nexports.distanceSquare = distanceSquare;\nexports.distSquare = distSquare;\nexports.negate = negate;\nexports.lerp = lerp;\nexports.applyTransform = applyTransform;\nexports.min = min;\nexports.max = max;","var _config = require(\"../config\");\n\nvar debugMode = _config.debugMode;\n\nvar logError = function () {};\n\nif (debugMode === 1) {\n logError = console.error;\n}\n\nvar _default = logError;\nmodule.exports = _default;","var _vector = require(\"./vector\");\n\nvar v2Create = _vector.create;\nvar v2DistSquare = _vector.distSquare;\n\n/**\n * 曲线辅助模块\n * @module zrender/core/curve\n * @author pissang(https://www.github.com/pissang)\n */\nvar mathPow = Math.pow;\nvar mathSqrt = Math.sqrt;\nvar EPSILON = 1e-8;\nvar EPSILON_NUMERIC = 1e-4;\nvar THREE_SQRT = mathSqrt(3);\nvar ONE_THIRD = 1 / 3; // 临时变量\n\nvar _v0 = v2Create();\n\nvar _v1 = v2Create();\n\nvar _v2 = v2Create();\n\nfunction isAroundZero(val) {\n return val > -EPSILON && val < EPSILON;\n}\n\nfunction isNotAroundZero(val) {\n return val > EPSILON || val < -EPSILON;\n}\n/**\n * 计算三次贝塞尔值\n * @memberOf module:zrender/core/curve\n * @param {number} p0\n * @param {number} p1\n * @param {number} p2\n * @param {number} p3\n * @param {number} t\n * @return {number}\n */\n\n\nfunction cubicAt(p0, p1, p2, p3, t) {\n var onet = 1 - t;\n return onet * onet * (onet * p0 + 3 * t * p1) + t * t * (t * p3 + 3 * onet * p2);\n}\n/**\n * 计算三次贝塞尔导数值\n * @memberOf module:zrender/core/curve\n * @param {number} p0\n * @param {number} p1\n * @param {number} p2\n * @param {number} p3\n * @param {number} t\n * @return {number}\n */\n\n\nfunction cubicDerivativeAt(p0, p1, p2, p3, t) {\n var onet = 1 - t;\n return 3 * (((p1 - p0) * onet + 2 * (p2 - p1) * t) * onet + (p3 - p2) * t * t);\n}\n/**\n * 计算三次贝塞尔方程根,使用盛金公式\n * @memberOf module:zrender/core/curve\n * @param {number} p0\n * @param {number} p1\n * @param {number} p2\n * @param {number} p3\n * @param {number} val\n * @param {Array.} roots\n * @return {number} 有效根数目\n */\n\n\nfunction cubicRootAt(p0, p1, p2, p3, val, roots) {\n // Evaluate roots of cubic functions\n var a = p3 + 3 * (p1 - p2) - p0;\n var b = 3 * (p2 - p1 * 2 + p0);\n var c = 3 * (p1 - p0);\n var d = p0 - val;\n var A = b * b - 3 * a * c;\n var B = b * c - 9 * a * d;\n var C = c * c - 3 * b * d;\n var n = 0;\n\n if (isAroundZero(A) && isAroundZero(B)) {\n if (isAroundZero(b)) {\n roots[0] = 0;\n } else {\n var t1 = -c / b; //t1, t2, t3, b is not zero\n\n if (t1 >= 0 && t1 <= 1) {\n roots[n++] = t1;\n }\n }\n } else {\n var disc = B * B - 4 * A * C;\n\n if (isAroundZero(disc)) {\n var K = B / A;\n var t1 = -b / a + K; // t1, a is not zero\n\n var t2 = -K / 2; // t2, t3\n\n if (t1 >= 0 && t1 <= 1) {\n roots[n++] = t1;\n }\n\n if (t2 >= 0 && t2 <= 1) {\n roots[n++] = t2;\n }\n } else if (disc > 0) {\n var discSqrt = mathSqrt(disc);\n var Y1 = A * b + 1.5 * a * (-B + discSqrt);\n var Y2 = A * b + 1.5 * a * (-B - discSqrt);\n\n if (Y1 < 0) {\n Y1 = -mathPow(-Y1, ONE_THIRD);\n } else {\n Y1 = mathPow(Y1, ONE_THIRD);\n }\n\n if (Y2 < 0) {\n Y2 = -mathPow(-Y2, ONE_THIRD);\n } else {\n Y2 = mathPow(Y2, ONE_THIRD);\n }\n\n var t1 = (-b - (Y1 + Y2)) / (3 * a);\n\n if (t1 >= 0 && t1 <= 1) {\n roots[n++] = t1;\n }\n } else {\n var T = (2 * A * b - 3 * a * B) / (2 * mathSqrt(A * A * A));\n var theta = Math.acos(T) / 3;\n var ASqrt = mathSqrt(A);\n var tmp = Math.cos(theta);\n var t1 = (-b - 2 * ASqrt * tmp) / (3 * a);\n var t2 = (-b + ASqrt * (tmp + THREE_SQRT * Math.sin(theta))) / (3 * a);\n var t3 = (-b + ASqrt * (tmp - THREE_SQRT * Math.sin(theta))) / (3 * a);\n\n if (t1 >= 0 && t1 <= 1) {\n roots[n++] = t1;\n }\n\n if (t2 >= 0 && t2 <= 1) {\n roots[n++] = t2;\n }\n\n if (t3 >= 0 && t3 <= 1) {\n roots[n++] = t3;\n }\n }\n }\n\n return n;\n}\n/**\n * 计算三次贝塞尔方程极限值的位置\n * @memberOf module:zrender/core/curve\n * @param {number} p0\n * @param {number} p1\n * @param {number} p2\n * @param {number} p3\n * @param {Array.} extrema\n * @return {number} 有效数目\n */\n\n\nfunction cubicExtrema(p0, p1, p2, p3, extrema) {\n var b = 6 * p2 - 12 * p1 + 6 * p0;\n var a = 9 * p1 + 3 * p3 - 3 * p0 - 9 * p2;\n var c = 3 * p1 - 3 * p0;\n var n = 0;\n\n if (isAroundZero(a)) {\n if (isNotAroundZero(b)) {\n var t1 = -c / b;\n\n if (t1 >= 0 && t1 <= 1) {\n extrema[n++] = t1;\n }\n }\n } else {\n var disc = b * b - 4 * a * c;\n\n if (isAroundZero(disc)) {\n extrema[0] = -b / (2 * a);\n } else if (disc > 0) {\n var discSqrt = mathSqrt(disc);\n var t1 = (-b + discSqrt) / (2 * a);\n var t2 = (-b - discSqrt) / (2 * a);\n\n if (t1 >= 0 && t1 <= 1) {\n extrema[n++] = t1;\n }\n\n if (t2 >= 0 && t2 <= 1) {\n extrema[n++] = t2;\n }\n }\n }\n\n return n;\n}\n/**\n * 细分三次贝塞尔曲线\n * @memberOf module:zrender/core/curve\n * @param {number} p0\n * @param {number} p1\n * @param {number} p2\n * @param {number} p3\n * @param {number} t\n * @param {Array.} out\n */\n\n\nfunction cubicSubdivide(p0, p1, p2, p3, t, out) {\n var p01 = (p1 - p0) * t + p0;\n var p12 = (p2 - p1) * t + p1;\n var p23 = (p3 - p2) * t + p2;\n var p012 = (p12 - p01) * t + p01;\n var p123 = (p23 - p12) * t + p12;\n var p0123 = (p123 - p012) * t + p012; // Seg0\n\n out[0] = p0;\n out[1] = p01;\n out[2] = p012;\n out[3] = p0123; // Seg1\n\n out[4] = p0123;\n out[5] = p123;\n out[6] = p23;\n out[7] = p3;\n}\n/**\n * 投射点到三次贝塞尔曲线上,返回投射距离。\n * 投射点有可能会有一个或者多个,这里只返回其中距离最短的一个。\n * @param {number} x0\n * @param {number} y0\n * @param {number} x1\n * @param {number} y1\n * @param {number} x2\n * @param {number} y2\n * @param {number} x3\n * @param {number} y3\n * @param {number} x\n * @param {number} y\n * @param {Array.} [out] 投射点\n * @return {number}\n */\n\n\nfunction cubicProjectPoint(x0, y0, x1, y1, x2, y2, x3, y3, x, y, out) {\n // http://pomax.github.io/bezierinfo/#projections\n var t;\n var interval = 0.005;\n var d = Infinity;\n var prev;\n var next;\n var d1;\n var d2;\n _v0[0] = x;\n _v0[1] = y; // 先粗略估计一下可能的最小距离的 t 值\n // PENDING\n\n for (var _t = 0; _t < 1; _t += 0.05) {\n _v1[0] = cubicAt(x0, x1, x2, x3, _t);\n _v1[1] = cubicAt(y0, y1, y2, y3, _t);\n d1 = v2DistSquare(_v0, _v1);\n\n if (d1 < d) {\n t = _t;\n d = d1;\n }\n }\n\n d = Infinity; // At most 32 iteration\n\n for (var i = 0; i < 32; i++) {\n if (interval < EPSILON_NUMERIC) {\n break;\n }\n\n prev = t - interval;\n next = t + interval; // t - interval\n\n _v1[0] = cubicAt(x0, x1, x2, x3, prev);\n _v1[1] = cubicAt(y0, y1, y2, y3, prev);\n d1 = v2DistSquare(_v1, _v0);\n\n if (prev >= 0 && d1 < d) {\n t = prev;\n d = d1;\n } else {\n // t + interval\n _v2[0] = cubicAt(x0, x1, x2, x3, next);\n _v2[1] = cubicAt(y0, y1, y2, y3, next);\n d2 = v2DistSquare(_v2, _v0);\n\n if (next <= 1 && d2 < d) {\n t = next;\n d = d2;\n } else {\n interval *= 0.5;\n }\n }\n } // t\n\n\n if (out) {\n out[0] = cubicAt(x0, x1, x2, x3, t);\n out[1] = cubicAt(y0, y1, y2, y3, t);\n } // console.log(interval, i);\n\n\n return mathSqrt(d);\n}\n/**\n * 计算二次方贝塞尔值\n * @param {number} p0\n * @param {number} p1\n * @param {number} p2\n * @param {number} t\n * @return {number}\n */\n\n\nfunction quadraticAt(p0, p1, p2, t) {\n var onet = 1 - t;\n return onet * (onet * p0 + 2 * t * p1) + t * t * p2;\n}\n/**\n * 计算二次方贝塞尔导数值\n * @param {number} p0\n * @param {number} p1\n * @param {number} p2\n * @param {number} t\n * @return {number}\n */\n\n\nfunction quadraticDerivativeAt(p0, p1, p2, t) {\n return 2 * ((1 - t) * (p1 - p0) + t * (p2 - p1));\n}\n/**\n * 计算二次方贝塞尔方程根\n * @param {number} p0\n * @param {number} p1\n * @param {number} p2\n * @param {number} t\n * @param {Array.} roots\n * @return {number} 有效根数目\n */\n\n\nfunction quadraticRootAt(p0, p1, p2, val, roots) {\n var a = p0 - 2 * p1 + p2;\n var b = 2 * (p1 - p0);\n var c = p0 - val;\n var n = 0;\n\n if (isAroundZero(a)) {\n if (isNotAroundZero(b)) {\n var t1 = -c / b;\n\n if (t1 >= 0 && t1 <= 1) {\n roots[n++] = t1;\n }\n }\n } else {\n var disc = b * b - 4 * a * c;\n\n if (isAroundZero(disc)) {\n var t1 = -b / (2 * a);\n\n if (t1 >= 0 && t1 <= 1) {\n roots[n++] = t1;\n }\n } else if (disc > 0) {\n var discSqrt = mathSqrt(disc);\n var t1 = (-b + discSqrt) / (2 * a);\n var t2 = (-b - discSqrt) / (2 * a);\n\n if (t1 >= 0 && t1 <= 1) {\n roots[n++] = t1;\n }\n\n if (t2 >= 0 && t2 <= 1) {\n roots[n++] = t2;\n }\n }\n }\n\n return n;\n}\n/**\n * 计算二次贝塞尔方程极限值\n * @memberOf module:zrender/core/curve\n * @param {number} p0\n * @param {number} p1\n * @param {number} p2\n * @return {number}\n */\n\n\nfunction quadraticExtremum(p0, p1, p2) {\n var divider = p0 + p2 - 2 * p1;\n\n if (divider === 0) {\n // p1 is center of p0 and p2\n return 0.5;\n } else {\n return (p0 - p1) / divider;\n }\n}\n/**\n * 细分二次贝塞尔曲线\n * @memberOf module:zrender/core/curve\n * @param {number} p0\n * @param {number} p1\n * @param {number} p2\n * @param {number} t\n * @param {Array.} out\n */\n\n\nfunction quadraticSubdivide(p0, p1, p2, t, out) {\n var p01 = (p1 - p0) * t + p0;\n var p12 = (p2 - p1) * t + p1;\n var p012 = (p12 - p01) * t + p01; // Seg0\n\n out[0] = p0;\n out[1] = p01;\n out[2] = p012; // Seg1\n\n out[3] = p012;\n out[4] = p12;\n out[5] = p2;\n}\n/**\n * 投射点到二次贝塞尔曲线上,返回投射距离。\n * 投射点有可能会有一个或者多个,这里只返回其中距离最短的一个。\n * @param {number} x0\n * @param {number} y0\n * @param {number} x1\n * @param {number} y1\n * @param {number} x2\n * @param {number} y2\n * @param {number} x\n * @param {number} y\n * @param {Array.} out 投射点\n * @return {number}\n */\n\n\nfunction quadraticProjectPoint(x0, y0, x1, y1, x2, y2, x, y, out) {\n // http://pomax.github.io/bezierinfo/#projections\n var t;\n var interval = 0.005;\n var d = Infinity;\n _v0[0] = x;\n _v0[1] = y; // 先粗略估计一下可能的最小距离的 t 值\n // PENDING\n\n for (var _t = 0; _t < 1; _t += 0.05) {\n _v1[0] = quadraticAt(x0, x1, x2, _t);\n _v1[1] = quadraticAt(y0, y1, y2, _t);\n var d1 = v2DistSquare(_v0, _v1);\n\n if (d1 < d) {\n t = _t;\n d = d1;\n }\n }\n\n d = Infinity; // At most 32 iteration\n\n for (var i = 0; i < 32; i++) {\n if (interval < EPSILON_NUMERIC) {\n break;\n }\n\n var prev = t - interval;\n var next = t + interval; // t - interval\n\n _v1[0] = quadraticAt(x0, x1, x2, prev);\n _v1[1] = quadraticAt(y0, y1, y2, prev);\n var d1 = v2DistSquare(_v1, _v0);\n\n if (prev >= 0 && d1 < d) {\n t = prev;\n d = d1;\n } else {\n // t + interval\n _v2[0] = quadraticAt(x0, x1, x2, next);\n _v2[1] = quadraticAt(y0, y1, y2, next);\n var d2 = v2DistSquare(_v2, _v0);\n\n if (next <= 1 && d2 < d) {\n t = next;\n d = d2;\n } else {\n interval *= 0.5;\n }\n }\n } // t\n\n\n if (out) {\n out[0] = quadraticAt(x0, x1, x2, t);\n out[1] = quadraticAt(y0, y1, y2, t);\n } // console.log(interval, i);\n\n\n return mathSqrt(d);\n}\n\nexports.cubicAt = cubicAt;\nexports.cubicDerivativeAt = cubicDerivativeAt;\nexports.cubicRootAt = cubicRootAt;\nexports.cubicExtrema = cubicExtrema;\nexports.cubicSubdivide = cubicSubdivide;\nexports.cubicProjectPoint = cubicProjectPoint;\nexports.quadraticAt = quadraticAt;\nexports.quadraticDerivativeAt = quadraticDerivativeAt;\nexports.quadraticRootAt = quadraticRootAt;\nexports.quadraticExtremum = quadraticExtremum;\nexports.quadraticSubdivide = quadraticSubdivide;\nexports.quadraticProjectPoint = quadraticProjectPoint;","var Eventful = require(\"../mixin/Eventful\");\n\nexports.Dispatcher = Eventful;\n\nvar env = require(\"./env\");\n\nvar _dom = require(\"./dom\");\n\nvar isCanvasEl = _dom.isCanvasEl;\nvar transformCoordWithViewport = _dom.transformCoordWithViewport;\n\n/**\n * Utilities for mouse or touch events.\n */\nvar isDomLevel2 = typeof window !== 'undefined' && !!window.addEventListener;\nvar MOUSE_EVENT_REG = /^(?:mouse|pointer|contextmenu|drag|drop)|click/;\nvar _calcOut = [];\n/**\n * Get the `zrX` and `zrY`, which are relative to the top-left of\n * the input `el`.\n * CSS transform (2D & 3D) is supported.\n *\n * The strategy to fetch the coords:\n * + If `calculate` is not set as `true`, users of this method should\n * ensure that `el` is the same or the same size & location as `e.target`.\n * Otherwise the result coords are probably not expected. Because we\n * firstly try to get coords from e.offsetX/e.offsetY.\n * + If `calculate` is set as `true`, the input `el` can be any element\n * and we force to calculate the coords based on `el`.\n * + The input `el` should be positionable (not position:static).\n *\n * The force `calculate` can be used in case like:\n * When mousemove event triggered on ec tooltip, `e.target` is not `el`(zr painter.dom).\n *\n * @param {HTMLElement} el DOM element.\n * @param {Event} e Mouse event or touch event.\n * @param {Object} out Get `out.zrX` and `out.zrY` as the result.\n * @param {boolean} [calculate=false] Whether to force calculate\n * the coordinates but not use ones provided by browser.\n */\n\nfunction clientToLocal(el, e, out, calculate) {\n out = out || {}; // According to the W3C Working Draft, offsetX and offsetY should be relative\n // to the padding edge of the target element. The only browser using this convention\n // is IE. Webkit uses the border edge, Opera uses the content edge, and FireFox does\n // not support the properties.\n // (see http://www.jacklmoore.com/notes/mouse-position/)\n // In zr painter.dom, padding edge equals to border edge.\n\n if (calculate || !env.canvasSupported) {\n calculateZrXY(el, e, out);\n } // Caution: In FireFox, layerX/layerY Mouse position relative to the closest positioned\n // ancestor element, so we should make sure el is positioned (e.g., not position:static).\n // BTW1, Webkit don't return the same results as FF in non-simple cases (like add\n // zoom-factor, overflow / opacity layers, transforms ...)\n // BTW2, (ev.offsetY || ev.pageY - $(ev.target).offset().top) is not correct in preserve-3d.\n // \n // BTW3, In ff, offsetX/offsetY is always 0.\n else if (env.browser.firefox && e.layerX != null && e.layerX !== e.offsetX) {\n out.zrX = e.layerX;\n out.zrY = e.layerY;\n } // For IE6+, chrome, safari, opera. (When will ff support offsetX?)\n else if (e.offsetX != null) {\n out.zrX = e.offsetX;\n out.zrY = e.offsetY;\n } // For some other device, e.g., IOS safari.\n else {\n calculateZrXY(el, e, out);\n }\n\n return out;\n}\n\nfunction calculateZrXY(el, e, out) {\n // BlackBerry 5, iOS 3 (original iPhone) don't have getBoundingRect.\n if (env.domSupported && el.getBoundingClientRect) {\n var ex = e.clientX;\n var ey = e.clientY;\n\n if (isCanvasEl(el)) {\n // Original approach, which do not support CSS transform.\n // marker can not be locationed in a canvas container\n // (getBoundingClientRect is always 0). We do not support\n // that input a pre-created canvas to zr while using css\n // transform in iOS.\n var box = el.getBoundingClientRect();\n out.zrX = ex - box.left;\n out.zrY = ey - box.top;\n return;\n } else {\n if (transformCoordWithViewport(_calcOut, el, ex, ey)) {\n out.zrX = _calcOut[0];\n out.zrY = _calcOut[1];\n return;\n }\n }\n }\n\n out.zrX = out.zrY = 0;\n}\n/**\n * Find native event compat for legency IE.\n * Should be called at the begining of a native event listener.\n *\n * @param {Event} [e] Mouse event or touch event or pointer event.\n * For lagency IE, we use `window.event` is used.\n * @return {Event} The native event.\n */\n\n\nfunction getNativeEvent(e) {\n return e || window.event;\n}\n/**\n * Normalize the coordinates of the input event.\n *\n * Get the `e.zrX` and `e.zrY`, which are relative to the top-left of\n * the input `el`.\n * Get `e.zrDelta` if using mouse wheel.\n * Get `e.which`, see the comment inside this function.\n *\n * Do not calculate repeatly if `zrX` and `zrY` already exist.\n *\n * Notice: see comments in `clientToLocal`. check the relationship\n * between the result coords and the parameters `el` and `calculate`.\n *\n * @param {HTMLElement} el DOM element.\n * @param {Event} [e] See `getNativeEvent`.\n * @param {boolean} [calculate=false] Whether to force calculate\n * the coordinates but not use ones provided by browser.\n * @return {UIEvent} The normalized native UIEvent.\n */\n\n\nfunction normalizeEvent(el, e, calculate) {\n e = getNativeEvent(e);\n\n if (e.zrX != null) {\n return e;\n }\n\n var eventType = e.type;\n var isTouch = eventType && eventType.indexOf('touch') >= 0;\n\n if (!isTouch) {\n clientToLocal(el, e, e, calculate);\n e.zrDelta = e.wheelDelta ? e.wheelDelta / 120 : -(e.detail || 0) / 3;\n } else {\n var touch = eventType !== 'touchend' ? e.targetTouches[0] : e.changedTouches[0];\n touch && clientToLocal(el, touch, e, calculate);\n } // Add which for click: 1 === left; 2 === middle; 3 === right; otherwise: 0;\n // See jQuery: https://github.com/jquery/jquery/blob/master/src/event.js\n // If e.which has been defined, it may be readonly,\n // see: https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/which\n\n\n var button = e.button;\n\n if (e.which == null && button !== undefined && MOUSE_EVENT_REG.test(e.type)) {\n e.which = button & 1 ? 1 : button & 2 ? 3 : button & 4 ? 2 : 0;\n } // [Caution]: `e.which` from browser is not always reliable. For example,\n // when press left button and `mousemove (pointermove)` in Edge, the `e.which`\n // is 65536 and the `e.button` is -1. But the `mouseup (pointerup)` and\n // `mousedown (pointerdown)` is the same as Chrome does.\n\n\n return e;\n}\n/**\n * @param {HTMLElement} el\n * @param {string} name\n * @param {Function} handler\n * @param {Object|boolean} opt If boolean, means `opt.capture`\n * @param {boolean} [opt.capture=false]\n * @param {boolean} [opt.passive=false]\n */\n\n\nfunction addEventListener(el, name, handler, opt) {\n if (isDomLevel2) {\n // Reproduct the console warning:\n // [Violation] Added non-passive event listener to a scroll-blocking event.\n // Consider marking event handler as 'passive' to make the page more responsive.\n // Just set console log level: verbose in chrome dev tool.\n // then the warning log will be printed when addEventListener called.\n // See https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\n // We have not yet found a neat way to using passive. Because in zrender the dom event\n // listener delegate all of the upper events of element. Some of those events need\n // to prevent default. For example, the feature `preventDefaultMouseMove` of echarts.\n // Before passive can be adopted, these issues should be considered:\n // (1) Whether and how a zrender user specifies an event listener passive. And by default,\n // passive or not.\n // (2) How to tread that some zrender event listener is passive, and some is not. If\n // we use other way but not preventDefault of mousewheel and touchmove, browser\n // compatibility should be handled.\n // var opts = (env.passiveSupported && name === 'mousewheel')\n // ? {passive: true}\n // // By default, the third param of el.addEventListener is `capture: false`.\n // : void 0;\n // el.addEventListener(name, handler /* , opts */);\n el.addEventListener(name, handler, opt);\n } else {\n // For simplicity, do not implement `setCapture` for IE9-.\n el.attachEvent('on' + name, handler);\n }\n}\n/**\n * Parameter are the same as `addEventListener`.\n *\n * Notice that if a listener is registered twice, one with capture and one without,\n * remove each one separately. Removal of a capturing listener does not affect a\n * non-capturing version of the same listener, and vice versa.\n */\n\n\nfunction removeEventListener(el, name, handler, opt) {\n if (isDomLevel2) {\n el.removeEventListener(name, handler, opt);\n } else {\n el.detachEvent('on' + name, handler);\n }\n}\n/**\n * preventDefault and stopPropagation.\n * Notice: do not use this method in zrender. It can only be\n * used by upper applications if necessary.\n *\n * @param {Event} e A mouse or touch event.\n */\n\n\nvar stop = isDomLevel2 ? function (e) {\n e.preventDefault();\n e.stopPropagation();\n e.cancelBubble = true;\n} : function (e) {\n e.returnValue = false;\n e.cancelBubble = true;\n};\n/**\n * This method only works for mouseup and mousedown. The functionality is restricted\n * for fault tolerance, See the `e.which` compatibility above.\n *\n * @param {MouseEvent} e\n * @return {boolean}\n */\n\nfunction isMiddleOrRightButtonOnMouseUpDown(e) {\n return e.which === 2 || e.which === 3;\n}\n/**\n * To be removed.\n * @deprecated\n */\n\n\nfunction notLeftMouse(e) {\n // If e.which is undefined, considered as left mouse event.\n return e.which > 1;\n} // For backward compatibility\n\n\nexports.clientToLocal = clientToLocal;\nexports.getNativeEvent = getNativeEvent;\nexports.normalizeEvent = normalizeEvent;\nexports.addEventListener = addEventListener;\nexports.removeEventListener = removeEventListener;\nexports.stop = stop;\nexports.isMiddleOrRightButtonOnMouseUpDown = isMiddleOrRightButtonOnMouseUpDown;\nexports.notLeftMouse = notLeftMouse;","var env = require(\"./env\");\n\nvar _fourPointsTransform = require(\"./fourPointsTransform\");\n\nvar buildTransformer = _fourPointsTransform.buildTransformer;\nvar EVENT_SAVED_PROP = '___zrEVENTSAVED';\nvar _calcOut = [];\n/**\n * Transform \"local coord\" from `elFrom` to `elTarget`.\n * \"local coord\": the coord based on the input `el`. The origin point is at\n * the position of \"left: 0; top: 0;\" in the `el`.\n *\n * Support when CSS transform is used.\n *\n * Having the `out` (that is, `[outX, outY]`), we can create an DOM element\n * and set the CSS style as \"left: outX; top: outY;\" and append it to `elTarge`\n * to locate the element.\n *\n * For example, this code below positions a child of `document.body` on the event\n * point, no matter whether `body` has `margin`/`paddin`/`transfrom`/... :\n * ```js\n * transformLocalCoord(out, container, document.body, event.offsetX, event.offsetY);\n * if (!eqNaN(out[0])) {\n * // Then locate the tip element on the event point.\n * var tipEl = document.createElement('div');\n * tipEl.style.cssText = 'position: absolute; left:' + out[0] + ';top:' + out[1] + ';';\n * document.body.appendChild(tipEl);\n * }\n * ```\n *\n * Notice: In some env this method is not supported. If called, `out` will be `[NaN, NaN]`.\n *\n * @param {Array.} out [inX: number, inY: number] The output..\n * If can not transform, `out` will not be modified but return `false`.\n * @param {HTMLElement} elFrom The `[inX, inY]` is based on elFrom.\n * @param {HTMLElement} elTarget The `out` is based on elTarget.\n * @param {number} inX\n * @param {number} inY\n * @return {boolean} Whether transform successfully.\n */\n\nfunction transformLocalCoord(out, elFrom, elTarget, inX, inY) {\n return transformCoordWithViewport(_calcOut, elFrom, inX, inY, true) && transformCoordWithViewport(out, elTarget, _calcOut[0], _calcOut[1]);\n}\n/**\n * Transform between a \"viewport coord\" and a \"local coord\".\n * \"viewport coord\": the coord based on the left-top corner of the viewport\n * of the browser.\n * \"local coord\": the coord based on the input `el`. The origin point is at\n * the position of \"left: 0; top: 0;\" in the `el`.\n *\n * Support the case when CSS transform is used on el.\n *\n * @param {Array.} out [inX: number, inY: number] The output. If `inverse: false`,\n * it represents \"local coord\", otherwise \"vireport coord\".\n * If can not transform, `out` will not be modified but return `false`.\n * @param {HTMLElement} el The \"local coord\" is based on the `el`, see comment above.\n * @param {number} inX If `inverse: false`,\n * it represents \"vireport coord\", otherwise \"local coord\".\n * @param {number} inY If `inverse: false`,\n * it represents \"vireport coord\", otherwise \"local coord\".\n * @param {boolean} [inverse=false]\n * `true`: from \"viewport coord\" to \"local coord\".\n * `false`: from \"local coord\" to \"viewport coord\".\n * @return {boolean} Whether transform successfully.\n */\n\n\nfunction transformCoordWithViewport(out, el, inX, inY, inverse) {\n if (el.getBoundingClientRect && env.domSupported && !isCanvasEl(el)) {\n var saved = el[EVENT_SAVED_PROP] || (el[EVENT_SAVED_PROP] = {});\n var markers = prepareCoordMarkers(el, saved);\n var transformer = preparePointerTransformer(markers, saved, inverse);\n\n if (transformer) {\n transformer(out, inX, inY);\n return true;\n }\n }\n\n return false;\n}\n\nfunction prepareCoordMarkers(el, saved) {\n var markers = saved.markers;\n\n if (markers) {\n return markers;\n }\n\n markers = saved.markers = [];\n var propLR = ['left', 'right'];\n var propTB = ['top', 'bottom'];\n\n for (var i = 0; i < 4; i++) {\n var marker = document.createElement('div');\n var stl = marker.style;\n var idxLR = i % 2;\n var idxTB = (i >> 1) % 2;\n stl.cssText = ['position: absolute', 'visibility: hidden', 'padding: 0', 'margin: 0', 'border-width: 0', 'user-select: none', 'width:0', 'height:0', // 'width: 5px',\n // 'height: 5px',\n propLR[idxLR] + ':0', propTB[idxTB] + ':0', propLR[1 - idxLR] + ':auto', propTB[1 - idxTB] + ':auto', ''].join('!important;');\n el.appendChild(marker);\n markers.push(marker);\n }\n\n return markers;\n}\n\nfunction preparePointerTransformer(markers, saved, inverse) {\n var transformerName = inverse ? 'invTrans' : 'trans';\n var transformer = saved[transformerName];\n var oldSrcCoords = saved.srcCoords;\n var oldCoordTheSame = true;\n var srcCoords = [];\n var destCoords = [];\n\n for (var i = 0; i < 4; i++) {\n var rect = markers[i].getBoundingClientRect();\n var ii = 2 * i;\n var x = rect.left;\n var y = rect.top;\n srcCoords.push(x, y);\n oldCoordTheSame = oldCoordTheSame && oldSrcCoords && x === oldSrcCoords[ii] && y === oldSrcCoords[ii + 1];\n destCoords.push(markers[i].offsetLeft, markers[i].offsetTop);\n } // Cache to avoid time consuming of `buildTransformer`.\n\n\n return oldCoordTheSame && transformer ? transformer : (saved.srcCoords = srcCoords, saved[transformerName] = inverse ? buildTransformer(destCoords, srcCoords) : buildTransformer(srcCoords, destCoords));\n}\n\nfunction isCanvasEl(el) {\n return el.nodeName.toUpperCase() === 'CANVAS';\n}\n\nexports.transformLocalCoord = transformLocalCoord;\nexports.transformCoordWithViewport = transformCoordWithViewport;\nexports.isCanvasEl = isCanvasEl;","/**\n * @module zrender/core/util\n */\n// 用于处理merge时无法遍历Date等对象的问题\nvar BUILTIN_OBJECT = {\n '[object Function]': 1,\n '[object RegExp]': 1,\n '[object Date]': 1,\n '[object Error]': 1,\n '[object CanvasGradient]': 1,\n '[object CanvasPattern]': 1,\n // For node-canvas\n '[object Image]': 1,\n '[object Canvas]': 1\n};\nvar TYPED_ARRAY = {\n '[object Int8Array]': 1,\n '[object Uint8Array]': 1,\n '[object Uint8ClampedArray]': 1,\n '[object Int16Array]': 1,\n '[object Uint16Array]': 1,\n '[object Int32Array]': 1,\n '[object Uint32Array]': 1,\n '[object Float32Array]': 1,\n '[object Float64Array]': 1\n};\nvar objToString = Object.prototype.toString;\nvar arrayProto = Array.prototype;\nvar nativeForEach = arrayProto.forEach;\nvar nativeFilter = arrayProto.filter;\nvar nativeSlice = arrayProto.slice;\nvar nativeMap = arrayProto.map;\nvar nativeReduce = arrayProto.reduce; // Avoid assign to an exported variable, for transforming to cjs.\n\nvar methods = {};\n\nfunction $override(name, fn) {\n // Clear ctx instance for different environment\n if (name === 'createCanvas') {\n _ctx = null;\n }\n\n methods[name] = fn;\n}\n/**\n * Those data types can be cloned:\n * Plain object, Array, TypedArray, number, string, null, undefined.\n * Those data types will be assgined using the orginal data:\n * BUILTIN_OBJECT\n * Instance of user defined class will be cloned to a plain object, without\n * properties in prototype.\n * Other data types is not supported (not sure what will happen).\n *\n * Caution: do not support clone Date, for performance consideration.\n * (There might be a large number of date in `series.data`).\n * So date should not be modified in and out of echarts.\n *\n * @param {*} source\n * @return {*} new\n */\n\n\nfunction clone(source) {\n if (source == null || typeof source !== 'object') {\n return source;\n }\n\n var result = source;\n var typeStr = objToString.call(source);\n\n if (typeStr === '[object Array]') {\n if (!isPrimitive(source)) {\n result = [];\n\n for (var i = 0, len = source.length; i < len; i++) {\n result[i] = clone(source[i]);\n }\n }\n } else if (TYPED_ARRAY[typeStr]) {\n if (!isPrimitive(source)) {\n var Ctor = source.constructor;\n\n if (source.constructor.from) {\n result = Ctor.from(source);\n } else {\n result = new Ctor(source.length);\n\n for (var i = 0, len = source.length; i < len; i++) {\n result[i] = clone(source[i]);\n }\n }\n }\n } else if (!BUILTIN_OBJECT[typeStr] && !isPrimitive(source) && !isDom(source)) {\n result = {};\n\n for (var key in source) {\n if (source.hasOwnProperty(key)) {\n result[key] = clone(source[key]);\n }\n }\n }\n\n return result;\n}\n/**\n * @memberOf module:zrender/core/util\n * @param {*} target\n * @param {*} source\n * @param {boolean} [overwrite=false]\n */\n\n\nfunction merge(target, source, overwrite) {\n // We should escapse that source is string\n // and enter for ... in ...\n if (!isObject(source) || !isObject(target)) {\n return overwrite ? clone(source) : target;\n }\n\n for (var key in source) {\n if (source.hasOwnProperty(key)) {\n var targetProp = target[key];\n var sourceProp = source[key];\n\n if (isObject(sourceProp) && isObject(targetProp) && !isArray(sourceProp) && !isArray(targetProp) && !isDom(sourceProp) && !isDom(targetProp) && !isBuiltInObject(sourceProp) && !isBuiltInObject(targetProp) && !isPrimitive(sourceProp) && !isPrimitive(targetProp)) {\n // 如果需要递归覆盖,就递归调用merge\n merge(targetProp, sourceProp, overwrite);\n } else if (overwrite || !(key in target)) {\n // 否则只处理overwrite为true,或者在目标对象中没有此属性的情况\n // NOTE,在 target[key] 不存在的时候也是直接覆盖\n target[key] = clone(source[key], true);\n }\n }\n }\n\n return target;\n}\n/**\n * @param {Array} targetAndSources The first item is target, and the rests are source.\n * @param {boolean} [overwrite=false]\n * @return {*} target\n */\n\n\nfunction mergeAll(targetAndSources, overwrite) {\n var result = targetAndSources[0];\n\n for (var i = 1, len = targetAndSources.length; i < len; i++) {\n result = merge(result, targetAndSources[i], overwrite);\n }\n\n return result;\n}\n/**\n * @param {*} target\n * @param {*} source\n * @memberOf module:zrender/core/util\n */\n\n\nfunction extend(target, source) {\n for (var key in source) {\n if (source.hasOwnProperty(key)) {\n target[key] = source[key];\n }\n }\n\n return target;\n}\n/**\n * @param {*} target\n * @param {*} source\n * @param {boolean} [overlay=false]\n * @memberOf module:zrender/core/util\n */\n\n\nfunction defaults(target, source, overlay) {\n for (var key in source) {\n if (source.hasOwnProperty(key) && (overlay ? source[key] != null : target[key] == null)) {\n target[key] = source[key];\n }\n }\n\n return target;\n}\n\nvar createCanvas = function () {\n return methods.createCanvas();\n};\n\nmethods.createCanvas = function () {\n return document.createElement('canvas');\n}; // FIXME\n\n\nvar _ctx;\n\nfunction getContext() {\n if (!_ctx) {\n // Use util.createCanvas instead of createCanvas\n // because createCanvas may be overwritten in different environment\n _ctx = createCanvas().getContext('2d');\n }\n\n return _ctx;\n}\n/**\n * 查询数组中元素的index\n * @memberOf module:zrender/core/util\n */\n\n\nfunction indexOf(array, value) {\n if (array) {\n if (array.indexOf) {\n return array.indexOf(value);\n }\n\n for (var i = 0, len = array.length; i < len; i++) {\n if (array[i] === value) {\n return i;\n }\n }\n }\n\n return -1;\n}\n/**\n * 构造类继承关系\n *\n * @memberOf module:zrender/core/util\n * @param {Function} clazz 源类\n * @param {Function} baseClazz 基类\n */\n\n\nfunction inherits(clazz, baseClazz) {\n var clazzPrototype = clazz.prototype;\n\n function F() {}\n\n F.prototype = baseClazz.prototype;\n clazz.prototype = new F();\n\n for (var prop in clazzPrototype) {\n if (clazzPrototype.hasOwnProperty(prop)) {\n clazz.prototype[prop] = clazzPrototype[prop];\n }\n }\n\n clazz.prototype.constructor = clazz;\n clazz.superClass = baseClazz;\n}\n/**\n * @memberOf module:zrender/core/util\n * @param {Object|Function} target\n * @param {Object|Function} sorce\n * @param {boolean} overlay\n */\n\n\nfunction mixin(target, source, overlay) {\n target = 'prototype' in target ? target.prototype : target;\n source = 'prototype' in source ? source.prototype : source;\n defaults(target, source, overlay);\n}\n/**\n * Consider typed array.\n * @param {Array|TypedArray} data\n */\n\n\nfunction isArrayLike(data) {\n if (!data) {\n return;\n }\n\n if (typeof data === 'string') {\n return false;\n }\n\n return typeof data.length === 'number';\n}\n/**\n * 数组或对象遍历\n * @memberOf module:zrender/core/util\n * @param {Object|Array} obj\n * @param {Function} cb\n * @param {*} [context]\n */\n\n\nfunction each(obj, cb, context) {\n if (!(obj && cb)) {\n return;\n }\n\n if (obj.forEach && obj.forEach === nativeForEach) {\n obj.forEach(cb, context);\n } else if (obj.length === +obj.length) {\n for (var i = 0, len = obj.length; i < len; i++) {\n cb.call(context, obj[i], i, obj);\n }\n } else {\n for (var key in obj) {\n if (obj.hasOwnProperty(key)) {\n cb.call(context, obj[key], key, obj);\n }\n }\n }\n}\n/**\n * 数组映射\n * @memberOf module:zrender/core/util\n * @param {Array} obj\n * @param {Function} cb\n * @param {*} [context]\n * @return {Array}\n */\n\n\nfunction map(obj, cb, context) {\n if (!(obj && cb)) {\n return;\n }\n\n if (obj.map && obj.map === nativeMap) {\n return obj.map(cb, context);\n } else {\n var result = [];\n\n for (var i = 0, len = obj.length; i < len; i++) {\n result.push(cb.call(context, obj[i], i, obj));\n }\n\n return result;\n }\n}\n/**\n * @memberOf module:zrender/core/util\n * @param {Array} obj\n * @param {Function} cb\n * @param {Object} [memo]\n * @param {*} [context]\n * @return {Array}\n */\n\n\nfunction reduce(obj, cb, memo, context) {\n if (!(obj && cb)) {\n return;\n }\n\n if (obj.reduce && obj.reduce === nativeReduce) {\n return obj.reduce(cb, memo, context);\n } else {\n for (var i = 0, len = obj.length; i < len; i++) {\n memo = cb.call(context, memo, obj[i], i, obj);\n }\n\n return memo;\n }\n}\n/**\n * 数组过滤\n * @memberOf module:zrender/core/util\n * @param {Array} obj\n * @param {Function} cb\n * @param {*} [context]\n * @return {Array}\n */\n\n\nfunction filter(obj, cb, context) {\n if (!(obj && cb)) {\n return;\n }\n\n if (obj.filter && obj.filter === nativeFilter) {\n return obj.filter(cb, context);\n } else {\n var result = [];\n\n for (var i = 0, len = obj.length; i < len; i++) {\n if (cb.call(context, obj[i], i, obj)) {\n result.push(obj[i]);\n }\n }\n\n return result;\n }\n}\n/**\n * 数组项查找\n * @memberOf module:zrender/core/util\n * @param {Array} obj\n * @param {Function} cb\n * @param {*} [context]\n * @return {*}\n */\n\n\nfunction find(obj, cb, context) {\n if (!(obj && cb)) {\n return;\n }\n\n for (var i = 0, len = obj.length; i < len; i++) {\n if (cb.call(context, obj[i], i, obj)) {\n return obj[i];\n }\n }\n}\n/**\n * @memberOf module:zrender/core/util\n * @param {Function} func\n * @param {*} context\n * @return {Function}\n */\n\n\nfunction bind(func, context) {\n var args = nativeSlice.call(arguments, 2);\n return function () {\n return func.apply(context, args.concat(nativeSlice.call(arguments)));\n };\n}\n/**\n * @memberOf module:zrender/core/util\n * @param {Function} func\n * @return {Function}\n */\n\n\nfunction curry(func) {\n var args = nativeSlice.call(arguments, 1);\n return function () {\n return func.apply(this, args.concat(nativeSlice.call(arguments)));\n };\n}\n/**\n * @memberOf module:zrender/core/util\n * @param {*} value\n * @return {boolean}\n */\n\n\nfunction isArray(value) {\n return objToString.call(value) === '[object Array]';\n}\n/**\n * @memberOf module:zrender/core/util\n * @param {*} value\n * @return {boolean}\n */\n\n\nfunction isFunction(value) {\n return typeof value === 'function';\n}\n/**\n * @memberOf module:zrender/core/util\n * @param {*} value\n * @return {boolean}\n */\n\n\nfunction isString(value) {\n return objToString.call(value) === '[object String]';\n}\n/**\n * @memberOf module:zrender/core/util\n * @param {*} value\n * @return {boolean}\n */\n\n\nfunction isObject(value) {\n // Avoid a V8 JIT bug in Chrome 19-20.\n // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.\n var type = typeof value;\n return type === 'function' || !!value && type === 'object';\n}\n/**\n * @memberOf module:zrender/core/util\n * @param {*} value\n * @return {boolean}\n */\n\n\nfunction isBuiltInObject(value) {\n return !!BUILTIN_OBJECT[objToString.call(value)];\n}\n/**\n * @memberOf module:zrender/core/util\n * @param {*} value\n * @return {boolean}\n */\n\n\nfunction isTypedArray(value) {\n return !!TYPED_ARRAY[objToString.call(value)];\n}\n/**\n * @memberOf module:zrender/core/util\n * @param {*} value\n * @return {boolean}\n */\n\n\nfunction isDom(value) {\n return typeof value === 'object' && typeof value.nodeType === 'number' && typeof value.ownerDocument === 'object';\n}\n/**\n * Whether is exactly NaN. Notice isNaN('a') returns true.\n * @param {*} value\n * @return {boolean}\n */\n\n\nfunction eqNaN(value) {\n /* eslint-disable-next-line no-self-compare */\n return value !== value;\n}\n/**\n * If value1 is not null, then return value1, otherwise judget rest of values.\n * Low performance.\n * @memberOf module:zrender/core/util\n * @return {*} Final value\n */\n\n\nfunction retrieve(values) {\n for (var i = 0, len = arguments.length; i < len; i++) {\n if (arguments[i] != null) {\n return arguments[i];\n }\n }\n}\n\nfunction retrieve2(value0, value1) {\n return value0 != null ? value0 : value1;\n}\n\nfunction retrieve3(value0, value1, value2) {\n return value0 != null ? value0 : value1 != null ? value1 : value2;\n}\n/**\n * @memberOf module:zrender/core/util\n * @param {Array} arr\n * @param {number} startIndex\n * @param {number} endIndex\n * @return {Array}\n */\n\n\nfunction slice() {\n return Function.call.apply(nativeSlice, arguments);\n}\n/**\n * Normalize css liked array configuration\n * e.g.\n * 3 => [3, 3, 3, 3]\n * [4, 2] => [4, 2, 4, 2]\n * [4, 3, 2] => [4, 3, 2, 3]\n * @param {number|Array.} val\n * @return {Array.}\n */\n\n\nfunction normalizeCssArray(val) {\n if (typeof val === 'number') {\n return [val, val, val, val];\n }\n\n var len = val.length;\n\n if (len === 2) {\n // vertical | horizontal\n return [val[0], val[1], val[0], val[1]];\n } else if (len === 3) {\n // top | horizontal | bottom\n return [val[0], val[1], val[2], val[1]];\n }\n\n return val;\n}\n/**\n * @memberOf module:zrender/core/util\n * @param {boolean} condition\n * @param {string} message\n */\n\n\nfunction assert(condition, message) {\n if (!condition) {\n throw new Error(message);\n }\n}\n/**\n * @memberOf module:zrender/core/util\n * @param {string} str string to be trimed\n * @return {string} trimed string\n */\n\n\nfunction trim(str) {\n if (str == null) {\n return null;\n } else if (typeof str.trim === 'function') {\n return str.trim();\n } else {\n return str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n }\n}\n\nvar primitiveKey = '__ec_primitive__';\n/**\n * Set an object as primitive to be ignored traversing children in clone or merge\n */\n\nfunction setAsPrimitive(obj) {\n obj[primitiveKey] = true;\n}\n\nfunction isPrimitive(obj) {\n return obj[primitiveKey];\n}\n/**\n * @constructor\n * @param {Object} obj Only apply `ownProperty`.\n */\n\n\nfunction HashMap(obj) {\n var isArr = isArray(obj); // Key should not be set on this, otherwise\n // methods get/set/... may be overrided.\n\n this.data = {};\n var thisMap = this;\n obj instanceof HashMap ? obj.each(visit) : obj && each(obj, visit);\n\n function visit(value, key) {\n isArr ? thisMap.set(value, key) : thisMap.set(key, value);\n }\n}\n\nHashMap.prototype = {\n constructor: HashMap,\n // Do not provide `has` method to avoid defining what is `has`.\n // (We usually treat `null` and `undefined` as the same, different\n // from ES6 Map).\n get: function (key) {\n return this.data.hasOwnProperty(key) ? this.data[key] : null;\n },\n set: function (key, value) {\n // Comparing with invocation chaining, `return value` is more commonly\n // used in this case: `var someVal = map.set('a', genVal());`\n return this.data[key] = value;\n },\n // Although util.each can be performed on this hashMap directly, user\n // should not use the exposed keys, who are prefixed.\n each: function (cb, context) {\n context !== void 0 && (cb = bind(cb, context));\n /* eslint-disable guard-for-in */\n\n for (var key in this.data) {\n this.data.hasOwnProperty(key) && cb(this.data[key], key);\n }\n /* eslint-enable guard-for-in */\n\n },\n // Do not use this method if performance sensitive.\n removeKey: function (key) {\n delete this.data[key];\n }\n};\n\nfunction createHashMap(obj) {\n return new HashMap(obj);\n}\n\nfunction concatArray(a, b) {\n var newArray = new a.constructor(a.length + b.length);\n\n for (var i = 0; i < a.length; i++) {\n newArray[i] = a[i];\n }\n\n var offset = a.length;\n\n for (i = 0; i < b.length; i++) {\n newArray[i + offset] = b[i];\n }\n\n return newArray;\n}\n\nfunction noop() {}\n\nexports.$override = $override;\nexports.clone = clone;\nexports.merge = merge;\nexports.mergeAll = mergeAll;\nexports.extend = extend;\nexports.defaults = defaults;\nexports.createCanvas = createCanvas;\nexports.getContext = getContext;\nexports.indexOf = indexOf;\nexports.inherits = inherits;\nexports.mixin = mixin;\nexports.isArrayLike = isArrayLike;\nexports.each = each;\nexports.map = map;\nexports.reduce = reduce;\nexports.filter = filter;\nexports.find = find;\nexports.bind = bind;\nexports.curry = curry;\nexports.isArray = isArray;\nexports.isFunction = isFunction;\nexports.isString = isString;\nexports.isObject = isObject;\nexports.isBuiltInObject = isBuiltInObject;\nexports.isTypedArray = isTypedArray;\nexports.isDom = isDom;\nexports.eqNaN = eqNaN;\nexports.retrieve = retrieve;\nexports.retrieve2 = retrieve2;\nexports.retrieve3 = retrieve3;\nexports.slice = slice;\nexports.normalizeCssArray = normalizeCssArray;\nexports.assert = assert;\nexports.trim = trim;\nexports.setAsPrimitive = setAsPrimitive;\nexports.isPrimitive = isPrimitive;\nexports.createHashMap = createHashMap;\nexports.concatArray = concatArray;\nexports.noop = noop;","/**\n * The algoritm is learnt from\n * https://franklinta.com/2014/09/08/computing-css-matrix3d-transforms/\n * And we made some optimization for matrix inversion.\n * Other similar approaches:\n * \"cv::getPerspectiveTransform\", \"Direct Linear Transformation\".\n */\nvar LN2 = Math.log(2);\n\nfunction determinant(rows, rank, rowStart, rowMask, colMask, detCache) {\n var cacheKey = rowMask + '-' + colMask;\n var fullRank = rows.length;\n\n if (detCache.hasOwnProperty(cacheKey)) {\n return detCache[cacheKey];\n }\n\n if (rank === 1) {\n // In this case the colMask must be like: `11101111`. We can find the place of `0`.\n var colStart = Math.round(Math.log((1 << fullRank) - 1 & ~colMask) / LN2);\n return rows[rowStart][colStart];\n }\n\n var subRowMask = rowMask | 1 << rowStart;\n var subRowStart = rowStart + 1;\n\n while (rowMask & 1 << subRowStart) {\n subRowStart++;\n }\n\n var sum = 0;\n\n for (var j = 0, colLocalIdx = 0; j < fullRank; j++) {\n var colTag = 1 << j;\n\n if (!(colTag & colMask)) {\n sum += (colLocalIdx % 2 ? -1 : 1) * rows[rowStart][j] // det(subMatrix(0, j))\n * determinant(rows, rank - 1, subRowStart, subRowMask, colMask | colTag, detCache);\n colLocalIdx++;\n }\n }\n\n detCache[cacheKey] = sum;\n return sum;\n}\n/**\n * Usage:\n * ```js\n * var transformer = buildTransformer(\n * [10, 44, 100, 44, 100, 300, 10, 300],\n * [50, 54, 130, 14, 140, 330, 14, 220]\n * );\n * var out = [];\n * transformer && transformer([11, 33], out);\n * ```\n *\n * Notice: `buildTransformer` may take more than 10ms in some Android device.\n *\n * @param {Array.} src source four points, [x0, y0, x1, y1, x2, y2, x3, y3]\n * @param {Array.} dest destination four points, [x0, y0, x1, y1, x2, y2, x3, y3]\n * @return {Function} transformer If fail, return null/undefined.\n */\n\n\nfunction buildTransformer(src, dest) {\n var mA = [[src[0], src[1], 1, 0, 0, 0, -dest[0] * src[0], -dest[0] * src[1]], [0, 0, 0, src[0], src[1], 1, -dest[1] * src[0], -dest[1] * src[1]], [src[2], src[3], 1, 0, 0, 0, -dest[2] * src[2], -dest[2] * src[3]], [0, 0, 0, src[2], src[3], 1, -dest[3] * src[2], -dest[3] * src[3]], [src[4], src[5], 1, 0, 0, 0, -dest[4] * src[4], -dest[4] * src[5]], [0, 0, 0, src[4], src[5], 1, -dest[5] * src[4], -dest[5] * src[5]], [src[6], src[7], 1, 0, 0, 0, -dest[6] * src[6], -dest[6] * src[7]], [0, 0, 0, src[6], src[7], 1, -dest[7] * src[6], -dest[7] * src[7]]];\n var detCache = {};\n var det = determinant(mA, 8, 0, 0, 0, detCache);\n\n if (det === 0) {\n // can not make transformer when and only when\n // any three of the markers are collinear.\n return;\n } // `invert(mA) * dest`, that is, `adj(mA) / det * dest`.\n\n\n var vh = [];\n\n for (var i = 0; i < 8; i++) {\n for (var j = 0; j < 8; j++) {\n vh[j] == null && (vh[j] = 0);\n vh[j] += ((i + j) % 2 ? -1 : 1) * // det(subMatrix(i, j))\n determinant(mA, 7, i === 0 ? 1 : 0, 1 << i, 1 << j, detCache) / det * dest[i];\n }\n }\n\n return function (out, srcPointX, srcPointY) {\n var pk = srcPointX * vh[6] + srcPointY * vh[7] + 1;\n out[0] = (srcPointX * vh[0] + srcPointY * vh[1] + vh[2]) / pk;\n out[1] = (srcPointX * vh[3] + srcPointY * vh[4] + vh[5]) / pk;\n };\n}\n\nexports.buildTransformer = buildTransformer;","var vec2 = require(\"./vector\");\n\nvar matrix = require(\"./matrix\");\n\n/**\n * @module echarts/core/BoundingRect\n */\nvar v2ApplyTransform = vec2.applyTransform;\nvar mathMin = Math.min;\nvar mathMax = Math.max;\n/**\n * @alias module:echarts/core/BoundingRect\n */\n\nfunction BoundingRect(x, y, width, height) {\n if (width < 0) {\n x = x + width;\n width = -width;\n }\n\n if (height < 0) {\n y = y + height;\n height = -height;\n }\n /**\n * @type {number}\n */\n\n\n this.x = x;\n /**\n * @type {number}\n */\n\n this.y = y;\n /**\n * @type {number}\n */\n\n this.width = width;\n /**\n * @type {number}\n */\n\n this.height = height;\n}\n\nBoundingRect.prototype = {\n constructor: BoundingRect,\n\n /**\n * @param {module:echarts/core/BoundingRect} other\n */\n union: function (other) {\n var x = mathMin(other.x, this.x);\n var y = mathMin(other.y, this.y);\n this.width = mathMax(other.x + other.width, this.x + this.width) - x;\n this.height = mathMax(other.y + other.height, this.y + this.height) - y;\n this.x = x;\n this.y = y;\n },\n\n /**\n * @param {Array.} m\n * @methods\n */\n applyTransform: function () {\n var lt = [];\n var rb = [];\n var lb = [];\n var rt = [];\n return function (m) {\n // In case usage like this\n // el.getBoundingRect().applyTransform(el.transform)\n // And element has no transform\n if (!m) {\n return;\n }\n\n lt[0] = lb[0] = this.x;\n lt[1] = rt[1] = this.y;\n rb[0] = rt[0] = this.x + this.width;\n rb[1] = lb[1] = this.y + this.height;\n v2ApplyTransform(lt, lt, m);\n v2ApplyTransform(rb, rb, m);\n v2ApplyTransform(lb, lb, m);\n v2ApplyTransform(rt, rt, m);\n this.x = mathMin(lt[0], rb[0], lb[0], rt[0]);\n this.y = mathMin(lt[1], rb[1], lb[1], rt[1]);\n var maxX = mathMax(lt[0], rb[0], lb[0], rt[0]);\n var maxY = mathMax(lt[1], rb[1], lb[1], rt[1]);\n this.width = maxX - this.x;\n this.height = maxY - this.y;\n };\n }(),\n\n /**\n * Calculate matrix of transforming from self to target rect\n * @param {module:zrender/core/BoundingRect} b\n * @return {Array.}\n */\n calculateTransform: function (b) {\n var a = this;\n var sx = b.width / a.width;\n var sy = b.height / a.height;\n var m = matrix.create(); // 矩阵右乘\n\n matrix.translate(m, m, [-a.x, -a.y]);\n matrix.scale(m, m, [sx, sy]);\n matrix.translate(m, m, [b.x, b.y]);\n return m;\n },\n\n /**\n * @param {(module:echarts/core/BoundingRect|Object)} b\n * @return {boolean}\n */\n intersect: function (b) {\n if (!b) {\n return false;\n }\n\n if (!(b instanceof BoundingRect)) {\n // Normalize negative width/height.\n b = BoundingRect.create(b);\n }\n\n var a = this;\n var ax0 = a.x;\n var ax1 = a.x + a.width;\n var ay0 = a.y;\n var ay1 = a.y + a.height;\n var bx0 = b.x;\n var bx1 = b.x + b.width;\n var by0 = b.y;\n var by1 = b.y + b.height;\n return !(ax1 < bx0 || bx1 < ax0 || ay1 < by0 || by1 < ay0);\n },\n contain: function (x, y) {\n var rect = this;\n return x >= rect.x && x <= rect.x + rect.width && y >= rect.y && y <= rect.y + rect.height;\n },\n\n /**\n * @return {module:echarts/core/BoundingRect}\n */\n clone: function () {\n return new BoundingRect(this.x, this.y, this.width, this.height);\n },\n\n /**\n * Copy from another rect\n */\n copy: function (other) {\n this.x = other.x;\n this.y = other.y;\n this.width = other.width;\n this.height = other.height;\n },\n plain: function () {\n return {\n x: this.x,\n y: this.y,\n width: this.width,\n height: this.height\n };\n }\n};\n/**\n * @param {Object|module:zrender/core/BoundingRect} rect\n * @param {number} rect.x\n * @param {number} rect.y\n * @param {number} rect.width\n * @param {number} rect.height\n * @return {module:zrender/core/BoundingRect}\n */\n\nBoundingRect.create = function (rect) {\n return new BoundingRect(rect.x, rect.y, rect.width, rect.height);\n};\n\nvar _default = BoundingRect;\nmodule.exports = _default;","var _event = require(\"../core/event\");\n\nvar addEventListener = _event.addEventListener;\nvar removeEventListener = _event.removeEventListener;\nvar normalizeEvent = _event.normalizeEvent;\nvar getNativeEvent = _event.getNativeEvent;\n\nvar zrUtil = require(\"../core/util\");\n\nvar Eventful = require(\"../mixin/Eventful\");\n\nvar env = require(\"../core/env\");\n\n/* global document */\nvar TOUCH_CLICK_DELAY = 300;\nvar globalEventSupported = env.domSupported;\n\nvar localNativeListenerNames = function () {\n var mouseHandlerNames = ['click', 'dblclick', 'mousewheel', 'mouseout', 'mouseup', 'mousedown', 'mousemove', 'contextmenu'];\n var touchHandlerNames = ['touchstart', 'touchend', 'touchmove'];\n var pointerEventNameMap = {\n pointerdown: 1,\n pointerup: 1,\n pointermove: 1,\n pointerout: 1\n };\n var pointerHandlerNames = zrUtil.map(mouseHandlerNames, function (name) {\n var nm = name.replace('mouse', 'pointer');\n return pointerEventNameMap.hasOwnProperty(nm) ? nm : name;\n });\n return {\n mouse: mouseHandlerNames,\n touch: touchHandlerNames,\n pointer: pointerHandlerNames\n };\n}();\n\nvar globalNativeListenerNames = {\n mouse: ['mousemove', 'mouseup'],\n pointer: ['pointermove', 'pointerup']\n};\n\nfunction eventNameFix(name) {\n return name === 'mousewheel' && env.browser.firefox ? 'DOMMouseScroll' : name;\n}\n\nfunction isPointerFromTouch(event) {\n var pointerType = event.pointerType;\n return pointerType === 'pen' || pointerType === 'touch';\n} // function useMSGuesture(handlerProxy, event) {\n// return isPointerFromTouch(event) && !!handlerProxy._msGesture;\n// }\n// function onMSGestureChange(proxy, event) {\n// if (event.translationX || event.translationY) {\n// // mousemove is carried by MSGesture to reduce the sensitivity.\n// proxy.handler.dispatchToElement(event.target, 'mousemove', event);\n// }\n// if (event.scale !== 1) {\n// event.pinchX = event.offsetX;\n// event.pinchY = event.offsetY;\n// event.pinchScale = event.scale;\n// proxy.handler.dispatchToElement(event.target, 'pinch', event);\n// }\n// }\n\n/**\n * Prevent mouse event from being dispatched after Touch Events action\n * @see \n * 1. Mobile browsers dispatch mouse events 300ms after touchend.\n * 2. Chrome for Android dispatch mousedown for long-touch about 650ms\n * Result: Blocking Mouse Events for 700ms.\n *\n * @param {DOMHandlerScope} scope\n */\n\n\nfunction setTouchTimer(scope) {\n scope.touching = true;\n\n if (scope.touchTimer != null) {\n clearTimeout(scope.touchTimer);\n scope.touchTimer = null;\n }\n\n scope.touchTimer = setTimeout(function () {\n scope.touching = false;\n scope.touchTimer = null;\n }, 700);\n} // Mark touch, which is useful in distinguish touch and\n// mouse event in upper applicatoin.\n\n\nfunction markTouch(event) {\n event && (event.zrByTouch = true);\n} // function markTriggeredFromLocal(event) {\n// event && (event.__zrIsFromLocal = true);\n// }\n// function isTriggeredFromLocal(instance, event) {\n// return !!(event && event.__zrIsFromLocal);\n// }\n\n\nfunction normalizeGlobalEvent(instance, event) {\n // offsetX, offsetY still need to be calculated. They are necessary in the event\n // handlers of the upper applications. Set `true` to force calculate them.\n return normalizeEvent(instance.dom, new FakeGlobalEvent(instance, event), true);\n}\n/**\n * Detect whether the given el is in `painterRoot`.\n */\n\n\nfunction isLocalEl(instance, el) {\n var elTmp = el;\n var isLocal = false;\n\n while (elTmp && elTmp.nodeType !== 9 && !(isLocal = elTmp.domBelongToZr || elTmp !== el && elTmp === instance.painterRoot)) {\n elTmp = elTmp.parentNode;\n }\n\n return isLocal;\n}\n/**\n * Make a fake event but not change the original event,\n * becuase the global event probably be used by other\n * listeners not belonging to zrender.\n * @class\n */\n\n\nfunction FakeGlobalEvent(instance, event) {\n this.type = event.type;\n this.target = this.currentTarget = instance.dom;\n this.pointerType = event.pointerType; // Necessray for the force calculation of zrX, zrY\n\n this.clientX = event.clientX;\n this.clientY = event.clientY; // Because we do not mount global listeners to touch events,\n // we do not copy `targetTouches` and `changedTouches` here.\n}\n\nvar fakeGlobalEventProto = FakeGlobalEvent.prototype; // we make the default methods on the event do nothing,\n// otherwise it is dangerous. See more details in\n// [Drag outside] in `Handler.js`.\n\nfakeGlobalEventProto.stopPropagation = fakeGlobalEventProto.stopImmediatePropagation = fakeGlobalEventProto.preventDefault = zrUtil.noop;\n/**\n * Local DOM Handlers\n * @this {HandlerProxy}\n */\n\nvar localDOMHandlers = {\n mousedown: function (event) {\n event = normalizeEvent(this.dom, event);\n this._mayPointerCapture = [event.zrX, event.zrY];\n this.trigger('mousedown', event);\n },\n mousemove: function (event) {\n event = normalizeEvent(this.dom, event);\n var downPoint = this._mayPointerCapture;\n\n if (downPoint && (event.zrX !== downPoint[0] || event.zrY !== downPoint[1])) {\n togglePointerCapture(this, true);\n }\n\n this.trigger('mousemove', event);\n },\n mouseup: function (event) {\n event = normalizeEvent(this.dom, event);\n togglePointerCapture(this, false);\n this.trigger('mouseup', event);\n },\n mouseout: function (event) {\n event = normalizeEvent(this.dom, event); // Similarly to the browser did on `document` and touch event,\n // `globalout` will be delayed to final pointer cature release.\n\n if (this._pointerCapturing) {\n event.zrEventControl = 'no_globalout';\n } // There might be some doms created by upper layer application\n // at the same level of painter.getViewportRoot() (e.g., tooltip\n // dom created by echarts), where 'globalout' event should not\n // be triggered when mouse enters these doms. (But 'mouseout'\n // should be triggered at the original hovered element as usual).\n\n\n var element = event.toElement || event.relatedTarget;\n event.zrIsToLocalDOM = isLocalEl(this, element);\n this.trigger('mouseout', event);\n },\n touchstart: function (event) {\n // Default mouse behaviour should not be disabled here.\n // For example, page may needs to be slided.\n event = normalizeEvent(this.dom, event);\n markTouch(event);\n this._lastTouchMoment = new Date();\n this.handler.processGesture(event, 'start'); // For consistent event listener for both touch device and mouse device,\n // we simulate \"mouseover-->mousedown\" in touch device. So we trigger\n // `mousemove` here (to trigger `mouseover` inside), and then trigger\n // `mousedown`.\n\n localDOMHandlers.mousemove.call(this, event);\n localDOMHandlers.mousedown.call(this, event);\n },\n touchmove: function (event) {\n event = normalizeEvent(this.dom, event);\n markTouch(event);\n this.handler.processGesture(event, 'change'); // Mouse move should always be triggered no matter whether\n // there is gestrue event, because mouse move and pinch may\n // be used at the same time.\n\n localDOMHandlers.mousemove.call(this, event);\n },\n touchend: function (event) {\n event = normalizeEvent(this.dom, event);\n markTouch(event);\n this.handler.processGesture(event, 'end');\n localDOMHandlers.mouseup.call(this, event); // Do not trigger `mouseout` here, in spite of `mousemove`(`mouseover`) is\n // triggered in `touchstart`. This seems to be illogical, but by this mechanism,\n // we can conveniently implement \"hover style\" in both PC and touch device just\n // by listening to `mouseover` to add \"hover style\" and listening to `mouseout`\n // to remove \"hover style\" on an element, without any additional code for\n // compatibility. (`mouseout` will not be triggered in `touchend`, so \"hover\n // style\" will remain for user view)\n // click event should always be triggered no matter whether\n // there is gestrue event. System click can not be prevented.\n\n if (+new Date() - this._lastTouchMoment < TOUCH_CLICK_DELAY) {\n localDOMHandlers.click.call(this, event);\n }\n },\n pointerdown: function (event) {\n localDOMHandlers.mousedown.call(this, event); // if (useMSGuesture(this, event)) {\n // this._msGesture.addPointer(event.pointerId);\n // }\n },\n pointermove: function (event) {\n // FIXME\n // pointermove is so sensitive that it always triggered when\n // tap(click) on touch screen, which affect some judgement in\n // upper application. So, we dont support mousemove on MS touch\n // device yet.\n if (!isPointerFromTouch(event)) {\n localDOMHandlers.mousemove.call(this, event);\n }\n },\n pointerup: function (event) {\n localDOMHandlers.mouseup.call(this, event);\n },\n pointerout: function (event) {\n // pointerout will be triggered when tap on touch screen\n // (IE11+/Edge on MS Surface) after click event triggered,\n // which is inconsistent with the mousout behavior we defined\n // in touchend. So we unify them.\n // (check localDOMHandlers.touchend for detailed explanation)\n if (!isPointerFromTouch(event)) {\n localDOMHandlers.mouseout.call(this, event);\n }\n }\n};\n/**\n * Othere DOM UI Event handlers for zr dom.\n * @this {HandlerProxy}\n */\n\nzrUtil.each(['click', 'mousewheel', 'dblclick', 'contextmenu'], function (name) {\n localDOMHandlers[name] = function (event) {\n event = normalizeEvent(this.dom, event);\n this.trigger(name, event);\n };\n});\n/**\n * DOM UI Event handlers for global page.\n *\n * [Caution]:\n * those handlers should both support in capture phase and bubble phase!\n *\n * @this {HandlerProxy}\n */\n\nvar globalDOMHandlers = {\n pointermove: function (event) {\n // FIXME\n // pointermove is so sensitive that it always triggered when\n // tap(click) on touch screen, which affect some judgement in\n // upper application. So, we dont support mousemove on MS touch\n // device yet.\n if (!isPointerFromTouch(event)) {\n globalDOMHandlers.mousemove.call(this, event);\n }\n },\n pointerup: function (event) {\n globalDOMHandlers.mouseup.call(this, event);\n },\n mousemove: function (event) {\n this.trigger('mousemove', event);\n },\n mouseup: function (event) {\n var pointerCaptureReleasing = this._pointerCapturing;\n togglePointerCapture(this, false);\n this.trigger('mouseup', event);\n\n if (pointerCaptureReleasing) {\n event.zrEventControl = 'only_globalout';\n this.trigger('mouseout', event);\n }\n }\n};\n/**\n * @param {HandlerProxy} instance\n * @param {DOMHandlerScope} scope\n */\n\nfunction mountLocalDOMEventListeners(instance, scope) {\n var domHandlers = scope.domHandlers;\n\n if (env.pointerEventsSupported) {\n // Only IE11+/Edge\n // 1. On devices that both enable touch and mouse (e.g., MS Surface and lenovo X240),\n // IE11+/Edge do not trigger touch event, but trigger pointer event and mouse event\n // at the same time.\n // 2. On MS Surface, it probablely only trigger mousedown but no mouseup when tap on\n // screen, which do not occurs in pointer event.\n // So we use pointer event to both detect touch gesture and mouse behavior.\n zrUtil.each(localNativeListenerNames.pointer, function (nativeEventName) {\n mountSingleDOMEventListener(scope, nativeEventName, function (event) {\n // markTriggeredFromLocal(event);\n domHandlers[nativeEventName].call(instance, event);\n });\n }); // FIXME\n // Note: MS Gesture require CSS touch-action set. But touch-action is not reliable,\n // which does not prevent defuault behavior occasionally (which may cause view port\n // zoomed in but use can not zoom it back). And event.preventDefault() does not work.\n // So we have to not to use MSGesture and not to support touchmove and pinch on MS\n // touch screen. And we only support click behavior on MS touch screen now.\n // MS Gesture Event is only supported on IE11+/Edge and on Windows 8+.\n // We dont support touch on IE on win7.\n // See \n // if (typeof MSGesture === 'function') {\n // (this._msGesture = new MSGesture()).target = dom; // jshint ignore:line\n // dom.addEventListener('MSGestureChange', onMSGestureChange);\n // }\n } else {\n if (env.touchEventsSupported) {\n zrUtil.each(localNativeListenerNames.touch, function (nativeEventName) {\n mountSingleDOMEventListener(scope, nativeEventName, function (event) {\n // markTriggeredFromLocal(event);\n domHandlers[nativeEventName].call(instance, event);\n setTouchTimer(scope);\n });\n }); // Handler of 'mouseout' event is needed in touch mode, which will be mounted below.\n // addEventListener(root, 'mouseout', this._mouseoutHandler);\n } // 1. Considering some devices that both enable touch and mouse event (like on MS Surface\n // and lenovo X240, @see #2350), we make mouse event be always listened, otherwise\n // mouse event can not be handle in those devices.\n // 2. On MS Surface, Chrome will trigger both touch event and mouse event. How to prevent\n // mouseevent after touch event triggered, see `setTouchTimer`.\n\n\n zrUtil.each(localNativeListenerNames.mouse, function (nativeEventName) {\n mountSingleDOMEventListener(scope, nativeEventName, function (event) {\n event = getNativeEvent(event);\n\n if (!scope.touching) {\n // markTriggeredFromLocal(event);\n domHandlers[nativeEventName].call(instance, event);\n }\n });\n });\n }\n}\n/**\n * @param {HandlerProxy} instance\n * @param {DOMHandlerScope} scope\n */\n\n\nfunction mountGlobalDOMEventListeners(instance, scope) {\n // Only IE11+/Edge. See the comment in `mountLocalDOMEventListeners`.\n if (env.pointerEventsSupported) {\n zrUtil.each(globalNativeListenerNames.pointer, mount);\n } // Touch event has implemented \"drag outside\" so we do not mount global listener for touch event.\n // (see https://www.w3.org/TR/touch-events/#the-touchmove-event)\n // We do not consider \"both-support-touch-and-mouse device\" for this feature (see the comment of\n // `mountLocalDOMEventListeners`) to avoid bugs util some requirements come.\n else if (!env.touchEventsSupported) {\n zrUtil.each(globalNativeListenerNames.mouse, mount);\n }\n\n function mount(nativeEventName) {\n function nativeEventListener(event) {\n event = getNativeEvent(event); // See the reason in [Drag outside] in `Handler.js`\n // This checking supports both `useCapture` or not.\n // PENDING: if there is performance issue in some devices,\n // we probably can not use `useCapture` and change a easier\n // to judes whether local (mark).\n\n if (!isLocalEl(instance, event.target)) {\n event = normalizeGlobalEvent(instance, event);\n scope.domHandlers[nativeEventName].call(instance, event);\n }\n }\n\n mountSingleDOMEventListener(scope, nativeEventName, nativeEventListener, {\n capture: true\n } // See [Drag Outside] in `Handler.js`\n );\n }\n}\n\nfunction mountSingleDOMEventListener(scope, nativeEventName, listener, opt) {\n scope.mounted[nativeEventName] = listener;\n scope.listenerOpts[nativeEventName] = opt;\n addEventListener(scope.domTarget, eventNameFix(nativeEventName), listener, opt);\n}\n\nfunction unmountDOMEventListeners(scope) {\n var mounted = scope.mounted;\n\n for (var nativeEventName in mounted) {\n if (mounted.hasOwnProperty(nativeEventName)) {\n removeEventListener(scope.domTarget, eventNameFix(nativeEventName), mounted[nativeEventName], scope.listenerOpts[nativeEventName]);\n }\n }\n\n scope.mounted = {};\n}\n/**\n * See [Drag Outside] in `Handler.js`.\n * @implement\n * @param {boolean} isPointerCapturing Should never be `null`/`undefined`.\n * `true`: start to capture pointer if it is not capturing.\n * `false`: end the capture if it is capturing.\n */\n\n\nfunction togglePointerCapture(instance, isPointerCapturing) {\n instance._mayPointerCapture = null;\n\n if (globalEventSupported && instance._pointerCapturing ^ isPointerCapturing) {\n instance._pointerCapturing = isPointerCapturing;\n var globalHandlerScope = instance._globalHandlerScope;\n isPointerCapturing ? mountGlobalDOMEventListeners(instance, globalHandlerScope) : unmountDOMEventListeners(globalHandlerScope);\n }\n}\n/**\n * @inner\n * @class\n */\n\n\nfunction DOMHandlerScope(domTarget, domHandlers) {\n this.domTarget = domTarget;\n this.domHandlers = domHandlers; // Key: eventName, value: mounted handler funcitons.\n // Used for unmount.\n\n this.mounted = {};\n this.listenerOpts = {};\n this.touchTimer = null;\n this.touching = false;\n}\n/**\n * @public\n * @class\n */\n\n\nfunction HandlerDomProxy(dom, painterRoot) {\n Eventful.call(this);\n this.dom = dom;\n this.painterRoot = painterRoot;\n this._localHandlerScope = new DOMHandlerScope(dom, localDOMHandlers);\n\n if (globalEventSupported) {\n this._globalHandlerScope = new DOMHandlerScope(document, globalDOMHandlers);\n }\n /**\n * @type {boolean}\n */\n\n\n this._pointerCapturing = false;\n /**\n * @type {Array.} [x, y] or null.\n */\n\n this._mayPointerCapture = null;\n mountLocalDOMEventListeners(this, this._localHandlerScope);\n}\n\nvar handlerDomProxyProto = HandlerDomProxy.prototype;\n\nhandlerDomProxyProto.dispose = function () {\n unmountDOMEventListeners(this._localHandlerScope);\n\n if (globalEventSupported) {\n unmountDOMEventListeners(this._globalHandlerScope);\n }\n};\n\nhandlerDomProxyProto.setCursor = function (cursorStyle) {\n this.dom.style && (this.dom.style.cursor = cursorStyle || 'default');\n};\n\nzrUtil.mixin(HandlerDomProxy, Eventful);\nvar _default = HandlerDomProxy;\nmodule.exports = _default;","// Simple LRU cache use doubly linked list\n// @module zrender/core/LRU\n\n/**\n * Simple double linked list. Compared with array, it has O(1) remove operation.\n * @constructor\n */\nvar LinkedList = function () {\n /**\n * @type {module:zrender/core/LRU~Entry}\n */\n this.head = null;\n /**\n * @type {module:zrender/core/LRU~Entry}\n */\n\n this.tail = null;\n this._len = 0;\n};\n\nvar linkedListProto = LinkedList.prototype;\n/**\n * Insert a new value at the tail\n * @param {} val\n * @return {module:zrender/core/LRU~Entry}\n */\n\nlinkedListProto.insert = function (val) {\n var entry = new Entry(val);\n this.insertEntry(entry);\n return entry;\n};\n/**\n * Insert an entry at the tail\n * @param {module:zrender/core/LRU~Entry} entry\n */\n\n\nlinkedListProto.insertEntry = function (entry) {\n if (!this.head) {\n this.head = this.tail = entry;\n } else {\n this.tail.next = entry;\n entry.prev = this.tail;\n entry.next = null;\n this.tail = entry;\n }\n\n this._len++;\n};\n/**\n * Remove entry.\n * @param {module:zrender/core/LRU~Entry} entry\n */\n\n\nlinkedListProto.remove = function (entry) {\n var prev = entry.prev;\n var next = entry.next;\n\n if (prev) {\n prev.next = next;\n } else {\n // Is head\n this.head = next;\n }\n\n if (next) {\n next.prev = prev;\n } else {\n // Is tail\n this.tail = prev;\n }\n\n entry.next = entry.prev = null;\n this._len--;\n};\n/**\n * @return {number}\n */\n\n\nlinkedListProto.len = function () {\n return this._len;\n};\n/**\n * Clear list\n */\n\n\nlinkedListProto.clear = function () {\n this.head = this.tail = null;\n this._len = 0;\n};\n/**\n * @constructor\n * @param {} val\n */\n\n\nvar Entry = function (val) {\n /**\n * @type {}\n */\n this.value = val;\n /**\n * @type {module:zrender/core/LRU~Entry}\n */\n\n this.next;\n /**\n * @type {module:zrender/core/LRU~Entry}\n */\n\n this.prev;\n};\n/**\n * LRU Cache\n * @constructor\n * @alias module:zrender/core/LRU\n */\n\n\nvar LRU = function (maxSize) {\n this._list = new LinkedList();\n this._map = {};\n this._maxSize = maxSize || 10;\n this._lastRemovedEntry = null;\n};\n\nvar LRUProto = LRU.prototype;\n/**\n * @param {string} key\n * @param {} value\n * @return {} Removed value\n */\n\nLRUProto.put = function (key, value) {\n var list = this._list;\n var map = this._map;\n var removed = null;\n\n if (map[key] == null) {\n var len = list.len(); // Reuse last removed entry\n\n var entry = this._lastRemovedEntry;\n\n if (len >= this._maxSize && len > 0) {\n // Remove the least recently used\n var leastUsedEntry = list.head;\n list.remove(leastUsedEntry);\n delete map[leastUsedEntry.key];\n removed = leastUsedEntry.value;\n this._lastRemovedEntry = leastUsedEntry;\n }\n\n if (entry) {\n entry.value = value;\n } else {\n entry = new Entry(value);\n }\n\n entry.key = key;\n list.insertEntry(entry);\n map[key] = entry;\n }\n\n return removed;\n};\n/**\n * @param {string} key\n * @return {}\n */\n\n\nLRUProto.get = function (key) {\n var entry = this._map[key];\n var list = this._list;\n\n if (entry != null) {\n // Put the latest used entry in the tail\n if (entry !== list.tail) {\n list.remove(entry);\n list.insertEntry(entry);\n }\n\n return entry.value;\n }\n};\n/**\n * Clear the cache\n */\n\n\nLRUProto.clear = function () {\n this._list.clear();\n\n this._map = {};\n};\n\nvar _default = LRU;\nmodule.exports = _default;","/**\n * zrender: 生成唯一id\n *\n * @author errorrik (errorrik@gmail.com)\n */\nvar idStart = 0x0907;\n\nfunction _default() {\n return idStart++;\n}\n\nmodule.exports = _default;","var vec2 = require(\"./vector\");\n\nvar curve = require(\"./curve\");\n\n/**\n * @author Yi Shen(https://github.com/pissang)\n */\nvar mathMin = Math.min;\nvar mathMax = Math.max;\nvar mathSin = Math.sin;\nvar mathCos = Math.cos;\nvar PI2 = Math.PI * 2;\nvar start = vec2.create();\nvar end = vec2.create();\nvar extremity = vec2.create();\n/**\n * 从顶点数组中计算出最小包围盒,写入`min`和`max`中\n * @module zrender/core/bbox\n * @param {Array} points 顶点数组\n * @param {number} min\n * @param {number} max\n */\n\nfunction fromPoints(points, min, max) {\n if (points.length === 0) {\n return;\n }\n\n var p = points[0];\n var left = p[0];\n var right = p[0];\n var top = p[1];\n var bottom = p[1];\n var i;\n\n for (i = 1; i < points.length; i++) {\n p = points[i];\n left = mathMin(left, p[0]);\n right = mathMax(right, p[0]);\n top = mathMin(top, p[1]);\n bottom = mathMax(bottom, p[1]);\n }\n\n min[0] = left;\n min[1] = top;\n max[0] = right;\n max[1] = bottom;\n}\n/**\n * @memberOf module:zrender/core/bbox\n * @param {number} x0\n * @param {number} y0\n * @param {number} x1\n * @param {number} y1\n * @param {Array.} min\n * @param {Array.} max\n */\n\n\nfunction fromLine(x0, y0, x1, y1, min, max) {\n min[0] = mathMin(x0, x1);\n min[1] = mathMin(y0, y1);\n max[0] = mathMax(x0, x1);\n max[1] = mathMax(y0, y1);\n}\n\nvar xDim = [];\nvar yDim = [];\n/**\n * 从三阶贝塞尔曲线(p0, p1, p2, p3)中计算出最小包围盒,写入`min`和`max`中\n * @memberOf module:zrender/core/bbox\n * @param {number} x0\n * @param {number} y0\n * @param {number} x1\n * @param {number} y1\n * @param {number} x2\n * @param {number} y2\n * @param {number} x3\n * @param {number} y3\n * @param {Array.} min\n * @param {Array.} max\n */\n\nfunction fromCubic(x0, y0, x1, y1, x2, y2, x3, y3, min, max) {\n var cubicExtrema = curve.cubicExtrema;\n var cubicAt = curve.cubicAt;\n var i;\n var n = cubicExtrema(x0, x1, x2, x3, xDim);\n min[0] = Infinity;\n min[1] = Infinity;\n max[0] = -Infinity;\n max[1] = -Infinity;\n\n for (i = 0; i < n; i++) {\n var x = cubicAt(x0, x1, x2, x3, xDim[i]);\n min[0] = mathMin(x, min[0]);\n max[0] = mathMax(x, max[0]);\n }\n\n n = cubicExtrema(y0, y1, y2, y3, yDim);\n\n for (i = 0; i < n; i++) {\n var y = cubicAt(y0, y1, y2, y3, yDim[i]);\n min[1] = mathMin(y, min[1]);\n max[1] = mathMax(y, max[1]);\n }\n\n min[0] = mathMin(x0, min[0]);\n max[0] = mathMax(x0, max[0]);\n min[0] = mathMin(x3, min[0]);\n max[0] = mathMax(x3, max[0]);\n min[1] = mathMin(y0, min[1]);\n max[1] = mathMax(y0, max[1]);\n min[1] = mathMin(y3, min[1]);\n max[1] = mathMax(y3, max[1]);\n}\n/**\n * 从二阶贝塞尔曲线(p0, p1, p2)中计算出最小包围盒,写入`min`和`max`中\n * @memberOf module:zrender/core/bbox\n * @param {number} x0\n * @param {number} y0\n * @param {number} x1\n * @param {number} y1\n * @param {number} x2\n * @param {number} y2\n * @param {Array.} min\n * @param {Array.} max\n */\n\n\nfunction fromQuadratic(x0, y0, x1, y1, x2, y2, min, max) {\n var quadraticExtremum = curve.quadraticExtremum;\n var quadraticAt = curve.quadraticAt; // Find extremities, where derivative in x dim or y dim is zero\n\n var tx = mathMax(mathMin(quadraticExtremum(x0, x1, x2), 1), 0);\n var ty = mathMax(mathMin(quadraticExtremum(y0, y1, y2), 1), 0);\n var x = quadraticAt(x0, x1, x2, tx);\n var y = quadraticAt(y0, y1, y2, ty);\n min[0] = mathMin(x0, x2, x);\n min[1] = mathMin(y0, y2, y);\n max[0] = mathMax(x0, x2, x);\n max[1] = mathMax(y0, y2, y);\n}\n/**\n * 从圆弧中计算出最小包围盒,写入`min`和`max`中\n * @method\n * @memberOf module:zrender/core/bbox\n * @param {number} x\n * @param {number} y\n * @param {number} rx\n * @param {number} ry\n * @param {number} startAngle\n * @param {number} endAngle\n * @param {number} anticlockwise\n * @param {Array.} min\n * @param {Array.} max\n */\n\n\nfunction fromArc(x, y, rx, ry, startAngle, endAngle, anticlockwise, min, max) {\n var vec2Min = vec2.min;\n var vec2Max = vec2.max;\n var diff = Math.abs(startAngle - endAngle);\n\n if (diff % PI2 < 1e-4 && diff > 1e-4) {\n // Is a circle\n min[0] = x - rx;\n min[1] = y - ry;\n max[0] = x + rx;\n max[1] = y + ry;\n return;\n }\n\n start[0] = mathCos(startAngle) * rx + x;\n start[1] = mathSin(startAngle) * ry + y;\n end[0] = mathCos(endAngle) * rx + x;\n end[1] = mathSin(endAngle) * ry + y;\n vec2Min(min, start, end);\n vec2Max(max, start, end); // Thresh to [0, Math.PI * 2]\n\n startAngle = startAngle % PI2;\n\n if (startAngle < 0) {\n startAngle = startAngle + PI2;\n }\n\n endAngle = endAngle % PI2;\n\n if (endAngle < 0) {\n endAngle = endAngle + PI2;\n }\n\n if (startAngle > endAngle && !anticlockwise) {\n endAngle += PI2;\n } else if (startAngle < endAngle && anticlockwise) {\n startAngle += PI2;\n }\n\n if (anticlockwise) {\n var tmp = endAngle;\n endAngle = startAngle;\n startAngle = tmp;\n } // var number = 0;\n // var step = (anticlockwise ? -Math.PI : Math.PI) / 2;\n\n\n for (var angle = 0; angle < endAngle; angle += Math.PI / 2) {\n if (angle > startAngle) {\n extremity[0] = mathCos(angle) * rx + x;\n extremity[1] = mathSin(angle) * ry + y;\n vec2Min(min, extremity, min);\n vec2Max(max, extremity, max);\n }\n }\n}\n\nexports.fromPoints = fromPoints;\nexports.fromLine = fromLine;\nexports.fromCubic = fromCubic;\nexports.fromQuadratic = fromQuadratic;\nexports.fromArc = fromArc;"],"sourceRoot":""}