{"version":3,"sources":["webpack:///../node_modules/gsap/utils/paths.js","webpack:///../node_modules/gsap/CustomEase.js","webpack:///../node_modules/gsap/CustomWiggle.js"],"names":["_svgPathExp","_scientific","_DEG2RAD","Math","PI","_sin","sin","_cos","cos","_abs","abs","_sqrt","sqrt","_isNumber","atan2","value","_roundingNum","_round","round","arcToSegment","lastX","lastY","rx","ry","angle","largeArcFlag","sweepFlag","x","y","angleRad","cosAngle","sinAngle","TWOPI","dx2","dy2","x1","y1","x1_sq","y1_sq","radiiCheck","rx_sq","ry_sq","sq","coef","cx1","cy1","cx","cy","ux","uy","vx","vy","temp","angleStart","acos","angleExtent","isNaN","i","segments","ceil","rawPath","angleIncrement","controlLength","ma","mb","mc","md","push","length","stringToRawPath","d","j","command","isRelative","segment","startX","startY","difX","difY","beziers","prevCommand","flag1","flag2","a","replace","m","n","match","path","relativeX","relativeY","twoThirds","elements","points","errorMessage","line","sx","sy","ex","ey","console","log","toUpperCase","closed","substr","charAt","pop","totalPoints","rawPathToString","sl","s","result","l","gsap","_coreInitted","_getGSAP","window","registerPlugin","_initCore","registerEase","CustomEase","create","warn","_numExp","_needsParsingExp","_bezierToPoints","x2","y2","x3","y3","x4","y4","threshold","index","x12","y12","x23","y23","x34","y34","x123","y123","x234","y234","x1234","y1234","dx","dy","d2","d3","splice","id","data","config","this","setData","_proto","prototype","a1","a2","inc","point","prevPoint","p","values","closest","lookup","precision","fast","test","indexOf","unshift","height","originY","max","tx","ty","min","_findMinimum","_normalize","nx","ease","custom","getSVGData","register","core","get","parseEase","slope","prevX","prevY","width","e","utils","toArray","invert","b","c","_dirty","transformRawPath","join","setAttribute","version","createCustomEase","_eases","easeOut","easeInOut","anticipate","uniform","_linearEase","required","_create","vars","wiggles","_parseEase","invertNonCustomEases","nextX","nextY","handleX","handleY","easedX","type","yEase","xEase","timingEase","amplitudeEase","random","CustomWiggle"],"mappings":"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","file":"js/vendor.c7d25f4c2e186db34e0a.bundle.js","sourcesContent":["/*!\n * paths 3.6.1\n * https://greensock.com\n *\n * Copyright 2008-2021, GreenSock. All rights reserved.\n * Subject to the terms at https://greensock.com/standard-license or for\n * Club GreenSock members, the agreement issued with that membership.\n * @author: Jack Doyle, jack@greensock.com\n*/\n\n/* eslint-disable */\nvar _svgPathExp = /[achlmqstvz]|(-?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?)[0-9]/ig,\n _numbersExp = /(?:(-)?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?)[0-9]/ig,\n _scientific = /[\\+\\-]?\\d*\\.?\\d+e[\\+\\-]?\\d+/ig,\n _selectorExp = /(^[#\\.][a-z]|[a-y][a-z])/i,\n _DEG2RAD = Math.PI / 180,\n _RAD2DEG = 180 / Math.PI,\n _sin = Math.sin,\n _cos = Math.cos,\n _abs = Math.abs,\n _sqrt = Math.sqrt,\n _atan2 = Math.atan2,\n _largeNum = 1e8,\n _isString = function _isString(value) {\n return typeof value === \"string\";\n},\n _isNumber = function _isNumber(value) {\n return typeof value === \"number\";\n},\n _isUndefined = function _isUndefined(value) {\n return typeof value === \"undefined\";\n},\n _temp = {},\n _temp2 = {},\n _roundingNum = 1e5,\n _wrapProgress = function _wrapProgress(progress) {\n return Math.round((progress + _largeNum) % 1 * _roundingNum) / _roundingNum || (progress < 0 ? 0 : 1);\n},\n //if progress lands on 1, the % will make it 0 which is why we || 1, but not if it's negative because it makes more sense for motion to end at 0 in that case.\n_round = function _round(value) {\n return Math.round(value * _roundingNum) / _roundingNum || 0;\n},\n _roundPrecise = function _roundPrecise(value) {\n return Math.round(value * 1e10) / 1e10 || 0;\n},\n _splitSegment = function _splitSegment(rawPath, segIndex, i, t) {\n var segment = rawPath[segIndex],\n shift = t === 1 ? 6 : subdivideSegment(segment, i, t);\n\n if (shift && shift + i + 2 < segment.length) {\n rawPath.splice(segIndex, 0, segment.slice(0, i + shift + 2));\n segment.splice(0, i + shift);\n return 1;\n }\n},\n _reverseRawPath = function _reverseRawPath(rawPath, skipOuter) {\n var i = rawPath.length;\n skipOuter || rawPath.reverse();\n\n while (i--) {\n rawPath[i].reversed || reverseSegment(rawPath[i]);\n }\n},\n _copyMetaData = function _copyMetaData(source, copy) {\n copy.totalLength = source.totalLength;\n\n if (source.samples) {\n //segment\n copy.samples = source.samples.slice(0);\n copy.lookup = source.lookup.slice(0);\n copy.minLength = source.minLength;\n copy.resolution = source.resolution;\n } else if (source.totalPoints) {\n //rawPath\n copy.totalPoints = source.totalPoints;\n }\n\n return copy;\n},\n //pushes a new segment into a rawPath, but if its starting values match the ending values of the last segment, it'll merge it into that same segment (to reduce the number of segments)\n_appendOrMerge = function _appendOrMerge(rawPath, segment) {\n var index = rawPath.length,\n prevSeg = rawPath[index - 1] || [],\n l = prevSeg.length;\n\n if (index && segment[0] === prevSeg[l - 2] && segment[1] === prevSeg[l - 1]) {\n segment = prevSeg.concat(segment.slice(2));\n index--;\n }\n\n rawPath[index] = segment;\n},\n _bestDistance;\n/* TERMINOLOGY\n - RawPath - an array of arrays, one for each Segment. A single RawPath could have multiple \"M\" commands, defining Segments (paths aren't always connected).\n - Segment - an array containing a sequence of Cubic Bezier coordinates in alternating x, y, x, y format. Starting anchor, then control point 1, control point 2, and ending anchor, then the next control point 1, control point 2, anchor, etc. Uses less memory than an array with a bunch of {x, y} points.\n - Bezier - a single cubic Bezier with a starting anchor, two control points, and an ending anchor.\n - the variable \"t\" is typically the position along an individual Bezier path (time) and it's NOT linear, meaning it could accelerate/decelerate based on the control points whereas the \"p\" or \"progress\" value is linearly mapped to the whole path, so it shouldn't really accelerate/decelerate based on control points. So a progress of 0.2 would be almost exactly 20% along the path. \"t\" is ONLY in an individual Bezier piece.\n */\n//accepts basic selector text, a path instance, a RawPath instance, or a Segment and returns a RawPath (makes it easy to homogenize things). If an element or selector text is passed in, it'll also cache the value so that if it's queried again, it'll just take the path data from there instead of parsing it all over again (as long as the path data itself hasn't changed - it'll check).\n\n\nexport function getRawPath(value) {\n value = _isString(value) && _selectorExp.test(value) ? document.querySelector(value) || value : value;\n var e = value.getAttribute ? value : 0,\n rawPath;\n\n if (e && (value = value.getAttribute(\"d\"))) {\n //implements caching\n if (!e._gsPath) {\n e._gsPath = {};\n }\n\n rawPath = e._gsPath[value];\n return rawPath && !rawPath._dirty ? rawPath : e._gsPath[value] = stringToRawPath(value);\n }\n\n return !value ? console.warn(\"Expecting a element or an SVG path data string\") : _isString(value) ? stringToRawPath(value) : _isNumber(value[0]) ? [value] : value;\n} //copies a RawPath WITHOUT the length meta data (for speed)\n\nexport function copyRawPath(rawPath) {\n var a = [],\n i = 0;\n\n for (; i < rawPath.length; i++) {\n a[i] = _copyMetaData(rawPath[i], rawPath[i].slice(0));\n }\n\n return _copyMetaData(rawPath, a);\n}\nexport function reverseSegment(segment) {\n var i = 0,\n y;\n segment.reverse(); //this will invert the order y, x, y, x so we must flip it back.\n\n for (; i < segment.length; i += 2) {\n y = segment[i];\n segment[i] = segment[i + 1];\n segment[i + 1] = y;\n }\n\n segment.reversed = !segment.reversed;\n}\n\nvar _createPath = function _createPath(e, ignore) {\n var path = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\"),\n attr = [].slice.call(e.attributes),\n i = attr.length,\n name;\n ignore = \",\" + ignore + \",\";\n\n while (--i > -1) {\n name = attr[i].nodeName.toLowerCase(); //in Microsoft Edge, if you don't set the attribute with a lowercase name, it doesn't render correctly! Super weird.\n\n if (ignore.indexOf(\",\" + name + \",\") < 0) {\n path.setAttributeNS(null, name, attr[i].nodeValue);\n }\n }\n\n return path;\n},\n _typeAttrs = {\n rect: \"rx,ry,x,y,width,height\",\n circle: \"r,cx,cy\",\n ellipse: \"rx,ry,cx,cy\",\n line: \"x1,x2,y1,y2\"\n},\n _attrToObj = function _attrToObj(e, attrs) {\n var props = attrs ? attrs.split(\",\") : [],\n obj = {},\n i = props.length;\n\n while (--i > -1) {\n obj[props[i]] = +e.getAttribute(props[i]) || 0;\n }\n\n return obj;\n}; //converts an SVG shape like , , , , , etc. to a , swapping it in and copying the attributes to match.\n\n\nexport function convertToPath(element, swap) {\n var type = element.tagName.toLowerCase(),\n circ = 0.552284749831,\n data,\n x,\n y,\n r,\n ry,\n path,\n rcirc,\n rycirc,\n points,\n w,\n h,\n x2,\n x3,\n x4,\n x5,\n x6,\n y2,\n y3,\n y4,\n y5,\n y6,\n attr;\n\n if (type === \"path\" || !element.getBBox) {\n return element;\n }\n\n path = _createPath(element, \"x,y,width,height,cx,cy,rx,ry,r,x1,x2,y1,y2,points\");\n attr = _attrToObj(element, _typeAttrs[type]);\n\n if (type === \"rect\") {\n r = attr.rx;\n ry = attr.ry || r;\n x = attr.x;\n y = attr.y;\n w = attr.width - r * 2;\n h = attr.height - ry * 2;\n\n if (r || ry) {\n //if there are rounded corners, render cubic beziers\n x2 = x + r * (1 - circ);\n x3 = x + r;\n x4 = x3 + w;\n x5 = x4 + r * circ;\n x6 = x4 + r;\n y2 = y + ry * (1 - circ);\n y3 = y + ry;\n y4 = y3 + h;\n y5 = y4 + ry * circ;\n y6 = y4 + ry;\n data = \"M\" + x6 + \",\" + y3 + \" V\" + y4 + \" C\" + [x6, y5, x5, y6, x4, y6, x4 - (x4 - x3) / 3, y6, x3 + (x4 - x3) / 3, y6, x3, y6, x2, y6, x, y5, x, y4, x, y4 - (y4 - y3) / 3, x, y3 + (y4 - y3) / 3, x, y3, x, y2, x2, y, x3, y, x3 + (x4 - x3) / 3, y, x4 - (x4 - x3) / 3, y, x4, y, x5, y, x6, y2, x6, y3].join(\",\") + \"z\";\n } else {\n data = \"M\" + (x + w) + \",\" + y + \" v\" + h + \" h\" + -w + \" v\" + -h + \" h\" + w + \"z\";\n }\n } else if (type === \"circle\" || type === \"ellipse\") {\n if (type === \"circle\") {\n r = ry = attr.r;\n rycirc = r * circ;\n } else {\n r = attr.rx;\n ry = attr.ry;\n rycirc = ry * circ;\n }\n\n x = attr.cx;\n y = attr.cy;\n rcirc = r * circ;\n data = \"M\" + (x + r) + \",\" + y + \" C\" + [x + r, y + rycirc, x + rcirc, y + ry, x, y + ry, x - rcirc, y + ry, x - r, y + rycirc, x - r, y, x - r, y - rycirc, x - rcirc, y - ry, x, y - ry, x + rcirc, y - ry, x + r, y - rycirc, x + r, y].join(\",\") + \"z\";\n } else if (type === \"line\") {\n data = \"M\" + attr.x1 + \",\" + attr.y1 + \" L\" + attr.x2 + \",\" + attr.y2; //previously, we just converted to \"Mx,y Lx,y\" but Safari has bugs that cause that not to render properly when using a stroke-dasharray that's not fully visible! Using a cubic bezier fixes that issue.\n } else if (type === \"polyline\" || type === \"polygon\") {\n points = (element.getAttribute(\"points\") + \"\").match(_numbersExp) || [];\n x = points.shift();\n y = points.shift();\n data = \"M\" + x + \",\" + y + \" L\" + points.join(\",\");\n\n if (type === \"polygon\") {\n data += \",\" + x + \",\" + y + \"z\";\n }\n }\n\n path.setAttribute(\"d\", rawPathToString(path._gsRawPath = stringToRawPath(data)));\n\n if (swap && element.parentNode) {\n element.parentNode.insertBefore(path, element);\n element.parentNode.removeChild(element);\n }\n\n return path;\n} //returns the rotation (in degrees) at a particular progress on a rawPath (the slope of the tangent)\n\nexport function getRotationAtProgress(rawPath, progress) {\n var d = getProgressData(rawPath, progress >= 1 ? 1 - 1e-9 : progress ? progress : 1e-9);\n return getRotationAtBezierT(d.segment, d.i, d.t);\n}\n\nfunction getRotationAtBezierT(segment, i, t) {\n var a = segment[i],\n b = segment[i + 2],\n c = segment[i + 4],\n x;\n a += (b - a) * t;\n b += (c - b) * t;\n a += (b - a) * t;\n x = b + (c + (segment[i + 6] - c) * t - b) * t - a;\n a = segment[i + 1];\n b = segment[i + 3];\n c = segment[i + 5];\n a += (b - a) * t;\n b += (c - b) * t;\n a += (b - a) * t;\n return _round(_atan2(b + (c + (segment[i + 7] - c) * t - b) * t - a, x) * _RAD2DEG);\n}\n\nexport function sliceRawPath(rawPath, start, end) {\n end = _isUndefined(end) ? 1 : _roundPrecise(end) || 0; // we must round to avoid issues like 4.15 / 8 = 0.8300000000000001 instead of 0.83 or 2.8 / 5 = 0.5599999999999999 instead of 0.56 and if someone is doing a loop like start: 2.8 / 0.5, end: 2.8 / 0.5 + 1.\n\n start = _roundPrecise(start) || 0;\n var loops = Math.max(0, ~~(_abs(end - start) - 1e-8)),\n path = copyRawPath(rawPath);\n\n if (start > end) {\n start = 1 - start;\n end = 1 - end;\n\n _reverseRawPath(path);\n\n path.totalLength = 0;\n }\n\n if (start < 0 || end < 0) {\n var offset = Math.abs(~~Math.min(start, end)) + 1;\n start += offset;\n end += offset;\n }\n\n path.totalLength || cacheRawPathMeasurements(path);\n var wrap = end > 1,\n s = getProgressData(path, start, _temp, true),\n e = getProgressData(path, end, _temp2),\n eSeg = e.segment,\n sSeg = s.segment,\n eSegIndex = e.segIndex,\n sSegIndex = s.segIndex,\n ei = e.i,\n si = s.i,\n sameSegment = sSegIndex === eSegIndex,\n sameBezier = ei === si && sameSegment,\n wrapsBehind,\n sShift,\n eShift,\n i,\n copy,\n totalSegments,\n l,\n j;\n\n if (wrap || loops) {\n wrapsBehind = eSegIndex < sSegIndex || sameSegment && ei < si || sameBezier && e.t < s.t;\n\n if (_splitSegment(path, sSegIndex, si, s.t)) {\n sSegIndex++;\n\n if (!wrapsBehind) {\n eSegIndex++;\n\n if (sameBezier) {\n e.t = (e.t - s.t) / (1 - s.t);\n ei = 0;\n } else if (sameSegment) {\n ei -= si;\n }\n }\n }\n\n if (1 - (end - start) < 1e-5) {\n eSegIndex = sSegIndex - 1;\n } else if (!e.t && eSegIndex) {\n eSegIndex--;\n } else if (_splitSegment(path, eSegIndex, ei, e.t) && wrapsBehind) {\n sSegIndex++;\n }\n\n if (s.t === 1) {\n sSegIndex = (sSegIndex + 1) % path.length;\n }\n\n copy = [];\n totalSegments = path.length;\n l = 1 + totalSegments * loops;\n j = sSegIndex;\n l += (totalSegments - sSegIndex + eSegIndex) % totalSegments;\n\n for (i = 0; i < l; i++) {\n _appendOrMerge(copy, path[j++ % totalSegments]);\n }\n\n path = copy;\n } else {\n eShift = e.t === 1 ? 6 : subdivideSegment(eSeg, ei, e.t);\n\n if (start !== end) {\n sShift = subdivideSegment(sSeg, si, sameBezier ? s.t / e.t : s.t);\n sameSegment && (eShift += sShift);\n eSeg.splice(ei + eShift + 2);\n (sShift || si) && sSeg.splice(0, si + sShift);\n i = path.length;\n\n while (i--) {\n //chop off any extra segments\n (i < sSegIndex || i > eSegIndex) && path.splice(i, 1);\n }\n } else {\n eSeg.angle = getRotationAtBezierT(eSeg, ei + eShift, 0); //record the value before we chop because it'll be impossible to determine the angle after its length is 0!\n\n ei += eShift;\n s = eSeg[ei];\n e = eSeg[ei + 1];\n eSeg.length = eSeg.totalLength = 0;\n eSeg.totalPoints = path.totalPoints = 8;\n eSeg.push(s, e, s, e, s, e, s, e);\n }\n }\n\n path.totalLength = 0;\n return path;\n} //measures a Segment according to its resolution (so if segment.resolution is 6, for example, it'll take 6 samples equally across each Bezier) and create/populate a \"samples\" Array that has the length up to each of those sample points (always increasing from the start) as well as a \"lookup\" array that's broken up according to the smallest distance between 2 samples. This gives us a very fast way of looking up a progress position rather than looping through all the points/Beziers. You can optionally have it only measure a subset, starting at startIndex and going for a specific number of beziers (remember, there are 3 x/y pairs each, for a total of 6 elements for each Bezier). It will also populate a \"totalLength\" property, but that's not generally super accurate because by default it'll only take 6 samples per Bezier. But for performance reasons, it's perfectly adequate for measuring progress values along the path. If you need a more accurate totalLength, either increase the resolution or use the more advanced bezierToPoints() method which keeps adding points until they don't deviate by more than a certain precision value.\n\nfunction measureSegment(segment, startIndex, bezierQty) {\n startIndex = startIndex || 0;\n\n if (!segment.samples) {\n segment.samples = [];\n segment.lookup = [];\n }\n\n var resolution = ~~segment.resolution || 12,\n inc = 1 / resolution,\n endIndex = bezierQty ? startIndex + bezierQty * 6 + 1 : segment.length,\n x1 = segment[startIndex],\n y1 = segment[startIndex + 1],\n samplesIndex = startIndex ? startIndex / 6 * resolution : 0,\n samples = segment.samples,\n lookup = segment.lookup,\n min = (startIndex ? segment.minLength : _largeNum) || _largeNum,\n prevLength = samples[samplesIndex + bezierQty * resolution - 1],\n length = startIndex ? samples[samplesIndex - 1] : 0,\n i,\n j,\n x4,\n x3,\n x2,\n xd,\n xd1,\n y4,\n y3,\n y2,\n yd,\n yd1,\n inv,\n t,\n lengthIndex,\n l,\n segLength;\n samples.length = lookup.length = 0;\n\n for (j = startIndex + 2; j < endIndex; j += 6) {\n x4 = segment[j + 4] - x1;\n x3 = segment[j + 2] - x1;\n x2 = segment[j] - x1;\n y4 = segment[j + 5] - y1;\n y3 = segment[j + 3] - y1;\n y2 = segment[j + 1] - y1;\n xd = xd1 = yd = yd1 = 0;\n\n if (_abs(x4) < 1e-5 && _abs(y4) < 1e-5 && _abs(x2) + _abs(y2) < 1e-5) {\n //dump points that are sufficiently close (basically right on top of each other, making a bezier super tiny or 0 length)\n if (segment.length > 8) {\n segment.splice(j, 6);\n j -= 6;\n endIndex -= 6;\n }\n } else {\n for (i = 1; i <= resolution; i++) {\n t = inc * i;\n inv = 1 - t;\n xd = xd1 - (xd1 = (t * t * x4 + 3 * inv * (t * x3 + inv * x2)) * t);\n yd = yd1 - (yd1 = (t * t * y4 + 3 * inv * (t * y3 + inv * y2)) * t);\n l = _sqrt(yd * yd + xd * xd);\n\n if (l < min) {\n min = l;\n }\n\n length += l;\n samples[samplesIndex++] = length;\n }\n }\n\n x1 += x4;\n y1 += y4;\n }\n\n if (prevLength) {\n prevLength -= length;\n\n for (; samplesIndex < samples.length; samplesIndex++) {\n samples[samplesIndex] += prevLength;\n }\n }\n\n if (samples.length && min) {\n segment.totalLength = segLength = samples[samples.length - 1] || 0;\n segment.minLength = min;\n l = lengthIndex = 0;\n\n for (i = 0; i < segLength; i += min) {\n lookup[l++] = samples[lengthIndex] < i ? ++lengthIndex : lengthIndex;\n }\n } else {\n segment.totalLength = samples[0] = 0;\n }\n\n return startIndex ? length - samples[startIndex / 2 - 1] : length;\n}\n\nexport function cacheRawPathMeasurements(rawPath, resolution) {\n var pathLength, points, i;\n\n for (i = pathLength = points = 0; i < rawPath.length; i++) {\n rawPath[i].resolution = ~~resolution || 12; //steps per Bezier curve (anchor, 2 control points, to anchor)\n\n points += rawPath[i].length;\n pathLength += measureSegment(rawPath[i]);\n }\n\n rawPath.totalPoints = points;\n rawPath.totalLength = pathLength;\n return rawPath;\n} //divide segment[i] at position t (value between 0 and 1, progress along that particular cubic bezier segment that starts at segment[i]). Returns how many elements were spliced into the segment array (either 0 or 6)\n\nexport function subdivideSegment(segment, i, t) {\n if (t <= 0 || t >= 1) {\n return 0;\n }\n\n var ax = segment[i],\n ay = segment[i + 1],\n cp1x = segment[i + 2],\n cp1y = segment[i + 3],\n cp2x = segment[i + 4],\n cp2y = segment[i + 5],\n bx = segment[i + 6],\n by = segment[i + 7],\n x1a = ax + (cp1x - ax) * t,\n x2 = cp1x + (cp2x - cp1x) * t,\n y1a = ay + (cp1y - ay) * t,\n y2 = cp1y + (cp2y - cp1y) * t,\n x1 = x1a + (x2 - x1a) * t,\n y1 = y1a + (y2 - y1a) * t,\n x2a = cp2x + (bx - cp2x) * t,\n y2a = cp2y + (by - cp2y) * t;\n x2 += (x2a - x2) * t;\n y2 += (y2a - y2) * t;\n segment.splice(i + 2, 4, _round(x1a), //first control point\n _round(y1a), _round(x1), //second control point\n _round(y1), _round(x1 + (x2 - x1) * t), //new fabricated anchor on line\n _round(y1 + (y2 - y1) * t), _round(x2), //third control point\n _round(y2), _round(x2a), //fourth control point\n _round(y2a));\n segment.samples && segment.samples.splice(i / 6 * segment.resolution | 0, 0, 0, 0, 0, 0, 0, 0);\n return 6;\n} // returns an object {path, segment, segIndex, i, t}\n\nfunction getProgressData(rawPath, progress, decoratee, pushToNextIfAtEnd) {\n decoratee = decoratee || {};\n rawPath.totalLength || cacheRawPathMeasurements(rawPath);\n\n if (progress < 0 || progress > 1) {\n progress = _wrapProgress(progress);\n }\n\n var segIndex = 0,\n segment = rawPath[0],\n samples,\n resolution,\n length,\n min,\n max,\n i,\n t;\n\n if (!progress) {\n t = i = segIndex = 0;\n segment = rawPath[0];\n } else if (progress === 1) {\n t = 1;\n segIndex = rawPath.length - 1;\n segment = rawPath[segIndex];\n i = segment.length - 8;\n } else {\n if (rawPath.length > 1) {\n //speed optimization: most of the time, there's only one segment so skip the recursion.\n length = rawPath.totalLength * progress;\n max = i = 0;\n\n while ((max += rawPath[i++].totalLength) < length) {\n segIndex = i;\n }\n\n segment = rawPath[segIndex];\n min = max - segment.totalLength;\n progress = (length - min) / (max - min) || 0;\n }\n\n samples = segment.samples;\n resolution = segment.resolution; //how many samples per cubic bezier chunk\n\n length = segment.totalLength * progress;\n i = segment.lookup[~~(length / segment.minLength)] || 0;\n min = i ? samples[i - 1] : 0;\n max = samples[i];\n\n if (max < length) {\n min = max;\n max = samples[++i];\n }\n\n t = 1 / resolution * ((length - min) / (max - min) + i % resolution);\n i = ~~(i / resolution) * 6;\n\n if (pushToNextIfAtEnd && t === 1) {\n if (i + 6 < segment.length) {\n i += 6;\n t = 0;\n } else if (segIndex + 1 < rawPath.length) {\n i = t = 0;\n segment = rawPath[++segIndex];\n }\n }\n }\n\n decoratee.t = t;\n decoratee.i = i;\n decoratee.path = rawPath;\n decoratee.segment = segment;\n decoratee.segIndex = segIndex;\n return decoratee;\n}\n\nexport function getPositionOnPath(rawPath, progress, includeAngle, point) {\n var segment = rawPath[0],\n result = point || {},\n samples,\n resolution,\n length,\n min,\n max,\n i,\n t,\n a,\n inv;\n\n if (progress < 0 || progress > 1) {\n progress = _wrapProgress(progress);\n }\n\n if (rawPath.length > 1) {\n //speed optimization: most of the time, there's only one segment so skip the recursion.\n length = rawPath.totalLength * progress;\n max = i = 0;\n\n while ((max += rawPath[i++].totalLength) < length) {\n segment = rawPath[i];\n }\n\n min = max - segment.totalLength;\n progress = (length - min) / (max - min) || 0;\n }\n\n samples = segment.samples;\n resolution = segment.resolution;\n length = segment.totalLength * progress;\n i = segment.lookup[progress < 1 ? ~~(length / segment.minLength) : segment.lookup.length - 1] || 0;\n min = i ? samples[i - 1] : 0;\n max = samples[i];\n\n if (max < length) {\n min = max;\n max = samples[++i];\n }\n\n t = 1 / resolution * ((length - min) / (max - min) + i % resolution) || 0;\n inv = 1 - t;\n i = ~~(i / resolution) * 6;\n a = segment[i];\n result.x = _round((t * t * (segment[i + 6] - a) + 3 * inv * (t * (segment[i + 4] - a) + inv * (segment[i + 2] - a))) * t + a);\n result.y = _round((t * t * (segment[i + 7] - (a = segment[i + 1])) + 3 * inv * (t * (segment[i + 5] - a) + inv * (segment[i + 3] - a))) * t + a);\n\n if (includeAngle) {\n result.angle = segment.totalLength ? getRotationAtBezierT(segment, i, t >= 1 ? 1 - 1e-9 : t ? t : 1e-9) : segment.angle || 0;\n }\n\n return result;\n} //applies a matrix transform to RawPath (or a segment in a RawPath) and returns whatever was passed in (it transforms the values in the array(s), not a copy).\n\nexport function transformRawPath(rawPath, a, b, c, d, tx, ty) {\n var j = rawPath.length,\n segment,\n l,\n i,\n x,\n y;\n\n while (--j > -1) {\n segment = rawPath[j];\n l = segment.length;\n\n for (i = 0; i < l; i += 2) {\n x = segment[i];\n y = segment[i + 1];\n segment[i] = x * a + y * c + tx;\n segment[i + 1] = x * b + y * d + ty;\n }\n }\n\n rawPath._dirty = 1;\n return rawPath;\n} // translates SVG arc data into a segment (cubic beziers). Angle is in degrees.\n\nfunction arcToSegment(lastX, lastY, rx, ry, angle, largeArcFlag, sweepFlag, x, y) {\n if (lastX === x && lastY === y) {\n return;\n }\n\n rx = _abs(rx);\n ry = _abs(ry);\n\n var angleRad = angle % 360 * _DEG2RAD,\n cosAngle = _cos(angleRad),\n sinAngle = _sin(angleRad),\n PI = Math.PI,\n TWOPI = PI * 2,\n dx2 = (lastX - x) / 2,\n dy2 = (lastY - y) / 2,\n x1 = cosAngle * dx2 + sinAngle * dy2,\n y1 = -sinAngle * dx2 + cosAngle * dy2,\n x1_sq = x1 * x1,\n y1_sq = y1 * y1,\n radiiCheck = x1_sq / (rx * rx) + y1_sq / (ry * ry);\n\n if (radiiCheck > 1) {\n rx = _sqrt(radiiCheck) * rx;\n ry = _sqrt(radiiCheck) * ry;\n }\n\n var rx_sq = rx * rx,\n ry_sq = ry * ry,\n sq = (rx_sq * ry_sq - rx_sq * y1_sq - ry_sq * x1_sq) / (rx_sq * y1_sq + ry_sq * x1_sq);\n\n if (sq < 0) {\n sq = 0;\n }\n\n var coef = (largeArcFlag === sweepFlag ? -1 : 1) * _sqrt(sq),\n cx1 = coef * (rx * y1 / ry),\n cy1 = coef * -(ry * x1 / rx),\n sx2 = (lastX + x) / 2,\n sy2 = (lastY + y) / 2,\n cx = sx2 + (cosAngle * cx1 - sinAngle * cy1),\n cy = sy2 + (sinAngle * cx1 + cosAngle * cy1),\n ux = (x1 - cx1) / rx,\n uy = (y1 - cy1) / ry,\n vx = (-x1 - cx1) / rx,\n vy = (-y1 - cy1) / ry,\n temp = ux * ux + uy * uy,\n angleStart = (uy < 0 ? -1 : 1) * Math.acos(ux / _sqrt(temp)),\n angleExtent = (ux * vy - uy * vx < 0 ? -1 : 1) * Math.acos((ux * vx + uy * vy) / _sqrt(temp * (vx * vx + vy * vy)));\n\n isNaN(angleExtent) && (angleExtent = PI); //rare edge case. Math.cos(-1) is NaN.\n\n if (!sweepFlag && angleExtent > 0) {\n angleExtent -= TWOPI;\n } else if (sweepFlag && angleExtent < 0) {\n angleExtent += TWOPI;\n }\n\n angleStart %= TWOPI;\n angleExtent %= TWOPI;\n\n var segments = Math.ceil(_abs(angleExtent) / (TWOPI / 4)),\n rawPath = [],\n angleIncrement = angleExtent / segments,\n controlLength = 4 / 3 * _sin(angleIncrement / 2) / (1 + _cos(angleIncrement / 2)),\n ma = cosAngle * rx,\n mb = sinAngle * rx,\n mc = sinAngle * -ry,\n md = cosAngle * ry,\n i;\n\n for (i = 0; i < segments; i++) {\n angle = angleStart + i * angleIncrement;\n x1 = _cos(angle);\n y1 = _sin(angle);\n ux = _cos(angle += angleIncrement);\n uy = _sin(angle);\n rawPath.push(x1 - controlLength * y1, y1 + controlLength * x1, ux + controlLength * uy, uy - controlLength * ux, ux, uy);\n } //now transform according to the actual size of the ellipse/arc (the beziers were noramlized, between 0 and 1 on a circle).\n\n\n for (i = 0; i < rawPath.length; i += 2) {\n x1 = rawPath[i];\n y1 = rawPath[i + 1];\n rawPath[i] = x1 * ma + y1 * mc + cx;\n rawPath[i + 1] = x1 * mb + y1 * md + cy;\n }\n\n rawPath[i - 2] = x; //always set the end to exactly where it's supposed to be\n\n rawPath[i - 1] = y;\n return rawPath;\n} //Spits back a RawPath with absolute coordinates. Each segment starts with a \"moveTo\" command (x coordinate, then y) and then 2 control points (x, y, x, y), then anchor. The goal is to minimize memory and maximize speed.\n\n\nexport function stringToRawPath(d) {\n var a = (d + \"\").replace(_scientific, function (m) {\n var n = +m;\n return n < 0.0001 && n > -0.0001 ? 0 : n;\n }).match(_svgPathExp) || [],\n //some authoring programs spit out very small numbers in scientific notation like \"1e-5\", so make sure we round that down to 0 first.\n path = [],\n relativeX = 0,\n relativeY = 0,\n twoThirds = 2 / 3,\n elements = a.length,\n points = 0,\n errorMessage = \"ERROR: malformed path: \" + d,\n i,\n j,\n x,\n y,\n command,\n isRelative,\n segment,\n startX,\n startY,\n difX,\n difY,\n beziers,\n prevCommand,\n flag1,\n flag2,\n line = function line(sx, sy, ex, ey) {\n difX = (ex - sx) / 3;\n difY = (ey - sy) / 3;\n segment.push(sx + difX, sy + difY, ex - difX, ey - difY, ex, ey);\n };\n\n if (!d || !isNaN(a[0]) || isNaN(a[1])) {\n console.log(errorMessage);\n return path;\n }\n\n for (i = 0; i < elements; i++) {\n prevCommand = command;\n\n if (isNaN(a[i])) {\n command = a[i].toUpperCase();\n isRelative = command !== a[i]; //lower case means relative\n } else {\n //commands like \"C\" can be strung together without any new command characters between.\n i--;\n }\n\n x = +a[i + 1];\n y = +a[i + 2];\n\n if (isRelative) {\n x += relativeX;\n y += relativeY;\n }\n\n if (!i) {\n startX = x;\n startY = y;\n } // \"M\" (move)\n\n\n if (command === \"M\") {\n if (segment) {\n if (segment.length < 8) {\n //if the path data was funky and just had a M with no actual drawing anywhere, skip it.\n path.length -= 1;\n } else {\n points += segment.length;\n }\n }\n\n relativeX = startX = x;\n relativeY = startY = y;\n segment = [x, y];\n path.push(segment);\n i += 2;\n command = \"L\"; //an \"M\" with more than 2 values gets interpreted as \"lineTo\" commands (\"L\").\n // \"C\" (cubic bezier)\n } else if (command === \"C\") {\n if (!segment) {\n segment = [0, 0];\n }\n\n if (!isRelative) {\n relativeX = relativeY = 0;\n } //note: \"*1\" is just a fast/short way to cast the value as a Number. WAAAY faster in Chrome, slightly slower in Firefox.\n\n\n segment.push(x, y, relativeX + a[i + 3] * 1, relativeY + a[i + 4] * 1, relativeX += a[i + 5] * 1, relativeY += a[i + 6] * 1);\n i += 6; // \"S\" (continuation of cubic bezier)\n } else if (command === \"S\") {\n difX = relativeX;\n difY = relativeY;\n\n if (prevCommand === \"C\" || prevCommand === \"S\") {\n difX += relativeX - segment[segment.length - 4];\n difY += relativeY - segment[segment.length - 3];\n }\n\n if (!isRelative) {\n relativeX = relativeY = 0;\n }\n\n segment.push(difX, difY, x, y, relativeX += a[i + 3] * 1, relativeY += a[i + 4] * 1);\n i += 4; // \"Q\" (quadratic bezier)\n } else if (command === \"Q\") {\n difX = relativeX + (x - relativeX) * twoThirds;\n difY = relativeY + (y - relativeY) * twoThirds;\n\n if (!isRelative) {\n relativeX = relativeY = 0;\n }\n\n relativeX += a[i + 3] * 1;\n relativeY += a[i + 4] * 1;\n segment.push(difX, difY, relativeX + (x - relativeX) * twoThirds, relativeY + (y - relativeY) * twoThirds, relativeX, relativeY);\n i += 4; // \"T\" (continuation of quadratic bezier)\n } else if (command === \"T\") {\n difX = relativeX - segment[segment.length - 4];\n difY = relativeY - segment[segment.length - 3];\n segment.push(relativeX + difX, relativeY + difY, x + (relativeX + difX * 1.5 - x) * twoThirds, y + (relativeY + difY * 1.5 - y) * twoThirds, relativeX = x, relativeY = y);\n i += 2; // \"H\" (horizontal line)\n } else if (command === \"H\") {\n line(relativeX, relativeY, relativeX = x, relativeY);\n i += 1; // \"V\" (vertical line)\n } else if (command === \"V\") {\n //adjust values because the first (and only one) isn't x in this case, it's y.\n line(relativeX, relativeY, relativeX, relativeY = x + (isRelative ? relativeY - relativeX : 0));\n i += 1; // \"L\" (line) or \"Z\" (close)\n } else if (command === \"L\" || command === \"Z\") {\n if (command === \"Z\") {\n x = startX;\n y = startY;\n segment.closed = true;\n }\n\n if (command === \"L\" || _abs(relativeX - x) > 0.5 || _abs(relativeY - y) > 0.5) {\n line(relativeX, relativeY, x, y);\n\n if (command === \"L\") {\n i += 2;\n }\n }\n\n relativeX = x;\n relativeY = y; // \"A\" (arc)\n } else if (command === \"A\") {\n flag1 = a[i + 4];\n flag2 = a[i + 5];\n difX = a[i + 6];\n difY = a[i + 7];\n j = 7;\n\n if (flag1.length > 1) {\n // for cases when the flags are merged, like \"a8 8 0 018 8\" (the 0 and 1 flags are WITH the x value of 8, but it could also be \"a8 8 0 01-8 8\" so it may include x or not)\n if (flag1.length < 3) {\n difY = difX;\n difX = flag2;\n j--;\n } else {\n difY = flag2;\n difX = flag1.substr(2);\n j -= 2;\n }\n\n flag2 = flag1.charAt(1);\n flag1 = flag1.charAt(0);\n }\n\n beziers = arcToSegment(relativeX, relativeY, +a[i + 1], +a[i + 2], +a[i + 3], +flag1, +flag2, (isRelative ? relativeX : 0) + difX * 1, (isRelative ? relativeY : 0) + difY * 1);\n i += j;\n\n if (beziers) {\n for (j = 0; j < beziers.length; j++) {\n segment.push(beziers[j]);\n }\n }\n\n relativeX = segment[segment.length - 2];\n relativeY = segment[segment.length - 1];\n } else {\n console.log(errorMessage);\n }\n }\n\n i = segment.length;\n\n if (i < 6) {\n //in case there's odd SVG like a M0,0 command at the very end.\n path.pop();\n i = 0;\n } else if (segment[0] === segment[i - 2] && segment[1] === segment[i - 1]) {\n segment.closed = true;\n }\n\n path.totalPoints = points + i;\n return path;\n} //populates the points array in alternating x/y values (like [x, y, x, y...] instead of individual point objects [{x, y}, {x, y}...] to conserve memory and stay in line with how we're handling segment arrays\n\nexport function bezierToPoints(x1, y1, x2, y2, x3, y3, x4, y4, threshold, points, index) {\n var x12 = (x1 + x2) / 2,\n y12 = (y1 + y2) / 2,\n x23 = (x2 + x3) / 2,\n y23 = (y2 + y3) / 2,\n x34 = (x3 + x4) / 2,\n y34 = (y3 + y4) / 2,\n x123 = (x12 + x23) / 2,\n y123 = (y12 + y23) / 2,\n x234 = (x23 + x34) / 2,\n y234 = (y23 + y34) / 2,\n x1234 = (x123 + x234) / 2,\n y1234 = (y123 + y234) / 2,\n dx = x4 - x1,\n dy = y4 - y1,\n d2 = _abs((x2 - x4) * dy - (y2 - y4) * dx),\n d3 = _abs((x3 - x4) * dy - (y3 - y4) * dx),\n length;\n\n if (!points) {\n points = [x1, y1, x4, y4];\n index = 2;\n }\n\n points.splice(index || points.length - 2, 0, x1234, y1234);\n\n if ((d2 + d3) * (d2 + d3) > threshold * (dx * dx + dy * dy)) {\n length = points.length;\n bezierToPoints(x1, y1, x12, y12, x123, y123, x1234, y1234, threshold, points, index);\n bezierToPoints(x1234, y1234, x234, y234, x34, y34, x4, y4, threshold, points, index + 2 + (points.length - length));\n }\n\n return points;\n}\n/*\nfunction getAngleBetweenPoints(x0, y0, x1, y1, x2, y2) { //angle between 3 points in radians\n\tvar dx1 = x1 - x0,\n\t\tdy1 = y1 - y0,\n\t\tdx2 = x2 - x1,\n\t\tdy2 = y2 - y1,\n\t\tdx3 = x2 - x0,\n\t\tdy3 = y2 - y0,\n\t\ta = dx1 * dx1 + dy1 * dy1,\n\t\tb = dx2 * dx2 + dy2 * dy2,\n\t\tc = dx3 * dx3 + dy3 * dy3;\n\treturn Math.acos( (a + b - c) / _sqrt(4 * a * b) );\n},\n*/\n//pointsToSegment() doesn't handle flat coordinates (where y is always 0) the way we need (the resulting control points are always right on top of the anchors), so this function basically makes the control points go directly up and down, varying in length based on the curviness (more curvy, further control points)\n\nexport function flatPointsToSegment(points, curviness) {\n if (curviness === void 0) {\n curviness = 1;\n }\n\n var x = points[0],\n y = 0,\n segment = [x, y],\n i = 2;\n\n for (; i < points.length; i += 2) {\n segment.push(x, y, points[i], y = (points[i] - x) * curviness / 2, x = points[i], -y);\n }\n\n return segment;\n} //points is an array of x/y points, like [x, y, x, y, x, y]\n\nexport function pointsToSegment(points, curviness, cornerThreshold) {\n //points = simplifyPoints(points, tolerance);\n _abs(points[0] - points[2]) < 1e-4 && _abs(points[1] - points[3]) < 1e-4 && (points = points.slice(2)); // if the first two points are super close, dump the first one.\n\n var l = points.length - 2,\n x = +points[0],\n y = +points[1],\n nextX = +points[2],\n nextY = +points[3],\n segment = [x, y, x, y],\n dx2 = nextX - x,\n dy2 = nextY - y,\n closed = Math.abs(points[l] - x) < 0.001 && Math.abs(points[l + 1] - y) < 0.001,\n prevX,\n prevY,\n angle,\n slope,\n i,\n dx1,\n dx3,\n dy1,\n dy3,\n d1,\n d2,\n a,\n b,\n c;\n\n if (isNaN(cornerThreshold)) {\n cornerThreshold = Math.PI / 10;\n }\n\n if (closed) {\n // if the start and end points are basically on top of each other, close the segment by adding the 2nd point to the end, and the 2nd-to-last point to the beginning (we'll remove them at the end, but this allows the curvature to look perfect)\n points.push(nextX, nextY);\n nextX = x;\n nextY = y;\n x = points[l - 2];\n y = points[l - 1];\n points.unshift(x, y);\n l += 4;\n }\n\n curviness = curviness || curviness === 0 ? +curviness : 1;\n\n for (i = 2; i < l; i += 2) {\n prevX = x;\n prevY = y;\n x = nextX;\n y = nextY;\n nextX = +points[i + 2];\n nextY = +points[i + 3];\n\n if (x === nextX && y === nextY) {\n continue;\n }\n\n dx1 = dx2;\n dy1 = dy2;\n dx2 = nextX - x;\n dy2 = nextY - y;\n dx3 = nextX - prevX;\n dy3 = nextY - prevY;\n a = dx1 * dx1 + dy1 * dy1;\n b = dx2 * dx2 + dy2 * dy2;\n c = dx3 * dx3 + dy3 * dy3;\n angle = Math.acos((a + b - c) / _sqrt(4 * a * b)); //angle between the 3 points\n\n d2 = angle / Math.PI * curviness; //temporary precalculation for speed (reusing d2 variable)\n\n d1 = _sqrt(a) * d2; //the tighter the angle, the shorter we make the handles in proportion.\n\n d2 *= _sqrt(b);\n\n if (x !== prevX || y !== prevY) {\n if (angle > cornerThreshold) {\n slope = _atan2(dy3, dx3);\n segment.push(_round(x - _cos(slope) * d1), //first control point\n _round(y - _sin(slope) * d1), _round(x), //anchor\n _round(y), _round(x + _cos(slope) * d2), //second control point\n _round(y + _sin(slope) * d2));\n } else {\n slope = _atan2(dy1, dx1);\n segment.push(_round(x - _cos(slope) * d1), //first control point\n _round(y - _sin(slope) * d1));\n slope = _atan2(dy2, dx2);\n segment.push(_round(x), //anchor\n _round(y), _round(x + _cos(slope) * d2), //second control point\n _round(y + _sin(slope) * d2));\n }\n }\n }\n\n x !== nextX || y !== nextY || segment.length < 4 ? segment.push(_round(nextX), _round(nextY), _round(nextX), _round(nextY)) : segment.length -= 2;\n\n if (closed) {\n segment.splice(0, 6);\n segment.length = segment.length - 6;\n }\n\n return segment;\n} //returns the squared distance between an x/y coordinate and a segment between x1/y1 and x2/y2\n\nfunction pointToSegDist(x, y, x1, y1, x2, y2) {\n var dx = x2 - x1,\n dy = y2 - y1,\n t;\n\n if (dx || dy) {\n t = ((x - x1) * dx + (y - y1) * dy) / (dx * dx + dy * dy);\n\n if (t > 1) {\n x1 = x2;\n y1 = y2;\n } else if (t > 0) {\n x1 += dx * t;\n y1 += dy * t;\n }\n }\n\n return Math.pow(x - x1, 2) + Math.pow(y - y1, 2);\n}\n\nfunction simplifyStep(points, first, last, tolerance, simplified) {\n var maxSqDist = tolerance,\n firstX = points[first],\n firstY = points[first + 1],\n lastX = points[last],\n lastY = points[last + 1],\n index,\n i,\n d;\n\n for (i = first + 2; i < last; i += 2) {\n d = pointToSegDist(points[i], points[i + 1], firstX, firstY, lastX, lastY);\n\n if (d > maxSqDist) {\n index = i;\n maxSqDist = d;\n }\n }\n\n if (maxSqDist > tolerance) {\n index - first > 2 && simplifyStep(points, first, index, tolerance, simplified);\n simplified.push(points[index], points[index + 1]);\n last - index > 2 && simplifyStep(points, index, last, tolerance, simplified);\n }\n} //points is an array of x/y values like [x, y, x, y, x, y]\n\n\nexport function simplifyPoints(points, tolerance) {\n var prevX = parseFloat(points[0]),\n prevY = parseFloat(points[1]),\n temp = [prevX, prevY],\n l = points.length - 2,\n i,\n x,\n y,\n dx,\n dy,\n result,\n last;\n tolerance = Math.pow(tolerance || 1, 2);\n\n for (i = 2; i < l; i += 2) {\n x = parseFloat(points[i]);\n y = parseFloat(points[i + 1]);\n dx = prevX - x;\n dy = prevY - y;\n\n if (dx * dx + dy * dy > tolerance) {\n temp.push(x, y);\n prevX = x;\n prevY = y;\n }\n }\n\n temp.push(parseFloat(points[l]), parseFloat(points[l + 1]));\n last = temp.length - 2;\n result = [temp[0], temp[1]];\n simplifyStep(temp, 0, last, tolerance, result);\n result.push(temp[last], temp[last + 1]);\n return result;\n}\n\nfunction getClosestProgressOnBezier(iterations, px, py, start, end, slices, x0, y0, x1, y1, x2, y2, x3, y3) {\n var inc = (end - start) / slices,\n best = 0,\n t = start,\n x,\n y,\n d,\n dx,\n dy,\n inv;\n _bestDistance = _largeNum;\n\n while (t <= end) {\n inv = 1 - t;\n x = inv * inv * inv * x0 + 3 * inv * inv * t * x1 + 3 * inv * t * t * x2 + t * t * t * x3;\n y = inv * inv * inv * y0 + 3 * inv * inv * t * y1 + 3 * inv * t * t * y2 + t * t * t * y3;\n dx = x - px;\n dy = y - py;\n d = dx * dx + dy * dy;\n\n if (d < _bestDistance) {\n _bestDistance = d;\n best = t;\n }\n\n t += inc;\n }\n\n return iterations > 1 ? getClosestProgressOnBezier(iterations - 1, px, py, Math.max(best - inc, 0), Math.min(best + inc, 1), slices, x0, y0, x1, y1, x2, y2, x3, y3) : best;\n}\n\nexport function getClosestData(rawPath, x, y, slices) {\n //returns an object with the closest j, i, and t (j is the segment index, i is the index of the point in that segment, and t is the time/progress along that bezier)\n var closest = {\n j: 0,\n i: 0,\n t: 0\n },\n bestDistance = _largeNum,\n i,\n j,\n t,\n segment;\n\n for (j = 0; j < rawPath.length; j++) {\n segment = rawPath[j];\n\n for (i = 0; i < segment.length; i += 6) {\n t = getClosestProgressOnBezier(1, x, y, 0, 1, slices || 20, segment[i], segment[i + 1], segment[i + 2], segment[i + 3], segment[i + 4], segment[i + 5], segment[i + 6], segment[i + 7]);\n\n if (bestDistance > _bestDistance) {\n bestDistance = _bestDistance;\n closest.j = j;\n closest.i = i;\n closest.t = t;\n }\n }\n }\n\n return closest;\n} //subdivide a Segment closest to a specific x,y coordinate\n\nexport function subdivideSegmentNear(x, y, segment, slices, iterations) {\n var l = segment.length,\n bestDistance = _largeNum,\n bestT = 0,\n bestSegmentIndex = 0,\n t,\n i;\n slices = slices || 20;\n iterations = iterations || 3;\n\n for (i = 0; i < l; i += 6) {\n t = getClosestProgressOnBezier(1, x, y, 0, 1, slices, segment[i], segment[i + 1], segment[i + 2], segment[i + 3], segment[i + 4], segment[i + 5], segment[i + 6], segment[i + 7]);\n\n if (bestDistance > _bestDistance) {\n bestDistance = _bestDistance;\n bestT = t;\n bestSegmentIndex = i;\n }\n }\n\n t = getClosestProgressOnBezier(iterations, x, y, bestT - 0.05, bestT + 0.05, slices, segment[bestSegmentIndex], segment[bestSegmentIndex + 1], segment[bestSegmentIndex + 2], segment[bestSegmentIndex + 3], segment[bestSegmentIndex + 4], segment[bestSegmentIndex + 5], segment[bestSegmentIndex + 6], segment[bestSegmentIndex + 7]);\n subdivideSegment(segment, bestSegmentIndex, t);\n return bestSegmentIndex + 6;\n}\n/*\nTakes any of the following and converts it to an all Cubic Bezier SVG data string:\n- A data string like \"M0,0 L2,4 v20,15 H100\"\n- A RawPath, like [[x, y, x, y, x, y, x, y][[x, y, x, y, x, y, x, y]]\n- A Segment, like [x, y, x, y, x, y, x, y]\n\nNote: all numbers are rounded down to the closest 0.001 to minimize memory, maximize speed, and avoid odd numbers like 1e-13\n*/\n\nexport function rawPathToString(rawPath) {\n if (_isNumber(rawPath[0])) {\n //in case a segment is passed in instead\n rawPath = [rawPath];\n }\n\n var result = \"\",\n l = rawPath.length,\n sl,\n s,\n i,\n segment;\n\n for (s = 0; s < l; s++) {\n segment = rawPath[s];\n result += \"M\" + _round(segment[0]) + \",\" + _round(segment[1]) + \" C\";\n sl = segment.length;\n\n for (i = 2; i < sl; i++) {\n result += _round(segment[i++]) + \",\" + _round(segment[i++]) + \" \" + _round(segment[i++]) + \",\" + _round(segment[i++]) + \" \" + _round(segment[i++]) + \",\" + _round(segment[i]) + \" \";\n }\n\n if (segment.closed) {\n result += \"z\";\n }\n }\n\n return result;\n}\n/*\n// takes a segment with coordinates [x, y, x, y, ...] and converts the control points into angles and lengths [x, y, angle, length, angle, length, x, y, angle, length, ...] so that it animates more cleanly and avoids odd breaks/kinks. For example, if you animate from 1 o'clock to 6 o'clock, it'd just go directly/linearly rather than around. So the length would be very short in the middle of the tween.\nexport function cpCoordsToAngles(segment, copy) {\n\tvar result = copy ? segment.slice(0) : segment,\n\t\tx, y, i;\n\tfor (i = 0; i < segment.length; i+=6) {\n\t\tx = segment[i+2] - segment[i];\n\t\ty = segment[i+3] - segment[i+1];\n\t\tresult[i+2] = Math.atan2(y, x);\n\t\tresult[i+3] = Math.sqrt(x * x + y * y);\n\t\tx = segment[i+6] - segment[i+4];\n\t\ty = segment[i+7] - segment[i+5];\n\t\tresult[i+4] = Math.atan2(y, x);\n\t\tresult[i+5] = Math.sqrt(x * x + y * y);\n\t}\n\treturn result;\n}\n\n// takes a segment that was converted with cpCoordsToAngles() to have angles and lengths instead of coordinates for the control points, and converts it BACK into coordinates.\nexport function cpAnglesToCoords(segment, copy) {\n\tvar result = copy ? segment.slice(0) : segment,\n\t\tlength = segment.length,\n\t\trnd = 1000,\n\t\tangle, l, i, j;\n\tfor (i = 0; i < length; i+=6) {\n\t\tangle = segment[i+2];\n\t\tl = segment[i+3]; //length\n\t\tresult[i+2] = (((segment[i] + Math.cos(angle) * l) * rnd) | 0) / rnd;\n\t\tresult[i+3] = (((segment[i+1] + Math.sin(angle) * l) * rnd) | 0) / rnd;\n\t\tangle = segment[i+4];\n\t\tl = segment[i+5]; //length\n\t\tresult[i+4] = (((segment[i+6] - Math.cos(angle) * l) * rnd) | 0) / rnd;\n\t\tresult[i+5] = (((segment[i+7] - Math.sin(angle) * l) * rnd) | 0) / rnd;\n\t}\n\treturn result;\n}\n\n//adds an \"isSmooth\" array to each segment and populates it with a boolean value indicating whether or not it's smooth (the control points have basically the same slope). For any smooth control points, it converts the coordinates into angle (x, in radians) and length (y) and puts them into the same index value in a smoothData array.\nexport function populateSmoothData(rawPath) {\n\tlet j = rawPath.length,\n\t\tsmooth, segment, x, y, x2, y2, i, l, a, a2, isSmooth, smoothData;\n\twhile (--j > -1) {\n\t\tsegment = rawPath[j];\n\t\tisSmooth = segment.isSmooth = segment.isSmooth || [0, 0, 0, 0];\n\t\tsmoothData = segment.smoothData = segment.smoothData || [0, 0, 0, 0];\n\t\tisSmooth.length = 4;\n\t\tl = segment.length - 2;\n\t\tfor (i = 6; i < l; i += 6) {\n\t\t\tx = segment[i] - segment[i - 2];\n\t\t\ty = segment[i + 1] - segment[i - 1];\n\t\t\tx2 = segment[i + 2] - segment[i];\n\t\t\ty2 = segment[i + 3] - segment[i + 1];\n\t\t\ta = _atan2(y, x);\n\t\t\ta2 = _atan2(y2, x2);\n\t\t\tsmooth = (Math.abs(a - a2) < 0.09);\n\t\t\tif (smooth) {\n\t\t\t\tsmoothData[i - 2] = a;\n\t\t\t\tsmoothData[i + 2] = a2;\n\t\t\t\tsmoothData[i - 1] = _sqrt(x * x + y * y);\n\t\t\t\tsmoothData[i + 3] = _sqrt(x2 * x2 + y2 * y2);\n\t\t\t}\n\t\t\tisSmooth.push(smooth, smooth, 0, 0, smooth, smooth);\n\t\t}\n\t\t//if the first and last points are identical, check to see if there's a smooth transition. We must handle this a bit differently due to their positions in the array.\n\t\tif (segment[l] === segment[0] && segment[l+1] === segment[1]) {\n\t\t\tx = segment[0] - segment[l-2];\n\t\t\ty = segment[1] - segment[l-1];\n\t\t\tx2 = segment[2] - segment[0];\n\t\t\ty2 = segment[3] - segment[1];\n\t\t\ta = _atan2(y, x);\n\t\t\ta2 = _atan2(y2, x2);\n\t\t\tif (Math.abs(a - a2) < 0.09) {\n\t\t\t\tsmoothData[l-2] = a;\n\t\t\t\tsmoothData[2] = a2;\n\t\t\t\tsmoothData[l-1] = _sqrt(x * x + y * y);\n\t\t\t\tsmoothData[3] = _sqrt(x2 * x2 + y2 * y2);\n\t\t\t\tisSmooth[l-2] = isSmooth[l-1] = true; //don't change indexes 2 and 3 because we'll trigger everything from the END, and this will optimize file size a bit.\n\t\t\t}\n\t\t}\n\t}\n\treturn rawPath;\n}\nexport function pointToScreen(svgElement, point) {\n\tif (arguments.length < 2) { //by default, take the first set of coordinates in the path as the point\n\t\tlet rawPath = getRawPath(svgElement);\n\t\tpoint = svgElement.ownerSVGElement.createSVGPoint();\n\t\tpoint.x = rawPath[0][0];\n\t\tpoint.y = rawPath[0][1];\n\t}\n\treturn point.matrixTransform(svgElement.getScreenCTM());\n}\n\n*/","/*!\n * CustomEase 3.6.1\n * https://greensock.com\n *\n * @license Copyright 2008-2021, GreenSock. All rights reserved.\n * Subject to the terms at https://greensock.com/standard-license or for\n * Club GreenSock members, the agreement issued with that membership.\n * @author: Jack Doyle, jack@greensock.com\n*/\n\n/* eslint-disable */\nimport { stringToRawPath, rawPathToString, transformRawPath } from \"./utils/paths.js\";\n\nvar gsap,\n _coreInitted,\n _getGSAP = function _getGSAP() {\n return gsap || typeof window !== \"undefined\" && (gsap = window.gsap) && gsap.registerPlugin && gsap;\n},\n _initCore = function _initCore() {\n gsap = _getGSAP();\n\n if (gsap) {\n gsap.registerEase(\"_CE\", CustomEase.create);\n _coreInitted = 1;\n } else {\n console.warn(\"Please gsap.registerPlugin(CustomEase)\");\n }\n},\n _bigNum = 1e20,\n _round = function _round(value) {\n return ~~(value * 1000 + (value < 0 ? -.5 : .5)) / 1000;\n},\n _bonusValidated = 1,\n //CustomEase\n_numExp = /[-+=\\.]*\\d+[\\.e\\-\\+]*\\d*[e\\-\\+]*\\d*/gi,\n //finds any numbers, including ones that start with += or -=, negative numbers, and ones in scientific notation like 1e-8.\n_needsParsingExp = /[cLlsSaAhHvVtTqQ]/g,\n _findMinimum = function _findMinimum(values) {\n var l = values.length,\n min = _bigNum,\n i;\n\n for (i = 1; i < l; i += 6) {\n +values[i] < min && (min = +values[i]);\n }\n\n return min;\n},\n //takes all the points and translates/scales them so that the x starts at 0 and ends at 1.\n_normalize = function _normalize(values, height, originY) {\n if (!originY && originY !== 0) {\n originY = Math.max(+values[values.length - 1], +values[1]);\n }\n\n var tx = +values[0] * -1,\n ty = -originY,\n l = values.length,\n sx = 1 / (+values[l - 2] + tx),\n sy = -height || (Math.abs(+values[l - 1] - +values[1]) < 0.01 * (+values[l - 2] - +values[0]) ? _findMinimum(values) + ty : +values[l - 1] + ty),\n i;\n\n if (sy) {\n //typically y ends at 1 (so that the end values are reached)\n sy = 1 / sy;\n } else {\n //in case the ease returns to its beginning value, scale everything proportionally\n sy = -sx;\n }\n\n for (i = 0; i < l; i += 2) {\n values[i] = (+values[i] + tx) * sx;\n values[i + 1] = (+values[i + 1] + ty) * sy;\n }\n},\n //note that this function returns point objects like {x, y} rather than working with segments which are arrays with alternating x, y values as in the similar function in paths.js\n_bezierToPoints = function _bezierToPoints(x1, y1, x2, y2, x3, y3, x4, y4, threshold, points, index) {\n var x12 = (x1 + x2) / 2,\n y12 = (y1 + y2) / 2,\n x23 = (x2 + x3) / 2,\n y23 = (y2 + y3) / 2,\n x34 = (x3 + x4) / 2,\n y34 = (y3 + y4) / 2,\n x123 = (x12 + x23) / 2,\n y123 = (y12 + y23) / 2,\n x234 = (x23 + x34) / 2,\n y234 = (y23 + y34) / 2,\n x1234 = (x123 + x234) / 2,\n y1234 = (y123 + y234) / 2,\n dx = x4 - x1,\n dy = y4 - y1,\n d2 = Math.abs((x2 - x4) * dy - (y2 - y4) * dx),\n d3 = Math.abs((x3 - x4) * dy - (y3 - y4) * dx),\n length;\n\n if (!points) {\n points = [{\n x: x1,\n y: y1\n }, {\n x: x4,\n y: y4\n }];\n index = 1;\n }\n\n points.splice(index || points.length - 1, 0, {\n x: x1234,\n y: y1234\n });\n\n if ((d2 + d3) * (d2 + d3) > threshold * (dx * dx + dy * dy)) {\n length = points.length;\n\n _bezierToPoints(x1, y1, x12, y12, x123, y123, x1234, y1234, threshold, points, index);\n\n _bezierToPoints(x1234, y1234, x234, y234, x34, y34, x4, y4, threshold, points, index + 1 + (points.length - length));\n }\n\n return points;\n};\n\nexport var CustomEase = /*#__PURE__*/function () {\n function CustomEase(id, data, config) {\n _coreInitted || _initCore();\n this.id = id;\n _bonusValidated && this.setData(data, config);\n }\n\n var _proto = CustomEase.prototype;\n\n _proto.setData = function setData(data, config) {\n config = config || {};\n data = data || \"0,0,1,1\";\n var values = data.match(_numExp),\n closest = 1,\n points = [],\n lookup = [],\n precision = config.precision || 1,\n fast = precision <= 1,\n l,\n a1,\n a2,\n i,\n inc,\n j,\n point,\n prevPoint,\n p;\n this.data = data;\n\n if (_needsParsingExp.test(data) || ~data.indexOf(\"M\") && data.indexOf(\"C\") < 0) {\n values = stringToRawPath(data)[0];\n }\n\n l = values.length;\n\n if (l === 4) {\n values.unshift(0, 0);\n values.push(1, 1);\n l = 8;\n } else if ((l - 2) % 6) {\n throw \"Invalid CustomEase\";\n }\n\n if (+values[0] !== 0 || +values[l - 2] !== 1) {\n _normalize(values, config.height, config.originY);\n }\n\n this.segment = values;\n\n for (i = 2; i < l; i += 6) {\n a1 = {\n x: +values[i - 2],\n y: +values[i - 1]\n };\n a2 = {\n x: +values[i + 4],\n y: +values[i + 5]\n };\n points.push(a1, a2);\n\n _bezierToPoints(a1.x, a1.y, +values[i], +values[i + 1], +values[i + 2], +values[i + 3], a2.x, a2.y, 1 / (precision * 200000), points, points.length - 1);\n }\n\n l = points.length;\n\n for (i = 0; i < l; i++) {\n point = points[i];\n prevPoint = points[i - 1] || point;\n\n if ((point.x > prevPoint.x || prevPoint.y !== point.y && prevPoint.x === point.x || point === prevPoint) && point.x <= 1) {\n //if a point goes BACKWARD in time or is a duplicate, just drop it. Also it shouldn't go past 1 on the x axis, as could happen in a string like \"M0,0 C0,0 0.12,0.68 0.18,0.788 0.195,0.845 0.308,1 0.32,1 0.403,1.005 0.398,1 0.5,1 0.602,1 0.816,1.005 0.9,1 0.91,1 0.948,0.69 0.962,0.615 1.003,0.376 1,0 1,0\".\n prevPoint.cx = point.x - prevPoint.x; //change in x between this point and the next point (performance optimization)\n\n prevPoint.cy = point.y - prevPoint.y;\n prevPoint.n = point;\n prevPoint.nx = point.x; //next point's x value (performance optimization, making lookups faster in getRatio()). Remember, the lookup will always land on a spot where it's either this point or the very next one (never beyond that)\n\n if (fast && i > 1 && Math.abs(prevPoint.cy / prevPoint.cx - points[i - 2].cy / points[i - 2].cx) > 2) {\n //if there's a sudden change in direction, prioritize accuracy over speed. Like a bounce ease - you don't want to risk the sampling chunks landing on each side of the bounce anchor and having it clipped off.\n fast = 0;\n }\n\n if (prevPoint.cx < closest) {\n if (!prevPoint.cx) {\n prevPoint.cx = 0.001; //avoids math problems in getRatio() (dividing by zero)\n\n if (i === l - 1) {\n //in case the final segment goes vertical RIGHT at the end, make sure we end at the end.\n prevPoint.x -= 0.001;\n closest = Math.min(closest, 0.001);\n fast = 0;\n }\n } else {\n closest = prevPoint.cx;\n }\n }\n } else {\n points.splice(i--, 1);\n l--;\n }\n }\n\n l = 1 / closest + 1 | 0;\n inc = 1 / l;\n j = 0;\n point = points[0];\n\n if (fast) {\n for (i = 0; i < l; i++) {\n //for fastest lookups, we just sample along the path at equal x (time) distance. Uses more memory and is slightly less accurate for anchors that don't land on the sampling points, but for the vast majority of eases it's excellent (and fast).\n p = i * inc;\n\n if (point.nx < p) {\n point = points[++j];\n }\n\n a1 = point.y + (p - point.x) / point.cx * point.cy;\n lookup[i] = {\n x: p,\n cx: inc,\n y: a1,\n cy: 0,\n nx: 9\n };\n\n if (i) {\n lookup[i - 1].cy = a1 - lookup[i - 1].y;\n }\n }\n\n lookup[l - 1].cy = points[points.length - 1].y - a1;\n } else {\n //this option is more accurate, ensuring that EVERY anchor is hit perfectly. Clipping across a bounce, for example, would never happen.\n for (i = 0; i < l; i++) {\n //build a lookup table based on the smallest distance so that we can instantly find the appropriate point (well, it'll either be that point or the very next one). We'll look up based on the linear progress. So it's it's 0.5 and the lookup table has 100 elements, it'd be like lookup[Math.floor(0.5 * 100)]\n if (point.nx < i * inc) {\n point = points[++j];\n }\n\n lookup[i] = point;\n }\n\n if (j < points.length - 1) {\n lookup[i - 1] = points[points.length - 2];\n }\n } //this._calcEnd = (points[points.length-1].y !== 1 || points[0].y !== 0); //ensures that we don't run into floating point errors. As long as we're starting at 0 and ending at 1, tell GSAP to skip the final calculation and use 0/1 as the factor.\n\n\n this.ease = function (p) {\n var point = lookup[p * l | 0] || lookup[l - 1];\n\n if (point.nx < p) {\n point = point.n;\n }\n\n return point.y + (p - point.x) / point.cx * point.cy;\n };\n\n this.ease.custom = this;\n this.id && gsap.registerEase(this.id, this.ease);\n return this;\n };\n\n _proto.getSVGData = function getSVGData(config) {\n return CustomEase.getSVGData(this, config);\n };\n\n CustomEase.create = function create(id, data, config) {\n return new CustomEase(id, data, config).ease;\n };\n\n CustomEase.register = function register(core) {\n gsap = core;\n\n _initCore();\n };\n\n CustomEase.get = function get(id) {\n return gsap.parseEase(id);\n };\n\n CustomEase.getSVGData = function getSVGData(ease, config) {\n config = config || {};\n var width = config.width || 100,\n height = config.height || 100,\n x = config.x || 0,\n y = (config.y || 0) + height,\n e = gsap.utils.toArray(config.path)[0],\n a,\n slope,\n i,\n inc,\n tx,\n ty,\n precision,\n threshold,\n prevX,\n prevY;\n\n if (config.invert) {\n height = -height;\n y = 0;\n }\n\n if (typeof ease === \"string\") {\n ease = gsap.parseEase(ease);\n }\n\n if (ease.custom) {\n ease = ease.custom;\n }\n\n if (ease instanceof CustomEase) {\n a = rawPathToString(transformRawPath([ease.segment], width, 0, 0, -height, x, y));\n } else {\n a = [x, y];\n precision = Math.max(5, (config.precision || 1) * 200);\n inc = 1 / precision;\n precision += 2;\n threshold = 5 / precision;\n prevX = _round(x + inc * width);\n prevY = _round(y + ease(inc) * -height);\n slope = (prevY - y) / (prevX - x);\n\n for (i = 2; i < precision; i++) {\n tx = _round(x + i * inc * width);\n ty = _round(y + ease(i * inc) * -height);\n\n if (Math.abs((ty - prevY) / (tx - prevX) - slope) > threshold || i === precision - 1) {\n //only add points when the slope changes beyond the threshold\n a.push(prevX, prevY);\n slope = (ty - prevY) / (tx - prevX);\n }\n\n prevX = tx;\n prevY = ty;\n }\n\n a = \"M\" + a.join(\",\");\n }\n\n e && e.setAttribute(\"d\", a);\n return a;\n };\n\n return CustomEase;\n}();\n_getGSAP() && gsap.registerPlugin(CustomEase);\nCustomEase.version = \"3.6.1\";\nexport { CustomEase as default };","/*!\n * CustomWiggle 3.6.1\n * https://greensock.com\n *\n * @license Copyright 2008-2021, GreenSock. All rights reserved.\n * Subject to the terms at https://greensock.com/standard-license or for\n * Club GreenSock members, the agreement issued with that membership.\n * @author: Jack Doyle, jack@greensock.com\n*/\n\n/* eslint-disable */\nvar gsap,\n _coreInitted,\n createCustomEase,\n _getGSAP = function _getGSAP() {\n return gsap || typeof window !== \"undefined\" && (gsap = window.gsap) && gsap.registerPlugin && gsap;\n},\n _eases = {\n easeOut: \"M0,1,C0.7,1,0.6,0,1,0\",\n easeInOut: \"M0,0,C0.1,0,0.24,1,0.444,1,0.644,1,0.6,0,1,0\",\n anticipate: \"M0,0,C0,0.222,0.024,0.386,0,0.4,0.18,0.455,0.65,0.646,0.7,0.67,0.9,0.76,1,0.846,1,1\",\n uniform: \"M0,0,C0,0.95,0,1,0,1,0,1,1,1,1,1,1,1,1,0,1,0\"\n},\n _linearEase = function _linearEase(p) {\n return p;\n},\n _initCore = function _initCore(required) {\n if (!_coreInitted) {\n gsap = _getGSAP();\n createCustomEase = gsap && gsap.parseEase(\"_CE\");\n\n if (createCustomEase) {\n for (var p in _eases) {\n _eases[p] = createCustomEase(\"\", _eases[p]);\n }\n\n _coreInitted = 1;\n\n _create(\"wiggle\").config = function (vars) {\n return typeof vars === \"object\" ? _create(\"\", vars) : _create(\"wiggle(\" + vars + \")\", {\n wiggles: +vars\n });\n };\n } else {\n required && console.warn(\"Please gsap.registerPlugin(CustomEase, CustomWiggle)\");\n }\n }\n},\n _parseEase = function _parseEase(ease, invertNonCustomEases) {\n if (typeof ease !== \"function\") {\n ease = gsap.parseEase(ease) || createCustomEase(\"\", ease);\n }\n\n return ease.custom || !invertNonCustomEases ? ease : function (p) {\n return 1 - ease(p);\n };\n},\n _bonusValidated = 1,\n //CustomWiggle\n_create = function _create(id, vars) {\n if (!_coreInitted) {\n _initCore(1);\n }\n\n vars = vars || {};\n var wiggles = (vars.wiggles || 10) | 0,\n inc = 1 / wiggles,\n x = inc / 2,\n anticipate = vars.type === \"anticipate\",\n yEase = _eases[vars.type] || _eases.easeOut,\n xEase = _linearEase,\n rnd = 1000,\n nextX,\n nextY,\n angle,\n handleX,\n handleY,\n easedX,\n y,\n path,\n i;\n\n if (_bonusValidated) {\n if (anticipate) {\n //the anticipate ease is actually applied on the x-axis (timing) and uses easeOut for amplitude.\n xEase = yEase;\n yEase = _eases.easeOut;\n }\n\n if (vars.timingEase) {\n xEase = _parseEase(vars.timingEase);\n }\n\n if (vars.amplitudeEase) {\n yEase = _parseEase(vars.amplitudeEase, true);\n }\n\n easedX = xEase(x);\n y = anticipate ? -yEase(x) : yEase(x);\n path = [0, 0, easedX / 4, 0, easedX / 2, y, easedX, y];\n\n if (vars.type === \"random\") {\n //if we just select random values on the y-axis and plug them into the \"normal\" algorithm, since the control points are always straight horizontal, it creates a bit of a slowdown at each anchor which just didn't seem as desirable, so we switched to an algorithm that bends the control points to be more in line with their context.\n path.length = 4;\n nextX = xEase(inc);\n nextY = Math.random() * 2 - 1;\n\n for (i = 2; i < wiggles; i++) {\n x = nextX;\n y = nextY;\n nextX = xEase(inc * i);\n nextY = Math.random() * 2 - 1;\n angle = Math.atan2(nextY - path[path.length - 3], nextX - path[path.length - 4]);\n handleX = Math.cos(angle) * inc;\n handleY = Math.sin(angle) * inc;\n path.push(x - handleX, y - handleY, x, y, x + handleX, y + handleY);\n }\n\n path.push(nextX, 0, 1, 0);\n } else {\n for (i = 1; i < wiggles; i++) {\n path.push(xEase(x + inc / 2), y);\n x += inc;\n y = (y > 0 ? -1 : 1) * yEase(i * inc);\n easedX = xEase(x);\n path.push(xEase(x - inc / 2), y, easedX, y);\n }\n\n path.push(xEase(x + inc / 4), y, xEase(x + inc / 4), 0, 1, 0);\n }\n\n i = path.length;\n\n while (--i > -1) {\n path[i] = ~~(path[i] * rnd) / rnd; //round values to avoid odd strings for super tiny values\n }\n\n path[2] = \"C\" + path[2];\n return createCustomEase(id, \"M\" + path.join(\",\"));\n }\n};\n\nexport var CustomWiggle = /*#__PURE__*/function () {\n function CustomWiggle(id, vars) {\n this.ease = _create(id, vars);\n }\n\n CustomWiggle.create = function create(id, vars) {\n return _create(id, vars);\n };\n\n CustomWiggle.register = function register(core) {\n gsap = core;\n\n _initCore();\n };\n\n return CustomWiggle;\n}();\n_getGSAP() && gsap.registerPlugin(CustomWiggle);\nCustomWiggle.version = \"3.6.1\";\nexport { CustomWiggle as default };"],"sourceRoot":""}