From 30ca488d4aa3b8748d81a6b4844ce0e8392dcaf0 Mon Sep 17 00:00:00 2001 From: Pomax Date: Sat, 15 Apr 2017 13:32:44 -0700 Subject: [PATCH] print CSS --- article.js | 6 +- components/Footer.jsx | 17 ++-- components/sections/preface/content.en-GB.md | 8 ++ en-GB/article.js | 6 +- en-GB/index.html | 9 +- index.html | 11 ++- ja-JP/article.js | 8 +- ja-JP/index.html | 2 +- package.json | 4 +- stylesheets/print.less | 88 +++++++------------- stylesheets/style.base.css | 84 +++++++++++++++++++ stylesheets/style.css | 2 +- stylesheets/style.less | 6 ++ tools/make-locales.js | 4 +- zh-CN/article.js | 4 +- zh-CN/index.html | 2 +- 16 files changed, 173 insertions(+), 88 deletions(-) diff --git a/article.js b/article.js index 713c39c9..b3d1b92e 100644 --- a/article.js +++ b/article.js @@ -1,4 +1,4 @@ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.BezierArticle=t():e.BezierArticle=t()}(this,function(){return function(e){function t(i){if(n[i])return n[i].exports;var r=n[i]={i:i,l:!1,exports:{}};return e[i].call(r.exports,r,r.exports,t),r.l=!0,r.exports}var n={};return t.m=e,t.c=n,t.i=function(e){return e},t.d=function(e,n,i){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:i})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=118)}([function(e,t,n){"use strict";var i=n(1),r=n(3),a=new r;e.exports=function(e,t){var n={getDefaultProps:function(){return{page:e,title:a.getTitle(e),handler:t}},render:function(){return a.getContent(e,this)}};return t&&Object.keys(t).forEach(function(e){n[e]=t[e]}),i.createClass(n)}},function(e,t,n){"use strict";(function(e){function i(){return null}function r(e){var t=e.nodeName,n=e.attributes;e.attributes={},t.defaultProps&&x(e.attributes,t.defaultProps),n&&x(e.attributes,n)}function a(e,t){var n,i,r;if(t){for(r in t)if(n=X.test(r))break;if(n){i=e.attributes={};for(r in t)t.hasOwnProperty(r)&&(i[X.test(r)?r.replace(/([A-Z0-9])/,"-$1").toLowerCase():r]=t[r])}}}function o(e,t,i){var r=t&&t._preactCompatRendered&&t._preactCompatRendered.base;r&&r.parentNode!==t&&(r=null),r||(r=t.children[0]);for(var a=t.childNodes.length;a--;)t.childNodes[a]!==r&&t.removeChild(t.childNodes[a]);var o=n.i(q.render)(e,t,r);return t&&(t._preactCompatRendered=o&&(o._component||{base:o})),"function"==typeof i&&i(),o&&o._component||o}function s(e,t,i,r){var a=n.i(q.h)(Z,{context:e.context},t),s=o(a,i);return r&&r(s),s._component||s.base}function l(e){var t=e._preactCompatRendered&&e._preactCompatRendered.base;return!(!t||t.parentNode!==e)&&(n.i(q.render)(n.i(q.h)(i),e,t),!0)}function c(e){return m.bind(null,e)}function h(e,t){for(var n=t||0;n0;)i[r]=arguments[r+2];if(!v(e))return e;var a=e.attributes||e.props,o=n.i(q.h)(e.nodeName||e.type,a,e.children||a&&a.children),s=[o,t];return i&&i.length?s.push(i):t&&t.children&&s.push(t.children),p(q.cloneElement.apply(void 0,s))}function v(e){return e&&(e instanceof Q||e.$$typeof===V)}function w(e,t){return t._refProxies[e]||(t._refProxies[e]=function(n){t&&t.refs&&(t.refs[e]=n,null===n&&(delete t._refProxies[e],t=null))})}function y(e){var t=e.nodeName,n=e.attributes;if(n&&"string"==typeof t){var i={};for(var r in n)i[r.toLowerCase()]=r;if(i.ondoubleclick&&(n.ondblclick=n[i.ondoubleclick],delete n[i.ondoubleclick]),i.onchange&&("textarea"===t||"input"===t.toLowerCase()&&!/^fil|che|rad/i.test(n.type))){var a=i.oninput||"oninput";n[a]||(n[a]=B([n[a],n[i.onchange]]),delete n[i.onchange])}}}function b(e){var t=e.attributes;if(t){var n=t.className||t.class;n&&(t.className=n)}}function x(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function _(e,t){for(var n in e)if(!(n in t))return!0;for(var i in t)if(e[i]!==t[i])return!0;return!1}function E(e){return e&&e.base||e}function C(){}function k(e){function t(e,t){T(this),A.call(this,e,t,H),N.call(this,e,t)}return e=x({constructor:t},e),e.mixins&&z(e,S(e.mixins)),e.statics&&x(t,e.statics),e.propTypes&&(t.propTypes=e.propTypes),e.defaultProps&&(t.defaultProps=e.defaultProps),e.getDefaultProps&&(t.defaultProps=e.getDefaultProps()),C.prototype=A.prototype,t.prototype=x(new C,e),t.displayName=e.displayName||"Component",t}function S(e){for(var t={},n=0;n4){if(1!==arguments.length)throw new Error("Only new Bezier(point[]) is accepted for 4th and higher order curves");a=!0}}else if(6!==o&&8!==o&&9!==o&&12!==o&&1!==arguments.length)throw new Error("Only new Bezier(point[]) is accepted for 4th and higher order curves");var s=!a&&(9===o||12===o)||e&&e[0]&&void 0!==e[0].z;this._3d=s;for(var l=[],c=0,u=s?3:2;c1e-4)return void(e._linear=!1);e._linear=!0}(this),this._t1=0,this._t2=1,this.update()};d.fromSVG=function(e){var t=e.match(/[-+]?\d*\.?\d+(?:[eE][-+]?\d+)?/g).map(parseFloat);return/[cq]/.test(e)?(t=t.map(function(e,n){return n<2?e:e+t[n%2]}),new d(t)):new d(t)},d.quadraticFromPoints=function(e,n,i,r){if(void 0===r&&(r=.5),0===r)return new d(n,n,i);if(1===r)return new d(e,n,n);var a=t(2,e,n,i,r);return new d(e,a.A,i)},d.cubicFromPoints=function(e,n,i,r,a){void 0===r&&(r=.5);var o=t(3,e,n,i,r);void 0===a&&(a=h.dist(n,o.C));var s=a*(1-r)/r,l=h.dist(e,i),c=(i.x-e.x)/l,u=(i.y-e.y)/l,f=a*c,m=a*u,p=s*c,g=s*u,v={x:n.x-f,y:n.y-m},w={x:n.x+p,y:n.y+g},y=o.A,b={x:y.x+(v.x-y.x)/(1-r),y:y.y+(v.y-y.y)/(1-r)},x={x:y.x+(w.x-y.x)/r,y:y.y+(w.y-y.y)/r},_={x:e.x+(b.x-e.x)/r,y:e.y+(b.y-e.y)/r},E={x:i.x+(x.x-i.x)/(1-r),y:i.y+(x.y-i.y)/(1-r)};return new d(e,_,E,i)};var f=function(){return h};d.getUtils=f,d.prototype={getUtils:f,valueOf:function(){return this.toString()},toString:function(){return h.pointsToString(this.points)},toSVG:function(e){if(this._3d)return!1;for(var t=this.points,n=t[0].x,i=t[0].y,r=["M",n,i,2===this.order?"Q":"C"],a=1,o=t.length;a1;t--,n--){for(var i,r=[],a=0;a0},length:function(){return h.length(this.derivative.bind(this))},_lut:[],getLUT:function(e){if(e=e||100,this._lut.length===e)return this._lut;this._lut=[];for(var t=0;t<=e;t++)this._lut.push(this.compute(t/e));return this._lut},on:function(e,t){t=t||5;for(var n,i=this.getLUT(),r=[],a=0,o=0;o1;){for(var d=0;d1;){for(i=[],o=0,s=n.length-1;o=0&&e<=1}),r=r.concat(i[n].sort())}.bind(this)),r=r.sort().filter(function(e,t){return r.indexOf(e)===t}),i.values=r,i},bbox:function(){var e=this.extrema(),t={};return this.dims.forEach(function(n){t[n]=h.getminmax(this,n,e[n])}.bind(this)),t},overlaps:function(e){var t=this.bbox(),n=e.bbox();return h.bboxoverlap(t,n)},offset:function(e,t){if(void 0!==t){var n=this.get(e),i=this.normal(e),r={c:n,n:i,x:n.x+i.x*t,y:n.y+i.y*t};return this._3d&&(r.z=n.z+i.z*t),r}if(this._linear){var a=this.normal(0),o=this.points.map(function(t){var n={x:t.x+e*a.x,y:t.y+e*a.y};return t.z&&i.z&&(n.z=t.z+e*a.z),n});return[new d(o)]}return this.reduce().map(function(t){return t.scale(e)})},simple:function(){if(3===this.order){var e=h.angle(this.points[0],this.points[3],this.points[1]),t=h.angle(this.points[0],this.points[3],this.points[2]);if(e>0&&t<0||e<0&&t>0)return!1}var n=this.normal(0),r=this.normal(1),a=n.x*r.x+n.y*r.y;return this._3d&&(a+=n.z*r.z),i(o(a))1,s.endcap.virtual=a0&&(r=r.concat(t))}),r},arcs:function(e){e=e||.5;var t=[];return this._iterate(e,t)},_error:function(e,t,n,r){var a=(r-n)/4,o=this.get(n+a),s=this.get(r-a),l=h.dist(e,t),c=h.dist(e,o),u=h.dist(e,s);return i(c-l)+i(u-l)},_iterate:function(e,t){var n,i=0,r=1;do{n=0,r=1;var a,o,s,l,c,u=this.get(i),d=!1,f=!1,m=r,p=1,g=0;do{f=d,l=s,m=(i+r)/2,g++,a=this.get(m),o=this.get(r),s=h.getccenter(u,a,o),s.interval={start:i,end:r};if(d=this._error(s,u,i,r)<=e,c=f&&!d,c||(p=r),d){if(r>=1){s.interval.end=p=1,l=s;break}r+=(r-i)/2}else r=m}while(!c&&n++<100);if(n>=100)break;l=l||s,t.push(l),i=p}while(r<1);return t}},e.exports=d}()},function(e,t,n){!function(){"use strict";var t=Math.abs,i=Math.cos,r=Math.sin,a=Math.acos,o=Math.atan2,s=Math.sqrt,l=Math.pow,c=function(e){return e<0?-l(-e,1/3):l(e,1/3)},h=Math.PI,u=2*h,d=h/2,f=Number.MAX_SAFE_INTEGER,m=Number.MIN_SAFE_INTEGER,p={Tvalues:[-.06405689286260563,.06405689286260563,-.1911188674736163,.1911188674736163,-.3150426796961634,.3150426796961634,-.4337935076260451,.4337935076260451,-.5454214713888396,.5454214713888396,-.6480936519369755,.6480936519369755,-.7401241915785544,.7401241915785544,-.820001985973903,.820001985973903,-.8864155270044011,.8864155270044011,-.9382745520027328,.9382745520027328,-.9747285559713095,.9747285559713095,-.9951872199970213,.9951872199970213],Cvalues:[.12793819534675216,.12793819534675216,.1258374563468283,.1258374563468283,.12167047292780339,.12167047292780339,.1155056680537256,.1155056680537256,.10744427011596563,.10744427011596563,.09761865210411388,.09761865210411388,.08619016153195327,.08619016153195327,.0733464814110803,.0733464814110803,.05929858491543678,.05929858491543678,.04427743881741981,.04427743881741981,.028531388628933663,.028531388628933663,.0123412297999872,.0123412297999872],arcfn:function(e,t){var n=t(e),i=n.x*n.x+n.y*n.y;return void 0!==n.z&&(i+=n.z*n.z),s(i)},between:function(e,t,n){return t<=e&&e<=n||p.approximately(e,t)||p.approximately(e,n)},approximately:function(e,n,i){return t(e-n)<=(i||1e-6)},length:function(e){var t,n,i=0,r=p.Tvalues.length;for(t=0;ta.x.min&&(t=a.x.min),n>a.y.min&&(n=a.y.min),i0&&(o.c1=t,o.c2=i,o.s1=e,o.s2=n,a.push(o))}})}),a},makeshape:function(e,t,n){var i=t.points.length,r=e.points.length,a=p.makeline(t.points[i-1],e.points[0]),o=p.makeline(e.points[r-1],t.points[0]),s={startcap:a,forward:e,back:t,endcap:o,bbox:p.findbbox([a,e,t,o])},l=p;return s.intersections=function(e){return l.shapeintersections(s,s.bbox,e,e.bbox,n)},s},getminmax:function(e,t,n){if(!n)return{min:0,max:0};var i,r,a=f,o=m;-1===n.indexOf(0)&&(n=[0].concat(n)),-1===n.indexOf(1)&&n.push(1);for(var s=0,l=n.length;so&&(o=r[t]);return{min:a,mid:(a+o)/2,max:o,size:o-a}},align:function(e,t){var n=t.p1.x,a=t.p1.y,s=-o(t.p2.y-a,t.p2.x-n),l=function(e){return{x:(e.x-n)*i(s)-(e.y-a)*r(s),y:(e.x-n)*r(s)+(e.y-a)*i(s)}};return e.map(l)},roots:function(e,t){t=t||{p1:{x:0,y:0},p2:{x:1,y:0}};var n=e.length-1,r=p.align(e,t),o=function(e){return 0<=e&&e<=1};if(2===n){var l=r[0].y,h=r[1].y,d=r[2].y,f=l-2*h+d;if(0!==f){var m=-s(h*h-l*d),g=-l+h,v=-(m+g)/f;return[v,-(-m+g)/f].filter(o)}return h!==d&&0===f?[(2*h-d)/2*(h-d)].filter(o):[]}var w,v,y,b,x,_=r[0].y,E=r[1].y,C=r[2].y,k=r[3].y,f=3*E-_-3*C+k,l=(3*_-6*E+3*C)/f,h=(-3*_+3*E)/f,d=_/f,r=(3*h-l*l)/3,S=r/3,z=(2*l*l*l-9*l*h+27*d)/27,T=z/2,P=T*T+S*S*S;if(P<0){var B=-r/3,N=B*B*B,L=s(N),M=-z/(2*L),I=M<-1?-1:M>1?1:M,A=a(I),O=c(L),j=2*O;return y=j*i(A/3)-l/3,b=j*i((A+u)/3)-l/3,x=j*i((A+2*u)/3)-l/3,[y,b,x].filter(o)}if(0===P)return w=T<0?c(-T):-c(T),y=2*w-l/3,b=-w-l/3,[y,b].filter(o);var D=s(P);return w=c(-T+D),v=c(T+D),[w-v-l/3].filter(o)},droots:function(e){if(3===e.length){var t=e[0],n=e[1],i=e[2],r=t-2*n+i;if(0!==r){var a=-s(n*n-t*i),o=-t+n;return[-(a+o)/r,-(-a+o)/r]}return n!==i&&0===r?[(2*n-i)/(2*(n-i))]:[]}if(2===e.length){var t=e[0],n=e[1];return t!==n?[t/(t-n)]:[]}},inflections:function(e){if(e.length<4)return[];var t=p.align(e,{p1:e[0],p2:e.slice(-1)[0]}),n=t[2].x*t[1].y,i=t[3].x*t[1].y,r=t[1].x*t[2].y,a=t[3].x*t[2].y,o=18*(-3*n+2*i+3*r-a),s=18*(3*n-i-3*r),l=18*(r-n);if(p.approximately(o,0)){if(!p.approximately(s,0)){var c=-l/s;if(0<=c&&c<=1)return[c]}return[]}var h=s*s-4*o*l,u=Math.sqrt(h),a=2*o;return p.approximately(a,0)?[]:[(u-s)/a,-(s+u)/a].filter(function(e){return 0<=e&&e<=1})},bboxoverlap:function(e,n){var i,r,a,o,s,l=["x","y"],c=l.length;for(i=0;i=s)return!1;return!0},expandbox:function(e,t){t.x.mine.x.max&&(e.x.max=t.x.max),t.y.max>e.y.max&&(e.y.max=t.y.max),t.z&&t.z.max>e.z.max&&(e.z.max=t.z.max),e.x.mid=(e.x.min+e.x.max)/2,e.y.mid=(e.y.min+e.y.max)/2,e.z&&(e.z.mid=(e.z.min+e.z.max)/2),e.x.size=e.x.max-e.x.min,e.y.size=e.y.max-e.y.min,e.z&&(e.z.size=e.z.max-e.z.min)},pairiteration:function(e,t,n){var i=e.bbox(),r=t.bbox(),a=1e5,o=n||.5;if(i.x.size+i.y.sizeP||P>B)&&(T+=u),T>B&&(a=B,B=T,T=a)):Bu-1)throw new Error("degree must be less than or equal to point count - 1");if(!r)for(r=[],s=0;sp)throw new Error("out of bounds");for(c=f[0];c=i[c]&&e<=i[c+1]);c++);var g=[];for(s=0;sc-t-1+h;s--)for(v=(e-i[s])/(i[s+t+1-h]-i[s]),l=0;l0||i0?[["dictionary",i.definitions],r]:r},deserialize:function(e,t,n,i){var r=e,a=!n;if(n=n||{},Array.isArray(e)){var o=e[0],l="dictionary"===o;if(1==e.length&&/^#/.test(o))return n.dictionary[o];o=s.exports[o],r=[],i&&(n.dictionary=r);for(var c=o?1:0,h=e.length;ce.length&&(n=e.length);for(var s=0;s0){var r=this._eventTypes,a=r&&r[i],o=a&&a[n];o&&o.call(this,i)}},statics:{inject:function e(t){var n=t._events;if(n){var i={};s.each(n,function(e,n){var r="string"==typeof e,a=r?e:n,o=s.capitalize(a),l=a.substring(2).toLowerCase();i[l]=r?{}:e,a="_"+a,t["get"+o]=function(){return this[a]},t["set"+o]=function(e){var t=this[a];t&&this.off(l,t),e&&this.on(l,e),this[a]=e}}),t._eventTypes=i}return e.base.apply(this,arguments)}}},c=s.extend({_class:"PaperScope",initialize:function e(){a=this,this.settings=new s({applyMatrix:!0,handleSize:4,hitTolerance:0}),this.project=null,this.projects=[],this.tools=[],this.palettes=[],this._id=e._id++,e._scopes[this._id]=this;var t=e.prototype;if(!this.support){var n=ne.getContext(1,1);t.support={nativeDash:"setLineDash"in n||"mozDash"in n,nativeBlendModes:ie.nativeModes},ne.release(n)}if(!this.browser){var i=navigator.userAgent.toLowerCase(),r=(/(win)/.exec(i)||/(mac)/.exec(i)||/(linux)/.exec(i)||[])[0],o=t.browser={platform:r};r&&(o[r]=!0),i.replace(/(opera|chrome|safari|webkit|firefox|msie|trident|atom)\/?\s*([.\d]+)(?:.*version\/([.\d]+))?(?:.*rv\:([.\d]+))?/g,function(e,t,n,i,r){if(!o.chrome){var a="opera"===t?i:n;"trident"===t&&(a=r,t="msie"),o.version=a,o.versionNumber=parseFloat(a),o.name=t,o[t]=!0}}),o.chrome&&delete o.webkit,o.atom&&delete o.chrome}},version:"0.9.25",getView:function(){return this.project&&this.project.getView()},getPaper:function(){return this},execute:function(e,t,n){a.PaperScript.execute(e,this,t,n),Q.updateFocus()},install:function(e){var t=this;s.each(["project","view","tool"],function(n){s.define(e,n,{configurable:!0,get:function(){return t[n]}})});for(var n in this)!/^_/.test(n)&&this[n]&&(e[n]=this[n])},setup:function(e){return a=this,this.project=new _(e),this},activate:function(){a=this},clear:function(){for(var e=this.projects.length-1;e>=0;e--)this.projects[e].remove();for(var e=this.tools.length-1;e>=0;e--)this.tools[e].remove();for(var e=this.palettes.length-1;e>=0;e--)this.palettes[e].remove()},remove:function(){this.clear(),delete c._scopes[this._id]},statics:new function(){function e(e){return e+="Attribute",function(t,n){return t[e](n)||t[e]("data-paper-"+n)}}return{_scopes:{},_id:0,get:function(e){return this._scopes[e]||null},getAttribute:e("get"),hasAttribute:e("has")}}}),h=s.extend(l,{initialize:function(e){this._scope=a,this._index=this._scope[this._list].push(this)-1,!e&&this._scope[this._reference]||this.activate()},activate:function(){if(!this._scope)return!1;var e=this._scope[this._reference];return e&&e!==this&&e.emit("deactivate"),this._scope[this._reference]=this,this.emit("activate",e),!0},isActive:function(){return this._scope[this._reference]===this},remove:function(){return null!=this._index&&(s.splice(this._scope[this._list],null,this._index,1),this._scope[this._reference]==this&&(this._scope[this._reference]=null),this._scope=null,!0)}}),u=s.extend({initialize:function(e){this.precision=e||5,this.multiplier=Math.pow(10,this.precision)},number:function(e){return Math.round(e*this.multiplier)/this.multiplier},pair:function(e,t,n){return this.number(e)+(n||",")+this.number(t)},point:function(e,t){return this.number(e.x)+(t||",")+this.number(e.y)},size:function(e,t){return this.number(e.width)+(t||",")+this.number(e.height)},rectangle:function(e,t){return this.point(e,t)+(t||",")+this.size(e,t)}});u.instance=new u;var d=new function(){function e(e,t,n){return en?n:e}var t=[[.5773502691896257],[0,.7745966692414834],[.33998104358485626,.8611363115940526],[0,.5384693101056831,.906179845938664],[.2386191860831969,.6612093864662645,.932469514203152],[0,.4058451513773972,.7415311855993945,.9491079123427585],[.1834346424956498,.525532409916329,.7966664774136267,.9602898564975363],[0,.3242534234038089,.6133714327005904,.8360311073266358,.9681602395076261],[.14887433898163122,.4333953941292472,.6794095682990244,.8650633666889845,.9739065285171717],[0,.26954315595234496,.5190961292068118,.7301520055740494,.8870625997680953,.978228658146057],[.1252334085114689,.3678314989981802,.5873179542866175,.7699026741943047,.9041172563704749,.9815606342467192],[0,.2304583159551348,.44849275103644687,.6423493394403402,.8015780907333099,.9175983992229779,.9841830547185881],[.10805494870734367,.31911236892788974,.5152486363581541,.6872929048116855,.827201315069765,.9284348836635735,.9862838086968123],[0,.20119409399743451,.3941513470775634,.5709721726085388,.7244177313601701,.8482065834104272,.937273392400706,.9879925180204854],[.09501250983763744,.2816035507792589,.45801677765722737,.6178762444026438,.755404408355003,.8656312023878318,.9445750230732326,.9894009349916499]],n=[[1],[.8888888888888888,.5555555555555556],[.6521451548625461,.34785484513745385],[.5688888888888889,.47862867049936647,.23692688505618908],[.46791393457269104,.3607615730481386,.17132449237917036],[.4179591836734694,.3818300505051189,.27970539148927664,.1294849661688697],[.362683783378362,.31370664587788727,.22238103445337448,.10122853629037626],[.3302393550012598,.31234707704000286,.26061069640293544,.1806481606948574,.08127438836157441],[.29552422471475287,.26926671930999635,.21908636251598204,.1494513491505806,.06667134430868814],[.2729250867779006,.26280454451024665,.23319376459199048,.18629021092773426,.1255803694649046,.05566856711617366],[.24914704581340277,.2334925365383548,.20316742672306592,.16007832854334622,.10693932599531843,.04717533638651183],[.2325515532308739,.22628318026289723,.2078160475368885,.17814598076194574,.13887351021978725,.09212149983772845,.04048400476531588],[.2152638534631578,.2051984637212956,.18553839747793782,.15720316715819355,.12151857068790319,.08015808715976021,.03511946033175186],[.2025782419255613,.19843148532711158,.1861610000155622,.16626920581699392,.13957067792615432,.10715922046717194,.07036604748810812,.03075324199611727],[.1894506104550685,.18260341504492358,.16915651939500254,.14959598881657674,.12462897125553388,.09515851168249279,.062253523938647894,.027152459411754096]],i=Math.abs,r=Math.sqrt,a=Math.pow;return{TOLERANCE:1e-6,EPSILON:1e-12,MACHINE_EPSILON:1.12e-16,CURVETIME_EPSILON:4e-7,GEOMETRIC_EPSILON:2e-7,WINDING_EPSILON:2e-7,TRIGONOMETRIC_EPSILON:1e-7,CLIPPING_EPSILON:1e-7,KAPPA:4*(r(2)-1)/3,isZero:function(e){return e>=-1e-12&&e<=1e-12},integrate:function(e,i,r,a){for(var o=t[a-2],s=n[a-2],l=.5*(r-i),c=l+i,h=0,u=a+1>>1,d=1&a?s[h++]*e(c):0;h0?(a=n,n=u<=r?.5*(r+a):u):(r=n,n=u>=a?.5*(r+a):u)}return n},solveQuadratic:function(t,n,o,s,l,c){var h,u,d=0,f=l-1e-12,m=c+1e-12,p=1/0,g=n;if(n/=-2,0!==(u=n*n-t*o)&&i(u)<1.12e-16){var v=a(i(t*n*o),1/3);if(v<1e-8){var w=a(10,i(Math.floor(Math.log(v)*Math.LOG10E)));isFinite(w)||(w=0),t*=w,n*=w,o*=w,u=n*n-t*o}}if(i(t)<1e-12){if(i(g)<1e-12)return i(o)<1e-12?-1:0;h=-o/g}else if(u>=-1.12e-16){var y=u<0?0:r(u),b=n+(n<0?-y:y);0===b?(h=o/t,p=-h):(h=b/t,p=o/b)}return isFinite(h)&&(null==l||h>f&&hf&&p0?1.3247179572*Math.max(b,r(y)):b,(g=u-x*b)!==u){do{if(u=g,_=t*u,f=_+n,m=f*u+o,w=(_+f)*u+m,v=m*u+s,(g=0===w?u:u-v/w/(1+1.12e-16))===u){u=g;break}}while(x*g>x*u);i(t)*u*u>i(s/u)&&(m=-s/u,f=(m-o)/u)}}var p=d.solveQuadratic(t,f,m,l,c,h);return isFinite(u)&&(0===p||u!==l[p-1])&&(null==c||u>c-1e-12&&u1?e[1]:e[0]):null!=e.x?(this.x=e.x,this.y=e.y):null!=e.width?(this.x=e.width,this.y=e.height):null!=e.angle?(this.x=e.length,this.y=0,this.setAngle(e.angle)):(this.x=this.y=0,this.__read&&(this.__read=0)),this.__read&&(this.__read=1))},set:function(e,t){return this.x=e,this.y=t,this},equals:function(e){return this===e||e&&(this.x===e.x&&this.y===e.y||Array.isArray(e)&&this.x===e[0]&&this.y===e[1])||!1},clone:function(){return new m(this.x,this.y)},toString:function(){var e=u.instance;return"{ x: "+e.number(this.x)+", y: "+e.number(this.y)+" }"},_serialize:function(e){var t=e.formatter;return[t.number(this.x),t.number(this.y)]},getLength:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},setLength:function(e){if(this.isZero()){var t=this._angle||0;this.set(Math.cos(t)*e,Math.sin(t)*e)}else{var n=e/this.getLength();d.isZero(n)&&this.getAngle(),this.set(this.x*n,this.y*n)}},getAngle:function(){return 180*this.getAngleInRadians.apply(this,arguments)/Math.PI},setAngle:function(e){this.setAngleInRadians.call(this,e*Math.PI/180)},getAngleInDegrees:"#getAngle",setAngleInDegrees:"#setAngle",getAngleInRadians:function(){if(arguments.length){var e=m.read(arguments),t=this.getLength()*e.getLength();if(d.isZero(t))return NaN;var n=this.dot(e)/t;return Math.acos(n<-1?-1:n>1?1:n)}return this.isZero()?this._angle||0:this._angle=Math.atan2(this.y,this.x)},setAngleInRadians:function(e){if(this._angle=e,!this.isZero()){var t=this.getLength();this.set(Math.cos(e)*t,Math.sin(e)*t)}},getQuadrant:function(){return this.x>=0?this.y>=0?1:4:this.y>=0?2:3}},{beans:!1,getDirectedAngle:function(){var e=m.read(arguments);return 180*Math.atan2(this.cross(e),this.dot(e))/Math.PI},getDistance:function(){var e=m.read(arguments),t=e.x-this.x,n=e.y-this.y,i=t*t+n*n;return s.read(arguments)?i:Math.sqrt(i)},normalize:function(e){e===o&&(e=1);var t=this.getLength(),n=0!==t?e/t:0,i=new m(this.x*n,this.y*n);return n>=0&&(i._angle=this._angle),i},rotate:function(e,t){if(0===e)return this.clone();e=e*Math.PI/180;var n=t?this.subtract(t):this,i=Math.sin(e),r=Math.cos(e);return n=new m(n.x*r-n.y*i,n.x*i+n.y*r),t?n.add(t):n},transform:function(e){return e?e._transformPoint(this):this},add:function(){var e=m.read(arguments);return new m(this.x+e.x,this.y+e.y)},subtract:function(){var e=m.read(arguments);return new m(this.x-e.x,this.y-e.y)},multiply:function(){var e=m.read(arguments);return new m(this.x*e.x,this.y*e.y)},divide:function(){var e=m.read(arguments);return new m(this.x/e.x,this.y/e.y)},modulo:function(){var e=m.read(arguments);return new m(this.x%e.x,this.y%e.y)},negate:function(){return new m(-this.x,-this.y)},isInside:function(){return w.read(arguments).contains(this)},isClose:function(){var e=m.read(arguments),t=s.read(arguments);return this.getDistance(e)1?e[1]:e[0]):null!=e.width?(this.width=e.width,this.height=e.height):null!=e.x?(this.width=e.x,this.height=e.y):(this.width=this.height=0,this.__read&&(this.__read=0)),this.__read&&(this.__read=1))},set:function(e,t){return this.width=e,this.height=t,this},equals:function(e){return e===this||e&&(this.width===e.width&&this.height===e.height||Array.isArray(e)&&this.width===e[0]&&this.height===e[1])||!1},clone:function(){return new g(this.width,this.height)},toString:function(){var e=u.instance;return"{ width: "+e.number(this.width)+", height: "+e.number(this.height)+" }"},_serialize:function(e){var t=e.formatter;return[t.number(this.width),t.number(this.height)]},add:function(){var e=g.read(arguments);return new g(this.width+e.width,this.height+e.height)},subtract:function(){var e=g.read(arguments);return new g(this.width-e.width,this.height-e.height)},multiply:function(){var e=g.read(arguments);return new g(this.width*e.width,this.height*e.height)},divide:function(){var e=g.read(arguments);return new g(this.width/e.width,this.height/e.height)},modulo:function(){var e=g.read(arguments);return new g(this.width%e.width,this.height%e.height)},negate:function(){return new g(-this.width,-this.height)},isZero:function(){return d.isZero(this.width)&&d.isZero(this.height)},isNaN:function(){return isNaN(this.width)||isNaN(this.height)},statics:{min:function(e,t){return new g(Math.min(e.width,t.width),Math.min(e.height,t.height))},max:function(e,t){return new g(Math.max(e.width,t.width),Math.max(e.height,t.height))},random:function(){return new g(Math.random(),Math.random())}}},s.each(["round","ceil","floor","abs"],function(e){var t=Math[e];this[e]=function(){return new g(t(this.width),t(this.height))}},{})),v=g.extend({initialize:function(e,t,n,i){this._width=e,this._height=t,this._owner=n,this._setter=i},set:function(e,t,n){return this._width=e,this._height=t,n||this._owner[this._setter](this),this},getWidth:function(){return this._width},setWidth:function(e){this._width=e,this._owner[this._setter](this)},getHeight:function(){return this._height},setHeight:function(e){this._height=e,this._owner[this._setter](this)}}),w=s.extend({_class:"Rectangle",_readIndex:!0,beans:!0,initialize:function(e,t,n,i){var r=typeof e,a=0;if("number"===r?(this.x=e,this.y=t,this.width=n,this.height=i,a=4):"undefined"===r||null===e?(this.x=this.y=this.width=this.height=0,a=null===e?1:0):1===arguments.length&&(Array.isArray(e)?(this.x=e[0],this.y=e[1],this.width=e[2],this.height=e[3],a=1):e.x!==o||e.width!==o?(this.x=e.x||0,this.y=e.y||0,this.width=e.width||0,this.height=e.height||0,a=1):e.from===o&&e.to===o&&(this.x=this.y=this.width=this.height=0,this._set(e),a=1)),!a){var l=m.readNamed(arguments,"from"),c=s.peek(arguments);if(this.x=l.x,this.y=l.y,c&&c.x!==o||s.hasNamed(arguments,"to")){var h=m.readNamed(arguments,"to");this.width=h.x-l.x,this.height=h.y-l.y,this.width<0&&(this.x=h.x,this.width=-this.width),this.height<0&&(this.y=h.y,this.height=-this.height)}else{var u=g.read(arguments);this.width=u.width,this.height=u.height}a=arguments.__index}this.__read&&(this.__read=a)},set:function(e,t,n,i){return this.x=e,this.y=t,this.width=n,this.height=i,this},clone:function(){return new w(this.x,this.y,this.width,this.height)},equals:function(e){var t=s.isPlainValue(e)?w.read(arguments):e;return t===this||t&&this.x===t.x&&this.y===t.y&&this.width===t.width&&this.height===t.height||!1},toString:function(){var e=u.instance;return"{ x: "+e.number(this.x)+", y: "+e.number(this.y)+", width: "+e.number(this.width)+", height: "+e.number(this.height)+" }"},_serialize:function(e){var t=e.formatter;return[t.number(this.x),t.number(this.y),t.number(this.width),t.number(this.height)]},getPoint:function(e){return new(e?m:p)(this.x,this.y,this,"setPoint")},setPoint:function(){var e=m.read(arguments);this.x=e.x,this.y=e.y},getSize:function(e){return new(e?g:v)(this.width,this.height,this,"setSize")},setSize:function(){var e=g.read(arguments);this._fixX&&(this.x+=(this.width-e.width)*this._fixX),this._fixY&&(this.y+=(this.height-e.height)*this._fixY),this.width=e.width,this.height=e.height,this._fixW=1,this._fixH=1},getLeft:function(){return this.x},setLeft:function(e){this._fixW||(this.width-=e-this.x),this.x=e,this._fixX=0},getTop:function(){return this.y},setTop:function(e){this._fixH||(this.height-=e-this.y),this.y=e,this._fixY=0},getRight:function(){return this.x+this.width},setRight:function(e){this._fixX!==o&&1!==this._fixX&&(this._fixW=0),this._fixW?this.x=e-this.width:this.width=e-this.x,this._fixX=1},getBottom:function(){return this.y+this.height},setBottom:function(e){this._fixY!==o&&1!==this._fixY&&(this._fixH=0),this._fixH?this.y=e-this.height:this.height=e-this.y,this._fixY=1},getCenterX:function(){return this.x+.5*this.width},setCenterX:function(e){this.x=e-.5*this.width,this._fixX=.5},getCenterY:function(){return this.y+.5*this.height},setCenterY:function(e){this.y=e-.5*this.height,this._fixY=.5},getCenter:function(e){return new(e?m:p)(this.getCenterX(),this.getCenterY(),this,"setCenter")},setCenter:function(){var e=m.read(arguments);return this.setCenterX(e.x),this.setCenterY(e.y),this},getArea:function(){return this.width*this.height},isEmpty:function(){return 0===this.width||0===this.height},contains:function(e){return e&&e.width!==o||4==(Array.isArray(e)?e:arguments).length?this._containsRectangle(w.read(arguments)):this._containsPoint(m.read(arguments))},_containsPoint:function(e){var t=e.x,n=e.y;return t>=this.x&&n>=this.y&&t<=this.x+this.width&&n<=this.y+this.height},_containsRectangle:function(e){var t=e.x,n=e.y;return t>=this.x&&n>=this.y&&t+e.width<=this.x+this.width&&n+e.height<=this.y+this.height},intersects:function(){var e=w.read(arguments);return e.x+e.width>this.x&&e.y+e.height>this.y&&e.x=this.x&&e.y+e.height>=this.y&&e.x<=this.x+this.width&&e.y<=this.y+this.height},intersect:function(){var e=w.read(arguments),t=Math.max(this.x,e.x),n=Math.max(this.y,e.y),i=Math.min(this.x+this.width,e.x+e.width),r=Math.min(this.y+this.height,e.y+e.height);return new w(t,n,i-t,r-n)},unite:function(){var e=w.read(arguments),t=Math.min(this.x,e.x),n=Math.min(this.y,e.y),i=Math.max(this.x+this.width,e.x+e.width),r=Math.max(this.y+this.height,e.y+e.height);return new w(t,n,i-t,r-n)},include:function(){var e=m.read(arguments),t=Math.min(this.x,e.x),n=Math.min(this.y,e.y),i=Math.max(this.x+this.width,e.x),r=Math.max(this.y+this.height,e.y);return new w(t,n,i-t,r-n)},expand:function(){var e=g.read(arguments),t=e.width,n=e.height;return new w(this.x-t/2,this.y-n/2,this.width+t,this.height+n)},scale:function(e,t){return this.expand(this.width*e-this.width,this.height*(t===o?e:t)-this.height)}},s.each([["Top","Left"],["Top","Right"],["Bottom","Left"],["Bottom","Right"],["Left","Center"],["Top","Center"],["Right","Center"],["Bottom","Center"]],function(e,t){var n=e.join(""),i=/^[RL]/.test(n);t>=4&&(e[1]+=i?"Y":"X");var r=e[i?0:1],a=e[i?1:0],o="get"+r,s="get"+a,l="set"+r,c="set"+a,h="get"+n,u="set"+n;this[h]=function(e){return new(e?m:p)(this[o](),this[s](),this,u)},this[u]=function(){var e=m.read(arguments);this[l](e.x),this[c](e.y)}},{beans:!0})),y=w.extend({initialize:function(e,t,n,i,r,a){this.set(e,t,n,i,!0),this._owner=r,this._setter=a},set:function(e,t,n,i,r){return this._x=e,this._y=t,this._width=n,this._height=i,r||this._owner[this._setter](this),this}},new function(){var e=w.prototype;return s.each(["x","y","width","height"],function(e){var t=s.capitalize(e),n="_"+e;this["get"+t]=function(){return this[n]},this["set"+t]=function(e){this[n]=e,this._dontNotify||this._owner[this._setter](this)}},s.each(["Point","Size","Center","Left","Top","Right","Bottom","CenterX","CenterY","TopLeft","TopRight","BottomLeft","BottomRight","LeftCenter","TopCenter","RightCenter","BottomCenter"],function(t){var n="set"+t;this[n]=function(){this._dontNotify=!0,e[n].apply(this,arguments),this._dontNotify=!1,this._owner[this._setter](this)}},{isSelected:function(){return this._owner._boundsSelected},setSelected:function(e){var t=this._owner;t.setSelected&&(t._boundsSelected=e,t.setSelected(e||t._selectedSegmentState>0))}}))}),b=s.extend({_class:"Matrix",initialize:function e(t){var n=arguments.length,i=!0;if(6===n?this.set.apply(this,arguments):1===n?t instanceof e?this.set(t._a,t._c,t._b,t._d,t._tx,t._ty):Array.isArray(t)?this.set.apply(this,t):i=!1:0===n?this.reset():i=!1,!i)throw new Error("Unsupported matrix parameters")},set:function(e,t,n,i,r,a,o){return this._a=e,this._c=t,this._b=n,this._d=i,this._tx=r,this._ty=a,o||this._changed(),this},_serialize:function(e){return s.serialize(this.getValues(),e)},_changed:function(){var e=this._owner;e&&(e._applyMatrix?e.transform(null,!0):e._changed(9))},clone:function(){return new b(this._a,this._c,this._b,this._d,this._tx,this._ty)},equals:function(e){return e===this||e&&this._a===e._a&&this._b===e._b&&this._c===e._c&&this._d===e._d&&this._tx===e._tx&&this._ty===e._ty||!1},toString:function(){var e=u.instance;return"[["+[e.number(this._a),e.number(this._b),e.number(this._tx)].join(", ")+"], ["+[e.number(this._c),e.number(this._d),e.number(this._ty)].join(", ")+"]]"},reset:function(e){return this._a=this._d=1,this._c=this._b=this._tx=this._ty=0,e||this._changed(),this},apply:function(e,t){var n=this._owner;return!!n&&(n.transform(null,!0,s.pick(e,!0),t),this.isIdentity())},translate:function(){var e=m.read(arguments),t=e.x,n=e.y;return this._tx+=t*this._a+n*this._b,this._ty+=t*this._c+n*this._d,this._changed(),this},scale:function(){var e=m.read(arguments),t=m.read(arguments,0,{readNull:!0});return t&&this.translate(t),this._a*=e.x,this._c*=e.x,this._b*=e.y,this._d*=e.y,t&&this.translate(t.negate()),this._changed(),this},rotate:function(e){e*=Math.PI/180;var t=m.read(arguments,1),n=t.x,i=t.y,r=Math.cos(e),a=Math.sin(e),o=n-n*r+i*a,s=i-n*a-i*r,l=this._a,c=this._b,h=this._c,u=this._d;return this._a=r*l+a*c,this._b=-a*l+r*c,this._c=r*h+a*u,this._d=-a*h+r*u,this._tx+=o*l+s*c,this._ty+=o*h+s*u,this._changed(),this},shear:function(){var e=m.read(arguments),t=m.read(arguments,0,{readNull:!0});t&&this.translate(t);var n=this._a,i=this._c;return this._a+=e.y*this._b,this._c+=e.y*this._d,this._b+=e.x*n,this._d+=e.x*i,t&&this.translate(t.negate()),this._changed(),this},skew:function(){var e=m.read(arguments),t=m.read(arguments,0,{readNull:!0}),n=Math.PI/180,i=new m(Math.tan(e.x*n),Math.tan(e.y*n));return this.shear(i,t)},concatenate:function(e){var t=this._a,n=this._b,i=this._c,r=this._d,a=e._a,o=e._b,s=e._c,l=e._d,c=e._tx,h=e._ty;return this._a=a*t+s*n,this._b=o*t+l*n,this._c=a*i+s*r,this._d=o*i+l*r,this._tx+=c*t+h*n,this._ty+=c*i+h*r,this._changed(),this},preConcatenate:function(e){var t=this._a,n=this._b,i=this._c,r=this._d,a=this._tx,o=this._ty,s=e._a,l=e._b,c=e._c,h=e._d,u=e._tx,d=e._ty;return this._a=s*t+l*i,this._b=s*n+l*r,this._c=c*t+h*i,this._d=c*n+h*r,this._tx=s*a+l*o+u,this._ty=c*a+h*o+d,this._changed(),this},chain:function(e){var t=this._a,n=this._b,i=this._c,r=this._d,a=this._tx,o=this._ty,s=e._a,l=e._b,c=e._c,h=e._d,u=e._tx,d=e._ty;return new b(s*t+c*n,s*i+c*r,l*t+h*n,l*i+h*r,a+u*t+d*n,o+u*i+d*r)},isIdentity:function(){return 1===this._a&&0===this._c&&0===this._b&&1===this._d&&0===this._tx&&0===this._ty},orNullIfIdentity:function(){return this.isIdentity()?null:this},isInvertible:function(){return!!this._getDeterminant()},isSingular:function(){return!this._getDeterminant()},transform:function(e,t,n){return arguments.length<3?this._transformPoint(m.read(arguments)):this._transformCoordinates(e,t,n)},_transformPoint:function(e,t,n){var i=e.x,r=e.y;return t||(t=new m),t.set(i*this._a+r*this._b+this._tx,i*this._c+r*this._d+this._ty,n)},_transformCoordinates:function(e,t,n){for(var i=0,r=0,a=2*n;ia[l]&&(a[l]=s)}return t||(t=new w),t.set(r[0],r[1],a[0]-r[0],a[1]-r[1],n)},inverseTransform:function(){return this._inverseTransform(m.read(arguments))},_getDeterminant:function(){var e=this._a*this._d-this._b*this._c;return isFinite(e)&&!d.isZero(e)&&isFinite(this._tx)&&isFinite(this._ty)?e:null},_inverseTransform:function(e,t,n){var i=this._getDeterminant();if(!i)return null;var r=e.x-this._tx,a=e.y-this._ty;return t||(t=new m),t.set((r*this._d-a*this._b)/i,(a*this._a-r*this._c)/i,n)},decompose:function(){var e=this._a,t=this._b,n=this._c,i=this._d;if(d.isZero(e*i-t*n))return null;var r=Math.sqrt(e*e+t*t);e/=r,t/=r;var a=e*n+t*i;n-=e*a,i-=t*a;var o=Math.sqrt(n*n+i*i);return n/=o,i/=o,a/=o,e*i=4?(this._px=e,this._py=t,this._vx=n,this._vy=i,a=r):(this._px=e.x,this._py=e.y,this._vx=t.x,this._vy=t.y,a=n),a||(this._vx-=this._px,this._vy-=this._py)},getPoint:function(){return new m(this._px,this._py)},getVector:function(){return new m(this._vx,this._vy)},getLength:function(){return this.getVector().getLength()},intersect:function(e,t){return x.intersect(this._px,this._py,this._vx,this._vy,e._px,e._py,e._vx,e._vy,!0,t)},getSide:function(e,t){return x.getSide(this._px,this._py,this._vx,this._vy,e.x,e.y,!0,t)},getDistance:function(e){return Math.abs(x.getSignedDistance(this._px,this._py,this._vx,this._vy,e.x,e.y,!0))},isCollinear:function(e){return m.isCollinear(this._vx,this._vy,e._vx,e._vy)},isOrthogonal:function(e){return m.isOrthogonal(this._vx,this._vy,e._vx,e._vy)},statics:{intersect:function(e,t,n,i,r,a,o,s,l,c){l||(n-=e,i-=t,o-=r,s-=a);var h=n*s-i*o;if(!d.isZero(h)){var u=e-r,f=t-a,p=(o*f-s*u)/h,g=(n*f-i*u)/h;if(c||-1e-12=1?1:p),new m(e+p*n,t+p*i)}},getSide:function(e,t,n,i,r,a,o,s){o||(n-=e,i-=t);var l=r-e,c=a-t,h=l*i-c*n;return 0!==h||s||(h=(l*n+l*n)/(n*n+i*i))>=0&&h<=1&&(h=0),h<0?-1:h>0?1:0},getSignedDistance:function(e,t,n,i,r,a,o){return o||(n-=e,i-=t),0===n?i>0?r-e:e-r:0===i?n<0?a-t:t-a:((r-e)*i-(a-t)*n)/Math.sqrt(n*n+i*i)}}}),_=h.extend({_class:"Project",_list:"projects",_reference:"project",initialize:function(e){h.call(this,!0),this.layers=[],this._activeLayer=null,this.symbols=[],this._currentStyle=new X(null,null,this),this._view=Q.create(this,e||ne.getCanvas(1,1)),this._selectedItems={},this._selectedItemCount=0,this._updateVersion=0},_serialize:function(e,t){return s.serialize(this.layers,e,!0,t)},clear:function(){for(var e=this.layers.length-1;e>=0;e--)this.layers[e].remove();this.symbols=[]},isEmpty:function(){return 0===this.layers.length},remove:function e(){return!!e.base.call(this)&&(this._view&&this._view.remove(),!0)},getView:function(){return this._view},getCurrentStyle:function(){return this._currentStyle},setCurrentStyle:function(e){this._currentStyle.initialize(e)},getIndex:function(){return this._index},getOptions:function(){return this._scope.settings},getActiveLayer:function(){return this._activeLayer||new S({project:this})},getSelectedItems:function(){var e=[];for(var t in this._selectedItems){var n=this._selectedItems[t];n.isInserted()&&e.push(n)}return e},insertChild:function(e,t,n){return t instanceof S?(t._remove(!1,!0),s.splice(this.layers,[t],e,0),t._setProject(this,!0),this._changes&&t._changed(5),this._activeLayer||(this._activeLayer=t)):t instanceof C?(this._activeLayer||this.insertChild(e,new S(C.NO_INSERT))).insertChild(e,t,n):t=null,t},addChild:function(e,t){return this.insertChild(o,e,t)},_updateSelection:function(e){var t=e._id,n=this._selectedItems;e._selected?n[t]!==e&&(this._selectedItemCount++,n[t]=e):n[t]===e&&(this._selectedItemCount--,delete n[t])},selectAll:function(){for(var e=this.layers,t=0,n=e.length;t=0;n--){var i=this.layers[n]._hitTest(e,t);if(i)return i}return null},getItems:function(e){return C._getItems(this.layers,e)},getItem:function(e){return C._getItems(this.layers,e,null,null,!0)[0]||null},importJSON:function(e){this.activate();var t=this._activeLayer;return s.importJSON(e,t&&t.isEmpty()&&t)},draw:function(e,t,n){this._updateVersion++,e.save(),t.applyToContext(e);for(var i=new s({offset:new m(0,0),pixelRatio:n,viewMatrix:t.isIdentity()?null:t,matrices:[new b],updateMatrix:!0}),r=0,a=this.layers,o=a.length;r0){e.save(),e.strokeWidth=1;var l=this._selectedItems,c=this._scope.settings.handleSize,h=this._updateVersion;for(var u in l)l[u]._drawSelection(e,t,c,l,h);e.restore()}}}),E=s.extend({_class:"Symbol",initialize:function(e,t){this._id=f.get(),this.project=a.project,this.project.symbols.push(this),e&&this.setDefinition(e,t)},_serialize:function(e,t){return t.add(this,function(){return s.serialize([this._class,this._definition],e,!1,t)})},_changed:function(e){8&e&&C._clearBoundsCache(this),1&e&&(this.project._needsUpdate=!0)},getDefinition:function(){return this._definition},setDefinition:function(e,t){e._parentSymbol&&(e=e.clone()),this._definition&&(this._definition._parentSymbol=null),this._definition=e,e.remove(),e.setSelected(!1),t||e.setPosition(new m),e._parentSymbol=this,this._changed(9)},place:function(e){return new P(this,e)},clone:function(){return new E(this._definition.clone(!1))},equals:function(e){return e===this||e&&this.definition.equals(e.definition)||!1}}),C=s.extend(l,{statics:{extend:function e(t){return t._serializeFields&&(t._serializeFields=new s(this.prototype._serializeFields,t._serializeFields)),e.base.apply(this,arguments)},NO_INSERT:{insert:!1}},_class:"Item",_applyMatrix:!0,_canApplyMatrix:!0,_boundsSelected:!1,_selectChildren:!1,_serializeFields:{name:null,applyMatrix:null,matrix:new b,pivot:null,locked:!1,visible:!0,blendMode:"normal",opacity:1,guide:!1,selected:!1,clipMask:!1,data:{}},initialize:function(){},_initialize:function(e,t){var n=e&&s.isPlainObject(e),i=n&&!0===e.internal,r=this._matrix=new b,o=n&&e.project||a.project;return i||(this._id=f.get()),this._applyMatrix=this._canApplyMatrix&&a.settings.applyMatrix,t&&r.translate(t),r._owner=this,this._style=new X(o._currentStyle,this,o),this._project||(i||n&&!1===e.insert?this._setProject(o):n&&e.parent?this.setParent(e.parent):(o._activeLayer||new S).addChild(this)),n&&e!==C.NO_INSERT&&this._set(e,{insert:!0,project:!0,parent:!0},!0),n},_events:s.each(["onMouseDown","onMouseUp","onMouseDrag","onClick","onDoubleClick","onMouseMove","onMouseEnter","onMouseLeave"],function(e){this[e]={install:function(e){this.getView()._installEvent(e)},uninstall:function(e){this.getView()._uninstallEvent(e)}}},{onFrame:{install:function(){this.getView()._animateItem(this,!0)},uninstall:function(){this.getView()._animateItem(this,!1)}},onLoad:{}}),_serialize:function(e,t){function n(n){for(var a in n){var o=r[a];s.equals(o,"leading"===a?1.2*n.fontSize:n[a])||(i[a]=s.serialize(o,e,"data"!==a,t))}}var i={},r=this;return n(this._serializeFields),this instanceof k||n(this._style._defaults),[this._class,i]},_changed:function(e){var t=this._parentSymbol,n=this._parent||t,i=this._project;if(8&e&&(this._bounds=this._position=this._decomposed=this._globalMatrix=this._currentPath=o),n&&40&e&&C._clearBoundsCache(n),2&e&&C._clearBoundsCache(this),i&&(1&e&&(i._needsUpdate=!0),i._changes)){var r=i._changesById[this._id];r?r.flags|=e:(r={item:this,flags:e},i._changesById[this._id]=r,i._changes.push(r))}t&&t._changed(e)},set:function(e){return e&&this._set(e),this},getId:function(){return this._id},getName:function(){return this._name},setName:function(e,t){if(this._name&&this._removeNamed(),e===+e+"")throw new Error("Names consisting only of numbers are not supported.");var n=this._parent;if(e&&n){for(var i=n._children,r=n._namedChildren,a=e,s=1;t&&i[e];)e=a+" "+s++;(r[e]=r[e]||[]).push(this),i[e]=this}this._name=e||o,this._changed(128)},getStyle:function(){return this._style},setStyle:function(e){this.getStyle().set(e)}},s.each(["locked","visible","blendMode","opacity","guide"],function(e){var t=s.capitalize(e),e="_"+e;this["get"+t]=function(){return this[e]},this["set"+t]=function(t){t!=this[e]&&(this[e]=t,this._changed("_locked"===e?128:129))}},{}),{beans:!0,_locked:!1,_visible:!0,_blendMode:"normal",_opacity:1,_guide:!1,isSelected:function(){if(this._selectChildren)for(var e=this._children,t=0,n=e.length;t=0;t--)if(this._children[t].contains(e))return!0;return!1}return e.isInside(this.getInternalBounds())},isInside:function(){return w.read(arguments).contains(this.getBounds())},_asPathItem:function(){return new O.Rectangle({rectangle:this.getInternalBounds(),matrix:this._matrix,insert:!1})},intersects:function(e,t){return e instanceof C&&this._asPathItem().getIntersections(e._asPathItem(),null,t||e._matrix,!0).length>0},hitTest:function(){return this._hitTest(m.read(arguments),B.getOptions(s.read(arguments)))},_hitTest:function(e,t){function n(t,n){var i=d["get"+n]();if(e.subtract(i).divide(l).length<=1)return new B(t,u,{name:s.hyphenate(n),point:i})}if(this._locked||!this._visible||this._guide&&!t.guides||this.isEmpty())return null;var i=this._matrix,r=t._totalMatrix,a=this.getView(),o=t._totalMatrix=r?r.chain(i):this.getGlobalMatrix().preConcatenate(a._matrix),l=t._tolerancePadding=new g(O._getPenPadding(1,o.inverted())).multiply(Math.max(t.tolerance,1e-6));if(e=i._inverseTransform(e),!this._children&&!this.getInternalRoughBounds().expand(l.multiply(2))._containsPoint(e))return null;var c,h=!(t.guides&&!this._guide||t.selected&&!this._selected||t.type&&t.type!==s.hyphenate(this._class)||t.class&&!(this instanceof t.class)),u=this;if(h&&(t.center||t.bounds)&&this._parent){var d=this.getInternalBounds();if(t.center&&(c=n("center","Center")),!c&&t.bounds)for(var f=["TopLeft","TopRight","BottomLeft","BottomRight","LeftCenter","TopCenter","RightCenter","BottomCenter"],m=0;m<8&&!c;m++)c=n("bounds",f[m])}var p=!c&&this._children;if(p)for(var v=this._getChildHitTestOptions(t),m=p.length-1;m>=0&&!c;m--)c=p[m]._hitTest(e,v);return!c&&h&&(c=this._hitTestSelf(e,t)),c&&c.point&&(c.point=i.transform(c.point)),t._totalMatrix=r,c},_getChildHitTestOptions:function(e){return e},_hitTestSelf:function(e,t){if(t.fill&&this.hasFill()&&this._contains(e))return new B("fill",this)},matches:function(e,t){function n(e,t){for(var i in e)if(e.hasOwnProperty(i)){var r=e[i],a=t[i];if(s.isPlainObject(r)&&s.isPlainObject(a)){if(!n(r,a))return!1}else if(!s.equals(r,a))return!1}return!0}var i=typeof e;if("object"===i){for(var r in e)if(e.hasOwnProperty(r)&&!this.matches(r,e[r]))return!1}else{if("function"===i)return e(this);var a=/^(empty|editable)$/.test(e)?this["is"+s.capitalize(e)]():"type"===e?s.hyphenate(this._class):this[e];if(/^(constructor|class)$/.test(e)){if(!(this instanceof t))return!1}else if(t instanceof RegExp){if(!t.test(a))return!1}else if("function"==typeof t){if(!t(a))return!1}else if(s.isPlainObject(t)){if(!n(t,a))return!1}else if(!s.equals(a,t))return!1}return!0},getItems:function(e){return C._getItems(this._children,e,this._matrix)},getItem:function(e){return C._getItems(this._children,e,this._matrix,null,!0)[0]||null},statics:{_getItems:function e(t,n,i,r,a){if(!r&&"object"==typeof n){var o=n.overlapping,l=n.inside,c=o||l,h=c&&w.read([c]);r={items:[],inside:!!l,overlapping:!!o,rect:h,path:o&&new O.Rectangle({rectangle:h,insert:!1})},c&&(n=s.set({},n,{inside:!0,overlapping:!0}))}var u=r&&r.items,h=r&&r.rect;i=h&&(i||new b);for(var d=0,f=t&&t.length;d0)break}return u}}},{importJSON:function(e){var t=s.importJSON(e,this);return t!==this?this.addChild(t):t},addChild:function(e,t){return this.insertChild(o,e,t)},insertChild:function(e,t,n){var i=t?this.insertChildren(e,[t],n):null;return i&&i[0]},addChildren:function(e,t){return this.insertChildren(this._children.length,e,t)},insertChildren:function(e,t,n,i){var r=this._children;if(r&&t&&t.length>0){t=Array.prototype.slice.apply(t);for(var a=t.length-1;a>=0;a--){var o=t[a];if(!i||o instanceof i){var l=o._parent===this&&o._index=0;i--)n[i]._remove(!0,!1);return n.length>0&&this._changed(11),n},clear:"#removeChildren",reverseChildren:function(){if(this._children){this._children.reverse();for(var e=0,t=this._children.length;e0},isInserted:function(){return!!this._parent&&this._parent.isInserted()},isAbove:function(e){return-1===this._getOrder(e)},isBelow:function(e){return 1===this._getOrder(e)},isParent:function(e){return this._parent===e},isChild:function(e){return e&&e._parent===this},isDescendant:function(e){for(var t=this;t=t._parent;)if(t==e)return!0;return!1},isAncestor:function(e){return!!e&&e.isDescendant(this)},isSibling:function(e){return this._parent===e._parent},isGroupedWith:function(e){for(var t=this._parent;t;){if(t._parent&&/^(Group|Layer|CompoundPath)$/.test(t._class)&&e.isDescendant(t))return!0;t=t._parent}return!1},translate:function(){var e=new b;return this.transform(e.translate.apply(e,arguments))},rotate:function(e){return this.transform((new b).rotate(e,m.read(arguments,1,{readNull:!0})||this.getPosition(!0)))}},s.each(["scale","shear","skew"],function(e){this[e]=function(){var t=m.read(arguments),n=m.read(arguments,0,{readNull:!0});return this.transform((new b)[e](t,n||this.getPosition(!0)))}},{}),{transform:function(e,t,n,i){e&&e.isIdentity()&&(e=null);var r=this._matrix,a=(t||this._applyMatrix)&&(!r.isIdentity()||e||t&&n&&this._children);if(!e&&!a)return this;if(e&&r.preConcatenate(e),a=a&&this._transformContent(r,n,i)){var o=this._pivot,s=this._style,l=s.getFillColor(!0),c=s.getStrokeColor(!0);o&&r._transformPoint(o,o,!0),l&&l.transform(r),c&&c.transform(r),r.reset(!0),i&&this._canApplyMatrix&&(this._applyMatrix=!0)}var h=this._bounds,u=this._position;this._changed(9);var d=h&&e&&e.decompose();if(d&&!d.shearing&&d.rotation%90==0){for(var f in h){var m=h[f];!a&&m._internal||e._transformBounds(m,m)}var p=this._boundsGetter,m=h[p&&p.getBounds||p||"getBounds"];m&&(this._position=m.getCenter(!0)),this._bounds=h}else e&&u&&(this._position=e._transformPoint(u,u));return this},_transformContent:function(e,t,n){var i=this._children;if(i){for(var r=0,a=i.length;rr:i0){e.strokeStyle=i.toCanvasStyle(e),e.lineWidth=o;var s=t.getStrokeJoin(),l=t.getStrokeCap(),c=t.getMiterLimit();if(s&&(e.lineJoin=s),l&&(e.lineCap=l),c&&(e.miterLimit=c),a.support.nativeDash){var h=t.getDashArray(),u=t.getDashOffset();h&&h.length&&("setLineDash"in e?(e.setLineDash(h),e.lineDashOffset=u):(e.mozDash=h,e.mozDashOffset=u))}}}if(r){var d=t.getShadowBlur();if(d>0){e.shadowColor=r.toCanvasStyle(e),e.shadowBlur=d;var f=this.getShadowOffset();e.shadowOffsetX=f.x,e.shadowOffsetY=f.y}}},draw:function(e,t,n){function i(e){return o?o.chain(e):e}var r=this._updateVersion=this._project._updateVersion;if(this._visible&&0!==this._opacity){var a=t.matrices,o=t.viewMatrix,s=this._matrix,l=a[a.length-1].chain(s);if(l.isInvertible()){a.push(l),t.updateMatrix&&(l._updateVersion=r,this._globalMatrix=l);var c,h,u,d=this._blendMode,f=this._opacity,m="normal"===d,p=ie.nativeModes[d],g=m&&1===f||t.dontStart||t.clip||(p||m&&f<1)&&this._canComposite(),v=t.pixelRatio||1;if(!g){var w=this.getStrokeBounds(i(l));if(!w.width||!w.height)return;u=t.offset,h=t.offset=w.getTopLeft().floor(),c=e,e=ne.getContext(w.getSize().ceil().add(1).multiply(v)),1!==v&&e.scale(v,v)}e.save();var y=n?n.chain(s):!this.getStrokeScaling(!0)&&i(l),b=!g&&t.clipItem,x=!y||b;if(g?(e.globalAlpha=f,p&&(e.globalCompositeOperation=d)):x&&e.translate(-h.x,-h.y),x&&(g?s:i(l)).applyToContext(e),b&&t.clipItem.draw(e,t.extend({clip:!0})),y){e.setTransform(v,0,0,v,0,0);var _=t.offset;_&&e.translate(-_.x,-_.y)}this._draw(e,t,y),e.restore(),a.pop(),t.clip&&!t.dontFinish&&e.clip(),g||(ie.process(d,e,c,f,h.subtract(u).multiply(v)),ne.release(e),t.offset=u)}}},_isUpdated:function(e){var t=this._parent;if(t instanceof j)return t._isUpdated(e);var n=this._updateVersion===e;return!n&&t&&t._visible&&t._isUpdated(e)&&(this._updateVersion=e,n=!0),n},_drawSelection:function(e,t,n,i,r){if((this._drawSelected||this._boundsSelected)&&this._isUpdated(r)){var a=this.getSelectedColor(!0)||this.getLayer().getSelectedColor(!0),o=t.chain(this.getGlobalMatrix(!0));if(e.strokeStyle=e.fillStyle=a?a.toCanvasStyle(e):"#009dec",this._drawSelected&&this._drawSelected(e,o,i),this._boundsSelected){var s=n/2,l=o._transformCorners(this.getInternalBounds());e.beginPath();for(var c=0;c<8;c++)e[0===c?"moveTo":"lineTo"](l[c],l[++c]);e.closePath(),e.stroke();for(var c=0;c<8;c++)e.fillRect(l[c]-s,l[++c]-s,n,n)}}},_canComposite:function(){return!1}},s.each(["down","drag","up","move"],function(e){this["removeOn"+s.capitalize(e)]=function(){var t={};return t[e]=!0,this.removeOn(t)}},{removeOn:function(e){for(var t in e)if(e[t]){var n="mouse"+t,i=this._project,r=i._removeSets=i._removeSets||{};r[n]=r[n]||{},r[n][this._id]=this}return this}})),k=C.extend({_class:"Group",_selectChildren:!0,_serializeFields:{children:[]},initialize:function(e){this._children=[],this._namedChildren={},this._initialize(e)||this.addChildren(Array.isArray(e)?e:arguments)},_changed:function e(t){e.base.call(this,t),1026&t&&(this._clipItem=o)},_getClipItem:function(){var e=this._clipItem;if(e===o){e=null;for(var t=0,n=this._children.length;t1?1:-1),s=o.multiply(r),l=s.subtract(o.multiply(i)),c=new w(s,l);if((n?c.expand(n):c).contains(t))return l}}function t(e,t){var n=e.getAngleInRadians(),i=2*t.width,r=2*t.height,a=i*Math.sin(n),o=r*Math.cos(n);return i*r/(2*Math.sqrt(a*a+o*o))}return{_contains:function t(n){if("rectangle"===this._type){var i=e(this,n);return i?n.subtract(i).divide(this._radius).getLength()<=1:t.base.call(this,n)}return n.divide(this.size).getLength()<=.5},_hitTestSelf:function n(i,r){var a=!1;if(this.hasStroke()){var o=this._type,s=this._radius,l=this.getStrokeWidth()+2*r.tolerance;if("rectangle"===o){var c=e(this,i,l);if(c){var h=i.subtract(c);a=2*Math.abs(h.getLength()-t(h,s))<=l}else{var u=new w(this._size).setCenter(0,0),d=u.expand(l),f=u.expand(-l);a=d._containsPoint(i)&&!f._containsPoint(i)}}else"ellipse"===o&&(s=t(i,s)),a=2*Math.abs(i.getLength()-s)<=l}return a?new B("stroke",this):n.base.apply(this,arguments)}}},{statics:new function(){function e(e,t,n,i,r){var a=new z(s.getNamed(r));return a._type=e,a._size=n,a._radius=i,a.translate(t)}return{Circle:function(){var t=m.readNamed(arguments,"center"),n=s.readNamed(arguments,"radius");return e("circle",t,new g(2*n),n,arguments)},Rectangle:function(){var t=w.readNamed(arguments,"rectangle"),n=g.min(g.readNamed(arguments,"radius"),t.getSize(!0).divide(2));return e("rectangle",t.getCenter(!0),t.getSize(!0),n,arguments)},Ellipse:function(){var t=z._readEllipse(arguments),n=t.radius;return e("ellipse",t.center,n.multiply(2),n,arguments)},_readEllipse:function(e){var t,n;if(s.hasNamed(e,"radius"))t=m.readNamed(e,"center"),n=g.readNamed(e,"radius");else{var i=w.readNamed(e,"rectangle");t=i.getCenter(!0),n=i.getSize(!0).divide(2)}return{center:t,radius:n}}}}}),T=C.extend({_class:"Raster",_applyMatrix:!1,_canApplyMatrix:!1,_boundsGetter:"getBounds",_boundsSelected:!0,_serializeFields:{crossOrigin:null,source:null},initialize:function(e,t){this._initialize(e,t!==o&&m.read(arguments,1))||("string"==typeof e?this.setSource(e):this.setImage(e)),this._size||(this._size=new g,this._loaded=!1)},_equals:function(e){return this.getSource()===e.getSource()},clone:function(e){var t=new T(C.NO_INSERT),n=this._image,i=this._canvas;if(n)t.setImage(n);else if(i){var r=ne.getCanvas(this._size);r.getContext("2d").drawImage(i,0,0),t.setImage(r)}return t._crossOrigin=this._crossOrigin,this._clone(t,e)},getSize:function(){var e=this._size;return new v(e?e.width:0,e?e.height:0,this,"setSize")},setSize:function(){var e=g.read(arguments);if(!e.equals(this._size))if(e.width>0&&e.height>0){var t=this.getElement();this.setImage(ne.getCanvas(e)),t&&this.getContext(!0).drawImage(t,0,0,e.width,e.height)}else this._canvas&&ne.release(this._canvas),this._size=e.clone()},getWidth:function(){return this._size?this._size.width:0},setWidth:function(e){this.setSize(e,this.getHeight())},getHeight:function(){return this._size?this._size.height:0},setHeight:function(e){this.setSize(this.getWidth(),e)},isEmpty:function(){var e=this._size;return!e||0===e.width&&0===e.height},getResolution:function(){var e=this._matrix,t=new m(0,0).transform(e),n=new m(1,0).transform(e).subtract(t),i=new m(0,1).transform(e).subtract(t);return new g(72/n.getLength(),72/i.getLength())},getPpi:"#getResolution",getImage:function(){return this._image},setImage:function(e){this._canvas&&ne.release(this._canvas),e&&e.getContext?(this._image=null,this._canvas=e,this._loaded=!0):(this._image=e,this._canvas=null,this._loaded=e&&e.complete),this._size=new g(e?e.naturalWidth||e.width:0,e?e.naturalHeight||e.height:0),this._context=null,this._changed(521)},getCanvas:function(){if(!this._canvas){var e=ne.getContext(this._size);try{this._image&&e.drawImage(this._image,0,0),this._canvas=e.canvas}catch(t){ne.release(e)}}return this._canvas},setCanvas:"#setImage",getContext:function(e){return this._context||(this._context=this.getCanvas().getContext("2d")),e&&(this._image=null,this._changed(513)),this._context},setContext:function(e){this._context=e},getSource:function(){return this._image&&this._image.src||this.toDataURL()},setSource:function(e){function t(){var e=i.getView();e&&(a=e._scope,i.setImage(n),i.emit("load"),e.update())}var n,i=this,r=this._crossOrigin;n=document.getElementById(e)||new Image,r&&(n.crossOrigin=r),n.naturalWidth&&n.naturalHeight?setTimeout(t,0):(U.add(n,{load:t}),n.src||(n.src=e)),this.setImage(n)},getCrossOrigin:function(){return this._image&&this._image.crossOrigin||this._crossOrigin||""},setCrossOrigin:function(e){this._crossOrigin=e,this._image&&(this._image.crossOrigin=e)},getElement:function(){return this._canvas||this._loaded&&this._image}},{beans:!1,getSubCanvas:function(){var e=w.read(arguments),t=ne.getContext(e.getSize());return t.drawImage(this.getCanvas(),e.x,e.y,e.width,e.height,0,0,e.width,e.height),t.canvas},getSubRaster:function(){var e=w.read(arguments),t=new T(C.NO_INSERT);return t.setImage(this.getSubCanvas(e)),t.translate(e.getCenter().subtract(this.getSize().divide(2))),t._matrix.preConcatenate(this._matrix),t.insertAbove(this),t},toDataURL:function(){var e=this._image&&this._image.src;if(/^data:/.test(e))return e;var t=this.getCanvas();return t?t.toDataURL.apply(t,arguments):null},drawImage:function(e){var t=m.read(arguments,1);this.getContext(!0).drawImage(e,t.x,t.y)},getAverageColor:function(e){var t,n;e?e instanceof A?(n=e,t=e.getBounds()):e.width?t=new w(e):e.x&&(t=new w(e.x-.5,e.y-.5,1,1)):t=this.getBounds();var i=Math.min(t.width,32),r=Math.min(t.height,32),a=T._sampleContext;a?a.clearRect(0,0,33,33):a=T._sampleContext=ne.getContext(new g(32)),a.save();var o=(new b).scale(i/t.width,r/t.height).translate(-t.x,-t.y);o.applyToContext(a),n&&n.draw(a,new s({clip:!0,matrices:[o]})),this._matrix.applyToContext(a);var l=this.getElement(),c=this._size;l&&a.drawImage(l,-c.width/2,-c.height/2),a.restore();for(var h=a.getImageData(.5,.5,Math.ceil(i),Math.ceil(r)).data,u=[0,0,0],d=0,f=0,m=h.length;f0?i[r-1]:t._closed?i[i.length-1]:null)||n._changed(),e&&e!==this._point&&e!==this._handleOut||!(n=i[r])||n._changed()),t._changed(25)}},getPoint:function(){return this._point},setPoint:function(){var e=m.read(arguments);this._point.set(e.x,e.y)},getHandleIn:function(){return this._handleIn},setHandleIn:function(){var e=m.read(arguments);this._handleIn.set(e.x,e.y)},getHandleOut:function(){return this._handleOut},setHandleOut:function(){var e=m.read(arguments);this._handleOut.set(e.x,e.y)},hasHandles:function(){return!this._handleIn.isZero()||!this._handleOut.isZero()},clearHandles:function(){this._handleIn.set(0,0),this._handleOut.set(0,0)},_selectionState:0,isSelected:function(e){var t=this._selectionState;return e?e===this._point?!!(4&t):e===this._handleIn?!!(1&t):e===this._handleOut&&!!(2&t):!!(7&t)},setSelected:function(e,t){var n=this._path,e=!!e,i=this._selectionState,r=i,a=t?t===this._point?4:t===this._handleIn?1:t===this._handleOut?2:0:7;e?i|=a:i&=~a,this._selectionState=i,n&&i!==r&&(n._updateSelection(this,r,i),n._changed(129))},getIndex:function(){return this._index!==o?this._index:null},getPath:function(){return this._path||null},getCurve:function(){var e=this._path,t=this._index;return e?(t>0&&!e._closed&&t===e._segments.length-1&&t--,e.getCurves()[t]||null):null},getLocation:function(){var e=this.getCurve();return e?new I(e,this===e._segment1?0:1):null},getNext:function(){var e=this._path&&this._path._segments;return e&&(e[this._index+1]||this._path._closed&&e[0])||null},getPrevious:function(){var e=this._path&&this._path._segments;return e&&(e[this._index-1]||this._path._closed&&e[e.length-1])||null},isFirst:function(){return 0===this._index},isLast:function(){var e=this._path;return e&&this._index===e._segments.length-1||!1},reverse:function(){var e=this._handleIn,t=this._handleOut,n=e._x,i=e._y;e.set(t._x,t._y),t.set(n,i)},reversed:function(){return new N(this._point,this._handleOut,this._handleIn)},remove:function(){return!!this._path&&!!this._path.removeSegment(this._index)},clone:function(){return new N(this._point,this._handleIn,this._handleOut)},equals:function(e){return e===this||e&&this._class===e._class&&this._point.equals(e._point)&&this._handleIn.equals(e._handleIn)&&this._handleOut.equals(e._handleOut)||!1},toString:function(){var e=["point: "+this._point];return this._handleIn.isZero()||e.push("handleIn: "+this._handleIn),this._handleOut.isZero()||e.push("handleOut: "+this._handleOut),"{ "+e.join(", ")+" }"},transform:function(e){this._transformCoordinates(e,new Array(6),!0),this._changed()},_transformCoordinates:function(e,t,n){var i=this._point,r=n&&this._handleIn.isZero()?null:this._handleIn,a=n&&this._handleOut.isZero()?null:this._handleOut,o=i._x,s=i._y,l=2;return t[0]=o,t[1]=s,r&&(t[l++]=r._x+o,t[l++]=r._y+s),a&&(t[l++]=a._x+o,t[l++]=a._y+s),e&&(e._transformCoordinates(t,t,l/2),o=t[0],s=t[1],n?(i._x=o,i._y=s,l=2,r&&(r._x=t[l++]-o,r._y=t[l++]-s),a&&(a._x=t[l++]-o,a._y=t[l++]-s)):(r||(t[l++]=o,t[l++]=s),a||(t[l++]=o,t[l++]=s))),t}}),L=m.extend({initialize:function(e,t,n){var i,r,a;if(e)if((i=e[0])!==o)r=e[1];else{var s=e;(i=s.x)===o&&(s=m.read(arguments),i=s.x),r=s.y,a=s.selected}else i=r=0;this._x=i,this._y=r,this._owner=t,t[n]=this,a&&this.setSelected(!0)},set:function(e,t){return this._x=e,this._y=t,this._owner._changed(this),this},_serialize:function(e){var t=e.formatter,n=t.number(this._x),i=t.number(this._y);return this.isSelected()?{x:n,y:i,selected:!0}:[n,i]},getX:function(){return this._x},setX:function(e){this._x=e,this._owner._changed(this)},getY:function(){return this._y},setY:function(e){this._y=e,this._owner._changed(this)},isZero:function(){return d.isZero(this._x)&&d.isZero(this._y)},setSelected:function(e){this._owner.setSelected(e,this)},isSelected:function(){return this._owner.isSelected(this)}}),M=s.extend({_class:"Curve",initialize:function(e,t,n,i,r,a,o,s){var l,c,h,u,d,f,m=arguments.length;3===m?(this._path=e,l=t,c=n):0===m?(l=new N,c=new N):1===m?"segment1"in e?(l=new N(e.segment1),c=new N(e.segment2)):"point1"in e?(h=e.point1,d=e.handle1,f=e.handle2,u=e.point2):Array.isArray(e)&&(h=[e[0],e[1]],u=[e[6],e[7]],d=[e[2]-e[0],e[3]-e[1]],f=[e[4]-e[6],e[5]-e[7]]):2===m?(l=new N(e),c=new N(t)):4===m?(h=e,d=t,f=n,u=i):8===m&&(h=[e,t],u=[o,s],d=[n-e,i-t],f=[r-o,a-s]),this._segment1=l||new N(h,null,d),this._segment2=c||new N(u,f,null)},_serialize:function(e){return s.serialize(this.hasHandles()?[this.getPoint1(),this.getHandle1(),this.getHandle2(),this.getPoint2()]:[this.getPoint1(),this.getPoint2()],e,!0)},_changed:function(){this._length=this._bounds=o},clone:function(){return new M(this._segment1,this._segment2)},toString:function(){var e=["point1: "+this._segment1._point];return this._segment1._handleOut.isZero()||e.push("handle1: "+this._segment1._handleOut),this._segment2._handleIn.isZero()||e.push("handle2: "+this._segment2._handleIn),e.push("point2: "+this._segment2._point),"{ "+e.join(", ")+" }"},remove:function(){var e=!1;if(this._path){var t=this._segment2,n=t._handleOut;e=t.remove(),e&&this._segment1._handleOut.set(n.x,n.y)}return e},getPoint1:function(){return this._segment1._point},setPoint1:function(){var e=m.read(arguments);this._segment1._point.set(e.x,e.y)},getPoint2:function(){return this._segment2._point},setPoint2:function(){var e=m.read(arguments);this._segment2._point.set(e.x,e.y)},getHandle1:function(){return this._segment1._handleOut},setHandle1:function(){var e=m.read(arguments);this._segment1._handleOut.set(e.x,e.y)},getHandle2:function(){return this._segment2._handleIn},setHandle2:function(){var e=m.read(arguments);this._segment2._handleIn.set(e.x,e.y)},getSegment1:function(){return this._segment1},getSegment2:function(){return this._segment2},getPath:function(){return this._path},getIndex:function(){return this._segment1._index},getNext:function(){var e=this._path&&this._path._curves;return e&&(e[this._segment1._index+1]||this._path._closed&&e[0])||null},getPrevious:function(){var e=this._path&&this._path._curves;return e&&(e[this._segment1._index-1]||this._path._closed&&e[e.length-1])||null},isFirst:function(){return 0===this._segment1._index},isLast:function(){var e=this._path;return e&&this._segment1._index===e._curves.length-1||!1},isSelected:function(){return this.getPoint1().isSelected()&&this.getHandle2().isSelected()&&this.getHandle2().isSelected()&&this.getPoint2().isSelected()},setSelected:function(e){this.getPoint1().setSelected(e),this.getHandle1().setSelected(e),this.getHandle2().setSelected(e),this.getPoint2().setSelected(e)},getValues:function(e){return M.getValues(this._segment1,this._segment2,e)},getPoints:function(){for(var e=this.getValues(),t=[],n=0;n<8;n+=2)t.push(new m(e[n],e[n+1]));return t},getLength:function(){return null==this._length&&(this._length=M.getLength(this.getValues(),0,1)),this._length},getArea:function(){return M.getArea(this.getValues())},getLine:function(){return new x(this._segment1._point,this._segment2._point)},getPart:function(e,t){return new M(M.getPart(this.getValues(),e,t))},getPartLength:function(e,t){return M.getLength(this.getValues(),e,t)},getIntersections:function(e){return M._getIntersections(this.getValues(),e&&e!==this?e.getValues():null,this,e,[],{})},_getParameter:function(e,t){return t?e:e&&e.curve===this?e.parameter:e===o&&t===o?.5:this.getParameterAt(e,0)},divide:function(e,t,n){var i=this._getParameter(e,t),r=null;if(i>=4e-7&&i<=1-4e-7){var a=M.subdivide(this.getValues(),i),o=a[0],s=a[1],l=n||this.hasHandles(),c=this._segment1,h=this._segment2,u=this._path;l&&(c._handleOut.set(o[2]-o[0],o[3]-o[1]),h._handleIn.set(s[4]-s[6],s[5]-s[7]));var d=o[6],f=o[7],p=new N(new m(d,f),l&&new m(o[4]-d,o[5]-f),l&&new m(s[2]-d,s[3]-f));u?(u.insert(c._index+1,p),r=this.getNext()):(this._segment2=p,r=new M(p,h))}return r},split:function(e,t){return this._path?this._path.split(this._segment1._index,this._getParameter(e,t)):null},reversed:function(){return new M(this._segment2.reversed(),this._segment1.reversed())},clearHandles:function(){this._segment1._handleOut.set(0,0),this._segment2._handleIn.set(0,0)},statics:{getValues:function(e,t,n){var i=e._point,r=e._handleOut,a=t._handleIn,o=t._point,s=[i._x,i._y,i._x+r._x,i._y+r._y,o._x+a._x,o._y+a._y,o._x,o._y];return n&&n._transformCoordinates(s,s,4),s},subdivide:function(e,t){var n=e[0],i=e[1],r=e[2],a=e[3],s=e[4],l=e[5],c=e[6],h=e[7];t===o&&(t=.5);var u=1-t,d=u*n+t*r,f=u*i+t*a,m=u*r+t*s,p=u*a+t*l,g=u*s+t*c,v=u*l+t*h,w=u*d+t*m,y=u*f+t*p,b=u*m+t*g,x=u*p+t*v,_=u*w+t*b,E=u*y+t*x;return[[n,i,d,f,w,y,_,E],[_,E,b,x,g,v,c,h]]},solveCubic:function(e,t,n,i,r,a){var o=e[t],s=e[t+2],l=e[t+4],c=e[t+6],h=3*(s-o),u=3*(l-s)-h,f=c-o-h-u;return d.solveCubic(f,u,h,o-n,i,r,a)},getParameterOf:function(e,t){var n=new m(e[0],e[1]),i=new m(e[6],e[7]),r=t.isClose(n,1e-12)?0:t.isClose(i,1e-12)?1:null;if(null!==r)return r;for(var a=[t.x,t.y],o=[],s=0;s<2;s++)for(var l=M.solveCubic(e,s,a[s],o,0,1),c=0;c=0&&n<=1){var i=t.getDistance(M.getPoint(e,n),!0);if(i.999999999999?1:M.getParameterOf(e,new m(i+h*s,r+h*l))}for(var u=1/0,d=0,f=0;f<=100;f++)n(f/100);for(var p=.005;p>4e-7;)n(d-p)||n(d+p)||(p/=2);return d},getPart:function(e,t,n){var i=t>n;if(i){var r=t;t=n,n=r}return t>0&&(e=M.subdivide(e,t)[1]),n<1&&(e=M.subdivide(e,(n-t)/(1-t))[0]),i?[e[6],e[7],e[4],e[5],e[2],e[3],e[0],e[1]]:e},hasHandles:function(e){var t=d.isZero;return!(t(e[0]-e[2])&&t(e[1]-e[3])&&t(e[4]-e[6])&&t(e[5]-e[7]))},isFlatEnough:function(e,t){var n=e[0],i=e[1],r=e[2],a=e[3],o=e[4],s=e[5],l=e[6],c=e[7],h=3*r-2*n-l,u=3*a-2*i-c,d=3*o-2*l-n,f=3*s-2*c-i;return Math.max(h*h,d*d)+Math.max(u*u,f*f)<10*t*t},getArea:function(e){var t=e[0],n=e[1],i=e[6],r=e[7],a=(e[2]+t)/2,o=(e[3]+n)/2,s=(e[4]+e[6])/2,l=(e[5]+e[7])/2;return 6*((t-a)*(o+n)+(a-s)*(l+o)+(s-i)*(r+l))/10},getBounds:function(e){for(var t=e.slice(0,2),n=t.slice(),i=[0,0],r=0;r<2;r++)M._addBounds(e[r],e[r+2],e[r+4],e[r+6],r,0,t,n,i);return new w(t[0],t[1],n[0]-t[0],n[1]-t[1])},_addBounds:function(e,t,n,i,r,a,o,s,l){function c(e,t){var n=e-t,i=e+t;ns[r]&&(s[r]=i)}var h=3*(t-n)-e+i,u=2*(e+n)-4*t,f=t-e,m=d.solveQuadratic(h,u,f,l);c(i,0);for(var p=0;p=0&&r<=1&&a<=0&&a>=-1}return!1},isLinear:function(e,t,n){var i=e.divide(3);return t.equals(i)&&n.negate().equals(i)}},function(e,t){this[t]=function(){var t=this._segment1,n=this._segment2;return e(n._point.subtract(t._point),t._handleOut,n._handleIn)},this.statics[t]=function(t){var n=t[0],i=t[1],r=t[6],a=t[7];return e(new m(r-n,a-i),new m(t[2]-n,t[3]-i),new m(t[4]-r,t[5]-a))}},{statics:{},hasHandles:function(){return!this._segment1._handleOut.isZero()||!this._segment2._handleIn.isZero()},isCollinear:function(e){return e&&this.isStraight()&&e.isStraight()&&this.getLine().isCollinear(e.getLine())},isHorizontal:function(){return this.isStraight()&&Math.abs(this.getTangentAt(.5,!0).y)<1e-7},isVertical:function(){return this.isStraight()&&Math.abs(this.getTangentAt(.5,!0).x)<1e-7}}),{beans:!1,getParameterAt:function(e,t){return M.getParameterAt(this.getValues(),e,t)},getParameterOf:function(){return M.getParameterOf(this.getValues(),m.read(arguments))},getLocationAt:function(e,t){var n=t?e:this.getParameterAt(e);return null!=n&&n>=0&&n<=1?new I(this,n):null},getLocationOf:function(){return this.getLocationAt(this.getParameterOf(m.read(arguments)),!0)},getOffsetOf:function(){var e=this.getLocationOf.apply(this,arguments);return e?e.getOffset():null},getNearestLocation:function(){var e=m.read(arguments),t=this.getValues(),n=M.getNearestParameter(t,e),i=M.getPoint(t,n);return new I(this,n,i,null,e.getDistance(i))},getNearestPoint:function(){return this.getNearestLocation.apply(this,arguments).getPoint()}},new function(){var e=["getPoint","getTangent","getNormal","getWeightedTangent","getWeightedNormal","getCurvature"];return s.each(e,function(e){this[e+"At"]=function(t,n){var i=this.getValues();return M[e](i,n?t:M.getParameterAt(i,t,0))}},{statics:{evaluateMethods:e}})},new function(){function e(e){var t=e[0],n=e[1],i=e[2],r=e[3],a=e[4],o=e[5],s=e[6],l=e[7],c=9*(i-a)+3*(s-t),h=6*(t+a)-12*i,u=3*(i-t),d=9*(r-o)+3*(l-n),f=6*(n+o)-12*r,m=3*(r-n);return function(e){var t=(c*e+h)*e+u,n=(d*e+f)*e+m;return Math.sqrt(t*t+n*n)}}function t(e,t){return Math.max(2,Math.min(16,Math.ceil(32*Math.abs(t-e))))}function n(e,t,n,i){if(null==t||t<0||t>1)return null;var r,a,o=e[0],s=e[1],l=e[2],c=e[3],h=e[4],u=e[5],d=e[6],f=e[7];if(0===n&&(t<4e-7||t>1-4e-7)){var p=t<4e-7;r=p?o:d,a=p?s:f}else{var g=3*(l-o),v=3*(h-l)-g,w=d-o-g-v,y=3*(c-s),b=3*(u-c)-y,x=f-s-y-b;if(0===n)r=((w*t+v)*t+g)*t+o,a=((x*t+b)*t+y)*t+s;else{if(t<4e-7?(r=g,a=y):t>1-4e-7?(r=3*(d-h),a=3*(f-u)):(r=(3*w*t+2*v)*t+g,a=(3*x*t+2*b)*t+y),i){0===r&&0===a&&(t<4e-7||t>1-4e-7)&&(r=h-l,a=u-c);var _=Math.sqrt(r*r+a*a);_&&(r/=_,a/=_)}if(3===n){var E=6*w*t+2*v,C=6*x*t+2*b,k=Math.pow(r*r+a*a,1.5);r=0!==k?(r*C-a*E)/k:0,a=0}}}return 2===n?new m(a,-r):new m(r,a)}return{statics:{getLength:function(n,i,r){if(i===o&&(i=0),r===o&&(r=1),0===i&&1===r&&M.isStraight(n)){var a=n[6]-n[0],s=n[7]-n[1];return Math.sqrt(a*a+s*s)}var l=e(n);return d.integrate(l,i,r,t(i,r))},getParameterAt:function(n,i,r){function a(e){return p+=d.integrate(u,r,e,t(r,e)),r=e,p-i}if(r===o&&(r=i<0?1:0),0===i)return r;var s=Math.abs,l=i>0,c=l?r:0,h=l?1:r,u=e(n),f=d.integrate(u,c,h,t(c,h));if(s(i-f)<1e-12)return l?h:c;if(s(i)>f)return null;var m=i/f,p=0;return d.findRoot(a,u,r+m,c,h,32,1e-12)},getPoint:function(e,t){return n(e,t,0,!1)},getTangent:function(e,t){return n(e,t,1,!0)},getWeightedTangent:function(e,t){return n(e,t,1,!1)},getNormal:function(e,t){return n(e,t,2,!0)},getWeightedNormal:function(e,t){return n(e,t,2,!1)},getCurvature:function(e,t){return n(e,t,3,!1).x}}}},new function(){function e(e,t,n,i,r,a,o,s,l,c,h){var u=t.startConnected,d=t.endConnected;if(null==r&&(r=M.getParameterOf(n,a)),null!==r&&r>=(u?4e-7:0)&&r<=(d?1-4e-7:1)&&(null==l&&(l=M.getParameterOf(o,c)),null!==l&&l>=(d?4e-7:0)&&l<=(u?1-4e-7:1))){var f=t.renormalize;if(f){var m=f(r,l);r=m[0],l=m[1]}var p=new I(i,r,a||M.getPoint(n,r),h),g=new I(s,l,c||M.getPoint(o,l),h),v=p.getPath()===g.getPath()&&p.getIndex()>g.getIndex(),w=v?g:p,y=t.include;p._intersection=g,g._intersection=p,y&&!y(w)||I.insert(e,w,!0)}}function t(r,a,o,s,l,c,h,u,d,f,m,p,g){if(!(++g>=24)){var v,w,y=a[0],b=a[1],_=a[6],E=a[7],C=x.getSignedDistance,k=C(y,b,_,E,a[2],a[3]),S=C(y,b,_,E,a[4],a[5]),z=k*S>0?.75:4/9,T=z*Math.min(0,k,S),P=z*Math.max(0,k,S),B=C(y,b,_,E,r[0],r[1]),N=C(y,b,_,E,r[2],r[3]),L=C(y,b,_,E,r[4],r[5]),I=C(y,b,_,E,r[6],r[7]),A=n(B,N,L,I),O=A[0],j=A[1];if(null!=(v=i(O,j,T,P))&&null!=(w=i(O.reverse(),j.reverse(),T,P))){r=M.getPart(r,v,w);var D=w-v,q=h+(u-h)*v,F=h+(u-h)*w;if(m>.5&&D>.5)if(F-q>f-d){var G=M.subdivide(r,.5),V=q+(F-q)/2;t(a,G[0],s,o,l,c,d,f,q,V,D,!p,g),t(a,G[1],s,o,l,c,d,f,V,F,D,!p,g)}else{var G=M.subdivide(a,.5),V=d+(f-d)/2;t(G[0],r,s,o,l,c,d,V,q,F,D,!p,g),t(G[1],r,s,o,l,c,V,f,q,F,D,!p,g)}else if(Math.max(f-d,F-q)<1e-7){var R=q+(F-q)/2,W=d+(f-d)/2;r=o.getValues(),a=s.getValues(),e(l,c,p?a:r,p?s:o,p?W:R,null,p?r:a,p?o:s,p?R:W,null)}else D>1e-12&&t(a,r,s,o,l,c,d,f,q,F,D,!p,g)}}}function n(e,t,n,i){var r,a=[0,e],o=[1/3,t],s=[2/3,n],l=[1,i],c=t-(2*e+i)/3,h=n-(e+2*i)/3;if(c*h<0)r=[[a,o,l],[a,s,l]];else{var u=c/h;r=[u>=2?[a,o,l]:u<=.5?[a,s,l]:[a,o,s,l],[a,l]]}return(c||h)<0?r.reverse():r}function i(e,t,n,i){return e[0][1]i?r(t,!1,i):e[0][0]}function r(e,t,n){for(var i=e[0][0],r=e[0][1],a=1,o=e.length;a=n:l<=n)return l===n?s:i+(n-r)*(s-i)/(l-r);i=s,r=l}return null}function a(t,n,i,r,a,o){for(var s=M.isStraight(t),l=s?n:t,c=s?t:n,h=c[0],u=c[1],f=c[6],m=c[7],p=f-h,g=m-u,v=Math.atan2(-g,p),w=Math.sin(v),y=Math.cos(v),b=[],x=0;x<8;x+=2){var _=l[x]-h,E=l[x+1]-u;b.push(_*y-E*w,_*w+E*y)}for(var C=[],k=M.solveCubic(b,1,0,C,0,1),x=0;xd.CURVETIME_EPSILON)&&e(a,o,t,i,B,s?P:z,n,r,N,s?z:P)}}}function o(t,n,i,r,a,o){var s=x.intersect(t[0],t[1],t[6],t[7],n[0],n[1],n[6],n[7]);s&&e(a,o,t,i,null,s,n,r,null,s)}return{statics:{_getIntersections:function(n,i,r,s,l,c){if(!i)return M._getSelfIntersection(n,r,l,c);var h=n[0],u=n[1],d=n[6],f=n[7],p=i[0],g=i[1],v=i[6],w=i[7],y=(3*n[2]+h)/4,b=(3*n[3]+u)/4,x=(3*n[4]+d)/4,_=(3*n[5]+f)/4,E=(3*i[2]+p)/4,C=(3*i[3]+g)/4,k=(3*i[4]+v)/4,S=(3*i[5]+w)/4,z=Math.min,T=Math.max;if(!(T(h,y,x,d)>=z(p,E,k,v)&&z(h,y,x,d)<=T(p,E,k,v)&&T(u,b,_,f)>=z(g,C,S,w)&&z(u,b,_,f)<=T(g,C,S,w)))return l;if(!c.startConnected&&!c.endConnected){var P=M.getOverlaps(n,i);if(P){for(var B=0;B<2;B++){var N=P[B];e(l,c,n,r,N[0],null,i,s,N[1],null,!0)}return l}}var L=M.isStraight(n),I=M.isStraight(i),A=L&&I,O=l.length;if((A?o:L||I?a:t)(n,i,r,s,l,c,0,1,0,1,0,!1,0),A&&l.length>O)return l;var j=new m(h,u),D=new m(d,f),q=new m(p,g),F=new m(v,w);return j.isClose(q,1e-12)&&e(l,c,n,r,0,j,i,s,0,q),!c.startConnected&&j.isClose(F,1e-12)&&e(l,c,n,r,0,j,i,s,1,F),!c.endConnected&&D.isClose(q,1e-12)&&e(l,c,n,r,1,D,i,s,0,q),D.isClose(F,1e-12)&&e(l,c,n,r,1,D,i,s,1,F),l},_getSelfIntersection:function(e,t,n,i){var r=e[0],a=e[1],o=e[2],s=e[3],l=e[4],c=e[5],h=e[6],u=e[7],f=new x(r,a,h,u,!1),p=f.getSide(new m(o,s),!0);if(p===f.getSide(new m(l,c),!0)&&((r-l)*(s-u)+(o-h)*(c-a))*p>0)return n;var g=h-3*l+3*o-r,v=l-2*o+r,w=o-r,y=u-3*c+3*s-a,b=c-2*s+a,_=s-a,E=y*w-g*_;if(E*E-4*(y*v-g*b)*(b*w-v*_)<0){var C,k=[],S=d.solveCubic(g*g+y*y,3*(g*v+y*b),2*(v*v+b*b)+g*w+y*_,v*w+b*_,k,0,1);if(S>0){for(var z=0,T=0;zT&&(T=P,C=k[z])}var B=M.subdivide(e,C);i.endConnected=!0,i.renormalize=function(e,t){return[e*C,t*(1-C)+C]},M._getIntersections(B[0],B[1],t,t,n,i)}}return n},getOverlaps:function(e,t){function n(e){var t=e[6]-e[0],n=e[7]-e[1];return t*t+n*n}var i=Math.abs,r=M.isStraight(e),a=M.isStraight(t),o=r&&a;if(o){var s=n(e)2e-7||h.getDistance(new m(c[6],c[7]))>2e-7)return null}else if(r^a)return null;for(var u=[e,t],d=[],f=0,p=0;f<2&&d.length<2;f+=0===p?0:1,p^=1){var g=M.getParameterOf(u[1^f],new m(u[f][0===p?0:6],u[f][0===p?1:7]));if(null!=g){var v=0===f?[p,g]:[g,p];(0===d.length||i(v[0]-d[0][0])>4e-7&&i(v[1]-d[0][1])>4e-7)&&d.push(v)}if(1===f&&0===d.length)break}if(2!==d.length)d=null;else if(!o){var w=M.getPart(e,d[0][0],d[1][0]),y=M.getPart(t,d[0][1],d[1][1]);(i(y[2]-w[2])>2e-7||i(y[3]-w[3])>2e-7||i(y[4]-w[4])>2e-7||i(y[5]-w[5])>2e-7)&&(d=null)}return d}}}}),I=s.extend({_class:"CurveLocation",beans:!0,initialize:function e(t,n,i,r,a){if(n>.9999996){var o=t.getNext();o&&(n=0,t=o)}this._id=f.get(e),this._setCurve(t),this._parameter=n,this._point=i||t.getPointAt(n,!0),this._overlap=r,this._distance=a,this._intersection=this._next=this._prev=null},_setCurve:function(e){var t=e._path;this._version=t?t._version:0,this._curve=e,this._segment=null,this._segment1=e._segment1,this._segment2=e._segment2},_setSegment:function(e){this._setCurve(e.getCurve()),this._segment=e,this._parameter=e===this._segment1?0:1,this._point=e._point.clone()},getSegment:function(){var e=this.getCurve(),t=this._segment;if(!t){var n=this.getParameter();0===n?t=e._segment1:1===n?t=e._segment2:null!=n&&(t=e.getPartLength(0,n)t&&et&&e<=l||e>=-l&&e=4e-7&&n<=1-4e-7||i>=4e-7&&i<=1-4e-7)return!this.isTouching();var r=this.getCurve(),a=r.getPrevious(),o=t.getCurve(),s=o.getPrevious(),l=Math.PI;if(!a||!s)return!1;var c=a.getTangentAt(1-4e-7,!0).negate().getAngleInRadians(),h=r.getTangentAt(4e-7,!0).getAngleInRadians(),u=s.getTangentAt(1-4e-7,!0).negate().getAngleInRadians(),d=o.getTangentAt(4e-7,!0).getAngleInRadians();return e(u,c,h)^e(d,c,h)&&e(u,h,c)^e(d,h,c)},isOverlap:function(){return!!this._overlap}},s.each(M.evaluateMethods,function(e){var t=e+"At";this[e]=function(){var e=this.getParameter(),n=this.getCurve();return null!=e&&n&&n[t](e,!0)}},{preserve:!0}),new function(){function e(e,t,n){function i(n,i){for(var a=n+i;a>=-1&&a<=r;a+=i){var o=e[(a%r+r)%r];if(!t.getPoint().isClose(o.getPoint(),2e-7))break;if(t.equals(o))return o}return null}for(var r=e.length,a=0,o=r-1;a<=o;){var s,l=a+o>>>1,c=e[l];if(n&&(s=t.equals(c)?c:i(l,-1)||i(l,1)))return t._overlap&&(s._overlap=s._intersection._overlap=!0),s;var h=t.getPath(),u=c.getPath();(h===u?t.getIndex()+t.getParameter()-(c.getIndex()+c.getParameter()):h._id-u._id)<0?o=l-1:a=l+1}return e.splice(a,0,t),t}return{statics:{insert:e,expand:function(t){for(var n=t.slice(),i=0,r=t.length;i0?this.setSegments(t):(this._curves=o,this._selectedSegmentState=0,t||"string"!=typeof e||(this.setPathData(e),e=null)),this._initialize(!t&&e)},_equals:function(e){return this._closed===e._closed&&s.equals(this._segments,e._segments)},clone:function(e){var t=new O(C.NO_INSERT);return t.setSegments(this._segments),t._closed=this._closed,this._clockwise!==o&&(t._clockwise=this._clockwise),this._clone(t,e)},_changed:function e(t){if(e.base.call(this,t),8&t){var n=this._parent;if(n&&(n._currentPath=o),this._length=this._area=this._clockwise=this._monoCurves=o,16&t)this._version++;else if(this._curves)for(var i=0,r=this._curves.length;i0&&this._add(N.readAll(e)),t&&this.setFullySelected(!0)},getFirstSegment:function(){return this._segments[0]},getLastSegment:function(){return this._segments[this._segments.length-1]},getCurves:function(){var e=this._curves,t=this._segments;if(!e){var n=this._countCurves();e=this._curves=new Array(n);for(var i=0;i0&&(n(d[0],!0),v.push("z")),v.join("")}},{isEmpty:function(){return 0===this._segments.length},_transformContent:function(e){for(var t=new Array(6),n=0,i=this._segments.length;n0?e-1:e},add:function(e){return arguments.length>1&&"number"!=typeof e?this._add(N.readAll(arguments)):this._add([N.read(arguments)])[0]},insert:function(e,t){return arguments.length>2&&"number"!=typeof t?this._add(N.readAll(arguments,1),e):this._add([N.read(arguments,1)],e)[0]},addSegment:function(){return this._add([N.read(arguments)])[0]},insertSegment:function(e){return this._add([N.read(arguments,1)],e)[0]},addSegments:function(e){return this._add(N.readAll(e))},insertSegments:function(e,t){return this._add(N.readAll(t),e)},removeSegment:function(e){return this.removeSegments(e,e+1)[0]||null},removeSegments:function(e,t,n){e=e||0,t=s.pick(t,this._segments.length);var i=this._segments,r=this._curves,a=i.length,o=i.splice(e,t-e),l=o.length;if(!l)return o;for(var c=0;c0&&t===a+(this._closed?1:0)?e-1:e,r=r.splice(d,l);n&&(o._curves=r.slice(1)),this._adjustCurves(d,d)}return this._changed(25),o},clear:"#removeSegments",hasHandles:function(){for(var e=this._segments,t=0,n=e.length;t=0},setClockwise:function(e){this.isClockwise()!=(e=!!e)&&this.reverse(),this._clockwise=e},isFullySelected:function(){var e=this._segments.length;return this._selected&&e>0&&this._selectedSegmentState===7*e},setFullySelected:function(e){e&&this._selectSegments(!0),this.setSelected(e)},setSelected:function e(t){t||this._selectSegments(!1),e.base.call(this,t)},_selectSegments:function(e){var t=this._segments.length;this._selectedSegmentState=e?7*t:0;for(var n=0;n0&&this.setSelected(!0)},flatten:function(e){for(var t=new D(this,64,.1),n=0,i=t.length/Math.ceil(t.length/e),r=t.length+(this._closed?-i:i)/2,a=[];n<=r;)a.push(new N(t.getPointAt(n))),n+=i;this.setSegments(a)},reduce:function(){for(var e=this.getCurves(),t=e.length-1;t>=0;t--){var n=e[t];n.hasHandles()||0!==n.getLength()&&!n.isCollinear(n.getNext())||n.remove()}return this},simplify:function(e){if(this._segments.length>2){var t=new q(this,e||2.5);this.setSegments(t.fit())}},split:function(e,t){if(null===t)return null;if(1===arguments.length){var n=e;if("number"==typeof n&&(n=this.getLocationAt(n)),!n)return null;e=n.index,t=n.parameter}t>=1-4e-7&&(e++,t--);var i=this.getCurves();if(e>=0&&e=4e-7&&i[e++].divide(t,!0);var r,a=this.removeSegments(e,this._segments.length,!0);return this._closed?(this.setClosed(!1),r=this):(r=new O(C.NO_INSERT),r.insertAbove(this,!0),this._clone(r)),r._add(a,0),this.addSegment(a[0]),r}return null},reverse:function(){this._segments.reverse();for(var e=0,t=this._segments.length;e0&&t._index0||E?0:null;if(null!==C&&(C>0?(s=p.getStrokeJoin(),l=p.getStrokeCap(),c=C*p.getMiterLimit(),b=y.add(new m(C,C))):s=l="round"),!t.ends||t.segments||w){if(t.segments||t.handles)for(var k=0;k1?o(u.getSegment())||(u=null):n(u.getPoint(),b)||(u=null)}if(!u&&"miter"===s&&v>1)for(var k=0;ke)return a.getLocationAt(e-l)}return n.length>0&&e<=this.getLength()?new I(n[n.length-1],1):null},getNearestLocation:function(){for(var e=m.read(arguments),t=this.getCurves(),n=1/0,i=null,r=0,a=t.length;r0&&i(d[0])}return{_draw:function(e,n,i){function r(e){return u[(e%d+d)%d]}var o=n.dontStart,s=n.dontFinish||n.clip,l=this.getStyle(),c=l.hasFill(),h=l.hasStroke(),u=l.getDashArray(),d=!a.support.nativeDash&&h&&u&&u.length;if(o||e.beginPath(),!o&&this._currentPath?e.currentPath=this._currentPath:(c||h&&!d||s)&&(t(e,this,i),this._closed&&e.closePath(),o||(this._currentPath=e.currentPath)),!s&&(c||h)&&(this._setStyles(e),c&&(e.fill(l.getWindingRule()),e.shadowColor="rgba(0,0,0,0)"),h)){if(d){o||e.beginPath();var f,m=new D(this,32,.25,i),p=m.length,g=-l.getDashOffset(),v=0;for(g%=p;g>0;)g-=r(v--)+r(v--);for(;g0||f>0)&&m.drawPart(e,Math.max(g,0),Math.max(f,0)),g=f+r(v++)}e.stroke()}},_drawSelected:function(n,i){n.beginPath(),t(n,this,i),n.stroke(),e(n,this._segments,i,a.settings.handleSize)}}},new function(){function e(e){var t=e.length,n=[],i=[],r=2;n[0]=e[0]/r;for(var a=1;a1&&(C*=B,k*=B,S=C*C,z=k*k),B=(S*z-S*P-z*T)/(S*P+z*T),E(B)<1e-12&&(B=0),B<0)throw new Error("Cannot create an arc with the given arguments");n=new m(C*_/k,-k*y/C).multiply((v===u?-1:1)*Math.sqrt(B)).rotate(p).add(d),a=(new b).translate(n).rotate(p).scale(C,k),r=a._inverseTransform(l),i=r.getDirectedAngle(a._inverseTransform(c)),!u&&i>0?i-=360:u&&i<0&&(i+=360)}if(t){var L=new x(l.add(t).divide(2),t.subtract(l).rotate(90),!0),M=new x(t.add(c).divide(2),c.subtract(t).rotate(90),!0),I=new x(l,c),A=I.getSide(t);if(!(n=L.intersect(M,!0))){if(!A)return this.lineTo(c);throw new Error("Cannot create an arc with the given arguments")}r=l.subtract(n),i=r.getDirectedAngle(c.subtract(n));var O=I.getSide(n);0===O?i=A*Math.abs(i):A===O&&(i+=i<0?360:-360)}for(var j=Math.abs(i),D=j>=360?4:Math.ceil(j/90),q=i/D,F=q*Math.PI/360,G=4/3*Math.sin(F)/(1+Math.cos(F)),V=[],R=0;R<=D;R++){var w=c,W=null;if(R0&&(s(e[0],f),s(e[e.length-1],f)),u},_getPenPadding:function(e,t){if(!t)return[e,e];var n=t.shiftless(),i=n.transform(new m(e,0)),r=n.transform(new m(0,e)),a=i.getAngleInRadians(),o=i.getLength(),s=r.getLength(),l=Math.sin(a),c=Math.cos(a),h=Math.tan(a),u=-Math.atan(s*h/o),d=Math.atan(s/(h*o));return[Math.abs(o*Math.cos(u)*c-s*Math.sin(u)*l),Math.abs(s*Math.sin(d)*c+o*Math.cos(d)*l)]},_addBevelJoin:function(e,t,n,i,r,a){var o=e.getCurve(),s=o.getPrevious(),l=o.getPointAt(0,!0),c=s.getNormalAt(1,!0),h=o.getNormalAt(0,!0),u=c.getDirectedAngle(h)<0?-n:n;if(c.setLength(u),h.setLength(u),a&&(r(l),r(l.add(c))),"miter"===t){var d=new x(l.add(c),new m(-c.y,c.x),!0).intersect(new x(l.add(h),new m(-h.y,h.x),!0),!0);if(d&&l.getDistance(d)<=i&&(r(d),!a))return}a||r(l.add(c)),r(l.add(h))},_addSquareCap:function(e,t,n,i,r){var a=e._point,o=e.getLocation(),s=o.getNormal().multiply(n);r&&(i(a.subtract(s)),i(a.add(s))),"square"===t&&(a=a.add(s.rotate(0===o.getParameter()?-90:90))),i(a.add(s)),i(a.subtract(s))},getHandleBounds:function(e,t,n,i,r,a){for(var o=new Array(6),s=1/0,l=-s,c=s,h=l,u=0,d=e.length;ul&&(l=x),_h&&(h=E)}}return new w(s,c,l-s,h-c)},getRoughBounds:function(e,t,n,i){var r=n.hasStroke()?n.getStrokeWidth()/2:0,a=r;return r>0&&("miter"===n.getStrokeJoin()&&(a=r*n.getMiterLimit()),"square"===n.getStrokeCap()&&(a=Math.max(a,r*Math.sqrt(2)))),O.getHandleBounds(e,t,n,i,O._getPenPadding(r,i),O._getPenPadding(a,i))}}});O.inject({statics:new function(){function e(e,t,n){var i=s.getNamed(n),r=new O(i&&!1===i.insert&&C.NO_INSERT);return r._add(e),r._closed=t,r.set(i)}function t(t,n,r){for(var a=new Array(4),o=0;o<4;o++){var s=i[o];a[o]=new N(s._point.multiply(n).add(t),s._handleIn.multiply(n),s._handleOut.multiply(n))}return e(a,!0,r)}var n=.5522847498307936,i=[new N([-1,0],[0,n],[0,-n]),new N([0,-1],[-n,0],[n,0]),new N([1,0],[0,-n],[0,n]),new N([0,1],[n,0],[-n,0])];return{Line:function(){return e([new N(m.readNamed(arguments,"from")),new N(m.readNamed(arguments,"to"))],!1,arguments)},Circle:function(){var e=m.readNamed(arguments,"center"),n=s.readNamed(arguments,"radius");return t(e,new g(n),arguments)},Rectangle:function(){var t,i=w.readNamed(arguments,"rectangle"),r=g.readNamed(arguments,"radius",0,{readNull:!0}),a=i.getBottomLeft(!0),o=i.getTopLeft(!0),s=i.getTopRight(!0),l=i.getBottomRight(!0);if(!r||r.isZero())t=[new N(a),new N(o),new N(s),new N(l)];else{r=g.min(r,i.getSize(!0).divide(2));var c=r.width,h=r.height,u=c*n,d=h*n;t=[new N(a.add(c,0),null,[-u,0]),new N(a.subtract(0,h),[0,d]),new N(o.add(0,h),null,[0,-d]),new N(o.add(c,0),[-u,0],null),new N(s.subtract(c,0),null,[u,0]),new N(s.add(0,h),[0,-d],null),new N(l.subtract(0,h),null,[0,d]),new N(l.subtract(c,0),[u,0])]}return e(t,!0,arguments)},RoundRectangle:"#Rectangle",Ellipse:function(){var e=z._readEllipse(arguments);return t(e.center,e.radius,arguments)},Oval:"#Ellipse",Arc:function(){var e=m.readNamed(arguments,"from"),t=m.readNamed(arguments,"through"),n=m.readNamed(arguments,"to"),i=s.getNamed(arguments),r=new O(i&&!1===i.insert&&C.NO_INSERT);return r.moveTo(e),r.arcTo(t,n),r.set(i)},RegularPolygon:function(){for(var t=m.readNamed(arguments,"center"),n=s.readNamed(arguments,"sides"),i=s.readNamed(arguments,"radius"),r=360/n,a=!(n%3),o=new m(0,a?-i:i),l=a?-1:.5,c=new Array(n),h=0;h=0;r--){var a=n[r];a instanceof j&&(n.splice.apply(n,[r,1].concat(a.removeChildren())),a.remove())}n=e.base.call(this,t,n,i,O);for(var r=0,s=!i&&n&&n.length;r=0;n--){var i=t[n].reduce();i.isEmpty()&&t.splice(n,1)}if(0===t.length){var i=new O(C.NO_INSERT);return i.insertAbove(this),i.setStyle(this._style),this.remove(),i}return e.base.call(this)},isClockwise:function(){var e=this.getFirstChild();return e&&e.isClockwise()},setClockwise:function(e){this.isClockwise()!==!!e&&this.reverse()},getFirstSegment:function(){var e=this.getFirstChild();return e&&e.getFirstSegment()},getLastSegment:function(){var e=this.getLastChild();return e&&e.getLastSegment()},getCurves:function(){for(var e=this._children,t=[],n=0,i=e.length;n=0;u--){var d=l[u].split();d&&(a(d)&&d.getFirstSegment().setHandleIn(0,0),o.getLastSegment().setHandleOut(0,0))}return a(o),t(k,h,n,i)}function r(e,t){for(var n=e;n;){if(n===t)return;n=n._prev}for(;e._next&&e._next!==t;)e=e._next;if(!e._next){for(;t._prev;)t=t._prev;e._next=t,t._prev=e}}function a(e){for(var t,n,i=!1,a=[],o=e.length-1;o>=0;o--){var s=e[o],l=s._curve,c=s._parameter,h=c;l!==t?i=!l.hasHandles():n>0&&(c/=n);var u;c<4e-7?u=l._segment1:c>1-4e-7?u=l._segment2:(u=l.divide(c,!0,!0)._segment1,i&&a.push(u)),s._setSegment(u);var d=u._intersection,f=s._intersection;if(d){r(d,f);for(var m=d;m;)r(m._intersection,d),m=m._next}else u._intersection=f;t=l,n=h}for(var o=0,p=a.length;o0)for(var b=c.length-1;b>=0;b--){var x=M.getPoint(y,c[b]).y;xu?u=x:x>g&&x-1/0&&(s=o(new m(r,u),t,!1,i)),f<1/0&&(l=o(new m(r,f),t,!1,i))}else for(var _,E,C=r-2e-7,k=r+2e-7,S=!1,v=0,w=t.length;v=y[1]&&a<=y[7]||a>=y[7]&&a<=y[1])&&1===M.solveCubic(y,1,a,c,0,1)){var P=c[0];if(!(P>1-4e-7&&S&&z.next!==t[v+1]||P<4e-7&&E>1-4e-7&&z.previous===_)){var B=M.getPoint(y,P).x,N=M.getTangent(y,P).y,L=!1;d.isZero(N)&&!M.isStraight(y)||P<4e-7&&N*M.getTangent(z.previous.values,1).y<0||P>1-4e-7&&N*M.getTangent(z.next.values,0).y<0?i&&B>=C&&B<=k&&(++s,++l,L=!0):B<=C?(s+=T,L=!0):B>=k&&(l+=T,L=!0),z.previous!==t[v-1]&&(S=P<4e-7&&L)}_=z,E=P}}return Math.max(h(s),h(l))}function s(e,t,n,i,r){var a=[],s=e,l=0,c=0;do{var h=e.getCurve(),u=h.getLength();a.push({segment:e,curve:h,length:u}),l+=u,e=e.getNext()}while(e&&!e._intersection&&e!==s);for(var d=0;d<3;d++)for(var u=l*(d+1)/4,f=0,m=a.length;f=0;_--)a[_].segment._winding=x}function l(e,t){function n(e,t){if(e._visited)return!1;if(!h)return!0;var n=e._winding,i=e._intersection;return i&&t&&u&&i.isOverlap()&&(n=u[n]||n),h(n)}function i(e){return e===o||e===s}function r(e,t){if(!e._next)return e;for(;e;){var r=e._segment,a=r.getNext(),o=a._intersection;if(i(a)||!r._visited&&!a._visited&&(!h||(!t||n(r))&&(!(t&&o&&o.isOverlap())&&n(a)||!t&&o&&n(o._segment))))return e;e=e._next}return null}function a(e,t){for(;e;){var n=e._segment;if(i(n))return n;e=e[t?"_next":"_prev"]}}for(var o,s,l=[],h=c[t],u={unite:{1:2},intersect:{2:1}}[t],f=0,m=e.length;fr?-1:1,previous:n,next:null};n&&(n.next=a),i.push(a),n=a}function t(t){if(0!==M.getLength(t)){var n=t[1],i=t[3],r=t[5],a=t[7];if(M.isStraight(t))e(t);else{var o=3*(i-r)-n+a,s=2*(n+r)-4*i,l=i-n,c=[],h=d.solveQuadratic(o,s,l,c,4e-7,1-4e-7);if(0===h)e(t);else{c.sort();var u=c[0],f=M.subdivide(t,u);e(f[0]),h>1&&(u=(c[1]-u)/(1-u),f=M.subdivide(f[1],u),e(f[0])),e(f[1])}}}}var n,i=this._monoCurves;if(!i){i=this._monoCurves=[];for(var r=this.getCurves(),a=this._segments,o=0,s=r.length;o1){var l=a[a.length-1]._point,c=a[0]._point,h=l._x,u=l._y,f=c._x,m=c._y;t([h,u,h,u,f,m,f,m])}if(i.length>0){var p=i[0],g=i[i.length-1];p.previous=g,g.next=p}}return i},getInteriorPoint:function(){var e=this.getBounds(),t=e.getCenter(!0);if(!this.contains(t)){for(var n=this._getMonoCurves(),i=[],r=t.y,a=[],o=0,s=n.length;o=l[1]&&r<=l[7]||r>=l[7]&&r<=l[1])&&M.solveCubic(l,1,r,i,0,1)>0)for(var c=i.length-1;c>=0;c--)a.push(M.getPoint(l,i[c]).x);if(a.length>1)break}t.x=(a[0]+a[1])/2}return t},reorient:function(){return this.setClockwise(!0),this}}),j.inject({_getMonoCurves:function(){for(var e=this._children,t=[],n=0,i=e.length;n0){this.addChildren(e);for(var t=e[0].isClockwise(),n=1,i=e.length;n=0;o--)e[o].contains(r)&&a++;e[n].setClockwise(a%2==0&&t)}}return this}});var D=s.extend({_class:"PathIterator",initialize:function(e,t,n,i){function r(e,t){var n=M.getValues(e,t,i);s.push(n),a(n,e._index,0,1)}function a(e,t,i,r){if(r-i>h&&!M.isFlatEnough(e,n||.25)){var o=M.subdivide(e,.5),s=(i+r)/2;a(o[0],t,i,s),a(o[1],t,s,r)}else{var u=e[6]-e[0],d=e[7]-e[1],f=Math.sqrt(u*u+d*d);f>1e-6&&(c+=f,l.push({offset:c,value:r,index:t}))}}for(var o,s=[],l=[],c=0,h=1/(t||32),u=e._segments,d=u[0],f=1,m=u.length;f=e){this.index=t;var a=this.parts[t-1],o=a&&a.index==r.index?a.value:0,s=a?a.offset:0;return{value:o+(r.value-o)*(e-s)/(r.offset-s),index:r.index}}}var r=this.parts[this.parts.length-1];return{value:1,index:r.index}},drawPart:function(e,t,n){t=this.getParameterAt(t),n=this.getParameterAt(n);for(var i=t.index;i<=n.index;i++){var r=M.getPart(this.curves[i],i==t.index?t.value:0,i==n.index?n.value:1);i==t.index&&e.moveTo(r[0],r[1]),e.bezierCurveTo.apply(e,r.slice(2))}}},s.each(M.evaluateMethods,function(e){this[e+"At"]=function(t,n){var i=this.getParameterAt(t);return M[e](this.curves[i.index],i.value,n)}},{})),q=s.extend({initialize:function(e,t){for(var n,i=this.points=[],r=e._segments,a=0,o=r.length;a0?[new N(e[0])]:[];return t>1&&this.fitCubic(0,t-1,e[1].subtract(e[0]).normalize(),e[t-2].subtract(e[t-1]).normalize()),this.closed&&(n.shift(),n.pop()),n},fitCubic:function(e,t,n,i){if(t-e==1){var r=this.points[e],a=this.points[t],o=r.getDistance(a)/3;return void this.addCurve([r,r.add(n.normalize(o)),a.add(i.normalize(o)),a])}for(var s,l=this.chordLengthParameterize(e,t),c=Math.max(this.error,this.error*this.error),h=!0,u=0;u<=4;u++){var d=this.generateBezier(e,t,l,n,i),f=this.findMaxError(e,t,d,l);if(f.error=c)break;h=this.reparameterize(e,t,l,d),c=f.error}var m=this.points[s-1].subtract(this.points[s]),p=this.points[s].subtract(this.points[s+1]),g=m.add(p).divide(2).normalize();this.fitCubic(e,s,n,g),this.fitCubic(s,t,g.negate(),i)},addCurve:function(e){this.segments[this.segments.length-1].setHandleOut(e[1].subtract(e[0])),this.segments.push(new N(e[3],e[2].subtract(e[3])))},generateBezier:function(e,t,n,i,r){for(var a=this.points[e],o=this.points[t],s=[[0,0],[0,0]],l=[0,0],c=0,h=t-e+1;c1e-12){var C=s[0][0]*l[1]-s[1][0]*l[0];x=(l[0]*s[1][1]-l[1]*s[0][1])/E,_=C/E}else{var k=s[0][0]+s[0][1],S=s[1][0]+s[1][1];x=_=Math.abs(k)>1e-12?l[0]/k:Math.abs(S)>1e-12?l[1]/S:0}var z,T,P=o.getDistance(a),B=1e-12*P;if(xP*P&&(x=_=P/3,z=T=null)}return[a,a.add(z||i.normalize(x)),o.add(T||r.normalize(_)),o]},reparameterize:function(e,t,n,i){for(var r=e;r<=t;r++)n[r-e]=this.findRoot(i,this.points[r],n[r-e]);for(var r=1,a=n.length;r=a&&(a=c,r=o)}return{error:a,index:r}}}),F=C.extend({_class:"TextItem",_boundsSelected:!0,_applyMatrix:!1,_canApplyMatrix:!1,_serializeFields:{content:null},_boundsGetter:"getBounds",initialize:function(e){this._content="",this._lines=[];var t=e&&s.isPlainObject(e)&&e.x===o&&e.y===o;this._initialize(t&&e,!t&&m.read(arguments))},_equals:function(e){return this._content===e._content},_clone:function e(t,n,i){return t.setContent(this._content),e.base.call(this,t,n,i)},getContent:function(){return this._content},setContent:function(e){this._content=""+e,this._lines=this._content.split(/\r\n|\n|\r/gm),this._changed(265)},isEmpty:function(){return!this._content},getCharacterStyle:"#getStyle",setCharacterStyle:"#setStyle",getParagraphStyle:"#getStyle",setParagraphStyle:"#setStyle"}),G=F.extend({_class:"PointText",initialize:function(){F.apply(this,arguments)},clone:function(e){return this._clone(new G(C.NO_INSERT),e)},getPoint:function(){var e=this._matrix.getTranslation();return new p(e.x,e.y,this,"setPoint")},setPoint:function(){var e=m.read(arguments);this.translate(e.subtract(this._matrix.getTranslation()))},_draw:function(e){if(this._content){this._setStyles(e);var t=this._style,n=this._lines,i=t.getLeading(),r=e.shadowColor;e.font=t.getFontStyle(),e.textAlign=t.getJustification();for(var a=0,o=n.length;a1&&(l-=1),o[s]=6*l<1?a+6*(r-a)*l:2*l<1?r:3*l<2?a+(r-a)*(2/3-l)*6:a}return o},"rgb-gray":function(e,t,n){return[.2989*e+.587*t+.114*n]},"gray-rgb":function(e){return[e,e,e]},"gray-hsb":function(e){return[0,0,e]},"gray-hsl":function(e){return[0,0,e]},"gradient-rgb":function(){return[]},"rgb-gradient":function(){return[]}};return s.each(n,function(e,t){i[t]=[],s.each(e,function(e,r){var a=s.capitalize(e),o=/^(hue|saturation)$/.test(e),l=i[t][r]="gradient"===e?function(e){var t=this._components[0];return e=R.read(Array.isArray(e)?e:arguments,0,{readNull:!0}),t!==e&&(t&&t._removeOwner(this),e&&e._addOwner(this)),e}:"gradient"===t?function(){return m.read(arguments,0,{readNull:"highlight"===e,clone:!0})}:function(e){return null==e||isNaN(e)?0:e};this["get"+a]=function(){return this._type===t||o&&/^hs[bl]$/.test(this._type)?this._components[r]:this._convert(t)[r]},this["set"+a]=function(e){this._type===t||o&&/^hs[bl]$/.test(this._type)||(this._components=this._convert(t),this._properties=n[t],this._type=t),this._components[r]=l.call(this,e),this._changed()}},this)},{_class:"Color",_readIndex:!0,initialize:function t(r){var a,o,s,l,c=Array.prototype.slice,h=arguments,u=0;Array.isArray(r)&&(h=r,r=h[0]);var d=null!=r&&typeof r;if("string"===d&&r in n&&(a=r,r=h[1],Array.isArray(r)?(o=r,s=h[2]):(this.__read&&(u=1),h=c.call(h,1),d=typeof r)),!o){if(l="number"===d?h:"object"===d&&null!=r.length?r:null){a||(a=l.length>=3?"rgb":"gray");var m=n[a].length;s=l[m],this.__read&&(u+=l===arguments?m+(null!=s?1:0):1),l.length>m&&(l=c.call(l,0,m))}else if("string"===d)a="rgb",o=e(r),4===o.length&&(s=o[3],o.length--);else if("object"===d)if(r.constructor===t){if(a=r._type,o=r._components.slice(),s=r._alpha,"gradient"===a)for(var p=1,g=o.length;p1?1:e))}var n=this._convert("rgb"),i=e||null==this._alpha?1:this._alpha;return n=[t(n[0]),t(n[1]),t(n[2])],i<1&&n.push(i<0?0:i),e?"#"+((1<<24)+(n[0]<<16)+(n[1]<<8)+n[2]).toString(16).slice(1):(4==n.length?"rgba(":"rgb(")+n.join(",")+")"},toCanvasStyle:function(e){if(this._canvasStyle)return this._canvasStyle;if("gradient"!==this._type)return this._canvasStyle=this.toCSS();var t,n=this._components,i=n[0],r=i._stops,a=n[1],o=n[2];if(i._radial){var s=o.getDistance(a),l=n[3];if(l){var c=l.subtract(a);c.getLength()>s&&(l=a.add(c.normalize(s-.1)))}var h=l||a;t=e.createRadialGradient(h.x,h.y,0,a.x,a.y,s)}else t=e.createLinearGradient(a.x,a.y,o.x,o.y);for(var u=0,d=r.length;u0&&!(t instanceof j))for(var i=0,s=n.length;i0},hasShadow:function(){return!!this.getShadowColor()&&this.getShadowBlur()>0},getView:function(){return this._project.getView()},getFontStyle:function(){var e=this.getFontSize();return this.getFontWeight()+" "+e+(/[a-z]/i.test(e+"")?" ":"px ")+this.getFontFamily()},getFont:"#getFontFamily",setFont:"#setFontFamily",getLeading:function e(){var t=e.base.call(this),n=this.getFontSize();return/pt|em|%|px/.test(n)&&(n=this.getView().getPixelSize(n)),null!=t?t:1.2*n}}),H=new function(){function e(e,t,n,i){for(var r=["","webkit","moz","Moz","ms","o"],a=t[0].toUpperCase()+t.substring(1),o=0;o<6;o++){var s=r[o],l=s?s+a:t;if(l in e){if(!n)return e[l];e[l]=i;break}}}return{getStyles:function(e){var t=e&&9!==e.nodeType?e.ownerDocument:e,n=t&&t.defaultView;return n&&n.getComputedStyle(e,"")},getBounds:function(e,t){var n,i=e.ownerDocument,r=i.body,a=i.documentElement;try{n=e.getBoundingClientRect()}catch(e){n={left:0,top:0,width:0,height:0}}var o=n.left-(a.clientLeft||r.clientLeft||0),s=n.top-(a.clientTop||r.clientTop||0);if(!t){var l=i.defaultView;o+=l.pageXOffset||a.scrollLeft||r.scrollLeft,s+=l.pageYOffset||a.scrollTop||r.scrollTop}return new w(o,s,n.width,n.height)},getViewportBounds:function(e){var t=e.ownerDocument,n=t.defaultView,i=t.documentElement;return new w(0,0,n.innerWidth||i.clientWidth,n.innerHeight||i.clientHeight)},getOffset:function(e,t){return H.getBounds(e,t).getPoint()},getSize:function(e){return H.getBounds(e,!0).getSize()},isInvisible:function(e){return H.getSize(e).equals(new g(0,0))},isInView:function(e){return!H.isInvisible(e)&&H.getViewportBounds(e).intersects(H.getBounds(e,!0))},getPrefixed:function(t,n){return e(t,n)},setPrefixed:function(t,n,i){if("object"==typeof n)for(var r in n)e(t,r,!0,n[r]);else e(t,n,!0,i)}}},U={add:function(e,t){for(var n in t)for(var i=t[n],r=n.split(/[\s,]+/g),a=0,o=r.length;a=0;t--){var o=r[t],s=o[0],l=o[1];(!l||("true"==c.getAttribute(l,"keepalive")||a)&&H.isInView(l))&&(r.splice(t,1),s())}n&&(r.length?n(e):i=!1)}var t,n=H.getPrefixed(window,"requestAnimationFrame"),i=!1,r=[],a=!0;return U.add(window,{focus:function(){a=!0},blur:function(){a=!1}}),function(a,o){r.push([a,o]),n?i||(n(e),i=!0):t||(t=setInterval(e,1e3/60))}};var Q=s.extend(l,{_class:"View",initialize:function e(t,n){function i(e){return n[e]||parseInt(n.getAttribute(e),10)}function r(){var e=H.getSize(n);return e.isNaN()||e.isZero()?new g(i("width"),i("height")):e}this._project=t,this._scope=t._scope,this._element=n;var a;this._pixelRatio||(this._pixelRatio=window.devicePixelRatio||1),this._id=n.getAttribute("id"),null==this._id&&n.setAttribute("id",this._id="view-"+e._id++),U.add(n,this._viewEvents);if(H.setPrefixed(n.style,{userSelect:"none",touchAction:"none",touchCallout:"none",contentZooming:"none",userDrag:"none",tapHighlightColor:"rgba(0,0,0,0)"}),c.hasAttribute(n,"resize")){var o=this;U.add(window,this._windowEvents={resize:function(){o.setViewSize(r())}})}if(this._setViewSize(a=r()),c.hasAttribute(n,"stats")&&"undefined"!=typeof Stats){this._stats=new Stats;var s=this._stats.domElement,l=s.style,h=H.getOffset(n);l.position="absolute",l.left=h.x+"px",l.top=h.y+"px",document.body.appendChild(s)}e._views.push(this),e._viewsById[this._id]=this,this._viewSize=a,(this._matrix=new b)._owner=this,this._zoom=1,e._focused||(e._focused=this),this._frameItems={},this._frameItemCount=0},remove:function(){return!!this._project&&(Q._focused===this&&(Q._focused=null),Q._views.splice(Q._views.indexOf(this),1),delete Q._viewsById[this._id],this._project._view===this&&(this._project._view=null),U.remove(this._element,this._viewEvents),U.remove(window,this._windowEvents),this._element=this._project=null,this.off("frame"),this._animate=!1,this._frameItems={},!0)},_events:s.each(["onResize","onMouseDown","onMouseUp","onMouseMove"],function(e){this[e]={install:function(e){this._installEvent(e)},uninstall:function(e){this._uninstallEvent(e)}}},{onFrame:{install:function(){this.play()},uninstall:function(){this.pause()}}}),_animate:!1,_time:0,_count:0,_requestFrame:function(){var e=this;U.requestAnimationFrame(function(){e._requested=!1,e._animate&&(e._requestFrame(),e._handleFrame())},this._element),this._requested=!0},_handleFrame:function(){a=this._scope;var e=Date.now()/1e3,t=this._before?e-this._before:0;this._before=e,this._handlingFrame=!0,this.emit("frame",new s({delta:t,time:this._time+=t,count:this._count++})),this._stats&&this._stats.update(),this._handlingFrame=!1,this.update()},_animateItem:function(e,t){var n=this._frameItems;t?(n[e._id]={item:e,time:0,count:0},1==++this._frameItemCount&&this.on("frame",this._handleFrameItems)):(delete n[e._id],0==--this._frameItemCount&&this.off("frame",this._handleFrameItems))},_handleFrameItems:function(e){for(var t in this._frameItems){var n=this._frameItems[t];n.item.emit("frame",new s(e,{time:n.time+=e.delta,count:n.count++}))}},_update:function(){this._project._needsUpdate=!0,this._handlingFrame||(this._animate?this._handleFrame():this.update())},_changed:function(e){1&e&&(this._project._needsUpdate=!0)},_transform:function(e){this._matrix.concatenate(e),this._bounds=null,this._update()},getElement:function(){return this._element},getPixelRatio:function(){return this._pixelRatio},getResolution:function(){return 72*this._pixelRatio},getViewSize:function(){var e=this._viewSize;return new v(e.width,e.height,this,"setViewSize")},setViewSize:function(){var e=g.read(arguments),t=e.subtract(this._viewSize);t.isZero()||(this._viewSize.set(e.width,e.height),this._setViewSize(e),this._bounds=null,this.emit("resize",{size:e,delta:t}),this._update())},_setViewSize:function(e){var t=this._element;t.width=e.width,t.height=e.height},getBounds:function(){return this._bounds||(this._bounds=this._matrix.inverted()._transformBounds(new w(new m,this._viewSize))),this._bounds},getSize:function(){return this.getBounds().getSize()},getCenter:function(){return this.getBounds().getCenter()},setCenter:function(){var e=m.read(arguments);this.scrollBy(e.subtract(this.getCenter()))},getZoom:function(){return this._zoom},setZoom:function(e){this._transform((new b).scale(e/this._zoom,this.getCenter())),this._zoom=e},isVisible:function(){return H.isInView(this._element)},scrollBy:function(){this._transform((new b).translate(m.read(arguments).negate()))},play:function(){this._animate=!0,this._requested||this._requestFrame()},pause:function(){this._animate=!1},draw:function(){this.update()},projectToView:function(){return this._matrix._transformPoint(m.read(arguments))},viewToProject:function(){return this._matrix._inverseTransform(m.read(arguments))}},{statics:{_views:[],_viewsById:{},_id:0,create:function(e,t){return"string"==typeof t&&(t=document.getElementById(t)),new K(e,t)}}},new function(){function e(e){var t=U.getTarget(e);return t.getAttribute&&Q._viewsById[t.getAttribute("id")]}function t(e,t){return e.viewToProject(U.getOffset(t,e._element))}function n(){if(!Q._focused||!Q._focused.isVisible())for(var e=0,t=Q._views.length;ethis._maxDistance&&(this._maxDistance=e)},getMaxDistance:function(){return this._maxDistance},setMaxDistance:function(e){this._maxDistance=e,null!=this._minDistance&&null!=e&&ei)t=this._point.add(l.normalize(i));else if(o)return!1}if(a&&t.equals(this._point))return!1}switch(this._lastPoint=r&&"mousemove"==e?t:this._point,this._point=t,e){case"mousedown":this._lastPoint=this._downPoint,this._downPoint=this._point,this._downCount++;break;case"mouseup":this._lastPoint=this._downPoint}return this._count=r?0:this._count+1,!0},_fireEvent:function(e,t){var n=a.project._removeSets;if(n){"mouseup"===e&&(n.mousedrag=null);var i=n[e];if(i){for(var r in i){var o=i[r];for(var s in n){var l=n[s];l&&l!=i&&delete l[o._id]}o.remove()}n[e]=null}}return this.responds(e)&&this.emit(e,new ee(this,e,t))},_handleEvent:function(e,t,n){a=this._scope;var i=!1;switch(e){case"mousedown":this._updateEvent(e,t,null,null,!0,!1,!1),i=this._fireEvent(e,n);break;case"mousedrag":for(var r=!1,o=!1;this._updateEvent(e,t,this.minDistance,this.maxDistance,!1,r,o);)i=this._fireEvent(e,n)||i,r=!0,o=!0;break;case"mouseup":!t.equals(this._point)&&this._updateEvent("mousedrag",t,this.minDistance,this.maxDistance,!1,!1,!1)&&(i=this._fireEvent("mousedrag",n)),this._updateEvent(e,t,null,this.maxDistance,!1,!1,!1),i=this._fireEvent(e,n)||i,this._updateEvent(e,t,null,null,!0,!1,!1),this._firstMove=!0;break;case"mousemove":for(;this._updateEvent(e,t,this.minDistance,this.maxDistance,this._firstMove,!0,!1);)i=this._fireEvent(e,n)||i,this._firstMove=!1}return i&&n.preventDefault(),i}}),{request:function(e,t,n,i){i=i===o||i;var r=new(window.ActiveXObject||XMLHttpRequest)("Microsoft.XMLHTTP");return r.open(e.toUpperCase(),t,i),"overrideMimeType"in r&&r.overrideMimeType("text/plain"),r.onreadystatechange=function(){if(4===r.readyState){var e=r.status;if(0!==e&&200!==e)throw new Error("Could not load "+t+" (Error "+e+")");n.call(r,r.responseText)}},r.send(null)}}),ne={canvases:[],getCanvas:function(e,t){var n;"object"==typeof e&&(t=e.height,e=e.width),n=this.canvases.length?this.canvases.pop():document.createElement("canvas");var i=n.getContext("2d");return n.width===e&&n.height===t?i.clearRect(0,0,e+1,t+1):(n.width=e,n.height=t),i.save(),n},getContext:function(e,t){return this.getCanvas(e,t).getContext("2d")},release:function(e){var t=e.canvas?e.canvas:e;t.getContext("2d").restore(),this.canvases.push(t)}},ie=new function(){function e(e,t,n){return.2989*e+.587*t+.114*n}function t(t,n,i,r){var a=r-e(t,n,i);f=t+a,m=n+a,p=i+a;var r=e(f,m,p),o=g(f,m,p),s=v(f,m,p);if(o<0){var l=r-o;f=r+(f-r)*r/l,m=r+(m-r)*r/l,p=r+(p-r)*r/l}if(s>255){var c=255-r,h=s-r;f=r+(f-r)*c/h,m=r+(m-r)*c/h,p=r+(p-r)*c/h}}function n(e,t,n){return v(e,t,n)-g(e,t,n)}function i(e,t,n,i){var r,a=[e,t,n],o=v(e,t,n),s=g(e,t,n);s=s===e?0:s===t?1:2,o=o===e?0:o===t?1:2,r=0===g(s,o)?1===v(s,o)?2:1:0,a[o]>a[s]?(a[r]=(a[r]-a[s])*i/(a[o]-a[s]),a[o]=i):a[r]=a[o]=0,a[s]=0,f=a[0],m=a[1],p=a[2]}var r,a,o,l,c,h,u,d,f,m,p,g=Math.min,v=Math.max,w=Math.abs,y={multiply:function(){f=c*r/255,m=h*a/255,p=u*o/255},screen:function(){f=c+r-c*r/255,m=h+a-h*a/255,p=u+o-u*o/255},overlay:function(){f=c<128?2*c*r/255:255-2*(255-c)*(255-r)/255,m=h<128?2*h*a/255:255-2*(255-h)*(255-a)/255,p=u<128?2*u*o/255:255-2*(255-u)*(255-o)/255},"soft-light":function(){var e=r*c/255;f=e+c*(255-(255-c)*(255-r)/255-e)/255,e=a*h/255,m=e+h*(255-(255-h)*(255-a)/255-e)/255,e=o*u/255,p=e+u*(255-(255-u)*(255-o)/255-e)/255},"hard-light":function(){f=r<128?2*r*c/255:255-2*(255-r)*(255-c)/255,m=a<128?2*a*h/255:255-2*(255-a)*(255-h)/255,p=o<128?2*o*u/255:255-2*(255-o)*(255-u)/255},"color-dodge":function(){f=0===c?0:255===r?255:g(255,255*c/(255-r)),m=0===h?0:255===a?255:g(255,255*h/(255-a)),p=0===u?0:255===o?255:g(255,255*u/(255-o))},"color-burn":function(){f=255===c?255:0===r?0:v(0,255-255*(255-c)/r),m=255===h?255:0===a?0:v(0,255-255*(255-h)/a),p=255===u?255:0===o?0:v(0,255-255*(255-u)/o)},darken:function(){f=cr?c:r,m=h>a?h:a,p=u>o?u:o},difference:function(){f=c-r,f<0&&(f=-f),m=h-a,m<0&&(m=-m),(p=u-o)<0&&(p=-p)},exclusion:function(){f=c+r*(255-c-c)/255,m=h+a*(255-h-h)/255,p=u+o*(255-u-u)/255},hue:function(){i(r,a,o,n(c,h,u)),t(f,m,p,e(c,h,u))},saturation:function(){i(c,h,u,n(r,a,o)),t(f,m,p,e(c,h,u))},luminosity:function(){t(c,h,u,e(r,a,o))},color:function(){t(r,a,o,e(c,h,u))},add:function(){f=g(c+r,255),m=g(h+a,255),p=g(u+o,255)},subtract:function(){f=v(c-r,0),m=v(h-a,0),p=v(u-o,0)},average:function(){f=(c+r)/2,m=(h+a)/2,p=(u+o)/2},negation:function(){f=255-w(255-r-c),m=255-w(255-a-h),p=255-w(255-o-u)}},b=this.nativeModes=s.each(["source-over","source-in","source-out","source-atop","destination-over","destination-in","destination-out","destination-atop","lighter","darker","copy","xor"],function(e){this[e]=!0},{}),x=ne.getContext(1,1);s.each(y,function(e,t){var n="darken"===t,i=!1;x.save();try{x.fillStyle=n?"#300":"#a00",x.fillRect(0,0,1,1),x.globalCompositeOperation=t,x.globalCompositeOperation===t&&(x.fillStyle=n?"#a00":"#300",x.fillRect(0,0,1,1),i=x.getImageData(0,0,1,1).data[0]!==n?170:51)}catch(e){}x.restore(),b[t]=i}),ne.release(x),this.process=function(e,t,n,i,s){var g=t.canvas,v="normal"===e;if(v||b[e])n.save(),n.setTransform(1,0,0,1,0,0),n.globalAlpha=i,v||(n.globalCompositeOperation=e),n.drawImage(g,s.x,s.y),n.restore();else{var w=y[e];if(!w)return;for(var x=n.getImageData(s.x,s.y,g.width,g.height),_=x.data,E=t.getImageData(0,0,g.width,g.height).data,C=0,k=_.length;C=3){s=e._closed?"polygon":"polyline";for(var h=[],u=0,d=l.length;u1||/z\S+/i.test(t)?new j(n):new O(n)}function h(n,i){var r,a=(e(n,"href",!0)||"").substring(1),o="radialgradient"===i;if(a)r=P[a].getGradient();else{for(var s=n.childNodes,l=[],c=0,h=s.length;c0&&this.weights;t.beginPath();var i=r(0,this.degree,e,this.knots,n);t.moveTo(i[0],i[1]);for(var a=.01;a<1;a+=.01)i=r(a,this.degree,e,this.knots,n),t.lineTo(i[0],i[1]);i=r(1,this.degree,e,this.knots,n),t.lineTo(i[0],i[1]),t.stroke(),t.closePath()},drawKnots:function(e){var t=this,n=this.knots,i=this.weights.length>0&&this.weights;n.forEach(function(a,o){if(!(on.length-1-t.degree)){var s=r(a,t.degree,e,n,i,!1,!0);t.circle(s[0],s[1],3)}})},drawNodes:function(e){var t,n=this;this.stroke(150),this.nodes.forEach(function(i,a){try{t=r(i,n.degree,e,n.knots,!1,!1,!0),n.line(t[0],t[1],e[a][0],e[a++][1])}catch(e){console.error(e)}})},formKnots:function(e,t){if(!(t=!0===t))return this.formUniformKnots(e);var n,i=e.length,r=[],a=i-this.degree;for(n=1;n=0;n--)t.push(n);return t.reverse()},formNodes:function(e,t){var n,i,r,a=[this.degree,e.length-1-this.degree],o=[];for(i=0;ie[a[1]]||o.push(n))}return o},formWeights:function(e){var t=[];return e.forEach(function(e){return t.push(1)}),t},setDegree:function(e){this.degree+=e,this.knots=this.formKnots(this.points),this.nodes=this.formNodes(this.knots,this.points)},near:function(e,t,n){var i=e.x-t,r=e.y-n;return Math.sqrt(i*i+r*r)1&&this.setDegree(-1),this.redraw()},keyUp:function(){},keyPressed:function(){},mouseDown:function(){this.isMouseDown=!0,this.cp=this.getCurrentPoint(this.mouseX,this.mouseY),this.cp||(this.points.push({x:this.mouseX,y:this.mouseY}),this.knots=this.formKnots(this.points),this.nodes=this.formNodes(this.knots,this.points)),this.redraw()},mouseUp:function(){this.isMouseDown=!1,this.cp=!1,this.redraw()},mouseDrag:function(){this.cp&&(this.cp.x=this.mouseX,this.cp.y=this.mouseY,this.redraw())},mouseMove:function(){},scrolled:function(e){if(this.cp=this.getCurrentPoint(this.mouseX,this.mouseY),this.cp){var t=this.points.indexOf(this.cp);this.weights.length>t&&(this.weights[t]+=.1*e,this.weights[t]<0&&(this.weights[t]=0)),t=this.points.indexOf(this.cp,t+1),-1!==t&&this.weights.length>t&&(this.weights[t]+=.1*e,this.weights[t]<0&&(this.weights[t]=0)),this.redraw()}},setKeyboardValues:function(e){e.ctrlKey||e.metaKey||e.altKey||e.preventDefault(),this.key=e.key,this.keyCode=e.code},setMouseValues:function(e){var t=this.cvs.getBoundingClientRect();this.mouseX=e.clientX-t.left,this.mouseY=e.clientY-t.top},size:function(e,t){this.width=0|e,this.height=0|(t||e),this.cvs.width=this.width,this.cvs.height=this.height,this.ctx=this.cvs.getContext("2d")},redraw:function(){this.draw()},clear:function(){this.ctx.clearRect(0,0,this.width,this.height)},grid:function(e){e=.5+(0|(e||10)),this.stroke(200,200,220);for(var t=e;t=r)return null;var s={type:"range",min:0,max:t,step:1,value:a,onChange:function(t){var i=e.state.weights;i[o]=t.target.value,n&&o-1){n.update();break}}else this.curve&&this.curve.update&&this.curve.update()}this.props.onMouseMove&&this.props.onMouseMove(e,this),this.dragging&&this.props.onMouseDrag&&this.props.onMouseDrag(e,this),this.props.static||this.playing||!this.props.draw||this.props.draw(this,this.curve)},mouseUp:function(e){if(this.down=!1,!this.movingPoint)return void(this.props.onMouseUp&&this.props.onMouseUp(e,this));this.movingPoint=!1,this.mp=!1,this.props.onMouseUp&&this.props.onMouseUp(e,this)},onClick:function(e){this.mx=e.offsetX,this.my=e.offsetY,!this.dragging&&this.props.onClick&&this.props.onClick(e,this)},onKeyUp:function(e){this.props.onKeyUp&&(this.props.onKeyUp(e,this),!this.playing&&this.props.draw&&this.props.draw(this,this.curve))},onKeyDown:function(e){this.props.onKeyDown&&(this.props.onKeyDown(e,this),!this.playing&&this.props.draw&&this.props.draw(this,this.curve))},onKeyPress:function(e){this.props.onKeyPress&&(this.props.onKeyPress(e,this),!this.playing&&this.props.draw&&this.props.draw(this,this.curve))},reset:function(){this.refs.canvas.width=this.refs.canvas.width,this.ctx.strokeStyle="black",this.ctx.lineWidth=1,this.ctx.fillStyle="none";var e=this.getPixelRatio();this.ctx.scale(e,e),this.offset={x:0,y:0},this.colorSeed=0},setSize:function(e,t){this.defaultWidth=e,this.defaultHeight=t;var n=this.refs.canvas;n.style.width=this.panelCount*e+"px",n.style.height=t+"px";var i=this.getPixelRatio();n.width=this.panelCount*e*i,n.height=t*i,this.ctx.scale(i,i)},setCurves:function(e){this.setCurve(e)},setCurve:function(e){var t=[];e=e instanceof Array?e:Array.from(arguments),e.forEach(function(e){t=t.concat(e.points)}),this.curve=1===e.length?e[0]:e,this.lpts=t},getPanelWidth:function(){return this.defaultWidth},getPanelHeight:function(){return this.defaultHeight},getDefaultQuadratic:function(){return new this.Bezier(70,250,20,110,250,60)},getDefaultCubic:function(){return new this.Bezier(120,160,35,200,220,260,220,40)},getDefault3DCubic:function(){return new this.Bezier(120,0,0,120,120,30,0,120,100,0,0,200)},getPixelRatio:function(){return window.devicePixelRatio||1},toImage:function(){var e=this.refs.canvas.toDataURL(),t=new Image;return t.src=e,t.devicePixelRatio=this.getPixelRatio(),t},setPanelCount:function(e){this.panelCount=e;var t=this.refs.canvas;t.width=e*this.defaultWidth*this.getPixelRatio(),t.style.width=e*this.defaultWidth+"px"},setOffset:function(e){this.offset=e},setColor:function(e){this.ctx.strokeStyle=e},getColor:function(){return this.ctx.strokeStyle||"black"},setWeight:function(e){this.ctx.lineWidth=e},noColor:function(e){this.ctx.strokeStyle="transparent"},setRandomColor:function(e){e=void 0===e?1:e;var t=this.colorSeed%360;this.colorSeed+=87,this.ctx.strokeStyle=r.hsl(t,1,.34).alpha(e).css()},setRandomFill:function(e){e=void 0===e?1:e;var t=this.colorSeed%360;this.colorSeed+=87,this.ctx.fillStyle=r.hsl(t,1,.34).alpha(e).css()},setFill:function(e){this.ctx.fillStyle=e},getFill:function(){return this.ctx.fillStyle||"transparent"},noFill:function(){this.ctx.fillStyle="transparent"},project:function(e,t,n){t=t||{x:0,y:0},n=n||-l/6;var i=e.y,r=-e.z,a=-e.x;return{x:t.x+i+a/2*s(n),y:t.y+r+a/2*o(n)}},projectXY:function(e,t,n){return c.project({x:e.x,y:e.y,z:0},t,n)},projectXZ:function(e,t,n){return c.project({x:e.x,y:0,z:e.z},t,n)},projectYZ:function(e,t,n){return c.project({x:0,y:e.y,z:e.z},t,n)},drawSkeleton:function(e,t,n){t=t||{x:0,y:0};var i=e.points;if(i.length>2){this.ctx.strokeStyle="lightgrey",this.drawLine(i[0],i[1],t);for(var r=i.length-2,a=1;a.95)&&(t.t=!1),t.redraw()},setupQuadratic:function(e){var t=e.getDefaultQuadratic();t.points[0].y-=10,e.setCurve(t)},setupCubic:function(e){var t=e.getDefaultCubic();t.points[2].y-=20,e.setCurve(t),e.lut=t.getLUT(100)},draw:function(e,t){e.reset(),e.drawSkeleton(t),e.drawCurve(t);var n=e.getPanelHeight();if(e.setColor("black"),e.t){e.drawCircle(e.curve.get(e.t),3),e.setColor("lightgrey");var i,r,a,o=e.drawHull(t,e.t),s=e.utils;6===o.length?(i=t.points[1],r=o[5],a=s.lli4(i,r,t.points[0],t.points[2]),e.setColor("lightgrey"),e.drawLine(t.points[0],t.points[2])):10===o.length&&(i=o[5],r=o[9],a=s.lli4(i,r,t.points[0],t.points[3]),e.setColor("lightgrey"),e.drawLine(t.points[0],t.points[3])),e.setColor("#00FF00"),e.drawLine(i,r),e.setColor("red"),e.drawLine(r,a),e.setColor("black"),e.drawCircle(a,3),e.setFill("black"),e.text("A",{x:10+i.x,y:i.y}),e.text("B (t = "+e.utils.round(e.t,2)+")",{x:10+r.x,y:r.y}),e.text("C",{x:10+a.x,y:a.y});var l=s.dist(i,r),c=s.dist(r,a),h=l/c;e.text("d1 (A-B): "+s.round(l,2)+", d2 (B-C): "+s.round(c,2)+", ratio (d1/d2): "+s.round(h,4),{x:10,y:n-7})}},setCT:function(e,t){t.t=e.offsetX/t.getPanelWidth()},drawCTgraph:function(e){e.reset(),e.setColor("black");var t=e.getPanelWidth(),n=t-40;e.drawAxes(20,"t",0,1,"u",0,1),e.setColor("blue");var i=function(t){var i=e.u(t);return{x:20+t*n,y:20+i*n}};if(e.drawFunction(i),e.t){var r=e.u(e.t),a=e.utils.round(r,3),o=e.utils.round(1-r,3),s=i(e.t);e.drawLine({x:s.x,y:20},s),e.drawLine({x:20,y:s.y},s),e.drawCircle(s,3),e.setFill("blue"),e.text(" t = "+e.utils.round(e.t,3),{x:s.x+10,y:s.y-7}),e.text("u(t) = "+e.utils.round(r,3),{x:s.x+10,y:s.y+7}),e.setFill("black"),e.text("C = "+a+" * start + "+o+" * end",{x:t/2-20,y:20+n})}},drawQCT:function(e){e.u=e.u||function(e){return(e-1)*(e-1)/(2*e*e-2*e+1)},this.drawCTgraph(e)},drawCCT:function(e){e.u=e.u||function(e){var t=(1-e)*(1-e)*(1-e);return t/(e*e*e+t)},this.drawCTgraph(e)}}},function(e,t,n){"use strict";var i=n(25),r=n(0);e.exports=r("abc",i)},function(e,t,n){"use strict";e.exports={setupQuadratic:function(e){var t=e.getDefaultQuadratic();e.setCurve(t)},setupCubic:function(e){var t=e.getDefaultCubic();e.setCurve(t)},align:function(e,t){var n=t.p1.x,i=t.p1.y,r=-Math.atan2(t.p2.y-i,t.p2.x-n),a=Math.cos,o=Math.sin,s=function(e){return{x:(e.x-n)*a(r)-(e.y-i)*o(r),y:(e.x-n)*o(r)+(e.y-i)*a(r)}};return e.map(s)},draw:function(e,t){e.setPanelCount(2),e.reset(),e.drawSkeleton(t),e.drawCurve(t);var n=t.points,i={p1:n[0],p2:n[n.length-1]},r=this.align(n,i),a=new e.Bezier(r),o=e.getPanelWidth(),s=e.getPanelHeight(),l={x:o,y:0};e.setColor("black"),e.drawLine({x:0,y:0},{x:0,y:s},l),l.x+=o/4,l.y+=s/2,e.setColor("grey"),e.drawLine({x:0,y:-s/2},{x:0,y:s/2},l),e.drawLine({x:-o/4,y:0},{x:o,y:0},l),e.setFill("grey"),e.setColor("black"),e.drawSkeleton(a,l),e.drawCurve(a,l)}}},function(e,t,n){"use strict";var i=n(27),r=n(0);e.exports=r("aligning",i)},function(e,t,n){"use strict";var i=Math.atan2,r=Math.PI,a=2*r,o=Math.cos,s=Math.sin;e.exports={statics:{keyHandlingOptions:{propName:"error",values:{38:.1,40:-.1},controller:function(e){e.error<.1&&(e.error=.1)}}},setupCircle:function(e){var t=new e.Bezier(70,70,140,40,240,130);e.setCurve(t)},setupQuadratic:function(e){var t=e.getDefaultQuadratic();e.setCurve(t)},setupCubic:function(e){var t=e.getDefaultCubic();e.setCurve(t),e.error=.5},getCCenter:function(e,t,n,l){var c,h=n.x-t.x,u=n.y-t.y,d=l.x-n.x,f=l.y-n.y,m=h*o(r/2)-u*s(r/2),p=h*s(r/2)+u*o(r/2),g=d*o(r/2)-f*s(r/2),v=d*s(r/2)+f*o(r/2),w=(t.x+n.x)/2,y=(t.y+n.y)/2,b=(n.x+l.x)/2,x=(n.y+l.y)/2,_=w+m,E=y+p,C=b+g,k=x+v,S=e.utils.lli8(w,y,_,E,b,x,C,k),z=e.utils.dist(S,t),T=i(t.y-S.y,t.x-S.x),P=i(n.y-S.y,n.x-S.x),B=i(l.y-S.y,l.x-S.x);return TP||P>B)&&(T+=a),T>B&&(c=B,B=T,T=c)):B-10&&(s.push({x:i*l,y:i*c}),e.drawLine({x:i*l,y:i*c},{x:i*a,y:i*o},r)),l=a,c=o;s.push({x:i*l,y:i*c}),e.text("Curve form has cusp →",{x:200-2*i,y:200+i/2.5}),e.setColor("#FF00FF"),e.setFill(e.getColor());var h=Math.sqrt;for(a=1;a>=0;a-=.005)s.push({x:i*l,y:i*c}),o=.5*(h(3)*h(4*a-a*a)-a),e.drawLine({x:i*l,y:i*c},{x:i*a,y:i*o},r),l=a,c=o;for(s.push({x:i*l,y:i*c}),e.text("← Curve forms a loop at t = 1",{x:200+i/4,y:200+i/1.5}),e.setColor("#3300FF"),e.setFill(e.getColor()),a=0;a>-n;a-=.01)s.push({x:i*l,y:i*c}),o=(-a*a+3*a)/3,e.drawLine({x:i*l,y:i*c},{x:i*a,y:i*o},r),l=a,c=o;s.push({x:i*l,y:i*c}),e.text("← Curve forms a loop at t = 0",{x:200-i+10,y:200-1.25*i}),e.setColor("transparent"),e.setFill("rgba(255,120,100,0.2)"),e.drawPath(s,r),s=[{x:-200,y:i},{x:200,y:i},{x:200,y:n},{x:-200,y:n}],e.setFill("rgba(0,200,0,0.2)"),e.drawPath(s,r),e.setColor("black"),e.setFill(e.getColor()),e.text("← Curve form has one inflection →",{x:200-i,y:200+1.75*i}),e.text("← Plain curve ↕",{x:200+i/2,y:n/6}),e.text("↕ Double inflection",{x:10,y:190}),e._map_image=e.toImage(),e._map_loaded=!0}}},function(e,t,n){"use strict";var i=n(45),r=n(0);e.exports=r("canonical",i)},function(e,t,n){"use strict";var i=n(0);e.exports=i("catmullconv")},function(e,t,n){"use strict";e.exports={statics:{keyHandlingOptions:{propName:"distance",values:{38:1,40:-1}}},setup:function(e){e.setPanelCount(3),e.lpts=[{x:56,y:153},{x:144,y:83},{x:188,y:185}],e.distance=0},convert:function(e,t,n,i){return[t,{x:t.x+(n.x-e.x)/3,y:t.y+(n.y-e.y)/3},{x:n.x-(i.x-t.x)/3,y:n.y-(i.y-t.y)/3},n]},draw:function(e){e.reset(),e.setColor("lightblue"),e.drawGrid(10,10);var t=e.lpts;e.setColor("black"),e.setFill("black"),t.forEach(function(t,n){e.drawCircle(t,3),e.text("point "+(n+1),t,{x:10,y:7})});var n=e.getPanelWidth(),i=e.getPanelHeight(),r={x:n,y:0};e.setColor("lightblue"),e.drawGrid(10,10,r),e.setColor("black"),e.drawLine({x:0,y:0},{x:0,y:i},r),t.forEach(function(t,n){e.drawCircle(t,3,r)});var a=t[0],o=t[1],s=t[2],l=s.x-a.x,c=s.y-a.y,h=Math.sqrt(l*l+c*c);l/=h,c/=h,e.drawLine(a,s,r);var u={x:a.x+(s.x-o.x)-e.distance*l,y:a.y+(s.y-o.y)-e.distance*c},d={x:a.x+(s.x-o.x)+e.distance*l,y:a.y+(s.y-o.y)+e.distance*c},f=e.utils.lli4(a,s,o,{x:(u.x+d.x)/2,y:(u.y+d.y)/2});e.setColor("blue"),e.drawCircle(f,3,r),e.drawLine(t[1],f,r),e.setColor("#666"),e.drawLine(f,u,r),e.drawLine(f,d,r),e.setFill("blue"),e.text("p0",u,{x:-20+r.x,y:r.y+2}),e.text("p4",d,{x:10+r.x,y:r.y+2}),e.setColor("red"),e.drawCircle(u,3,r),e.drawLine(o,u,r),e.drawLine(a,{x:a.x+(o.x-u.x)/5,y:a.y+(o.y-u.y)/5},r),e.setColor("#00FF00"),e.drawCircle(d,3,r),e.drawLine(o,d,r),e.drawLine(s,{x:s.x+(d.x-o.x)/5,y:s.y+(d.y-o.y)/5},r);var m=new e.Bezier(this.convert(u,a,o,s)),p=new e.Bezier(this.convert(a,o,s,d));e.setColor("lightgrey"),e.drawCurve(m,r),e.drawCurve(p,r),r.x+=n,e.setColor("lightblue"),e.drawGrid(10,10,r),e.setColor("black"),e.drawLine({x:0,y:0},{x:0,y:i},r),e.drawCurve(m,r),e.drawCurve(p,r),e.drawPoints(m.points,r),e.drawPoints(p.points,r),e.setColor("lightgrey"),e.drawLine(m.points[0],m.points[1],r),e.drawLine(m.points[2],p.points[1],r),e.drawLine(p.points[2],p.points[3],r)}}},function(e,t,n){"use strict";var i=n(48),r=n(0),a=n(2);e.exports=a(r("catmullmoulding",i))},function(e,t,n){"use strict";var i=Math.sin,r=Math.cos;e.exports={setup:function(e){e.w=e.getPanelWidth(),e.h=e.getPanelHeight(),e.pad=20,e.r=e.w/2-e.pad,e.mousePt=!1,e.angle=0;var t={x:e.w-e.pad,y:e.h/2};e.setCurve(new e.Bezier(t,t,t))},draw:function(e,t){e.reset(),e.setColor("lightgrey"),e.drawGrid(1,1),e.setColor("red"),e.drawCircle({x:e.w/2,y:e.h/2},e.r),e.setColor("transparent"),e.setFill("rgba(100,255,100,0.4)");var n={x:e.w/2,y:e.h/2,r:e.r,s:e.angle<0?e.angle:0,e:e.angle<0?0:e.angle};e.drawArc(n),e.setColor("black"),e.drawSkeleton(t),e.drawCurve(t)},onMouseMove:function(e,t){var n=e.offsetX-t.w/2,a=e.offsetY-t.h/2,o=Math.atan2(a,n),s=t.curve.points,l=t.r,c=(r(o)-1)/i(o);s[1]={x:t.w/2+l*(r(o)-c*i(o)),y:t.w/2+l*(i(o)+c*r(o))},s[2]={x:t.w/2+t.r*r(o),y:t.w/2+t.r*i(o)},t.setCurve(new t.Bezier(s)),t.angle=o}}},function(e,t,n){"use strict";var i=n(50),r=n(0);e.exports=r("circles",i)},function(e,t,n){"use strict";var i=Math.sin,r=Math.cos,a=Math.tan;e.exports={setup:function(e){e.setSize(400,400),e.w=e.getPanelWidth(),e.h=e.getPanelHeight(),e.pad=80,e.r=e.w/2-e.pad,e.mousePt=!1,e.angle=0;var t={x:e.w-e.pad,y:e.h/2};e.setCurve(new e.Bezier(t,t,t,t))},guessCurve:function(e,t,n){var i={x:(e.x+n.x)/2,y:(e.y+n.y)/2},r={x:t.x+(t.x-i.x)/3,y:t.y+(t.y-i.y)/3},a=(n.x-e.x)/4,o=(n.y-e.y)/4,s={x:t.x-a,y:t.y-o},l={x:t.x+a,y:t.y+o},c={x:r.x+2*(s.x-r.x),y:r.y+2*(s.y-r.y)},h={x:r.x+2*(l.x-r.x),y:r.y+2*(l.y-r.y)};return[{x:e.x+2*(c.x-e.x),y:e.y+2*(c.y-e.y)},{x:n.x+2*(h.x-n.x),y:n.y+2*(h.y-n.y)}]},draw:function(e,t){e.reset(),e.setColor("lightgrey"),e.drawGrid(1,1),e.setColor("rgba(255,0,0,0.4)"),e.drawCircle({x:e.w/2,y:e.h/2},e.r),e.setColor("transparent"),e.setFill("rgba(100,255,100,0.4)");var n={x:e.w/2,y:e.h/2,r:e.r,s:e.angle<0?e.angle:0,e:e.angle<0?0:e.angle};e.drawArc(n);var a={x:e.w/2+e.r*r(e.angle/2),y:e.w/2+e.r*i(e.angle/2)},o=t.points[0],s=t.points[3],l=this.guessCurve(o,a,s),c=new e.Bezier([o,l[0],l[1],s]);e.setColor("rgb(140,140,255)"),e.drawLine(c.points[0],c.points[1]),e.drawLine(c.points[1],c.points[2]),e.drawLine(c.points[2],c.points[3]),e.setColor("blue"),e.drawCurve(c),e.drawCircle(c.points[1],3),e.drawCircle(c.points[2],3),e.drawSkeleton(t),e.setColor("black"),e.drawLine(t.points[1],t.points[2]),e.drawCurve(t)},onMouseMove:function(e,t){var n=e.offsetX-t.w/2,o=e.offsetY-t.h/2;if(!(n>t.w/2)){var s=Math.atan2(o,n);s<0&&(s=2*Math.PI+s);var l=t.curve.points,c=t.r,h=4*a(s/4)/3;l[1]={x:t.w/2+c,y:t.w/2+c*h},l[2]={x:t.w/2+t.r*(r(s)+h*i(s)),y:t.w/2+t.r*(i(s)-h*r(s))},l[3]={x:t.w/2+t.r*r(s),y:t.w/2+t.r*i(s)},t.setCurve(new t.Bezier(l)),t.angle=s}},drawCircle:function(e){e.setSize(325,325),e.reset();var t=e.getPanelWidth(),n=e.getPanelHeight(),i=t/2-60,r=.55228,a={x:-30,y:-15},o=new e.Bezier([{x:t/2+i,y:n/2},{x:t/2+i,y:n/2+r*i},{x:t/2+r*i,y:n/2+i},{x:t/2,y:n/2+i}]);e.setColor("lightgrey"),e.drawLine({x:0,y:n/2},{x:t+60,y:n/2},a),e.drawLine({x:t/2,y:0},{x:t/2,y:n+60},a);var s=o.points;e.setColor("red"),e.drawPoint(s[0],a),e.drawPoint(s[1],a),e.drawPoint(s[2],a),e.drawPoint(s[3],a),e.drawCurve(o,a),e.setColor("rgb(255,160,160)"),e.drawLine(s[0],s[1],a),e.drawLine(s[1],s[2],a),e.drawLine(s[2],s[3],a),e.setFill("red"),e.text(s[0].x-t/2+","+(s[0].y-n/2),{x:s[0].x+7,y:s[0].y+3},a),e.text(s[1].x-t/2+","+(s[1].y-n/2),{x:s[1].x+7,y:s[1].y+3},a),e.text(s[2].x-t/2+","+(s[2].y-n/2),{x:s[2].x+7,y:s[2].y+7},a),e.text(s[3].x-t/2+","+(s[3].y-n/2),{x:s[3].x,y:s[3].y+13},a),s.forEach(function(e){e.x=-(e.x-t)}),e.setColor("blue"),e.drawCurve(o,a),e.drawLine(s[2],s[3],a),e.drawPoint(s[2],a),e.setFill("blue"),e.text("reflected",{x:s[2].x-30,y:s[2].y+13},a),e.setColor("rgb(200,200,255)"),e.drawLine(s[1],s[0],a),e.drawPoint(s[1],a),s.forEach(function(e){e.y=-(e.y-n)}),e.setColor("green"),e.drawCurve(o,a),s.forEach(function(e){e.x=-(e.x-t)}),e.setColor("purple"),e.drawCurve(o,a),e.drawLine(s[1],s[0],a),e.drawPoint(s[1],a),e.setFill("purple"),e.text("reflected",{x:s[1].x+10,y:s[1].y+3},a),e.setColor("rgb(200,200,255)"),e.drawLine(s[2],s[3],a),e.drawPoint(s[2],a),e.setColor("black"),e.setFill("black"),e.drawLine({x:t/2,y:n/2},{x:t/2+i-2,y:n/2},a),e.drawLine({x:t/2,y:n/2},{x:t/2,y:n/2+i-2},a),e.text("r = "+i,{x:t/2+i/3,y:n/2+10},a)}}},function(e,t,n){"use strict";var i=n(52),r=n(0);e.exports=r("circles_cubic",i)},function(e,t,n){"use strict";e.exports={componentDidMount:function(){if("undefined"==typeof document)return this.silence();this.heading=document.getElementById(this.props.page),document.addEventListener("scroll",this.scrollHandler,{passive:!0})},scrollHandler:function(e){this.heading.getBoundingClientRect().top=20&&i.x<=t-20){this.drawLerpBox(e,t,20,i);var r=(i.x-20)/n;this.drawLerpPoint(e,(1-r)*(1-r),20,n,i),this.drawLerpPoint(e,2*(1-r)*r,20,n,i),this.drawLerpPoint(e,r*r,20,n,i)}this.drawFunction(e,"first term",{x:40,y:n},function(e){return{x:20+e*n,y:20+n*(1-e)*(1-e)}}),this.drawFunction(e,"second term",{x:t/2-30,y:t/2+20},function(e){return{x:20+e*n,y:20+2*n*(1-e)*e}}),this.drawFunction(e,"third term",{x:n-50,y:n},function(e){return{x:20+e*n,y:20+n*e*e}})},drawCubicLerp:function(e){e.reset();var t=e.getPanelWidth(),n=t-40;e.drawAxes(20,"t",0,1,"S","0%","100%");var i=e.hover;if(i&&i.x>=20&&i.x<=t-20){this.drawLerpBox(e,t,20,i);var r=(i.x-20)/n;this.drawLerpPoint(e,(1-r)*(1-r)*(1-r),20,n,i),this.drawLerpPoint(e,3*(1-r)*(1-r)*r,20,n,i),this.drawLerpPoint(e,3*(1-r)*r*r,20,n,i),this.drawLerpPoint(e,r*r*r,20,n,i)}this.drawFunction(e,"first term",{x:40,y:n},function(e){return{x:20+e*n,y:20+n*(1-e)*(1-e)*(1-e)}}),this.drawFunction(e,"second term",{x:t/2-80,y:t/2},function(e){return{x:20+e*n,y:20+3*n*(1-e)*(1-e)*e}}),this.drawFunction(e,"third term",{x:t/2+40,y:t/2},function(e){return{x:20+e*n,y:20+3*n*(1-e)*e*e}}),this.drawFunction(e,"fourth term",{x:n-50,y:n},function(e){return{x:20+e*n,y:20+n*e*e*e}})},draw15thLerp:function(e){e.reset();var t=e.getPanelWidth(),n=t-40;e.drawAxes(20,"t",0,1,"S","0%","100%");var i,r=[1,15,105,455,1365,3003,5005,6435,6435,5005,3003,1365,455,105,15,1],a=e.hover;if(a&&a.x>=20&&a.x<=t-20)for(this.drawLerpBox(e,t,20,a),i=0;i<=15;i++){var o=(a.x-20)/n,s=r[i]*Math.pow(1-o,15-i)*Math.pow(o,i);this.drawLerpPoint(e,s,20,n,a)}for(i=0;i<=15;i++){var l=!1,c=!1;0===i&&(l="first term",c={x:25,y:n}),15===i&&(l="last term",c={x:t-70,y:n}),this.drawFunction(e,l,c,function(e){return{x:20+e*n,y:20+n*r[i]*Math.pow(1-e,15-i)*Math.pow(e,i)}})}}}},function(e,t,n){"use strict";var i=n(58),r=n(0);e.exports=r("control",i)},function(e,t,n){"use strict";var i=Math.abs;e.exports={setup:function(e){this.api=e,e.setPanelCount(3);var t=new e.Bezier(10,100,90,30,40,140,220,220),n=new e.Bezier(5,150,180,20,80,250,210,190);e.setCurve(t,n),this.pairReset()},pairReset:function(){this.prevstep=0,this.step=0},draw:function(e,t){var n=this;e.reset();var r={x:0,y:0};t.forEach(function(t){e.drawSkeleton(t),e.drawCurve(t)});var a=e.getPanelWidth(),o=e.getPanelHeight();if(r.x+=a,e.drawLine({x:0,y:0},{x:0,y:o},r),0===this.step&&(this.pairs=[{c1:t[0],c2:t[1]}]),this.step!==this.prevstep){var s=this.pairs;this.pairs=[],this.finals=[],s.forEach(function(t){if(t.c1.length()<.6&&t.c2.length()<.6)return n.finals.push(t);var i=t.c1.split(.5);e.setColor("black"),e.drawCurve(t.c1,r),e.setColor("red"),e.drawbbox(i.left.bbox(),r),e.drawbbox(i.right.bbox(),r);var a=t.c2.split(.5);e.setColor("black"),e.drawCurve(t.c2,r),e.setColor("blue"),e.drawbbox(a.left.bbox(),r),e.drawbbox(a.right.bbox(),r),i.left.overlaps(a.left)&&n.pairs.push({c1:i.left,c2:a.left}),i.left.overlaps(a.right)&&n.pairs.push({c1:i.left,c2:a.right}),i.right.overlaps(a.left)&&n.pairs.push({c1:i.right,c2:a.left}),i.right.overlaps(a.right)&&n.pairs.push({c1:i.right,c2:a.right})}),this.prevstep=this.step}else this.pairs.forEach(function(t){e.setColor("black"),e.drawCurve(t.c1,r),e.drawCurve(t.c2,r),e.setColor("red"),e.drawbbox(t.c1.bbox(),r),e.setColor("blue"),e.drawbbox(t.c2.bbox(),r)});0===this.pairs.length&&(this.pairReset(),this.draw(e,t)),r.x+=a,e.setColor("black"),e.drawLine({x:0,y:0},{x:0,y:o},r);var l,c,h=t[0].intersects(t[1]).map(function(e){var t=e.split("/").map(function(e){return parseFloat(e)});return{t1:t[0],t2:t[1]}}),u=h[0];for(c=1;c.95)&&(e.text("t = "+Math.round(u),{x:h.x+1.25*s*Math.cos(u)-10,y:h.y+1.25*l*Math.sin(u)+5}),e.drawCircle(c,2,h))}}}},function(e,t,n){"use strict";var i=n(65),r=n(0),a=n(2);e.exports=a(r("explanation",i))},function(e,t,n){"use strict";e.exports={setupQuadratic:function(e){var t=new e.Bezier(70,155,20,110,100,75);e.setCurve(t)},setupCubic:function(e){var t=new e.Bezier(60,105,75,30,215,115,140,160);e.setCurve(t)},draw:function(e,t){e.reset(),e.drawSkeleton(t),e.drawCurve(t),e.setColor("lightgrey");var n,i,r=t.get(-10.05);for(n=-10;n<=.05;n+=.05)i=t.get(n),e.drawLine(r,i),r=i;r=t.get(1);for(n=1.05;n<=10;n+=.05)i=t.get(n),e.drawLine(r,i),r=i}}},function(e,t,n){"use strict";var i=n(67),r=n(0);e.exports=r("extended",i)},function(e,t,n){"use strict";e.exports={setupQuadratic:function(e){var t=e.getDefaultQuadratic();t.points[2].x=210,e.setCurve(t)},setupCubic:function(e){var t=e.getDefaultCubic();e.setCurve(t)},draw:function(e,t){e.setPanelCount(3),e.reset(),e.drawSkeleton(t),e.drawCurve(t);var n=t.order+1,i=t.points,r=e.getPanelWidth(),a=e.getPanelHeight(),o={x:r,y:0},s=JSON.parse(JSON.stringify(i)).map(function(e,t){return{x:r*t/n,y:e.x}});e.setColor("black"),e.drawLine({x:0,y:0},{x:0,y:a},o),e.drawAxes(20,"t",0,1,"x",0,r,o),o.x+=20;var l=new e.Bezier(s);e.drawCurve(l,o),e.setColor("red"),l.extrema().y.forEach(function(t){var n=l.get(t);e.drawCircle(n,3,o)}),o.x+=r-20;var c=JSON.parse(JSON.stringify(i)).map(function(e,t){return{x:r*t/n,y:e.y}});e.setColor("black"),e.drawLine({x:0,y:0},{x:0,y:a},o),e.drawAxes(20,"t",0,1,"y",0,r,o),o.x+=20;var h=new e.Bezier(c);e.drawCurve(h,o),e.setColor("red"),h.extrema().y.forEach(function(t){var n=h.get(t);e.drawCircle(n,3,o)})}}},function(e,t,n){"use strict";var i=n(69),r=n(0);e.exports=r("extremities",i)},function(e,t,n){"use strict";e.exports={statics:{keyHandlingOptions:{propName:"steps",values:{38:1,40:-1},controller:function(e){e.steps<1&&(e.steps=1)}}},setupQuadratic:function(e){var t=e.getDefaultQuadratic();e.setCurve(t),e.steps=3},setupCubic:function(e){var t=e.getDefaultCubic();e.setCurve(t),e.steps=5},drawFlattened:function(e,t){e.reset(),e.setColor("#DDD"),e.drawSkeleton(t),e.setColor("#DDD"),e.drawCurve(t);for(var n,i=1/e.steps,r=t.points[0],a=i;a<1+i;a+=i)n=t.get(Math.min(a,1)),e.setColor("red"),e.drawLine(r,n),r=n;e.setFill("black"),e.text("Curve approximation using "+e.steps+" segments",{x:10,y:15})},values:{38:1,40:-1},onKeyDown:function(e,t){var n=this.values[e.keyCode];n&&(e.preventDefault(),t.steps+=n,t.steps<1&&(t.steps=1))}}},function(e,t,n){"use strict";var i=n(71),r=n(0),a=n(2);e.exports=a(r("flattening",i))},function(e,t,n){"use strict";e.exports={statics:{keyHandlingOptions:{propName:"distance",values:{38:1,40:-1}}},setup:function(e,t){e.setCurve(t),e.distance=20},setupQuadratic:function(e){var t=e.getDefaultQuadratic();this.setup(e,t)},setupCubic:function(e){var t=e.getDefaultCubic();this.setup(e,t)},draw:function(e,t){e.reset(),e.drawSkeleton(t),e.drawCurve(t),e.setColor("blue"),t.outline(0,0,e.distance,e.distance).curves.forEach(function(t){return e.drawCurve(t)})}}},function(e,t,n){"use strict";var i=n(73),r=n(0),a=n(2);e.exports=a(r("graduatedoffset",i))},function(e,t,n){"use strict";e.exports={setupCubic:function(e){var t=new e.Bezier(135,25,25,135,215,75,215,240);e.setCurve(t)},draw:function(e,t){e.reset(),e.drawSkeleton(t),e.drawCurve(t),e.setColor("red"),t.inflections().forEach(function(n){e.drawCircle(t.get(n),5)})}}},function(e,t,n){"use strict";var i=n(75),r=n(0);e.exports=r("inflections",i)},function(e,t,n){"use strict";var i=Math.min,r=Math.max;e.exports={setupLines:function(e){var t=new e.Bezier([50,50,150,110]),n=new e.Bezier([50,250,170,170]);e.setCurve(t,n)},drawLineIntersection:function(e,t){e.reset();var n=e.utils.lli4,a=n(t[0].points[0],t[0].points[1],t[1].points[0],t[1].points[1]),o=0;t.forEach(function(t){if(e.drawSkeleton(t),e.setColor("black"),a){var n=t.points,s=i(n[0].x,n[1].x),l=i(n[0].y,n[1].y),c=r(n[0].x,n[1].x),h=r(n[0].y,n[1].y);s<=a.x&&l<=a.y&&c>=a.x&&h>=a.y&&(e.setColor("#00FF00"),o++)}e.drawCurve(t)}),a&&(e.setColor(o<2?"red":"#00FF00"),e.drawCircle(a,3))},setupQuadratic:function(e){var t=e.getDefaultQuadratic(),n=new e.Bezier([15,250,220,20]);e.setCurve(t,n)},setupCubic:function(e){var t=new e.Bezier([100,240,30,60,210,230,160,30]),n=new e.Bezier([25,260,230,20]);e.setCurve(t,n)},draw:function(e,t){e.reset(),t.forEach(function(t){e.drawSkeleton(t),e.drawCurve(t)});var n=e.utils,i={p1:t[1].points[0],p2:t[1].points[1]},r=n.align(t[0].points,i),a=new e.Bezier(r);n.roots(a.points).forEach(function(n){var i=t[0].get(n);e.drawCircle(i,3),e.text("t = "+n,{x:i.x+5,y:i.y+10})})}}},function(e,t,n){"use strict";var i=n(77),r=n(0);e.exports=r("intersections",i)},function(e,t,n){"use strict";e.exports={drawQuadratic:function(e){var t=e.getDefaultQuadratic();e.setCurve(t)},drawCubic:function(e){var t=e.getDefaultCubic();e.setCurve(t)},drawCurve:function(e,t){e.reset(),e.drawSkeleton(t),e.drawCurve(t)}}},function(e,t,n){"use strict";var i=n(79),r=n(0);e.exports=r("introduction",i)},function(e,t,n){"use strict";var i=n(0);e.exports=i("matrix")},function(e,t,n){"use strict";var i=n(0);e.exports=i("matrixsplit")},function(e,t,n){"use strict";var i=Math.abs;e.exports={setupQuadratic:function(e){e.setPanelCount(3);var t=e.getDefaultQuadratic();t.points[2].x-=30,e.setCurve(t)},setupCubic:function(e){e.setPanelCount(3);var t=new e.Bezier([100,230,30,160,200,50,210,160]);t.points[2].y-=20,e.setCurve(t),e.lut=t.getLUT(100)},saveCurve:function(e,t){t.t&&(t.setCurve(t.newcurve),t.t=!1,t.redraw())},findTValue:function(e,t){var n=t.curve.on({x:e.offsetX,y:e.offsetY},7);return!(n<.05||n>.95)&&n},markQB:function(e,t){if(t.t=this.findTValue(e,t),t.t){var n=t.t,r=2*n,a=r*n-r,o=a+1,s=i(a/o),l=t.curve,c=t.A=l.points[1],h=t.B=l.get(n);t.C=t.utils.lli4(c,h,l.points[0],l.points[2]),t.ratio=s}},markCB:function(e,t){if(t.t=this.findTValue(e,t),t.t){var n=t.t,r=1-n,a=n*n*n,o=r*r*r,s=a+o,l=s-1,c=i(l/s),h=t.curve,u=h.hull(n),d=t.A=u[5],f=t.B=h.get(n);t.db=h.derivative(n),t.C=t.utils.lli4(d,f,h.points[0],h.points[3]),t.ratio=c}},drag:function(e,t){if(t.t){var n=t.newB={x:e.offsetX,y:e.offsetY};t.newA={x:n.x-(t.C.x-n.x)/t.ratio,y:n.y-(t.C.y-n.y)/t.ratio}}},dragQB:function(e,t){t.t&&(this.drag(e,t),t.update=[t.newA])},dragCB:function(e,t){if(t.t){this.drag(e,t);var n=t.curve,i=n.hull(t.t),r=t.B,a=i[7],o=i[8],s={x:a.x-r.x,y:a.y-r.y},l={x:o.x-r.x,y:o.y-r.y},c=n.points,h={x:t.newB.x+s.x,y:t.newB.y+s.y},u={x:t.newA.x-(t.newA.x-h.x)/(1-t.t),y:t.newA.y-(t.newA.y-h.y)/(1-t.t)},d={x:t.newB.x+l.x,y:t.newB.y+l.y},f={x:t.newA.x+(d.x-t.newA.x)/t.t,y:t.newA.y+(d.y-t.newA.y)/t.t},m={x:c[0].x+(u.x-c[0].x)/t.t,y:c[0].y+(u.y-c[0].y)/t.t},p={x:c[3].x-(c[3].x-f.x)/(1-t.t),y:c[3].y-(c[3].y-f.y)/(1-t.t)};t.p1=h,t.p2=d,t.sc1=u,t.sc2=f,t.nc1=m,t.nc2=p,t.update=[m,p]}},drawMould:function(e,t){e.reset(),e.drawSkeleton(t),e.drawCurve(t);var n=e.getPanelWidth(),i=e.getPanelHeight(),r={x:n,y:0},a=e.utils.round;if(e.setColor("black"),e.drawLine({x:0,y:0},{x:0,y:i},r),e.drawLine({x:n,y:0},{x:n,y:i},r),e.t){e.drawCircle(t.get(e.t),3),e.npts=[t.points[0]].concat(e.update).concat([t.points.slice(-1)[0]]),e.newcurve=new e.Bezier(e.npts),e.setColor("lightgrey"),e.drawCurve(e.newcurve);var o=e.drawHull(e.newcurve,e.t,r);if(e.drawLine(e.npts[0],e.npts.slice(-1)[0],r),e.drawLine(e.newA,e.newB,r),e.setColor("grey"),e.drawCircle(e.newA,3,r),e.setColor("blue"),e.drawCircle(e.B,3,r),e.drawCircle(e.C,3,r),e.drawCircle(e.newB,3,r),e.drawLine(e.B,e.C,r),e.drawLine(e.newB,e.C,r),e.setFill("black"),e.text("A'",e.newA,{x:r.x+7,y:r.y+1}),e.text("start",t.get(0),{x:r.x+7,y:r.y+1}),e.text("end",t.get(1),{x:r.x+7,y:r.y+1}),e.setFill("blue"),e.text("B'",e.newB,{x:r.x+7,y:r.y+1}),e.text("B, at t = "+a(e.t,2),e.B,{x:r.x+7,y:r.y+1}),e.text("C",e.C,{x:r.x+7,y:r.y+1}),3===t.order){var s=t.hull(e.t);e.drawLine(s[7],s[8],r),e.drawLine(o[7],o[8],r),e.drawCircle(o[7],3,r),e.drawCircle(o[8],3,r),e.text("e1",o[7],{x:r.x+7,y:r.y+1}),e.text("e2",o[8],{x:r.x+7,y:r.y+1})}r.x+=n,e.setColor("lightgrey"),e.drawSkeleton(e.newcurve,r),e.setColor("black"),e.drawCurve(e.newcurve,r)}else r.x+=n,e.drawCurve(t,r)}}},function(e,t,n){"use strict";var i=n(83),r=n(0);e.exports=r("moulding",i)},function(e,t,n){"use strict";e.exports={statics:{keyHandlingOptions:{propName:"distance",values:{38:1,40:-1}}},setup:function(e,t){e.setCurve(t),e.distance=20},setupQuadratic:function(e){var t=e.getDefaultQuadratic();this.setup(e,t)},setupCubic:function(e){var t=e.getDefaultCubic();this.setup(e,t)},draw:function(e,t){e.reset(),e.drawSkeleton(t);var n=t.reduce();n.forEach(function(t){e.setRandomColor(),e.drawCurve(t),e.drawCircle(t.points[0],1)});var i=n.slice(-1)[0];e.drawPoint(i.points[3]||i.points[2]),e.setColor("red");var r=t.offset(e.distance);r.forEach(function(t){e.drawPoint(t.points[0]),e.drawCurve(t)}),i=r.slice(-1)[0],e.drawPoint(i.points[3]||i.points[2]),e.setColor("blue"),r=t.offset(-e.distance),r.forEach(function(t){e.drawPoint(t.points[0]),e.drawCurve(t)}),i=r.slice(-1)[0],e.drawPoint(i.points[3]||i.points[2])}}},function(e,t,n){"use strict";var i=n(85),r=n(0),a=n(2);e.exports=a(r("offsetting",i))},function(e,t,n){"use strict";var i=Math.abs;e.exports={setup:function(e){e.lpts=[{x:56,y:153},{x:144,y:83},{x:188,y:185}]},onClick:function(e,t){3==t.lpts.length&&(t.lpts=[]),t.lpts.push({x:e.offsetX,y:e.offsetY}),t.redraw()},getQRatio:function(e){var t=2*e,n=t*e-t;return i(n/(n+1))},getCRatio:function(e){var t=1-e,n=e*e*e,r=t*t*t,a=n+r;return i((a-1)/a)},drawQuadratic:function(e,t){var n=["start","t=0.5","end"];if(e.reset(),e.setColor("lightblue"),e.drawGrid(10,10),e.setFill("black"),e.setColor("black"),e.lpts.forEach(function(t,i){e.drawCircle(t,3),e.text(n[i],t,{x:5,y:2})}),3===e.lpts.length){var i=e.lpts[0],r=e.lpts[2],a=e.lpts[1],o={x:(i.x+r.x)/2,y:(i.y+r.y)/2};e.setColor("blue"),e.drawLine(i,r),e.drawLine(a,o),e.drawCircle(o,3);var s=this.getQRatio(.5),l={x:a.x+(a.x-o.x)/s,y:a.y+(a.y-o.y)/s};t=new e.Bezier([i,l,r]),e.setColor("lightgrey"),e.drawLine(l,a),e.drawLine(l,i),e.drawLine(l,r),e.setColor("black"),e.drawCircle(l,1),e.drawCurve(t)}},drawCubic:function(e,t){var n=["start","t=0.5","end"];if(e.reset(),e.setFill("black"),e.setColor("black"),e.lpts.forEach(function(t,i){e.drawCircle(t,3),e.text(n[i],t,{x:5,y:2})}),e.setColor("lightblue"),e.drawGrid(10,10),3===e.lpts.length){var i=e.lpts[0],r=e.lpts[2],a=e.lpts[1],o={x:(i.x+r.x)/2,y:(i.y+r.y)/2};e.setColor("blue"),e.drawLine(i,r),e.drawLine(a,o),e.drawCircle(o,1);var s=this.getCRatio(.5),l={x:a.x+(a.x-o.x)/s,y:a.y+(a.y-o.y)/s},c=e.utils.dist(i,r),h=c/8,u=e.utils.dist(a,o),d=h+u/4,f=d*(r.x-i.x)/c,m=d*(r.y-i.y)/c,p={x:a.x-f,y:a.y-m},g={x:a.x+f,y:a.y+m},v={x:l.x+2*(p.x-l.x),y:l.y+2*(p.y-l.y)},w={x:l.x+2*(g.x-l.x),y:l.y+2*(g.y-l.y)},y={x:i.x+2*(v.x-i.x),y:i.y+2*(v.y-i.y)},b={x:r.x+2*(w.x-r.x),y:r.y+2*(w.y-r.y)};t=new e.Bezier([i,y,b,r]),e.drawLine(p,g),e.setColor("lightgrey"),e.drawLine(l,o),e.drawLine(l,v),e.drawLine(l,w),e.drawLine(i,y),e.drawLine(r,b),e.drawLine(y,b),e.setColor("black"),e.drawCircle(l,1),e.drawCircle(y,1),e.drawCircle(b,1),e.drawCurve(t)}}}},function(e,t,n){"use strict";var i=n(87),r=n(0);e.exports=r("pointcurves",i)},function(e,t,n){"use strict";function i(e){var t=Math.sqrt(e.x*e.x+e.y*e.y+e.z*e.z);return{x:e.x/t,y:e.y/t,z:e.z/t}}var r,a;e.exports={drawCube:function(e){var t=function(t){return e.project(t,r)},n=[{x:0,y:0,z:0},{x:200,y:0,z:0},{x:200,y:200,z:0},{x:0,y:200,z:0},{x:0,y:0,z:200},{x:200,y:0,z:200},{x:200,y:200,z:200},{x:0,y:200,z:200}].map(function(e){return t(e)});e.setColor("grey"),e.drawLine(n[1],n[2]),e.drawLine(n[2],n[3]),e.drawLine(n[1],n[5]),e.drawLine(n[2],n[6]),e.drawLine(n[3],n[7]),e.drawLine(n[4],n[5]),e.drawLine(n[5],n[6]),e.drawLine(n[6],n[7]),e.drawLine(n[7],n[4]),e.setColor("blue"),e.drawLine(n[0],n[1]),e.setColor("red"),e.drawLine(n[3],n[0]),e.setColor("green"),e.drawLine(n[0],n[4])},drawCurve:function(e,t,n){var i=function(t){return e.project(t,r)},a=t.map(function(e){return i(e)});n&&(e.setColor("rgba(0,0,0,0.2)"),e.drawCurve({points:t.map(function(t){return e.projectXY(t,r)})}),e.drawCurve({points:t.map(function(t){return e.projectYZ(t,r)})}),e.drawCurve({points:t.map(function(t){return e.projectXZ(t,r)})})),e.setColor("#333"),e.drawLine(a[0],a[1]),e.drawCircle(a[1],3),e.drawCircle(a[2],3),e.drawLine(a[2],a[3]),e.setColor("black"),e.drawCircle(a[0],3),e.drawCircle(a[3],3);new e.Bezier(a);e.drawCurve({points:a})},getVectors:function(e,t){var n,i,r,a,o,s,l;return n=e.get(t),i=e.derivative(t),r={x:n.x+i.x,y:n.y+i.y,z:n.z+i.z},o={x:r.y*n.z-r.z*n.y,y:r.z*n.x-r.x*n.z,z:r.x*n.y-r.y*n.x},a=Math.sqrt(o.x*o.x+o.y*o.y+o.z*o.z),o={x:o.x/a,y:o.y/a,z:o.z/a},s=[o.x*o.x,o.x*o.y-o.z,o.x*o.z+o.y,o.x*o.y+o.z,o.y*o.y,o.y*o.z-o.x,o.x*o.z-o.y,o.y*o.z+o.x,o.z*o.z],l={x:n.x*s[0]+n.y*s[1]+n.z*s[2],y:n.x*s[3]+n.y*s[4]+n.z*s[5],z:n.x*s[6]+n.y*s[7]+n.z*s[8]},{dt:n,a:i,ddt:r,r:o,R:s,n:l}},drawVector:function(e,t,n,a,o,s,l,c){var h=function(t){return e.project(t,r)};n=i(n),n={x:t.x+a*n.x,y:t.y+a*n.y,z:t.z+a*n.z},e.setColor("rgba("+o+","+s+","+l+",1)"),e.drawLine(h(t),h(n)),c&&(e.setColor("rgba("+o+","+s+","+l+",0.2)"),e.drawLine(e.projectXY(t,r),e.projectXY(n,r)),e.drawLine(e.projectXZ(t,r),e.projectXZ(n,r)),e.drawLine(e.projectYZ(t,r),e.projectYZ(n,r)))},setup:function(e){r={x:2*e.getPanelWidth()/5,y:4*e.getPanelHeight()/5},e.setSize(1.25*e.getPanelWidth(),e.getPanelHeight())},drawVectors:function(e){e.reset();this.drawCube(e);var t=[{x:120,y:0,z:0},{x:120,y:220,z:0},{x:30,y:0,z:30},{x:0,y:0,z:200}];this.drawCurve(e,t);var n=new e.Bezier(t),i=new e.Bezier(n.dpoints[0]),a=Math.max(e.hover.x?e.hover.x/e.getPanelWidth():0,0),o=n.get(a);e.drawCircle(function(t){return e.project(t,r)}(o),3);var s=this.getVectors(i,a);this.drawVector(e,o,s.dt,40,0,200,0),this.drawVector(e,o,s.r,40,0,0,200),this.drawVector(e,o,s.n,40,200,0,0)},setupNormals:function(e){a={x:2*e.getPanelWidth()/5,y:4*e.getPanelHeight()/5},e.setSize(1.25*e.getPanelWidth(),e.getPanelHeight())},drawNormals:function(e){e.reset();this.drawCube(e);var t=[{x:120,y:0,z:0},{x:120,y:220,z:0},{x:30,y:0,z:30},{x:0,y:0,z:200}];this.drawCurve(e,t,!0);var n=new e.Bezier(t),i=new e.Bezier(n.dpoints[0]),a=Math.max(e.hover.x?e.hover.x/e.getPanelWidth():0,0),o=n.get(a);e.drawCircle(function(t){return e.project(t,r)}(o),3);var s=this.getVectors(i,a);this.drawVector(e,o,s.dt,40,0,200,0,!0),this.drawVector(e,o,s.r,40,0,0,200,!0),this.drawVector(e,o,s.n,40,200,0,0,!0)}}},function(e,t,n){"use strict";var i=n(89),r=n(0);e.exports=r("pointvectors3d",i)},function(e,t,n){"use strict";e.exports={setupQuadratic:function(e){var t=e.getDefaultQuadratic();e.setCurve(t)},setupCubic:function(e){var t=e.getDefaultCubic();e.setCurve(t)},draw:function(e,t){e.reset(),e.drawSkeleton(t);var n,i,r,a,o,s;for(n=0;n<=10;n++)i=n/10,r=t.get(i),a=t.derivative(i),s=Math.sqrt(a.x*a.x+a.y*a.y),a={x:a.x/s,y:a.y/s},o=t.normal(i),e.setColor("blue"),e.drawLine(r,{x:r.x+20*a.x,y:r.y+20*a.y}),e.setColor("red"),e.drawLine(r,{x:r.x+20*o.x,y:r.y+20*o.y}),e.setColor("black"),e.drawCircle(r,3)}}},function(e,t,n){"use strict";var i=n(91),r=n(0);e.exports=r("pointvectors",i)},function(e,t,n){"use strict";var i=Math.atan2,r=Math.sqrt,a=Math.sin,o=Math.cos;e.exports={setupQuadratic:function(e){var t=e.getPanelWidth(),n=e.getPanelHeight(),i=t/2,r=n/2,a=[{x:i,y:40},{x:t-40,y:40},{x:t-40,y:r},{x:t-40,y:n-40},{x:i,y:n-40},{x:40,y:n-40},{x:40,y:r},{x:40,y:40}];e.lpts=a},setupCubic:function(e){var t=e.getPanelWidth(),n=e.getPanelHeight(),i=t/2,r=n/2,a=(t-80)/2,o=.55228*a,s=[{x:i,y:40},{x:i+o,y:40},{x:t-40,y:r-o},{x:t-40,y:r},{x:t-40,y:r+o},{x:i+o,y:n-40},{x:i,y:n-40},{x:i-o,y:n-40},{x:40,y:r+o},{x:40,y:r},{x:40,y:r-o},{x:i-o,y:40}];e.lpts=s},movePointsQuadraticLD:function(e,t){for(var n,i,r,a=1;a<4;a++)n=t+(2*a-2)+e.lpts.length,n=e.lpts[n%e.lpts.length],i=t+(2*a-1),i=e.lpts[i%e.lpts.length],r=t+2*a,r=e.lpts[r%e.lpts.length],r.x=i.x+(i.x-n.x),r.y=i.y+(i.y-n.y);r=t+6,r=e.lpts[r%e.lpts.length],e.problem=r},movePointsCubicLD:function(e,t){var n,i;t%3==1?(i=t-1,i+=i<0?e.lpts.length:0,n=t-2,n+=n<0?e.lpts.length:0):(i=(t+1)%e.lpts.length,n=(t+2)%e.lpts.length),i=e.lpts[i],n=e.lpts[n],n.x=i.x+(i.x-e.mp.x),n.y=i.y+(i.y-e.mp.y)},linkDerivatives:function(e,t){if(t.mp){var n=8===t.lpts.length,i=t.mp_idx;n?i%2!=0&&this.movePointsQuadraticLD(t,i):i%3!=0&&this.movePointsCubicLD(t,i)}},movePointsQuadraticDirOnly:function(e,t){var n,s,l;[-1,1].forEach(function(c){n=e.mp,s=t+c+e.lpts.length,s=e.lpts[s%e.lpts.length],l=t+2*c+e.lpts.length,l=e.lpts[l%e.lpts.length];var h=i(s.y-n.y,s.x-n.x),u=l.x-s.x,d=l.y-s.y,f=r(u*u+d*d);l.x=s.x+f*o(h),l.y=s.y+f*a(h)}),l=t+4,l=e.lpts[l%e.lpts.length],e.problem=l},movePointsCubicDirOnly:function(e,t){var n,s;t%3==1?(s=t-1,s+=s<0?e.lpts.length:0,n=t-2,n+=n<0?e.lpts.length:0):(s=(t+1)%e.lpts.length,n=(t+2)%e.lpts.length),s=e.lpts[s],n=e.lpts[n];var l=i(s.y-e.mp.y,s.x-e.mp.x),c=n.x-s.x,h=n.y-s.y,u=r(c*c+h*h);n.x=s.x+u*o(l),n.y=s.y+u*a(l)},linkDirection:function(e,t){if(t.mp){var n=8===t.lpts.length,i=t.mp_idx;n?i%2!=0&&this.movePointsQuadraticDirOnly(t,i):i%3!=0&&this.movePointsCubicDirOnly(t,i)}},bufferPoints:function(e,t){t.bpts=JSON.parse(JSON.stringify(t.lpts))},moveQuadraticPoint:function(e,t){this.moveCubicPoint(e,t),[-1,1].forEach(function(n){var s=t-n+e.lpts.length;s=e.lpts[s%e.lpts.length];var l=t-2*n+e.lpts.length;l=e.lpts[l%e.lpts.length];var c=t-3*n+e.lpts.length;c=e.lpts[c%e.lpts.length];var h=i(l.y-s.y,l.x-s.x),u=c.x-l.x,d=c.y-l.y,f=r(u*u+d*d);c.x=l.x+f*o(h),c.y=l.y+f*a(h)});var n=t+4;n=e.lpts[n%e.lpts.length],e.problem=n},moveCubicPoint:function(e,t){var n=e.bpts[t],i=e.lpts[t],r=i.x-n.x,a=i.y-n.y,o=e.lpts.length,s=t-1+o,l=t+1,c=e.bpts[s%o],h=e.bpts[l%o],u=e.lpts[s%o],d=e.lpts[l%o];return u.x=c.x+r,u.y=c.y+a,d.x=h.x+r,d.y=h.y+a,{x:r,y:a}},modelCurve:function(e,t){if(t.mp){var n=8===t.lpts.length,i=t.mp_idx;n?i%2!=0?this.movePointsQuadraticDirOnly(t,i):this.moveQuadraticPoint(t,i):i%3!=0?this.movePointsCubicDirOnly(t,i):this.moveCubicPoint(t,i)}},draw:function(e,t){e.reset();var n=e.lpts,i=8===n.length,r=i?new e.Bezier(n[0],n[1],n[2]):new e.Bezier(n[0],n[1],n[2],n[3]);e.drawSkeleton(r,!1,!0),e.drawCurve(r);var a=i?new e.Bezier(n[2],n[3],n[4]):new e.Bezier(n[3],n[4],n[5],n[6]);e.drawSkeleton(a,!1,!0),e.drawCurve(a);var o=i?new e.Bezier(n[4],n[5],n[6]):new e.Bezier(n[6],n[7],n[8],n[9]);e.drawSkeleton(o,!1,!0),e.drawCurve(o);var s=i?new e.Bezier(n[6],n[7],n[0]):new e.Bezier(n[9],n[10],n[11],n[0]);e.drawSkeleton(s,!1,!0),e.drawCurve(s),e.problem&&(e.setColor("red"),e.drawCircle(e.problem,5))}}},function(e,t,n){"use strict";var i=n(93),r=n(0);e.exports=r("polybezier",i)},function(e,t,n){"use strict";var i=n(0);e.exports=i("preface")},function(e,t,n){"use strict";e.exports={setup:function(e){e.setSize(320,320);var t=new e.Bezier([{x:248,y:188},{x:218,y:294},{x:45,y:290},{x:12,y:236},{x:14,y:82},{x:186,y:177},{x:221,y:90},{x:18,y:156},{x:34,y:57},{x:198,y:18}]);e.setCurve(t),e._lut=t.getLUT()},findClosest:function(e,t,n){var i,r,a=e.length,o=n(e[0],t),s=0;for(i=1;i1;){for(var o=0;od){i--;break}i<0&&(i=0),i===c.length&&(i=c.length-1),u.push(c[i])}for(n=0;n0;o-=e.step)(a=o/100)>1||(e.setRandomColor(),n={x:d.x+a*(f.x-d.x),y:d.y+a*(f.y-d.y)},i={x:f.x+a*(m.x-f.x),y:f.y+a*(m.y-f.y)},r={x:n.x+a*(i.x-n.x),y:n.y+a*(i.y-n.y)},p={x:0,y:0},e.drawCircle(n,3,p),e.drawCircle(i,3,p),e.setWeight(.5),e.drawLine(n,i,p),e.setWeight(1.5),e.drawLine(d,n,p),e.drawLine(f,i,p),e.setWeight(1),p.x+=h,e.drawCircle(n,3,p),e.drawCircle(i,3,p),e.setWeight(.5),e.drawLine(n,i,p),e.setWeight(1.5),e.drawLine(n,r,p),e.setWeight(1),e.drawCircle(r,3,p),p.x+=h,e.drawCircle(r,3,p),e.text(o+"%, or t = "+e.utils.round(a,2),{x:r.x+10+p.x,y:r.y+10+p.y}))},values:{38:1,40:-1},onKeyDown:function(e,t){var n=this.values[e.keyCode];n&&(e.preventDefault(),t.step+=n,t.step<1&&(t.step=1))}}},function(e,t,n){"use strict";var i=n(108),r=n(0);e.exports=r("whatis",i)},function(e,t,n){"use strict";var i=n(1),r=n(15),a=n(4),o=n(12),s=n(17),l=n(21);a.locale="en-GB",e.exports={locale:"en-GB",preface:{locale:"en-GB",title:"Preface",getContent:function(e){return i.createElement("section",null,i.createElement(a,{name:"preface",title:"Preface"}),i.createElement("p",null,"In order to draw things in 2D, we usually rely on lines, which typically get classified into two categories: straight lines, and curves. The first of these are as easy to draw as they are easy to make a computer draw. Give a computer the first and last point in the line, and BAM! straight line. No questions asked."),i.createElement("p",null,"Curves, however, are a much bigger problem. While we can draw curves with ridiculous ease freehand, computers are a bit handicapped in that they can't draw curves unless there is a mathematical function that describes how it should be drawn. In fact, they even need this for straight lines, but the function is ridiculously easy, so we tend to ignore that as far as computers are concerned, all lines are \"functions\", regardless of whether they're straight or curves. However, that does mean that we need to come up with fast-to-compute functions that lead to nice looking curves on a computer. There's a number of these, and in this article we'll focus on a particular function that has received quite a bit of attention, and is used in pretty much anything that can draw curves: \"Bézier\" curves"),i.createElement("p",null,"They're named after ",i.createElement("a",{href:"https://en.wikipedia.org/wiki/Pierre_B%C3%A9zier"},"Pierre Bézier"),', who is principally responsible for getting them known to the world as a curve well-suited for design work (working for Renault and publishing his investigations in 1962), although he was not the first, or only one, to "invent" these type of curves. One might be tempted to say that the mathematician ',i.createElement("a",{href:"https://en.wikipedia.org/wiki/Paul_de_Casteljau"},"Paul de Casteljau"),' was first, investigating the nature of these curves in 1959 while working at Citroën, coming up with a really elegant way of figuring out how to draw them. However, de Casteljau did not publish his work, making the question "who was first" hard to answer in any absolute sense. Or is it? Bézier curves are, at their core, "Bernstein polynomials", a family of mathematical functions investigated by ',i.createElement("a",{href:"https://en.wikipedia.org/wiki/Sergei_Natanovich_Bernstein"},"Sergei Natanovich Bernstein"),", with publications on them at least as far back as 1912. Anyway, that's mostly trivia, what you are more likely to care about is that these curves are handy: you can link up multiple Bézier curves so that the combination looks like a single curve. If you've ever drawn Photoshop \"paths\" or worked with vector drawing programs like Flash, Illustrator or nkscape, those curves you've been drawing are Bézier curves."),i.createElement("p",null,"So, what if you need to program them yourself? What are the pitfalls? How do you draw them? What are the bounding boxes, how do you determine intersections, how can you extrude a curve, in short: how do you do everything that you might want when you do with these curves? That's what this page is for. Prepare to be mathed!"),i.createElement("p",null,"—Pomax (or in the tweetworld, ",i.createElement("a",{href:"https://twitter.com/TheRealPomax"},"@TheRealPomax"),")"),i.createElement("div",{className:"note"},i.createElement("h2",{id:"note-virtually-all-b-zier-graphics-are-interactive-"},"Note: virtually all Bézier graphics are interactive."),i.createElement("p",null,"This page uses interactive examples, relying heavily on ",i.createElement("a",{href:"http://pomax.github.io/bezierjs"},"Bezier.js"),', as well as "real" maths (in LaTeX form) which is typeset using the most excellent ',i.createElement("a",{href:"http://MathJax.org"},"MathJax")," library. The page is generated offline as a React application, using Webpack, which has made adding \"view source\" options considerably more challenging. I'm still trying to figure out how to add them back in, but it didn't feel like it should hold up deploying this update compared to the previous years' version."),i.createElement("h2",{id:"this-book-is-open-source-"},"This book is open source."),i.createElement("p",null,"This book is an open source software project, and lives on two github repositorites. The first is ",i.createElement("a",{href:"https://github.com/pomax/bezierinfo"},"https://github.com/pomax/bezierinfo")," and is the purely-for-presentation version you are viewing right now. The other repository is ",i.createElement("a",{href:"https://github.com/pomax/BezierInfo-2"},"https://github.com/pomax/BezierInfo-2"),", which is the development version, housing all the html, javascript, and css. You can fork either of these, and pretty much do with them as you please, except for passing it off as your own work wholesale, of course =)"),i.createElement("h2",{id:"how-complicated-is-the-maths-going-to-be-"},"How complicated is the maths going to be?"),i.createElement("p",null,"Most of the mathematics in this Primer are early high school maths. If you understand basic arithmetic, and you know how to read English, you should be able to get by just fine. There will at times be ",i.createElement("em",null,"far"),' more complicated maths, but if you don\'t feel like digesting them, you can safely skip over them by either skipping over the "detail boxes" in section or by just jumping to the end of a section with maths that looks too involving. The end of sections typically simply list the conclusions so you can just work with those values directly.'),i.createElement("h2",{id:"questions-comments-"},"Questions, comments:"),i.createElement("p",null,"If you have suggestions for new sections, hit up the ",i.createElement("a",{href:"https://github.com/pomax/BezierInfo-2/issues"},"Github issue tracker")," (also reachable from the repo linked to in the upper right). If you have questions about the material, there's currently no comment section while I'm doing the rewrite, but you can use the issue tracker for that as well. Once the rewrite is done, I'll add a general comment section back in, and maybe a more topical \"select this section of text and hit the 'question' button to ask a question about it\" system. We'll see."),i.createElement("h2",{id:"buy-me-a-coffee-"},"Buy me a coffee?"),i.createElement("p",null,"If you enjoyed this book, or you simply found it useful for something you were trying to get done, and you were wondering how to let me know you appreciated this book, you can always ",i.createElement("a",{href:"https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=QPRDLNGDANJSW"},"buy me a coffee"),", however-much a coffee is where you live. This work has grown over the years, from a small primer to a 70ish print-page-equivalent reader on the subject of Bézier curves, and a lot of coffee went into the making of it. I don't regret a minute I spent on writing it, but I can always do with some more coffee to keep on writing!")))}},introduction:{locale:"en-GB",title:"A lightning introduction",getContent:function(e){return i.createElement("section",null,i.createElement(a,{name:"introduction",title:"A lightning introduction",number:"1"}),i.createElement("p",null,"Let's start with the good stuff: when we're talking about Bézier curves, we're talking about the things that you can see in the following graphics. They run from some start point to some end point, with their curvature influenced by one or more \"intermediate\" control points. Now, because all the graphics on this page are interactive, go manipulate those curves a bit: click-drag the points, and see how their shape changes based on what you do."),i.createElement("div",{className:"figure"},i.createElement(r,{handler:e.props.handler,section:"introduction",inline:!0,title:"Quadratic Bézier curves",setup:e.drawQuadratic,sname:"drawQuadratic",draw:e.drawCurve,dname:"drawCurve"}),i.createElement(r,{handler:e.props.handler,section:"introduction",inline:!0,title:"Cubic Bézier curves",setup:e.drawCubic,sname:"drawCubic",draw:e.drawCurve,dname:"drawCurve"})),i.createElement("p",null,"These curves are used a lot in computer aided design and computer aided manufacturing (CAD/CAM) applications, as well as in graphic design programs like Adobe Illustrator and Photoshop, Inkscape, the Gimp, etc. and in graphic technologies like scalable vector graphics (SVG) and OpenType fonts (ttf/otf). A lot of things use Bézier curves, so if you want to learn more about them... prepare to get your learn on!"))}},whatis:{locale:"en-GB",title:"So what makes a Bézier Curve?",getContent:function(e){return i.createElement("section",null,i.createElement(a,{name:"whatis",title:"So what makes a Bézier Curve?",number:"2"}),i.createElement("p",null,"Playing with the points for curves may have given you a feel for how Bézier curves behave, but what ",i.createElement("em",null,"are")," Bézier curves, really? There are two ways to explain what a Bézier curve is, and they turn out to be the entirely equivalent, but one of them uses complicated maths, and the other uses really simple maths. So... let's start with the simple explanation:"),i.createElement("p",null,"Bezier curves are the result of ",i.createElement("a",{href:"https://en.wikipedia.org/wiki/Linear_interpolation"},"linear interpolations"),". That sounds complicated but you've been doing linear interpolation since you were very young: any time you had to point at something between two other things, you've been applying linear interpolation. It's simply \"picking a point between two points\"."),i.createElement("p",null,"If we know the distance between those two points, and we want a new point that is, say, 20% the distance away from the first point (and thus 80% the distance away from the second point) then we can compute that really easily:"),i.createElement("img",{className:"LaTeX SVG",src:"images/latex/8090904d6448ed0c8e6151aecf62f361d51ead96.svg",width:"526.4",height:"107.8"}),i.createElement("p",null,"So let's look at that in action: the following graphic is interactive in that you can use your up and down arrow keys to increase or decrease the interpolation ratio, to see what happens. We start with three points, which gives us two lines. Linear interpolation over those lines gives use two points, between which we can again perform linear interpolation, yielding a single point. And that point —and all points we can form in this way for all ratios taken together— form our Bézier curve:"),i.createElement(r,{handler:e.props.handler,section:"whatis",title:"Linear Interpolation leading to Bézier curves",setup:e.setup,sname:"setup",draw:e.draw,dname:"draw",onKeyDown:e.onKeyDown}),i.createElement("p",null,"And that brings us to the complicated maths: calculus."),i.createElement("p",null,'While it doesn\'t look like that\'s what we\'ve just done, we actually just drew a quadratic curve, in steps, rather than in a single go. One of the fascinating parts about Bézier curves is that they can both be described in terms of polynomial functions, as well as in terms of very simple interpolations of interpolations of [...]. That, in turn, means we can look at what these curves can do based on both "real maths" (by examining the functions, their derivatives, and all that stuff), as well as by looking at the "mechanical" composition (which tells us that a curve will never extend beyond the points we used to construct it, for instance)'),i.createElement("p",null,"So let's start looking at Bézier curves a bit more in depth. Their mathematical expressions, the properties we can derive from those, and the various things we can do to, and with, Bézier curves."))}},explanation:{locale:"en-GB",title:"The mathematics of Bézier curves",getContent:function(e){return i.createElement("section",null,i.createElement(a,{name:"explanation",title:"The mathematics of Bézier curves",number:"3"}),i.createElement("p",null,'Bézier curves are a form of "parametric" function. Mathematically speaking, parametric functions are cheats: a "function" is actually a well defined term representing a mapping from any number of inputs to a ',i.createElement("strong",null,"single")," output. Numbers go in, a single number comes out. Change the numbers that go in, and the number that comes out is still a single number. Parametric functions cheat. They basically say \"alright, well, we want multiple values coming out, so we'll just use more than one function\". An illustration: Let's say we have a function that maps some value, let's call it ",i.createElement("i",null,"x"),", to some other value, using some kind of number manipulation:"),i.createElement("img",{className:"LaTeX SVG",src:"images/latex/785e792c343b71d4e674ac94d8800940b30917ac.svg",width:"100.8",height:"18.2"}),i.createElement("p",null,"The notation ",i.createElement("i",null,"f(x)")," is the standard way to show that it's a function (by convention called ",i.createElement("i",null,"f")," if we're only listing one) and its output changes based on one variable (in this case, ",i.createElement("i",null,"x"),"). Change ",i.createElement("i",null,"x"),", and the output for ",i.createElement("i",null,"f(x)")," changes."),i.createElement("p",null,"So far so good. Now, let's look at parametric functions, and how they cheat. Let's take the following two functions:"),i.createElement("img",{className:"LaTeX SVG",src:"images/latex/0dfe7562b43441e72201ff4cdd2e8b6e2e3ecb2d.svg",width:"98",height:"37.8"}),i.createElement("p",null,"There's nothing really remarkable about them, they're just a sine and cosine function, but you'll notice the inputs have different names. If we change the value for ",i.createElement("i",null,"a"),", we're not going to change the output value for ",i.createElement("i",null,"f(b)"),", since ",i.createElement("i",null,"a")," isn't used in that function. Parametric functions cheat by changing that. In a parametric function all the different functions share a variable, like this:"),i.createElement("img",{className:"LaTeX SVG",src:"images/latex/ed6f533530199d1e99b3319ba137c1327b0459c0.svg",width:"105",height:"42"}),i.createElement("p",null,"Multiple functions, but only one variable. If we change the value for ",i.createElement("i",null,"t"),", we change the outcome of both ",i.createElement("i",null,"f",i.createElement("sub",null,"a"),"(t)")," and ",i.createElement("i",null,"f",i.createElement("sub",null,"b"),"(t)"),". You might wonder how that's useful, and the answer is actually pretty simple: if we change the labels ",i.createElement("i",null,"f",i.createElement("sub",null,"a"),"(t)")," and ",i.createElement("i",null,"f",i.createElement("sub",null,"b"),"(t)")," with what we usually mean with them for parametric curves, things might be a lot more obvious:"),i.createElement("img",{className:"LaTeX SVG",src:"images/latex/ea632ea75d6a2aeb6fe69c07feb6e76f81884746.svg",width:"81.19999999999999",height:"42"}),i.createElement("p",null,"There we go. ",i.createElement("i",null,"x"),"/",i.createElement("i",null,"y")," coordinates, linked through some mystery value ",i.createElement("i",null,"t"),"."),i.createElement("p",null,"So, parametric curves don't define a ",i.createElement("i",null,"y")," coordinate in terms of an ",i.createElement("i",null,"x"),' coordinate, like normal functions do, but they instead link the values to a "control" variable. If we vary the value of ',i.createElement("i",null,"t"),", then with every change we get ",i.createElement("strong",null,"two")," values, which we can use as (",i.createElement("i",null,"x"),",",i.createElement("i",null,"y"),") coordinates in a graph. The above set of functions, for instance, generates points on a circle: We can range ",i.createElement("i",null,"t")," from negative to positive infinity, and the resulting (",i.createElement("i",null,"x"),",",i.createElement("i",null,"y"),") coordinates will always lie on a circle with radius 1 around the origin (0,0). If we plot it for ",i.createElement("i",null,"t")," from 0 to 5, we get this (use your up and down arrow keys to change the plot end value):"),i.createElement(r,{handler:e.props.handler,section:"explanation",title:"A (partial) circle: x=sin(t), y=cos(t)",static:!0,setup:e.setup,sname:"setup",draw:e.draw,dname:"draw",onKeyDown:e.props.onKeyDown}),i.createElement("p",null,"Bézier curves are (one in many classes of) parametric functions, and are characterised by using the same base function for all its dimensions. Unlike the above example, where the ",i.createElement("i",null,"x")," and ",i.createElement("i",null,"y"),' values use different functions (one uses a sine, the other a cosine), Bézier curves use the "binomial polynomial" for both ',i.createElement("i",null,"x")," and ",i.createElement("i",null,"y"),". So what are binomial polynomials?"),i.createElement("p",null,"You may remember polynomials from high school, where they're those sums that look like:"),i.createElement("img",{className:"LaTeX SVG",src:"images/latex/3e8b26cf8833db7089d65e9c6b3953a3140bb19f.svg",width:"224",height:"21"}),i.createElement("p",null,"If they have a highest order term ",i.createElement("i",null,"x³")," they're called \"cubic\" polynomials, if it's ",i.createElement("i",null,"x²")," it's a \"square\" polynomial, if it's just ",i.createElement("i",null,"x")," it's a line (and if there aren't even any terms with ",i.createElement("i",null,"x")," it's not a polynomial!)"),i.createElement("p",null,"Bézier curves are polynomials of ",i.createElement("i",null,"t"),", rather than ",i.createElement("i",null,"x"),", with the value for ",i.createElement("i",null,"t")," fixed being between 0 and 1, with coefficients ",i.createElement("i",null,"a"),", ",i.createElement("i",null,"b"),' etc. taking the "binomial" form, which sounds fancy but is actually a pretty simple description for mixing values:'),i.createElement("img",{className:"LaTeX SVG",src:"images/latex/565d935cab46bc995f53190102dadfdd1afc08f6.svg",width:"385",height:"68.6"}),i.createElement("p",null,"I know what you're thinking: that doesn't look too simple, but if we remove ",i.createElement("i",null,"t"),' and add in "times one", things suddenly look pretty easy. Check out these binomial terms:'),i.createElement("img",{className:"LaTeX SVG",src:"images/latex/8c618738924e53a313a31fa407b3d91155525ee1.svg",width:"219.79999999999998",height:"91"}),i.createElement("p",null,'Notice that 2 is the same as 1+1, and 3 is 2+1 and 1+2, and 6 is 3+3... As you can see, each time we go up a dimension, we simply start and end with 1, and everything in between is just "the two numbers above it, added together". Now ',i.createElement("i",null,"that's")," easy to remember."),i.createElement("p",null,"There's an equally simple way to figure out how the polynomial terms work: if we rename ",i.createElement("i",null,"(1-t)")," to ",i.createElement("i",null,"a")," and ",i.createElement("i",null,"t")," to ",i.createElement("i",null,"b"),", and remove the weights for a moment, we get this:"),i.createElement("img",{className:"LaTeX SVG",src:"images/latex/c8740a3a9a63b592e1480883a54024ebdaffaf05.svg",width:"316.4",height:"62.99999999999999"}),i.createElement("p",null,"It's basically just a sum of \"every combination of ",i.createElement("i",null,"a")," and ",i.createElement("i",null,"b"),'", progressively replacing ',i.createElement("i",null,"a"),"'s with ",i.createElement("i",null,"b"),"'s after every + sign. So that's actually pretty simple too. So now you know binomial polynomials, and just for completeness I'm going to show you the generic function for this:"),i.createElement("img",{className:"LaTeX SVG",src:"images/latex/444a01611e5709f702c36f6ca17aa2761c0877a9.svg",width:"315",height:"57.4"}),i.createElement("p",null,"And that's the full description for Bézier curves. Σ in this function indicates that this is a series of additions (using the variable listed below the Σ, starting at ...= and ending at the value listed on top of the Σ)."),i.createElement("div",{className:"howtocode"},i.createElement("h3",{id:"how-to-implement-the-basis-function"},"How to implement the basis function"),i.createElement("p",null,"We could naively implement the basis function as a mathematical construct, using the function as our guide, like this:"),i.createElement("pre",null,"function Bezier(n,t):\n sum = 0\n for(k=0; k= lut.length):\n s = lut.length\n nextRow = new array(size=s+1)\n nextRow[0] = 1\n for(i=1, prev=s-1; i