diff --git a/cvat-canvas/README.md b/cvat-canvas/README.md index f61c3f87..a9afef2e 100644 --- a/cvat-canvas/README.md +++ b/cvat-canvas/README.md @@ -1,10 +1,8 @@ # Module CVAT-CANVAS ## Description -The CVAT module presents a canvas to viewing, drawing and editing of annotations. - -- It has been written on typescript -- It contains the class ```Canvas``` and the enum ```Rotation``` +The CVAT module written in TypeScript language. +It presents a canvas to viewing, drawing and editing of annotations. ## Commands - Building of the module from sources in the ```dist``` directory: @@ -21,15 +19,7 @@ npm version minor # updated after major changes which don't affect API compati npm version major # updated after major changes which affect API compatibility with previous versions ``` -## Creation -Canvas is created by using constructor: - -```js - const { Canvas } = require('./canvas'); - const canvas = new Canvas(ObjectStateClass); -``` - -- Canvas has transparent background +## Using Canvas itself handles: - Shape context menu (PKM) @@ -39,12 +29,14 @@ Canvas itself handles: - Remove point (PKM) - Polyshape editing (Shift + LKM) -## API -### Methods - -All methods are sync. +### API Methods ```ts + enum Rotation { + ANTICLOCKWISE90, + CLOCKWISE90, + } + interface DrawData { enabled: boolean; shapeType?: string; @@ -53,23 +45,38 @@ All methods are sync. crosshair?: boolean; } - html(): HTMLDivElement; - setup(frameData: FrameData, objectStates: ObjectState): void; - activate(clientID: number, attributeID?: number): void; - rotate(rotation: Rotation, remember?: boolean): void; - focus(clientID: number, padding?: number): void; - fit(): void; - grid(stepX: number, stepY: number): void; + interface GroupData { + enabled: boolean; + resetGroup?: boolean; + } - draw(drawData: DrawData): void; - split(enabled?: boolean): void; - group(enabled?: boolean): void; - merge(enabled?: boolean): void; + interface MergeData { + enabled: boolean; + } + + interface SplitData { + enabled: boolean; + } - cancel(): any; + interface Canvas { + html(): HTMLDivElement; + setup(frameData: any, objectStates: any[]): void; + activate(clientID: number, attributeID?: number): void; + rotate(rotation: Rotation, remember?: boolean): void; + focus(clientID: number, padding?: number): void; + fit(): void; + grid(stepX: number, stepY: number): void; + + draw(drawData: DrawData): void; + group(groupData: GroupData): void; + split(splitData: SplitData): void; + merge(mergeData: MergeData): void; + + cancel(): void; + } ``` -### CSS Classes/IDs +### API CSS - All drawn objects (shapes, tracks) have an id ```cvat_canvas_object_{objectState.id}``` - Drawn shapes and tracks have classes ```cvat_canvas_shape```, @@ -90,15 +97,72 @@ Standard JS events are used. - canvas.setup - canvas.activated => ObjectState - canvas.deactivated - - canvas.moved => [ObjectState], x, y - - canvas.drawn => ObjectState - - canvas.edited => ObjectState - - canvas.splitted => ObjectState - - canvas.groupped => [ObjectState] - - canvas.merged => [ObjectState] + - canvas.moved => {states: ObjectState[], x: number, y: number} + - canvas.drawn => {state: ObjectState} + - canvas.edited => {state: ObjectState} + - canvas.splitted => {state: ObjectState, frame: number} + - canvas.groupped => {states: ObjectState[], reset: boolean} + - canvas.merged => {states: ObjectState[]} - canvas.canceled ``` +### WEB +```js + // Create an instance of a canvas + const canvas = new window.canvas.Canvas(window.cvat.classes.ObjectState); + + // Put canvas to a html container + htmlContainer.appendChild(canvas.html()); + + // Next you can use its API methods. For example: + canvas.rotate(window.Canvas.Rotation.CLOCKWISE90); + canvas.draw({ + enabled: true, + shapeType: 'rectangle', + crosshair: true, + }); +``` + +### TypeScript +- Add to ```tsconfig.json```: +```json + "compilerOptions": { + "paths": { + "cvat-canvas.node": ["3rdparty/cvat-canvas.node"] + } + } +``` + +- ```3rdparty``` directory contains both ```cvat-canvas.node.js``` and ```cvat-canvas.node.d.ts```. +- Add alias to ```webpack.config.js```: +```js +module.exports = { + resolve: { + alias: { + 'cvat-canvas.node': path.resolve(__dirname, '3rdparty/cvat-canvas.node.js'), + } + } +} +``` + +Than you can use it in TypeScript: +```ts + import * as CANVAS from 'cvat-canvas.node'; + // Create an instance of a canvas + const canvas = new CANVAS.Canvas(null); + + // Put canvas to a html container + htmlContainer.appendChild(canvas.html()); + + // Next you can use its API methods. For example: + canvas.rotate(CANVAS.Rotation.CLOCKWISE90); + canvas.draw({ + enabled: true, + shapeType: 'rectangle', + crosshair: true, + }); +``` + ## States ![](images/states.svg) diff --git a/cvat-canvas/package.json b/cvat-canvas/package.json index de8eea6b..b8b46928 100644 --- a/cvat-canvas/package.json +++ b/cvat-canvas/package.json @@ -2,7 +2,7 @@ "name": "cvat-canvas", "version": "0.1.0", "description": "Part of Computer Vision Annotation Tool which presents its canvas library", - "main": "babel.config.js", + "main": "src/canvas.ts", "scripts": { "build": "tsc && webpack --config ./webpack.config.js", "server": "nodemon --watch config --exec 'webpack-dev-server --config ./webpack.config.js --mode=development --open'" @@ -25,6 +25,7 @@ "@typescript-eslint/eslint-plugin": "^1.13.0", "@typescript-eslint/parser": "^1.13.0", "babel-loader": "^8.0.6", + "dts-bundle-webpack": "^1.0.2", "eslint": "^6.1.0", "eslint-config-airbnb-typescript": "^4.0.1", "eslint-config-typescript-recommended": "^1.4.17", diff --git a/cvat-canvas/public/canvas.css b/cvat-canvas/public/canvas.css new file mode 100644 index 00000000..f34d991e --- /dev/null +++ b/cvat-canvas/public/canvas.css @@ -0,0 +1,122 @@ +.cvat_canvas_hidden { + display: none; +} + +.cvat_canvas_shape { + fill-opacity: 0.1; + stroke-opacity: 1; +} + +polyline.cvat_canvas_shape { + fill-opacity: 0; + stroke-opacity: 1; +} + +.cvat_canvas_text { + font-weight: bold; + font-size: 1.2em; + fill: white; + cursor: default; + font-family: Calibri, Candara, Segoe, "Segoe UI", Optima, Arial, sans-serif; + text-shadow: 0px 0px 4px black; + user-select: none; + pointer-events: none; +} + +.cvat_canvas_crosshair { + stroke: red; +} + +.cvat_canvas_shape_activated { + +} + +.cvat_canvas_shape_grouping { + +} + +.cvat_canvas_shape_merging { + +} + +.cvat_canvas_shape_drawing { + fill-opacity: 0.1; + stroke-opacity: 1; + fill: white; + stroke: black; +} + +.svg_select_boundingRect { + opacity: 0; + pointer-events: none; +} + +#cvat_canvas_wrapper { + width: 100%; + height: 93%; + border-radius: 5px; + background-color: white; + overflow: hidden; + position: relative; +} + +#cvat_canvas_loading_animation { + z-index: 1; + position: absolute; + width: 100%; + height: 100%; +} + +#cvat_canvas_loading_circle { + fill-opacity: 0; + stroke: #09c; + stroke-width: 3px; + stroke-dasharray: 50; + animation: loadingAnimation 1s linear infinite; +} + +#cvat_canvas_text_content { + position: absolute; + z-index: 3; + pointer-events: none; + width: 100%; + height: 100%; + pointer-events: none; +} + +#cvat_canvas_background { + position: absolute; + z-index: 0; + background-repeat: no-repeat; + width: 100%; + height: 100%; + box-shadow: 2px 2px 5px 0px rgba(0,0,0,0.75); +} + +#cvat_canvas_grid { + position: absolute; + z-index: 2; + pointer-events: none; + width: 100%; + height: 100%; + pointer-events: none; +} + +#cvat_canvas_grid_pattern { + opacity: 1; + stroke: white; +} + +#cvat_canvas_content { + position: absolute; + z-index: 2; + outline: 10px solid black; + width: 100%; + height: 100%; +} + +@keyframes loadingAnimation { + 0% {stroke-dashoffset: 1; stroke: #09c;} + 50% {stroke-dashoffset: 100; stroke: #f44;} + 100% {stroke-dashoffset: 300; stroke: #09c;} +} \ No newline at end of file diff --git a/cvat-canvas/public/credentials.js b/cvat-canvas/public/credentials.js new file mode 100644 index 00000000..e69de29b diff --git a/cvat-canvas/public/cvat-canvas.js b/cvat-canvas/public/cvat-canvas.js new file mode 100644 index 00000000..6f0c1983 --- /dev/null +++ b/cvat-canvas/public/cvat-canvas.js @@ -0,0 +1,12 @@ +window.canvas=function(t){var e={};function i(n){if(e[n])return e[n].exports;var s=e[n]={i:n,l:!1,exports:{}};return t[n].call(s.exports,s,s.exports,i),s.l=!0,s.exports}return i.m=t,i.c=e,i.d=function(t,e,n){i.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:n})},i.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},i.t=function(t,e){if(1&e&&(t=i(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var n=Object.create(null);if(i.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var s in t)i.d(n,s,function(e){return t[e]}.bind(null,s));return n},i.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return i.d(e,"a",e),e},i.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},i.p="",i(i.s=5)}([function(t,e,i){var n,s; +/*! +* svg.js - A lightweight library for manipulating and animating SVG. +* @version 2.7.1 +* https://svgdotjs.github.io/ +* +* @copyright Wout Fierens +* @license MIT +* +* BUILT: Fri Nov 30 2018 10:01:55 GMT+0100 (GMT+01:00) +*/s="undefined"!=typeof window?window:this,void 0===(n=function(){return function(t,e){var i=(void 0!==this?this:t).SVG=function(t){if(i.supported)return t=new i.Doc(t),i.parser.draw||i.prepare(),t};if(i.ns="http://www.w3.org/2000/svg",i.xmlns="http://www.w3.org/2000/xmlns/",i.xlink="http://www.w3.org/1999/xlink",i.svgjs="http://svgjs.com/svgjs",i.supported=!!e.createElementNS&&!!e.createElementNS(i.ns,"svg").createSVGRect,!i.supported)return!1;i.did=1e3,i.eid=function(t){return"Svgjs"+c(t)+i.did++},i.create=function(t){var i=e.createElementNS(this.ns,t);return i.setAttribute("id",this.eid(t)),i},i.extend=function(){var t,e,n,s;for(t=[].slice.call(arguments),e=t.pop(),s=t.length-1;s>=0;s--)if(t[s])for(n in e)t[s].prototype[n]=e[n];i.Set&&i.Set.inherit&&i.Set.inherit()},i.invent=function(t){var e="function"==typeof t.create?t.create:function(){this.constructor.call(this,i.create(t.create))};return t.inherit&&(e.prototype=new t.inherit),t.extend&&i.extend(e,t.extend),t.construct&&i.extend(t.parent||i.Container,t.construct),e},i.adopt=function(e){return e?e.instance?e.instance:((n="svg"==e.nodeName?e.parentNode instanceof t.SVGElement?new i.Nested:new i.Doc:"linearGradient"==e.nodeName?new i.Gradient("linear"):"radialGradient"==e.nodeName?new i.Gradient("radial"):i[c(e.nodeName)]?new(i[c(e.nodeName)]):new i.Element(e)).type=e.nodeName,n.node=e,e.instance=n,n instanceof i.Doc&&n.namespace().defs(),n.setData(JSON.parse(e.getAttribute("svgjs:data"))||{}),n):null;var n},i.prepare=function(){var t=e.getElementsByTagName("body")[0],n=(t?new i.Doc(t):i.adopt(e.documentElement).nested()).size(2,0);i.parser={body:t||e.documentElement,draw:n.style("opacity:0;position:absolute;left:-100%;top:-100%;overflow:hidden").attr("focusable","false").node,poly:n.polyline().node,path:n.path().node,native:i.create("svg")}},i.parser={native:i.create("svg")},e.addEventListener("DOMContentLoaded",function(){i.parser.draw||i.prepare()},!1),i.regex={numberAndUnit:/^([+-]?(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?)([a-z%]*)$/i,hex:/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i,rgb:/rgb\((\d+),(\d+),(\d+)\)/,reference:/#([a-z0-9\-_]+)/i,transforms:/\)\s*,?\s*/,whitespace:/\s/g,isHex:/^#[a-f0-9]{3,6}$/i,isRgb:/^rgb\(/,isCss:/[^:]+:[^;]+;?/,isBlank:/^(\s+)?$/,isNumber:/^[+-]?(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i,isPercent:/^-?[\d\.]+%$/,isImage:/\.(jpg|jpeg|png|gif|svg)(\?[^=]+.*)?/i,delimiter:/[\s,]+/,hyphen:/([^e])\-/gi,pathLetters:/[MLHVCSQTAZ]/gi,isPathLetter:/[MLHVCSQTAZ]/i,numbersWithDots:/((\d?\.\d+(?:e[+-]?\d+)?)((?:\.\d+(?:e[+-]?\d+)?)+))+/gi,dots:/\./g},i.utils={map:function(t,e){var i,n=t.length,s=[];for(i=0;i1?1:t,new i.Color({r:~~(this.r+(this.destination.r-this.r)*t),g:~~(this.g+(this.destination.g-this.g)*t),b:~~(this.b+(this.destination.b-this.b)*t)})):this}}),i.Color.test=function(t){return t+="",i.regex.isHex.test(t)||i.regex.isRgb.test(t)},i.Color.isRgb=function(t){return t&&"number"==typeof t.r&&"number"==typeof t.g&&"number"==typeof t.b},i.Color.isColor=function(t){return i.Color.isRgb(t)||i.Color.test(t)},i.Array=function(t,e){0==(t=(t||[]).valueOf()).length&&e&&(t=e.valueOf()),this.value=this.parse(t)},i.extend(i.Array,{morph:function(t){if(this.destination=this.parse(t),this.value.length!=this.destination.length){for(var e=this.value[this.value.length-1],i=this.destination[this.destination.length-1];this.value.length>this.destination.length;)this.destination.push(i);for(;this.value.length=0;n--)this.value[n]=[this.value[n][0]+t,this.value[n][1]+e];return this},size:function(t,e){var i,n=this.bbox();for(i=this.value.length-1;i>=0;i--)n.width&&(this.value[i][0]=(this.value[i][0]-n.x)*t/n.width+n.x),n.height&&(this.value[i][1]=(this.value[i][1]-n.y)*e/n.height+n.y);return this},bbox:function(){return i.parser.poly.setAttribute("points",this.toString()),i.parser.poly.getBBox()}});for(var n={M:function(t,e,i){return e.x=i.x=t[0],e.y=i.y=t[1],["M",e.x,e.y]},L:function(t,e){return e.x=t[0],e.y=t[1],["L",t[0],t[1]]},H:function(t,e){return e.x=t[0],["H",t[0]]},V:function(t,e){return e.y=t[0],["V",t[0]]},C:function(t,e){return e.x=t[4],e.y=t[5],["C",t[0],t[1],t[2],t[3],t[4],t[5]]},S:function(t,e){return e.x=t[2],e.y=t[3],["S",t[0],t[1],t[2],t[3]]},Q:function(t,e){return e.x=t[2],e.y=t[3],["Q",t[0],t[1],t[2],t[3]]},T:function(t,e){return e.x=t[0],e.y=t[1],["T",t[0],t[1]]},Z:function(t,e,i){return e.x=i.x,e.y=i.y,["Z"]},A:function(t,e){return e.x=t[5],e.y=t[6],["A",t[0],t[1],t[2],t[3],t[4],t[5],t[6]]}},s="mlhvqtcsaz".split(""),r=0,a=s.length;r=0;s--)"M"==(n=this.value[s][0])||"L"==n||"T"==n?(this.value[s][1]+=t,this.value[s][2]+=e):"H"==n?this.value[s][1]+=t:"V"==n?this.value[s][1]+=e:"C"==n||"S"==n||"Q"==n?(this.value[s][1]+=t,this.value[s][2]+=e,this.value[s][3]+=t,this.value[s][4]+=e,"C"==n&&(this.value[s][5]+=t,this.value[s][6]+=e)):"A"==n&&(this.value[s][6]+=t,this.value[s][7]+=e);return this},size:function(t,e){var i,n,s=this.bbox();for(i=this.value.length-1;i>=0;i--)"M"==(n=this.value[i][0])||"L"==n||"T"==n?(this.value[i][1]=(this.value[i][1]-s.x)*t/s.width+s.x,this.value[i][2]=(this.value[i][2]-s.y)*e/s.height+s.y):"H"==n?this.value[i][1]=(this.value[i][1]-s.x)*t/s.width+s.x:"V"==n?this.value[i][1]=(this.value[i][1]-s.y)*e/s.height+s.y:"C"==n||"S"==n||"Q"==n?(this.value[i][1]=(this.value[i][1]-s.x)*t/s.width+s.x,this.value[i][2]=(this.value[i][2]-s.y)*e/s.height+s.y,this.value[i][3]=(this.value[i][3]-s.x)*t/s.width+s.x,this.value[i][4]=(this.value[i][4]-s.y)*e/s.height+s.y,"C"==n&&(this.value[i][5]=(this.value[i][5]-s.x)*t/s.width+s.x,this.value[i][6]=(this.value[i][6]-s.y)*e/s.height+s.y)):"A"==n&&(this.value[i][1]=this.value[i][1]*t/s.width,this.value[i][2]=this.value[i][2]*e/s.height,this.value[i][6]=(this.value[i][6]-s.x)*t/s.width+s.x,this.value[i][7]=(this.value[i][7]-s.y)*e/s.height+s.y);return this},equalCommands:function(t){var e,n,s;for(t=new i.PathArray(t),s=this.value.length===t.value.length,e=0,n=this.value.length;s&&el);return r},bbox:function(){return i.parser.path.setAttribute("d",this.toString()),i.parser.path.getBBox()}}),i.Number=i.invent({create:function(t,e){this.value=0,this.unit=e||"","number"==typeof t?this.value=isNaN(t)?0:isFinite(t)?t:t<0?-34e37:34e37:"string"==typeof t?(e=t.match(i.regex.numberAndUnit))&&(this.value=parseFloat(e[1]),"%"==e[5]?this.value/=100:"s"==e[5]&&(this.value*=1e3),this.unit=e[5]):t instanceof i.Number&&(this.value=t.valueOf(),this.unit=t.unit)},extend:{toString:function(){return("%"==this.unit?~~(1e8*this.value)/1e6:"s"==this.unit?this.value/1e3:this.value)+this.unit},toJSON:function(){return this.toString()},valueOf:function(){return this.value},plus:function(t){return t=new i.Number(t),new i.Number(this+t,this.unit||t.unit)},minus:function(t){return t=new i.Number(t),new i.Number(this-t,this.unit||t.unit)},times:function(t){return t=new i.Number(t),new i.Number(this*t,this.unit||t.unit)},divide:function(t){return t=new i.Number(t),new i.Number(this/t,this.unit||t.unit)},to:function(t){var e=new i.Number(this);return"string"==typeof t&&(e.unit=t),e},morph:function(t){return this.destination=new i.Number(t),t.relative&&(this.destination.value+=this.value),this},at:function(t){return this.destination?new i.Number(this.destination).minus(this).times(t).plus(this):this}}}),i.Element=i.invent({create:function(t){this._stroke=i.defaults.attrs.stroke,this._event=null,this._events={},this.dom={},(this.node=t)&&(this.type=t.nodeName,this.node.instance=this,this._events=t._events||{},this._stroke=t.getAttribute("stroke")||this._stroke)},extend:{x:function(t){return this.attr("x",t)},y:function(t){return this.attr("y",t)},cx:function(t){return null==t?this.x()+this.width()/2:this.x(t-this.width()/2)},cy:function(t){return null==t?this.y()+this.height()/2:this.y(t-this.height()/2)},move:function(t,e){return this.x(t).y(e)},center:function(t,e){return this.cx(t).cy(e)},width:function(t){return this.attr("width",t)},height:function(t){return this.attr("height",t)},size:function(t,e){var n=d(this,t,e);return this.width(new i.Number(n.width)).height(new i.Number(n.height))},clone:function(t){this.writeDataToDom();var e=v(this.node.cloneNode(!0));return t?t.add(e):this.after(e),e},remove:function(){return this.parent()&&this.parent().removeElement(this),this},replace:function(t){return this.after(t).remove(),t},addTo:function(t){return t.put(this)},putIn:function(t){return t.add(this)},id:function(t){return this.attr("id",t)},inside:function(t,e){var i=this.bbox();return t>i.x&&e>i.y&&t/,"").replace(/<\/svg>$/,"");n.innerHTML=""+t.replace(/\n/,"").replace(/<([\w:-]+)([^<]+?)\/>/g,"<$1$2>")+"";for(var s=0,r=n.firstChild.childNodes.length;s":function(t){return-Math.cos(t*Math.PI)/2+.5},">":function(t){return Math.sin(t*Math.PI/2)},"<":function(t){return 1-Math.cos(t*Math.PI/2)}},i.morph=function(t){return function(e,n){return new i.MorphObj(e,n).at(t)}},i.Situation=i.invent({create:function(t){this.init=!1,this.reversed=!1,this.reversing=!1,this.duration=new i.Number(t.duration).valueOf(),this.delay=new i.Number(t.delay).valueOf(),this.start=+new Date+this.delay,this.finish=this.start+this.duration,this.ease=t.ease,this.loop=0,this.loops=!1,this.animations={},this.attrs={},this.styles={},this.transforms=[],this.once={}}}),i.FX=i.invent({create:function(t){this._target=t,this.situations=[],this.active=!1,this.situation=null,this.paused=!1,this.lastPos=0,this.pos=0,this.absPos=0,this._speed=1},extend:{animate:function(t,e,n){"object"==typeof t&&(e=t.ease,n=t.delay,t=t.duration);var s=new i.Situation({duration:t||1e3,delay:n||0,ease:i.easing[e||"-"]||e});return this.queue(s),this},delay:function(t){var e=new i.Situation({duration:t,delay:0,ease:i.easing["-"]});return this.queue(e)},target:function(t){return t&&t instanceof i.Element?(this._target=t,this):this._target},timeToAbsPos:function(t){return(t-this.situation.start)/(this.situation.duration/this._speed)},absPosToTime:function(t){return this.situation.duration/this._speed*t+this.situation.start},startAnimFrame:function(){this.stopAnimFrame(),this.animationFrame=t.requestAnimationFrame(function(){this.step()}.bind(this))},stopAnimFrame:function(){t.cancelAnimationFrame(this.animationFrame)},start:function(){return!this.active&&this.situation&&(this.active=!0,this.startCurrent()),this},startCurrent:function(){return this.situation.start=+new Date+this.situation.delay/this._speed,this.situation.finish=this.situation.start+this.situation.duration/this._speed,this.initAnimations().step()},queue:function(t){return("function"==typeof t||t instanceof i.Situation)&&this.situations.push(t),this.situation||(this.situation=this.situations.shift()),this},dequeue:function(){return this.stop(),this.situation=this.situations.shift(),this.situation&&(this.situation instanceof i.Situation?this.start():this.situation.call(this)),this},initAnimations:function(){var t,e,n,s=this.situation;if(s.init)return this;for(t in s.animations)for(n=this.target()[t](),Array.isArray(n)||(n=[n]),Array.isArray(s.animations[t])||(s.animations[t]=[s.animations[t]]),e=n.length;e--;)s.animations[t][e]instanceof i.Number&&(n[e]=new i.Number(n[e])),s.animations[t][e]=n[e].morph(s.animations[t][e]);for(t in s.attrs)s.attrs[t]=new i.MorphObj(this.target().attr(t),s.attrs[t]);for(t in s.styles)s.styles[t]=new i.MorphObj(this.target().style(t),s.styles[t]);return s.initialTransformation=this.target().matrixify(),s.init=!0,this},clearQueue:function(){return this.situations=[],this},clearCurrent:function(){return this.situation=null,this},stop:function(t,e){var i=this.active;return this.active=!1,e&&this.clearQueue(),t&&this.situation&&(!i&&this.startCurrent(),this.atEnd()),this.stopAnimFrame(),this.clearCurrent()},reset:function(){if(this.situation){var t=this.situation;this.stop(),this.situation=t,this.atStart()}return this},finish:function(){for(this.stop(!0,!1);this.dequeue().situation&&this.stop(!0,!1););return this.clearQueue().clearCurrent(),this},atStart:function(){return this.at(0,!0)},atEnd:function(){return!0===this.situation.loops&&(this.situation.loops=this.situation.loop+1),"number"==typeof this.situation.loops?this.at(this.situation.loops,!0):this.at(1,!0)},at:function(t,e){var i=this.situation.duration/this._speed;return this.absPos=t,e||(this.situation.reversed&&(this.absPos=1-this.absPos),this.absPos+=this.situation.loop),this.situation.start=+new Date-this.absPos*i,this.situation.finish=this.situation.start+i,this.step(!0)},speed:function(t){return 0===t?this.pause():t?(this._speed=t,this.at(this.absPos,!0)):this._speed},loop:function(t,e){var i=this.last();return i.loops=null==t||t,i.loop=0,e&&(i.reversing=!0),this},pause:function(){return this.paused=!0,this.stopAnimFrame(),this},play:function(){return this.paused?(this.paused=!1,this.at(this.absPos,!0)):this},reverse:function(t){var e=this.last();return e.reversed=void 0===t?!e.reversed:t,this},progress:function(t){return t?this.situation.ease(this.pos):this.pos},after:function(t){var e=this.last();return this.target().on("finished.fx",function i(n){n.detail.situation==e&&(t.call(this,e),this.off("finished.fx",i))}),this._callStart()},during:function(t){var e=this.last(),n=function(n){n.detail.situation==e&&t.call(this,n.detail.pos,i.morph(n.detail.pos),n.detail.eased,e)};return this.target().off("during.fx",n).on("during.fx",n),this.after(function(){this.off("during.fx",n)}),this._callStart()},afterAll:function(t){var e=function e(i){t.call(this),this.off("allfinished.fx",e)};return this.target().off("allfinished.fx",e).on("allfinished.fx",e),this._callStart()},duringAll:function(t){var e=function(e){t.call(this,e.detail.pos,i.morph(e.detail.pos),e.detail.eased,e.detail.situation)};return this.target().off("during.fx",e).on("during.fx",e),this.afterAll(function(){this.off("during.fx",e)}),this._callStart()},last:function(){return this.situations.length?this.situations[this.situations.length-1]:this.situation},add:function(t,e,i){return this.last()[i||"animations"][t]=e,this._callStart()},step:function(t){var e,i,n;t||(this.absPos=this.timeToAbsPos(+new Date)),!1!==this.situation.loops?(e=Math.max(this.absPos,0),i=Math.floor(e),!0===this.situation.loops||ithis.lastPos&&r<=s&&(this.situation.once[r].call(this.target(),this.pos,s),delete this.situation.once[r]);return this.active&&this.target().fire("during",{pos:this.pos,eased:s,fx:this,situation:this.situation}),this.situation?(this.eachAt(),1==this.pos&&!this.situation.reversed||this.situation.reversed&&0==this.pos?(this.stopAnimFrame(),this.target().fire("finished",{fx:this,situation:this.situation}),this.situations.length||(this.target().fire("allfinished"),this.situations.length||(this.target().off(".fx"),this.active=!1)),this.active?this.dequeue():this.clearCurrent()):!this.paused&&this.active&&this.startAnimFrame(),this.lastPos=s,this):this},eachAt:function(){var t,e,n,s=this,r=this.target(),a=this.situation;for(t in a.animations)n=[].concat(a.animations[t]).map(function(t){return"string"!=typeof t&&t.at?t.at(a.ease(s.pos),s.pos):t}),r[t].apply(r,n);for(t in a.attrs)n=[t].concat(a.attrs[t]).map(function(t){return"string"!=typeof t&&t.at?t.at(a.ease(s.pos),s.pos):t}),r.attr.apply(r,n);for(t in a.styles)n=[t].concat(a.styles[t]).map(function(t){return"string"!=typeof t&&t.at?t.at(a.ease(s.pos),s.pos):t}),r.style.apply(r,n);if(a.transforms.length){for(n=a.initialTransformation,t=0,e=a.transforms.length;t=0;--e)this[x[e]]=null!=t[x[e]]?t[x[e]]:n[x[e]]},extend:{extract:function(){var t=f(this,0,1),e=f(this,1,0),n=180/Math.PI*Math.atan2(t.y,t.x)-90;return{x:this.e,y:this.f,transformedX:(this.e*Math.cos(n*Math.PI/180)+this.f*Math.sin(n*Math.PI/180))/Math.sqrt(this.a*this.a+this.b*this.b),transformedY:(this.f*Math.cos(n*Math.PI/180)+this.e*Math.sin(-n*Math.PI/180))/Math.sqrt(this.c*this.c+this.d*this.d),skewX:-n,skewY:180/Math.PI*Math.atan2(e.y,e.x),scaleX:Math.sqrt(this.a*this.a+this.b*this.b),scaleY:Math.sqrt(this.c*this.c+this.d*this.d),rotation:n,a:this.a,b:this.b,c:this.c,d:this.d,e:this.e,f:this.f,matrix:new i.Matrix(this)}},clone:function(){return new i.Matrix(this)},morph:function(t){return this.destination=new i.Matrix(t),this},at:function(t){if(!this.destination)return this;var e=new i.Matrix({a:this.a+(this.destination.a-this.a)*t,b:this.b+(this.destination.b-this.b)*t,c:this.c+(this.destination.c-this.c)*t,d:this.d+(this.destination.d-this.d)*t,e:this.e+(this.destination.e-this.e)*t,f:this.f+(this.destination.f-this.f)*t});return e},multiply:function(t){return new i.Matrix(this.native().multiply(function(t){return t instanceof i.Matrix||(t=new i.Matrix(t)),t}(t).native()))},inverse:function(){return new i.Matrix(this.native().inverse())},translate:function(t,e){return new i.Matrix(this.native().translate(t||0,e||0))},scale:function(t,e,n,s){return 1==arguments.length?e=t:3==arguments.length&&(s=n,n=e,e=t),this.around(n,s,new i.Matrix(t,0,0,e,0,0))},rotate:function(t,e,n){return t=i.utils.radians(t),this.around(e,n,new i.Matrix(Math.cos(t),Math.sin(t),-Math.sin(t),Math.cos(t),0,0))},flip:function(t,e){return"x"==t?this.scale(-1,1,e,0):"y"==t?this.scale(1,-1,0,e):this.scale(-1,-1,t,null!=e?e:t)},skew:function(t,e,n,s){return 1==arguments.length?e=t:3==arguments.length&&(s=n,n=e,e=t),t=i.utils.radians(t),e=i.utils.radians(e),this.around(n,s,new i.Matrix(1,Math.tan(e),Math.tan(t),1,0,0))},skewX:function(t,e,i){return this.skew(t,0,e,i)},skewY:function(t,e,i){return this.skew(0,t,e,i)},around:function(t,e,n){return this.multiply(new i.Matrix(1,0,0,1,t||0,e||0)).multiply(n).multiply(new i.Matrix(1,0,0,1,-t||0,-e||0))},native:function(){for(var t=i.parser.native.createSVGMatrix(),e=x.length-1;e>=0;e--)t[x[e]]=this[x[e]];return t},toString:function(){return"matrix("+g(this.a)+","+g(this.b)+","+g(this.c)+","+g(this.d)+","+g(this.e)+","+g(this.f)+")"}},parent:i.Element,construct:{ctm:function(){return new i.Matrix(this.node.getCTM())},screenCTM:function(){if(this instanceof i.Nested){var t=this.rect(1,1),e=t.node.getScreenCTM();return t.remove(),new i.Matrix(e)}return new i.Matrix(this.node.getScreenCTM())}}}),i.Point=i.invent({create:function(t,e){var i;i=Array.isArray(t)?{x:t[0],y:t[1]}:"object"==typeof t?{x:t.x,y:t.y}:null!=t?{x:t,y:null!=e?e:t}:{x:0,y:0},this.x=i.x,this.y=i.y},extend:{clone:function(){return new i.Point(this)},morph:function(t,e){return this.destination=new i.Point(t,e),this},at:function(t){if(!this.destination)return this;var e=new i.Point({x:this.x+(this.destination.x-this.x)*t,y:this.y+(this.destination.y-this.y)*t});return e},native:function(){var t=i.parser.native.createSVGPoint();return t.x=this.x,t.y=this.y,t},transform:function(t){return new i.Point(this.native().matrixTransform(t.native()))}}}),i.extend(i.Element,{point:function(t,e){return new i.Point(t,e).transform(this.screenCTM().inverse())}}),i.extend(i.Element,{attr:function(t,e,n){if(null==t){for(t={},e=this.node.attributes,n=e.length-1;n>=0;n--)t[e[n].nodeName]=i.regex.isNumber.test(e[n].nodeValue)?parseFloat(e[n].nodeValue):e[n].nodeValue;return t}if("object"==typeof t)for(e in t)this.attr(e,t[e]);else if(null===e)this.node.removeAttribute(t);else{if(null==e)return null==(e=this.node.getAttribute(t))?i.defaults.attrs[t]:i.regex.isNumber.test(e)?parseFloat(e):e;"stroke-width"==t?this.attr("stroke",parseFloat(e)>0?this._stroke:null):"stroke"==t&&(this._stroke=e),"fill"!=t&&"stroke"!=t||(i.regex.isImage.test(e)&&(e=this.doc().defs().image(e,0,0)),e instanceof i.Image&&(e=this.doc().defs().pattern(0,0,function(){this.add(e)}))),"number"==typeof e?e=new i.Number(e):i.Color.isColor(e)?e=new i.Color(e):Array.isArray(e)&&(e=new i.Array(e)),"leading"==t?this.leading&&this.leading(e):"string"==typeof n?this.node.setAttributeNS(n,t,e.toString()):this.node.setAttribute(t,e.toString()),!this.rebuild||"font-size"!=t&&"x"!=t||this.rebuild(t,e)}return this}}),i.extend(i.Element,{transform:function(t,e){var n,s;if("object"!=typeof t)return n=new i.Matrix(this).extract(),"string"==typeof t?n[t]:n;if(n=new i.Matrix(this),e=!!e||!!t.relative,null!=t.a)n=e?n.multiply(new i.Matrix(t)):new i.Matrix(t);else if(null!=t.rotation)m(t,this),n=e?n.rotate(t.rotation,t.cx,t.cy):n.rotate(t.rotation-n.extract().rotation,t.cx,t.cy);else if(null!=t.scale||null!=t.scaleX||null!=t.scaleY){if(m(t,this),t.scaleX=null!=t.scale?t.scale:null!=t.scaleX?t.scaleX:1,t.scaleY=null!=t.scale?t.scale:null!=t.scaleY?t.scaleY:1,!e){var r=n.extract();t.scaleX=1*t.scaleX/r.scaleX,t.scaleY=1*t.scaleY/r.scaleY}n=n.scale(t.scaleX,t.scaleY,t.cx,t.cy)}else if(null!=t.skew||null!=t.skewX||null!=t.skewY){if(m(t,this),t.skewX=null!=t.skew?t.skew:null!=t.skewX?t.skewX:0,t.skewY=null!=t.skew?t.skew:null!=t.skewY?t.skewY:0,!e){var r=n.extract();n=n.multiply((new i.Matrix).skew(r.skewX,r.skewY,t.cx,t.cy).inverse())}n=n.skew(t.skewX,t.skewY,t.cx,t.cy)}else t.flip?("x"==t.flip||"y"==t.flip?t.offset=null==t.offset?this.bbox()["c"+t.flip]:t.offset:null==t.offset?(s=this.bbox(),t.flip=s.cx,t.offset=s.cy):t.flip=t.offset,n=(new i.Matrix).flip(t.flip,t.offset)):null==t.x&&null==t.y||(e?n=n.translate(t.x,t.y):(null!=t.x&&(n.e=t.x),null!=t.y&&(n.f=t.y)));return this.attr("transform",n)}}),i.extend(i.FX,{transform:function(t,e){var n,s,r=this.target();return"object"!=typeof t?(n=new i.Matrix(r).extract(),"string"==typeof t?n[t]:n):(e=!!e||!!t.relative,null!=t.a?n=new i.Matrix(t):null!=t.rotation?(m(t,r),n=new i.Rotate(t.rotation,t.cx,t.cy)):null!=t.scale||null!=t.scaleX||null!=t.scaleY?(m(t,r),t.scaleX=null!=t.scale?t.scale:null!=t.scaleX?t.scaleX:1,t.scaleY=null!=t.scale?t.scale:null!=t.scaleY?t.scaleY:1,n=new i.Scale(t.scaleX,t.scaleY,t.cx,t.cy)):null!=t.skewX||null!=t.skewY?(m(t,r),t.skewX=null!=t.skewX?t.skewX:0,t.skewY=null!=t.skewY?t.skewY:0,n=new i.Skew(t.skewX,t.skewY,t.cx,t.cy)):t.flip?("x"==t.flip||"y"==t.flip?t.offset=null==t.offset?r.bbox()["c"+t.flip]:t.offset:null==t.offset?(s=r.bbox(),t.flip=s.cx,t.offset=s.cy):t.flip=t.offset,n=(new i.Matrix).flip(t.flip,t.offset)):null==t.x&&null==t.y||(n=new i.Translate(t.x,t.y)),n?(n.relative=e,this.last().transforms.push(n),this._callStart()):this)}}),i.extend(i.Element,{untransform:function(){return this.attr("transform",null)},matrixify:function(){var t=(this.attr("transform")||"").split(i.regex.transforms).slice(0,-1).map(function(t){var e=t.trim().split("(");return[e[0],e[1].split(i.regex.delimiter).map(function(t){return parseFloat(t)})]}).reduce(function(t,e){return"matrix"==e[0]?t.multiply(p(e[1])):t[e[0]].apply(t,e[1])},new i.Matrix);return t},toParent:function(t){if(this==t)return this;var e=this.screenCTM(),i=t.screenCTM().inverse();return this.addTo(t).untransform().transform(i.multiply(e)),this},toDoc:function(){return this.toParent(this.doc())}}),i.Transformation=i.invent({create:function(t,e){if(arguments.length>1&&"boolean"!=typeof e)return this.constructor.call(this,[].slice.call(arguments));if(Array.isArray(t))for(var i=0,n=this.arguments.length;i=0},index:function(t){return[].slice.call(this.node.childNodes).indexOf(t.node)},get:function(t){return i.adopt(this.node.childNodes[t])},first:function(){return this.get(0)},last:function(){return this.get(this.node.childNodes.length-1)},each:function(t,e){var n,s,r=this.children();for(n=0,s=r.length;ns/r?this.height/r:this.width/s,this.x=e,this.y=n,this.width=s,this.height=r)}else t="string"==typeof t?t.match(d).map(function(t){return parseFloat(t)}):Array.isArray(t)?t:"object"==typeof t?[t.x,t.y,t.width,t.height]:4==arguments.length?[].slice.call(arguments):l,this.x=t[0],this.y=t[1],this.width=t[2],this.height=t[3]},extend:{toString:function(){return this.x+" "+this.y+" "+this.width+" "+this.height},morph:function(t,e,n,s){return this.destination=new i.ViewBox(t,e,n,s),this},at:function(t){return this.destination?new i.ViewBox([this.x+(this.destination.x-this.x)*t,this.y+(this.destination.y-this.y)*t,this.width+(this.destination.width-this.width)*t,this.height+(this.destination.height-this.height)*t]):this}},parent:i.Container,construct:{viewbox:function(t,e,n,s){return 0==arguments.length?new i.ViewBox(this):this.attr("viewBox",new i.ViewBox(t,e,n,s))}}}),["click","dblclick","mousedown","mouseup","mouseover","mouseout","mousemove","mouseenter","mouseleave","touchstart","touchmove","touchleave","touchend","touchcancel"].forEach(function(t){i.Element.prototype[t]=function(e){return null==e?i.off(this,t):i.on(this,t,e),this}}),i.listenerId=0,i.on=function(t,e,n,s,r){var a=n.bind(s||t),o=t instanceof i.Element?t.node:t;o.instance=o.instance||{_events:{}};var h=o.instance._events;n._svgjsListenerId||(n._svgjsListenerId=++i.listenerId),e.split(i.regex.delimiter).forEach(function(t){var e=t.split(".")[0],i=t.split(".")[1]||"*";h[e]=h[e]||{},h[e][i]=h[e][i]||{},h[e][i][n._svgjsListenerId]=a,o.addEventListener(e,a,r||!1)})},i.off=function(t,e,n,s){var r=t instanceof i.Element?t.node:t;if(r.instance&&("function"!=typeof n||(n=n._svgjsListenerId))){var a=r.instance._events;(e||"").split(i.regex.delimiter).forEach(function(t){var e,o,h=t&&t.split(".")[0],l=t&&t.split(".")[1];if(n)a[h]&&a[h][l||"*"]&&(r.removeEventListener(h,a[h][l||"*"][n],s||!1),delete a[h][l||"*"][n]);else if(h&&l){if(a[h]&&a[h][l]){for(o in a[h][l])i.off(r,[h,l].join("."),o);delete a[h][l]}}else if(l)for(t in a)for(e in a[t])l===e&&i.off(r,[t,l].join("."));else if(h){if(a[h]){for(e in a[h])i.off(r,[h,e].join("."));delete a[h]}}else{for(t in a)i.off(r,t);r.instance._events={}}})}},i.extend(i.Element,{on:function(t,e,n,s){return i.on(this,t,e,n,s),this},off:function(t,e){return i.off(this.node,t,e),this},fire:function(e,n){return e instanceof t.Event?this.node.dispatchEvent(e):this.node.dispatchEvent(e=new i.CustomEvent(e,{detail:n,cancelable:!0})),this._event=e,this},event:function(){return this._event}}),i.Defs=i.invent({create:"defs",inherit:i.Container}),i.G=i.invent({create:"g",inherit:i.Container,extend:{x:function(t){return null==t?this.transform("x"):this.transform({x:t-this.x()},!0)},y:function(t){return null==t?this.transform("y"):this.transform({y:t-this.y()},!0)},cx:function(t){return null==t?this.gbox().cx:this.x(t-this.gbox().width/2)},cy:function(t){return null==t?this.gbox().cy:this.y(t-this.gbox().height/2)},gbox:function(){var t=this.bbox(),e=this.transform();return t.x+=e.x,t.x2+=e.x,t.cx+=e.x,t.y+=e.y,t.y2+=e.y,t.cy+=e.y,t}},construct:{group:function(){return this.put(new i.G)}}}),i.Doc=i.invent({create:function(t){t&&("svg"==(t="string"==typeof t?e.getElementById(t):t).nodeName?this.constructor.call(this,t):(this.constructor.call(this,i.create("svg")),t.appendChild(this.node),this.size("100%","100%")),this.namespace().defs())},inherit:i.Container,extend:{namespace:function(){return this.attr({xmlns:i.ns,version:"1.1"}).attr("xmlns:xlink",i.xlink,i.xmlns).attr("xmlns:svgjs",i.svgjs,i.xmlns)},defs:function(){var t;return this._defs||((t=this.node.getElementsByTagName("defs")[0])?this._defs=i.adopt(t):this._defs=new i.Defs,this.node.appendChild(this._defs.node)),this._defs},parent:function(){return this.node.parentNode&&"#document"!=this.node.parentNode.nodeName&&"#document-fragment"!=this.node.parentNode.nodeName?this.node.parentNode:null},spof:function(){var t=this.node.getScreenCTM();return t&&this.style("left",-t.e%1+"px").style("top",-t.f%1+"px"),this},remove:function(){return this.parent()&&this.parent().removeChild(this.node),this},clear:function(){for(;this.node.hasChildNodes();)this.node.removeChild(this.node.lastChild);return delete this._defs,i.parser.draw.parentNode||this.node.appendChild(i.parser.draw),this},clone:function(t){this.writeDataToDom();var e=this.node,i=v(e.cloneNode(!0));return t?(t.node||t).appendChild(i.node):e.parentNode.insertBefore(i.node,e.nextSibling),i}}}),i.extend(i.Element,{siblings:function(){return this.parent().children()},position:function(){return this.parent().index(this)},next:function(){return this.siblings()[this.position()+1]},previous:function(){return this.siblings()[this.position()-1]},forward:function(){var t=this.position()+1,e=this.parent();return e.removeElement(this).add(this,t),e instanceof i.Doc&&e.node.appendChild(e.defs().node),this},backward:function(){var t=this.position();return t>0&&this.parent().removeElement(this).add(this,t-1),this},front:function(){var t=this.parent();return t.node.appendChild(this.node),t instanceof i.Doc&&t.node.appendChild(t.defs().node),this},back:function(){return this.position()>0&&this.parent().removeElement(this).add(this,0),this},before:function(t){t.remove();var e=this.position();return this.parent().add(t,e),this},after:function(t){t.remove();var e=this.position();return this.parent().add(t,e+1),this}}),i.Mask=i.invent({create:function(){this.constructor.call(this,i.create("mask")),this.targets=[]},inherit:i.Container,extend:{remove:function(){for(var t=this.targets.length-1;t>=0;t--)this.targets[t]&&this.targets[t].unmask();return this.targets=[],i.Element.prototype.remove.call(this),this}},construct:{mask:function(){return this.defs().put(new i.Mask)}}}),i.extend(i.Element,{maskWith:function(t){return this.masker=t instanceof i.Mask?t:this.parent().mask().add(t),this.masker.targets.push(this),this.attr("mask",'url("#'+this.masker.attr("id")+'")')},unmask:function(){return delete this.masker,this.attr("mask",null)}}),i.ClipPath=i.invent({create:function(){this.constructor.call(this,i.create("clipPath")),this.targets=[]},inherit:i.Container,extend:{remove:function(){for(var t=this.targets.length-1;t>=0;t--)this.targets[t]&&this.targets[t].unclip();return this.targets=[],this.parent().removeElement(this),this}},construct:{clip:function(){return this.defs().put(new i.ClipPath)}}}),i.extend(i.Element,{clipWith:function(t){return this.clipper=t instanceof i.ClipPath?t:this.parent().clip().add(t),this.clipper.targets.push(this),this.attr("clip-path",'url("#'+this.clipper.attr("id")+'")')},unclip:function(){return delete this.clipper,this.attr("clip-path",null)}}),i.Gradient=i.invent({create:function(t){this.constructor.call(this,i.create(t+"Gradient")),this.type=t},inherit:i.Container,extend:{at:function(t,e,n){return this.put(new i.Stop).update(t,e,n)},update:function(t){return this.clear(),"function"==typeof t&&t.call(this,this),this},fill:function(){return"url(#"+this.id()+")"},toString:function(){return this.fill()},attr:function(t,e,n){return"transform"==t&&(t="gradientTransform"),i.Container.prototype.attr.call(this,t,e,n)}},construct:{gradient:function(t,e){return this.defs().gradient(t,e)}}}),i.extend(i.Gradient,i.FX,{from:function(t,e){return"radial"==(this._target||this).type?this.attr({fx:new i.Number(t),fy:new i.Number(e)}):this.attr({x1:new i.Number(t),y1:new i.Number(e)})},to:function(t,e){return"radial"==(this._target||this).type?this.attr({cx:new i.Number(t),cy:new i.Number(e)}):this.attr({x2:new i.Number(t),y2:new i.Number(e)})}}),i.extend(i.Defs,{gradient:function(t,e){return this.put(new i.Gradient(t)).update(e)}}),i.Stop=i.invent({create:"stop",inherit:i.Element,extend:{update:function(t){return("number"==typeof t||t instanceof i.Number)&&(t={offset:arguments[0],color:arguments[1],opacity:arguments[2]}),null!=t.opacity&&this.attr("stop-opacity",t.opacity),null!=t.color&&this.attr("stop-color",t.color),null!=t.offset&&this.attr("offset",new i.Number(t.offset)),this}}}),i.Pattern=i.invent({create:"pattern",inherit:i.Container,extend:{fill:function(){return"url(#"+this.id()+")"},update:function(t){return this.clear(),"function"==typeof t&&t.call(this,this),this},toString:function(){return this.fill()},attr:function(t,e,n){return"transform"==t&&(t="patternTransform"),i.Container.prototype.attr.call(this,t,e,n)}},construct:{pattern:function(t,e,i){return this.defs().pattern(t,e,i)}}}),i.extend(i.Defs,{pattern:function(t,e,n){return this.put(new i.Pattern).update(n).attr({x:0,y:0,width:t,height:e,patternUnits:"userSpaceOnUse"})}}),i.Shape=i.invent({create:function(t){this.constructor.call(this,t)},inherit:i.Element}),i.Bare=i.invent({create:function(t,e){if(this.constructor.call(this,i.create(t)),e)for(var n in e.prototype)"function"==typeof e.prototype[n]&&(this[n]=e.prototype[n])},inherit:i.Element,extend:{words:function(t){for(;this.node.hasChildNodes();)this.node.removeChild(this.node.lastChild);return this.node.appendChild(e.createTextNode(t)),this}}}),i.extend(i.Parent,{element:function(t,e){return this.put(new i.Bare(t,e))}}),i.Symbol=i.invent({create:"symbol",inherit:i.Container,construct:{symbol:function(){return this.put(new i.Symbol)}}}),i.Use=i.invent({create:"use",inherit:i.Shape,extend:{element:function(t,e){return this.attr("href",(e||"")+"#"+t,i.xlink)}},construct:{use:function(t,e){return this.put(new i.Use).element(t,e)}}}),i.Rect=i.invent({create:"rect",inherit:i.Shape,construct:{rect:function(t,e){return this.put(new i.Rect).size(t,e)}}}),i.Circle=i.invent({create:"circle",inherit:i.Shape,construct:{circle:function(t){return this.put(new i.Circle).rx(new i.Number(t).divide(2)).move(0,0)}}}),i.extend(i.Circle,i.FX,{rx:function(t){return this.attr("r",t)},ry:function(t){return this.rx(t)}}),i.Ellipse=i.invent({create:"ellipse",inherit:i.Shape,construct:{ellipse:function(t,e){return this.put(new i.Ellipse).size(t,e).move(0,0)}}}),i.extend(i.Ellipse,i.Rect,i.FX,{rx:function(t){return this.attr("rx",t)},ry:function(t){return this.attr("ry",t)}}),i.extend(i.Circle,i.Ellipse,{x:function(t){return null==t?this.cx()-this.rx():this.cx(t+this.rx())},y:function(t){return null==t?this.cy()-this.ry():this.cy(t+this.ry())},cx:function(t){return null==t?this.attr("cx"):this.attr("cx",t)},cy:function(t){return null==t?this.attr("cy"):this.attr("cy",t)},width:function(t){return null==t?2*this.rx():this.rx(new i.Number(t).divide(2))},height:function(t){return null==t?2*this.ry():this.ry(new i.Number(t).divide(2))},size:function(t,e){var n=d(this,t,e);return this.rx(new i.Number(n.width).divide(2)).ry(new i.Number(n.height).divide(2))}}),i.Line=i.invent({create:"line",inherit:i.Shape,extend:{array:function(){return new i.PointArray([[this.attr("x1"),this.attr("y1")],[this.attr("x2"),this.attr("y2")]])},plot:function(t,e,n,s){return null==t?this.array():(t=void 0!==e?{x1:t,y1:e,x2:n,y2:s}:new i.PointArray(t).toLine(),this.attr(t))},move:function(t,e){return this.attr(this.array().move(t,e).toLine())},size:function(t,e){var i=d(this,t,e);return this.attr(this.array().size(i.width,i.height).toLine())}},construct:{line:function(t,e,n,s){return i.Line.prototype.plot.apply(this.put(new i.Line),null!=t?[t,e,n,s]:[0,0,0,0])}}}),i.Polyline=i.invent({create:"polyline",inherit:i.Shape,construct:{polyline:function(t){return this.put(new i.Polyline).plot(t||new i.PointArray)}}}),i.Polygon=i.invent({create:"polygon",inherit:i.Shape,construct:{polygon:function(t){return this.put(new i.Polygon).plot(t||new i.PointArray)}}}),i.extend(i.Polyline,i.Polygon,{array:function(){return this._array||(this._array=new i.PointArray(this.attr("points")))},plot:function(t){return null==t?this.array():this.clear().attr("points","string"==typeof t?t:this._array=new i.PointArray(t))},clear:function(){return delete this._array,this},move:function(t,e){return this.attr("points",this.array().move(t,e))},size:function(t,e){var i=d(this,t,e);return this.attr("points",this.array().size(i.width,i.height))}}),i.extend(i.Line,i.Polyline,i.Polygon,{morphArray:i.PointArray,x:function(t){return null==t?this.bbox().x:this.move(t,this.bbox().y)},y:function(t){return null==t?this.bbox().y:this.move(this.bbox().x,t)},width:function(t){var e=this.bbox();return null==t?e.width:this.size(t,e.height)},height:function(t){var e=this.bbox();return null==t?e.height:this.size(e.width,t)}}),i.Path=i.invent({create:"path",inherit:i.Shape,extend:{morphArray:i.PathArray,array:function(){return this._array||(this._array=new i.PathArray(this.attr("d")))},plot:function(t){return null==t?this.array():this.clear().attr("d","string"==typeof t?t:this._array=new i.PathArray(t))},clear:function(){return delete this._array,this},move:function(t,e){return this.attr("d",this.array().move(t,e))},x:function(t){return null==t?this.bbox().x:this.move(t,this.bbox().y)},y:function(t){return null==t?this.bbox().y:this.move(this.bbox().x,t)},size:function(t,e){var i=d(this,t,e);return this.attr("d",this.array().size(i.width,i.height))},width:function(t){return null==t?this.bbox().width:this.size(t,this.bbox().height)},height:function(t){return null==t?this.bbox().height:this.size(this.bbox().width,t)}},construct:{path:function(t){return this.put(new i.Path).plot(t||new i.PathArray)}}}),i.Image=i.invent({create:"image",inherit:i.Shape,extend:{load:function(e){if(!e)return this;var n=this,s=new t.Image;return i.on(s,"load",function(){i.off(s);var t=n.parent(i.Pattern);null!==t&&(0==n.width()&&0==n.height()&&n.size(s.width,s.height),t&&0==t.width()&&0==t.height()&&t.size(n.width(),n.height()),"function"==typeof n._loaded&&n._loaded.call(n,{width:s.width,height:s.height,ratio:s.width/s.height,url:e}))}),i.on(s,"error",function(t){i.off(s),"function"==typeof n._error&&n._error.call(n,t)}),this.attr("href",s.src=this.src=e,i.xlink)},loaded:function(t){return this._loaded=t,this},error:function(t){return this._error=t,this}},construct:{image:function(t,e,n){return this.put(new i.Image).load(t).size(e||0,n||e||0)}}}),i.Text=i.invent({create:function(){this.constructor.call(this,i.create("text")),this.dom.leading=new i.Number(1.3),this._rebuild=!0,this._build=!1,this.attr("font-family",i.defaults.attrs["font-family"])},inherit:i.Shape,extend:{x:function(t){return null==t?this.attr("x"):this.attr("x",t)},y:function(t){var e=this.attr("y"),i="number"==typeof e?e-this.bbox().y:0;return null==t?"number"==typeof e?e-i:e:this.attr("y","number"==typeof t.valueOf()?t+i:t)},cx:function(t){return null==t?this.bbox().cx:this.x(t-this.bbox().width/2)},cy:function(t){return null==t?this.bbox().cy:this.y(t-this.bbox().height/2)},text:function(t){if(void 0===t){for(var t="",e=this.node.childNodes,n=0,s=e.length;n=0;n--)e.childNodes[n]instanceof t.SVGElement&&v(e.childNodes[n]);return i.adopt(e).id(i.eid(e.nodeName))}function y(t){return null==t.x&&(t.x=0,t.y=0,t.width=0,t.height=0),t.w=t.width,t.h=t.height,t.x2=t.x+t.width,t.y2=t.y+t.height,t.cx=t.x+t.width/2,t.cy=t.y+t.height/2,t}function g(t){return Math.abs(t)>1e-37?t:0}["fill","stroke"].forEach(function(t){var e,n={};n[t]=function(n){if(void 0===n)return this;if("string"==typeof n||i.Color.isRgb(n)||n&&"function"==typeof n.fill)this.attr(t,n);else for(e=o[t].length-1;e>=0;e--)null!=n[o[t][e]]&&this.attr(o.prefix(t,o[t][e]),n[o[t][e]]);return this},i.extend(i.Element,i.FX,n)}),i.extend(i.Element,i.FX,{rotate:function(t,e,i){return this.transform({rotation:t,cx:e,cy:i})},skew:function(t,e,i,n){return 1==arguments.length||3==arguments.length?this.transform({skew:t,cx:e,cy:i}):this.transform({skewX:t,skewY:e,cx:i,cy:n})},scale:function(t,e,i,n){return 1==arguments.length||3==arguments.length?this.transform({scale:t,cx:e,cy:i}):this.transform({scaleX:t,scaleY:e,cx:i,cy:n})},translate:function(t,e){return this.transform({x:t,y:e})},flip:function(t,e){return e="number"==typeof t?t:e,this.transform({flip:t||"both",offset:e})},matrix:function(t){return this.attr("transform",new i.Matrix(6==arguments.length?[].slice.call(arguments):t))},opacity:function(t){return this.attr("opacity",t)},dx:function(t){return this.x(new i.Number(t).plus(this instanceof i.FX?0:this.x()),!0)},dy:function(t){return this.y(new i.Number(t).plus(this instanceof i.FX?0:this.y()),!0)},dmove:function(t,e){return this.dx(t).dy(e)}}),i.extend(i.Rect,i.Ellipse,i.Circle,i.Gradient,i.FX,{radius:function(t,e){var n=(this._target||this).type;return"radial"==n||"circle"==n?this.attr("r",new i.Number(t)):this.rx(t).ry(null==e?t:e)}}),i.extend(i.Path,{length:function(){return this.node.getTotalLength()},pointAt:function(t){return this.node.getPointAtLength(t)}}),i.extend(i.Parent,i.Text,i.Tspan,i.FX,{font:function(t,e){if("object"==typeof t)for(e in t)this.font(e,t[e]);return"leading"==t?this.leading(e):"anchor"==t?this.attr("text-anchor",e):"size"==t||"family"==t||"weight"==t||"stretch"==t||"variant"==t||"style"==t?this.attr("font-"+t,e):this.attr(t,e)}}),i.Set=i.invent({create:function(t){t instanceof i.Set?this.members=t.members.slice():Array.isArray(t)?this.members=t:this.clear()},extend:{add:function(){var t,e,i=[].slice.call(arguments);for(t=0,e=i.length;t-1&&this.members.splice(e,1),this},each:function(t){for(var e=0,i=this.members.length;e=0},index:function(t){return this.members.indexOf(t)},get:function(t){return this.members[t]},first:function(){return this.get(0)},last:function(){return this.get(this.members.length-1)},valueOf:function(){return this.members},bbox:function(){if(0==this.members.length)return new i.RBox;var t=this.members[0].rbox(this.members[0].doc());return this.each(function(){t=t.merge(this.rbox(this.doc()))}),t}},construct:{set:function(t){return new i.Set(t)}}}),i.FX.Set=i.invent({create:function(t){this.set=t}}),i.Set.inherit=function(){var t=[];for(var e in i.Shape.prototype)"function"==typeof i.Shape.prototype[e]&&"function"!=typeof i.Set.prototype[e]&&t.push(e);for(var e in t.forEach(function(t){i.Set.prototype[t]=function(){for(var e=0,n=this.members.length;e=0;t--)delete this.memory()[arguments[t]];return this},memory:function(){return this._memory||(this._memory={})}}),i.get=function(t){var n=e.getElementById(function(t){var e=(t||"").toString().match(i.regex.reference);if(e)return e[1]}(t)||t);return i.adopt(n)},i.select=function(t,n){return new i.Set(i.utils.map((n||e).querySelectorAll(t),function(t){return i.adopt(t)}))},i.extend(i.Parent,{select:function(t){return i.select(t,this.node)}});var x="abcdef".split("");if("function"!=typeof t.CustomEvent){var w=function(t,i){i=i||{bubbles:!1,cancelable:!1,detail:void 0};var n=e.createEvent("CustomEvent");return n.initCustomEvent(t,i.bubbles,i.cancelable,i.detail),n};w.prototype=t.Event.prototype,i.CustomEvent=w}else i.CustomEvent=t.CustomEvent;return function(e){for(var i=0,n=["moz","webkit"],s=0;sr.maxX-e.width&&(a=(n=r.maxX-e.width)-this.startPoints.box.x),null!=r.minY&&sr.maxY-e.height&&(o=(s=r.maxY-e.height)-this.startPoints.box.y),null!=r.snapToGrid&&(n-=n%r.snapToGrid,s-=s%r.snapToGrid,a-=a%r.snapToGrid,o-=o%r.snapToGrid),this.el instanceof SVG.G?this.el.matrix(this.startPoints.transform).transform({x:a,y:o},!0):this.el.move(n,s));return i},t.prototype.end=function(t){var e=this.drag(t);this.el.fire("dragend",{event:t,p:e,m:this.m,handler:this}),SVG.off(window,"mousemove.drag"),SVG.off(window,"touchmove.drag"),SVG.off(window,"mouseup.drag"),SVG.off(window,"touchend.drag")},SVG.extend(SVG.Element,{draggable:function(e,i){"function"!=typeof e&&"object"!=typeof e||(i=e,e=!0);var n=this.remember("_draggable")||new t(this);return(e=void 0===e||e)?n.init(i||{},e):(this.off("mousedown.drag"),this.off("touchstart.drag")),this}})}).call(this)},function(t,e){!function(){"use strict";(function(){function t(t){t.remember("_resizeHandler",this),this.el=t,this.parameters={},this.lastUpdateCall=null,this.p=t.doc().node.createSVGPoint()}t.prototype.transformPoint=function(t,e,i){return this.p.x=t-(this.offset.x-window.pageXOffset),this.p.y=e-(this.offset.y-window.pageYOffset),this.p.matrixTransform(i||this.m)},t.prototype._extractPosition=function(t){return{x:null!=t.clientX?t.clientX:t.touches[0].clientX,y:null!=t.clientY?t.clientY:t.touches[0].clientY}},t.prototype.init=function(t){var e=this;if(this.stop(),"stop"!==t){for(var i in this.options={},this.el.resize.defaults)this.options[i]=this.el.resize.defaults[i],void 0!==t[i]&&(this.options[i]=t[i]);this.el.on("lt.resize",function(t){e.resize(t||window.event)}),this.el.on("rt.resize",function(t){e.resize(t||window.event)}),this.el.on("rb.resize",function(t){e.resize(t||window.event)}),this.el.on("lb.resize",function(t){e.resize(t||window.event)}),this.el.on("t.resize",function(t){e.resize(t||window.event)}),this.el.on("r.resize",function(t){e.resize(t||window.event)}),this.el.on("b.resize",function(t){e.resize(t||window.event)}),this.el.on("l.resize",function(t){e.resize(t||window.event)}),this.el.on("rot.resize",function(t){e.resize(t||window.event)}),this.el.on("point.resize",function(t){e.resize(t||window.event)}),this.update()}},t.prototype.stop=function(){return this.el.off("lt.resize"),this.el.off("rt.resize"),this.el.off("rb.resize"),this.el.off("lb.resize"),this.el.off("t.resize"),this.el.off("r.resize"),this.el.off("b.resize"),this.el.off("l.resize"),this.el.off("rot.resize"),this.el.off("point.resize"),this},t.prototype.resize=function(t){var e=this;this.m=this.el.node.getScreenCTM().inverse(),this.offset={x:window.pageXOffset,y:window.pageYOffset};var i=this._extractPosition(t.detail.event);if(this.parameters={type:this.el.type,p:this.transformPoint(i.x,i.y),x:t.detail.x,y:t.detail.y,box:this.el.bbox(),rotation:this.el.transform().rotation},"text"===this.el.type&&(this.parameters.fontSize=this.el.attr()["font-size"]),void 0!==t.detail.i){var n=this.el.array().valueOf();this.parameters.i=t.detail.i,this.parameters.pointCoords=[n[t.detail.i][0],n[t.detail.i][1]]}switch(t.type){case"lt":this.calc=function(t,e){var i=this.snapToGrid(t,e);if(this.parameters.box.width-i[0]>0&&this.parameters.box.height-i[1]>0){if("text"===this.parameters.type)return this.el.move(this.parameters.box.x+i[0],this.parameters.box.y),void this.el.attr("font-size",this.parameters.fontSize-i[0]);i=this.checkAspectRatio(i),this.el.move(this.parameters.box.x+i[0],this.parameters.box.y+i[1]).size(this.parameters.box.width-i[0],this.parameters.box.height-i[1])}};break;case"rt":this.calc=function(t,e){var i=this.snapToGrid(t,e,2);if(this.parameters.box.width+i[0]>0&&this.parameters.box.height-i[1]>0){if("text"===this.parameters.type)return this.el.move(this.parameters.box.x-i[0],this.parameters.box.y),void this.el.attr("font-size",this.parameters.fontSize+i[0]);i=this.checkAspectRatio(i,!0),this.el.move(this.parameters.box.x,this.parameters.box.y+i[1]).size(this.parameters.box.width+i[0],this.parameters.box.height-i[1])}};break;case"rb":this.calc=function(t,e){var i=this.snapToGrid(t,e,0);if(this.parameters.box.width+i[0]>0&&this.parameters.box.height+i[1]>0){if("text"===this.parameters.type)return this.el.move(this.parameters.box.x-i[0],this.parameters.box.y),void this.el.attr("font-size",this.parameters.fontSize+i[0]);i=this.checkAspectRatio(i),this.el.move(this.parameters.box.x,this.parameters.box.y).size(this.parameters.box.width+i[0],this.parameters.box.height+i[1])}};break;case"lb":this.calc=function(t,e){var i=this.snapToGrid(t,e,1);if(this.parameters.box.width-i[0]>0&&this.parameters.box.height+i[1]>0){if("text"===this.parameters.type)return this.el.move(this.parameters.box.x+i[0],this.parameters.box.y),void this.el.attr("font-size",this.parameters.fontSize-i[0]);i=this.checkAspectRatio(i,!0),this.el.move(this.parameters.box.x+i[0],this.parameters.box.y).size(this.parameters.box.width-i[0],this.parameters.box.height+i[1])}};break;case"t":this.calc=function(t,e){var i=this.snapToGrid(t,e,2);if(this.parameters.box.height-i[1]>0){if("text"===this.parameters.type)return;this.el.move(this.parameters.box.x,this.parameters.box.y+i[1]).height(this.parameters.box.height-i[1])}};break;case"r":this.calc=function(t,e){var i=this.snapToGrid(t,e,0);if(this.parameters.box.width+i[0]>0){if("text"===this.parameters.type)return;this.el.move(this.parameters.box.x,this.parameters.box.y).width(this.parameters.box.width+i[0])}};break;case"b":this.calc=function(t,e){var i=this.snapToGrid(t,e,0);if(this.parameters.box.height+i[1]>0){if("text"===this.parameters.type)return;this.el.move(this.parameters.box.x,this.parameters.box.y).height(this.parameters.box.height+i[1])}};break;case"l":this.calc=function(t,e){var i=this.snapToGrid(t,e,1);if(this.parameters.box.width-i[0]>0){if("text"===this.parameters.type)return;this.el.move(this.parameters.box.x+i[0],this.parameters.box.y).width(this.parameters.box.width-i[0])}};break;case"rot":this.calc=function(t,e){var i=t+this.parameters.p.x,n=e+this.parameters.p.y,s=Math.atan2(this.parameters.p.y-this.parameters.box.y-this.parameters.box.height/2,this.parameters.p.x-this.parameters.box.x-this.parameters.box.width/2),r=Math.atan2(n-this.parameters.box.y-this.parameters.box.height/2,i-this.parameters.box.x-this.parameters.box.width/2),a=this.parameters.rotation+180*(r-s)/Math.PI+this.options.snapToAngle/2;this.el.center(this.parameters.box.cx,this.parameters.box.cy).rotate(a-a%this.options.snapToAngle,this.parameters.box.cx,this.parameters.box.cy)};break;case"point":this.calc=function(t,e){var i=this.snapToGrid(t,e,this.parameters.pointCoords[0],this.parameters.pointCoords[1]),n=this.el.array().valueOf();n[this.parameters.i][0]=this.parameters.pointCoords[0]+i[0],n[this.parameters.i][1]=this.parameters.pointCoords[1]+i[1],this.el.plot(n)}}this.el.fire("resizestart",{dx:this.parameters.x,dy:this.parameters.y,event:t}),SVG.on(window,"touchmove.resize",function(t){e.update(t||window.event)}),SVG.on(window,"touchend.resize",function(){e.done()}),SVG.on(window,"mousemove.resize",function(t){e.update(t||window.event)}),SVG.on(window,"mouseup.resize",function(){e.done()})},t.prototype.update=function(t){if(t){var e=this._extractPosition(t),i=this.transformPoint(e.x,e.y),n=i.x-this.parameters.p.x,s=i.y-this.parameters.p.y;this.lastUpdateCall=[n,s],this.calc(n,s),this.el.fire("resizing",{dx:n,dy:s,event:t})}else this.lastUpdateCall&&this.calc(this.lastUpdateCall[0],this.lastUpdateCall[1])},t.prototype.done=function(){this.lastUpdateCall=null,SVG.off(window,"mousemove.resize"),SVG.off(window,"mouseup.resize"),SVG.off(window,"touchmove.resize"),SVG.off(window,"touchend.resize"),this.el.fire("resizedone")},t.prototype.snapToGrid=function(t,e,i,n){var s;return void 0!==n?s=[(i+t)%this.options.snapToGrid,(n+e)%this.options.snapToGrid]:(i=null==i?3:i,s=[(this.parameters.box.x+t+(1&i?0:this.parameters.box.width))%this.options.snapToGrid,(this.parameters.box.y+e+(2&i?0:this.parameters.box.height))%this.options.snapToGrid]),t<0&&(s[0]-=this.options.snapToGrid),e<0&&(s[1]-=this.options.snapToGrid),t-=Math.abs(s[0])a.maxX&&(t=a.maxX-s),void 0!==a.minY&&r+ea.maxY&&(e=a.maxY-r),[t,e]},t.prototype.checkAspectRatio=function(t,e){if(!this.options.saveAspectRatio)return t;var i=t.slice(),n=this.parameters.box.width/this.parameters.box.height,s=this.parameters.box.width+t[0],r=this.parameters.box.height-t[1],a=s/r;return an&&(i[0]=this.parameters.box.width-r*n,e&&(i[0]=-i[0])),i},SVG.extend(SVG.Element,{resize:function(e){return(this.remember("_resizeHandler")||new t(this)).init(e||{}),this}}),SVG.Element.prototype.resize.defaults={snapToAngle:.1,snapToGrid:1,constraint:{},saveAspectRatio:!1}}).call(this)}()},function(t,e){!function(){"use strict";function t(t){this.el=t,t.remember("_selectHandler",this),this.pointSelection={isSelected:!1},this.rectSelection={isSelected:!1},this.pointsList={lt:[0,0],rt:["width",0],rb:["width","height"],lb:[0,"height"],t:["width",0],r:["width","height"],b:["width","height"],l:[0,"height"]},this.pointCoord=function(t,e,i){var n="string"!=typeof t?t:e[t];return i?n/2:n},this.pointCoords=function(t,e){var i=this.pointsList[t];return{x:this.pointCoord(i[0],e,"t"===t||"b"===t),y:this.pointCoord(i[1],e,"r"===t||"l"===t)}}}t.prototype.init=function(t,e){var i=this.el.bbox();this.options={};var n=this.el.selectize.defaults.points;for(var s in this.el.selectize.defaults)this.options[s]=this.el.selectize.defaults[s],void 0!==e[s]&&(this.options[s]=e[s]);var r=["points","pointsExclude"];for(var s in r){var a=this.options[r[s]];"string"==typeof a?a=a.length>0?a.split(/\s*,\s*/i):[]:"boolean"==typeof a&&"points"===r[s]&&(a=a?n:[]),this.options[r[s]]=a}this.options.points=[n,this.options.points].reduce(function(t,e){return t.filter(function(t){return e.indexOf(t)>-1})}),this.options.points=[this.options.points,this.options.pointsExclude].reduce(function(t,e){return t.filter(function(t){return e.indexOf(t)<0})}),this.parent=this.el.parent(),this.nested=this.nested||this.parent.group(),this.nested.matrix(new SVG.Matrix(this.el).translate(i.x,i.y)),this.options.deepSelect&&-1!==["line","polyline","polygon"].indexOf(this.el.type)?this.selectPoints(t):this.selectRect(t),this.observe(),this.cleanup()},t.prototype.selectPoints=function(t){return this.pointSelection.isSelected=t,this.pointSelection.set?this:(this.pointSelection.set=this.parent.set(),this.drawPoints(),this)},t.prototype.getPointArray=function(){var t=this.el.bbox();return this.el.array().valueOf().map(function(e){return[e[0]-t.x,e[1]-t.y]})},t.prototype.drawPoints=function(){for(var t=this,e=this.getPointArray(),i=0,n=e.length;i-1){var e=this.transformPoint(t.clientX,t.clientY),i=this.el.array().valueOf();return i.push(this.snapToGrid([e.x,e.y])),this.el.plot(i),this.drawCircles(),void this.el.fire("drawpoint",{event:t,p:{x:e.x,y:e.y},m:this.m})}this.stop(t)},clean:function(){this.set.each(function(){this.remove()}),this.set.clear(),delete this.set},drawCircles:function(){var t=this.el.array().valueOf();this.set.each(function(){this.remove()}),this.set.clear();for(var e=0;e0?6*n/5:5*n/6;this.data.scale=Math.min(Math.max(r,s.MIN),s.MAX);var o=this.data.angle,h=Math.sin(o*Math.PI/180)+Math.cos(o*Math.PI/180);o/90%2?(this.data.top+=h*((t-this.data.imageSize.width/2)*(n/this.data.scale-1))*this.data.scale,this.data.left-=h*((e-this.data.imageSize.height/2)*(n/this.data.scale-1))*this.data.scale):(this.data.left+=h*((t-this.data.imageSize.width/2)*(n/this.data.scale-1))*this.data.scale,this.data.top+=h*((e-this.data.imageSize.height/2)*(n/this.data.scale-1))*this.data.scale),this.notify(a.ZOOM)}},{key:"move",value:function(t,e){this.data.top+=t,this.data.left+=e,this.notify(a.MOVE)}},{key:"setup",value:function(t,e){var i=this;t.data(function(){i.data.image="",i.notify(a.IMAGE)}).then(function(n){i.data.imageSize={height:t.height,width:t.width},i.data.rememberAngle||(i.data.angle=0),i.data.image=n,i.notify(a.IMAGE),i.data.objects=e,i.notify(a.OBJECTS)}).catch(function(t){throw t})}},{key:"activate",value:function(t,e){this.data.activeElement={clientID:t,attributeID:e},this.notify(a.ACTIVATE)}},{key:"rotate",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];t===r.CLOCKWISE90?this.data.angle+=90:this.data.angle-=90,this.data.angle%=360,this.data.rememberAngle=e,this.fit()}},{key:"focus",value:function(t,e){this.data.focusData={clientID:t,padding:e},this.notify(a.FOCUS)}},{key:"fit",value:function(){var t=this.data.angle;this.data.scale=t/90%2?Math.min(this.data.canvasSize.width/this.data.imageSize.height,this.data.canvasSize.height/this.data.imageSize.width):Math.min(this.data.canvasSize.width/this.data.imageSize.width,this.data.canvasSize.height/this.data.imageSize.height),this.data.scale=Math.min(Math.max(this.data.scale,s.MIN),s.MAX),this.data.top=this.data.canvasSize.height/2-this.data.imageSize.height/2,this.data.left=this.data.canvasSize.width/2-this.data.imageSize.width/2,this.notify(a.FIT)}},{key:"grid",value:function(t,e){this.data.gridSize={height:e,width:t},this.notify(a.GRID)}},{key:"draw",value:function(t){if(t.enabled){if(this.data.drawData.enabled)throw new Error("Drawing has been already started");if(!t.shapeType)throw new Error("A shape type is not specified");if(void 0!==t.numberOfPoints){if("polygon"===t.shapeType&&t.numberOfPoints<3)throw new Error("A polygon consists of at least 3 points");if("polyline"===t.shapeType&&t.numberOfPoints<2)throw new Error("A polyline consists of at least 2 points")}}this.data.drawData=Object.assign({},t),this.notify(a.DRAW)}},{key:"split",value:function(t){return t}},{key:"group",value:function(t){return t}},{key:"merge",value:function(t){return t}},{key:"cancel",value:function(){console.log("hello")}},{key:"geometry",get:function(){return{angle:this.data.angle,canvas:Object.assign({},this.data.canvasSize),image:Object.assign({},this.data.imageSize),grid:Object.assign({},this.data.gridSize),left:this.data.left,offset:this.data.imageOffset,scale:this.data.scale,top:this.data.top}},set:function(t){this.data.angle=t.angle,this.data.canvasSize=Object.assign({},t.canvas),this.data.imageSize=Object.assign({},t.image),this.data.gridSize=Object.assign({},t.grid),this.data.left=t.left,this.data.top=t.top,this.data.imageOffset=t.offset,this.data.scale=t.scale,this.data.imageOffset=Math.floor(Math.max(this.data.canvasSize.height/s.MIN,this.data.canvasSize.width/s.MIN))}},{key:"image",get:function(){return this.data.image}},{key:"objects",get:function(){return this.data.objects}},{key:"gridSize",get:function(){return Object.assign({},this.data.gridSize)}},{key:"focusData",get:function(){return Object.assign({},this.data.focusData)}},{key:"activeElement",get:function(){return Object.assign({},this.data.activeElement)}},{key:"objectStateClass",get:function(){return this.data.ObjectStateClass}},{key:"drawData",get:function(){return Object.assign({},this.data.drawData)}}])&&l(i.prototype,n),h&&l(i,h),e}();function p(t,e){for(var i=0;i=y.AREA_THRESHOLD?t.onDrawDone({points:[a,o,h,l]}):t.onDrawDone(null)})}},{key:"drawPolyshape",value:function(){var t=this,e=this.drawData.numberOfPoints,i=function(){--e||this.drawInstance.draw("done")}.bind(this);this.drawData.numberOfPoints&&(this.drawInstance.on("drawstart",i),this.drawInstance.on("drawpoint",i),this.drawInstance.on("undopoint",function(){e++}));var n=function(t){3===t.which&&(t.stopPropagation(),t.preventDefault(),this.drawInstance.draw("undo"))}.bind(this);this.canvas.node.addEventListener("mousedown",n);var s={x:null,y:null},r=function(t){if(t.shiftKey&&["polygon","polyline"].includes(this.drawData.shapeType))if(null===s.x||null===s.y)this.drawInstance.draw("point",t);else{Math.sqrt(Math.pow(t.clientX-s.x,2)+Math.pow(t.clientY-s.y,2))>15&&this.drawInstance.draw("point",t)}}.bind(this);this.canvas.node.addEventListener("mousemove",r);var a=this;this.drawInstance.on("drawstart drawpoint",function(t){a.transform(a.geometry),s.x=t.detail.event.clientX,s.y=t.detail.event.clientY}),this.drawInstance.on("drawstop",function(){a.canvas.node.removeEventListener("mousedown",n),a.canvas.node.removeEventListener("mousemove",r)}),this.drawInstance.on("drawdone",function(e){var i=I(t.canvas.node,e.target.getAttribute("points").split(/[,\s]/g).map(function(t){return+t}));i=z(t.background,i);for(var n={xtl:Number.MAX_SAFE_INTEGER,ytl:Number.MAX_SAFE_INTEGER,xbr:Number.MAX_SAFE_INTEGER,ybr:Number.MAX_SAFE_INTEGER},s=t.geometry.image.width,r=t.geometry.image.height,a=0;a=y.AREA_THRESHOLD?t.onDrawDone({points:i}):"polyline"===t.drawData.shapeType&&(n.xbr-n.xtl>=y.SIZE_THRESHOLD||n.ybr-n.ytl>=y.SIZE_THRESHOLD)?t.onDrawDone({points:i}):"points"===t.drawData.shapeType?t.onDrawDone({points:i}):t.onDrawDone(null)})}},{key:"drawPolygon",value:function(){this.drawInstance=this.canvas.polygon().draw({snapToGrid:.1}).addClass("cvat_canvas_shape_drawing").style({"stroke-width":y.BASE_STROKE_WIDTH/this.geometry.scale}),this.drawPolyshape()}},{key:"drawPolyline",value:function(){this.drawInstance=this.canvas.polyline().draw({snapToGrid:.1}).addClass("cvat_canvas_shape_drawing").style({"stroke-width":y.BASE_STROKE_WIDTH/this.geometry.scale,"fill-opacity":0}),this.drawPolyshape()}},{key:"drawPoints",value:function(){this.drawInstance=this.canvas.polygon().draw({snapToGrid:.1}).addClass("cvat_canvas_shape_drawing").style({"stroke-width":0,opacity:0}),this.drawPolyshape()}},{key:"startDraw",value:function(){"rectangle"===this.drawData.shapeType?this.drawBox():"polygon"===this.drawData.shapeType?this.drawPolygon():"polyline"===this.drawData.shapeType?this.drawPolyline():"points"===this.drawData.shapeType&&this.drawPoints()}}]),X(t,[{key:"transform",value:function(t){if(this.geometry=t,this.crosshair&&(this.crosshair.x.attr({"stroke-width":y.BASE_STROKE_WIDTH/(2*t.scale)}),this.crosshair.y.attr({"stroke-width":y.BASE_STROKE_WIDTH/(2*t.scale)})),this.drawInstance){this.drawInstance.draw("transform"),this.drawInstance.style({"stroke-width":y.BASE_STROKE_WIDTH/t.scale});var e=this.drawInstance.remember("_paintHandler"),i=!0,n=!1,s=void 0;try{for(var r,a=e.set.members[Symbol.iterator]();!(i=(r=a.next()).done);i=!0){var o=r.value;o.style("stroke-width","".concat(y.BASE_STROKE_WIDTH/(3*t.scale))),o.attr("r","".concat(y.BASE_POINT_SIZE/(2*t.scale)))}}catch(t){n=!0,s=t}finally{try{i||null==a.return||a.return()}finally{if(n)throw s}}}}},{key:"draw",value:function(t,e){this.geometry=e,t.enabled?(this.drawData=t,this.initDrawing(),this.startDraw()):(this.closeDrawing(),this.drawData=t)}}]),t}();function R(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var i=[],n=!0,s=!1,r=void 0;try{for(var a,o=t[Symbol.iterator]();!(n=(a=o.next()).done)&&(i.push(a.value),!e||i.length!==e);n=!0);}catch(t){s=!0,r=t}finally{try{n||null==o.return||o.return()}finally{if(s)throw r}}return i}(t,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}()}function L(t,e){for(var i=0;i0?-1:1),t.preventDefault()}),this.content.addEventListener("mousemove",function(t){if(n.mode===B.IDLE){var e=R(z(n.background,[t.clientX,t.clientY]),2),i=e[0],s=e[1],r=new CustomEvent("canvas.moved",{bubbles:!1,cancelable:!0,detail:{x:i,y:s,objects:n.controller.objects}});n.canvas.dispatchEvent(r)}}),this.content.oncontextmenu=function(){return!1},e.subscribe(this)}return Y(t,[{key:"onDrawDone",value:function(t){if(t){var e=new CustomEvent("canvas.drawn",{bubbles:!1,cancelable:!0,detail:{state:new this.controller.objectStateClass(t)}});this.canvas.dispatchEvent(e)}else{var i=new CustomEvent("canvas.canceled",{bubbles:!1,cancelable:!0});this.canvas.dispatchEvent(i)}this.controller.draw({enabled:!1})}}]),Y(t,[{key:"notify",value:function(t,e){function i(t){for(var e=0,i=[this.background,this.grid,this.loadingAnimation,this.content];ethis.canvas.offsetWidth){var u=[i.x,i.y];l=u[0],c=u[1]}var d=R(z(this.text,[l+y.TEXT_MARGIN,c]),2),f=d[0],p=d[1];t.move(f,p);var m=!0,v=!1,g=void 0;try{for(var x,w=t.lines().members[Symbol.iterator]();!(m=(x=w.next()).done);m=!0){x.value.attr("x",t.attr("x"))}}catch(t){v=!0,g=t}finally{try{m||null==w.return||w.return()}finally{if(v)throw g}}}},{key:"addText",value:function(t){var e=t.label,i=t.clientID,n=t.attributes,s=e.attributes.reduce(function(t,e){return t[e.id]=e.name,t},{});return this.adoptedText.text(function(t){t.tspan("".concat(e.name," ").concat(i)).style("text-transform","uppercase");for(var r=0,a=Object.keys(n);r1&&void 0!==arguments[1]?arguments[1]:null;this.model.activate(t,e)}},{key:"rotate",value:function(t,e){this.model.rotate(t,e)}},{key:"focus",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;this.model.focus(t,e)}},{key:"fit",value:function(){this.model.fit()}},{key:"grid",value:function(t,e){this.model.grid(t,e)}},{key:"draw",value:function(t){this.model.draw(t)}},{key:"split",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.model.split(t)}},{key:"group",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.model.group(t)}},{key:"merge",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.model.merge(t)}},{key:"cancel",value:function(){this.model.cancel()}}])&&W(e.prototype,i),n&&W(e,n),t}()}]); +//# sourceMappingURL=cvat-canvas.js.map \ No newline at end of file diff --git a/cvat-canvas/public/cvat-canvas.js.map b/cvat-canvas/public/cvat-canvas.js.map new file mode 100644 index 00000000..458b9b25 --- /dev/null +++ b/cvat-canvas/public/cvat-canvas.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack://canvas/webpack/bootstrap","webpack://canvas/./node_modules/svg.js/dist/svg.js","webpack://canvas/./node_modules/svg.draggable.js/dist/svg.draggable.js","webpack://canvas/./node_modules/svg.resize.js/dist/svg.resize.js","webpack://canvas/./node_modules/svg.select.js/dist/svg.select.js","webpack://canvas/./node_modules/svg.draw.js/dist/svg.draw.js","webpack://canvas/./src/master.ts","webpack://canvas/./src/canvasModel.ts","webpack://canvas/./src/canvasController.ts","webpack://canvas/./src/consts.ts","webpack://canvas/./src/svg.patch.ts","webpack://canvas/./src/shared.ts","webpack://canvas/./src/drawHandler.ts","webpack://canvas/./src/canvasView.ts","webpack://canvas/./src/canvas.ts"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","__WEBPACK_AMD_DEFINE_RESULT__","root","window","this","undefined","document","SVG","element","supported","Doc","parser","draw","prepare","xmlns","xlink","svgjs","createElementNS","createSVGRect","did","eid","capitalize","setAttribute","extend","methods","slice","arguments","pop","length","Set","inherit","invent","config","initializer","constructor","construct","parent","Container","adopt","node","instance","nodeName","parentNode","SVGElement","Nested","Gradient","Element","type","namespace","defs","setData","JSON","parse","getAttribute","body","getElementsByTagName","documentElement","nested","size","style","attr","poly","polyline","path","native","addEventListener","regex","numberAndUnit","hex","rgb","reference","transforms","whitespace","isHex","isRgb","isCss","isBlank","isNumber","isPercent","isImage","delimiter","hyphen","pathLetters","isPathLetter","numbersWithDots","dots","utils","map","array","block","il","result","push","filter","radians","Math","PI","degrees","filterSVGElements","nodes","el","defaults","attrs","fill-opacity","stroke-opacity","stroke-width","stroke-linejoin","stroke-linecap","fill","stroke","opacity","x","y","cx","cy","width","height","rx","ry","offset","stop-opacity","stop-color","font-size","font-family","text-anchor","Color","color","match","g","b","test","exec","replace","parseInt","substring","join","toString","toHex","compToHex","toRgb","brightness","morph","destination","at","pos","isColor","Array","fallback","valueOf","lastValue","lastDestination","settle","seen","indexOf","isArray","split","string","trim","parseFloat","reverse","clone","array_clone","arr","PointArray","toLine","x1","y1","x2","y2","points","len","move","box","bbox","isNaN","getBBox","pathHandlers","M","p0","L","H","V","C","S","Q","T","Z","A","mlhvqtcsa","j","jl","toUpperCase","PathArray","a","arrayToString","equalCommands","pathArray","sourceArray","destinationArray","paramCnt","pathRegReplace","reduce","prev","curr","concat","Point","index","Number","unit","isFinite","toJSON","plus","number","minus","times","divide","to","relative","_stroke","_event","_events","dom","center","proportionalSize","writeDataToDom","assignNewId","cloneNode","add","after","remove","removeElement","addTo","put","putIn","id","inside","show","hide","visible","classes","hasClass","addClass","removeClass","toggleClass","matches","doc","parents","selector","matchesSelector","msMatchesSelector","mozMatchesSelector","webkitMatchesSelector","oMatchesSelector","svg","well","createElement","Parent","appendChild","innerHTML","firstChild","childNodes","each","lines","fn","removeAttribute","keys","stringify","is","obj","easing","-","<>","cos",">","sin","<","from","MorphObj","Situation","init","reversed","reversing","duration","delay","start","Date","finish","ease","loop","loops","animations","styles","once","FX","_target","situations","active","situation","paused","lastPos","absPos","_speed","animate","queue","target","timeToAbsPos","timestamp","absPosToTime","startAnimFrame","stopAnimFrame","animationFrame","requestAnimationFrame","step","cancelAnimationFrame","startCurrent","initAnimations","shift","dequeue","stop","source","initialTransformation","matrixify","clearQueue","clearCurrent","jumpToEnd","atEnd","reset","temp","atStart","isAbsPos","durDivSpd","speed","pause","last","play","progress","easeIt","on","wrapper","e","detail","off","_callStart","during","eased","afterAll","duringAll","method","args","ignoreTime","absPosInt","lastLoop","max","floor","Boolean","min","fire","fx","eachAt","self","apply","Matrix","multiply","undo","extract","matrix","isEased","setTimeout","real","v","G","transform","num","Text","plot","leading","viewbox","ViewBox","update","Stop","Box","left","top","fullBox","merge","xMin","Infinity","xMax","yMin","yMax","pts","forEach","BBox","contains","Exception","topParent","Shape","clientLeft","clientTop","clientWidth","clientHeight","tbox","console","warn","rbox","RBox","getBoundingClientRect","addOffset","pageXOffset","pageYOffset","screenCTM","inverse","base","arrayToMatrix","abcdef","px","deltaTransformPoint","py","skewX","atan2","f","transformedX","sqrt","transformedY","skewY","scaleX","scaleY","rotation","parseMatrix","translate","scale","around","rotate","flip","skew","tan","createSVGMatrix","float32String","ctm","getCTM","rect","getScreenCTM","point","createSVGPoint","matrixTransform","attributes","nodeValue","image","Image","pattern","setAttributeNS","rebuild","ensureCentre","Rotate","Scale","Skew","Translate","untransform","str","kv","toParent","pCtm","toDoc","Transformation","inversed","params","_undo","cssText","camelCase","children","insertBefore","has","first","deep","removeChild","clear","hasChildNodes","lastChild","_defs","ungroup","depth","Defs","flatten","view","we","he","wm","hm","reg","offsetWidth","offsetHeight","zoom","event","listenerId","events","listener","binding","options","bag","_svgjsListenerId","ev","removeEventListener","data","Event","dispatchEvent","CustomEvent","cancelable","gbox","trans","group","getElementById","version","spof","nextSibling","siblings","position","next","previous","forward","backward","front","back","before","Mask","targets","unmask","mask","maskWith","masker","ClipPath","unclip","clip","clipWith","clipper","gradient","fy","Pattern","patternUnits","Bare","words","text","createTextNode","symbol","Use","file","use","Rect","Circle","circle","Ellipse","ellipse","Line","line","Polyline","Polygon","polygon","_array","morphArray","Path","load","url","img","_loaded","ratio","_error","src","loaded","error","_rebuild","_build","oy","nodeType","newLined","textContent","build","tspan","newLine","textPath","blankLineOffset","dy","plain","Tspan","dx","getComputedTextLength","TextPath","track","link","linkTo","Marker","ref","marker","sugar","prefix","toLowerCase","charAt","comp","w","h","abs","extension","dmove","radius","getTotalLength","pointAt","getPointAtLength","font","members","elements","splice","set","remember","k","memory","forget","_memory","idFromReference","select","query","querySelectorAll","CustomEventPoly","bubbles","createEvent","initCustomEvent","lastTime","vendors","callback","currTime","getTime","timeToCall","clearTimeout","factory","DragHandler","constraint","val","_this","transformPoint","touches","changedTouches","clientX","clientY","which","buttons","handler","defaultPrevented","preventDefault","stopPropagation","anchorOffset","startPoints","drag","end","gx","gy","coord","minX","maxX","minY","maxY","snapToGrid","draggable","dragHandler","ResizeHandler","parameters","lastUpdateCall","_extractPosition","resize","txPt","fontSize","pointCoords","calc","diffX","diffY","snap","checkAspectRatio","current","sAngle","pAngle","angle","snapToAngle","done","flag","pointCoordsY","constraintToBox","orgX","orgY","isReverse","saveAspectRatio","updatedSnap","aspectRatio","newW","newH","newAspectRatio","SelectHandler","pointSelection","isSelected","rectSelection","pointsList","lt","rt","rb","lb","pointCoord","setting","isPointCentered","settings","selectize","pointsLists","option","pointsExclude","deepSelect","selectPoints","selectRect","observe","cleanup","drawPoints","getPointArray","curriedEvent","returnValue","pageX","pageY","drawPoint","classPoints","pointType","drawCircle","drawRect","Error","pointSize","updatePointSelection","updateRectSelection","coords","rotationPoint","getMoseDownFunc","eventName","classRect","pointElement","MutationObserver","observerInst","disconnect","PaintHandler","plugin","getPlugin","startPoint","pointPlugin","clean","cancel","param","plugins","paintHandler","shapes","shapesArr","drawCircles","FrameZoom","Rotation","UpdateReasons","MasterImpl","_classCallCheck","listeners","reason","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_step","_iterator","iterator","notify","err","CanvasModelImpl","_MasterImpl","ObjectStateClass","canvasModel_classCallCheck","_possibleConstructorReturn","_getPrototypeOf","activeElement","clientID","attributeID","canvasSize","drawData","enabled","shapeType","numberOfPoints","initialState","imageOffset","imageSize","focusData","padding","gridSize","objects","rememberAngle","_inherits","direction","oldScale","newScale","MIN","MAX","mutiplier","ZOOM","topOffset","leftOffset","MOVE","frameData","objectStates","_this2","IMAGE","then","OBJECTS","exception","ACTIVATE","CLOCKWISE90","fit","FOCUS","FIT","stepX","stepY","GRID","assign","DRAW","log","canvas","grid","geometry","CanvasControllerImpl","model","canvasController_classCallCheck","lastDragPosition","isDragging","objectStateClass","consts","BASE_STROKE_WIDTH","BASE_POINT_SIZE","TEXT_MARGIN","AREA_THRESHOLD","SIZE_THRESHOLD","originalDraw","_len","_key","_i","_Object$keys","_array$i","_slicedToArray","_array$i2","originalDraggable","_len2","_key2","svg_patch_i2","_Object$keys2","originalResize","_len3","_key3","_i3","_Object$keys3","translateFromSVG","output","transformationMatrix","pt","translateToSVG","Mode","DrawHandlerImpl","onDrawDone","background","_this3","drawHandler_classCallCheck","crosshair","drawInstance","_translateToSVG4","drawHandler_slicedToArray","drawHandler_createClass","zOrder","MAX_SAFE_INTEGER","addCrosshair","removeCrosshair","frameWidth","frameHeight","_translateFromSVG2","xtl","ytl","xbr","ybr","_translateToSVG2","sizeDecrement","handleUndo","lastDrawnPoint","handleSlide","shiftKey","includes","pow","drawPolyshape","drawBox","drawPolygon","drawPolyline","initDrawing","startDraw","closeDrawing","darker","percentage","R","round","B","rHex","gHex","bHex","CanvasViewImpl","controller","canvasView_classCallCheck","svgShapes","svgTexts","IDLE","loadingAnimation","adoptedText","gridPath","gridPattern","content","adoptedContent","drawHandler","loadingCircle","gridDefs","gridRect","canvasFirstMounted","animationName","enableDrag","disableDrag","deltaY","canvasView_slicedToArray","oncontextmenu","subscribe","canvasView_createClass","state","_i2","_arr2","getElementsByClassName","_iteratorNormalCompletion2","_didIteratorError2","_iteratorError2","_step2","_iterator2","updateTextPosition","_i5","_arr5","_i6","_arr6","classList","backgroundImage","_arr3","_i4","_arr4","deactivate","_i7","addObjects","offsetLeft","offsetTop","dragged","activate","states","_iteratorNormalCompletion3","_didIteratorError3","_iteratorError3","_step3","_iterator3","objectType","addTag","translatedPoints","addRect","stringified","acc","idx","addPolygon","addPolyline","addPoints","visibility","addText","shape","append","DRAG","RESIZE","_translateFromSVG4","_ref","_ref2","_iteratorNormalCompletion4","_didIteratorError4","_iteratorError4","_step4","_iterator4","label","attrNames","_i8","attrID","_points","color-rendering","shape-rendering","CanvasImpl","canvas_classCallCheck","html","setup","focus"],"mappings":"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","file":"cvat-canvas.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 5);\n","/*!\n* svg.js - A lightweight library for manipulating and animating SVG.\n* @version 2.7.1\n* https://svgdotjs.github.io/\n*\n* @copyright Wout Fierens \n* @license MIT\n*\n* BUILT: Fri Nov 30 2018 10:01:55 GMT+0100 (GMT+01:00)\n*/;\n(function(root, factory) {\r\n /* istanbul ignore next */\r\n if (typeof define === 'function' && define.amd) {\r\n define(function(){\r\n return factory(root, root.document)\r\n })\r\n } else if (typeof exports === 'object') {\r\n module.exports = root.document ? factory(root, root.document) : function(w){ return factory(w, w.document) }\r\n } else {\r\n root.SVG = factory(root, root.document)\r\n }\r\n}(typeof window !== \"undefined\" ? window : this, function(window, document) {\r\n\r\n// Find global reference - uses 'this' by default when available,\r\n// falls back to 'window' otherwise (for bundlers like Webpack)\r\nvar globalRef = (typeof this !== \"undefined\") ? this : window;\r\n\r\n// The main wrapping element\r\nvar SVG = globalRef.SVG = function(element) {\r\n if (SVG.supported) {\r\n element = new SVG.Doc(element)\r\n\r\n if(!SVG.parser.draw)\r\n SVG.prepare()\r\n\r\n return element\r\n }\r\n}\r\n\r\n// Default namespaces\r\nSVG.ns = 'http://www.w3.org/2000/svg'\r\nSVG.xmlns = 'http://www.w3.org/2000/xmlns/'\r\nSVG.xlink = 'http://www.w3.org/1999/xlink'\r\nSVG.svgjs = 'http://svgjs.com/svgjs'\r\n\r\n// Svg support test\r\nSVG.supported = (function() {\r\n return !! document.createElementNS &&\r\n !! document.createElementNS(SVG.ns,'svg').createSVGRect\r\n})()\r\n\r\n// Don't bother to continue if SVG is not supported\r\nif (!SVG.supported) return false\r\n\r\n// Element id sequence\r\nSVG.did = 1000\r\n\r\n// Get next named element id\r\nSVG.eid = function(name) {\r\n return 'Svgjs' + capitalize(name) + (SVG.did++)\r\n}\r\n\r\n// Method for element creation\r\nSVG.create = function(name) {\r\n // create element\r\n var element = document.createElementNS(this.ns, name)\r\n\r\n // apply unique id\r\n element.setAttribute('id', this.eid(name))\r\n\r\n return element\r\n}\r\n\r\n// Method for extending objects\r\nSVG.extend = function() {\r\n var modules, methods, key, i\r\n\r\n // Get list of modules\r\n modules = [].slice.call(arguments)\r\n\r\n // Get object with extensions\r\n methods = modules.pop()\r\n\r\n for (i = modules.length - 1; i >= 0; i--)\r\n if (modules[i])\r\n for (key in methods)\r\n modules[i].prototype[key] = methods[key]\r\n\r\n // Make sure SVG.Set inherits any newly added methods\r\n if (SVG.Set && SVG.Set.inherit)\r\n SVG.Set.inherit()\r\n}\r\n\r\n// Invent new element\r\nSVG.invent = function(config) {\r\n // Create element initializer\r\n var initializer = typeof config.create == 'function' ?\r\n config.create :\r\n function() {\r\n this.constructor.call(this, SVG.create(config.create))\r\n }\r\n\r\n // Inherit prototype\r\n if (config.inherit)\r\n initializer.prototype = new config.inherit\r\n\r\n // Extend with methods\r\n if (config.extend)\r\n SVG.extend(initializer, config.extend)\r\n\r\n // Attach construct method to parent\r\n if (config.construct)\r\n SVG.extend(config.parent || SVG.Container, config.construct)\r\n\r\n return initializer\r\n}\r\n\r\n// Adopt existing svg elements\r\nSVG.adopt = function(node) {\r\n // check for presence of node\r\n if (!node) return null\r\n\r\n // make sure a node isn't already adopted\r\n if (node.instance) return node.instance\r\n\r\n // initialize variables\r\n var element\r\n\r\n // adopt with element-specific settings\r\n if (node.nodeName == 'svg')\r\n element = node.parentNode instanceof window.SVGElement ? new SVG.Nested : new SVG.Doc\r\n else if (node.nodeName == 'linearGradient')\r\n element = new SVG.Gradient('linear')\r\n else if (node.nodeName == 'radialGradient')\r\n element = new SVG.Gradient('radial')\r\n else if (SVG[capitalize(node.nodeName)])\r\n element = new SVG[capitalize(node.nodeName)]\r\n else\r\n element = new SVG.Element(node)\r\n\r\n // ensure references\r\n element.type = node.nodeName\r\n element.node = node\r\n node.instance = element\r\n\r\n // SVG.Class specific preparations\r\n if (element instanceof SVG.Doc)\r\n element.namespace().defs()\r\n\r\n // pull svgjs data from the dom (getAttributeNS doesn't work in html5)\r\n element.setData(JSON.parse(node.getAttribute('svgjs:data')) || {})\r\n\r\n return element\r\n}\r\n\r\n// Initialize parsing element\r\nSVG.prepare = function() {\r\n // Select document body and create invisible svg element\r\n var body = document.getElementsByTagName('body')[0]\r\n , draw = (body ? new SVG.Doc(body) : SVG.adopt(document.documentElement).nested()).size(2, 0)\r\n\r\n // Create parser object\r\n SVG.parser = {\r\n body: body || document.documentElement\r\n , draw: draw.style('opacity:0;position:absolute;left:-100%;top:-100%;overflow:hidden').attr('focusable', 'false').node\r\n , poly: draw.polyline().node\r\n , path: draw.path().node\r\n , native: SVG.create('svg')\r\n }\r\n}\r\n\r\nSVG.parser = {\r\n native: SVG.create('svg')\r\n}\r\n\r\ndocument.addEventListener('DOMContentLoaded', function() {\r\n if(!SVG.parser.draw)\r\n SVG.prepare()\r\n}, false)\r\n\n// Storage for regular expressions\r\nSVG.regex = {\r\n // Parse unit value\r\n numberAndUnit: /^([+-]?(\\d+(\\.\\d*)?|\\.\\d+)(e[+-]?\\d+)?)([a-z%]*)$/i\r\n\r\n // Parse hex value\r\n, hex: /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i\r\n\r\n // Parse rgb value\r\n, rgb: /rgb\\((\\d+),(\\d+),(\\d+)\\)/\r\n\r\n // Parse reference id\r\n, reference: /#([a-z0-9\\-_]+)/i\r\n\r\n // splits a transformation chain\r\n, transforms: /\\)\\s*,?\\s*/\r\n\r\n // Whitespace\r\n, whitespace: /\\s/g\r\n\r\n // Test hex value\r\n, isHex: /^#[a-f0-9]{3,6}$/i\r\n\r\n // Test rgb value\r\n, isRgb: /^rgb\\(/\r\n\r\n // Test css declaration\r\n, isCss: /[^:]+:[^;]+;?/\r\n\r\n // Test for blank string\r\n, isBlank: /^(\\s+)?$/\r\n\r\n // Test for numeric string\r\n, isNumber: /^[+-]?(\\d+(\\.\\d*)?|\\.\\d+)(e[+-]?\\d+)?$/i\r\n\r\n // Test for percent value\r\n, isPercent: /^-?[\\d\\.]+%$/\r\n\r\n // Test for image url\r\n, isImage: /\\.(jpg|jpeg|png|gif|svg)(\\?[^=]+.*)?/i\r\n\r\n // split at whitespace and comma\r\n, delimiter: /[\\s,]+/\r\n\r\n // The following regex are used to parse the d attribute of a path\r\n\r\n // Matches all hyphens which are not after an exponent\r\n, hyphen: /([^e])\\-/gi\r\n\r\n // Replaces and tests for all path letters\r\n, pathLetters: /[MLHVCSQTAZ]/gi\r\n\r\n // yes we need this one, too\r\n, isPathLetter: /[MLHVCSQTAZ]/i\r\n\r\n // matches 0.154.23.45\r\n, numbersWithDots: /((\\d?\\.\\d+(?:e[+-]?\\d+)?)((?:\\.\\d+(?:e[+-]?\\d+)?)+))+/gi\r\n\r\n // matches .\r\n, dots: /\\./g\r\n}\r\n\nSVG.utils = {\r\n // Map function\r\n map: function(array, block) {\r\n var i\r\n , il = array.length\r\n , result = []\r\n\r\n for (i = 0; i < il; i++)\r\n result.push(block(array[i]))\r\n\r\n return result\r\n }\r\n\r\n // Filter function\r\n, filter: function(array, block) {\r\n var i\r\n , il = array.length\r\n , result = []\r\n\r\n for (i = 0; i < il; i++)\r\n if (block(array[i]))\r\n result.push(array[i])\r\n\r\n return result\r\n }\r\n\r\n // Degrees to radians\r\n, radians: function(d) {\r\n return d % 360 * Math.PI / 180\r\n }\r\n\r\n // Radians to degrees\r\n, degrees: function(r) {\r\n return r * 180 / Math.PI % 360\r\n }\r\n\r\n, filterSVGElements: function(nodes) {\r\n return this.filter( nodes, function(el) { return el instanceof window.SVGElement })\r\n }\r\n\r\n}\n\r\nSVG.defaults = {\r\n // Default attribute values\r\n attrs: {\r\n // fill and stroke\r\n 'fill-opacity': 1\r\n , 'stroke-opacity': 1\r\n , 'stroke-width': 0\r\n , 'stroke-linejoin': 'miter'\r\n , 'stroke-linecap': 'butt'\r\n , fill: '#000000'\r\n , stroke: '#000000'\r\n , opacity: 1\r\n // position\r\n , x: 0\r\n , y: 0\r\n , cx: 0\r\n , cy: 0\r\n // size\r\n , width: 0\r\n , height: 0\r\n // radius\r\n , r: 0\r\n , rx: 0\r\n , ry: 0\r\n // gradient\r\n , offset: 0\r\n , 'stop-opacity': 1\r\n , 'stop-color': '#000000'\r\n // text\r\n , 'font-size': 16\r\n , 'font-family': 'Helvetica, Arial, sans-serif'\r\n , 'text-anchor': 'start'\r\n }\r\n\r\n}\n// Module for color convertions\r\nSVG.Color = function(color) {\r\n var match\r\n\r\n // initialize defaults\r\n this.r = 0\r\n this.g = 0\r\n this.b = 0\r\n\r\n if(!color) return\r\n\r\n // parse color\r\n if (typeof color === 'string') {\r\n if (SVG.regex.isRgb.test(color)) {\r\n // get rgb values\r\n match = SVG.regex.rgb.exec(color.replace(SVG.regex.whitespace,''))\r\n\r\n // parse numeric values\r\n this.r = parseInt(match[1])\r\n this.g = parseInt(match[2])\r\n this.b = parseInt(match[3])\r\n\r\n } else if (SVG.regex.isHex.test(color)) {\r\n // get hex values\r\n match = SVG.regex.hex.exec(fullHex(color))\r\n\r\n // parse numeric values\r\n this.r = parseInt(match[1], 16)\r\n this.g = parseInt(match[2], 16)\r\n this.b = parseInt(match[3], 16)\r\n\r\n }\r\n\r\n } else if (typeof color === 'object') {\r\n this.r = color.r\r\n this.g = color.g\r\n this.b = color.b\r\n\r\n }\r\n\r\n}\r\n\r\nSVG.extend(SVG.Color, {\r\n // Default to hex conversion\r\n toString: function() {\r\n return this.toHex()\r\n }\r\n // Build hex value\r\n, toHex: function() {\r\n return '#'\r\n + compToHex(this.r)\r\n + compToHex(this.g)\r\n + compToHex(this.b)\r\n }\r\n // Build rgb value\r\n, toRgb: function() {\r\n return 'rgb(' + [this.r, this.g, this.b].join() + ')'\r\n }\r\n // Calculate true brightness\r\n, brightness: function() {\r\n return (this.r / 255 * 0.30)\r\n + (this.g / 255 * 0.59)\r\n + (this.b / 255 * 0.11)\r\n }\r\n // Make color morphable\r\n, morph: function(color) {\r\n this.destination = new SVG.Color(color)\r\n\r\n return this\r\n }\r\n // Get morphed color at given position\r\n, at: function(pos) {\r\n // make sure a destination is defined\r\n if (!this.destination) return this\r\n\r\n // normalise pos\r\n pos = pos < 0 ? 0 : pos > 1 ? 1 : pos\r\n\r\n // generate morphed color\r\n return new SVG.Color({\r\n r: ~~(this.r + (this.destination.r - this.r) * pos)\r\n , g: ~~(this.g + (this.destination.g - this.g) * pos)\r\n , b: ~~(this.b + (this.destination.b - this.b) * pos)\r\n })\r\n }\r\n\r\n})\r\n\r\n// Testers\r\n\r\n// Test if given value is a color string\r\nSVG.Color.test = function(color) {\r\n color += ''\r\n return SVG.regex.isHex.test(color)\r\n || SVG.regex.isRgb.test(color)\r\n}\r\n\r\n// Test if given value is a rgb object\r\nSVG.Color.isRgb = function(color) {\r\n return color && typeof color.r == 'number'\r\n && typeof color.g == 'number'\r\n && typeof color.b == 'number'\r\n}\r\n\r\n// Test if given value is a color\r\nSVG.Color.isColor = function(color) {\r\n return SVG.Color.isRgb(color) || SVG.Color.test(color)\r\n}\n// Module for array conversion\r\nSVG.Array = function(array, fallback) {\r\n array = (array || []).valueOf()\r\n\r\n // if array is empty and fallback is provided, use fallback\r\n if (array.length == 0 && fallback)\r\n array = fallback.valueOf()\r\n\r\n // parse array\r\n this.value = this.parse(array)\r\n}\r\n\r\nSVG.extend(SVG.Array, {\r\n // Make array morphable\r\n morph: function(array) {\r\n this.destination = this.parse(array)\r\n\r\n // normalize length of arrays\r\n if (this.value.length != this.destination.length) {\r\n var lastValue = this.value[this.value.length - 1]\r\n , lastDestination = this.destination[this.destination.length - 1]\r\n\r\n while(this.value.length > this.destination.length)\r\n this.destination.push(lastDestination)\r\n while(this.value.length < this.destination.length)\r\n this.value.push(lastValue)\r\n }\r\n\r\n return this\r\n }\r\n // Clean up any duplicate points\r\n, settle: function() {\r\n // find all unique values\r\n for (var i = 0, il = this.value.length, seen = []; i < il; i++)\r\n if (seen.indexOf(this.value[i]) == -1)\r\n seen.push(this.value[i])\r\n\r\n // set new value\r\n return this.value = seen\r\n }\r\n // Get morphed array at given position\r\n, at: function(pos) {\r\n // make sure a destination is defined\r\n if (!this.destination) return this\r\n\r\n // generate morphed array\r\n for (var i = 0, il = this.value.length, array = []; i < il; i++)\r\n array.push(this.value[i] + (this.destination[i] - this.value[i]) * pos)\r\n\r\n return new SVG.Array(array)\r\n }\r\n // Convert array to string\r\n, toString: function() {\r\n return this.value.join(' ')\r\n }\r\n // Real value\r\n, valueOf: function() {\r\n return this.value\r\n }\r\n // Parse whitespace separated string\r\n, parse: function(array) {\r\n array = array.valueOf()\r\n\r\n // if already is an array, no need to parse it\r\n if (Array.isArray(array)) return array\r\n\r\n return this.split(array)\r\n }\r\n // Strip unnecessary whitespace\r\n, split: function(string) {\r\n return string.trim().split(SVG.regex.delimiter).map(parseFloat)\r\n }\r\n // Reverse array\r\n, reverse: function() {\r\n this.value.reverse()\r\n\r\n return this\r\n }\r\n, clone: function() {\r\n var clone = new this.constructor()\r\n clone.value = array_clone(this.value)\r\n return clone\r\n }\r\n})\n// Poly points array\r\nSVG.PointArray = function(array, fallback) {\r\n SVG.Array.call(this, array, fallback || [[0,0]])\r\n}\r\n\r\n// Inherit from SVG.Array\r\nSVG.PointArray.prototype = new SVG.Array\r\nSVG.PointArray.prototype.constructor = SVG.PointArray\r\n\r\nSVG.extend(SVG.PointArray, {\r\n // Convert array to string\r\n toString: function() {\r\n // convert to a poly point string\r\n for (var i = 0, il = this.value.length, array = []; i < il; i++)\r\n array.push(this.value[i].join(','))\r\n\r\n return array.join(' ')\r\n }\r\n // Convert array to line object\r\n, toLine: function() {\r\n return {\r\n x1: this.value[0][0]\r\n , y1: this.value[0][1]\r\n , x2: this.value[1][0]\r\n , y2: this.value[1][1]\r\n }\r\n }\r\n // Get morphed array at given position\r\n, at: function(pos) {\r\n // make sure a destination is defined\r\n if (!this.destination) return this\r\n\r\n // generate morphed point string\r\n for (var i = 0, il = this.value.length, array = []; i < il; i++)\r\n array.push([\r\n this.value[i][0] + (this.destination[i][0] - this.value[i][0]) * pos\r\n , this.value[i][1] + (this.destination[i][1] - this.value[i][1]) * pos\r\n ])\r\n\r\n return new SVG.PointArray(array)\r\n }\r\n // Parse point string and flat array\r\n, parse: function(array) {\r\n var points = []\r\n\r\n array = array.valueOf()\r\n\r\n // if it is an array\r\n if (Array.isArray(array)) {\r\n // and it is not flat, there is no need to parse it\r\n if(Array.isArray(array[0])) {\r\n // make sure to use a clone\r\n return array.map(function (el) { return el.slice() })\r\n } else if (array[0].x != null){\r\n // allow point objects to be passed\r\n return array.map(function (el) { return [el.x, el.y] })\r\n }\r\n } else { // Else, it is considered as a string\r\n // parse points\r\n array = array.trim().split(SVG.regex.delimiter).map(parseFloat)\r\n }\r\n\r\n // validate points - https://svgwg.org/svg2-draft/shapes.html#DataTypePoints\r\n // Odd number of coordinates is an error. In such cases, drop the last odd coordinate.\r\n if (array.length % 2 !== 0) array.pop()\r\n\r\n // wrap points in two-tuples and parse points as floats\r\n for(var i = 0, len = array.length; i < len; i = i + 2)\r\n points.push([ array[i], array[i+1] ])\r\n\r\n return points\r\n }\r\n // Move point string\r\n, move: function(x, y) {\r\n var box = this.bbox()\r\n\r\n // get relative offset\r\n x -= box.x\r\n y -= box.y\r\n\r\n // move every point\r\n if (!isNaN(x) && !isNaN(y))\r\n for (var i = this.value.length - 1; i >= 0; i--)\r\n this.value[i] = [this.value[i][0] + x, this.value[i][1] + y]\r\n\r\n return this\r\n }\r\n // Resize poly string\r\n, size: function(width, height) {\r\n var i, box = this.bbox()\r\n\r\n // recalculate position of all points according to new size\r\n for (i = this.value.length - 1; i >= 0; i--) {\r\n if(box.width) this.value[i][0] = ((this.value[i][0] - box.x) * width) / box.width + box.x\r\n if(box.height) this.value[i][1] = ((this.value[i][1] - box.y) * height) / box.height + box.y\r\n }\r\n\r\n return this\r\n }\r\n // Get bounding box of points\r\n, bbox: function() {\r\n SVG.parser.poly.setAttribute('points', this.toString())\r\n\r\n return SVG.parser.poly.getBBox()\r\n }\r\n})\r\n\nvar pathHandlers = {\r\n M: function(c, p, p0) {\r\n p.x = p0.x = c[0]\r\n p.y = p0.y = c[1]\r\n\r\n return ['M', p.x, p.y]\r\n },\r\n L: function(c, p) {\r\n p.x = c[0]\r\n p.y = c[1]\r\n return ['L', c[0], c[1]]\r\n },\r\n H: function(c, p) {\r\n p.x = c[0]\r\n return ['H', c[0]]\r\n },\r\n V: function(c, p) {\r\n p.y = c[0]\r\n return ['V', c[0]]\r\n },\r\n C: function(c, p) {\r\n p.x = c[4]\r\n p.y = c[5]\r\n return ['C', c[0], c[1], c[2], c[3], c[4], c[5]]\r\n },\r\n S: function(c, p) {\r\n p.x = c[2]\r\n p.y = c[3]\r\n return ['S', c[0], c[1], c[2], c[3]]\r\n },\r\n Q: function(c, p) {\r\n p.x = c[2]\r\n p.y = c[3]\r\n return ['Q', c[0], c[1], c[2], c[3]]\r\n },\r\n T: function(c, p) {\r\n p.x = c[0]\r\n p.y = c[1]\r\n return ['T', c[0], c[1]]\r\n },\r\n Z: function(c, p, p0) {\r\n p.x = p0.x\r\n p.y = p0.y\r\n return ['Z']\r\n },\r\n A: function(c, p) {\r\n p.x = c[5]\r\n p.y = c[6]\r\n return ['A', c[0], c[1], c[2], c[3], c[4], c[5], c[6]]\r\n }\r\n}\r\n\r\nvar mlhvqtcsa = 'mlhvqtcsaz'.split('')\r\n\r\nfor(var i = 0, il = mlhvqtcsa.length; i < il; ++i){\r\n pathHandlers[mlhvqtcsa[i]] = (function(i){\r\n return function(c, p, p0) {\r\n if(i == 'H') c[0] = c[0] + p.x\r\n else if(i == 'V') c[0] = c[0] + p.y\r\n else if(i == 'A'){\r\n c[5] = c[5] + p.x,\r\n c[6] = c[6] + p.y\r\n }\r\n else\r\n for(var j = 0, jl = c.length; j < jl; ++j) {\r\n c[j] = c[j] + (j%2 ? p.y : p.x)\r\n }\r\n\r\n return pathHandlers[i](c, p, p0)\r\n }\r\n })(mlhvqtcsa[i].toUpperCase())\r\n}\r\n\r\n// Path points array\r\nSVG.PathArray = function(array, fallback) {\r\n SVG.Array.call(this, array, fallback || [['M', 0, 0]])\r\n}\r\n\r\n// Inherit from SVG.Array\r\nSVG.PathArray.prototype = new SVG.Array\r\nSVG.PathArray.prototype.constructor = SVG.PathArray\r\n\r\nSVG.extend(SVG.PathArray, {\r\n // Convert array to string\r\n toString: function() {\r\n return arrayToString(this.value)\r\n }\r\n // Move path string\r\n, move: function(x, y) {\r\n // get bounding box of current situation\r\n var box = this.bbox()\r\n\r\n // get relative offset\r\n x -= box.x\r\n y -= box.y\r\n\r\n if (!isNaN(x) && !isNaN(y)) {\r\n // move every point\r\n for (var l, i = this.value.length - 1; i >= 0; i--) {\r\n l = this.value[i][0]\r\n\r\n if (l == 'M' || l == 'L' || l == 'T') {\r\n this.value[i][1] += x\r\n this.value[i][2] += y\r\n\r\n } else if (l == 'H') {\r\n this.value[i][1] += x\r\n\r\n } else if (l == 'V') {\r\n this.value[i][1] += y\r\n\r\n } else if (l == 'C' || l == 'S' || l == 'Q') {\r\n this.value[i][1] += x\r\n this.value[i][2] += y\r\n this.value[i][3] += x\r\n this.value[i][4] += y\r\n\r\n if (l == 'C') {\r\n this.value[i][5] += x\r\n this.value[i][6] += y\r\n }\r\n\r\n } else if (l == 'A') {\r\n this.value[i][6] += x\r\n this.value[i][7] += y\r\n }\r\n\r\n }\r\n }\r\n\r\n return this\r\n }\r\n // Resize path string\r\n, size: function(width, height) {\r\n // get bounding box of current situation\r\n var i, l, box = this.bbox()\r\n\r\n // recalculate position of all points according to new size\r\n for (i = this.value.length - 1; i >= 0; i--) {\r\n l = this.value[i][0]\r\n\r\n if (l == 'M' || l == 'L' || l == 'T') {\r\n this.value[i][1] = ((this.value[i][1] - box.x) * width) / box.width + box.x\r\n this.value[i][2] = ((this.value[i][2] - box.y) * height) / box.height + box.y\r\n\r\n } else if (l == 'H') {\r\n this.value[i][1] = ((this.value[i][1] - box.x) * width) / box.width + box.x\r\n\r\n } else if (l == 'V') {\r\n this.value[i][1] = ((this.value[i][1] - box.y) * height) / box.height + box.y\r\n\r\n } else if (l == 'C' || l == 'S' || l == 'Q') {\r\n this.value[i][1] = ((this.value[i][1] - box.x) * width) / box.width + box.x\r\n this.value[i][2] = ((this.value[i][2] - box.y) * height) / box.height + box.y\r\n this.value[i][3] = ((this.value[i][3] - box.x) * width) / box.width + box.x\r\n this.value[i][4] = ((this.value[i][4] - box.y) * height) / box.height + box.y\r\n\r\n if (l == 'C') {\r\n this.value[i][5] = ((this.value[i][5] - box.x) * width) / box.width + box.x\r\n this.value[i][6] = ((this.value[i][6] - box.y) * height) / box.height + box.y\r\n }\r\n\r\n } else if (l == 'A') {\r\n // resize radii\r\n this.value[i][1] = (this.value[i][1] * width) / box.width\r\n this.value[i][2] = (this.value[i][2] * height) / box.height\r\n\r\n // move position values\r\n this.value[i][6] = ((this.value[i][6] - box.x) * width) / box.width + box.x\r\n this.value[i][7] = ((this.value[i][7] - box.y) * height) / box.height + box.y\r\n }\r\n\r\n }\r\n\r\n return this\r\n }\r\n // Test if the passed path array use the same path data commands as this path array\r\n, equalCommands: function(pathArray) {\r\n var i, il, equalCommands\r\n\r\n pathArray = new SVG.PathArray(pathArray)\r\n\r\n equalCommands = this.value.length === pathArray.value.length\r\n for(i = 0, il = this.value.length; equalCommands && i < il; i++) {\r\n equalCommands = this.value[i][0] === pathArray.value[i][0]\r\n }\r\n\r\n return equalCommands\r\n }\r\n // Make path array morphable\r\n, morph: function(pathArray) {\r\n pathArray = new SVG.PathArray(pathArray)\r\n\r\n if(this.equalCommands(pathArray)) {\r\n this.destination = pathArray\r\n } else {\r\n this.destination = null\r\n }\r\n\r\n return this\r\n }\r\n // Get morphed path array at given position\r\n, at: function(pos) {\r\n // make sure a destination is defined\r\n if (!this.destination) return this\r\n\r\n var sourceArray = this.value\r\n , destinationArray = this.destination.value\r\n , array = [], pathArray = new SVG.PathArray()\r\n , i, il, j, jl\r\n\r\n // Animate has specified in the SVG spec\r\n // See: https://www.w3.org/TR/SVG11/paths.html#PathElement\r\n for (i = 0, il = sourceArray.length; i < il; i++) {\r\n array[i] = [sourceArray[i][0]]\r\n for(j = 1, jl = sourceArray[i].length; j < jl; j++) {\r\n array[i][j] = sourceArray[i][j] + (destinationArray[i][j] - sourceArray[i][j]) * pos\r\n }\r\n // For the two flags of the elliptical arc command, the SVG spec say:\r\n // Flags and booleans are interpolated as fractions between zero and one, with any non-zero value considered to be a value of one/true\r\n // Elliptical arc command as an array followed by corresponding indexes:\r\n // ['A', rx, ry, x-axis-rotation, large-arc-flag, sweep-flag, x, y]\r\n // 0 1 2 3 4 5 6 7\r\n if(array[i][0] === 'A') {\r\n array[i][4] = +(array[i][4] != 0)\r\n array[i][5] = +(array[i][5] != 0)\r\n }\r\n }\r\n\r\n // Directly modify the value of a path array, this is done this way for performance\r\n pathArray.value = array\r\n return pathArray\r\n }\r\n // Absolutize and parse path to array\r\n, parse: function(array) {\r\n // if it's already a patharray, no need to parse it\r\n if (array instanceof SVG.PathArray) return array.valueOf()\r\n\r\n // prepare for parsing\r\n var i, x0, y0, s, seg, arr\r\n , x = 0\r\n , y = 0\r\n , paramCnt = { 'M':2, 'L':2, 'H':1, 'V':1, 'C':6, 'S':4, 'Q':4, 'T':2, 'A':7, 'Z':0 }\r\n\r\n if(typeof array == 'string'){\r\n\r\n array = array\r\n .replace(SVG.regex.numbersWithDots, pathRegReplace) // convert 45.123.123 to 45.123 .123\r\n .replace(SVG.regex.pathLetters, ' $& ') // put some room between letters and numbers\r\n .replace(SVG.regex.hyphen, '$1 -') // add space before hyphen\r\n .trim() // trim\r\n .split(SVG.regex.delimiter) // split into array\r\n\r\n }else{\r\n array = array.reduce(function(prev, curr){\r\n return [].concat.call(prev, curr)\r\n }, [])\r\n }\r\n\r\n // array now is an array containing all parts of a path e.g. ['M', '0', '0', 'L', '30', '30' ...]\r\n var arr = []\r\n , p = new SVG.Point()\r\n , p0 = new SVG.Point()\r\n , index = 0\r\n , len = array.length\r\n\r\n do{\r\n // Test if we have a path letter\r\n if(SVG.regex.isPathLetter.test(array[index])){\r\n s = array[index]\r\n ++index\r\n // If last letter was a move command and we got no new, it defaults to [L]ine\r\n }else if(s == 'M'){\r\n s = 'L'\r\n }else if(s == 'm'){\r\n s = 'l'\r\n }\r\n\r\n arr.push(pathHandlers[s].call(null,\r\n array.slice(index, (index = index + paramCnt[s.toUpperCase()])).map(parseFloat),\r\n p, p0\r\n )\r\n )\r\n\r\n }while(len > index)\r\n\r\n return arr\r\n\r\n }\r\n // Get bounding box of path\r\n, bbox: function() {\r\n SVG.parser.path.setAttribute('d', this.toString())\r\n\r\n return SVG.parser.path.getBBox()\r\n }\r\n\r\n})\r\n\n// Module for unit convertions\r\nSVG.Number = SVG.invent({\r\n // Initialize\r\n create: function(value, unit) {\r\n // initialize defaults\r\n this.value = 0\r\n this.unit = unit || ''\r\n\r\n // parse value\r\n if (typeof value === 'number') {\r\n // ensure a valid numeric value\r\n this.value = isNaN(value) ? 0 : !isFinite(value) ? (value < 0 ? -3.4e+38 : +3.4e+38) : value\r\n\r\n } else if (typeof value === 'string') {\r\n unit = value.match(SVG.regex.numberAndUnit)\r\n\r\n if (unit) {\r\n // make value numeric\r\n this.value = parseFloat(unit[1])\r\n\r\n // normalize\r\n if (unit[5] == '%')\r\n this.value /= 100\r\n else if (unit[5] == 's')\r\n this.value *= 1000\r\n\r\n // store unit\r\n this.unit = unit[5]\r\n }\r\n\r\n } else {\r\n if (value instanceof SVG.Number) {\r\n this.value = value.valueOf()\r\n this.unit = value.unit\r\n }\r\n }\r\n\r\n }\r\n // Add methods\r\n, extend: {\r\n // Stringalize\r\n toString: function() {\r\n return (\r\n this.unit == '%' ?\r\n ~~(this.value * 1e8) / 1e6:\r\n this.unit == 's' ?\r\n this.value / 1e3 :\r\n this.value\r\n ) + this.unit\r\n }\r\n , toJSON: function() {\r\n return this.toString()\r\n }\r\n , // Convert to primitive\r\n valueOf: function() {\r\n return this.value\r\n }\r\n // Add number\r\n , plus: function(number) {\r\n number = new SVG.Number(number)\r\n return new SVG.Number(this + number, this.unit || number.unit)\r\n }\r\n // Subtract number\r\n , minus: function(number) {\r\n number = new SVG.Number(number)\r\n return new SVG.Number(this - number, this.unit || number.unit)\r\n }\r\n // Multiply number\r\n , times: function(number) {\r\n number = new SVG.Number(number)\r\n return new SVG.Number(this * number, this.unit || number.unit)\r\n }\r\n // Divide number\r\n , divide: function(number) {\r\n number = new SVG.Number(number)\r\n return new SVG.Number(this / number, this.unit || number.unit)\r\n }\r\n // Convert to different unit\r\n , to: function(unit) {\r\n var number = new SVG.Number(this)\r\n\r\n if (typeof unit === 'string')\r\n number.unit = unit\r\n\r\n return number\r\n }\r\n // Make number morphable\r\n , morph: function(number) {\r\n this.destination = new SVG.Number(number)\r\n\r\n if(number.relative) {\r\n this.destination.value += this.value\r\n }\r\n\r\n return this\r\n }\r\n // Get morphed number at given position\r\n , at: function(pos) {\r\n // Make sure a destination is defined\r\n if (!this.destination) return this\r\n\r\n // Generate new morphed number\r\n return new SVG.Number(this.destination)\r\n .minus(this)\r\n .times(pos)\r\n .plus(this)\r\n }\r\n\r\n }\r\n})\r\n\n\r\nSVG.Element = SVG.invent({\r\n // Initialize node\r\n create: function(node) {\r\n // make stroke value accessible dynamically\r\n this._stroke = SVG.defaults.attrs.stroke\r\n this._event = null\r\n this._events = {}\r\n\r\n // initialize data object\r\n this.dom = {}\r\n\r\n // create circular reference\r\n if (this.node = node) {\r\n this.type = node.nodeName\r\n this.node.instance = this\r\n this._events = node._events || {}\r\n\r\n // store current attribute value\r\n this._stroke = node.getAttribute('stroke') || this._stroke\r\n }\r\n }\r\n\r\n // Add class methods\r\n, extend: {\r\n // Move over x-axis\r\n x: function(x) {\r\n return this.attr('x', x)\r\n }\r\n // Move over y-axis\r\n , y: function(y) {\r\n return this.attr('y', y)\r\n }\r\n // Move by center over x-axis\r\n , cx: function(x) {\r\n return x == null ? this.x() + this.width() / 2 : this.x(x - this.width() / 2)\r\n }\r\n // Move by center over y-axis\r\n , cy: function(y) {\r\n return y == null ? this.y() + this.height() / 2 : this.y(y - this.height() / 2)\r\n }\r\n // Move element to given x and y values\r\n , move: function(x, y) {\r\n return this.x(x).y(y)\r\n }\r\n // Move element by its center\r\n , center: function(x, y) {\r\n return this.cx(x).cy(y)\r\n }\r\n // Set width of element\r\n , width: function(width) {\r\n return this.attr('width', width)\r\n }\r\n // Set height of element\r\n , height: function(height) {\r\n return this.attr('height', height)\r\n }\r\n // Set element size to given width and height\r\n , size: function(width, height) {\r\n var p = proportionalSize(this, width, height)\r\n\r\n return this\r\n .width(new SVG.Number(p.width))\r\n .height(new SVG.Number(p.height))\r\n }\r\n // Clone element\r\n , clone: function(parent) {\r\n // write dom data to the dom so the clone can pickup the data\r\n this.writeDataToDom()\r\n\r\n // clone element and assign new id\r\n var clone = assignNewId(this.node.cloneNode(true))\r\n\r\n // insert the clone in the given parent or after myself\r\n if(parent) parent.add(clone)\r\n else this.after(clone)\r\n\r\n return clone\r\n }\r\n // Remove element\r\n , remove: function() {\r\n if (this.parent())\r\n this.parent().removeElement(this)\r\n\r\n return this\r\n }\r\n // Replace element\r\n , replace: function(element) {\r\n this.after(element).remove()\r\n\r\n return element\r\n }\r\n // Add element to given container and return self\r\n , addTo: function(parent) {\r\n return parent.put(this)\r\n }\r\n // Add element to given container and return container\r\n , putIn: function(parent) {\r\n return parent.add(this)\r\n }\r\n // Get / set id\r\n , id: function(id) {\r\n return this.attr('id', id)\r\n }\r\n // Checks whether the given point inside the bounding box of the element\r\n , inside: function(x, y) {\r\n var box = this.bbox()\r\n\r\n return x > box.x\r\n && y > box.y\r\n && x < box.x + box.width\r\n && y < box.y + box.height\r\n }\r\n // Show element\r\n , show: function() {\r\n return this.style('display', '')\r\n }\r\n // Hide element\r\n , hide: function() {\r\n return this.style('display', 'none')\r\n }\r\n // Is element visible?\r\n , visible: function() {\r\n return this.style('display') != 'none'\r\n }\r\n // Return id on string conversion\r\n , toString: function() {\r\n return this.attr('id')\r\n }\r\n // Return array of classes on the node\r\n , classes: function() {\r\n var attr = this.attr('class')\r\n\r\n return attr == null ? [] : attr.trim().split(SVG.regex.delimiter)\r\n }\r\n // Return true if class exists on the node, false otherwise\r\n , hasClass: function(name) {\r\n return this.classes().indexOf(name) != -1\r\n }\r\n // Add class to the node\r\n , addClass: function(name) {\r\n if (!this.hasClass(name)) {\r\n var array = this.classes()\r\n array.push(name)\r\n this.attr('class', array.join(' '))\r\n }\r\n\r\n return this\r\n }\r\n // Remove class from the node\r\n , removeClass: function(name) {\r\n if (this.hasClass(name)) {\r\n this.attr('class', this.classes().filter(function(c) {\r\n return c != name\r\n }).join(' '))\r\n }\r\n\r\n return this\r\n }\r\n // Toggle the presence of a class on the node\r\n , toggleClass: function(name) {\r\n return this.hasClass(name) ? this.removeClass(name) : this.addClass(name)\r\n }\r\n // Get referenced element form attribute value\r\n , reference: function(attr) {\r\n return SVG.get(this.attr(attr))\r\n }\r\n // Returns the parent element instance\r\n , parent: function(type) {\r\n var parent = this\r\n\r\n // check for parent\r\n if(!parent.node.parentNode) return null\r\n\r\n // get parent element\r\n parent = SVG.adopt(parent.node.parentNode)\r\n\r\n if(!type) return parent\r\n\r\n // loop trough ancestors if type is given\r\n while(parent && parent.node instanceof window.SVGElement){\r\n if(typeof type === 'string' ? parent.matches(type) : parent instanceof type) return parent\r\n if(!parent.node.parentNode || parent.node.parentNode.nodeName == '#document' || parent.node.parentNode.nodeName == '#document-fragment') return null // #759, #720\r\n parent = SVG.adopt(parent.node.parentNode)\r\n }\r\n }\r\n // Get parent document\r\n , doc: function() {\r\n return this instanceof SVG.Doc ? this : this.parent(SVG.Doc)\r\n }\r\n // return array of all ancestors of given type up to the root svg\r\n , parents: function(type) {\r\n var parents = [], parent = this\r\n\r\n do{\r\n parent = parent.parent(type)\r\n if(!parent || !parent.node) break\r\n\r\n parents.push(parent)\r\n } while(parent.parent)\r\n\r\n return parents\r\n }\r\n // matches the element vs a css selector\r\n , matches: function(selector){\r\n return matches(this.node, selector)\r\n }\r\n // Returns the svg node to call native svg methods on it\r\n , native: function() {\r\n return this.node\r\n }\r\n // Import raw svg\r\n , svg: function(svg) {\r\n // create temporary holder\r\n var well = document.createElement('svg')\r\n\r\n // act as a setter if svg is given\r\n if (svg && this instanceof SVG.Parent) {\r\n // dump raw svg\r\n well.innerHTML = '' + svg.replace(/\\n/, '').replace(/<([\\w:-]+)([^<]+?)\\/>/g, '<$1$2>') + ''\r\n\r\n // transplant nodes\r\n for (var i = 0, il = well.firstChild.childNodes.length; i < il; i++)\r\n this.node.appendChild(well.firstChild.firstChild)\r\n\r\n // otherwise act as a getter\r\n } else {\r\n // create a wrapping svg element in case of partial content\r\n well.appendChild(svg = document.createElement('svg'))\r\n\r\n // write svgjs data to the dom\r\n this.writeDataToDom()\r\n\r\n // insert a copy of this node\r\n svg.appendChild(this.node.cloneNode(true))\r\n\r\n // return target element\r\n return well.innerHTML.replace(/^/, '').replace(/<\\/svg>$/, '')\r\n }\r\n\r\n return this\r\n }\r\n // write svgjs data to the dom\r\n , writeDataToDom: function() {\r\n\r\n // dump variables recursively\r\n if(this.each || this.lines){\r\n var fn = this.each ? this : this.lines();\r\n fn.each(function(){\r\n this.writeDataToDom()\r\n })\r\n }\r\n\r\n // remove previously set data\r\n this.node.removeAttribute('svgjs:data')\r\n\r\n if(Object.keys(this.dom).length)\r\n this.node.setAttribute('svgjs:data', JSON.stringify(this.dom)) // see #428\r\n\r\n return this\r\n }\r\n // set given data to the elements data property\r\n , setData: function(o){\r\n this.dom = o\r\n return this\r\n }\r\n , is: function(obj){\r\n return is(this, obj)\r\n }\r\n }\r\n})\r\n\nSVG.easing = {\r\n '-': function(pos){return pos}\r\n, '<>':function(pos){return -Math.cos(pos * Math.PI) / 2 + 0.5}\r\n, '>': function(pos){return Math.sin(pos * Math.PI / 2)}\r\n, '<': function(pos){return -Math.cos(pos * Math.PI / 2) + 1}\r\n}\r\n\r\nSVG.morph = function(pos){\r\n return function(from, to) {\r\n return new SVG.MorphObj(from, to).at(pos)\r\n }\r\n}\r\n\r\nSVG.Situation = SVG.invent({\r\n\r\n create: function(o){\r\n this.init = false\r\n this.reversed = false\r\n this.reversing = false\r\n\r\n this.duration = new SVG.Number(o.duration).valueOf()\r\n this.delay = new SVG.Number(o.delay).valueOf()\r\n\r\n this.start = +new Date() + this.delay\r\n this.finish = this.start + this.duration\r\n this.ease = o.ease\r\n\r\n // this.loop is incremented from 0 to this.loops\r\n // it is also incremented when in an infinite loop (when this.loops is true)\r\n this.loop = 0\r\n this.loops = false\r\n\r\n this.animations = {\r\n // functionToCall: [list of morphable objects]\r\n // e.g. move: [SVG.Number, SVG.Number]\r\n }\r\n\r\n this.attrs = {\r\n // holds all attributes which are not represented from a function svg.js provides\r\n // e.g. someAttr: SVG.Number\r\n }\r\n\r\n this.styles = {\r\n // holds all styles which should be animated\r\n // e.g. fill-color: SVG.Color\r\n }\r\n\r\n this.transforms = [\r\n // holds all transformations as transformation objects\r\n // e.g. [SVG.Rotate, SVG.Translate, SVG.Matrix]\r\n ]\r\n\r\n this.once = {\r\n // functions to fire at a specific position\r\n // e.g. \"0.5\": function foo(){}\r\n }\r\n\r\n }\r\n\r\n})\r\n\r\n\r\nSVG.FX = SVG.invent({\r\n\r\n create: function(element) {\r\n this._target = element\r\n this.situations = []\r\n this.active = false\r\n this.situation = null\r\n this.paused = false\r\n this.lastPos = 0\r\n this.pos = 0\r\n // The absolute position of an animation is its position in the context of its complete duration (including delay and loops)\r\n // When performing a delay, absPos is below 0 and when performing a loop, its value is above 1\r\n this.absPos = 0\r\n this._speed = 1\r\n }\r\n\r\n, extend: {\r\n\r\n /**\r\n * sets or returns the target of this animation\r\n * @param o object || number In case of Object it holds all parameters. In case of number its the duration of the animation\r\n * @param ease function || string Function which should be used for easing or easing keyword\r\n * @param delay Number indicating the delay before the animation starts\r\n * @return target || this\r\n */\r\n animate: function(o, ease, delay){\r\n\r\n if(typeof o == 'object'){\r\n ease = o.ease\r\n delay = o.delay\r\n o = o.duration\r\n }\r\n\r\n var situation = new SVG.Situation({\r\n duration: o || 1000,\r\n delay: delay || 0,\r\n ease: SVG.easing[ease || '-'] || ease\r\n })\r\n\r\n this.queue(situation)\r\n\r\n return this\r\n }\r\n\r\n /**\r\n * sets a delay before the next element of the queue is called\r\n * @param delay Duration of delay in milliseconds\r\n * @return this.target()\r\n */\r\n , delay: function(delay){\r\n // The delay is performed by an empty situation with its duration\r\n // attribute set to the duration of the delay\r\n var situation = new SVG.Situation({\r\n duration: delay,\r\n delay: 0,\r\n ease: SVG.easing['-']\r\n })\r\n\r\n return this.queue(situation)\r\n }\r\n\r\n /**\r\n * sets or returns the target of this animation\r\n * @param null || target SVG.Element which should be set as new target\r\n * @return target || this\r\n */\r\n , target: function(target){\r\n if(target && target instanceof SVG.Element){\r\n this._target = target\r\n return this\r\n }\r\n\r\n return this._target\r\n }\r\n\r\n // returns the absolute position at a given time\r\n , timeToAbsPos: function(timestamp){\r\n return (timestamp - this.situation.start) / (this.situation.duration/this._speed)\r\n }\r\n\r\n // returns the timestamp from a given absolute positon\r\n , absPosToTime: function(absPos){\r\n return this.situation.duration/this._speed * absPos + this.situation.start\r\n }\r\n\r\n // starts the animationloop\r\n , startAnimFrame: function(){\r\n this.stopAnimFrame()\r\n this.animationFrame = window.requestAnimationFrame(function(){ this.step() }.bind(this))\r\n }\r\n\r\n // cancels the animationframe\r\n , stopAnimFrame: function(){\r\n window.cancelAnimationFrame(this.animationFrame)\r\n }\r\n\r\n // kicks off the animation - only does something when the queue is currently not active and at least one situation is set\r\n , start: function(){\r\n // dont start if already started\r\n if(!this.active && this.situation){\r\n this.active = true\r\n this.startCurrent()\r\n }\r\n\r\n return this\r\n }\r\n\r\n // start the current situation\r\n , startCurrent: function(){\r\n this.situation.start = +new Date + this.situation.delay/this._speed\r\n this.situation.finish = this.situation.start + this.situation.duration/this._speed\r\n return this.initAnimations().step()\r\n }\r\n\r\n /**\r\n * adds a function / Situation to the animation queue\r\n * @param fn function / situation to add\r\n * @return this\r\n */\r\n , queue: function(fn){\r\n if(typeof fn == 'function' || fn instanceof SVG.Situation)\r\n this.situations.push(fn)\r\n\r\n if(!this.situation) this.situation = this.situations.shift()\r\n\r\n return this\r\n }\r\n\r\n /**\r\n * pulls next element from the queue and execute it\r\n * @return this\r\n */\r\n , dequeue: function(){\r\n // stop current animation\r\n this.stop()\r\n\r\n // get next animation from queue\r\n this.situation = this.situations.shift()\r\n\r\n if(this.situation){\r\n if(this.situation instanceof SVG.Situation) {\r\n this.start()\r\n } else {\r\n // If it is not a SVG.Situation, then it is a function, we execute it\r\n this.situation.call(this)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n // updates all animations to the current state of the element\r\n // this is important when one property could be changed from another property\r\n , initAnimations: function() {\r\n var i, j, source\r\n var s = this.situation\r\n\r\n if(s.init) return this\r\n\r\n for(i in s.animations){\r\n source = this.target()[i]()\r\n\r\n if(!Array.isArray(source)) {\r\n source = [source]\r\n }\r\n\r\n if(!Array.isArray(s.animations[i])) {\r\n s.animations[i] = [s.animations[i]]\r\n }\r\n\r\n //if(s.animations[i].length > source.length) {\r\n // source.concat = source.concat(s.animations[i].slice(source.length, s.animations[i].length))\r\n //}\r\n\r\n for(j = source.length; j--;) {\r\n // The condition is because some methods return a normal number instead\r\n // of a SVG.Number\r\n if(s.animations[i][j] instanceof SVG.Number)\r\n source[j] = new SVG.Number(source[j])\r\n\r\n s.animations[i][j] = source[j].morph(s.animations[i][j])\r\n }\r\n }\r\n\r\n for(i in s.attrs){\r\n s.attrs[i] = new SVG.MorphObj(this.target().attr(i), s.attrs[i])\r\n }\r\n\r\n for(i in s.styles){\r\n s.styles[i] = new SVG.MorphObj(this.target().style(i), s.styles[i])\r\n }\r\n\r\n s.initialTransformation = this.target().matrixify()\r\n\r\n s.init = true\r\n return this\r\n }\r\n , clearQueue: function(){\r\n this.situations = []\r\n return this\r\n }\r\n , clearCurrent: function(){\r\n this.situation = null\r\n return this\r\n }\r\n /** stops the animation immediately\r\n * @param jumpToEnd A Boolean indicating whether to complete the current animation immediately.\r\n * @param clearQueue A Boolean indicating whether to remove queued animation as well.\r\n * @return this\r\n */\r\n , stop: function(jumpToEnd, clearQueue){\r\n var active = this.active\r\n this.active = false\r\n\r\n if(clearQueue){\r\n this.clearQueue()\r\n }\r\n\r\n if(jumpToEnd && this.situation){\r\n // initialize the situation if it was not\r\n !active && this.startCurrent()\r\n this.atEnd()\r\n }\r\n\r\n this.stopAnimFrame()\r\n\r\n return this.clearCurrent()\r\n }\r\n\r\n /** resets the element to the state where the current element has started\r\n * @return this\r\n */\r\n , reset: function(){\r\n if(this.situation){\r\n var temp = this.situation\r\n this.stop()\r\n this.situation = temp\r\n this.atStart()\r\n }\r\n return this\r\n }\r\n\r\n // Stop the currently-running animation, remove all queued animations, and complete all animations for the element.\r\n , finish: function(){\r\n\r\n this.stop(true, false)\r\n\r\n while(this.dequeue().situation && this.stop(true, false));\r\n\r\n this.clearQueue().clearCurrent()\r\n\r\n return this\r\n }\r\n\r\n // set the internal animation pointer at the start position, before any loops, and updates the visualisation\r\n , atStart: function() {\r\n return this.at(0, true)\r\n }\r\n\r\n // set the internal animation pointer at the end position, after all the loops, and updates the visualisation\r\n , atEnd: function() {\r\n if (this.situation.loops === true) {\r\n // If in a infinite loop, we end the current iteration\r\n this.situation.loops = this.situation.loop + 1\r\n }\r\n\r\n if(typeof this.situation.loops == 'number') {\r\n // If performing a finite number of loops, we go after all the loops\r\n return this.at(this.situation.loops, true)\r\n } else {\r\n // If no loops, we just go at the end\r\n return this.at(1, true)\r\n }\r\n }\r\n\r\n // set the internal animation pointer to the specified position and updates the visualisation\r\n // if isAbsPos is true, pos is treated as an absolute position\r\n , at: function(pos, isAbsPos){\r\n var durDivSpd = this.situation.duration/this._speed\r\n\r\n this.absPos = pos\r\n // If pos is not an absolute position, we convert it into one\r\n if (!isAbsPos) {\r\n if (this.situation.reversed) this.absPos = 1 - this.absPos\r\n this.absPos += this.situation.loop\r\n }\r\n\r\n this.situation.start = +new Date - this.absPos * durDivSpd\r\n this.situation.finish = this.situation.start + durDivSpd\r\n\r\n return this.step(true)\r\n }\r\n\r\n /**\r\n * sets or returns the speed of the animations\r\n * @param speed null || Number The new speed of the animations\r\n * @return Number || this\r\n */\r\n , speed: function(speed){\r\n if (speed === 0) return this.pause()\r\n\r\n if (speed) {\r\n this._speed = speed\r\n // We use an absolute position here so that speed can affect the delay before the animation\r\n return this.at(this.absPos, true)\r\n } else return this._speed\r\n }\r\n\r\n // Make loopable\r\n , loop: function(times, reverse) {\r\n var c = this.last()\r\n\r\n // store total loops\r\n c.loops = (times != null) ? times : true\r\n c.loop = 0\r\n\r\n if(reverse) c.reversing = true\r\n return this\r\n }\r\n\r\n // pauses the animation\r\n , pause: function(){\r\n this.paused = true\r\n this.stopAnimFrame()\r\n\r\n return this\r\n }\r\n\r\n // unpause the animation\r\n , play: function(){\r\n if(!this.paused) return this\r\n this.paused = false\r\n // We use an absolute position here so that the delay before the animation can be paused\r\n return this.at(this.absPos, true)\r\n }\r\n\r\n /**\r\n * toggle or set the direction of the animation\r\n * true sets direction to backwards while false sets it to forwards\r\n * @param reversed Boolean indicating whether to reverse the animation or not (default: toggle the reverse status)\r\n * @return this\r\n */\r\n , reverse: function(reversed){\r\n var c = this.last()\r\n\r\n if(typeof reversed == 'undefined') c.reversed = !c.reversed\r\n else c.reversed = reversed\r\n\r\n return this\r\n }\r\n\r\n\r\n /**\r\n * returns a float from 0-1 indicating the progress of the current animation\r\n * @param eased Boolean indicating whether the returned position should be eased or not\r\n * @return number\r\n */\r\n , progress: function(easeIt){\r\n return easeIt ? this.situation.ease(this.pos) : this.pos\r\n }\r\n\r\n /**\r\n * adds a callback function which is called when the current animation is finished\r\n * @param fn Function which should be executed as callback\r\n * @return number\r\n */\r\n , after: function(fn){\r\n var c = this.last()\r\n , wrapper = function wrapper(e){\r\n if(e.detail.situation == c){\r\n fn.call(this, c)\r\n this.off('finished.fx', wrapper) // prevent memory leak\r\n }\r\n }\r\n\r\n this.target().on('finished.fx', wrapper)\r\n\r\n return this._callStart()\r\n }\r\n\r\n // adds a callback which is called whenever one animation step is performed\r\n , during: function(fn){\r\n var c = this.last()\r\n , wrapper = function(e){\r\n if(e.detail.situation == c){\r\n fn.call(this, e.detail.pos, SVG.morph(e.detail.pos), e.detail.eased, c)\r\n }\r\n }\r\n\r\n // see above\r\n this.target().off('during.fx', wrapper).on('during.fx', wrapper)\r\n\r\n this.after(function(){\r\n this.off('during.fx', wrapper)\r\n })\r\n\r\n return this._callStart()\r\n }\r\n\r\n // calls after ALL animations in the queue are finished\r\n , afterAll: function(fn){\r\n var wrapper = function wrapper(e){\r\n fn.call(this)\r\n this.off('allfinished.fx', wrapper)\r\n }\r\n\r\n // see above\r\n this.target().off('allfinished.fx', wrapper).on('allfinished.fx', wrapper)\r\n\r\n return this._callStart()\r\n }\r\n\r\n // calls on every animation step for all animations\r\n , duringAll: function(fn){\r\n var wrapper = function(e){\r\n fn.call(this, e.detail.pos, SVG.morph(e.detail.pos), e.detail.eased, e.detail.situation)\r\n }\r\n\r\n this.target().off('during.fx', wrapper).on('during.fx', wrapper)\r\n\r\n this.afterAll(function(){\r\n this.off('during.fx', wrapper)\r\n })\r\n\r\n return this._callStart()\r\n }\r\n\r\n , last: function(){\r\n return this.situations.length ? this.situations[this.situations.length-1] : this.situation\r\n }\r\n\r\n // adds one property to the animations\r\n , add: function(method, args, type){\r\n this.last()[type || 'animations'][method] = args\r\n return this._callStart()\r\n }\r\n\r\n /** perform one step of the animation\r\n * @param ignoreTime Boolean indicating whether to ignore time and use position directly or recalculate position based on time\r\n * @return this\r\n */\r\n , step: function(ignoreTime){\r\n\r\n // convert current time to an absolute position\r\n if(!ignoreTime) this.absPos = this.timeToAbsPos(+new Date)\r\n\r\n // This part convert an absolute position to a position\r\n if(this.situation.loops !== false) {\r\n var absPos, absPosInt, lastLoop\r\n\r\n // If the absolute position is below 0, we just treat it as if it was 0\r\n absPos = Math.max(this.absPos, 0)\r\n absPosInt = Math.floor(absPos)\r\n\r\n if(this.situation.loops === true || absPosInt < this.situation.loops) {\r\n this.pos = absPos - absPosInt\r\n lastLoop = this.situation.loop\r\n this.situation.loop = absPosInt\r\n } else {\r\n this.absPos = this.situation.loops\r\n this.pos = 1\r\n // The -1 here is because we don't want to toggle reversed when all the loops have been completed\r\n lastLoop = this.situation.loop - 1\r\n this.situation.loop = this.situation.loops\r\n }\r\n\r\n if(this.situation.reversing) {\r\n // Toggle reversed if an odd number of loops as occured since the last call of step\r\n this.situation.reversed = this.situation.reversed != Boolean((this.situation.loop - lastLoop) % 2)\r\n }\r\n\r\n } else {\r\n // If there are no loop, the absolute position must not be above 1\r\n this.absPos = Math.min(this.absPos, 1)\r\n this.pos = this.absPos\r\n }\r\n\r\n // while the absolute position can be below 0, the position must not be below 0\r\n if(this.pos < 0) this.pos = 0\r\n\r\n if(this.situation.reversed) this.pos = 1 - this.pos\r\n\r\n\r\n // apply easing\r\n var eased = this.situation.ease(this.pos)\r\n\r\n // call once-callbacks\r\n for(var i in this.situation.once){\r\n if(i > this.lastPos && i <= eased){\r\n this.situation.once[i].call(this.target(), this.pos, eased)\r\n delete this.situation.once[i]\r\n }\r\n }\r\n\r\n // fire during callback with position, eased position and current situation as parameter\r\n if(this.active) this.target().fire('during', {pos: this.pos, eased: eased, fx: this, situation: this.situation})\r\n\r\n // the user may call stop or finish in the during callback\r\n // so make sure that we still have a valid situation\r\n if(!this.situation){\r\n return this\r\n }\r\n\r\n // apply the actual animation to every property\r\n this.eachAt()\r\n\r\n // do final code when situation is finished\r\n if((this.pos == 1 && !this.situation.reversed) || (this.situation.reversed && this.pos == 0)){\r\n\r\n // stop animation callback\r\n this.stopAnimFrame()\r\n\r\n // fire finished callback with current situation as parameter\r\n this.target().fire('finished', {fx:this, situation: this.situation})\r\n\r\n if(!this.situations.length){\r\n this.target().fire('allfinished')\r\n\r\n // Recheck the length since the user may call animate in the afterAll callback\r\n if(!this.situations.length){\r\n this.target().off('.fx') // there shouldnt be any binding left, but to make sure...\r\n this.active = false\r\n }\r\n }\r\n\r\n // start next animation\r\n if(this.active) this.dequeue()\r\n else this.clearCurrent()\r\n\r\n }else if(!this.paused && this.active){\r\n // we continue animating when we are not at the end\r\n this.startAnimFrame()\r\n }\r\n\r\n // save last eased position for once callback triggering\r\n this.lastPos = eased\r\n return this\r\n\r\n }\r\n\r\n // calculates the step for every property and calls block with it\r\n , eachAt: function(){\r\n var i, len, at, self = this, target = this.target(), s = this.situation\r\n\r\n // apply animations which can be called trough a method\r\n for(i in s.animations){\r\n\r\n at = [].concat(s.animations[i]).map(function(el){\r\n return typeof el !== 'string' && el.at ? el.at(s.ease(self.pos), self.pos) : el\r\n })\r\n\r\n target[i].apply(target, at)\r\n\r\n }\r\n\r\n // apply animation which has to be applied with attr()\r\n for(i in s.attrs){\r\n\r\n at = [i].concat(s.attrs[i]).map(function(el){\r\n return typeof el !== 'string' && el.at ? el.at(s.ease(self.pos), self.pos) : el\r\n })\r\n\r\n target.attr.apply(target, at)\r\n\r\n }\r\n\r\n // apply animation which has to be applied with style()\r\n for(i in s.styles){\r\n\r\n at = [i].concat(s.styles[i]).map(function(el){\r\n return typeof el !== 'string' && el.at ? el.at(s.ease(self.pos), self.pos) : el\r\n })\r\n\r\n target.style.apply(target, at)\r\n\r\n }\r\n\r\n // animate initialTransformation which has to be chained\r\n if(s.transforms.length){\r\n\r\n // get initial initialTransformation\r\n at = s.initialTransformation\r\n for(i = 0, len = s.transforms.length; i < len; i++){\r\n\r\n // get next transformation in chain\r\n var a = s.transforms[i]\r\n\r\n // multiply matrix directly\r\n if(a instanceof SVG.Matrix){\r\n\r\n if(a.relative){\r\n at = at.multiply(new SVG.Matrix().morph(a).at(s.ease(this.pos)))\r\n }else{\r\n at = at.morph(a).at(s.ease(this.pos))\r\n }\r\n continue\r\n }\r\n\r\n // when transformation is absolute we have to reset the needed transformation first\r\n if(!a.relative)\r\n a.undo(at.extract())\r\n\r\n // and reapply it after\r\n at = at.multiply(a.at(s.ease(this.pos)))\r\n\r\n }\r\n\r\n // set new matrix on element\r\n target.matrix(at)\r\n }\r\n\r\n return this\r\n\r\n }\r\n\r\n\r\n // adds an once-callback which is called at a specific position and never again\r\n , once: function(pos, fn, isEased){\r\n var c = this.last()\r\n if(!isEased) pos = c.ease(pos)\r\n\r\n c.once[pos] = fn\r\n\r\n return this\r\n }\r\n\r\n , _callStart: function() {\r\n setTimeout(function(){this.start()}.bind(this), 0)\r\n return this\r\n }\r\n\r\n }\r\n\r\n, parent: SVG.Element\r\n\r\n // Add method to parent elements\r\n, construct: {\r\n // Get fx module or create a new one, then animate with given duration and ease\r\n animate: function(o, ease, delay) {\r\n return (this.fx || (this.fx = new SVG.FX(this))).animate(o, ease, delay)\r\n }\r\n , delay: function(delay){\r\n return (this.fx || (this.fx = new SVG.FX(this))).delay(delay)\r\n }\r\n , stop: function(jumpToEnd, clearQueue) {\r\n if (this.fx)\r\n this.fx.stop(jumpToEnd, clearQueue)\r\n\r\n return this\r\n }\r\n , finish: function() {\r\n if (this.fx)\r\n this.fx.finish()\r\n\r\n return this\r\n }\r\n // Pause current animation\r\n , pause: function() {\r\n if (this.fx)\r\n this.fx.pause()\r\n\r\n return this\r\n }\r\n // Play paused current animation\r\n , play: function() {\r\n if (this.fx)\r\n this.fx.play()\r\n\r\n return this\r\n }\r\n // Set/Get the speed of the animations\r\n , speed: function(speed) {\r\n if (this.fx)\r\n if (speed == null)\r\n return this.fx.speed()\r\n else\r\n this.fx.speed(speed)\r\n\r\n return this\r\n }\r\n }\r\n\r\n})\r\n\r\n// MorphObj is used whenever no morphable object is given\r\nSVG.MorphObj = SVG.invent({\r\n\r\n create: function(from, to){\r\n // prepare color for morphing\r\n if(SVG.Color.isColor(to)) return new SVG.Color(from).morph(to)\r\n // check if we have a list of values\r\n if(SVG.regex.delimiter.test(from)) {\r\n // prepare path for morphing\r\n if(SVG.regex.pathLetters.test(from)) return new SVG.PathArray(from).morph(to)\r\n // prepare value list for morphing\r\n else return new SVG.Array(from).morph(to)\r\n }\r\n // prepare number for morphing\r\n if(SVG.regex.numberAndUnit.test(to)) return new SVG.Number(from).morph(to)\r\n\r\n // prepare for plain morphing\r\n this.value = from\r\n this.destination = to\r\n }\r\n\r\n, extend: {\r\n at: function(pos, real){\r\n return real < 1 ? this.value : this.destination\r\n },\r\n\r\n valueOf: function(){\r\n return this.value\r\n }\r\n }\r\n\r\n})\r\n\r\nSVG.extend(SVG.FX, {\r\n // Add animatable attributes\r\n attr: function(a, v, relative) {\r\n // apply attributes individually\r\n if (typeof a == 'object') {\r\n for (var key in a)\r\n this.attr(key, a[key])\r\n\r\n } else {\r\n this.add(a, v, 'attrs')\r\n }\r\n\r\n return this\r\n }\r\n // Add animatable styles\r\n, style: function(s, v) {\r\n if (typeof s == 'object')\r\n for (var key in s)\r\n this.style(key, s[key])\r\n\r\n else\r\n this.add(s, v, 'styles')\r\n\r\n return this\r\n }\r\n // Animatable x-axis\r\n, x: function(x, relative) {\r\n if(this.target() instanceof SVG.G){\r\n this.transform({x:x}, relative)\r\n return this\r\n }\r\n\r\n var num = new SVG.Number(x)\r\n num.relative = relative\r\n return this.add('x', num)\r\n }\r\n // Animatable y-axis\r\n, y: function(y, relative) {\r\n if(this.target() instanceof SVG.G){\r\n this.transform({y:y}, relative)\r\n return this\r\n }\r\n\r\n var num = new SVG.Number(y)\r\n num.relative = relative\r\n return this.add('y', num)\r\n }\r\n // Animatable center x-axis\r\n, cx: function(x) {\r\n return this.add('cx', new SVG.Number(x))\r\n }\r\n // Animatable center y-axis\r\n, cy: function(y) {\r\n return this.add('cy', new SVG.Number(y))\r\n }\r\n // Add animatable move\r\n, move: function(x, y) {\r\n return this.x(x).y(y)\r\n }\r\n // Add animatable center\r\n, center: function(x, y) {\r\n return this.cx(x).cy(y)\r\n }\r\n // Add animatable size\r\n, size: function(width, height) {\r\n if (this.target() instanceof SVG.Text) {\r\n // animate font size for Text elements\r\n this.attr('font-size', width)\r\n\r\n } else {\r\n // animate bbox based size for all other elements\r\n var box\r\n\r\n if(!width || !height){\r\n box = this.target().bbox()\r\n }\r\n\r\n if(!width){\r\n width = box.width / box.height * height\r\n }\r\n\r\n if(!height){\r\n height = box.height / box.width * width\r\n }\r\n\r\n this.add('width' , new SVG.Number(width))\r\n .add('height', new SVG.Number(height))\r\n\r\n }\r\n\r\n return this\r\n }\r\n // Add animatable width\r\n, width: function(width) {\r\n return this.add('width', new SVG.Number(width))\r\n }\r\n // Add animatable height\r\n, height: function(height) {\r\n return this.add('height', new SVG.Number(height))\r\n }\r\n // Add animatable plot\r\n, plot: function(a, b, c, d) {\r\n // Lines can be plotted with 4 arguments\r\n if(arguments.length == 4) {\r\n return this.plot([a, b, c, d])\r\n }\r\n\r\n return this.add('plot', new (this.target().morphArray)(a))\r\n }\r\n // Add leading method\r\n, leading: function(value) {\r\n return this.target().leading ?\r\n this.add('leading', new SVG.Number(value)) :\r\n this\r\n }\r\n // Add animatable viewbox\r\n, viewbox: function(x, y, width, height) {\r\n if (this.target() instanceof SVG.Container) {\r\n this.add('viewbox', new SVG.ViewBox(x, y, width, height))\r\n }\r\n\r\n return this\r\n }\r\n, update: function(o) {\r\n if (this.target() instanceof SVG.Stop) {\r\n if (typeof o == 'number' || o instanceof SVG.Number) {\r\n return this.update({\r\n offset: arguments[0]\r\n , color: arguments[1]\r\n , opacity: arguments[2]\r\n })\r\n }\r\n\r\n if (o.opacity != null) this.attr('stop-opacity', o.opacity)\r\n if (o.color != null) this.attr('stop-color', o.color)\r\n if (o.offset != null) this.attr('offset', o.offset)\r\n }\r\n\r\n return this\r\n }\r\n})\r\n\nSVG.Box = SVG.invent({\r\n create: function(x, y, width, height) {\r\n if (typeof x == 'object' && !(x instanceof SVG.Element)) {\r\n // chromes getBoundingClientRect has no x and y property\r\n return SVG.Box.call(this, x.left != null ? x.left : x.x , x.top != null ? x.top : x.y, x.width, x.height)\r\n } else if (arguments.length == 4) {\r\n this.x = x\r\n this.y = y\r\n this.width = width\r\n this.height = height\r\n }\r\n\r\n // add center, right, bottom...\r\n fullBox(this)\r\n }\r\n, extend: {\r\n // Merge rect box with another, return a new instance\r\n merge: function(box) {\r\n var b = new this.constructor()\r\n\r\n // merge boxes\r\n b.x = Math.min(this.x, box.x)\r\n b.y = Math.min(this.y, box.y)\r\n b.width = Math.max(this.x + this.width, box.x + box.width) - b.x\r\n b.height = Math.max(this.y + this.height, box.y + box.height) - b.y\r\n\r\n return fullBox(b)\r\n }\r\n\r\n , transform: function(m) {\r\n var xMin = Infinity, xMax = -Infinity, yMin = Infinity, yMax = -Infinity, p, bbox\r\n\r\n var pts = [\r\n new SVG.Point(this.x, this.y),\r\n new SVG.Point(this.x2, this.y),\r\n new SVG.Point(this.x, this.y2),\r\n new SVG.Point(this.x2, this.y2)\r\n ]\r\n\r\n pts.forEach(function(p) {\r\n p = p.transform(m)\r\n xMin = Math.min(xMin,p.x)\r\n xMax = Math.max(xMax,p.x)\r\n yMin = Math.min(yMin,p.y)\r\n yMax = Math.max(yMax,p.y)\r\n })\r\n\r\n bbox = new this.constructor()\r\n bbox.x = xMin\r\n bbox.width = xMax-xMin\r\n bbox.y = yMin\r\n bbox.height = yMax-yMin\r\n\r\n fullBox(bbox)\r\n\r\n return bbox\r\n }\r\n }\r\n})\r\n\r\nSVG.BBox = SVG.invent({\r\n // Initialize\r\n create: function(element) {\r\n SVG.Box.apply(this, [].slice.call(arguments))\r\n\r\n // get values if element is given\r\n if (element instanceof SVG.Element) {\r\n var box\r\n\r\n // yes this is ugly, but Firefox can be a pain when it comes to elements that are not yet rendered\r\n try {\r\n\r\n if (!document.documentElement.contains){\r\n // This is IE - it does not support contains() for top-level SVGs\r\n var topParent = element.node\r\n while (topParent.parentNode){\r\n topParent = topParent.parentNode\r\n }\r\n if (topParent != document) throw new Exception('Element not in the dom')\r\n } else {\r\n // the element is NOT in the dom, throw error\r\n if(!document.documentElement.contains(element.node)) throw new Exception('Element not in the dom')\r\n }\r\n\r\n // find native bbox\r\n box = element.node.getBBox()\r\n } catch(e) {\r\n if(element instanceof SVG.Shape){\r\n var clone = element.clone(SVG.parser.draw.instance).show()\r\n box = clone.node.getBBox()\r\n clone.remove()\r\n }else{\r\n box = {\r\n x: element.node.clientLeft\r\n , y: element.node.clientTop\r\n , width: element.node.clientWidth\r\n , height: element.node.clientHeight\r\n }\r\n }\r\n }\r\n\r\n SVG.Box.call(this, box)\r\n }\r\n\r\n }\r\n\r\n // Define ancestor\r\n, inherit: SVG.Box\r\n\r\n // Define Parent\r\n, parent: SVG.Element\r\n\r\n // Constructor\r\n, construct: {\r\n // Get bounding box\r\n bbox: function() {\r\n return new SVG.BBox(this)\r\n }\r\n }\r\n\r\n})\r\n\r\nSVG.BBox.prototype.constructor = SVG.BBox\r\n\r\n\r\nSVG.extend(SVG.Element, {\r\n tbox: function(){\r\n console.warn('Use of TBox is deprecated and mapped to RBox. Use .rbox() instead.')\r\n return this.rbox(this.doc())\r\n }\r\n})\r\n\r\nSVG.RBox = SVG.invent({\r\n // Initialize\r\n create: function(element) {\r\n SVG.Box.apply(this, [].slice.call(arguments))\r\n\r\n if (element instanceof SVG.Element) {\r\n SVG.Box.call(this, element.node.getBoundingClientRect())\r\n }\r\n }\r\n\r\n, inherit: SVG.Box\r\n\r\n // define Parent\r\n, parent: SVG.Element\r\n\r\n, extend: {\r\n addOffset: function() {\r\n // offset by window scroll position, because getBoundingClientRect changes when window is scrolled\r\n this.x += window.pageXOffset\r\n this.y += window.pageYOffset\r\n return this\r\n }\r\n }\r\n\r\n // Constructor\r\n, construct: {\r\n // Get rect box\r\n rbox: function(el) {\r\n if (el) return new SVG.RBox(this).transform(el.screenCTM().inverse())\r\n return new SVG.RBox(this).addOffset()\r\n }\r\n }\r\n\r\n})\r\n\r\nSVG.RBox.prototype.constructor = SVG.RBox\r\n\nSVG.Matrix = SVG.invent({\r\n // Initialize\r\n create: function(source) {\r\n var i, base = arrayToMatrix([1, 0, 0, 1, 0, 0])\r\n\r\n // ensure source as object\r\n source = source instanceof SVG.Element ?\r\n source.matrixify() :\r\n typeof source === 'string' ?\r\n arrayToMatrix(source.split(SVG.regex.delimiter).map(parseFloat)) :\r\n arguments.length == 6 ?\r\n arrayToMatrix([].slice.call(arguments)) :\r\n Array.isArray(source) ?\r\n arrayToMatrix(source) :\r\n typeof source === 'object' ?\r\n source : base\r\n\r\n // merge source\r\n for (i = abcdef.length - 1; i >= 0; --i)\r\n this[abcdef[i]] = source[abcdef[i]] != null ?\r\n source[abcdef[i]] : base[abcdef[i]]\r\n }\r\n\r\n // Add methods\r\n, extend: {\r\n // Extract individual transformations\r\n extract: function() {\r\n // find delta transform points\r\n var px = deltaTransformPoint(this, 0, 1)\r\n , py = deltaTransformPoint(this, 1, 0)\r\n , skewX = 180 / Math.PI * Math.atan2(px.y, px.x) - 90\r\n\r\n return {\r\n // translation\r\n x: this.e\r\n , y: this.f\r\n , transformedX:(this.e * Math.cos(skewX * Math.PI / 180) + this.f * Math.sin(skewX * Math.PI / 180)) / Math.sqrt(this.a * this.a + this.b * this.b)\r\n , transformedY:(this.f * Math.cos(skewX * Math.PI / 180) + this.e * Math.sin(-skewX * Math.PI / 180)) / Math.sqrt(this.c * this.c + this.d * this.d)\r\n // skew\r\n , skewX: -skewX\r\n , skewY: 180 / Math.PI * Math.atan2(py.y, py.x)\r\n // scale\r\n , scaleX: Math.sqrt(this.a * this.a + this.b * this.b)\r\n , scaleY: Math.sqrt(this.c * this.c + this.d * this.d)\r\n // rotation\r\n , rotation: skewX\r\n , a: this.a\r\n , b: this.b\r\n , c: this.c\r\n , d: this.d\r\n , e: this.e\r\n , f: this.f\r\n , matrix: new SVG.Matrix(this)\r\n }\r\n }\r\n // Clone matrix\r\n , clone: function() {\r\n return new SVG.Matrix(this)\r\n }\r\n // Morph one matrix into another\r\n , morph: function(matrix) {\r\n // store new destination\r\n this.destination = new SVG.Matrix(matrix)\r\n\r\n return this\r\n }\r\n // Get morphed matrix at a given position\r\n , at: function(pos) {\r\n // make sure a destination is defined\r\n if (!this.destination) return this\r\n\r\n // calculate morphed matrix at a given position\r\n var matrix = new SVG.Matrix({\r\n a: this.a + (this.destination.a - this.a) * pos\r\n , b: this.b + (this.destination.b - this.b) * pos\r\n , c: this.c + (this.destination.c - this.c) * pos\r\n , d: this.d + (this.destination.d - this.d) * pos\r\n , e: this.e + (this.destination.e - this.e) * pos\r\n , f: this.f + (this.destination.f - this.f) * pos\r\n })\r\n\r\n return matrix\r\n }\r\n // Multiplies by given matrix\r\n , multiply: function(matrix) {\r\n return new SVG.Matrix(this.native().multiply(parseMatrix(matrix).native()))\r\n }\r\n // Inverses matrix\r\n , inverse: function() {\r\n return new SVG.Matrix(this.native().inverse())\r\n }\r\n // Translate matrix\r\n , translate: function(x, y) {\r\n return new SVG.Matrix(this.native().translate(x || 0, y || 0))\r\n }\r\n // Scale matrix\r\n , scale: function(x, y, cx, cy) {\r\n // support uniformal scale\r\n if (arguments.length == 1) {\r\n y = x\r\n } else if (arguments.length == 3) {\r\n cy = cx\r\n cx = y\r\n y = x\r\n }\r\n\r\n return this.around(cx, cy, new SVG.Matrix(x, 0, 0, y, 0, 0))\r\n }\r\n // Rotate matrix\r\n , rotate: function(r, cx, cy) {\r\n // convert degrees to radians\r\n r = SVG.utils.radians(r)\r\n\r\n return this.around(cx, cy, new SVG.Matrix(Math.cos(r), Math.sin(r), -Math.sin(r), Math.cos(r), 0, 0))\r\n }\r\n // Flip matrix on x or y, at a given offset\r\n , flip: function(a, o) {\r\n return a == 'x' ?\r\n this.scale(-1, 1, o, 0) :\r\n a == 'y' ?\r\n this.scale(1, -1, 0, o) :\r\n this.scale(-1, -1, a, o != null ? o : a)\r\n }\r\n // Skew\r\n , skew: function(x, y, cx, cy) {\r\n // support uniformal skew\r\n if (arguments.length == 1) {\r\n y = x\r\n } else if (arguments.length == 3) {\r\n cy = cx\r\n cx = y\r\n y = x\r\n }\r\n\r\n // convert degrees to radians\r\n x = SVG.utils.radians(x)\r\n y = SVG.utils.radians(y)\r\n\r\n return this.around(cx, cy, new SVG.Matrix(1, Math.tan(y), Math.tan(x), 1, 0, 0))\r\n }\r\n // SkewX\r\n , skewX: function(x, cx, cy) {\r\n return this.skew(x, 0, cx, cy)\r\n }\r\n // SkewY\r\n , skewY: function(y, cx, cy) {\r\n return this.skew(0, y, cx, cy)\r\n }\r\n // Transform around a center point\r\n , around: function(cx, cy, matrix) {\r\n return this\r\n .multiply(new SVG.Matrix(1, 0, 0, 1, cx || 0, cy || 0))\r\n .multiply(matrix)\r\n .multiply(new SVG.Matrix(1, 0, 0, 1, -cx || 0, -cy || 0))\r\n }\r\n // Convert to native SVGMatrix\r\n , native: function() {\r\n // create new matrix\r\n var matrix = SVG.parser.native.createSVGMatrix()\r\n\r\n // update with current values\r\n for (var i = abcdef.length - 1; i >= 0; i--)\r\n matrix[abcdef[i]] = this[abcdef[i]]\r\n\r\n return matrix\r\n }\r\n // Convert matrix to string\r\n , toString: function() {\r\n // Construct the matrix directly, avoid values that are too small\r\n return 'matrix(' + float32String(this.a) + ',' + float32String(this.b)\r\n + ',' + float32String(this.c) + ',' + float32String(this.d)\r\n + ',' + float32String(this.e) + ',' + float32String(this.f)\r\n + ')'\r\n }\r\n }\r\n\r\n // Define parent\r\n, parent: SVG.Element\r\n\r\n // Add parent method\r\n, construct: {\r\n // Get current matrix\r\n ctm: function() {\r\n return new SVG.Matrix(this.node.getCTM())\r\n },\r\n // Get current screen matrix\r\n screenCTM: function() {\r\n /* https://bugzilla.mozilla.org/show_bug.cgi?id=1344537\r\n This is needed because FF does not return the transformation matrix\r\n for the inner coordinate system when getScreenCTM() is called on nested svgs.\r\n However all other Browsers do that */\r\n if(this instanceof SVG.Nested) {\r\n var rect = this.rect(1,1)\r\n var m = rect.node.getScreenCTM()\r\n rect.remove()\r\n return new SVG.Matrix(m)\r\n }\r\n return new SVG.Matrix(this.node.getScreenCTM())\r\n }\r\n\r\n }\r\n\r\n})\r\n\nSVG.Point = SVG.invent({\r\n // Initialize\r\n create: function(x,y) {\r\n var i, source, base = {x:0, y:0}\r\n\r\n // ensure source as object\r\n source = Array.isArray(x) ?\r\n {x:x[0], y:x[1]} :\r\n typeof x === 'object' ?\r\n {x:x.x, y:x.y} :\r\n x != null ?\r\n {x:x, y:(y != null ? y : x)} : base // If y has no value, then x is used has its value\r\n\r\n // merge source\r\n this.x = source.x\r\n this.y = source.y\r\n }\r\n\r\n // Add methods\r\n, extend: {\r\n // Clone point\r\n clone: function() {\r\n return new SVG.Point(this)\r\n }\r\n // Morph one point into another\r\n , morph: function(x, y) {\r\n // store new destination\r\n this.destination = new SVG.Point(x, y)\r\n\r\n return this\r\n }\r\n // Get morphed point at a given position\r\n , at: function(pos) {\r\n // make sure a destination is defined\r\n if (!this.destination) return this\r\n\r\n // calculate morphed matrix at a given position\r\n var point = new SVG.Point({\r\n x: this.x + (this.destination.x - this.x) * pos\r\n , y: this.y + (this.destination.y - this.y) * pos\r\n })\r\n\r\n return point\r\n }\r\n // Convert to native SVGPoint\r\n , native: function() {\r\n // create new point\r\n var point = SVG.parser.native.createSVGPoint()\r\n\r\n // update with current values\r\n point.x = this.x\r\n point.y = this.y\r\n\r\n return point\r\n }\r\n // transform point with matrix\r\n , transform: function(matrix) {\r\n return new SVG.Point(this.native().matrixTransform(matrix.native()))\r\n }\r\n\r\n }\r\n\r\n})\r\n\r\nSVG.extend(SVG.Element, {\r\n\r\n // Get point\r\n point: function(x, y) {\r\n return new SVG.Point(x,y).transform(this.screenCTM().inverse());\r\n }\r\n\r\n})\r\n\nSVG.extend(SVG.Element, {\r\n // Set svg element attribute\r\n attr: function(a, v, n) {\r\n // act as full getter\r\n if (a == null) {\r\n // get an object of attributes\r\n a = {}\r\n v = this.node.attributes\r\n for (n = v.length - 1; n >= 0; n--)\r\n a[v[n].nodeName] = SVG.regex.isNumber.test(v[n].nodeValue) ? parseFloat(v[n].nodeValue) : v[n].nodeValue\r\n\r\n return a\r\n\r\n } else if (typeof a == 'object') {\r\n // apply every attribute individually if an object is passed\r\n for (v in a) this.attr(v, a[v])\r\n\r\n } else if (v === null) {\r\n // remove value\r\n this.node.removeAttribute(a)\r\n\r\n } else if (v == null) {\r\n // act as a getter if the first and only argument is not an object\r\n v = this.node.getAttribute(a)\r\n return v == null ?\r\n SVG.defaults.attrs[a] :\r\n SVG.regex.isNumber.test(v) ?\r\n parseFloat(v) : v\r\n\r\n } else {\r\n // BUG FIX: some browsers will render a stroke if a color is given even though stroke width is 0\r\n if (a == 'stroke-width')\r\n this.attr('stroke', parseFloat(v) > 0 ? this._stroke : null)\r\n else if (a == 'stroke')\r\n this._stroke = v\r\n\r\n // convert image fill and stroke to patterns\r\n if (a == 'fill' || a == 'stroke') {\r\n if (SVG.regex.isImage.test(v))\r\n v = this.doc().defs().image(v, 0, 0)\r\n\r\n if (v instanceof SVG.Image)\r\n v = this.doc().defs().pattern(0, 0, function() {\r\n this.add(v)\r\n })\r\n }\r\n\r\n // ensure correct numeric values (also accepts NaN and Infinity)\r\n if (typeof v === 'number')\r\n v = new SVG.Number(v)\r\n\r\n // ensure full hex color\r\n else if (SVG.Color.isColor(v))\r\n v = new SVG.Color(v)\r\n\r\n // parse array values\r\n else if (Array.isArray(v))\r\n v = new SVG.Array(v)\r\n\r\n // if the passed attribute is leading...\r\n if (a == 'leading') {\r\n // ... call the leading method instead\r\n if (this.leading)\r\n this.leading(v)\r\n } else {\r\n // set given attribute on node\r\n typeof n === 'string' ?\r\n this.node.setAttributeNS(n, a, v.toString()) :\r\n this.node.setAttribute(a, v.toString())\r\n }\r\n\r\n // rebuild if required\r\n if (this.rebuild && (a == 'font-size' || a == 'x'))\r\n this.rebuild(a, v)\r\n }\r\n\r\n return this\r\n }\r\n})\nSVG.extend(SVG.Element, {\r\n // Add transformations\r\n transform: function(o, relative) {\r\n // get target in case of the fx module, otherwise reference this\r\n var target = this\r\n , matrix, bbox\r\n\r\n // act as a getter\r\n if (typeof o !== 'object') {\r\n // get current matrix\r\n matrix = new SVG.Matrix(target).extract()\r\n\r\n return typeof o === 'string' ? matrix[o] : matrix\r\n }\r\n\r\n // get current matrix\r\n matrix = new SVG.Matrix(target)\r\n\r\n // ensure relative flag\r\n relative = !!relative || !!o.relative\r\n\r\n // act on matrix\r\n if (o.a != null) {\r\n matrix = relative ?\r\n // relative\r\n matrix.multiply(new SVG.Matrix(o)) :\r\n // absolute\r\n new SVG.Matrix(o)\r\n\r\n // act on rotation\r\n } else if (o.rotation != null) {\r\n // ensure centre point\r\n ensureCentre(o, target)\r\n\r\n // apply transformation\r\n matrix = relative ?\r\n // relative\r\n matrix.rotate(o.rotation, o.cx, o.cy) :\r\n // absolute\r\n matrix.rotate(o.rotation - matrix.extract().rotation, o.cx, o.cy)\r\n\r\n // act on scale\r\n } else if (o.scale != null || o.scaleX != null || o.scaleY != null) {\r\n // ensure centre point\r\n ensureCentre(o, target)\r\n\r\n // ensure scale values on both axes\r\n o.scaleX = o.scale != null ? o.scale : o.scaleX != null ? o.scaleX : 1\r\n o.scaleY = o.scale != null ? o.scale : o.scaleY != null ? o.scaleY : 1\r\n\r\n if (!relative) {\r\n // absolute; multiply inversed values\r\n var e = matrix.extract()\r\n o.scaleX = o.scaleX * 1 / e.scaleX\r\n o.scaleY = o.scaleY * 1 / e.scaleY\r\n }\r\n\r\n matrix = matrix.scale(o.scaleX, o.scaleY, o.cx, o.cy)\r\n\r\n // act on skew\r\n } else if (o.skew != null || o.skewX != null || o.skewY != null) {\r\n // ensure centre point\r\n ensureCentre(o, target)\r\n\r\n // ensure skew values on both axes\r\n o.skewX = o.skew != null ? o.skew : o.skewX != null ? o.skewX : 0\r\n o.skewY = o.skew != null ? o.skew : o.skewY != null ? o.skewY : 0\r\n\r\n if (!relative) {\r\n // absolute; reset skew values\r\n var e = matrix.extract()\r\n matrix = matrix.multiply(new SVG.Matrix().skew(e.skewX, e.skewY, o.cx, o.cy).inverse())\r\n }\r\n\r\n matrix = matrix.skew(o.skewX, o.skewY, o.cx, o.cy)\r\n\r\n // act on flip\r\n } else if (o.flip) {\r\n if(o.flip == 'x' || o.flip == 'y') {\r\n o.offset = o.offset == null ? target.bbox()['c' + o.flip] : o.offset\r\n } else {\r\n if(o.offset == null) {\r\n bbox = target.bbox()\r\n o.flip = bbox.cx\r\n o.offset = bbox.cy\r\n } else {\r\n o.flip = o.offset\r\n }\r\n }\r\n\r\n matrix = new SVG.Matrix().flip(o.flip, o.offset)\r\n\r\n // act on translate\r\n } else if (o.x != null || o.y != null) {\r\n if (relative) {\r\n // relative\r\n matrix = matrix.translate(o.x, o.y)\r\n } else {\r\n // absolute\r\n if (o.x != null) matrix.e = o.x\r\n if (o.y != null) matrix.f = o.y\r\n }\r\n }\r\n\r\n return this.attr('transform', matrix)\r\n }\r\n})\r\n\r\nSVG.extend(SVG.FX, {\r\n transform: function(o, relative) {\r\n // get target in case of the fx module, otherwise reference this\r\n var target = this.target()\r\n , matrix, bbox\r\n\r\n // act as a getter\r\n if (typeof o !== 'object') {\r\n // get current matrix\r\n matrix = new SVG.Matrix(target).extract()\r\n\r\n return typeof o === 'string' ? matrix[o] : matrix\r\n }\r\n\r\n // ensure relative flag\r\n relative = !!relative || !!o.relative\r\n\r\n // act on matrix\r\n if (o.a != null) {\r\n matrix = new SVG.Matrix(o)\r\n\r\n // act on rotation\r\n } else if (o.rotation != null) {\r\n // ensure centre point\r\n ensureCentre(o, target)\r\n\r\n // apply transformation\r\n matrix = new SVG.Rotate(o.rotation, o.cx, o.cy)\r\n\r\n // act on scale\r\n } else if (o.scale != null || o.scaleX != null || o.scaleY != null) {\r\n // ensure centre point\r\n ensureCentre(o, target)\r\n\r\n // ensure scale values on both axes\r\n o.scaleX = o.scale != null ? o.scale : o.scaleX != null ? o.scaleX : 1\r\n o.scaleY = o.scale != null ? o.scale : o.scaleY != null ? o.scaleY : 1\r\n\r\n matrix = new SVG.Scale(o.scaleX, o.scaleY, o.cx, o.cy)\r\n\r\n // act on skew\r\n } else if (o.skewX != null || o.skewY != null) {\r\n // ensure centre point\r\n ensureCentre(o, target)\r\n\r\n // ensure skew values on both axes\r\n o.skewX = o.skewX != null ? o.skewX : 0\r\n o.skewY = o.skewY != null ? o.skewY : 0\r\n\r\n matrix = new SVG.Skew(o.skewX, o.skewY, o.cx, o.cy)\r\n\r\n // act on flip\r\n } else if (o.flip) {\r\n if(o.flip == 'x' || o.flip == 'y') {\r\n o.offset = o.offset == null ? target.bbox()['c' + o.flip] : o.offset\r\n } else {\r\n if(o.offset == null) {\r\n bbox = target.bbox()\r\n o.flip = bbox.cx\r\n o.offset = bbox.cy\r\n } else {\r\n o.flip = o.offset\r\n }\r\n }\r\n\r\n matrix = new SVG.Matrix().flip(o.flip, o.offset)\r\n\r\n // act on translate\r\n } else if (o.x != null || o.y != null) {\r\n matrix = new SVG.Translate(o.x, o.y)\r\n }\r\n\r\n if(!matrix) return this\r\n\r\n matrix.relative = relative\r\n\r\n this.last().transforms.push(matrix)\r\n\r\n return this._callStart()\r\n }\r\n})\r\n\r\nSVG.extend(SVG.Element, {\r\n // Reset all transformations\r\n untransform: function() {\r\n return this.attr('transform', null)\r\n },\r\n // merge the whole transformation chain into one matrix and returns it\r\n matrixify: function() {\r\n\r\n var matrix = (this.attr('transform') || '')\r\n // split transformations\r\n .split(SVG.regex.transforms).slice(0,-1).map(function(str){\r\n // generate key => value pairs\r\n var kv = str.trim().split('(')\r\n return [kv[0], kv[1].split(SVG.regex.delimiter).map(function(str){ return parseFloat(str) })]\r\n })\r\n // merge every transformation into one matrix\r\n .reduce(function(matrix, transform){\r\n\r\n if(transform[0] == 'matrix') return matrix.multiply(arrayToMatrix(transform[1]))\r\n return matrix[transform[0]].apply(matrix, transform[1])\r\n\r\n }, new SVG.Matrix())\r\n\r\n return matrix\r\n },\r\n // add an element to another parent without changing the visual representation on the screen\r\n toParent: function(parent) {\r\n if(this == parent) return this\r\n var ctm = this.screenCTM()\r\n var pCtm = parent.screenCTM().inverse()\r\n\r\n this.addTo(parent).untransform().transform(pCtm.multiply(ctm))\r\n\r\n return this\r\n },\r\n // same as above with parent equals root-svg\r\n toDoc: function() {\r\n return this.toParent(this.doc())\r\n }\r\n\r\n})\r\n\r\nSVG.Transformation = SVG.invent({\r\n\r\n create: function(source, inversed){\r\n\r\n if(arguments.length > 1 && typeof inversed != 'boolean'){\r\n return this.constructor.call(this, [].slice.call(arguments))\r\n }\r\n\r\n if(Array.isArray(source)){\r\n for(var i = 0, len = this.arguments.length; i < len; ++i){\r\n this[this.arguments[i]] = source[i]\r\n }\r\n } else if(typeof source == 'object'){\r\n for(var i = 0, len = this.arguments.length; i < len; ++i){\r\n this[this.arguments[i]] = source[this.arguments[i]]\r\n }\r\n }\r\n\r\n this.inversed = false\r\n\r\n if(inversed === true){\r\n this.inversed = true\r\n }\r\n\r\n }\r\n\r\n, extend: {\r\n\r\n arguments: []\r\n , method: ''\r\n\r\n , at: function(pos){\r\n\r\n var params = []\r\n\r\n for(var i = 0, len = this.arguments.length; i < len; ++i){\r\n params.push(this[this.arguments[i]])\r\n }\r\n\r\n var m = this._undo || new SVG.Matrix()\r\n\r\n m = new SVG.Matrix().morph(SVG.Matrix.prototype[this.method].apply(m, params)).at(pos)\r\n\r\n return this.inversed ? m.inverse() : m\r\n\r\n }\r\n\r\n , undo: function(o){\r\n for(var i = 0, len = this.arguments.length; i < len; ++i){\r\n o[this.arguments[i]] = typeof this[this.arguments[i]] == 'undefined' ? 0 : o[this.arguments[i]]\r\n }\r\n\r\n // The method SVG.Matrix.extract which was used before calling this\r\n // method to obtain a value for the parameter o doesn't return a cx and\r\n // a cy so we use the ones that were provided to this object at its creation\r\n o.cx = this.cx\r\n o.cy = this.cy\r\n\r\n this._undo = new SVG[capitalize(this.method)](o, true).at(1)\r\n\r\n return this\r\n }\r\n\r\n }\r\n\r\n})\r\n\r\nSVG.Translate = SVG.invent({\r\n\r\n parent: SVG.Matrix\r\n, inherit: SVG.Transformation\r\n\r\n, create: function(source, inversed){\r\n this.constructor.apply(this, [].slice.call(arguments))\r\n }\r\n\r\n, extend: {\r\n arguments: ['transformedX', 'transformedY']\r\n , method: 'translate'\r\n }\r\n\r\n})\r\n\r\nSVG.Rotate = SVG.invent({\r\n\r\n parent: SVG.Matrix\r\n, inherit: SVG.Transformation\r\n\r\n, create: function(source, inversed){\r\n this.constructor.apply(this, [].slice.call(arguments))\r\n }\r\n\r\n, extend: {\r\n arguments: ['rotation', 'cx', 'cy']\r\n , method: 'rotate'\r\n , at: function(pos){\r\n var m = new SVG.Matrix().rotate(new SVG.Number().morph(this.rotation - (this._undo ? this._undo.rotation : 0)).at(pos), this.cx, this.cy)\r\n return this.inversed ? m.inverse() : m\r\n }\r\n , undo: function(o){\r\n this._undo = o\r\n return this\r\n }\r\n }\r\n\r\n})\r\n\r\nSVG.Scale = SVG.invent({\r\n\r\n parent: SVG.Matrix\r\n, inherit: SVG.Transformation\r\n\r\n, create: function(source, inversed){\r\n this.constructor.apply(this, [].slice.call(arguments))\r\n }\r\n\r\n, extend: {\r\n arguments: ['scaleX', 'scaleY', 'cx', 'cy']\r\n , method: 'scale'\r\n }\r\n\r\n})\r\n\r\nSVG.Skew = SVG.invent({\r\n\r\n parent: SVG.Matrix\r\n, inherit: SVG.Transformation\r\n\r\n, create: function(source, inversed){\r\n this.constructor.apply(this, [].slice.call(arguments))\r\n }\r\n\r\n, extend: {\r\n arguments: ['skewX', 'skewY', 'cx', 'cy']\r\n , method: 'skew'\r\n }\r\n\r\n})\r\n\nSVG.extend(SVG.Element, {\r\n // Dynamic style generator\r\n style: function(s, v) {\r\n if (arguments.length == 0) {\r\n // get full style\r\n return this.node.style.cssText || ''\r\n\r\n } else if (arguments.length < 2) {\r\n // apply every style individually if an object is passed\r\n if (typeof s == 'object') {\r\n for (v in s) this.style(v, s[v])\r\n\r\n } else if (SVG.regex.isCss.test(s)) {\r\n // parse css string\r\n s = s.split(/\\s*;\\s*/)\r\n // filter out suffix ; and stuff like ;;\r\n .filter(function(e) { return !!e })\r\n .map(function(e){ return e.split(/\\s*:\\s*/) })\r\n\r\n // apply every definition individually\r\n while (v = s.pop()) {\r\n this.style(v[0], v[1])\r\n }\r\n } else {\r\n // act as a getter if the first and only argument is not an object\r\n return this.node.style[camelCase(s)]\r\n }\r\n\r\n } else {\r\n this.node.style[camelCase(s)] = v === null || SVG.regex.isBlank.test(v) ? '' : v\r\n }\r\n\r\n return this\r\n }\r\n})\nSVG.Parent = SVG.invent({\r\n // Initialize node\r\n create: function(element) {\r\n this.constructor.call(this, element)\r\n }\r\n\r\n // Inherit from\r\n, inherit: SVG.Element\r\n\r\n // Add class methods\r\n, extend: {\r\n // Returns all child elements\r\n children: function() {\r\n return SVG.utils.map(SVG.utils.filterSVGElements(this.node.childNodes), function(node) {\r\n return SVG.adopt(node)\r\n })\r\n }\r\n // Add given element at a position\r\n , add: function(element, i) {\r\n if (i == null)\r\n this.node.appendChild(element.node)\r\n else if (element.node != this.node.childNodes[i])\r\n this.node.insertBefore(element.node, this.node.childNodes[i])\r\n\r\n return this\r\n }\r\n // Basically does the same as `add()` but returns the added element instead\r\n , put: function(element, i) {\r\n this.add(element, i)\r\n return element\r\n }\r\n // Checks if the given element is a child\r\n , has: function(element) {\r\n return this.index(element) >= 0\r\n }\r\n // Gets index of given element\r\n , index: function(element) {\r\n return [].slice.call(this.node.childNodes).indexOf(element.node)\r\n }\r\n // Get a element at the given index\r\n , get: function(i) {\r\n return SVG.adopt(this.node.childNodes[i])\r\n }\r\n // Get first child\r\n , first: function() {\r\n return this.get(0)\r\n }\r\n // Get the last child\r\n , last: function() {\r\n return this.get(this.node.childNodes.length - 1)\r\n }\r\n // Iterates over all children and invokes a given block\r\n , each: function(block, deep) {\r\n var i, il\r\n , children = this.children()\r\n\r\n for (i = 0, il = children.length; i < il; i++) {\r\n if (children[i] instanceof SVG.Element)\r\n block.apply(children[i], [i, children])\r\n\r\n if (deep && (children[i] instanceof SVG.Container))\r\n children[i].each(block, deep)\r\n }\r\n\r\n return this\r\n }\r\n // Remove a given child\r\n , removeElement: function(element) {\r\n this.node.removeChild(element.node)\r\n\r\n return this\r\n }\r\n // Remove all elements in this container\r\n , clear: function() {\r\n // remove children\r\n while(this.node.hasChildNodes())\r\n this.node.removeChild(this.node.lastChild)\r\n\r\n // remove defs reference\r\n delete this._defs\r\n\r\n return this\r\n }\r\n , // Get defs\r\n defs: function() {\r\n return this.doc().defs()\r\n }\r\n }\r\n\r\n})\r\n\nSVG.extend(SVG.Parent, {\r\n\r\n ungroup: function(parent, depth) {\r\n if(depth === 0 || this instanceof SVG.Defs || this.node == SVG.parser.draw) return this\r\n\r\n parent = parent || (this instanceof SVG.Doc ? this : this.parent(SVG.Parent))\r\n depth = depth || Infinity\r\n\r\n this.each(function(){\r\n if(this instanceof SVG.Defs) return this\r\n if(this instanceof SVG.Parent) return this.ungroup(parent, depth-1)\r\n return this.toParent(parent)\r\n })\r\n\r\n this.node.firstChild || this.remove()\r\n\r\n return this\r\n },\r\n\r\n flatten: function(parent, depth) {\r\n return this.ungroup(parent, depth)\r\n }\r\n\r\n})\nSVG.Container = SVG.invent({\r\n // Initialize node\r\n create: function(element) {\r\n this.constructor.call(this, element)\r\n }\r\n\r\n // Inherit from\r\n, inherit: SVG.Parent\r\n\r\n})\n\r\nSVG.ViewBox = SVG.invent({\r\n\r\n create: function(source) {\r\n var i, base = [0, 0, 0, 0]\r\n\r\n var x, y, width, height, box, view, we, he\r\n , wm = 1 // width multiplier\r\n , hm = 1 // height multiplier\r\n , reg = /[+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?/gi\r\n\r\n if(source instanceof SVG.Element){\r\n\r\n we = source\r\n he = source\r\n view = (source.attr('viewBox') || '').match(reg)\r\n box = source.bbox\r\n\r\n // get dimensions of current node\r\n width = new SVG.Number(source.width())\r\n height = new SVG.Number(source.height())\r\n\r\n // find nearest non-percentual dimensions\r\n while (width.unit == '%') {\r\n wm *= width.value\r\n width = new SVG.Number(we instanceof SVG.Doc ? we.parent().offsetWidth : we.parent().width())\r\n we = we.parent()\r\n }\r\n while (height.unit == '%') {\r\n hm *= height.value\r\n height = new SVG.Number(he instanceof SVG.Doc ? he.parent().offsetHeight : he.parent().height())\r\n he = he.parent()\r\n }\r\n\r\n // ensure defaults\r\n this.x = 0\r\n this.y = 0\r\n this.width = width * wm\r\n this.height = height * hm\r\n this.zoom = 1\r\n\r\n if (view) {\r\n // get width and height from viewbox\r\n x = parseFloat(view[0])\r\n y = parseFloat(view[1])\r\n width = parseFloat(view[2])\r\n height = parseFloat(view[3])\r\n\r\n // calculate zoom accoring to viewbox\r\n this.zoom = ((this.width / this.height) > (width / height)) ?\r\n this.height / height :\r\n this.width / width\r\n\r\n // calculate real pixel dimensions on parent SVG.Doc element\r\n this.x = x\r\n this.y = y\r\n this.width = width\r\n this.height = height\r\n\r\n }\r\n\r\n }else{\r\n\r\n // ensure source as object\r\n source = typeof source === 'string' ?\r\n source.match(reg).map(function(el){ return parseFloat(el) }) :\r\n Array.isArray(source) ?\r\n source :\r\n typeof source == 'object' ?\r\n [source.x, source.y, source.width, source.height] :\r\n arguments.length == 4 ?\r\n [].slice.call(arguments) :\r\n base\r\n\r\n this.x = source[0]\r\n this.y = source[1]\r\n this.width = source[2]\r\n this.height = source[3]\r\n }\r\n\r\n\r\n }\r\n\r\n, extend: {\r\n\r\n toString: function() {\r\n return this.x + ' ' + this.y + ' ' + this.width + ' ' + this.height\r\n }\r\n , morph: function(x, y, width, height){\r\n this.destination = new SVG.ViewBox(x, y, width, height)\r\n return this\r\n }\r\n\r\n , at: function(pos) {\r\n\r\n if(!this.destination) return this\r\n\r\n return new SVG.ViewBox([\r\n this.x + (this.destination.x - this.x) * pos\r\n , this.y + (this.destination.y - this.y) * pos\r\n , this.width + (this.destination.width - this.width) * pos\r\n , this.height + (this.destination.height - this.height) * pos\r\n ])\r\n\r\n }\r\n\r\n }\r\n\r\n // Define parent\r\n, parent: SVG.Container\r\n\r\n // Add parent method\r\n, construct: {\r\n\r\n // get/set viewbox\r\n viewbox: function(x, y, width, height) {\r\n if (arguments.length == 0)\r\n // act as a getter if there are no arguments\r\n return new SVG.ViewBox(this)\r\n\r\n // otherwise act as a setter\r\n return this.attr('viewBox', new SVG.ViewBox(x, y, width, height))\r\n }\r\n\r\n }\r\n\r\n})\n// Add events to elements\r\n\r\n;[ 'click',\r\n 'dblclick',\r\n 'mousedown',\r\n 'mouseup',\r\n 'mouseover',\r\n 'mouseout',\r\n 'mousemove',\r\n 'mouseenter',\r\n 'mouseleave',\r\n 'touchstart',\r\n 'touchmove',\r\n 'touchleave',\r\n 'touchend',\r\n 'touchcancel' ].forEach(function (event) {\r\n // add event to SVG.Element\r\n SVG.Element.prototype[event] = function (f) {\r\n // bind event to element rather than element node\r\n if (f == null) {\r\n SVG.off(this, event)\r\n } else {\r\n SVG.on(this, event, f)\r\n }\r\n return this\r\n }\r\n })\r\n\r\nSVG.listenerId = 0\r\n\r\n// Add event binder in the SVG namespace\r\nSVG.on = function (node, events, listener, binding, options) {\r\n var l = listener.bind(binding || node)\r\n var n = node instanceof SVG.Element ? node.node : node\r\n\r\n // ensure instance object for nodes which are not adopted\r\n n.instance = n.instance || {_events: {}}\r\n\r\n var bag = n.instance._events\r\n\r\n // add id to listener\r\n if (!listener._svgjsListenerId) { listener._svgjsListenerId = ++SVG.listenerId }\r\n\r\n events.split(SVG.regex.delimiter).forEach(function (event) {\r\n var ev = event.split('.')[0]\r\n var ns = event.split('.')[1] || '*'\r\n\r\n // ensure valid object\r\n bag[ev] = bag[ev] || {}\r\n bag[ev][ns] = bag[ev][ns] || {}\r\n\r\n // reference listener\r\n bag[ev][ns][listener._svgjsListenerId] = l\r\n\r\n // add listener\r\n n.addEventListener(ev, l, options || false)\r\n })\r\n}\r\n\r\n// Add event unbinder in the SVG namespace\r\nSVG.off = function (node, events, listener, options) {\r\n var n = node instanceof SVG.Element ? node.node : node\r\n if (!n.instance) return\r\n\r\n // listener can be a function or a number\r\n if (typeof listener === 'function') {\r\n listener = listener._svgjsListenerId\r\n if (!listener) return\r\n }\r\n\r\n var bag = n.instance._events\r\n\r\n ;(events || '').split(SVG.regex.delimiter).forEach(function (event) {\r\n var ev = event && event.split('.')[0]\r\n var ns = event && event.split('.')[1]\r\n var namespace, l\r\n\r\n if (listener) {\r\n // remove listener reference\r\n if (bag[ev] && bag[ev][ns || '*']) {\r\n // removeListener\r\n n.removeEventListener(ev, bag[ev][ns || '*'][listener], options || false)\r\n\r\n delete bag[ev][ns || '*'][listener]\r\n }\r\n } else if (ev && ns) {\r\n // remove all listeners for a namespaced event\r\n if (bag[ev] && bag[ev][ns]) {\r\n for (l in bag[ev][ns]) { SVG.off(n, [ev, ns].join('.'), l) }\r\n\r\n delete bag[ev][ns]\r\n }\r\n } else if (ns) {\r\n // remove all listeners for a specific namespace\r\n for (event in bag) {\r\n for (namespace in bag[event]) {\r\n if (ns === namespace) { SVG.off(n, [event, ns].join('.')) }\r\n }\r\n }\r\n } else if (ev) {\r\n // remove all listeners for the event\r\n if (bag[ev]) {\r\n for (namespace in bag[ev]) { SVG.off(n, [ev, namespace].join('.')) }\r\n\r\n delete bag[ev]\r\n }\r\n } else {\r\n // remove all listeners on a given node\r\n for (event in bag) { SVG.off(n, event) }\r\n\r\n n.instance._events = {}\r\n }\r\n })\r\n}\r\n\r\nSVG.extend(SVG.Element, {\r\n // Bind given event to listener\r\n on: function (event, listener, binding, options) {\r\n SVG.on(this, event, listener, binding, options)\r\n return this\r\n },\r\n // Unbind event from listener\r\n off: function (event, listener) {\r\n SVG.off(this.node, event, listener)\r\n return this\r\n },\r\n fire: function (event, data) {\r\n // Dispatch event\r\n if (event instanceof window.Event) {\r\n this.node.dispatchEvent(event)\r\n } else {\r\n this.node.dispatchEvent(event = new SVG.CustomEvent(event, {detail: data, cancelable: true}))\r\n }\r\n this._event = event\r\n return this\r\n },\r\n event: function() {\r\n return this._event\r\n }\r\n})\r\n\n\r\nSVG.Defs = SVG.invent({\r\n // Initialize node\r\n create: 'defs'\r\n\r\n // Inherit from\r\n, inherit: SVG.Container\r\n\r\n})\nSVG.G = SVG.invent({\r\n // Initialize node\r\n create: 'g'\r\n\r\n // Inherit from\r\n, inherit: SVG.Container\r\n\r\n // Add class methods\r\n, extend: {\r\n // Move over x-axis\r\n x: function(x) {\r\n return x == null ? this.transform('x') : this.transform({ x: x - this.x() }, true)\r\n }\r\n // Move over y-axis\r\n , y: function(y) {\r\n return y == null ? this.transform('y') : this.transform({ y: y - this.y() }, true)\r\n }\r\n // Move by center over x-axis\r\n , cx: function(x) {\r\n return x == null ? this.gbox().cx : this.x(x - this.gbox().width / 2)\r\n }\r\n // Move by center over y-axis\r\n , cy: function(y) {\r\n return y == null ? this.gbox().cy : this.y(y - this.gbox().height / 2)\r\n }\r\n , gbox: function() {\r\n\r\n var bbox = this.bbox()\r\n , trans = this.transform()\r\n\r\n bbox.x += trans.x\r\n bbox.x2 += trans.x\r\n bbox.cx += trans.x\r\n\r\n bbox.y += trans.y\r\n bbox.y2 += trans.y\r\n bbox.cy += trans.y\r\n\r\n return bbox\r\n }\r\n }\r\n\r\n // Add parent method\r\n, construct: {\r\n // Create a group element\r\n group: function() {\r\n return this.put(new SVG.G)\r\n }\r\n }\r\n})\r\n\nSVG.Doc = SVG.invent({\r\n // Initialize node\r\n create: function(element) {\r\n if (element) {\r\n // ensure the presence of a dom element\r\n element = typeof element == 'string' ?\r\n document.getElementById(element) :\r\n element\r\n\r\n // If the target is an svg element, use that element as the main wrapper.\r\n // This allows svg.js to work with svg documents as well.\r\n if (element.nodeName == 'svg') {\r\n this.constructor.call(this, element)\r\n } else {\r\n this.constructor.call(this, SVG.create('svg'))\r\n element.appendChild(this.node)\r\n this.size('100%', '100%')\r\n }\r\n\r\n // set svg element attributes and ensure defs node\r\n this.namespace().defs()\r\n }\r\n }\r\n\r\n // Inherit from\r\n, inherit: SVG.Container\r\n\r\n // Add class methods\r\n, extend: {\r\n // Add namespaces\r\n namespace: function() {\r\n return this\r\n .attr({ xmlns: SVG.ns, version: '1.1' })\r\n .attr('xmlns:xlink', SVG.xlink, SVG.xmlns)\r\n .attr('xmlns:svgjs', SVG.svgjs, SVG.xmlns)\r\n }\r\n // Creates and returns defs element\r\n , defs: function() {\r\n if (!this._defs) {\r\n var defs\r\n\r\n // Find or create a defs element in this instance\r\n if (defs = this.node.getElementsByTagName('defs')[0])\r\n this._defs = SVG.adopt(defs)\r\n else\r\n this._defs = new SVG.Defs\r\n\r\n // Make sure the defs node is at the end of the stack\r\n this.node.appendChild(this._defs.node)\r\n }\r\n\r\n return this._defs\r\n }\r\n // custom parent method\r\n , parent: function() {\r\n if(!this.node.parentNode || this.node.parentNode.nodeName == '#document' || this.node.parentNode.nodeName == '#document-fragment') return null\r\n return this.node.parentNode\r\n }\r\n // Fix for possible sub-pixel offset. See:\r\n // https://bugzilla.mozilla.org/show_bug.cgi?id=608812\r\n , spof: function() {\r\n var pos = this.node.getScreenCTM()\r\n\r\n if (pos)\r\n this\r\n .style('left', (-pos.e % 1) + 'px')\r\n .style('top', (-pos.f % 1) + 'px')\r\n\r\n return this\r\n }\r\n\r\n // Removes the doc from the DOM\r\n , remove: function() {\r\n if(this.parent()) {\r\n this.parent().removeChild(this.node)\r\n }\r\n\r\n return this\r\n }\r\n , clear: function() {\r\n // remove children\r\n while(this.node.hasChildNodes())\r\n this.node.removeChild(this.node.lastChild)\r\n\r\n // remove defs reference\r\n delete this._defs\r\n\r\n // add back parser\r\n if(!SVG.parser.draw.parentNode)\r\n this.node.appendChild(SVG.parser.draw)\r\n\r\n return this\r\n }\r\n , clone: function (parent) {\r\n // write dom data to the dom so the clone can pickup the data\r\n this.writeDataToDom()\r\n\r\n // get reference to node\r\n var node = this.node\r\n\r\n // clone element and assign new id\r\n var clone = assignNewId(node.cloneNode(true))\r\n\r\n // insert the clone in the given parent or after myself\r\n if(parent) {\r\n (parent.node || parent).appendChild(clone.node)\r\n } else {\r\n node.parentNode.insertBefore(clone.node, node.nextSibling)\r\n }\r\n\r\n return clone\r\n }\r\n }\r\n\r\n})\r\n\n// ### This module adds backward / forward functionality to elements.\r\n\r\n//\r\nSVG.extend(SVG.Element, {\r\n // Get all siblings, including myself\r\n siblings: function() {\r\n return this.parent().children()\r\n }\r\n // Get the curent position siblings\r\n, position: function() {\r\n return this.parent().index(this)\r\n }\r\n // Get the next element (will return null if there is none)\r\n, next: function() {\r\n return this.siblings()[this.position() + 1]\r\n }\r\n // Get the next element (will return null if there is none)\r\n, previous: function() {\r\n return this.siblings()[this.position() - 1]\r\n }\r\n // Send given element one step forward\r\n, forward: function() {\r\n var i = this.position() + 1\r\n , p = this.parent()\r\n\r\n // move node one step forward\r\n p.removeElement(this).add(this, i)\r\n\r\n // make sure defs node is always at the top\r\n if (p instanceof SVG.Doc)\r\n p.node.appendChild(p.defs().node)\r\n\r\n return this\r\n }\r\n // Send given element one step backward\r\n, backward: function() {\r\n var i = this.position()\r\n\r\n if (i > 0)\r\n this.parent().removeElement(this).add(this, i - 1)\r\n\r\n return this\r\n }\r\n // Send given element all the way to the front\r\n, front: function() {\r\n var p = this.parent()\r\n\r\n // Move node forward\r\n p.node.appendChild(this.node)\r\n\r\n // Make sure defs node is always at the top\r\n if (p instanceof SVG.Doc)\r\n p.node.appendChild(p.defs().node)\r\n\r\n return this\r\n }\r\n // Send given element all the way to the back\r\n, back: function() {\r\n if (this.position() > 0)\r\n this.parent().removeElement(this).add(this, 0)\r\n\r\n return this\r\n }\r\n // Inserts a given element before the targeted element\r\n, before: function(element) {\r\n element.remove()\r\n\r\n var i = this.position()\r\n\r\n this.parent().add(element, i)\r\n\r\n return this\r\n }\r\n // Insters a given element after the targeted element\r\n, after: function(element) {\r\n element.remove()\r\n\r\n var i = this.position()\r\n\r\n this.parent().add(element, i + 1)\r\n\r\n return this\r\n }\r\n\r\n})\nSVG.Mask = SVG.invent({\r\n // Initialize node\r\n create: function() {\r\n this.constructor.call(this, SVG.create('mask'))\r\n\r\n // keep references to masked elements\r\n this.targets = []\r\n }\r\n\r\n // Inherit from\r\n, inherit: SVG.Container\r\n\r\n // Add class methods\r\n, extend: {\r\n // Unmask all masked elements and remove itself\r\n remove: function() {\r\n // unmask all targets\r\n for (var i = this.targets.length - 1; i >= 0; i--)\r\n if (this.targets[i])\r\n this.targets[i].unmask()\r\n this.targets = []\r\n\r\n // remove mask from parent\r\n SVG.Element.prototype.remove.call(this)\r\n\r\n return this\r\n }\r\n }\r\n\r\n // Add parent method\r\n, construct: {\r\n // Create masking element\r\n mask: function() {\r\n return this.defs().put(new SVG.Mask)\r\n }\r\n }\r\n})\r\n\r\n\r\nSVG.extend(SVG.Element, {\r\n // Distribute mask to svg element\r\n maskWith: function(element) {\r\n // use given mask or create a new one\r\n this.masker = element instanceof SVG.Mask ? element : this.parent().mask().add(element)\r\n\r\n // store reverence on self in mask\r\n this.masker.targets.push(this)\r\n\r\n // apply mask\r\n return this.attr('mask', 'url(\"#' + this.masker.attr('id') + '\")')\r\n }\r\n // Unmask element\r\n, unmask: function() {\r\n delete this.masker\r\n return this.attr('mask', null)\r\n }\r\n\r\n})\r\n\nSVG.ClipPath = SVG.invent({\r\n // Initialize node\r\n create: function() {\r\n this.constructor.call(this, SVG.create('clipPath'))\r\n\r\n // keep references to clipped elements\r\n this.targets = []\r\n }\r\n\r\n // Inherit from\r\n, inherit: SVG.Container\r\n\r\n // Add class methods\r\n, extend: {\r\n // Unclip all clipped elements and remove itself\r\n remove: function() {\r\n // unclip all targets\r\n for (var i = this.targets.length - 1; i >= 0; i--)\r\n if (this.targets[i])\r\n this.targets[i].unclip()\r\n this.targets = []\r\n\r\n // remove clipPath from parent\r\n this.parent().removeElement(this)\r\n\r\n return this\r\n }\r\n }\r\n\r\n // Add parent method\r\n, construct: {\r\n // Create clipping element\r\n clip: function() {\r\n return this.defs().put(new SVG.ClipPath)\r\n }\r\n }\r\n})\r\n\r\n//\r\nSVG.extend(SVG.Element, {\r\n // Distribute clipPath to svg element\r\n clipWith: function(element) {\r\n // use given clip or create a new one\r\n this.clipper = element instanceof SVG.ClipPath ? element : this.parent().clip().add(element)\r\n\r\n // store reverence on self in mask\r\n this.clipper.targets.push(this)\r\n\r\n // apply mask\r\n return this.attr('clip-path', 'url(\"#' + this.clipper.attr('id') + '\")')\r\n }\r\n // Unclip element\r\n, unclip: function() {\r\n delete this.clipper\r\n return this.attr('clip-path', null)\r\n }\r\n\r\n})\nSVG.Gradient = SVG.invent({\r\n // Initialize node\r\n create: function(type) {\r\n this.constructor.call(this, SVG.create(type + 'Gradient'))\r\n\r\n // store type\r\n this.type = type\r\n }\r\n\r\n // Inherit from\r\n, inherit: SVG.Container\r\n\r\n // Add class methods\r\n, extend: {\r\n // Add a color stop\r\n at: function(offset, color, opacity) {\r\n return this.put(new SVG.Stop).update(offset, color, opacity)\r\n }\r\n // Update gradient\r\n , update: function(block) {\r\n // remove all stops\r\n this.clear()\r\n\r\n // invoke passed block\r\n if (typeof block == 'function')\r\n block.call(this, this)\r\n\r\n return this\r\n }\r\n // Return the fill id\r\n , fill: function() {\r\n return 'url(#' + this.id() + ')'\r\n }\r\n // Alias string convertion to fill\r\n , toString: function() {\r\n return this.fill()\r\n }\r\n // custom attr to handle transform\r\n , attr: function(a, b, c) {\r\n if(a == 'transform') a = 'gradientTransform'\r\n return SVG.Container.prototype.attr.call(this, a, b, c)\r\n }\r\n }\r\n\r\n // Add parent method\r\n, construct: {\r\n // Create gradient element in defs\r\n gradient: function(type, block) {\r\n return this.defs().gradient(type, block)\r\n }\r\n }\r\n})\r\n\r\n// Add animatable methods to both gradient and fx module\r\nSVG.extend(SVG.Gradient, SVG.FX, {\r\n // From position\r\n from: function(x, y) {\r\n return (this._target || this).type == 'radial' ?\r\n this.attr({ fx: new SVG.Number(x), fy: new SVG.Number(y) }) :\r\n this.attr({ x1: new SVG.Number(x), y1: new SVG.Number(y) })\r\n }\r\n // To position\r\n, to: function(x, y) {\r\n return (this._target || this).type == 'radial' ?\r\n this.attr({ cx: new SVG.Number(x), cy: new SVG.Number(y) }) :\r\n this.attr({ x2: new SVG.Number(x), y2: new SVG.Number(y) })\r\n }\r\n})\r\n\r\n// Base gradient generation\r\nSVG.extend(SVG.Defs, {\r\n // define gradient\r\n gradient: function(type, block) {\r\n return this.put(new SVG.Gradient(type)).update(block)\r\n }\r\n\r\n})\r\n\r\nSVG.Stop = SVG.invent({\r\n // Initialize node\r\n create: 'stop'\r\n\r\n // Inherit from\r\n, inherit: SVG.Element\r\n\r\n // Add class methods\r\n, extend: {\r\n // add color stops\r\n update: function(o) {\r\n if (typeof o == 'number' || o instanceof SVG.Number) {\r\n o = {\r\n offset: arguments[0]\r\n , color: arguments[1]\r\n , opacity: arguments[2]\r\n }\r\n }\r\n\r\n // set attributes\r\n if (o.opacity != null) this.attr('stop-opacity', o.opacity)\r\n if (o.color != null) this.attr('stop-color', o.color)\r\n if (o.offset != null) this.attr('offset', new SVG.Number(o.offset))\r\n\r\n return this\r\n }\r\n }\r\n\r\n})\r\n\nSVG.Pattern = SVG.invent({\r\n // Initialize node\r\n create: 'pattern'\r\n\r\n // Inherit from\r\n, inherit: SVG.Container\r\n\r\n // Add class methods\r\n, extend: {\r\n // Return the fill id\r\n fill: function() {\r\n return 'url(#' + this.id() + ')'\r\n }\r\n // Update pattern by rebuilding\r\n , update: function(block) {\r\n // remove content\r\n this.clear()\r\n\r\n // invoke passed block\r\n if (typeof block == 'function')\r\n block.call(this, this)\r\n\r\n return this\r\n }\r\n // Alias string convertion to fill\r\n , toString: function() {\r\n return this.fill()\r\n }\r\n // custom attr to handle transform\r\n , attr: function(a, b, c) {\r\n if(a == 'transform') a = 'patternTransform'\r\n return SVG.Container.prototype.attr.call(this, a, b, c)\r\n }\r\n\r\n }\r\n\r\n // Add parent method\r\n, construct: {\r\n // Create pattern element in defs\r\n pattern: function(width, height, block) {\r\n return this.defs().pattern(width, height, block)\r\n }\r\n }\r\n})\r\n\r\nSVG.extend(SVG.Defs, {\r\n // Define gradient\r\n pattern: function(width, height, block) {\r\n return this.put(new SVG.Pattern).update(block).attr({\r\n x: 0\r\n , y: 0\r\n , width: width\r\n , height: height\r\n , patternUnits: 'userSpaceOnUse'\r\n })\r\n }\r\n\r\n})\nSVG.Shape = SVG.invent({\r\n // Initialize node\r\n create: function(element) {\r\n this.constructor.call(this, element)\r\n }\r\n\r\n // Inherit from\r\n, inherit: SVG.Element\r\n\r\n})\n\r\nSVG.Bare = SVG.invent({\r\n // Initialize\r\n create: function(element, inherit) {\r\n // construct element\r\n this.constructor.call(this, SVG.create(element))\r\n\r\n // inherit custom methods\r\n if (inherit)\r\n for (var method in inherit.prototype)\r\n if (typeof inherit.prototype[method] === 'function')\r\n this[method] = inherit.prototype[method]\r\n }\r\n\r\n // Inherit from\r\n, inherit: SVG.Element\r\n\r\n // Add methods\r\n, extend: {\r\n // Insert some plain text\r\n words: function(text) {\r\n // remove contents\r\n while (this.node.hasChildNodes())\r\n this.node.removeChild(this.node.lastChild)\r\n\r\n // create text node\r\n this.node.appendChild(document.createTextNode(text))\r\n\r\n return this\r\n }\r\n }\r\n})\r\n\r\n\r\nSVG.extend(SVG.Parent, {\r\n // Create an element that is not described by SVG.js\r\n element: function(element, inherit) {\r\n return this.put(new SVG.Bare(element, inherit))\r\n }\r\n})\r\n\nSVG.Symbol = SVG.invent({\r\n // Initialize node\r\n create: 'symbol'\r\n\r\n // Inherit from\r\n, inherit: SVG.Container\r\n\r\n, construct: {\r\n // create symbol\r\n symbol: function() {\r\n return this.put(new SVG.Symbol)\r\n }\r\n }\r\n})\r\n\nSVG.Use = SVG.invent({\r\n // Initialize node\r\n create: 'use'\r\n\r\n // Inherit from\r\n, inherit: SVG.Shape\r\n\r\n // Add class methods\r\n, extend: {\r\n // Use element as a reference\r\n element: function(element, file) {\r\n // Set lined element\r\n return this.attr('href', (file || '') + '#' + element, SVG.xlink)\r\n }\r\n }\r\n\r\n // Add parent method\r\n, construct: {\r\n // Create a use element\r\n use: function(element, file) {\r\n return this.put(new SVG.Use).element(element, file)\r\n }\r\n }\r\n})\nSVG.Rect = SVG.invent({\r\n // Initialize node\r\n create: 'rect'\r\n\r\n // Inherit from\r\n, inherit: SVG.Shape\r\n\r\n // Add parent method\r\n, construct: {\r\n // Create a rect element\r\n rect: function(width, height) {\r\n return this.put(new SVG.Rect()).size(width, height)\r\n }\r\n }\r\n})\nSVG.Circle = SVG.invent({\r\n // Initialize node\r\n create: 'circle'\r\n\r\n // Inherit from\r\n, inherit: SVG.Shape\r\n\r\n // Add parent method\r\n, construct: {\r\n // Create circle element, based on ellipse\r\n circle: function(size) {\r\n return this.put(new SVG.Circle).rx(new SVG.Number(size).divide(2)).move(0, 0)\r\n }\r\n }\r\n})\r\n\r\nSVG.extend(SVG.Circle, SVG.FX, {\r\n // Radius x value\r\n rx: function(rx) {\r\n return this.attr('r', rx)\r\n }\r\n // Alias radius x value\r\n, ry: function(ry) {\r\n return this.rx(ry)\r\n }\r\n})\r\n\r\nSVG.Ellipse = SVG.invent({\r\n // Initialize node\r\n create: 'ellipse'\r\n\r\n // Inherit from\r\n, inherit: SVG.Shape\r\n\r\n // Add parent method\r\n, construct: {\r\n // Create an ellipse\r\n ellipse: function(width, height) {\r\n return this.put(new SVG.Ellipse).size(width, height).move(0, 0)\r\n }\r\n }\r\n})\r\n\r\nSVG.extend(SVG.Ellipse, SVG.Rect, SVG.FX, {\r\n // Radius x value\r\n rx: function(rx) {\r\n return this.attr('rx', rx)\r\n }\r\n // Radius y value\r\n, ry: function(ry) {\r\n return this.attr('ry', ry)\r\n }\r\n})\r\n\r\n// Add common method\r\nSVG.extend(SVG.Circle, SVG.Ellipse, {\r\n // Move over x-axis\r\n x: function(x) {\r\n return x == null ? this.cx() - this.rx() : this.cx(x + this.rx())\r\n }\r\n // Move over y-axis\r\n , y: function(y) {\r\n return y == null ? this.cy() - this.ry() : this.cy(y + this.ry())\r\n }\r\n // Move by center over x-axis\r\n , cx: function(x) {\r\n return x == null ? this.attr('cx') : this.attr('cx', x)\r\n }\r\n // Move by center over y-axis\r\n , cy: function(y) {\r\n return y == null ? this.attr('cy') : this.attr('cy', y)\r\n }\r\n // Set width of element\r\n , width: function(width) {\r\n return width == null ? this.rx() * 2 : this.rx(new SVG.Number(width).divide(2))\r\n }\r\n // Set height of element\r\n , height: function(height) {\r\n return height == null ? this.ry() * 2 : this.ry(new SVG.Number(height).divide(2))\r\n }\r\n // Custom size function\r\n , size: function(width, height) {\r\n var p = proportionalSize(this, width, height)\r\n\r\n return this\r\n .rx(new SVG.Number(p.width).divide(2))\r\n .ry(new SVG.Number(p.height).divide(2))\r\n }\r\n})\nSVG.Line = SVG.invent({\r\n // Initialize node\r\n create: 'line'\r\n\r\n // Inherit from\r\n, inherit: SVG.Shape\r\n\r\n // Add class methods\r\n, extend: {\r\n // Get array\r\n array: function() {\r\n return new SVG.PointArray([\r\n [ this.attr('x1'), this.attr('y1') ]\r\n , [ this.attr('x2'), this.attr('y2') ]\r\n ])\r\n }\r\n // Overwrite native plot() method\r\n , plot: function(x1, y1, x2, y2) {\r\n if (x1 == null)\r\n return this.array()\r\n else if (typeof y1 !== 'undefined')\r\n x1 = { x1: x1, y1: y1, x2: x2, y2: y2 }\r\n else\r\n x1 = new SVG.PointArray(x1).toLine()\r\n\r\n return this.attr(x1)\r\n }\r\n // Move by left top corner\r\n , move: function(x, y) {\r\n return this.attr(this.array().move(x, y).toLine())\r\n }\r\n // Set element size to given width and height\r\n , size: function(width, height) {\r\n var p = proportionalSize(this, width, height)\r\n\r\n return this.attr(this.array().size(p.width, p.height).toLine())\r\n }\r\n }\r\n\r\n // Add parent method\r\n, construct: {\r\n // Create a line element\r\n line: function(x1, y1, x2, y2) {\r\n // make sure plot is called as a setter\r\n // x1 is not necessarily a number, it can also be an array, a string and a SVG.PointArray\r\n return SVG.Line.prototype.plot.apply(\r\n this.put(new SVG.Line)\r\n , x1 != null ? [x1, y1, x2, y2] : [0, 0, 0, 0]\r\n )\r\n }\r\n }\r\n})\r\n\nSVG.Polyline = SVG.invent({\r\n // Initialize node\r\n create: 'polyline'\r\n\r\n // Inherit from\r\n, inherit: SVG.Shape\r\n\r\n // Add parent method\r\n, construct: {\r\n // Create a wrapped polyline element\r\n polyline: function(p) {\r\n // make sure plot is called as a setter\r\n return this.put(new SVG.Polyline).plot(p || new SVG.PointArray)\r\n }\r\n }\r\n})\r\n\r\nSVG.Polygon = SVG.invent({\r\n // Initialize node\r\n create: 'polygon'\r\n\r\n // Inherit from\r\n, inherit: SVG.Shape\r\n\r\n // Add parent method\r\n, construct: {\r\n // Create a wrapped polygon element\r\n polygon: function(p) {\r\n // make sure plot is called as a setter\r\n return this.put(new SVG.Polygon).plot(p || new SVG.PointArray)\r\n }\r\n }\r\n})\r\n\r\n// Add polygon-specific functions\r\nSVG.extend(SVG.Polyline, SVG.Polygon, {\r\n // Get array\r\n array: function() {\r\n return this._array || (this._array = new SVG.PointArray(this.attr('points')))\r\n }\r\n // Plot new path\r\n, plot: function(p) {\r\n return (p == null) ?\r\n this.array() :\r\n this.clear().attr('points', typeof p == 'string' ? p : (this._array = new SVG.PointArray(p)))\r\n }\r\n // Clear array cache\r\n, clear: function() {\r\n delete this._array\r\n return this\r\n }\r\n // Move by left top corner\r\n, move: function(x, y) {\r\n return this.attr('points', this.array().move(x, y))\r\n }\r\n // Set element size to given width and height\r\n, size: function(width, height) {\r\n var p = proportionalSize(this, width, height)\r\n\r\n return this.attr('points', this.array().size(p.width, p.height))\r\n }\r\n\r\n})\r\n\n// unify all point to point elements\r\nSVG.extend(SVG.Line, SVG.Polyline, SVG.Polygon, {\r\n // Define morphable array\r\n morphArray: SVG.PointArray\r\n // Move by left top corner over x-axis\r\n, x: function(x) {\r\n return x == null ? this.bbox().x : this.move(x, this.bbox().y)\r\n }\r\n // Move by left top corner over y-axis\r\n, y: function(y) {\r\n return y == null ? this.bbox().y : this.move(this.bbox().x, y)\r\n }\r\n // Set width of element\r\n, width: function(width) {\r\n var b = this.bbox()\r\n\r\n return width == null ? b.width : this.size(width, b.height)\r\n }\r\n // Set height of element\r\n, height: function(height) {\r\n var b = this.bbox()\r\n\r\n return height == null ? b.height : this.size(b.width, height)\r\n }\r\n})\nSVG.Path = SVG.invent({\r\n // Initialize node\r\n create: 'path'\r\n\r\n // Inherit from\r\n, inherit: SVG.Shape\r\n\r\n // Add class methods\r\n, extend: {\r\n // Define morphable array\r\n morphArray: SVG.PathArray\r\n // Get array\r\n , array: function() {\r\n return this._array || (this._array = new SVG.PathArray(this.attr('d')))\r\n }\r\n // Plot new path\r\n , plot: function(d) {\r\n return (d == null) ?\r\n this.array() :\r\n this.clear().attr('d', typeof d == 'string' ? d : (this._array = new SVG.PathArray(d)))\r\n }\r\n // Clear array cache\r\n , clear: function() {\r\n delete this._array\r\n return this\r\n }\r\n // Move by left top corner\r\n , move: function(x, y) {\r\n return this.attr('d', this.array().move(x, y))\r\n }\r\n // Move by left top corner over x-axis\r\n , x: function(x) {\r\n return x == null ? this.bbox().x : this.move(x, this.bbox().y)\r\n }\r\n // Move by left top corner over y-axis\r\n , y: function(y) {\r\n return y == null ? this.bbox().y : this.move(this.bbox().x, y)\r\n }\r\n // Set element size to given width and height\r\n , size: function(width, height) {\r\n var p = proportionalSize(this, width, height)\r\n\r\n return this.attr('d', this.array().size(p.width, p.height))\r\n }\r\n // Set width of element\r\n , width: function(width) {\r\n return width == null ? this.bbox().width : this.size(width, this.bbox().height)\r\n }\r\n // Set height of element\r\n , height: function(height) {\r\n return height == null ? this.bbox().height : this.size(this.bbox().width, height)\r\n }\r\n\r\n }\r\n\r\n // Add parent method\r\n, construct: {\r\n // Create a wrapped path element\r\n path: function(d) {\r\n // make sure plot is called as a setter\r\n return this.put(new SVG.Path).plot(d || new SVG.PathArray)\r\n }\r\n }\r\n})\r\n\nSVG.Image = SVG.invent({\r\n // Initialize node\r\n create: 'image'\r\n\r\n // Inherit from\r\n, inherit: SVG.Shape\r\n\r\n // Add class methods\r\n, extend: {\r\n // (re)load image\r\n load: function(url) {\r\n if (!url) return this\r\n\r\n var self = this\r\n , img = new window.Image()\r\n\r\n // preload image\r\n SVG.on(img, 'load', function() {\r\n SVG.off(img)\r\n\r\n var p = self.parent(SVG.Pattern)\r\n\r\n if(p === null) return\r\n\r\n // ensure image size\r\n if (self.width() == 0 && self.height() == 0)\r\n self.size(img.width, img.height)\r\n\r\n // ensure pattern size if not set\r\n if (p && p.width() == 0 && p.height() == 0)\r\n p.size(self.width(), self.height())\r\n\r\n // callback\r\n if (typeof self._loaded === 'function')\r\n self._loaded.call(self, {\r\n width: img.width\r\n , height: img.height\r\n , ratio: img.width / img.height\r\n , url: url\r\n })\r\n })\r\n\r\n SVG.on(img, 'error', function(e){\r\n SVG.off(img)\r\n\r\n if (typeof self._error === 'function'){\r\n self._error.call(self, e)\r\n }\r\n })\r\n\r\n return this.attr('href', (img.src = this.src = url), SVG.xlink)\r\n }\r\n // Add loaded callback\r\n , loaded: function(loaded) {\r\n this._loaded = loaded\r\n return this\r\n }\r\n\r\n , error: function(error) {\r\n this._error = error\r\n return this\r\n }\r\n }\r\n\r\n // Add parent method\r\n, construct: {\r\n // create image element, load image and set its size\r\n image: function(source, width, height) {\r\n return this.put(new SVG.Image).load(source).size(width || 0, height || width || 0)\r\n }\r\n }\r\n\r\n})\nSVG.Text = SVG.invent({\r\n // Initialize node\r\n create: function() {\r\n this.constructor.call(this, SVG.create('text'))\r\n\r\n this.dom.leading = new SVG.Number(1.3) // store leading value for rebuilding\r\n this._rebuild = true // enable automatic updating of dy values\r\n this._build = false // disable build mode for adding multiple lines\r\n\r\n // set default font\r\n this.attr('font-family', SVG.defaults.attrs['font-family'])\r\n }\r\n\r\n // Inherit from\r\n, inherit: SVG.Shape\r\n\r\n // Add class methods\r\n, extend: {\r\n // Move over x-axis\r\n x: function(x) {\r\n // act as getter\r\n if (x == null)\r\n return this.attr('x')\r\n\r\n return this.attr('x', x)\r\n }\r\n // Move over y-axis\r\n , y: function(y) {\r\n var oy = this.attr('y')\r\n , o = typeof oy === 'number' ? oy - this.bbox().y : 0\r\n\r\n // act as getter\r\n if (y == null)\r\n return typeof oy === 'number' ? oy - o : oy\r\n\r\n return this.attr('y', typeof y.valueOf() === 'number' ? y + o : y)\r\n }\r\n // Move center over x-axis\r\n , cx: function(x) {\r\n return x == null ? this.bbox().cx : this.x(x - this.bbox().width / 2)\r\n }\r\n // Move center over y-axis\r\n , cy: function(y) {\r\n return y == null ? this.bbox().cy : this.y(y - this.bbox().height / 2)\r\n }\r\n // Set the text content\r\n , text: function(text) {\r\n // act as getter\r\n if (typeof text === 'undefined'){\r\n var text = ''\r\n var children = this.node.childNodes\r\n for(var i = 0, len = children.length; i < len; ++i){\r\n\r\n // add newline if its not the first child and newLined is set to true\r\n if(i != 0 && children[i].nodeType != 3 && SVG.adopt(children[i]).dom.newLined == true){\r\n text += '\\n'\r\n }\r\n\r\n // add content of this node\r\n text += children[i].textContent\r\n }\r\n\r\n return text\r\n }\r\n\r\n // remove existing content\r\n this.clear().build(true)\r\n\r\n if (typeof text === 'function') {\r\n // call block\r\n text.call(this, this)\r\n\r\n } else {\r\n // store text and make sure text is not blank\r\n text = text.split('\\n')\r\n\r\n // build new lines\r\n for (var i = 0, il = text.length; i < il; i++)\r\n this.tspan(text[i]).newLine()\r\n }\r\n\r\n // disable build mode and rebuild lines\r\n return this.build(false).rebuild()\r\n }\r\n // Set font size\r\n , size: function(size) {\r\n return this.attr('font-size', size).rebuild()\r\n }\r\n // Set / get leading\r\n , leading: function(value) {\r\n // act as getter\r\n if (value == null)\r\n return this.dom.leading\r\n\r\n // act as setter\r\n this.dom.leading = new SVG.Number(value)\r\n\r\n return this.rebuild()\r\n }\r\n // Get all the first level lines\r\n , lines: function() {\r\n var node = (this.textPath && this.textPath() || this).node\r\n\r\n // filter tspans and map them to SVG.js instances\r\n var lines = SVG.utils.map(SVG.utils.filterSVGElements(node.childNodes), function(el){\r\n return SVG.adopt(el)\r\n })\r\n\r\n // return an instance of SVG.set\r\n return new SVG.Set(lines)\r\n }\r\n // Rebuild appearance type\r\n , rebuild: function(rebuild) {\r\n // store new rebuild flag if given\r\n if (typeof rebuild == 'boolean')\r\n this._rebuild = rebuild\r\n\r\n // define position of all lines\r\n if (this._rebuild) {\r\n var self = this\r\n , blankLineOffset = 0\r\n , dy = this.dom.leading * new SVG.Number(this.attr('font-size'))\r\n\r\n this.lines().each(function() {\r\n if (this.dom.newLined) {\r\n if (!self.textPath())\r\n this.attr('x', self.attr('x'))\r\n if(this.text() == '\\n') {\r\n blankLineOffset += dy\r\n }else{\r\n this.attr('dy', dy + blankLineOffset)\r\n blankLineOffset = 0\r\n }\r\n }\r\n })\r\n\r\n this.fire('rebuild')\r\n }\r\n\r\n return this\r\n }\r\n // Enable / disable build mode\r\n , build: function(build) {\r\n this._build = !!build\r\n return this\r\n }\r\n // overwrite method from parent to set data properly\r\n , setData: function(o){\r\n this.dom = o\r\n this.dom.leading = new SVG.Number(o.leading || 1.3)\r\n return this\r\n }\r\n }\r\n\r\n // Add parent method\r\n, construct: {\r\n // Create text element\r\n text: function(text) {\r\n return this.put(new SVG.Text).text(text)\r\n }\r\n // Create plain text element\r\n , plain: function(text) {\r\n return this.put(new SVG.Text).plain(text)\r\n }\r\n }\r\n\r\n})\r\n\r\nSVG.Tspan = SVG.invent({\r\n // Initialize node\r\n create: 'tspan'\r\n\r\n // Inherit from\r\n, inherit: SVG.Shape\r\n\r\n // Add class methods\r\n, extend: {\r\n // Set text content\r\n text: function(text) {\r\n if(text == null) return this.node.textContent + (this.dom.newLined ? '\\n' : '')\r\n\r\n typeof text === 'function' ? text.call(this, this) : this.plain(text)\r\n\r\n return this\r\n }\r\n // Shortcut dx\r\n , dx: function(dx) {\r\n return this.attr('dx', dx)\r\n }\r\n // Shortcut dy\r\n , dy: function(dy) {\r\n return this.attr('dy', dy)\r\n }\r\n // Create new line\r\n , newLine: function() {\r\n // fetch text parent\r\n var t = this.parent(SVG.Text)\r\n\r\n // mark new line\r\n this.dom.newLined = true\r\n\r\n // apply new hy¡n\r\n return this.dy(t.dom.leading * t.attr('font-size')).attr('x', t.x())\r\n }\r\n }\r\n\r\n})\r\n\r\nSVG.extend(SVG.Text, SVG.Tspan, {\r\n // Create plain text node\r\n plain: function(text) {\r\n // clear if build mode is disabled\r\n if (this._build === false)\r\n this.clear()\r\n\r\n // create text node\r\n this.node.appendChild(document.createTextNode(text))\r\n\r\n return this\r\n }\r\n // Create a tspan\r\n, tspan: function(text) {\r\n var node = (this.textPath && this.textPath() || this).node\r\n , tspan = new SVG.Tspan\r\n\r\n // clear if build mode is disabled\r\n if (this._build === false)\r\n this.clear()\r\n\r\n // add new tspan\r\n node.appendChild(tspan.node)\r\n\r\n return tspan.text(text)\r\n }\r\n // Clear all lines\r\n, clear: function() {\r\n var node = (this.textPath && this.textPath() || this).node\r\n\r\n // remove existing child nodes\r\n while (node.hasChildNodes())\r\n node.removeChild(node.lastChild)\r\n\r\n return this\r\n }\r\n // Get length of text element\r\n, length: function() {\r\n return this.node.getComputedTextLength()\r\n }\r\n})\r\n\nSVG.TextPath = SVG.invent({\r\n // Initialize node\r\n create: 'textPath'\r\n\r\n // Inherit from\r\n, inherit: SVG.Parent\r\n\r\n // Define parent class\r\n, parent: SVG.Text\r\n\r\n // Add parent method\r\n, construct: {\r\n morphArray: SVG.PathArray\r\n // Create path for text to run on\r\n , path: function(d) {\r\n // create textPath element\r\n var path = new SVG.TextPath\r\n , track = this.doc().defs().path(d)\r\n\r\n // move lines to textpath\r\n while (this.node.hasChildNodes())\r\n path.node.appendChild(this.node.firstChild)\r\n\r\n // add textPath element as child node\r\n this.node.appendChild(path.node)\r\n\r\n // link textPath to path and add content\r\n path.attr('href', '#' + track, SVG.xlink)\r\n\r\n return this\r\n }\r\n // return the array of the path track element\r\n , array: function() {\r\n var track = this.track()\r\n\r\n return track ? track.array() : null\r\n }\r\n // Plot path if any\r\n , plot: function(d) {\r\n var track = this.track()\r\n , pathArray = null\r\n\r\n if (track) {\r\n pathArray = track.plot(d)\r\n }\r\n\r\n return (d == null) ? pathArray : this\r\n }\r\n // Get the path track element\r\n , track: function() {\r\n var path = this.textPath()\r\n\r\n if (path)\r\n return path.reference('href')\r\n }\r\n // Get the textPath child\r\n , textPath: function() {\r\n if (this.node.firstChild && this.node.firstChild.nodeName == 'textPath')\r\n return SVG.adopt(this.node.firstChild)\r\n }\r\n }\r\n})\r\n\nSVG.Nested = SVG.invent({\r\n // Initialize node\r\n create: function() {\r\n this.constructor.call(this, SVG.create('svg'))\r\n\r\n this.style('overflow', 'visible')\r\n }\r\n\r\n // Inherit from\r\n, inherit: SVG.Container\r\n\r\n // Add parent method\r\n, construct: {\r\n // Create nested svg document\r\n nested: function() {\r\n return this.put(new SVG.Nested)\r\n }\r\n }\r\n})\nSVG.A = SVG.invent({\r\n // Initialize node\r\n create: 'a'\r\n\r\n // Inherit from\r\n, inherit: SVG.Container\r\n\r\n // Add class methods\r\n, extend: {\r\n // Link url\r\n to: function(url) {\r\n return this.attr('href', url, SVG.xlink)\r\n }\r\n // Link show attribute\r\n , show: function(target) {\r\n return this.attr('show', target, SVG.xlink)\r\n }\r\n // Link target attribute\r\n , target: function(target) {\r\n return this.attr('target', target)\r\n }\r\n }\r\n\r\n // Add parent method\r\n, construct: {\r\n // Create a hyperlink element\r\n link: function(url) {\r\n return this.put(new SVG.A).to(url)\r\n }\r\n }\r\n})\r\n\r\nSVG.extend(SVG.Element, {\r\n // Create a hyperlink element\r\n linkTo: function(url) {\r\n var link = new SVG.A\r\n\r\n if (typeof url == 'function')\r\n url.call(link, link)\r\n else\r\n link.to(url)\r\n\r\n return this.parent().put(link).put(this)\r\n }\r\n\r\n})\nSVG.Marker = SVG.invent({\r\n // Initialize node\r\n create: 'marker'\r\n\r\n // Inherit from\r\n, inherit: SVG.Container\r\n\r\n // Add class methods\r\n, extend: {\r\n // Set width of element\r\n width: function(width) {\r\n return this.attr('markerWidth', width)\r\n }\r\n // Set height of element\r\n , height: function(height) {\r\n return this.attr('markerHeight', height)\r\n }\r\n // Set marker refX and refY\r\n , ref: function(x, y) {\r\n return this.attr('refX', x).attr('refY', y)\r\n }\r\n // Update marker\r\n , update: function(block) {\r\n // remove all content\r\n this.clear()\r\n\r\n // invoke passed block\r\n if (typeof block == 'function')\r\n block.call(this, this)\r\n\r\n return this\r\n }\r\n // Return the fill id\r\n , toString: function() {\r\n return 'url(#' + this.id() + ')'\r\n }\r\n }\r\n\r\n // Add parent method\r\n, construct: {\r\n marker: function(width, height, block) {\r\n // Create marker element in defs\r\n return this.defs().marker(width, height, block)\r\n }\r\n }\r\n\r\n})\r\n\r\nSVG.extend(SVG.Defs, {\r\n // Create marker\r\n marker: function(width, height, block) {\r\n // Set default viewbox to match the width and height, set ref to cx and cy and set orient to auto\r\n return this.put(new SVG.Marker)\r\n .size(width, height)\r\n .ref(width / 2, height / 2)\r\n .viewbox(0, 0, width, height)\r\n .attr('orient', 'auto')\r\n .update(block)\r\n }\r\n\r\n})\r\n\r\nSVG.extend(SVG.Line, SVG.Polyline, SVG.Polygon, SVG.Path, {\r\n // Create and attach markers\r\n marker: function(marker, width, height, block) {\r\n var attr = ['marker']\r\n\r\n // Build attribute name\r\n if (marker != 'all') attr.push(marker)\r\n attr = attr.join('-')\r\n\r\n // Set marker attribute\r\n marker = arguments[1] instanceof SVG.Marker ?\r\n arguments[1] :\r\n this.doc().marker(width, height, block)\r\n\r\n return this.attr(attr, marker)\r\n }\r\n\r\n})\n// Define list of available attributes for stroke and fill\r\nvar sugar = {\r\n stroke: ['color', 'width', 'opacity', 'linecap', 'linejoin', 'miterlimit', 'dasharray', 'dashoffset']\r\n, fill: ['color', 'opacity', 'rule']\r\n, prefix: function(t, a) {\r\n return a == 'color' ? t : t + '-' + a\r\n }\r\n}\r\n\r\n// Add sugar for fill and stroke\r\n;['fill', 'stroke'].forEach(function(m) {\r\n var i, extension = {}\r\n\r\n extension[m] = function(o) {\r\n if (typeof o == 'undefined')\r\n return this\r\n if (typeof o == 'string' || SVG.Color.isRgb(o) || (o && typeof o.fill === 'function'))\r\n this.attr(m, o)\r\n\r\n else\r\n // set all attributes from sugar.fill and sugar.stroke list\r\n for (i = sugar[m].length - 1; i >= 0; i--)\r\n if (o[sugar[m][i]] != null)\r\n this.attr(sugar.prefix(m, sugar[m][i]), o[sugar[m][i]])\r\n\r\n return this\r\n }\r\n\r\n SVG.extend(SVG.Element, SVG.FX, extension)\r\n\r\n})\r\n\r\nSVG.extend(SVG.Element, SVG.FX, {\r\n // Map rotation to transform\r\n rotate: function(d, cx, cy) {\r\n return this.transform({ rotation: d, cx: cx, cy: cy })\r\n }\r\n // Map skew to transform\r\n, skew: function(x, y, cx, cy) {\r\n return arguments.length == 1 || arguments.length == 3 ?\r\n this.transform({ skew: x, cx: y, cy: cx }) :\r\n this.transform({ skewX: x, skewY: y, cx: cx, cy: cy })\r\n }\r\n // Map scale to transform\r\n, scale: function(x, y, cx, cy) {\r\n return arguments.length == 1 || arguments.length == 3 ?\r\n this.transform({ scale: x, cx: y, cy: cx }) :\r\n this.transform({ scaleX: x, scaleY: y, cx: cx, cy: cy })\r\n }\r\n // Map translate to transform\r\n, translate: function(x, y) {\r\n return this.transform({ x: x, y: y })\r\n }\r\n // Map flip to transform\r\n, flip: function(a, o) {\r\n o = typeof a == 'number' ? a : o\r\n return this.transform({ flip: a || 'both', offset: o })\r\n }\r\n // Map matrix to transform\r\n, matrix: function(m) {\r\n return this.attr('transform', new SVG.Matrix(arguments.length == 6 ? [].slice.call(arguments) : m))\r\n }\r\n // Opacity\r\n, opacity: function(value) {\r\n return this.attr('opacity', value)\r\n }\r\n // Relative move over x axis\r\n, dx: function(x) {\r\n return this.x(new SVG.Number(x).plus(this instanceof SVG.FX ? 0 : this.x()), true)\r\n }\r\n // Relative move over y axis\r\n, dy: function(y) {\r\n return this.y(new SVG.Number(y).plus(this instanceof SVG.FX ? 0 : this.y()), true)\r\n }\r\n // Relative move over x and y axes\r\n, dmove: function(x, y) {\r\n return this.dx(x).dy(y)\r\n }\r\n})\r\n\r\nSVG.extend(SVG.Rect, SVG.Ellipse, SVG.Circle, SVG.Gradient, SVG.FX, {\r\n // Add x and y radius\r\n radius: function(x, y) {\r\n var type = (this._target || this).type;\r\n return type == 'radial' || type == 'circle' ?\r\n this.attr('r', new SVG.Number(x)) :\r\n this.rx(x).ry(y == null ? x : y)\r\n }\r\n})\r\n\r\nSVG.extend(SVG.Path, {\r\n // Get path length\r\n length: function() {\r\n return this.node.getTotalLength()\r\n }\r\n // Get point at length\r\n, pointAt: function(length) {\r\n return this.node.getPointAtLength(length)\r\n }\r\n})\r\n\r\nSVG.extend(SVG.Parent, SVG.Text, SVG.Tspan, SVG.FX, {\r\n // Set font\r\n font: function(a, v) {\r\n if (typeof a == 'object') {\r\n for (v in a) this.font(v, a[v])\r\n }\r\n\r\n return a == 'leading' ?\r\n this.leading(v) :\r\n a == 'anchor' ?\r\n this.attr('text-anchor', v) :\r\n a == 'size' || a == 'family' || a == 'weight' || a == 'stretch' || a == 'variant' || a == 'style' ?\r\n this.attr('font-'+ a, v) :\r\n this.attr(a, v)\r\n }\r\n})\r\n\nSVG.Set = SVG.invent({\r\n // Initialize\r\n create: function(members) {\r\n if (members instanceof SVG.Set) {\r\n this.members = members.members.slice()\r\n } else {\r\n Array.isArray(members) ? this.members = members : this.clear()\r\n }\r\n }\r\n\r\n // Add class methods\r\n, extend: {\r\n // Add element to set\r\n add: function() {\r\n var i, il, elements = [].slice.call(arguments)\r\n\r\n for (i = 0, il = elements.length; i < il; i++)\r\n this.members.push(elements[i])\r\n\r\n return this\r\n }\r\n // Remove element from set\r\n , remove: function(element) {\r\n var i = this.index(element)\r\n\r\n // remove given child\r\n if (i > -1)\r\n this.members.splice(i, 1)\r\n\r\n return this\r\n }\r\n // Iterate over all members\r\n , each: function(block) {\r\n for (var i = 0, il = this.members.length; i < il; i++)\r\n block.apply(this.members[i], [i, this.members])\r\n\r\n return this\r\n }\r\n // Restore to defaults\r\n , clear: function() {\r\n // initialize store\r\n this.members = []\r\n\r\n return this\r\n }\r\n // Get the length of a set\r\n , length: function() {\r\n return this.members.length\r\n }\r\n // Checks if a given element is present in set\r\n , has: function(element) {\r\n return this.index(element) >= 0\r\n }\r\n // retuns index of given element in set\r\n , index: function(element) {\r\n return this.members.indexOf(element)\r\n }\r\n // Get member at given index\r\n , get: function(i) {\r\n return this.members[i]\r\n }\r\n // Get first member\r\n , first: function() {\r\n return this.get(0)\r\n }\r\n // Get last member\r\n , last: function() {\r\n return this.get(this.members.length - 1)\r\n }\r\n // Default value\r\n , valueOf: function() {\r\n return this.members\r\n }\r\n // Get the bounding box of all members included or empty box if set has no items\r\n , bbox: function(){\r\n // return an empty box of there are no members\r\n if (this.members.length == 0)\r\n return new SVG.RBox()\r\n\r\n // get the first rbox and update the target bbox\r\n var rbox = this.members[0].rbox(this.members[0].doc())\r\n\r\n this.each(function() {\r\n // user rbox for correct position and visual representation\r\n rbox = rbox.merge(this.rbox(this.doc()))\r\n })\r\n\r\n return rbox\r\n }\r\n }\r\n\r\n // Add parent method\r\n, construct: {\r\n // Create a new set\r\n set: function(members) {\r\n return new SVG.Set(members)\r\n }\r\n }\r\n})\r\n\r\nSVG.FX.Set = SVG.invent({\r\n // Initialize node\r\n create: function(set) {\r\n // store reference to set\r\n this.set = set\r\n }\r\n\r\n})\r\n\r\n// Alias methods\r\nSVG.Set.inherit = function() {\r\n var m\r\n , methods = []\r\n\r\n // gather shape methods\r\n for(var m in SVG.Shape.prototype)\r\n if (typeof SVG.Shape.prototype[m] == 'function' && typeof SVG.Set.prototype[m] != 'function')\r\n methods.push(m)\r\n\r\n // apply shape aliasses\r\n methods.forEach(function(method) {\r\n SVG.Set.prototype[method] = function() {\r\n for (var i = 0, il = this.members.length; i < il; i++)\r\n if (this.members[i] && typeof this.members[i][method] == 'function')\r\n this.members[i][method].apply(this.members[i], arguments)\r\n\r\n return method == 'animate' ? (this.fx || (this.fx = new SVG.FX.Set(this))) : this\r\n }\r\n })\r\n\r\n // clear methods for the next round\r\n methods = []\r\n\r\n // gather fx methods\r\n for(var m in SVG.FX.prototype)\r\n if (typeof SVG.FX.prototype[m] == 'function' && typeof SVG.FX.Set.prototype[m] != 'function')\r\n methods.push(m)\r\n\r\n // apply fx aliasses\r\n methods.forEach(function(method) {\r\n SVG.FX.Set.prototype[method] = function() {\r\n for (var i = 0, il = this.set.members.length; i < il; i++)\r\n this.set.members[i].fx[method].apply(this.set.members[i].fx, arguments)\r\n\r\n return this\r\n }\r\n })\r\n}\r\n\n\r\nSVG.extend(SVG.Element, {\r\n // Store data values on svg nodes\r\n data: function(a, v, r) {\r\n if (typeof a == 'object') {\r\n for (v in a)\r\n this.data(v, a[v])\r\n\r\n } else if (arguments.length < 2) {\r\n try {\r\n return JSON.parse(this.attr('data-' + a))\r\n } catch(e) {\r\n return this.attr('data-' + a)\r\n }\r\n\r\n } else {\r\n this.attr(\r\n 'data-' + a\r\n , v === null ?\r\n null :\r\n r === true || typeof v === 'string' || typeof v === 'number' ?\r\n v :\r\n JSON.stringify(v)\r\n )\r\n }\r\n\r\n return this\r\n }\r\n})\nSVG.extend(SVG.Element, {\r\n // Remember arbitrary data\r\n remember: function(k, v) {\r\n // remember every item in an object individually\r\n if (typeof arguments[0] == 'object')\r\n for (var v in k)\r\n this.remember(v, k[v])\r\n\r\n // retrieve memory\r\n else if (arguments.length == 1)\r\n return this.memory()[k]\r\n\r\n // store memory\r\n else\r\n this.memory()[k] = v\r\n\r\n return this\r\n }\r\n\r\n // Erase a given memory\r\n, forget: function() {\r\n if (arguments.length == 0)\r\n this._memory = {}\r\n else\r\n for (var i = arguments.length - 1; i >= 0; i--)\r\n delete this.memory()[arguments[i]]\r\n\r\n return this\r\n }\r\n\r\n // Initialize or return local memory object\r\n, memory: function() {\r\n return this._memory || (this._memory = {})\r\n }\r\n\r\n})\n// Method for getting an element by id\r\nSVG.get = function(id) {\r\n var node = document.getElementById(idFromReference(id) || id)\r\n return SVG.adopt(node)\r\n}\r\n\r\n// Select elements by query string\r\nSVG.select = function(query, parent) {\r\n return new SVG.Set(\r\n SVG.utils.map((parent || document).querySelectorAll(query), function(node) {\r\n return SVG.adopt(node)\r\n })\r\n )\r\n}\r\n\r\nSVG.extend(SVG.Parent, {\r\n // Scoped select method\r\n select: function(query) {\r\n return SVG.select(query, this.node)\r\n }\r\n\r\n})\nfunction pathRegReplace(a, b, c, d) {\r\n return c + d.replace(SVG.regex.dots, ' .')\r\n}\r\n\r\n// creates deep clone of array\r\nfunction array_clone(arr){\r\n var clone = arr.slice(0)\r\n for(var i = clone.length; i--;){\r\n if(Array.isArray(clone[i])){\r\n clone[i] = array_clone(clone[i])\r\n }\r\n }\r\n return clone\r\n}\r\n\r\n// tests if a given element is instance of an object\r\nfunction is(el, obj){\r\n return el instanceof obj\r\n}\r\n\r\n// tests if a given selector matches an element\r\nfunction matches(el, selector) {\r\n return (el.matches || el.matchesSelector || el.msMatchesSelector || el.mozMatchesSelector || el.webkitMatchesSelector || el.oMatchesSelector).call(el, selector);\r\n}\r\n\r\n// Convert dash-separated-string to camelCase\r\nfunction camelCase(s) {\r\n return s.toLowerCase().replace(/-(.)/g, function(m, g) {\r\n return g.toUpperCase()\r\n })\r\n}\r\n\r\n// Capitalize first letter of a string\r\nfunction capitalize(s) {\r\n return s.charAt(0).toUpperCase() + s.slice(1)\r\n}\r\n\r\n// Ensure to six-based hex\r\nfunction fullHex(hex) {\r\n return hex.length == 4 ?\r\n [ '#',\r\n hex.substring(1, 2), hex.substring(1, 2)\r\n , hex.substring(2, 3), hex.substring(2, 3)\r\n , hex.substring(3, 4), hex.substring(3, 4)\r\n ].join('') : hex\r\n}\r\n\r\n// Component to hex value\r\nfunction compToHex(comp) {\r\n var hex = comp.toString(16)\r\n return hex.length == 1 ? '0' + hex : hex\r\n}\r\n\r\n// Calculate proportional width and height values when necessary\r\nfunction proportionalSize(element, width, height) {\r\n if (width == null || height == null) {\r\n var box = element.bbox()\r\n\r\n if (width == null)\r\n width = box.width / box.height * height\r\n else if (height == null)\r\n height = box.height / box.width * width\r\n }\r\n\r\n return {\r\n width: width\r\n , height: height\r\n }\r\n}\r\n\r\n// Delta transform point\r\nfunction deltaTransformPoint(matrix, x, y) {\r\n return {\r\n x: x * matrix.a + y * matrix.c + 0\r\n , y: x * matrix.b + y * matrix.d + 0\r\n }\r\n}\r\n\r\n// Map matrix array to object\r\nfunction arrayToMatrix(a) {\r\n return { a: a[0], b: a[1], c: a[2], d: a[3], e: a[4], f: a[5] }\r\n}\r\n\r\n// Parse matrix if required\r\nfunction parseMatrix(matrix) {\r\n if (!(matrix instanceof SVG.Matrix))\r\n matrix = new SVG.Matrix(matrix)\r\n\r\n return matrix\r\n}\r\n\r\n// Add centre point to transform object\r\nfunction ensureCentre(o, target) {\r\n o.cx = o.cx == null ? target.bbox().cx : o.cx\r\n o.cy = o.cy == null ? target.bbox().cy : o.cy\r\n}\r\n\r\n// PathArray Helpers\r\nfunction arrayToString(a) {\r\n for (var i = 0, il = a.length, s = ''; i < il; i++) {\r\n s += a[i][0]\r\n\r\n if (a[i][1] != null) {\r\n s += a[i][1]\r\n\r\n if (a[i][2] != null) {\r\n s += ' '\r\n s += a[i][2]\r\n\r\n if (a[i][3] != null) {\r\n s += ' '\r\n s += a[i][3]\r\n s += ' '\r\n s += a[i][4]\r\n\r\n if (a[i][5] != null) {\r\n s += ' '\r\n s += a[i][5]\r\n s += ' '\r\n s += a[i][6]\r\n\r\n if (a[i][7] != null) {\r\n s += ' '\r\n s += a[i][7]\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return s + ' '\r\n}\r\n\r\n// Deep new id assignment\r\nfunction assignNewId(node) {\r\n // do the same for SVG child nodes as well\r\n for (var i = node.childNodes.length - 1; i >= 0; i--)\r\n if (node.childNodes[i] instanceof window.SVGElement)\r\n assignNewId(node.childNodes[i])\r\n\r\n return SVG.adopt(node).id(SVG.eid(node.nodeName))\r\n}\r\n\r\n// Add more bounding box properties\r\nfunction fullBox(b) {\r\n if (b.x == null) {\r\n b.x = 0\r\n b.y = 0\r\n b.width = 0\r\n b.height = 0\r\n }\r\n\r\n b.w = b.width\r\n b.h = b.height\r\n b.x2 = b.x + b.width\r\n b.y2 = b.y + b.height\r\n b.cx = b.x + b.width / 2\r\n b.cy = b.y + b.height / 2\r\n\r\n return b\r\n}\r\n\r\n// Get id from reference string\r\nfunction idFromReference(url) {\r\n var m = (url || '').toString().match(SVG.regex.reference)\r\n\r\n if (m) return m[1]\r\n}\r\n\r\n// If values like 1e-88 are passed, this is not a valid 32 bit float,\r\n// but in those cases, we are so close to 0 that 0 works well!\r\nfunction float32String(v) {\r\n return Math.abs(v) > 1e-37 ? v : 0\r\n}\r\n\r\n// Create matrix array for looping\r\nvar abcdef = 'abcdef'.split('')\r\n\n// Add CustomEvent to IE9 and IE10\r\nif (typeof window.CustomEvent !== 'function') {\r\n // Code from: https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent\r\n var CustomEventPoly = function(event, options) {\r\n options = options || { bubbles: false, cancelable: false, detail: undefined }\r\n var e = document.createEvent('CustomEvent')\r\n e.initCustomEvent(event, options.bubbles, options.cancelable, options.detail)\r\n return e\r\n }\r\n\r\n CustomEventPoly.prototype = window.Event.prototype\r\n\r\n SVG.CustomEvent = CustomEventPoly\r\n} else {\r\n SVG.CustomEvent = window.CustomEvent\r\n}\r\n\r\n// requestAnimationFrame / cancelAnimationFrame Polyfill with fallback based on Paul Irish\r\n(function(w) {\r\n var lastTime = 0\r\n var vendors = ['moz', 'webkit']\r\n\r\n for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {\r\n w.requestAnimationFrame = w[vendors[x] + 'RequestAnimationFrame']\r\n w.cancelAnimationFrame = w[vendors[x] + 'CancelAnimationFrame'] ||\r\n w[vendors[x] + 'CancelRequestAnimationFrame']\r\n }\r\n\r\n w.requestAnimationFrame = w.requestAnimationFrame ||\r\n function(callback) {\r\n var currTime = new Date().getTime()\r\n var timeToCall = Math.max(0, 16 - (currTime - lastTime))\r\n\r\n var id = w.setTimeout(function() {\r\n callback(currTime + timeToCall)\r\n }, timeToCall)\r\n\r\n lastTime = currTime + timeToCall\r\n return id\r\n }\r\n\r\n w.cancelAnimationFrame = w.cancelAnimationFrame || w.clearTimeout;\r\n\r\n}(window))\r\n\r\nreturn SVG\r\n\r\n}));\r","/*! svg.draggable.js - v2.2.2 - 2019-01-08\r\n* https://github.com/svgdotjs/svg.draggable.js\r\n* Copyright (c) 2019 Wout Fierens; Licensed MIT */\r\n;(function() {\r\n\r\n // creates handler, saves it\r\n function DragHandler(el){\r\n el.remember('_draggable', this)\r\n this.el = el\r\n }\r\n\r\n\r\n // Sets new parameter, starts dragging\r\n DragHandler.prototype.init = function(constraint, val){\r\n var _this = this\r\n this.constraint = constraint\r\n this.value = val\r\n this.el.on('mousedown.drag', function(e){ _this.start(e) })\r\n this.el.on('touchstart.drag', function(e){ _this.start(e) })\r\n }\r\n\r\n // transforms one point from screen to user coords\r\n DragHandler.prototype.transformPoint = function(event, offset){\r\n event = event || window.event\r\n var touches = event.changedTouches && event.changedTouches[0] || event\r\n this.p.x = touches.clientX - (offset || 0)\r\n this.p.y = touches.clientY\r\n return this.p.matrixTransform(this.m)\r\n }\r\n\r\n // gets elements bounding box with special handling of groups, nested and use\r\n DragHandler.prototype.getBBox = function(){\r\n\r\n var box = this.el.bbox()\r\n\r\n if(this.el instanceof SVG.Nested) box = this.el.rbox()\r\n\r\n if (this.el instanceof SVG.G || this.el instanceof SVG.Use || this.el instanceof SVG.Nested) {\r\n box.x = this.el.x()\r\n box.y = this.el.y()\r\n }\r\n\r\n return box\r\n }\r\n\r\n // start dragging\r\n DragHandler.prototype.start = function(e){\r\n\r\n // check for left button\r\n if(e.type == 'click'|| e.type == 'mousedown' || e.type == 'mousemove'){\r\n if((e.which || e.buttons) != 1){\r\n return\r\n }\r\n }\r\n\r\n var _this = this\r\n\r\n // fire beforedrag event\r\n this.el.fire('beforedrag', { event: e, handler: this })\r\n if(this.el.event().defaultPrevented) return;\r\n\r\n // prevent browser drag behavior as soon as possible\r\n e.preventDefault();\r\n\r\n // prevent propagation to a parent that might also have dragging enabled\r\n e.stopPropagation();\r\n\r\n // search for parent on the fly to make sure we can call\r\n // draggable() even when element is not in the dom currently\r\n this.parent = this.parent || this.el.parent(SVG.Nested) || this.el.parent(SVG.Doc)\r\n this.p = this.parent.node.createSVGPoint()\r\n\r\n // save current transformation matrix\r\n this.m = this.el.node.getScreenCTM().inverse()\r\n\r\n var box = this.getBBox()\r\n\r\n var anchorOffset;\r\n\r\n // fix text-anchor in text-element (#37)\r\n if(this.el instanceof SVG.Text){\r\n anchorOffset = this.el.node.getComputedTextLength();\r\n\r\n switch(this.el.attr('text-anchor')){\r\n case 'middle':\r\n anchorOffset /= 2;\r\n break\r\n case 'start':\r\n anchorOffset = 0;\r\n break;\r\n }\r\n }\r\n\r\n this.startPoints = {\r\n // We take absolute coordinates since we are just using a delta here\r\n point: this.transformPoint(e, anchorOffset),\r\n box: box,\r\n transform: this.el.transform()\r\n }\r\n\r\n // add drag and end events to window\r\n SVG.on(window, 'mousemove.drag', function(e){ _this.drag(e) })\r\n SVG.on(window, 'touchmove.drag', function(e){ _this.drag(e) })\r\n SVG.on(window, 'mouseup.drag', function(e){ _this.end(e) })\r\n SVG.on(window, 'touchend.drag', function(e){ _this.end(e) })\r\n\r\n // fire dragstart event\r\n this.el.fire('dragstart', {event: e, p: this.startPoints.point, m: this.m, handler: this})\r\n }\r\n\r\n // while dragging\r\n DragHandler.prototype.drag = function(e){\r\n\r\n var box = this.getBBox()\r\n , p = this.transformPoint(e)\r\n , x = this.startPoints.box.x + p.x - this.startPoints.point.x\r\n , y = this.startPoints.box.y + p.y - this.startPoints.point.y\r\n , c = this.constraint\r\n , gx = p.x - this.startPoints.point.x\r\n , gy = p.y - this.startPoints.point.y\r\n\r\n this.el.fire('dragmove', {\r\n event: e\r\n , p: p\r\n , m: this.m\r\n , handler: this\r\n })\r\n\r\n if(this.el.event().defaultPrevented) return p\r\n\r\n // move the element to its new position, if possible by constraint\r\n if (typeof c == 'function') {\r\n\r\n var coord = c.call(this.el, x, y, this.m)\r\n\r\n // bool, just show us if movement is allowed or not\r\n if (typeof coord == 'boolean') {\r\n coord = {\r\n x: coord,\r\n y: coord\r\n }\r\n }\r\n\r\n // if true, we just move. If !false its a number and we move it there\r\n if (coord.x === true) {\r\n this.el.x(x)\r\n } else if (coord.x !== false) {\r\n this.el.x(coord.x)\r\n }\r\n\r\n if (coord.y === true) {\r\n this.el.y(y)\r\n } else if (coord.y !== false) {\r\n this.el.y(coord.y)\r\n }\r\n\r\n } else if (typeof c == 'object') {\r\n\r\n // keep element within constrained box\r\n if (c.minX != null && x < c.minX) {\r\n x = c.minX\r\n gx = x - this.startPoints.box.x\r\n } else if (c.maxX != null && x > c.maxX - box.width) {\r\n x = c.maxX - box.width\r\n gx = x - this.startPoints.box.x\r\n } if (c.minY != null && y < c.minY) {\r\n y = c.minY\r\n gy = y - this.startPoints.box.y\r\n } else if (c.maxY != null && y > c.maxY - box.height) {\r\n y = c.maxY - box.height\r\n gy = y - this.startPoints.box.y\r\n }\r\n\r\n if (c.snapToGrid != null) {\r\n x = x - (x % c.snapToGrid)\r\n y = y - (y % c.snapToGrid)\r\n gx = gx - (gx % c.snapToGrid)\r\n gy = gy - (gy % c.snapToGrid)\r\n }\r\n\r\n if(this.el instanceof SVG.G)\r\n this.el.matrix(this.startPoints.transform).transform({x:gx, y: gy}, true)\r\n else\r\n this.el.move(x, y)\r\n }\r\n\r\n // so we can use it in the end-method, too\r\n return p\r\n }\r\n\r\n DragHandler.prototype.end = function(e){\r\n\r\n // final drag\r\n var p = this.drag(e);\r\n\r\n // fire dragend event\r\n this.el.fire('dragend', { event: e, p: p, m: this.m, handler: this })\r\n\r\n // unbind events\r\n SVG.off(window, 'mousemove.drag')\r\n SVG.off(window, 'touchmove.drag')\r\n SVG.off(window, 'mouseup.drag')\r\n SVG.off(window, 'touchend.drag')\r\n\r\n }\r\n\r\n SVG.extend(SVG.Element, {\r\n // Make element draggable\r\n // Constraint might be an object (as described in readme.md) or a function in the form \"function (x, y)\" that gets called before every move.\r\n // The function can return a boolean or an object of the form {x, y}, to which the element will be moved. \"False\" skips moving, true moves to raw x, y.\r\n draggable: function(value, constraint) {\r\n\r\n // Check the parameters and reassign if needed\r\n if (typeof value == 'function' || typeof value == 'object') {\r\n constraint = value\r\n value = true\r\n }\r\n\r\n var dragHandler = this.remember('_draggable') || new DragHandler(this)\r\n\r\n // When no parameter is given, value is true\r\n value = typeof value === 'undefined' ? true : value\r\n\r\n if(value) dragHandler.init(constraint || {}, value)\r\n else {\r\n this.off('mousedown.drag')\r\n this.off('touchstart.drag')\r\n }\r\n\r\n return this\r\n }\r\n\r\n })\r\n\r\n}).call(this);\r\n","/*!\n* svg.resize.js - An extension for svg.js which allows to resize elements which are selected\n* @version 1.4.3\n* https://github.com/svgdotjs/svg.resize.js\n*\n* @copyright [object Object]\n* @license MIT\n*/;\n;(function() {\n\"use strict\";\n\n;(function () {\r\n\r\n function ResizeHandler(el) {\r\n\r\n el.remember('_resizeHandler', this);\r\n\r\n this.el = el;\r\n this.parameters = {};\r\n this.lastUpdateCall = null;\r\n this.p = el.doc().node.createSVGPoint();\r\n }\r\n\r\n ResizeHandler.prototype.transformPoint = function(x, y, m){\r\n\r\n this.p.x = x - (this.offset.x - window.pageXOffset);\r\n this.p.y = y - (this.offset.y - window.pageYOffset);\r\n\r\n return this.p.matrixTransform(m || this.m);\r\n\r\n };\r\n\r\n ResizeHandler.prototype._extractPosition = function(event) {\r\n // Extract a position from a mouse/touch event.\r\n // Returns { x: .., y: .. }\r\n return {\r\n x: event.clientX != null ? event.clientX : event.touches[0].clientX,\r\n y: event.clientY != null ? event.clientY : event.touches[0].clientY\r\n }\r\n };\r\n\r\n ResizeHandler.prototype.init = function (options) {\r\n\r\n var _this = this;\r\n\r\n this.stop();\r\n\r\n if (options === 'stop') {\r\n return;\r\n }\r\n\r\n this.options = {};\r\n\r\n // Merge options and defaults\r\n for (var i in this.el.resize.defaults) {\r\n this.options[i] = this.el.resize.defaults[i];\r\n if (typeof options[i] !== 'undefined') {\r\n this.options[i] = options[i];\r\n }\r\n }\r\n\r\n // We listen to all these events which are specifying different edges\r\n this.el.on('lt.resize', function(e){ _this.resize(e || window.event); }); // Left-Top\r\n this.el.on('rt.resize', function(e){ _this.resize(e || window.event); }); // Right-Top\r\n this.el.on('rb.resize', function(e){ _this.resize(e || window.event); }); // Right-Bottom\r\n this.el.on('lb.resize', function(e){ _this.resize(e || window.event); }); // Left-Bottom\r\n\r\n this.el.on('t.resize', function(e){ _this.resize(e || window.event); }); // Top\r\n this.el.on('r.resize', function(e){ _this.resize(e || window.event); }); // Right\r\n this.el.on('b.resize', function(e){ _this.resize(e || window.event); }); // Bottom\r\n this.el.on('l.resize', function(e){ _this.resize(e || window.event); }); // Left\r\n\r\n this.el.on('rot.resize', function(e){ _this.resize(e || window.event); }); // Rotation\r\n\r\n this.el.on('point.resize', function(e){ _this.resize(e || window.event); }); // Point-Moving\r\n\r\n // This call ensures, that the plugin reacts to a change of snapToGrid immediately\r\n this.update();\r\n\r\n };\r\n\r\n ResizeHandler.prototype.stop = function(){\r\n this.el.off('lt.resize');\r\n this.el.off('rt.resize');\r\n this.el.off('rb.resize');\r\n this.el.off('lb.resize');\r\n\r\n this.el.off('t.resize');\r\n this.el.off('r.resize');\r\n this.el.off('b.resize');\r\n this.el.off('l.resize');\r\n\r\n this.el.off('rot.resize');\r\n\r\n this.el.off('point.resize');\r\n\r\n return this;\r\n };\r\n\r\n ResizeHandler.prototype.resize = function (event) {\r\n\r\n var _this = this;\r\n\r\n this.m = this.el.node.getScreenCTM().inverse();\r\n this.offset = { x: window.pageXOffset, y: window.pageYOffset };\r\n\r\n var txPt = this._extractPosition(event.detail.event);\r\n this.parameters = {\r\n type: this.el.type, // the type of element\r\n p: this.transformPoint(txPt.x, txPt.y),\r\n x: event.detail.x, // x-position of the mouse when resizing started\r\n y: event.detail.y, // y-position of the mouse when resizing started\r\n box: this.el.bbox(), // The bounding-box of the element\r\n rotation: this.el.transform().rotation // The current rotation of the element\r\n };\r\n\r\n // Add font-size parameter if the element type is text\r\n if (this.el.type === \"text\") {\r\n this.parameters.fontSize = this.el.attr()[\"font-size\"];\r\n }\r\n\r\n // the i-param in the event holds the index of the point which is moved, when using `deepSelect`\r\n if (event.detail.i !== undefined) {\r\n\r\n // get the point array\r\n var array = this.el.array().valueOf();\r\n\r\n // Save the index and the point which is moved\r\n this.parameters.i = event.detail.i;\r\n this.parameters.pointCoords = [array[event.detail.i][0], array[event.detail.i][1]];\r\n }\r\n\r\n // Lets check which edge of the bounding-box was clicked and resize the this.el according to this\r\n switch (event.type) {\r\n\r\n // Left-Top-Edge\r\n case 'lt':\r\n // We build a calculating function for every case which gives us the new position of the this.el\r\n this.calc = function (diffX, diffY) {\r\n // The procedure is always the same\r\n // First we snap the edge to the given grid (snapping to 1px grid is normal resizing)\r\n var snap = this.snapToGrid(diffX, diffY);\r\n\r\n // Now we check if the new height and width still valid (> 0)\r\n if (this.parameters.box.width - snap[0] > 0 && this.parameters.box.height - snap[1] > 0) {\r\n // ...if valid, we resize the this.el (which can include moving because the coord-system starts at the left-top and this edge is moving sometimes when resized)\r\n\r\n /*\r\n * but first check if the element is text box, so we can change the font size instead of\r\n * the width and height\r\n */\r\n\r\n if (this.parameters.type === \"text\") {\r\n this.el.move(this.parameters.box.x + snap[0], this.parameters.box.y);\r\n this.el.attr(\"font-size\", this.parameters.fontSize - snap[0]);\r\n return;\r\n }\r\n\r\n snap = this.checkAspectRatio(snap);\r\n\r\n this.el.move(this.parameters.box.x + snap[0], this.parameters.box.y + snap[1]).size(this.parameters.box.width - snap[0], this.parameters.box.height - snap[1]);\r\n }\r\n };\r\n break;\r\n\r\n // Right-Top\r\n case 'rt':\r\n // s.a.\r\n this.calc = function (diffX, diffY) {\r\n var snap = this.snapToGrid(diffX, diffY, 1 << 1);\r\n if (this.parameters.box.width + snap[0] > 0 && this.parameters.box.height - snap[1] > 0) {\r\n if (this.parameters.type === \"text\") {\r\n this.el.move(this.parameters.box.x - snap[0], this.parameters.box.y);\r\n this.el.attr(\"font-size\", this.parameters.fontSize + snap[0]);\r\n return;\r\n }\r\n\r\n snap = this.checkAspectRatio(snap, true);\r\n\r\n this.el.move(this.parameters.box.x, this.parameters.box.y + snap[1]).size(this.parameters.box.width + snap[0], this.parameters.box.height - snap[1]);\r\n }\r\n };\r\n break;\r\n\r\n // Right-Bottom\r\n case 'rb':\r\n // s.a.\r\n this.calc = function (diffX, diffY) {\r\n var snap = this.snapToGrid(diffX, diffY, 0);\r\n if (this.parameters.box.width + snap[0] > 0 && this.parameters.box.height + snap[1] > 0) {\r\n if (this.parameters.type === \"text\") {\r\n this.el.move(this.parameters.box.x - snap[0], this.parameters.box.y);\r\n this.el.attr(\"font-size\", this.parameters.fontSize + snap[0]);\r\n return;\r\n }\r\n\r\n snap = this.checkAspectRatio(snap);\r\n\r\n this.el.move(this.parameters.box.x, this.parameters.box.y).size(this.parameters.box.width + snap[0], this.parameters.box.height + snap[1]);\r\n }\r\n };\r\n break;\r\n\r\n // Left-Bottom\r\n case 'lb':\r\n // s.a.\r\n this.calc = function (diffX, diffY) {\r\n var snap = this.snapToGrid(diffX, diffY, 1);\r\n if (this.parameters.box.width - snap[0] > 0 && this.parameters.box.height + snap[1] > 0) {\r\n if (this.parameters.type === \"text\") {\r\n this.el.move(this.parameters.box.x + snap[0], this.parameters.box.y);\r\n this.el.attr(\"font-size\", this.parameters.fontSize - snap[0]);\r\n return;\r\n }\r\n\r\n snap = this.checkAspectRatio(snap, true);\r\n\r\n this.el.move(this.parameters.box.x + snap[0], this.parameters.box.y).size(this.parameters.box.width - snap[0], this.parameters.box.height + snap[1]);\r\n }\r\n };\r\n break;\r\n\r\n // Top\r\n case 't':\r\n // s.a.\r\n this.calc = function (diffX, diffY) {\r\n var snap = this.snapToGrid(diffX, diffY, 1 << 1);\r\n if (this.parameters.box.height - snap[1] > 0) {\r\n // Disable the font-resizing if it is not from the corner of bounding-box\r\n if (this.parameters.type === \"text\") {\r\n return;\r\n }\r\n\r\n this.el.move(this.parameters.box.x, this.parameters.box.y + snap[1]).height(this.parameters.box.height - snap[1]);\r\n }\r\n };\r\n break;\r\n\r\n // Right\r\n case 'r':\r\n // s.a.\r\n this.calc = function (diffX, diffY) {\r\n var snap = this.snapToGrid(diffX, diffY, 0);\r\n if (this.parameters.box.width + snap[0] > 0) {\r\n if (this.parameters.type === \"text\") {\r\n return;\r\n }\r\n\r\n this.el.move(this.parameters.box.x, this.parameters.box.y).width(this.parameters.box.width + snap[0]);\r\n }\r\n };\r\n break;\r\n\r\n // Bottom\r\n case 'b':\r\n // s.a.\r\n this.calc = function (diffX, diffY) {\r\n var snap = this.snapToGrid(diffX, diffY, 0);\r\n if (this.parameters.box.height + snap[1] > 0) {\r\n if (this.parameters.type === \"text\") {\r\n return;\r\n }\r\n\r\n this.el.move(this.parameters.box.x, this.parameters.box.y).height(this.parameters.box.height + snap[1]);\r\n }\r\n };\r\n break;\r\n\r\n // Left\r\n case 'l':\r\n // s.a.\r\n this.calc = function (diffX, diffY) {\r\n var snap = this.snapToGrid(diffX, diffY, 1);\r\n if (this.parameters.box.width - snap[0] > 0) {\r\n if (this.parameters.type === \"text\") {\r\n return;\r\n }\r\n\r\n this.el.move(this.parameters.box.x + snap[0], this.parameters.box.y).width(this.parameters.box.width - snap[0]);\r\n }\r\n };\r\n break;\r\n\r\n // Rotation\r\n case 'rot':\r\n // s.a.\r\n this.calc = function (diffX, diffY) {\r\n\r\n // yes this is kinda stupid but we need the mouse coords back...\r\n var current = {x: diffX + this.parameters.p.x, y: diffY + this.parameters.p.y};\r\n\r\n // start minus middle\r\n var sAngle = Math.atan2((this.parameters.p.y - this.parameters.box.y - this.parameters.box.height / 2), (this.parameters.p.x - this.parameters.box.x - this.parameters.box.width / 2));\r\n\r\n // end minus middle\r\n var pAngle = Math.atan2((current.y - this.parameters.box.y - this.parameters.box.height / 2), (current.x - this.parameters.box.x - this.parameters.box.width / 2));\r\n\r\n var angle = this.parameters.rotation + (pAngle - sAngle) * 180 / Math.PI + this.options.snapToAngle / 2;\r\n\r\n // We have to move the element to the center of the box first and change the rotation afterwards\r\n // because rotation always works around a rotation-center, which is changed when moving the element\r\n // We also set the new rotation center to the center of the box.\r\n this.el.center(this.parameters.box.cx, this.parameters.box.cy).rotate(angle - (angle % this.options.snapToAngle), this.parameters.box.cx, this.parameters.box.cy);\r\n };\r\n break;\r\n\r\n // Moving one single Point (needed when an element is deepSelected which means you can move every single point of the object)\r\n case 'point':\r\n this.calc = function (diffX, diffY) {\r\n\r\n // Snapping the point to the grid\r\n var snap = this.snapToGrid(diffX, diffY, this.parameters.pointCoords[0], this.parameters.pointCoords[1]);\r\n\r\n // Get the point array\r\n var array = this.el.array().valueOf();\r\n\r\n // Changing the moved point in the array\r\n array[this.parameters.i][0] = this.parameters.pointCoords[0] + snap[0];\r\n array[this.parameters.i][1] = this.parameters.pointCoords[1] + snap[1];\r\n\r\n // And plot the new this.el\r\n this.el.plot(array);\r\n };\r\n }\r\n\r\n this.el.fire('resizestart', {dx: this.parameters.x, dy: this.parameters.y, event: event});\r\n // When resizing started, we have to register events for...\r\n // Touches.\r\n SVG.on(window, 'touchmove.resize', function(e) {\r\n _this.update(e || window.event);\r\n });\r\n SVG.on(window, 'touchend.resize', function() {\r\n _this.done();\r\n });\r\n // Mouse.\r\n SVG.on(window, 'mousemove.resize', function (e) {\r\n _this.update(e || window.event);\r\n });\r\n SVG.on(window, 'mouseup.resize', function () {\r\n _this.done();\r\n });\r\n\r\n };\r\n\r\n // The update-function redraws the element every time the mouse is moving\r\n ResizeHandler.prototype.update = function (event) {\r\n\r\n if (!event) {\r\n if (this.lastUpdateCall) {\r\n this.calc(this.lastUpdateCall[0], this.lastUpdateCall[1]);\r\n }\r\n return;\r\n }\r\n\r\n // Calculate the difference between the mouseposition at start and now\r\n var txPt = this._extractPosition(event);\r\n var p = this.transformPoint(txPt.x, txPt.y);\r\n\r\n var diffX = p.x - this.parameters.p.x,\r\n diffY = p.y - this.parameters.p.y;\r\n\r\n this.lastUpdateCall = [diffX, diffY];\r\n\r\n // Calculate the new position and height / width of the element\r\n this.calc(diffX, diffY);\r\n\r\n // Emit an event to say we have changed.\r\n this.el.fire('resizing', {dx: diffX, dy: diffY, event: event});\r\n };\r\n\r\n // Is called on mouseup.\r\n // Removes the update-function from the mousemove event\r\n ResizeHandler.prototype.done = function () {\r\n this.lastUpdateCall = null;\r\n SVG.off(window, 'mousemove.resize');\r\n SVG.off(window, 'mouseup.resize');\r\n SVG.off(window, 'touchmove.resize');\r\n SVG.off(window, 'touchend.resize');\r\n this.el.fire('resizedone');\r\n };\r\n\r\n // The flag is used to determine whether the resizing is used with a left-Point (first bit) and top-point (second bit)\r\n // In this cases the temp-values are calculated differently\r\n ResizeHandler.prototype.snapToGrid = function (diffX, diffY, flag, pointCoordsY) {\r\n\r\n var temp;\r\n\r\n // If `pointCoordsY` is given, a single Point has to be snapped (deepSelect). That's why we need a different temp-value\r\n if (typeof pointCoordsY !== 'undefined') {\r\n // Note that flag = pointCoordsX in this case\r\n temp = [(flag + diffX) % this.options.snapToGrid, (pointCoordsY + diffY) % this.options.snapToGrid];\r\n } else {\r\n // We check if the flag is set and if not we set a default-value (both bits set - which means upper-left-edge)\r\n flag = flag == null ? 1 | 1 << 1 : flag;\r\n temp = [(this.parameters.box.x + diffX + (flag & 1 ? 0 : this.parameters.box.width)) % this.options.snapToGrid, (this.parameters.box.y + diffY + (flag & (1 << 1) ? 0 : this.parameters.box.height)) % this.options.snapToGrid];\r\n }\r\n\r\n if(diffX < 0) {\r\n temp[0] -= this.options.snapToGrid;\r\n }\r\n if(diffY < 0) {\r\n temp[1] -= this.options.snapToGrid;\r\n }\r\n\r\n diffX -= (Math.abs(temp[0]) < this.options.snapToGrid / 2 ?\r\n temp[0] :\r\n temp[0] - (diffX < 0 ? -this.options.snapToGrid : this.options.snapToGrid));\r\n diffY -= (Math.abs(temp[1]) < this.options.snapToGrid / 2 ?\r\n temp[1] :\r\n temp[1] - (diffY < 0 ? -this.options.snapToGrid : this.options.snapToGrid));\r\n\r\n return this.constraintToBox(diffX, diffY, flag, pointCoordsY);\r\n\r\n };\r\n\r\n // keep element within constrained box\r\n ResizeHandler.prototype.constraintToBox = function (diffX, diffY, flag, pointCoordsY) {\r\n //return [diffX, diffY]\r\n var c = this.options.constraint || {};\r\n var orgX, orgY;\r\n\r\n if (typeof pointCoordsY !== 'undefined') {\r\n orgX = flag;\r\n orgY = pointCoordsY;\r\n } else {\r\n orgX = this.parameters.box.x + (flag & 1 ? 0 : this.parameters.box.width);\r\n orgY = this.parameters.box.y + (flag & (1<<1) ? 0 : this.parameters.box.height);\r\n }\r\n\r\n if (typeof c.minX !== 'undefined' && orgX + diffX < c.minX) {\r\n diffX = c.minX - orgX;\r\n }\r\n\r\n if (typeof c.maxX !== 'undefined' && orgX + diffX > c.maxX) {\r\n diffX = c.maxX - orgX;\r\n }\r\n\r\n if (typeof c.minY !== 'undefined' && orgY + diffY < c.minY) {\r\n diffY = c.minY - orgY;\r\n }\r\n\r\n if (typeof c.maxY !== 'undefined' && orgY + diffY > c.maxY) {\r\n diffY = c.maxY - orgY;\r\n }\r\n\r\n return [diffX, diffY];\r\n };\r\n\r\n ResizeHandler.prototype.checkAspectRatio = function (snap, isReverse) {\r\n if (!this.options.saveAspectRatio) {\r\n return snap;\r\n }\r\n\r\n var updatedSnap = snap.slice();\r\n var aspectRatio = this.parameters.box.width / this.parameters.box.height;\r\n var newW = this.parameters.box.width + snap[0];\r\n var newH = this.parameters.box.height - snap[1];\r\n var newAspectRatio = newW / newH;\r\n\r\n if (newAspectRatio < aspectRatio) {\r\n // Height is too big. Adapt it\r\n updatedSnap[1] = newW / aspectRatio - this.parameters.box.height;\r\n isReverse && (updatedSnap[1] = -updatedSnap[1]);\r\n } else if (newAspectRatio > aspectRatio) {\r\n // Width is too big. Adapt it\r\n updatedSnap[0] = this.parameters.box.width - newH * aspectRatio;\r\n isReverse && (updatedSnap[0] = -updatedSnap[0]);\r\n }\r\n\r\n return updatedSnap;\r\n };\r\n\r\n SVG.extend(SVG.Element, {\r\n // Resize element with mouse\r\n resize: function (options) {\r\n\r\n (this.remember('_resizeHandler') || new ResizeHandler(this)).init(options || {});\r\n\r\n return this;\r\n\r\n }\r\n\r\n });\r\n\r\n SVG.Element.prototype.resize.defaults = {\r\n snapToAngle: 0.1, // Specifies the speed the rotation is happening when moving the mouse\r\n snapToGrid: 1, // Snaps to a grid of `snapToGrid` Pixels\r\n constraint: {}, // keep element within constrained box\r\n saveAspectRatio: false // Save aspect ratio when resizing using lt, rt, rb or lb points\r\n };\r\n\r\n}).call(this);\n}());\n","/*!\n* svg.select.js - An extension of svg.js which allows to select elements with mouse\n* @version 3.0.1\n* https://github.com/svgdotjs/svg.select.js\n*\n* @copyright Ulrich-Matthias Schäfer\n* @license MIT\n*/;\n;(function() {\n\"use strict\";\n\nfunction SelectHandler(el) {\r\n\r\n this.el = el;\r\n el.remember('_selectHandler', this);\r\n this.pointSelection = {isSelected: false};\r\n this.rectSelection = {isSelected: false};\r\n\r\n // helper list with position settings of each type of point\r\n this.pointsList = {\r\n lt: [ 0, 0 ],\r\n rt: [ 'width', 0 ],\r\n rb: [ 'width', 'height' ],\r\n lb: [ 0, 'height' ],\r\n t: [ 'width', 0 ],\r\n r: [ 'width', 'height' ],\r\n b: [ 'width', 'height' ],\r\n l: [ 0, 'height' ]\r\n };\r\n\r\n // helper function to get point coordinates based on settings above and an object (bbox in our case)\r\n this.pointCoord = function (setting, object, isPointCentered) {\r\n var coord = typeof setting !== 'string' ? setting : object[setting];\r\n // Top, bottom, right and left points are placed in the center of element width/height\r\n return isPointCentered ? coord / 2 : coord\r\n }\r\n\r\n this.pointCoords = function (point, object) {\r\n var settings = this.pointsList[point];\r\n\r\n return {\r\n x: this.pointCoord(settings[0], object, (point === 't' || point === 'b')),\r\n y: this.pointCoord(settings[1], object, (point === 'r' || point === 'l'))\r\n }\r\n }\r\n}\r\n\r\nSelectHandler.prototype.init = function (value, options) {\r\n\r\n var bbox = this.el.bbox();\r\n this.options = {};\r\n\r\n // store defaults list of points in order to verify users config\r\n var points = this.el.selectize.defaults.points;\r\n\r\n // Merging the defaults and the options-object together\r\n for (var i in this.el.selectize.defaults) {\r\n this.options[i] = this.el.selectize.defaults[i];\r\n if (options[i] !== undefined) {\r\n this.options[i] = options[i];\r\n }\r\n }\r\n\r\n // prepare & validate list of points to be added (or excluded)\r\n var pointsLists = ['points', 'pointsExclude'];\r\n\r\n for (var i in pointsLists) {\r\n var option = this.options[pointsLists[i]];\r\n\r\n if (typeof option === 'string') {\r\n if (option.length > 0) {\r\n // if set as comma separated string list => convert it into an array\r\n option = option.split(/\\s*,\\s*/i);\r\n } else {\r\n option = [];\r\n }\r\n } else if (typeof option === 'boolean' && pointsLists[i] === 'points') {\r\n // this is not needed, but let's have it for legacy support\r\n option = option ? points : [];\r\n }\r\n\r\n this.options[pointsLists[i]] = option;\r\n }\r\n\r\n // intersect correct all points options with users config (exclude unwanted points)\r\n // ES5 -> NO arrow functions nor Array.includes()\r\n this.options.points = [ points, this.options.points ].reduce(\r\n function (a, b) {\r\n return a.filter(\r\n function (c) {\r\n return b.indexOf(c) > -1;\r\n }\r\n )\r\n }\r\n );\r\n\r\n // exclude pointsExclude, if wanted\r\n this.options.points = [ this.options.points, this.options.pointsExclude ].reduce(\r\n function (a, b) {\r\n return a.filter(\r\n function (c) {\r\n return b.indexOf(c) < 0;\r\n }\r\n )\r\n }\r\n );\r\n\r\n this.parent = this.el.parent();\r\n this.nested = (this.nested || this.parent.group());\r\n this.nested.matrix(new SVG.Matrix(this.el).translate(bbox.x, bbox.y));\r\n\r\n // When deepSelect is enabled and the element is a line/polyline/polygon, draw only points for moving\r\n if (this.options.deepSelect && ['line', 'polyline', 'polygon'].indexOf(this.el.type) !== -1) {\r\n this.selectPoints(value);\r\n } else {\r\n this.selectRect(value);\r\n }\r\n\r\n this.observe();\r\n this.cleanup();\r\n\r\n};\r\n\r\nSelectHandler.prototype.selectPoints = function (value) {\r\n\r\n this.pointSelection.isSelected = value;\r\n\r\n // When set is already there we dont have to create one\r\n if (this.pointSelection.set) {\r\n return this;\r\n }\r\n\r\n // Create our set of elements\r\n this.pointSelection.set = this.parent.set();\r\n // draw the points and mark the element as selected\r\n this.drawPoints();\r\n\r\n return this;\r\n\r\n};\r\n\r\n// create the point-array which contains the 2 points of a line or simply the points-array of polyline/polygon\r\nSelectHandler.prototype.getPointArray = function () {\r\n var bbox = this.el.bbox();\r\n\r\n return this.el.array().valueOf().map(function (el) {\r\n return [el[0] - bbox.x, el[1] - bbox.y];\r\n });\r\n};\r\n\r\n// Draws a points\r\nSelectHandler.prototype.drawPoints = function () {\r\n\r\n var _this = this, array = this.getPointArray();\r\n\r\n // go through the array of points\r\n for (var i = 0, len = array.length; i < len; ++i) {\r\n\r\n var curriedEvent = (function (k) {\r\n return function (ev) {\r\n ev = ev || window.event;\r\n ev.preventDefault ? ev.preventDefault() : ev.returnValue = false;\r\n ev.stopPropagation();\r\n\r\n var x = ev.pageX || ev.touches[0].pageX;\r\n var y = ev.pageY || ev.touches[0].pageY;\r\n _this.el.fire('point', {x: x, y: y, i: k, event: ev});\r\n };\r\n })(i);\r\n\r\n // add every point to the set\r\n // add css-classes and a touchstart-event which fires our event for moving points\r\n var point = this.drawPoint(array[i][0], array[i][1])\r\n .addClass(this.options.classPoints)\r\n .addClass(this.options.classPoints + '_point')\r\n .on('touchstart', curriedEvent)\r\n .on('mousedown', curriedEvent)\r\n this.pointSelection.set.add(point);\r\n }\r\n};\r\n\r\n// The function to draw single point\r\nSelectHandler.prototype.drawPoint = function (cx, cy) {\r\n var pointType = this.options.pointType;\r\n\r\n switch (pointType) {\r\n case 'circle':\r\n return this.drawCircle(cx, cy);\r\n case 'rect':\r\n return this.drawRect(cx, cy);\r\n default:\r\n if (typeof pointType === 'function') {\r\n return pointType.call(this, cx, cy);\r\n }\r\n\r\n throw new Error('Unknown ' + pointType + ' point type!');\r\n }\r\n};\r\n\r\n// The function to draw the circle point\r\nSelectHandler.prototype.drawCircle = function (cx, cy) {\r\n return this.nested.circle(this.options.pointSize)\r\n .center(cx, cy);\r\n};\r\n\r\n// The function to draw the rect point\r\nSelectHandler.prototype.drawRect = function (cx, cy) {\r\n return this.nested.rect(this.options.pointSize, this.options.pointSize)\r\n .center(cx, cy);\r\n};\r\n\r\n// every time a point is moved, we have to update the positions of our point\r\nSelectHandler.prototype.updatePointSelection = function () {\r\n var array = this.getPointArray();\r\n\r\n this.pointSelection.set.each(function (i) {\r\n if (this.cx() === array[i][0] && this.cy() === array[i][1]) {\r\n return;\r\n }\r\n this.center(array[i][0], array[i][1]);\r\n });\r\n};\r\n\r\nSelectHandler.prototype.updateRectSelection = function () {\r\n var _this = this, bbox = this.el.bbox();\r\n\r\n this.rectSelection.set.get(0).attr({\r\n width: bbox.width,\r\n height: bbox.height\r\n });\r\n\r\n // set.get(1) is always in the upper left corner. no need to move it\r\n if (this.options.points.length) {\r\n this.options.points.map(function (point, index) {\r\n var coords = _this.pointCoords(point, bbox);\r\n\r\n _this.rectSelection.set.get(index + 1).center(coords.x, coords.y);\r\n });\r\n }\r\n\r\n if (this.options.rotationPoint) {\r\n var length = this.rectSelection.set.length();\r\n\r\n this.rectSelection.set.get(length - 1).center(bbox.width / 2, 20);\r\n }\r\n};\r\n\r\nSelectHandler.prototype.selectRect = function (value) {\r\n\r\n var _this = this, bbox = this.el.bbox();\r\n\r\n this.rectSelection.isSelected = value;\r\n\r\n // when set is already p\r\n this.rectSelection.set = this.rectSelection.set || this.parent.set();\r\n\r\n // helperFunction to create a mouse-down function which triggers the event specified in `eventName`\r\n function getMoseDownFunc(eventName) {\r\n return function (ev) {\r\n ev = ev || window.event;\r\n ev.preventDefault ? ev.preventDefault() : ev.returnValue = false;\r\n ev.stopPropagation();\r\n\r\n var x = ev.pageX || ev.touches[0].pageX;\r\n var y = ev.pageY || ev.touches[0].pageY;\r\n _this.el.fire(eventName, {x: x, y: y, event: ev});\r\n };\r\n }\r\n\r\n // create the selection-rectangle and add the css-class\r\n if (!this.rectSelection.set.get(0)) {\r\n this.rectSelection.set.add(this.nested.rect(bbox.width, bbox.height).addClass(this.options.classRect));\r\n }\r\n\r\n // Draw Points at the edges, if enabled\r\n if (this.options.points.length && this.rectSelection.set.length() < 2) {\r\n var ename =\"touchstart\", mname = \"mousedown\";\r\n\r\n this.options.points.map(function (point, index) {\r\n var coords = _this.pointCoords(point, bbox);\r\n\r\n var pointElement = _this.drawPoint(coords.x, coords.y)\r\n .attr('class', _this.options.classPoints + '_' + point)\r\n .on(mname, getMoseDownFunc(point))\r\n .on(ename, getMoseDownFunc(point));\r\n _this.rectSelection.set.add(pointElement);\r\n });\r\n\r\n this.rectSelection.set.each(function () {\r\n this.addClass(_this.options.classPoints);\r\n });\r\n }\r\n\r\n // draw rotationPint, if enabled\r\n if (this.options.rotationPoint && ((this.options.points && !this.rectSelection.set.get(9)) || (!this.options.points && !this.rectSelection.set.get(1)))) {\r\n\r\n var curriedEvent = function (ev) {\r\n ev = ev || window.event;\r\n ev.preventDefault ? ev.preventDefault() : ev.returnValue = false;\r\n ev.stopPropagation();\r\n\r\n var x = ev.pageX || ev.touches[0].pageX;\r\n var y = ev.pageY || ev.touches[0].pageY;\r\n _this.el.fire('rot', {x: x, y: y, event: ev});\r\n };\r\n\r\n var pointElement = this.drawPoint(bbox.width / 2, 20)\r\n .attr('class', this.options.classPoints + '_rot')\r\n .on(\"touchstart\", curriedEvent)\r\n .on(\"mousedown\", curriedEvent);\r\n this.rectSelection.set.add(pointElement);\r\n }\r\n\r\n};\r\n\r\nSelectHandler.prototype.handler = function () {\r\n\r\n var bbox = this.el.bbox();\r\n this.nested.matrix(new SVG.Matrix(this.el).translate(bbox.x, bbox.y));\r\n\r\n if (this.rectSelection.isSelected) {\r\n this.updateRectSelection();\r\n }\r\n\r\n if (this.pointSelection.isSelected) {\r\n this.updatePointSelection();\r\n }\r\n\r\n};\r\n\r\nSelectHandler.prototype.observe = function () {\r\n var _this = this;\r\n\r\n if (MutationObserver) {\r\n if (this.rectSelection.isSelected || this.pointSelection.isSelected) {\r\n this.observerInst = this.observerInst || new MutationObserver(function () {\r\n _this.handler();\r\n });\r\n this.observerInst.observe(this.el.node, {attributes: true});\r\n } else {\r\n try {\r\n this.observerInst.disconnect();\r\n delete this.observerInst;\r\n } catch (e) {\r\n }\r\n }\r\n } else {\r\n this.el.off('DOMAttrModified.select');\r\n\r\n if (this.rectSelection.isSelected || this.pointSelection.isSelected) {\r\n this.el.on('DOMAttrModified.select', function () {\r\n _this.handler();\r\n });\r\n }\r\n }\r\n};\r\n\r\nSelectHandler.prototype.cleanup = function () {\r\n\r\n //var _this = this;\r\n\r\n if (!this.rectSelection.isSelected && this.rectSelection.set) {\r\n // stop watching the element, remove the selection\r\n this.rectSelection.set.each(function () {\r\n this.remove();\r\n });\r\n\r\n this.rectSelection.set.clear();\r\n delete this.rectSelection.set;\r\n }\r\n\r\n if (!this.pointSelection.isSelected && this.pointSelection.set) {\r\n // Remove all points, clear the set, stop watching the element\r\n this.pointSelection.set.each(function () {\r\n this.remove();\r\n });\r\n\r\n this.pointSelection.set.clear();\r\n delete this.pointSelection.set;\r\n }\r\n\r\n if (!this.pointSelection.isSelected && !this.rectSelection.isSelected) {\r\n this.nested.remove();\r\n delete this.nested;\r\n\r\n }\r\n};\r\n\r\n\r\nSVG.extend(SVG.Element, {\r\n // Select element with mouse\r\n selectize: function (value, options) {\r\n\r\n // Check the parameters and reassign if needed\r\n if (typeof value === 'object') {\r\n options = value;\r\n value = true;\r\n }\r\n\r\n var selectHandler = this.remember('_selectHandler') || new SelectHandler(this);\r\n\r\n selectHandler.init(value === undefined ? true : value, options || {});\r\n\r\n return this;\r\n\r\n }\r\n});\r\n\r\nSVG.Element.prototype.selectize.defaults = {\r\n points: ['lt', 'rt', 'rb', 'lb', 't', 'r', 'b', 'l'], // which points to draw, default all\r\n pointsExclude: [], // easier option if to exclude few than rewrite all\r\n classRect: 'svg_select_boundingRect', // Css-class added to the rect\r\n classPoints: 'svg_select_points', // Css-class added to the points\r\n pointSize: 7, // size of point\r\n rotationPoint: true, // If true, rotation point is drawn. Needed for rotation!\r\n deepSelect: false, // If true, moving of single points is possible (only line, polyline, polyon)\r\n pointType: 'circle' // Point type: circle or rect, default circle\r\n};\n}());\n","/*! svg.draw.js - v2.0.3 - 2017-06-19\r\n* https://github.com/svgdotjs/svg.draw.js\r\n* Copyright (c) 2017 Ulrich-Matthias Schäfer; Licensed MIT */\r\n\r\n;(function () {\r\n // Our Object which manages drawing\r\n function PaintHandler(el, event, options) {\r\n\r\n this.el = el;\r\n el.remember('_paintHandler', this);\r\n \r\n var _this = this,\r\n plugin = this.getPlugin();\r\n\r\n this.parent = el.parent(SVG.Nested) || el.parent(SVG.Doc);\r\n this.p = this.parent.node.createSVGPoint(); // Helping point for coord transformation\r\n this.m = null; // transformation matrix. We get it when drawing starts\r\n this.startPoint = null;\r\n this.lastUpdateCall = null;\r\n this.options = {};\r\n\r\n // Merge options and defaults\r\n for (var i in this.el.draw.defaults) {\r\n this.options[i] = this.el.draw.defaults[i];\r\n if (typeof options[i] !== 'undefined') {\r\n this.options[i] = options[i];\r\n }\r\n }\r\n \r\n if(plugin.point) {\r\n plugin['pointPlugin'] = plugin.point;\r\n delete plugin.point;\r\n }\r\n \r\n // Import all methods from plugin into object\r\n for (var i in plugin){\r\n this[i] = plugin[i];\r\n }\r\n \r\n // When we got an event, we use this for start, otherwise we use the click-event as default\r\n if (!event) {\r\n this.parent.on('click.draw', function (e) {\r\n _this.start(e);\r\n });\r\n\r\n }\r\n\r\n }\r\n\r\n PaintHandler.prototype.transformPoint = function(x, y){\r\n\r\n this.p.x = x - (this.offset.x - window.pageXOffset);\r\n this.p.y = y - (this.offset.y - window.pageYOffset);\r\n \r\n return this.p.matrixTransform(this.m);\r\n \r\n }\r\n \r\n PaintHandler.prototype.start = function (event) {\r\n \r\n var _this = this;\r\n \r\n // get the current transform matrix from screen to element (offset corrected)\r\n this.m = this.el.node.getScreenCTM().inverse();\r\n\r\n // we save the current scrolling-offset here\r\n this.offset = { x: window.pageXOffset, y: window.pageYOffset };\r\n\r\n // we want to snap in screen-coords, so we have to scale the snapToGrid accordingly\r\n this.options.snapToGrid *= Math.sqrt(this.m.a * this.m.a + this.m.b * this.m.b)\r\n\r\n // save the startpoint\r\n this.startPoint = this.snapToGrid(this.transformPoint(event.clientX, event.clientY));\r\n\r\n // the plugin may do some initial work\r\n if(this.init){ this.init(event); }\r\n\r\n // Fire our `drawstart`-event. We send the offset-corrected cursor-position along\r\n this.el.fire('drawstart', {event:event, p:this.p, m:this.m});\r\n\r\n // We need to bind the update-function to the mousemove event to keep track of the cursor\r\n SVG.on(window, 'mousemove.draw', function (e) {\r\n _this.update(e);\r\n });\r\n\r\n // Every consecutive call to start should map to point now\r\n this.start = this.point;\r\n\r\n\r\n };\r\n\r\n // This function draws a point if the element is a polyline or polygon\r\n // Otherwise it will just stop drawing the shape cause we are done\r\n PaintHandler.prototype.point = function (event) {\r\n if (this.point != this.start) return this.start(event);\r\n \r\n if (this.pointPlugin) {\r\n return this.pointPlugin(event);\r\n }\r\n \r\n // If this function is not overwritten we just call stop\r\n this.stop(event);\r\n };\r\n\r\n\r\n // The stop-function does the cleanup work\r\n PaintHandler.prototype.stop = function (event) {\r\n if (event) {\r\n this.update(event);\r\n }\r\n \r\n // Plugin may want to clean something\r\n if(this.clean){ this.clean(); }\r\n\r\n // Unbind from all events\r\n SVG.off(window, 'mousemove.draw');\r\n this.parent.off('click.draw');\r\n\r\n // remove Refernce to PaintHandler\r\n this.el.forget('_paintHandler');\r\n\r\n // overwrite draw-function since we never need it again for this element\r\n this.el.draw = function () {\r\n };\r\n\r\n // Fire the `drawstop`-event\r\n this.el.fire('drawstop');\r\n };\r\n\r\n // Updates the element while moving the cursor\r\n PaintHandler.prototype.update = function (event) {\r\n\r\n if(!event && this.lastUpdateCall){\r\n event = this.lastUpdateCall;\r\n }\r\n \r\n this.lastUpdateCall = event;\r\n \r\n // Call the calc-function which calculates the new position and size\r\n this.calc(event);\r\n\r\n // Fire the `drawupdate`-event\r\n this.el.fire('drawupdate', {event:event, p:this.p, m:this.m});\r\n };\r\n\r\n // Called from outside. Finishs a poly-element\r\n PaintHandler.prototype.done = function () {\r\n this.calc();\r\n this.stop();\r\n\r\n this.el.fire('drawdone');\r\n };\r\n\r\n // Called from outside. Cancels a poly-element\r\n PaintHandler.prototype.cancel = function () {\r\n // stop drawing and remove the element\r\n this.stop();\r\n this.el.remove();\r\n\r\n this.el.fire('drawcancel');\r\n };\r\n\r\n // Calculate the corrected position when using `snapToGrid`\r\n PaintHandler.prototype.snapToGrid = function (draw) {\r\n\r\n var temp = null;\r\n\r\n // An array was given. Loop through every element\r\n if (draw.length) {\r\n temp = [draw[0] % this.options.snapToGrid, draw[1] % this.options.snapToGrid];\r\n draw[0] -= temp[0] < this.options.snapToGrid / 2 ? temp[0] : temp[0] - this.options.snapToGrid;\r\n draw[1] -= temp[1] < this.options.snapToGrid / 2 ? temp[1] : temp[1] - this.options.snapToGrid;\r\n return draw;\r\n }\r\n\r\n // Properties of element were given. Snap them all\r\n for (var i in draw) {\r\n temp = draw[i] % this.options.snapToGrid;\r\n draw[i] -= (temp < this.options.snapToGrid / 2 ? temp : temp - this.options.snapToGrid) + (temp < 0 ? this.options.snapToGrid : 0);\r\n }\r\n\r\n return draw;\r\n };\r\n\r\n PaintHandler.prototype.param = function (key, value) {\r\n this.options[key] = value === null ? this.el.draw.defaults[key] : value;\r\n this.update();\r\n };\r\n\r\n // Returns the plugin\r\n PaintHandler.prototype.getPlugin = function () {\r\n return this.el.draw.plugins[this.el.type];\r\n };\r\n\r\n SVG.extend(SVG.Element, {\r\n // Draw element with mouse\r\n draw: function (event, options, value) {\r\n\r\n // sort the parameters\r\n if (!(event instanceof Event || typeof event === 'string')) {\r\n options = event;\r\n event = null;\r\n }\r\n\r\n // get the old Handler or create a new one from event and options\r\n var paintHandler = this.remember('_paintHandler') || new PaintHandler(this, event, options || {});\r\n\r\n // When we got an event we have to start/continue drawing\r\n if (event instanceof Event) {\r\n paintHandler['start'](event);\r\n }\r\n\r\n // if event is located in our PaintHandler we handle it as method\r\n if (paintHandler[event]) {\r\n paintHandler[event](options, value);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n });\r\n\r\n // Default values. Can be changed for the whole project if needed\r\n SVG.Element.prototype.draw.defaults = {\r\n snapToGrid: 1 // Snaps to a grid of `snapToGrid` px\r\n };\r\n\r\n SVG.Element.prototype.draw.extend = function(name, obj){\r\n\r\n var plugins = {};\r\n if(typeof name === 'string'){\r\n plugins[name] = obj;\r\n }else{\r\n plugins = name;\r\n }\r\n\r\n for(var shapes in plugins){\r\n var shapesArr = shapes.trim().split(/\\s+/);\r\n\r\n for(var i in shapesArr){\r\n SVG.Element.prototype.draw.plugins[shapesArr[i]] = plugins[shapes];\r\n }\r\n }\r\n\r\n };\r\n\r\n // Container for all types not specified here\r\n SVG.Element.prototype.draw.plugins = {};\r\n\r\n SVG.Element.prototype.draw.extend('rect image', {\r\n \r\n init:function(e){\r\n\r\n var p = this.startPoint;\r\n \r\n this.el.attr({ x: p.x, y: p.y, height: 0, width: 0 });\r\n },\r\n \r\n calc:function (e) {\r\n\r\n var rect = {\r\n x: this.startPoint.x,\r\n y: this.startPoint.y\r\n }, p = this.transformPoint(e.clientX, e.clientY);\r\n\r\n rect.width = p.x - rect.x;\r\n rect.height = p.y - rect.y;\r\n\r\n // Snap the params to the grid we specified\r\n this.snapToGrid(rect);\r\n\r\n // When width is less than zero, we have to draw to the left\r\n // which means we have to move the start-point to the left\r\n if (rect.width < 0) {\r\n rect.x = rect.x + rect.width;\r\n rect.width = -rect.width;\r\n }\r\n\r\n // ...same with height\r\n if (rect.height < 0) {\r\n rect.y = rect.y + rect.height;\r\n rect.height = -rect.height;\r\n }\r\n\r\n // draw the element\r\n this.el.attr(rect);\r\n }\r\n \r\n });\r\n\r\n\r\n SVG.Element.prototype.draw.extend('line polyline polygon', {\r\n\r\n init:function(e){\r\n // When we draw a polygon, we immediately need 2 points.\r\n // One start-point and one point at the mouse-position\r\n\r\n this.set = new SVG.Set();\r\n\r\n var p = this.startPoint,\r\n arr = [\r\n [p.x, p.y],\r\n [p.x, p.y]\r\n ];\r\n\r\n this.el.plot(arr);\r\n\r\n // We draw little circles around each point\r\n // This is absolutely not needed and maybe removed in a later release\r\n this.drawCircles();\r\n\r\n },\r\n\r\n\r\n // The calc-function sets the position of the last point to the mouse-position (with offset ofc)\r\n calc:function (e) {\r\n var arr = this.el.array().valueOf();\r\n arr.pop();\r\n\r\n if (e) {\r\n var p = this.transformPoint(e.clientX, e.clientY);\r\n arr.push(this.snapToGrid([p.x, p.y]));\r\n }\r\n\r\n this.el.plot(arr);\r\n\r\n },\r\n\r\n point:function(e){\r\n\r\n if (this.el.type.indexOf('poly') > -1) {\r\n // Add the new Point to the point-array\r\n var p = this.transformPoint(e.clientX, e.clientY),\r\n arr = this.el.array().valueOf();\r\n\r\n arr.push(this.snapToGrid([p.x, p.y]));\r\n\r\n this.el.plot(arr);\r\n this.drawCircles();\r\n\r\n // Fire the `drawpoint`-event, which holds the coords of the new Point\r\n this.el.fire('drawpoint', {event:e, p:{x:p.x, y:p.y}, m:this.m});\r\n\r\n return;\r\n }\r\n\r\n // We are done, if the element is no polyline or polygon\r\n this.stop(e);\r\n\r\n },\r\n\r\n clean:function(){\r\n\r\n // Remove all circles\r\n this.set.each(function () {\r\n this.remove();\r\n });\r\n\r\n this.set.clear();\r\n\r\n delete this.set;\r\n\r\n },\r\n\r\n drawCircles:function () {\r\n var array = this.el.array().valueOf()\r\n\r\n this.set.each(function () {\r\n this.remove();\r\n });\r\n\r\n this.set.clear();\r\n\r\n for (var i = 0; i < array.length; ++i) {\r\n\r\n this.p.x = array[i][0]\r\n this.p.y = array[i][1]\r\n\r\n var p = this.p.matrixTransform(this.parent.node.getScreenCTM().inverse().multiply(this.el.node.getScreenCTM()));\r\n\r\n this.set.add(this.parent.circle(5).stroke({width: 1}).fill('#ccc').center(p.x, p.y));\r\n }\r\n }\r\n\r\n });\r\n\r\n SVG.Element.prototype.draw.extend('circle', {\r\n \r\n init:function(e){\r\n \r\n var p = this.startPoint;\r\n\r\n this.el.attr({ cx: p.x, cy: p.y, r: 1 });\r\n },\r\n\r\n // We determine the radius by the cursor position\r\n calc:function (e) {\r\n \r\n var p = this.transformPoint(e.clientX, e.clientY),\r\n circle = {\r\n cx: this.startPoint.x,\r\n cy: this.startPoint.y,\r\n\r\n // calculating the radius\r\n r: Math.sqrt(\r\n (p.x - this.startPoint.x) * (p.x - this.startPoint.x) +\r\n (p.y - this.startPoint.y) * (p.y - this.startPoint.y)\r\n )\r\n };\r\n \r\n this.snapToGrid(circle);\r\n this.el.attr(circle);\r\n }\r\n \r\n });\r\n\r\n SVG.Element.prototype.draw.extend('ellipse', {\r\n \r\n init:function(e){\r\n // We start with a circle with radius 1 at the position of the cursor\r\n var p = this.startPoint;\r\n\r\n this.el.attr({ cx: p.x, cy: p.y, rx: 1, ry: 1 });\r\n \r\n },\r\n\r\n calc:function (e) {\r\n var p = this.transformPoint(e.clientX, e.clientY);\r\n \r\n var ellipse = {\r\n cx: this.startPoint.x,\r\n cy: this.startPoint.y,\r\n rx: Math.abs(p.x - this.startPoint.x),\r\n ry: Math.abs(p.y - this.startPoint.y)\r\n };\r\n \r\n this.snapToGrid(ellipse);\r\n this.el.attr(ellipse);\r\n }\r\n \r\n });\r\n}).call(this);","/*\n* Copyright (C) 2019 Intel Corporation\n* SPDX-License-Identifier: MIT\n*/\n\nexport interface Master {\n subscribe(listener: Listener): void;\n unsubscribe(listener: Listener): void;\n unsubscribeAll(): void;\n notify(reason: string): void;\n}\n\nexport interface Listener {\n notify(master: Master, reason: string): void;\n}\n\nexport class MasterImpl implements Master {\n private listeners: Listener[];\n\n public constructor() {\n this.listeners = [];\n }\n\n public subscribe(listener: Listener): void {\n this.listeners.push(listener);\n }\n\n public unsubscribe(listener: Listener): void {\n for (let i = 0; i < this.listeners.length; i++) {\n if (this.listeners[i] === listener) {\n this.listeners.splice(i, 1);\n }\n }\n }\n\n public unsubscribeAll(): void {\n this.listeners = [];\n }\n\n public notify(reason: string): void {\n for (const listener of this.listeners) {\n listener.notify(this, reason);\n }\n }\n}\n","/*\n* Copyright (C) 2019 Intel Corporation\n* SPDX-License-Identifier: MIT\n*/\n\n// Disable till full implementation\n/* eslint class-methods-use-this: \"off\" */\n\nimport { MasterImpl } from './master';\n\nexport interface Size {\n width: number;\n height: number;\n}\n\nexport interface Position {\n x: number;\n y: number;\n}\n\nexport interface Geometry {\n image: Size;\n canvas: Size;\n grid: Size;\n top: number;\n left: number;\n scale: number;\n offset: number;\n angle: number;\n}\n\nexport interface FocusData {\n clientID: number;\n padding: number;\n}\n\nexport interface ActiveElement {\n clientID: number;\n attributeID: number;\n}\n\nexport interface DrawData {\n enabled: boolean;\n shapeType?: string;\n numberOfPoints?: number;\n initialState?: any;\n crosshair?: boolean;\n}\n\nexport enum FrameZoom {\n MIN = 0.1,\n MAX = 10,\n}\n\nexport enum Rotation {\n ANTICLOCKWISE90,\n CLOCKWISE90,\n}\n\nexport enum UpdateReasons {\n IMAGE = 'image',\n OBJECTS = 'objects',\n ZOOM = 'zoom',\n FIT = 'fit',\n MOVE = 'move',\n GRID = 'grid',\n FOCUS = 'focus',\n ACTIVATE = 'activate',\n DRAW = 'draw',\n}\n\nexport interface CanvasModel {\n readonly image: string;\n readonly objects: any[];\n readonly gridSize: Size;\n readonly focusData: FocusData;\n readonly activeElement: ActiveElement;\n readonly objectStateClass: any;\n readonly drawData: DrawData;\n geometry: Geometry;\n\n zoom(x: number, y: number, direction: number): void;\n move(topOffset: number, leftOffset: number): void;\n\n setup(frameData: any, objectStates: any[]): void;\n activate(clientID: number, attributeID: number): void;\n rotate(rotation: Rotation, remember: boolean): void;\n focus(clientID: number, padding: number): void;\n fit(): void;\n grid(stepX: number, stepY: number): void;\n\n draw(drawData: DrawData): void;\n split(enabled: boolean): void;\n group(enabled: boolean): void;\n merge(enabled: boolean): void;\n\n cancel(): void;\n}\n\nexport class CanvasModelImpl extends MasterImpl implements CanvasModel {\n private data: {\n ObjectStateClass: any;\n activeElement: ActiveElement;\n angle: number;\n canvasSize: Size;\n drawData: DrawData;\n image: string;\n imageOffset: number;\n imageSize: Size;\n focusData: FocusData;\n gridSize: Size;\n left: number;\n objects: any[];\n rememberAngle: boolean;\n scale: number;\n top: number;\n };\n\n public constructor(ObjectStateClass: any) {\n super();\n\n this.data = {\n activeElement: {\n clientID: null,\n attributeID: null,\n },\n angle: 0,\n canvasSize: {\n height: 0,\n width: 0,\n },\n drawData: {\n enabled: false,\n shapeType: null,\n numberOfPoints: null,\n initialState: null,\n },\n image: '',\n imageOffset: 0,\n imageSize: {\n height: 0,\n width: 0,\n },\n focusData: {\n clientID: 0,\n padding: 0,\n },\n gridSize: {\n height: 100,\n width: 100,\n },\n left: 0,\n objects: [],\n ObjectStateClass,\n rememberAngle: false,\n scale: 1,\n top: 0,\n };\n }\n\n public zoom(x: number, y: number, direction: number): void {\n const oldScale: number = this.data.scale;\n const newScale: number = direction > 0 ? oldScale * 6 / 5 : oldScale * 5 / 6;\n this.data.scale = Math.min(Math.max(newScale, FrameZoom.MIN), FrameZoom.MAX);\n\n const { angle } = this.data;\n\n const mutiplier = Math.sin(angle * Math.PI / 180) + Math.cos(angle * Math.PI / 180);\n if ((angle / 90) % 2) {\n // 90, 270, ..\n this.data.top += mutiplier * ((x - this.data.imageSize.width / 2)\n * (oldScale / this.data.scale - 1)) * this.data.scale;\n this.data.left -= mutiplier * ((y - this.data.imageSize.height / 2)\n * (oldScale / this.data.scale - 1)) * this.data.scale;\n } else {\n this.data.left += mutiplier * ((x - this.data.imageSize.width / 2)\n * (oldScale / this.data.scale - 1)) * this.data.scale;\n this.data.top += mutiplier * ((y - this.data.imageSize.height / 2)\n * (oldScale / this.data.scale - 1)) * this.data.scale;\n }\n\n this.notify(UpdateReasons.ZOOM);\n }\n\n public move(topOffset: number, leftOffset: number): void {\n this.data.top += topOffset;\n this.data.left += leftOffset;\n this.notify(UpdateReasons.MOVE);\n }\n\n public setup(frameData: any, objectStates: any[]): void {\n frameData.data(\n (): void => {\n this.data.image = '';\n this.notify(UpdateReasons.IMAGE);\n },\n ).then((data: string): void => {\n this.data.imageSize = {\n height: (frameData.height as number),\n width: (frameData.width as number),\n };\n\n if (!this.data.rememberAngle) {\n this.data.angle = 0;\n }\n\n this.data.image = data;\n this.notify(UpdateReasons.IMAGE);\n this.data.objects = objectStates;\n this.notify(UpdateReasons.OBJECTS);\n }).catch((exception: any): void => {\n throw exception;\n });\n }\n\n public activate(clientID: number, attributeID: number): void {\n this.data.activeElement = {\n clientID,\n attributeID,\n };\n\n this.notify(UpdateReasons.ACTIVATE);\n }\n\n public rotate(rotation: Rotation, remember: boolean = false): void {\n if (rotation === Rotation.CLOCKWISE90) {\n this.data.angle += 90;\n } else {\n this.data.angle -= 90;\n }\n\n this.data.angle %= 360;\n this.data.rememberAngle = remember;\n this.fit();\n }\n\n public focus(clientID: number, padding: number): void {\n this.data.focusData = {\n clientID,\n padding,\n };\n\n this.notify(UpdateReasons.FOCUS);\n }\n\n public fit(): void {\n const { angle } = this.data;\n\n if ((angle / 90) % 2) {\n // 90, 270, ..\n this.data.scale = Math.min(\n this.data.canvasSize.width / this.data.imageSize.height,\n this.data.canvasSize.height / this.data.imageSize.width,\n );\n } else {\n this.data.scale = Math.min(\n this.data.canvasSize.width / this.data.imageSize.width,\n this.data.canvasSize.height / this.data.imageSize.height,\n );\n }\n\n this.data.scale = Math.min(\n Math.max(this.data.scale, FrameZoom.MIN),\n FrameZoom.MAX,\n );\n\n this.data.top = (this.data.canvasSize.height / 2 - this.data.imageSize.height / 2);\n this.data.left = (this.data.canvasSize.width / 2 - this.data.imageSize.width / 2);\n\n this.notify(UpdateReasons.FIT);\n }\n\n public grid(stepX: number, stepY: number): void {\n this.data.gridSize = {\n height: stepY,\n width: stepX,\n };\n\n this.notify(UpdateReasons.GRID);\n }\n\n public draw(drawData: DrawData): void {\n if (drawData.enabled) {\n if (this.data.drawData.enabled) {\n throw new Error('Drawing has been already started');\n } else if (!drawData.shapeType) {\n throw new Error('A shape type is not specified');\n } else if (typeof (drawData.numberOfPoints) !== 'undefined') {\n if (drawData.shapeType === 'polygon' && drawData.numberOfPoints < 3) {\n throw new Error('A polygon consists of at least 3 points');\n } else if (drawData.shapeType === 'polyline' && drawData.numberOfPoints < 2) {\n throw new Error('A polyline consists of at least 2 points');\n }\n }\n }\n\n this.data.drawData = Object.assign({}, drawData);\n this.notify(UpdateReasons.DRAW);\n }\n\n public split(enabled: boolean): any {\n return enabled;\n }\n\n public group(enabled: boolean): any {\n return enabled;\n }\n\n public merge(enabled: boolean): any {\n return enabled;\n }\n\n public cancel(): void {\n console.log('hello');\n }\n\n public get geometry(): Geometry {\n return {\n angle: this.data.angle,\n canvas: Object.assign({}, this.data.canvasSize),\n image: Object.assign({}, this.data.imageSize),\n grid: Object.assign({}, this.data.gridSize),\n left: this.data.left,\n offset: this.data.imageOffset,\n scale: this.data.scale,\n top: this.data.top,\n };\n }\n\n public set geometry(geometry: Geometry) {\n this.data.angle = geometry.angle;\n this.data.canvasSize = Object.assign({}, geometry.canvas);\n this.data.imageSize = Object.assign({}, geometry.image);\n this.data.gridSize = Object.assign({}, geometry.grid);\n this.data.left = geometry.left;\n this.data.top = geometry.top;\n this.data.imageOffset = geometry.offset;\n this.data.scale = geometry.scale;\n\n this.data.imageOffset = Math.floor(Math.max(\n this.data.canvasSize.height / FrameZoom.MIN,\n this.data.canvasSize.width / FrameZoom.MIN,\n ));\n }\n\n public get image(): string {\n return this.data.image;\n }\n\n public get objects(): any[] {\n return this.data.objects;\n }\n\n public get gridSize(): Size {\n return Object.assign({}, this.data.gridSize);\n }\n\n public get focusData(): FocusData {\n return Object.assign({}, this.data.focusData);\n }\n\n public get activeElement(): ActiveElement {\n return Object.assign({}, this.data.activeElement);\n }\n\n public get objectStateClass(): any {\n return this.data.ObjectStateClass;\n }\n\n public get drawData(): DrawData {\n return Object.assign({}, this.data.drawData);\n }\n}\n","/*\n* Copyright (C) 2019 Intel Corporation\n* SPDX-License-Identifier: MIT\n*/\n\nimport {\n CanvasModel,\n Geometry,\n Position,\n FocusData,\n ActiveElement,\n DrawData,\n} from './canvasModel';\n\nexport interface CanvasController {\n readonly objects: any[];\n readonly focusData: FocusData;\n readonly activeElement: ActiveElement;\n readonly objectStateClass: any;\n readonly drawData: DrawData;\n geometry: Geometry;\n\n zoom(x: number, y: number, direction: number): void;\n draw(drawData: DrawData): void;\n enableDrag(x: number, y: number): void;\n drag(x: number, y: number): void;\n disableDrag(): void;\n\n fit(): void;\n}\n\nexport class CanvasControllerImpl implements CanvasController {\n private model: CanvasModel;\n private lastDragPosition: Position;\n private isDragging: boolean;\n\n public constructor(model: CanvasModel) {\n this.model = model;\n }\n\n public zoom(x: number, y: number, direction: number): void {\n this.model.zoom(x, y, direction);\n }\n\n public fit(): void {\n this.model.fit();\n }\n\n public enableDrag(x: number, y: number): void {\n this.lastDragPosition = {\n x,\n y,\n };\n this.isDragging = true;\n }\n\n public drag(x: number, y: number): void {\n if (this.isDragging) {\n const topOffset: number = y - this.lastDragPosition.y;\n const leftOffset: number = x - this.lastDragPosition.x;\n this.lastDragPosition = {\n x,\n y,\n };\n this.model.move(topOffset, leftOffset);\n }\n }\n\n public disableDrag(): void {\n this.isDragging = false;\n }\n\n public draw(drawData: DrawData): void {\n this.model.draw(drawData);\n }\n\n public get geometry(): Geometry {\n return this.model.geometry;\n }\n\n public set geometry(geometry: Geometry) {\n this.model.geometry = geometry;\n }\n\n public get objects(): any[] {\n return this.model.objects;\n }\n\n public get focusData(): FocusData {\n return this.model.focusData;\n }\n\n public get activeElement(): ActiveElement {\n return this.model.activeElement;\n }\n\n public get objectStateClass(): any {\n return this.model.objectStateClass;\n }\n\n public get drawData(): DrawData {\n return this.model.drawData;\n }\n}\n","/*\n* Copyright (C) 2019 Intel Corporation\n* SPDX-License-Identifier: MIT\n*/\n\nconst BASE_STROKE_WIDTH = 2;\nconst BASE_POINT_SIZE = 8;\nconst TEXT_MARGIN = 10;\nconst AREA_THRESHOLD = 9;\nconst SIZE_THRESHOLD = 3;\n\nexport default {\n BASE_STROKE_WIDTH,\n BASE_POINT_SIZE,\n TEXT_MARGIN,\n AREA_THRESHOLD,\n SIZE_THRESHOLD,\n};\n","import * as SVG from 'svg.js';\n\n/* eslint-disable */\n\nimport 'svg.draggable.js';\nimport 'svg.resize.js';\nimport 'svg.select.js';\nimport 'svg.draw.js';\n\n// Update constructor\nconst originalDraw = SVG.Element.prototype.draw;\nSVG.Element.prototype.draw = function constructor(...args: any): any {\n let handler = this.remember('_paintHandler');\n if (!handler) {\n originalDraw.call(this, ...args);\n handler = this.remember('_paintHandler');\n handler.set = new SVG.Set();\n } else {\n originalDraw.call(this, ...args);\n }\n\n return this;\n};\nfor (const key of Object.keys(originalDraw)) {\n SVG.Element.prototype.draw[key] = originalDraw[key];\n}\n\n// Create undo for polygones and polylines\nfunction undo(): void {\n if (this.set.length()) {\n this.set.members.splice(-1, 1)[0].remove();\n this.el.array().value.splice(-2, 1);\n this.el.plot(this.el.array());\n this.el.fire('undopoint');\n }\n}\n\nSVG.Element.prototype.draw.extend('polyline', Object.assign({},\n SVG.Element.prototype.draw.plugins.polyline,\n {\n undo: undo,\n },\n));\n\nSVG.Element.prototype.draw.extend('polygon', Object.assign({},\n SVG.Element.prototype.draw.plugins.polygon,\n {\n undo: undo,\n },\n));\n\n\n// Create transform for rect, polyline and polygon\nfunction transform(): void {\n this.m = this.el.node.getScreenCTM().inverse();\n this.offset = { x: window.pageXOffset, y: window.pageYOffset };\n}\n\nSVG.Element.prototype.draw.extend('rect', Object.assign({},\n SVG.Element.prototype.draw.plugins.rect,\n {\n transform: transform,\n },\n));\n\nSVG.Element.prototype.draw.extend('polyline', Object.assign({},\n SVG.Element.prototype.draw.plugins.polyline,\n {\n transform: transform,\n },\n));\n\nSVG.Element.prototype.draw.extend('polygon', Object.assign({},\n SVG.Element.prototype.draw.plugins.polygon,\n {\n transform: transform,\n },\n));\n\n// Fix method drawCircles\nfunction drawCircles(): void {\n const array = this.el.array().valueOf();\n\n this.set.each(function (): void {\n this.remove();\n });\n\n this.set.clear();\n\n for (let i = 0; i < array.length - 1; ++i) {\n [this.p.x] = array[i];\n [, this.p.y] = array[i];\n\n const p = this.p.matrixTransform(\n this.parent.node.getScreenCTM()\n .inverse()\n .multiply(this.el.node.getScreenCTM()),\n );\n\n this.set.add(\n this.parent\n .circle(5)\n .stroke({\n width: 1,\n }).fill('#ccc')\n .center(p.x, p.y),\n );\n }\n}\n\nSVG.Element.prototype.draw.extend('line', Object.assign({},\n SVG.Element.prototype.draw.plugins.line,\n {\n drawCircles: drawCircles,\n }\n));\n\nSVG.Element.prototype.draw.extend('polyline', Object.assign({},\n SVG.Element.prototype.draw.plugins.polyline,\n {\n drawCircles: drawCircles,\n }\n));\n\nSVG.Element.prototype.draw.extend('polygon', Object.assign({},\n SVG.Element.prototype.draw.plugins.polygon,\n {\n drawCircles: drawCircles,\n }\n));\n\n// Fix method drag\nconst originalDraggable = SVG.Element.prototype.draggable;\nSVG.Element.prototype.draggable = function constructor(...args: any): any {\n let handler = this.remember('_draggable');\n if (!handler) {\n originalDraggable.call(this, ...args);\n handler = this.remember('_draggable');\n handler.drag = function(e: any) {\n this.m = this.el.node.getScreenCTM().inverse();\n handler.constructor.prototype.drag.call(this, e);\n }\n } else {\n originalDraggable.call(this, ...args);\n }\n\n return this;\n};\nfor (const key of Object.keys(originalDraggable)) {\n SVG.Element.prototype.draggable[key] = originalDraggable[key];\n}\n\n// Fix method resize\nconst originalResize = SVG.Element.prototype.resize;\nSVG.Element.prototype.resize = function constructor(...args: any): any {\n let handler = this.remember('_resizeHandler');\n if (!handler) {\n originalResize.call(this, ...args);\n handler = this.remember('_resizeHandler');\n handler.update = function(e: any) {\n this.m = this.el.node.getScreenCTM().inverse();\n handler.constructor.prototype.update.call(this, e);\n }\n } else {\n originalResize.call(this, ...args);\n }\n\n return this;\n};\nfor (const key of Object.keys(originalResize)) {\n SVG.Element.prototype.resize[key] = originalResize[key];\n}\n","/*\n* Copyright (C) 2019 Intel Corporation\n* SPDX-License-Identifier: MIT\n*/\n\n// Translate point array from the client coordinate system\n// to a coordinate system of a canvas\nexport function translateFromSVG(svg: SVGSVGElement, points: number[]): number[] {\n const output = [];\n const transformationMatrix = svg.getScreenCTM();\n let pt = svg.createSVGPoint();\n for (let i = 0; i < points.length - 1; i += 2) {\n pt.x = points[i];\n pt.y = points[i + 1];\n pt = pt.matrixTransform(transformationMatrix);\n output.push(pt.x, pt.y);\n }\n\n return output;\n}\n\n// Translate point array from a coordinate system of a canvas\n// to the client coordinate system\nexport function translateToSVG(svg: SVGSVGElement, points: number[]): number[] {\n const output = [];\n const transformationMatrix = svg.getScreenCTM().inverse();\n let pt = svg.createSVGPoint();\n for (let i = 0; i < points.length; i += 2) {\n pt.x = points[i];\n pt.y = points[i + 1];\n pt = pt.matrixTransform(transformationMatrix);\n output.push(pt.x, pt.y);\n }\n\n return output;\n}\n","/*\n* Copyright (C) 2019 Intel Corporation\n* SPDX-License-Identifier: MIT\n*/\n\nimport * as SVG from 'svg.js';\nimport consts from './consts';\nimport 'svg.draw.js';\nimport './svg.patch';\n\nimport {\n DrawData,\n Geometry,\n} from './canvasModel';\n\nimport {\n translateToSVG,\n translateFromSVG,\n} from './shared';\n\nexport interface DrawHandler {\n draw(drawData: DrawData, geometry: Geometry): void;\n}\n\nexport class DrawHandlerImpl implements DrawHandler {\n private onDrawDone: any; // callback is used to notify about creating new shape\n private canvas: SVG.Container;\n private background: SVGSVGElement;\n private crosshair: {\n x: SVG.Line;\n y: SVG.Line;\n };\n private drawData: DrawData;\n private geometry: Geometry;\n private drawInstance: any;\n\n\n private addCrosshair(): void {\n this.crosshair = {\n x: this.canvas.line(0, 0, this.canvas.node.clientWidth, 0).attr({\n 'stroke-width': consts.BASE_STROKE_WIDTH / (2 * this.geometry.scale),\n zOrder: Number.MAX_SAFE_INTEGER,\n }).addClass('cvat_canvas_crosshair'),\n y: this.canvas.line(0, 0, 0, this.canvas.node.clientHeight).attr({\n 'stroke-width': consts.BASE_STROKE_WIDTH / (2 * this.geometry.scale),\n zOrder: Number.MAX_SAFE_INTEGER,\n }).addClass('cvat_canvas_crosshair'),\n };\n }\n\n private removeCrosshair(): void {\n this.crosshair.x.remove();\n this.crosshair.y.remove();\n this.crosshair = null;\n }\n\n private initDrawing(): void {\n if (this.drawData.crosshair) {\n this.addCrosshair();\n }\n }\n\n private closeDrawing(): void {\n if (this.crosshair) {\n this.removeCrosshair();\n }\n\n if (this.drawInstance) {\n if (this.drawData.shapeType === 'rectangle') {\n this.drawInstance.draw('cancel');\n } else {\n this.drawInstance.draw('done');\n }\n\n // We should check again because state can be changed in 'cancel' and 'done'\n if (this.drawInstance) {\n this.drawInstance.remove();\n this.drawInstance = null;\n }\n }\n }\n\n private drawBox(): void {\n this.drawInstance = this.canvas.rect();\n this.drawInstance.draw({\n snapToGrid: 0.1,\n }).addClass('cvat_canvas_shape_drawing').attr({\n 'stroke-width': consts.BASE_STROKE_WIDTH / this.geometry.scale,\n }).on('drawstop', (e: Event): void => {\n const frameWidth = this.geometry.image.width;\n const frameHeight = this.geometry.image.height;\n const bbox = (e.target as SVGRectElement).getBBox();\n\n let [xtl, ytl, xbr, ybr] = translateFromSVG(\n this.canvas.node as any as SVGSVGElement,\n [bbox.x, bbox.y, bbox.x + bbox.width, bbox.y + bbox.height],\n );\n\n ([xtl, ytl, xbr, ybr] = translateToSVG(\n this.background,\n [xtl, ytl, xbr, ybr],\n ));\n\n xtl = Math.min(Math.max(xtl, 0), frameWidth);\n xbr = Math.min(Math.max(xbr, 0), frameWidth);\n ytl = Math.min(Math.max(ytl, 0), frameHeight);\n ybr = Math.min(Math.max(ybr, 0), frameHeight);\n\n if ((xbr - xtl) * (ybr - ytl) >= consts.AREA_THRESHOLD) {\n this.onDrawDone({\n points: [xtl, ytl, xbr, ybr],\n });\n } else {\n this.onDrawDone(null);\n }\n });\n }\n\n private drawPolyshape(): void {\n let size = this.drawData.numberOfPoints;\n const sizeDecrement = function sizeDecrement(): void {\n if (!--size) {\n this.drawInstance.draw('done');\n }\n }.bind(this);\n\n const sizeIncrement = function sizeIncrement(): void {\n size++;\n };\n\n if (this.drawData.numberOfPoints) {\n this.drawInstance.on('drawstart', sizeDecrement);\n this.drawInstance.on('drawpoint', sizeDecrement);\n this.drawInstance.on('undopoint', sizeIncrement);\n }\n\n // Add ability to cancel the latest drawn point\n const handleUndo = function handleUndo(e: MouseEvent): void {\n if (e.which === 3) {\n e.stopPropagation();\n e.preventDefault();\n this.drawInstance.draw('undo');\n }\n }.bind(this);\n this.canvas.node.addEventListener('mousedown', handleUndo);\n\n // Add ability to draw shapes by sliding\n // We need to remember last drawn point\n // to implementation of slide drawing\n const lastDrawnPoint: {\n x: number;\n y: number;\n } = {\n x: null,\n y: null,\n };\n\n const handleSlide = function handleSlide(e: MouseEvent): void {\n // TODO: Use enumeration after typification cvat-core\n if (e.shiftKey && ['polygon', 'polyline'].includes(this.drawData.shapeType)) {\n if (lastDrawnPoint.x === null || lastDrawnPoint.y === null) {\n this.drawInstance.draw('point', e);\n } else {\n const deltaTreshold = 15;\n const delta = Math.sqrt(\n ((e.clientX - lastDrawnPoint.x) ** 2)\n + ((e.clientY - lastDrawnPoint.y) ** 2),\n );\n if (delta > deltaTreshold) {\n this.drawInstance.draw('point', e);\n }\n }\n }\n }.bind(this);\n this.canvas.node.addEventListener('mousemove', handleSlide);\n\n // We need scale just drawn points\n const self = this;\n this.drawInstance.on('drawstart drawpoint', (e: CustomEvent): void => {\n self.transform(self.geometry);\n lastDrawnPoint.x = e.detail.event.clientX;\n lastDrawnPoint.y = e.detail.event.clientY;\n });\n\n this.drawInstance.on('drawstop', (): void => {\n self.canvas.node.removeEventListener('mousedown', handleUndo);\n self.canvas.node.removeEventListener('mousemove', handleSlide);\n });\n\n this.drawInstance.on('drawdone', (e: CustomEvent): void => {\n let points = translateFromSVG(\n this.canvas.node as any as SVGSVGElement,\n (e.target as SVGElement)\n .getAttribute('points')\n .split(/[,\\s]/g)\n .map((coord): number => +coord),\n );\n\n points = translateToSVG(\n this.background,\n points,\n );\n\n const bbox = {\n xtl: Number.MAX_SAFE_INTEGER,\n ytl: Number.MAX_SAFE_INTEGER,\n xbr: Number.MAX_SAFE_INTEGER,\n ybr: Number.MAX_SAFE_INTEGER,\n };\n\n const frameWidth = this.geometry.image.width;\n const frameHeight = this.geometry.image.height;\n for (let i = 0; i < points.length - 1; i += 2) {\n points[i] = Math.min(Math.max(points[i], 0), frameWidth);\n points[i + 1] = Math.min(Math.max(points[i + 1], 0), frameHeight);\n\n bbox.xtl = Math.min(bbox.xtl, points[i]);\n bbox.ytl = Math.min(bbox.ytl, points[i + 1]);\n bbox.xbr = Math.max(bbox.xbr, points[i]);\n bbox.ybr = Math.max(bbox.ybr, points[i + 1]);\n }\n\n if (this.drawData.shapeType === 'polygon'\n && ((bbox.xbr - bbox.xtl) * (bbox.ybr - bbox.ytl) >= consts.AREA_THRESHOLD)) {\n this.onDrawDone({\n points,\n });\n } else if (this.drawData.shapeType === 'polyline'\n && ((bbox.xbr - bbox.xtl) >= consts.SIZE_THRESHOLD\n || (bbox.ybr - bbox.ytl) >= consts.SIZE_THRESHOLD)) {\n this.onDrawDone({\n points,\n });\n } else if (this.drawData.shapeType === 'points') {\n this.onDrawDone({\n points,\n });\n } else {\n this.onDrawDone(null);\n }\n });\n }\n\n private drawPolygon(): void {\n this.drawInstance = (this.canvas as any).polygon().draw({\n snapToGrid: 0.1,\n }).addClass('cvat_canvas_shape_drawing').style({\n 'stroke-width': consts.BASE_STROKE_WIDTH / this.geometry.scale,\n });\n\n this.drawPolyshape();\n }\n\n private drawPolyline(): void {\n this.drawInstance = (this.canvas as any).polyline().draw({\n snapToGrid: 0.1,\n }).addClass('cvat_canvas_shape_drawing').style({\n 'stroke-width': consts.BASE_STROKE_WIDTH / this.geometry.scale,\n 'fill-opacity': 0,\n });\n\n this.drawPolyshape();\n }\n\n private drawPoints(): void {\n this.drawInstance = (this.canvas as any).polygon().draw({\n snapToGrid: 0.1,\n }).addClass('cvat_canvas_shape_drawing').style({\n 'stroke-width': 0,\n opacity: 0,\n });\n\n this.drawPolyshape();\n }\n\n private startDraw(): void {\n // TODO: Use enums after typification cvat-core\n if (this.drawData.shapeType === 'rectangle') {\n this.drawBox();\n } else if (this.drawData.shapeType === 'polygon') {\n this.drawPolygon();\n } else if (this.drawData.shapeType === 'polyline') {\n this.drawPolyline();\n } else if (this.drawData.shapeType === 'points') {\n this.drawPoints();\n }\n }\n\n public constructor(onDrawDone: any, canvas: SVG.Container, background: SVGSVGElement) {\n this.onDrawDone = onDrawDone;\n this.canvas = canvas;\n this.background = background;\n this.drawData = null;\n this.geometry = null;\n this.crosshair = null;\n this.drawInstance = null;\n\n this.canvas.node.addEventListener('mousemove', (e): void => {\n if (this.crosshair) {\n const [x, y] = translateToSVG(\n this.canvas.node as any as SVGSVGElement,\n [e.clientX, e.clientY],\n );\n\n this.crosshair.x.attr({\n y1: y,\n y2: y,\n });\n\n this.crosshair.y.attr({\n x1: x,\n x2: x,\n });\n }\n });\n }\n\n public transform(geometry: Geometry): void {\n this.geometry = geometry;\n\n if (this.crosshair) {\n this.crosshair.x.attr({\n 'stroke-width': consts.BASE_STROKE_WIDTH / (2 * geometry.scale),\n });\n this.crosshair.y.attr({\n 'stroke-width': consts.BASE_STROKE_WIDTH / (2 * geometry.scale),\n });\n }\n\n if (this.drawInstance) {\n this.drawInstance.draw('transform');\n this.drawInstance.style({\n 'stroke-width': consts.BASE_STROKE_WIDTH / geometry.scale,\n });\n\n const paintHandler = this.drawInstance.remember('_paintHandler');\n\n for (const point of (paintHandler as any).set.members) {\n point.style(\n 'stroke-width',\n `${consts.BASE_STROKE_WIDTH / (3 * geometry.scale)}`,\n );\n point.attr(\n 'r',\n `${consts.BASE_POINT_SIZE / (2 * geometry.scale)}`,\n );\n }\n }\n }\n\n public draw(drawData: DrawData, geometry: Geometry): void {\n this.geometry = geometry;\n\n if (drawData.enabled) {\n this.drawData = drawData;\n this.initDrawing();\n this.startDraw();\n } else {\n this.closeDrawing();\n this.drawData = drawData;\n }\n }\n}\n\n// TODO: handle initial state\n","/*\n* Copyright (C) 2019 Intel Corporation\n* SPDX-License-Identifier: MIT\n*/\n\n// Disable till full implementation\n/* eslint class-methods-use-this: \"off\" */\n\nimport * as SVG from 'svg.js';\n\n// tslint:disable-next-line: ordered-imports\nimport 'svg.draggable.js';\nimport 'svg.resize.js';\nimport 'svg.select.js';\n\nimport { CanvasController } from './canvasController';\nimport { Listener, Master } from './master';\nimport { DrawHandler, DrawHandlerImpl } from './drawHandler';\nimport { translateToSVG, translateFromSVG } from './shared';\nimport consts from './consts';\nimport {\n CanvasModel,\n Geometry,\n Size,\n UpdateReasons,\n FocusData,\n FrameZoom,\n ActiveElement,\n DrawData,\n} from './canvasModel';\n\nexport interface CanvasView {\n html(): HTMLDivElement;\n}\n\n\ninterface ShapeDict {\n [index: number]: SVG.Shape;\n}\n\ninterface TextDict {\n [index: number]: SVG.Text;\n}\n\nenum Mode {\n IDLE = 'idle',\n DRAG = 'drag',\n RESIZE = 'resize',\n DRAW = 'draw',\n}\n\nfunction darker(color: string, percentage: number): string {\n const R = Math.round(parseInt(color.slice(1, 3), 16) * (1 - percentage / 100));\n const G = Math.round(parseInt(color.slice(3, 5), 16) * (1 - percentage / 100));\n const B = Math.round(parseInt(color.slice(5, 7), 16) * (1 - percentage / 100));\n\n const rHex = Math.max(0, R).toString(16);\n const gHex = Math.max(0, G).toString(16);\n const bHex = Math.max(0, B).toString(16);\n\n return `#${rHex.length === 1 ? `0${rHex}` : rHex}`\n + `${gHex.length === 1 ? `0${gHex}` : gHex}`\n + `${bHex.length === 1 ? `0${bHex}` : bHex}`;\n}\n\nexport class CanvasViewImpl implements CanvasView, Listener {\n private loadingAnimation: SVGSVGElement;\n private text: SVGSVGElement;\n private adoptedText: SVG.Container;\n private background: SVGSVGElement;\n private grid: SVGSVGElement;\n private content: SVGSVGElement;\n private adoptedContent: SVG.Container;\n private canvas: HTMLDivElement;\n private gridPath: SVGPathElement;\n private gridPattern: SVGPatternElement;\n private controller: CanvasController;\n private svgShapes: ShapeDict;\n private svgTexts: TextDict;\n private drawHandler: DrawHandler;\n private activeElement: {\n state: any;\n attributeID: number;\n };\n\n private mode: Mode;\n\n private onDrawDone(data: Record): void {\n if (data) {\n const event: CustomEvent = new CustomEvent('canvas.drawn', {\n bubbles: false,\n cancelable: true,\n detail: {\n // eslint-disable-next-line new-cap\n state: new this.controller.objectStateClass(data),\n },\n });\n\n this.canvas.dispatchEvent(event);\n } else {\n const event: CustomEvent = new CustomEvent('canvas.canceled', {\n bubbles: false,\n cancelable: true,\n });\n\n this.canvas.dispatchEvent(event);\n }\n\n this.controller.draw({\n enabled: false,\n });\n }\n\n public constructor(model: CanvasModel & Master, controller: CanvasController) {\n this.controller = controller;\n this.svgShapes = {};\n this.svgTexts = {};\n this.activeElement = null;\n this.mode = Mode.IDLE;\n\n // Create HTML elements\n this.loadingAnimation = window.document\n .createElementNS('http://www.w3.org/2000/svg', 'svg');\n this.text = window.document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n this.adoptedText = (SVG.adopt((this.text as any as HTMLElement)) as SVG.Container);\n this.background = window.document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n\n this.grid = window.document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n this.gridPath = window.document.createElementNS('http://www.w3.org/2000/svg', 'path');\n this.gridPattern = window.document.createElementNS('http://www.w3.org/2000/svg', 'pattern');\n\n this.content = window.document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n this.adoptedContent = (SVG.adopt((this.content as any as HTMLElement)) as SVG.Container);\n this.drawHandler = new DrawHandlerImpl(\n this.onDrawDone.bind(this),\n this.adoptedContent,\n this.background,\n );\n this.canvas = window.document.createElement('div');\n\n const loadingCircle: SVGCircleElement = window.document\n .createElementNS('http://www.w3.org/2000/svg', 'circle');\n const gridDefs: SVGDefsElement = window.document\n .createElementNS('http://www.w3.org/2000/svg', 'defs');\n const gridRect: SVGRectElement = window.document\n .createElementNS('http://www.w3.org/2000/svg', 'rect');\n\n // Setup loading animation\n this.loadingAnimation.setAttribute('id', 'cvat_canvas_loading_animation');\n loadingCircle.setAttribute('id', 'cvat_canvas_loading_circle');\n loadingCircle.setAttribute('r', '30');\n loadingCircle.setAttribute('cx', '50%');\n loadingCircle.setAttribute('cy', '50%');\n\n // Setup grid\n this.grid.setAttribute('id', 'cvat_canvas_grid');\n this.grid.setAttribute('version', '2');\n this.gridPath.setAttribute('d', 'M 1000 0 L 0 0 0 1000');\n this.gridPath.setAttribute('fill', 'none');\n this.gridPath.setAttribute('stroke-width', '1.5');\n this.gridPattern.setAttribute('id', 'cvat_canvas_grid_pattern');\n this.gridPattern.setAttribute('width', '100');\n this.gridPattern.setAttribute('height', '100');\n this.gridPattern.setAttribute('patternUnits', 'userSpaceOnUse');\n gridRect.setAttribute('width', '100%');\n gridRect.setAttribute('height', '100%');\n gridRect.setAttribute('fill', 'url(#cvat_canvas_grid_pattern)');\n\n // Setup content\n this.text.setAttribute('id', 'cvat_canvas_text_content');\n this.background.setAttribute('id', 'cvat_canvas_background');\n this.content.setAttribute('id', 'cvat_canvas_content');\n\n // Setup wrappers\n this.canvas.setAttribute('id', 'cvat_canvas_wrapper');\n\n // Unite created HTML elements together\n this.loadingAnimation.appendChild(loadingCircle);\n this.grid.appendChild(gridDefs);\n this.grid.appendChild(gridRect);\n\n gridDefs.appendChild(this.gridPattern);\n this.gridPattern.appendChild(this.gridPath);\n\n this.canvas.appendChild(this.loadingAnimation);\n this.canvas.appendChild(this.text);\n this.canvas.appendChild(this.background);\n this.canvas.appendChild(this.grid);\n this.canvas.appendChild(this.content);\n\n\n // A little hack to get size after first mounting\n // http://www.backalleycoder.com/2012/04/25/i-want-a-damnodeinserted/\n const self = this;\n const canvasFirstMounted = (event: AnimationEvent): void => {\n if (event.animationName === 'loadingAnimation') {\n const { geometry } = this.controller;\n geometry.canvas = {\n height: self.canvas.clientHeight,\n width: self.canvas.clientWidth,\n };\n\n this.controller.geometry = geometry;\n self.canvas.removeEventListener('animationstart', canvasFirstMounted);\n }\n };\n\n this.canvas.addEventListener('animationstart', canvasFirstMounted);\n\n this.content.addEventListener('dblclick', (): void => {\n self.controller.fit();\n });\n\n this.content.addEventListener('mousedown', (event): void => {\n if ((event.which === 1 && this.mode === Mode.IDLE) || (event.which === 2)) {\n self.controller.enableDrag(event.clientX, event.clientY);\n }\n });\n\n this.content.addEventListener('mousemove', (event): void => {\n self.controller.drag(event.clientX, event.clientY);\n });\n\n window.document.addEventListener('mouseup', (event): void => {\n if (event.which === 1 || event.which === 2) {\n self.controller.disableDrag();\n }\n });\n\n this.content.addEventListener('wheel', (event): void => {\n const point = translateToSVG(self.background, [event.clientX, event.clientY]);\n self.controller.zoom(point[0], point[1], event.deltaY > 0 ? -1 : 1);\n event.preventDefault();\n });\n\n this.content.addEventListener('mousemove', (e): void => {\n if (this.mode !== Mode.IDLE) return;\n\n const [x, y] = translateToSVG(this.background, [e.clientX, e.clientY]);\n const event: CustomEvent = new CustomEvent('canvas.moved', {\n bubbles: false,\n cancelable: true,\n detail: {\n x,\n y,\n objects: this.controller.objects,\n },\n });\n\n this.canvas.dispatchEvent(event);\n });\n\n this.content.oncontextmenu = (): boolean => false;\n model.subscribe(this);\n }\n\n public notify(model: CanvasModel & Master, reason: UpdateReasons): void {\n function transform(geometry: Geometry): void {\n // Transform canvas\n for (const obj of [this.background, this.grid, this.loadingAnimation, this.content]) {\n obj.style.transform = `scale(${geometry.scale}) rotate(${geometry.angle}deg)`;\n }\n\n // Transform grid\n this.gridPath.setAttribute('stroke-width', `${consts.BASE_STROKE_WIDTH / (2 * geometry.scale)}px`);\n\n // Transform all shape points\n for (const element of window.document.getElementsByClassName('svg_select_points')) {\n element.setAttribute(\n 'stroke-width',\n `${consts.BASE_STROKE_WIDTH / (3 * geometry.scale)}`,\n );\n element.setAttribute(\n 'r',\n `${consts.BASE_POINT_SIZE / (2 * geometry.scale)}`,\n );\n }\n\n for (const element of\n window.document.getElementsByClassName('cvat_canvas_selected_point')) {\n element.setAttribute(\n 'stroke-width',\n `${+element.getAttribute('stroke-width') * 2}`,\n );\n }\n\n // Transform all drawn shapes\n for (const key in this.svgShapes) {\n if (Object.prototype.hasOwnProperty.call(this.svgShapes, key)) {\n const object = this.svgShapes[key];\n if (object.attr('stroke-width')) {\n object.attr({\n 'stroke-width': consts.BASE_STROKE_WIDTH / (geometry.scale),\n });\n }\n }\n }\n\n // Transform all text\n for (const key in this.svgShapes) {\n if (Object.prototype.hasOwnProperty.call(this.svgShapes, key)\n && Object.prototype.hasOwnProperty.call(this.svgTexts, key)) {\n this.updateTextPosition(\n this.svgTexts[key],\n this.svgShapes[key],\n );\n }\n }\n\n // Transform handlers\n this.drawHandler.transform(geometry);\n }\n\n function resize(geometry: Geometry): void {\n for (const obj of [this.background, this.grid, this.loadingAnimation]) {\n obj.style.width = `${geometry.image.width}px`;\n obj.style.height = `${geometry.image.height}px`;\n }\n\n for (const obj of [this.content, this.text]) {\n obj.style.width = `${geometry.image.width + geometry.offset * 2}px`;\n obj.style.height = `${geometry.image.height + geometry.offset * 2}px`;\n }\n }\n\n function move(geometry: Geometry): void {\n for (const obj of [this.background, this.grid, this.loadingAnimation]) {\n obj.style.top = `${geometry.top}px`;\n obj.style.left = `${geometry.left}px`;\n }\n\n for (const obj of [this.content, this.text]) {\n obj.style.top = `${geometry.top - geometry.offset}px`;\n obj.style.left = `${geometry.left - geometry.offset}px`;\n }\n\n // Transform handlers\n this.drawHandler.transform(geometry);\n }\n\n function computeFocus(focusData: FocusData, geometry: Geometry): void {\n // This computation cann't be done in the model because of lack of data\n const object = this.svgShapes[focusData.clientID];\n if (!object) {\n return;\n }\n\n // First of all, compute and apply scale\n\n let scale = null;\n const bbox: SVG.BBox = object.node.getBBox();\n if ((geometry.angle / 90) % 2) {\n // 90, 270, ..\n scale = Math.min(Math.max(Math.min(\n geometry.canvas.width / bbox.height,\n geometry.canvas.height / bbox.width,\n ), FrameZoom.MIN), FrameZoom.MAX);\n } else {\n scale = Math.min(Math.max(Math.min(\n geometry.canvas.width / bbox.width,\n geometry.canvas.height / bbox.height,\n ), FrameZoom.MIN), FrameZoom.MAX);\n }\n\n transform.call(this, Object.assign({}, geometry, {\n scale,\n }));\n\n const [x, y] = translateFromSVG(this.content, [\n bbox.x + bbox.width / 2,\n bbox.y + bbox.height / 2,\n ]);\n\n const [cx, cy] = [\n this.canvas.clientWidth / 2 + this.canvas.offsetLeft,\n this.canvas.clientHeight / 2 + this.canvas.offsetTop,\n ];\n\n const dragged = Object.assign({}, geometry, {\n top: geometry.top + cy - y,\n left: geometry.left + cx - x,\n scale,\n });\n\n this.controller.geometry = dragged;\n move.call(this, dragged);\n }\n\n function setupObjects(objects: any[], geometry: Geometry): void {\n const ctm = this.content.getScreenCTM()\n .inverse().multiply(this.background.getScreenCTM());\n\n this.deactivate();\n\n // TODO: Compute difference\n\n // Instead of simple clearing let's remove all objects properly\n for (const id of Object.keys(this.svgShapes)) {\n if (id in this.svgTexts) {\n this.svgTexts[id].remove();\n }\n\n this.svgShapes[id].remove();\n }\n\n this.svgTexts = {};\n this.svgShapes = {};\n\n this.addObjects(ctm, objects, geometry);\n // TODO: Update objects\n // TODO: Delete objects\n }\n\n const { geometry } = this.controller;\n if (reason === UpdateReasons.IMAGE) {\n if (!model.image.length) {\n this.loadingAnimation.classList.remove('cvat_canvas_hidden');\n } else {\n this.loadingAnimation.classList.add('cvat_canvas_hidden');\n this.background.style.backgroundImage = `url(\"${model.image}\")`;\n move.call(this, geometry);\n resize.call(this, geometry);\n transform.call(this, geometry);\n }\n } else if (reason === UpdateReasons.ZOOM || reason === UpdateReasons.FIT) {\n move.call(this, geometry);\n transform.call(this, geometry);\n } else if (reason === UpdateReasons.MOVE) {\n move.call(this, geometry);\n } else if (reason === UpdateReasons.OBJECTS) {\n setupObjects.call(this, this.controller.objects, geometry);\n const event: CustomEvent = new CustomEvent('canvas.setup');\n this.canvas.dispatchEvent(event);\n } else if (reason === UpdateReasons.GRID) {\n const size: Size = geometry.grid;\n this.gridPattern.setAttribute('width', `${size.width}`);\n this.gridPattern.setAttribute('height', `${size.height}`);\n } else if (reason === UpdateReasons.FOCUS) {\n computeFocus.call(this, this.controller.focusData, geometry);\n } else if (reason === UpdateReasons.ACTIVATE) {\n this.activate(geometry, this.controller.activeElement);\n } else if (reason === UpdateReasons.DRAW) {\n const data: DrawData = this.controller.drawData;\n if (data.enabled) {\n this.mode = Mode.DRAW;\n this.deactivate();\n } else {\n this.mode = Mode.IDLE;\n }\n this.drawHandler.draw(data, geometry);\n }\n }\n\n public html(): HTMLDivElement {\n return this.canvas;\n }\n\n private addObjects(ctm: SVGMatrix, states: any[], geometry: Geometry): void {\n for (const state of states) {\n if (state.objectType === 'tag') {\n this.addTag(state, geometry);\n } else {\n const points: number[] = (state.points as number[]);\n const translatedPoints: number[] = [];\n for (let i = 0; i <= points.length - 1; i += 2) {\n let point: SVGPoint = this.background.createSVGPoint();\n point.x = points[i];\n point.y = points[i + 1];\n point = point.matrixTransform(ctm);\n translatedPoints.push(point.x, point.y);\n }\n\n // TODO: Use enums after typification cvat-core\n if (state.shapeType === 'rectangle') {\n this.svgShapes[state.clientID] = this\n .addRect(translatedPoints, state, geometry);\n } else {\n const stringified = translatedPoints.reduce(\n (acc: string, val: number, idx: number): string => {\n if (idx % 2) {\n return `${acc}${val} `;\n }\n\n return `${acc}${val},`;\n }, '',\n );\n\n if (state.shapeType === 'polygon') {\n this.svgShapes[state.clientID] = this\n .addPolygon(stringified, state, geometry);\n } else if (state.shapeType === 'polyline') {\n this.svgShapes[state.clientID] = this\n .addPolyline(stringified, state, geometry);\n } else if (state.shapeType === 'points') {\n this.svgShapes[state.clientID] = this\n .addPoints(stringified, state, geometry);\n }\n }\n\n // TODO: Use enums after typification cvat-core\n if (state.visibility === 'all') {\n this.svgTexts[state.clientID] = this.addText(state);\n this.updateTextPosition(\n this.svgTexts[state.clientID],\n this.svgShapes[state.clientID],\n );\n }\n }\n }\n }\n\n private deactivate(): void {\n if (this.activeElement) {\n const { state } = this.activeElement;\n const shape = this.svgShapes[this.activeElement.state.clientID];\n (shape as any).draggable(false);\n\n if (state.shapeType !== 'points') {\n this.selectize(false, shape, null);\n }\n\n (shape as any).resize(false);\n\n // Hide text only if it is hidden by settings\n const text = this.svgTexts[state.clientID];\n if (text && state.visibility === 'shape') {\n text.remove();\n delete this.svgTexts[state.clientID];\n }\n this.activeElement = null;\n }\n }\n\n private selectize(value: boolean, shape: SVG.Element, geometry: Geometry): void {\n if (value) {\n (shape as any).selectize(value, {\n deepSelect: true,\n pointSize: consts.BASE_POINT_SIZE / geometry.scale,\n rotationPoint: false,\n pointType(cx: number, cy: number): SVG.Circle {\n const circle: SVG.Circle = this.nested\n .circle(this.options.pointSize)\n .stroke('black')\n .fill(shape.node.getAttribute('fill'))\n .center(cx, cy)\n .attr({\n 'stroke-width': consts.BASE_STROKE_WIDTH / (3 * geometry.scale),\n });\n\n circle.node.addEventListener('mouseenter', (): void => {\n circle.attr({\n 'stroke-width': circle.attr('stroke-width') * 2,\n });\n\n circle.addClass('cvat_canvas_selected_point');\n });\n\n circle.node.addEventListener('mouseleave', (): void => {\n circle.attr({\n 'stroke-width': circle.attr('stroke-width') / 2,\n });\n\n circle.removeClass('cvat_canvas_selected_point');\n });\n\n return circle;\n },\n });\n } else {\n (shape as any).selectize(false, {\n deepSelect: true,\n });\n }\n }\n\n private activate(geometry: Geometry, activeElement: ActiveElement): void {\n // Check if other element have been already activated\n if (this.activeElement) {\n // Check if it is the same element\n if (this.activeElement.state.clientID === activeElement.clientID) {\n return;\n }\n\n // Deactivate previous element\n this.deactivate();\n }\n\n const state = this.controller.objects\n .filter((el): boolean => el.clientID === activeElement.clientID)[0];\n this.activeElement = {\n attributeID: activeElement.attributeID,\n state,\n };\n\n const shape = this.svgShapes[activeElement.clientID];\n let text = this.svgTexts[activeElement.clientID];\n // Draw text if it's hidden by default\n if (!text && state.visibility === 'shape') {\n text = this.addText(state);\n this.svgTexts[state.clientID] = text;\n this.updateTextPosition(\n text,\n shape,\n );\n }\n\n const self = this;\n this.content.append(shape.node);\n (shape as any).draggable().on('dragstart', (): void => {\n this.mode = Mode.DRAG;\n if (text) {\n text.addClass('cvat_canvas_hidden');\n }\n }).on('dragend', (): void => {\n this.mode = Mode.IDLE;\n if (text) {\n text.removeClass('cvat_canvas_hidden');\n self.updateTextPosition(\n text,\n shape,\n );\n }\n });\n\n if (state.shapeType !== 'points') {\n this.selectize(true, shape, geometry);\n }\n\n (shape as any).resize().on('resizestart', (): void => {\n this.mode = Mode.RESIZE;\n if (text) {\n text.addClass('cvat_canvas_hidden');\n }\n }).on('resizedone', (): void => {\n this.mode = Mode.IDLE;\n if (text) {\n text.removeClass('cvat_canvas_hidden');\n self.updateTextPosition(\n text,\n shape,\n );\n }\n });\n }\n\n // Update text position after corresponding box has been moved, resized, etc.\n private updateTextPosition(text: SVG.Text, shape: SVG.Shape): void {\n let box = (shape.node as any).getBBox();\n\n // Translate the whole box to the client coordinate system\n const [x1, y1, x2, y2]: number[] = translateFromSVG(this.content, [\n box.x,\n box.y,\n box.x + box.width,\n box.y + box.height,\n ]);\n\n box = {\n x: Math.min(x1, x2),\n y: Math.min(y1, y2),\n width: Math.max(x1, x2) - Math.min(x1, x2),\n height: Math.max(y1, y2) - Math.min(y1, y2),\n };\n\n // Find the best place for a text\n let [clientX, clientY]: number[] = [box.x + box.width, box.y];\n if (clientX + (text.node as any as SVGTextElement)\n .getBBox().width + consts.TEXT_MARGIN > this.canvas.offsetWidth) {\n ([clientX, clientY] = [box.x, box.y]);\n }\n\n // Translate back to text SVG\n const [x, y]: number[] = translateToSVG(this.text, [\n clientX + consts.TEXT_MARGIN,\n clientY,\n ]);\n\n // Finally draw a text\n text.move(x, y);\n for (const tspan of (text.lines() as any).members) {\n tspan.attr('x', text.attr('x'));\n }\n }\n\n private addText(state: any): SVG.Text {\n const { label, clientID, attributes } = state;\n const attrNames = label.attributes.reduce((acc: any, val: any): void => {\n acc[val.id] = val.name;\n return acc;\n }, {});\n\n return this.adoptedText.text((block): void => {\n block.tspan(`${label.name} ${clientID}`).style('text-transform', 'uppercase');\n for (const attrID of Object.keys(attributes)) {\n block.tspan(`${attrNames[attrID]}: ${attributes[attrID]}`).attr({\n attrID,\n dy: '1em',\n x: 0,\n });\n }\n }).move(0, 0).addClass('cvat_canvas_text');\n }\n\n private addRect(points: number[], state: any, geometry: Geometry): SVG.Rect {\n const [xtl, ytl, xbr, ybr] = points;\n\n return this.adoptedContent.rect().size(xbr - xtl, ybr - ytl).attr({\n clientID: state.clientID,\n 'color-rendering': 'optimizeQuality',\n fill: state.color,\n 'shape-rendering': 'geometricprecision',\n stroke: darker(state.color, 50),\n 'stroke-width': consts.BASE_STROKE_WIDTH / geometry.scale,\n zOrder: state.zOrder,\n }).move(xtl, ytl)\n .addClass('cvat_canvas_shape');\n }\n\n private addPolygon(points: string, state: any, geometry: Geometry): SVG.Polygon {\n return this.adoptedContent.polygon(points).attr({\n clientID: state.clientID,\n 'color-rendering': 'optimizeQuality',\n fill: state.color,\n 'shape-rendering': 'geometricprecision',\n stroke: darker(state.color, 50),\n 'stroke-width': consts.BASE_STROKE_WIDTH / geometry.scale,\n zOrder: state.zOrder,\n }).addClass('cvat_canvas_shape');\n }\n\n private addPolyline(points: string, state: any, geometry: Geometry): SVG.PolyLine {\n return this.adoptedContent.polyline(points).attr({\n clientID: state.clientID,\n 'color-rendering': 'optimizeQuality',\n fill: state.color,\n 'shape-rendering': 'geometricprecision',\n stroke: darker(state.color, 50),\n 'stroke-width': consts.BASE_STROKE_WIDTH / geometry.scale,\n zOrder: state.zOrder,\n }).addClass('cvat_canvas_shape');\n }\n\n private addPoints(points: string, state: any, geometry: Geometry): SVG.PolyLine {\n const shape = this.adoptedContent.polyline(points).attr({\n clientID: state.clientID,\n 'color-rendering': 'optimizeQuality',\n fill: state.color,\n 'shape-rendering': 'geometricprecision',\n zOrder: state.zOrder,\n }).addClass('cvat_canvas_shape');\n\n this.selectize(true, shape, geometry);\n shape.remove = function remove(): void {\n this.selectize(false, shape);\n shape.constructor.prototype.remove.call(shape);\n }.bind(this);\n shape.attr('fill', 'none');\n\n return shape;\n }\n\n private addTag(state: any, geometry: Geometry): void {\n console.log(state, geometry);\n }\n}\n","/*\n* Copyright (C) 2019 Intel Corporation\n* SPDX-License-Identifier: MIT\n*/\n\nimport {\n Rotation,\n DrawData,\n CanvasModel,\n CanvasModelImpl,\n} from './canvasModel';\n\nimport {\n Master,\n} from './master';\n\nimport {\n CanvasController,\n CanvasControllerImpl,\n} from './canvasController';\n\nimport {\n CanvasView,\n CanvasViewImpl,\n} from './canvasView';\n\ninterface Canvas {\n html(): HTMLDivElement;\n setup(frameData: any, objectStates: any[]): void;\n activate(clientID: number, attributeID?: number): void;\n rotate(rotation: Rotation, remember?: boolean): void;\n focus(clientID: number, padding?: number): void;\n fit(): void;\n grid(stepX: number, stepY: number): void;\n\n draw(drawData: DrawData): void;\n split(enabled?: boolean): void;\n group(enabled?: boolean): void;\n merge(enabled?: boolean): void;\n\n cancel(): void;\n}\n\nclass CanvasImpl implements Canvas {\n private model: CanvasModel & Master;\n private controller: CanvasController;\n private view: CanvasView;\n\n public constructor(ObjectStateClass: any) {\n this.model = new CanvasModelImpl(ObjectStateClass);\n this.controller = new CanvasControllerImpl(this.model);\n this.view = new CanvasViewImpl(this.model, this.controller);\n }\n\n public html(): HTMLDivElement {\n return this.view.html();\n }\n\n public setup(frameData: any, objectStates: any[]): void {\n this.model.setup(frameData, objectStates);\n }\n\n public activate(clientID: number, attributeID: number = null): void {\n this.model.activate(clientID, attributeID);\n }\n\n public rotate(rotation: Rotation, remember: boolean): void {\n this.model.rotate(rotation, remember);\n }\n\n public focus(clientID: number, padding: number = 0): void {\n this.model.focus(clientID, padding);\n }\n\n public fit(): void {\n this.model.fit();\n }\n\n public grid(stepX: number, stepY: number): void {\n this.model.grid(stepX, stepY);\n }\n\n public draw(drawData: DrawData): void {\n this.model.draw(drawData);\n }\n\n public split(enabled: boolean = false): void {\n this.model.split(enabled);\n }\n\n public group(enabled: boolean = false): void {\n this.model.group(enabled);\n }\n\n public merge(enabled: boolean = false): void {\n this.model.merge(enabled);\n }\n\n public cancel(): void {\n this.model.cancel();\n }\n}\n\nexport {\n CanvasImpl as Canvas,\n Rotation,\n};\n"],"sourceRoot":""} \ No newline at end of file diff --git a/cvat-canvas/public/cvat-canvas.node.js b/cvat-canvas/public/cvat-canvas.node.js new file mode 100644 index 00000000..97c4f39c --- /dev/null +++ b/cvat-canvas/public/cvat-canvas.node.js @@ -0,0 +1,12 @@ +exports.canvas=function(t){var e={};function i(n){if(e[n])return e[n].exports;var s=e[n]={i:n,l:!1,exports:{}};return t[n].call(s.exports,s,s.exports,i),s.l=!0,s.exports}return i.m=t,i.c=e,i.d=function(t,e,n){i.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:n})},i.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},i.t=function(t,e){if(1&e&&(t=i(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var n=Object.create(null);if(i.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var s in t)i.d(n,s,function(e){return t[e]}.bind(null,s));return n},i.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return i.d(e,"a",e),e},i.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},i.p="",i(i.s=5)}([function(t,e,i){var n,s; +/*! +* svg.js - A lightweight library for manipulating and animating SVG. +* @version 2.7.1 +* https://svgdotjs.github.io/ +* +* @copyright Wout Fierens +* @license MIT +* +* BUILT: Fri Nov 30 2018 10:01:55 GMT+0100 (GMT+01:00) +*/s="undefined"!=typeof window?window:this,void 0===(n=function(){return function(t,e){var i=(void 0!==this?this:t).SVG=function(t){if(i.supported)return t=new i.Doc(t),i.parser.draw||i.prepare(),t};if(i.ns="http://www.w3.org/2000/svg",i.xmlns="http://www.w3.org/2000/xmlns/",i.xlink="http://www.w3.org/1999/xlink",i.svgjs="http://svgjs.com/svgjs",i.supported=!!e.createElementNS&&!!e.createElementNS(i.ns,"svg").createSVGRect,!i.supported)return!1;i.did=1e3,i.eid=function(t){return"Svgjs"+c(t)+i.did++},i.create=function(t){var i=e.createElementNS(this.ns,t);return i.setAttribute("id",this.eid(t)),i},i.extend=function(){var t,e,n,s;for(t=[].slice.call(arguments),e=t.pop(),s=t.length-1;s>=0;s--)if(t[s])for(n in e)t[s].prototype[n]=e[n];i.Set&&i.Set.inherit&&i.Set.inherit()},i.invent=function(t){var e="function"==typeof t.create?t.create:function(){this.constructor.call(this,i.create(t.create))};return t.inherit&&(e.prototype=new t.inherit),t.extend&&i.extend(e,t.extend),t.construct&&i.extend(t.parent||i.Container,t.construct),e},i.adopt=function(e){return e?e.instance?e.instance:((n="svg"==e.nodeName?e.parentNode instanceof t.SVGElement?new i.Nested:new i.Doc:"linearGradient"==e.nodeName?new i.Gradient("linear"):"radialGradient"==e.nodeName?new i.Gradient("radial"):i[c(e.nodeName)]?new(i[c(e.nodeName)]):new i.Element(e)).type=e.nodeName,n.node=e,e.instance=n,n instanceof i.Doc&&n.namespace().defs(),n.setData(JSON.parse(e.getAttribute("svgjs:data"))||{}),n):null;var n},i.prepare=function(){var t=e.getElementsByTagName("body")[0],n=(t?new i.Doc(t):i.adopt(e.documentElement).nested()).size(2,0);i.parser={body:t||e.documentElement,draw:n.style("opacity:0;position:absolute;left:-100%;top:-100%;overflow:hidden").attr("focusable","false").node,poly:n.polyline().node,path:n.path().node,native:i.create("svg")}},i.parser={native:i.create("svg")},e.addEventListener("DOMContentLoaded",function(){i.parser.draw||i.prepare()},!1),i.regex={numberAndUnit:/^([+-]?(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?)([a-z%]*)$/i,hex:/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i,rgb:/rgb\((\d+),(\d+),(\d+)\)/,reference:/#([a-z0-9\-_]+)/i,transforms:/\)\s*,?\s*/,whitespace:/\s/g,isHex:/^#[a-f0-9]{3,6}$/i,isRgb:/^rgb\(/,isCss:/[^:]+:[^;]+;?/,isBlank:/^(\s+)?$/,isNumber:/^[+-]?(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i,isPercent:/^-?[\d\.]+%$/,isImage:/\.(jpg|jpeg|png|gif|svg)(\?[^=]+.*)?/i,delimiter:/[\s,]+/,hyphen:/([^e])\-/gi,pathLetters:/[MLHVCSQTAZ]/gi,isPathLetter:/[MLHVCSQTAZ]/i,numbersWithDots:/((\d?\.\d+(?:e[+-]?\d+)?)((?:\.\d+(?:e[+-]?\d+)?)+))+/gi,dots:/\./g},i.utils={map:function(t,e){var i,n=t.length,s=[];for(i=0;i1?1:t,new i.Color({r:~~(this.r+(this.destination.r-this.r)*t),g:~~(this.g+(this.destination.g-this.g)*t),b:~~(this.b+(this.destination.b-this.b)*t)})):this}}),i.Color.test=function(t){return t+="",i.regex.isHex.test(t)||i.regex.isRgb.test(t)},i.Color.isRgb=function(t){return t&&"number"==typeof t.r&&"number"==typeof t.g&&"number"==typeof t.b},i.Color.isColor=function(t){return i.Color.isRgb(t)||i.Color.test(t)},i.Array=function(t,e){0==(t=(t||[]).valueOf()).length&&e&&(t=e.valueOf()),this.value=this.parse(t)},i.extend(i.Array,{morph:function(t){if(this.destination=this.parse(t),this.value.length!=this.destination.length){for(var e=this.value[this.value.length-1],i=this.destination[this.destination.length-1];this.value.length>this.destination.length;)this.destination.push(i);for(;this.value.length=0;n--)this.value[n]=[this.value[n][0]+t,this.value[n][1]+e];return this},size:function(t,e){var i,n=this.bbox();for(i=this.value.length-1;i>=0;i--)n.width&&(this.value[i][0]=(this.value[i][0]-n.x)*t/n.width+n.x),n.height&&(this.value[i][1]=(this.value[i][1]-n.y)*e/n.height+n.y);return this},bbox:function(){return i.parser.poly.setAttribute("points",this.toString()),i.parser.poly.getBBox()}});for(var n={M:function(t,e,i){return e.x=i.x=t[0],e.y=i.y=t[1],["M",e.x,e.y]},L:function(t,e){return e.x=t[0],e.y=t[1],["L",t[0],t[1]]},H:function(t,e){return e.x=t[0],["H",t[0]]},V:function(t,e){return e.y=t[0],["V",t[0]]},C:function(t,e){return e.x=t[4],e.y=t[5],["C",t[0],t[1],t[2],t[3],t[4],t[5]]},S:function(t,e){return e.x=t[2],e.y=t[3],["S",t[0],t[1],t[2],t[3]]},Q:function(t,e){return e.x=t[2],e.y=t[3],["Q",t[0],t[1],t[2],t[3]]},T:function(t,e){return e.x=t[0],e.y=t[1],["T",t[0],t[1]]},Z:function(t,e,i){return e.x=i.x,e.y=i.y,["Z"]},A:function(t,e){return e.x=t[5],e.y=t[6],["A",t[0],t[1],t[2],t[3],t[4],t[5],t[6]]}},s="mlhvqtcsaz".split(""),r=0,a=s.length;r=0;s--)"M"==(n=this.value[s][0])||"L"==n||"T"==n?(this.value[s][1]+=t,this.value[s][2]+=e):"H"==n?this.value[s][1]+=t:"V"==n?this.value[s][1]+=e:"C"==n||"S"==n||"Q"==n?(this.value[s][1]+=t,this.value[s][2]+=e,this.value[s][3]+=t,this.value[s][4]+=e,"C"==n&&(this.value[s][5]+=t,this.value[s][6]+=e)):"A"==n&&(this.value[s][6]+=t,this.value[s][7]+=e);return this},size:function(t,e){var i,n,s=this.bbox();for(i=this.value.length-1;i>=0;i--)"M"==(n=this.value[i][0])||"L"==n||"T"==n?(this.value[i][1]=(this.value[i][1]-s.x)*t/s.width+s.x,this.value[i][2]=(this.value[i][2]-s.y)*e/s.height+s.y):"H"==n?this.value[i][1]=(this.value[i][1]-s.x)*t/s.width+s.x:"V"==n?this.value[i][1]=(this.value[i][1]-s.y)*e/s.height+s.y:"C"==n||"S"==n||"Q"==n?(this.value[i][1]=(this.value[i][1]-s.x)*t/s.width+s.x,this.value[i][2]=(this.value[i][2]-s.y)*e/s.height+s.y,this.value[i][3]=(this.value[i][3]-s.x)*t/s.width+s.x,this.value[i][4]=(this.value[i][4]-s.y)*e/s.height+s.y,"C"==n&&(this.value[i][5]=(this.value[i][5]-s.x)*t/s.width+s.x,this.value[i][6]=(this.value[i][6]-s.y)*e/s.height+s.y)):"A"==n&&(this.value[i][1]=this.value[i][1]*t/s.width,this.value[i][2]=this.value[i][2]*e/s.height,this.value[i][6]=(this.value[i][6]-s.x)*t/s.width+s.x,this.value[i][7]=(this.value[i][7]-s.y)*e/s.height+s.y);return this},equalCommands:function(t){var e,n,s;for(t=new i.PathArray(t),s=this.value.length===t.value.length,e=0,n=this.value.length;s&&el);return r},bbox:function(){return i.parser.path.setAttribute("d",this.toString()),i.parser.path.getBBox()}}),i.Number=i.invent({create:function(t,e){this.value=0,this.unit=e||"","number"==typeof t?this.value=isNaN(t)?0:isFinite(t)?t:t<0?-34e37:34e37:"string"==typeof t?(e=t.match(i.regex.numberAndUnit))&&(this.value=parseFloat(e[1]),"%"==e[5]?this.value/=100:"s"==e[5]&&(this.value*=1e3),this.unit=e[5]):t instanceof i.Number&&(this.value=t.valueOf(),this.unit=t.unit)},extend:{toString:function(){return("%"==this.unit?~~(1e8*this.value)/1e6:"s"==this.unit?this.value/1e3:this.value)+this.unit},toJSON:function(){return this.toString()},valueOf:function(){return this.value},plus:function(t){return t=new i.Number(t),new i.Number(this+t,this.unit||t.unit)},minus:function(t){return t=new i.Number(t),new i.Number(this-t,this.unit||t.unit)},times:function(t){return t=new i.Number(t),new i.Number(this*t,this.unit||t.unit)},divide:function(t){return t=new i.Number(t),new i.Number(this/t,this.unit||t.unit)},to:function(t){var e=new i.Number(this);return"string"==typeof t&&(e.unit=t),e},morph:function(t){return this.destination=new i.Number(t),t.relative&&(this.destination.value+=this.value),this},at:function(t){return this.destination?new i.Number(this.destination).minus(this).times(t).plus(this):this}}}),i.Element=i.invent({create:function(t){this._stroke=i.defaults.attrs.stroke,this._event=null,this._events={},this.dom={},(this.node=t)&&(this.type=t.nodeName,this.node.instance=this,this._events=t._events||{},this._stroke=t.getAttribute("stroke")||this._stroke)},extend:{x:function(t){return this.attr("x",t)},y:function(t){return this.attr("y",t)},cx:function(t){return null==t?this.x()+this.width()/2:this.x(t-this.width()/2)},cy:function(t){return null==t?this.y()+this.height()/2:this.y(t-this.height()/2)},move:function(t,e){return this.x(t).y(e)},center:function(t,e){return this.cx(t).cy(e)},width:function(t){return this.attr("width",t)},height:function(t){return this.attr("height",t)},size:function(t,e){var n=d(this,t,e);return this.width(new i.Number(n.width)).height(new i.Number(n.height))},clone:function(t){this.writeDataToDom();var e=v(this.node.cloneNode(!0));return t?t.add(e):this.after(e),e},remove:function(){return this.parent()&&this.parent().removeElement(this),this},replace:function(t){return this.after(t).remove(),t},addTo:function(t){return t.put(this)},putIn:function(t){return t.add(this)},id:function(t){return this.attr("id",t)},inside:function(t,e){var i=this.bbox();return t>i.x&&e>i.y&&t/,"").replace(/<\/svg>$/,"");n.innerHTML=""+t.replace(/\n/,"").replace(/<([\w:-]+)([^<]+?)\/>/g,"<$1$2>")+"";for(var s=0,r=n.firstChild.childNodes.length;s":function(t){return-Math.cos(t*Math.PI)/2+.5},">":function(t){return Math.sin(t*Math.PI/2)},"<":function(t){return 1-Math.cos(t*Math.PI/2)}},i.morph=function(t){return function(e,n){return new i.MorphObj(e,n).at(t)}},i.Situation=i.invent({create:function(t){this.init=!1,this.reversed=!1,this.reversing=!1,this.duration=new i.Number(t.duration).valueOf(),this.delay=new i.Number(t.delay).valueOf(),this.start=+new Date+this.delay,this.finish=this.start+this.duration,this.ease=t.ease,this.loop=0,this.loops=!1,this.animations={},this.attrs={},this.styles={},this.transforms=[],this.once={}}}),i.FX=i.invent({create:function(t){this._target=t,this.situations=[],this.active=!1,this.situation=null,this.paused=!1,this.lastPos=0,this.pos=0,this.absPos=0,this._speed=1},extend:{animate:function(t,e,n){"object"==typeof t&&(e=t.ease,n=t.delay,t=t.duration);var s=new i.Situation({duration:t||1e3,delay:n||0,ease:i.easing[e||"-"]||e});return this.queue(s),this},delay:function(t){var e=new i.Situation({duration:t,delay:0,ease:i.easing["-"]});return this.queue(e)},target:function(t){return t&&t instanceof i.Element?(this._target=t,this):this._target},timeToAbsPos:function(t){return(t-this.situation.start)/(this.situation.duration/this._speed)},absPosToTime:function(t){return this.situation.duration/this._speed*t+this.situation.start},startAnimFrame:function(){this.stopAnimFrame(),this.animationFrame=t.requestAnimationFrame(function(){this.step()}.bind(this))},stopAnimFrame:function(){t.cancelAnimationFrame(this.animationFrame)},start:function(){return!this.active&&this.situation&&(this.active=!0,this.startCurrent()),this},startCurrent:function(){return this.situation.start=+new Date+this.situation.delay/this._speed,this.situation.finish=this.situation.start+this.situation.duration/this._speed,this.initAnimations().step()},queue:function(t){return("function"==typeof t||t instanceof i.Situation)&&this.situations.push(t),this.situation||(this.situation=this.situations.shift()),this},dequeue:function(){return this.stop(),this.situation=this.situations.shift(),this.situation&&(this.situation instanceof i.Situation?this.start():this.situation.call(this)),this},initAnimations:function(){var t,e,n,s=this.situation;if(s.init)return this;for(t in s.animations)for(n=this.target()[t](),Array.isArray(n)||(n=[n]),Array.isArray(s.animations[t])||(s.animations[t]=[s.animations[t]]),e=n.length;e--;)s.animations[t][e]instanceof i.Number&&(n[e]=new i.Number(n[e])),s.animations[t][e]=n[e].morph(s.animations[t][e]);for(t in s.attrs)s.attrs[t]=new i.MorphObj(this.target().attr(t),s.attrs[t]);for(t in s.styles)s.styles[t]=new i.MorphObj(this.target().style(t),s.styles[t]);return s.initialTransformation=this.target().matrixify(),s.init=!0,this},clearQueue:function(){return this.situations=[],this},clearCurrent:function(){return this.situation=null,this},stop:function(t,e){var i=this.active;return this.active=!1,e&&this.clearQueue(),t&&this.situation&&(!i&&this.startCurrent(),this.atEnd()),this.stopAnimFrame(),this.clearCurrent()},reset:function(){if(this.situation){var t=this.situation;this.stop(),this.situation=t,this.atStart()}return this},finish:function(){for(this.stop(!0,!1);this.dequeue().situation&&this.stop(!0,!1););return this.clearQueue().clearCurrent(),this},atStart:function(){return this.at(0,!0)},atEnd:function(){return!0===this.situation.loops&&(this.situation.loops=this.situation.loop+1),"number"==typeof this.situation.loops?this.at(this.situation.loops,!0):this.at(1,!0)},at:function(t,e){var i=this.situation.duration/this._speed;return this.absPos=t,e||(this.situation.reversed&&(this.absPos=1-this.absPos),this.absPos+=this.situation.loop),this.situation.start=+new Date-this.absPos*i,this.situation.finish=this.situation.start+i,this.step(!0)},speed:function(t){return 0===t?this.pause():t?(this._speed=t,this.at(this.absPos,!0)):this._speed},loop:function(t,e){var i=this.last();return i.loops=null==t||t,i.loop=0,e&&(i.reversing=!0),this},pause:function(){return this.paused=!0,this.stopAnimFrame(),this},play:function(){return this.paused?(this.paused=!1,this.at(this.absPos,!0)):this},reverse:function(t){var e=this.last();return e.reversed=void 0===t?!e.reversed:t,this},progress:function(t){return t?this.situation.ease(this.pos):this.pos},after:function(t){var e=this.last();return this.target().on("finished.fx",function i(n){n.detail.situation==e&&(t.call(this,e),this.off("finished.fx",i))}),this._callStart()},during:function(t){var e=this.last(),n=function(n){n.detail.situation==e&&t.call(this,n.detail.pos,i.morph(n.detail.pos),n.detail.eased,e)};return this.target().off("during.fx",n).on("during.fx",n),this.after(function(){this.off("during.fx",n)}),this._callStart()},afterAll:function(t){var e=function e(i){t.call(this),this.off("allfinished.fx",e)};return this.target().off("allfinished.fx",e).on("allfinished.fx",e),this._callStart()},duringAll:function(t){var e=function(e){t.call(this,e.detail.pos,i.morph(e.detail.pos),e.detail.eased,e.detail.situation)};return this.target().off("during.fx",e).on("during.fx",e),this.afterAll(function(){this.off("during.fx",e)}),this._callStart()},last:function(){return this.situations.length?this.situations[this.situations.length-1]:this.situation},add:function(t,e,i){return this.last()[i||"animations"][t]=e,this._callStart()},step:function(t){var e,i,n;t||(this.absPos=this.timeToAbsPos(+new Date)),!1!==this.situation.loops?(e=Math.max(this.absPos,0),i=Math.floor(e),!0===this.situation.loops||ithis.lastPos&&r<=s&&(this.situation.once[r].call(this.target(),this.pos,s),delete this.situation.once[r]);return this.active&&this.target().fire("during",{pos:this.pos,eased:s,fx:this,situation:this.situation}),this.situation?(this.eachAt(),1==this.pos&&!this.situation.reversed||this.situation.reversed&&0==this.pos?(this.stopAnimFrame(),this.target().fire("finished",{fx:this,situation:this.situation}),this.situations.length||(this.target().fire("allfinished"),this.situations.length||(this.target().off(".fx"),this.active=!1)),this.active?this.dequeue():this.clearCurrent()):!this.paused&&this.active&&this.startAnimFrame(),this.lastPos=s,this):this},eachAt:function(){var t,e,n,s=this,r=this.target(),a=this.situation;for(t in a.animations)n=[].concat(a.animations[t]).map(function(t){return"string"!=typeof t&&t.at?t.at(a.ease(s.pos),s.pos):t}),r[t].apply(r,n);for(t in a.attrs)n=[t].concat(a.attrs[t]).map(function(t){return"string"!=typeof t&&t.at?t.at(a.ease(s.pos),s.pos):t}),r.attr.apply(r,n);for(t in a.styles)n=[t].concat(a.styles[t]).map(function(t){return"string"!=typeof t&&t.at?t.at(a.ease(s.pos),s.pos):t}),r.style.apply(r,n);if(a.transforms.length){for(n=a.initialTransformation,t=0,e=a.transforms.length;t=0;--e)this[x[e]]=null!=t[x[e]]?t[x[e]]:n[x[e]]},extend:{extract:function(){var t=f(this,0,1),e=f(this,1,0),n=180/Math.PI*Math.atan2(t.y,t.x)-90;return{x:this.e,y:this.f,transformedX:(this.e*Math.cos(n*Math.PI/180)+this.f*Math.sin(n*Math.PI/180))/Math.sqrt(this.a*this.a+this.b*this.b),transformedY:(this.f*Math.cos(n*Math.PI/180)+this.e*Math.sin(-n*Math.PI/180))/Math.sqrt(this.c*this.c+this.d*this.d),skewX:-n,skewY:180/Math.PI*Math.atan2(e.y,e.x),scaleX:Math.sqrt(this.a*this.a+this.b*this.b),scaleY:Math.sqrt(this.c*this.c+this.d*this.d),rotation:n,a:this.a,b:this.b,c:this.c,d:this.d,e:this.e,f:this.f,matrix:new i.Matrix(this)}},clone:function(){return new i.Matrix(this)},morph:function(t){return this.destination=new i.Matrix(t),this},at:function(t){if(!this.destination)return this;var e=new i.Matrix({a:this.a+(this.destination.a-this.a)*t,b:this.b+(this.destination.b-this.b)*t,c:this.c+(this.destination.c-this.c)*t,d:this.d+(this.destination.d-this.d)*t,e:this.e+(this.destination.e-this.e)*t,f:this.f+(this.destination.f-this.f)*t});return e},multiply:function(t){return new i.Matrix(this.native().multiply(function(t){return t instanceof i.Matrix||(t=new i.Matrix(t)),t}(t).native()))},inverse:function(){return new i.Matrix(this.native().inverse())},translate:function(t,e){return new i.Matrix(this.native().translate(t||0,e||0))},scale:function(t,e,n,s){return 1==arguments.length?e=t:3==arguments.length&&(s=n,n=e,e=t),this.around(n,s,new i.Matrix(t,0,0,e,0,0))},rotate:function(t,e,n){return t=i.utils.radians(t),this.around(e,n,new i.Matrix(Math.cos(t),Math.sin(t),-Math.sin(t),Math.cos(t),0,0))},flip:function(t,e){return"x"==t?this.scale(-1,1,e,0):"y"==t?this.scale(1,-1,0,e):this.scale(-1,-1,t,null!=e?e:t)},skew:function(t,e,n,s){return 1==arguments.length?e=t:3==arguments.length&&(s=n,n=e,e=t),t=i.utils.radians(t),e=i.utils.radians(e),this.around(n,s,new i.Matrix(1,Math.tan(e),Math.tan(t),1,0,0))},skewX:function(t,e,i){return this.skew(t,0,e,i)},skewY:function(t,e,i){return this.skew(0,t,e,i)},around:function(t,e,n){return this.multiply(new i.Matrix(1,0,0,1,t||0,e||0)).multiply(n).multiply(new i.Matrix(1,0,0,1,-t||0,-e||0))},native:function(){for(var t=i.parser.native.createSVGMatrix(),e=x.length-1;e>=0;e--)t[x[e]]=this[x[e]];return t},toString:function(){return"matrix("+g(this.a)+","+g(this.b)+","+g(this.c)+","+g(this.d)+","+g(this.e)+","+g(this.f)+")"}},parent:i.Element,construct:{ctm:function(){return new i.Matrix(this.node.getCTM())},screenCTM:function(){if(this instanceof i.Nested){var t=this.rect(1,1),e=t.node.getScreenCTM();return t.remove(),new i.Matrix(e)}return new i.Matrix(this.node.getScreenCTM())}}}),i.Point=i.invent({create:function(t,e){var i;i=Array.isArray(t)?{x:t[0],y:t[1]}:"object"==typeof t?{x:t.x,y:t.y}:null!=t?{x:t,y:null!=e?e:t}:{x:0,y:0},this.x=i.x,this.y=i.y},extend:{clone:function(){return new i.Point(this)},morph:function(t,e){return this.destination=new i.Point(t,e),this},at:function(t){if(!this.destination)return this;var e=new i.Point({x:this.x+(this.destination.x-this.x)*t,y:this.y+(this.destination.y-this.y)*t});return e},native:function(){var t=i.parser.native.createSVGPoint();return t.x=this.x,t.y=this.y,t},transform:function(t){return new i.Point(this.native().matrixTransform(t.native()))}}}),i.extend(i.Element,{point:function(t,e){return new i.Point(t,e).transform(this.screenCTM().inverse())}}),i.extend(i.Element,{attr:function(t,e,n){if(null==t){for(t={},e=this.node.attributes,n=e.length-1;n>=0;n--)t[e[n].nodeName]=i.regex.isNumber.test(e[n].nodeValue)?parseFloat(e[n].nodeValue):e[n].nodeValue;return t}if("object"==typeof t)for(e in t)this.attr(e,t[e]);else if(null===e)this.node.removeAttribute(t);else{if(null==e)return null==(e=this.node.getAttribute(t))?i.defaults.attrs[t]:i.regex.isNumber.test(e)?parseFloat(e):e;"stroke-width"==t?this.attr("stroke",parseFloat(e)>0?this._stroke:null):"stroke"==t&&(this._stroke=e),"fill"!=t&&"stroke"!=t||(i.regex.isImage.test(e)&&(e=this.doc().defs().image(e,0,0)),e instanceof i.Image&&(e=this.doc().defs().pattern(0,0,function(){this.add(e)}))),"number"==typeof e?e=new i.Number(e):i.Color.isColor(e)?e=new i.Color(e):Array.isArray(e)&&(e=new i.Array(e)),"leading"==t?this.leading&&this.leading(e):"string"==typeof n?this.node.setAttributeNS(n,t,e.toString()):this.node.setAttribute(t,e.toString()),!this.rebuild||"font-size"!=t&&"x"!=t||this.rebuild(t,e)}return this}}),i.extend(i.Element,{transform:function(t,e){var n,s;if("object"!=typeof t)return n=new i.Matrix(this).extract(),"string"==typeof t?n[t]:n;if(n=new i.Matrix(this),e=!!e||!!t.relative,null!=t.a)n=e?n.multiply(new i.Matrix(t)):new i.Matrix(t);else if(null!=t.rotation)m(t,this),n=e?n.rotate(t.rotation,t.cx,t.cy):n.rotate(t.rotation-n.extract().rotation,t.cx,t.cy);else if(null!=t.scale||null!=t.scaleX||null!=t.scaleY){if(m(t,this),t.scaleX=null!=t.scale?t.scale:null!=t.scaleX?t.scaleX:1,t.scaleY=null!=t.scale?t.scale:null!=t.scaleY?t.scaleY:1,!e){var r=n.extract();t.scaleX=1*t.scaleX/r.scaleX,t.scaleY=1*t.scaleY/r.scaleY}n=n.scale(t.scaleX,t.scaleY,t.cx,t.cy)}else if(null!=t.skew||null!=t.skewX||null!=t.skewY){if(m(t,this),t.skewX=null!=t.skew?t.skew:null!=t.skewX?t.skewX:0,t.skewY=null!=t.skew?t.skew:null!=t.skewY?t.skewY:0,!e){var r=n.extract();n=n.multiply((new i.Matrix).skew(r.skewX,r.skewY,t.cx,t.cy).inverse())}n=n.skew(t.skewX,t.skewY,t.cx,t.cy)}else t.flip?("x"==t.flip||"y"==t.flip?t.offset=null==t.offset?this.bbox()["c"+t.flip]:t.offset:null==t.offset?(s=this.bbox(),t.flip=s.cx,t.offset=s.cy):t.flip=t.offset,n=(new i.Matrix).flip(t.flip,t.offset)):null==t.x&&null==t.y||(e?n=n.translate(t.x,t.y):(null!=t.x&&(n.e=t.x),null!=t.y&&(n.f=t.y)));return this.attr("transform",n)}}),i.extend(i.FX,{transform:function(t,e){var n,s,r=this.target();return"object"!=typeof t?(n=new i.Matrix(r).extract(),"string"==typeof t?n[t]:n):(e=!!e||!!t.relative,null!=t.a?n=new i.Matrix(t):null!=t.rotation?(m(t,r),n=new i.Rotate(t.rotation,t.cx,t.cy)):null!=t.scale||null!=t.scaleX||null!=t.scaleY?(m(t,r),t.scaleX=null!=t.scale?t.scale:null!=t.scaleX?t.scaleX:1,t.scaleY=null!=t.scale?t.scale:null!=t.scaleY?t.scaleY:1,n=new i.Scale(t.scaleX,t.scaleY,t.cx,t.cy)):null!=t.skewX||null!=t.skewY?(m(t,r),t.skewX=null!=t.skewX?t.skewX:0,t.skewY=null!=t.skewY?t.skewY:0,n=new i.Skew(t.skewX,t.skewY,t.cx,t.cy)):t.flip?("x"==t.flip||"y"==t.flip?t.offset=null==t.offset?r.bbox()["c"+t.flip]:t.offset:null==t.offset?(s=r.bbox(),t.flip=s.cx,t.offset=s.cy):t.flip=t.offset,n=(new i.Matrix).flip(t.flip,t.offset)):null==t.x&&null==t.y||(n=new i.Translate(t.x,t.y)),n?(n.relative=e,this.last().transforms.push(n),this._callStart()):this)}}),i.extend(i.Element,{untransform:function(){return this.attr("transform",null)},matrixify:function(){var t=(this.attr("transform")||"").split(i.regex.transforms).slice(0,-1).map(function(t){var e=t.trim().split("(");return[e[0],e[1].split(i.regex.delimiter).map(function(t){return parseFloat(t)})]}).reduce(function(t,e){return"matrix"==e[0]?t.multiply(p(e[1])):t[e[0]].apply(t,e[1])},new i.Matrix);return t},toParent:function(t){if(this==t)return this;var e=this.screenCTM(),i=t.screenCTM().inverse();return this.addTo(t).untransform().transform(i.multiply(e)),this},toDoc:function(){return this.toParent(this.doc())}}),i.Transformation=i.invent({create:function(t,e){if(arguments.length>1&&"boolean"!=typeof e)return this.constructor.call(this,[].slice.call(arguments));if(Array.isArray(t))for(var i=0,n=this.arguments.length;i=0},index:function(t){return[].slice.call(this.node.childNodes).indexOf(t.node)},get:function(t){return i.adopt(this.node.childNodes[t])},first:function(){return this.get(0)},last:function(){return this.get(this.node.childNodes.length-1)},each:function(t,e){var n,s,r=this.children();for(n=0,s=r.length;ns/r?this.height/r:this.width/s,this.x=e,this.y=n,this.width=s,this.height=r)}else t="string"==typeof t?t.match(d).map(function(t){return parseFloat(t)}):Array.isArray(t)?t:"object"==typeof t?[t.x,t.y,t.width,t.height]:4==arguments.length?[].slice.call(arguments):l,this.x=t[0],this.y=t[1],this.width=t[2],this.height=t[3]},extend:{toString:function(){return this.x+" "+this.y+" "+this.width+" "+this.height},morph:function(t,e,n,s){return this.destination=new i.ViewBox(t,e,n,s),this},at:function(t){return this.destination?new i.ViewBox([this.x+(this.destination.x-this.x)*t,this.y+(this.destination.y-this.y)*t,this.width+(this.destination.width-this.width)*t,this.height+(this.destination.height-this.height)*t]):this}},parent:i.Container,construct:{viewbox:function(t,e,n,s){return 0==arguments.length?new i.ViewBox(this):this.attr("viewBox",new i.ViewBox(t,e,n,s))}}}),["click","dblclick","mousedown","mouseup","mouseover","mouseout","mousemove","mouseenter","mouseleave","touchstart","touchmove","touchleave","touchend","touchcancel"].forEach(function(t){i.Element.prototype[t]=function(e){return null==e?i.off(this,t):i.on(this,t,e),this}}),i.listenerId=0,i.on=function(t,e,n,s,r){var a=n.bind(s||t),o=t instanceof i.Element?t.node:t;o.instance=o.instance||{_events:{}};var h=o.instance._events;n._svgjsListenerId||(n._svgjsListenerId=++i.listenerId),e.split(i.regex.delimiter).forEach(function(t){var e=t.split(".")[0],i=t.split(".")[1]||"*";h[e]=h[e]||{},h[e][i]=h[e][i]||{},h[e][i][n._svgjsListenerId]=a,o.addEventListener(e,a,r||!1)})},i.off=function(t,e,n,s){var r=t instanceof i.Element?t.node:t;if(r.instance&&("function"!=typeof n||(n=n._svgjsListenerId))){var a=r.instance._events;(e||"").split(i.regex.delimiter).forEach(function(t){var e,o,h=t&&t.split(".")[0],l=t&&t.split(".")[1];if(n)a[h]&&a[h][l||"*"]&&(r.removeEventListener(h,a[h][l||"*"][n],s||!1),delete a[h][l||"*"][n]);else if(h&&l){if(a[h]&&a[h][l]){for(o in a[h][l])i.off(r,[h,l].join("."),o);delete a[h][l]}}else if(l)for(t in a)for(e in a[t])l===e&&i.off(r,[t,l].join("."));else if(h){if(a[h]){for(e in a[h])i.off(r,[h,e].join("."));delete a[h]}}else{for(t in a)i.off(r,t);r.instance._events={}}})}},i.extend(i.Element,{on:function(t,e,n,s){return i.on(this,t,e,n,s),this},off:function(t,e){return i.off(this.node,t,e),this},fire:function(e,n){return e instanceof t.Event?this.node.dispatchEvent(e):this.node.dispatchEvent(e=new i.CustomEvent(e,{detail:n,cancelable:!0})),this._event=e,this},event:function(){return this._event}}),i.Defs=i.invent({create:"defs",inherit:i.Container}),i.G=i.invent({create:"g",inherit:i.Container,extend:{x:function(t){return null==t?this.transform("x"):this.transform({x:t-this.x()},!0)},y:function(t){return null==t?this.transform("y"):this.transform({y:t-this.y()},!0)},cx:function(t){return null==t?this.gbox().cx:this.x(t-this.gbox().width/2)},cy:function(t){return null==t?this.gbox().cy:this.y(t-this.gbox().height/2)},gbox:function(){var t=this.bbox(),e=this.transform();return t.x+=e.x,t.x2+=e.x,t.cx+=e.x,t.y+=e.y,t.y2+=e.y,t.cy+=e.y,t}},construct:{group:function(){return this.put(new i.G)}}}),i.Doc=i.invent({create:function(t){t&&("svg"==(t="string"==typeof t?e.getElementById(t):t).nodeName?this.constructor.call(this,t):(this.constructor.call(this,i.create("svg")),t.appendChild(this.node),this.size("100%","100%")),this.namespace().defs())},inherit:i.Container,extend:{namespace:function(){return this.attr({xmlns:i.ns,version:"1.1"}).attr("xmlns:xlink",i.xlink,i.xmlns).attr("xmlns:svgjs",i.svgjs,i.xmlns)},defs:function(){var t;return this._defs||((t=this.node.getElementsByTagName("defs")[0])?this._defs=i.adopt(t):this._defs=new i.Defs,this.node.appendChild(this._defs.node)),this._defs},parent:function(){return this.node.parentNode&&"#document"!=this.node.parentNode.nodeName&&"#document-fragment"!=this.node.parentNode.nodeName?this.node.parentNode:null},spof:function(){var t=this.node.getScreenCTM();return t&&this.style("left",-t.e%1+"px").style("top",-t.f%1+"px"),this},remove:function(){return this.parent()&&this.parent().removeChild(this.node),this},clear:function(){for(;this.node.hasChildNodes();)this.node.removeChild(this.node.lastChild);return delete this._defs,i.parser.draw.parentNode||this.node.appendChild(i.parser.draw),this},clone:function(t){this.writeDataToDom();var e=this.node,i=v(e.cloneNode(!0));return t?(t.node||t).appendChild(i.node):e.parentNode.insertBefore(i.node,e.nextSibling),i}}}),i.extend(i.Element,{siblings:function(){return this.parent().children()},position:function(){return this.parent().index(this)},next:function(){return this.siblings()[this.position()+1]},previous:function(){return this.siblings()[this.position()-1]},forward:function(){var t=this.position()+1,e=this.parent();return e.removeElement(this).add(this,t),e instanceof i.Doc&&e.node.appendChild(e.defs().node),this},backward:function(){var t=this.position();return t>0&&this.parent().removeElement(this).add(this,t-1),this},front:function(){var t=this.parent();return t.node.appendChild(this.node),t instanceof i.Doc&&t.node.appendChild(t.defs().node),this},back:function(){return this.position()>0&&this.parent().removeElement(this).add(this,0),this},before:function(t){t.remove();var e=this.position();return this.parent().add(t,e),this},after:function(t){t.remove();var e=this.position();return this.parent().add(t,e+1),this}}),i.Mask=i.invent({create:function(){this.constructor.call(this,i.create("mask")),this.targets=[]},inherit:i.Container,extend:{remove:function(){for(var t=this.targets.length-1;t>=0;t--)this.targets[t]&&this.targets[t].unmask();return this.targets=[],i.Element.prototype.remove.call(this),this}},construct:{mask:function(){return this.defs().put(new i.Mask)}}}),i.extend(i.Element,{maskWith:function(t){return this.masker=t instanceof i.Mask?t:this.parent().mask().add(t),this.masker.targets.push(this),this.attr("mask",'url("#'+this.masker.attr("id")+'")')},unmask:function(){return delete this.masker,this.attr("mask",null)}}),i.ClipPath=i.invent({create:function(){this.constructor.call(this,i.create("clipPath")),this.targets=[]},inherit:i.Container,extend:{remove:function(){for(var t=this.targets.length-1;t>=0;t--)this.targets[t]&&this.targets[t].unclip();return this.targets=[],this.parent().removeElement(this),this}},construct:{clip:function(){return this.defs().put(new i.ClipPath)}}}),i.extend(i.Element,{clipWith:function(t){return this.clipper=t instanceof i.ClipPath?t:this.parent().clip().add(t),this.clipper.targets.push(this),this.attr("clip-path",'url("#'+this.clipper.attr("id")+'")')},unclip:function(){return delete this.clipper,this.attr("clip-path",null)}}),i.Gradient=i.invent({create:function(t){this.constructor.call(this,i.create(t+"Gradient")),this.type=t},inherit:i.Container,extend:{at:function(t,e,n){return this.put(new i.Stop).update(t,e,n)},update:function(t){return this.clear(),"function"==typeof t&&t.call(this,this),this},fill:function(){return"url(#"+this.id()+")"},toString:function(){return this.fill()},attr:function(t,e,n){return"transform"==t&&(t="gradientTransform"),i.Container.prototype.attr.call(this,t,e,n)}},construct:{gradient:function(t,e){return this.defs().gradient(t,e)}}}),i.extend(i.Gradient,i.FX,{from:function(t,e){return"radial"==(this._target||this).type?this.attr({fx:new i.Number(t),fy:new i.Number(e)}):this.attr({x1:new i.Number(t),y1:new i.Number(e)})},to:function(t,e){return"radial"==(this._target||this).type?this.attr({cx:new i.Number(t),cy:new i.Number(e)}):this.attr({x2:new i.Number(t),y2:new i.Number(e)})}}),i.extend(i.Defs,{gradient:function(t,e){return this.put(new i.Gradient(t)).update(e)}}),i.Stop=i.invent({create:"stop",inherit:i.Element,extend:{update:function(t){return("number"==typeof t||t instanceof i.Number)&&(t={offset:arguments[0],color:arguments[1],opacity:arguments[2]}),null!=t.opacity&&this.attr("stop-opacity",t.opacity),null!=t.color&&this.attr("stop-color",t.color),null!=t.offset&&this.attr("offset",new i.Number(t.offset)),this}}}),i.Pattern=i.invent({create:"pattern",inherit:i.Container,extend:{fill:function(){return"url(#"+this.id()+")"},update:function(t){return this.clear(),"function"==typeof t&&t.call(this,this),this},toString:function(){return this.fill()},attr:function(t,e,n){return"transform"==t&&(t="patternTransform"),i.Container.prototype.attr.call(this,t,e,n)}},construct:{pattern:function(t,e,i){return this.defs().pattern(t,e,i)}}}),i.extend(i.Defs,{pattern:function(t,e,n){return this.put(new i.Pattern).update(n).attr({x:0,y:0,width:t,height:e,patternUnits:"userSpaceOnUse"})}}),i.Shape=i.invent({create:function(t){this.constructor.call(this,t)},inherit:i.Element}),i.Bare=i.invent({create:function(t,e){if(this.constructor.call(this,i.create(t)),e)for(var n in e.prototype)"function"==typeof e.prototype[n]&&(this[n]=e.prototype[n])},inherit:i.Element,extend:{words:function(t){for(;this.node.hasChildNodes();)this.node.removeChild(this.node.lastChild);return this.node.appendChild(e.createTextNode(t)),this}}}),i.extend(i.Parent,{element:function(t,e){return this.put(new i.Bare(t,e))}}),i.Symbol=i.invent({create:"symbol",inherit:i.Container,construct:{symbol:function(){return this.put(new i.Symbol)}}}),i.Use=i.invent({create:"use",inherit:i.Shape,extend:{element:function(t,e){return this.attr("href",(e||"")+"#"+t,i.xlink)}},construct:{use:function(t,e){return this.put(new i.Use).element(t,e)}}}),i.Rect=i.invent({create:"rect",inherit:i.Shape,construct:{rect:function(t,e){return this.put(new i.Rect).size(t,e)}}}),i.Circle=i.invent({create:"circle",inherit:i.Shape,construct:{circle:function(t){return this.put(new i.Circle).rx(new i.Number(t).divide(2)).move(0,0)}}}),i.extend(i.Circle,i.FX,{rx:function(t){return this.attr("r",t)},ry:function(t){return this.rx(t)}}),i.Ellipse=i.invent({create:"ellipse",inherit:i.Shape,construct:{ellipse:function(t,e){return this.put(new i.Ellipse).size(t,e).move(0,0)}}}),i.extend(i.Ellipse,i.Rect,i.FX,{rx:function(t){return this.attr("rx",t)},ry:function(t){return this.attr("ry",t)}}),i.extend(i.Circle,i.Ellipse,{x:function(t){return null==t?this.cx()-this.rx():this.cx(t+this.rx())},y:function(t){return null==t?this.cy()-this.ry():this.cy(t+this.ry())},cx:function(t){return null==t?this.attr("cx"):this.attr("cx",t)},cy:function(t){return null==t?this.attr("cy"):this.attr("cy",t)},width:function(t){return null==t?2*this.rx():this.rx(new i.Number(t).divide(2))},height:function(t){return null==t?2*this.ry():this.ry(new i.Number(t).divide(2))},size:function(t,e){var n=d(this,t,e);return this.rx(new i.Number(n.width).divide(2)).ry(new i.Number(n.height).divide(2))}}),i.Line=i.invent({create:"line",inherit:i.Shape,extend:{array:function(){return new i.PointArray([[this.attr("x1"),this.attr("y1")],[this.attr("x2"),this.attr("y2")]])},plot:function(t,e,n,s){return null==t?this.array():(t=void 0!==e?{x1:t,y1:e,x2:n,y2:s}:new i.PointArray(t).toLine(),this.attr(t))},move:function(t,e){return this.attr(this.array().move(t,e).toLine())},size:function(t,e){var i=d(this,t,e);return this.attr(this.array().size(i.width,i.height).toLine())}},construct:{line:function(t,e,n,s){return i.Line.prototype.plot.apply(this.put(new i.Line),null!=t?[t,e,n,s]:[0,0,0,0])}}}),i.Polyline=i.invent({create:"polyline",inherit:i.Shape,construct:{polyline:function(t){return this.put(new i.Polyline).plot(t||new i.PointArray)}}}),i.Polygon=i.invent({create:"polygon",inherit:i.Shape,construct:{polygon:function(t){return this.put(new i.Polygon).plot(t||new i.PointArray)}}}),i.extend(i.Polyline,i.Polygon,{array:function(){return this._array||(this._array=new i.PointArray(this.attr("points")))},plot:function(t){return null==t?this.array():this.clear().attr("points","string"==typeof t?t:this._array=new i.PointArray(t))},clear:function(){return delete this._array,this},move:function(t,e){return this.attr("points",this.array().move(t,e))},size:function(t,e){var i=d(this,t,e);return this.attr("points",this.array().size(i.width,i.height))}}),i.extend(i.Line,i.Polyline,i.Polygon,{morphArray:i.PointArray,x:function(t){return null==t?this.bbox().x:this.move(t,this.bbox().y)},y:function(t){return null==t?this.bbox().y:this.move(this.bbox().x,t)},width:function(t){var e=this.bbox();return null==t?e.width:this.size(t,e.height)},height:function(t){var e=this.bbox();return null==t?e.height:this.size(e.width,t)}}),i.Path=i.invent({create:"path",inherit:i.Shape,extend:{morphArray:i.PathArray,array:function(){return this._array||(this._array=new i.PathArray(this.attr("d")))},plot:function(t){return null==t?this.array():this.clear().attr("d","string"==typeof t?t:this._array=new i.PathArray(t))},clear:function(){return delete this._array,this},move:function(t,e){return this.attr("d",this.array().move(t,e))},x:function(t){return null==t?this.bbox().x:this.move(t,this.bbox().y)},y:function(t){return null==t?this.bbox().y:this.move(this.bbox().x,t)},size:function(t,e){var i=d(this,t,e);return this.attr("d",this.array().size(i.width,i.height))},width:function(t){return null==t?this.bbox().width:this.size(t,this.bbox().height)},height:function(t){return null==t?this.bbox().height:this.size(this.bbox().width,t)}},construct:{path:function(t){return this.put(new i.Path).plot(t||new i.PathArray)}}}),i.Image=i.invent({create:"image",inherit:i.Shape,extend:{load:function(e){if(!e)return this;var n=this,s=new t.Image;return i.on(s,"load",function(){i.off(s);var t=n.parent(i.Pattern);null!==t&&(0==n.width()&&0==n.height()&&n.size(s.width,s.height),t&&0==t.width()&&0==t.height()&&t.size(n.width(),n.height()),"function"==typeof n._loaded&&n._loaded.call(n,{width:s.width,height:s.height,ratio:s.width/s.height,url:e}))}),i.on(s,"error",function(t){i.off(s),"function"==typeof n._error&&n._error.call(n,t)}),this.attr("href",s.src=this.src=e,i.xlink)},loaded:function(t){return this._loaded=t,this},error:function(t){return this._error=t,this}},construct:{image:function(t,e,n){return this.put(new i.Image).load(t).size(e||0,n||e||0)}}}),i.Text=i.invent({create:function(){this.constructor.call(this,i.create("text")),this.dom.leading=new i.Number(1.3),this._rebuild=!0,this._build=!1,this.attr("font-family",i.defaults.attrs["font-family"])},inherit:i.Shape,extend:{x:function(t){return null==t?this.attr("x"):this.attr("x",t)},y:function(t){var e=this.attr("y"),i="number"==typeof e?e-this.bbox().y:0;return null==t?"number"==typeof e?e-i:e:this.attr("y","number"==typeof t.valueOf()?t+i:t)},cx:function(t){return null==t?this.bbox().cx:this.x(t-this.bbox().width/2)},cy:function(t){return null==t?this.bbox().cy:this.y(t-this.bbox().height/2)},text:function(t){if(void 0===t){for(var t="",e=this.node.childNodes,n=0,s=e.length;n=0;n--)e.childNodes[n]instanceof t.SVGElement&&v(e.childNodes[n]);return i.adopt(e).id(i.eid(e.nodeName))}function y(t){return null==t.x&&(t.x=0,t.y=0,t.width=0,t.height=0),t.w=t.width,t.h=t.height,t.x2=t.x+t.width,t.y2=t.y+t.height,t.cx=t.x+t.width/2,t.cy=t.y+t.height/2,t}function g(t){return Math.abs(t)>1e-37?t:0}["fill","stroke"].forEach(function(t){var e,n={};n[t]=function(n){if(void 0===n)return this;if("string"==typeof n||i.Color.isRgb(n)||n&&"function"==typeof n.fill)this.attr(t,n);else for(e=o[t].length-1;e>=0;e--)null!=n[o[t][e]]&&this.attr(o.prefix(t,o[t][e]),n[o[t][e]]);return this},i.extend(i.Element,i.FX,n)}),i.extend(i.Element,i.FX,{rotate:function(t,e,i){return this.transform({rotation:t,cx:e,cy:i})},skew:function(t,e,i,n){return 1==arguments.length||3==arguments.length?this.transform({skew:t,cx:e,cy:i}):this.transform({skewX:t,skewY:e,cx:i,cy:n})},scale:function(t,e,i,n){return 1==arguments.length||3==arguments.length?this.transform({scale:t,cx:e,cy:i}):this.transform({scaleX:t,scaleY:e,cx:i,cy:n})},translate:function(t,e){return this.transform({x:t,y:e})},flip:function(t,e){return e="number"==typeof t?t:e,this.transform({flip:t||"both",offset:e})},matrix:function(t){return this.attr("transform",new i.Matrix(6==arguments.length?[].slice.call(arguments):t))},opacity:function(t){return this.attr("opacity",t)},dx:function(t){return this.x(new i.Number(t).plus(this instanceof i.FX?0:this.x()),!0)},dy:function(t){return this.y(new i.Number(t).plus(this instanceof i.FX?0:this.y()),!0)},dmove:function(t,e){return this.dx(t).dy(e)}}),i.extend(i.Rect,i.Ellipse,i.Circle,i.Gradient,i.FX,{radius:function(t,e){var n=(this._target||this).type;return"radial"==n||"circle"==n?this.attr("r",new i.Number(t)):this.rx(t).ry(null==e?t:e)}}),i.extend(i.Path,{length:function(){return this.node.getTotalLength()},pointAt:function(t){return this.node.getPointAtLength(t)}}),i.extend(i.Parent,i.Text,i.Tspan,i.FX,{font:function(t,e){if("object"==typeof t)for(e in t)this.font(e,t[e]);return"leading"==t?this.leading(e):"anchor"==t?this.attr("text-anchor",e):"size"==t||"family"==t||"weight"==t||"stretch"==t||"variant"==t||"style"==t?this.attr("font-"+t,e):this.attr(t,e)}}),i.Set=i.invent({create:function(t){t instanceof i.Set?this.members=t.members.slice():Array.isArray(t)?this.members=t:this.clear()},extend:{add:function(){var t,e,i=[].slice.call(arguments);for(t=0,e=i.length;t-1&&this.members.splice(e,1),this},each:function(t){for(var e=0,i=this.members.length;e=0},index:function(t){return this.members.indexOf(t)},get:function(t){return this.members[t]},first:function(){return this.get(0)},last:function(){return this.get(this.members.length-1)},valueOf:function(){return this.members},bbox:function(){if(0==this.members.length)return new i.RBox;var t=this.members[0].rbox(this.members[0].doc());return this.each(function(){t=t.merge(this.rbox(this.doc()))}),t}},construct:{set:function(t){return new i.Set(t)}}}),i.FX.Set=i.invent({create:function(t){this.set=t}}),i.Set.inherit=function(){var t=[];for(var e in i.Shape.prototype)"function"==typeof i.Shape.prototype[e]&&"function"!=typeof i.Set.prototype[e]&&t.push(e);for(var e in t.forEach(function(t){i.Set.prototype[t]=function(){for(var e=0,n=this.members.length;e=0;t--)delete this.memory()[arguments[t]];return this},memory:function(){return this._memory||(this._memory={})}}),i.get=function(t){var n=e.getElementById(function(t){var e=(t||"").toString().match(i.regex.reference);if(e)return e[1]}(t)||t);return i.adopt(n)},i.select=function(t,n){return new i.Set(i.utils.map((n||e).querySelectorAll(t),function(t){return i.adopt(t)}))},i.extend(i.Parent,{select:function(t){return i.select(t,this.node)}});var x="abcdef".split("");if("function"!=typeof t.CustomEvent){var w=function(t,i){i=i||{bubbles:!1,cancelable:!1,detail:void 0};var n=e.createEvent("CustomEvent");return n.initCustomEvent(t,i.bubbles,i.cancelable,i.detail),n};w.prototype=t.Event.prototype,i.CustomEvent=w}else i.CustomEvent=t.CustomEvent;return function(e){for(var i=0,n=["moz","webkit"],s=0;sr.maxX-e.width&&(a=(n=r.maxX-e.width)-this.startPoints.box.x),null!=r.minY&&sr.maxY-e.height&&(o=(s=r.maxY-e.height)-this.startPoints.box.y),null!=r.snapToGrid&&(n-=n%r.snapToGrid,s-=s%r.snapToGrid,a-=a%r.snapToGrid,o-=o%r.snapToGrid),this.el instanceof SVG.G?this.el.matrix(this.startPoints.transform).transform({x:a,y:o},!0):this.el.move(n,s));return i},t.prototype.end=function(t){var e=this.drag(t);this.el.fire("dragend",{event:t,p:e,m:this.m,handler:this}),SVG.off(window,"mousemove.drag"),SVG.off(window,"touchmove.drag"),SVG.off(window,"mouseup.drag"),SVG.off(window,"touchend.drag")},SVG.extend(SVG.Element,{draggable:function(e,i){"function"!=typeof e&&"object"!=typeof e||(i=e,e=!0);var n=this.remember("_draggable")||new t(this);return(e=void 0===e||e)?n.init(i||{},e):(this.off("mousedown.drag"),this.off("touchstart.drag")),this}})}).call(this)},function(t,e){!function(){"use strict";(function(){function t(t){t.remember("_resizeHandler",this),this.el=t,this.parameters={},this.lastUpdateCall=null,this.p=t.doc().node.createSVGPoint()}t.prototype.transformPoint=function(t,e,i){return this.p.x=t-(this.offset.x-window.pageXOffset),this.p.y=e-(this.offset.y-window.pageYOffset),this.p.matrixTransform(i||this.m)},t.prototype._extractPosition=function(t){return{x:null!=t.clientX?t.clientX:t.touches[0].clientX,y:null!=t.clientY?t.clientY:t.touches[0].clientY}},t.prototype.init=function(t){var e=this;if(this.stop(),"stop"!==t){for(var i in this.options={},this.el.resize.defaults)this.options[i]=this.el.resize.defaults[i],void 0!==t[i]&&(this.options[i]=t[i]);this.el.on("lt.resize",function(t){e.resize(t||window.event)}),this.el.on("rt.resize",function(t){e.resize(t||window.event)}),this.el.on("rb.resize",function(t){e.resize(t||window.event)}),this.el.on("lb.resize",function(t){e.resize(t||window.event)}),this.el.on("t.resize",function(t){e.resize(t||window.event)}),this.el.on("r.resize",function(t){e.resize(t||window.event)}),this.el.on("b.resize",function(t){e.resize(t||window.event)}),this.el.on("l.resize",function(t){e.resize(t||window.event)}),this.el.on("rot.resize",function(t){e.resize(t||window.event)}),this.el.on("point.resize",function(t){e.resize(t||window.event)}),this.update()}},t.prototype.stop=function(){return this.el.off("lt.resize"),this.el.off("rt.resize"),this.el.off("rb.resize"),this.el.off("lb.resize"),this.el.off("t.resize"),this.el.off("r.resize"),this.el.off("b.resize"),this.el.off("l.resize"),this.el.off("rot.resize"),this.el.off("point.resize"),this},t.prototype.resize=function(t){var e=this;this.m=this.el.node.getScreenCTM().inverse(),this.offset={x:window.pageXOffset,y:window.pageYOffset};var i=this._extractPosition(t.detail.event);if(this.parameters={type:this.el.type,p:this.transformPoint(i.x,i.y),x:t.detail.x,y:t.detail.y,box:this.el.bbox(),rotation:this.el.transform().rotation},"text"===this.el.type&&(this.parameters.fontSize=this.el.attr()["font-size"]),void 0!==t.detail.i){var n=this.el.array().valueOf();this.parameters.i=t.detail.i,this.parameters.pointCoords=[n[t.detail.i][0],n[t.detail.i][1]]}switch(t.type){case"lt":this.calc=function(t,e){var i=this.snapToGrid(t,e);if(this.parameters.box.width-i[0]>0&&this.parameters.box.height-i[1]>0){if("text"===this.parameters.type)return this.el.move(this.parameters.box.x+i[0],this.parameters.box.y),void this.el.attr("font-size",this.parameters.fontSize-i[0]);i=this.checkAspectRatio(i),this.el.move(this.parameters.box.x+i[0],this.parameters.box.y+i[1]).size(this.parameters.box.width-i[0],this.parameters.box.height-i[1])}};break;case"rt":this.calc=function(t,e){var i=this.snapToGrid(t,e,2);if(this.parameters.box.width+i[0]>0&&this.parameters.box.height-i[1]>0){if("text"===this.parameters.type)return this.el.move(this.parameters.box.x-i[0],this.parameters.box.y),void this.el.attr("font-size",this.parameters.fontSize+i[0]);i=this.checkAspectRatio(i,!0),this.el.move(this.parameters.box.x,this.parameters.box.y+i[1]).size(this.parameters.box.width+i[0],this.parameters.box.height-i[1])}};break;case"rb":this.calc=function(t,e){var i=this.snapToGrid(t,e,0);if(this.parameters.box.width+i[0]>0&&this.parameters.box.height+i[1]>0){if("text"===this.parameters.type)return this.el.move(this.parameters.box.x-i[0],this.parameters.box.y),void this.el.attr("font-size",this.parameters.fontSize+i[0]);i=this.checkAspectRatio(i),this.el.move(this.parameters.box.x,this.parameters.box.y).size(this.parameters.box.width+i[0],this.parameters.box.height+i[1])}};break;case"lb":this.calc=function(t,e){var i=this.snapToGrid(t,e,1);if(this.parameters.box.width-i[0]>0&&this.parameters.box.height+i[1]>0){if("text"===this.parameters.type)return this.el.move(this.parameters.box.x+i[0],this.parameters.box.y),void this.el.attr("font-size",this.parameters.fontSize-i[0]);i=this.checkAspectRatio(i,!0),this.el.move(this.parameters.box.x+i[0],this.parameters.box.y).size(this.parameters.box.width-i[0],this.parameters.box.height+i[1])}};break;case"t":this.calc=function(t,e){var i=this.snapToGrid(t,e,2);if(this.parameters.box.height-i[1]>0){if("text"===this.parameters.type)return;this.el.move(this.parameters.box.x,this.parameters.box.y+i[1]).height(this.parameters.box.height-i[1])}};break;case"r":this.calc=function(t,e){var i=this.snapToGrid(t,e,0);if(this.parameters.box.width+i[0]>0){if("text"===this.parameters.type)return;this.el.move(this.parameters.box.x,this.parameters.box.y).width(this.parameters.box.width+i[0])}};break;case"b":this.calc=function(t,e){var i=this.snapToGrid(t,e,0);if(this.parameters.box.height+i[1]>0){if("text"===this.parameters.type)return;this.el.move(this.parameters.box.x,this.parameters.box.y).height(this.parameters.box.height+i[1])}};break;case"l":this.calc=function(t,e){var i=this.snapToGrid(t,e,1);if(this.parameters.box.width-i[0]>0){if("text"===this.parameters.type)return;this.el.move(this.parameters.box.x+i[0],this.parameters.box.y).width(this.parameters.box.width-i[0])}};break;case"rot":this.calc=function(t,e){var i=t+this.parameters.p.x,n=e+this.parameters.p.y,s=Math.atan2(this.parameters.p.y-this.parameters.box.y-this.parameters.box.height/2,this.parameters.p.x-this.parameters.box.x-this.parameters.box.width/2),r=Math.atan2(n-this.parameters.box.y-this.parameters.box.height/2,i-this.parameters.box.x-this.parameters.box.width/2),a=this.parameters.rotation+180*(r-s)/Math.PI+this.options.snapToAngle/2;this.el.center(this.parameters.box.cx,this.parameters.box.cy).rotate(a-a%this.options.snapToAngle,this.parameters.box.cx,this.parameters.box.cy)};break;case"point":this.calc=function(t,e){var i=this.snapToGrid(t,e,this.parameters.pointCoords[0],this.parameters.pointCoords[1]),n=this.el.array().valueOf();n[this.parameters.i][0]=this.parameters.pointCoords[0]+i[0],n[this.parameters.i][1]=this.parameters.pointCoords[1]+i[1],this.el.plot(n)}}this.el.fire("resizestart",{dx:this.parameters.x,dy:this.parameters.y,event:t}),SVG.on(window,"touchmove.resize",function(t){e.update(t||window.event)}),SVG.on(window,"touchend.resize",function(){e.done()}),SVG.on(window,"mousemove.resize",function(t){e.update(t||window.event)}),SVG.on(window,"mouseup.resize",function(){e.done()})},t.prototype.update=function(t){if(t){var e=this._extractPosition(t),i=this.transformPoint(e.x,e.y),n=i.x-this.parameters.p.x,s=i.y-this.parameters.p.y;this.lastUpdateCall=[n,s],this.calc(n,s),this.el.fire("resizing",{dx:n,dy:s,event:t})}else this.lastUpdateCall&&this.calc(this.lastUpdateCall[0],this.lastUpdateCall[1])},t.prototype.done=function(){this.lastUpdateCall=null,SVG.off(window,"mousemove.resize"),SVG.off(window,"mouseup.resize"),SVG.off(window,"touchmove.resize"),SVG.off(window,"touchend.resize"),this.el.fire("resizedone")},t.prototype.snapToGrid=function(t,e,i,n){var s;return void 0!==n?s=[(i+t)%this.options.snapToGrid,(n+e)%this.options.snapToGrid]:(i=null==i?3:i,s=[(this.parameters.box.x+t+(1&i?0:this.parameters.box.width))%this.options.snapToGrid,(this.parameters.box.y+e+(2&i?0:this.parameters.box.height))%this.options.snapToGrid]),t<0&&(s[0]-=this.options.snapToGrid),e<0&&(s[1]-=this.options.snapToGrid),t-=Math.abs(s[0])a.maxX&&(t=a.maxX-s),void 0!==a.minY&&r+ea.maxY&&(e=a.maxY-r),[t,e]},t.prototype.checkAspectRatio=function(t,e){if(!this.options.saveAspectRatio)return t;var i=t.slice(),n=this.parameters.box.width/this.parameters.box.height,s=this.parameters.box.width+t[0],r=this.parameters.box.height-t[1],a=s/r;return an&&(i[0]=this.parameters.box.width-r*n,e&&(i[0]=-i[0])),i},SVG.extend(SVG.Element,{resize:function(e){return(this.remember("_resizeHandler")||new t(this)).init(e||{}),this}}),SVG.Element.prototype.resize.defaults={snapToAngle:.1,snapToGrid:1,constraint:{},saveAspectRatio:!1}}).call(this)}()},function(t,e){!function(){"use strict";function t(t){this.el=t,t.remember("_selectHandler",this),this.pointSelection={isSelected:!1},this.rectSelection={isSelected:!1},this.pointsList={lt:[0,0],rt:["width",0],rb:["width","height"],lb:[0,"height"],t:["width",0],r:["width","height"],b:["width","height"],l:[0,"height"]},this.pointCoord=function(t,e,i){var n="string"!=typeof t?t:e[t];return i?n/2:n},this.pointCoords=function(t,e){var i=this.pointsList[t];return{x:this.pointCoord(i[0],e,"t"===t||"b"===t),y:this.pointCoord(i[1],e,"r"===t||"l"===t)}}}t.prototype.init=function(t,e){var i=this.el.bbox();this.options={};var n=this.el.selectize.defaults.points;for(var s in this.el.selectize.defaults)this.options[s]=this.el.selectize.defaults[s],void 0!==e[s]&&(this.options[s]=e[s]);var r=["points","pointsExclude"];for(var s in r){var a=this.options[r[s]];"string"==typeof a?a=a.length>0?a.split(/\s*,\s*/i):[]:"boolean"==typeof a&&"points"===r[s]&&(a=a?n:[]),this.options[r[s]]=a}this.options.points=[n,this.options.points].reduce(function(t,e){return t.filter(function(t){return e.indexOf(t)>-1})}),this.options.points=[this.options.points,this.options.pointsExclude].reduce(function(t,e){return t.filter(function(t){return e.indexOf(t)<0})}),this.parent=this.el.parent(),this.nested=this.nested||this.parent.group(),this.nested.matrix(new SVG.Matrix(this.el).translate(i.x,i.y)),this.options.deepSelect&&-1!==["line","polyline","polygon"].indexOf(this.el.type)?this.selectPoints(t):this.selectRect(t),this.observe(),this.cleanup()},t.prototype.selectPoints=function(t){return this.pointSelection.isSelected=t,this.pointSelection.set?this:(this.pointSelection.set=this.parent.set(),this.drawPoints(),this)},t.prototype.getPointArray=function(){var t=this.el.bbox();return this.el.array().valueOf().map(function(e){return[e[0]-t.x,e[1]-t.y]})},t.prototype.drawPoints=function(){for(var t=this,e=this.getPointArray(),i=0,n=e.length;i-1){var e=this.transformPoint(t.clientX,t.clientY),i=this.el.array().valueOf();return i.push(this.snapToGrid([e.x,e.y])),this.el.plot(i),this.drawCircles(),void this.el.fire("drawpoint",{event:t,p:{x:e.x,y:e.y},m:this.m})}this.stop(t)},clean:function(){this.set.each(function(){this.remove()}),this.set.clear(),delete this.set},drawCircles:function(){var t=this.el.array().valueOf();this.set.each(function(){this.remove()}),this.set.clear();for(var e=0;e0?6*n/5:5*n/6;this.data.scale=Math.min(Math.max(r,s.MIN),s.MAX);var o=this.data.angle,h=Math.sin(o*Math.PI/180)+Math.cos(o*Math.PI/180);o/90%2?(this.data.top+=h*((t-this.data.imageSize.width/2)*(n/this.data.scale-1))*this.data.scale,this.data.left-=h*((e-this.data.imageSize.height/2)*(n/this.data.scale-1))*this.data.scale):(this.data.left+=h*((t-this.data.imageSize.width/2)*(n/this.data.scale-1))*this.data.scale,this.data.top+=h*((e-this.data.imageSize.height/2)*(n/this.data.scale-1))*this.data.scale),this.notify(a.ZOOM)}},{key:"move",value:function(t,e){this.data.top+=t,this.data.left+=e,this.notify(a.MOVE)}},{key:"setup",value:function(t,e){var i=this;t.data(function(){i.data.image="",i.notify(a.IMAGE)}).then(function(n){i.data.imageSize={height:t.height,width:t.width},i.data.rememberAngle||(i.data.angle=0),i.data.image=n,i.notify(a.IMAGE),i.data.objects=e,i.notify(a.OBJECTS)}).catch(function(t){throw t})}},{key:"activate",value:function(t,e){this.data.activeElement={clientID:t,attributeID:e},this.notify(a.ACTIVATE)}},{key:"rotate",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];t===r.CLOCKWISE90?this.data.angle+=90:this.data.angle-=90,this.data.angle%=360,this.data.rememberAngle=e,this.fit()}},{key:"focus",value:function(t,e){this.data.focusData={clientID:t,padding:e},this.notify(a.FOCUS)}},{key:"fit",value:function(){var t=this.data.angle;this.data.scale=t/90%2?Math.min(this.data.canvasSize.width/this.data.imageSize.height,this.data.canvasSize.height/this.data.imageSize.width):Math.min(this.data.canvasSize.width/this.data.imageSize.width,this.data.canvasSize.height/this.data.imageSize.height),this.data.scale=Math.min(Math.max(this.data.scale,s.MIN),s.MAX),this.data.top=this.data.canvasSize.height/2-this.data.imageSize.height/2,this.data.left=this.data.canvasSize.width/2-this.data.imageSize.width/2,this.notify(a.FIT)}},{key:"grid",value:function(t,e){this.data.gridSize={height:e,width:t},this.notify(a.GRID)}},{key:"draw",value:function(t){if(t.enabled){if(this.data.drawData.enabled)throw new Error("Drawing has been already started");if(!t.shapeType)throw new Error("A shape type is not specified");if(void 0!==t.numberOfPoints){if("polygon"===t.shapeType&&t.numberOfPoints<3)throw new Error("A polygon consists of at least 3 points");if("polyline"===t.shapeType&&t.numberOfPoints<2)throw new Error("A polyline consists of at least 2 points")}}this.data.drawData=Object.assign({},t),this.notify(a.DRAW)}},{key:"split",value:function(t){return t}},{key:"group",value:function(t){return t}},{key:"merge",value:function(t){return t}},{key:"cancel",value:function(){console.log("hello")}},{key:"geometry",get:function(){return{angle:this.data.angle,canvas:Object.assign({},this.data.canvasSize),image:Object.assign({},this.data.imageSize),grid:Object.assign({},this.data.gridSize),left:this.data.left,offset:this.data.imageOffset,scale:this.data.scale,top:this.data.top}},set:function(t){this.data.angle=t.angle,this.data.canvasSize=Object.assign({},t.canvas),this.data.imageSize=Object.assign({},t.image),this.data.gridSize=Object.assign({},t.grid),this.data.left=t.left,this.data.top=t.top,this.data.imageOffset=t.offset,this.data.scale=t.scale,this.data.imageOffset=Math.floor(Math.max(this.data.canvasSize.height/s.MIN,this.data.canvasSize.width/s.MIN))}},{key:"image",get:function(){return this.data.image}},{key:"objects",get:function(){return this.data.objects}},{key:"gridSize",get:function(){return Object.assign({},this.data.gridSize)}},{key:"focusData",get:function(){return Object.assign({},this.data.focusData)}},{key:"activeElement",get:function(){return Object.assign({},this.data.activeElement)}},{key:"objectStateClass",get:function(){return this.data.ObjectStateClass}},{key:"drawData",get:function(){return Object.assign({},this.data.drawData)}}])&&l(i.prototype,n),h&&l(i,h),e}();function p(t,e){for(var i=0;i=y.AREA_THRESHOLD?t.onDrawDone({points:[a,o,h,l]}):t.onDrawDone(null)})}},{key:"drawPolyshape",value:function(){var t=this,e=this.drawData.numberOfPoints,i=function(){--e||this.drawInstance.draw("done")}.bind(this);this.drawData.numberOfPoints&&(this.drawInstance.on("drawstart",i),this.drawInstance.on("drawpoint",i),this.drawInstance.on("undopoint",function(){e++}));var n=function(t){3===t.which&&(t.stopPropagation(),t.preventDefault(),this.drawInstance.draw("undo"))}.bind(this);this.canvas.node.addEventListener("mousedown",n);var s={x:null,y:null},r=function(t){if(t.shiftKey&&["polygon","polyline"].includes(this.drawData.shapeType))if(null===s.x||null===s.y)this.drawInstance.draw("point",t);else{Math.sqrt(Math.pow(t.clientX-s.x,2)+Math.pow(t.clientY-s.y,2))>15&&this.drawInstance.draw("point",t)}}.bind(this);this.canvas.node.addEventListener("mousemove",r);var a=this;this.drawInstance.on("drawstart drawpoint",function(t){a.transform(a.geometry),s.x=t.detail.event.clientX,s.y=t.detail.event.clientY}),this.drawInstance.on("drawstop",function(){a.canvas.node.removeEventListener("mousedown",n),a.canvas.node.removeEventListener("mousemove",r)}),this.drawInstance.on("drawdone",function(e){var i=I(t.canvas.node,e.target.getAttribute("points").split(/[,\s]/g).map(function(t){return+t}));i=z(t.background,i);for(var n={xtl:Number.MAX_SAFE_INTEGER,ytl:Number.MAX_SAFE_INTEGER,xbr:Number.MAX_SAFE_INTEGER,ybr:Number.MAX_SAFE_INTEGER},s=t.geometry.image.width,r=t.geometry.image.height,a=0;a=y.AREA_THRESHOLD?t.onDrawDone({points:i}):"polyline"===t.drawData.shapeType&&(n.xbr-n.xtl>=y.SIZE_THRESHOLD||n.ybr-n.ytl>=y.SIZE_THRESHOLD)?t.onDrawDone({points:i}):"points"===t.drawData.shapeType?t.onDrawDone({points:i}):t.onDrawDone(null)})}},{key:"drawPolygon",value:function(){this.drawInstance=this.canvas.polygon().draw({snapToGrid:.1}).addClass("cvat_canvas_shape_drawing").style({"stroke-width":y.BASE_STROKE_WIDTH/this.geometry.scale}),this.drawPolyshape()}},{key:"drawPolyline",value:function(){this.drawInstance=this.canvas.polyline().draw({snapToGrid:.1}).addClass("cvat_canvas_shape_drawing").style({"stroke-width":y.BASE_STROKE_WIDTH/this.geometry.scale,"fill-opacity":0}),this.drawPolyshape()}},{key:"drawPoints",value:function(){this.drawInstance=this.canvas.polygon().draw({snapToGrid:.1}).addClass("cvat_canvas_shape_drawing").style({"stroke-width":0,opacity:0}),this.drawPolyshape()}},{key:"startDraw",value:function(){"rectangle"===this.drawData.shapeType?this.drawBox():"polygon"===this.drawData.shapeType?this.drawPolygon():"polyline"===this.drawData.shapeType?this.drawPolyline():"points"===this.drawData.shapeType&&this.drawPoints()}}]),X(t,[{key:"transform",value:function(t){if(this.geometry=t,this.crosshair&&(this.crosshair.x.attr({"stroke-width":y.BASE_STROKE_WIDTH/(2*t.scale)}),this.crosshair.y.attr({"stroke-width":y.BASE_STROKE_WIDTH/(2*t.scale)})),this.drawInstance){this.drawInstance.draw("transform"),this.drawInstance.style({"stroke-width":y.BASE_STROKE_WIDTH/t.scale});var e=this.drawInstance.remember("_paintHandler"),i=!0,n=!1,s=void 0;try{for(var r,a=e.set.members[Symbol.iterator]();!(i=(r=a.next()).done);i=!0){var o=r.value;o.style("stroke-width","".concat(y.BASE_STROKE_WIDTH/(3*t.scale))),o.attr("r","".concat(y.BASE_POINT_SIZE/(2*t.scale)))}}catch(t){n=!0,s=t}finally{try{i||null==a.return||a.return()}finally{if(n)throw s}}}}},{key:"draw",value:function(t,e){this.geometry=e,t.enabled?(this.drawData=t,this.initDrawing(),this.startDraw()):(this.closeDrawing(),this.drawData=t)}}]),t}();function R(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var i=[],n=!0,s=!1,r=void 0;try{for(var a,o=t[Symbol.iterator]();!(n=(a=o.next()).done)&&(i.push(a.value),!e||i.length!==e);n=!0);}catch(t){s=!0,r=t}finally{try{n||null==o.return||o.return()}finally{if(s)throw r}}return i}(t,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}()}function L(t,e){for(var i=0;i0?-1:1),t.preventDefault()}),this.content.addEventListener("mousemove",function(t){if(n.mode===B.IDLE){var e=R(z(n.background,[t.clientX,t.clientY]),2),i=e[0],s=e[1],r=new CustomEvent("canvas.moved",{bubbles:!1,cancelable:!0,detail:{x:i,y:s,objects:n.controller.objects}});n.canvas.dispatchEvent(r)}}),this.content.oncontextmenu=function(){return!1},e.subscribe(this)}return Y(t,[{key:"onDrawDone",value:function(t){if(t){var e=new CustomEvent("canvas.drawn",{bubbles:!1,cancelable:!0,detail:{state:new this.controller.objectStateClass(t)}});this.canvas.dispatchEvent(e)}else{var i=new CustomEvent("canvas.canceled",{bubbles:!1,cancelable:!0});this.canvas.dispatchEvent(i)}this.controller.draw({enabled:!1})}}]),Y(t,[{key:"notify",value:function(t,e){function i(t){for(var e=0,i=[this.background,this.grid,this.loadingAnimation,this.content];ethis.canvas.offsetWidth){var u=[i.x,i.y];l=u[0],c=u[1]}var d=R(z(this.text,[l+y.TEXT_MARGIN,c]),2),f=d[0],p=d[1];t.move(f,p);var m=!0,v=!1,g=void 0;try{for(var x,w=t.lines().members[Symbol.iterator]();!(m=(x=w.next()).done);m=!0){x.value.attr("x",t.attr("x"))}}catch(t){v=!0,g=t}finally{try{m||null==w.return||w.return()}finally{if(v)throw g}}}},{key:"addText",value:function(t){var e=t.label,i=t.clientID,n=t.attributes,s=e.attributes.reduce(function(t,e){return t[e.id]=e.name,t},{});return this.adoptedText.text(function(t){t.tspan("".concat(e.name," ").concat(i)).style("text-transform","uppercase");for(var r=0,a=Object.keys(n);r1&&void 0!==arguments[1]?arguments[1]:null;this.model.activate(t,e)}},{key:"rotate",value:function(t,e){this.model.rotate(t,e)}},{key:"focus",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;this.model.focus(t,e)}},{key:"fit",value:function(){this.model.fit()}},{key:"grid",value:function(t,e){this.model.grid(t,e)}},{key:"draw",value:function(t){this.model.draw(t)}},{key:"split",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.model.split(t)}},{key:"group",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.model.group(t)}},{key:"merge",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.model.merge(t)}},{key:"cancel",value:function(){this.model.cancel()}}])&&W(e.prototype,i),n&&W(e,n),t}()}]); +//# sourceMappingURL=cvat-canvas.node.js.map \ No newline at end of file diff --git a/cvat-canvas/public/cvat-canvas.node.js.map b/cvat-canvas/public/cvat-canvas.node.js.map new file mode 100644 index 00000000..7c59d734 --- /dev/null +++ b/cvat-canvas/public/cvat-canvas.node.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack://canvas/webpack/bootstrap","webpack://canvas/./node_modules/svg.js/dist/svg.js","webpack://canvas/./node_modules/svg.draggable.js/dist/svg.draggable.js","webpack://canvas/./node_modules/svg.resize.js/dist/svg.resize.js","webpack://canvas/./node_modules/svg.select.js/dist/svg.select.js","webpack://canvas/./node_modules/svg.draw.js/dist/svg.draw.js","webpack://canvas/./src/master.ts","webpack://canvas/./src/canvasModel.ts","webpack://canvas/./src/canvasController.ts","webpack://canvas/./src/consts.ts","webpack://canvas/./src/svg.patch.ts","webpack://canvas/./src/shared.ts","webpack://canvas/./src/drawHandler.ts","webpack://canvas/./src/canvasView.ts","webpack://canvas/./src/canvas.ts"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","__WEBPACK_AMD_DEFINE_RESULT__","root","window","this","undefined","document","SVG","element","supported","Doc","parser","draw","prepare","xmlns","xlink","svgjs","createElementNS","createSVGRect","did","eid","capitalize","setAttribute","extend","methods","slice","arguments","pop","length","Set","inherit","invent","config","initializer","constructor","construct","parent","Container","adopt","node","instance","nodeName","parentNode","SVGElement","Nested","Gradient","Element","type","namespace","defs","setData","JSON","parse","getAttribute","body","getElementsByTagName","documentElement","nested","size","style","attr","poly","polyline","path","native","addEventListener","regex","numberAndUnit","hex","rgb","reference","transforms","whitespace","isHex","isRgb","isCss","isBlank","isNumber","isPercent","isImage","delimiter","hyphen","pathLetters","isPathLetter","numbersWithDots","dots","utils","map","array","block","il","result","push","filter","radians","Math","PI","degrees","filterSVGElements","nodes","el","defaults","attrs","fill-opacity","stroke-opacity","stroke-width","stroke-linejoin","stroke-linecap","fill","stroke","opacity","x","y","cx","cy","width","height","rx","ry","offset","stop-opacity","stop-color","font-size","font-family","text-anchor","Color","color","match","g","b","test","exec","replace","parseInt","substring","join","toString","toHex","compToHex","toRgb","brightness","morph","destination","at","pos","isColor","Array","fallback","valueOf","lastValue","lastDestination","settle","seen","indexOf","isArray","split","string","trim","parseFloat","reverse","clone","array_clone","arr","PointArray","toLine","x1","y1","x2","y2","points","len","move","box","bbox","isNaN","getBBox","pathHandlers","M","p0","L","H","V","C","S","Q","T","Z","A","mlhvqtcsa","j","jl","toUpperCase","PathArray","a","arrayToString","equalCommands","pathArray","sourceArray","destinationArray","paramCnt","pathRegReplace","reduce","prev","curr","concat","Point","index","Number","unit","isFinite","toJSON","plus","number","minus","times","divide","to","relative","_stroke","_event","_events","dom","center","proportionalSize","writeDataToDom","assignNewId","cloneNode","add","after","remove","removeElement","addTo","put","putIn","id","inside","show","hide","visible","classes","hasClass","addClass","removeClass","toggleClass","matches","doc","parents","selector","matchesSelector","msMatchesSelector","mozMatchesSelector","webkitMatchesSelector","oMatchesSelector","svg","well","createElement","Parent","appendChild","innerHTML","firstChild","childNodes","each","lines","fn","removeAttribute","keys","stringify","is","obj","easing","-","<>","cos",">","sin","<","from","MorphObj","Situation","init","reversed","reversing","duration","delay","start","Date","finish","ease","loop","loops","animations","styles","once","FX","_target","situations","active","situation","paused","lastPos","absPos","_speed","animate","queue","target","timeToAbsPos","timestamp","absPosToTime","startAnimFrame","stopAnimFrame","animationFrame","requestAnimationFrame","step","cancelAnimationFrame","startCurrent","initAnimations","shift","dequeue","stop","source","initialTransformation","matrixify","clearQueue","clearCurrent","jumpToEnd","atEnd","reset","temp","atStart","isAbsPos","durDivSpd","speed","pause","last","play","progress","easeIt","on","wrapper","e","detail","off","_callStart","during","eased","afterAll","duringAll","method","args","ignoreTime","absPosInt","lastLoop","max","floor","Boolean","min","fire","fx","eachAt","self","apply","Matrix","multiply","undo","extract","matrix","isEased","setTimeout","real","v","G","transform","num","Text","plot","leading","viewbox","ViewBox","update","Stop","Box","left","top","fullBox","merge","xMin","Infinity","xMax","yMin","yMax","pts","forEach","BBox","contains","Exception","topParent","Shape","clientLeft","clientTop","clientWidth","clientHeight","tbox","console","warn","rbox","RBox","getBoundingClientRect","addOffset","pageXOffset","pageYOffset","screenCTM","inverse","base","arrayToMatrix","abcdef","px","deltaTransformPoint","py","skewX","atan2","f","transformedX","sqrt","transformedY","skewY","scaleX","scaleY","rotation","parseMatrix","translate","scale","around","rotate","flip","skew","tan","createSVGMatrix","float32String","ctm","getCTM","rect","getScreenCTM","point","createSVGPoint","matrixTransform","attributes","nodeValue","image","Image","pattern","setAttributeNS","rebuild","ensureCentre","Rotate","Scale","Skew","Translate","untransform","str","kv","toParent","pCtm","toDoc","Transformation","inversed","params","_undo","cssText","camelCase","children","insertBefore","has","first","deep","removeChild","clear","hasChildNodes","lastChild","_defs","ungroup","depth","Defs","flatten","view","we","he","wm","hm","reg","offsetWidth","offsetHeight","zoom","event","listenerId","events","listener","binding","options","bag","_svgjsListenerId","ev","removeEventListener","data","Event","dispatchEvent","CustomEvent","cancelable","gbox","trans","group","getElementById","version","spof","nextSibling","siblings","position","next","previous","forward","backward","front","back","before","Mask","targets","unmask","mask","maskWith","masker","ClipPath","unclip","clip","clipWith","clipper","gradient","fy","Pattern","patternUnits","Bare","words","text","createTextNode","symbol","Use","file","use","Rect","Circle","circle","Ellipse","ellipse","Line","line","Polyline","Polygon","polygon","_array","morphArray","Path","load","url","img","_loaded","ratio","_error","src","loaded","error","_rebuild","_build","oy","nodeType","newLined","textContent","build","tspan","newLine","textPath","blankLineOffset","dy","plain","Tspan","dx","getComputedTextLength","TextPath","track","link","linkTo","Marker","ref","marker","sugar","prefix","toLowerCase","charAt","comp","w","h","abs","extension","dmove","radius","getTotalLength","pointAt","getPointAtLength","font","members","elements","splice","set","remember","k","memory","forget","_memory","idFromReference","select","query","querySelectorAll","CustomEventPoly","bubbles","createEvent","initCustomEvent","lastTime","vendors","callback","currTime","getTime","timeToCall","clearTimeout","factory","DragHandler","constraint","val","_this","transformPoint","touches","changedTouches","clientX","clientY","which","buttons","handler","defaultPrevented","preventDefault","stopPropagation","anchorOffset","startPoints","drag","end","gx","gy","coord","minX","maxX","minY","maxY","snapToGrid","draggable","dragHandler","ResizeHandler","parameters","lastUpdateCall","_extractPosition","resize","txPt","fontSize","pointCoords","calc","diffX","diffY","snap","checkAspectRatio","current","sAngle","pAngle","angle","snapToAngle","done","flag","pointCoordsY","constraintToBox","orgX","orgY","isReverse","saveAspectRatio","updatedSnap","aspectRatio","newW","newH","newAspectRatio","SelectHandler","pointSelection","isSelected","rectSelection","pointsList","lt","rt","rb","lb","pointCoord","setting","isPointCentered","settings","selectize","pointsLists","option","pointsExclude","deepSelect","selectPoints","selectRect","observe","cleanup","drawPoints","getPointArray","curriedEvent","returnValue","pageX","pageY","drawPoint","classPoints","pointType","drawCircle","drawRect","Error","pointSize","updatePointSelection","updateRectSelection","coords","rotationPoint","getMoseDownFunc","eventName","classRect","pointElement","MutationObserver","observerInst","disconnect","PaintHandler","plugin","getPlugin","startPoint","pointPlugin","clean","cancel","param","plugins","paintHandler","shapes","shapesArr","drawCircles","FrameZoom","Rotation","UpdateReasons","MasterImpl","_classCallCheck","listeners","reason","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_step","_iterator","iterator","notify","err","CanvasModelImpl","_MasterImpl","ObjectStateClass","canvasModel_classCallCheck","_possibleConstructorReturn","_getPrototypeOf","activeElement","clientID","attributeID","canvasSize","drawData","enabled","shapeType","numberOfPoints","initialState","imageOffset","imageSize","focusData","padding","gridSize","objects","rememberAngle","_inherits","direction","oldScale","newScale","MIN","MAX","mutiplier","ZOOM","topOffset","leftOffset","MOVE","frameData","objectStates","_this2","IMAGE","then","OBJECTS","exception","ACTIVATE","CLOCKWISE90","fit","FOCUS","FIT","stepX","stepY","GRID","assign","DRAW","log","canvas","grid","geometry","CanvasControllerImpl","model","canvasController_classCallCheck","lastDragPosition","isDragging","objectStateClass","consts","BASE_STROKE_WIDTH","BASE_POINT_SIZE","TEXT_MARGIN","AREA_THRESHOLD","SIZE_THRESHOLD","originalDraw","_len","_key","_i","_Object$keys","_array$i","_slicedToArray","_array$i2","originalDraggable","_len2","_key2","svg_patch_i2","_Object$keys2","originalResize","_len3","_key3","_i3","_Object$keys3","translateFromSVG","output","transformationMatrix","pt","translateToSVG","Mode","DrawHandlerImpl","onDrawDone","background","_this3","drawHandler_classCallCheck","crosshair","drawInstance","_translateToSVG4","drawHandler_slicedToArray","drawHandler_createClass","zOrder","MAX_SAFE_INTEGER","addCrosshair","removeCrosshair","frameWidth","frameHeight","_translateFromSVG2","xtl","ytl","xbr","ybr","_translateToSVG2","sizeDecrement","handleUndo","lastDrawnPoint","handleSlide","shiftKey","includes","pow","drawPolyshape","drawBox","drawPolygon","drawPolyline","initDrawing","startDraw","closeDrawing","darker","percentage","R","round","B","rHex","gHex","bHex","CanvasViewImpl","controller","canvasView_classCallCheck","svgShapes","svgTexts","IDLE","loadingAnimation","adoptedText","gridPath","gridPattern","content","adoptedContent","drawHandler","loadingCircle","gridDefs","gridRect","canvasFirstMounted","animationName","enableDrag","disableDrag","deltaY","canvasView_slicedToArray","oncontextmenu","subscribe","canvasView_createClass","state","_i2","_arr2","getElementsByClassName","_iteratorNormalCompletion2","_didIteratorError2","_iteratorError2","_step2","_iterator2","updateTextPosition","_i5","_arr5","_i6","_arr6","classList","backgroundImage","_arr3","_i4","_arr4","deactivate","_i7","addObjects","offsetLeft","offsetTop","dragged","activate","states","_iteratorNormalCompletion3","_didIteratorError3","_iteratorError3","_step3","_iterator3","objectType","addTag","translatedPoints","addRect","stringified","acc","idx","addPolygon","addPolyline","addPoints","visibility","addText","shape","append","DRAG","RESIZE","_translateFromSVG4","_ref","_ref2","_iteratorNormalCompletion4","_didIteratorError4","_iteratorError4","_step4","_iterator4","label","attrNames","_i8","attrID","_points","color-rendering","shape-rendering","CanvasImpl","canvas_classCallCheck","html","setup","focus"],"mappings":"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","file":"cvat-canvas.node.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 5);\n","/*!\n* svg.js - A lightweight library for manipulating and animating SVG.\n* @version 2.7.1\n* https://svgdotjs.github.io/\n*\n* @copyright Wout Fierens \n* @license MIT\n*\n* BUILT: Fri Nov 30 2018 10:01:55 GMT+0100 (GMT+01:00)\n*/;\n(function(root, factory) {\r\n /* istanbul ignore next */\r\n if (typeof define === 'function' && define.amd) {\r\n define(function(){\r\n return factory(root, root.document)\r\n })\r\n } else if (typeof exports === 'object') {\r\n module.exports = root.document ? factory(root, root.document) : function(w){ return factory(w, w.document) }\r\n } else {\r\n root.SVG = factory(root, root.document)\r\n }\r\n}(typeof window !== \"undefined\" ? window : this, function(window, document) {\r\n\r\n// Find global reference - uses 'this' by default when available,\r\n// falls back to 'window' otherwise (for bundlers like Webpack)\r\nvar globalRef = (typeof this !== \"undefined\") ? this : window;\r\n\r\n// The main wrapping element\r\nvar SVG = globalRef.SVG = function(element) {\r\n if (SVG.supported) {\r\n element = new SVG.Doc(element)\r\n\r\n if(!SVG.parser.draw)\r\n SVG.prepare()\r\n\r\n return element\r\n }\r\n}\r\n\r\n// Default namespaces\r\nSVG.ns = 'http://www.w3.org/2000/svg'\r\nSVG.xmlns = 'http://www.w3.org/2000/xmlns/'\r\nSVG.xlink = 'http://www.w3.org/1999/xlink'\r\nSVG.svgjs = 'http://svgjs.com/svgjs'\r\n\r\n// Svg support test\r\nSVG.supported = (function() {\r\n return !! document.createElementNS &&\r\n !! document.createElementNS(SVG.ns,'svg').createSVGRect\r\n})()\r\n\r\n// Don't bother to continue if SVG is not supported\r\nif (!SVG.supported) return false\r\n\r\n// Element id sequence\r\nSVG.did = 1000\r\n\r\n// Get next named element id\r\nSVG.eid = function(name) {\r\n return 'Svgjs' + capitalize(name) + (SVG.did++)\r\n}\r\n\r\n// Method for element creation\r\nSVG.create = function(name) {\r\n // create element\r\n var element = document.createElementNS(this.ns, name)\r\n\r\n // apply unique id\r\n element.setAttribute('id', this.eid(name))\r\n\r\n return element\r\n}\r\n\r\n// Method for extending objects\r\nSVG.extend = function() {\r\n var modules, methods, key, i\r\n\r\n // Get list of modules\r\n modules = [].slice.call(arguments)\r\n\r\n // Get object with extensions\r\n methods = modules.pop()\r\n\r\n for (i = modules.length - 1; i >= 0; i--)\r\n if (modules[i])\r\n for (key in methods)\r\n modules[i].prototype[key] = methods[key]\r\n\r\n // Make sure SVG.Set inherits any newly added methods\r\n if (SVG.Set && SVG.Set.inherit)\r\n SVG.Set.inherit()\r\n}\r\n\r\n// Invent new element\r\nSVG.invent = function(config) {\r\n // Create element initializer\r\n var initializer = typeof config.create == 'function' ?\r\n config.create :\r\n function() {\r\n this.constructor.call(this, SVG.create(config.create))\r\n }\r\n\r\n // Inherit prototype\r\n if (config.inherit)\r\n initializer.prototype = new config.inherit\r\n\r\n // Extend with methods\r\n if (config.extend)\r\n SVG.extend(initializer, config.extend)\r\n\r\n // Attach construct method to parent\r\n if (config.construct)\r\n SVG.extend(config.parent || SVG.Container, config.construct)\r\n\r\n return initializer\r\n}\r\n\r\n// Adopt existing svg elements\r\nSVG.adopt = function(node) {\r\n // check for presence of node\r\n if (!node) return null\r\n\r\n // make sure a node isn't already adopted\r\n if (node.instance) return node.instance\r\n\r\n // initialize variables\r\n var element\r\n\r\n // adopt with element-specific settings\r\n if (node.nodeName == 'svg')\r\n element = node.parentNode instanceof window.SVGElement ? new SVG.Nested : new SVG.Doc\r\n else if (node.nodeName == 'linearGradient')\r\n element = new SVG.Gradient('linear')\r\n else if (node.nodeName == 'radialGradient')\r\n element = new SVG.Gradient('radial')\r\n else if (SVG[capitalize(node.nodeName)])\r\n element = new SVG[capitalize(node.nodeName)]\r\n else\r\n element = new SVG.Element(node)\r\n\r\n // ensure references\r\n element.type = node.nodeName\r\n element.node = node\r\n node.instance = element\r\n\r\n // SVG.Class specific preparations\r\n if (element instanceof SVG.Doc)\r\n element.namespace().defs()\r\n\r\n // pull svgjs data from the dom (getAttributeNS doesn't work in html5)\r\n element.setData(JSON.parse(node.getAttribute('svgjs:data')) || {})\r\n\r\n return element\r\n}\r\n\r\n// Initialize parsing element\r\nSVG.prepare = function() {\r\n // Select document body and create invisible svg element\r\n var body = document.getElementsByTagName('body')[0]\r\n , draw = (body ? new SVG.Doc(body) : SVG.adopt(document.documentElement).nested()).size(2, 0)\r\n\r\n // Create parser object\r\n SVG.parser = {\r\n body: body || document.documentElement\r\n , draw: draw.style('opacity:0;position:absolute;left:-100%;top:-100%;overflow:hidden').attr('focusable', 'false').node\r\n , poly: draw.polyline().node\r\n , path: draw.path().node\r\n , native: SVG.create('svg')\r\n }\r\n}\r\n\r\nSVG.parser = {\r\n native: SVG.create('svg')\r\n}\r\n\r\ndocument.addEventListener('DOMContentLoaded', function() {\r\n if(!SVG.parser.draw)\r\n SVG.prepare()\r\n}, false)\r\n\n// Storage for regular expressions\r\nSVG.regex = {\r\n // Parse unit value\r\n numberAndUnit: /^([+-]?(\\d+(\\.\\d*)?|\\.\\d+)(e[+-]?\\d+)?)([a-z%]*)$/i\r\n\r\n // Parse hex value\r\n, hex: /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i\r\n\r\n // Parse rgb value\r\n, rgb: /rgb\\((\\d+),(\\d+),(\\d+)\\)/\r\n\r\n // Parse reference id\r\n, reference: /#([a-z0-9\\-_]+)/i\r\n\r\n // splits a transformation chain\r\n, transforms: /\\)\\s*,?\\s*/\r\n\r\n // Whitespace\r\n, whitespace: /\\s/g\r\n\r\n // Test hex value\r\n, isHex: /^#[a-f0-9]{3,6}$/i\r\n\r\n // Test rgb value\r\n, isRgb: /^rgb\\(/\r\n\r\n // Test css declaration\r\n, isCss: /[^:]+:[^;]+;?/\r\n\r\n // Test for blank string\r\n, isBlank: /^(\\s+)?$/\r\n\r\n // Test for numeric string\r\n, isNumber: /^[+-]?(\\d+(\\.\\d*)?|\\.\\d+)(e[+-]?\\d+)?$/i\r\n\r\n // Test for percent value\r\n, isPercent: /^-?[\\d\\.]+%$/\r\n\r\n // Test for image url\r\n, isImage: /\\.(jpg|jpeg|png|gif|svg)(\\?[^=]+.*)?/i\r\n\r\n // split at whitespace and comma\r\n, delimiter: /[\\s,]+/\r\n\r\n // The following regex are used to parse the d attribute of a path\r\n\r\n // Matches all hyphens which are not after an exponent\r\n, hyphen: /([^e])\\-/gi\r\n\r\n // Replaces and tests for all path letters\r\n, pathLetters: /[MLHVCSQTAZ]/gi\r\n\r\n // yes we need this one, too\r\n, isPathLetter: /[MLHVCSQTAZ]/i\r\n\r\n // matches 0.154.23.45\r\n, numbersWithDots: /((\\d?\\.\\d+(?:e[+-]?\\d+)?)((?:\\.\\d+(?:e[+-]?\\d+)?)+))+/gi\r\n\r\n // matches .\r\n, dots: /\\./g\r\n}\r\n\nSVG.utils = {\r\n // Map function\r\n map: function(array, block) {\r\n var i\r\n , il = array.length\r\n , result = []\r\n\r\n for (i = 0; i < il; i++)\r\n result.push(block(array[i]))\r\n\r\n return result\r\n }\r\n\r\n // Filter function\r\n, filter: function(array, block) {\r\n var i\r\n , il = array.length\r\n , result = []\r\n\r\n for (i = 0; i < il; i++)\r\n if (block(array[i]))\r\n result.push(array[i])\r\n\r\n return result\r\n }\r\n\r\n // Degrees to radians\r\n, radians: function(d) {\r\n return d % 360 * Math.PI / 180\r\n }\r\n\r\n // Radians to degrees\r\n, degrees: function(r) {\r\n return r * 180 / Math.PI % 360\r\n }\r\n\r\n, filterSVGElements: function(nodes) {\r\n return this.filter( nodes, function(el) { return el instanceof window.SVGElement })\r\n }\r\n\r\n}\n\r\nSVG.defaults = {\r\n // Default attribute values\r\n attrs: {\r\n // fill and stroke\r\n 'fill-opacity': 1\r\n , 'stroke-opacity': 1\r\n , 'stroke-width': 0\r\n , 'stroke-linejoin': 'miter'\r\n , 'stroke-linecap': 'butt'\r\n , fill: '#000000'\r\n , stroke: '#000000'\r\n , opacity: 1\r\n // position\r\n , x: 0\r\n , y: 0\r\n , cx: 0\r\n , cy: 0\r\n // size\r\n , width: 0\r\n , height: 0\r\n // radius\r\n , r: 0\r\n , rx: 0\r\n , ry: 0\r\n // gradient\r\n , offset: 0\r\n , 'stop-opacity': 1\r\n , 'stop-color': '#000000'\r\n // text\r\n , 'font-size': 16\r\n , 'font-family': 'Helvetica, Arial, sans-serif'\r\n , 'text-anchor': 'start'\r\n }\r\n\r\n}\n// Module for color convertions\r\nSVG.Color = function(color) {\r\n var match\r\n\r\n // initialize defaults\r\n this.r = 0\r\n this.g = 0\r\n this.b = 0\r\n\r\n if(!color) return\r\n\r\n // parse color\r\n if (typeof color === 'string') {\r\n if (SVG.regex.isRgb.test(color)) {\r\n // get rgb values\r\n match = SVG.regex.rgb.exec(color.replace(SVG.regex.whitespace,''))\r\n\r\n // parse numeric values\r\n this.r = parseInt(match[1])\r\n this.g = parseInt(match[2])\r\n this.b = parseInt(match[3])\r\n\r\n } else if (SVG.regex.isHex.test(color)) {\r\n // get hex values\r\n match = SVG.regex.hex.exec(fullHex(color))\r\n\r\n // parse numeric values\r\n this.r = parseInt(match[1], 16)\r\n this.g = parseInt(match[2], 16)\r\n this.b = parseInt(match[3], 16)\r\n\r\n }\r\n\r\n } else if (typeof color === 'object') {\r\n this.r = color.r\r\n this.g = color.g\r\n this.b = color.b\r\n\r\n }\r\n\r\n}\r\n\r\nSVG.extend(SVG.Color, {\r\n // Default to hex conversion\r\n toString: function() {\r\n return this.toHex()\r\n }\r\n // Build hex value\r\n, toHex: function() {\r\n return '#'\r\n + compToHex(this.r)\r\n + compToHex(this.g)\r\n + compToHex(this.b)\r\n }\r\n // Build rgb value\r\n, toRgb: function() {\r\n return 'rgb(' + [this.r, this.g, this.b].join() + ')'\r\n }\r\n // Calculate true brightness\r\n, brightness: function() {\r\n return (this.r / 255 * 0.30)\r\n + (this.g / 255 * 0.59)\r\n + (this.b / 255 * 0.11)\r\n }\r\n // Make color morphable\r\n, morph: function(color) {\r\n this.destination = new SVG.Color(color)\r\n\r\n return this\r\n }\r\n // Get morphed color at given position\r\n, at: function(pos) {\r\n // make sure a destination is defined\r\n if (!this.destination) return this\r\n\r\n // normalise pos\r\n pos = pos < 0 ? 0 : pos > 1 ? 1 : pos\r\n\r\n // generate morphed color\r\n return new SVG.Color({\r\n r: ~~(this.r + (this.destination.r - this.r) * pos)\r\n , g: ~~(this.g + (this.destination.g - this.g) * pos)\r\n , b: ~~(this.b + (this.destination.b - this.b) * pos)\r\n })\r\n }\r\n\r\n})\r\n\r\n// Testers\r\n\r\n// Test if given value is a color string\r\nSVG.Color.test = function(color) {\r\n color += ''\r\n return SVG.regex.isHex.test(color)\r\n || SVG.regex.isRgb.test(color)\r\n}\r\n\r\n// Test if given value is a rgb object\r\nSVG.Color.isRgb = function(color) {\r\n return color && typeof color.r == 'number'\r\n && typeof color.g == 'number'\r\n && typeof color.b == 'number'\r\n}\r\n\r\n// Test if given value is a color\r\nSVG.Color.isColor = function(color) {\r\n return SVG.Color.isRgb(color) || SVG.Color.test(color)\r\n}\n// Module for array conversion\r\nSVG.Array = function(array, fallback) {\r\n array = (array || []).valueOf()\r\n\r\n // if array is empty and fallback is provided, use fallback\r\n if (array.length == 0 && fallback)\r\n array = fallback.valueOf()\r\n\r\n // parse array\r\n this.value = this.parse(array)\r\n}\r\n\r\nSVG.extend(SVG.Array, {\r\n // Make array morphable\r\n morph: function(array) {\r\n this.destination = this.parse(array)\r\n\r\n // normalize length of arrays\r\n if (this.value.length != this.destination.length) {\r\n var lastValue = this.value[this.value.length - 1]\r\n , lastDestination = this.destination[this.destination.length - 1]\r\n\r\n while(this.value.length > this.destination.length)\r\n this.destination.push(lastDestination)\r\n while(this.value.length < this.destination.length)\r\n this.value.push(lastValue)\r\n }\r\n\r\n return this\r\n }\r\n // Clean up any duplicate points\r\n, settle: function() {\r\n // find all unique values\r\n for (var i = 0, il = this.value.length, seen = []; i < il; i++)\r\n if (seen.indexOf(this.value[i]) == -1)\r\n seen.push(this.value[i])\r\n\r\n // set new value\r\n return this.value = seen\r\n }\r\n // Get morphed array at given position\r\n, at: function(pos) {\r\n // make sure a destination is defined\r\n if (!this.destination) return this\r\n\r\n // generate morphed array\r\n for (var i = 0, il = this.value.length, array = []; i < il; i++)\r\n array.push(this.value[i] + (this.destination[i] - this.value[i]) * pos)\r\n\r\n return new SVG.Array(array)\r\n }\r\n // Convert array to string\r\n, toString: function() {\r\n return this.value.join(' ')\r\n }\r\n // Real value\r\n, valueOf: function() {\r\n return this.value\r\n }\r\n // Parse whitespace separated string\r\n, parse: function(array) {\r\n array = array.valueOf()\r\n\r\n // if already is an array, no need to parse it\r\n if (Array.isArray(array)) return array\r\n\r\n return this.split(array)\r\n }\r\n // Strip unnecessary whitespace\r\n, split: function(string) {\r\n return string.trim().split(SVG.regex.delimiter).map(parseFloat)\r\n }\r\n // Reverse array\r\n, reverse: function() {\r\n this.value.reverse()\r\n\r\n return this\r\n }\r\n, clone: function() {\r\n var clone = new this.constructor()\r\n clone.value = array_clone(this.value)\r\n return clone\r\n }\r\n})\n// Poly points array\r\nSVG.PointArray = function(array, fallback) {\r\n SVG.Array.call(this, array, fallback || [[0,0]])\r\n}\r\n\r\n// Inherit from SVG.Array\r\nSVG.PointArray.prototype = new SVG.Array\r\nSVG.PointArray.prototype.constructor = SVG.PointArray\r\n\r\nSVG.extend(SVG.PointArray, {\r\n // Convert array to string\r\n toString: function() {\r\n // convert to a poly point string\r\n for (var i = 0, il = this.value.length, array = []; i < il; i++)\r\n array.push(this.value[i].join(','))\r\n\r\n return array.join(' ')\r\n }\r\n // Convert array to line object\r\n, toLine: function() {\r\n return {\r\n x1: this.value[0][0]\r\n , y1: this.value[0][1]\r\n , x2: this.value[1][0]\r\n , y2: this.value[1][1]\r\n }\r\n }\r\n // Get morphed array at given position\r\n, at: function(pos) {\r\n // make sure a destination is defined\r\n if (!this.destination) return this\r\n\r\n // generate morphed point string\r\n for (var i = 0, il = this.value.length, array = []; i < il; i++)\r\n array.push([\r\n this.value[i][0] + (this.destination[i][0] - this.value[i][0]) * pos\r\n , this.value[i][1] + (this.destination[i][1] - this.value[i][1]) * pos\r\n ])\r\n\r\n return new SVG.PointArray(array)\r\n }\r\n // Parse point string and flat array\r\n, parse: function(array) {\r\n var points = []\r\n\r\n array = array.valueOf()\r\n\r\n // if it is an array\r\n if (Array.isArray(array)) {\r\n // and it is not flat, there is no need to parse it\r\n if(Array.isArray(array[0])) {\r\n // make sure to use a clone\r\n return array.map(function (el) { return el.slice() })\r\n } else if (array[0].x != null){\r\n // allow point objects to be passed\r\n return array.map(function (el) { return [el.x, el.y] })\r\n }\r\n } else { // Else, it is considered as a string\r\n // parse points\r\n array = array.trim().split(SVG.regex.delimiter).map(parseFloat)\r\n }\r\n\r\n // validate points - https://svgwg.org/svg2-draft/shapes.html#DataTypePoints\r\n // Odd number of coordinates is an error. In such cases, drop the last odd coordinate.\r\n if (array.length % 2 !== 0) array.pop()\r\n\r\n // wrap points in two-tuples and parse points as floats\r\n for(var i = 0, len = array.length; i < len; i = i + 2)\r\n points.push([ array[i], array[i+1] ])\r\n\r\n return points\r\n }\r\n // Move point string\r\n, move: function(x, y) {\r\n var box = this.bbox()\r\n\r\n // get relative offset\r\n x -= box.x\r\n y -= box.y\r\n\r\n // move every point\r\n if (!isNaN(x) && !isNaN(y))\r\n for (var i = this.value.length - 1; i >= 0; i--)\r\n this.value[i] = [this.value[i][0] + x, this.value[i][1] + y]\r\n\r\n return this\r\n }\r\n // Resize poly string\r\n, size: function(width, height) {\r\n var i, box = this.bbox()\r\n\r\n // recalculate position of all points according to new size\r\n for (i = this.value.length - 1; i >= 0; i--) {\r\n if(box.width) this.value[i][0] = ((this.value[i][0] - box.x) * width) / box.width + box.x\r\n if(box.height) this.value[i][1] = ((this.value[i][1] - box.y) * height) / box.height + box.y\r\n }\r\n\r\n return this\r\n }\r\n // Get bounding box of points\r\n, bbox: function() {\r\n SVG.parser.poly.setAttribute('points', this.toString())\r\n\r\n return SVG.parser.poly.getBBox()\r\n }\r\n})\r\n\nvar pathHandlers = {\r\n M: function(c, p, p0) {\r\n p.x = p0.x = c[0]\r\n p.y = p0.y = c[1]\r\n\r\n return ['M', p.x, p.y]\r\n },\r\n L: function(c, p) {\r\n p.x = c[0]\r\n p.y = c[1]\r\n return ['L', c[0], c[1]]\r\n },\r\n H: function(c, p) {\r\n p.x = c[0]\r\n return ['H', c[0]]\r\n },\r\n V: function(c, p) {\r\n p.y = c[0]\r\n return ['V', c[0]]\r\n },\r\n C: function(c, p) {\r\n p.x = c[4]\r\n p.y = c[5]\r\n return ['C', c[0], c[1], c[2], c[3], c[4], c[5]]\r\n },\r\n S: function(c, p) {\r\n p.x = c[2]\r\n p.y = c[3]\r\n return ['S', c[0], c[1], c[2], c[3]]\r\n },\r\n Q: function(c, p) {\r\n p.x = c[2]\r\n p.y = c[3]\r\n return ['Q', c[0], c[1], c[2], c[3]]\r\n },\r\n T: function(c, p) {\r\n p.x = c[0]\r\n p.y = c[1]\r\n return ['T', c[0], c[1]]\r\n },\r\n Z: function(c, p, p0) {\r\n p.x = p0.x\r\n p.y = p0.y\r\n return ['Z']\r\n },\r\n A: function(c, p) {\r\n p.x = c[5]\r\n p.y = c[6]\r\n return ['A', c[0], c[1], c[2], c[3], c[4], c[5], c[6]]\r\n }\r\n}\r\n\r\nvar mlhvqtcsa = 'mlhvqtcsaz'.split('')\r\n\r\nfor(var i = 0, il = mlhvqtcsa.length; i < il; ++i){\r\n pathHandlers[mlhvqtcsa[i]] = (function(i){\r\n return function(c, p, p0) {\r\n if(i == 'H') c[0] = c[0] + p.x\r\n else if(i == 'V') c[0] = c[0] + p.y\r\n else if(i == 'A'){\r\n c[5] = c[5] + p.x,\r\n c[6] = c[6] + p.y\r\n }\r\n else\r\n for(var j = 0, jl = c.length; j < jl; ++j) {\r\n c[j] = c[j] + (j%2 ? p.y : p.x)\r\n }\r\n\r\n return pathHandlers[i](c, p, p0)\r\n }\r\n })(mlhvqtcsa[i].toUpperCase())\r\n}\r\n\r\n// Path points array\r\nSVG.PathArray = function(array, fallback) {\r\n SVG.Array.call(this, array, fallback || [['M', 0, 0]])\r\n}\r\n\r\n// Inherit from SVG.Array\r\nSVG.PathArray.prototype = new SVG.Array\r\nSVG.PathArray.prototype.constructor = SVG.PathArray\r\n\r\nSVG.extend(SVG.PathArray, {\r\n // Convert array to string\r\n toString: function() {\r\n return arrayToString(this.value)\r\n }\r\n // Move path string\r\n, move: function(x, y) {\r\n // get bounding box of current situation\r\n var box = this.bbox()\r\n\r\n // get relative offset\r\n x -= box.x\r\n y -= box.y\r\n\r\n if (!isNaN(x) && !isNaN(y)) {\r\n // move every point\r\n for (var l, i = this.value.length - 1; i >= 0; i--) {\r\n l = this.value[i][0]\r\n\r\n if (l == 'M' || l == 'L' || l == 'T') {\r\n this.value[i][1] += x\r\n this.value[i][2] += y\r\n\r\n } else if (l == 'H') {\r\n this.value[i][1] += x\r\n\r\n } else if (l == 'V') {\r\n this.value[i][1] += y\r\n\r\n } else if (l == 'C' || l == 'S' || l == 'Q') {\r\n this.value[i][1] += x\r\n this.value[i][2] += y\r\n this.value[i][3] += x\r\n this.value[i][4] += y\r\n\r\n if (l == 'C') {\r\n this.value[i][5] += x\r\n this.value[i][6] += y\r\n }\r\n\r\n } else if (l == 'A') {\r\n this.value[i][6] += x\r\n this.value[i][7] += y\r\n }\r\n\r\n }\r\n }\r\n\r\n return this\r\n }\r\n // Resize path string\r\n, size: function(width, height) {\r\n // get bounding box of current situation\r\n var i, l, box = this.bbox()\r\n\r\n // recalculate position of all points according to new size\r\n for (i = this.value.length - 1; i >= 0; i--) {\r\n l = this.value[i][0]\r\n\r\n if (l == 'M' || l == 'L' || l == 'T') {\r\n this.value[i][1] = ((this.value[i][1] - box.x) * width) / box.width + box.x\r\n this.value[i][2] = ((this.value[i][2] - box.y) * height) / box.height + box.y\r\n\r\n } else if (l == 'H') {\r\n this.value[i][1] = ((this.value[i][1] - box.x) * width) / box.width + box.x\r\n\r\n } else if (l == 'V') {\r\n this.value[i][1] = ((this.value[i][1] - box.y) * height) / box.height + box.y\r\n\r\n } else if (l == 'C' || l == 'S' || l == 'Q') {\r\n this.value[i][1] = ((this.value[i][1] - box.x) * width) / box.width + box.x\r\n this.value[i][2] = ((this.value[i][2] - box.y) * height) / box.height + box.y\r\n this.value[i][3] = ((this.value[i][3] - box.x) * width) / box.width + box.x\r\n this.value[i][4] = ((this.value[i][4] - box.y) * height) / box.height + box.y\r\n\r\n if (l == 'C') {\r\n this.value[i][5] = ((this.value[i][5] - box.x) * width) / box.width + box.x\r\n this.value[i][6] = ((this.value[i][6] - box.y) * height) / box.height + box.y\r\n }\r\n\r\n } else if (l == 'A') {\r\n // resize radii\r\n this.value[i][1] = (this.value[i][1] * width) / box.width\r\n this.value[i][2] = (this.value[i][2] * height) / box.height\r\n\r\n // move position values\r\n this.value[i][6] = ((this.value[i][6] - box.x) * width) / box.width + box.x\r\n this.value[i][7] = ((this.value[i][7] - box.y) * height) / box.height + box.y\r\n }\r\n\r\n }\r\n\r\n return this\r\n }\r\n // Test if the passed path array use the same path data commands as this path array\r\n, equalCommands: function(pathArray) {\r\n var i, il, equalCommands\r\n\r\n pathArray = new SVG.PathArray(pathArray)\r\n\r\n equalCommands = this.value.length === pathArray.value.length\r\n for(i = 0, il = this.value.length; equalCommands && i < il; i++) {\r\n equalCommands = this.value[i][0] === pathArray.value[i][0]\r\n }\r\n\r\n return equalCommands\r\n }\r\n // Make path array morphable\r\n, morph: function(pathArray) {\r\n pathArray = new SVG.PathArray(pathArray)\r\n\r\n if(this.equalCommands(pathArray)) {\r\n this.destination = pathArray\r\n } else {\r\n this.destination = null\r\n }\r\n\r\n return this\r\n }\r\n // Get morphed path array at given position\r\n, at: function(pos) {\r\n // make sure a destination is defined\r\n if (!this.destination) return this\r\n\r\n var sourceArray = this.value\r\n , destinationArray = this.destination.value\r\n , array = [], pathArray = new SVG.PathArray()\r\n , i, il, j, jl\r\n\r\n // Animate has specified in the SVG spec\r\n // See: https://www.w3.org/TR/SVG11/paths.html#PathElement\r\n for (i = 0, il = sourceArray.length; i < il; i++) {\r\n array[i] = [sourceArray[i][0]]\r\n for(j = 1, jl = sourceArray[i].length; j < jl; j++) {\r\n array[i][j] = sourceArray[i][j] + (destinationArray[i][j] - sourceArray[i][j]) * pos\r\n }\r\n // For the two flags of the elliptical arc command, the SVG spec say:\r\n // Flags and booleans are interpolated as fractions between zero and one, with any non-zero value considered to be a value of one/true\r\n // Elliptical arc command as an array followed by corresponding indexes:\r\n // ['A', rx, ry, x-axis-rotation, large-arc-flag, sweep-flag, x, y]\r\n // 0 1 2 3 4 5 6 7\r\n if(array[i][0] === 'A') {\r\n array[i][4] = +(array[i][4] != 0)\r\n array[i][5] = +(array[i][5] != 0)\r\n }\r\n }\r\n\r\n // Directly modify the value of a path array, this is done this way for performance\r\n pathArray.value = array\r\n return pathArray\r\n }\r\n // Absolutize and parse path to array\r\n, parse: function(array) {\r\n // if it's already a patharray, no need to parse it\r\n if (array instanceof SVG.PathArray) return array.valueOf()\r\n\r\n // prepare for parsing\r\n var i, x0, y0, s, seg, arr\r\n , x = 0\r\n , y = 0\r\n , paramCnt = { 'M':2, 'L':2, 'H':1, 'V':1, 'C':6, 'S':4, 'Q':4, 'T':2, 'A':7, 'Z':0 }\r\n\r\n if(typeof array == 'string'){\r\n\r\n array = array\r\n .replace(SVG.regex.numbersWithDots, pathRegReplace) // convert 45.123.123 to 45.123 .123\r\n .replace(SVG.regex.pathLetters, ' $& ') // put some room between letters and numbers\r\n .replace(SVG.regex.hyphen, '$1 -') // add space before hyphen\r\n .trim() // trim\r\n .split(SVG.regex.delimiter) // split into array\r\n\r\n }else{\r\n array = array.reduce(function(prev, curr){\r\n return [].concat.call(prev, curr)\r\n }, [])\r\n }\r\n\r\n // array now is an array containing all parts of a path e.g. ['M', '0', '0', 'L', '30', '30' ...]\r\n var arr = []\r\n , p = new SVG.Point()\r\n , p0 = new SVG.Point()\r\n , index = 0\r\n , len = array.length\r\n\r\n do{\r\n // Test if we have a path letter\r\n if(SVG.regex.isPathLetter.test(array[index])){\r\n s = array[index]\r\n ++index\r\n // If last letter was a move command and we got no new, it defaults to [L]ine\r\n }else if(s == 'M'){\r\n s = 'L'\r\n }else if(s == 'm'){\r\n s = 'l'\r\n }\r\n\r\n arr.push(pathHandlers[s].call(null,\r\n array.slice(index, (index = index + paramCnt[s.toUpperCase()])).map(parseFloat),\r\n p, p0\r\n )\r\n )\r\n\r\n }while(len > index)\r\n\r\n return arr\r\n\r\n }\r\n // Get bounding box of path\r\n, bbox: function() {\r\n SVG.parser.path.setAttribute('d', this.toString())\r\n\r\n return SVG.parser.path.getBBox()\r\n }\r\n\r\n})\r\n\n// Module for unit convertions\r\nSVG.Number = SVG.invent({\r\n // Initialize\r\n create: function(value, unit) {\r\n // initialize defaults\r\n this.value = 0\r\n this.unit = unit || ''\r\n\r\n // parse value\r\n if (typeof value === 'number') {\r\n // ensure a valid numeric value\r\n this.value = isNaN(value) ? 0 : !isFinite(value) ? (value < 0 ? -3.4e+38 : +3.4e+38) : value\r\n\r\n } else if (typeof value === 'string') {\r\n unit = value.match(SVG.regex.numberAndUnit)\r\n\r\n if (unit) {\r\n // make value numeric\r\n this.value = parseFloat(unit[1])\r\n\r\n // normalize\r\n if (unit[5] == '%')\r\n this.value /= 100\r\n else if (unit[5] == 's')\r\n this.value *= 1000\r\n\r\n // store unit\r\n this.unit = unit[5]\r\n }\r\n\r\n } else {\r\n if (value instanceof SVG.Number) {\r\n this.value = value.valueOf()\r\n this.unit = value.unit\r\n }\r\n }\r\n\r\n }\r\n // Add methods\r\n, extend: {\r\n // Stringalize\r\n toString: function() {\r\n return (\r\n this.unit == '%' ?\r\n ~~(this.value * 1e8) / 1e6:\r\n this.unit == 's' ?\r\n this.value / 1e3 :\r\n this.value\r\n ) + this.unit\r\n }\r\n , toJSON: function() {\r\n return this.toString()\r\n }\r\n , // Convert to primitive\r\n valueOf: function() {\r\n return this.value\r\n }\r\n // Add number\r\n , plus: function(number) {\r\n number = new SVG.Number(number)\r\n return new SVG.Number(this + number, this.unit || number.unit)\r\n }\r\n // Subtract number\r\n , minus: function(number) {\r\n number = new SVG.Number(number)\r\n return new SVG.Number(this - number, this.unit || number.unit)\r\n }\r\n // Multiply number\r\n , times: function(number) {\r\n number = new SVG.Number(number)\r\n return new SVG.Number(this * number, this.unit || number.unit)\r\n }\r\n // Divide number\r\n , divide: function(number) {\r\n number = new SVG.Number(number)\r\n return new SVG.Number(this / number, this.unit || number.unit)\r\n }\r\n // Convert to different unit\r\n , to: function(unit) {\r\n var number = new SVG.Number(this)\r\n\r\n if (typeof unit === 'string')\r\n number.unit = unit\r\n\r\n return number\r\n }\r\n // Make number morphable\r\n , morph: function(number) {\r\n this.destination = new SVG.Number(number)\r\n\r\n if(number.relative) {\r\n this.destination.value += this.value\r\n }\r\n\r\n return this\r\n }\r\n // Get morphed number at given position\r\n , at: function(pos) {\r\n // Make sure a destination is defined\r\n if (!this.destination) return this\r\n\r\n // Generate new morphed number\r\n return new SVG.Number(this.destination)\r\n .minus(this)\r\n .times(pos)\r\n .plus(this)\r\n }\r\n\r\n }\r\n})\r\n\n\r\nSVG.Element = SVG.invent({\r\n // Initialize node\r\n create: function(node) {\r\n // make stroke value accessible dynamically\r\n this._stroke = SVG.defaults.attrs.stroke\r\n this._event = null\r\n this._events = {}\r\n\r\n // initialize data object\r\n this.dom = {}\r\n\r\n // create circular reference\r\n if (this.node = node) {\r\n this.type = node.nodeName\r\n this.node.instance = this\r\n this._events = node._events || {}\r\n\r\n // store current attribute value\r\n this._stroke = node.getAttribute('stroke') || this._stroke\r\n }\r\n }\r\n\r\n // Add class methods\r\n, extend: {\r\n // Move over x-axis\r\n x: function(x) {\r\n return this.attr('x', x)\r\n }\r\n // Move over y-axis\r\n , y: function(y) {\r\n return this.attr('y', y)\r\n }\r\n // Move by center over x-axis\r\n , cx: function(x) {\r\n return x == null ? this.x() + this.width() / 2 : this.x(x - this.width() / 2)\r\n }\r\n // Move by center over y-axis\r\n , cy: function(y) {\r\n return y == null ? this.y() + this.height() / 2 : this.y(y - this.height() / 2)\r\n }\r\n // Move element to given x and y values\r\n , move: function(x, y) {\r\n return this.x(x).y(y)\r\n }\r\n // Move element by its center\r\n , center: function(x, y) {\r\n return this.cx(x).cy(y)\r\n }\r\n // Set width of element\r\n , width: function(width) {\r\n return this.attr('width', width)\r\n }\r\n // Set height of element\r\n , height: function(height) {\r\n return this.attr('height', height)\r\n }\r\n // Set element size to given width and height\r\n , size: function(width, height) {\r\n var p = proportionalSize(this, width, height)\r\n\r\n return this\r\n .width(new SVG.Number(p.width))\r\n .height(new SVG.Number(p.height))\r\n }\r\n // Clone element\r\n , clone: function(parent) {\r\n // write dom data to the dom so the clone can pickup the data\r\n this.writeDataToDom()\r\n\r\n // clone element and assign new id\r\n var clone = assignNewId(this.node.cloneNode(true))\r\n\r\n // insert the clone in the given parent or after myself\r\n if(parent) parent.add(clone)\r\n else this.after(clone)\r\n\r\n return clone\r\n }\r\n // Remove element\r\n , remove: function() {\r\n if (this.parent())\r\n this.parent().removeElement(this)\r\n\r\n return this\r\n }\r\n // Replace element\r\n , replace: function(element) {\r\n this.after(element).remove()\r\n\r\n return element\r\n }\r\n // Add element to given container and return self\r\n , addTo: function(parent) {\r\n return parent.put(this)\r\n }\r\n // Add element to given container and return container\r\n , putIn: function(parent) {\r\n return parent.add(this)\r\n }\r\n // Get / set id\r\n , id: function(id) {\r\n return this.attr('id', id)\r\n }\r\n // Checks whether the given point inside the bounding box of the element\r\n , inside: function(x, y) {\r\n var box = this.bbox()\r\n\r\n return x > box.x\r\n && y > box.y\r\n && x < box.x + box.width\r\n && y < box.y + box.height\r\n }\r\n // Show element\r\n , show: function() {\r\n return this.style('display', '')\r\n }\r\n // Hide element\r\n , hide: function() {\r\n return this.style('display', 'none')\r\n }\r\n // Is element visible?\r\n , visible: function() {\r\n return this.style('display') != 'none'\r\n }\r\n // Return id on string conversion\r\n , toString: function() {\r\n return this.attr('id')\r\n }\r\n // Return array of classes on the node\r\n , classes: function() {\r\n var attr = this.attr('class')\r\n\r\n return attr == null ? [] : attr.trim().split(SVG.regex.delimiter)\r\n }\r\n // Return true if class exists on the node, false otherwise\r\n , hasClass: function(name) {\r\n return this.classes().indexOf(name) != -1\r\n }\r\n // Add class to the node\r\n , addClass: function(name) {\r\n if (!this.hasClass(name)) {\r\n var array = this.classes()\r\n array.push(name)\r\n this.attr('class', array.join(' '))\r\n }\r\n\r\n return this\r\n }\r\n // Remove class from the node\r\n , removeClass: function(name) {\r\n if (this.hasClass(name)) {\r\n this.attr('class', this.classes().filter(function(c) {\r\n return c != name\r\n }).join(' '))\r\n }\r\n\r\n return this\r\n }\r\n // Toggle the presence of a class on the node\r\n , toggleClass: function(name) {\r\n return this.hasClass(name) ? this.removeClass(name) : this.addClass(name)\r\n }\r\n // Get referenced element form attribute value\r\n , reference: function(attr) {\r\n return SVG.get(this.attr(attr))\r\n }\r\n // Returns the parent element instance\r\n , parent: function(type) {\r\n var parent = this\r\n\r\n // check for parent\r\n if(!parent.node.parentNode) return null\r\n\r\n // get parent element\r\n parent = SVG.adopt(parent.node.parentNode)\r\n\r\n if(!type) return parent\r\n\r\n // loop trough ancestors if type is given\r\n while(parent && parent.node instanceof window.SVGElement){\r\n if(typeof type === 'string' ? parent.matches(type) : parent instanceof type) return parent\r\n if(!parent.node.parentNode || parent.node.parentNode.nodeName == '#document' || parent.node.parentNode.nodeName == '#document-fragment') return null // #759, #720\r\n parent = SVG.adopt(parent.node.parentNode)\r\n }\r\n }\r\n // Get parent document\r\n , doc: function() {\r\n return this instanceof SVG.Doc ? this : this.parent(SVG.Doc)\r\n }\r\n // return array of all ancestors of given type up to the root svg\r\n , parents: function(type) {\r\n var parents = [], parent = this\r\n\r\n do{\r\n parent = parent.parent(type)\r\n if(!parent || !parent.node) break\r\n\r\n parents.push(parent)\r\n } while(parent.parent)\r\n\r\n return parents\r\n }\r\n // matches the element vs a css selector\r\n , matches: function(selector){\r\n return matches(this.node, selector)\r\n }\r\n // Returns the svg node to call native svg methods on it\r\n , native: function() {\r\n return this.node\r\n }\r\n // Import raw svg\r\n , svg: function(svg) {\r\n // create temporary holder\r\n var well = document.createElement('svg')\r\n\r\n // act as a setter if svg is given\r\n if (svg && this instanceof SVG.Parent) {\r\n // dump raw svg\r\n well.innerHTML = '' + svg.replace(/\\n/, '').replace(/<([\\w:-]+)([^<]+?)\\/>/g, '<$1$2>') + ''\r\n\r\n // transplant nodes\r\n for (var i = 0, il = well.firstChild.childNodes.length; i < il; i++)\r\n this.node.appendChild(well.firstChild.firstChild)\r\n\r\n // otherwise act as a getter\r\n } else {\r\n // create a wrapping svg element in case of partial content\r\n well.appendChild(svg = document.createElement('svg'))\r\n\r\n // write svgjs data to the dom\r\n this.writeDataToDom()\r\n\r\n // insert a copy of this node\r\n svg.appendChild(this.node.cloneNode(true))\r\n\r\n // return target element\r\n return well.innerHTML.replace(/^/, '').replace(/<\\/svg>$/, '')\r\n }\r\n\r\n return this\r\n }\r\n // write svgjs data to the dom\r\n , writeDataToDom: function() {\r\n\r\n // dump variables recursively\r\n if(this.each || this.lines){\r\n var fn = this.each ? this : this.lines();\r\n fn.each(function(){\r\n this.writeDataToDom()\r\n })\r\n }\r\n\r\n // remove previously set data\r\n this.node.removeAttribute('svgjs:data')\r\n\r\n if(Object.keys(this.dom).length)\r\n this.node.setAttribute('svgjs:data', JSON.stringify(this.dom)) // see #428\r\n\r\n return this\r\n }\r\n // set given data to the elements data property\r\n , setData: function(o){\r\n this.dom = o\r\n return this\r\n }\r\n , is: function(obj){\r\n return is(this, obj)\r\n }\r\n }\r\n})\r\n\nSVG.easing = {\r\n '-': function(pos){return pos}\r\n, '<>':function(pos){return -Math.cos(pos * Math.PI) / 2 + 0.5}\r\n, '>': function(pos){return Math.sin(pos * Math.PI / 2)}\r\n, '<': function(pos){return -Math.cos(pos * Math.PI / 2) + 1}\r\n}\r\n\r\nSVG.morph = function(pos){\r\n return function(from, to) {\r\n return new SVG.MorphObj(from, to).at(pos)\r\n }\r\n}\r\n\r\nSVG.Situation = SVG.invent({\r\n\r\n create: function(o){\r\n this.init = false\r\n this.reversed = false\r\n this.reversing = false\r\n\r\n this.duration = new SVG.Number(o.duration).valueOf()\r\n this.delay = new SVG.Number(o.delay).valueOf()\r\n\r\n this.start = +new Date() + this.delay\r\n this.finish = this.start + this.duration\r\n this.ease = o.ease\r\n\r\n // this.loop is incremented from 0 to this.loops\r\n // it is also incremented when in an infinite loop (when this.loops is true)\r\n this.loop = 0\r\n this.loops = false\r\n\r\n this.animations = {\r\n // functionToCall: [list of morphable objects]\r\n // e.g. move: [SVG.Number, SVG.Number]\r\n }\r\n\r\n this.attrs = {\r\n // holds all attributes which are not represented from a function svg.js provides\r\n // e.g. someAttr: SVG.Number\r\n }\r\n\r\n this.styles = {\r\n // holds all styles which should be animated\r\n // e.g. fill-color: SVG.Color\r\n }\r\n\r\n this.transforms = [\r\n // holds all transformations as transformation objects\r\n // e.g. [SVG.Rotate, SVG.Translate, SVG.Matrix]\r\n ]\r\n\r\n this.once = {\r\n // functions to fire at a specific position\r\n // e.g. \"0.5\": function foo(){}\r\n }\r\n\r\n }\r\n\r\n})\r\n\r\n\r\nSVG.FX = SVG.invent({\r\n\r\n create: function(element) {\r\n this._target = element\r\n this.situations = []\r\n this.active = false\r\n this.situation = null\r\n this.paused = false\r\n this.lastPos = 0\r\n this.pos = 0\r\n // The absolute position of an animation is its position in the context of its complete duration (including delay and loops)\r\n // When performing a delay, absPos is below 0 and when performing a loop, its value is above 1\r\n this.absPos = 0\r\n this._speed = 1\r\n }\r\n\r\n, extend: {\r\n\r\n /**\r\n * sets or returns the target of this animation\r\n * @param o object || number In case of Object it holds all parameters. In case of number its the duration of the animation\r\n * @param ease function || string Function which should be used for easing or easing keyword\r\n * @param delay Number indicating the delay before the animation starts\r\n * @return target || this\r\n */\r\n animate: function(o, ease, delay){\r\n\r\n if(typeof o == 'object'){\r\n ease = o.ease\r\n delay = o.delay\r\n o = o.duration\r\n }\r\n\r\n var situation = new SVG.Situation({\r\n duration: o || 1000,\r\n delay: delay || 0,\r\n ease: SVG.easing[ease || '-'] || ease\r\n })\r\n\r\n this.queue(situation)\r\n\r\n return this\r\n }\r\n\r\n /**\r\n * sets a delay before the next element of the queue is called\r\n * @param delay Duration of delay in milliseconds\r\n * @return this.target()\r\n */\r\n , delay: function(delay){\r\n // The delay is performed by an empty situation with its duration\r\n // attribute set to the duration of the delay\r\n var situation = new SVG.Situation({\r\n duration: delay,\r\n delay: 0,\r\n ease: SVG.easing['-']\r\n })\r\n\r\n return this.queue(situation)\r\n }\r\n\r\n /**\r\n * sets or returns the target of this animation\r\n * @param null || target SVG.Element which should be set as new target\r\n * @return target || this\r\n */\r\n , target: function(target){\r\n if(target && target instanceof SVG.Element){\r\n this._target = target\r\n return this\r\n }\r\n\r\n return this._target\r\n }\r\n\r\n // returns the absolute position at a given time\r\n , timeToAbsPos: function(timestamp){\r\n return (timestamp - this.situation.start) / (this.situation.duration/this._speed)\r\n }\r\n\r\n // returns the timestamp from a given absolute positon\r\n , absPosToTime: function(absPos){\r\n return this.situation.duration/this._speed * absPos + this.situation.start\r\n }\r\n\r\n // starts the animationloop\r\n , startAnimFrame: function(){\r\n this.stopAnimFrame()\r\n this.animationFrame = window.requestAnimationFrame(function(){ this.step() }.bind(this))\r\n }\r\n\r\n // cancels the animationframe\r\n , stopAnimFrame: function(){\r\n window.cancelAnimationFrame(this.animationFrame)\r\n }\r\n\r\n // kicks off the animation - only does something when the queue is currently not active and at least one situation is set\r\n , start: function(){\r\n // dont start if already started\r\n if(!this.active && this.situation){\r\n this.active = true\r\n this.startCurrent()\r\n }\r\n\r\n return this\r\n }\r\n\r\n // start the current situation\r\n , startCurrent: function(){\r\n this.situation.start = +new Date + this.situation.delay/this._speed\r\n this.situation.finish = this.situation.start + this.situation.duration/this._speed\r\n return this.initAnimations().step()\r\n }\r\n\r\n /**\r\n * adds a function / Situation to the animation queue\r\n * @param fn function / situation to add\r\n * @return this\r\n */\r\n , queue: function(fn){\r\n if(typeof fn == 'function' || fn instanceof SVG.Situation)\r\n this.situations.push(fn)\r\n\r\n if(!this.situation) this.situation = this.situations.shift()\r\n\r\n return this\r\n }\r\n\r\n /**\r\n * pulls next element from the queue and execute it\r\n * @return this\r\n */\r\n , dequeue: function(){\r\n // stop current animation\r\n this.stop()\r\n\r\n // get next animation from queue\r\n this.situation = this.situations.shift()\r\n\r\n if(this.situation){\r\n if(this.situation instanceof SVG.Situation) {\r\n this.start()\r\n } else {\r\n // If it is not a SVG.Situation, then it is a function, we execute it\r\n this.situation.call(this)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n // updates all animations to the current state of the element\r\n // this is important when one property could be changed from another property\r\n , initAnimations: function() {\r\n var i, j, source\r\n var s = this.situation\r\n\r\n if(s.init) return this\r\n\r\n for(i in s.animations){\r\n source = this.target()[i]()\r\n\r\n if(!Array.isArray(source)) {\r\n source = [source]\r\n }\r\n\r\n if(!Array.isArray(s.animations[i])) {\r\n s.animations[i] = [s.animations[i]]\r\n }\r\n\r\n //if(s.animations[i].length > source.length) {\r\n // source.concat = source.concat(s.animations[i].slice(source.length, s.animations[i].length))\r\n //}\r\n\r\n for(j = source.length; j--;) {\r\n // The condition is because some methods return a normal number instead\r\n // of a SVG.Number\r\n if(s.animations[i][j] instanceof SVG.Number)\r\n source[j] = new SVG.Number(source[j])\r\n\r\n s.animations[i][j] = source[j].morph(s.animations[i][j])\r\n }\r\n }\r\n\r\n for(i in s.attrs){\r\n s.attrs[i] = new SVG.MorphObj(this.target().attr(i), s.attrs[i])\r\n }\r\n\r\n for(i in s.styles){\r\n s.styles[i] = new SVG.MorphObj(this.target().style(i), s.styles[i])\r\n }\r\n\r\n s.initialTransformation = this.target().matrixify()\r\n\r\n s.init = true\r\n return this\r\n }\r\n , clearQueue: function(){\r\n this.situations = []\r\n return this\r\n }\r\n , clearCurrent: function(){\r\n this.situation = null\r\n return this\r\n }\r\n /** stops the animation immediately\r\n * @param jumpToEnd A Boolean indicating whether to complete the current animation immediately.\r\n * @param clearQueue A Boolean indicating whether to remove queued animation as well.\r\n * @return this\r\n */\r\n , stop: function(jumpToEnd, clearQueue){\r\n var active = this.active\r\n this.active = false\r\n\r\n if(clearQueue){\r\n this.clearQueue()\r\n }\r\n\r\n if(jumpToEnd && this.situation){\r\n // initialize the situation if it was not\r\n !active && this.startCurrent()\r\n this.atEnd()\r\n }\r\n\r\n this.stopAnimFrame()\r\n\r\n return this.clearCurrent()\r\n }\r\n\r\n /** resets the element to the state where the current element has started\r\n * @return this\r\n */\r\n , reset: function(){\r\n if(this.situation){\r\n var temp = this.situation\r\n this.stop()\r\n this.situation = temp\r\n this.atStart()\r\n }\r\n return this\r\n }\r\n\r\n // Stop the currently-running animation, remove all queued animations, and complete all animations for the element.\r\n , finish: function(){\r\n\r\n this.stop(true, false)\r\n\r\n while(this.dequeue().situation && this.stop(true, false));\r\n\r\n this.clearQueue().clearCurrent()\r\n\r\n return this\r\n }\r\n\r\n // set the internal animation pointer at the start position, before any loops, and updates the visualisation\r\n , atStart: function() {\r\n return this.at(0, true)\r\n }\r\n\r\n // set the internal animation pointer at the end position, after all the loops, and updates the visualisation\r\n , atEnd: function() {\r\n if (this.situation.loops === true) {\r\n // If in a infinite loop, we end the current iteration\r\n this.situation.loops = this.situation.loop + 1\r\n }\r\n\r\n if(typeof this.situation.loops == 'number') {\r\n // If performing a finite number of loops, we go after all the loops\r\n return this.at(this.situation.loops, true)\r\n } else {\r\n // If no loops, we just go at the end\r\n return this.at(1, true)\r\n }\r\n }\r\n\r\n // set the internal animation pointer to the specified position and updates the visualisation\r\n // if isAbsPos is true, pos is treated as an absolute position\r\n , at: function(pos, isAbsPos){\r\n var durDivSpd = this.situation.duration/this._speed\r\n\r\n this.absPos = pos\r\n // If pos is not an absolute position, we convert it into one\r\n if (!isAbsPos) {\r\n if (this.situation.reversed) this.absPos = 1 - this.absPos\r\n this.absPos += this.situation.loop\r\n }\r\n\r\n this.situation.start = +new Date - this.absPos * durDivSpd\r\n this.situation.finish = this.situation.start + durDivSpd\r\n\r\n return this.step(true)\r\n }\r\n\r\n /**\r\n * sets or returns the speed of the animations\r\n * @param speed null || Number The new speed of the animations\r\n * @return Number || this\r\n */\r\n , speed: function(speed){\r\n if (speed === 0) return this.pause()\r\n\r\n if (speed) {\r\n this._speed = speed\r\n // We use an absolute position here so that speed can affect the delay before the animation\r\n return this.at(this.absPos, true)\r\n } else return this._speed\r\n }\r\n\r\n // Make loopable\r\n , loop: function(times, reverse) {\r\n var c = this.last()\r\n\r\n // store total loops\r\n c.loops = (times != null) ? times : true\r\n c.loop = 0\r\n\r\n if(reverse) c.reversing = true\r\n return this\r\n }\r\n\r\n // pauses the animation\r\n , pause: function(){\r\n this.paused = true\r\n this.stopAnimFrame()\r\n\r\n return this\r\n }\r\n\r\n // unpause the animation\r\n , play: function(){\r\n if(!this.paused) return this\r\n this.paused = false\r\n // We use an absolute position here so that the delay before the animation can be paused\r\n return this.at(this.absPos, true)\r\n }\r\n\r\n /**\r\n * toggle or set the direction of the animation\r\n * true sets direction to backwards while false sets it to forwards\r\n * @param reversed Boolean indicating whether to reverse the animation or not (default: toggle the reverse status)\r\n * @return this\r\n */\r\n , reverse: function(reversed){\r\n var c = this.last()\r\n\r\n if(typeof reversed == 'undefined') c.reversed = !c.reversed\r\n else c.reversed = reversed\r\n\r\n return this\r\n }\r\n\r\n\r\n /**\r\n * returns a float from 0-1 indicating the progress of the current animation\r\n * @param eased Boolean indicating whether the returned position should be eased or not\r\n * @return number\r\n */\r\n , progress: function(easeIt){\r\n return easeIt ? this.situation.ease(this.pos) : this.pos\r\n }\r\n\r\n /**\r\n * adds a callback function which is called when the current animation is finished\r\n * @param fn Function which should be executed as callback\r\n * @return number\r\n */\r\n , after: function(fn){\r\n var c = this.last()\r\n , wrapper = function wrapper(e){\r\n if(e.detail.situation == c){\r\n fn.call(this, c)\r\n this.off('finished.fx', wrapper) // prevent memory leak\r\n }\r\n }\r\n\r\n this.target().on('finished.fx', wrapper)\r\n\r\n return this._callStart()\r\n }\r\n\r\n // adds a callback which is called whenever one animation step is performed\r\n , during: function(fn){\r\n var c = this.last()\r\n , wrapper = function(e){\r\n if(e.detail.situation == c){\r\n fn.call(this, e.detail.pos, SVG.morph(e.detail.pos), e.detail.eased, c)\r\n }\r\n }\r\n\r\n // see above\r\n this.target().off('during.fx', wrapper).on('during.fx', wrapper)\r\n\r\n this.after(function(){\r\n this.off('during.fx', wrapper)\r\n })\r\n\r\n return this._callStart()\r\n }\r\n\r\n // calls after ALL animations in the queue are finished\r\n , afterAll: function(fn){\r\n var wrapper = function wrapper(e){\r\n fn.call(this)\r\n this.off('allfinished.fx', wrapper)\r\n }\r\n\r\n // see above\r\n this.target().off('allfinished.fx', wrapper).on('allfinished.fx', wrapper)\r\n\r\n return this._callStart()\r\n }\r\n\r\n // calls on every animation step for all animations\r\n , duringAll: function(fn){\r\n var wrapper = function(e){\r\n fn.call(this, e.detail.pos, SVG.morph(e.detail.pos), e.detail.eased, e.detail.situation)\r\n }\r\n\r\n this.target().off('during.fx', wrapper).on('during.fx', wrapper)\r\n\r\n this.afterAll(function(){\r\n this.off('during.fx', wrapper)\r\n })\r\n\r\n return this._callStart()\r\n }\r\n\r\n , last: function(){\r\n return this.situations.length ? this.situations[this.situations.length-1] : this.situation\r\n }\r\n\r\n // adds one property to the animations\r\n , add: function(method, args, type){\r\n this.last()[type || 'animations'][method] = args\r\n return this._callStart()\r\n }\r\n\r\n /** perform one step of the animation\r\n * @param ignoreTime Boolean indicating whether to ignore time and use position directly or recalculate position based on time\r\n * @return this\r\n */\r\n , step: function(ignoreTime){\r\n\r\n // convert current time to an absolute position\r\n if(!ignoreTime) this.absPos = this.timeToAbsPos(+new Date)\r\n\r\n // This part convert an absolute position to a position\r\n if(this.situation.loops !== false) {\r\n var absPos, absPosInt, lastLoop\r\n\r\n // If the absolute position is below 0, we just treat it as if it was 0\r\n absPos = Math.max(this.absPos, 0)\r\n absPosInt = Math.floor(absPos)\r\n\r\n if(this.situation.loops === true || absPosInt < this.situation.loops) {\r\n this.pos = absPos - absPosInt\r\n lastLoop = this.situation.loop\r\n this.situation.loop = absPosInt\r\n } else {\r\n this.absPos = this.situation.loops\r\n this.pos = 1\r\n // The -1 here is because we don't want to toggle reversed when all the loops have been completed\r\n lastLoop = this.situation.loop - 1\r\n this.situation.loop = this.situation.loops\r\n }\r\n\r\n if(this.situation.reversing) {\r\n // Toggle reversed if an odd number of loops as occured since the last call of step\r\n this.situation.reversed = this.situation.reversed != Boolean((this.situation.loop - lastLoop) % 2)\r\n }\r\n\r\n } else {\r\n // If there are no loop, the absolute position must not be above 1\r\n this.absPos = Math.min(this.absPos, 1)\r\n this.pos = this.absPos\r\n }\r\n\r\n // while the absolute position can be below 0, the position must not be below 0\r\n if(this.pos < 0) this.pos = 0\r\n\r\n if(this.situation.reversed) this.pos = 1 - this.pos\r\n\r\n\r\n // apply easing\r\n var eased = this.situation.ease(this.pos)\r\n\r\n // call once-callbacks\r\n for(var i in this.situation.once){\r\n if(i > this.lastPos && i <= eased){\r\n this.situation.once[i].call(this.target(), this.pos, eased)\r\n delete this.situation.once[i]\r\n }\r\n }\r\n\r\n // fire during callback with position, eased position and current situation as parameter\r\n if(this.active) this.target().fire('during', {pos: this.pos, eased: eased, fx: this, situation: this.situation})\r\n\r\n // the user may call stop or finish in the during callback\r\n // so make sure that we still have a valid situation\r\n if(!this.situation){\r\n return this\r\n }\r\n\r\n // apply the actual animation to every property\r\n this.eachAt()\r\n\r\n // do final code when situation is finished\r\n if((this.pos == 1 && !this.situation.reversed) || (this.situation.reversed && this.pos == 0)){\r\n\r\n // stop animation callback\r\n this.stopAnimFrame()\r\n\r\n // fire finished callback with current situation as parameter\r\n this.target().fire('finished', {fx:this, situation: this.situation})\r\n\r\n if(!this.situations.length){\r\n this.target().fire('allfinished')\r\n\r\n // Recheck the length since the user may call animate in the afterAll callback\r\n if(!this.situations.length){\r\n this.target().off('.fx') // there shouldnt be any binding left, but to make sure...\r\n this.active = false\r\n }\r\n }\r\n\r\n // start next animation\r\n if(this.active) this.dequeue()\r\n else this.clearCurrent()\r\n\r\n }else if(!this.paused && this.active){\r\n // we continue animating when we are not at the end\r\n this.startAnimFrame()\r\n }\r\n\r\n // save last eased position for once callback triggering\r\n this.lastPos = eased\r\n return this\r\n\r\n }\r\n\r\n // calculates the step for every property and calls block with it\r\n , eachAt: function(){\r\n var i, len, at, self = this, target = this.target(), s = this.situation\r\n\r\n // apply animations which can be called trough a method\r\n for(i in s.animations){\r\n\r\n at = [].concat(s.animations[i]).map(function(el){\r\n return typeof el !== 'string' && el.at ? el.at(s.ease(self.pos), self.pos) : el\r\n })\r\n\r\n target[i].apply(target, at)\r\n\r\n }\r\n\r\n // apply animation which has to be applied with attr()\r\n for(i in s.attrs){\r\n\r\n at = [i].concat(s.attrs[i]).map(function(el){\r\n return typeof el !== 'string' && el.at ? el.at(s.ease(self.pos), self.pos) : el\r\n })\r\n\r\n target.attr.apply(target, at)\r\n\r\n }\r\n\r\n // apply animation which has to be applied with style()\r\n for(i in s.styles){\r\n\r\n at = [i].concat(s.styles[i]).map(function(el){\r\n return typeof el !== 'string' && el.at ? el.at(s.ease(self.pos), self.pos) : el\r\n })\r\n\r\n target.style.apply(target, at)\r\n\r\n }\r\n\r\n // animate initialTransformation which has to be chained\r\n if(s.transforms.length){\r\n\r\n // get initial initialTransformation\r\n at = s.initialTransformation\r\n for(i = 0, len = s.transforms.length; i < len; i++){\r\n\r\n // get next transformation in chain\r\n var a = s.transforms[i]\r\n\r\n // multiply matrix directly\r\n if(a instanceof SVG.Matrix){\r\n\r\n if(a.relative){\r\n at = at.multiply(new SVG.Matrix().morph(a).at(s.ease(this.pos)))\r\n }else{\r\n at = at.morph(a).at(s.ease(this.pos))\r\n }\r\n continue\r\n }\r\n\r\n // when transformation is absolute we have to reset the needed transformation first\r\n if(!a.relative)\r\n a.undo(at.extract())\r\n\r\n // and reapply it after\r\n at = at.multiply(a.at(s.ease(this.pos)))\r\n\r\n }\r\n\r\n // set new matrix on element\r\n target.matrix(at)\r\n }\r\n\r\n return this\r\n\r\n }\r\n\r\n\r\n // adds an once-callback which is called at a specific position and never again\r\n , once: function(pos, fn, isEased){\r\n var c = this.last()\r\n if(!isEased) pos = c.ease(pos)\r\n\r\n c.once[pos] = fn\r\n\r\n return this\r\n }\r\n\r\n , _callStart: function() {\r\n setTimeout(function(){this.start()}.bind(this), 0)\r\n return this\r\n }\r\n\r\n }\r\n\r\n, parent: SVG.Element\r\n\r\n // Add method to parent elements\r\n, construct: {\r\n // Get fx module or create a new one, then animate with given duration and ease\r\n animate: function(o, ease, delay) {\r\n return (this.fx || (this.fx = new SVG.FX(this))).animate(o, ease, delay)\r\n }\r\n , delay: function(delay){\r\n return (this.fx || (this.fx = new SVG.FX(this))).delay(delay)\r\n }\r\n , stop: function(jumpToEnd, clearQueue) {\r\n if (this.fx)\r\n this.fx.stop(jumpToEnd, clearQueue)\r\n\r\n return this\r\n }\r\n , finish: function() {\r\n if (this.fx)\r\n this.fx.finish()\r\n\r\n return this\r\n }\r\n // Pause current animation\r\n , pause: function() {\r\n if (this.fx)\r\n this.fx.pause()\r\n\r\n return this\r\n }\r\n // Play paused current animation\r\n , play: function() {\r\n if (this.fx)\r\n this.fx.play()\r\n\r\n return this\r\n }\r\n // Set/Get the speed of the animations\r\n , speed: function(speed) {\r\n if (this.fx)\r\n if (speed == null)\r\n return this.fx.speed()\r\n else\r\n this.fx.speed(speed)\r\n\r\n return this\r\n }\r\n }\r\n\r\n})\r\n\r\n// MorphObj is used whenever no morphable object is given\r\nSVG.MorphObj = SVG.invent({\r\n\r\n create: function(from, to){\r\n // prepare color for morphing\r\n if(SVG.Color.isColor(to)) return new SVG.Color(from).morph(to)\r\n // check if we have a list of values\r\n if(SVG.regex.delimiter.test(from)) {\r\n // prepare path for morphing\r\n if(SVG.regex.pathLetters.test(from)) return new SVG.PathArray(from).morph(to)\r\n // prepare value list for morphing\r\n else return new SVG.Array(from).morph(to)\r\n }\r\n // prepare number for morphing\r\n if(SVG.regex.numberAndUnit.test(to)) return new SVG.Number(from).morph(to)\r\n\r\n // prepare for plain morphing\r\n this.value = from\r\n this.destination = to\r\n }\r\n\r\n, extend: {\r\n at: function(pos, real){\r\n return real < 1 ? this.value : this.destination\r\n },\r\n\r\n valueOf: function(){\r\n return this.value\r\n }\r\n }\r\n\r\n})\r\n\r\nSVG.extend(SVG.FX, {\r\n // Add animatable attributes\r\n attr: function(a, v, relative) {\r\n // apply attributes individually\r\n if (typeof a == 'object') {\r\n for (var key in a)\r\n this.attr(key, a[key])\r\n\r\n } else {\r\n this.add(a, v, 'attrs')\r\n }\r\n\r\n return this\r\n }\r\n // Add animatable styles\r\n, style: function(s, v) {\r\n if (typeof s == 'object')\r\n for (var key in s)\r\n this.style(key, s[key])\r\n\r\n else\r\n this.add(s, v, 'styles')\r\n\r\n return this\r\n }\r\n // Animatable x-axis\r\n, x: function(x, relative) {\r\n if(this.target() instanceof SVG.G){\r\n this.transform({x:x}, relative)\r\n return this\r\n }\r\n\r\n var num = new SVG.Number(x)\r\n num.relative = relative\r\n return this.add('x', num)\r\n }\r\n // Animatable y-axis\r\n, y: function(y, relative) {\r\n if(this.target() instanceof SVG.G){\r\n this.transform({y:y}, relative)\r\n return this\r\n }\r\n\r\n var num = new SVG.Number(y)\r\n num.relative = relative\r\n return this.add('y', num)\r\n }\r\n // Animatable center x-axis\r\n, cx: function(x) {\r\n return this.add('cx', new SVG.Number(x))\r\n }\r\n // Animatable center y-axis\r\n, cy: function(y) {\r\n return this.add('cy', new SVG.Number(y))\r\n }\r\n // Add animatable move\r\n, move: function(x, y) {\r\n return this.x(x).y(y)\r\n }\r\n // Add animatable center\r\n, center: function(x, y) {\r\n return this.cx(x).cy(y)\r\n }\r\n // Add animatable size\r\n, size: function(width, height) {\r\n if (this.target() instanceof SVG.Text) {\r\n // animate font size for Text elements\r\n this.attr('font-size', width)\r\n\r\n } else {\r\n // animate bbox based size for all other elements\r\n var box\r\n\r\n if(!width || !height){\r\n box = this.target().bbox()\r\n }\r\n\r\n if(!width){\r\n width = box.width / box.height * height\r\n }\r\n\r\n if(!height){\r\n height = box.height / box.width * width\r\n }\r\n\r\n this.add('width' , new SVG.Number(width))\r\n .add('height', new SVG.Number(height))\r\n\r\n }\r\n\r\n return this\r\n }\r\n // Add animatable width\r\n, width: function(width) {\r\n return this.add('width', new SVG.Number(width))\r\n }\r\n // Add animatable height\r\n, height: function(height) {\r\n return this.add('height', new SVG.Number(height))\r\n }\r\n // Add animatable plot\r\n, plot: function(a, b, c, d) {\r\n // Lines can be plotted with 4 arguments\r\n if(arguments.length == 4) {\r\n return this.plot([a, b, c, d])\r\n }\r\n\r\n return this.add('plot', new (this.target().morphArray)(a))\r\n }\r\n // Add leading method\r\n, leading: function(value) {\r\n return this.target().leading ?\r\n this.add('leading', new SVG.Number(value)) :\r\n this\r\n }\r\n // Add animatable viewbox\r\n, viewbox: function(x, y, width, height) {\r\n if (this.target() instanceof SVG.Container) {\r\n this.add('viewbox', new SVG.ViewBox(x, y, width, height))\r\n }\r\n\r\n return this\r\n }\r\n, update: function(o) {\r\n if (this.target() instanceof SVG.Stop) {\r\n if (typeof o == 'number' || o instanceof SVG.Number) {\r\n return this.update({\r\n offset: arguments[0]\r\n , color: arguments[1]\r\n , opacity: arguments[2]\r\n })\r\n }\r\n\r\n if (o.opacity != null) this.attr('stop-opacity', o.opacity)\r\n if (o.color != null) this.attr('stop-color', o.color)\r\n if (o.offset != null) this.attr('offset', o.offset)\r\n }\r\n\r\n return this\r\n }\r\n})\r\n\nSVG.Box = SVG.invent({\r\n create: function(x, y, width, height) {\r\n if (typeof x == 'object' && !(x instanceof SVG.Element)) {\r\n // chromes getBoundingClientRect has no x and y property\r\n return SVG.Box.call(this, x.left != null ? x.left : x.x , x.top != null ? x.top : x.y, x.width, x.height)\r\n } else if (arguments.length == 4) {\r\n this.x = x\r\n this.y = y\r\n this.width = width\r\n this.height = height\r\n }\r\n\r\n // add center, right, bottom...\r\n fullBox(this)\r\n }\r\n, extend: {\r\n // Merge rect box with another, return a new instance\r\n merge: function(box) {\r\n var b = new this.constructor()\r\n\r\n // merge boxes\r\n b.x = Math.min(this.x, box.x)\r\n b.y = Math.min(this.y, box.y)\r\n b.width = Math.max(this.x + this.width, box.x + box.width) - b.x\r\n b.height = Math.max(this.y + this.height, box.y + box.height) - b.y\r\n\r\n return fullBox(b)\r\n }\r\n\r\n , transform: function(m) {\r\n var xMin = Infinity, xMax = -Infinity, yMin = Infinity, yMax = -Infinity, p, bbox\r\n\r\n var pts = [\r\n new SVG.Point(this.x, this.y),\r\n new SVG.Point(this.x2, this.y),\r\n new SVG.Point(this.x, this.y2),\r\n new SVG.Point(this.x2, this.y2)\r\n ]\r\n\r\n pts.forEach(function(p) {\r\n p = p.transform(m)\r\n xMin = Math.min(xMin,p.x)\r\n xMax = Math.max(xMax,p.x)\r\n yMin = Math.min(yMin,p.y)\r\n yMax = Math.max(yMax,p.y)\r\n })\r\n\r\n bbox = new this.constructor()\r\n bbox.x = xMin\r\n bbox.width = xMax-xMin\r\n bbox.y = yMin\r\n bbox.height = yMax-yMin\r\n\r\n fullBox(bbox)\r\n\r\n return bbox\r\n }\r\n }\r\n})\r\n\r\nSVG.BBox = SVG.invent({\r\n // Initialize\r\n create: function(element) {\r\n SVG.Box.apply(this, [].slice.call(arguments))\r\n\r\n // get values if element is given\r\n if (element instanceof SVG.Element) {\r\n var box\r\n\r\n // yes this is ugly, but Firefox can be a pain when it comes to elements that are not yet rendered\r\n try {\r\n\r\n if (!document.documentElement.contains){\r\n // This is IE - it does not support contains() for top-level SVGs\r\n var topParent = element.node\r\n while (topParent.parentNode){\r\n topParent = topParent.parentNode\r\n }\r\n if (topParent != document) throw new Exception('Element not in the dom')\r\n } else {\r\n // the element is NOT in the dom, throw error\r\n if(!document.documentElement.contains(element.node)) throw new Exception('Element not in the dom')\r\n }\r\n\r\n // find native bbox\r\n box = element.node.getBBox()\r\n } catch(e) {\r\n if(element instanceof SVG.Shape){\r\n var clone = element.clone(SVG.parser.draw.instance).show()\r\n box = clone.node.getBBox()\r\n clone.remove()\r\n }else{\r\n box = {\r\n x: element.node.clientLeft\r\n , y: element.node.clientTop\r\n , width: element.node.clientWidth\r\n , height: element.node.clientHeight\r\n }\r\n }\r\n }\r\n\r\n SVG.Box.call(this, box)\r\n }\r\n\r\n }\r\n\r\n // Define ancestor\r\n, inherit: SVG.Box\r\n\r\n // Define Parent\r\n, parent: SVG.Element\r\n\r\n // Constructor\r\n, construct: {\r\n // Get bounding box\r\n bbox: function() {\r\n return new SVG.BBox(this)\r\n }\r\n }\r\n\r\n})\r\n\r\nSVG.BBox.prototype.constructor = SVG.BBox\r\n\r\n\r\nSVG.extend(SVG.Element, {\r\n tbox: function(){\r\n console.warn('Use of TBox is deprecated and mapped to RBox. Use .rbox() instead.')\r\n return this.rbox(this.doc())\r\n }\r\n})\r\n\r\nSVG.RBox = SVG.invent({\r\n // Initialize\r\n create: function(element) {\r\n SVG.Box.apply(this, [].slice.call(arguments))\r\n\r\n if (element instanceof SVG.Element) {\r\n SVG.Box.call(this, element.node.getBoundingClientRect())\r\n }\r\n }\r\n\r\n, inherit: SVG.Box\r\n\r\n // define Parent\r\n, parent: SVG.Element\r\n\r\n, extend: {\r\n addOffset: function() {\r\n // offset by window scroll position, because getBoundingClientRect changes when window is scrolled\r\n this.x += window.pageXOffset\r\n this.y += window.pageYOffset\r\n return this\r\n }\r\n }\r\n\r\n // Constructor\r\n, construct: {\r\n // Get rect box\r\n rbox: function(el) {\r\n if (el) return new SVG.RBox(this).transform(el.screenCTM().inverse())\r\n return new SVG.RBox(this).addOffset()\r\n }\r\n }\r\n\r\n})\r\n\r\nSVG.RBox.prototype.constructor = SVG.RBox\r\n\nSVG.Matrix = SVG.invent({\r\n // Initialize\r\n create: function(source) {\r\n var i, base = arrayToMatrix([1, 0, 0, 1, 0, 0])\r\n\r\n // ensure source as object\r\n source = source instanceof SVG.Element ?\r\n source.matrixify() :\r\n typeof source === 'string' ?\r\n arrayToMatrix(source.split(SVG.regex.delimiter).map(parseFloat)) :\r\n arguments.length == 6 ?\r\n arrayToMatrix([].slice.call(arguments)) :\r\n Array.isArray(source) ?\r\n arrayToMatrix(source) :\r\n typeof source === 'object' ?\r\n source : base\r\n\r\n // merge source\r\n for (i = abcdef.length - 1; i >= 0; --i)\r\n this[abcdef[i]] = source[abcdef[i]] != null ?\r\n source[abcdef[i]] : base[abcdef[i]]\r\n }\r\n\r\n // Add methods\r\n, extend: {\r\n // Extract individual transformations\r\n extract: function() {\r\n // find delta transform points\r\n var px = deltaTransformPoint(this, 0, 1)\r\n , py = deltaTransformPoint(this, 1, 0)\r\n , skewX = 180 / Math.PI * Math.atan2(px.y, px.x) - 90\r\n\r\n return {\r\n // translation\r\n x: this.e\r\n , y: this.f\r\n , transformedX:(this.e * Math.cos(skewX * Math.PI / 180) + this.f * Math.sin(skewX * Math.PI / 180)) / Math.sqrt(this.a * this.a + this.b * this.b)\r\n , transformedY:(this.f * Math.cos(skewX * Math.PI / 180) + this.e * Math.sin(-skewX * Math.PI / 180)) / Math.sqrt(this.c * this.c + this.d * this.d)\r\n // skew\r\n , skewX: -skewX\r\n , skewY: 180 / Math.PI * Math.atan2(py.y, py.x)\r\n // scale\r\n , scaleX: Math.sqrt(this.a * this.a + this.b * this.b)\r\n , scaleY: Math.sqrt(this.c * this.c + this.d * this.d)\r\n // rotation\r\n , rotation: skewX\r\n , a: this.a\r\n , b: this.b\r\n , c: this.c\r\n , d: this.d\r\n , e: this.e\r\n , f: this.f\r\n , matrix: new SVG.Matrix(this)\r\n }\r\n }\r\n // Clone matrix\r\n , clone: function() {\r\n return new SVG.Matrix(this)\r\n }\r\n // Morph one matrix into another\r\n , morph: function(matrix) {\r\n // store new destination\r\n this.destination = new SVG.Matrix(matrix)\r\n\r\n return this\r\n }\r\n // Get morphed matrix at a given position\r\n , at: function(pos) {\r\n // make sure a destination is defined\r\n if (!this.destination) return this\r\n\r\n // calculate morphed matrix at a given position\r\n var matrix = new SVG.Matrix({\r\n a: this.a + (this.destination.a - this.a) * pos\r\n , b: this.b + (this.destination.b - this.b) * pos\r\n , c: this.c + (this.destination.c - this.c) * pos\r\n , d: this.d + (this.destination.d - this.d) * pos\r\n , e: this.e + (this.destination.e - this.e) * pos\r\n , f: this.f + (this.destination.f - this.f) * pos\r\n })\r\n\r\n return matrix\r\n }\r\n // Multiplies by given matrix\r\n , multiply: function(matrix) {\r\n return new SVG.Matrix(this.native().multiply(parseMatrix(matrix).native()))\r\n }\r\n // Inverses matrix\r\n , inverse: function() {\r\n return new SVG.Matrix(this.native().inverse())\r\n }\r\n // Translate matrix\r\n , translate: function(x, y) {\r\n return new SVG.Matrix(this.native().translate(x || 0, y || 0))\r\n }\r\n // Scale matrix\r\n , scale: function(x, y, cx, cy) {\r\n // support uniformal scale\r\n if (arguments.length == 1) {\r\n y = x\r\n } else if (arguments.length == 3) {\r\n cy = cx\r\n cx = y\r\n y = x\r\n }\r\n\r\n return this.around(cx, cy, new SVG.Matrix(x, 0, 0, y, 0, 0))\r\n }\r\n // Rotate matrix\r\n , rotate: function(r, cx, cy) {\r\n // convert degrees to radians\r\n r = SVG.utils.radians(r)\r\n\r\n return this.around(cx, cy, new SVG.Matrix(Math.cos(r), Math.sin(r), -Math.sin(r), Math.cos(r), 0, 0))\r\n }\r\n // Flip matrix on x or y, at a given offset\r\n , flip: function(a, o) {\r\n return a == 'x' ?\r\n this.scale(-1, 1, o, 0) :\r\n a == 'y' ?\r\n this.scale(1, -1, 0, o) :\r\n this.scale(-1, -1, a, o != null ? o : a)\r\n }\r\n // Skew\r\n , skew: function(x, y, cx, cy) {\r\n // support uniformal skew\r\n if (arguments.length == 1) {\r\n y = x\r\n } else if (arguments.length == 3) {\r\n cy = cx\r\n cx = y\r\n y = x\r\n }\r\n\r\n // convert degrees to radians\r\n x = SVG.utils.radians(x)\r\n y = SVG.utils.radians(y)\r\n\r\n return this.around(cx, cy, new SVG.Matrix(1, Math.tan(y), Math.tan(x), 1, 0, 0))\r\n }\r\n // SkewX\r\n , skewX: function(x, cx, cy) {\r\n return this.skew(x, 0, cx, cy)\r\n }\r\n // SkewY\r\n , skewY: function(y, cx, cy) {\r\n return this.skew(0, y, cx, cy)\r\n }\r\n // Transform around a center point\r\n , around: function(cx, cy, matrix) {\r\n return this\r\n .multiply(new SVG.Matrix(1, 0, 0, 1, cx || 0, cy || 0))\r\n .multiply(matrix)\r\n .multiply(new SVG.Matrix(1, 0, 0, 1, -cx || 0, -cy || 0))\r\n }\r\n // Convert to native SVGMatrix\r\n , native: function() {\r\n // create new matrix\r\n var matrix = SVG.parser.native.createSVGMatrix()\r\n\r\n // update with current values\r\n for (var i = abcdef.length - 1; i >= 0; i--)\r\n matrix[abcdef[i]] = this[abcdef[i]]\r\n\r\n return matrix\r\n }\r\n // Convert matrix to string\r\n , toString: function() {\r\n // Construct the matrix directly, avoid values that are too small\r\n return 'matrix(' + float32String(this.a) + ',' + float32String(this.b)\r\n + ',' + float32String(this.c) + ',' + float32String(this.d)\r\n + ',' + float32String(this.e) + ',' + float32String(this.f)\r\n + ')'\r\n }\r\n }\r\n\r\n // Define parent\r\n, parent: SVG.Element\r\n\r\n // Add parent method\r\n, construct: {\r\n // Get current matrix\r\n ctm: function() {\r\n return new SVG.Matrix(this.node.getCTM())\r\n },\r\n // Get current screen matrix\r\n screenCTM: function() {\r\n /* https://bugzilla.mozilla.org/show_bug.cgi?id=1344537\r\n This is needed because FF does not return the transformation matrix\r\n for the inner coordinate system when getScreenCTM() is called on nested svgs.\r\n However all other Browsers do that */\r\n if(this instanceof SVG.Nested) {\r\n var rect = this.rect(1,1)\r\n var m = rect.node.getScreenCTM()\r\n rect.remove()\r\n return new SVG.Matrix(m)\r\n }\r\n return new SVG.Matrix(this.node.getScreenCTM())\r\n }\r\n\r\n }\r\n\r\n})\r\n\nSVG.Point = SVG.invent({\r\n // Initialize\r\n create: function(x,y) {\r\n var i, source, base = {x:0, y:0}\r\n\r\n // ensure source as object\r\n source = Array.isArray(x) ?\r\n {x:x[0], y:x[1]} :\r\n typeof x === 'object' ?\r\n {x:x.x, y:x.y} :\r\n x != null ?\r\n {x:x, y:(y != null ? y : x)} : base // If y has no value, then x is used has its value\r\n\r\n // merge source\r\n this.x = source.x\r\n this.y = source.y\r\n }\r\n\r\n // Add methods\r\n, extend: {\r\n // Clone point\r\n clone: function() {\r\n return new SVG.Point(this)\r\n }\r\n // Morph one point into another\r\n , morph: function(x, y) {\r\n // store new destination\r\n this.destination = new SVG.Point(x, y)\r\n\r\n return this\r\n }\r\n // Get morphed point at a given position\r\n , at: function(pos) {\r\n // make sure a destination is defined\r\n if (!this.destination) return this\r\n\r\n // calculate morphed matrix at a given position\r\n var point = new SVG.Point({\r\n x: this.x + (this.destination.x - this.x) * pos\r\n , y: this.y + (this.destination.y - this.y) * pos\r\n })\r\n\r\n return point\r\n }\r\n // Convert to native SVGPoint\r\n , native: function() {\r\n // create new point\r\n var point = SVG.parser.native.createSVGPoint()\r\n\r\n // update with current values\r\n point.x = this.x\r\n point.y = this.y\r\n\r\n return point\r\n }\r\n // transform point with matrix\r\n , transform: function(matrix) {\r\n return new SVG.Point(this.native().matrixTransform(matrix.native()))\r\n }\r\n\r\n }\r\n\r\n})\r\n\r\nSVG.extend(SVG.Element, {\r\n\r\n // Get point\r\n point: function(x, y) {\r\n return new SVG.Point(x,y).transform(this.screenCTM().inverse());\r\n }\r\n\r\n})\r\n\nSVG.extend(SVG.Element, {\r\n // Set svg element attribute\r\n attr: function(a, v, n) {\r\n // act as full getter\r\n if (a == null) {\r\n // get an object of attributes\r\n a = {}\r\n v = this.node.attributes\r\n for (n = v.length - 1; n >= 0; n--)\r\n a[v[n].nodeName] = SVG.regex.isNumber.test(v[n].nodeValue) ? parseFloat(v[n].nodeValue) : v[n].nodeValue\r\n\r\n return a\r\n\r\n } else if (typeof a == 'object') {\r\n // apply every attribute individually if an object is passed\r\n for (v in a) this.attr(v, a[v])\r\n\r\n } else if (v === null) {\r\n // remove value\r\n this.node.removeAttribute(a)\r\n\r\n } else if (v == null) {\r\n // act as a getter if the first and only argument is not an object\r\n v = this.node.getAttribute(a)\r\n return v == null ?\r\n SVG.defaults.attrs[a] :\r\n SVG.regex.isNumber.test(v) ?\r\n parseFloat(v) : v\r\n\r\n } else {\r\n // BUG FIX: some browsers will render a stroke if a color is given even though stroke width is 0\r\n if (a == 'stroke-width')\r\n this.attr('stroke', parseFloat(v) > 0 ? this._stroke : null)\r\n else if (a == 'stroke')\r\n this._stroke = v\r\n\r\n // convert image fill and stroke to patterns\r\n if (a == 'fill' || a == 'stroke') {\r\n if (SVG.regex.isImage.test(v))\r\n v = this.doc().defs().image(v, 0, 0)\r\n\r\n if (v instanceof SVG.Image)\r\n v = this.doc().defs().pattern(0, 0, function() {\r\n this.add(v)\r\n })\r\n }\r\n\r\n // ensure correct numeric values (also accepts NaN and Infinity)\r\n if (typeof v === 'number')\r\n v = new SVG.Number(v)\r\n\r\n // ensure full hex color\r\n else if (SVG.Color.isColor(v))\r\n v = new SVG.Color(v)\r\n\r\n // parse array values\r\n else if (Array.isArray(v))\r\n v = new SVG.Array(v)\r\n\r\n // if the passed attribute is leading...\r\n if (a == 'leading') {\r\n // ... call the leading method instead\r\n if (this.leading)\r\n this.leading(v)\r\n } else {\r\n // set given attribute on node\r\n typeof n === 'string' ?\r\n this.node.setAttributeNS(n, a, v.toString()) :\r\n this.node.setAttribute(a, v.toString())\r\n }\r\n\r\n // rebuild if required\r\n if (this.rebuild && (a == 'font-size' || a == 'x'))\r\n this.rebuild(a, v)\r\n }\r\n\r\n return this\r\n }\r\n})\nSVG.extend(SVG.Element, {\r\n // Add transformations\r\n transform: function(o, relative) {\r\n // get target in case of the fx module, otherwise reference this\r\n var target = this\r\n , matrix, bbox\r\n\r\n // act as a getter\r\n if (typeof o !== 'object') {\r\n // get current matrix\r\n matrix = new SVG.Matrix(target).extract()\r\n\r\n return typeof o === 'string' ? matrix[o] : matrix\r\n }\r\n\r\n // get current matrix\r\n matrix = new SVG.Matrix(target)\r\n\r\n // ensure relative flag\r\n relative = !!relative || !!o.relative\r\n\r\n // act on matrix\r\n if (o.a != null) {\r\n matrix = relative ?\r\n // relative\r\n matrix.multiply(new SVG.Matrix(o)) :\r\n // absolute\r\n new SVG.Matrix(o)\r\n\r\n // act on rotation\r\n } else if (o.rotation != null) {\r\n // ensure centre point\r\n ensureCentre(o, target)\r\n\r\n // apply transformation\r\n matrix = relative ?\r\n // relative\r\n matrix.rotate(o.rotation, o.cx, o.cy) :\r\n // absolute\r\n matrix.rotate(o.rotation - matrix.extract().rotation, o.cx, o.cy)\r\n\r\n // act on scale\r\n } else if (o.scale != null || o.scaleX != null || o.scaleY != null) {\r\n // ensure centre point\r\n ensureCentre(o, target)\r\n\r\n // ensure scale values on both axes\r\n o.scaleX = o.scale != null ? o.scale : o.scaleX != null ? o.scaleX : 1\r\n o.scaleY = o.scale != null ? o.scale : o.scaleY != null ? o.scaleY : 1\r\n\r\n if (!relative) {\r\n // absolute; multiply inversed values\r\n var e = matrix.extract()\r\n o.scaleX = o.scaleX * 1 / e.scaleX\r\n o.scaleY = o.scaleY * 1 / e.scaleY\r\n }\r\n\r\n matrix = matrix.scale(o.scaleX, o.scaleY, o.cx, o.cy)\r\n\r\n // act on skew\r\n } else if (o.skew != null || o.skewX != null || o.skewY != null) {\r\n // ensure centre point\r\n ensureCentre(o, target)\r\n\r\n // ensure skew values on both axes\r\n o.skewX = o.skew != null ? o.skew : o.skewX != null ? o.skewX : 0\r\n o.skewY = o.skew != null ? o.skew : o.skewY != null ? o.skewY : 0\r\n\r\n if (!relative) {\r\n // absolute; reset skew values\r\n var e = matrix.extract()\r\n matrix = matrix.multiply(new SVG.Matrix().skew(e.skewX, e.skewY, o.cx, o.cy).inverse())\r\n }\r\n\r\n matrix = matrix.skew(o.skewX, o.skewY, o.cx, o.cy)\r\n\r\n // act on flip\r\n } else if (o.flip) {\r\n if(o.flip == 'x' || o.flip == 'y') {\r\n o.offset = o.offset == null ? target.bbox()['c' + o.flip] : o.offset\r\n } else {\r\n if(o.offset == null) {\r\n bbox = target.bbox()\r\n o.flip = bbox.cx\r\n o.offset = bbox.cy\r\n } else {\r\n o.flip = o.offset\r\n }\r\n }\r\n\r\n matrix = new SVG.Matrix().flip(o.flip, o.offset)\r\n\r\n // act on translate\r\n } else if (o.x != null || o.y != null) {\r\n if (relative) {\r\n // relative\r\n matrix = matrix.translate(o.x, o.y)\r\n } else {\r\n // absolute\r\n if (o.x != null) matrix.e = o.x\r\n if (o.y != null) matrix.f = o.y\r\n }\r\n }\r\n\r\n return this.attr('transform', matrix)\r\n }\r\n})\r\n\r\nSVG.extend(SVG.FX, {\r\n transform: function(o, relative) {\r\n // get target in case of the fx module, otherwise reference this\r\n var target = this.target()\r\n , matrix, bbox\r\n\r\n // act as a getter\r\n if (typeof o !== 'object') {\r\n // get current matrix\r\n matrix = new SVG.Matrix(target).extract()\r\n\r\n return typeof o === 'string' ? matrix[o] : matrix\r\n }\r\n\r\n // ensure relative flag\r\n relative = !!relative || !!o.relative\r\n\r\n // act on matrix\r\n if (o.a != null) {\r\n matrix = new SVG.Matrix(o)\r\n\r\n // act on rotation\r\n } else if (o.rotation != null) {\r\n // ensure centre point\r\n ensureCentre(o, target)\r\n\r\n // apply transformation\r\n matrix = new SVG.Rotate(o.rotation, o.cx, o.cy)\r\n\r\n // act on scale\r\n } else if (o.scale != null || o.scaleX != null || o.scaleY != null) {\r\n // ensure centre point\r\n ensureCentre(o, target)\r\n\r\n // ensure scale values on both axes\r\n o.scaleX = o.scale != null ? o.scale : o.scaleX != null ? o.scaleX : 1\r\n o.scaleY = o.scale != null ? o.scale : o.scaleY != null ? o.scaleY : 1\r\n\r\n matrix = new SVG.Scale(o.scaleX, o.scaleY, o.cx, o.cy)\r\n\r\n // act on skew\r\n } else if (o.skewX != null || o.skewY != null) {\r\n // ensure centre point\r\n ensureCentre(o, target)\r\n\r\n // ensure skew values on both axes\r\n o.skewX = o.skewX != null ? o.skewX : 0\r\n o.skewY = o.skewY != null ? o.skewY : 0\r\n\r\n matrix = new SVG.Skew(o.skewX, o.skewY, o.cx, o.cy)\r\n\r\n // act on flip\r\n } else if (o.flip) {\r\n if(o.flip == 'x' || o.flip == 'y') {\r\n o.offset = o.offset == null ? target.bbox()['c' + o.flip] : o.offset\r\n } else {\r\n if(o.offset == null) {\r\n bbox = target.bbox()\r\n o.flip = bbox.cx\r\n o.offset = bbox.cy\r\n } else {\r\n o.flip = o.offset\r\n }\r\n }\r\n\r\n matrix = new SVG.Matrix().flip(o.flip, o.offset)\r\n\r\n // act on translate\r\n } else if (o.x != null || o.y != null) {\r\n matrix = new SVG.Translate(o.x, o.y)\r\n }\r\n\r\n if(!matrix) return this\r\n\r\n matrix.relative = relative\r\n\r\n this.last().transforms.push(matrix)\r\n\r\n return this._callStart()\r\n }\r\n})\r\n\r\nSVG.extend(SVG.Element, {\r\n // Reset all transformations\r\n untransform: function() {\r\n return this.attr('transform', null)\r\n },\r\n // merge the whole transformation chain into one matrix and returns it\r\n matrixify: function() {\r\n\r\n var matrix = (this.attr('transform') || '')\r\n // split transformations\r\n .split(SVG.regex.transforms).slice(0,-1).map(function(str){\r\n // generate key => value pairs\r\n var kv = str.trim().split('(')\r\n return [kv[0], kv[1].split(SVG.regex.delimiter).map(function(str){ return parseFloat(str) })]\r\n })\r\n // merge every transformation into one matrix\r\n .reduce(function(matrix, transform){\r\n\r\n if(transform[0] == 'matrix') return matrix.multiply(arrayToMatrix(transform[1]))\r\n return matrix[transform[0]].apply(matrix, transform[1])\r\n\r\n }, new SVG.Matrix())\r\n\r\n return matrix\r\n },\r\n // add an element to another parent without changing the visual representation on the screen\r\n toParent: function(parent) {\r\n if(this == parent) return this\r\n var ctm = this.screenCTM()\r\n var pCtm = parent.screenCTM().inverse()\r\n\r\n this.addTo(parent).untransform().transform(pCtm.multiply(ctm))\r\n\r\n return this\r\n },\r\n // same as above with parent equals root-svg\r\n toDoc: function() {\r\n return this.toParent(this.doc())\r\n }\r\n\r\n})\r\n\r\nSVG.Transformation = SVG.invent({\r\n\r\n create: function(source, inversed){\r\n\r\n if(arguments.length > 1 && typeof inversed != 'boolean'){\r\n return this.constructor.call(this, [].slice.call(arguments))\r\n }\r\n\r\n if(Array.isArray(source)){\r\n for(var i = 0, len = this.arguments.length; i < len; ++i){\r\n this[this.arguments[i]] = source[i]\r\n }\r\n } else if(typeof source == 'object'){\r\n for(var i = 0, len = this.arguments.length; i < len; ++i){\r\n this[this.arguments[i]] = source[this.arguments[i]]\r\n }\r\n }\r\n\r\n this.inversed = false\r\n\r\n if(inversed === true){\r\n this.inversed = true\r\n }\r\n\r\n }\r\n\r\n, extend: {\r\n\r\n arguments: []\r\n , method: ''\r\n\r\n , at: function(pos){\r\n\r\n var params = []\r\n\r\n for(var i = 0, len = this.arguments.length; i < len; ++i){\r\n params.push(this[this.arguments[i]])\r\n }\r\n\r\n var m = this._undo || new SVG.Matrix()\r\n\r\n m = new SVG.Matrix().morph(SVG.Matrix.prototype[this.method].apply(m, params)).at(pos)\r\n\r\n return this.inversed ? m.inverse() : m\r\n\r\n }\r\n\r\n , undo: function(o){\r\n for(var i = 0, len = this.arguments.length; i < len; ++i){\r\n o[this.arguments[i]] = typeof this[this.arguments[i]] == 'undefined' ? 0 : o[this.arguments[i]]\r\n }\r\n\r\n // The method SVG.Matrix.extract which was used before calling this\r\n // method to obtain a value for the parameter o doesn't return a cx and\r\n // a cy so we use the ones that were provided to this object at its creation\r\n o.cx = this.cx\r\n o.cy = this.cy\r\n\r\n this._undo = new SVG[capitalize(this.method)](o, true).at(1)\r\n\r\n return this\r\n }\r\n\r\n }\r\n\r\n})\r\n\r\nSVG.Translate = SVG.invent({\r\n\r\n parent: SVG.Matrix\r\n, inherit: SVG.Transformation\r\n\r\n, create: function(source, inversed){\r\n this.constructor.apply(this, [].slice.call(arguments))\r\n }\r\n\r\n, extend: {\r\n arguments: ['transformedX', 'transformedY']\r\n , method: 'translate'\r\n }\r\n\r\n})\r\n\r\nSVG.Rotate = SVG.invent({\r\n\r\n parent: SVG.Matrix\r\n, inherit: SVG.Transformation\r\n\r\n, create: function(source, inversed){\r\n this.constructor.apply(this, [].slice.call(arguments))\r\n }\r\n\r\n, extend: {\r\n arguments: ['rotation', 'cx', 'cy']\r\n , method: 'rotate'\r\n , at: function(pos){\r\n var m = new SVG.Matrix().rotate(new SVG.Number().morph(this.rotation - (this._undo ? this._undo.rotation : 0)).at(pos), this.cx, this.cy)\r\n return this.inversed ? m.inverse() : m\r\n }\r\n , undo: function(o){\r\n this._undo = o\r\n return this\r\n }\r\n }\r\n\r\n})\r\n\r\nSVG.Scale = SVG.invent({\r\n\r\n parent: SVG.Matrix\r\n, inherit: SVG.Transformation\r\n\r\n, create: function(source, inversed){\r\n this.constructor.apply(this, [].slice.call(arguments))\r\n }\r\n\r\n, extend: {\r\n arguments: ['scaleX', 'scaleY', 'cx', 'cy']\r\n , method: 'scale'\r\n }\r\n\r\n})\r\n\r\nSVG.Skew = SVG.invent({\r\n\r\n parent: SVG.Matrix\r\n, inherit: SVG.Transformation\r\n\r\n, create: function(source, inversed){\r\n this.constructor.apply(this, [].slice.call(arguments))\r\n }\r\n\r\n, extend: {\r\n arguments: ['skewX', 'skewY', 'cx', 'cy']\r\n , method: 'skew'\r\n }\r\n\r\n})\r\n\nSVG.extend(SVG.Element, {\r\n // Dynamic style generator\r\n style: function(s, v) {\r\n if (arguments.length == 0) {\r\n // get full style\r\n return this.node.style.cssText || ''\r\n\r\n } else if (arguments.length < 2) {\r\n // apply every style individually if an object is passed\r\n if (typeof s == 'object') {\r\n for (v in s) this.style(v, s[v])\r\n\r\n } else if (SVG.regex.isCss.test(s)) {\r\n // parse css string\r\n s = s.split(/\\s*;\\s*/)\r\n // filter out suffix ; and stuff like ;;\r\n .filter(function(e) { return !!e })\r\n .map(function(e){ return e.split(/\\s*:\\s*/) })\r\n\r\n // apply every definition individually\r\n while (v = s.pop()) {\r\n this.style(v[0], v[1])\r\n }\r\n } else {\r\n // act as a getter if the first and only argument is not an object\r\n return this.node.style[camelCase(s)]\r\n }\r\n\r\n } else {\r\n this.node.style[camelCase(s)] = v === null || SVG.regex.isBlank.test(v) ? '' : v\r\n }\r\n\r\n return this\r\n }\r\n})\nSVG.Parent = SVG.invent({\r\n // Initialize node\r\n create: function(element) {\r\n this.constructor.call(this, element)\r\n }\r\n\r\n // Inherit from\r\n, inherit: SVG.Element\r\n\r\n // Add class methods\r\n, extend: {\r\n // Returns all child elements\r\n children: function() {\r\n return SVG.utils.map(SVG.utils.filterSVGElements(this.node.childNodes), function(node) {\r\n return SVG.adopt(node)\r\n })\r\n }\r\n // Add given element at a position\r\n , add: function(element, i) {\r\n if (i == null)\r\n this.node.appendChild(element.node)\r\n else if (element.node != this.node.childNodes[i])\r\n this.node.insertBefore(element.node, this.node.childNodes[i])\r\n\r\n return this\r\n }\r\n // Basically does the same as `add()` but returns the added element instead\r\n , put: function(element, i) {\r\n this.add(element, i)\r\n return element\r\n }\r\n // Checks if the given element is a child\r\n , has: function(element) {\r\n return this.index(element) >= 0\r\n }\r\n // Gets index of given element\r\n , index: function(element) {\r\n return [].slice.call(this.node.childNodes).indexOf(element.node)\r\n }\r\n // Get a element at the given index\r\n , get: function(i) {\r\n return SVG.adopt(this.node.childNodes[i])\r\n }\r\n // Get first child\r\n , first: function() {\r\n return this.get(0)\r\n }\r\n // Get the last child\r\n , last: function() {\r\n return this.get(this.node.childNodes.length - 1)\r\n }\r\n // Iterates over all children and invokes a given block\r\n , each: function(block, deep) {\r\n var i, il\r\n , children = this.children()\r\n\r\n for (i = 0, il = children.length; i < il; i++) {\r\n if (children[i] instanceof SVG.Element)\r\n block.apply(children[i], [i, children])\r\n\r\n if (deep && (children[i] instanceof SVG.Container))\r\n children[i].each(block, deep)\r\n }\r\n\r\n return this\r\n }\r\n // Remove a given child\r\n , removeElement: function(element) {\r\n this.node.removeChild(element.node)\r\n\r\n return this\r\n }\r\n // Remove all elements in this container\r\n , clear: function() {\r\n // remove children\r\n while(this.node.hasChildNodes())\r\n this.node.removeChild(this.node.lastChild)\r\n\r\n // remove defs reference\r\n delete this._defs\r\n\r\n return this\r\n }\r\n , // Get defs\r\n defs: function() {\r\n return this.doc().defs()\r\n }\r\n }\r\n\r\n})\r\n\nSVG.extend(SVG.Parent, {\r\n\r\n ungroup: function(parent, depth) {\r\n if(depth === 0 || this instanceof SVG.Defs || this.node == SVG.parser.draw) return this\r\n\r\n parent = parent || (this instanceof SVG.Doc ? this : this.parent(SVG.Parent))\r\n depth = depth || Infinity\r\n\r\n this.each(function(){\r\n if(this instanceof SVG.Defs) return this\r\n if(this instanceof SVG.Parent) return this.ungroup(parent, depth-1)\r\n return this.toParent(parent)\r\n })\r\n\r\n this.node.firstChild || this.remove()\r\n\r\n return this\r\n },\r\n\r\n flatten: function(parent, depth) {\r\n return this.ungroup(parent, depth)\r\n }\r\n\r\n})\nSVG.Container = SVG.invent({\r\n // Initialize node\r\n create: function(element) {\r\n this.constructor.call(this, element)\r\n }\r\n\r\n // Inherit from\r\n, inherit: SVG.Parent\r\n\r\n})\n\r\nSVG.ViewBox = SVG.invent({\r\n\r\n create: function(source) {\r\n var i, base = [0, 0, 0, 0]\r\n\r\n var x, y, width, height, box, view, we, he\r\n , wm = 1 // width multiplier\r\n , hm = 1 // height multiplier\r\n , reg = /[+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?/gi\r\n\r\n if(source instanceof SVG.Element){\r\n\r\n we = source\r\n he = source\r\n view = (source.attr('viewBox') || '').match(reg)\r\n box = source.bbox\r\n\r\n // get dimensions of current node\r\n width = new SVG.Number(source.width())\r\n height = new SVG.Number(source.height())\r\n\r\n // find nearest non-percentual dimensions\r\n while (width.unit == '%') {\r\n wm *= width.value\r\n width = new SVG.Number(we instanceof SVG.Doc ? we.parent().offsetWidth : we.parent().width())\r\n we = we.parent()\r\n }\r\n while (height.unit == '%') {\r\n hm *= height.value\r\n height = new SVG.Number(he instanceof SVG.Doc ? he.parent().offsetHeight : he.parent().height())\r\n he = he.parent()\r\n }\r\n\r\n // ensure defaults\r\n this.x = 0\r\n this.y = 0\r\n this.width = width * wm\r\n this.height = height * hm\r\n this.zoom = 1\r\n\r\n if (view) {\r\n // get width and height from viewbox\r\n x = parseFloat(view[0])\r\n y = parseFloat(view[1])\r\n width = parseFloat(view[2])\r\n height = parseFloat(view[3])\r\n\r\n // calculate zoom accoring to viewbox\r\n this.zoom = ((this.width / this.height) > (width / height)) ?\r\n this.height / height :\r\n this.width / width\r\n\r\n // calculate real pixel dimensions on parent SVG.Doc element\r\n this.x = x\r\n this.y = y\r\n this.width = width\r\n this.height = height\r\n\r\n }\r\n\r\n }else{\r\n\r\n // ensure source as object\r\n source = typeof source === 'string' ?\r\n source.match(reg).map(function(el){ return parseFloat(el) }) :\r\n Array.isArray(source) ?\r\n source :\r\n typeof source == 'object' ?\r\n [source.x, source.y, source.width, source.height] :\r\n arguments.length == 4 ?\r\n [].slice.call(arguments) :\r\n base\r\n\r\n this.x = source[0]\r\n this.y = source[1]\r\n this.width = source[2]\r\n this.height = source[3]\r\n }\r\n\r\n\r\n }\r\n\r\n, extend: {\r\n\r\n toString: function() {\r\n return this.x + ' ' + this.y + ' ' + this.width + ' ' + this.height\r\n }\r\n , morph: function(x, y, width, height){\r\n this.destination = new SVG.ViewBox(x, y, width, height)\r\n return this\r\n }\r\n\r\n , at: function(pos) {\r\n\r\n if(!this.destination) return this\r\n\r\n return new SVG.ViewBox([\r\n this.x + (this.destination.x - this.x) * pos\r\n , this.y + (this.destination.y - this.y) * pos\r\n , this.width + (this.destination.width - this.width) * pos\r\n , this.height + (this.destination.height - this.height) * pos\r\n ])\r\n\r\n }\r\n\r\n }\r\n\r\n // Define parent\r\n, parent: SVG.Container\r\n\r\n // Add parent method\r\n, construct: {\r\n\r\n // get/set viewbox\r\n viewbox: function(x, y, width, height) {\r\n if (arguments.length == 0)\r\n // act as a getter if there are no arguments\r\n return new SVG.ViewBox(this)\r\n\r\n // otherwise act as a setter\r\n return this.attr('viewBox', new SVG.ViewBox(x, y, width, height))\r\n }\r\n\r\n }\r\n\r\n})\n// Add events to elements\r\n\r\n;[ 'click',\r\n 'dblclick',\r\n 'mousedown',\r\n 'mouseup',\r\n 'mouseover',\r\n 'mouseout',\r\n 'mousemove',\r\n 'mouseenter',\r\n 'mouseleave',\r\n 'touchstart',\r\n 'touchmove',\r\n 'touchleave',\r\n 'touchend',\r\n 'touchcancel' ].forEach(function (event) {\r\n // add event to SVG.Element\r\n SVG.Element.prototype[event] = function (f) {\r\n // bind event to element rather than element node\r\n if (f == null) {\r\n SVG.off(this, event)\r\n } else {\r\n SVG.on(this, event, f)\r\n }\r\n return this\r\n }\r\n })\r\n\r\nSVG.listenerId = 0\r\n\r\n// Add event binder in the SVG namespace\r\nSVG.on = function (node, events, listener, binding, options) {\r\n var l = listener.bind(binding || node)\r\n var n = node instanceof SVG.Element ? node.node : node\r\n\r\n // ensure instance object for nodes which are not adopted\r\n n.instance = n.instance || {_events: {}}\r\n\r\n var bag = n.instance._events\r\n\r\n // add id to listener\r\n if (!listener._svgjsListenerId) { listener._svgjsListenerId = ++SVG.listenerId }\r\n\r\n events.split(SVG.regex.delimiter).forEach(function (event) {\r\n var ev = event.split('.')[0]\r\n var ns = event.split('.')[1] || '*'\r\n\r\n // ensure valid object\r\n bag[ev] = bag[ev] || {}\r\n bag[ev][ns] = bag[ev][ns] || {}\r\n\r\n // reference listener\r\n bag[ev][ns][listener._svgjsListenerId] = l\r\n\r\n // add listener\r\n n.addEventListener(ev, l, options || false)\r\n })\r\n}\r\n\r\n// Add event unbinder in the SVG namespace\r\nSVG.off = function (node, events, listener, options) {\r\n var n = node instanceof SVG.Element ? node.node : node\r\n if (!n.instance) return\r\n\r\n // listener can be a function or a number\r\n if (typeof listener === 'function') {\r\n listener = listener._svgjsListenerId\r\n if (!listener) return\r\n }\r\n\r\n var bag = n.instance._events\r\n\r\n ;(events || '').split(SVG.regex.delimiter).forEach(function (event) {\r\n var ev = event && event.split('.')[0]\r\n var ns = event && event.split('.')[1]\r\n var namespace, l\r\n\r\n if (listener) {\r\n // remove listener reference\r\n if (bag[ev] && bag[ev][ns || '*']) {\r\n // removeListener\r\n n.removeEventListener(ev, bag[ev][ns || '*'][listener], options || false)\r\n\r\n delete bag[ev][ns || '*'][listener]\r\n }\r\n } else if (ev && ns) {\r\n // remove all listeners for a namespaced event\r\n if (bag[ev] && bag[ev][ns]) {\r\n for (l in bag[ev][ns]) { SVG.off(n, [ev, ns].join('.'), l) }\r\n\r\n delete bag[ev][ns]\r\n }\r\n } else if (ns) {\r\n // remove all listeners for a specific namespace\r\n for (event in bag) {\r\n for (namespace in bag[event]) {\r\n if (ns === namespace) { SVG.off(n, [event, ns].join('.')) }\r\n }\r\n }\r\n } else if (ev) {\r\n // remove all listeners for the event\r\n if (bag[ev]) {\r\n for (namespace in bag[ev]) { SVG.off(n, [ev, namespace].join('.')) }\r\n\r\n delete bag[ev]\r\n }\r\n } else {\r\n // remove all listeners on a given node\r\n for (event in bag) { SVG.off(n, event) }\r\n\r\n n.instance._events = {}\r\n }\r\n })\r\n}\r\n\r\nSVG.extend(SVG.Element, {\r\n // Bind given event to listener\r\n on: function (event, listener, binding, options) {\r\n SVG.on(this, event, listener, binding, options)\r\n return this\r\n },\r\n // Unbind event from listener\r\n off: function (event, listener) {\r\n SVG.off(this.node, event, listener)\r\n return this\r\n },\r\n fire: function (event, data) {\r\n // Dispatch event\r\n if (event instanceof window.Event) {\r\n this.node.dispatchEvent(event)\r\n } else {\r\n this.node.dispatchEvent(event = new SVG.CustomEvent(event, {detail: data, cancelable: true}))\r\n }\r\n this._event = event\r\n return this\r\n },\r\n event: function() {\r\n return this._event\r\n }\r\n})\r\n\n\r\nSVG.Defs = SVG.invent({\r\n // Initialize node\r\n create: 'defs'\r\n\r\n // Inherit from\r\n, inherit: SVG.Container\r\n\r\n})\nSVG.G = SVG.invent({\r\n // Initialize node\r\n create: 'g'\r\n\r\n // Inherit from\r\n, inherit: SVG.Container\r\n\r\n // Add class methods\r\n, extend: {\r\n // Move over x-axis\r\n x: function(x) {\r\n return x == null ? this.transform('x') : this.transform({ x: x - this.x() }, true)\r\n }\r\n // Move over y-axis\r\n , y: function(y) {\r\n return y == null ? this.transform('y') : this.transform({ y: y - this.y() }, true)\r\n }\r\n // Move by center over x-axis\r\n , cx: function(x) {\r\n return x == null ? this.gbox().cx : this.x(x - this.gbox().width / 2)\r\n }\r\n // Move by center over y-axis\r\n , cy: function(y) {\r\n return y == null ? this.gbox().cy : this.y(y - this.gbox().height / 2)\r\n }\r\n , gbox: function() {\r\n\r\n var bbox = this.bbox()\r\n , trans = this.transform()\r\n\r\n bbox.x += trans.x\r\n bbox.x2 += trans.x\r\n bbox.cx += trans.x\r\n\r\n bbox.y += trans.y\r\n bbox.y2 += trans.y\r\n bbox.cy += trans.y\r\n\r\n return bbox\r\n }\r\n }\r\n\r\n // Add parent method\r\n, construct: {\r\n // Create a group element\r\n group: function() {\r\n return this.put(new SVG.G)\r\n }\r\n }\r\n})\r\n\nSVG.Doc = SVG.invent({\r\n // Initialize node\r\n create: function(element) {\r\n if (element) {\r\n // ensure the presence of a dom element\r\n element = typeof element == 'string' ?\r\n document.getElementById(element) :\r\n element\r\n\r\n // If the target is an svg element, use that element as the main wrapper.\r\n // This allows svg.js to work with svg documents as well.\r\n if (element.nodeName == 'svg') {\r\n this.constructor.call(this, element)\r\n } else {\r\n this.constructor.call(this, SVG.create('svg'))\r\n element.appendChild(this.node)\r\n this.size('100%', '100%')\r\n }\r\n\r\n // set svg element attributes and ensure defs node\r\n this.namespace().defs()\r\n }\r\n }\r\n\r\n // Inherit from\r\n, inherit: SVG.Container\r\n\r\n // Add class methods\r\n, extend: {\r\n // Add namespaces\r\n namespace: function() {\r\n return this\r\n .attr({ xmlns: SVG.ns, version: '1.1' })\r\n .attr('xmlns:xlink', SVG.xlink, SVG.xmlns)\r\n .attr('xmlns:svgjs', SVG.svgjs, SVG.xmlns)\r\n }\r\n // Creates and returns defs element\r\n , defs: function() {\r\n if (!this._defs) {\r\n var defs\r\n\r\n // Find or create a defs element in this instance\r\n if (defs = this.node.getElementsByTagName('defs')[0])\r\n this._defs = SVG.adopt(defs)\r\n else\r\n this._defs = new SVG.Defs\r\n\r\n // Make sure the defs node is at the end of the stack\r\n this.node.appendChild(this._defs.node)\r\n }\r\n\r\n return this._defs\r\n }\r\n // custom parent method\r\n , parent: function() {\r\n if(!this.node.parentNode || this.node.parentNode.nodeName == '#document' || this.node.parentNode.nodeName == '#document-fragment') return null\r\n return this.node.parentNode\r\n }\r\n // Fix for possible sub-pixel offset. See:\r\n // https://bugzilla.mozilla.org/show_bug.cgi?id=608812\r\n , spof: function() {\r\n var pos = this.node.getScreenCTM()\r\n\r\n if (pos)\r\n this\r\n .style('left', (-pos.e % 1) + 'px')\r\n .style('top', (-pos.f % 1) + 'px')\r\n\r\n return this\r\n }\r\n\r\n // Removes the doc from the DOM\r\n , remove: function() {\r\n if(this.parent()) {\r\n this.parent().removeChild(this.node)\r\n }\r\n\r\n return this\r\n }\r\n , clear: function() {\r\n // remove children\r\n while(this.node.hasChildNodes())\r\n this.node.removeChild(this.node.lastChild)\r\n\r\n // remove defs reference\r\n delete this._defs\r\n\r\n // add back parser\r\n if(!SVG.parser.draw.parentNode)\r\n this.node.appendChild(SVG.parser.draw)\r\n\r\n return this\r\n }\r\n , clone: function (parent) {\r\n // write dom data to the dom so the clone can pickup the data\r\n this.writeDataToDom()\r\n\r\n // get reference to node\r\n var node = this.node\r\n\r\n // clone element and assign new id\r\n var clone = assignNewId(node.cloneNode(true))\r\n\r\n // insert the clone in the given parent or after myself\r\n if(parent) {\r\n (parent.node || parent).appendChild(clone.node)\r\n } else {\r\n node.parentNode.insertBefore(clone.node, node.nextSibling)\r\n }\r\n\r\n return clone\r\n }\r\n }\r\n\r\n})\r\n\n// ### This module adds backward / forward functionality to elements.\r\n\r\n//\r\nSVG.extend(SVG.Element, {\r\n // Get all siblings, including myself\r\n siblings: function() {\r\n return this.parent().children()\r\n }\r\n // Get the curent position siblings\r\n, position: function() {\r\n return this.parent().index(this)\r\n }\r\n // Get the next element (will return null if there is none)\r\n, next: function() {\r\n return this.siblings()[this.position() + 1]\r\n }\r\n // Get the next element (will return null if there is none)\r\n, previous: function() {\r\n return this.siblings()[this.position() - 1]\r\n }\r\n // Send given element one step forward\r\n, forward: function() {\r\n var i = this.position() + 1\r\n , p = this.parent()\r\n\r\n // move node one step forward\r\n p.removeElement(this).add(this, i)\r\n\r\n // make sure defs node is always at the top\r\n if (p instanceof SVG.Doc)\r\n p.node.appendChild(p.defs().node)\r\n\r\n return this\r\n }\r\n // Send given element one step backward\r\n, backward: function() {\r\n var i = this.position()\r\n\r\n if (i > 0)\r\n this.parent().removeElement(this).add(this, i - 1)\r\n\r\n return this\r\n }\r\n // Send given element all the way to the front\r\n, front: function() {\r\n var p = this.parent()\r\n\r\n // Move node forward\r\n p.node.appendChild(this.node)\r\n\r\n // Make sure defs node is always at the top\r\n if (p instanceof SVG.Doc)\r\n p.node.appendChild(p.defs().node)\r\n\r\n return this\r\n }\r\n // Send given element all the way to the back\r\n, back: function() {\r\n if (this.position() > 0)\r\n this.parent().removeElement(this).add(this, 0)\r\n\r\n return this\r\n }\r\n // Inserts a given element before the targeted element\r\n, before: function(element) {\r\n element.remove()\r\n\r\n var i = this.position()\r\n\r\n this.parent().add(element, i)\r\n\r\n return this\r\n }\r\n // Insters a given element after the targeted element\r\n, after: function(element) {\r\n element.remove()\r\n\r\n var i = this.position()\r\n\r\n this.parent().add(element, i + 1)\r\n\r\n return this\r\n }\r\n\r\n})\nSVG.Mask = SVG.invent({\r\n // Initialize node\r\n create: function() {\r\n this.constructor.call(this, SVG.create('mask'))\r\n\r\n // keep references to masked elements\r\n this.targets = []\r\n }\r\n\r\n // Inherit from\r\n, inherit: SVG.Container\r\n\r\n // Add class methods\r\n, extend: {\r\n // Unmask all masked elements and remove itself\r\n remove: function() {\r\n // unmask all targets\r\n for (var i = this.targets.length - 1; i >= 0; i--)\r\n if (this.targets[i])\r\n this.targets[i].unmask()\r\n this.targets = []\r\n\r\n // remove mask from parent\r\n SVG.Element.prototype.remove.call(this)\r\n\r\n return this\r\n }\r\n }\r\n\r\n // Add parent method\r\n, construct: {\r\n // Create masking element\r\n mask: function() {\r\n return this.defs().put(new SVG.Mask)\r\n }\r\n }\r\n})\r\n\r\n\r\nSVG.extend(SVG.Element, {\r\n // Distribute mask to svg element\r\n maskWith: function(element) {\r\n // use given mask or create a new one\r\n this.masker = element instanceof SVG.Mask ? element : this.parent().mask().add(element)\r\n\r\n // store reverence on self in mask\r\n this.masker.targets.push(this)\r\n\r\n // apply mask\r\n return this.attr('mask', 'url(\"#' + this.masker.attr('id') + '\")')\r\n }\r\n // Unmask element\r\n, unmask: function() {\r\n delete this.masker\r\n return this.attr('mask', null)\r\n }\r\n\r\n})\r\n\nSVG.ClipPath = SVG.invent({\r\n // Initialize node\r\n create: function() {\r\n this.constructor.call(this, SVG.create('clipPath'))\r\n\r\n // keep references to clipped elements\r\n this.targets = []\r\n }\r\n\r\n // Inherit from\r\n, inherit: SVG.Container\r\n\r\n // Add class methods\r\n, extend: {\r\n // Unclip all clipped elements and remove itself\r\n remove: function() {\r\n // unclip all targets\r\n for (var i = this.targets.length - 1; i >= 0; i--)\r\n if (this.targets[i])\r\n this.targets[i].unclip()\r\n this.targets = []\r\n\r\n // remove clipPath from parent\r\n this.parent().removeElement(this)\r\n\r\n return this\r\n }\r\n }\r\n\r\n // Add parent method\r\n, construct: {\r\n // Create clipping element\r\n clip: function() {\r\n return this.defs().put(new SVG.ClipPath)\r\n }\r\n }\r\n})\r\n\r\n//\r\nSVG.extend(SVG.Element, {\r\n // Distribute clipPath to svg element\r\n clipWith: function(element) {\r\n // use given clip or create a new one\r\n this.clipper = element instanceof SVG.ClipPath ? element : this.parent().clip().add(element)\r\n\r\n // store reverence on self in mask\r\n this.clipper.targets.push(this)\r\n\r\n // apply mask\r\n return this.attr('clip-path', 'url(\"#' + this.clipper.attr('id') + '\")')\r\n }\r\n // Unclip element\r\n, unclip: function() {\r\n delete this.clipper\r\n return this.attr('clip-path', null)\r\n }\r\n\r\n})\nSVG.Gradient = SVG.invent({\r\n // Initialize node\r\n create: function(type) {\r\n this.constructor.call(this, SVG.create(type + 'Gradient'))\r\n\r\n // store type\r\n this.type = type\r\n }\r\n\r\n // Inherit from\r\n, inherit: SVG.Container\r\n\r\n // Add class methods\r\n, extend: {\r\n // Add a color stop\r\n at: function(offset, color, opacity) {\r\n return this.put(new SVG.Stop).update(offset, color, opacity)\r\n }\r\n // Update gradient\r\n , update: function(block) {\r\n // remove all stops\r\n this.clear()\r\n\r\n // invoke passed block\r\n if (typeof block == 'function')\r\n block.call(this, this)\r\n\r\n return this\r\n }\r\n // Return the fill id\r\n , fill: function() {\r\n return 'url(#' + this.id() + ')'\r\n }\r\n // Alias string convertion to fill\r\n , toString: function() {\r\n return this.fill()\r\n }\r\n // custom attr to handle transform\r\n , attr: function(a, b, c) {\r\n if(a == 'transform') a = 'gradientTransform'\r\n return SVG.Container.prototype.attr.call(this, a, b, c)\r\n }\r\n }\r\n\r\n // Add parent method\r\n, construct: {\r\n // Create gradient element in defs\r\n gradient: function(type, block) {\r\n return this.defs().gradient(type, block)\r\n }\r\n }\r\n})\r\n\r\n// Add animatable methods to both gradient and fx module\r\nSVG.extend(SVG.Gradient, SVG.FX, {\r\n // From position\r\n from: function(x, y) {\r\n return (this._target || this).type == 'radial' ?\r\n this.attr({ fx: new SVG.Number(x), fy: new SVG.Number(y) }) :\r\n this.attr({ x1: new SVG.Number(x), y1: new SVG.Number(y) })\r\n }\r\n // To position\r\n, to: function(x, y) {\r\n return (this._target || this).type == 'radial' ?\r\n this.attr({ cx: new SVG.Number(x), cy: new SVG.Number(y) }) :\r\n this.attr({ x2: new SVG.Number(x), y2: new SVG.Number(y) })\r\n }\r\n})\r\n\r\n// Base gradient generation\r\nSVG.extend(SVG.Defs, {\r\n // define gradient\r\n gradient: function(type, block) {\r\n return this.put(new SVG.Gradient(type)).update(block)\r\n }\r\n\r\n})\r\n\r\nSVG.Stop = SVG.invent({\r\n // Initialize node\r\n create: 'stop'\r\n\r\n // Inherit from\r\n, inherit: SVG.Element\r\n\r\n // Add class methods\r\n, extend: {\r\n // add color stops\r\n update: function(o) {\r\n if (typeof o == 'number' || o instanceof SVG.Number) {\r\n o = {\r\n offset: arguments[0]\r\n , color: arguments[1]\r\n , opacity: arguments[2]\r\n }\r\n }\r\n\r\n // set attributes\r\n if (o.opacity != null) this.attr('stop-opacity', o.opacity)\r\n if (o.color != null) this.attr('stop-color', o.color)\r\n if (o.offset != null) this.attr('offset', new SVG.Number(o.offset))\r\n\r\n return this\r\n }\r\n }\r\n\r\n})\r\n\nSVG.Pattern = SVG.invent({\r\n // Initialize node\r\n create: 'pattern'\r\n\r\n // Inherit from\r\n, inherit: SVG.Container\r\n\r\n // Add class methods\r\n, extend: {\r\n // Return the fill id\r\n fill: function() {\r\n return 'url(#' + this.id() + ')'\r\n }\r\n // Update pattern by rebuilding\r\n , update: function(block) {\r\n // remove content\r\n this.clear()\r\n\r\n // invoke passed block\r\n if (typeof block == 'function')\r\n block.call(this, this)\r\n\r\n return this\r\n }\r\n // Alias string convertion to fill\r\n , toString: function() {\r\n return this.fill()\r\n }\r\n // custom attr to handle transform\r\n , attr: function(a, b, c) {\r\n if(a == 'transform') a = 'patternTransform'\r\n return SVG.Container.prototype.attr.call(this, a, b, c)\r\n }\r\n\r\n }\r\n\r\n // Add parent method\r\n, construct: {\r\n // Create pattern element in defs\r\n pattern: function(width, height, block) {\r\n return this.defs().pattern(width, height, block)\r\n }\r\n }\r\n})\r\n\r\nSVG.extend(SVG.Defs, {\r\n // Define gradient\r\n pattern: function(width, height, block) {\r\n return this.put(new SVG.Pattern).update(block).attr({\r\n x: 0\r\n , y: 0\r\n , width: width\r\n , height: height\r\n , patternUnits: 'userSpaceOnUse'\r\n })\r\n }\r\n\r\n})\nSVG.Shape = SVG.invent({\r\n // Initialize node\r\n create: function(element) {\r\n this.constructor.call(this, element)\r\n }\r\n\r\n // Inherit from\r\n, inherit: SVG.Element\r\n\r\n})\n\r\nSVG.Bare = SVG.invent({\r\n // Initialize\r\n create: function(element, inherit) {\r\n // construct element\r\n this.constructor.call(this, SVG.create(element))\r\n\r\n // inherit custom methods\r\n if (inherit)\r\n for (var method in inherit.prototype)\r\n if (typeof inherit.prototype[method] === 'function')\r\n this[method] = inherit.prototype[method]\r\n }\r\n\r\n // Inherit from\r\n, inherit: SVG.Element\r\n\r\n // Add methods\r\n, extend: {\r\n // Insert some plain text\r\n words: function(text) {\r\n // remove contents\r\n while (this.node.hasChildNodes())\r\n this.node.removeChild(this.node.lastChild)\r\n\r\n // create text node\r\n this.node.appendChild(document.createTextNode(text))\r\n\r\n return this\r\n }\r\n }\r\n})\r\n\r\n\r\nSVG.extend(SVG.Parent, {\r\n // Create an element that is not described by SVG.js\r\n element: function(element, inherit) {\r\n return this.put(new SVG.Bare(element, inherit))\r\n }\r\n})\r\n\nSVG.Symbol = SVG.invent({\r\n // Initialize node\r\n create: 'symbol'\r\n\r\n // Inherit from\r\n, inherit: SVG.Container\r\n\r\n, construct: {\r\n // create symbol\r\n symbol: function() {\r\n return this.put(new SVG.Symbol)\r\n }\r\n }\r\n})\r\n\nSVG.Use = SVG.invent({\r\n // Initialize node\r\n create: 'use'\r\n\r\n // Inherit from\r\n, inherit: SVG.Shape\r\n\r\n // Add class methods\r\n, extend: {\r\n // Use element as a reference\r\n element: function(element, file) {\r\n // Set lined element\r\n return this.attr('href', (file || '') + '#' + element, SVG.xlink)\r\n }\r\n }\r\n\r\n // Add parent method\r\n, construct: {\r\n // Create a use element\r\n use: function(element, file) {\r\n return this.put(new SVG.Use).element(element, file)\r\n }\r\n }\r\n})\nSVG.Rect = SVG.invent({\r\n // Initialize node\r\n create: 'rect'\r\n\r\n // Inherit from\r\n, inherit: SVG.Shape\r\n\r\n // Add parent method\r\n, construct: {\r\n // Create a rect element\r\n rect: function(width, height) {\r\n return this.put(new SVG.Rect()).size(width, height)\r\n }\r\n }\r\n})\nSVG.Circle = SVG.invent({\r\n // Initialize node\r\n create: 'circle'\r\n\r\n // Inherit from\r\n, inherit: SVG.Shape\r\n\r\n // Add parent method\r\n, construct: {\r\n // Create circle element, based on ellipse\r\n circle: function(size) {\r\n return this.put(new SVG.Circle).rx(new SVG.Number(size).divide(2)).move(0, 0)\r\n }\r\n }\r\n})\r\n\r\nSVG.extend(SVG.Circle, SVG.FX, {\r\n // Radius x value\r\n rx: function(rx) {\r\n return this.attr('r', rx)\r\n }\r\n // Alias radius x value\r\n, ry: function(ry) {\r\n return this.rx(ry)\r\n }\r\n})\r\n\r\nSVG.Ellipse = SVG.invent({\r\n // Initialize node\r\n create: 'ellipse'\r\n\r\n // Inherit from\r\n, inherit: SVG.Shape\r\n\r\n // Add parent method\r\n, construct: {\r\n // Create an ellipse\r\n ellipse: function(width, height) {\r\n return this.put(new SVG.Ellipse).size(width, height).move(0, 0)\r\n }\r\n }\r\n})\r\n\r\nSVG.extend(SVG.Ellipse, SVG.Rect, SVG.FX, {\r\n // Radius x value\r\n rx: function(rx) {\r\n return this.attr('rx', rx)\r\n }\r\n // Radius y value\r\n, ry: function(ry) {\r\n return this.attr('ry', ry)\r\n }\r\n})\r\n\r\n// Add common method\r\nSVG.extend(SVG.Circle, SVG.Ellipse, {\r\n // Move over x-axis\r\n x: function(x) {\r\n return x == null ? this.cx() - this.rx() : this.cx(x + this.rx())\r\n }\r\n // Move over y-axis\r\n , y: function(y) {\r\n return y == null ? this.cy() - this.ry() : this.cy(y + this.ry())\r\n }\r\n // Move by center over x-axis\r\n , cx: function(x) {\r\n return x == null ? this.attr('cx') : this.attr('cx', x)\r\n }\r\n // Move by center over y-axis\r\n , cy: function(y) {\r\n return y == null ? this.attr('cy') : this.attr('cy', y)\r\n }\r\n // Set width of element\r\n , width: function(width) {\r\n return width == null ? this.rx() * 2 : this.rx(new SVG.Number(width).divide(2))\r\n }\r\n // Set height of element\r\n , height: function(height) {\r\n return height == null ? this.ry() * 2 : this.ry(new SVG.Number(height).divide(2))\r\n }\r\n // Custom size function\r\n , size: function(width, height) {\r\n var p = proportionalSize(this, width, height)\r\n\r\n return this\r\n .rx(new SVG.Number(p.width).divide(2))\r\n .ry(new SVG.Number(p.height).divide(2))\r\n }\r\n})\nSVG.Line = SVG.invent({\r\n // Initialize node\r\n create: 'line'\r\n\r\n // Inherit from\r\n, inherit: SVG.Shape\r\n\r\n // Add class methods\r\n, extend: {\r\n // Get array\r\n array: function() {\r\n return new SVG.PointArray([\r\n [ this.attr('x1'), this.attr('y1') ]\r\n , [ this.attr('x2'), this.attr('y2') ]\r\n ])\r\n }\r\n // Overwrite native plot() method\r\n , plot: function(x1, y1, x2, y2) {\r\n if (x1 == null)\r\n return this.array()\r\n else if (typeof y1 !== 'undefined')\r\n x1 = { x1: x1, y1: y1, x2: x2, y2: y2 }\r\n else\r\n x1 = new SVG.PointArray(x1).toLine()\r\n\r\n return this.attr(x1)\r\n }\r\n // Move by left top corner\r\n , move: function(x, y) {\r\n return this.attr(this.array().move(x, y).toLine())\r\n }\r\n // Set element size to given width and height\r\n , size: function(width, height) {\r\n var p = proportionalSize(this, width, height)\r\n\r\n return this.attr(this.array().size(p.width, p.height).toLine())\r\n }\r\n }\r\n\r\n // Add parent method\r\n, construct: {\r\n // Create a line element\r\n line: function(x1, y1, x2, y2) {\r\n // make sure plot is called as a setter\r\n // x1 is not necessarily a number, it can also be an array, a string and a SVG.PointArray\r\n return SVG.Line.prototype.plot.apply(\r\n this.put(new SVG.Line)\r\n , x1 != null ? [x1, y1, x2, y2] : [0, 0, 0, 0]\r\n )\r\n }\r\n }\r\n})\r\n\nSVG.Polyline = SVG.invent({\r\n // Initialize node\r\n create: 'polyline'\r\n\r\n // Inherit from\r\n, inherit: SVG.Shape\r\n\r\n // Add parent method\r\n, construct: {\r\n // Create a wrapped polyline element\r\n polyline: function(p) {\r\n // make sure plot is called as a setter\r\n return this.put(new SVG.Polyline).plot(p || new SVG.PointArray)\r\n }\r\n }\r\n})\r\n\r\nSVG.Polygon = SVG.invent({\r\n // Initialize node\r\n create: 'polygon'\r\n\r\n // Inherit from\r\n, inherit: SVG.Shape\r\n\r\n // Add parent method\r\n, construct: {\r\n // Create a wrapped polygon element\r\n polygon: function(p) {\r\n // make sure plot is called as a setter\r\n return this.put(new SVG.Polygon).plot(p || new SVG.PointArray)\r\n }\r\n }\r\n})\r\n\r\n// Add polygon-specific functions\r\nSVG.extend(SVG.Polyline, SVG.Polygon, {\r\n // Get array\r\n array: function() {\r\n return this._array || (this._array = new SVG.PointArray(this.attr('points')))\r\n }\r\n // Plot new path\r\n, plot: function(p) {\r\n return (p == null) ?\r\n this.array() :\r\n this.clear().attr('points', typeof p == 'string' ? p : (this._array = new SVG.PointArray(p)))\r\n }\r\n // Clear array cache\r\n, clear: function() {\r\n delete this._array\r\n return this\r\n }\r\n // Move by left top corner\r\n, move: function(x, y) {\r\n return this.attr('points', this.array().move(x, y))\r\n }\r\n // Set element size to given width and height\r\n, size: function(width, height) {\r\n var p = proportionalSize(this, width, height)\r\n\r\n return this.attr('points', this.array().size(p.width, p.height))\r\n }\r\n\r\n})\r\n\n// unify all point to point elements\r\nSVG.extend(SVG.Line, SVG.Polyline, SVG.Polygon, {\r\n // Define morphable array\r\n morphArray: SVG.PointArray\r\n // Move by left top corner over x-axis\r\n, x: function(x) {\r\n return x == null ? this.bbox().x : this.move(x, this.bbox().y)\r\n }\r\n // Move by left top corner over y-axis\r\n, y: function(y) {\r\n return y == null ? this.bbox().y : this.move(this.bbox().x, y)\r\n }\r\n // Set width of element\r\n, width: function(width) {\r\n var b = this.bbox()\r\n\r\n return width == null ? b.width : this.size(width, b.height)\r\n }\r\n // Set height of element\r\n, height: function(height) {\r\n var b = this.bbox()\r\n\r\n return height == null ? b.height : this.size(b.width, height)\r\n }\r\n})\nSVG.Path = SVG.invent({\r\n // Initialize node\r\n create: 'path'\r\n\r\n // Inherit from\r\n, inherit: SVG.Shape\r\n\r\n // Add class methods\r\n, extend: {\r\n // Define morphable array\r\n morphArray: SVG.PathArray\r\n // Get array\r\n , array: function() {\r\n return this._array || (this._array = new SVG.PathArray(this.attr('d')))\r\n }\r\n // Plot new path\r\n , plot: function(d) {\r\n return (d == null) ?\r\n this.array() :\r\n this.clear().attr('d', typeof d == 'string' ? d : (this._array = new SVG.PathArray(d)))\r\n }\r\n // Clear array cache\r\n , clear: function() {\r\n delete this._array\r\n return this\r\n }\r\n // Move by left top corner\r\n , move: function(x, y) {\r\n return this.attr('d', this.array().move(x, y))\r\n }\r\n // Move by left top corner over x-axis\r\n , x: function(x) {\r\n return x == null ? this.bbox().x : this.move(x, this.bbox().y)\r\n }\r\n // Move by left top corner over y-axis\r\n , y: function(y) {\r\n return y == null ? this.bbox().y : this.move(this.bbox().x, y)\r\n }\r\n // Set element size to given width and height\r\n , size: function(width, height) {\r\n var p = proportionalSize(this, width, height)\r\n\r\n return this.attr('d', this.array().size(p.width, p.height))\r\n }\r\n // Set width of element\r\n , width: function(width) {\r\n return width == null ? this.bbox().width : this.size(width, this.bbox().height)\r\n }\r\n // Set height of element\r\n , height: function(height) {\r\n return height == null ? this.bbox().height : this.size(this.bbox().width, height)\r\n }\r\n\r\n }\r\n\r\n // Add parent method\r\n, construct: {\r\n // Create a wrapped path element\r\n path: function(d) {\r\n // make sure plot is called as a setter\r\n return this.put(new SVG.Path).plot(d || new SVG.PathArray)\r\n }\r\n }\r\n})\r\n\nSVG.Image = SVG.invent({\r\n // Initialize node\r\n create: 'image'\r\n\r\n // Inherit from\r\n, inherit: SVG.Shape\r\n\r\n // Add class methods\r\n, extend: {\r\n // (re)load image\r\n load: function(url) {\r\n if (!url) return this\r\n\r\n var self = this\r\n , img = new window.Image()\r\n\r\n // preload image\r\n SVG.on(img, 'load', function() {\r\n SVG.off(img)\r\n\r\n var p = self.parent(SVG.Pattern)\r\n\r\n if(p === null) return\r\n\r\n // ensure image size\r\n if (self.width() == 0 && self.height() == 0)\r\n self.size(img.width, img.height)\r\n\r\n // ensure pattern size if not set\r\n if (p && p.width() == 0 && p.height() == 0)\r\n p.size(self.width(), self.height())\r\n\r\n // callback\r\n if (typeof self._loaded === 'function')\r\n self._loaded.call(self, {\r\n width: img.width\r\n , height: img.height\r\n , ratio: img.width / img.height\r\n , url: url\r\n })\r\n })\r\n\r\n SVG.on(img, 'error', function(e){\r\n SVG.off(img)\r\n\r\n if (typeof self._error === 'function'){\r\n self._error.call(self, e)\r\n }\r\n })\r\n\r\n return this.attr('href', (img.src = this.src = url), SVG.xlink)\r\n }\r\n // Add loaded callback\r\n , loaded: function(loaded) {\r\n this._loaded = loaded\r\n return this\r\n }\r\n\r\n , error: function(error) {\r\n this._error = error\r\n return this\r\n }\r\n }\r\n\r\n // Add parent method\r\n, construct: {\r\n // create image element, load image and set its size\r\n image: function(source, width, height) {\r\n return this.put(new SVG.Image).load(source).size(width || 0, height || width || 0)\r\n }\r\n }\r\n\r\n})\nSVG.Text = SVG.invent({\r\n // Initialize node\r\n create: function() {\r\n this.constructor.call(this, SVG.create('text'))\r\n\r\n this.dom.leading = new SVG.Number(1.3) // store leading value for rebuilding\r\n this._rebuild = true // enable automatic updating of dy values\r\n this._build = false // disable build mode for adding multiple lines\r\n\r\n // set default font\r\n this.attr('font-family', SVG.defaults.attrs['font-family'])\r\n }\r\n\r\n // Inherit from\r\n, inherit: SVG.Shape\r\n\r\n // Add class methods\r\n, extend: {\r\n // Move over x-axis\r\n x: function(x) {\r\n // act as getter\r\n if (x == null)\r\n return this.attr('x')\r\n\r\n return this.attr('x', x)\r\n }\r\n // Move over y-axis\r\n , y: function(y) {\r\n var oy = this.attr('y')\r\n , o = typeof oy === 'number' ? oy - this.bbox().y : 0\r\n\r\n // act as getter\r\n if (y == null)\r\n return typeof oy === 'number' ? oy - o : oy\r\n\r\n return this.attr('y', typeof y.valueOf() === 'number' ? y + o : y)\r\n }\r\n // Move center over x-axis\r\n , cx: function(x) {\r\n return x == null ? this.bbox().cx : this.x(x - this.bbox().width / 2)\r\n }\r\n // Move center over y-axis\r\n , cy: function(y) {\r\n return y == null ? this.bbox().cy : this.y(y - this.bbox().height / 2)\r\n }\r\n // Set the text content\r\n , text: function(text) {\r\n // act as getter\r\n if (typeof text === 'undefined'){\r\n var text = ''\r\n var children = this.node.childNodes\r\n for(var i = 0, len = children.length; i < len; ++i){\r\n\r\n // add newline if its not the first child and newLined is set to true\r\n if(i != 0 && children[i].nodeType != 3 && SVG.adopt(children[i]).dom.newLined == true){\r\n text += '\\n'\r\n }\r\n\r\n // add content of this node\r\n text += children[i].textContent\r\n }\r\n\r\n return text\r\n }\r\n\r\n // remove existing content\r\n this.clear().build(true)\r\n\r\n if (typeof text === 'function') {\r\n // call block\r\n text.call(this, this)\r\n\r\n } else {\r\n // store text and make sure text is not blank\r\n text = text.split('\\n')\r\n\r\n // build new lines\r\n for (var i = 0, il = text.length; i < il; i++)\r\n this.tspan(text[i]).newLine()\r\n }\r\n\r\n // disable build mode and rebuild lines\r\n return this.build(false).rebuild()\r\n }\r\n // Set font size\r\n , size: function(size) {\r\n return this.attr('font-size', size).rebuild()\r\n }\r\n // Set / get leading\r\n , leading: function(value) {\r\n // act as getter\r\n if (value == null)\r\n return this.dom.leading\r\n\r\n // act as setter\r\n this.dom.leading = new SVG.Number(value)\r\n\r\n return this.rebuild()\r\n }\r\n // Get all the first level lines\r\n , lines: function() {\r\n var node = (this.textPath && this.textPath() || this).node\r\n\r\n // filter tspans and map them to SVG.js instances\r\n var lines = SVG.utils.map(SVG.utils.filterSVGElements(node.childNodes), function(el){\r\n return SVG.adopt(el)\r\n })\r\n\r\n // return an instance of SVG.set\r\n return new SVG.Set(lines)\r\n }\r\n // Rebuild appearance type\r\n , rebuild: function(rebuild) {\r\n // store new rebuild flag if given\r\n if (typeof rebuild == 'boolean')\r\n this._rebuild = rebuild\r\n\r\n // define position of all lines\r\n if (this._rebuild) {\r\n var self = this\r\n , blankLineOffset = 0\r\n , dy = this.dom.leading * new SVG.Number(this.attr('font-size'))\r\n\r\n this.lines().each(function() {\r\n if (this.dom.newLined) {\r\n if (!self.textPath())\r\n this.attr('x', self.attr('x'))\r\n if(this.text() == '\\n') {\r\n blankLineOffset += dy\r\n }else{\r\n this.attr('dy', dy + blankLineOffset)\r\n blankLineOffset = 0\r\n }\r\n }\r\n })\r\n\r\n this.fire('rebuild')\r\n }\r\n\r\n return this\r\n }\r\n // Enable / disable build mode\r\n , build: function(build) {\r\n this._build = !!build\r\n return this\r\n }\r\n // overwrite method from parent to set data properly\r\n , setData: function(o){\r\n this.dom = o\r\n this.dom.leading = new SVG.Number(o.leading || 1.3)\r\n return this\r\n }\r\n }\r\n\r\n // Add parent method\r\n, construct: {\r\n // Create text element\r\n text: function(text) {\r\n return this.put(new SVG.Text).text(text)\r\n }\r\n // Create plain text element\r\n , plain: function(text) {\r\n return this.put(new SVG.Text).plain(text)\r\n }\r\n }\r\n\r\n})\r\n\r\nSVG.Tspan = SVG.invent({\r\n // Initialize node\r\n create: 'tspan'\r\n\r\n // Inherit from\r\n, inherit: SVG.Shape\r\n\r\n // Add class methods\r\n, extend: {\r\n // Set text content\r\n text: function(text) {\r\n if(text == null) return this.node.textContent + (this.dom.newLined ? '\\n' : '')\r\n\r\n typeof text === 'function' ? text.call(this, this) : this.plain(text)\r\n\r\n return this\r\n }\r\n // Shortcut dx\r\n , dx: function(dx) {\r\n return this.attr('dx', dx)\r\n }\r\n // Shortcut dy\r\n , dy: function(dy) {\r\n return this.attr('dy', dy)\r\n }\r\n // Create new line\r\n , newLine: function() {\r\n // fetch text parent\r\n var t = this.parent(SVG.Text)\r\n\r\n // mark new line\r\n this.dom.newLined = true\r\n\r\n // apply new hy¡n\r\n return this.dy(t.dom.leading * t.attr('font-size')).attr('x', t.x())\r\n }\r\n }\r\n\r\n})\r\n\r\nSVG.extend(SVG.Text, SVG.Tspan, {\r\n // Create plain text node\r\n plain: function(text) {\r\n // clear if build mode is disabled\r\n if (this._build === false)\r\n this.clear()\r\n\r\n // create text node\r\n this.node.appendChild(document.createTextNode(text))\r\n\r\n return this\r\n }\r\n // Create a tspan\r\n, tspan: function(text) {\r\n var node = (this.textPath && this.textPath() || this).node\r\n , tspan = new SVG.Tspan\r\n\r\n // clear if build mode is disabled\r\n if (this._build === false)\r\n this.clear()\r\n\r\n // add new tspan\r\n node.appendChild(tspan.node)\r\n\r\n return tspan.text(text)\r\n }\r\n // Clear all lines\r\n, clear: function() {\r\n var node = (this.textPath && this.textPath() || this).node\r\n\r\n // remove existing child nodes\r\n while (node.hasChildNodes())\r\n node.removeChild(node.lastChild)\r\n\r\n return this\r\n }\r\n // Get length of text element\r\n, length: function() {\r\n return this.node.getComputedTextLength()\r\n }\r\n})\r\n\nSVG.TextPath = SVG.invent({\r\n // Initialize node\r\n create: 'textPath'\r\n\r\n // Inherit from\r\n, inherit: SVG.Parent\r\n\r\n // Define parent class\r\n, parent: SVG.Text\r\n\r\n // Add parent method\r\n, construct: {\r\n morphArray: SVG.PathArray\r\n // Create path for text to run on\r\n , path: function(d) {\r\n // create textPath element\r\n var path = new SVG.TextPath\r\n , track = this.doc().defs().path(d)\r\n\r\n // move lines to textpath\r\n while (this.node.hasChildNodes())\r\n path.node.appendChild(this.node.firstChild)\r\n\r\n // add textPath element as child node\r\n this.node.appendChild(path.node)\r\n\r\n // link textPath to path and add content\r\n path.attr('href', '#' + track, SVG.xlink)\r\n\r\n return this\r\n }\r\n // return the array of the path track element\r\n , array: function() {\r\n var track = this.track()\r\n\r\n return track ? track.array() : null\r\n }\r\n // Plot path if any\r\n , plot: function(d) {\r\n var track = this.track()\r\n , pathArray = null\r\n\r\n if (track) {\r\n pathArray = track.plot(d)\r\n }\r\n\r\n return (d == null) ? pathArray : this\r\n }\r\n // Get the path track element\r\n , track: function() {\r\n var path = this.textPath()\r\n\r\n if (path)\r\n return path.reference('href')\r\n }\r\n // Get the textPath child\r\n , textPath: function() {\r\n if (this.node.firstChild && this.node.firstChild.nodeName == 'textPath')\r\n return SVG.adopt(this.node.firstChild)\r\n }\r\n }\r\n})\r\n\nSVG.Nested = SVG.invent({\r\n // Initialize node\r\n create: function() {\r\n this.constructor.call(this, SVG.create('svg'))\r\n\r\n this.style('overflow', 'visible')\r\n }\r\n\r\n // Inherit from\r\n, inherit: SVG.Container\r\n\r\n // Add parent method\r\n, construct: {\r\n // Create nested svg document\r\n nested: function() {\r\n return this.put(new SVG.Nested)\r\n }\r\n }\r\n})\nSVG.A = SVG.invent({\r\n // Initialize node\r\n create: 'a'\r\n\r\n // Inherit from\r\n, inherit: SVG.Container\r\n\r\n // Add class methods\r\n, extend: {\r\n // Link url\r\n to: function(url) {\r\n return this.attr('href', url, SVG.xlink)\r\n }\r\n // Link show attribute\r\n , show: function(target) {\r\n return this.attr('show', target, SVG.xlink)\r\n }\r\n // Link target attribute\r\n , target: function(target) {\r\n return this.attr('target', target)\r\n }\r\n }\r\n\r\n // Add parent method\r\n, construct: {\r\n // Create a hyperlink element\r\n link: function(url) {\r\n return this.put(new SVG.A).to(url)\r\n }\r\n }\r\n})\r\n\r\nSVG.extend(SVG.Element, {\r\n // Create a hyperlink element\r\n linkTo: function(url) {\r\n var link = new SVG.A\r\n\r\n if (typeof url == 'function')\r\n url.call(link, link)\r\n else\r\n link.to(url)\r\n\r\n return this.parent().put(link).put(this)\r\n }\r\n\r\n})\nSVG.Marker = SVG.invent({\r\n // Initialize node\r\n create: 'marker'\r\n\r\n // Inherit from\r\n, inherit: SVG.Container\r\n\r\n // Add class methods\r\n, extend: {\r\n // Set width of element\r\n width: function(width) {\r\n return this.attr('markerWidth', width)\r\n }\r\n // Set height of element\r\n , height: function(height) {\r\n return this.attr('markerHeight', height)\r\n }\r\n // Set marker refX and refY\r\n , ref: function(x, y) {\r\n return this.attr('refX', x).attr('refY', y)\r\n }\r\n // Update marker\r\n , update: function(block) {\r\n // remove all content\r\n this.clear()\r\n\r\n // invoke passed block\r\n if (typeof block == 'function')\r\n block.call(this, this)\r\n\r\n return this\r\n }\r\n // Return the fill id\r\n , toString: function() {\r\n return 'url(#' + this.id() + ')'\r\n }\r\n }\r\n\r\n // Add parent method\r\n, construct: {\r\n marker: function(width, height, block) {\r\n // Create marker element in defs\r\n return this.defs().marker(width, height, block)\r\n }\r\n }\r\n\r\n})\r\n\r\nSVG.extend(SVG.Defs, {\r\n // Create marker\r\n marker: function(width, height, block) {\r\n // Set default viewbox to match the width and height, set ref to cx and cy and set orient to auto\r\n return this.put(new SVG.Marker)\r\n .size(width, height)\r\n .ref(width / 2, height / 2)\r\n .viewbox(0, 0, width, height)\r\n .attr('orient', 'auto')\r\n .update(block)\r\n }\r\n\r\n})\r\n\r\nSVG.extend(SVG.Line, SVG.Polyline, SVG.Polygon, SVG.Path, {\r\n // Create and attach markers\r\n marker: function(marker, width, height, block) {\r\n var attr = ['marker']\r\n\r\n // Build attribute name\r\n if (marker != 'all') attr.push(marker)\r\n attr = attr.join('-')\r\n\r\n // Set marker attribute\r\n marker = arguments[1] instanceof SVG.Marker ?\r\n arguments[1] :\r\n this.doc().marker(width, height, block)\r\n\r\n return this.attr(attr, marker)\r\n }\r\n\r\n})\n// Define list of available attributes for stroke and fill\r\nvar sugar = {\r\n stroke: ['color', 'width', 'opacity', 'linecap', 'linejoin', 'miterlimit', 'dasharray', 'dashoffset']\r\n, fill: ['color', 'opacity', 'rule']\r\n, prefix: function(t, a) {\r\n return a == 'color' ? t : t + '-' + a\r\n }\r\n}\r\n\r\n// Add sugar for fill and stroke\r\n;['fill', 'stroke'].forEach(function(m) {\r\n var i, extension = {}\r\n\r\n extension[m] = function(o) {\r\n if (typeof o == 'undefined')\r\n return this\r\n if (typeof o == 'string' || SVG.Color.isRgb(o) || (o && typeof o.fill === 'function'))\r\n this.attr(m, o)\r\n\r\n else\r\n // set all attributes from sugar.fill and sugar.stroke list\r\n for (i = sugar[m].length - 1; i >= 0; i--)\r\n if (o[sugar[m][i]] != null)\r\n this.attr(sugar.prefix(m, sugar[m][i]), o[sugar[m][i]])\r\n\r\n return this\r\n }\r\n\r\n SVG.extend(SVG.Element, SVG.FX, extension)\r\n\r\n})\r\n\r\nSVG.extend(SVG.Element, SVG.FX, {\r\n // Map rotation to transform\r\n rotate: function(d, cx, cy) {\r\n return this.transform({ rotation: d, cx: cx, cy: cy })\r\n }\r\n // Map skew to transform\r\n, skew: function(x, y, cx, cy) {\r\n return arguments.length == 1 || arguments.length == 3 ?\r\n this.transform({ skew: x, cx: y, cy: cx }) :\r\n this.transform({ skewX: x, skewY: y, cx: cx, cy: cy })\r\n }\r\n // Map scale to transform\r\n, scale: function(x, y, cx, cy) {\r\n return arguments.length == 1 || arguments.length == 3 ?\r\n this.transform({ scale: x, cx: y, cy: cx }) :\r\n this.transform({ scaleX: x, scaleY: y, cx: cx, cy: cy })\r\n }\r\n // Map translate to transform\r\n, translate: function(x, y) {\r\n return this.transform({ x: x, y: y })\r\n }\r\n // Map flip to transform\r\n, flip: function(a, o) {\r\n o = typeof a == 'number' ? a : o\r\n return this.transform({ flip: a || 'both', offset: o })\r\n }\r\n // Map matrix to transform\r\n, matrix: function(m) {\r\n return this.attr('transform', new SVG.Matrix(arguments.length == 6 ? [].slice.call(arguments) : m))\r\n }\r\n // Opacity\r\n, opacity: function(value) {\r\n return this.attr('opacity', value)\r\n }\r\n // Relative move over x axis\r\n, dx: function(x) {\r\n return this.x(new SVG.Number(x).plus(this instanceof SVG.FX ? 0 : this.x()), true)\r\n }\r\n // Relative move over y axis\r\n, dy: function(y) {\r\n return this.y(new SVG.Number(y).plus(this instanceof SVG.FX ? 0 : this.y()), true)\r\n }\r\n // Relative move over x and y axes\r\n, dmove: function(x, y) {\r\n return this.dx(x).dy(y)\r\n }\r\n})\r\n\r\nSVG.extend(SVG.Rect, SVG.Ellipse, SVG.Circle, SVG.Gradient, SVG.FX, {\r\n // Add x and y radius\r\n radius: function(x, y) {\r\n var type = (this._target || this).type;\r\n return type == 'radial' || type == 'circle' ?\r\n this.attr('r', new SVG.Number(x)) :\r\n this.rx(x).ry(y == null ? x : y)\r\n }\r\n})\r\n\r\nSVG.extend(SVG.Path, {\r\n // Get path length\r\n length: function() {\r\n return this.node.getTotalLength()\r\n }\r\n // Get point at length\r\n, pointAt: function(length) {\r\n return this.node.getPointAtLength(length)\r\n }\r\n})\r\n\r\nSVG.extend(SVG.Parent, SVG.Text, SVG.Tspan, SVG.FX, {\r\n // Set font\r\n font: function(a, v) {\r\n if (typeof a == 'object') {\r\n for (v in a) this.font(v, a[v])\r\n }\r\n\r\n return a == 'leading' ?\r\n this.leading(v) :\r\n a == 'anchor' ?\r\n this.attr('text-anchor', v) :\r\n a == 'size' || a == 'family' || a == 'weight' || a == 'stretch' || a == 'variant' || a == 'style' ?\r\n this.attr('font-'+ a, v) :\r\n this.attr(a, v)\r\n }\r\n})\r\n\nSVG.Set = SVG.invent({\r\n // Initialize\r\n create: function(members) {\r\n if (members instanceof SVG.Set) {\r\n this.members = members.members.slice()\r\n } else {\r\n Array.isArray(members) ? this.members = members : this.clear()\r\n }\r\n }\r\n\r\n // Add class methods\r\n, extend: {\r\n // Add element to set\r\n add: function() {\r\n var i, il, elements = [].slice.call(arguments)\r\n\r\n for (i = 0, il = elements.length; i < il; i++)\r\n this.members.push(elements[i])\r\n\r\n return this\r\n }\r\n // Remove element from set\r\n , remove: function(element) {\r\n var i = this.index(element)\r\n\r\n // remove given child\r\n if (i > -1)\r\n this.members.splice(i, 1)\r\n\r\n return this\r\n }\r\n // Iterate over all members\r\n , each: function(block) {\r\n for (var i = 0, il = this.members.length; i < il; i++)\r\n block.apply(this.members[i], [i, this.members])\r\n\r\n return this\r\n }\r\n // Restore to defaults\r\n , clear: function() {\r\n // initialize store\r\n this.members = []\r\n\r\n return this\r\n }\r\n // Get the length of a set\r\n , length: function() {\r\n return this.members.length\r\n }\r\n // Checks if a given element is present in set\r\n , has: function(element) {\r\n return this.index(element) >= 0\r\n }\r\n // retuns index of given element in set\r\n , index: function(element) {\r\n return this.members.indexOf(element)\r\n }\r\n // Get member at given index\r\n , get: function(i) {\r\n return this.members[i]\r\n }\r\n // Get first member\r\n , first: function() {\r\n return this.get(0)\r\n }\r\n // Get last member\r\n , last: function() {\r\n return this.get(this.members.length - 1)\r\n }\r\n // Default value\r\n , valueOf: function() {\r\n return this.members\r\n }\r\n // Get the bounding box of all members included or empty box if set has no items\r\n , bbox: function(){\r\n // return an empty box of there are no members\r\n if (this.members.length == 0)\r\n return new SVG.RBox()\r\n\r\n // get the first rbox and update the target bbox\r\n var rbox = this.members[0].rbox(this.members[0].doc())\r\n\r\n this.each(function() {\r\n // user rbox for correct position and visual representation\r\n rbox = rbox.merge(this.rbox(this.doc()))\r\n })\r\n\r\n return rbox\r\n }\r\n }\r\n\r\n // Add parent method\r\n, construct: {\r\n // Create a new set\r\n set: function(members) {\r\n return new SVG.Set(members)\r\n }\r\n }\r\n})\r\n\r\nSVG.FX.Set = SVG.invent({\r\n // Initialize node\r\n create: function(set) {\r\n // store reference to set\r\n this.set = set\r\n }\r\n\r\n})\r\n\r\n// Alias methods\r\nSVG.Set.inherit = function() {\r\n var m\r\n , methods = []\r\n\r\n // gather shape methods\r\n for(var m in SVG.Shape.prototype)\r\n if (typeof SVG.Shape.prototype[m] == 'function' && typeof SVG.Set.prototype[m] != 'function')\r\n methods.push(m)\r\n\r\n // apply shape aliasses\r\n methods.forEach(function(method) {\r\n SVG.Set.prototype[method] = function() {\r\n for (var i = 0, il = this.members.length; i < il; i++)\r\n if (this.members[i] && typeof this.members[i][method] == 'function')\r\n this.members[i][method].apply(this.members[i], arguments)\r\n\r\n return method == 'animate' ? (this.fx || (this.fx = new SVG.FX.Set(this))) : this\r\n }\r\n })\r\n\r\n // clear methods for the next round\r\n methods = []\r\n\r\n // gather fx methods\r\n for(var m in SVG.FX.prototype)\r\n if (typeof SVG.FX.prototype[m] == 'function' && typeof SVG.FX.Set.prototype[m] != 'function')\r\n methods.push(m)\r\n\r\n // apply fx aliasses\r\n methods.forEach(function(method) {\r\n SVG.FX.Set.prototype[method] = function() {\r\n for (var i = 0, il = this.set.members.length; i < il; i++)\r\n this.set.members[i].fx[method].apply(this.set.members[i].fx, arguments)\r\n\r\n return this\r\n }\r\n })\r\n}\r\n\n\r\nSVG.extend(SVG.Element, {\r\n // Store data values on svg nodes\r\n data: function(a, v, r) {\r\n if (typeof a == 'object') {\r\n for (v in a)\r\n this.data(v, a[v])\r\n\r\n } else if (arguments.length < 2) {\r\n try {\r\n return JSON.parse(this.attr('data-' + a))\r\n } catch(e) {\r\n return this.attr('data-' + a)\r\n }\r\n\r\n } else {\r\n this.attr(\r\n 'data-' + a\r\n , v === null ?\r\n null :\r\n r === true || typeof v === 'string' || typeof v === 'number' ?\r\n v :\r\n JSON.stringify(v)\r\n )\r\n }\r\n\r\n return this\r\n }\r\n})\nSVG.extend(SVG.Element, {\r\n // Remember arbitrary data\r\n remember: function(k, v) {\r\n // remember every item in an object individually\r\n if (typeof arguments[0] == 'object')\r\n for (var v in k)\r\n this.remember(v, k[v])\r\n\r\n // retrieve memory\r\n else if (arguments.length == 1)\r\n return this.memory()[k]\r\n\r\n // store memory\r\n else\r\n this.memory()[k] = v\r\n\r\n return this\r\n }\r\n\r\n // Erase a given memory\r\n, forget: function() {\r\n if (arguments.length == 0)\r\n this._memory = {}\r\n else\r\n for (var i = arguments.length - 1; i >= 0; i--)\r\n delete this.memory()[arguments[i]]\r\n\r\n return this\r\n }\r\n\r\n // Initialize or return local memory object\r\n, memory: function() {\r\n return this._memory || (this._memory = {})\r\n }\r\n\r\n})\n// Method for getting an element by id\r\nSVG.get = function(id) {\r\n var node = document.getElementById(idFromReference(id) || id)\r\n return SVG.adopt(node)\r\n}\r\n\r\n// Select elements by query string\r\nSVG.select = function(query, parent) {\r\n return new SVG.Set(\r\n SVG.utils.map((parent || document).querySelectorAll(query), function(node) {\r\n return SVG.adopt(node)\r\n })\r\n )\r\n}\r\n\r\nSVG.extend(SVG.Parent, {\r\n // Scoped select method\r\n select: function(query) {\r\n return SVG.select(query, this.node)\r\n }\r\n\r\n})\nfunction pathRegReplace(a, b, c, d) {\r\n return c + d.replace(SVG.regex.dots, ' .')\r\n}\r\n\r\n// creates deep clone of array\r\nfunction array_clone(arr){\r\n var clone = arr.slice(0)\r\n for(var i = clone.length; i--;){\r\n if(Array.isArray(clone[i])){\r\n clone[i] = array_clone(clone[i])\r\n }\r\n }\r\n return clone\r\n}\r\n\r\n// tests if a given element is instance of an object\r\nfunction is(el, obj){\r\n return el instanceof obj\r\n}\r\n\r\n// tests if a given selector matches an element\r\nfunction matches(el, selector) {\r\n return (el.matches || el.matchesSelector || el.msMatchesSelector || el.mozMatchesSelector || el.webkitMatchesSelector || el.oMatchesSelector).call(el, selector);\r\n}\r\n\r\n// Convert dash-separated-string to camelCase\r\nfunction camelCase(s) {\r\n return s.toLowerCase().replace(/-(.)/g, function(m, g) {\r\n return g.toUpperCase()\r\n })\r\n}\r\n\r\n// Capitalize first letter of a string\r\nfunction capitalize(s) {\r\n return s.charAt(0).toUpperCase() + s.slice(1)\r\n}\r\n\r\n// Ensure to six-based hex\r\nfunction fullHex(hex) {\r\n return hex.length == 4 ?\r\n [ '#',\r\n hex.substring(1, 2), hex.substring(1, 2)\r\n , hex.substring(2, 3), hex.substring(2, 3)\r\n , hex.substring(3, 4), hex.substring(3, 4)\r\n ].join('') : hex\r\n}\r\n\r\n// Component to hex value\r\nfunction compToHex(comp) {\r\n var hex = comp.toString(16)\r\n return hex.length == 1 ? '0' + hex : hex\r\n}\r\n\r\n// Calculate proportional width and height values when necessary\r\nfunction proportionalSize(element, width, height) {\r\n if (width == null || height == null) {\r\n var box = element.bbox()\r\n\r\n if (width == null)\r\n width = box.width / box.height * height\r\n else if (height == null)\r\n height = box.height / box.width * width\r\n }\r\n\r\n return {\r\n width: width\r\n , height: height\r\n }\r\n}\r\n\r\n// Delta transform point\r\nfunction deltaTransformPoint(matrix, x, y) {\r\n return {\r\n x: x * matrix.a + y * matrix.c + 0\r\n , y: x * matrix.b + y * matrix.d + 0\r\n }\r\n}\r\n\r\n// Map matrix array to object\r\nfunction arrayToMatrix(a) {\r\n return { a: a[0], b: a[1], c: a[2], d: a[3], e: a[4], f: a[5] }\r\n}\r\n\r\n// Parse matrix if required\r\nfunction parseMatrix(matrix) {\r\n if (!(matrix instanceof SVG.Matrix))\r\n matrix = new SVG.Matrix(matrix)\r\n\r\n return matrix\r\n}\r\n\r\n// Add centre point to transform object\r\nfunction ensureCentre(o, target) {\r\n o.cx = o.cx == null ? target.bbox().cx : o.cx\r\n o.cy = o.cy == null ? target.bbox().cy : o.cy\r\n}\r\n\r\n// PathArray Helpers\r\nfunction arrayToString(a) {\r\n for (var i = 0, il = a.length, s = ''; i < il; i++) {\r\n s += a[i][0]\r\n\r\n if (a[i][1] != null) {\r\n s += a[i][1]\r\n\r\n if (a[i][2] != null) {\r\n s += ' '\r\n s += a[i][2]\r\n\r\n if (a[i][3] != null) {\r\n s += ' '\r\n s += a[i][3]\r\n s += ' '\r\n s += a[i][4]\r\n\r\n if (a[i][5] != null) {\r\n s += ' '\r\n s += a[i][5]\r\n s += ' '\r\n s += a[i][6]\r\n\r\n if (a[i][7] != null) {\r\n s += ' '\r\n s += a[i][7]\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return s + ' '\r\n}\r\n\r\n// Deep new id assignment\r\nfunction assignNewId(node) {\r\n // do the same for SVG child nodes as well\r\n for (var i = node.childNodes.length - 1; i >= 0; i--)\r\n if (node.childNodes[i] instanceof window.SVGElement)\r\n assignNewId(node.childNodes[i])\r\n\r\n return SVG.adopt(node).id(SVG.eid(node.nodeName))\r\n}\r\n\r\n// Add more bounding box properties\r\nfunction fullBox(b) {\r\n if (b.x == null) {\r\n b.x = 0\r\n b.y = 0\r\n b.width = 0\r\n b.height = 0\r\n }\r\n\r\n b.w = b.width\r\n b.h = b.height\r\n b.x2 = b.x + b.width\r\n b.y2 = b.y + b.height\r\n b.cx = b.x + b.width / 2\r\n b.cy = b.y + b.height / 2\r\n\r\n return b\r\n}\r\n\r\n// Get id from reference string\r\nfunction idFromReference(url) {\r\n var m = (url || '').toString().match(SVG.regex.reference)\r\n\r\n if (m) return m[1]\r\n}\r\n\r\n// If values like 1e-88 are passed, this is not a valid 32 bit float,\r\n// but in those cases, we are so close to 0 that 0 works well!\r\nfunction float32String(v) {\r\n return Math.abs(v) > 1e-37 ? v : 0\r\n}\r\n\r\n// Create matrix array for looping\r\nvar abcdef = 'abcdef'.split('')\r\n\n// Add CustomEvent to IE9 and IE10\r\nif (typeof window.CustomEvent !== 'function') {\r\n // Code from: https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent\r\n var CustomEventPoly = function(event, options) {\r\n options = options || { bubbles: false, cancelable: false, detail: undefined }\r\n var e = document.createEvent('CustomEvent')\r\n e.initCustomEvent(event, options.bubbles, options.cancelable, options.detail)\r\n return e\r\n }\r\n\r\n CustomEventPoly.prototype = window.Event.prototype\r\n\r\n SVG.CustomEvent = CustomEventPoly\r\n} else {\r\n SVG.CustomEvent = window.CustomEvent\r\n}\r\n\r\n// requestAnimationFrame / cancelAnimationFrame Polyfill with fallback based on Paul Irish\r\n(function(w) {\r\n var lastTime = 0\r\n var vendors = ['moz', 'webkit']\r\n\r\n for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {\r\n w.requestAnimationFrame = w[vendors[x] + 'RequestAnimationFrame']\r\n w.cancelAnimationFrame = w[vendors[x] + 'CancelAnimationFrame'] ||\r\n w[vendors[x] + 'CancelRequestAnimationFrame']\r\n }\r\n\r\n w.requestAnimationFrame = w.requestAnimationFrame ||\r\n function(callback) {\r\n var currTime = new Date().getTime()\r\n var timeToCall = Math.max(0, 16 - (currTime - lastTime))\r\n\r\n var id = w.setTimeout(function() {\r\n callback(currTime + timeToCall)\r\n }, timeToCall)\r\n\r\n lastTime = currTime + timeToCall\r\n return id\r\n }\r\n\r\n w.cancelAnimationFrame = w.cancelAnimationFrame || w.clearTimeout;\r\n\r\n}(window))\r\n\r\nreturn SVG\r\n\r\n}));\r","/*! svg.draggable.js - v2.2.2 - 2019-01-08\r\n* https://github.com/svgdotjs/svg.draggable.js\r\n* Copyright (c) 2019 Wout Fierens; Licensed MIT */\r\n;(function() {\r\n\r\n // creates handler, saves it\r\n function DragHandler(el){\r\n el.remember('_draggable', this)\r\n this.el = el\r\n }\r\n\r\n\r\n // Sets new parameter, starts dragging\r\n DragHandler.prototype.init = function(constraint, val){\r\n var _this = this\r\n this.constraint = constraint\r\n this.value = val\r\n this.el.on('mousedown.drag', function(e){ _this.start(e) })\r\n this.el.on('touchstart.drag', function(e){ _this.start(e) })\r\n }\r\n\r\n // transforms one point from screen to user coords\r\n DragHandler.prototype.transformPoint = function(event, offset){\r\n event = event || window.event\r\n var touches = event.changedTouches && event.changedTouches[0] || event\r\n this.p.x = touches.clientX - (offset || 0)\r\n this.p.y = touches.clientY\r\n return this.p.matrixTransform(this.m)\r\n }\r\n\r\n // gets elements bounding box with special handling of groups, nested and use\r\n DragHandler.prototype.getBBox = function(){\r\n\r\n var box = this.el.bbox()\r\n\r\n if(this.el instanceof SVG.Nested) box = this.el.rbox()\r\n\r\n if (this.el instanceof SVG.G || this.el instanceof SVG.Use || this.el instanceof SVG.Nested) {\r\n box.x = this.el.x()\r\n box.y = this.el.y()\r\n }\r\n\r\n return box\r\n }\r\n\r\n // start dragging\r\n DragHandler.prototype.start = function(e){\r\n\r\n // check for left button\r\n if(e.type == 'click'|| e.type == 'mousedown' || e.type == 'mousemove'){\r\n if((e.which || e.buttons) != 1){\r\n return\r\n }\r\n }\r\n\r\n var _this = this\r\n\r\n // fire beforedrag event\r\n this.el.fire('beforedrag', { event: e, handler: this })\r\n if(this.el.event().defaultPrevented) return;\r\n\r\n // prevent browser drag behavior as soon as possible\r\n e.preventDefault();\r\n\r\n // prevent propagation to a parent that might also have dragging enabled\r\n e.stopPropagation();\r\n\r\n // search for parent on the fly to make sure we can call\r\n // draggable() even when element is not in the dom currently\r\n this.parent = this.parent || this.el.parent(SVG.Nested) || this.el.parent(SVG.Doc)\r\n this.p = this.parent.node.createSVGPoint()\r\n\r\n // save current transformation matrix\r\n this.m = this.el.node.getScreenCTM().inverse()\r\n\r\n var box = this.getBBox()\r\n\r\n var anchorOffset;\r\n\r\n // fix text-anchor in text-element (#37)\r\n if(this.el instanceof SVG.Text){\r\n anchorOffset = this.el.node.getComputedTextLength();\r\n\r\n switch(this.el.attr('text-anchor')){\r\n case 'middle':\r\n anchorOffset /= 2;\r\n break\r\n case 'start':\r\n anchorOffset = 0;\r\n break;\r\n }\r\n }\r\n\r\n this.startPoints = {\r\n // We take absolute coordinates since we are just using a delta here\r\n point: this.transformPoint(e, anchorOffset),\r\n box: box,\r\n transform: this.el.transform()\r\n }\r\n\r\n // add drag and end events to window\r\n SVG.on(window, 'mousemove.drag', function(e){ _this.drag(e) })\r\n SVG.on(window, 'touchmove.drag', function(e){ _this.drag(e) })\r\n SVG.on(window, 'mouseup.drag', function(e){ _this.end(e) })\r\n SVG.on(window, 'touchend.drag', function(e){ _this.end(e) })\r\n\r\n // fire dragstart event\r\n this.el.fire('dragstart', {event: e, p: this.startPoints.point, m: this.m, handler: this})\r\n }\r\n\r\n // while dragging\r\n DragHandler.prototype.drag = function(e){\r\n\r\n var box = this.getBBox()\r\n , p = this.transformPoint(e)\r\n , x = this.startPoints.box.x + p.x - this.startPoints.point.x\r\n , y = this.startPoints.box.y + p.y - this.startPoints.point.y\r\n , c = this.constraint\r\n , gx = p.x - this.startPoints.point.x\r\n , gy = p.y - this.startPoints.point.y\r\n\r\n this.el.fire('dragmove', {\r\n event: e\r\n , p: p\r\n , m: this.m\r\n , handler: this\r\n })\r\n\r\n if(this.el.event().defaultPrevented) return p\r\n\r\n // move the element to its new position, if possible by constraint\r\n if (typeof c == 'function') {\r\n\r\n var coord = c.call(this.el, x, y, this.m)\r\n\r\n // bool, just show us if movement is allowed or not\r\n if (typeof coord == 'boolean') {\r\n coord = {\r\n x: coord,\r\n y: coord\r\n }\r\n }\r\n\r\n // if true, we just move. If !false its a number and we move it there\r\n if (coord.x === true) {\r\n this.el.x(x)\r\n } else if (coord.x !== false) {\r\n this.el.x(coord.x)\r\n }\r\n\r\n if (coord.y === true) {\r\n this.el.y(y)\r\n } else if (coord.y !== false) {\r\n this.el.y(coord.y)\r\n }\r\n\r\n } else if (typeof c == 'object') {\r\n\r\n // keep element within constrained box\r\n if (c.minX != null && x < c.minX) {\r\n x = c.minX\r\n gx = x - this.startPoints.box.x\r\n } else if (c.maxX != null && x > c.maxX - box.width) {\r\n x = c.maxX - box.width\r\n gx = x - this.startPoints.box.x\r\n } if (c.minY != null && y < c.minY) {\r\n y = c.minY\r\n gy = y - this.startPoints.box.y\r\n } else if (c.maxY != null && y > c.maxY - box.height) {\r\n y = c.maxY - box.height\r\n gy = y - this.startPoints.box.y\r\n }\r\n\r\n if (c.snapToGrid != null) {\r\n x = x - (x % c.snapToGrid)\r\n y = y - (y % c.snapToGrid)\r\n gx = gx - (gx % c.snapToGrid)\r\n gy = gy - (gy % c.snapToGrid)\r\n }\r\n\r\n if(this.el instanceof SVG.G)\r\n this.el.matrix(this.startPoints.transform).transform({x:gx, y: gy}, true)\r\n else\r\n this.el.move(x, y)\r\n }\r\n\r\n // so we can use it in the end-method, too\r\n return p\r\n }\r\n\r\n DragHandler.prototype.end = function(e){\r\n\r\n // final drag\r\n var p = this.drag(e);\r\n\r\n // fire dragend event\r\n this.el.fire('dragend', { event: e, p: p, m: this.m, handler: this })\r\n\r\n // unbind events\r\n SVG.off(window, 'mousemove.drag')\r\n SVG.off(window, 'touchmove.drag')\r\n SVG.off(window, 'mouseup.drag')\r\n SVG.off(window, 'touchend.drag')\r\n\r\n }\r\n\r\n SVG.extend(SVG.Element, {\r\n // Make element draggable\r\n // Constraint might be an object (as described in readme.md) or a function in the form \"function (x, y)\" that gets called before every move.\r\n // The function can return a boolean or an object of the form {x, y}, to which the element will be moved. \"False\" skips moving, true moves to raw x, y.\r\n draggable: function(value, constraint) {\r\n\r\n // Check the parameters and reassign if needed\r\n if (typeof value == 'function' || typeof value == 'object') {\r\n constraint = value\r\n value = true\r\n }\r\n\r\n var dragHandler = this.remember('_draggable') || new DragHandler(this)\r\n\r\n // When no parameter is given, value is true\r\n value = typeof value === 'undefined' ? true : value\r\n\r\n if(value) dragHandler.init(constraint || {}, value)\r\n else {\r\n this.off('mousedown.drag')\r\n this.off('touchstart.drag')\r\n }\r\n\r\n return this\r\n }\r\n\r\n })\r\n\r\n}).call(this);\r\n","/*!\n* svg.resize.js - An extension for svg.js which allows to resize elements which are selected\n* @version 1.4.3\n* https://github.com/svgdotjs/svg.resize.js\n*\n* @copyright [object Object]\n* @license MIT\n*/;\n;(function() {\n\"use strict\";\n\n;(function () {\r\n\r\n function ResizeHandler(el) {\r\n\r\n el.remember('_resizeHandler', this);\r\n\r\n this.el = el;\r\n this.parameters = {};\r\n this.lastUpdateCall = null;\r\n this.p = el.doc().node.createSVGPoint();\r\n }\r\n\r\n ResizeHandler.prototype.transformPoint = function(x, y, m){\r\n\r\n this.p.x = x - (this.offset.x - window.pageXOffset);\r\n this.p.y = y - (this.offset.y - window.pageYOffset);\r\n\r\n return this.p.matrixTransform(m || this.m);\r\n\r\n };\r\n\r\n ResizeHandler.prototype._extractPosition = function(event) {\r\n // Extract a position from a mouse/touch event.\r\n // Returns { x: .., y: .. }\r\n return {\r\n x: event.clientX != null ? event.clientX : event.touches[0].clientX,\r\n y: event.clientY != null ? event.clientY : event.touches[0].clientY\r\n }\r\n };\r\n\r\n ResizeHandler.prototype.init = function (options) {\r\n\r\n var _this = this;\r\n\r\n this.stop();\r\n\r\n if (options === 'stop') {\r\n return;\r\n }\r\n\r\n this.options = {};\r\n\r\n // Merge options and defaults\r\n for (var i in this.el.resize.defaults) {\r\n this.options[i] = this.el.resize.defaults[i];\r\n if (typeof options[i] !== 'undefined') {\r\n this.options[i] = options[i];\r\n }\r\n }\r\n\r\n // We listen to all these events which are specifying different edges\r\n this.el.on('lt.resize', function(e){ _this.resize(e || window.event); }); // Left-Top\r\n this.el.on('rt.resize', function(e){ _this.resize(e || window.event); }); // Right-Top\r\n this.el.on('rb.resize', function(e){ _this.resize(e || window.event); }); // Right-Bottom\r\n this.el.on('lb.resize', function(e){ _this.resize(e || window.event); }); // Left-Bottom\r\n\r\n this.el.on('t.resize', function(e){ _this.resize(e || window.event); }); // Top\r\n this.el.on('r.resize', function(e){ _this.resize(e || window.event); }); // Right\r\n this.el.on('b.resize', function(e){ _this.resize(e || window.event); }); // Bottom\r\n this.el.on('l.resize', function(e){ _this.resize(e || window.event); }); // Left\r\n\r\n this.el.on('rot.resize', function(e){ _this.resize(e || window.event); }); // Rotation\r\n\r\n this.el.on('point.resize', function(e){ _this.resize(e || window.event); }); // Point-Moving\r\n\r\n // This call ensures, that the plugin reacts to a change of snapToGrid immediately\r\n this.update();\r\n\r\n };\r\n\r\n ResizeHandler.prototype.stop = function(){\r\n this.el.off('lt.resize');\r\n this.el.off('rt.resize');\r\n this.el.off('rb.resize');\r\n this.el.off('lb.resize');\r\n\r\n this.el.off('t.resize');\r\n this.el.off('r.resize');\r\n this.el.off('b.resize');\r\n this.el.off('l.resize');\r\n\r\n this.el.off('rot.resize');\r\n\r\n this.el.off('point.resize');\r\n\r\n return this;\r\n };\r\n\r\n ResizeHandler.prototype.resize = function (event) {\r\n\r\n var _this = this;\r\n\r\n this.m = this.el.node.getScreenCTM().inverse();\r\n this.offset = { x: window.pageXOffset, y: window.pageYOffset };\r\n\r\n var txPt = this._extractPosition(event.detail.event);\r\n this.parameters = {\r\n type: this.el.type, // the type of element\r\n p: this.transformPoint(txPt.x, txPt.y),\r\n x: event.detail.x, // x-position of the mouse when resizing started\r\n y: event.detail.y, // y-position of the mouse when resizing started\r\n box: this.el.bbox(), // The bounding-box of the element\r\n rotation: this.el.transform().rotation // The current rotation of the element\r\n };\r\n\r\n // Add font-size parameter if the element type is text\r\n if (this.el.type === \"text\") {\r\n this.parameters.fontSize = this.el.attr()[\"font-size\"];\r\n }\r\n\r\n // the i-param in the event holds the index of the point which is moved, when using `deepSelect`\r\n if (event.detail.i !== undefined) {\r\n\r\n // get the point array\r\n var array = this.el.array().valueOf();\r\n\r\n // Save the index and the point which is moved\r\n this.parameters.i = event.detail.i;\r\n this.parameters.pointCoords = [array[event.detail.i][0], array[event.detail.i][1]];\r\n }\r\n\r\n // Lets check which edge of the bounding-box was clicked and resize the this.el according to this\r\n switch (event.type) {\r\n\r\n // Left-Top-Edge\r\n case 'lt':\r\n // We build a calculating function for every case which gives us the new position of the this.el\r\n this.calc = function (diffX, diffY) {\r\n // The procedure is always the same\r\n // First we snap the edge to the given grid (snapping to 1px grid is normal resizing)\r\n var snap = this.snapToGrid(diffX, diffY);\r\n\r\n // Now we check if the new height and width still valid (> 0)\r\n if (this.parameters.box.width - snap[0] > 0 && this.parameters.box.height - snap[1] > 0) {\r\n // ...if valid, we resize the this.el (which can include moving because the coord-system starts at the left-top and this edge is moving sometimes when resized)\r\n\r\n /*\r\n * but first check if the element is text box, so we can change the font size instead of\r\n * the width and height\r\n */\r\n\r\n if (this.parameters.type === \"text\") {\r\n this.el.move(this.parameters.box.x + snap[0], this.parameters.box.y);\r\n this.el.attr(\"font-size\", this.parameters.fontSize - snap[0]);\r\n return;\r\n }\r\n\r\n snap = this.checkAspectRatio(snap);\r\n\r\n this.el.move(this.parameters.box.x + snap[0], this.parameters.box.y + snap[1]).size(this.parameters.box.width - snap[0], this.parameters.box.height - snap[1]);\r\n }\r\n };\r\n break;\r\n\r\n // Right-Top\r\n case 'rt':\r\n // s.a.\r\n this.calc = function (diffX, diffY) {\r\n var snap = this.snapToGrid(diffX, diffY, 1 << 1);\r\n if (this.parameters.box.width + snap[0] > 0 && this.parameters.box.height - snap[1] > 0) {\r\n if (this.parameters.type === \"text\") {\r\n this.el.move(this.parameters.box.x - snap[0], this.parameters.box.y);\r\n this.el.attr(\"font-size\", this.parameters.fontSize + snap[0]);\r\n return;\r\n }\r\n\r\n snap = this.checkAspectRatio(snap, true);\r\n\r\n this.el.move(this.parameters.box.x, this.parameters.box.y + snap[1]).size(this.parameters.box.width + snap[0], this.parameters.box.height - snap[1]);\r\n }\r\n };\r\n break;\r\n\r\n // Right-Bottom\r\n case 'rb':\r\n // s.a.\r\n this.calc = function (diffX, diffY) {\r\n var snap = this.snapToGrid(diffX, diffY, 0);\r\n if (this.parameters.box.width + snap[0] > 0 && this.parameters.box.height + snap[1] > 0) {\r\n if (this.parameters.type === \"text\") {\r\n this.el.move(this.parameters.box.x - snap[0], this.parameters.box.y);\r\n this.el.attr(\"font-size\", this.parameters.fontSize + snap[0]);\r\n return;\r\n }\r\n\r\n snap = this.checkAspectRatio(snap);\r\n\r\n this.el.move(this.parameters.box.x, this.parameters.box.y).size(this.parameters.box.width + snap[0], this.parameters.box.height + snap[1]);\r\n }\r\n };\r\n break;\r\n\r\n // Left-Bottom\r\n case 'lb':\r\n // s.a.\r\n this.calc = function (diffX, diffY) {\r\n var snap = this.snapToGrid(diffX, diffY, 1);\r\n if (this.parameters.box.width - snap[0] > 0 && this.parameters.box.height + snap[1] > 0) {\r\n if (this.parameters.type === \"text\") {\r\n this.el.move(this.parameters.box.x + snap[0], this.parameters.box.y);\r\n this.el.attr(\"font-size\", this.parameters.fontSize - snap[0]);\r\n return;\r\n }\r\n\r\n snap = this.checkAspectRatio(snap, true);\r\n\r\n this.el.move(this.parameters.box.x + snap[0], this.parameters.box.y).size(this.parameters.box.width - snap[0], this.parameters.box.height + snap[1]);\r\n }\r\n };\r\n break;\r\n\r\n // Top\r\n case 't':\r\n // s.a.\r\n this.calc = function (diffX, diffY) {\r\n var snap = this.snapToGrid(diffX, diffY, 1 << 1);\r\n if (this.parameters.box.height - snap[1] > 0) {\r\n // Disable the font-resizing if it is not from the corner of bounding-box\r\n if (this.parameters.type === \"text\") {\r\n return;\r\n }\r\n\r\n this.el.move(this.parameters.box.x, this.parameters.box.y + snap[1]).height(this.parameters.box.height - snap[1]);\r\n }\r\n };\r\n break;\r\n\r\n // Right\r\n case 'r':\r\n // s.a.\r\n this.calc = function (diffX, diffY) {\r\n var snap = this.snapToGrid(diffX, diffY, 0);\r\n if (this.parameters.box.width + snap[0] > 0) {\r\n if (this.parameters.type === \"text\") {\r\n return;\r\n }\r\n\r\n this.el.move(this.parameters.box.x, this.parameters.box.y).width(this.parameters.box.width + snap[0]);\r\n }\r\n };\r\n break;\r\n\r\n // Bottom\r\n case 'b':\r\n // s.a.\r\n this.calc = function (diffX, diffY) {\r\n var snap = this.snapToGrid(diffX, diffY, 0);\r\n if (this.parameters.box.height + snap[1] > 0) {\r\n if (this.parameters.type === \"text\") {\r\n return;\r\n }\r\n\r\n this.el.move(this.parameters.box.x, this.parameters.box.y).height(this.parameters.box.height + snap[1]);\r\n }\r\n };\r\n break;\r\n\r\n // Left\r\n case 'l':\r\n // s.a.\r\n this.calc = function (diffX, diffY) {\r\n var snap = this.snapToGrid(diffX, diffY, 1);\r\n if (this.parameters.box.width - snap[0] > 0) {\r\n if (this.parameters.type === \"text\") {\r\n return;\r\n }\r\n\r\n this.el.move(this.parameters.box.x + snap[0], this.parameters.box.y).width(this.parameters.box.width - snap[0]);\r\n }\r\n };\r\n break;\r\n\r\n // Rotation\r\n case 'rot':\r\n // s.a.\r\n this.calc = function (diffX, diffY) {\r\n\r\n // yes this is kinda stupid but we need the mouse coords back...\r\n var current = {x: diffX + this.parameters.p.x, y: diffY + this.parameters.p.y};\r\n\r\n // start minus middle\r\n var sAngle = Math.atan2((this.parameters.p.y - this.parameters.box.y - this.parameters.box.height / 2), (this.parameters.p.x - this.parameters.box.x - this.parameters.box.width / 2));\r\n\r\n // end minus middle\r\n var pAngle = Math.atan2((current.y - this.parameters.box.y - this.parameters.box.height / 2), (current.x - this.parameters.box.x - this.parameters.box.width / 2));\r\n\r\n var angle = this.parameters.rotation + (pAngle - sAngle) * 180 / Math.PI + this.options.snapToAngle / 2;\r\n\r\n // We have to move the element to the center of the box first and change the rotation afterwards\r\n // because rotation always works around a rotation-center, which is changed when moving the element\r\n // We also set the new rotation center to the center of the box.\r\n this.el.center(this.parameters.box.cx, this.parameters.box.cy).rotate(angle - (angle % this.options.snapToAngle), this.parameters.box.cx, this.parameters.box.cy);\r\n };\r\n break;\r\n\r\n // Moving one single Point (needed when an element is deepSelected which means you can move every single point of the object)\r\n case 'point':\r\n this.calc = function (diffX, diffY) {\r\n\r\n // Snapping the point to the grid\r\n var snap = this.snapToGrid(diffX, diffY, this.parameters.pointCoords[0], this.parameters.pointCoords[1]);\r\n\r\n // Get the point array\r\n var array = this.el.array().valueOf();\r\n\r\n // Changing the moved point in the array\r\n array[this.parameters.i][0] = this.parameters.pointCoords[0] + snap[0];\r\n array[this.parameters.i][1] = this.parameters.pointCoords[1] + snap[1];\r\n\r\n // And plot the new this.el\r\n this.el.plot(array);\r\n };\r\n }\r\n\r\n this.el.fire('resizestart', {dx: this.parameters.x, dy: this.parameters.y, event: event});\r\n // When resizing started, we have to register events for...\r\n // Touches.\r\n SVG.on(window, 'touchmove.resize', function(e) {\r\n _this.update(e || window.event);\r\n });\r\n SVG.on(window, 'touchend.resize', function() {\r\n _this.done();\r\n });\r\n // Mouse.\r\n SVG.on(window, 'mousemove.resize', function (e) {\r\n _this.update(e || window.event);\r\n });\r\n SVG.on(window, 'mouseup.resize', function () {\r\n _this.done();\r\n });\r\n\r\n };\r\n\r\n // The update-function redraws the element every time the mouse is moving\r\n ResizeHandler.prototype.update = function (event) {\r\n\r\n if (!event) {\r\n if (this.lastUpdateCall) {\r\n this.calc(this.lastUpdateCall[0], this.lastUpdateCall[1]);\r\n }\r\n return;\r\n }\r\n\r\n // Calculate the difference between the mouseposition at start and now\r\n var txPt = this._extractPosition(event);\r\n var p = this.transformPoint(txPt.x, txPt.y);\r\n\r\n var diffX = p.x - this.parameters.p.x,\r\n diffY = p.y - this.parameters.p.y;\r\n\r\n this.lastUpdateCall = [diffX, diffY];\r\n\r\n // Calculate the new position and height / width of the element\r\n this.calc(diffX, diffY);\r\n\r\n // Emit an event to say we have changed.\r\n this.el.fire('resizing', {dx: diffX, dy: diffY, event: event});\r\n };\r\n\r\n // Is called on mouseup.\r\n // Removes the update-function from the mousemove event\r\n ResizeHandler.prototype.done = function () {\r\n this.lastUpdateCall = null;\r\n SVG.off(window, 'mousemove.resize');\r\n SVG.off(window, 'mouseup.resize');\r\n SVG.off(window, 'touchmove.resize');\r\n SVG.off(window, 'touchend.resize');\r\n this.el.fire('resizedone');\r\n };\r\n\r\n // The flag is used to determine whether the resizing is used with a left-Point (first bit) and top-point (second bit)\r\n // In this cases the temp-values are calculated differently\r\n ResizeHandler.prototype.snapToGrid = function (diffX, diffY, flag, pointCoordsY) {\r\n\r\n var temp;\r\n\r\n // If `pointCoordsY` is given, a single Point has to be snapped (deepSelect). That's why we need a different temp-value\r\n if (typeof pointCoordsY !== 'undefined') {\r\n // Note that flag = pointCoordsX in this case\r\n temp = [(flag + diffX) % this.options.snapToGrid, (pointCoordsY + diffY) % this.options.snapToGrid];\r\n } else {\r\n // We check if the flag is set and if not we set a default-value (both bits set - which means upper-left-edge)\r\n flag = flag == null ? 1 | 1 << 1 : flag;\r\n temp = [(this.parameters.box.x + diffX + (flag & 1 ? 0 : this.parameters.box.width)) % this.options.snapToGrid, (this.parameters.box.y + diffY + (flag & (1 << 1) ? 0 : this.parameters.box.height)) % this.options.snapToGrid];\r\n }\r\n\r\n if(diffX < 0) {\r\n temp[0] -= this.options.snapToGrid;\r\n }\r\n if(diffY < 0) {\r\n temp[1] -= this.options.snapToGrid;\r\n }\r\n\r\n diffX -= (Math.abs(temp[0]) < this.options.snapToGrid / 2 ?\r\n temp[0] :\r\n temp[0] - (diffX < 0 ? -this.options.snapToGrid : this.options.snapToGrid));\r\n diffY -= (Math.abs(temp[1]) < this.options.snapToGrid / 2 ?\r\n temp[1] :\r\n temp[1] - (diffY < 0 ? -this.options.snapToGrid : this.options.snapToGrid));\r\n\r\n return this.constraintToBox(diffX, diffY, flag, pointCoordsY);\r\n\r\n };\r\n\r\n // keep element within constrained box\r\n ResizeHandler.prototype.constraintToBox = function (diffX, diffY, flag, pointCoordsY) {\r\n //return [diffX, diffY]\r\n var c = this.options.constraint || {};\r\n var orgX, orgY;\r\n\r\n if (typeof pointCoordsY !== 'undefined') {\r\n orgX = flag;\r\n orgY = pointCoordsY;\r\n } else {\r\n orgX = this.parameters.box.x + (flag & 1 ? 0 : this.parameters.box.width);\r\n orgY = this.parameters.box.y + (flag & (1<<1) ? 0 : this.parameters.box.height);\r\n }\r\n\r\n if (typeof c.minX !== 'undefined' && orgX + diffX < c.minX) {\r\n diffX = c.minX - orgX;\r\n }\r\n\r\n if (typeof c.maxX !== 'undefined' && orgX + diffX > c.maxX) {\r\n diffX = c.maxX - orgX;\r\n }\r\n\r\n if (typeof c.minY !== 'undefined' && orgY + diffY < c.minY) {\r\n diffY = c.minY - orgY;\r\n }\r\n\r\n if (typeof c.maxY !== 'undefined' && orgY + diffY > c.maxY) {\r\n diffY = c.maxY - orgY;\r\n }\r\n\r\n return [diffX, diffY];\r\n };\r\n\r\n ResizeHandler.prototype.checkAspectRatio = function (snap, isReverse) {\r\n if (!this.options.saveAspectRatio) {\r\n return snap;\r\n }\r\n\r\n var updatedSnap = snap.slice();\r\n var aspectRatio = this.parameters.box.width / this.parameters.box.height;\r\n var newW = this.parameters.box.width + snap[0];\r\n var newH = this.parameters.box.height - snap[1];\r\n var newAspectRatio = newW / newH;\r\n\r\n if (newAspectRatio < aspectRatio) {\r\n // Height is too big. Adapt it\r\n updatedSnap[1] = newW / aspectRatio - this.parameters.box.height;\r\n isReverse && (updatedSnap[1] = -updatedSnap[1]);\r\n } else if (newAspectRatio > aspectRatio) {\r\n // Width is too big. Adapt it\r\n updatedSnap[0] = this.parameters.box.width - newH * aspectRatio;\r\n isReverse && (updatedSnap[0] = -updatedSnap[0]);\r\n }\r\n\r\n return updatedSnap;\r\n };\r\n\r\n SVG.extend(SVG.Element, {\r\n // Resize element with mouse\r\n resize: function (options) {\r\n\r\n (this.remember('_resizeHandler') || new ResizeHandler(this)).init(options || {});\r\n\r\n return this;\r\n\r\n }\r\n\r\n });\r\n\r\n SVG.Element.prototype.resize.defaults = {\r\n snapToAngle: 0.1, // Specifies the speed the rotation is happening when moving the mouse\r\n snapToGrid: 1, // Snaps to a grid of `snapToGrid` Pixels\r\n constraint: {}, // keep element within constrained box\r\n saveAspectRatio: false // Save aspect ratio when resizing using lt, rt, rb or lb points\r\n };\r\n\r\n}).call(this);\n}());\n","/*!\n* svg.select.js - An extension of svg.js which allows to select elements with mouse\n* @version 3.0.1\n* https://github.com/svgdotjs/svg.select.js\n*\n* @copyright Ulrich-Matthias Schäfer\n* @license MIT\n*/;\n;(function() {\n\"use strict\";\n\nfunction SelectHandler(el) {\r\n\r\n this.el = el;\r\n el.remember('_selectHandler', this);\r\n this.pointSelection = {isSelected: false};\r\n this.rectSelection = {isSelected: false};\r\n\r\n // helper list with position settings of each type of point\r\n this.pointsList = {\r\n lt: [ 0, 0 ],\r\n rt: [ 'width', 0 ],\r\n rb: [ 'width', 'height' ],\r\n lb: [ 0, 'height' ],\r\n t: [ 'width', 0 ],\r\n r: [ 'width', 'height' ],\r\n b: [ 'width', 'height' ],\r\n l: [ 0, 'height' ]\r\n };\r\n\r\n // helper function to get point coordinates based on settings above and an object (bbox in our case)\r\n this.pointCoord = function (setting, object, isPointCentered) {\r\n var coord = typeof setting !== 'string' ? setting : object[setting];\r\n // Top, bottom, right and left points are placed in the center of element width/height\r\n return isPointCentered ? coord / 2 : coord\r\n }\r\n\r\n this.pointCoords = function (point, object) {\r\n var settings = this.pointsList[point];\r\n\r\n return {\r\n x: this.pointCoord(settings[0], object, (point === 't' || point === 'b')),\r\n y: this.pointCoord(settings[1], object, (point === 'r' || point === 'l'))\r\n }\r\n }\r\n}\r\n\r\nSelectHandler.prototype.init = function (value, options) {\r\n\r\n var bbox = this.el.bbox();\r\n this.options = {};\r\n\r\n // store defaults list of points in order to verify users config\r\n var points = this.el.selectize.defaults.points;\r\n\r\n // Merging the defaults and the options-object together\r\n for (var i in this.el.selectize.defaults) {\r\n this.options[i] = this.el.selectize.defaults[i];\r\n if (options[i] !== undefined) {\r\n this.options[i] = options[i];\r\n }\r\n }\r\n\r\n // prepare & validate list of points to be added (or excluded)\r\n var pointsLists = ['points', 'pointsExclude'];\r\n\r\n for (var i in pointsLists) {\r\n var option = this.options[pointsLists[i]];\r\n\r\n if (typeof option === 'string') {\r\n if (option.length > 0) {\r\n // if set as comma separated string list => convert it into an array\r\n option = option.split(/\\s*,\\s*/i);\r\n } else {\r\n option = [];\r\n }\r\n } else if (typeof option === 'boolean' && pointsLists[i] === 'points') {\r\n // this is not needed, but let's have it for legacy support\r\n option = option ? points : [];\r\n }\r\n\r\n this.options[pointsLists[i]] = option;\r\n }\r\n\r\n // intersect correct all points options with users config (exclude unwanted points)\r\n // ES5 -> NO arrow functions nor Array.includes()\r\n this.options.points = [ points, this.options.points ].reduce(\r\n function (a, b) {\r\n return a.filter(\r\n function (c) {\r\n return b.indexOf(c) > -1;\r\n }\r\n )\r\n }\r\n );\r\n\r\n // exclude pointsExclude, if wanted\r\n this.options.points = [ this.options.points, this.options.pointsExclude ].reduce(\r\n function (a, b) {\r\n return a.filter(\r\n function (c) {\r\n return b.indexOf(c) < 0;\r\n }\r\n )\r\n }\r\n );\r\n\r\n this.parent = this.el.parent();\r\n this.nested = (this.nested || this.parent.group());\r\n this.nested.matrix(new SVG.Matrix(this.el).translate(bbox.x, bbox.y));\r\n\r\n // When deepSelect is enabled and the element is a line/polyline/polygon, draw only points for moving\r\n if (this.options.deepSelect && ['line', 'polyline', 'polygon'].indexOf(this.el.type) !== -1) {\r\n this.selectPoints(value);\r\n } else {\r\n this.selectRect(value);\r\n }\r\n\r\n this.observe();\r\n this.cleanup();\r\n\r\n};\r\n\r\nSelectHandler.prototype.selectPoints = function (value) {\r\n\r\n this.pointSelection.isSelected = value;\r\n\r\n // When set is already there we dont have to create one\r\n if (this.pointSelection.set) {\r\n return this;\r\n }\r\n\r\n // Create our set of elements\r\n this.pointSelection.set = this.parent.set();\r\n // draw the points and mark the element as selected\r\n this.drawPoints();\r\n\r\n return this;\r\n\r\n};\r\n\r\n// create the point-array which contains the 2 points of a line or simply the points-array of polyline/polygon\r\nSelectHandler.prototype.getPointArray = function () {\r\n var bbox = this.el.bbox();\r\n\r\n return this.el.array().valueOf().map(function (el) {\r\n return [el[0] - bbox.x, el[1] - bbox.y];\r\n });\r\n};\r\n\r\n// Draws a points\r\nSelectHandler.prototype.drawPoints = function () {\r\n\r\n var _this = this, array = this.getPointArray();\r\n\r\n // go through the array of points\r\n for (var i = 0, len = array.length; i < len; ++i) {\r\n\r\n var curriedEvent = (function (k) {\r\n return function (ev) {\r\n ev = ev || window.event;\r\n ev.preventDefault ? ev.preventDefault() : ev.returnValue = false;\r\n ev.stopPropagation();\r\n\r\n var x = ev.pageX || ev.touches[0].pageX;\r\n var y = ev.pageY || ev.touches[0].pageY;\r\n _this.el.fire('point', {x: x, y: y, i: k, event: ev});\r\n };\r\n })(i);\r\n\r\n // add every point to the set\r\n // add css-classes and a touchstart-event which fires our event for moving points\r\n var point = this.drawPoint(array[i][0], array[i][1])\r\n .addClass(this.options.classPoints)\r\n .addClass(this.options.classPoints + '_point')\r\n .on('touchstart', curriedEvent)\r\n .on('mousedown', curriedEvent)\r\n this.pointSelection.set.add(point);\r\n }\r\n};\r\n\r\n// The function to draw single point\r\nSelectHandler.prototype.drawPoint = function (cx, cy) {\r\n var pointType = this.options.pointType;\r\n\r\n switch (pointType) {\r\n case 'circle':\r\n return this.drawCircle(cx, cy);\r\n case 'rect':\r\n return this.drawRect(cx, cy);\r\n default:\r\n if (typeof pointType === 'function') {\r\n return pointType.call(this, cx, cy);\r\n }\r\n\r\n throw new Error('Unknown ' + pointType + ' point type!');\r\n }\r\n};\r\n\r\n// The function to draw the circle point\r\nSelectHandler.prototype.drawCircle = function (cx, cy) {\r\n return this.nested.circle(this.options.pointSize)\r\n .center(cx, cy);\r\n};\r\n\r\n// The function to draw the rect point\r\nSelectHandler.prototype.drawRect = function (cx, cy) {\r\n return this.nested.rect(this.options.pointSize, this.options.pointSize)\r\n .center(cx, cy);\r\n};\r\n\r\n// every time a point is moved, we have to update the positions of our point\r\nSelectHandler.prototype.updatePointSelection = function () {\r\n var array = this.getPointArray();\r\n\r\n this.pointSelection.set.each(function (i) {\r\n if (this.cx() === array[i][0] && this.cy() === array[i][1]) {\r\n return;\r\n }\r\n this.center(array[i][0], array[i][1]);\r\n });\r\n};\r\n\r\nSelectHandler.prototype.updateRectSelection = function () {\r\n var _this = this, bbox = this.el.bbox();\r\n\r\n this.rectSelection.set.get(0).attr({\r\n width: bbox.width,\r\n height: bbox.height\r\n });\r\n\r\n // set.get(1) is always in the upper left corner. no need to move it\r\n if (this.options.points.length) {\r\n this.options.points.map(function (point, index) {\r\n var coords = _this.pointCoords(point, bbox);\r\n\r\n _this.rectSelection.set.get(index + 1).center(coords.x, coords.y);\r\n });\r\n }\r\n\r\n if (this.options.rotationPoint) {\r\n var length = this.rectSelection.set.length();\r\n\r\n this.rectSelection.set.get(length - 1).center(bbox.width / 2, 20);\r\n }\r\n};\r\n\r\nSelectHandler.prototype.selectRect = function (value) {\r\n\r\n var _this = this, bbox = this.el.bbox();\r\n\r\n this.rectSelection.isSelected = value;\r\n\r\n // when set is already p\r\n this.rectSelection.set = this.rectSelection.set || this.parent.set();\r\n\r\n // helperFunction to create a mouse-down function which triggers the event specified in `eventName`\r\n function getMoseDownFunc(eventName) {\r\n return function (ev) {\r\n ev = ev || window.event;\r\n ev.preventDefault ? ev.preventDefault() : ev.returnValue = false;\r\n ev.stopPropagation();\r\n\r\n var x = ev.pageX || ev.touches[0].pageX;\r\n var y = ev.pageY || ev.touches[0].pageY;\r\n _this.el.fire(eventName, {x: x, y: y, event: ev});\r\n };\r\n }\r\n\r\n // create the selection-rectangle and add the css-class\r\n if (!this.rectSelection.set.get(0)) {\r\n this.rectSelection.set.add(this.nested.rect(bbox.width, bbox.height).addClass(this.options.classRect));\r\n }\r\n\r\n // Draw Points at the edges, if enabled\r\n if (this.options.points.length && this.rectSelection.set.length() < 2) {\r\n var ename =\"touchstart\", mname = \"mousedown\";\r\n\r\n this.options.points.map(function (point, index) {\r\n var coords = _this.pointCoords(point, bbox);\r\n\r\n var pointElement = _this.drawPoint(coords.x, coords.y)\r\n .attr('class', _this.options.classPoints + '_' + point)\r\n .on(mname, getMoseDownFunc(point))\r\n .on(ename, getMoseDownFunc(point));\r\n _this.rectSelection.set.add(pointElement);\r\n });\r\n\r\n this.rectSelection.set.each(function () {\r\n this.addClass(_this.options.classPoints);\r\n });\r\n }\r\n\r\n // draw rotationPint, if enabled\r\n if (this.options.rotationPoint && ((this.options.points && !this.rectSelection.set.get(9)) || (!this.options.points && !this.rectSelection.set.get(1)))) {\r\n\r\n var curriedEvent = function (ev) {\r\n ev = ev || window.event;\r\n ev.preventDefault ? ev.preventDefault() : ev.returnValue = false;\r\n ev.stopPropagation();\r\n\r\n var x = ev.pageX || ev.touches[0].pageX;\r\n var y = ev.pageY || ev.touches[0].pageY;\r\n _this.el.fire('rot', {x: x, y: y, event: ev});\r\n };\r\n\r\n var pointElement = this.drawPoint(bbox.width / 2, 20)\r\n .attr('class', this.options.classPoints + '_rot')\r\n .on(\"touchstart\", curriedEvent)\r\n .on(\"mousedown\", curriedEvent);\r\n this.rectSelection.set.add(pointElement);\r\n }\r\n\r\n};\r\n\r\nSelectHandler.prototype.handler = function () {\r\n\r\n var bbox = this.el.bbox();\r\n this.nested.matrix(new SVG.Matrix(this.el).translate(bbox.x, bbox.y));\r\n\r\n if (this.rectSelection.isSelected) {\r\n this.updateRectSelection();\r\n }\r\n\r\n if (this.pointSelection.isSelected) {\r\n this.updatePointSelection();\r\n }\r\n\r\n};\r\n\r\nSelectHandler.prototype.observe = function () {\r\n var _this = this;\r\n\r\n if (MutationObserver) {\r\n if (this.rectSelection.isSelected || this.pointSelection.isSelected) {\r\n this.observerInst = this.observerInst || new MutationObserver(function () {\r\n _this.handler();\r\n });\r\n this.observerInst.observe(this.el.node, {attributes: true});\r\n } else {\r\n try {\r\n this.observerInst.disconnect();\r\n delete this.observerInst;\r\n } catch (e) {\r\n }\r\n }\r\n } else {\r\n this.el.off('DOMAttrModified.select');\r\n\r\n if (this.rectSelection.isSelected || this.pointSelection.isSelected) {\r\n this.el.on('DOMAttrModified.select', function () {\r\n _this.handler();\r\n });\r\n }\r\n }\r\n};\r\n\r\nSelectHandler.prototype.cleanup = function () {\r\n\r\n //var _this = this;\r\n\r\n if (!this.rectSelection.isSelected && this.rectSelection.set) {\r\n // stop watching the element, remove the selection\r\n this.rectSelection.set.each(function () {\r\n this.remove();\r\n });\r\n\r\n this.rectSelection.set.clear();\r\n delete this.rectSelection.set;\r\n }\r\n\r\n if (!this.pointSelection.isSelected && this.pointSelection.set) {\r\n // Remove all points, clear the set, stop watching the element\r\n this.pointSelection.set.each(function () {\r\n this.remove();\r\n });\r\n\r\n this.pointSelection.set.clear();\r\n delete this.pointSelection.set;\r\n }\r\n\r\n if (!this.pointSelection.isSelected && !this.rectSelection.isSelected) {\r\n this.nested.remove();\r\n delete this.nested;\r\n\r\n }\r\n};\r\n\r\n\r\nSVG.extend(SVG.Element, {\r\n // Select element with mouse\r\n selectize: function (value, options) {\r\n\r\n // Check the parameters and reassign if needed\r\n if (typeof value === 'object') {\r\n options = value;\r\n value = true;\r\n }\r\n\r\n var selectHandler = this.remember('_selectHandler') || new SelectHandler(this);\r\n\r\n selectHandler.init(value === undefined ? true : value, options || {});\r\n\r\n return this;\r\n\r\n }\r\n});\r\n\r\nSVG.Element.prototype.selectize.defaults = {\r\n points: ['lt', 'rt', 'rb', 'lb', 't', 'r', 'b', 'l'], // which points to draw, default all\r\n pointsExclude: [], // easier option if to exclude few than rewrite all\r\n classRect: 'svg_select_boundingRect', // Css-class added to the rect\r\n classPoints: 'svg_select_points', // Css-class added to the points\r\n pointSize: 7, // size of point\r\n rotationPoint: true, // If true, rotation point is drawn. Needed for rotation!\r\n deepSelect: false, // If true, moving of single points is possible (only line, polyline, polyon)\r\n pointType: 'circle' // Point type: circle or rect, default circle\r\n};\n}());\n","/*! svg.draw.js - v2.0.3 - 2017-06-19\r\n* https://github.com/svgdotjs/svg.draw.js\r\n* Copyright (c) 2017 Ulrich-Matthias Schäfer; Licensed MIT */\r\n\r\n;(function () {\r\n // Our Object which manages drawing\r\n function PaintHandler(el, event, options) {\r\n\r\n this.el = el;\r\n el.remember('_paintHandler', this);\r\n \r\n var _this = this,\r\n plugin = this.getPlugin();\r\n\r\n this.parent = el.parent(SVG.Nested) || el.parent(SVG.Doc);\r\n this.p = this.parent.node.createSVGPoint(); // Helping point for coord transformation\r\n this.m = null; // transformation matrix. We get it when drawing starts\r\n this.startPoint = null;\r\n this.lastUpdateCall = null;\r\n this.options = {};\r\n\r\n // Merge options and defaults\r\n for (var i in this.el.draw.defaults) {\r\n this.options[i] = this.el.draw.defaults[i];\r\n if (typeof options[i] !== 'undefined') {\r\n this.options[i] = options[i];\r\n }\r\n }\r\n \r\n if(plugin.point) {\r\n plugin['pointPlugin'] = plugin.point;\r\n delete plugin.point;\r\n }\r\n \r\n // Import all methods from plugin into object\r\n for (var i in plugin){\r\n this[i] = plugin[i];\r\n }\r\n \r\n // When we got an event, we use this for start, otherwise we use the click-event as default\r\n if (!event) {\r\n this.parent.on('click.draw', function (e) {\r\n _this.start(e);\r\n });\r\n\r\n }\r\n\r\n }\r\n\r\n PaintHandler.prototype.transformPoint = function(x, y){\r\n\r\n this.p.x = x - (this.offset.x - window.pageXOffset);\r\n this.p.y = y - (this.offset.y - window.pageYOffset);\r\n \r\n return this.p.matrixTransform(this.m);\r\n \r\n }\r\n \r\n PaintHandler.prototype.start = function (event) {\r\n \r\n var _this = this;\r\n \r\n // get the current transform matrix from screen to element (offset corrected)\r\n this.m = this.el.node.getScreenCTM().inverse();\r\n\r\n // we save the current scrolling-offset here\r\n this.offset = { x: window.pageXOffset, y: window.pageYOffset };\r\n\r\n // we want to snap in screen-coords, so we have to scale the snapToGrid accordingly\r\n this.options.snapToGrid *= Math.sqrt(this.m.a * this.m.a + this.m.b * this.m.b)\r\n\r\n // save the startpoint\r\n this.startPoint = this.snapToGrid(this.transformPoint(event.clientX, event.clientY));\r\n\r\n // the plugin may do some initial work\r\n if(this.init){ this.init(event); }\r\n\r\n // Fire our `drawstart`-event. We send the offset-corrected cursor-position along\r\n this.el.fire('drawstart', {event:event, p:this.p, m:this.m});\r\n\r\n // We need to bind the update-function to the mousemove event to keep track of the cursor\r\n SVG.on(window, 'mousemove.draw', function (e) {\r\n _this.update(e);\r\n });\r\n\r\n // Every consecutive call to start should map to point now\r\n this.start = this.point;\r\n\r\n\r\n };\r\n\r\n // This function draws a point if the element is a polyline or polygon\r\n // Otherwise it will just stop drawing the shape cause we are done\r\n PaintHandler.prototype.point = function (event) {\r\n if (this.point != this.start) return this.start(event);\r\n \r\n if (this.pointPlugin) {\r\n return this.pointPlugin(event);\r\n }\r\n \r\n // If this function is not overwritten we just call stop\r\n this.stop(event);\r\n };\r\n\r\n\r\n // The stop-function does the cleanup work\r\n PaintHandler.prototype.stop = function (event) {\r\n if (event) {\r\n this.update(event);\r\n }\r\n \r\n // Plugin may want to clean something\r\n if(this.clean){ this.clean(); }\r\n\r\n // Unbind from all events\r\n SVG.off(window, 'mousemove.draw');\r\n this.parent.off('click.draw');\r\n\r\n // remove Refernce to PaintHandler\r\n this.el.forget('_paintHandler');\r\n\r\n // overwrite draw-function since we never need it again for this element\r\n this.el.draw = function () {\r\n };\r\n\r\n // Fire the `drawstop`-event\r\n this.el.fire('drawstop');\r\n };\r\n\r\n // Updates the element while moving the cursor\r\n PaintHandler.prototype.update = function (event) {\r\n\r\n if(!event && this.lastUpdateCall){\r\n event = this.lastUpdateCall;\r\n }\r\n \r\n this.lastUpdateCall = event;\r\n \r\n // Call the calc-function which calculates the new position and size\r\n this.calc(event);\r\n\r\n // Fire the `drawupdate`-event\r\n this.el.fire('drawupdate', {event:event, p:this.p, m:this.m});\r\n };\r\n\r\n // Called from outside. Finishs a poly-element\r\n PaintHandler.prototype.done = function () {\r\n this.calc();\r\n this.stop();\r\n\r\n this.el.fire('drawdone');\r\n };\r\n\r\n // Called from outside. Cancels a poly-element\r\n PaintHandler.prototype.cancel = function () {\r\n // stop drawing and remove the element\r\n this.stop();\r\n this.el.remove();\r\n\r\n this.el.fire('drawcancel');\r\n };\r\n\r\n // Calculate the corrected position when using `snapToGrid`\r\n PaintHandler.prototype.snapToGrid = function (draw) {\r\n\r\n var temp = null;\r\n\r\n // An array was given. Loop through every element\r\n if (draw.length) {\r\n temp = [draw[0] % this.options.snapToGrid, draw[1] % this.options.snapToGrid];\r\n draw[0] -= temp[0] < this.options.snapToGrid / 2 ? temp[0] : temp[0] - this.options.snapToGrid;\r\n draw[1] -= temp[1] < this.options.snapToGrid / 2 ? temp[1] : temp[1] - this.options.snapToGrid;\r\n return draw;\r\n }\r\n\r\n // Properties of element were given. Snap them all\r\n for (var i in draw) {\r\n temp = draw[i] % this.options.snapToGrid;\r\n draw[i] -= (temp < this.options.snapToGrid / 2 ? temp : temp - this.options.snapToGrid) + (temp < 0 ? this.options.snapToGrid : 0);\r\n }\r\n\r\n return draw;\r\n };\r\n\r\n PaintHandler.prototype.param = function (key, value) {\r\n this.options[key] = value === null ? this.el.draw.defaults[key] : value;\r\n this.update();\r\n };\r\n\r\n // Returns the plugin\r\n PaintHandler.prototype.getPlugin = function () {\r\n return this.el.draw.plugins[this.el.type];\r\n };\r\n\r\n SVG.extend(SVG.Element, {\r\n // Draw element with mouse\r\n draw: function (event, options, value) {\r\n\r\n // sort the parameters\r\n if (!(event instanceof Event || typeof event === 'string')) {\r\n options = event;\r\n event = null;\r\n }\r\n\r\n // get the old Handler or create a new one from event and options\r\n var paintHandler = this.remember('_paintHandler') || new PaintHandler(this, event, options || {});\r\n\r\n // When we got an event we have to start/continue drawing\r\n if (event instanceof Event) {\r\n paintHandler['start'](event);\r\n }\r\n\r\n // if event is located in our PaintHandler we handle it as method\r\n if (paintHandler[event]) {\r\n paintHandler[event](options, value);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n });\r\n\r\n // Default values. Can be changed for the whole project if needed\r\n SVG.Element.prototype.draw.defaults = {\r\n snapToGrid: 1 // Snaps to a grid of `snapToGrid` px\r\n };\r\n\r\n SVG.Element.prototype.draw.extend = function(name, obj){\r\n\r\n var plugins = {};\r\n if(typeof name === 'string'){\r\n plugins[name] = obj;\r\n }else{\r\n plugins = name;\r\n }\r\n\r\n for(var shapes in plugins){\r\n var shapesArr = shapes.trim().split(/\\s+/);\r\n\r\n for(var i in shapesArr){\r\n SVG.Element.prototype.draw.plugins[shapesArr[i]] = plugins[shapes];\r\n }\r\n }\r\n\r\n };\r\n\r\n // Container for all types not specified here\r\n SVG.Element.prototype.draw.plugins = {};\r\n\r\n SVG.Element.prototype.draw.extend('rect image', {\r\n \r\n init:function(e){\r\n\r\n var p = this.startPoint;\r\n \r\n this.el.attr({ x: p.x, y: p.y, height: 0, width: 0 });\r\n },\r\n \r\n calc:function (e) {\r\n\r\n var rect = {\r\n x: this.startPoint.x,\r\n y: this.startPoint.y\r\n }, p = this.transformPoint(e.clientX, e.clientY);\r\n\r\n rect.width = p.x - rect.x;\r\n rect.height = p.y - rect.y;\r\n\r\n // Snap the params to the grid we specified\r\n this.snapToGrid(rect);\r\n\r\n // When width is less than zero, we have to draw to the left\r\n // which means we have to move the start-point to the left\r\n if (rect.width < 0) {\r\n rect.x = rect.x + rect.width;\r\n rect.width = -rect.width;\r\n }\r\n\r\n // ...same with height\r\n if (rect.height < 0) {\r\n rect.y = rect.y + rect.height;\r\n rect.height = -rect.height;\r\n }\r\n\r\n // draw the element\r\n this.el.attr(rect);\r\n }\r\n \r\n });\r\n\r\n\r\n SVG.Element.prototype.draw.extend('line polyline polygon', {\r\n\r\n init:function(e){\r\n // When we draw a polygon, we immediately need 2 points.\r\n // One start-point and one point at the mouse-position\r\n\r\n this.set = new SVG.Set();\r\n\r\n var p = this.startPoint,\r\n arr = [\r\n [p.x, p.y],\r\n [p.x, p.y]\r\n ];\r\n\r\n this.el.plot(arr);\r\n\r\n // We draw little circles around each point\r\n // This is absolutely not needed and maybe removed in a later release\r\n this.drawCircles();\r\n\r\n },\r\n\r\n\r\n // The calc-function sets the position of the last point to the mouse-position (with offset ofc)\r\n calc:function (e) {\r\n var arr = this.el.array().valueOf();\r\n arr.pop();\r\n\r\n if (e) {\r\n var p = this.transformPoint(e.clientX, e.clientY);\r\n arr.push(this.snapToGrid([p.x, p.y]));\r\n }\r\n\r\n this.el.plot(arr);\r\n\r\n },\r\n\r\n point:function(e){\r\n\r\n if (this.el.type.indexOf('poly') > -1) {\r\n // Add the new Point to the point-array\r\n var p = this.transformPoint(e.clientX, e.clientY),\r\n arr = this.el.array().valueOf();\r\n\r\n arr.push(this.snapToGrid([p.x, p.y]));\r\n\r\n this.el.plot(arr);\r\n this.drawCircles();\r\n\r\n // Fire the `drawpoint`-event, which holds the coords of the new Point\r\n this.el.fire('drawpoint', {event:e, p:{x:p.x, y:p.y}, m:this.m});\r\n\r\n return;\r\n }\r\n\r\n // We are done, if the element is no polyline or polygon\r\n this.stop(e);\r\n\r\n },\r\n\r\n clean:function(){\r\n\r\n // Remove all circles\r\n this.set.each(function () {\r\n this.remove();\r\n });\r\n\r\n this.set.clear();\r\n\r\n delete this.set;\r\n\r\n },\r\n\r\n drawCircles:function () {\r\n var array = this.el.array().valueOf()\r\n\r\n this.set.each(function () {\r\n this.remove();\r\n });\r\n\r\n this.set.clear();\r\n\r\n for (var i = 0; i < array.length; ++i) {\r\n\r\n this.p.x = array[i][0]\r\n this.p.y = array[i][1]\r\n\r\n var p = this.p.matrixTransform(this.parent.node.getScreenCTM().inverse().multiply(this.el.node.getScreenCTM()));\r\n\r\n this.set.add(this.parent.circle(5).stroke({width: 1}).fill('#ccc').center(p.x, p.y));\r\n }\r\n }\r\n\r\n });\r\n\r\n SVG.Element.prototype.draw.extend('circle', {\r\n \r\n init:function(e){\r\n \r\n var p = this.startPoint;\r\n\r\n this.el.attr({ cx: p.x, cy: p.y, r: 1 });\r\n },\r\n\r\n // We determine the radius by the cursor position\r\n calc:function (e) {\r\n \r\n var p = this.transformPoint(e.clientX, e.clientY),\r\n circle = {\r\n cx: this.startPoint.x,\r\n cy: this.startPoint.y,\r\n\r\n // calculating the radius\r\n r: Math.sqrt(\r\n (p.x - this.startPoint.x) * (p.x - this.startPoint.x) +\r\n (p.y - this.startPoint.y) * (p.y - this.startPoint.y)\r\n )\r\n };\r\n \r\n this.snapToGrid(circle);\r\n this.el.attr(circle);\r\n }\r\n \r\n });\r\n\r\n SVG.Element.prototype.draw.extend('ellipse', {\r\n \r\n init:function(e){\r\n // We start with a circle with radius 1 at the position of the cursor\r\n var p = this.startPoint;\r\n\r\n this.el.attr({ cx: p.x, cy: p.y, rx: 1, ry: 1 });\r\n \r\n },\r\n\r\n calc:function (e) {\r\n var p = this.transformPoint(e.clientX, e.clientY);\r\n \r\n var ellipse = {\r\n cx: this.startPoint.x,\r\n cy: this.startPoint.y,\r\n rx: Math.abs(p.x - this.startPoint.x),\r\n ry: Math.abs(p.y - this.startPoint.y)\r\n };\r\n \r\n this.snapToGrid(ellipse);\r\n this.el.attr(ellipse);\r\n }\r\n \r\n });\r\n}).call(this);","/*\n* Copyright (C) 2019 Intel Corporation\n* SPDX-License-Identifier: MIT\n*/\n\nexport interface Master {\n subscribe(listener: Listener): void;\n unsubscribe(listener: Listener): void;\n unsubscribeAll(): void;\n notify(reason: string): void;\n}\n\nexport interface Listener {\n notify(master: Master, reason: string): void;\n}\n\nexport class MasterImpl implements Master {\n private listeners: Listener[];\n\n public constructor() {\n this.listeners = [];\n }\n\n public subscribe(listener: Listener): void {\n this.listeners.push(listener);\n }\n\n public unsubscribe(listener: Listener): void {\n for (let i = 0; i < this.listeners.length; i++) {\n if (this.listeners[i] === listener) {\n this.listeners.splice(i, 1);\n }\n }\n }\n\n public unsubscribeAll(): void {\n this.listeners = [];\n }\n\n public notify(reason: string): void {\n for (const listener of this.listeners) {\n listener.notify(this, reason);\n }\n }\n}\n","/*\n* Copyright (C) 2019 Intel Corporation\n* SPDX-License-Identifier: MIT\n*/\n\n// Disable till full implementation\n/* eslint class-methods-use-this: \"off\" */\n\nimport { MasterImpl } from './master';\n\nexport interface Size {\n width: number;\n height: number;\n}\n\nexport interface Position {\n x: number;\n y: number;\n}\n\nexport interface Geometry {\n image: Size;\n canvas: Size;\n grid: Size;\n top: number;\n left: number;\n scale: number;\n offset: number;\n angle: number;\n}\n\nexport interface FocusData {\n clientID: number;\n padding: number;\n}\n\nexport interface ActiveElement {\n clientID: number;\n attributeID: number;\n}\n\nexport interface DrawData {\n enabled: boolean;\n shapeType?: string;\n numberOfPoints?: number;\n initialState?: any;\n crosshair?: boolean;\n}\n\nexport enum FrameZoom {\n MIN = 0.1,\n MAX = 10,\n}\n\nexport enum Rotation {\n ANTICLOCKWISE90,\n CLOCKWISE90,\n}\n\nexport enum UpdateReasons {\n IMAGE = 'image',\n OBJECTS = 'objects',\n ZOOM = 'zoom',\n FIT = 'fit',\n MOVE = 'move',\n GRID = 'grid',\n FOCUS = 'focus',\n ACTIVATE = 'activate',\n DRAW = 'draw',\n}\n\nexport interface CanvasModel extends MasterImpl {\n readonly image: string;\n readonly objects: any[];\n readonly gridSize: Size;\n readonly focusData: FocusData;\n readonly activeElement: ActiveElement;\n readonly objectStateClass: any;\n readonly drawData: DrawData;\n geometry: Geometry;\n\n zoom(x: number, y: number, direction: number): void;\n move(topOffset: number, leftOffset: number): void;\n\n setup(frameData: any, objectStates: any[]): void;\n activate(clientID: number, attributeID: number): void;\n rotate(rotation: Rotation, remember: boolean): void;\n focus(clientID: number, padding: number): void;\n fit(): void;\n grid(stepX: number, stepY: number): void;\n\n draw(drawData: DrawData): void;\n split(enabled: boolean): void;\n group(enabled: boolean): void;\n merge(enabled: boolean): void;\n\n cancel(): void;\n}\n\nexport class CanvasModelImpl extends MasterImpl implements CanvasModel {\n private data: {\n ObjectStateClass: any;\n activeElement: ActiveElement;\n angle: number;\n canvasSize: Size;\n drawData: DrawData;\n image: string;\n imageOffset: number;\n imageSize: Size;\n focusData: FocusData;\n gridSize: Size;\n left: number;\n objects: any[];\n rememberAngle: boolean;\n scale: number;\n top: number;\n };\n\n public constructor(ObjectStateClass: any) {\n super();\n\n this.data = {\n activeElement: {\n clientID: null,\n attributeID: null,\n },\n angle: 0,\n canvasSize: {\n height: 0,\n width: 0,\n },\n drawData: {\n enabled: false,\n shapeType: null,\n numberOfPoints: null,\n initialState: null,\n },\n image: '',\n imageOffset: 0,\n imageSize: {\n height: 0,\n width: 0,\n },\n focusData: {\n clientID: 0,\n padding: 0,\n },\n gridSize: {\n height: 100,\n width: 100,\n },\n left: 0,\n objects: [],\n ObjectStateClass,\n rememberAngle: false,\n scale: 1,\n top: 0,\n };\n }\n\n public zoom(x: number, y: number, direction: number): void {\n const oldScale: number = this.data.scale;\n const newScale: number = direction > 0 ? oldScale * 6 / 5 : oldScale * 5 / 6;\n this.data.scale = Math.min(Math.max(newScale, FrameZoom.MIN), FrameZoom.MAX);\n\n const { angle } = this.data;\n\n const mutiplier = Math.sin(angle * Math.PI / 180) + Math.cos(angle * Math.PI / 180);\n if ((angle / 90) % 2) {\n // 90, 270, ..\n this.data.top += mutiplier * ((x - this.data.imageSize.width / 2)\n * (oldScale / this.data.scale - 1)) * this.data.scale;\n this.data.left -= mutiplier * ((y - this.data.imageSize.height / 2)\n * (oldScale / this.data.scale - 1)) * this.data.scale;\n } else {\n this.data.left += mutiplier * ((x - this.data.imageSize.width / 2)\n * (oldScale / this.data.scale - 1)) * this.data.scale;\n this.data.top += mutiplier * ((y - this.data.imageSize.height / 2)\n * (oldScale / this.data.scale - 1)) * this.data.scale;\n }\n\n this.notify(UpdateReasons.ZOOM);\n }\n\n public move(topOffset: number, leftOffset: number): void {\n this.data.top += topOffset;\n this.data.left += leftOffset;\n this.notify(UpdateReasons.MOVE);\n }\n\n public setup(frameData: any, objectStates: any[]): void {\n frameData.data(\n (): void => {\n this.data.image = '';\n this.notify(UpdateReasons.IMAGE);\n },\n ).then((data: string): void => {\n this.data.imageSize = {\n height: (frameData.height as number),\n width: (frameData.width as number),\n };\n\n if (!this.data.rememberAngle) {\n this.data.angle = 0;\n }\n\n this.data.image = data;\n this.notify(UpdateReasons.IMAGE);\n this.data.objects = objectStates;\n this.notify(UpdateReasons.OBJECTS);\n }).catch((exception: any): void => {\n throw exception;\n });\n }\n\n public activate(clientID: number, attributeID: number): void {\n this.data.activeElement = {\n clientID,\n attributeID,\n };\n\n this.notify(UpdateReasons.ACTIVATE);\n }\n\n public rotate(rotation: Rotation, remember: boolean = false): void {\n if (rotation === Rotation.CLOCKWISE90) {\n this.data.angle += 90;\n } else {\n this.data.angle -= 90;\n }\n\n this.data.angle %= 360;\n this.data.rememberAngle = remember;\n this.fit();\n }\n\n public focus(clientID: number, padding: number): void {\n this.data.focusData = {\n clientID,\n padding,\n };\n\n this.notify(UpdateReasons.FOCUS);\n }\n\n public fit(): void {\n const { angle } = this.data;\n\n if ((angle / 90) % 2) {\n // 90, 270, ..\n this.data.scale = Math.min(\n this.data.canvasSize.width / this.data.imageSize.height,\n this.data.canvasSize.height / this.data.imageSize.width,\n );\n } else {\n this.data.scale = Math.min(\n this.data.canvasSize.width / this.data.imageSize.width,\n this.data.canvasSize.height / this.data.imageSize.height,\n );\n }\n\n this.data.scale = Math.min(\n Math.max(this.data.scale, FrameZoom.MIN),\n FrameZoom.MAX,\n );\n\n this.data.top = (this.data.canvasSize.height / 2 - this.data.imageSize.height / 2);\n this.data.left = (this.data.canvasSize.width / 2 - this.data.imageSize.width / 2);\n\n this.notify(UpdateReasons.FIT);\n }\n\n public grid(stepX: number, stepY: number): void {\n this.data.gridSize = {\n height: stepY,\n width: stepX,\n };\n\n this.notify(UpdateReasons.GRID);\n }\n\n public draw(drawData: DrawData): void {\n if (drawData.enabled) {\n if (this.data.drawData.enabled) {\n throw new Error('Drawing has been already started');\n } else if (!drawData.shapeType) {\n throw new Error('A shape type is not specified');\n } else if (typeof (drawData.numberOfPoints) !== 'undefined') {\n if (drawData.shapeType === 'polygon' && drawData.numberOfPoints < 3) {\n throw new Error('A polygon consists of at least 3 points');\n } else if (drawData.shapeType === 'polyline' && drawData.numberOfPoints < 2) {\n throw new Error('A polyline consists of at least 2 points');\n }\n }\n }\n\n this.data.drawData = Object.assign({}, drawData);\n this.notify(UpdateReasons.DRAW);\n }\n\n public split(enabled: boolean): any {\n return enabled;\n }\n\n public group(enabled: boolean): any {\n return enabled;\n }\n\n public merge(enabled: boolean): any {\n return enabled;\n }\n\n public cancel(): void {\n console.log('hello');\n }\n\n public get geometry(): Geometry {\n return {\n angle: this.data.angle,\n canvas: Object.assign({}, this.data.canvasSize),\n image: Object.assign({}, this.data.imageSize),\n grid: Object.assign({}, this.data.gridSize),\n left: this.data.left,\n offset: this.data.imageOffset,\n scale: this.data.scale,\n top: this.data.top,\n };\n }\n\n public set geometry(geometry: Geometry) {\n this.data.angle = geometry.angle;\n this.data.canvasSize = Object.assign({}, geometry.canvas);\n this.data.imageSize = Object.assign({}, geometry.image);\n this.data.gridSize = Object.assign({}, geometry.grid);\n this.data.left = geometry.left;\n this.data.top = geometry.top;\n this.data.imageOffset = geometry.offset;\n this.data.scale = geometry.scale;\n\n this.data.imageOffset = Math.floor(Math.max(\n this.data.canvasSize.height / FrameZoom.MIN,\n this.data.canvasSize.width / FrameZoom.MIN,\n ));\n }\n\n public get image(): string {\n return this.data.image;\n }\n\n public get objects(): any[] {\n return this.data.objects;\n }\n\n public get gridSize(): Size {\n return Object.assign({}, this.data.gridSize);\n }\n\n public get focusData(): FocusData {\n return Object.assign({}, this.data.focusData);\n }\n\n public get activeElement(): ActiveElement {\n return Object.assign({}, this.data.activeElement);\n }\n\n public get objectStateClass(): any {\n return this.data.ObjectStateClass;\n }\n\n public get drawData(): DrawData {\n return Object.assign({}, this.data.drawData);\n }\n}\n","/*\n* Copyright (C) 2019 Intel Corporation\n* SPDX-License-Identifier: MIT\n*/\n\nimport {\n CanvasModel,\n Geometry,\n Position,\n FocusData,\n ActiveElement,\n DrawData,\n} from './canvasModel';\n\nexport interface CanvasController {\n readonly objects: any[];\n readonly focusData: FocusData;\n readonly activeElement: ActiveElement;\n readonly objectStateClass: any;\n readonly drawData: DrawData;\n geometry: Geometry;\n\n zoom(x: number, y: number, direction: number): void;\n draw(drawData: DrawData): void;\n enableDrag(x: number, y: number): void;\n drag(x: number, y: number): void;\n disableDrag(): void;\n\n fit(): void;\n}\n\nexport class CanvasControllerImpl implements CanvasController {\n private model: CanvasModel;\n private lastDragPosition: Position;\n private isDragging: boolean;\n\n public constructor(model: CanvasModel) {\n this.model = model;\n }\n\n public zoom(x: number, y: number, direction: number): void {\n this.model.zoom(x, y, direction);\n }\n\n public fit(): void {\n this.model.fit();\n }\n\n public enableDrag(x: number, y: number): void {\n this.lastDragPosition = {\n x,\n y,\n };\n this.isDragging = true;\n }\n\n public drag(x: number, y: number): void {\n if (this.isDragging) {\n const topOffset: number = y - this.lastDragPosition.y;\n const leftOffset: number = x - this.lastDragPosition.x;\n this.lastDragPosition = {\n x,\n y,\n };\n this.model.move(topOffset, leftOffset);\n }\n }\n\n public disableDrag(): void {\n this.isDragging = false;\n }\n\n public draw(drawData: DrawData): void {\n this.model.draw(drawData);\n }\n\n public get geometry(): Geometry {\n return this.model.geometry;\n }\n\n public set geometry(geometry: Geometry) {\n this.model.geometry = geometry;\n }\n\n public get objects(): any[] {\n return this.model.objects;\n }\n\n public get focusData(): FocusData {\n return this.model.focusData;\n }\n\n public get activeElement(): ActiveElement {\n return this.model.activeElement;\n }\n\n public get objectStateClass(): any {\n return this.model.objectStateClass;\n }\n\n public get drawData(): DrawData {\n return this.model.drawData;\n }\n}\n","/*\n* Copyright (C) 2019 Intel Corporation\n* SPDX-License-Identifier: MIT\n*/\n\nconst BASE_STROKE_WIDTH = 2;\nconst BASE_POINT_SIZE = 8;\nconst TEXT_MARGIN = 10;\nconst AREA_THRESHOLD = 9;\nconst SIZE_THRESHOLD = 3;\n\nexport default {\n BASE_STROKE_WIDTH,\n BASE_POINT_SIZE,\n TEXT_MARGIN,\n AREA_THRESHOLD,\n SIZE_THRESHOLD,\n};\n","import * as SVG from 'svg.js';\n\n/* eslint-disable */\n\nimport 'svg.draggable.js';\nimport 'svg.resize.js';\nimport 'svg.select.js';\nimport 'svg.draw.js';\n\n// Update constructor\nconst originalDraw = SVG.Element.prototype.draw;\nSVG.Element.prototype.draw = function constructor(...args: any): any {\n let handler = this.remember('_paintHandler');\n if (!handler) {\n originalDraw.call(this, ...args);\n handler = this.remember('_paintHandler');\n handler.set = new SVG.Set();\n } else {\n originalDraw.call(this, ...args);\n }\n\n return this;\n};\nfor (const key of Object.keys(originalDraw)) {\n SVG.Element.prototype.draw[key] = originalDraw[key];\n}\n\n// Create undo for polygones and polylines\nfunction undo(): void {\n if (this.set.length()) {\n this.set.members.splice(-1, 1)[0].remove();\n this.el.array().value.splice(-2, 1);\n this.el.plot(this.el.array());\n this.el.fire('undopoint');\n }\n}\n\nSVG.Element.prototype.draw.extend('polyline', Object.assign({},\n SVG.Element.prototype.draw.plugins.polyline,\n {\n undo: undo,\n },\n));\n\nSVG.Element.prototype.draw.extend('polygon', Object.assign({},\n SVG.Element.prototype.draw.plugins.polygon,\n {\n undo: undo,\n },\n));\n\n\n// Create transform for rect, polyline and polygon\nfunction transform(): void {\n this.m = this.el.node.getScreenCTM().inverse();\n this.offset = { x: window.pageXOffset, y: window.pageYOffset };\n}\n\nSVG.Element.prototype.draw.extend('rect', Object.assign({},\n SVG.Element.prototype.draw.plugins.rect,\n {\n transform: transform,\n },\n));\n\nSVG.Element.prototype.draw.extend('polyline', Object.assign({},\n SVG.Element.prototype.draw.plugins.polyline,\n {\n transform: transform,\n },\n));\n\nSVG.Element.prototype.draw.extend('polygon', Object.assign({},\n SVG.Element.prototype.draw.plugins.polygon,\n {\n transform: transform,\n },\n));\n\n// Fix method drawCircles\nfunction drawCircles(): void {\n const array = this.el.array().valueOf();\n\n this.set.each(function (): void {\n this.remove();\n });\n\n this.set.clear();\n\n for (let i = 0; i < array.length - 1; ++i) {\n [this.p.x] = array[i];\n [, this.p.y] = array[i];\n\n const p = this.p.matrixTransform(\n this.parent.node.getScreenCTM()\n .inverse()\n .multiply(this.el.node.getScreenCTM()),\n );\n\n this.set.add(\n this.parent\n .circle(5)\n .stroke({\n width: 1,\n }).fill('#ccc')\n .center(p.x, p.y),\n );\n }\n}\n\nSVG.Element.prototype.draw.extend('line', Object.assign({},\n SVG.Element.prototype.draw.plugins.line,\n {\n drawCircles: drawCircles,\n }\n));\n\nSVG.Element.prototype.draw.extend('polyline', Object.assign({},\n SVG.Element.prototype.draw.plugins.polyline,\n {\n drawCircles: drawCircles,\n }\n));\n\nSVG.Element.prototype.draw.extend('polygon', Object.assign({},\n SVG.Element.prototype.draw.plugins.polygon,\n {\n drawCircles: drawCircles,\n }\n));\n\n// Fix method drag\nconst originalDraggable = SVG.Element.prototype.draggable;\nSVG.Element.prototype.draggable = function constructor(...args: any): any {\n let handler = this.remember('_draggable');\n if (!handler) {\n originalDraggable.call(this, ...args);\n handler = this.remember('_draggable');\n handler.drag = function(e: any) {\n this.m = this.el.node.getScreenCTM().inverse();\n handler.constructor.prototype.drag.call(this, e);\n }\n } else {\n originalDraggable.call(this, ...args);\n }\n\n return this;\n};\nfor (const key of Object.keys(originalDraggable)) {\n SVG.Element.prototype.draggable[key] = originalDraggable[key];\n}\n\n// Fix method resize\nconst originalResize = SVG.Element.prototype.resize;\nSVG.Element.prototype.resize = function constructor(...args: any): any {\n let handler = this.remember('_resizeHandler');\n if (!handler) {\n originalResize.call(this, ...args);\n handler = this.remember('_resizeHandler');\n handler.update = function(e: any) {\n this.m = this.el.node.getScreenCTM().inverse();\n handler.constructor.prototype.update.call(this, e);\n }\n } else {\n originalResize.call(this, ...args);\n }\n\n return this;\n};\nfor (const key of Object.keys(originalResize)) {\n SVG.Element.prototype.resize[key] = originalResize[key];\n}\n","/*\n* Copyright (C) 2019 Intel Corporation\n* SPDX-License-Identifier: MIT\n*/\n\n// Translate point array from the client coordinate system\n// to a coordinate system of a canvas\nexport function translateFromSVG(svg: SVGSVGElement, points: number[]): number[] {\n const output = [];\n const transformationMatrix = svg.getScreenCTM();\n let pt = svg.createSVGPoint();\n for (let i = 0; i < points.length - 1; i += 2) {\n pt.x = points[i];\n pt.y = points[i + 1];\n pt = pt.matrixTransform(transformationMatrix);\n output.push(pt.x, pt.y);\n }\n\n return output;\n}\n\n// Translate point array from a coordinate system of a canvas\n// to the client coordinate system\nexport function translateToSVG(svg: SVGSVGElement, points: number[]): number[] {\n const output = [];\n const transformationMatrix = svg.getScreenCTM().inverse();\n let pt = svg.createSVGPoint();\n for (let i = 0; i < points.length; i += 2) {\n pt.x = points[i];\n pt.y = points[i + 1];\n pt = pt.matrixTransform(transformationMatrix);\n output.push(pt.x, pt.y);\n }\n\n return output;\n}\n","/*\n* Copyright (C) 2019 Intel Corporation\n* SPDX-License-Identifier: MIT\n*/\n\nimport * as SVG from 'svg.js';\nimport consts from './consts';\nimport 'svg.draw.js';\nimport './svg.patch';\n\nimport {\n DrawData,\n Geometry,\n} from './canvasModel';\n\nimport {\n translateToSVG,\n translateFromSVG,\n} from './shared';\n\nexport interface DrawHandler {\n draw(drawData: DrawData, geometry: Geometry): void;\n}\n\nexport class DrawHandlerImpl implements DrawHandler {\n private onDrawDone: any; // callback is used to notify about creating new shape\n private canvas: SVG.Container;\n private background: SVGSVGElement;\n private crosshair: {\n x: SVG.Line;\n y: SVG.Line;\n };\n private drawData: DrawData;\n private geometry: Geometry;\n private drawInstance: any;\n\n\n private addCrosshair(): void {\n this.crosshair = {\n x: this.canvas.line(0, 0, this.canvas.node.clientWidth, 0).attr({\n 'stroke-width': consts.BASE_STROKE_WIDTH / (2 * this.geometry.scale),\n zOrder: Number.MAX_SAFE_INTEGER,\n }).addClass('cvat_canvas_crosshair'),\n y: this.canvas.line(0, 0, 0, this.canvas.node.clientHeight).attr({\n 'stroke-width': consts.BASE_STROKE_WIDTH / (2 * this.geometry.scale),\n zOrder: Number.MAX_SAFE_INTEGER,\n }).addClass('cvat_canvas_crosshair'),\n };\n }\n\n private removeCrosshair(): void {\n this.crosshair.x.remove();\n this.crosshair.y.remove();\n this.crosshair = null;\n }\n\n private initDrawing(): void {\n if (this.drawData.crosshair) {\n this.addCrosshair();\n }\n }\n\n private closeDrawing(): void {\n if (this.crosshair) {\n this.removeCrosshair();\n }\n\n if (this.drawInstance) {\n if (this.drawData.shapeType === 'rectangle') {\n this.drawInstance.draw('cancel');\n } else {\n this.drawInstance.draw('done');\n }\n\n // We should check again because state can be changed in 'cancel' and 'done'\n if (this.drawInstance) {\n this.drawInstance.remove();\n this.drawInstance = null;\n }\n }\n }\n\n private drawBox(): void {\n this.drawInstance = this.canvas.rect();\n this.drawInstance.draw({\n snapToGrid: 0.1,\n }).addClass('cvat_canvas_shape_drawing').attr({\n 'stroke-width': consts.BASE_STROKE_WIDTH / this.geometry.scale,\n }).on('drawstop', (e: Event): void => {\n const frameWidth = this.geometry.image.width;\n const frameHeight = this.geometry.image.height;\n const bbox = (e.target as SVGRectElement).getBBox();\n\n let [xtl, ytl, xbr, ybr] = translateFromSVG(\n this.canvas.node as any as SVGSVGElement,\n [bbox.x, bbox.y, bbox.x + bbox.width, bbox.y + bbox.height],\n );\n\n ([xtl, ytl, xbr, ybr] = translateToSVG(\n this.background,\n [xtl, ytl, xbr, ybr],\n ));\n\n xtl = Math.min(Math.max(xtl, 0), frameWidth);\n xbr = Math.min(Math.max(xbr, 0), frameWidth);\n ytl = Math.min(Math.max(ytl, 0), frameHeight);\n ybr = Math.min(Math.max(ybr, 0), frameHeight);\n\n if ((xbr - xtl) * (ybr - ytl) >= consts.AREA_THRESHOLD) {\n this.onDrawDone({\n points: [xtl, ytl, xbr, ybr],\n });\n } else {\n this.onDrawDone(null);\n }\n });\n }\n\n private drawPolyshape(): void {\n let size = this.drawData.numberOfPoints;\n const sizeDecrement = function sizeDecrement(): void {\n if (!--size) {\n this.drawInstance.draw('done');\n }\n }.bind(this);\n\n const sizeIncrement = function sizeIncrement(): void {\n size++;\n };\n\n if (this.drawData.numberOfPoints) {\n this.drawInstance.on('drawstart', sizeDecrement);\n this.drawInstance.on('drawpoint', sizeDecrement);\n this.drawInstance.on('undopoint', sizeIncrement);\n }\n\n // Add ability to cancel the latest drawn point\n const handleUndo = function handleUndo(e: MouseEvent): void {\n if (e.which === 3) {\n e.stopPropagation();\n e.preventDefault();\n this.drawInstance.draw('undo');\n }\n }.bind(this);\n this.canvas.node.addEventListener('mousedown', handleUndo);\n\n // Add ability to draw shapes by sliding\n // We need to remember last drawn point\n // to implementation of slide drawing\n const lastDrawnPoint: {\n x: number;\n y: number;\n } = {\n x: null,\n y: null,\n };\n\n const handleSlide = function handleSlide(e: MouseEvent): void {\n // TODO: Use enumeration after typification cvat-core\n if (e.shiftKey && ['polygon', 'polyline'].includes(this.drawData.shapeType)) {\n if (lastDrawnPoint.x === null || lastDrawnPoint.y === null) {\n this.drawInstance.draw('point', e);\n } else {\n const deltaTreshold = 15;\n const delta = Math.sqrt(\n ((e.clientX - lastDrawnPoint.x) ** 2)\n + ((e.clientY - lastDrawnPoint.y) ** 2),\n );\n if (delta > deltaTreshold) {\n this.drawInstance.draw('point', e);\n }\n }\n }\n }.bind(this);\n this.canvas.node.addEventListener('mousemove', handleSlide);\n\n // We need scale just drawn points\n const self = this;\n this.drawInstance.on('drawstart drawpoint', (e: CustomEvent): void => {\n self.transform(self.geometry);\n lastDrawnPoint.x = e.detail.event.clientX;\n lastDrawnPoint.y = e.detail.event.clientY;\n });\n\n this.drawInstance.on('drawstop', (): void => {\n self.canvas.node.removeEventListener('mousedown', handleUndo);\n self.canvas.node.removeEventListener('mousemove', handleSlide);\n });\n\n this.drawInstance.on('drawdone', (e: CustomEvent): void => {\n let points = translateFromSVG(\n this.canvas.node as any as SVGSVGElement,\n (e.target as SVGElement)\n .getAttribute('points')\n .split(/[,\\s]/g)\n .map((coord): number => +coord),\n );\n\n points = translateToSVG(\n this.background,\n points,\n );\n\n const bbox = {\n xtl: Number.MAX_SAFE_INTEGER,\n ytl: Number.MAX_SAFE_INTEGER,\n xbr: Number.MAX_SAFE_INTEGER,\n ybr: Number.MAX_SAFE_INTEGER,\n };\n\n const frameWidth = this.geometry.image.width;\n const frameHeight = this.geometry.image.height;\n for (let i = 0; i < points.length - 1; i += 2) {\n points[i] = Math.min(Math.max(points[i], 0), frameWidth);\n points[i + 1] = Math.min(Math.max(points[i + 1], 0), frameHeight);\n\n bbox.xtl = Math.min(bbox.xtl, points[i]);\n bbox.ytl = Math.min(bbox.ytl, points[i + 1]);\n bbox.xbr = Math.max(bbox.xbr, points[i]);\n bbox.ybr = Math.max(bbox.ybr, points[i + 1]);\n }\n\n if (this.drawData.shapeType === 'polygon'\n && ((bbox.xbr - bbox.xtl) * (bbox.ybr - bbox.ytl) >= consts.AREA_THRESHOLD)) {\n this.onDrawDone({\n points,\n });\n } else if (this.drawData.shapeType === 'polyline'\n && ((bbox.xbr - bbox.xtl) >= consts.SIZE_THRESHOLD\n || (bbox.ybr - bbox.ytl) >= consts.SIZE_THRESHOLD)) {\n this.onDrawDone({\n points,\n });\n } else if (this.drawData.shapeType === 'points') {\n this.onDrawDone({\n points,\n });\n } else {\n this.onDrawDone(null);\n }\n });\n }\n\n private drawPolygon(): void {\n this.drawInstance = (this.canvas as any).polygon().draw({\n snapToGrid: 0.1,\n }).addClass('cvat_canvas_shape_drawing').style({\n 'stroke-width': consts.BASE_STROKE_WIDTH / this.geometry.scale,\n });\n\n this.drawPolyshape();\n }\n\n private drawPolyline(): void {\n this.drawInstance = (this.canvas as any).polyline().draw({\n snapToGrid: 0.1,\n }).addClass('cvat_canvas_shape_drawing').style({\n 'stroke-width': consts.BASE_STROKE_WIDTH / this.geometry.scale,\n 'fill-opacity': 0,\n });\n\n this.drawPolyshape();\n }\n\n private drawPoints(): void {\n this.drawInstance = (this.canvas as any).polygon().draw({\n snapToGrid: 0.1,\n }).addClass('cvat_canvas_shape_drawing').style({\n 'stroke-width': 0,\n opacity: 0,\n });\n\n this.drawPolyshape();\n }\n\n private startDraw(): void {\n // TODO: Use enums after typification cvat-core\n if (this.drawData.shapeType === 'rectangle') {\n this.drawBox();\n } else if (this.drawData.shapeType === 'polygon') {\n this.drawPolygon();\n } else if (this.drawData.shapeType === 'polyline') {\n this.drawPolyline();\n } else if (this.drawData.shapeType === 'points') {\n this.drawPoints();\n }\n }\n\n public constructor(onDrawDone: any, canvas: SVG.Container, background: SVGSVGElement) {\n this.onDrawDone = onDrawDone;\n this.canvas = canvas;\n this.background = background;\n this.drawData = null;\n this.geometry = null;\n this.crosshair = null;\n this.drawInstance = null;\n\n this.canvas.node.addEventListener('mousemove', (e): void => {\n if (this.crosshair) {\n const [x, y] = translateToSVG(\n this.canvas.node as any as SVGSVGElement,\n [e.clientX, e.clientY],\n );\n\n this.crosshair.x.attr({\n y1: y,\n y2: y,\n });\n\n this.crosshair.y.attr({\n x1: x,\n x2: x,\n });\n }\n });\n }\n\n public transform(geometry: Geometry): void {\n this.geometry = geometry;\n\n if (this.crosshair) {\n this.crosshair.x.attr({\n 'stroke-width': consts.BASE_STROKE_WIDTH / (2 * geometry.scale),\n });\n this.crosshair.y.attr({\n 'stroke-width': consts.BASE_STROKE_WIDTH / (2 * geometry.scale),\n });\n }\n\n if (this.drawInstance) {\n this.drawInstance.draw('transform');\n this.drawInstance.style({\n 'stroke-width': consts.BASE_STROKE_WIDTH / geometry.scale,\n });\n\n const paintHandler = this.drawInstance.remember('_paintHandler');\n\n for (const point of (paintHandler as any).set.members) {\n point.style(\n 'stroke-width',\n `${consts.BASE_STROKE_WIDTH / (3 * geometry.scale)}`,\n );\n point.attr(\n 'r',\n `${consts.BASE_POINT_SIZE / (2 * geometry.scale)}`,\n );\n }\n }\n }\n\n public draw(drawData: DrawData, geometry: Geometry): void {\n this.geometry = geometry;\n\n if (drawData.enabled) {\n this.drawData = drawData;\n this.initDrawing();\n this.startDraw();\n } else {\n this.closeDrawing();\n this.drawData = drawData;\n }\n }\n}\n\n// TODO: handle initial state\n","/*\n* Copyright (C) 2019 Intel Corporation\n* SPDX-License-Identifier: MIT\n*/\n\n// Disable till full implementation\n/* eslint class-methods-use-this: \"off\" */\n\nimport * as SVG from 'svg.js';\n\n// tslint:disable-next-line: ordered-imports\nimport 'svg.draggable.js';\nimport 'svg.resize.js';\nimport 'svg.select.js';\n\nimport { CanvasController } from './canvasController';\nimport { Listener, Master } from './master';\nimport { DrawHandler, DrawHandlerImpl } from './drawHandler';\nimport { translateToSVG, translateFromSVG } from './shared';\nimport consts from './consts';\nimport {\n CanvasModel,\n Geometry,\n Size,\n UpdateReasons,\n FocusData,\n FrameZoom,\n ActiveElement,\n DrawData,\n} from './canvasModel';\n\nexport interface CanvasView {\n html(): HTMLDivElement;\n}\n\n\ninterface ShapeDict {\n [index: number]: SVG.Shape;\n}\n\ninterface TextDict {\n [index: number]: SVG.Text;\n}\n\nenum Mode {\n IDLE = 'idle',\n DRAG = 'drag',\n RESIZE = 'resize',\n DRAW = 'draw',\n}\n\nfunction darker(color: string, percentage: number): string {\n const R = Math.round(parseInt(color.slice(1, 3), 16) * (1 - percentage / 100));\n const G = Math.round(parseInt(color.slice(3, 5), 16) * (1 - percentage / 100));\n const B = Math.round(parseInt(color.slice(5, 7), 16) * (1 - percentage / 100));\n\n const rHex = Math.max(0, R).toString(16);\n const gHex = Math.max(0, G).toString(16);\n const bHex = Math.max(0, B).toString(16);\n\n return `#${rHex.length === 1 ? `0${rHex}` : rHex}`\n + `${gHex.length === 1 ? `0${gHex}` : gHex}`\n + `${bHex.length === 1 ? `0${bHex}` : bHex}`;\n}\n\nexport class CanvasViewImpl implements CanvasView, Listener {\n private loadingAnimation: SVGSVGElement;\n private text: SVGSVGElement;\n private adoptedText: SVG.Container;\n private background: SVGSVGElement;\n private grid: SVGSVGElement;\n private content: SVGSVGElement;\n private adoptedContent: SVG.Container;\n private canvas: HTMLDivElement;\n private gridPath: SVGPathElement;\n private gridPattern: SVGPatternElement;\n private controller: CanvasController;\n private svgShapes: ShapeDict;\n private svgTexts: TextDict;\n private drawHandler: DrawHandler;\n private activeElement: {\n state: any;\n attributeID: number;\n };\n\n private mode: Mode;\n\n private onDrawDone(data: Record): void {\n if (data) {\n const event: CustomEvent = new CustomEvent('canvas.drawn', {\n bubbles: false,\n cancelable: true,\n detail: {\n // eslint-disable-next-line new-cap\n state: new this.controller.objectStateClass(data),\n },\n });\n\n this.canvas.dispatchEvent(event);\n } else {\n const event: CustomEvent = new CustomEvent('canvas.canceled', {\n bubbles: false,\n cancelable: true,\n });\n\n this.canvas.dispatchEvent(event);\n }\n\n this.controller.draw({\n enabled: false,\n });\n }\n\n public constructor(model: CanvasModel & Master, controller: CanvasController) {\n this.controller = controller;\n this.svgShapes = {};\n this.svgTexts = {};\n this.activeElement = null;\n this.mode = Mode.IDLE;\n\n // Create HTML elements\n this.loadingAnimation = window.document\n .createElementNS('http://www.w3.org/2000/svg', 'svg');\n this.text = window.document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n this.adoptedText = (SVG.adopt((this.text as any as HTMLElement)) as SVG.Container);\n this.background = window.document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n\n this.grid = window.document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n this.gridPath = window.document.createElementNS('http://www.w3.org/2000/svg', 'path');\n this.gridPattern = window.document.createElementNS('http://www.w3.org/2000/svg', 'pattern');\n\n this.content = window.document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n this.adoptedContent = (SVG.adopt((this.content as any as HTMLElement)) as SVG.Container);\n this.drawHandler = new DrawHandlerImpl(\n this.onDrawDone.bind(this),\n this.adoptedContent,\n this.background,\n );\n this.canvas = window.document.createElement('div');\n\n const loadingCircle: SVGCircleElement = window.document\n .createElementNS('http://www.w3.org/2000/svg', 'circle');\n const gridDefs: SVGDefsElement = window.document\n .createElementNS('http://www.w3.org/2000/svg', 'defs');\n const gridRect: SVGRectElement = window.document\n .createElementNS('http://www.w3.org/2000/svg', 'rect');\n\n // Setup loading animation\n this.loadingAnimation.setAttribute('id', 'cvat_canvas_loading_animation');\n loadingCircle.setAttribute('id', 'cvat_canvas_loading_circle');\n loadingCircle.setAttribute('r', '30');\n loadingCircle.setAttribute('cx', '50%');\n loadingCircle.setAttribute('cy', '50%');\n\n // Setup grid\n this.grid.setAttribute('id', 'cvat_canvas_grid');\n this.grid.setAttribute('version', '2');\n this.gridPath.setAttribute('d', 'M 1000 0 L 0 0 0 1000');\n this.gridPath.setAttribute('fill', 'none');\n this.gridPath.setAttribute('stroke-width', '1.5');\n this.gridPattern.setAttribute('id', 'cvat_canvas_grid_pattern');\n this.gridPattern.setAttribute('width', '100');\n this.gridPattern.setAttribute('height', '100');\n this.gridPattern.setAttribute('patternUnits', 'userSpaceOnUse');\n gridRect.setAttribute('width', '100%');\n gridRect.setAttribute('height', '100%');\n gridRect.setAttribute('fill', 'url(#cvat_canvas_grid_pattern)');\n\n // Setup content\n this.text.setAttribute('id', 'cvat_canvas_text_content');\n this.background.setAttribute('id', 'cvat_canvas_background');\n this.content.setAttribute('id', 'cvat_canvas_content');\n\n // Setup wrappers\n this.canvas.setAttribute('id', 'cvat_canvas_wrapper');\n\n // Unite created HTML elements together\n this.loadingAnimation.appendChild(loadingCircle);\n this.grid.appendChild(gridDefs);\n this.grid.appendChild(gridRect);\n\n gridDefs.appendChild(this.gridPattern);\n this.gridPattern.appendChild(this.gridPath);\n\n this.canvas.appendChild(this.loadingAnimation);\n this.canvas.appendChild(this.text);\n this.canvas.appendChild(this.background);\n this.canvas.appendChild(this.grid);\n this.canvas.appendChild(this.content);\n\n\n // A little hack to get size after first mounting\n // http://www.backalleycoder.com/2012/04/25/i-want-a-damnodeinserted/\n const self = this;\n const canvasFirstMounted = (event: AnimationEvent): void => {\n if (event.animationName === 'loadingAnimation') {\n const { geometry } = this.controller;\n geometry.canvas = {\n height: self.canvas.clientHeight,\n width: self.canvas.clientWidth,\n };\n\n this.controller.geometry = geometry;\n self.canvas.removeEventListener('animationstart', canvasFirstMounted);\n }\n };\n\n this.canvas.addEventListener('animationstart', canvasFirstMounted);\n\n this.content.addEventListener('dblclick', (): void => {\n self.controller.fit();\n });\n\n this.content.addEventListener('mousedown', (event): void => {\n if ((event.which === 1 && this.mode === Mode.IDLE) || (event.which === 2)) {\n self.controller.enableDrag(event.clientX, event.clientY);\n }\n });\n\n this.content.addEventListener('mousemove', (event): void => {\n self.controller.drag(event.clientX, event.clientY);\n });\n\n window.document.addEventListener('mouseup', (event): void => {\n if (event.which === 1 || event.which === 2) {\n self.controller.disableDrag();\n }\n });\n\n this.content.addEventListener('wheel', (event): void => {\n const point = translateToSVG(self.background, [event.clientX, event.clientY]);\n self.controller.zoom(point[0], point[1], event.deltaY > 0 ? -1 : 1);\n event.preventDefault();\n });\n\n this.content.addEventListener('mousemove', (e): void => {\n if (this.mode !== Mode.IDLE) return;\n\n const [x, y] = translateToSVG(this.background, [e.clientX, e.clientY]);\n const event: CustomEvent = new CustomEvent('canvas.moved', {\n bubbles: false,\n cancelable: true,\n detail: {\n x,\n y,\n objects: this.controller.objects,\n },\n });\n\n this.canvas.dispatchEvent(event);\n });\n\n this.content.oncontextmenu = (): boolean => false;\n model.subscribe(this);\n }\n\n public notify(model: CanvasModel & Master, reason: UpdateReasons): void {\n function transform(geometry: Geometry): void {\n // Transform canvas\n for (const obj of [this.background, this.grid, this.loadingAnimation, this.content]) {\n obj.style.transform = `scale(${geometry.scale}) rotate(${geometry.angle}deg)`;\n }\n\n // Transform grid\n this.gridPath.setAttribute('stroke-width', `${consts.BASE_STROKE_WIDTH / (2 * geometry.scale)}px`);\n\n // Transform all shape points\n for (const element of window.document.getElementsByClassName('svg_select_points')) {\n element.setAttribute(\n 'stroke-width',\n `${consts.BASE_STROKE_WIDTH / (3 * geometry.scale)}`,\n );\n element.setAttribute(\n 'r',\n `${consts.BASE_POINT_SIZE / (2 * geometry.scale)}`,\n );\n }\n\n for (const element of\n window.document.getElementsByClassName('cvat_canvas_selected_point')) {\n element.setAttribute(\n 'stroke-width',\n `${+element.getAttribute('stroke-width') * 2}`,\n );\n }\n\n // Transform all drawn shapes\n for (const key in this.svgShapes) {\n if (Object.prototype.hasOwnProperty.call(this.svgShapes, key)) {\n const object = this.svgShapes[key];\n if (object.attr('stroke-width')) {\n object.attr({\n 'stroke-width': consts.BASE_STROKE_WIDTH / (geometry.scale),\n });\n }\n }\n }\n\n // Transform all text\n for (const key in this.svgShapes) {\n if (Object.prototype.hasOwnProperty.call(this.svgShapes, key)\n && Object.prototype.hasOwnProperty.call(this.svgTexts, key)) {\n this.updateTextPosition(\n this.svgTexts[key],\n this.svgShapes[key],\n );\n }\n }\n\n // Transform handlers\n this.drawHandler.transform(geometry);\n }\n\n function resize(geometry: Geometry): void {\n for (const obj of [this.background, this.grid, this.loadingAnimation]) {\n obj.style.width = `${geometry.image.width}px`;\n obj.style.height = `${geometry.image.height}px`;\n }\n\n for (const obj of [this.content, this.text]) {\n obj.style.width = `${geometry.image.width + geometry.offset * 2}px`;\n obj.style.height = `${geometry.image.height + geometry.offset * 2}px`;\n }\n }\n\n function move(geometry: Geometry): void {\n for (const obj of [this.background, this.grid, this.loadingAnimation]) {\n obj.style.top = `${geometry.top}px`;\n obj.style.left = `${geometry.left}px`;\n }\n\n for (const obj of [this.content, this.text]) {\n obj.style.top = `${geometry.top - geometry.offset}px`;\n obj.style.left = `${geometry.left - geometry.offset}px`;\n }\n\n // Transform handlers\n this.drawHandler.transform(geometry);\n }\n\n function computeFocus(focusData: FocusData, geometry: Geometry): void {\n // This computation cann't be done in the model because of lack of data\n const object = this.svgShapes[focusData.clientID];\n if (!object) {\n return;\n }\n\n // First of all, compute and apply scale\n\n let scale = null;\n const bbox: SVG.BBox = object.node.getBBox();\n if ((geometry.angle / 90) % 2) {\n // 90, 270, ..\n scale = Math.min(Math.max(Math.min(\n geometry.canvas.width / bbox.height,\n geometry.canvas.height / bbox.width,\n ), FrameZoom.MIN), FrameZoom.MAX);\n } else {\n scale = Math.min(Math.max(Math.min(\n geometry.canvas.width / bbox.width,\n geometry.canvas.height / bbox.height,\n ), FrameZoom.MIN), FrameZoom.MAX);\n }\n\n transform.call(this, Object.assign({}, geometry, {\n scale,\n }));\n\n const [x, y] = translateFromSVG(this.content, [\n bbox.x + bbox.width / 2,\n bbox.y + bbox.height / 2,\n ]);\n\n const [cx, cy] = [\n this.canvas.clientWidth / 2 + this.canvas.offsetLeft,\n this.canvas.clientHeight / 2 + this.canvas.offsetTop,\n ];\n\n const dragged = Object.assign({}, geometry, {\n top: geometry.top + cy - y,\n left: geometry.left + cx - x,\n scale,\n });\n\n this.controller.geometry = dragged;\n move.call(this, dragged);\n }\n\n function setupObjects(objects: any[], geometry: Geometry): void {\n const ctm = this.content.getScreenCTM()\n .inverse().multiply(this.background.getScreenCTM());\n\n this.deactivate();\n\n // TODO: Compute difference\n\n // Instead of simple clearing let's remove all objects properly\n for (const id of Object.keys(this.svgShapes)) {\n if (id in this.svgTexts) {\n this.svgTexts[id].remove();\n }\n\n this.svgShapes[id].remove();\n }\n\n this.svgTexts = {};\n this.svgShapes = {};\n\n this.addObjects(ctm, objects, geometry);\n // TODO: Update objects\n // TODO: Delete objects\n }\n\n const { geometry } = this.controller;\n if (reason === UpdateReasons.IMAGE) {\n if (!model.image.length) {\n this.loadingAnimation.classList.remove('cvat_canvas_hidden');\n } else {\n this.loadingAnimation.classList.add('cvat_canvas_hidden');\n this.background.style.backgroundImage = `url(\"${model.image}\")`;\n move.call(this, geometry);\n resize.call(this, geometry);\n transform.call(this, geometry);\n }\n } else if (reason === UpdateReasons.ZOOM || reason === UpdateReasons.FIT) {\n move.call(this, geometry);\n transform.call(this, geometry);\n } else if (reason === UpdateReasons.MOVE) {\n move.call(this, geometry);\n } else if (reason === UpdateReasons.OBJECTS) {\n setupObjects.call(this, this.controller.objects, geometry);\n const event: CustomEvent = new CustomEvent('canvas.setup');\n this.canvas.dispatchEvent(event);\n } else if (reason === UpdateReasons.GRID) {\n const size: Size = geometry.grid;\n this.gridPattern.setAttribute('width', `${size.width}`);\n this.gridPattern.setAttribute('height', `${size.height}`);\n } else if (reason === UpdateReasons.FOCUS) {\n computeFocus.call(this, this.controller.focusData, geometry);\n } else if (reason === UpdateReasons.ACTIVATE) {\n this.activate(geometry, this.controller.activeElement);\n } else if (reason === UpdateReasons.DRAW) {\n const data: DrawData = this.controller.drawData;\n if (data.enabled) {\n this.mode = Mode.DRAW;\n this.deactivate();\n } else {\n this.mode = Mode.IDLE;\n }\n this.drawHandler.draw(data, geometry);\n }\n }\n\n public html(): HTMLDivElement {\n return this.canvas;\n }\n\n private addObjects(ctm: SVGMatrix, states: any[], geometry: Geometry): void {\n for (const state of states) {\n if (state.objectType === 'tag') {\n this.addTag(state, geometry);\n } else {\n const points: number[] = (state.points as number[]);\n const translatedPoints: number[] = [];\n for (let i = 0; i <= points.length - 1; i += 2) {\n let point: SVGPoint = this.background.createSVGPoint();\n point.x = points[i];\n point.y = points[i + 1];\n point = point.matrixTransform(ctm);\n translatedPoints.push(point.x, point.y);\n }\n\n // TODO: Use enums after typification cvat-core\n if (state.shapeType === 'rectangle') {\n this.svgShapes[state.clientID] = this\n .addRect(translatedPoints, state, geometry);\n } else {\n const stringified = translatedPoints.reduce(\n (acc: string, val: number, idx: number): string => {\n if (idx % 2) {\n return `${acc}${val} `;\n }\n\n return `${acc}${val},`;\n }, '',\n );\n\n if (state.shapeType === 'polygon') {\n this.svgShapes[state.clientID] = this\n .addPolygon(stringified, state, geometry);\n } else if (state.shapeType === 'polyline') {\n this.svgShapes[state.clientID] = this\n .addPolyline(stringified, state, geometry);\n } else if (state.shapeType === 'points') {\n this.svgShapes[state.clientID] = this\n .addPoints(stringified, state, geometry);\n }\n }\n\n // TODO: Use enums after typification cvat-core\n if (state.visibility === 'all') {\n this.svgTexts[state.clientID] = this.addText(state);\n this.updateTextPosition(\n this.svgTexts[state.clientID],\n this.svgShapes[state.clientID],\n );\n }\n }\n }\n }\n\n private deactivate(): void {\n if (this.activeElement) {\n const { state } = this.activeElement;\n const shape = this.svgShapes[this.activeElement.state.clientID];\n (shape as any).draggable(false);\n\n if (state.shapeType !== 'points') {\n this.selectize(false, shape, null);\n }\n\n (shape as any).resize(false);\n\n // Hide text only if it is hidden by settings\n const text = this.svgTexts[state.clientID];\n if (text && state.visibility === 'shape') {\n text.remove();\n delete this.svgTexts[state.clientID];\n }\n this.activeElement = null;\n }\n }\n\n private selectize(value: boolean, shape: SVG.Element, geometry: Geometry): void {\n if (value) {\n (shape as any).selectize(value, {\n deepSelect: true,\n pointSize: consts.BASE_POINT_SIZE / geometry.scale,\n rotationPoint: false,\n pointType(cx: number, cy: number): SVG.Circle {\n const circle: SVG.Circle = this.nested\n .circle(this.options.pointSize)\n .stroke('black')\n .fill(shape.node.getAttribute('fill'))\n .center(cx, cy)\n .attr({\n 'stroke-width': consts.BASE_STROKE_WIDTH / (3 * geometry.scale),\n });\n\n circle.node.addEventListener('mouseenter', (): void => {\n circle.attr({\n 'stroke-width': circle.attr('stroke-width') * 2,\n });\n\n circle.addClass('cvat_canvas_selected_point');\n });\n\n circle.node.addEventListener('mouseleave', (): void => {\n circle.attr({\n 'stroke-width': circle.attr('stroke-width') / 2,\n });\n\n circle.removeClass('cvat_canvas_selected_point');\n });\n\n return circle;\n },\n });\n } else {\n (shape as any).selectize(false, {\n deepSelect: true,\n });\n }\n }\n\n private activate(geometry: Geometry, activeElement: ActiveElement): void {\n // Check if other element have been already activated\n if (this.activeElement) {\n // Check if it is the same element\n if (this.activeElement.state.clientID === activeElement.clientID) {\n return;\n }\n\n // Deactivate previous element\n this.deactivate();\n }\n\n const state = this.controller.objects\n .filter((el): boolean => el.clientID === activeElement.clientID)[0];\n this.activeElement = {\n attributeID: activeElement.attributeID,\n state,\n };\n\n const shape = this.svgShapes[activeElement.clientID];\n let text = this.svgTexts[activeElement.clientID];\n // Draw text if it's hidden by default\n if (!text && state.visibility === 'shape') {\n text = this.addText(state);\n this.svgTexts[state.clientID] = text;\n this.updateTextPosition(\n text,\n shape,\n );\n }\n\n const self = this;\n this.content.append(shape.node);\n (shape as any).draggable().on('dragstart', (): void => {\n this.mode = Mode.DRAG;\n if (text) {\n text.addClass('cvat_canvas_hidden');\n }\n }).on('dragend', (): void => {\n this.mode = Mode.IDLE;\n if (text) {\n text.removeClass('cvat_canvas_hidden');\n self.updateTextPosition(\n text,\n shape,\n );\n }\n });\n\n if (state.shapeType !== 'points') {\n this.selectize(true, shape, geometry);\n }\n\n (shape as any).resize().on('resizestart', (): void => {\n this.mode = Mode.RESIZE;\n if (text) {\n text.addClass('cvat_canvas_hidden');\n }\n }).on('resizedone', (): void => {\n this.mode = Mode.IDLE;\n if (text) {\n text.removeClass('cvat_canvas_hidden');\n self.updateTextPosition(\n text,\n shape,\n );\n }\n });\n }\n\n // Update text position after corresponding box has been moved, resized, etc.\n private updateTextPosition(text: SVG.Text, shape: SVG.Shape): void {\n let box = (shape.node as any).getBBox();\n\n // Translate the whole box to the client coordinate system\n const [x1, y1, x2, y2]: number[] = translateFromSVG(this.content, [\n box.x,\n box.y,\n box.x + box.width,\n box.y + box.height,\n ]);\n\n box = {\n x: Math.min(x1, x2),\n y: Math.min(y1, y2),\n width: Math.max(x1, x2) - Math.min(x1, x2),\n height: Math.max(y1, y2) - Math.min(y1, y2),\n };\n\n // Find the best place for a text\n let [clientX, clientY]: number[] = [box.x + box.width, box.y];\n if (clientX + (text.node as any as SVGTextElement)\n .getBBox().width + consts.TEXT_MARGIN > this.canvas.offsetWidth) {\n ([clientX, clientY] = [box.x, box.y]);\n }\n\n // Translate back to text SVG\n const [x, y]: number[] = translateToSVG(this.text, [\n clientX + consts.TEXT_MARGIN,\n clientY,\n ]);\n\n // Finally draw a text\n text.move(x, y);\n for (const tspan of (text.lines() as any).members) {\n tspan.attr('x', text.attr('x'));\n }\n }\n\n private addText(state: any): SVG.Text {\n const { label, clientID, attributes } = state;\n const attrNames = label.attributes.reduce((acc: any, val: any): void => {\n acc[val.id] = val.name;\n return acc;\n }, {});\n\n return this.adoptedText.text((block): void => {\n block.tspan(`${label.name} ${clientID}`).style('text-transform', 'uppercase');\n for (const attrID of Object.keys(attributes)) {\n block.tspan(`${attrNames[attrID]}: ${attributes[attrID]}`).attr({\n attrID,\n dy: '1em',\n x: 0,\n });\n }\n }).move(0, 0).addClass('cvat_canvas_text');\n }\n\n private addRect(points: number[], state: any, geometry: Geometry): SVG.Rect {\n const [xtl, ytl, xbr, ybr] = points;\n\n return this.adoptedContent.rect().size(xbr - xtl, ybr - ytl).attr({\n clientID: state.clientID,\n 'color-rendering': 'optimizeQuality',\n fill: state.color,\n 'shape-rendering': 'geometricprecision',\n stroke: darker(state.color, 50),\n 'stroke-width': consts.BASE_STROKE_WIDTH / geometry.scale,\n zOrder: state.zOrder,\n }).move(xtl, ytl)\n .addClass('cvat_canvas_shape');\n }\n\n private addPolygon(points: string, state: any, geometry: Geometry): SVG.Polygon {\n return this.adoptedContent.polygon(points).attr({\n clientID: state.clientID,\n 'color-rendering': 'optimizeQuality',\n fill: state.color,\n 'shape-rendering': 'geometricprecision',\n stroke: darker(state.color, 50),\n 'stroke-width': consts.BASE_STROKE_WIDTH / geometry.scale,\n zOrder: state.zOrder,\n }).addClass('cvat_canvas_shape');\n }\n\n private addPolyline(points: string, state: any, geometry: Geometry): SVG.PolyLine {\n return this.adoptedContent.polyline(points).attr({\n clientID: state.clientID,\n 'color-rendering': 'optimizeQuality',\n fill: state.color,\n 'shape-rendering': 'geometricprecision',\n stroke: darker(state.color, 50),\n 'stroke-width': consts.BASE_STROKE_WIDTH / geometry.scale,\n zOrder: state.zOrder,\n }).addClass('cvat_canvas_shape');\n }\n\n private addPoints(points: string, state: any, geometry: Geometry): SVG.PolyLine {\n const shape = this.adoptedContent.polyline(points).attr({\n clientID: state.clientID,\n 'color-rendering': 'optimizeQuality',\n fill: state.color,\n 'shape-rendering': 'geometricprecision',\n zOrder: state.zOrder,\n }).addClass('cvat_canvas_shape');\n\n this.selectize(true, shape, geometry);\n shape.remove = function remove(): void {\n this.selectize(false, shape);\n shape.constructor.prototype.remove.call(shape);\n }.bind(this);\n shape.attr('fill', 'none');\n\n return shape;\n }\n\n private addTag(state: any, geometry: Geometry): void {\n console.log(state, geometry);\n }\n}\n","/*\n* Copyright (C) 2019 Intel Corporation\n* SPDX-License-Identifier: MIT\n*/\n\nimport {\n CanvasModel,\n CanvasModelImpl,\n Rotation,\n DrawData,\n} from './canvasModel';\n\nimport {\n CanvasController,\n CanvasControllerImpl,\n} from './canvasController';\n\nimport {\n CanvasView,\n CanvasViewImpl,\n} from './canvasView';\n\ninterface Canvas {\n html(): HTMLDivElement;\n setup(frameData: any, objectStates: any[]): void;\n activate(clientID: number, attributeID?: number): void;\n rotate(rotation: Rotation, remember?: boolean): void;\n focus(clientID: number, padding?: number): void;\n fit(): void;\n grid(stepX: number, stepY: number): void;\n\n draw(drawData: DrawData): void;\n split(enabled?: boolean): void;\n group(enabled?: boolean): void;\n merge(enabled?: boolean): void;\n\n cancel(): void;\n}\n\nclass CanvasImpl implements Canvas {\n private model: CanvasModel;\n private controller: CanvasController;\n private view: CanvasView;\n\n public constructor(ObjectStateClass: any) {\n this.model = new CanvasModelImpl(ObjectStateClass);\n this.controller = new CanvasControllerImpl(this.model);\n this.view = new CanvasViewImpl(this.model, this.controller);\n }\n\n public html(): HTMLDivElement {\n return this.view.html();\n }\n\n public setup(frameData: any, objectStates: any[]): void {\n this.model.setup(frameData, objectStates);\n }\n\n public activate(clientID: number, attributeID: number = null): void {\n this.model.activate(clientID, attributeID);\n }\n\n public rotate(rotation: Rotation, remember: boolean): void {\n this.model.rotate(rotation, remember);\n }\n\n public focus(clientID: number, padding: number = 0): void {\n this.model.focus(clientID, padding);\n }\n\n public fit(): void {\n this.model.fit();\n }\n\n public grid(stepX: number, stepY: number): void {\n this.model.grid(stepX, stepY);\n }\n\n public draw(drawData: DrawData): void {\n this.model.draw(drawData);\n }\n\n public split(enabled: boolean = false): void {\n this.model.split(enabled);\n }\n\n public group(enabled: boolean = false): void {\n this.model.group(enabled);\n }\n\n public merge(enabled: boolean = false): void {\n this.model.merge(enabled);\n }\n\n public cancel(): void {\n this.model.cancel();\n }\n}\n\nexport {\n CanvasImpl as Canvas,\n Rotation,\n};\n"],"sourceRoot":""} \ No newline at end of file diff --git a/cvat-canvas/public/cvat-core.min.js b/cvat-canvas/public/cvat-core.min.js new file mode 100644 index 00000000..bee44358 --- /dev/null +++ b/cvat-canvas/public/cvat-core.min.js @@ -0,0 +1,15 @@ +window.cvat=function(t){var e={};function n(r){if(e[r])return e[r].exports;var o=e[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)n.d(r,o,function(e){return t[e]}.bind(null,o));return r},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=90)}([function(t,e,n){(function(e){var n="object",r=function(t){return t&&t.Math==Math&&t};t.exports=r(typeof globalThis==n&&globalThis)||r(typeof window==n&&window)||r(typeof self==n&&self)||r(typeof e==n&&e)||Function("return this")()}).call(this,n(28))},function(t,e,n){var r=n(0),o=n(31),i=n(57),s=n(96),a=r.Symbol,c=o("wks");t.exports=function(t){return c[t]||(c[t]=s&&a[t]||(s?a:i)("Symbol."+t))}},function(t,e){t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,e,n){var r=n(11);t.exports=function(t){if(!r(t))throw TypeError(String(t)+" is not an object");return t}},function(t,e,n){"use strict";var r=n(30),o=n(107),i=n(25),s=n(17),a=n(73),c=s.set,u=s.getterFor("Array Iterator");t.exports=a(Array,"Array",function(t,e){c(this,{type:"Array Iterator",target:r(t),index:0,kind:e})},function(){var t=u(this),e=t.target,n=t.kind,r=t.index++;return!e||r>=e.length?(t.target=void 0,{value:void 0,done:!0}):"keys"==n?{value:r,done:!1}:"values"==n?{value:e[r],done:!1}:{value:[r,e[r]],done:!1}},"values"),i.Arguments=i.Array,o("keys"),o("values"),o("entries")},function(t,e,n){n(9),(()=>{const e=n(112),r=n(114),o=n(48);class i extends Error{constructor(t){super(t);const n=(new Date).toISOString(),i=e.os.toString(),s=`${e.name} ${e.version}`,a=r.parse(this)[0],c=`${a.fileName}`,u=a.lineNumber,l=a.columnNumber,{jobID:p,taskID:f,clientID:h}=o;Object.defineProperties(this,Object.freeze({system:{get:()=>i},client:{get:()=>s},time:{get:()=>n},jobID:{get:()=>p},taskID:{get:()=>f},projID:{get:()=>void 0},clientID:{get:()=>h},filename:{get:()=>c},line:{get:()=>u},column:{get:()=>l}}))}async save(){const t={system:this.system,client:this.client,time:this.time,job_id:this.jobID,task_id:this.taskID,proj_id:this.projID,client_id:this.clientID,message:this.message,filename:this.filename,line:this.line,column:this.column,stack:this.stack};try{const e=n(18);await e.server.exception(t)}catch(t){}}}t.exports={Exception:i,ArgumentError:class extends i{constructor(t){super(t)}},DataError:class extends i{constructor(t){super(t)}},ScriptingError:class extends i{constructor(t){super(t)}},PluginError:class extends i{constructor(t){super(t)}},ServerError:class extends i{constructor(t,e){super(t),Object.defineProperties(this,Object.freeze({code:{get:()=>e}}))}}}})()},function(t,e,n){"use strict";var r=n(78),o=n(135),i=Object.prototype.toString;function s(t){return"[object Array]"===i.call(t)}function a(t){return null!==t&&"object"==typeof t}function c(t){return"[object Function]"===i.call(t)}function u(t,e){if(null!=t)if("object"!=typeof t&&(t=[t]),s(t))for(var n=0,r=t.length;ns;){var a,c,u,l=r[s++],p=i?l.ok:l.fail,f=l.resolve,h=l.reject,d=l.domain;try{p?(i||(2===e.rejection&&Y(t,e),e.rejection=1),!0===p?a=o:(d&&d.enter(),a=p(o),d&&(d.exit(),u=!0)),a===l.promise?h(M("Promise-chain cycle")):(c=V(a))?c.call(a,f,h):f(a)):h(o)}catch(t){d&&!u&&d.exit(),h(t)}}e.reactions=[],e.notified=!1,n&&!e.rejection&&K(t,e)})}},H=function(t,e,n){var r,o;W?((r=$.createEvent("Event")).promise=e,r.reason=n,r.initEvent(t,!1,!0),c.dispatchEvent(r)):r={promise:e,reason:n},(o=c["on"+t])?o(r):"unhandledrejection"===t&&j("Unhandled promise rejection",n)},K=function(t,e){w.call(c,function(){var n,r=e.value;if(Z(e)&&(n=S(function(){G?R.emit("unhandledRejection",r,t):H("unhandledrejection",t,r)}),e.rejection=G||Z(e)?2:1,n.error))throw n.value})},Z=function(t){return 1!==t.rejection&&!t.parent},Y=function(t,e){w.call(c,function(){G?R.emit("rejectionHandled",t):H("rejectionhandled",t,e.value)})},Q=function(t,e,n,r){return function(o){t(e,n,o,r)}},tt=function(t,e,n,r){e.done||(e.done=!0,r&&(e=r),e.value=n,e.state=2,X(t,e,!0))},et=function(t,e,n,r){if(!e.done){e.done=!0,r&&(e=r);try{if(t===n)throw M("Promise can't be resolved itself");var o=V(n);o?O(function(){var r={done:!1};try{o.call(n,Q(et,t,r,e),Q(tt,t,r,e))}catch(n){tt(t,r,n,e)}}):(e.value=n,e.state=1,X(t,e,!1))}catch(n){tt(t,{done:!1},n,e)}}};J&&(N=function(t){b(this,N,_),d(t),r.call(this);var e=I(this);try{t(Q(et,this,e),Q(tt,this,e))}catch(t){tt(this,e,t)}},(r=function(t){F(this,{type:_,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:0,value:void 0})}).prototype=l(N.prototype,{then:function(t,e){var n=C(this),r=B(v(this,N));return r.ok="function"!=typeof t||t,r.fail="function"==typeof e&&e,r.domain=G?R.domain:void 0,n.parent=!0,n.reactions.push(r),0!=n.state&&X(this,n,!1),r.promise},catch:function(t){return this.then(void 0,t)}}),o=function(){var t=new r,e=I(t);this.promise=t,this.resolve=Q(et,t,e),this.reject=Q(tt,t,e)},k.f=B=function(t){return t===N||t===i?new o(t):U(t)},a||"function"!=typeof D||s({global:!0,enumerable:!0,forced:!0},{fetch:function(t){return x(N,D.apply(c,arguments))}})),s({global:!0,wrap:!0,forced:J},{Promise:N}),p(N,_,!1,!0),f(_),i=u.Promise,s({target:_,stat:!0,forced:J},{reject:function(t){var e=B(this);return e.reject.call(void 0,t),e.promise}}),s({target:_,stat:!0,forced:a||J},{resolve:function(t){return x(a&&this===i?N:this,t)}}),s({target:_,stat:!0,forced:q},{all:function(t){var e=this,n=B(e),r=n.resolve,o=n.reject,i=S(function(){var n=d(e.resolve),i=[],s=0,a=1;m(t,function(t){var c=s++,u=!1;i.push(void 0),a++,n.call(e,t).then(function(t){u||(u=!0,i[c]=t,--a||r(i))},o)}),--a||r(i)});return i.error&&o(i.value),n.promise},race:function(t){var e=this,n=B(e),r=n.reject,o=S(function(){var o=d(e.resolve);m(t,function(t){o.call(e,t).then(n.resolve,r)})});return o.error&&r(o.value),n.promise}})},function(t,e,n){var r=n(2);t.exports=!r(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(t,e){t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},function(t,e,n){var r=n(10),o=n(14),i=n(29);t.exports=r?function(t,e,n){return o.f(t,e,i(1,n))}:function(t,e,n){return t[e]=n,t}},function(t,e,n){var r=n(0),o=n(40).f,i=n(12),s=n(16),a=n(43),c=n(58),u=n(62);t.exports=function(t,e){var n,l,p,f,h,d=t.target,b=t.global,g=t.stat;if(n=b?r:g?r[d]||a(d,{}):(r[d]||{}).prototype)for(l in e){if(f=e[l],p=t.noTargetGet?(h=o(n,l))&&h.value:n[l],!u(b?l:d+(g?".":"#")+l,t.forced)&&void 0!==p){if(typeof f==typeof p)continue;c(f,p)}(t.sham||p&&p.sham)&&i(f,"sham",!0),s(n,l,f,t)}}},function(t,e,n){var r=n(10),o=n(55),i=n(3),s=n(41),a=Object.defineProperty;e.f=r?a:function(t,e,n){if(i(t),e=s(e,!0),i(n),o)try{return a(t,e,n)}catch(t){}if("get"in n||"set"in n)throw TypeError("Accessors not supported");return"value"in n&&(t[e]=n.value),t}},function(t,e){var n={}.toString;t.exports=function(t){return n.call(t).slice(8,-1)}},function(t,e,n){var r=n(0),o=n(31),i=n(12),s=n(7),a=n(43),c=n(56),u=n(17),l=u.get,p=u.enforce,f=String(c).split("toString");o("inspectSource",function(t){return c.call(t)}),(t.exports=function(t,e,n,o){var c=!!o&&!!o.unsafe,u=!!o&&!!o.enumerable,l=!!o&&!!o.noTargetGet;"function"==typeof n&&("string"!=typeof e||s(n,"name")||i(n,"name",e),p(n).source=f.join("string"==typeof e?e:"")),t!==r?(c?!l&&t[e]&&(u=!0):delete t[e],u?t[e]=n:i(t,e,n)):u?t[e]=n:a(e,n)})(Function.prototype,"toString",function(){return"function"==typeof this&&l(this).source||c.call(this)})},function(t,e,n){var r,o,i,s=n(91),a=n(0),c=n(11),u=n(12),l=n(7),p=n(44),f=n(45),h=a.WeakMap;if(s){var d=new h,b=d.get,g=d.has,m=d.set;r=function(t,e){return m.call(d,t,e),e},o=function(t){return b.call(d,t)||{}},i=function(t){return g.call(d,t)}}else{var y=p("state");f[y]=!0,r=function(t,e){return u(t,y,e),e},o=function(t){return l(t,y)?t[y]:{}},i=function(t){return l(t,y)}}t.exports={set:r,get:o,has:i,enforce:function(t){return i(t)?o(t):r(t,{})},getterFor:function(t){return function(e){var n;if(!c(e)||(n=o(e)).type!==t)throw TypeError("Incompatible receiver, "+t+" required");return n}}}},function(t,e,n){n(9),n(116),(()=>{const e=n(121),{ServerError:r}=n(5),o=n(122),i=n(48);const s=new class{constructor(){const s=n(133);s.defaults.withCredentials=!0,s.defaults.xsrfHeaderName="X-CSRFTOKEN",s.defaults.xsrfCookieName="csrftoken";let a=o.get("token");async function c(t=""){const{backendAPI:e}=i;let n=null;try{n=await s.get(`${e}/tasks?${t}`,{proxy:i.proxy})}catch(t){const e=t.response?t.response.status:t.code;throw new r("Could not get tasks from a server",e)}return n.data.results.count=n.data.count,n.data.results}async function u(t){const{backendAPI:e}=i;try{await s.delete(`${e}/tasks/${t}`)}catch(t){const e=t.response?t.response.status:t.code;throw new r("Could not delete the task from the server",e)}}a&&(s.defaults.headers.common.Authorization=`Token ${a}`),Object.defineProperties(this,Object.freeze({server:{value:Object.freeze({about:async function(){const{backendAPI:t}=i;let e=null;try{e=await s.get(`${t}/server/about`,{proxy:i.proxy})}catch(t){const e=t.response?t.response.status:t.code;throw new r('Could not get "about" information from the server',e)}return e.data},share:async function(t){const{backendAPI:e}=i;t=encodeURIComponent(t);let n=null;try{n=await s.get(`${e}/server/share?directory=${t}`,{proxy:i.proxy})}catch(t){const e=t.response?t.response.status:t.code;throw new r('Could not get "share" information from the server',e)}return n.data},formats:async function(){const{backendAPI:t}=i;let e=null;try{e=await s.get(`${t}/server/annotation/formats`,{proxy:i.proxy})}catch(t){const e=t.response?t.response.status:t.code;throw new r("Could not get annotation formats from the server",e)}return e.data},exception:async function(t){const{backendAPI:e}=i;try{await s.post(`${e}/server/exception`,JSON.stringify(t),{proxy:i.proxy,headers:{"Content-Type":"application/json"}})}catch(t){const e=t.response?t.response.status:t.code;throw new r("Could not send an exception to the server",e)}},login:async function(t,e){const n=[`${encodeURIComponent("username")}=${encodeURIComponent(t)}`,`${encodeURIComponent("password")}=${encodeURIComponent(e)}`].join("&").replace(/%20/g,"+");let c=null;try{c=await s.post(`${i.backendAPI}/auth/login`,n,{proxy:i.proxy})}catch(t){const e=t.response?t.response.status:t.code;throw new r("Could not login on a server",e)}if(c.headers["set-cookie"]){const t=c.headers["set-cookie"].join(";");s.defaults.headers.common.Cookie=t}a=c.data.key,o.set("token",a),s.defaults.headers.common.Authorization=`Token ${a}`},logout:async function(){try{await s.post(`${i.backendAPI}/auth/logout`,{proxy:i.proxy})}catch(t){const e=t.response?t.response.status:t.code;throw new r("Could not logout from the server",e)}o.remove("token"),s.defaults.headers.common.Authorization=""},authorized:async function(){try{await t.exports.users.getSelf()}catch(t){if(401===t.code)return!1;throw t}return!0},register:async function(t,e,n,o,a,c){let u=null;try{const l=JSON.stringify({username:t,first_name:e,last_name:n,email:o,password1:a,password2:c});u=await s.post(`${i.backendAPI}/auth/register`,l,{proxy:i.proxy})}catch(e){const n=e.response?e.response.status:e.code;throw new r(`Could not register '${t}' user on the server`,n)}return u.data}}),writable:!1},tasks:{value:Object.freeze({getTasks:c,saveTask:async function(t,e){const{backendAPI:n}=i;try{await s.patch(`${n}/tasks/${t}`,JSON.stringify(e),{proxy:i.proxy,headers:{"Content-Type":"application/json"}})}catch(t){const e=t.response?t.response.status:t.code;throw new r("Could not save the task on the server",e)}},createTask:async function(t,n,o){const{backendAPI:a}=i,l=new e;for(const t in n)if(Object.prototype.hasOwnProperty.call(n,t))for(let e=0;e{setTimeout(async function i(){try{const c=await s.get(`${a}/tasks/${t}/status`);["Queued","Started"].includes(c.data.state)?(""!==c.data.message&&o(c.data.message),setTimeout(i,1e3)):"Finished"===c.data.state?e():"Failed"===c.data.state?n(new r("Could not create the task on the server",400)):n(new r(`Unknown task state has been received: ${c.data.state}`,500))}catch(t){const e=t.response?t.response.status:t.code;n(new r("Data uploading error occurred",e))}},1e3)})}(p.data.id)}catch(t){throw await u(p.data.id),t}return(await c(`?id=${p.id}`))[0]},deleteTask:u}),writable:!1},jobs:{value:Object.freeze({getJob:async function(t){const{backendAPI:e}=i;let n=null;try{n=await s.get(`${e}/jobs/${t}`,{proxy:i.proxy})}catch(t){const e=t.response?t.response.status:t.code;throw new r("Could not get jobs from a server",e)}return n.data},saveJob:async function(t,e){const{backendAPI:n}=i;try{await s.patch(`${n}/jobs/${t}`,JSON.stringify(e),{proxy:i.proxy,headers:{"Content-Type":"application/json"}})}catch(t){const e=t.response?t.response.status:t.code;throw new r("Could not save the job on the server",e)}}}),writable:!1},users:{value:Object.freeze({getUsers:async function(){const{backendAPI:t}=i;let e=null;try{e=await s.get(`${t}/users`,{proxy:i.proxy})}catch(t){const e=t.response?t.response.status:t.code;throw new r("Could not get users from the server",e)}return e.data.results},getSelf:async function(){const{backendAPI:t}=i;let e=null;try{e=await s.get(`${t}/users/self`,{proxy:i.proxy})}catch(t){const e=t.response?t.response.status:t.code;throw new r("Could not get user data from the server",e)}return e.data}}),writable:!1},frames:{value:Object.freeze({getData:async function(t,e){const{backendAPI:n}=i;let o=null;try{o=await s.get(`${n}/tasks/${t}/frames/${e}`,{proxy:i.proxy,responseType:"blob"})}catch(n){const o=n.response?n.response.status:n.code;throw new r(`Could not get frame ${e} for the task ${t} from the server`,o)}return o.data},getMeta:async function(t){const{backendAPI:e}=i;let n=null;try{n=await s.get(`${e}/tasks/${t}/frames/meta`,{proxy:i.proxy})}catch(e){const n=e.response?e.response.status:e.code;throw new r(`Could not get frame meta info for the task ${t} from the server`,n)}return n.data}}),writable:!1},annotations:{value:Object.freeze({updateAnnotations:async function(t,e,n,o){const{backendAPI:a}=i;let c=null,u=null;"PUT"===o.toUpperCase()?(c=s.put.bind(s),u=`${a}/${t}s/${e}/annotations`):(c=s.patch.bind(s),u=`${a}/${t}s/${e}/annotations?action=${o}`);let l=null;try{l=await c(u,JSON.stringify(n),{proxy:i.proxy,headers:{"Content-Type":"application/json"}})}catch(n){const o=n.response?n.response.status:n.code;throw new r(`Could not updated annotations for the ${t} ${e} on the server`,o)}return l.data},getAnnotations:async function(t,e){const{backendAPI:n}=i;let o=null;try{o=await s.get(`${n}/${t}s/${e}/annotations`,{proxy:i.proxy})}catch(n){const o=n.response?n.response.status:n.code;throw new r(`Could not get annotations for the ${t} ${e} from the server`,o)}return o.data},dumpAnnotations:async function(t,e,n){const{backendAPI:o}=i,a=e.replace(/\//g,"_");let c=`${o}/tasks/${t}/annotations/${a}?format=${n}`;return new Promise((e,n)=>{setTimeout(async function o(){try{202===(await s.get(`${c}`,{proxy:i.proxy})).status?setTimeout(o,3e3):e(c=`${c}&action=download`)}catch(e){const o=e.response?e.response.status:e.code,i=new r(`Could not dump annotations for the task ${t} from the server`,o);n(i)}})})},uploadAnnotations:async function(t,n,o,a){const{backendAPI:c}=i;let u=new e;return u.append("annotation_file",o),new Promise((o,l)=>{setTimeout(async function p(){try{202===(await s.put(`${c}/${t}s/${n}/annotations?format=${a}`,u,{proxy:i.proxy})).status?(u=new e,setTimeout(p,3e3)):o()}catch(e){const o=e.response?e.response.status:e.code,i=new r(`Could not upload annotations for the ${t} ${n}`,o);l(i)}})})}}),writable:!1}}))}};t.exports=s})()},function(t,e,n){(function(e){var n=Object.assign?Object.assign:function(t,e,n,r){for(var o=1;o{const e=Object.freeze({DIR:"DIR",REG:"REG"}),n=Object.freeze({ANNOTATION:"annotation",VALIDATION:"validation",COMPLETED:"completed"}),r=Object.freeze({ANNOTATION:"annotation",INTERPOLATION:"interpolation"}),o=Object.freeze({CHECKBOX:"checkbox",RADIO:"radio",SELECT:"select",NUMBER:"number",TEXT:"text"}),i=Object.freeze({TAG:"tag",SHAPE:"shape",TRACK:"track"}),s=Object.freeze({RECTANGLE:"rectangle",POLYGON:"polygon",POLYLINE:"polyline",POINTS:"points"}),a=Object.freeze({ALL:"all",SHAPE:"shape",NONE:"none"});t.exports={ShareFileType:e,TaskStatus:n,TaskMode:r,AttributeType:o,ObjectType:i,ObjectShape:s,VisibleState:a,LogType:{pasteObject:0,changeAttribute:1,dragObject:2,deleteObject:3,pressShortcut:4,resizeObject:5,sendLogs:6,saveJob:7,jumpFrame:8,drawObject:9,changeLabel:10,sendTaskInfo:11,loadJob:12,moveImage:13,zoomImage:14,lockObject:15,mergeObjects:16,copyObject:17,propagateObject:18,undoAction:19,redoAction:20,sendUserActivity:21,sendException:22,changeFrame:23,debugInfo:24,fitImage:25,rotateImage:26}}})()},function(t,e){t.exports=function(t){if(null==t)throw TypeError("Can't call method on "+t);return t}},function(t,e){t.exports=!1},function(t,e,n){var r=n(14).f,o=n(7),i=n(1)("toStringTag");t.exports=function(t,e,n){t&&!o(t=n?t:t.prototype,i)&&r(t,i,{configurable:!0,value:e})}},function(t,e){t.exports=function(t){if("function"!=typeof t)throw TypeError(String(t)+" is not a function");return t}},function(t,e){t.exports={}},function(t,e,n){n(106),n(4),n(9),n(8),(()=>{const{PluginError:e}=n(5),r=[];class o{static async apiWrapper(t,...n){const r=await o.list();for(const o of r){const r=o.functions.filter(e=>e.callback===t)[0];if(r&&r.enter)try{await r.enter.call(this,o,...n)}catch(t){throw t instanceof e?t:new e(`Exception in plugin ${o.name}: ${t.toString()}`)}}let i=await t.implementation.call(this,...n);for(const o of r){const r=o.functions.filter(e=>e.callback===t)[0];if(r&&r.leave)try{i=await r.leave.call(this,o,i,...n)}catch(t){throw t instanceof e?t:new e(`Exception in plugin ${o.name}: ${t.toString()}`)}}return i}static async register(t){const n=[];if("object"!=typeof t)throw new e(`Plugin should be an object, but got "${typeof t}"`);if(!("name"in t)||"string"!=typeof t.name)throw new e('Plugin must contain a "name" field and it must be a string');if(!("description"in t)||"string"!=typeof t.description)throw new e('Plugin must contain a "description" field and it must be a string');if("functions"in t)throw new e('Plugin must not contain a "functions" field');!function t(e,r){const o={};for(const n in e)Object.prototype.hasOwnProperty.call(e,n)&&("object"==typeof e[n]?Object.prototype.hasOwnProperty.call(r,n)&&t(e[n],r[n]):["enter","leave"].includes(n)&&"function"==typeof r&&(e[n],1)&&(o.callback=r,o[n]=e[n]));Object.keys(o).length&&n.push(o)}(t,{cvat:this}),Object.defineProperty(t,"functions",{value:n,writable:!1}),r.push(t)}static async list(){return r}}t.exports=o})()},function(t,e,n){var r=n(21);t.exports=function(t){return Object(r(t))}},function(t,e){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(t){"object"==typeof window&&(n=window)}t.exports=n},function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},function(t,e,n){var r=n(54),o=n(21);t.exports=function(t){return r(o(t))}},function(t,e,n){var r=n(0),o=n(43),i=n(22),s=r["__core-js_shared__"]||o("__core-js_shared__",{});(t.exports=function(t,e){return s[t]||(s[t]=void 0!==e?e:{})})("versions",[]).push({version:"3.1.3",mode:i?"pure":"global",copyright:"© 2019 Denis Pushkarev (zloirock.ru)"})},function(t,e,n){var r=n(59),o=n(0),i=function(t){return"function"==typeof t?t:void 0};t.exports=function(t,e){return arguments.length<2?i(r[t])||i(o[t]):r[t]&&r[t][e]||o[t]&&o[t][e]}},function(t,e,n){var r=n(34),o=Math.min;t.exports=function(t){return t>0?o(r(t),9007199254740991):0}},function(t,e){var n=Math.ceil,r=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?r:n)(t)}},function(t,e,n){var r=n(24);t.exports=function(t,e,n){if(r(t),void 0===e)return t;switch(n){case 0:return function(){return t.call(e)};case 1:return function(n){return t.call(e,n)};case 2:return function(n,r){return t.call(e,n,r)};case 3:return function(n,r,o){return t.call(e,n,r,o)}}return function(){return t.apply(e,arguments)}}},function(t,e,n){var r=n(99),o=n(25),i=n(1)("iterator");t.exports=function(t){if(null!=t)return t[i]||t["@@iterator"]||o[r(t)]}},function(t,e,n){n(4),n(9),n(151),n(8),n(52),(()=>{const e=n(26),r=n(18),{getFrame:o}=n(154),{ArgumentError:i}=n(5),{TaskStatus:s}=n(20),{Label:a}=n(38);function c(t){Object.defineProperties(t,{annotations:Object.freeze({value:{async upload(n,r){return await e.apiWrapper.call(this,t.annotations.upload,n,r)},async save(){return await e.apiWrapper.call(this,t.annotations.save)},async clear(n=!1){return await e.apiWrapper.call(this,t.annotations.clear,n)},async dump(n,r){return await e.apiWrapper.call(this,t.annotations.dump,n,r)},async statistics(){return await e.apiWrapper.call(this,t.annotations.statistics)},async put(n=[]){return await e.apiWrapper.call(this,t.annotations.put,n)},async get(n,r={}){return await e.apiWrapper.call(this,t.annotations.get,n,r)},async search(n,r,o){return await e.apiWrapper.call(this,t.annotations.search,n,r,o)},async select(n,r,o){return await e.apiWrapper.call(this,t.annotations.select,n,r,o)},async hasUnsavedChanges(){return await e.apiWrapper.call(this,t.annotations.hasUnsavedChanges)},async merge(n){return await e.apiWrapper.call(this,t.annotations.merge,n)},async split(n,r){return await e.apiWrapper.call(this,t.annotations.split,n,r)},async group(n,r=!1){return await e.apiWrapper.call(this,t.annotations.group,n,r)}},writable:!0}),frames:Object.freeze({value:{async get(n){return await e.apiWrapper.call(this,t.frames.get,n)}},writable:!0}),logs:Object.freeze({value:{async put(n,r){return await e.apiWrapper.call(this,t.logs.put,n,r)},async save(n){return await e.apiWrapper.call(this,t.logs.save,n)}},writable:!0}),actions:Object.freeze({value:{async undo(n){return await e.apiWrapper.call(this,t.actions.undo,n)},async redo(n){return await e.apiWrapper.call(this,t.actions.redo,n)},async clear(){return await e.apiWrapper.call(this,t.actions.clear)}},writable:!0}),events:Object.freeze({value:{async subscribe(n,r){return await e.apiWrapper.call(this,t.events.subscribe,n,r)},async unsubscribe(n,r=null){return await e.apiWrapper.call(this,t.events.unsubscribe,n,r)}},writable:!0})})}class u{constructor(){}}class l extends u{constructor(t){super();const e={id:void 0,assignee:void 0,status:void 0,start_frame:void 0,stop_frame:void 0,task:void 0};for(const n in e)if(Object.prototype.hasOwnProperty.call(e,n)&&(n in t&&(e[n]=t[n]),void 0===e[n]))throw new i(`Job field "${n}" was not initialized`);Object.defineProperties(this,Object.freeze({id:{get:()=>e.id},assignee:{get:()=>e.assignee,set:()=>t=>{if(!Number.isInteger(t)||t<0)throw new i("Value must be a non negative integer");e.assignee=t}},status:{get:()=>e.status,set:t=>{const n=s;let r=!1;for(const e in n)if(n[e]===t){r=!0;break}if(!r)throw new i("Value must be a value from the enumeration cvat.enums.TaskStatus");e.status=t}},startFrame:{get:()=>e.start_frame},stopFrame:{get:()=>e.stop_frame},task:{get:()=>e.task}})),this.annotations={get:Object.getPrototypeOf(this).annotations.get.bind(this),put:Object.getPrototypeOf(this).annotations.put.bind(this),save:Object.getPrototypeOf(this).annotations.save.bind(this),dump:Object.getPrototypeOf(this).annotations.dump.bind(this),merge:Object.getPrototypeOf(this).annotations.merge.bind(this),split:Object.getPrototypeOf(this).annotations.split.bind(this),group:Object.getPrototypeOf(this).annotations.group.bind(this),clear:Object.getPrototypeOf(this).annotations.clear.bind(this),upload:Object.getPrototypeOf(this).annotations.upload.bind(this),select:Object.getPrototypeOf(this).annotations.select.bind(this),statistics:Object.getPrototypeOf(this).annotations.statistics.bind(this),hasUnsavedChanges:Object.getPrototypeOf(this).annotations.hasUnsavedChanges.bind(this)},this.frames={get:Object.getPrototypeOf(this).frames.get.bind(this)}}async save(){return await e.apiWrapper.call(this,l.prototype.save)}}class p extends u{constructor(t){super();const e={id:void 0,name:void 0,status:void 0,size:void 0,mode:void 0,owner:void 0,assignee:void 0,created_date:void 0,updated_date:void 0,bug_tracker:void 0,overlap:void 0,segment_size:void 0,z_order:void 0,image_quality:void 0,start_frame:void 0,stop_frame:void 0,frame_filter:void 0};for(const n in e)Object.prototype.hasOwnProperty.call(e,n)&&n in t&&(e[n]=t[n]);if(e.labels=[],e.jobs=[],e.files=Object.freeze({server_files:[],client_files:[],remote_files:[]}),Array.isArray(t.segments))for(const n of t.segments)if(Array.isArray(n.jobs))for(const t of n.jobs){const r=new l({url:t.url,id:t.id,assignee:t.assignee,status:t.status,start_frame:n.start_frame,stop_frame:n.stop_frame,task:this});e.jobs.push(r)}if(Array.isArray(t.labels))for(const n of t.labels){const t=new a(n);e.labels.push(t)}Object.defineProperties(this,Object.freeze({id:{get:()=>e.id},name:{get:()=>e.name,set:t=>{if(!t.trim().length)throw new i("Value must not be empty");e.name=t}},status:{get:()=>e.status},size:{get:()=>e.size},mode:{get:()=>e.mode},owner:{get:()=>e.owner},assignee:{get:()=>e.assignee,set:()=>t=>{if(!Number.isInteger(t)||t<0)throw new i("Value must be a non negative integer");e.assignee=t}},createdDate:{get:()=>e.created_date},updatedDate:{get:()=>e.updated_date},bugTracker:{get:()=>e.bug_tracker,set:t=>{e.bug_tracker=t}},overlap:{get:()=>e.overlap,set:t=>{if(!Number.isInteger(t)||t<0)throw new i("Value must be a non negative integer");e.overlap=t}},segmentSize:{get:()=>e.segment_size,set:t=>{if(!Number.isInteger(t)||t<0)throw new i("Value must be a positive integer");e.segment_size=t}},zOrder:{get:()=>e.z_order,set:t=>{if("boolean"!=typeof t)throw new i("Value must be a boolean");e.z_order=t}},imageQuality:{get:()=>e.image_quality,set:t=>{if(!Number.isInteger(t)||t<0)throw new i("Value must be a positive integer");e.image_quality=t}},labels:{get:()=>[...e.labels],set:t=>{if(!Array.isArray(t))throw new i("Value must be an array of Labels");for(const e of t)if(!(e instanceof a))throw new i("Each array value must be an instance of Label. "+`${typeof e} was found`);void 0===e.id?e.labels=[...t]:e.labels=e.labels.concat([...t])}},jobs:{get:()=>[...e.jobs]},serverFiles:{get:()=>[...e.files.server_files],set:t=>{if(!Array.isArray(t))throw new i(`Value must be an array. But ${typeof t} has been got.`);for(const e of t)if("string"!=typeof e)throw new i(`Array values must be a string. But ${typeof e} has been got.`);Array.prototype.push.apply(e.files.server_files,t)}},clientFiles:{get:()=>[...e.files.client_files],set:t=>{if(!Array.isArray(t))throw new i(`Value must be an array. But ${typeof t} has been got.`);for(const e of t)if(!(e instanceof File))throw new i(`Array values must be a File. But ${e.constructor.name} has been got.`);Array.prototype.push.apply(e.files.client_files,t)}},remoteFiles:{get:()=>[...e.files.remote_files],set:t=>{if(!Array.isArray(t))throw new i(`Value must be an array. But ${typeof t} has been got.`);for(const e of t)if("string"!=typeof e)throw new i(`Array values must be a string. But ${typeof e} has been got.`);Array.prototype.push.apply(e.files.remote_files,t)}},startFrame:{get:()=>e.start_frame,set:t=>{if(!Number.isInteger(t)||t<0)throw new i("Value must be a not negative integer");e.start_frame=t}},stopFrame:{get:()=>e.stop_frame,set:t=>{if(!Number.isInteger(t)||t<0)throw new i("Value must be a not negative integer");e.stop_frame=t}},frameFilter:{get:()=>e.frame_filter,set:t=>{if("string"!=typeof t)throw new i(`Filter value must be a string. But ${typeof t} has been got.`);e.frame_filter=t}}})),this.annotations={get:Object.getPrototypeOf(this).annotations.get.bind(this),put:Object.getPrototypeOf(this).annotations.put.bind(this),save:Object.getPrototypeOf(this).annotations.save.bind(this),dump:Object.getPrototypeOf(this).annotations.dump.bind(this),merge:Object.getPrototypeOf(this).annotations.merge.bind(this),split:Object.getPrototypeOf(this).annotations.split.bind(this),group:Object.getPrototypeOf(this).annotations.group.bind(this),clear:Object.getPrototypeOf(this).annotations.clear.bind(this),upload:Object.getPrototypeOf(this).annotations.upload.bind(this),select:Object.getPrototypeOf(this).annotations.select.bind(this),statistics:Object.getPrototypeOf(this).annotations.statistics.bind(this),hasUnsavedChanges:Object.getPrototypeOf(this).annotations.hasUnsavedChanges.bind(this)},this.frames={get:Object.getPrototypeOf(this).frames.get.bind(this)}}async save(t=(()=>{})){return await e.apiWrapper.call(this,p.prototype.save,t)}async delete(){return await e.apiWrapper.call(this,p.prototype.delete)}}t.exports={Job:l,Task:p};const{getAnnotations:f,putAnnotations:h,saveAnnotations:d,hasUnsavedChanges:b,mergeAnnotations:g,splitAnnotations:m,groupAnnotations:y,clearAnnotations:v,selectObject:w,annotationsStatistics:O,uploadAnnotations:x,dumpAnnotations:j}=n(156);c(l.prototype),c(p.prototype),l.prototype.save.implementation=async function(){if(this.id){const t={status:this.status};return await r.jobs.saveJob(this.id,t),this}throw new i("Can not save job without and id")},l.prototype.frames.get.implementation=async function(t){if(!Number.isInteger(t)||t<0)throw new i(`Frame must be a positive integer. Got: "${t}"`);if(tthis.stopFrame)throw new i(`The frame with number ${t} is out of the job`);return await o(this.task.id,this.task.mode,t)},l.prototype.annotations.get.implementation=async function(t,e){if(tthis.stopFrame)throw new i(`Frame ${t} does not exist in the job`);return await f(this,t,e)},l.prototype.annotations.save.implementation=async function(t){return await d(this,t)},l.prototype.annotations.merge.implementation=async function(t){return await g(this,t)},l.prototype.annotations.split.implementation=async function(t,e){return await m(this,t,e)},l.prototype.annotations.group.implementation=async function(t,e){return await y(this,t,e)},l.prototype.annotations.hasUnsavedChanges.implementation=function(){return b(this)},l.prototype.annotations.clear.implementation=async function(t){return await v(this,t)},l.prototype.annotations.select.implementation=function(t,e,n){return w(this,t,e,n)},l.prototype.annotations.statistics.implementation=function(){return O(this)},l.prototype.annotations.put.implementation=function(t){return h(this,t)},l.prototype.annotations.upload.implementation=async function(t,e){return await x(this,t,e)},l.prototype.annotations.dump.implementation=async function(t,e){return await j(this,t,e)},p.prototype.save.implementation=async function(t){if(void 0!==this.id){const t={name:this.name,bug_tracker:this.bugTracker,z_order:this.zOrder,labels:[...this.labels.map(t=>t.toJSON())]};return await r.tasks.saveTask(this.id,t),this}const e={name:this.name,labels:this.labels.map(t=>t.toJSON()),image_quality:this.imageQuality,z_order:Boolean(this.zOrder)};this.bugTracker&&(e.bug_tracker=this.bugTracker),this.segmentSize&&(e.segment_size=this.segmentSize),this.overlap&&(e.overlap=this.overlap),this.startFrame&&(e.start_frame=this.startFrame),this.stopFrame&&(e.stop_frame=this.stopFrame),this.frameFilter&&(e.frame_filter=this.frameFilter);const n={client_files:this.clientFiles,server_files:this.serverFiles,remote_files:this.remoteFiles},o=await r.tasks.createTask(e,n,t);return new p(o)},p.prototype.delete.implementation=async function(){return await r.tasks.deleteTask(this.id)},p.prototype.frames.get.implementation=async function(t){if(!Number.isInteger(t)||t<0)throw new i(`Frame must be a positive integer. Got: "${t}"`);if(t>=this.size)throw new i(`The frame with number ${t} is out of the task`);return await o(this.id,this.mode,t)},p.prototype.annotations.get.implementation=async function(t,e){if(!Number.isInteger(t)||t<0)throw new i(`Frame must be a positive integer. Got: "${t}"`);if(t>=this.size)throw new i(`Frame ${t} does not exist in the task`);return await f(this,t,e)},p.prototype.annotations.save.implementation=async function(t){return await d(this,t)},p.prototype.annotations.merge.implementation=async function(t){return await g(this,t)},p.prototype.annotations.split.implementation=async function(t,e){return await m(this,t,e)},p.prototype.annotations.group.implementation=async function(t,e){return await y(this,t,e)},p.prototype.annotations.hasUnsavedChanges.implementation=function(){return b(this)},p.prototype.annotations.clear.implementation=async function(t){return await v(this,t)},p.prototype.annotations.select.implementation=function(t,e,n){return w(this,t,e,n)},p.prototype.annotations.statistics.implementation=function(){return O(this)},p.prototype.annotations.put.implementation=function(t){return h(this,t)},p.prototype.annotations.upload.implementation=async function(t,e){return await x(this,t,e)},p.prototype.annotations.dump.implementation=async function(t,e){return await j(this,t,e)}})()},function(t,e,n){n(4),n(8),n(52),(()=>{const{AttributeType:e}=n(20),{ArgumentError:r}=n(5);class o{constructor(t){const n={id:void 0,default_value:void 0,input_type:void 0,mutable:void 0,name:void 0,values:void 0};for(const e in n)Object.prototype.hasOwnProperty.call(n,e)&&Object.prototype.hasOwnProperty.call(t,e)&&(Array.isArray(t[e])?n[e]=[...t[e]]:n[e]=t[e]);if(!Object.values(e).includes(n.input_type))throw new r(`Got invalid attribute type ${n.input_type}`);Object.defineProperties(this,Object.freeze({id:{get:()=>n.id},defaultValue:{get:()=>n.default_value},inputType:{get:()=>n.input_type},mutable:{get:()=>n.mutable},name:{get:()=>n.name},values:{get:()=>[...n.values]}}))}toJSON(){const t={name:this.name,mutable:this.mutable,input_type:this.inputType,default_value:this.defaultValue,values:this.values};return void 0!==this.id&&(t.id=this.id),t}}t.exports={Attribute:o,Label:class{constructor(t){const e={id:void 0,name:void 0};for(const n in e)Object.prototype.hasOwnProperty.call(e,n)&&Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);if(e.attributes=[],Object.prototype.hasOwnProperty.call(t,"attributes")&&Array.isArray(t.attributes))for(const n of t.attributes)e.attributes.push(new o(n));Object.defineProperties(this,Object.freeze({id:{get:()=>e.id},name:{get:()=>e.name},attributes:{get:()=>[...e.attributes]}}))}toJSON(){const t={name:this.name,attributes:[...this.attributes.map(t=>t.toJSON())]};return void 0!==this.id&&(t.id=this.id),t}}}})()},function(t,e,n){(()=>{const{ArgumentError:e}=n(5);t.exports={isBoolean:function(t){return"boolean"==typeof t},isInteger:function(t){return"number"==typeof t&&Number.isInteger(t)},isEnum:function(t){for(const e in this)if(Object.prototype.hasOwnProperty.call(this,e)&&this[e]===t)return!0;return!1},isString:function(t){return"string"==typeof t},checkFilter:function(t,n){for(const r in t)if(Object.prototype.hasOwnProperty.call(t,r)){if(!(r in n))throw new e(`Unsupported filter property has been recieved: "${r}"`);if(!n[r](t[r]))throw new e(`Received filter property "${r}" is not satisfied for checker`)}},checkObjectType:function(t,n,r,o){if(r){if(typeof n!==r){if("integer"===r&&Number.isInteger(n))return;throw new e(`"${t}" is expected to be "${r}", but "${typeof n}" has been got.`)}}else if(o&&!(n instanceof o)){if(void 0!==n)throw new e(`"${t}" is expected to be ${o.name}, but `+`"${n.constructor.name}" has been got`);throw new e(`"${t}" is expected to be ${o.name}, but "undefined" has been got.`)}}}})()},function(t,e,n){var r=n(10),o=n(53),i=n(29),s=n(30),a=n(41),c=n(7),u=n(55),l=Object.getOwnPropertyDescriptor;e.f=r?l:function(t,e){if(t=s(t),e=a(e,!0),u)try{return l(t,e)}catch(t){}if(c(t,e))return i(!o.f.call(t,e),t[e])}},function(t,e,n){var r=n(11);t.exports=function(t,e){if(!r(t))return t;var n,o;if(e&&"function"==typeof(n=t.toString)&&!r(o=n.call(t)))return o;if("function"==typeof(n=t.valueOf)&&!r(o=n.call(t)))return o;if(!e&&"function"==typeof(n=t.toString)&&!r(o=n.call(t)))return o;throw TypeError("Can't convert object to primitive value")}},function(t,e,n){var r=n(0),o=n(11),i=r.document,s=o(i)&&o(i.createElement);t.exports=function(t){return s?i.createElement(t):{}}},function(t,e,n){var r=n(0),o=n(12);t.exports=function(t,e){try{o(r,t,e)}catch(n){r[t]=e}return e}},function(t,e,n){var r=n(31),o=n(57),i=r("keys");t.exports=function(t){return i[t]||(i[t]=o(t))}},function(t,e){t.exports={}},function(t,e){t.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},function(t,e){t.exports=function(t,e,n){if(!(t instanceof e))throw TypeError("Incorrect "+(n?n+" ":"")+"invocation");return t}},function(t,e){t.exports={backendAPI:"http://localhost:7000/api/v1",proxy:!1,taskID:void 0,jobID:void 0,clientID:+Date.now().toString().substr(-6)}},function(t,e,n){var r=n(34),o=n(21),i=function(t){return function(e,n){var i,s,a=String(o(e)),c=r(n),u=a.length;return c<0||c>=u?t?"":void 0:(i=a.charCodeAt(c))<55296||i>56319||c+1===u||(s=a.charCodeAt(c+1))<56320||s>57343?t?a.charAt(c):i:t?a.slice(c,c+2):s-56320+(i-55296<<10)+65536}};t.exports={codeAt:i(!1),charAt:i(!0)}},function(t,e,n){"use strict";(function(e){var r=n(6),o=n(137),i={"Content-Type":"application/x-www-form-urlencoded"};function s(t,e){!r.isUndefined(t)&&r.isUndefined(t["Content-Type"])&&(t["Content-Type"]=e)}var a,c={adapter:("undefined"!=typeof XMLHttpRequest?a=n(80):void 0!==e&&(a=n(80)),a),transformRequest:[function(t,e){return o(e,"Content-Type"),r.isFormData(t)||r.isArrayBuffer(t)||r.isBuffer(t)||r.isStream(t)||r.isFile(t)||r.isBlob(t)?t:r.isArrayBufferView(t)?t.buffer:r.isURLSearchParams(t)?(s(e,"application/x-www-form-urlencoded;charset=utf-8"),t.toString()):r.isObject(t)?(s(e,"application/json;charset=utf-8"),JSON.stringify(t)):t}],transformResponse:[function(t){if("string"==typeof t)try{t=JSON.parse(t)}catch(t){}return t}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,validateStatus:function(t){return t>=200&&t<300}};c.headers={common:{Accept:"application/json, text/plain, */*"}},r.forEach(["delete","get","head"],function(t){c.headers[t]={}}),r.forEach(["post","put","patch"],function(t){c.headers[t]=r.merge(i)}),t.exports=c}).call(this,n(79))},function(t,e,n){n(4),n(9),n(8),(()=>{const e=n(26),{ArgumentError:r}=n(5);class o{constructor(t){const e={label:null,attributes:{},points:null,outside:null,occluded:null,keyframe:null,group:null,zOrder:null,lock:null,color:null,visibility:null,clientID:t.clientID,serverID:t.serverID,frame:t.frame,objectType:t.objectType,shapeType:t.shapeType,updateFlags:{}};Object.defineProperty(e.updateFlags,"reset",{value:function(){this.label=!1,this.attributes=!1,this.points=!1,this.outside=!1,this.occluded=!1,this.keyframe=!1,this.group=!1,this.zOrder=!1,this.lock=!1,this.color=!1,this.visibility=!1},writable:!1}),Object.defineProperties(this,Object.freeze({updateFlags:{get:()=>e.updateFlags},frame:{get:()=>e.frame},objectType:{get:()=>e.objectType},shapeType:{get:()=>e.shapeType},clientID:{get:()=>e.clientID},serverID:{get:()=>e.serverID},label:{get:()=>e.label,set:t=>{e.updateFlags.label=!0,e.label=t}},color:{get:()=>e.color,set:t=>{e.updateFlags.color=!0,e.color=t}},visibility:{get:()=>e.visibility,set:t=>{e.updateFlags.visibility=!0,e.visibility=t}},points:{get:()=>e.points,set:t=>{if(!Array.isArray(t))throw new r("Points are expected to be an array "+`but got ${"object"==typeof t?t.constructor.name:typeof t}`);e.updateFlags.points=!0,e.points=[...t]}},group:{get:()=>e.group,set:t=>{e.updateFlags.group=!0,e.group=t}},zOrder:{get:()=>e.zOrder,set:t=>{e.updateFlags.zOrder=!0,e.zOrder=t}},outside:{get:()=>e.outside,set:t=>{e.updateFlags.outside=!0,e.outside=t}},keyframe:{get:()=>e.keyframe,set:t=>{e.updateFlags.keyframe=!0,e.keyframe=t}},occluded:{get:()=>e.occluded,set:t=>{e.updateFlags.occluded=!0,e.occluded=t}},lock:{get:()=>e.lock,set:t=>{e.updateFlags.lock=!0,e.lock=t}},attributes:{get:()=>e.attributes,set:t=>{if("object"!=typeof t)throw new r("Attributes are expected to be an object "+`but got ${"object"==typeof t?t.constructor.name:typeof t}`);for(const n of Object.keys(t))e.updateFlags.attributes=!0,e.attributes[n]=t[n]}}})),this.label=t.label,this.group=t.group,this.zOrder=t.zOrder,this.outside=t.outside,this.keyframe=t.keyframe,this.occluded=t.occluded,this.color=t.color,this.lock=t.lock,this.visibility=t.visibility,void 0!==t.points&&(this.points=t.points),void 0!==t.attributes&&(this.attributes=t.attributes),e.updateFlags.reset()}async save(){return await e.apiWrapper.call(this,o.prototype.save)}async delete(t=!1){return await e.apiWrapper.call(this,o.prototype.delete,t)}async up(){return await e.apiWrapper.call(this,o.prototype.up)}async down(){return await e.apiWrapper.call(this,o.prototype.down)}}o.prototype.save.implementation=async function(){return this.hidden&&this.hidden.save?this.hidden.save():this},o.prototype.delete.implementation=async function(t){return!(!this.hidden||!this.hidden.delete)&&this.hidden.delete(t)},o.prototype.up.implementation=async function(){return!(!this.hidden||!this.hidden.up)&&this.hidden.up()},o.prototype.down.implementation=async function(){return!(!this.hidden||!this.hidden.down)&&this.hidden.down()},t.exports=o})()},function(t,e,n){"use strict";n(13)({target:"URL",proto:!0,enumerable:!0},{toJSON:function(){return URL.prototype.toString.call(this)}})},function(t,e,n){"use strict";var r={}.propertyIsEnumerable,o=Object.getOwnPropertyDescriptor,i=o&&!r.call({1:2},1);e.f=i?function(t){var e=o(this,t);return!!e&&e.enumerable}:r},function(t,e,n){var r=n(2),o=n(15),i="".split;t.exports=r(function(){return!Object("z").propertyIsEnumerable(0)})?function(t){return"String"==o(t)?i.call(t,""):Object(t)}:Object},function(t,e,n){var r=n(10),o=n(2),i=n(42);t.exports=!r&&!o(function(){return 7!=Object.defineProperty(i("div"),"a",{get:function(){return 7}}).a})},function(t,e,n){var r=n(31);t.exports=r("native-function-to-string",Function.toString)},function(t,e){var n=0,r=Math.random();t.exports=function(t){return"Symbol("+String(void 0===t?"":t)+")_"+(++n+r).toString(36)}},function(t,e,n){var r=n(7),o=n(92),i=n(40),s=n(14);t.exports=function(t,e){for(var n=o(e),a=s.f,c=i.f,u=0;uc;)r(a,n=e[c++])&&(~i(u,n)||u.push(n));return u}},function(t,e){e.f=Object.getOwnPropertySymbols},function(t,e,n){var r=n(2),o=/#|\.prototype\./,i=function(t,e){var n=a[s(t)];return n==u||n!=c&&("function"==typeof e?r(e):!!e)},s=i.normalize=function(t){return String(t).replace(o,".").toLowerCase()},a=i.data={},c=i.NATIVE="N",u=i.POLYFILL="P";t.exports=i},function(t,e,n){var r=n(16);t.exports=function(t,e,n){for(var o in e)r(t,o,e[o],n);return t}},function(t,e,n){var r=n(1),o=n(25),i=r("iterator"),s=Array.prototype;t.exports=function(t){return void 0!==t&&(o.Array===t||s[i]===t)}},function(t,e,n){var r=n(3);t.exports=function(t,e,n,o){try{return o?e(r(n)[0],n[1]):e(n)}catch(e){var i=t.return;throw void 0!==i&&r(i.call(t)),e}}},function(t,e,n){var r,o,i,s=n(0),a=n(2),c=n(15),u=n(35),l=n(67),p=n(42),f=s.location,h=s.setImmediate,d=s.clearImmediate,b=s.process,g=s.MessageChannel,m=s.Dispatch,y=0,v={},w=function(t){if(v.hasOwnProperty(t)){var e=v[t];delete v[t],e()}},O=function(t){return function(){w(t)}},x=function(t){w(t.data)},j=function(t){s.postMessage(t+"",f.protocol+"//"+f.host)};h&&d||(h=function(t){for(var e=[],n=1;arguments.length>n;)e.push(arguments[n++]);return v[++y]=function(){("function"==typeof t?t:Function(t)).apply(void 0,e)},r(y),y},d=function(t){delete v[t]},"process"==c(b)?r=function(t){b.nextTick(O(t))}:m&&m.now?r=function(t){m.now(O(t))}:g?(i=(o=new g).port2,o.port1.onmessage=x,r=u(i.postMessage,i,1)):!s.addEventListener||"function"!=typeof postMessage||s.importScripts||a(j)?r="onreadystatechange"in p("script")?function(t){l.appendChild(p("script")).onreadystatechange=function(){l.removeChild(this),w(t)}}:function(t){setTimeout(O(t),0)}:(r=j,s.addEventListener("message",x,!1))),t.exports={set:h,clear:d}},function(t,e,n){var r=n(32);t.exports=r("document","documentElement")},function(t,e,n){var r=n(32);t.exports=r("navigator","userAgent")||""},function(t,e,n){"use strict";var r=n(24),o=function(t){var e,n;this.promise=new t(function(t,r){if(void 0!==e||void 0!==n)throw TypeError("Bad Promise constructor");e=t,n=r}),this.resolve=r(e),this.reject=r(n)};t.exports.f=function(t){return new o(t)}},function(t,e,n){var r=n(3),o=n(71),i=n(46),s=n(45),a=n(67),c=n(42),u=n(44)("IE_PROTO"),l=function(){},p=function(){var t,e=c("iframe"),n=i.length;for(e.style.display="none",a.appendChild(e),e.src=String("javascript:"),(t=e.contentWindow.document).open(),t.write("
It can contain keys:\n *
  • name\n *
  • assignee\n *
  • bug_tracker\n *
  • z_order\n *
  • labels\n *
  • segment_size\n *
  • overlap\n */\n constructor(initialData) {\n super();\n const data = {\n id: undefined,\n name: undefined,\n status: undefined,\n size: undefined,\n mode: undefined,\n owner: undefined,\n assignee: undefined,\n created_date: undefined,\n updated_date: undefined,\n bug_tracker: undefined,\n overlap: undefined,\n segment_size: undefined,\n z_order: undefined,\n image_quality: undefined,\n start_frame: undefined,\n stop_frame: undefined,\n frame_filter: undefined,\n };\n\n for (const property in data) {\n if (Object.prototype.hasOwnProperty.call(data, property)\n && property in initialData) {\n data[property] = initialData[property];\n }\n }\n\n data.labels = [];\n data.jobs = [];\n data.files = Object.freeze({\n server_files: [],\n client_files: [],\n remote_files: [],\n });\n\n if (Array.isArray(initialData.segments)) {\n for (const segment of initialData.segments) {\n if (Array.isArray(segment.jobs)) {\n for (const job of segment.jobs) {\n const jobInstance = new Job({\n url: job.url,\n id: job.id,\n assignee: job.assignee,\n status: job.status,\n start_frame: segment.start_frame,\n stop_frame: segment.stop_frame,\n task: this,\n });\n data.jobs.push(jobInstance);\n }\n }\n }\n }\n\n if (Array.isArray(initialData.labels)) {\n for (const label of initialData.labels) {\n const classInstance = new Label(label);\n data.labels.push(classInstance);\n }\n }\n\n Object.defineProperties(this, Object.freeze({\n /**\n * @name id\n * @type {integer}\n * @memberof module:API.cvat.classes.Task\n * @readonly\n * @instance\n */\n id: {\n get: () => data.id,\n },\n /**\n * @name name\n * @type {string}\n * @memberof module:API.cvat.classes.Task\n * @instance\n * @throws {module:API.cvat.exceptions.ArgumentError}\n */\n name: {\n get: () => data.name,\n set: (value) => {\n if (!value.trim().length) {\n throw new ArgumentError(\n 'Value must not be empty',\n );\n }\n data.name = value;\n },\n },\n /**\n * @name status\n * @type {module:API.cvat.enums.TaskStatus}\n * @memberof module:API.cvat.classes.Task\n * @readonly\n * @instance\n */\n status: {\n get: () => data.status,\n },\n /**\n * @name size\n * @type {integer}\n * @memberof module:API.cvat.classes.Task\n * @readonly\n * @instance\n */\n size: {\n get: () => data.size,\n },\n /**\n * @name mode\n * @type {TaskMode}\n * @memberof module:API.cvat.classes.Task\n * @readonly\n * @instance\n */\n mode: {\n get: () => data.mode,\n },\n /**\n * Identificator of a user who has created the task\n * @name owner\n * @type {integer}\n * @memberof module:API.cvat.classes.Task\n * @readonly\n * @instance\n */\n owner: {\n get: () => data.owner,\n },\n /**\n * Identificator of a user who is responsible for the task\n * @name assignee\n * @type {integer}\n * @memberof module:API.cvat.classes.Task\n * @instance\n * @throws {module:API.cvat.exceptions.ArgumentError}\n */\n assignee: {\n get: () => data.assignee,\n set: () => (assignee) => {\n if (!Number.isInteger(assignee) || assignee < 0) {\n throw new ArgumentError(\n 'Value must be a non negative integer',\n );\n }\n data.assignee = assignee;\n },\n },\n /**\n * @name createdDate\n * @type {string}\n * @memberof module:API.cvat.classes.Task\n * @readonly\n * @instance\n */\n createdDate: {\n get: () => data.created_date,\n },\n /**\n * @name updatedDate\n * @type {string}\n * @memberof module:API.cvat.classes.Task\n * @readonly\n * @instance\n */\n updatedDate: {\n get: () => data.updated_date,\n },\n /**\n * @name bugTracker\n * @type {string}\n * @memberof module:API.cvat.classes.Task\n * @instance\n * @throws {module:API.cvat.exceptions.ArgumentError}\n */\n bugTracker: {\n get: () => data.bug_tracker,\n set: (tracker) => {\n data.bug_tracker = tracker;\n },\n },\n /**\n * @name overlap\n * @type {integer}\n * @memberof module:API.cvat.classes.Task\n * @instance\n * @throws {module:API.cvat.exceptions.ArgumentError}\n */\n overlap: {\n get: () => data.overlap,\n set: (overlap) => {\n if (!Number.isInteger(overlap) || overlap < 0) {\n throw new ArgumentError(\n 'Value must be a non negative integer',\n );\n }\n data.overlap = overlap;\n },\n },\n /**\n * @name segmentSize\n * @type {integer}\n * @memberof module:API.cvat.classes.Task\n * @instance\n * @throws {module:API.cvat.exceptions.ArgumentError}\n */\n segmentSize: {\n get: () => data.segment_size,\n set: (segment) => {\n if (!Number.isInteger(segment) || segment < 0) {\n throw new ArgumentError(\n 'Value must be a positive integer',\n );\n }\n data.segment_size = segment;\n },\n },\n /**\n * @name zOrder\n * @type {boolean}\n * @memberof module:API.cvat.classes.Task\n * @instance\n * @throws {module:API.cvat.exceptions.ArgumentError}\n */\n zOrder: {\n get: () => data.z_order,\n set: (zOrder) => {\n if (typeof (zOrder) !== 'boolean') {\n throw new ArgumentError(\n 'Value must be a boolean',\n );\n }\n data.z_order = zOrder;\n },\n },\n /**\n * @name imageQuality\n * @type {integer}\n * @memberof module:API.cvat.classes.Task\n * @instance\n * @throws {module:API.cvat.exceptions.ArgumentError}\n */\n imageQuality: {\n get: () => data.image_quality,\n set: (quality) => {\n if (!Number.isInteger(quality) || quality < 0) {\n throw new ArgumentError(\n 'Value must be a positive integer',\n );\n }\n data.image_quality = quality;\n },\n },\n /**\n * After task has been created value can be appended only.\n * @name labels\n * @type {module:API.cvat.classes.Label[]}\n * @memberof module:API.cvat.classes.Task\n * @instance\n * @throws {module:API.cvat.exceptions.ArgumentError}\n */\n labels: {\n get: () => [...data.labels],\n set: (labels) => {\n if (!Array.isArray(labels)) {\n throw new ArgumentError(\n 'Value must be an array of Labels',\n );\n }\n\n for (const label of labels) {\n if (!(label instanceof Label)) {\n throw new ArgumentError(\n 'Each array value must be an instance of Label. '\n + `${typeof (label)} was found`,\n );\n }\n }\n\n if (typeof (data.id) === 'undefined') {\n data.labels = [...labels];\n } else {\n data.labels = data.labels.concat([...labels]);\n }\n },\n },\n /**\n * @name jobs\n * @type {module:API.cvat.classes.Job[]}\n * @memberof module:API.cvat.classes.Task\n * @readonly\n * @instance\n */\n jobs: {\n get: () => [...data.jobs],\n },\n /**\n * List of files from shared resource\n * @name serverFiles\n * @type {string[]}\n * @memberof module:API.cvat.classes.Task\n * @instance\n * @throws {module:API.cvat.exceptions.ArgumentError}\n */\n serverFiles: {\n get: () => [...data.files.server_files],\n set: (serverFiles) => {\n if (!Array.isArray(serverFiles)) {\n throw new ArgumentError(\n `Value must be an array. But ${typeof (serverFiles)} has been got.`,\n );\n }\n\n for (const value of serverFiles) {\n if (typeof (value) !== 'string') {\n throw new ArgumentError(\n `Array values must be a string. But ${typeof (value)} has been got.`,\n );\n }\n }\n\n Array.prototype.push.apply(data.files.server_files, serverFiles);\n },\n },\n /**\n * List of files from client host\n * @name clientFiles\n * @type {File[]}\n * @memberof module:API.cvat.classes.Task\n * @instance\n * @throws {module:API.cvat.exceptions.ArgumentError}\n */\n clientFiles: {\n get: () => [...data.files.client_files],\n set: (clientFiles) => {\n if (!Array.isArray(clientFiles)) {\n throw new ArgumentError(\n `Value must be an array. But ${typeof (clientFiles)} has been got.`,\n );\n }\n\n for (const value of clientFiles) {\n if (!(value instanceof File)) {\n throw new ArgumentError(\n `Array values must be a File. But ${value.constructor.name} has been got.`,\n );\n }\n }\n\n Array.prototype.push.apply(data.files.client_files, clientFiles);\n },\n },\n /**\n * List of files from remote host\n * @name remoteFiles\n * @type {File[]}\n * @memberof module:API.cvat.classes.Task\n * @instance\n * @throws {module:API.cvat.exceptions.ArgumentError}\n */\n remoteFiles: {\n get: () => [...data.files.remote_files],\n set: (remoteFiles) => {\n if (!Array.isArray(remoteFiles)) {\n throw new ArgumentError(\n `Value must be an array. But ${typeof (remoteFiles)} has been got.`,\n );\n }\n\n for (const value of remoteFiles) {\n if (typeof (value) !== 'string') {\n throw new ArgumentError(\n `Array values must be a string. But ${typeof (value)} has been got.`,\n );\n }\n }\n\n Array.prototype.push.apply(data.files.remote_files, remoteFiles);\n },\n },\n /**\n * The first frame of a video to annotation\n * @name startFrame\n * @type {integer}\n * @memberof module:API.cvat.classes.Task\n * @instance\n * @throws {module:API.cvat.exceptions.ArgumentError}\n */\n startFrame: {\n get: () => data.start_frame,\n set: (frame) => {\n if (!Number.isInteger(frame) || frame < 0) {\n throw new ArgumentError(\n 'Value must be a not negative integer',\n );\n }\n data.start_frame = frame;\n },\n },\n /**\n * The last frame of a video to annotation\n * @name stopFrame\n * @type {integer}\n * @memberof module:API.cvat.classes.Task\n * @instance\n * @throws {module:API.cvat.exceptions.ArgumentError}\n */\n stopFrame: {\n get: () => data.stop_frame,\n set: (frame) => {\n if (!Number.isInteger(frame) || frame < 0) {\n throw new ArgumentError(\n 'Value must be a not negative integer',\n );\n }\n data.stop_frame = frame;\n },\n },\n /**\n * Filter to ignore some frames during task creation\n * @name frameFilter\n * @type {string}\n * @memberof module:API.cvat.classes.Task\n * @instance\n * @throws {module:API.cvat.exceptions.ArgumentError}\n */\n frameFilter: {\n get: () => data.frame_filter,\n set: (filter) => {\n if (typeof (filter) !== 'string') {\n throw new ArgumentError(\n `Filter value must be a string. But ${typeof (filter)} has been got.`,\n );\n }\n\n data.frame_filter = filter;\n },\n },\n }));\n\n // When we call a function, for example: task.annotations.get()\n // In the method get we lose the task context\n // So, we need return it\n this.annotations = {\n get: Object.getPrototypeOf(this).annotations.get.bind(this),\n put: Object.getPrototypeOf(this).annotations.put.bind(this),\n save: Object.getPrototypeOf(this).annotations.save.bind(this),\n dump: Object.getPrototypeOf(this).annotations.dump.bind(this),\n merge: Object.getPrototypeOf(this).annotations.merge.bind(this),\n split: Object.getPrototypeOf(this).annotations.split.bind(this),\n group: Object.getPrototypeOf(this).annotations.group.bind(this),\n clear: Object.getPrototypeOf(this).annotations.clear.bind(this),\n upload: Object.getPrototypeOf(this).annotations.upload.bind(this),\n select: Object.getPrototypeOf(this).annotations.select.bind(this),\n statistics: Object.getPrototypeOf(this).annotations.statistics.bind(this),\n hasUnsavedChanges: Object.getPrototypeOf(this)\n .annotations.hasUnsavedChanges.bind(this),\n };\n\n this.frames = {\n get: Object.getPrototypeOf(this).frames.get.bind(this),\n };\n }\n\n /**\n * Method updates data of a created task or creates new task from scratch\n * @method save\n * @returns {module:API.cvat.classes.Task}\n * @memberof module:API.cvat.classes.Task\n * @param {function} [onUpdate] - the function which is used only if task hasn't\n * been created yet. It called in order to notify about creation status.\n * It receives the string parameter which is a status message\n * @readonly\n * @instance\n * @async\n * @throws {module:API.cvat.exceptions.ServerError}\n * @throws {module:API.cvat.exceptions.PluginError}\n */\n async save(onUpdate = () => {}) {\n const result = await PluginRegistry\n .apiWrapper.call(this, Task.prototype.save, onUpdate);\n return result;\n }\n\n /**\n * Method deletes a task from a server\n * @method delete\n * @memberof module:API.cvat.classes.Task\n * @readonly\n * @instance\n * @async\n * @throws {module:API.cvat.exceptions.ServerError}\n * @throws {module:API.cvat.exceptions.PluginError}\n */\n async delete() {\n const result = await PluginRegistry\n .apiWrapper.call(this, Task.prototype.delete);\n return result;\n }\n }\n\n module.exports = {\n Job,\n Task,\n };\n\n const {\n getAnnotations,\n putAnnotations,\n saveAnnotations,\n hasUnsavedChanges,\n mergeAnnotations,\n splitAnnotations,\n groupAnnotations,\n clearAnnotations,\n selectObject,\n annotationsStatistics,\n uploadAnnotations,\n dumpAnnotations,\n } = require('./annotations');\n\n buildDublicatedAPI(Job.prototype);\n buildDublicatedAPI(Task.prototype);\n\n Job.prototype.save.implementation = async function () {\n // TODO: Add ability to change an assignee\n if (this.id) {\n const jobData = {\n status: this.status,\n };\n\n await serverProxy.jobs.saveJob(this.id, jobData);\n return this;\n }\n\n throw new ArgumentError(\n 'Can not save job without and id',\n );\n };\n\n Job.prototype.frames.get.implementation = async function (frame) {\n if (!Number.isInteger(frame) || frame < 0) {\n throw new ArgumentError(\n `Frame must be a positive integer. Got: \"${frame}\"`,\n );\n }\n\n if (frame < this.startFrame || frame > this.stopFrame) {\n throw new ArgumentError(\n `The frame with number ${frame} is out of the job`,\n );\n }\n\n const frameData = await getFrame(this.task.id, this.task.mode, frame);\n return frameData;\n };\n\n // TODO: Check filter for annotations\n Job.prototype.annotations.get.implementation = async function (frame, filter) {\n if (frame < this.startFrame || frame > this.stopFrame) {\n throw new ArgumentError(\n `Frame ${frame} does not exist in the job`,\n );\n }\n\n const annotationsData = await getAnnotations(this, frame, filter);\n return annotationsData;\n };\n\n Job.prototype.annotations.save.implementation = async function (onUpdate) {\n const result = await saveAnnotations(this, onUpdate);\n return result;\n };\n\n Job.prototype.annotations.merge.implementation = async function (objectStates) {\n const result = await mergeAnnotations(this, objectStates);\n return result;\n };\n\n Job.prototype.annotations.split.implementation = async function (objectState, frame) {\n const result = await splitAnnotations(this, objectState, frame);\n return result;\n };\n\n Job.prototype.annotations.group.implementation = async function (objectStates, reset) {\n const result = await groupAnnotations(this, objectStates, reset);\n return result;\n };\n\n Job.prototype.annotations.hasUnsavedChanges.implementation = function () {\n const result = hasUnsavedChanges(this);\n return result;\n };\n\n Job.prototype.annotations.clear.implementation = async function (reload) {\n const result = await clearAnnotations(this, reload);\n return result;\n };\n\n Job.prototype.annotations.select.implementation = function (frame, x, y) {\n const result = selectObject(this, frame, x, y);\n return result;\n };\n\n Job.prototype.annotations.statistics.implementation = function () {\n const result = annotationsStatistics(this);\n return result;\n };\n\n Job.prototype.annotations.put.implementation = function (objectStates) {\n const result = putAnnotations(this, objectStates);\n return result;\n };\n\n Job.prototype.annotations.upload.implementation = async function (file, loader) {\n const result = await uploadAnnotations(this, file, loader);\n return result;\n };\n\n Job.prototype.annotations.dump.implementation = async function (name, dumper) {\n const result = await dumpAnnotations(this, name, dumper);\n return result;\n };\n\n Task.prototype.save.implementation = async function saveTaskImplementation(onUpdate) {\n // TODO: Add ability to change an owner and an assignee\n if (typeof (this.id) !== 'undefined') {\n // If the task has been already created, we update it\n const taskData = {\n name: this.name,\n bug_tracker: this.bugTracker,\n z_order: this.zOrder,\n labels: [...this.labels.map(el => el.toJSON())],\n };\n\n await serverProxy.tasks.saveTask(this.id, taskData);\n return this;\n }\n\n const taskData = {\n name: this.name,\n labels: this.labels.map(el => el.toJSON()),\n image_quality: this.imageQuality,\n z_order: Boolean(this.zOrder),\n };\n\n if (this.bugTracker) {\n taskData.bug_tracker = this.bugTracker;\n }\n if (this.segmentSize) {\n taskData.segment_size = this.segmentSize;\n }\n if (this.overlap) {\n taskData.overlap = this.overlap;\n }\n if (this.startFrame) {\n taskData.start_frame = this.startFrame;\n }\n if (this.stopFrame) {\n taskData.stop_frame = this.stopFrame;\n }\n if (this.frameFilter) {\n taskData.frame_filter = this.frameFilter;\n }\n\n const taskFiles = {\n client_files: this.clientFiles,\n server_files: this.serverFiles,\n remote_files: this.remoteFiles,\n };\n\n const task = await serverProxy.tasks.createTask(taskData, taskFiles, onUpdate);\n return new Task(task);\n };\n\n Task.prototype.delete.implementation = async function () {\n const result = await serverProxy.tasks.deleteTask(this.id);\n return result;\n };\n\n Task.prototype.frames.get.implementation = async function (frame) {\n if (!Number.isInteger(frame) || frame < 0) {\n throw new ArgumentError(\n `Frame must be a positive integer. Got: \"${frame}\"`,\n );\n }\n\n if (frame >= this.size) {\n throw new ArgumentError(\n `The frame with number ${frame} is out of the task`,\n );\n }\n\n const result = await getFrame(this.id, this.mode, frame);\n return result;\n };\n\n // TODO: Check filter for annotations\n Task.prototype.annotations.get.implementation = async function (frame, filter) {\n if (!Number.isInteger(frame) || frame < 0) {\n throw new ArgumentError(\n `Frame must be a positive integer. Got: \"${frame}\"`,\n );\n }\n\n if (frame >= this.size) {\n throw new ArgumentError(\n `Frame ${frame} does not exist in the task`,\n );\n }\n\n const result = await getAnnotations(this, frame, filter);\n return result;\n };\n\n Task.prototype.annotations.save.implementation = async function (onUpdate) {\n const result = await saveAnnotations(this, onUpdate);\n return result;\n };\n\n Task.prototype.annotations.merge.implementation = async function (objectStates) {\n const result = await mergeAnnotations(this, objectStates);\n return result;\n };\n\n Task.prototype.annotations.split.implementation = async function (objectState, frame) {\n const result = await splitAnnotations(this, objectState, frame);\n return result;\n };\n\n Task.prototype.annotations.group.implementation = async function (objectStates, reset) {\n const result = await groupAnnotations(this, objectStates, reset);\n return result;\n };\n\n Task.prototype.annotations.hasUnsavedChanges.implementation = function () {\n const result = hasUnsavedChanges(this);\n return result;\n };\n\n Task.prototype.annotations.clear.implementation = async function (reload) {\n const result = await clearAnnotations(this, reload);\n return result;\n };\n\n Task.prototype.annotations.select.implementation = function (frame, x, y) {\n const result = selectObject(this, frame, x, y);\n return result;\n };\n\n Task.prototype.annotations.statistics.implementation = function () {\n const result = annotationsStatistics(this);\n return result;\n };\n\n Task.prototype.annotations.put.implementation = function (objectStates) {\n const result = putAnnotations(this, objectStates);\n return result;\n };\n\n Task.prototype.annotations.upload.implementation = async function (file, loader) {\n const result = await uploadAnnotations(this, file, loader);\n return result;\n };\n\n Task.prototype.annotations.dump.implementation = async function (name, dumper) {\n const result = await dumpAnnotations(this, name, dumper);\n return result;\n };\n})();\n","/*\n* Copyright (C) 2019 Intel Corporation\n* SPDX-License-Identifier: MIT\n*/\n\n/* global\n require:false\n*/\n\n(() => {\n const { AttributeType } = require('./enums');\n const { ArgumentError } = require('./exceptions');\n\n /**\n * Class representing an attribute\n * @memberof module:API.cvat.classes\n * @hideconstructor\n */\n class Attribute {\n constructor(initialData) {\n const data = {\n id: undefined,\n default_value: undefined,\n input_type: undefined,\n mutable: undefined,\n name: undefined,\n values: undefined,\n };\n\n for (const key in data) {\n if (Object.prototype.hasOwnProperty.call(data, key)) {\n if (Object.prototype.hasOwnProperty.call(initialData, key)) {\n if (Array.isArray(initialData[key])) {\n data[key] = [...initialData[key]];\n } else {\n data[key] = initialData[key];\n }\n }\n }\n }\n\n if (!Object.values(AttributeType).includes(data.input_type)) {\n throw new ArgumentError(\n `Got invalid attribute type ${data.input_type}`,\n );\n }\n\n Object.defineProperties(this, Object.freeze({\n /**\n * @name id\n * @type {integer}\n * @memberof module:API.cvat.classes.Attribute\n * @readonly\n * @instance\n */\n id: {\n get: () => data.id,\n },\n /**\n * @name defaultValue\n * @type {(string|integer|boolean)}\n * @memberof module:API.cvat.classes.Attribute\n * @readonly\n * @instance\n */\n defaultValue: {\n get: () => data.default_value,\n },\n /**\n * @name inputType\n * @type {module:API.cvat.enums.AttributeType}\n * @memberof module:API.cvat.classes.Attribute\n * @readonly\n * @instance\n */\n inputType: {\n get: () => data.input_type,\n },\n /**\n * @name mutable\n * @type {boolean}\n * @memberof module:API.cvat.classes.Attribute\n * @readonly\n * @instance\n */\n mutable: {\n get: () => data.mutable,\n },\n /**\n * @name name\n * @type {string}\n * @memberof module:API.cvat.classes.Attribute\n * @readonly\n * @instance\n */\n name: {\n get: () => data.name,\n },\n /**\n * @name values\n * @type {(string[]|integer[]|boolean[])}\n * @memberof module:API.cvat.classes.Attribute\n * @readonly\n * @instance\n */\n values: {\n get: () => [...data.values],\n },\n }));\n }\n\n toJSON() {\n const object = {\n name: this.name,\n mutable: this.mutable,\n input_type: this.inputType,\n default_value: this.defaultValue,\n values: this.values,\n };\n\n if (typeof (this.id) !== 'undefined') {\n object.id = this.id;\n }\n\n return object;\n }\n }\n\n /**\n * Class representing a label\n * @memberof module:API.cvat.classes\n * @hideconstructor\n */\n class Label {\n constructor(initialData) {\n const data = {\n id: undefined,\n name: undefined,\n };\n\n for (const key in data) {\n if (Object.prototype.hasOwnProperty.call(data, key)) {\n if (Object.prototype.hasOwnProperty.call(initialData, key)) {\n data[key] = initialData[key];\n }\n }\n }\n\n data.attributes = [];\n\n if (Object.prototype.hasOwnProperty.call(initialData, 'attributes')\n && Array.isArray(initialData.attributes)) {\n for (const attrData of initialData.attributes) {\n data.attributes.push(new Attribute(attrData));\n }\n }\n\n Object.defineProperties(this, Object.freeze({\n /**\n * @name id\n * @type {integer}\n * @memberof module:API.cvat.classes.Label\n * @readonly\n * @instance\n */\n id: {\n get: () => data.id,\n },\n /**\n * @name name\n * @type {string}\n * @memberof module:API.cvat.classes.Label\n * @readonly\n * @instance\n */\n name: {\n get: () => data.name,\n },\n /**\n * @name attributes\n * @type {module:API.cvat.classes.Attribute[]}\n * @memberof module:API.cvat.classes.Label\n * @readonly\n * @instance\n */\n attributes: {\n get: () => [...data.attributes],\n },\n }));\n }\n\n toJSON() {\n const object = {\n name: this.name,\n attributes: [...this.attributes.map(el => el.toJSON())],\n };\n\n if (typeof (this.id) !== 'undefined') {\n object.id = this.id;\n }\n\n return object;\n }\n }\n\n module.exports = {\n Attribute,\n Label,\n };\n})();\n","/*\n* Copyright (C) 2019 Intel Corporation\n* SPDX-License-Identifier: MIT\n*/\n\n/* global\n require:false\n*/\n\n(() => {\n const { ArgumentError } = require('./exceptions');\n\n function isBoolean(value) {\n return typeof (value) === 'boolean';\n }\n\n function isInteger(value) {\n return typeof (value) === 'number' && Number.isInteger(value);\n }\n\n // Called with specific Enum context\n function isEnum(value) {\n for (const key in this) {\n if (Object.prototype.hasOwnProperty.call(this, key)) {\n if (this[key] === value) {\n return true;\n }\n }\n }\n\n return false;\n }\n\n function isString(value) {\n return typeof (value) === 'string';\n }\n\n function checkFilter(filter, fields) {\n for (const prop in filter) {\n if (Object.prototype.hasOwnProperty.call(filter, prop)) {\n if (!(prop in fields)) {\n throw new ArgumentError(\n `Unsupported filter property has been recieved: \"${prop}\"`,\n );\n } else if (!fields[prop](filter[prop])) {\n throw new ArgumentError(\n `Received filter property \"${prop}\" is not satisfied for checker`,\n );\n }\n }\n }\n }\n\n function checkObjectType(name, value, type, instance) {\n if (type) {\n if (typeof (value) !== type) {\n // specific case for integers which aren't native type in JS\n if (type === 'integer' && Number.isInteger(value)) {\n return;\n }\n\n throw new ArgumentError(\n `\"${name}\" is expected to be \"${type}\", but \"${typeof (value)}\" has been got.`,\n );\n }\n } else if (instance) {\n if (!(value instanceof instance)) {\n if (value !== undefined) {\n throw new ArgumentError(\n `\"${name}\" is expected to be ${instance.name}, but `\n + `\"${value.constructor.name}\" has been got`,\n );\n }\n\n throw new ArgumentError(\n `\"${name}\" is expected to be ${instance.name}, but \"undefined\" has been got.`,\n );\n }\n }\n }\n\n module.exports = {\n isBoolean,\n isInteger,\n isEnum,\n isString,\n checkFilter,\n checkObjectType,\n };\n})();\n","var DESCRIPTORS = require('../internals/descriptors');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toPrimitive = require('../internals/to-primitive');\nvar has = require('../internals/has');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\n\nvar nativeGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// `Object.getOwnPropertyDescriptor` method\n// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor\nexports.f = DESCRIPTORS ? nativeGetOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\n O = toIndexedObject(O);\n P = toPrimitive(P, true);\n if (IE8_DOM_DEFINE) try {\n return nativeGetOwnPropertyDescriptor(O, P);\n } catch (error) { /* empty */ }\n if (has(O, P)) return createPropertyDescriptor(!propertyIsEnumerableModule.f.call(O, P), O[P]);\n};\n","var isObject = require('../internals/is-object');\n\n// `ToPrimitive` abstract operation\n// https://tc39.github.io/ecma262/#sec-toprimitive\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (input, PREFERRED_STRING) {\n if (!isObject(input)) return input;\n var fn, val;\n if (PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;\n if (typeof (fn = input.valueOf) == 'function' && !isObject(val = fn.call(input))) return val;\n if (!PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n","var global = require('../internals/global');\nvar isObject = require('../internals/is-object');\n\nvar document = global.document;\n// typeof document.createElement is 'object' in old IE\nvar EXISTS = isObject(document) && isObject(document.createElement);\n\nmodule.exports = function (it) {\n return EXISTS ? document.createElement(it) : {};\n};\n","var global = require('../internals/global');\nvar hide = require('../internals/hide');\n\nmodule.exports = function (key, value) {\n try {\n hide(global, key, value);\n } catch (error) {\n global[key] = value;\n } return value;\n};\n","var shared = require('../internals/shared');\nvar uid = require('../internals/uid');\n\nvar keys = shared('keys');\n\nmodule.exports = function (key) {\n return keys[key] || (keys[key] = uid(key));\n};\n","module.exports = {};\n","// IE8- don't enum bug keys\nmodule.exports = [\n 'constructor',\n 'hasOwnProperty',\n 'isPrototypeOf',\n 'propertyIsEnumerable',\n 'toLocaleString',\n 'toString',\n 'valueOf'\n];\n","module.exports = function (it, Constructor, name) {\n if (!(it instanceof Constructor)) {\n throw TypeError('Incorrect ' + (name ? name + ' ' : '') + 'invocation');\n } return it;\n};\n","/*\n* Copyright (C) 2019 Intel Corporation\n* SPDX-License-Identifier: MIT\n*/\n\nmodule.exports = {\n backendAPI: 'http://localhost:7000/api/v1',\n proxy: false,\n taskID: undefined,\n jobID: undefined,\n clientID: +Date.now().toString().substr(-6),\n};\n","var toInteger = require('../internals/to-integer');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\n// `String.prototype.{ codePointAt, at }` methods implementation\nvar createMethod = function (CONVERT_TO_STRING) {\n return function ($this, pos) {\n var S = String(requireObjectCoercible($this));\n var position = toInteger(pos);\n var size = S.length;\n var first, second;\n if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;\n first = S.charCodeAt(position);\n return first < 0xD800 || first > 0xDBFF || position + 1 === size\n || (second = S.charCodeAt(position + 1)) < 0xDC00 || second > 0xDFFF\n ? CONVERT_TO_STRING ? S.charAt(position) : first\n : CONVERT_TO_STRING ? S.slice(position, position + 2) : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;\n };\n};\n\nmodule.exports = {\n // `String.prototype.codePointAt` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.codepointat\n codeAt: createMethod(false),\n // `String.prototype.at` method\n // https://github.com/mathiasbynens/String.prototype.at\n charAt: createMethod(true)\n};\n","'use strict';\n\nvar utils = require('./utils');\nvar normalizeHeaderName = require('./helpers/normalizeHeaderName');\n\nvar DEFAULT_CONTENT_TYPE = {\n 'Content-Type': 'application/x-www-form-urlencoded'\n};\n\nfunction setContentTypeIfUnset(headers, value) {\n if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) {\n headers['Content-Type'] = value;\n }\n}\n\nfunction getDefaultAdapter() {\n var adapter;\n if (typeof XMLHttpRequest !== 'undefined') {\n // For browsers use XHR adapter\n adapter = require('./adapters/xhr');\n } else if (typeof process !== 'undefined') {\n // For node use HTTP adapter\n adapter = require('./adapters/http');\n }\n return adapter;\n}\n\nvar defaults = {\n adapter: getDefaultAdapter(),\n\n transformRequest: [function transformRequest(data, headers) {\n normalizeHeaderName(headers, 'Content-Type');\n if (utils.isFormData(data) ||\n utils.isArrayBuffer(data) ||\n utils.isBuffer(data) ||\n utils.isStream(data) ||\n utils.isFile(data) ||\n utils.isBlob(data)\n ) {\n return data;\n }\n if (utils.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils.isURLSearchParams(data)) {\n setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8');\n return data.toString();\n }\n if (utils.isObject(data)) {\n setContentTypeIfUnset(headers, 'application/json;charset=utf-8');\n return JSON.stringify(data);\n }\n return data;\n }],\n\n transformResponse: [function transformResponse(data) {\n /*eslint no-param-reassign:0*/\n if (typeof data === 'string') {\n try {\n data = JSON.parse(data);\n } catch (e) { /* Ignore */ }\n }\n return data;\n }],\n\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n\n xsrfCookieName: 'XSRF-TOKEN',\n xsrfHeaderName: 'X-XSRF-TOKEN',\n\n maxContentLength: -1,\n\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n }\n};\n\ndefaults.headers = {\n common: {\n 'Accept': 'application/json, text/plain, */*'\n }\n};\n\nutils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) {\n defaults.headers[method] = {};\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);\n});\n\nmodule.exports = defaults;\n","/*\n* Copyright (C) 2019 Intel Corporation\n* SPDX-License-Identifier: MIT\n*/\n\n/* global\n require:false\n*/\n\n(() => {\n const PluginRegistry = require('./plugins');\n const { ArgumentError } = require('./exceptions');\n\n /**\n * Class representing a state of an object on a specific frame\n * @memberof module:API.cvat.classes\n */\n class ObjectState {\n /**\n * @param {Object} serialized - is an dictionary which contains\n * initial information about an ObjectState;\n * Necessary fields: objectType, shapeType\n * Necessary fields for objects which haven't been added to collection yet: frame\n * Optional fields: points, group, zOrder, outside, occluded,\n * attributes, lock, label, mode, color, keyframe, clientID, serverID\n * These fields can be set later via setters\n */\n constructor(serialized) {\n const data = {\n label: null,\n attributes: {},\n\n points: null,\n outside: null,\n occluded: null,\n keyframe: null,\n\n group: null,\n zOrder: null,\n lock: null,\n color: null,\n visibility: null,\n\n clientID: serialized.clientID,\n serverID: serialized.serverID,\n\n frame: serialized.frame,\n objectType: serialized.objectType,\n shapeType: serialized.shapeType,\n updateFlags: {},\n };\n\n // Shows whether any properties updated since last reset() or interpolation\n Object.defineProperty(data.updateFlags, 'reset', {\n value: function reset() {\n this.label = false;\n this.attributes = false;\n\n this.points = false;\n this.outside = false;\n this.occluded = false;\n this.keyframe = false;\n\n this.group = false;\n this.zOrder = false;\n this.lock = false;\n this.color = false;\n this.visibility = false;\n },\n writable: false,\n });\n\n Object.defineProperties(this, Object.freeze({\n // Internal property. We don't need document it.\n updateFlags: {\n get: () => data.updateFlags,\n },\n frame: {\n /**\n * @name frame\n * @type {integer}\n * @memberof module:API.cvat.classes.ObjectState\n * @readonly\n * @instance\n */\n get: () => data.frame,\n },\n objectType: {\n /**\n * @name objectType\n * @type {module:API.cvat.enums.ObjectType}\n * @memberof module:API.cvat.classes.ObjectState\n * @readonly\n * @instance\n */\n get: () => data.objectType,\n },\n shapeType: {\n /**\n * @name shapeType\n * @type {module:API.cvat.enums.ObjectShape}\n * @memberof module:API.cvat.classes.ObjectState\n * @readonly\n * @instance\n */\n get: () => data.shapeType,\n },\n clientID: {\n /**\n * @name clientID\n * @type {integer}\n * @memberof module:API.cvat.classes.ObjectState\n * @readonly\n * @instance\n */\n get: () => data.clientID,\n },\n serverID: {\n /**\n * @name serverID\n * @type {integer}\n * @memberof module:API.cvat.classes.ObjectState\n * @readonly\n * @instance\n */\n get: () => data.serverID,\n },\n label: {\n /**\n * @name shape\n * @type {module:API.cvat.classes.Label}\n * @memberof module:API.cvat.classes.ObjectState\n * @instance\n */\n get: () => data.label,\n set: (labelInstance) => {\n data.updateFlags.label = true;\n data.label = labelInstance;\n },\n },\n color: {\n /**\n * @name color\n * @type {string}\n * @memberof module:API.cvat.classes.ObjectState\n * @instance\n */\n get: () => data.color,\n set: (color) => {\n data.updateFlags.color = true;\n data.color = color;\n },\n },\n visibility: {\n /**\n * @name visibility\n * @type {module:API.cvat.enums.VisibleState}\n * @memberof module:API.cvat.classes.ObjectState\n * @instance\n */\n get: () => data.visibility,\n set: (visibility) => {\n data.updateFlags.visibility = true;\n data.visibility = visibility;\n },\n },\n points: {\n /**\n * @name points\n * @type {number[]}\n * @memberof module:API.cvat.classes.ObjectState\n * @throws {module:API.cvat.exceptions.ArgumentError}\n * @instance\n */\n get: () => data.points,\n set: (points) => {\n if (Array.isArray(points)) {\n data.updateFlags.points = true;\n data.points = [...points];\n } else {\n throw new ArgumentError(\n 'Points are expected to be an array '\n + `but got ${typeof (points) === 'object'\n ? points.constructor.name : typeof (points)}`,\n );\n }\n },\n },\n group: {\n /**\n * @name group\n * @type {integer}\n * @memberof module:API.cvat.classes.ObjectState\n * @instance\n */\n get: () => data.group,\n set: (group) => {\n data.updateFlags.group = true;\n data.group = group;\n },\n },\n zOrder: {\n /**\n * @name zOrder\n * @type {integer}\n * @memberof module:API.cvat.classes.ObjectState\n * @instance\n */\n get: () => data.zOrder,\n set: (zOrder) => {\n data.updateFlags.zOrder = true;\n data.zOrder = zOrder;\n },\n },\n outside: {\n /**\n * @name outside\n * @type {boolean}\n * @memberof module:API.cvat.classes.ObjectState\n * @instance\n */\n get: () => data.outside,\n set: (outside) => {\n data.updateFlags.outside = true;\n data.outside = outside;\n },\n },\n keyframe: {\n /**\n * @name keyframe\n * @type {boolean}\n * @memberof module:API.cvat.classes.ObjectState\n * @instance\n */\n get: () => data.keyframe,\n set: (keyframe) => {\n data.updateFlags.keyframe = true;\n data.keyframe = keyframe;\n },\n },\n occluded: {\n /**\n * @name occluded\n * @type {boolean}\n * @memberof module:API.cvat.classes.ObjectState\n * @instance\n */\n get: () => data.occluded,\n set: (occluded) => {\n data.updateFlags.occluded = true;\n data.occluded = occluded;\n },\n },\n lock: {\n /**\n * @name lock\n * @type {boolean}\n * @memberof module:API.cvat.classes.ObjectState\n * @instance\n */\n get: () => data.lock,\n set: (lock) => {\n data.updateFlags.lock = true;\n data.lock = lock;\n },\n },\n attributes: {\n /**\n * Object is id:value pairs where \"id\" is an integer\n * attribute identifier and \"value\" is an attribute value\n * @name attributes\n * @type {Object}\n * @memberof module:API.cvat.classes.ObjectState\n * @throws {module:API.cvat.exceptions.ArgumentError}\n * @instance\n */\n get: () => data.attributes,\n set: (attributes) => {\n if (typeof (attributes) !== 'object') {\n throw new ArgumentError(\n 'Attributes are expected to be an object '\n + `but got ${typeof (attributes) === 'object'\n ? attributes.constructor.name : typeof (attributes)}`,\n );\n }\n\n for (const attrID of Object.keys(attributes)) {\n data.updateFlags.attributes = true;\n data.attributes[attrID] = attributes[attrID];\n }\n },\n },\n }));\n\n this.label = serialized.label;\n this.group = serialized.group;\n this.zOrder = serialized.zOrder;\n this.outside = serialized.outside;\n this.keyframe = serialized.keyframe;\n this.occluded = serialized.occluded;\n this.color = serialized.color;\n this.lock = serialized.lock;\n this.visibility = serialized.visibility;\n\n // It can be undefined in a constructor and it can be defined later\n if (typeof (serialized.points) !== 'undefined') {\n this.points = serialized.points;\n }\n if (typeof (serialized.attributes) !== 'undefined') {\n this.attributes = serialized.attributes;\n }\n\n data.updateFlags.reset();\n }\n\n /**\n * Method saves/updates an object state in a collection\n * @method save\n * @memberof module:API.cvat.classes.ObjectState\n * @readonly\n * @instance\n * @async\n * @throws {module:API.cvat.exceptions.PluginError}\n * @throws {module:API.cvat.exceptions.ArgumentError}\n * @returns {module:API.cvat.classes.ObjectState} updated state of an object\n */\n async save() {\n const result = await PluginRegistry\n .apiWrapper.call(this, ObjectState.prototype.save);\n return result;\n }\n\n /**\n * Method deletes an object from a collection\n * @method delete\n * @memberof module:API.cvat.classes.ObjectState\n * @readonly\n * @instance\n * @param {boolean} [force=false] delete object even if it is locked\n * @async\n * @returns {boolean} true if object has been deleted\n * @throws {module:API.cvat.exceptions.PluginError}\n */\n async delete(force = false) {\n const result = await PluginRegistry\n .apiWrapper.call(this, ObjectState.prototype.delete, force);\n return result;\n }\n\n /**\n * Set the highest ZOrder within a frame\n * @method up\n * @memberof module:API.cvat.classes.ObjectState\n * @readonly\n * @instance\n * @async\n * @throws {module:API.cvat.exceptions.PluginError}\n */\n async up() {\n const result = await PluginRegistry\n .apiWrapper.call(this, ObjectState.prototype.up);\n return result;\n }\n\n /**\n * Set the lowest ZOrder within a frame\n * @method down\n * @memberof module:API.cvat.classes.ObjectState\n * @readonly\n * @instance\n * @async\n * @throws {module:API.cvat.exceptions.PluginError}\n */\n async down() {\n const result = await PluginRegistry\n .apiWrapper.call(this, ObjectState.prototype.down);\n return result;\n }\n }\n\n // Default implementation saves element in collection\n ObjectState.prototype.save.implementation = async function () {\n if (this.hidden && this.hidden.save) {\n return this.hidden.save();\n }\n\n return this;\n };\n\n // Default implementation do nothing\n ObjectState.prototype.delete.implementation = async function (force) {\n if (this.hidden && this.hidden.delete) {\n return this.hidden.delete(force);\n }\n\n return false;\n };\n\n ObjectState.prototype.up.implementation = async function () {\n if (this.hidden && this.hidden.up) {\n return this.hidden.up();\n }\n\n return false;\n };\n\n ObjectState.prototype.down.implementation = async function () {\n if (this.hidden && this.hidden.down) {\n return this.hidden.down();\n }\n\n return false;\n };\n\n\n module.exports = ObjectState;\n})();\n","'use strict';\nvar $ = require('../internals/export');\n\n// `URL.prototype.toJSON` method\n// https://url.spec.whatwg.org/#dom-url-tojson\n$({ target: 'URL', proto: true, enumerable: true }, {\n toJSON: function toJSON() {\n return URL.prototype.toString.call(this);\n }\n});\n","'use strict';\nvar nativePropertyIsEnumerable = {}.propertyIsEnumerable;\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// Nashorn ~ JDK8 bug\nvar NASHORN_BUG = getOwnPropertyDescriptor && !nativePropertyIsEnumerable.call({ 1: 2 }, 1);\n\n// `Object.prototype.propertyIsEnumerable` method implementation\n// https://tc39.github.io/ecma262/#sec-object.prototype.propertyisenumerable\nexports.f = NASHORN_BUG ? function propertyIsEnumerable(V) {\n var descriptor = getOwnPropertyDescriptor(this, V);\n return !!descriptor && descriptor.enumerable;\n} : nativePropertyIsEnumerable;\n","var fails = require('../internals/fails');\nvar classof = require('../internals/classof-raw');\n\nvar split = ''.split;\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\nmodule.exports = fails(function () {\n // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\n // eslint-disable-next-line no-prototype-builtins\n return !Object('z').propertyIsEnumerable(0);\n}) ? function (it) {\n return classof(it) == 'String' ? split.call(it, '') : Object(it);\n} : Object;\n","var DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar createElement = require('../internals/document-create-element');\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !DESCRIPTORS && !fails(function () {\n return Object.defineProperty(createElement('div'), 'a', {\n get: function () { return 7; }\n }).a != 7;\n});\n","var shared = require('../internals/shared');\n\nmodule.exports = shared('native-function-to-string', Function.toString);\n","var id = 0;\nvar postfix = Math.random();\n\nmodule.exports = function (key) {\n return 'Symbol(' + String(key === undefined ? '' : key) + ')_' + (++id + postfix).toString(36);\n};\n","var has = require('../internals/has');\nvar ownKeys = require('../internals/own-keys');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar definePropertyModule = require('../internals/object-define-property');\n\nmodule.exports = function (target, source) {\n var keys = ownKeys(source);\n var defineProperty = definePropertyModule.f;\n var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n if (!has(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key));\n }\n};\n","module.exports = require('../internals/global');\n","var has = require('../internals/has');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar indexOf = require('../internals/array-includes').indexOf;\nvar hiddenKeys = require('../internals/hidden-keys');\n\nmodule.exports = function (object, names) {\n var O = toIndexedObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) !has(hiddenKeys, key) && has(O, key) && result.push(key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (has(O, key = names[i++])) {\n ~indexOf(result, key) || result.push(key);\n }\n return result;\n};\n","exports.f = Object.getOwnPropertySymbols;\n","var fails = require('../internals/fails');\n\nvar replacement = /#|\\.prototype\\./;\n\nvar isForced = function (feature, detection) {\n var value = data[normalize(feature)];\n return value == POLYFILL ? true\n : value == NATIVE ? false\n : typeof detection == 'function' ? fails(detection)\n : !!detection;\n};\n\nvar normalize = isForced.normalize = function (string) {\n return String(string).replace(replacement, '.').toLowerCase();\n};\n\nvar data = isForced.data = {};\nvar NATIVE = isForced.NATIVE = 'N';\nvar POLYFILL = isForced.POLYFILL = 'P';\n\nmodule.exports = isForced;\n","var redefine = require('../internals/redefine');\n\nmodule.exports = function (target, src, options) {\n for (var key in src) redefine(target, key, src[key], options);\n return target;\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\nvar Iterators = require('../internals/iterators');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar ArrayPrototype = Array.prototype;\n\n// check on default Array iterator\nmodule.exports = function (it) {\n return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it);\n};\n","var anObject = require('../internals/an-object');\n\n// call something on iterator step with safe closing on error\nmodule.exports = function (iterator, fn, value, ENTRIES) {\n try {\n return ENTRIES ? fn(anObject(value)[0], value[1]) : fn(value);\n // 7.4.6 IteratorClose(iterator, completion)\n } catch (error) {\n var returnMethod = iterator['return'];\n if (returnMethod !== undefined) anObject(returnMethod.call(iterator));\n throw error;\n }\n};\n","var global = require('../internals/global');\nvar fails = require('../internals/fails');\nvar classof = require('../internals/classof-raw');\nvar bind = require('../internals/bind-context');\nvar html = require('../internals/html');\nvar createElement = require('../internals/document-create-element');\n\nvar location = global.location;\nvar set = global.setImmediate;\nvar clear = global.clearImmediate;\nvar process = global.process;\nvar MessageChannel = global.MessageChannel;\nvar Dispatch = global.Dispatch;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar defer, channel, port;\n\nvar run = function (id) {\n // eslint-disable-next-line no-prototype-builtins\n if (queue.hasOwnProperty(id)) {\n var fn = queue[id];\n delete queue[id];\n fn();\n }\n};\n\nvar runner = function (id) {\n return function () {\n run(id);\n };\n};\n\nvar listener = function (event) {\n run(event.data);\n};\n\nvar post = function (id) {\n // old engines have not location.origin\n global.postMessage(id + '', location.protocol + '//' + location.host);\n};\n\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!set || !clear) {\n set = function setImmediate(fn) {\n var args = [];\n var i = 1;\n while (arguments.length > i) args.push(arguments[i++]);\n queue[++counter] = function () {\n // eslint-disable-next-line no-new-func\n (typeof fn == 'function' ? fn : Function(fn)).apply(undefined, args);\n };\n defer(counter);\n return counter;\n };\n clear = function clearImmediate(id) {\n delete queue[id];\n };\n // Node.js 0.8-\n if (classof(process) == 'process') {\n defer = function (id) {\n process.nextTick(runner(id));\n };\n // Sphere (JS game engine) Dispatch API\n } else if (Dispatch && Dispatch.now) {\n defer = function (id) {\n Dispatch.now(runner(id));\n };\n // Browsers with MessageChannel, includes WebWorkers\n } else if (MessageChannel) {\n channel = new MessageChannel();\n port = channel.port2;\n channel.port1.onmessage = listener;\n defer = bind(port.postMessage, port, 1);\n // Browsers with postMessage, skip WebWorkers\n // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts && !fails(post)) {\n defer = post;\n global.addEventListener('message', listener, false);\n // IE8-\n } else if (ONREADYSTATECHANGE in createElement('script')) {\n defer = function (id) {\n html.appendChild(createElement('script'))[ONREADYSTATECHANGE] = function () {\n html.removeChild(this);\n run(id);\n };\n };\n // Rest old browsers\n } else {\n defer = function (id) {\n setTimeout(runner(id), 0);\n };\n }\n}\n\nmodule.exports = {\n set: set,\n clear: clear\n};\n","var getBuiltIn = require('../internals/get-built-in');\n\nmodule.exports = getBuiltIn('document', 'documentElement');\n","var getBuiltIn = require('../internals/get-built-in');\n\nmodule.exports = getBuiltIn('navigator', 'userAgent') || '';\n","'use strict';\nvar aFunction = require('../internals/a-function');\n\nvar PromiseCapability = function (C) {\n var resolve, reject;\n this.promise = new C(function ($$resolve, $$reject) {\n if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');\n resolve = $$resolve;\n reject = $$reject;\n });\n this.resolve = aFunction(resolve);\n this.reject = aFunction(reject);\n};\n\n// 25.4.1.5 NewPromiseCapability(C)\nmodule.exports.f = function (C) {\n return new PromiseCapability(C);\n};\n","var anObject = require('../internals/an-object');\nvar defineProperties = require('../internals/object-define-properties');\nvar enumBugKeys = require('../internals/enum-bug-keys');\nvar hiddenKeys = require('../internals/hidden-keys');\nvar html = require('../internals/html');\nvar documentCreateElement = require('../internals/document-create-element');\nvar sharedKey = require('../internals/shared-key');\nvar IE_PROTO = sharedKey('IE_PROTO');\n\nvar PROTOTYPE = 'prototype';\nvar Empty = function () { /* empty */ };\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar createDict = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = documentCreateElement('iframe');\n var length = enumBugKeys.length;\n var lt = '<';\n var script = 'script';\n var gt = '>';\n var js = 'java' + script + ':';\n var iframeDocument;\n iframe.style.display = 'none';\n html.appendChild(iframe);\n iframe.src = String(js);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(lt + script + gt + 'document.F=Object' + lt + '/' + script + gt);\n iframeDocument.close();\n createDict = iframeDocument.F;\n while (length--) delete createDict[PROTOTYPE][enumBugKeys[length]];\n return createDict();\n};\n\n// `Object.create` method\n// https://tc39.github.io/ecma262/#sec-object.create\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n Empty[PROTOTYPE] = anObject(O);\n result = new Empty();\n Empty[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = createDict();\n return Properties === undefined ? result : defineProperties(result, Properties);\n};\n\nhiddenKeys[IE_PROTO] = true;\n","var DESCRIPTORS = require('../internals/descriptors');\nvar definePropertyModule = require('../internals/object-define-property');\nvar anObject = require('../internals/an-object');\nvar objectKeys = require('../internals/object-keys');\n\n// `Object.defineProperties` method\n// https://tc39.github.io/ecma262/#sec-object.defineproperties\nmodule.exports = DESCRIPTORS ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var keys = objectKeys(Properties);\n var length = keys.length;\n var index = 0;\n var key;\n while (length > index) definePropertyModule.f(O, key = keys[index++], Properties[key]);\n return O;\n};\n","var internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\n// `Object.keys` method\n// https://tc39.github.io/ecma262/#sec-object.keys\nmodule.exports = Object.keys || function keys(O) {\n return internalObjectKeys(O, enumBugKeys);\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar createIteratorConstructor = require('../internals/create-iterator-constructor');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar hide = require('../internals/hide');\nvar redefine = require('../internals/redefine');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_PURE = require('../internals/is-pure');\nvar Iterators = require('../internals/iterators');\nvar IteratorsCore = require('../internals/iterators-core');\n\nvar IteratorPrototype = IteratorsCore.IteratorPrototype;\nvar BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS;\nvar ITERATOR = wellKnownSymbol('iterator');\nvar KEYS = 'keys';\nvar VALUES = 'values';\nvar ENTRIES = 'entries';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) {\n createIteratorConstructor(IteratorConstructor, NAME, next);\n\n var getIterationMethod = function (KIND) {\n if (KIND === DEFAULT && defaultIterator) return defaultIterator;\n if (!BUGGY_SAFARI_ITERATORS && KIND in IterablePrototype) return IterablePrototype[KIND];\n switch (KIND) {\n case KEYS: return function keys() { return new IteratorConstructor(this, KIND); };\n case VALUES: return function values() { return new IteratorConstructor(this, KIND); };\n case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); };\n } return function () { return new IteratorConstructor(this); };\n };\n\n var TO_STRING_TAG = NAME + ' Iterator';\n var INCORRECT_VALUES_NAME = false;\n var IterablePrototype = Iterable.prototype;\n var nativeIterator = IterablePrototype[ITERATOR]\n || IterablePrototype['@@iterator']\n || DEFAULT && IterablePrototype[DEFAULT];\n var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT);\n var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator;\n var CurrentIteratorPrototype, methods, KEY;\n\n // fix native\n if (anyNativeIterator) {\n CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable()));\n if (IteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) {\n if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) {\n if (setPrototypeOf) {\n setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype);\n } else if (typeof CurrentIteratorPrototype[ITERATOR] != 'function') {\n hide(CurrentIteratorPrototype, ITERATOR, returnThis);\n }\n }\n // Set @@toStringTag to native iterators\n setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true);\n if (IS_PURE) Iterators[TO_STRING_TAG] = returnThis;\n }\n }\n\n // fix Array#{values, @@iterator}.name in V8 / FF\n if (DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) {\n INCORRECT_VALUES_NAME = true;\n defaultIterator = function values() { return nativeIterator.call(this); };\n }\n\n // define iterator\n if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) {\n hide(IterablePrototype, ITERATOR, defaultIterator);\n }\n Iterators[NAME] = defaultIterator;\n\n // export additional methods\n if (DEFAULT) {\n methods = {\n values: getIterationMethod(VALUES),\n keys: IS_SET ? defaultIterator : getIterationMethod(KEYS),\n entries: getIterationMethod(ENTRIES)\n };\n if (FORCED) for (KEY in methods) {\n if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) {\n redefine(IterablePrototype, KEY, methods[KEY]);\n }\n } else $({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods);\n }\n\n return methods;\n};\n","'use strict';\nvar IteratorPrototype = require('../internals/iterators-core').IteratorPrototype;\nvar create = require('../internals/object-create');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar Iterators = require('../internals/iterators');\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (IteratorConstructor, NAME, next) {\n var TO_STRING_TAG = NAME + ' Iterator';\n IteratorConstructor.prototype = create(IteratorPrototype, { next: createPropertyDescriptor(1, next) });\n setToStringTag(IteratorConstructor, TO_STRING_TAG, false, true);\n Iterators[TO_STRING_TAG] = returnThis;\n return IteratorConstructor;\n};\n","'use strict';\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar hide = require('../internals/hide');\nvar has = require('../internals/has');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_PURE = require('../internals/is-pure');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar BUGGY_SAFARI_ITERATORS = false;\n\nvar returnThis = function () { return this; };\n\n// `%IteratorPrototype%` object\n// https://tc39.github.io/ecma262/#sec-%iteratorprototype%-object\nvar IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator;\n\nif ([].keys) {\n arrayIterator = [].keys();\n // Safari 8 has buggy iterators w/o `next`\n if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true;\n else {\n PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator));\n if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype;\n }\n}\n\nif (IteratorPrototype == undefined) IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\nif (!IS_PURE && !has(IteratorPrototype, ITERATOR)) hide(IteratorPrototype, ITERATOR, returnThis);\n\nmodule.exports = {\n IteratorPrototype: IteratorPrototype,\n BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS\n};\n","var has = require('../internals/has');\nvar toObject = require('../internals/to-object');\nvar sharedKey = require('../internals/shared-key');\nvar CORRECT_PROTOTYPE_GETTER = require('../internals/correct-prototype-getter');\n\nvar IE_PROTO = sharedKey('IE_PROTO');\nvar ObjectPrototype = Object.prototype;\n\n// `Object.getPrototypeOf` method\n// https://tc39.github.io/ecma262/#sec-object.getprototypeof\nmodule.exports = CORRECT_PROTOTYPE_GETTER ? Object.getPrototypeOf : function (O) {\n O = toObject(O);\n if (has(O, IE_PROTO)) return O[IE_PROTO];\n if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n return O.constructor.prototype;\n } return O instanceof Object ? ObjectPrototype : null;\n};\n","'use strict';\nvar regexpFlags = require('./regexp-flags');\n\nvar nativeExec = RegExp.prototype.exec;\n// This always refers to the native implementation, because the\n// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js,\n// which loads this file before patching the method.\nvar nativeReplace = String.prototype.replace;\n\nvar patchedExec = nativeExec;\n\nvar UPDATES_LAST_INDEX_WRONG = (function () {\n var re1 = /a/;\n var re2 = /b*/g;\n nativeExec.call(re1, 'a');\n nativeExec.call(re2, 'a');\n return re1.lastIndex !== 0 || re2.lastIndex !== 0;\n})();\n\n// nonparticipating capturing group, copied from es5-shim's String#split patch.\nvar NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;\n\nvar PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED;\n\nif (PATCH) {\n patchedExec = function exec(str) {\n var re = this;\n var lastIndex, reCopy, match, i;\n\n if (NPCG_INCLUDED) {\n reCopy = new RegExp('^' + re.source + '$(?!\\\\s)', regexpFlags.call(re));\n }\n if (UPDATES_LAST_INDEX_WRONG) lastIndex = re.lastIndex;\n\n match = nativeExec.call(re, str);\n\n if (UPDATES_LAST_INDEX_WRONG && match) {\n re.lastIndex = re.global ? match.index + match[0].length : lastIndex;\n }\n if (NPCG_INCLUDED && match && match.length > 1) {\n // Fix browsers whose `exec` methods don't consistently return `undefined`\n // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/\n nativeReplace.call(match[0], reCopy, function () {\n for (i = 1; i < arguments.length - 2; i++) {\n if (arguments[i] === undefined) match[i] = undefined;\n }\n });\n }\n\n return match;\n };\n}\n\nmodule.exports = patchedExec;\n","'use strict';\n\nmodule.exports = function bind(fn, thisArg) {\n return function wrap() {\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; i++) {\n args[i] = arguments[i];\n }\n return fn.apply(thisArg, args);\n };\n};\n","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n","'use strict';\n\nvar utils = require('./../utils');\nvar settle = require('./../core/settle');\nvar buildURL = require('./../helpers/buildURL');\nvar parseHeaders = require('./../helpers/parseHeaders');\nvar isURLSameOrigin = require('./../helpers/isURLSameOrigin');\nvar createError = require('../core/createError');\n\nmodule.exports = function xhrAdapter(config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n var requestData = config.data;\n var requestHeaders = config.headers;\n\n if (utils.isFormData(requestData)) {\n delete requestHeaders['Content-Type']; // Let the browser set it\n }\n\n var request = new XMLHttpRequest();\n\n // HTTP basic authentication\n if (config.auth) {\n var username = config.auth.username || '';\n var password = config.auth.password || '';\n requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password);\n }\n\n request.open(config.method.toUpperCase(), buildURL(config.url, config.params, config.paramsSerializer), true);\n\n // Set the request timeout in MS\n request.timeout = config.timeout;\n\n // Listen for ready state\n request.onreadystatechange = function handleLoad() {\n if (!request || request.readyState !== 4) {\n return;\n }\n\n // The request errored out and we didn't get a response, this will be\n // handled by onerror instead\n // With one exception: request that using file: protocol, most browsers\n // will return status as 0 even though it's a successful request\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n return;\n }\n\n // Prepare the response\n var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null;\n var responseData = !config.responseType || config.responseType === 'text' ? request.responseText : request.response;\n var response = {\n data: responseData,\n status: request.status,\n statusText: request.statusText,\n headers: responseHeaders,\n config: config,\n request: request\n };\n\n settle(resolve, reject, response);\n\n // Clean up request\n request = null;\n };\n\n // Handle low level network errors\n request.onerror = function handleError() {\n // Real errors are hidden from us by the browser\n // onerror should only fire if it's a network error\n reject(createError('Network Error', config, null, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle timeout\n request.ontimeout = function handleTimeout() {\n reject(createError('timeout of ' + config.timeout + 'ms exceeded', config, 'ECONNABORTED',\n request));\n\n // Clean up request\n request = null;\n };\n\n // Add xsrf header\n // This is only done if running in a standard browser environment.\n // Specifically not if we're in a web worker, or react-native.\n if (utils.isStandardBrowserEnv()) {\n var cookies = require('./../helpers/cookies');\n\n // Add xsrf header\n var xsrfValue = (config.withCredentials || isURLSameOrigin(config.url)) && config.xsrfCookieName ?\n cookies.read(config.xsrfCookieName) :\n undefined;\n\n if (xsrfValue) {\n requestHeaders[config.xsrfHeaderName] = xsrfValue;\n }\n }\n\n // Add headers to the request\n if ('setRequestHeader' in request) {\n utils.forEach(requestHeaders, function setRequestHeader(val, key) {\n if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') {\n // Remove Content-Type if data is undefined\n delete requestHeaders[key];\n } else {\n // Otherwise add header to the request\n request.setRequestHeader(key, val);\n }\n });\n }\n\n // Add withCredentials to request if needed\n if (config.withCredentials) {\n request.withCredentials = true;\n }\n\n // Add responseType to request if needed\n if (config.responseType) {\n try {\n request.responseType = config.responseType;\n } catch (e) {\n // Expected DOMException thrown by browsers not compatible XMLHttpRequest Level 2.\n // But, this can be suppressed for 'json' type as it can be parsed by default 'transformResponse' function.\n if (config.responseType !== 'json') {\n throw e;\n }\n }\n }\n\n // Handle progress if needed\n if (typeof config.onDownloadProgress === 'function') {\n request.addEventListener('progress', config.onDownloadProgress);\n }\n\n // Not all browsers support upload events\n if (typeof config.onUploadProgress === 'function' && request.upload) {\n request.upload.addEventListener('progress', config.onUploadProgress);\n }\n\n if (config.cancelToken) {\n // Handle cancellation\n config.cancelToken.promise.then(function onCanceled(cancel) {\n if (!request) {\n return;\n }\n\n request.abort();\n reject(cancel);\n // Clean up request\n request = null;\n });\n }\n\n if (requestData === undefined) {\n requestData = null;\n }\n\n // Send the request\n request.send(requestData);\n });\n};\n","'use strict';\n\nvar enhanceError = require('./enhanceError');\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {Object} config The config.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n * @returns {Error} The created error.\n */\nmodule.exports = function createError(message, config, code, request, response) {\n var error = new Error(message);\n return enhanceError(error, config, code, request, response);\n};\n","'use strict';\n\nmodule.exports = function isCancel(value) {\n return !!(value && value.__CANCEL__);\n};\n","'use strict';\n\n/**\n * A `Cancel` is an object that is thrown when an operation is canceled.\n *\n * @class\n * @param {string=} message The message.\n */\nfunction Cancel(message) {\n this.message = message;\n}\n\nCancel.prototype.toString = function toString() {\n return 'Cancel' + (this.message ? ': ' + this.message : '');\n};\n\nCancel.prototype.__CANCEL__ = true;\n\nmodule.exports = Cancel;\n","/*\n* Copyright (C) 2019 Intel Corporation\n* SPDX-License-Identifier: MIT\n*/\n\n(() => {\n /**\n * Class representing a user\n * @memberof module:API.cvat.classes\n * @hideconstructor\n */\n class User {\n constructor(initialData) {\n const data = {\n id: null,\n username: null,\n email: null,\n first_name: null,\n last_name: null,\n groups: null,\n last_login: null,\n date_joined: null,\n is_staff: null,\n is_superuser: null,\n is_active: null,\n };\n\n for (const property in data) {\n if (Object.prototype.hasOwnProperty.call(data, property)\n && property in initialData) {\n data[property] = initialData[property];\n }\n }\n\n Object.defineProperties(this, Object.freeze({\n id: {\n /**\n * @name id\n * @type {integer}\n * @memberof module:API.cvat.classes.User\n * @readonly\n * @instance\n */\n get: () => data.id,\n },\n username: {\n /**\n * @name username\n * @type {string}\n * @memberof module:API.cvat.classes.User\n * @readonly\n * @instance\n */\n get: () => data.username,\n },\n email: {\n /**\n * @name email\n * @type {string}\n * @memberof module:API.cvat.classes.User\n * @readonly\n * @instance\n */\n get: () => data.email,\n },\n firstName: {\n /**\n * @name firstName\n * @type {string}\n * @memberof module:API.cvat.classes.User\n * @readonly\n * @instance\n */\n get: () => data.first_name,\n },\n lastName: {\n /**\n * @name lastName\n * @type {string}\n * @memberof module:API.cvat.classes.User\n * @readonly\n * @instance\n */\n get: () => data.last_name,\n },\n groups: {\n /**\n * @name groups\n * @type {string[]}\n * @memberof module:API.cvat.classes.User\n * @readonly\n * @instance\n */\n get: () => JSON.parse(JSON.stringify(data.groups)),\n },\n lastLogin: {\n /**\n * @name lastLogin\n * @type {string}\n * @memberof module:API.cvat.classes.User\n * @readonly\n * @instance\n */\n get: () => data.last_login,\n },\n dateJoined: {\n /**\n * @name dateJoined\n * @type {string}\n * @memberof module:API.cvat.classes.User\n * @readonly\n * @instance\n */\n get: () => data.date_joined,\n },\n isStaff: {\n /**\n * @name isStaff\n * @type {boolean}\n * @memberof module:API.cvat.classes.User\n * @readonly\n * @instance\n */\n get: () => data.is_staff,\n },\n isSuperuser: {\n /**\n * @name isSuperuser\n * @type {boolean}\n * @memberof module:API.cvat.classes.User\n * @readonly\n * @instance\n */\n get: () => data.is_superuser,\n },\n isActive: {\n /**\n * @name isActive\n * @type {boolean}\n * @memberof module:API.cvat.classes.User\n * @readonly\n * @instance\n */\n get: () => data.is_active,\n },\n }));\n }\n }\n\n module.exports = User;\n})();\n","/*\n* Copyright (C) 2019 Intel Corporation\n* SPDX-License-Identifier: MIT\n*/\n\n\n(() => {\n /**\n * Class representing collection statistics\n * @memberof module:API.cvat.classes\n * @hideconstructor\n */\n class Statistics {\n constructor(label, total) {\n Object.defineProperties(this, Object.freeze({\n /**\n * Statistics by labels with a structure:\n * @example\n * {\n * label: {\n * boxes: {\n * tracks: 10,\n * shapes: 11,\n * },\n * polygons: {\n * tracks: 13,\n * shapes: 14,\n * },\n * polylines: {\n * tracks: 16,\n * shapes: 17,\n * },\n * points: {\n * tracks: 19,\n * shapes: 20,\n * },\n * tags: 66,\n * manually: 186,\n * interpolated: 500,\n * total: 608,\n * }\n * }\n * @name label\n * @type {Object}\n * @memberof module:API.cvat.classes.Statistics\n * @readonly\n * @instance\n */\n label: {\n get: () => JSON.parse(JSON.stringify(label)),\n },\n /**\n * Total statistics (covers all labels) with a structure:\n * @example\n * {\n * boxes: {\n * tracks: 10,\n * shapes: 11,\n * },\n * polygons: {\n * tracks: 13,\n * shapes: 14,\n * },\n * polylines: {\n * tracks: 16,\n * shapes: 17,\n * },\n * points: {\n * tracks: 19,\n * shapes: 20,\n * },\n * tags: 66,\n * manually: 186,\n * interpolated: 500,\n * total: 608,\n * }\n * @name total\n * @type {Object}\n * @memberof module:API.cvat.classes.Statistics\n * @readonly\n * @instance\n */\n total: {\n get: () => JSON.parse(JSON.stringify(total)),\n },\n }));\n }\n }\n\n module.exports = Statistics;\n})();\n","// a string of all valid unicode whitespaces\n// eslint-disable-next-line max-len\nmodule.exports = '\\u0009\\u000A\\u000B\\u000C\\u000D\\u0020\\u00A0\\u1680\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n","'use strict';\nvar $ = require('../internals/export');\nvar aFunction = require('../internals/a-function');\nvar toObject = require('../internals/to-object');\nvar fails = require('../internals/fails');\nvar sloppyArrayMethod = require('../internals/sloppy-array-method');\n\nvar nativeSort = [].sort;\nvar test = [1, 2, 3];\n\n// IE8-\nvar FAILS_ON_UNDEFINED = fails(function () {\n test.sort(undefined);\n});\n// V8 bug\nvar FAILS_ON_NULL = fails(function () {\n test.sort(null);\n});\n// Old WebKit\nvar SLOPPY_METHOD = sloppyArrayMethod('sort');\n\nvar FORCED = FAILS_ON_UNDEFINED || !FAILS_ON_NULL || SLOPPY_METHOD;\n\n// `Array.prototype.sort` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.sort\n$({ target: 'Array', proto: true, forced: FORCED }, {\n sort: function sort(comparefn) {\n return comparefn === undefined\n ? nativeSort.call(toObject(this))\n : nativeSort.call(toObject(this), aFunction(comparefn));\n }\n});\n","/*\n* Copyright (C) 2019 Intel Corporation\n* SPDX-License-Identifier: MIT\n*/\n\n(() => {\n /**\n * Class representing an annotation loader\n * @memberof module:API.cvat.classes\n * @hideconstructor\n */\n class Loader {\n constructor(initialData) {\n const data = {\n display_name: initialData.display_name,\n format: initialData.format,\n handler: initialData.handler,\n version: initialData.version,\n };\n\n Object.defineProperties(this, {\n name: {\n /**\n * @name name\n * @type {string}\n * @memberof module:API.cvat.classes.Loader\n * @readonly\n * @instance\n */\n get: () => data.display_name,\n },\n format: {\n /**\n * @name format\n * @type {string}\n * @memberof module:API.cvat.classes.Loader\n * @readonly\n * @instance\n */\n get: () => data.format,\n },\n handler: {\n /**\n * @name handler\n * @type {string}\n * @memberof module:API.cvat.classes.Loader\n * @readonly\n * @instance\n */\n get: () => data.handler,\n },\n version: {\n /**\n * @name version\n * @type {string}\n * @memberof module:API.cvat.classes.Loader\n * @readonly\n * @instance\n */\n get: () => data.version,\n },\n });\n }\n }\n\n /**\n * Class representing an annotation dumper\n * @memberof module:API.cvat.classes\n * @hideconstructor\n */\n class Dumper {\n constructor(initialData) {\n const data = {\n display_name: initialData.display_name,\n format: initialData.format,\n handler: initialData.handler,\n version: initialData.version,\n };\n\n Object.defineProperties(this, {\n name: {\n /**\n * @name name\n * @type {string}\n * @memberof module:API.cvat.classes.Dumper\n * @readonly\n * @instance\n */\n get: () => data.display_name,\n },\n format: {\n /**\n * @name format\n * @type {string}\n * @memberof module:API.cvat.classes.Dumper\n * @readonly\n * @instance\n */\n get: () => data.format,\n },\n handler: {\n /**\n * @name handler\n * @type {string}\n * @memberof module:API.cvat.classes.Dumper\n * @readonly\n * @instance\n */\n get: () => data.handler,\n },\n version: {\n /**\n * @name version\n * @type {string}\n * @memberof module:API.cvat.classes.Dumper\n * @readonly\n * @instance\n */\n get: () => data.version,\n },\n });\n }\n }\n\n /**\n * Class representing an annotation format\n * @memberof module:API.cvat.classes\n * @hideconstructor\n */\n class AnnotationFormat {\n constructor(initialData) {\n const data = {\n created_date: initialData.created_date,\n updated_date: initialData.updated_date,\n id: initialData.id,\n owner: initialData.owner,\n name: initialData.name,\n handler_file: initialData.handler_file,\n };\n\n data.dumpers = initialData.dumpers.map(el => new Dumper(el));\n data.loaders = initialData.loaders.map(el => new Loader(el));\n\n // Now all fields are readonly\n Object.defineProperties(this, {\n id: {\n /**\n * @name id\n * @type {integer}\n * @memberof module:API.cvat.classes.AnnotationFormat\n * @readonly\n * @instance\n */\n get: () => data.id,\n },\n owner: {\n /**\n * @name owner\n * @type {integer}\n * @memberof module:API.cvat.classes.AnnotationFormat\n * @readonly\n * @instance\n */\n get: () => data.owner,\n },\n name: {\n /**\n * @name name\n * @type {string}\n * @memberof module:API.cvat.classes.AnnotationFormat\n * @readonly\n * @instance\n */\n get: () => data.name,\n },\n createdDate: {\n /**\n * @name createdDate\n * @type {string}\n * @memberof module:API.cvat.classes.AnnotationFormat\n * @readonly\n * @instance\n */\n get: () => data.created_date,\n },\n updatedDate: {\n /**\n * @name updatedDate\n * @type {string}\n * @memberof module:API.cvat.classes.AnnotationFormat\n * @readonly\n * @instance\n */\n get: () => data.updated_date,\n },\n handlerFile: {\n /**\n * @name handlerFile\n * @type {string}\n * @memberof module:API.cvat.classes.AnnotationFormat\n * @readonly\n * @instance\n */\n get: () => data.handler_file,\n },\n loaders: {\n /**\n * @name loaders\n * @type {module:API.cvat.classes.Loader[]}\n * @memberof module:API.cvat.classes.AnnotationFormat\n * @readonly\n * @instance\n */\n get: () => [...data.loaders],\n },\n dumpers: {\n /**\n * @name dumpers\n * @type {module:API.cvat.classes.Dumper[]}\n * @memberof module:API.cvat.classes.AnnotationFormat\n * @readonly\n * @instance\n */\n get: () => [...data.dumpers],\n },\n });\n }\n }\n\n module.exports = {\n AnnotationFormat,\n Loader,\n Dumper,\n };\n})();\n","var fails = require('../internals/fails');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_PURE = require('../internals/is-pure');\n\nvar ITERATOR = wellKnownSymbol('iterator');\n\nmodule.exports = !fails(function () {\n var url = new URL('b?e=1', 'http://a');\n var searchParams = url.searchParams;\n url.pathname = 'c%20d';\n return (IS_PURE && !url.toJSON)\n || !searchParams.sort\n || url.href !== 'http://a/c%20d?e=1'\n || searchParams.get('e') !== '1'\n || String(new URLSearchParams('?a=1')) !== 'a=1'\n || !searchParams[ITERATOR]\n // throws in Edge\n || new URL('https://a@b').username !== 'a'\n || new URLSearchParams(new URLSearchParams('a=b')).get('a') !== 'b'\n // not punycoded in Edge\n || new URL('http://тест').host !== 'xn--e1aybc'\n // not escaped in Chrome 62-\n || new URL('http://a#б').hash !== '#%D0%B1';\n});\n","/*\n* Copyright (C) 2019 Intel Corporation\n* SPDX-License-Identifier: MIT\n*/\n\n/* global\n require:false\n*/\n\n/**\n * External API which should be used by for development\n * @module API\n*/\n\nfunction build() {\n const PluginRegistry = require('./plugins');\n const User = require('./user');\n const ObjectState = require('./object-state');\n const Statistics = require('./statistics');\n const { Job, Task } = require('./session');\n const { Attribute, Label } = require('./labels');\n\n const {\n ShareFileType,\n TaskStatus,\n TaskMode,\n AttributeType,\n ObjectType,\n ObjectShape,\n VisibleState,\n LogType,\n } = require('./enums');\n\n const {\n Exception,\n ArgumentError,\n DataError,\n ScriptingError,\n PluginError,\n ServerError,\n } = require('./exceptions');\n\n const pjson = require('../package.json');\n const config = require('./config');\n\n /**\n * API entrypoint\n * @namespace cvat\n * @memberof module:API\n */\n const cvat = {\n /**\n * Namespace is used for an interaction with a server\n * @namespace server\n * @package\n * @memberof module:API.cvat\n */\n server: {\n /**\n * @typedef {Object} ServerInfo\n * @property {string} name A name of the tool\n * @property {string} description A description of the tool\n * @property {string} version A version of the tool\n * @global\n */\n\n /**\n * Method returns some information about the annotation tool\n * @method about\n * @async\n * @memberof module:API.cvat.server\n * @return {ServerInfo}\n * @throws {module:API.cvat.exceptions.ServerError}\n * @throws {module:API.cvat.exceptions.PluginError}\n */\n async about() {\n const result = await PluginRegistry\n .apiWrapper(cvat.server.about);\n return result;\n },\n /**\n * @typedef {Object} FileInfo\n * @property {string} name A name of a file\n * @property {module:API.cvat.enums.ShareFileType} type\n * A type of a file\n * @global\n */\n\n /**\n * Method returns a list of files in a specified directory on a share\n * @method share\n * @async\n * @memberof module:API.cvat.server\n * @param {string} [directory=/] - Share directory path\n * @returns {FileInfo[]}\n * @throws {module:API.cvat.exceptions.PluginError}\n * @throws {module:API.cvat.exceptions.ServerError}\n */\n async share(directory = '/') {\n const result = await PluginRegistry\n .apiWrapper(cvat.server.share, directory);\n return result;\n },\n /**\n * Method returns available annotation formats\n * @method formats\n * @async\n * @memberof module:API.cvat.server\n * @returns {module:API.cvat.classes.AnnotationFormat[]}\n * @throws {module:API.cvat.exceptions.PluginError}\n * @throws {module:API.cvat.exceptions.ServerError}\n */\n async formats() {\n const result = await PluginRegistry\n .apiWrapper(cvat.server.formats);\n return result;\n },\n /**\n * Method allows to register on a server\n * @method register\n * @async\n * @memberof module:API.cvat.server\n * @param {string} username An username for the new account\n * @param {string} firstName A first name for the new account\n * @param {string} lastName A last name for the new account\n * @param {string} email A email address for the new account\n * @param {string} password1 A password for the new account\n * @param {string} password2 The confirmation password for the new account\n * @throws {module:API.cvat.exceptions.PluginError}\n * @throws {module:API.cvat.exceptions.ServerError}\n */\n async register(username, firstName, lastName, email, password1, password2) {\n const result = await PluginRegistry\n .apiWrapper(cvat.server.register, username, firstName,\n lastName, email, password1, password2);\n return result;\n },\n /**\n * Method allows to login on a server\n * @method login\n * @async\n * @memberof module:API.cvat.server\n * @param {string} username An username of an account\n * @param {string} password A password of an account\n * @throws {module:API.cvat.exceptions.PluginError}\n * @throws {module:API.cvat.exceptions.ServerError}\n */\n async login(username, password) {\n const result = await PluginRegistry\n .apiWrapper(cvat.server.login, username, password);\n return result;\n },\n /**\n * Method allows to logout from the server\n * @method logout\n * @async\n * @memberof module:API.cvat.server\n * @throws {module:API.cvat.exceptions.PluginError}\n * @throws {module:API.cvat.exceptions.ServerError}\n */\n async logout() {\n const result = await PluginRegistry\n .apiWrapper(cvat.server.logout);\n return result;\n },\n /**\n * Method allows to know whether you are authorized on the server\n * @method authorized\n * @async\n * @memberof module:API.cvat.server\n * @returns {boolean}\n * @throws {module:API.cvat.exceptions.PluginError}\n * @throws {module:API.cvat.exceptions.ServerError}\n */\n async authorized() {\n const result = await PluginRegistry\n .apiWrapper(cvat.server.authorized);\n return result;\n },\n },\n /**\n * Namespace is used for getting tasks\n * @namespace tasks\n * @memberof module:API.cvat\n */\n tasks: {\n /**\n * @typedef {Object} TaskFilter\n * @property {string} name Check if name contains this value\n * @property {module:API.cvat.enums.TaskStatus} status\n * Check if status contains this value\n * @property {module:API.cvat.enums.TaskMode} mode\n * Check if mode contains this value\n * @property {integer} id Check if id equals this value\n * @property {integer} page Get specific page\n * (default REST API returns 20 tasks per request.\n * In order to get more, it is need to specify next page)\n * @property {string} owner Check if owner user contains this value\n * @property {string} assignee Check if assigneed contains this value\n * @property {string} search Combined search of contains among all fields\n * @global\n */\n\n /**\n * Method returns list of tasks corresponding to a filter\n * @method get\n * @async\n * @memberof module:API.cvat.tasks\n * @param {TaskFilter} [filter={}] task filter\n * @returns {module:API.cvat.classes.Task[]}\n * @throws {module:API.cvat.exceptions.PluginError}\n * @throws {module:API.cvat.exceptions.ServerError}\n */\n async get(filter = {}) {\n const result = await PluginRegistry\n .apiWrapper(cvat.tasks.get, filter);\n return result;\n },\n },\n /**\n * Namespace is used for getting jobs\n * @namespace jobs\n * @memberof module:API.cvat\n */\n jobs: {\n /**\n * @typedef {Object} JobFilter\n * Only one of fields is allowed simultaneously\n * @property {integer} taskID filter all jobs of specific task\n * @property {integer} jobID filter job with a specific id\n * @global\n */\n\n /**\n * Method returns list of jobs corresponding to a filter\n * @method get\n * @async\n * @memberof module:API.cvat.jobs\n * @param {JobFilter} filter job filter\n * @returns {module:API.cvat.classes.Job[]}\n * @throws {module:API.cvat.exceptions.PluginError}\n * @throws {module:API.cvat.exceptions.ServerError}\n */\n async get(filter = {}) {\n const result = await PluginRegistry\n .apiWrapper(cvat.jobs.get, filter);\n return result;\n },\n },\n /**\n * Namespace is used for getting users\n * @namespace users\n * @memberof module:API.cvat\n */\n users: {\n /**\n * @typedef {Object} UserFilter\n * @property {boolean} self get only self\n * @global\n */\n\n /**\n * Method returns list of users corresponding to a filter\n * @method get\n * @async\n * @memberof module:API.cvat.users\n * @param {UserFilter} [filter={}] user filter\n * @returns {module:API.cvat.classes.User[]}\n * @throws {module:API.cvat.exceptions.PluginError}\n * @throws {module:API.cvat.exceptions.ServerError}\n */\n async get(filter = {}) {\n const result = await PluginRegistry\n .apiWrapper(cvat.users.get, filter);\n return result;\n },\n },\n /**\n * Namespace is used for plugin management\n * @namespace plugins\n * @memberof module:API.cvat\n */\n plugins: {\n /**\n * @typedef {Object} Plugin\n * A plugin is a Javascript object. It must have properties are listed below.
    \n * It also mustn't have property 'functions' which is used internally.
    \n * You can expand any API method including class methods.
    \n * In order to expand class method just use a class name\n * in a cvat space (example is listed below).\n *\n * @property {string} name A name of a plugin\n * @property {string} description A description of a plugin\n * Example plugin implementation listed below:\n * @example\n * plugin = {\n * name: 'Example Plugin',\n * description: 'This example plugin demonstrates how plugin system in CVAT works',\n * cvat: {\n * server: {\n * about: {\n * // Plugin adds some actions after executing the cvat.server.about()\n * // For example it adds a field with installed plugins to a result\n * // An argument \"self\" is a plugin itself\n * // An argument \"result\" is a return value of cvat.server.about()\n * // All next arguments are arguments of a wrapped function\n * // (in this case the wrapped function doesn't have any arguments)\n * async leave(self, result) {\n * result.plugins = await self.internal.getPlugins();\n * // Note that a method leave must return \"result\" (changed or not)\n * // Otherwise API won't work as expected\n * return result;\n * },\n * },\n * },\n * // In this example plugin also wraps a class method\n * classes: {\n * Job: {\n * prototype: {\n * annotations: {\n * put: {\n * // The first argument \"self\" is a plugin, like in a case above\n * // The second argument is an argument of the\n * // Job.annotations.put()\n * // It contains an array of objects to put\n * // In this sample we round objects coordinates and save them\n * enter(self, objects) {\n * for (const obj of objects) {\n * if (obj.type != 'tag') {\n * const points = obj.position.map((point) => {\n * const roundPoint = {\n * x: Math.round(point.x),\n * y: Math.round(point.y),\n * };\n * return roundPoint;\n * });\n * }\n * }\n * },\n * },\n * },\n * },\n * },\n * },\n * },\n * // In general you can add any others members to your plugin\n * // Members below are only examples\n * internal: {\n * async getPlugins() {\n * // Collect information about installed plugins\n * const plugins = await cvat.plugins.list();\n * return plugins.map((el) => {\n * return {\n * name: el.name,\n * description: el.description,\n * };\n * });\n * },\n * },\n * };\n * @global\n */\n\n /**\n * Method returns list of installed plugins\n * @method list\n * @async\n * @memberof module:API.cvat.plugins\n * @returns {Plugin[]}\n * @throws {module:API.cvat.exceptions.PluginError}\n */\n async list() {\n const result = await PluginRegistry\n .apiWrapper(cvat.plugins.list);\n return result;\n },\n /**\n * Install plugin to CVAT\n * @method register\n * @async\n * @memberof module:API.cvat.plugins\n * @param {Plugin} [plugin] plugin for registration\n * @throws {module:API.cvat.exceptions.PluginError}\n */\n async register(plugin) {\n const result = await PluginRegistry\n .apiWrapper(cvat.plugins.register, plugin);\n return result;\n },\n },\n /**\n * Namespace contains some changeable configurations\n * @namespace config\n * @memberof module:API.cvat\n */\n config: {\n /**\n * @memberof module:API.cvat.config\n * @property {string} backendAPI host with a backend api\n * @memberof module:API.cvat.config\n * @property {string} proxy Axios proxy settings.\n * For more details please read here \n * @memberof module:API.cvat.config\n * @property {integer} taskID this value is displayed in a logs if available\n * @memberof module:API.cvat.config\n * @property {integer} jobID this value is displayed in a logs if available\n * @memberof module:API.cvat.config\n * @property {integer} clientID read only auto-generated\n * value which is displayed in a logs\n * @memberof module:API.cvat.config\n */\n get backendAPI() {\n return config.backendAPI;\n },\n set backendAPI(value) {\n config.backendAPI = value;\n },\n get proxy() {\n return config.proxy;\n },\n set proxy(value) {\n config.proxy = value;\n },\n get taskID() {\n return config.taskID;\n },\n set taskID(value) {\n config.taskID = value;\n },\n get jobID() {\n return config.jobID;\n },\n set jobID(value) {\n config.jobID = value;\n },\n get clientID() {\n return config.clientID;\n },\n },\n /**\n * Namespace contains some library information e.g. api version\n * @namespace client\n * @memberof module:API.cvat\n */\n client: {\n /**\n * @property {string} version Client version.\n * Format: {major}.{minor}.{patch}\n *
  • A major number is changed after an API becomes\n * incompatible with a previous version\n *
  • A minor number is changed after an API expands\n *
  • A patch number is changed after an each build\n * @memberof module:API.cvat.client\n * @readonly\n */\n version: `${pjson.version}`,\n },\n /**\n * Namespace is used for access to enums\n * @namespace enums\n * @memberof module:API.cvat\n */\n enums: {\n ShareFileType,\n TaskStatus,\n TaskMode,\n AttributeType,\n ObjectType,\n ObjectShape,\n VisibleState,\n LogType,\n },\n /**\n * Namespace is used for access to exceptions\n * @namespace exceptions\n * @memberof module:API.cvat\n */\n exceptions: {\n Exception,\n ArgumentError,\n DataError,\n ScriptingError,\n PluginError,\n ServerError,\n },\n /**\n * Namespace is used for access to classes\n * @namespace classes\n * @memberof module:API.cvat\n */\n classes: {\n Task,\n User,\n Job,\n Attribute,\n Label,\n Statistics,\n ObjectState,\n },\n };\n\n cvat.server = Object.freeze(cvat.server);\n cvat.tasks = Object.freeze(cvat.tasks);\n cvat.jobs = Object.freeze(cvat.jobs);\n cvat.users = Object.freeze(cvat.users);\n cvat.plugins = Object.freeze(cvat.plugins);\n cvat.client = Object.freeze(cvat.client);\n cvat.enums = Object.freeze(cvat.enums);\n\n const implementAPI = require('./api-implementation');\n\n Math.clamp = function (value, min, max) {\n return Math.min(Math.max(value, min), max);\n };\n\n const implemented = Object.freeze(implementAPI(cvat));\n return implemented;\n}\n\nmodule.exports = build();\n","var global = require('../internals/global');\nvar nativeFunctionToString = require('../internals/function-to-string');\n\nvar WeakMap = global.WeakMap;\n\nmodule.exports = typeof WeakMap === 'function' && /native code/.test(nativeFunctionToString.call(WeakMap));\n","var getBuiltIn = require('../internals/get-built-in');\nvar getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar anObject = require('../internals/an-object');\n\n// all object keys, includes non-enumerable and symbols\nmodule.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {\n var keys = getOwnPropertyNamesModule.f(anObject(it));\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n return getOwnPropertySymbols ? keys.concat(getOwnPropertySymbols(it)) : keys;\n};\n","var internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\nvar hiddenKeys = enumBugKeys.concat('length', 'prototype');\n\n// `Object.getOwnPropertyNames` method\n// https://tc39.github.io/ecma262/#sec-object.getownpropertynames\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return internalObjectKeys(O, hiddenKeys);\n};\n","var toIndexedObject = require('../internals/to-indexed-object');\nvar toLength = require('../internals/to-length');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\n\n// `Array.prototype.{ indexOf, includes }` methods implementation\nvar createMethod = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIndexedObject($this);\n var length = toLength(O.length);\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) {\n if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.includes` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.includes\n includes: createMethod(true),\n // `Array.prototype.indexOf` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.indexof\n indexOf: createMethod(false)\n};\n","var toInteger = require('../internals/to-integer');\n\nvar max = Math.max;\nvar min = Math.min;\n\n// Helper for a popular repeating case of the spec:\n// Let integer be ? ToInteger(index).\n// If integer < 0, let result be max((length + integer), 0); else let result be min(length, length).\nmodule.exports = function (index, length) {\n var integer = toInteger(index);\n return integer < 0 ? max(integer + length, 0) : min(integer, length);\n};\n","var fails = require('../internals/fails');\n\nmodule.exports = !!Object.getOwnPropertySymbols && !fails(function () {\n // Chrome 38 Symbol has incorrect toString conversion\n // eslint-disable-next-line no-undef\n return !String(Symbol());\n});\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar definePropertyModule = require('../internals/object-define-property');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar DESCRIPTORS = require('../internals/descriptors');\n\nvar SPECIES = wellKnownSymbol('species');\n\nmodule.exports = function (CONSTRUCTOR_NAME) {\n var Constructor = getBuiltIn(CONSTRUCTOR_NAME);\n var defineProperty = definePropertyModule.f;\n\n if (DESCRIPTORS && Constructor && !Constructor[SPECIES]) {\n defineProperty(Constructor, SPECIES, {\n configurable: true,\n get: function () { return this; }\n });\n }\n};\n","var anObject = require('../internals/an-object');\nvar isArrayIteratorMethod = require('../internals/is-array-iterator-method');\nvar toLength = require('../internals/to-length');\nvar bind = require('../internals/bind-context');\nvar getIteratorMethod = require('../internals/get-iterator-method');\nvar callWithSafeIterationClosing = require('../internals/call-with-safe-iteration-closing');\n\nvar Result = function (stopped, result) {\n this.stopped = stopped;\n this.result = result;\n};\n\nvar iterate = module.exports = function (iterable, fn, that, AS_ENTRIES, IS_ITERATOR) {\n var boundFunction = bind(fn, that, AS_ENTRIES ? 2 : 1);\n var iterator, iterFn, index, length, result, step;\n\n if (IS_ITERATOR) {\n iterator = iterable;\n } else {\n iterFn = getIteratorMethod(iterable);\n if (typeof iterFn != 'function') throw TypeError('Target is not iterable');\n // optimisation for array iterators\n if (isArrayIteratorMethod(iterFn)) {\n for (index = 0, length = toLength(iterable.length); length > index; index++) {\n result = AS_ENTRIES\n ? boundFunction(anObject(step = iterable[index])[0], step[1])\n : boundFunction(iterable[index]);\n if (result && result instanceof Result) return result;\n } return new Result(false);\n }\n iterator = iterFn.call(iterable);\n }\n\n while (!(step = iterator.next()).done) {\n result = callWithSafeIterationClosing(iterator, boundFunction, step.value, AS_ENTRIES);\n if (result && result instanceof Result) return result;\n } return new Result(false);\n};\n\niterate.stop = function (result) {\n return new Result(true, result);\n};\n","var classofRaw = require('../internals/classof-raw');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n// ES3 wrong here\nvar CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (error) { /* empty */ }\n};\n\n// getting tag from ES6+ `Object.prototype.toString`\nmodule.exports = function (it) {\n var O, tag, result;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG)) == 'string' ? tag\n // builtinTag case\n : CORRECT_ARGUMENTS ? classofRaw(O)\n // ES3 arguments fallback\n : (result = classofRaw(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : result;\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var called = 0;\n var iteratorWithReturn = {\n next: function () {\n return { done: !!called++ };\n },\n 'return': function () {\n SAFE_CLOSING = true;\n }\n };\n iteratorWithReturn[ITERATOR] = function () {\n return this;\n };\n // eslint-disable-next-line no-throw-literal\n Array.from(iteratorWithReturn, function () { throw 2; });\n} catch (error) { /* empty */ }\n\nmodule.exports = function (exec, SKIP_CLOSING) {\n if (!SKIP_CLOSING && !SAFE_CLOSING) return false;\n var ITERATION_SUPPORT = false;\n try {\n var object = {};\n object[ITERATOR] = function () {\n return {\n next: function () {\n return { done: ITERATION_SUPPORT = true };\n }\n };\n };\n exec(object);\n } catch (error) { /* empty */ }\n return ITERATION_SUPPORT;\n};\n","var anObject = require('../internals/an-object');\nvar aFunction = require('../internals/a-function');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar SPECIES = wellKnownSymbol('species');\n\n// `SpeciesConstructor` abstract operation\n// https://tc39.github.io/ecma262/#sec-speciesconstructor\nmodule.exports = function (O, defaultConstructor) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? defaultConstructor : aFunction(S);\n};\n","var global = require('../internals/global');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar classof = require('../internals/classof-raw');\nvar macrotask = require('../internals/task').set;\nvar userAgent = require('../internals/user-agent');\n\nvar MutationObserver = global.MutationObserver || global.WebKitMutationObserver;\nvar process = global.process;\nvar Promise = global.Promise;\nvar IS_NODE = classof(process) == 'process';\n// Node.js 11 shows ExperimentalWarning on getting `queueMicrotask`\nvar queueMicrotaskDescriptor = getOwnPropertyDescriptor(global, 'queueMicrotask');\nvar queueMicrotask = queueMicrotaskDescriptor && queueMicrotaskDescriptor.value;\n\nvar flush, head, last, notify, toggle, node, promise;\n\n// modern engines have queueMicrotask method\nif (!queueMicrotask) {\n flush = function () {\n var parent, fn;\n if (IS_NODE && (parent = process.domain)) parent.exit();\n while (head) {\n fn = head.fn;\n head = head.next;\n try {\n fn();\n } catch (error) {\n if (head) notify();\n else last = undefined;\n throw error;\n }\n } last = undefined;\n if (parent) parent.enter();\n };\n\n // Node.js\n if (IS_NODE) {\n notify = function () {\n process.nextTick(flush);\n };\n // browsers with MutationObserver, except iOS - https://github.com/zloirock/core-js/issues/339\n } else if (MutationObserver && !/(iphone|ipod|ipad).*applewebkit/i.test(userAgent)) {\n toggle = true;\n node = document.createTextNode('');\n new MutationObserver(flush).observe(node, { characterData: true }); // eslint-disable-line no-new\n notify = function () {\n node.data = toggle = !toggle;\n };\n // environments with maybe non-completely correct, but existent Promise\n } else if (Promise && Promise.resolve) {\n // Promise.resolve without an argument throws an error in LG WebOS 2\n promise = Promise.resolve(undefined);\n notify = function () {\n promise.then(flush);\n };\n // for other environments - macrotask based on:\n // - setImmediate\n // - MessageChannel\n // - window.postMessag\n // - onreadystatechange\n // - setTimeout\n } else {\n notify = function () {\n // strange IE + webpack dev server bug - use .call(global)\n macrotask.call(global, flush);\n };\n }\n}\n\nmodule.exports = queueMicrotask || function (fn) {\n var task = { fn: fn, next: undefined };\n if (last) last.next = task;\n if (!head) {\n head = task;\n notify();\n } last = task;\n};\n","var anObject = require('../internals/an-object');\nvar isObject = require('../internals/is-object');\nvar newPromiseCapability = require('../internals/new-promise-capability');\n\nmodule.exports = function (C, x) {\n anObject(C);\n if (isObject(x) && x.constructor === C) return x;\n var promiseCapability = newPromiseCapability.f(C);\n var resolve = promiseCapability.resolve;\n resolve(x);\n return promiseCapability.promise;\n};\n","var global = require('../internals/global');\n\nmodule.exports = function (a, b) {\n var console = global.console;\n if (console && console.error) {\n arguments.length === 1 ? console.error(a) : console.error(a, b);\n }\n};\n","module.exports = function (exec) {\n try {\n return { error: false, value: exec() };\n } catch (error) {\n return { error: true, value: error };\n }\n};\n","// `Symbol.prototype.description` getter\n// https://tc39.github.io/ecma262/#sec-symbol.prototype.description\n'use strict';\nvar $ = require('../internals/export');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar global = require('../internals/global');\nvar has = require('../internals/has');\nvar isObject = require('../internals/is-object');\nvar defineProperty = require('../internals/object-define-property').f;\nvar copyConstructorProperties = require('../internals/copy-constructor-properties');\n\nvar NativeSymbol = global.Symbol;\n\nif (DESCRIPTORS && typeof NativeSymbol == 'function' && (!('description' in NativeSymbol.prototype) ||\n // Safari 12 bug\n NativeSymbol().description !== undefined\n)) {\n var EmptyStringDescriptionStore = {};\n // wrap Symbol constructor for correct work with undefined description\n var SymbolWrapper = function Symbol() {\n var description = arguments.length < 1 || arguments[0] === undefined ? undefined : String(arguments[0]);\n var result = this instanceof SymbolWrapper\n ? new NativeSymbol(description)\n // in Edge 13, String(Symbol(undefined)) === 'Symbol(undefined)'\n : description === undefined ? NativeSymbol() : NativeSymbol(description);\n if (description === '') EmptyStringDescriptionStore[result] = true;\n return result;\n };\n copyConstructorProperties(SymbolWrapper, NativeSymbol);\n var symbolPrototype = SymbolWrapper.prototype = NativeSymbol.prototype;\n symbolPrototype.constructor = SymbolWrapper;\n\n var symbolToString = symbolPrototype.toString;\n var native = String(NativeSymbol('test')) == 'Symbol(test)';\n var regexp = /^Symbol\\((.*)\\)[^)]+$/;\n defineProperty(symbolPrototype, 'description', {\n configurable: true,\n get: function description() {\n var symbol = isObject(this) ? this.valueOf() : this;\n var string = symbolToString.call(symbol);\n if (has(EmptyStringDescriptionStore, symbol)) return '';\n var desc = native ? string.slice(7, -1) : string.replace(regexp, '$1');\n return desc === '' ? undefined : desc;\n }\n });\n\n $({ global: true, forced: true }, {\n Symbol: SymbolWrapper\n });\n}\n","var wellKnownSymbol = require('../internals/well-known-symbol');\nvar create = require('../internals/object-create');\nvar hide = require('../internals/hide');\n\nvar UNSCOPABLES = wellKnownSymbol('unscopables');\nvar ArrayPrototype = Array.prototype;\n\n// Array.prototype[@@unscopables]\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\nif (ArrayPrototype[UNSCOPABLES] == undefined) {\n hide(ArrayPrototype, UNSCOPABLES, create(null));\n}\n\n// add a key to Array.prototype[@@unscopables]\nmodule.exports = function (key) {\n ArrayPrototype[UNSCOPABLES][key] = true;\n};\n","var fails = require('../internals/fails');\n\nmodule.exports = !fails(function () {\n function F() { /* empty */ }\n F.prototype.constructor = null;\n return Object.getPrototypeOf(new F()) !== F.prototype;\n});\n","var anObject = require('../internals/an-object');\nvar aPossiblePrototype = require('../internals/a-possible-prototype');\n\n// `Object.setPrototypeOf` method\n// https://tc39.github.io/ecma262/#sec-object.setprototypeof\n// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nmodule.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () {\n var CORRECT_SETTER = false;\n var test = {};\n var setter;\n try {\n setter = Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set;\n setter.call(test, []);\n CORRECT_SETTER = test instanceof Array;\n } catch (error) { /* empty */ }\n return function setPrototypeOf(O, proto) {\n anObject(O);\n aPossiblePrototype(proto);\n if (CORRECT_SETTER) setter.call(O, proto);\n else O.__proto__ = proto;\n return O;\n };\n}() : undefined);\n","var isObject = require('../internals/is-object');\n\nmodule.exports = function (it) {\n if (!isObject(it) && it !== null) {\n throw TypeError(\"Can't set \" + String(it) + ' as a prototype');\n } return it;\n};\n","// iterable DOM collections\n// flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods\nmodule.exports = {\n CSSRuleList: 0,\n CSSStyleDeclaration: 0,\n CSSValueList: 0,\n ClientRectList: 0,\n DOMRectList: 0,\n DOMStringList: 0,\n DOMTokenList: 1,\n DataTransferItemList: 0,\n FileList: 0,\n HTMLAllCollection: 0,\n HTMLCollection: 0,\n HTMLFormElement: 0,\n HTMLSelectElement: 0,\n MediaList: 0,\n MimeTypeArray: 0,\n NamedNodeMap: 0,\n NodeList: 1,\n PaintRequestList: 0,\n Plugin: 0,\n PluginArray: 0,\n SVGLengthList: 0,\n SVGNumberList: 0,\n SVGPathSegList: 0,\n SVGPointList: 0,\n SVGStringList: 0,\n SVGTransformList: 0,\n SourceBufferList: 0,\n StyleSheetList: 0,\n TextTrackCueList: 0,\n TextTrackList: 0,\n TouchList: 0\n};\n","/*!\n * Platform.js \n * Copyright 2014-2018 Benjamin Tan \n * Copyright 2011-2013 John-David Dalton \n * Available under MIT license \n */\n;(function() {\n 'use strict';\n\n /** Used to determine if values are of the language type `Object`. */\n var objectTypes = {\n 'function': true,\n 'object': true\n };\n\n /** Used as a reference to the global object. */\n var root = (objectTypes[typeof window] && window) || this;\n\n /** Backup possible global object. */\n var oldRoot = root;\n\n /** Detect free variable `exports`. */\n var freeExports = objectTypes[typeof exports] && exports;\n\n /** Detect free variable `module`. */\n var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;\n\n /** Detect free variable `global` from Node.js or Browserified code and use it as `root`. */\n var freeGlobal = freeExports && freeModule && typeof global == 'object' && global;\n if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal || freeGlobal.self === freeGlobal)) {\n root = freeGlobal;\n }\n\n /**\n * Used as the maximum length of an array-like object.\n * See the [ES6 spec](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength)\n * for more details.\n */\n var maxSafeInteger = Math.pow(2, 53) - 1;\n\n /** Regular expression to detect Opera. */\n var reOpera = /\\bOpera/;\n\n /** Possible global object. */\n var thisBinding = this;\n\n /** Used for native method references. */\n var objectProto = Object.prototype;\n\n /** Used to check for own properties of an object. */\n var hasOwnProperty = objectProto.hasOwnProperty;\n\n /** Used to resolve the internal `[[Class]]` of values. */\n var toString = objectProto.toString;\n\n /*--------------------------------------------------------------------------*/\n\n /**\n * Capitalizes a string value.\n *\n * @private\n * @param {string} string The string to capitalize.\n * @returns {string} The capitalized string.\n */\n function capitalize(string) {\n string = String(string);\n return string.charAt(0).toUpperCase() + string.slice(1);\n }\n\n /**\n * A utility function to clean up the OS name.\n *\n * @private\n * @param {string} os The OS name to clean up.\n * @param {string} [pattern] A `RegExp` pattern matching the OS name.\n * @param {string} [label] A label for the OS.\n */\n function cleanupOS(os, pattern, label) {\n // Platform tokens are defined at:\n // http://msdn.microsoft.com/en-us/library/ms537503(VS.85).aspx\n // http://web.archive.org/web/20081122053950/http://msdn.microsoft.com/en-us/library/ms537503(VS.85).aspx\n var data = {\n '10.0': '10',\n '6.4': '10 Technical Preview',\n '6.3': '8.1',\n '6.2': '8',\n '6.1': 'Server 2008 R2 / 7',\n '6.0': 'Server 2008 / Vista',\n '5.2': 'Server 2003 / XP 64-bit',\n '5.1': 'XP',\n '5.01': '2000 SP1',\n '5.0': '2000',\n '4.0': 'NT',\n '4.90': 'ME'\n };\n // Detect Windows version from platform tokens.\n if (pattern && label && /^Win/i.test(os) && !/^Windows Phone /i.test(os) &&\n (data = data[/[\\d.]+$/.exec(os)])) {\n os = 'Windows ' + data;\n }\n // Correct character case and cleanup string.\n os = String(os);\n\n if (pattern && label) {\n os = os.replace(RegExp(pattern, 'i'), label);\n }\n\n os = format(\n os.replace(/ ce$/i, ' CE')\n .replace(/\\bhpw/i, 'web')\n .replace(/\\bMacintosh\\b/, 'Mac OS')\n .replace(/_PowerPC\\b/i, ' OS')\n .replace(/\\b(OS X) [^ \\d]+/i, '$1')\n .replace(/\\bMac (OS X)\\b/, '$1')\n .replace(/\\/(\\d)/, ' $1')\n .replace(/_/g, '.')\n .replace(/(?: BePC|[ .]*fc[ \\d.]+)$/i, '')\n .replace(/\\bx86\\.64\\b/gi, 'x86_64')\n .replace(/\\b(Windows Phone) OS\\b/, '$1')\n .replace(/\\b(Chrome OS \\w+) [\\d.]+\\b/, '$1')\n .split(' on ')[0]\n );\n\n return os;\n }\n\n /**\n * An iteration utility for arrays and objects.\n *\n * @private\n * @param {Array|Object} object The object to iterate over.\n * @param {Function} callback The function called per iteration.\n */\n function each(object, callback) {\n var index = -1,\n length = object ? object.length : 0;\n\n if (typeof length == 'number' && length > -1 && length <= maxSafeInteger) {\n while (++index < length) {\n callback(object[index], index, object);\n }\n } else {\n forOwn(object, callback);\n }\n }\n\n /**\n * Trim and conditionally capitalize string values.\n *\n * @private\n * @param {string} string The string to format.\n * @returns {string} The formatted string.\n */\n function format(string) {\n string = trim(string);\n return /^(?:webOS|i(?:OS|P))/.test(string)\n ? string\n : capitalize(string);\n }\n\n /**\n * Iterates over an object's own properties, executing the `callback` for each.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} callback The function executed per own property.\n */\n function forOwn(object, callback) {\n for (var key in object) {\n if (hasOwnProperty.call(object, key)) {\n callback(object[key], key, object);\n }\n }\n }\n\n /**\n * Gets the internal `[[Class]]` of a value.\n *\n * @private\n * @param {*} value The value.\n * @returns {string} The `[[Class]]`.\n */\n function getClassOf(value) {\n return value == null\n ? capitalize(value)\n : toString.call(value).slice(8, -1);\n }\n\n /**\n * Host objects can return type values that are different from their actual\n * data type. The objects we are concerned with usually return non-primitive\n * types of \"object\", \"function\", or \"unknown\".\n *\n * @private\n * @param {*} object The owner of the property.\n * @param {string} property The property to check.\n * @returns {boolean} Returns `true` if the property value is a non-primitive, else `false`.\n */\n function isHostType(object, property) {\n var type = object != null ? typeof object[property] : 'number';\n return !/^(?:boolean|number|string|undefined)$/.test(type) &&\n (type == 'object' ? !!object[property] : true);\n }\n\n /**\n * Prepares a string for use in a `RegExp` by making hyphens and spaces optional.\n *\n * @private\n * @param {string} string The string to qualify.\n * @returns {string} The qualified string.\n */\n function qualify(string) {\n return String(string).replace(/([ -])(?!$)/g, '$1?');\n }\n\n /**\n * A bare-bones `Array#reduce` like utility function.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} callback The function called per iteration.\n * @returns {*} The accumulated result.\n */\n function reduce(array, callback) {\n var accumulator = null;\n each(array, function(value, index) {\n accumulator = callback(accumulator, value, index, array);\n });\n return accumulator;\n }\n\n /**\n * Removes leading and trailing whitespace from a string.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} The trimmed string.\n */\n function trim(string) {\n return String(string).replace(/^ +| +$/g, '');\n }\n\n /*--------------------------------------------------------------------------*/\n\n /**\n * Creates a new platform object.\n *\n * @memberOf platform\n * @param {Object|string} [ua=navigator.userAgent] The user agent string or\n * context object.\n * @returns {Object} A platform object.\n */\n function parse(ua) {\n\n /** The environment context object. */\n var context = root;\n\n /** Used to flag when a custom context is provided. */\n var isCustomContext = ua && typeof ua == 'object' && getClassOf(ua) != 'String';\n\n // Juggle arguments.\n if (isCustomContext) {\n context = ua;\n ua = null;\n }\n\n /** Browser navigator object. */\n var nav = context.navigator || {};\n\n /** Browser user agent string. */\n var userAgent = nav.userAgent || '';\n\n ua || (ua = userAgent);\n\n /** Used to flag when `thisBinding` is the [ModuleScope]. */\n var isModuleScope = isCustomContext || thisBinding == oldRoot;\n\n /** Used to detect if browser is like Chrome. */\n var likeChrome = isCustomContext\n ? !!nav.likeChrome\n : /\\bChrome\\b/.test(ua) && !/internal|\\n/i.test(toString.toString());\n\n /** Internal `[[Class]]` value shortcuts. */\n var objectClass = 'Object',\n airRuntimeClass = isCustomContext ? objectClass : 'ScriptBridgingProxyObject',\n enviroClass = isCustomContext ? objectClass : 'Environment',\n javaClass = (isCustomContext && context.java) ? 'JavaPackage' : getClassOf(context.java),\n phantomClass = isCustomContext ? objectClass : 'RuntimeObject';\n\n /** Detect Java environments. */\n var java = /\\bJava/.test(javaClass) && context.java;\n\n /** Detect Rhino. */\n var rhino = java && getClassOf(context.environment) == enviroClass;\n\n /** A character to represent alpha. */\n var alpha = java ? 'a' : '\\u03b1';\n\n /** A character to represent beta. */\n var beta = java ? 'b' : '\\u03b2';\n\n /** Browser document object. */\n var doc = context.document || {};\n\n /**\n * Detect Opera browser (Presto-based).\n * http://www.howtocreate.co.uk/operaStuff/operaObject.html\n * http://dev.opera.com/articles/view/opera-mini-web-content-authoring-guidelines/#operamini\n */\n var opera = context.operamini || context.opera;\n\n /** Opera `[[Class]]`. */\n var operaClass = reOpera.test(operaClass = (isCustomContext && opera) ? opera['[[Class]]'] : getClassOf(opera))\n ? operaClass\n : (opera = null);\n\n /*------------------------------------------------------------------------*/\n\n /** Temporary variable used over the script's lifetime. */\n var data;\n\n /** The CPU architecture. */\n var arch = ua;\n\n /** Platform description array. */\n var description = [];\n\n /** Platform alpha/beta indicator. */\n var prerelease = null;\n\n /** A flag to indicate that environment features should be used to resolve the platform. */\n var useFeatures = ua == userAgent;\n\n /** The browser/environment version. */\n var version = useFeatures && opera && typeof opera.version == 'function' && opera.version();\n\n /** A flag to indicate if the OS ends with \"/ Version\" */\n var isSpecialCasedOS;\n\n /* Detectable layout engines (order is important). */\n var layout = getLayout([\n { 'label': 'EdgeHTML', 'pattern': 'Edge' },\n 'Trident',\n { 'label': 'WebKit', 'pattern': 'AppleWebKit' },\n 'iCab',\n 'Presto',\n 'NetFront',\n 'Tasman',\n 'KHTML',\n 'Gecko'\n ]);\n\n /* Detectable browser names (order is important). */\n var name = getName([\n 'Adobe AIR',\n 'Arora',\n 'Avant Browser',\n 'Breach',\n 'Camino',\n 'Electron',\n 'Epiphany',\n 'Fennec',\n 'Flock',\n 'Galeon',\n 'GreenBrowser',\n 'iCab',\n 'Iceweasel',\n 'K-Meleon',\n 'Konqueror',\n 'Lunascape',\n 'Maxthon',\n { 'label': 'Microsoft Edge', 'pattern': 'Edge' },\n 'Midori',\n 'Nook Browser',\n 'PaleMoon',\n 'PhantomJS',\n 'Raven',\n 'Rekonq',\n 'RockMelt',\n { 'label': 'Samsung Internet', 'pattern': 'SamsungBrowser' },\n 'SeaMonkey',\n { 'label': 'Silk', 'pattern': '(?:Cloud9|Silk-Accelerated)' },\n 'Sleipnir',\n 'SlimBrowser',\n { 'label': 'SRWare Iron', 'pattern': 'Iron' },\n 'Sunrise',\n 'Swiftfox',\n 'Waterfox',\n 'WebPositive',\n 'Opera Mini',\n { 'label': 'Opera Mini', 'pattern': 'OPiOS' },\n 'Opera',\n { 'label': 'Opera', 'pattern': 'OPR' },\n 'Chrome',\n { 'label': 'Chrome Mobile', 'pattern': '(?:CriOS|CrMo)' },\n { 'label': 'Firefox', 'pattern': '(?:Firefox|Minefield)' },\n { 'label': 'Firefox for iOS', 'pattern': 'FxiOS' },\n { 'label': 'IE', 'pattern': 'IEMobile' },\n { 'label': 'IE', 'pattern': 'MSIE' },\n 'Safari'\n ]);\n\n /* Detectable products (order is important). */\n var product = getProduct([\n { 'label': 'BlackBerry', 'pattern': 'BB10' },\n 'BlackBerry',\n { 'label': 'Galaxy S', 'pattern': 'GT-I9000' },\n { 'label': 'Galaxy S2', 'pattern': 'GT-I9100' },\n { 'label': 'Galaxy S3', 'pattern': 'GT-I9300' },\n { 'label': 'Galaxy S4', 'pattern': 'GT-I9500' },\n { 'label': 'Galaxy S5', 'pattern': 'SM-G900' },\n { 'label': 'Galaxy S6', 'pattern': 'SM-G920' },\n { 'label': 'Galaxy S6 Edge', 'pattern': 'SM-G925' },\n { 'label': 'Galaxy S7', 'pattern': 'SM-G930' },\n { 'label': 'Galaxy S7 Edge', 'pattern': 'SM-G935' },\n 'Google TV',\n 'Lumia',\n 'iPad',\n 'iPod',\n 'iPhone',\n 'Kindle',\n { 'label': 'Kindle Fire', 'pattern': '(?:Cloud9|Silk-Accelerated)' },\n 'Nexus',\n 'Nook',\n 'PlayBook',\n 'PlayStation Vita',\n 'PlayStation',\n 'TouchPad',\n 'Transformer',\n { 'label': 'Wii U', 'pattern': 'WiiU' },\n 'Wii',\n 'Xbox One',\n { 'label': 'Xbox 360', 'pattern': 'Xbox' },\n 'Xoom'\n ]);\n\n /* Detectable manufacturers. */\n var manufacturer = getManufacturer({\n 'Apple': { 'iPad': 1, 'iPhone': 1, 'iPod': 1 },\n 'Archos': {},\n 'Amazon': { 'Kindle': 1, 'Kindle Fire': 1 },\n 'Asus': { 'Transformer': 1 },\n 'Barnes & Noble': { 'Nook': 1 },\n 'BlackBerry': { 'PlayBook': 1 },\n 'Google': { 'Google TV': 1, 'Nexus': 1 },\n 'HP': { 'TouchPad': 1 },\n 'HTC': {},\n 'LG': {},\n 'Microsoft': { 'Xbox': 1, 'Xbox One': 1 },\n 'Motorola': { 'Xoom': 1 },\n 'Nintendo': { 'Wii U': 1, 'Wii': 1 },\n 'Nokia': { 'Lumia': 1 },\n 'Samsung': { 'Galaxy S': 1, 'Galaxy S2': 1, 'Galaxy S3': 1, 'Galaxy S4': 1 },\n 'Sony': { 'PlayStation': 1, 'PlayStation Vita': 1 }\n });\n\n /* Detectable operating systems (order is important). */\n var os = getOS([\n 'Windows Phone',\n 'Android',\n 'CentOS',\n { 'label': 'Chrome OS', 'pattern': 'CrOS' },\n 'Debian',\n 'Fedora',\n 'FreeBSD',\n 'Gentoo',\n 'Haiku',\n 'Kubuntu',\n 'Linux Mint',\n 'OpenBSD',\n 'Red Hat',\n 'SuSE',\n 'Ubuntu',\n 'Xubuntu',\n 'Cygwin',\n 'Symbian OS',\n 'hpwOS',\n 'webOS ',\n 'webOS',\n 'Tablet OS',\n 'Tizen',\n 'Linux',\n 'Mac OS X',\n 'Macintosh',\n 'Mac',\n 'Windows 98;',\n 'Windows '\n ]);\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Picks the layout engine from an array of guesses.\n *\n * @private\n * @param {Array} guesses An array of guesses.\n * @returns {null|string} The detected layout engine.\n */\n function getLayout(guesses) {\n return reduce(guesses, function(result, guess) {\n return result || RegExp('\\\\b' + (\n guess.pattern || qualify(guess)\n ) + '\\\\b', 'i').exec(ua) && (guess.label || guess);\n });\n }\n\n /**\n * Picks the manufacturer from an array of guesses.\n *\n * @private\n * @param {Array} guesses An object of guesses.\n * @returns {null|string} The detected manufacturer.\n */\n function getManufacturer(guesses) {\n return reduce(guesses, function(result, value, key) {\n // Lookup the manufacturer by product or scan the UA for the manufacturer.\n return result || (\n value[product] ||\n value[/^[a-z]+(?: +[a-z]+\\b)*/i.exec(product)] ||\n RegExp('\\\\b' + qualify(key) + '(?:\\\\b|\\\\w*\\\\d)', 'i').exec(ua)\n ) && key;\n });\n }\n\n /**\n * Picks the browser name from an array of guesses.\n *\n * @private\n * @param {Array} guesses An array of guesses.\n * @returns {null|string} The detected browser name.\n */\n function getName(guesses) {\n return reduce(guesses, function(result, guess) {\n return result || RegExp('\\\\b' + (\n guess.pattern || qualify(guess)\n ) + '\\\\b', 'i').exec(ua) && (guess.label || guess);\n });\n }\n\n /**\n * Picks the OS name from an array of guesses.\n *\n * @private\n * @param {Array} guesses An array of guesses.\n * @returns {null|string} The detected OS name.\n */\n function getOS(guesses) {\n return reduce(guesses, function(result, guess) {\n var pattern = guess.pattern || qualify(guess);\n if (!result && (result =\n RegExp('\\\\b' + pattern + '(?:/[\\\\d.]+|[ \\\\w.]*)', 'i').exec(ua)\n )) {\n result = cleanupOS(result, pattern, guess.label || guess);\n }\n return result;\n });\n }\n\n /**\n * Picks the product name from an array of guesses.\n *\n * @private\n * @param {Array} guesses An array of guesses.\n * @returns {null|string} The detected product name.\n */\n function getProduct(guesses) {\n return reduce(guesses, function(result, guess) {\n var pattern = guess.pattern || qualify(guess);\n if (!result && (result =\n RegExp('\\\\b' + pattern + ' *\\\\d+[.\\\\w_]*', 'i').exec(ua) ||\n RegExp('\\\\b' + pattern + ' *\\\\w+-[\\\\w]*', 'i').exec(ua) ||\n RegExp('\\\\b' + pattern + '(?:; *(?:[a-z]+[_-])?[a-z]+\\\\d+|[^ ();-]*)', 'i').exec(ua)\n )) {\n // Split by forward slash and append product version if needed.\n if ((result = String((guess.label && !RegExp(pattern, 'i').test(guess.label)) ? guess.label : result).split('/'))[1] && !/[\\d.]+/.test(result[0])) {\n result[0] += ' ' + result[1];\n }\n // Correct character case and cleanup string.\n guess = guess.label || guess;\n result = format(result[0]\n .replace(RegExp(pattern, 'i'), guess)\n .replace(RegExp('; *(?:' + guess + '[_-])?', 'i'), ' ')\n .replace(RegExp('(' + guess + ')[-_.]?(\\\\w)', 'i'), '$1 $2'));\n }\n return result;\n });\n }\n\n /**\n * Resolves the version using an array of UA patterns.\n *\n * @private\n * @param {Array} patterns An array of UA patterns.\n * @returns {null|string} The detected version.\n */\n function getVersion(patterns) {\n return reduce(patterns, function(result, pattern) {\n return result || (RegExp(pattern +\n '(?:-[\\\\d.]+/|(?: for [\\\\w-]+)?[ /-])([\\\\d.]+[^ ();/_-]*)', 'i').exec(ua) || 0)[1] || null;\n });\n }\n\n /**\n * Returns `platform.description` when the platform object is coerced to a string.\n *\n * @name toString\n * @memberOf platform\n * @returns {string} Returns `platform.description` if available, else an empty string.\n */\n function toStringPlatform() {\n return this.description || '';\n }\n\n /*------------------------------------------------------------------------*/\n\n // Convert layout to an array so we can add extra details.\n layout && (layout = [layout]);\n\n // Detect product names that contain their manufacturer's name.\n if (manufacturer && !product) {\n product = getProduct([manufacturer]);\n }\n // Clean up Google TV.\n if ((data = /\\bGoogle TV\\b/.exec(product))) {\n product = data[0];\n }\n // Detect simulators.\n if (/\\bSimulator\\b/i.test(ua)) {\n product = (product ? product + ' ' : '') + 'Simulator';\n }\n // Detect Opera Mini 8+ running in Turbo/Uncompressed mode on iOS.\n if (name == 'Opera Mini' && /\\bOPiOS\\b/.test(ua)) {\n description.push('running in Turbo/Uncompressed mode');\n }\n // Detect IE Mobile 11.\n if (name == 'IE' && /\\blike iPhone OS\\b/.test(ua)) {\n data = parse(ua.replace(/like iPhone OS/, ''));\n manufacturer = data.manufacturer;\n product = data.product;\n }\n // Detect iOS.\n else if (/^iP/.test(product)) {\n name || (name = 'Safari');\n os = 'iOS' + ((data = / OS ([\\d_]+)/i.exec(ua))\n ? ' ' + data[1].replace(/_/g, '.')\n : '');\n }\n // Detect Kubuntu.\n else if (name == 'Konqueror' && !/buntu/i.test(os)) {\n os = 'Kubuntu';\n }\n // Detect Android browsers.\n else if ((manufacturer && manufacturer != 'Google' &&\n ((/Chrome/.test(name) && !/\\bMobile Safari\\b/i.test(ua)) || /\\bVita\\b/.test(product))) ||\n (/\\bAndroid\\b/.test(os) && /^Chrome/.test(name) && /\\bVersion\\//i.test(ua))) {\n name = 'Android Browser';\n os = /\\bAndroid\\b/.test(os) ? os : 'Android';\n }\n // Detect Silk desktop/accelerated modes.\n else if (name == 'Silk') {\n if (!/\\bMobi/i.test(ua)) {\n os = 'Android';\n description.unshift('desktop mode');\n }\n if (/Accelerated *= *true/i.test(ua)) {\n description.unshift('accelerated');\n }\n }\n // Detect PaleMoon identifying as Firefox.\n else if (name == 'PaleMoon' && (data = /\\bFirefox\\/([\\d.]+)\\b/.exec(ua))) {\n description.push('identifying as Firefox ' + data[1]);\n }\n // Detect Firefox OS and products running Firefox.\n else if (name == 'Firefox' && (data = /\\b(Mobile|Tablet|TV)\\b/i.exec(ua))) {\n os || (os = 'Firefox OS');\n product || (product = data[1]);\n }\n // Detect false positives for Firefox/Safari.\n else if (!name || (data = !/\\bMinefield\\b/i.test(ua) && /\\b(?:Firefox|Safari)\\b/.exec(name))) {\n // Escape the `/` for Firefox 1.\n if (name && !product && /[\\/,]|^[^(]+?\\)/.test(ua.slice(ua.indexOf(data + '/') + 8))) {\n // Clear name of false positives.\n name = null;\n }\n // Reassign a generic name.\n if ((data = product || manufacturer || os) &&\n (product || manufacturer || /\\b(?:Android|Symbian OS|Tablet OS|webOS)\\b/.test(os))) {\n name = /[a-z]+(?: Hat)?/i.exec(/\\bAndroid\\b/.test(os) ? os : data) + ' Browser';\n }\n }\n // Add Chrome version to description for Electron.\n else if (name == 'Electron' && (data = (/\\bChrome\\/([\\d.]+)\\b/.exec(ua) || 0)[1])) {\n description.push('Chromium ' + data);\n }\n // Detect non-Opera (Presto-based) versions (order is important).\n if (!version) {\n version = getVersion([\n '(?:Cloud9|CriOS|CrMo|Edge|FxiOS|IEMobile|Iron|Opera ?Mini|OPiOS|OPR|Raven|SamsungBrowser|Silk(?!/[\\\\d.]+$))',\n 'Version',\n qualify(name),\n '(?:Firefox|Minefield|NetFront)'\n ]);\n }\n // Detect stubborn layout engines.\n if ((data =\n layout == 'iCab' && parseFloat(version) > 3 && 'WebKit' ||\n /\\bOpera\\b/.test(name) && (/\\bOPR\\b/.test(ua) ? 'Blink' : 'Presto') ||\n /\\b(?:Midori|Nook|Safari)\\b/i.test(ua) && !/^(?:Trident|EdgeHTML)$/.test(layout) && 'WebKit' ||\n !layout && /\\bMSIE\\b/i.test(ua) && (os == 'Mac OS' ? 'Tasman' : 'Trident') ||\n layout == 'WebKit' && /\\bPlayStation\\b(?! Vita\\b)/i.test(name) && 'NetFront'\n )) {\n layout = [data];\n }\n // Detect Windows Phone 7 desktop mode.\n if (name == 'IE' && (data = (/; *(?:XBLWP|ZuneWP)(\\d+)/i.exec(ua) || 0)[1])) {\n name += ' Mobile';\n os = 'Windows Phone ' + (/\\+$/.test(data) ? data : data + '.x');\n description.unshift('desktop mode');\n }\n // Detect Windows Phone 8.x desktop mode.\n else if (/\\bWPDesktop\\b/i.test(ua)) {\n name = 'IE Mobile';\n os = 'Windows Phone 8.x';\n description.unshift('desktop mode');\n version || (version = (/\\brv:([\\d.]+)/.exec(ua) || 0)[1]);\n }\n // Detect IE 11 identifying as other browsers.\n else if (name != 'IE' && layout == 'Trident' && (data = /\\brv:([\\d.]+)/.exec(ua))) {\n if (name) {\n description.push('identifying as ' + name + (version ? ' ' + version : ''));\n }\n name = 'IE';\n version = data[1];\n }\n // Leverage environment features.\n if (useFeatures) {\n // Detect server-side environments.\n // Rhino has a global function while others have a global object.\n if (isHostType(context, 'global')) {\n if (java) {\n data = java.lang.System;\n arch = data.getProperty('os.arch');\n os = os || data.getProperty('os.name') + ' ' + data.getProperty('os.version');\n }\n if (rhino) {\n try {\n version = context.require('ringo/engine').version.join('.');\n name = 'RingoJS';\n } catch(e) {\n if ((data = context.system) && data.global.system == context.system) {\n name = 'Narwhal';\n os || (os = data[0].os || null);\n }\n }\n if (!name) {\n name = 'Rhino';\n }\n }\n else if (\n typeof context.process == 'object' && !context.process.browser &&\n (data = context.process)\n ) {\n if (typeof data.versions == 'object') {\n if (typeof data.versions.electron == 'string') {\n description.push('Node ' + data.versions.node);\n name = 'Electron';\n version = data.versions.electron;\n } else if (typeof data.versions.nw == 'string') {\n description.push('Chromium ' + version, 'Node ' + data.versions.node);\n name = 'NW.js';\n version = data.versions.nw;\n }\n }\n if (!name) {\n name = 'Node.js';\n arch = data.arch;\n os = data.platform;\n version = /[\\d.]+/.exec(data.version);\n version = version ? version[0] : null;\n }\n }\n }\n // Detect Adobe AIR.\n else if (getClassOf((data = context.runtime)) == airRuntimeClass) {\n name = 'Adobe AIR';\n os = data.flash.system.Capabilities.os;\n }\n // Detect PhantomJS.\n else if (getClassOf((data = context.phantom)) == phantomClass) {\n name = 'PhantomJS';\n version = (data = data.version || null) && (data.major + '.' + data.minor + '.' + data.patch);\n }\n // Detect IE compatibility modes.\n else if (typeof doc.documentMode == 'number' && (data = /\\bTrident\\/(\\d+)/i.exec(ua))) {\n // We're in compatibility mode when the Trident version + 4 doesn't\n // equal the document mode.\n version = [version, doc.documentMode];\n if ((data = +data[1] + 4) != version[1]) {\n description.push('IE ' + version[1] + ' mode');\n layout && (layout[1] = '');\n version[1] = data;\n }\n version = name == 'IE' ? String(version[1].toFixed(1)) : version[0];\n }\n // Detect IE 11 masking as other browsers.\n else if (typeof doc.documentMode == 'number' && /^(?:Chrome|Firefox)\\b/.test(name)) {\n description.push('masking as ' + name + ' ' + version);\n name = 'IE';\n version = '11.0';\n layout = ['Trident'];\n os = 'Windows';\n }\n os = os && format(os);\n }\n // Detect prerelease phases.\n if (version && (data =\n /(?:[ab]|dp|pre|[ab]\\d+pre)(?:\\d+\\+?)?$/i.exec(version) ||\n /(?:alpha|beta)(?: ?\\d)?/i.exec(ua + ';' + (useFeatures && nav.appMinorVersion)) ||\n /\\bMinefield\\b/i.test(ua) && 'a'\n )) {\n prerelease = /b/i.test(data) ? 'beta' : 'alpha';\n version = version.replace(RegExp(data + '\\\\+?$'), '') +\n (prerelease == 'beta' ? beta : alpha) + (/\\d+\\+?/.exec(data) || '');\n }\n // Detect Firefox Mobile.\n if (name == 'Fennec' || name == 'Firefox' && /\\b(?:Android|Firefox OS)\\b/.test(os)) {\n name = 'Firefox Mobile';\n }\n // Obscure Maxthon's unreliable version.\n else if (name == 'Maxthon' && version) {\n version = version.replace(/\\.[\\d.]+/, '.x');\n }\n // Detect Xbox 360 and Xbox One.\n else if (/\\bXbox\\b/i.test(product)) {\n if (product == 'Xbox 360') {\n os = null;\n }\n if (product == 'Xbox 360' && /\\bIEMobile\\b/.test(ua)) {\n description.unshift('mobile mode');\n }\n }\n // Add mobile postfix.\n else if ((/^(?:Chrome|IE|Opera)$/.test(name) || name && !product && !/Browser|Mobi/.test(name)) &&\n (os == 'Windows CE' || /Mobi/i.test(ua))) {\n name += ' Mobile';\n }\n // Detect IE platform preview.\n else if (name == 'IE' && useFeatures) {\n try {\n if (context.external === null) {\n description.unshift('platform preview');\n }\n } catch(e) {\n description.unshift('embedded');\n }\n }\n // Detect BlackBerry OS version.\n // http://docs.blackberry.com/en/developers/deliverables/18169/HTTP_headers_sent_by_BB_Browser_1234911_11.jsp\n else if ((/\\bBlackBerry\\b/.test(product) || /\\bBB10\\b/.test(ua)) && (data =\n (RegExp(product.replace(/ +/g, ' *') + '/([.\\\\d]+)', 'i').exec(ua) || 0)[1] ||\n version\n )) {\n data = [data, /BB10/.test(ua)];\n os = (data[1] ? (product = null, manufacturer = 'BlackBerry') : 'Device Software') + ' ' + data[0];\n version = null;\n }\n // Detect Opera identifying/masking itself as another browser.\n // http://www.opera.com/support/kb/view/843/\n else if (this != forOwn && product != 'Wii' && (\n (useFeatures && opera) ||\n (/Opera/.test(name) && /\\b(?:MSIE|Firefox)\\b/i.test(ua)) ||\n (name == 'Firefox' && /\\bOS X (?:\\d+\\.){2,}/.test(os)) ||\n (name == 'IE' && (\n (os && !/^Win/.test(os) && version > 5.5) ||\n /\\bWindows XP\\b/.test(os) && version > 8 ||\n version == 8 && !/\\bTrident\\b/.test(ua)\n ))\n ) && !reOpera.test((data = parse.call(forOwn, ua.replace(reOpera, '') + ';'))) && data.name) {\n // When \"identifying\", the UA contains both Opera and the other browser's name.\n data = 'ing as ' + data.name + ((data = data.version) ? ' ' + data : '');\n if (reOpera.test(name)) {\n if (/\\bIE\\b/.test(data) && os == 'Mac OS') {\n os = null;\n }\n data = 'identify' + data;\n }\n // When \"masking\", the UA contains only the other browser's name.\n else {\n data = 'mask' + data;\n if (operaClass) {\n name = format(operaClass.replace(/([a-z])([A-Z])/g, '$1 $2'));\n } else {\n name = 'Opera';\n }\n if (/\\bIE\\b/.test(data)) {\n os = null;\n }\n if (!useFeatures) {\n version = null;\n }\n }\n layout = ['Presto'];\n description.push(data);\n }\n // Detect WebKit Nightly and approximate Chrome/Safari versions.\n if ((data = (/\\bAppleWebKit\\/([\\d.]+\\+?)/i.exec(ua) || 0)[1])) {\n // Correct build number for numeric comparison.\n // (e.g. \"532.5\" becomes \"532.05\")\n data = [parseFloat(data.replace(/\\.(\\d)$/, '.0$1')), data];\n // Nightly builds are postfixed with a \"+\".\n if (name == 'Safari' && data[1].slice(-1) == '+') {\n name = 'WebKit Nightly';\n prerelease = 'alpha';\n version = data[1].slice(0, -1);\n }\n // Clear incorrect browser versions.\n else if (version == data[1] ||\n version == (data[2] = (/\\bSafari\\/([\\d.]+\\+?)/i.exec(ua) || 0)[1])) {\n version = null;\n }\n // Use the full Chrome version when available.\n data[1] = (/\\bChrome\\/([\\d.]+)/i.exec(ua) || 0)[1];\n // Detect Blink layout engine.\n if (data[0] == 537.36 && data[2] == 537.36 && parseFloat(data[1]) >= 28 && layout == 'WebKit') {\n layout = ['Blink'];\n }\n // Detect JavaScriptCore.\n // http://stackoverflow.com/questions/6768474/how-can-i-detect-which-javascript-engine-v8-or-jsc-is-used-at-runtime-in-androi\n if (!useFeatures || (!likeChrome && !data[1])) {\n layout && (layout[1] = 'like Safari');\n data = (data = data[0], data < 400 ? 1 : data < 500 ? 2 : data < 526 ? 3 : data < 533 ? 4 : data < 534 ? '4+' : data < 535 ? 5 : data < 537 ? 6 : data < 538 ? 7 : data < 601 ? 8 : '8');\n } else {\n layout && (layout[1] = 'like Chrome');\n data = data[1] || (data = data[0], data < 530 ? 1 : data < 532 ? 2 : data < 532.05 ? 3 : data < 533 ? 4 : data < 534.03 ? 5 : data < 534.07 ? 6 : data < 534.10 ? 7 : data < 534.13 ? 8 : data < 534.16 ? 9 : data < 534.24 ? 10 : data < 534.30 ? 11 : data < 535.01 ? 12 : data < 535.02 ? '13+' : data < 535.07 ? 15 : data < 535.11 ? 16 : data < 535.19 ? 17 : data < 536.05 ? 18 : data < 536.10 ? 19 : data < 537.01 ? 20 : data < 537.11 ? '21+' : data < 537.13 ? 23 : data < 537.18 ? 24 : data < 537.24 ? 25 : data < 537.36 ? 26 : layout != 'Blink' ? '27' : '28');\n }\n // Add the postfix of \".x\" or \"+\" for approximate versions.\n layout && (layout[1] += ' ' + (data += typeof data == 'number' ? '.x' : /[.+]/.test(data) ? '' : '+'));\n // Obscure version for some Safari 1-2 releases.\n if (name == 'Safari' && (!version || parseInt(version) > 45)) {\n version = data;\n }\n }\n // Detect Opera desktop modes.\n if (name == 'Opera' && (data = /\\bzbov|zvav$/.exec(os))) {\n name += ' ';\n description.unshift('desktop mode');\n if (data == 'zvav') {\n name += 'Mini';\n version = null;\n } else {\n name += 'Mobile';\n }\n os = os.replace(RegExp(' *' + data + '$'), '');\n }\n // Detect Chrome desktop mode.\n else if (name == 'Safari' && /\\bChrome\\b/.exec(layout && layout[1])) {\n description.unshift('desktop mode');\n name = 'Chrome Mobile';\n version = null;\n\n if (/\\bOS X\\b/.test(os)) {\n manufacturer = 'Apple';\n os = 'iOS 4.3+';\n } else {\n os = null;\n }\n }\n // Strip incorrect OS versions.\n if (version && version.indexOf((data = /[\\d.]+$/.exec(os))) == 0 &&\n ua.indexOf('/' + data + '-') > -1) {\n os = trim(os.replace(data, ''));\n }\n // Add layout engine.\n if (layout && !/\\b(?:Avant|Nook)\\b/.test(name) && (\n /Browser|Lunascape|Maxthon/.test(name) ||\n name != 'Safari' && /^iOS/.test(os) && /\\bSafari\\b/.test(layout[1]) ||\n /^(?:Adobe|Arora|Breach|Midori|Opera|Phantom|Rekonq|Rock|Samsung Internet|Sleipnir|Web)/.test(name) && layout[1])) {\n // Don't add layout details to description if they are falsey.\n (data = layout[layout.length - 1]) && description.push(data);\n }\n // Combine contextual information.\n if (description.length) {\n description = ['(' + description.join('; ') + ')'];\n }\n // Append manufacturer to description.\n if (manufacturer && product && product.indexOf(manufacturer) < 0) {\n description.push('on ' + manufacturer);\n }\n // Append product to description.\n if (product) {\n description.push((/^on /.test(description[description.length - 1]) ? '' : 'on ') + product);\n }\n // Parse the OS into an object.\n if (os) {\n data = / ([\\d.+]+)$/.exec(os);\n isSpecialCasedOS = data && os.charAt(os.length - data[0].length - 1) == '/';\n os = {\n 'architecture': 32,\n 'family': (data && !isSpecialCasedOS) ? os.replace(data[0], '') : os,\n 'version': data ? data[1] : null,\n 'toString': function() {\n var version = this.version;\n return this.family + ((version && !isSpecialCasedOS) ? ' ' + version : '') + (this.architecture == 64 ? ' 64-bit' : '');\n }\n };\n }\n // Add browser/OS architecture.\n if ((data = /\\b(?:AMD|IA|Win|WOW|x86_|x)64\\b/i.exec(arch)) && !/\\bi686\\b/i.test(arch)) {\n if (os) {\n os.architecture = 64;\n os.family = os.family.replace(RegExp(' *' + data), '');\n }\n if (\n name && (/\\bWOW64\\b/i.test(ua) ||\n (useFeatures && /\\w(?:86|32)$/.test(nav.cpuClass || nav.platform) && !/\\bWin64; x64\\b/i.test(ua)))\n ) {\n description.unshift('32-bit');\n }\n }\n // Chrome 39 and above on OS X is always 64-bit.\n else if (\n os && /^OS X/.test(os.family) &&\n name == 'Chrome' && parseFloat(version) >= 39\n ) {\n os.architecture = 64;\n }\n\n ua || (ua = null);\n\n /*------------------------------------------------------------------------*/\n\n /**\n * The platform object.\n *\n * @name platform\n * @type Object\n */\n var platform = {};\n\n /**\n * The platform description.\n *\n * @memberOf platform\n * @type string|null\n */\n platform.description = ua;\n\n /**\n * The name of the browser's layout engine.\n *\n * The list of common layout engines include:\n * \"Blink\", \"EdgeHTML\", \"Gecko\", \"Trident\" and \"WebKit\"\n *\n * @memberOf platform\n * @type string|null\n */\n platform.layout = layout && layout[0];\n\n /**\n * The name of the product's manufacturer.\n *\n * The list of manufacturers include:\n * \"Apple\", \"Archos\", \"Amazon\", \"Asus\", \"Barnes & Noble\", \"BlackBerry\",\n * \"Google\", \"HP\", \"HTC\", \"LG\", \"Microsoft\", \"Motorola\", \"Nintendo\",\n * \"Nokia\", \"Samsung\" and \"Sony\"\n *\n * @memberOf platform\n * @type string|null\n */\n platform.manufacturer = manufacturer;\n\n /**\n * The name of the browser/environment.\n *\n * The list of common browser names include:\n * \"Chrome\", \"Electron\", \"Firefox\", \"Firefox for iOS\", \"IE\",\n * \"Microsoft Edge\", \"PhantomJS\", \"Safari\", \"SeaMonkey\", \"Silk\",\n * \"Opera Mini\" and \"Opera\"\n *\n * Mobile versions of some browsers have \"Mobile\" appended to their name:\n * eg. \"Chrome Mobile\", \"Firefox Mobile\", \"IE Mobile\" and \"Opera Mobile\"\n *\n * @memberOf platform\n * @type string|null\n */\n platform.name = name;\n\n /**\n * The alpha/beta release indicator.\n *\n * @memberOf platform\n * @type string|null\n */\n platform.prerelease = prerelease;\n\n /**\n * The name of the product hosting the browser.\n *\n * The list of common products include:\n *\n * \"BlackBerry\", \"Galaxy S4\", \"Lumia\", \"iPad\", \"iPod\", \"iPhone\", \"Kindle\",\n * \"Kindle Fire\", \"Nexus\", \"Nook\", \"PlayBook\", \"TouchPad\" and \"Transformer\"\n *\n * @memberOf platform\n * @type string|null\n */\n platform.product = product;\n\n /**\n * The browser's user agent string.\n *\n * @memberOf platform\n * @type string|null\n */\n platform.ua = ua;\n\n /**\n * The browser/environment version.\n *\n * @memberOf platform\n * @type string|null\n */\n platform.version = name && version;\n\n /**\n * The name of the operating system.\n *\n * @memberOf platform\n * @type Object\n */\n platform.os = os || {\n\n /**\n * The CPU architecture the OS is built for.\n *\n * @memberOf platform.os\n * @type number|null\n */\n 'architecture': null,\n\n /**\n * The family of the OS.\n *\n * Common values include:\n * \"Windows\", \"Windows Server 2008 R2 / 7\", \"Windows Server 2008 / Vista\",\n * \"Windows XP\", \"OS X\", \"Ubuntu\", \"Debian\", \"Fedora\", \"Red Hat\", \"SuSE\",\n * \"Android\", \"iOS\" and \"Windows Phone\"\n *\n * @memberOf platform.os\n * @type string|null\n */\n 'family': null,\n\n /**\n * The version of the OS.\n *\n * @memberOf platform.os\n * @type string|null\n */\n 'version': null,\n\n /**\n * Returns the OS string.\n *\n * @memberOf platform.os\n * @returns {string} The OS string.\n */\n 'toString': function() { return 'null'; }\n };\n\n platform.parse = parse;\n platform.toString = toStringPlatform;\n\n if (platform.version) {\n description.unshift(version);\n }\n if (platform.name) {\n description.unshift(name);\n }\n if (os && name && !(os == String(os).split(' ')[0] && (os == name.split(' ')[0] || product))) {\n description.push(product ? '(' + os + ')' : 'on ' + os);\n }\n if (description.length) {\n platform.description = description.join(' ');\n }\n return platform;\n }\n\n /*--------------------------------------------------------------------------*/\n\n // Export platform.\n var platform = parse();\n\n // Some AMD build optimizers, like r.js, check for condition patterns like the following:\n if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\n // Expose platform on the global object to prevent errors when platform is\n // loaded by a script tag in the presence of an AMD loader.\n // See http://requirejs.org/docs/errors.html#mismatch for more details.\n root.platform = platform;\n\n // Define as an anonymous module so platform can be aliased through path mapping.\n define(function() {\n return platform;\n });\n }\n // Check for `exports` after `define` in case a build optimizer adds an `exports` object.\n else if (freeExports && freeModule) {\n // Export for CommonJS support.\n forOwn(platform, function(value, key) {\n freeExports[key] = value;\n });\n }\n else {\n // Export to the global object.\n root.platform = platform;\n }\n}.call(this));\n","module.exports = function(module) {\n\tif (!module.webpackPolyfill) {\n\t\tmodule.deprecate = function() {};\n\t\tmodule.paths = [];\n\t\t// module.parent = undefined by default\n\t\tif (!module.children) module.children = [];\n\t\tObject.defineProperty(module, \"loaded\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"id\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n","(function(root, factory) {\n 'use strict';\n // Universal Module Definition (UMD) to support AMD, CommonJS/Node.js, Rhino, and browsers.\n\n /* istanbul ignore next */\n if (typeof define === 'function' && define.amd) {\n define('error-stack-parser', ['stackframe'], factory);\n } else if (typeof exports === 'object') {\n module.exports = factory(require('stackframe'));\n } else {\n root.ErrorStackParser = factory(root.StackFrame);\n }\n}(this, function ErrorStackParser(StackFrame) {\n 'use strict';\n\n var FIREFOX_SAFARI_STACK_REGEXP = /(^|@)\\S+\\:\\d+/;\n var CHROME_IE_STACK_REGEXP = /^\\s*at .*(\\S+\\:\\d+|\\(native\\))/m;\n var SAFARI_NATIVE_CODE_REGEXP = /^(eval@)?(\\[native code\\])?$/;\n\n return {\n /**\n * Given an Error object, extract the most information from it.\n *\n * @param {Error} error object\n * @return {Array} of StackFrames\n */\n parse: function ErrorStackParser$$parse(error) {\n if (typeof error.stacktrace !== 'undefined' || typeof error['opera#sourceloc'] !== 'undefined') {\n return this.parseOpera(error);\n } else if (error.stack && error.stack.match(CHROME_IE_STACK_REGEXP)) {\n return this.parseV8OrIE(error);\n } else if (error.stack) {\n return this.parseFFOrSafari(error);\n } else {\n throw new Error('Cannot parse given Error object');\n }\n },\n\n // Separate line and column numbers from a string of the form: (URI:Line:Column)\n extractLocation: function ErrorStackParser$$extractLocation(urlLike) {\n // Fail-fast but return locations like \"(native)\"\n if (urlLike.indexOf(':') === -1) {\n return [urlLike];\n }\n\n var regExp = /(.+?)(?:\\:(\\d+))?(?:\\:(\\d+))?$/;\n var parts = regExp.exec(urlLike.replace(/[\\(\\)]/g, ''));\n return [parts[1], parts[2] || undefined, parts[3] || undefined];\n },\n\n parseV8OrIE: function ErrorStackParser$$parseV8OrIE(error) {\n var filtered = error.stack.split('\\n').filter(function(line) {\n return !!line.match(CHROME_IE_STACK_REGEXP);\n }, this);\n\n return filtered.map(function(line) {\n if (line.indexOf('(eval ') > -1) {\n // Throw away eval information until we implement stacktrace.js/stackframe#8\n line = line.replace(/eval code/g, 'eval').replace(/(\\(eval at [^\\()]*)|(\\)\\,.*$)/g, '');\n }\n var tokens = line.replace(/^\\s+/, '').replace(/\\(eval code/g, '(').split(/\\s+/).slice(1);\n var locationParts = this.extractLocation(tokens.pop());\n var functionName = tokens.join(' ') || undefined;\n var fileName = ['eval', ''].indexOf(locationParts[0]) > -1 ? undefined : locationParts[0];\n\n return new StackFrame({\n functionName: functionName,\n fileName: fileName,\n lineNumber: locationParts[1],\n columnNumber: locationParts[2],\n source: line\n });\n }, this);\n },\n\n parseFFOrSafari: function ErrorStackParser$$parseFFOrSafari(error) {\n var filtered = error.stack.split('\\n').filter(function(line) {\n return !line.match(SAFARI_NATIVE_CODE_REGEXP);\n }, this);\n\n return filtered.map(function(line) {\n // Throw away eval information until we implement stacktrace.js/stackframe#8\n if (line.indexOf(' > eval') > -1) {\n line = line.replace(/ line (\\d+)(?: > eval line \\d+)* > eval\\:\\d+\\:\\d+/g, ':$1');\n }\n\n if (line.indexOf('@') === -1 && line.indexOf(':') === -1) {\n // Safari eval frames only have function names and nothing else\n return new StackFrame({\n functionName: line\n });\n } else {\n var functionNameRegex = /((.*\".+\"[^@]*)?[^@]*)(?:@)/;\n var matches = line.match(functionNameRegex);\n var functionName = matches && matches[1] ? matches[1] : undefined;\n var locationParts = this.extractLocation(line.replace(functionNameRegex, ''));\n\n return new StackFrame({\n functionName: functionName,\n fileName: locationParts[0],\n lineNumber: locationParts[1],\n columnNumber: locationParts[2],\n source: line\n });\n }\n }, this);\n },\n\n parseOpera: function ErrorStackParser$$parseOpera(e) {\n if (!e.stacktrace || (e.message.indexOf('\\n') > -1 &&\n e.message.split('\\n').length > e.stacktrace.split('\\n').length)) {\n return this.parseOpera9(e);\n } else if (!e.stack) {\n return this.parseOpera10(e);\n } else {\n return this.parseOpera11(e);\n }\n },\n\n parseOpera9: function ErrorStackParser$$parseOpera9(e) {\n var lineRE = /Line (\\d+).*script (?:in )?(\\S+)/i;\n var lines = e.message.split('\\n');\n var result = [];\n\n for (var i = 2, len = lines.length; i < len; i += 2) {\n var match = lineRE.exec(lines[i]);\n if (match) {\n result.push(new StackFrame({\n fileName: match[2],\n lineNumber: match[1],\n source: lines[i]\n }));\n }\n }\n\n return result;\n },\n\n parseOpera10: function ErrorStackParser$$parseOpera10(e) {\n var lineRE = /Line (\\d+).*script (?:in )?(\\S+)(?:: In function (\\S+))?$/i;\n var lines = e.stacktrace.split('\\n');\n var result = [];\n\n for (var i = 0, len = lines.length; i < len; i += 2) {\n var match = lineRE.exec(lines[i]);\n if (match) {\n result.push(\n new StackFrame({\n functionName: match[3] || undefined,\n fileName: match[2],\n lineNumber: match[1],\n source: lines[i]\n })\n );\n }\n }\n\n return result;\n },\n\n // Opera 10.65+ Error.stack very similar to FF/Safari\n parseOpera11: function ErrorStackParser$$parseOpera11(error) {\n var filtered = error.stack.split('\\n').filter(function(line) {\n return !!line.match(FIREFOX_SAFARI_STACK_REGEXP) && !line.match(/^Error created at/);\n }, this);\n\n return filtered.map(function(line) {\n var tokens = line.split('@');\n var locationParts = this.extractLocation(tokens.pop());\n var functionCall = (tokens.shift() || '');\n var functionName = functionCall\n .replace(//, '$2')\n .replace(/\\([^\\)]*\\)/g, '') || undefined;\n var argsRaw;\n if (functionCall.match(/\\(([^\\)]*)\\)/)) {\n argsRaw = functionCall.replace(/^[^\\(]+\\(([^\\)]*)\\)$/, '$1');\n }\n var args = (argsRaw === undefined || argsRaw === '[arguments not available]') ?\n undefined : argsRaw.split(',');\n\n return new StackFrame({\n functionName: functionName,\n args: args,\n fileName: locationParts[0],\n lineNumber: locationParts[1],\n columnNumber: locationParts[2],\n source: line\n });\n }, this);\n }\n };\n}));\n","(function(root, factory) {\n 'use strict';\n // Universal Module Definition (UMD) to support AMD, CommonJS/Node.js, Rhino, and browsers.\n\n /* istanbul ignore next */\n if (typeof define === 'function' && define.amd) {\n define('stackframe', [], factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.StackFrame = factory();\n }\n}(this, function() {\n 'use strict';\n function _isNumber(n) {\n return !isNaN(parseFloat(n)) && isFinite(n);\n }\n\n function _capitalize(str) {\n return str.charAt(0).toUpperCase() + str.substring(1);\n }\n\n function _getter(p) {\n return function() {\n return this[p];\n };\n }\n\n var booleanProps = ['isConstructor', 'isEval', 'isNative', 'isToplevel'];\n var numericProps = ['columnNumber', 'lineNumber'];\n var stringProps = ['fileName', 'functionName', 'source'];\n var arrayProps = ['args'];\n\n var props = booleanProps.concat(numericProps, stringProps, arrayProps);\n\n function StackFrame(obj) {\n if (obj instanceof Object) {\n for (var i = 0; i < props.length; i++) {\n if (obj.hasOwnProperty(props[i]) && obj[props[i]] !== undefined) {\n this['set' + _capitalize(props[i])](obj[props[i]]);\n }\n }\n }\n }\n\n StackFrame.prototype = {\n getArgs: function() {\n return this.args;\n },\n setArgs: function(v) {\n if (Object.prototype.toString.call(v) !== '[object Array]') {\n throw new TypeError('Args must be an Array');\n }\n this.args = v;\n },\n\n getEvalOrigin: function() {\n return this.evalOrigin;\n },\n setEvalOrigin: function(v) {\n if (v instanceof StackFrame) {\n this.evalOrigin = v;\n } else if (v instanceof Object) {\n this.evalOrigin = new StackFrame(v);\n } else {\n throw new TypeError('Eval Origin must be an Object or StackFrame');\n }\n },\n\n toString: function() {\n var functionName = this.getFunctionName() || '{anonymous}';\n var args = '(' + (this.getArgs() || []).join(',') + ')';\n var fileName = this.getFileName() ? ('@' + this.getFileName()) : '';\n var lineNumber = _isNumber(this.getLineNumber()) ? (':' + this.getLineNumber()) : '';\n var columnNumber = _isNumber(this.getColumnNumber()) ? (':' + this.getColumnNumber()) : '';\n return functionName + args + fileName + lineNumber + columnNumber;\n }\n };\n\n for (var i = 0; i < booleanProps.length; i++) {\n StackFrame.prototype['get' + _capitalize(booleanProps[i])] = _getter(booleanProps[i]);\n StackFrame.prototype['set' + _capitalize(booleanProps[i])] = (function(p) {\n return function(v) {\n this[p] = Boolean(v);\n };\n })(booleanProps[i]);\n }\n\n for (var j = 0; j < numericProps.length; j++) {\n StackFrame.prototype['get' + _capitalize(numericProps[j])] = _getter(numericProps[j]);\n StackFrame.prototype['set' + _capitalize(numericProps[j])] = (function(p) {\n return function(v) {\n if (!_isNumber(v)) {\n throw new TypeError(p + ' must be a Number');\n }\n this[p] = Number(v);\n };\n })(numericProps[j]);\n }\n\n for (var k = 0; k < stringProps.length; k++) {\n StackFrame.prototype['get' + _capitalize(stringProps[k])] = _getter(stringProps[k]);\n StackFrame.prototype['set' + _capitalize(stringProps[k])] = (function(p) {\n return function(v) {\n this[p] = String(v);\n };\n })(stringProps[k]);\n }\n\n return StackFrame;\n}));\n","'use strict';\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar anObject = require('../internals/an-object');\nvar toObject = require('../internals/to-object');\nvar toLength = require('../internals/to-length');\nvar toInteger = require('../internals/to-integer');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar advanceStringIndex = require('../internals/advance-string-index');\nvar regExpExec = require('../internals/regexp-exec-abstract');\n\nvar max = Math.max;\nvar min = Math.min;\nvar floor = Math.floor;\nvar SUBSTITUTION_SYMBOLS = /\\$([$&'`]|\\d\\d?|<[^>]*>)/g;\nvar SUBSTITUTION_SYMBOLS_NO_NAMED = /\\$([$&'`]|\\d\\d?)/g;\n\nvar maybeToString = function (it) {\n return it === undefined ? it : String(it);\n};\n\n// @@replace logic\nfixRegExpWellKnownSymbolLogic('replace', 2, function (REPLACE, nativeReplace, maybeCallNative) {\n return [\n // `String.prototype.replace` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.replace\n function replace(searchValue, replaceValue) {\n var O = requireObjectCoercible(this);\n var replacer = searchValue == undefined ? undefined : searchValue[REPLACE];\n return replacer !== undefined\n ? replacer.call(searchValue, O, replaceValue)\n : nativeReplace.call(String(O), searchValue, replaceValue);\n },\n // `RegExp.prototype[@@replace]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace\n function (regexp, replaceValue) {\n var res = maybeCallNative(nativeReplace, regexp, this, replaceValue);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n\n var functionalReplace = typeof replaceValue === 'function';\n if (!functionalReplace) replaceValue = String(replaceValue);\n\n var global = rx.global;\n if (global) {\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n }\n var results = [];\n while (true) {\n var result = regExpExec(rx, S);\n if (result === null) break;\n\n results.push(result);\n if (!global) break;\n\n var matchStr = String(result[0]);\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n }\n\n var accumulatedResult = '';\n var nextSourcePosition = 0;\n for (var i = 0; i < results.length; i++) {\n result = results[i];\n\n var matched = String(result[0]);\n var position = max(min(toInteger(result.index), S.length), 0);\n var captures = [];\n // NOTE: This is equivalent to\n // captures = result.slice(1).map(maybeToString)\n // but for some reason `nativeSlice.call(result, 1, result.length)` (called in\n // the slice polyfill when slicing native arrays) \"doesn't work\" in safari 9 and\n // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.\n for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j]));\n var namedCaptures = result.groups;\n if (functionalReplace) {\n var replacerArgs = [matched].concat(captures, position, S);\n if (namedCaptures !== undefined) replacerArgs.push(namedCaptures);\n var replacement = String(replaceValue.apply(undefined, replacerArgs));\n } else {\n replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);\n }\n if (position >= nextSourcePosition) {\n accumulatedResult += S.slice(nextSourcePosition, position) + replacement;\n nextSourcePosition = position + matched.length;\n }\n }\n return accumulatedResult + S.slice(nextSourcePosition);\n }\n ];\n\n // https://tc39.github.io/ecma262/#sec-getsubstitution\n function getSubstitution(matched, str, position, captures, namedCaptures, replacement) {\n var tailPos = position + matched.length;\n var m = captures.length;\n var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;\n if (namedCaptures !== undefined) {\n namedCaptures = toObject(namedCaptures);\n symbols = SUBSTITUTION_SYMBOLS;\n }\n return nativeReplace.call(replacement, symbols, function (match, ch) {\n var capture;\n switch (ch.charAt(0)) {\n case '$': return '$';\n case '&': return matched;\n case '`': return str.slice(0, position);\n case \"'\": return str.slice(tailPos);\n case '<':\n capture = namedCaptures[ch.slice(1, -1)];\n break;\n default: // \\d\\d?\n var n = +ch;\n if (n === 0) return match;\n if (n > m) {\n var f = floor(n / 10);\n if (f === 0) return match;\n if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1);\n return match;\n }\n capture = captures[n - 1];\n }\n return capture === undefined ? '' : capture;\n });\n }\n});\n","'use strict';\nvar hide = require('../internals/hide');\nvar redefine = require('../internals/redefine');\nvar fails = require('../internals/fails');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar regexpExec = require('../internals/regexp-exec');\n\nvar SPECIES = wellKnownSymbol('species');\n\nvar REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {\n // #replace needs built-in support for named groups.\n // #match works fine because it just return the exec results, even if it has\n // a \"grops\" property.\n var re = /./;\n re.exec = function () {\n var result = [];\n result.groups = { a: '7' };\n return result;\n };\n return ''.replace(re, '$') !== '7';\n});\n\n// Chrome 51 has a buggy \"split\" implementation when RegExp#exec !== nativeExec\n// Weex JS has frozen built-in prototypes, so use try / catch wrapper\nvar SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = !fails(function () {\n var re = /(?:)/;\n var originalExec = re.exec;\n re.exec = function () { return originalExec.apply(this, arguments); };\n var result = 'ab'.split(re);\n return result.length !== 2 || result[0] !== 'a' || result[1] !== 'b';\n});\n\nmodule.exports = function (KEY, length, exec, sham) {\n var SYMBOL = wellKnownSymbol(KEY);\n\n var DELEGATES_TO_SYMBOL = !fails(function () {\n // String methods call symbol-named RegEp methods\n var O = {};\n O[SYMBOL] = function () { return 7; };\n return ''[KEY](O) != 7;\n });\n\n var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL && !fails(function () {\n // Symbol-named RegExp methods call .exec\n var execCalled = false;\n var re = /a/;\n re.exec = function () { execCalled = true; return null; };\n\n if (KEY === 'split') {\n // RegExp[@@split] doesn't call the regex's exec method, but first creates\n // a new one. We need to return the patched regex when creating the new one.\n re.constructor = {};\n re.constructor[SPECIES] = function () { return re; };\n }\n\n re[SYMBOL]('');\n return !execCalled;\n });\n\n if (\n !DELEGATES_TO_SYMBOL ||\n !DELEGATES_TO_EXEC ||\n (KEY === 'replace' && !REPLACE_SUPPORTS_NAMED_GROUPS) ||\n (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC)\n ) {\n var nativeRegExpMethod = /./[SYMBOL];\n var methods = exec(SYMBOL, ''[KEY], function (nativeMethod, regexp, str, arg2, forceStringMethod) {\n if (regexp.exec === regexpExec) {\n if (DELEGATES_TO_SYMBOL && !forceStringMethod) {\n // The native String method already delegates to @@method (this\n // polyfilled function), leasing to infinite recursion.\n // We avoid it by directly calling the native @@method method.\n return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) };\n }\n return { done: true, value: nativeMethod.call(str, regexp, arg2) };\n }\n return { done: false };\n });\n var stringMethod = methods[0];\n var regexMethod = methods[1];\n\n redefine(String.prototype, KEY, stringMethod);\n redefine(RegExp.prototype, SYMBOL, length == 2\n // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)\n // 21.2.5.11 RegExp.prototype[@@split](string, limit)\n ? function (string, arg) { return regexMethod.call(string, this, arg); }\n // 21.2.5.6 RegExp.prototype[@@match](string)\n // 21.2.5.9 RegExp.prototype[@@search](string)\n : function (string) { return regexMethod.call(string, this); }\n );\n if (sham) hide(RegExp.prototype[SYMBOL], 'sham', true);\n }\n};\n","'use strict';\nvar anObject = require('../internals/an-object');\n\n// `RegExp.prototype.flags` getter implementation\n// https://tc39.github.io/ecma262/#sec-get-regexp.prototype.flags\nmodule.exports = function () {\n var that = anObject(this);\n var result = '';\n if (that.global) result += 'g';\n if (that.ignoreCase) result += 'i';\n if (that.multiline) result += 'm';\n if (that.dotAll) result += 's';\n if (that.unicode) result += 'u';\n if (that.sticky) result += 'y';\n return result;\n};\n","'use strict';\nvar charAt = require('../internals/string-multibyte').charAt;\n\n// `AdvanceStringIndex` abstract operation\n// https://tc39.github.io/ecma262/#sec-advancestringindex\nmodule.exports = function (S, index, unicode) {\n return index + (unicode ? charAt(S, index).length : 1);\n};\n","var classof = require('./classof-raw');\nvar regexpExec = require('./regexp-exec');\n\n// `RegExpExec` abstract operation\n// https://tc39.github.io/ecma262/#sec-regexpexec\nmodule.exports = function (R, S) {\n var exec = R.exec;\n if (typeof exec === 'function') {\n var result = exec.call(R, S);\n if (typeof result !== 'object') {\n throw TypeError('RegExp exec method returned something other than an Object or null');\n }\n return result;\n }\n\n if (classof(R) !== 'RegExp') {\n throw TypeError('RegExp#exec called on incompatible receiver');\n }\n\n return regexpExec.call(R, S);\n};\n\n","/* eslint-env browser */\nmodule.exports = typeof self == 'object' ? self.FormData : window.FormData;\n","var engine = require('../src/store-engine')\n\nvar storages = require('../storages/all')\nvar plugins = [require('../plugins/json2')]\n\nmodule.exports = engine.createStore(storages, plugins)\n","var util = require('./util')\nvar slice = util.slice\nvar pluck = util.pluck\nvar each = util.each\nvar bind = util.bind\nvar create = util.create\nvar isList = util.isList\nvar isFunction = util.isFunction\nvar isObject = util.isObject\n\nmodule.exports = {\n\tcreateStore: createStore\n}\n\nvar storeAPI = {\n\tversion: '2.0.12',\n\tenabled: false,\n\t\n\t// get returns the value of the given key. If that value\n\t// is undefined, it returns optionalDefaultValue instead.\n\tget: function(key, optionalDefaultValue) {\n\t\tvar data = this.storage.read(this._namespacePrefix + key)\n\t\treturn this._deserialize(data, optionalDefaultValue)\n\t},\n\n\t// set will store the given value at key and returns value.\n\t// Calling set with value === undefined is equivalent to calling remove.\n\tset: function(key, value) {\n\t\tif (value === undefined) {\n\t\t\treturn this.remove(key)\n\t\t}\n\t\tthis.storage.write(this._namespacePrefix + key, this._serialize(value))\n\t\treturn value\n\t},\n\n\t// remove deletes the key and value stored at the given key.\n\tremove: function(key) {\n\t\tthis.storage.remove(this._namespacePrefix + key)\n\t},\n\n\t// each will call the given callback once for each key-value pair\n\t// in this store.\n\teach: function(callback) {\n\t\tvar self = this\n\t\tthis.storage.each(function(val, namespacedKey) {\n\t\t\tcallback.call(self, self._deserialize(val), (namespacedKey || '').replace(self._namespaceRegexp, ''))\n\t\t})\n\t},\n\n\t// clearAll will remove all the stored key-value pairs in this store.\n\tclearAll: function() {\n\t\tthis.storage.clearAll()\n\t},\n\n\t// additional functionality that can't live in plugins\n\t// ---------------------------------------------------\n\n\t// hasNamespace returns true if this store instance has the given namespace.\n\thasNamespace: function(namespace) {\n\t\treturn (this._namespacePrefix == '__storejs_'+namespace+'_')\n\t},\n\n\t// createStore creates a store.js instance with the first\n\t// functioning storage in the list of storage candidates,\n\t// and applies the the given mixins to the instance.\n\tcreateStore: function() {\n\t\treturn createStore.apply(this, arguments)\n\t},\n\t\n\taddPlugin: function(plugin) {\n\t\tthis._addPlugin(plugin)\n\t},\n\t\n\tnamespace: function(namespace) {\n\t\treturn createStore(this.storage, this.plugins, namespace)\n\t}\n}\n\nfunction _warn() {\n\tvar _console = (typeof console == 'undefined' ? null : console)\n\tif (!_console) { return }\n\tvar fn = (_console.warn ? _console.warn : _console.log)\n\tfn.apply(_console, arguments)\n}\n\nfunction createStore(storages, plugins, namespace) {\n\tif (!namespace) {\n\t\tnamespace = ''\n\t}\n\tif (storages && !isList(storages)) {\n\t\tstorages = [storages]\n\t}\n\tif (plugins && !isList(plugins)) {\n\t\tplugins = [plugins]\n\t}\n\n\tvar namespacePrefix = (namespace ? '__storejs_'+namespace+'_' : '')\n\tvar namespaceRegexp = (namespace ? new RegExp('^'+namespacePrefix) : null)\n\tvar legalNamespaces = /^[a-zA-Z0-9_\\-]*$/ // alpha-numeric + underscore and dash\n\tif (!legalNamespaces.test(namespace)) {\n\t\tthrow new Error('store.js namespaces can only have alphanumerics + underscores and dashes')\n\t}\n\t\n\tvar _privateStoreProps = {\n\t\t_namespacePrefix: namespacePrefix,\n\t\t_namespaceRegexp: namespaceRegexp,\n\n\t\t_testStorage: function(storage) {\n\t\t\ttry {\n\t\t\t\tvar testStr = '__storejs__test__'\n\t\t\t\tstorage.write(testStr, testStr)\n\t\t\t\tvar ok = (storage.read(testStr) === testStr)\n\t\t\t\tstorage.remove(testStr)\n\t\t\t\treturn ok\n\t\t\t} catch(e) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t},\n\n\t\t_assignPluginFnProp: function(pluginFnProp, propName) {\n\t\t\tvar oldFn = this[propName]\n\t\t\tthis[propName] = function pluginFn() {\n\t\t\t\tvar args = slice(arguments, 0)\n\t\t\t\tvar self = this\n\n\t\t\t\t// super_fn calls the old function which was overwritten by\n\t\t\t\t// this mixin.\n\t\t\t\tfunction super_fn() {\n\t\t\t\t\tif (!oldFn) { return }\n\t\t\t\t\teach(arguments, function(arg, i) {\n\t\t\t\t\t\targs[i] = arg\n\t\t\t\t\t})\n\t\t\t\t\treturn oldFn.apply(self, args)\n\t\t\t\t}\n\n\t\t\t\t// Give mixing function access to super_fn by prefixing all mixin function\n\t\t\t\t// arguments with super_fn.\n\t\t\t\tvar newFnArgs = [super_fn].concat(args)\n\n\t\t\t\treturn pluginFnProp.apply(self, newFnArgs)\n\t\t\t}\n\t\t},\n\n\t\t_serialize: function(obj) {\n\t\t\treturn JSON.stringify(obj)\n\t\t},\n\n\t\t_deserialize: function(strVal, defaultVal) {\n\t\t\tif (!strVal) { return defaultVal }\n\t\t\t// It is possible that a raw string value has been previously stored\n\t\t\t// in a storage without using store.js, meaning it will be a raw\n\t\t\t// string value instead of a JSON serialized string. By defaulting\n\t\t\t// to the raw string value in case of a JSON parse error, we allow\n\t\t\t// for past stored values to be forwards-compatible with store.js\n\t\t\tvar val = ''\n\t\t\ttry { val = JSON.parse(strVal) }\n\t\t\tcatch(e) { val = strVal }\n\n\t\t\treturn (val !== undefined ? val : defaultVal)\n\t\t},\n\t\t\n\t\t_addStorage: function(storage) {\n\t\t\tif (this.enabled) { return }\n\t\t\tif (this._testStorage(storage)) {\n\t\t\t\tthis.storage = storage\n\t\t\t\tthis.enabled = true\n\t\t\t}\n\t\t},\n\n\t\t_addPlugin: function(plugin) {\n\t\t\tvar self = this\n\n\t\t\t// If the plugin is an array, then add all plugins in the array.\n\t\t\t// This allows for a plugin to depend on other plugins.\n\t\t\tif (isList(plugin)) {\n\t\t\t\teach(plugin, function(plugin) {\n\t\t\t\t\tself._addPlugin(plugin)\n\t\t\t\t})\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Keep track of all plugins we've seen so far, so that we\n\t\t\t// don't add any of them twice.\n\t\t\tvar seenPlugin = pluck(this.plugins, function(seenPlugin) {\n\t\t\t\treturn (plugin === seenPlugin)\n\t\t\t})\n\t\t\tif (seenPlugin) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.plugins.push(plugin)\n\n\t\t\t// Check that the plugin is properly formed\n\t\t\tif (!isFunction(plugin)) {\n\t\t\t\tthrow new Error('Plugins must be function values that return objects')\n\t\t\t}\n\n\t\t\tvar pluginProperties = plugin.call(this)\n\t\t\tif (!isObject(pluginProperties)) {\n\t\t\t\tthrow new Error('Plugins must return an object of function properties')\n\t\t\t}\n\n\t\t\t// Add the plugin function properties to this store instance.\n\t\t\teach(pluginProperties, function(pluginFnProp, propName) {\n\t\t\t\tif (!isFunction(pluginFnProp)) {\n\t\t\t\t\tthrow new Error('Bad plugin property: '+propName+' from plugin '+plugin.name+'. Plugins should only return functions.')\n\t\t\t\t}\n\t\t\t\tself._assignPluginFnProp(pluginFnProp, propName)\n\t\t\t})\n\t\t},\n\t\t\n\t\t// Put deprecated properties in the private API, so as to not expose it to accidential\n\t\t// discovery through inspection of the store object.\n\t\t\n\t\t// Deprecated: addStorage\n\t\taddStorage: function(storage) {\n\t\t\t_warn('store.addStorage(storage) is deprecated. Use createStore([storages])')\n\t\t\tthis._addStorage(storage)\n\t\t}\n\t}\n\n\tvar store = create(_privateStoreProps, storeAPI, {\n\t\tplugins: []\n\t})\n\tstore.raw = {}\n\teach(store, function(prop, propName) {\n\t\tif (isFunction(prop)) {\n\t\t\tstore.raw[propName] = bind(store, prop)\t\t\t\n\t\t}\n\t})\n\teach(storages, function(storage) {\n\t\tstore._addStorage(storage)\n\t})\n\teach(plugins, function(plugin) {\n\t\tstore._addPlugin(plugin)\n\t})\n\treturn store\n}\n","module.exports = [\n\t// Listed in order of usage preference\n\trequire('./localStorage'),\n\trequire('./oldFF-globalStorage'),\n\trequire('./oldIE-userDataStorage'),\n\trequire('./cookieStorage'),\n\trequire('./sessionStorage'),\n\trequire('./memoryStorage')\n]\n","var util = require('../src/util')\nvar Global = util.Global\n\nmodule.exports = {\n\tname: 'localStorage',\n\tread: read,\n\twrite: write,\n\teach: each,\n\tremove: remove,\n\tclearAll: clearAll,\n}\n\nfunction localStorage() {\n\treturn Global.localStorage\n}\n\nfunction read(key) {\n\treturn localStorage().getItem(key)\n}\n\nfunction write(key, data) {\n\treturn localStorage().setItem(key, data)\n}\n\nfunction each(fn) {\n\tfor (var i = localStorage().length - 1; i >= 0; i--) {\n\t\tvar key = localStorage().key(i)\n\t\tfn(read(key), key)\n\t}\n}\n\nfunction remove(key) {\n\treturn localStorage().removeItem(key)\n}\n\nfunction clearAll() {\n\treturn localStorage().clear()\n}\n","// oldFF-globalStorage provides storage for Firefox\n// versions 6 and 7, where no localStorage, etc\n// is available.\n\nvar util = require('../src/util')\nvar Global = util.Global\n\nmodule.exports = {\n\tname: 'oldFF-globalStorage',\n\tread: read,\n\twrite: write,\n\teach: each,\n\tremove: remove,\n\tclearAll: clearAll,\n}\n\nvar globalStorage = Global.globalStorage\n\nfunction read(key) {\n\treturn globalStorage[key]\n}\n\nfunction write(key, data) {\n\tglobalStorage[key] = data\n}\n\nfunction each(fn) {\n\tfor (var i = globalStorage.length - 1; i >= 0; i--) {\n\t\tvar key = globalStorage.key(i)\n\t\tfn(globalStorage[key], key)\n\t}\n}\n\nfunction remove(key) {\n\treturn globalStorage.removeItem(key)\n}\n\nfunction clearAll() {\n\teach(function(key, _) {\n\t\tdelete globalStorage[key]\n\t})\n}\n","// oldIE-userDataStorage provides storage for Internet Explorer\n// versions 6 and 7, where no localStorage, sessionStorage, etc\n// is available.\n\nvar util = require('../src/util')\nvar Global = util.Global\n\nmodule.exports = {\n\tname: 'oldIE-userDataStorage',\n\twrite: write,\n\tread: read,\n\teach: each,\n\tremove: remove,\n\tclearAll: clearAll,\n}\n\nvar storageName = 'storejs'\nvar doc = Global.document\nvar _withStorageEl = _makeIEStorageElFunction()\nvar disable = (Global.navigator ? Global.navigator.userAgent : '').match(/ (MSIE 8|MSIE 9|MSIE 10)\\./) // MSIE 9.x, MSIE 10.x\n\nfunction write(unfixedKey, data) {\n\tif (disable) { return }\n\tvar fixedKey = fixKey(unfixedKey)\n\t_withStorageEl(function(storageEl) {\n\t\tstorageEl.setAttribute(fixedKey, data)\n\t\tstorageEl.save(storageName)\n\t})\n}\n\nfunction read(unfixedKey) {\n\tif (disable) { return }\n\tvar fixedKey = fixKey(unfixedKey)\n\tvar res = null\n\t_withStorageEl(function(storageEl) {\n\t\tres = storageEl.getAttribute(fixedKey)\n\t})\n\treturn res\n}\n\nfunction each(callback) {\n\t_withStorageEl(function(storageEl) {\n\t\tvar attributes = storageEl.XMLDocument.documentElement.attributes\n\t\tfor (var i=attributes.length-1; i>=0; i--) {\n\t\t\tvar attr = attributes[i]\n\t\t\tcallback(storageEl.getAttribute(attr.name), attr.name)\n\t\t}\n\t})\n}\n\nfunction remove(unfixedKey) {\n\tvar fixedKey = fixKey(unfixedKey)\n\t_withStorageEl(function(storageEl) {\n\t\tstorageEl.removeAttribute(fixedKey)\n\t\tstorageEl.save(storageName)\n\t})\n}\n\nfunction clearAll() {\n\t_withStorageEl(function(storageEl) {\n\t\tvar attributes = storageEl.XMLDocument.documentElement.attributes\n\t\tstorageEl.load(storageName)\n\t\tfor (var i=attributes.length-1; i>=0; i--) {\n\t\t\tstorageEl.removeAttribute(attributes[i].name)\n\t\t}\n\t\tstorageEl.save(storageName)\n\t})\n}\n\n// Helpers\n//////////\n\n// In IE7, keys cannot start with a digit or contain certain chars.\n// See https://github.com/marcuswestin/store.js/issues/40\n// See https://github.com/marcuswestin/store.js/issues/83\nvar forbiddenCharsRegex = new RegExp(\"[!\\\"#$%&'()*+,/\\\\\\\\:;<=>?@[\\\\]^`{|}~]\", \"g\")\nfunction fixKey(key) {\n\treturn key.replace(/^\\d/, '___$&').replace(forbiddenCharsRegex, '___')\n}\n\nfunction _makeIEStorageElFunction() {\n\tif (!doc || !doc.documentElement || !doc.documentElement.addBehavior) {\n\t\treturn null\n\t}\n\tvar scriptTag = 'script',\n\t\tstorageOwner,\n\t\tstorageContainer,\n\t\tstorageEl\n\n\t// Since #userData storage applies only to specific paths, we need to\n\t// somehow link our data to a specific path. We choose /favicon.ico\n\t// as a pretty safe option, since all browsers already make a request to\n\t// this URL anyway and being a 404 will not hurt us here. We wrap an\n\t// iframe pointing to the favicon in an ActiveXObject(htmlfile) object\n\t// (see: http://msdn.microsoft.com/en-us/library/aa752574(v=VS.85).aspx)\n\t// since the iframe access rules appear to allow direct access and\n\t// manipulation of the document element, even for a 404 page. This\n\t// document can be used instead of the current document (which would\n\t// have been limited to the current path) to perform #userData storage.\n\ttry {\n\t\t/* global ActiveXObject */\n\t\tstorageContainer = new ActiveXObject('htmlfile')\n\t\tstorageContainer.open()\n\t\tstorageContainer.write('<'+scriptTag+'>document.w=window')\n\t\tstorageContainer.close()\n\t\tstorageOwner = storageContainer.w.frames[0].document\n\t\tstorageEl = storageOwner.createElement('div')\n\t} catch(e) {\n\t\t// somehow ActiveXObject instantiation failed (perhaps some special\n\t\t// security settings or otherwse), fall back to per-path storage\n\t\tstorageEl = doc.createElement('div')\n\t\tstorageOwner = doc.body\n\t}\n\n\treturn function(storeFunction) {\n\t\tvar args = [].slice.call(arguments, 0)\n\t\targs.unshift(storageEl)\n\t\t// See http://msdn.microsoft.com/en-us/library/ms531081(v=VS.85).aspx\n\t\t// and http://msdn.microsoft.com/en-us/library/ms531424(v=VS.85).aspx\n\t\tstorageOwner.appendChild(storageEl)\n\t\tstorageEl.addBehavior('#default#userData')\n\t\tstorageEl.load(storageName)\n\t\tstoreFunction.apply(this, args)\n\t\tstorageOwner.removeChild(storageEl)\n\t\treturn\n\t}\n}\n","// cookieStorage is useful Safari private browser mode, where localStorage\n// doesn't work but cookies do. This implementation is adopted from\n// https://developer.mozilla.org/en-US/docs/Web/API/Storage/LocalStorage\n\nvar util = require('../src/util')\nvar Global = util.Global\nvar trim = util.trim\n\nmodule.exports = {\n\tname: 'cookieStorage',\n\tread: read,\n\twrite: write,\n\teach: each,\n\tremove: remove,\n\tclearAll: clearAll,\n}\n\nvar doc = Global.document\n\nfunction read(key) {\n\tif (!key || !_has(key)) { return null }\n\tvar regexpStr = \"(?:^|.*;\\\\s*)\" +\n\t\tescape(key).replace(/[\\-\\.\\+\\*]/g, \"\\\\$&\") +\n\t\t\"\\\\s*\\\\=\\\\s*((?:[^;](?!;))*[^;]?).*\"\n\treturn unescape(doc.cookie.replace(new RegExp(regexpStr), \"$1\"))\n}\n\nfunction each(callback) {\n\tvar cookies = doc.cookie.split(/; ?/g)\n\tfor (var i = cookies.length - 1; i >= 0; i--) {\n\t\tif (!trim(cookies[i])) {\n\t\t\tcontinue\n\t\t}\n\t\tvar kvp = cookies[i].split('=')\n\t\tvar key = unescape(kvp[0])\n\t\tvar val = unescape(kvp[1])\n\t\tcallback(val, key)\n\t}\n}\n\nfunction write(key, data) {\n\tif(!key) { return }\n\tdoc.cookie = escape(key) + \"=\" + escape(data) + \"; expires=Tue, 19 Jan 2038 03:14:07 GMT; path=/\"\n}\n\nfunction remove(key) {\n\tif (!key || !_has(key)) {\n\t\treturn\n\t}\n\tdoc.cookie = escape(key) + \"=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/\"\n}\n\nfunction clearAll() {\n\teach(function(_, key) {\n\t\tremove(key)\n\t})\n}\n\nfunction _has(key) {\n\treturn (new RegExp(\"(?:^|;\\\\s*)\" + escape(key).replace(/[\\-\\.\\+\\*]/g, \"\\\\$&\") + \"\\\\s*\\\\=\")).test(doc.cookie)\n}\n","var util = require('../src/util')\nvar Global = util.Global\n\nmodule.exports = {\n\tname: 'sessionStorage',\n\tread: read,\n\twrite: write,\n\teach: each,\n\tremove: remove,\n\tclearAll: clearAll\n}\n\nfunction sessionStorage() {\n\treturn Global.sessionStorage\n}\n\nfunction read(key) {\n\treturn sessionStorage().getItem(key)\n}\n\nfunction write(key, data) {\n\treturn sessionStorage().setItem(key, data)\n}\n\nfunction each(fn) {\n\tfor (var i = sessionStorage().length - 1; i >= 0; i--) {\n\t\tvar key = sessionStorage().key(i)\n\t\tfn(read(key), key)\n\t}\n}\n\nfunction remove(key) {\n\treturn sessionStorage().removeItem(key)\n}\n\nfunction clearAll() {\n\treturn sessionStorage().clear()\n}\n","// memoryStorage is a useful last fallback to ensure that the store\n// is functions (meaning store.get(), store.set(), etc will all function).\n// However, stored values will not persist when the browser navigates to\n// a new page or reloads the current page.\n\nmodule.exports = {\n\tname: 'memoryStorage',\n\tread: read,\n\twrite: write,\n\teach: each,\n\tremove: remove,\n\tclearAll: clearAll,\n}\n\nvar memoryStorage = {}\n\nfunction read(key) {\n\treturn memoryStorage[key]\n}\n\nfunction write(key, data) {\n\tmemoryStorage[key] = data\n}\n\nfunction each(callback) {\n\tfor (var key in memoryStorage) {\n\t\tif (memoryStorage.hasOwnProperty(key)) {\n\t\t\tcallback(memoryStorage[key], key)\n\t\t}\n\t}\n}\n\nfunction remove(key) {\n\tdelete memoryStorage[key]\n}\n\nfunction clearAll(key) {\n\tmemoryStorage = {}\n}\n","module.exports = json2Plugin\n\nfunction json2Plugin() {\n\trequire('./lib/json2')\n\treturn {}\n}\n","/* eslint-disable */\n\n// json2.js\n// 2016-10-28\n// Public Domain.\n// NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.\n// See http://www.JSON.org/js.html\n// This code should be minified before deployment.\n// See http://javascript.crockford.com/jsmin.html\n\n// USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO\n// NOT CONTROL.\n\n// This file creates a global JSON object containing two methods: stringify\n// and parse. This file provides the ES5 JSON capability to ES3 systems.\n// If a project might run on IE8 or earlier, then this file should be included.\n// This file does nothing on ES5 systems.\n\n// JSON.stringify(value, replacer, space)\n// value any JavaScript value, usually an object or array.\n// replacer an optional parameter that determines how object\n// values are stringified for objects. It can be a\n// function or an array of strings.\n// space an optional parameter that specifies the indentation\n// of nested structures. If it is omitted, the text will\n// be packed without extra whitespace. If it is a number,\n// it will specify the number of spaces to indent at each\n// level. If it is a string (such as \"\\t\" or \" \"),\n// it contains the characters used to indent at each level.\n// This method produces a JSON text from a JavaScript value.\n// When an object value is found, if the object contains a toJSON\n// method, its toJSON method will be called and the result will be\n// stringified. A toJSON method does not serialize: it returns the\n// value represented by the name/value pair that should be serialized,\n// or undefined if nothing should be serialized. The toJSON method\n// will be passed the key associated with the value, and this will be\n// bound to the value.\n\n// For example, this would serialize Dates as ISO strings.\n\n// Date.prototype.toJSON = function (key) {\n// function f(n) {\n// // Format integers to have at least two digits.\n// return (n < 10)\n// ? \"0\" + n\n// : n;\n// }\n// return this.getUTCFullYear() + \"-\" +\n// f(this.getUTCMonth() + 1) + \"-\" +\n// f(this.getUTCDate()) + \"T\" +\n// f(this.getUTCHours()) + \":\" +\n// f(this.getUTCMinutes()) + \":\" +\n// f(this.getUTCSeconds()) + \"Z\";\n// };\n\n// You can provide an optional replacer method. It will be passed the\n// key and value of each member, with this bound to the containing\n// object. The value that is returned from your method will be\n// serialized. If your method returns undefined, then the member will\n// be excluded from the serialization.\n\n// If the replacer parameter is an array of strings, then it will be\n// used to select the members to be serialized. It filters the results\n// such that only members with keys listed in the replacer array are\n// stringified.\n\n// Values that do not have JSON representations, such as undefined or\n// functions, will not be serialized. Such values in objects will be\n// dropped; in arrays they will be replaced with null. You can use\n// a replacer function to replace those with JSON values.\n\n// JSON.stringify(undefined) returns undefined.\n\n// The optional space parameter produces a stringification of the\n// value that is filled with line breaks and indentation to make it\n// easier to read.\n\n// If the space parameter is a non-empty string, then that string will\n// be used for indentation. If the space parameter is a number, then\n// the indentation will be that many spaces.\n\n// Example:\n\n// text = JSON.stringify([\"e\", {pluribus: \"unum\"}]);\n// // text is '[\"e\",{\"pluribus\":\"unum\"}]'\n\n// text = JSON.stringify([\"e\", {pluribus: \"unum\"}], null, \"\\t\");\n// // text is '[\\n\\t\"e\",\\n\\t{\\n\\t\\t\"pluribus\": \"unum\"\\n\\t}\\n]'\n\n// text = JSON.stringify([new Date()], function (key, value) {\n// return this[key] instanceof Date\n// ? \"Date(\" + this[key] + \")\"\n// : value;\n// });\n// // text is '[\"Date(---current time---)\"]'\n\n// JSON.parse(text, reviver)\n// This method parses a JSON text to produce an object or array.\n// It can throw a SyntaxError exception.\n\n// The optional reviver parameter is a function that can filter and\n// transform the results. It receives each of the keys and values,\n// and its return value is used instead of the original value.\n// If it returns what it received, then the structure is not modified.\n// If it returns undefined then the member is deleted.\n\n// Example:\n\n// // Parse the text. Values that look like ISO date strings will\n// // be converted to Date objects.\n\n// myData = JSON.parse(text, function (key, value) {\n// var a;\n// if (typeof value === \"string\") {\n// a =\n// /^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2}(?:\\.\\d*)?)Z$/.exec(value);\n// if (a) {\n// return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],\n// +a[5], +a[6]));\n// }\n// }\n// return value;\n// });\n\n// myData = JSON.parse('[\"Date(09/09/2001)\"]', function (key, value) {\n// var d;\n// if (typeof value === \"string\" &&\n// value.slice(0, 5) === \"Date(\" &&\n// value.slice(-1) === \")\") {\n// d = new Date(value.slice(5, -1));\n// if (d) {\n// return d;\n// }\n// }\n// return value;\n// });\n\n// This is a reference implementation. You are free to copy, modify, or\n// redistribute.\n\n/*jslint\n eval, for, this\n*/\n\n/*property\n JSON, apply, call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,\n getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,\n lastIndex, length, parse, prototype, push, replace, slice, stringify,\n test, toJSON, toString, valueOf\n*/\n\n\n// Create a JSON object only if one does not already exist. We create the\n// methods in a closure to avoid creating global variables.\n\nif (typeof JSON !== \"object\") {\n JSON = {};\n}\n\n(function () {\n \"use strict\";\n\n var rx_one = /^[\\],:{}\\s]*$/;\n var rx_two = /\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g;\n var rx_three = /\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g;\n var rx_four = /(?:^|:|,)(?:\\s*\\[)+/g;\n var rx_escapable = /[\\\\\"\\u0000-\\u001f\\u007f-\\u009f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g;\n var rx_dangerous = /[\\u0000\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g;\n\n function f(n) {\n // Format integers to have at least two digits.\n return n < 10\n ? \"0\" + n\n : n;\n }\n\n function this_value() {\n return this.valueOf();\n }\n\n if (typeof Date.prototype.toJSON !== \"function\") {\n\n Date.prototype.toJSON = function () {\n\n return isFinite(this.valueOf())\n ? this.getUTCFullYear() + \"-\" +\n f(this.getUTCMonth() + 1) + \"-\" +\n f(this.getUTCDate()) + \"T\" +\n f(this.getUTCHours()) + \":\" +\n f(this.getUTCMinutes()) + \":\" +\n f(this.getUTCSeconds()) + \"Z\"\n : null;\n };\n\n Boolean.prototype.toJSON = this_value;\n Number.prototype.toJSON = this_value;\n String.prototype.toJSON = this_value;\n }\n\n var gap;\n var indent;\n var meta;\n var rep;\n\n\n function quote(string) {\n\n// If the string contains no control characters, no quote characters, and no\n// backslash characters, then we can safely slap some quotes around it.\n// Otherwise we must also replace the offending characters with safe escape\n// sequences.\n\n rx_escapable.lastIndex = 0;\n return rx_escapable.test(string)\n ? \"\\\"\" + string.replace(rx_escapable, function (a) {\n var c = meta[a];\n return typeof c === \"string\"\n ? c\n : \"\\\\u\" + (\"0000\" + a.charCodeAt(0).toString(16)).slice(-4);\n }) + \"\\\"\"\n : \"\\\"\" + string + \"\\\"\";\n }\n\n\n function str(key, holder) {\n\n// Produce a string from holder[key].\n\n var i; // The loop counter.\n var k; // The member key.\n var v; // The member value.\n var length;\n var mind = gap;\n var partial;\n var value = holder[key];\n\n// If the value has a toJSON method, call it to obtain a replacement value.\n\n if (value && typeof value === \"object\" &&\n typeof value.toJSON === \"function\") {\n value = value.toJSON(key);\n }\n\n// If we were called with a replacer function, then call the replacer to\n// obtain a replacement value.\n\n if (typeof rep === \"function\") {\n value = rep.call(holder, key, value);\n }\n\n// What happens next depends on the value's type.\n\n switch (typeof value) {\n case \"string\":\n return quote(value);\n\n case \"number\":\n\n// JSON numbers must be finite. Encode non-finite numbers as null.\n\n return isFinite(value)\n ? String(value)\n : \"null\";\n\n case \"boolean\":\n case \"null\":\n\n// If the value is a boolean or null, convert it to a string. Note:\n// typeof null does not produce \"null\". The case is included here in\n// the remote chance that this gets fixed someday.\n\n return String(value);\n\n// If the type is \"object\", we might be dealing with an object or an array or\n// null.\n\n case \"object\":\n\n// Due to a specification blunder in ECMAScript, typeof null is \"object\",\n// so watch out for that case.\n\n if (!value) {\n return \"null\";\n }\n\n// Make an array to hold the partial results of stringifying this object value.\n\n gap += indent;\n partial = [];\n\n// Is the value an array?\n\n if (Object.prototype.toString.apply(value) === \"[object Array]\") {\n\n// The value is an array. Stringify every element. Use null as a placeholder\n// for non-JSON values.\n\n length = value.length;\n for (i = 0; i < length; i += 1) {\n partial[i] = str(i, value) || \"null\";\n }\n\n// Join all of the elements together, separated with commas, and wrap them in\n// brackets.\n\n v = partial.length === 0\n ? \"[]\"\n : gap\n ? \"[\\n\" + gap + partial.join(\",\\n\" + gap) + \"\\n\" + mind + \"]\"\n : \"[\" + partial.join(\",\") + \"]\";\n gap = mind;\n return v;\n }\n\n// If the replacer is an array, use it to select the members to be stringified.\n\n if (rep && typeof rep === \"object\") {\n length = rep.length;\n for (i = 0; i < length; i += 1) {\n if (typeof rep[i] === \"string\") {\n k = rep[i];\n v = str(k, value);\n if (v) {\n partial.push(quote(k) + (\n gap\n ? \": \"\n : \":\"\n ) + v);\n }\n }\n }\n } else {\n\n// Otherwise, iterate through all of the keys in the object.\n\n for (k in value) {\n if (Object.prototype.hasOwnProperty.call(value, k)) {\n v = str(k, value);\n if (v) {\n partial.push(quote(k) + (\n gap\n ? \": \"\n : \":\"\n ) + v);\n }\n }\n }\n }\n\n// Join all of the member texts together, separated with commas,\n// and wrap them in braces.\n\n v = partial.length === 0\n ? \"{}\"\n : gap\n ? \"{\\n\" + gap + partial.join(\",\\n\" + gap) + \"\\n\" + mind + \"}\"\n : \"{\" + partial.join(\",\") + \"}\";\n gap = mind;\n return v;\n }\n }\n\n// If the JSON object does not yet have a stringify method, give it one.\n\n if (typeof JSON.stringify !== \"function\") {\n meta = { // table of character substitutions\n \"\\b\": \"\\\\b\",\n \"\\t\": \"\\\\t\",\n \"\\n\": \"\\\\n\",\n \"\\f\": \"\\\\f\",\n \"\\r\": \"\\\\r\",\n \"\\\"\": \"\\\\\\\"\",\n \"\\\\\": \"\\\\\\\\\"\n };\n JSON.stringify = function (value, replacer, space) {\n\n// The stringify method takes a value and an optional replacer, and an optional\n// space parameter, and returns a JSON text. The replacer can be a function\n// that can replace values, or an array of strings that will select the keys.\n// A default replacer method can be provided. Use of the space parameter can\n// produce text that is more easily readable.\n\n var i;\n gap = \"\";\n indent = \"\";\n\n// If the space parameter is a number, make an indent string containing that\n// many spaces.\n\n if (typeof space === \"number\") {\n for (i = 0; i < space; i += 1) {\n indent += \" \";\n }\n\n// If the space parameter is a string, it will be used as the indent string.\n\n } else if (typeof space === \"string\") {\n indent = space;\n }\n\n// If there is a replacer, it must be a function or an array.\n// Otherwise, throw an error.\n\n rep = replacer;\n if (replacer && typeof replacer !== \"function\" &&\n (typeof replacer !== \"object\" ||\n typeof replacer.length !== \"number\")) {\n throw new Error(\"JSON.stringify\");\n }\n\n// Make a fake root object containing our value under the key of \"\".\n// Return the result of stringifying the value.\n\n return str(\"\", {\"\": value});\n };\n }\n\n\n// If the JSON object does not yet have a parse method, give it one.\n\n if (typeof JSON.parse !== \"function\") {\n JSON.parse = function (text, reviver) {\n\n// The parse method takes a text and an optional reviver function, and returns\n// a JavaScript value if the text is a valid JSON text.\n\n var j;\n\n function walk(holder, key) {\n\n// The walk method is used to recursively walk the resulting structure so\n// that modifications can be made.\n\n var k;\n var v;\n var value = holder[key];\n if (value && typeof value === \"object\") {\n for (k in value) {\n if (Object.prototype.hasOwnProperty.call(value, k)) {\n v = walk(value, k);\n if (v !== undefined) {\n value[k] = v;\n } else {\n delete value[k];\n }\n }\n }\n }\n return reviver.call(holder, key, value);\n }\n\n\n// Parsing happens in four stages. In the first stage, we replace certain\n// Unicode characters with escape sequences. JavaScript handles many characters\n// incorrectly, either silently deleting them, or treating them as line endings.\n\n text = String(text);\n rx_dangerous.lastIndex = 0;\n if (rx_dangerous.test(text)) {\n text = text.replace(rx_dangerous, function (a) {\n return \"\\\\u\" +\n (\"0000\" + a.charCodeAt(0).toString(16)).slice(-4);\n });\n }\n\n// In the second stage, we run the text against regular expressions that look\n// for non-JSON patterns. We are especially concerned with \"()\" and \"new\"\n// because they can cause invocation, and \"=\" because it can cause mutation.\n// But just to be safe, we want to reject all unexpected forms.\n\n// We split the second stage into 4 regexp operations in order to work around\n// crippling inefficiencies in IE's and Safari's regexp engines. First we\n// replace the JSON backslash pairs with \"@\" (a non-JSON character). Second, we\n// replace all simple value tokens with \"]\" characters. Third, we delete all\n// open brackets that follow a colon or comma or that begin the text. Finally,\n// we look to see that the remaining characters are only whitespace or \"]\" or\n// \",\" or \":\" or \"{\" or \"}\". If that is so, then the text is safe for eval.\n\n if (\n rx_one.test(\n text\n .replace(rx_two, \"@\")\n .replace(rx_three, \"]\")\n .replace(rx_four, \"\")\n )\n ) {\n\n// In the third stage we use the eval function to compile the text into a\n// JavaScript structure. The \"{\" operator is subject to a syntactic ambiguity\n// in JavaScript: it can begin a block or an object literal. We wrap the text\n// in parens to eliminate the ambiguity.\n\n j = eval(\"(\" + text + \")\");\n\n// In the optional fourth stage, we recursively walk the new structure, passing\n// each name/value pair to a reviver function for possible transformation.\n\n return (typeof reviver === \"function\")\n ? walk({\"\": j}, \"\")\n : j;\n }\n\n// If the text is not JSON parseable, then a SyntaxError is thrown.\n\n throw new SyntaxError(\"JSON.parse\");\n };\n }\n}());","module.exports = require('./lib/axios');","'use strict';\n\nvar utils = require('./utils');\nvar bind = require('./helpers/bind');\nvar Axios = require('./core/Axios');\nvar defaults = require('./defaults');\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n * @return {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n var context = new Axios(defaultConfig);\n var instance = bind(Axios.prototype.request, context);\n\n // Copy axios.prototype to instance\n utils.extend(instance, Axios.prototype, context);\n\n // Copy context to instance\n utils.extend(instance, context);\n\n return instance;\n}\n\n// Create the default instance to be exported\nvar axios = createInstance(defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios;\n\n// Factory for creating new instances\naxios.create = function create(instanceConfig) {\n return createInstance(utils.merge(defaults, instanceConfig));\n};\n\n// Expose Cancel & CancelToken\naxios.Cancel = require('./cancel/Cancel');\naxios.CancelToken = require('./cancel/CancelToken');\naxios.isCancel = require('./cancel/isCancel');\n\n// Expose all/spread\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\naxios.spread = require('./helpers/spread');\n\nmodule.exports = axios;\n\n// Allow use of default import syntax in TypeScript\nmodule.exports.default = axios;\n","/*!\n * Determine if an object is a Buffer\n *\n * @author Feross Aboukhadijeh \n * @license MIT\n */\n\nmodule.exports = function isBuffer (obj) {\n return obj != null && obj.constructor != null &&\n typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)\n}\n","'use strict';\n\nvar defaults = require('./../defaults');\nvar utils = require('./../utils');\nvar InterceptorManager = require('./InterceptorManager');\nvar dispatchRequest = require('./dispatchRequest');\n\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n */\nfunction Axios(instanceConfig) {\n this.defaults = instanceConfig;\n this.interceptors = {\n request: new InterceptorManager(),\n response: new InterceptorManager()\n };\n}\n\n/**\n * Dispatch a request\n *\n * @param {Object} config The config specific for this request (merged with this.defaults)\n */\nAxios.prototype.request = function request(config) {\n /*eslint no-param-reassign:0*/\n // Allow for axios('example/url'[, config]) a la fetch API\n if (typeof config === 'string') {\n config = utils.merge({\n url: arguments[0]\n }, arguments[1]);\n }\n\n config = utils.merge(defaults, {method: 'get'}, this.defaults, config);\n config.method = config.method.toLowerCase();\n\n // Hook up interceptors middleware\n var chain = [dispatchRequest, undefined];\n var promise = Promise.resolve(config);\n\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n chain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n chain.push(interceptor.fulfilled, interceptor.rejected);\n });\n\n while (chain.length) {\n promise = promise.then(chain.shift(), chain.shift());\n }\n\n return promise;\n};\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, config) {\n return this.request(utils.merge(config || {}, {\n method: method,\n url: url\n }));\n };\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, data, config) {\n return this.request(utils.merge(config || {}, {\n method: method,\n url: url,\n data: data\n }));\n };\n});\n\nmodule.exports = Axios;\n","'use strict';\n\nvar utils = require('../utils');\n\nmodule.exports = function normalizeHeaderName(headers, normalizedName) {\n utils.forEach(headers, function processHeader(value, name) {\n if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) {\n headers[normalizedName] = value;\n delete headers[name];\n }\n });\n};\n","'use strict';\n\nvar createError = require('./createError');\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n */\nmodule.exports = function settle(resolve, reject, response) {\n var validateStatus = response.config.validateStatus;\n // Note: status is not exposed by XDomainRequest\n if (!response.status || !validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(createError(\n 'Request failed with status code ' + response.status,\n response.config,\n null,\n response.request,\n response\n ));\n }\n};\n","'use strict';\n\n/**\n * Update an Error with the specified config, error code, and response.\n *\n * @param {Error} error The error to update.\n * @param {Object} config The config.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n * @returns {Error} The error.\n */\nmodule.exports = function enhanceError(error, config, code, request, response) {\n error.config = config;\n if (code) {\n error.code = code;\n }\n error.request = request;\n error.response = response;\n return error;\n};\n","'use strict';\n\nvar utils = require('./../utils');\n\nfunction encode(val) {\n return encodeURIComponent(val).\n replace(/%40/gi, '@').\n replace(/%3A/gi, ':').\n replace(/%24/g, '$').\n replace(/%2C/gi, ',').\n replace(/%20/g, '+').\n replace(/%5B/gi, '[').\n replace(/%5D/gi, ']');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @returns {string} The formatted url\n */\nmodule.exports = function buildURL(url, params, paramsSerializer) {\n /*eslint no-param-reassign:0*/\n if (!params) {\n return url;\n }\n\n var serializedParams;\n if (paramsSerializer) {\n serializedParams = paramsSerializer(params);\n } else if (utils.isURLSearchParams(params)) {\n serializedParams = params.toString();\n } else {\n var parts = [];\n\n utils.forEach(params, function serialize(val, key) {\n if (val === null || typeof val === 'undefined') {\n return;\n }\n\n if (utils.isArray(val)) {\n key = key + '[]';\n } else {\n val = [val];\n }\n\n utils.forEach(val, function parseValue(v) {\n if (utils.isDate(v)) {\n v = v.toISOString();\n } else if (utils.isObject(v)) {\n v = JSON.stringify(v);\n }\n parts.push(encode(key) + '=' + encode(v));\n });\n });\n\n serializedParams = parts.join('&');\n }\n\n if (serializedParams) {\n url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n }\n\n return url;\n};\n","'use strict';\n\nvar utils = require('./../utils');\n\n// Headers whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nvar ignoreDuplicateOf = [\n 'age', 'authorization', 'content-length', 'content-type', 'etag',\n 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n 'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n 'referer', 'retry-after', 'user-agent'\n];\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} headers Headers needing to be parsed\n * @returns {Object} Headers parsed into an object\n */\nmodule.exports = function parseHeaders(headers) {\n var parsed = {};\n var key;\n var val;\n var i;\n\n if (!headers) { return parsed; }\n\n utils.forEach(headers.split('\\n'), function parser(line) {\n i = line.indexOf(':');\n key = utils.trim(line.substr(0, i)).toLowerCase();\n val = utils.trim(line.substr(i + 1));\n\n if (key) {\n if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) {\n return;\n }\n if (key === 'set-cookie') {\n parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]);\n } else {\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n }\n }\n });\n\n return parsed;\n};\n","'use strict';\n\nvar utils = require('./../utils');\n\nmodule.exports = (\n utils.isStandardBrowserEnv() ?\n\n // Standard browser envs have full support of the APIs needed to test\n // whether the request URL is of the same origin as current location.\n (function standardBrowserEnv() {\n var msie = /(msie|trident)/i.test(navigator.userAgent);\n var urlParsingNode = document.createElement('a');\n var originURL;\n\n /**\n * Parse a URL to discover it's components\n *\n * @param {String} url The URL to be parsed\n * @returns {Object}\n */\n function resolveURL(url) {\n var href = url;\n\n if (msie) {\n // IE needs attribute set twice to normalize properties\n urlParsingNode.setAttribute('href', href);\n href = urlParsingNode.href;\n }\n\n urlParsingNode.setAttribute('href', href);\n\n // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n return {\n href: urlParsingNode.href,\n protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\n host: urlParsingNode.host,\n search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\n hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\n hostname: urlParsingNode.hostname,\n port: urlParsingNode.port,\n pathname: (urlParsingNode.pathname.charAt(0) === '/') ?\n urlParsingNode.pathname :\n '/' + urlParsingNode.pathname\n };\n }\n\n originURL = resolveURL(window.location.href);\n\n /**\n * Determine if a URL shares the same origin as the current location\n *\n * @param {String} requestURL The URL to test\n * @returns {boolean} True if URL shares the same origin, otherwise false\n */\n return function isURLSameOrigin(requestURL) {\n var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;\n return (parsed.protocol === originURL.protocol &&\n parsed.host === originURL.host);\n };\n })() :\n\n // Non standard browser envs (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return function isURLSameOrigin() {\n return true;\n };\n })()\n);\n","'use strict';\n\nvar utils = require('./../utils');\n\nmodule.exports = (\n utils.isStandardBrowserEnv() ?\n\n // Standard browser envs support document.cookie\n (function standardBrowserEnv() {\n return {\n write: function write(name, value, expires, path, domain, secure) {\n var cookie = [];\n cookie.push(name + '=' + encodeURIComponent(value));\n\n if (utils.isNumber(expires)) {\n cookie.push('expires=' + new Date(expires).toGMTString());\n }\n\n if (utils.isString(path)) {\n cookie.push('path=' + path);\n }\n\n if (utils.isString(domain)) {\n cookie.push('domain=' + domain);\n }\n\n if (secure === true) {\n cookie.push('secure');\n }\n\n document.cookie = cookie.join('; ');\n },\n\n read: function read(name) {\n var match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n return (match ? decodeURIComponent(match[3]) : null);\n },\n\n remove: function remove(name) {\n this.write(name, '', Date.now() - 86400000);\n }\n };\n })() :\n\n // Non standard browser env (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return {\n write: function write() {},\n read: function read() { return null; },\n remove: function remove() {}\n };\n })()\n);\n","'use strict';\n\nvar utils = require('./../utils');\n\nfunction InterceptorManager() {\n this.handlers = [];\n}\n\n/**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\nInterceptorManager.prototype.use = function use(fulfilled, rejected) {\n this.handlers.push({\n fulfilled: fulfilled,\n rejected: rejected\n });\n return this.handlers.length - 1;\n};\n\n/**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n */\nInterceptorManager.prototype.eject = function eject(id) {\n if (this.handlers[id]) {\n this.handlers[id] = null;\n }\n};\n\n/**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n */\nInterceptorManager.prototype.forEach = function forEach(fn) {\n utils.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n};\n\nmodule.exports = InterceptorManager;\n","'use strict';\n\nvar utils = require('./../utils');\nvar transformData = require('./transformData');\nvar isCancel = require('../cancel/isCancel');\nvar defaults = require('../defaults');\nvar isAbsoluteURL = require('./../helpers/isAbsoluteURL');\nvar combineURLs = require('./../helpers/combineURLs');\n\n/**\n * Throws a `Cancel` if cancellation has been requested.\n */\nfunction throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n * @returns {Promise} The Promise to be fulfilled\n */\nmodule.exports = function dispatchRequest(config) {\n throwIfCancellationRequested(config);\n\n // Support baseURL config\n if (config.baseURL && !isAbsoluteURL(config.url)) {\n config.url = combineURLs(config.baseURL, config.url);\n }\n\n // Ensure headers exist\n config.headers = config.headers || {};\n\n // Transform request data\n config.data = transformData(\n config.data,\n config.headers,\n config.transformRequest\n );\n\n // Flatten headers\n config.headers = utils.merge(\n config.headers.common || {},\n config.headers[config.method] || {},\n config.headers || {}\n );\n\n utils.forEach(\n ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n function cleanHeaderConfig(method) {\n delete config.headers[method];\n }\n );\n\n var adapter = config.adapter || defaults.adapter;\n\n return adapter(config).then(function onAdapterResolution(response) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n response.data = transformData(\n response.data,\n response.headers,\n config.transformResponse\n );\n\n return response;\n }, function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n if (reason && reason.response) {\n reason.response.data = transformData(\n reason.response.data,\n reason.response.headers,\n config.transformResponse\n );\n }\n }\n\n return Promise.reject(reason);\n });\n};\n","'use strict';\n\nvar utils = require('./../utils');\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Object|String} data The data to be transformed\n * @param {Array} headers The headers for the request or response\n * @param {Array|Function} fns A single function or Array of functions\n * @returns {*} The resulting transformed data\n */\nmodule.exports = function transformData(data, headers, fns) {\n /*eslint no-param-reassign:0*/\n utils.forEach(fns, function transform(fn) {\n data = fn(data, headers);\n });\n\n return data;\n};\n","'use strict';\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nmodule.exports = function isAbsoluteURL(url) {\n // A URL is considered absolute if it begins with \"://\" or \"//\" (protocol-relative URL).\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n // by any combination of letters, digits, plus, period, or hyphen.\n return /^([a-z][a-z\\d\\+\\-\\.]*:)?\\/\\//i.test(url);\n};\n","'use strict';\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n * @returns {string} The combined URL\n */\nmodule.exports = function combineURLs(baseURL, relativeURL) {\n return relativeURL\n ? baseURL.replace(/\\/+$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n : baseURL;\n};\n","'use strict';\n\nvar Cancel = require('./Cancel');\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @class\n * @param {Function} executor The executor function.\n */\nfunction CancelToken(executor) {\n if (typeof executor !== 'function') {\n throw new TypeError('executor must be a function.');\n }\n\n var resolvePromise;\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n\n var token = this;\n executor(function cancel(message) {\n if (token.reason) {\n // Cancellation has already been requested\n return;\n }\n\n token.reason = new Cancel(message);\n resolvePromise(token.reason);\n });\n}\n\n/**\n * Throws a `Cancel` if cancellation has been requested.\n */\nCancelToken.prototype.throwIfRequested = function throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n};\n\n/**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\nCancelToken.source = function source() {\n var cancel;\n var token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token: token,\n cancel: cancel\n };\n};\n\nmodule.exports = CancelToken;\n","'use strict';\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n * ```js\n * function f(x, y, z) {}\n * var args = [1, 2, 3];\n * f.apply(null, args);\n * ```\n *\n * With `spread` this example can be re-written.\n *\n * ```js\n * spread(function(x, y, z) {})([1, 2, 3]);\n * ```\n *\n * @param {Function} callback\n * @returns {Function}\n */\nmodule.exports = function spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar $trim = require('../internals/string-trim').trim;\nvar forcedStringTrimMethod = require('../internals/forced-string-trim-method');\n\n// `String.prototype.trim` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.trim\n$({ target: 'String', proto: true, forced: forcedStringTrimMethod('trim') }, {\n trim: function trim() {\n return $trim(this);\n }\n});\n","var requireObjectCoercible = require('../internals/require-object-coercible');\nvar whitespaces = require('../internals/whitespaces');\n\nvar whitespace = '[' + whitespaces + ']';\nvar ltrim = RegExp('^' + whitespace + whitespace + '*');\nvar rtrim = RegExp(whitespace + whitespace + '*$');\n\n// `String.prototype.{ trim, trimStart, trimEnd, trimLeft, trimRight }` methods implementation\nvar createMethod = function (TYPE) {\n return function ($this) {\n var string = String(requireObjectCoercible($this));\n if (TYPE & 1) string = string.replace(ltrim, '');\n if (TYPE & 2) string = string.replace(rtrim, '');\n return string;\n };\n};\n\nmodule.exports = {\n // `String.prototype.{ trimLeft, trimStart }` methods\n // https://tc39.github.io/ecma262/#sec-string.prototype.trimstart\n start: createMethod(1),\n // `String.prototype.{ trimRight, trimEnd }` methods\n // https://tc39.github.io/ecma262/#sec-string.prototype.trimend\n end: createMethod(2),\n // `String.prototype.trim` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.trim\n trim: createMethod(3)\n};\n","var fails = require('../internals/fails');\nvar whitespaces = require('../internals/whitespaces');\n\nvar non = '\\u200B\\u0085\\u180E';\n\n// check that a method works with the correct list\n// of whitespaces and has a correct name\nmodule.exports = function (METHOD_NAME) {\n return fails(function () {\n return !!whitespaces[METHOD_NAME]() || non[METHOD_NAME]() != non || whitespaces[METHOD_NAME].name !== METHOD_NAME;\n });\n};\n","/*\n* Copyright (C) 2019 Intel Corporation\n* SPDX-License-Identifier: MIT\n*/\n\n/* global\n require:false\n global:false\n*/\n\n(() => {\n const PluginRegistry = require('./plugins');\n const serverProxy = require('./server-proxy');\n const { ArgumentError } = require('./exceptions');\n const { isBrowser, isNode } = require('browser-or-node');\n\n // This is the frames storage\n const frameDataCache = {};\n const frameCache = {};\n\n /**\n * Class provides meta information about specific frame and frame itself\n * @memberof module:API.cvat.classes\n * @hideconstructor\n */\n class FrameData {\n constructor(width, height, tid, number) {\n Object.defineProperties(this, Object.freeze({\n /**\n * @name width\n * @type {integer}\n * @memberof module:API.cvat.classes.FrameData\n * @readonly\n * @instance\n */\n width: {\n value: width,\n writable: false,\n },\n /**\n * @name height\n * @type {integer}\n * @memberof module:API.cvat.classes.FrameData\n * @readonly\n * @instance\n */\n height: {\n value: height,\n writable: false,\n },\n tid: {\n value: tid,\n writable: false,\n },\n number: {\n value: number,\n writable: false,\n },\n }));\n }\n\n /**\n * Method returns URL encoded image which can be placed in the img tag\n * @method data\n * @returns {string}\n * @memberof module:API.cvat.classes.FrameData\n * @instance\n * @async\n * @param {function} [onServerRequest = () => {}]\n * callback which will be called if data absences local\n * @throws {module:API.cvat.exception.ServerError}\n * @throws {module:API.cvat.exception.PluginError}\n */\n async data(onServerRequest = () => {}) {\n const result = await PluginRegistry\n .apiWrapper.call(this, FrameData.prototype.data, onServerRequest);\n return result;\n }\n }\n\n FrameData.prototype.data.implementation = async function (onServerRequest) {\n return new Promise(async (resolve, reject) => {\n try {\n if (this.number in frameCache[this.tid]) {\n resolve(frameCache[this.tid][this.number]);\n } else {\n onServerRequest();\n const frame = await serverProxy.frames.getData(this.tid, this.number);\n\n if (isNode) {\n frameCache[this.tid][this.number] = global.Buffer.from(frame, 'binary').toString('base64');\n resolve(frameCache[this.tid][this.number]);\n } else if (isBrowser) {\n const reader = new FileReader();\n reader.onload = () => {\n frameCache[this.tid][this.number] = reader.result;\n resolve(frameCache[this.tid][this.number]);\n };\n reader.readAsDataURL(frame);\n }\n }\n } catch (exception) {\n reject(exception);\n }\n });\n };\n\n async function getFrame(taskID, mode, frame) {\n if (!(taskID in frameDataCache)) {\n frameDataCache[taskID] = {};\n frameDataCache[taskID].meta = await serverProxy.frames.getMeta(taskID);\n\n frameCache[taskID] = {};\n }\n\n if (!(frame in frameDataCache[taskID])) {\n let size = null;\n if (mode === 'interpolation') {\n [size] = frameDataCache[taskID].meta;\n } else if (mode === 'annotation') {\n if (frame >= frameDataCache[taskID].meta.length) {\n throw new ArgumentError(\n `Meta information about frame ${frame} can't be received from the server`,\n );\n } else {\n size = frameDataCache[taskID].meta[frame];\n }\n } else {\n throw new ArgumentError(\n `Invalid mode is specified ${mode}`,\n );\n }\n\n frameDataCache[taskID][frame] = new FrameData(size.width, size.height, taskID, frame);\n }\n\n return frameDataCache[taskID][frame];\n }\n\n module.exports = {\n FrameData,\n getFrame,\n };\n})();\n","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n/* global window self */\n\nvar isBrowser = typeof window !== 'undefined' && typeof window.document !== 'undefined';\n\n/* eslint-disable no-restricted-globals */\nvar isWebWorker = (typeof self === 'undefined' ? 'undefined' : _typeof(self)) === 'object' && self.constructor && self.constructor.name === 'DedicatedWorkerGlobalScope';\n/* eslint-enable no-restricted-globals */\n\nvar isNode = typeof process !== 'undefined' && process.versions != null && process.versions.node != null;\n\nexports.isBrowser = isBrowser;\nexports.isWebWorker = isWebWorker;\nexports.isNode = isNode;","/*\n* Copyright (C) 2019 Intel Corporation\n* SPDX-License-Identifier: MIT\n*/\n\n/* global\n require:false\n*/\n\n(() => {\n const serverProxy = require('./server-proxy');\n const Collection = require('./annotations-collection');\n const AnnotationsSaver = require('./annotations-saver');\n const { checkObjectType } = require('./common');\n const { Task } = require('./session');\n const {\n Loader,\n Dumper,\n } = require('./annotation-format.js');\n const {\n ScriptingError,\n DataError,\n ArgumentError,\n } = require('./exceptions');\n\n const jobCache = new WeakMap();\n const taskCache = new WeakMap();\n\n function getCache(sessionType) {\n if (sessionType === 'task') {\n return taskCache;\n }\n\n if (sessionType === 'job') {\n return jobCache;\n }\n\n throw new ScriptingError(\n `Unknown session type was received ${sessionType}`,\n );\n }\n\n async function getAnnotationsFromServer(session) {\n const sessionType = session instanceof Task ? 'task' : 'job';\n const cache = getCache(sessionType);\n\n if (!cache.has(session)) {\n const rawAnnotations = await serverProxy.annotations\n .getAnnotations(sessionType, session.id);\n\n // Get meta information about frames\n const startFrame = sessionType === 'job' ? session.startFrame : 0;\n const stopFrame = sessionType === 'job' ? session.stopFrame : session.size - 1;\n const frameMeta = {};\n for (let i = startFrame; i <= stopFrame; i++) {\n frameMeta[i] = await session.frames.get(i);\n }\n\n const collection = new Collection({\n labels: session.labels || session.task.labels,\n startFrame,\n stopFrame,\n frameMeta,\n }).import(rawAnnotations);\n\n const saver = new AnnotationsSaver(rawAnnotations.version, collection, session);\n\n cache.set(session, {\n collection,\n saver,\n\n });\n }\n }\n\n async function getAnnotations(session, frame, filter) {\n await getAnnotationsFromServer(session);\n const sessionType = session instanceof Task ? 'task' : 'job';\n const cache = getCache(sessionType);\n return cache.get(session).collection.get(frame, filter);\n }\n\n async function saveAnnotations(session, onUpdate) {\n const sessionType = session instanceof Task ? 'task' : 'job';\n const cache = getCache(sessionType);\n\n if (cache.has(session)) {\n await cache.get(session).saver.save(onUpdate);\n }\n\n // If a collection wasn't uploaded, than it wasn't changed, finally we shouldn't save it\n }\n\n function mergeAnnotations(session, objectStates) {\n const sessionType = session instanceof Task ? 'task' : 'job';\n const cache = getCache(sessionType);\n\n if (cache.has(session)) {\n return cache.get(session).collection.merge(objectStates);\n }\n\n throw new DataError(\n 'Collection has not been initialized yet. Call annotations.get() or annotations.clear(true) before',\n );\n }\n\n function splitAnnotations(session, objectState, frame) {\n const sessionType = session instanceof Task ? 'task' : 'job';\n const cache = getCache(sessionType);\n\n if (cache.has(session)) {\n return cache.get(session).collection.split(objectState, frame);\n }\n\n throw new DataError(\n 'Collection has not been initialized yet. Call annotations.get() or annotations.clear(true) before',\n );\n }\n\n function groupAnnotations(session, objectStates, reset) {\n const sessionType = session instanceof Task ? 'task' : 'job';\n const cache = getCache(sessionType);\n\n if (cache.has(session)) {\n return cache.get(session).collection.group(objectStates, reset);\n }\n\n throw new DataError(\n 'Collection has not been initialized yet. Call annotations.get() or annotations.clear(true) before',\n );\n }\n\n function hasUnsavedChanges(session) {\n const sessionType = session instanceof Task ? 'task' : 'job';\n const cache = getCache(sessionType);\n\n if (cache.has(session)) {\n return cache.get(session).saver.hasUnsavedChanges();\n }\n\n return false;\n }\n\n async function clearAnnotations(session, reload) {\n checkObjectType('reload', reload, 'boolean', null);\n const sessionType = session instanceof Task ? 'task' : 'job';\n const cache = getCache(sessionType);\n\n if (cache.has(session)) {\n cache.get(session).collection.clear();\n }\n\n if (reload) {\n cache.delete(session);\n await getAnnotationsFromServer(session);\n }\n }\n\n function annotationsStatistics(session) {\n const sessionType = session instanceof Task ? 'task' : 'job';\n const cache = getCache(sessionType);\n\n if (cache.has(session)) {\n return cache.get(session).collection.statistics();\n }\n\n throw new DataError(\n 'Collection has not been initialized yet. Call annotations.get() or annotations.clear(true) before',\n );\n }\n\n function putAnnotations(session, objectStates) {\n const sessionType = session instanceof Task ? 'task' : 'job';\n const cache = getCache(sessionType);\n\n if (cache.has(session)) {\n return cache.get(session).collection.put(objectStates);\n }\n\n throw new DataError(\n 'Collection has not been initialized yet. Call annotations.get() or annotations.clear(true) before',\n );\n }\n\n function selectObject(session, objectStates, x, y) {\n const sessionType = session instanceof Task ? 'task' : 'job';\n const cache = getCache(sessionType);\n\n if (cache.has(session)) {\n return cache.get(session).collection.select(objectStates, x, y);\n }\n\n throw new DataError(\n 'Collection has not been initialized yet. Call annotations.get() or annotations.clear(true) before',\n );\n }\n\n async function uploadAnnotations(session, file, loader) {\n const sessionType = session instanceof Task ? 'task' : 'job';\n if (!(loader instanceof Loader)) {\n throw new ArgumentError(\n 'A loader must be instance of Loader class',\n );\n }\n await serverProxy.annotations.uploadAnnotations(sessionType, session.id, file, loader.name);\n }\n\n async function dumpAnnotations(session, name, dumper) {\n if (!(dumper instanceof Dumper)) {\n throw new ArgumentError(\n 'A dumper must be instance of Dumper class',\n );\n }\n\n let result = null;\n const sessionType = session instanceof Task ? 'task' : 'job';\n if (sessionType === 'job') {\n result = await serverProxy.annotations\n .dumpAnnotations(session.task.id, name, dumper.name);\n } else {\n result = await serverProxy.annotations\n .dumpAnnotations(session.id, name, dumper.name);\n }\n\n return result;\n }\n\n module.exports = {\n getAnnotations,\n putAnnotations,\n saveAnnotations,\n hasUnsavedChanges,\n mergeAnnotations,\n splitAnnotations,\n groupAnnotations,\n clearAnnotations,\n annotationsStatistics,\n selectObject,\n uploadAnnotations,\n dumpAnnotations,\n };\n})();\n","/*\n* Copyright (C) 2019 Intel Corporation\n* SPDX-License-Identifier: MIT\n*/\n\n/* global\n require:false\n*/\n\n(() => {\n const {\n RectangleShape,\n PolygonShape,\n PolylineShape,\n PointsShape,\n RectangleTrack,\n PolygonTrack,\n PolylineTrack,\n PointsTrack,\n Track,\n Shape,\n Tag,\n objectStateFactory,\n } = require('./annotations-objects');\n const { checkObjectType } = require('./common');\n const Statistics = require('./statistics');\n const { Label } = require('./labels');\n const {\n DataError,\n ArgumentError,\n ScriptingError,\n } = require('./exceptions');\n\n const {\n ObjectShape,\n ObjectType,\n } = require('./enums');\n const ObjectState = require('./object-state');\n\n const colors = [\n '#0066FF', '#AF593E', '#01A368', '#FF861F', '#ED0A3F', '#FF3F34', '#76D7EA',\n '#8359A3', '#FBE870', '#C5E17A', '#03BB85', '#FFDF00', '#8B8680', '#0A6B0D',\n '#8FD8D8', '#A36F40', '#F653A6', '#CA3435', '#FFCBA4', '#FF99CC', '#FA9D5A',\n '#FFAE42', '#A78B00', '#788193', '#514E49', '#1164B4', '#F4FA9F', '#FED8B1',\n '#C32148', '#01796F', '#E90067', '#FF91A4', '#404E5A', '#6CDAE7', '#FFC1CC',\n '#006A93', '#867200', '#E2B631', '#6EEB6E', '#FFC800', '#CC99BA', '#FF007C',\n '#BC6CAC', '#DCCCD7', '#EBE1C2', '#A6AAAE', '#B99685', '#0086A7', '#5E4330',\n '#C8A2C8', '#708EB3', '#BC8777', '#B2592D', '#497E48', '#6A2963', '#E6335F',\n '#00755E', '#B5A895', '#0048ba', '#EED9C4', '#C88A65', '#FF6E4A', '#87421F',\n '#B2BEB5', '#926F5B', '#00B9FB', '#6456B7', '#DB5079', '#C62D42', '#FA9C44',\n '#DA8A67', '#FD7C6E', '#93CCEA', '#FCF686', '#503E32', '#FF5470', '#9DE093',\n '#FF7A00', '#4F69C6', '#A50B5E', '#F0E68C', '#FDFF00', '#F091A9', '#FFFF66',\n '#6F9940', '#FC74FD', '#652DC1', '#D6AEDD', '#EE34D2', '#BB3385', '#6B3FA0',\n '#33CC99', '#FFDB00', '#87FF2A', '#6EEB6E', '#FFC800', '#CC99BA', '#7A89B8',\n '#006A93', '#867200', '#E2B631', '#D9D6CF',\n ];\n\n function shapeFactory(shapeData, clientID, injection) {\n const { type } = shapeData;\n const color = colors[clientID % colors.length];\n\n let shapeModel = null;\n switch (type) {\n case 'rectangle':\n shapeModel = new RectangleShape(shapeData, clientID, color, injection);\n break;\n case 'polygon':\n shapeModel = new PolygonShape(shapeData, clientID, color, injection);\n break;\n case 'polyline':\n shapeModel = new PolylineShape(shapeData, clientID, color, injection);\n break;\n case 'points':\n shapeModel = new PointsShape(shapeData, clientID, color, injection);\n break;\n default:\n throw new DataError(\n `An unexpected type of shape \"${type}\"`,\n );\n }\n\n return shapeModel;\n }\n\n\n function trackFactory(trackData, clientID, injection) {\n if (trackData.shapes.length) {\n const { type } = trackData.shapes[0];\n const color = colors[clientID % colors.length];\n\n let trackModel = null;\n switch (type) {\n case 'rectangle':\n trackModel = new RectangleTrack(trackData, clientID, color, injection);\n break;\n case 'polygon':\n trackModel = new PolygonTrack(trackData, clientID, color, injection);\n break;\n case 'polyline':\n trackModel = new PolylineTrack(trackData, clientID, color, injection);\n break;\n case 'points':\n trackModel = new PointsTrack(trackData, clientID, color, injection);\n break;\n default:\n throw new DataError(\n `An unexpected type of track \"${type}\"`,\n );\n }\n\n return trackModel;\n }\n\n console.warn('The track without any shapes had been found. It was ignored.');\n return null;\n }\n\n class Collection {\n constructor(data) {\n this.startFrame = data.startFrame;\n this.stopFrame = data.stopFrame;\n this.frameMeta = data.frameMeta;\n\n this.labels = data.labels.reduce((labelAccumulator, label) => {\n labelAccumulator[label.id] = label;\n return labelAccumulator;\n }, {});\n\n this.shapes = {}; // key is a frame\n this.tags = {}; // key is a frame\n this.tracks = [];\n this.objects = {}; // key is a client id\n this.count = 0;\n this.flush = false;\n this.collectionZ = {}; // key is a frame, {max, min} are values\n this.groups = {\n max: 0,\n }; // it is an object to we can pass it as an argument by a reference\n this.injection = {\n labels: this.labels,\n collectionZ: this.collectionZ,\n groups: this.groups,\n frameMeta: this.frameMeta,\n };\n }\n\n import(data) {\n for (const tag of data.tags) {\n const clientID = ++this.count;\n const tagModel = new Tag(tag, clientID, this.injection);\n this.tags[tagModel.frame] = this.tags[tagModel.frame] || [];\n this.tags[tagModel.frame].push(tagModel);\n this.objects[clientID] = tagModel;\n }\n\n for (const shape of data.shapes) {\n const clientID = ++this.count;\n const shapeModel = shapeFactory(shape, clientID, this.injection);\n this.shapes[shapeModel.frame] = this.shapes[shapeModel.frame] || [];\n this.shapes[shapeModel.frame].push(shapeModel);\n this.objects[clientID] = shapeModel;\n }\n\n for (const track of data.tracks) {\n const clientID = ++this.count;\n const trackModel = trackFactory(track, clientID, this.injection);\n // The function can return null if track doesn't have any shapes.\n // In this case a corresponded message will be sent to the console\n if (trackModel) {\n this.tracks.push(trackModel);\n this.objects[clientID] = trackModel;\n }\n }\n\n return this;\n }\n\n export() {\n const data = {\n tracks: this.tracks.filter(track => !track.removed)\n .map(track => track.toJSON()),\n shapes: Object.values(this.shapes)\n .reduce((accumulator, value) => {\n accumulator.push(...value);\n return accumulator;\n }, []).filter(shape => !shape.removed)\n .map(shape => shape.toJSON()),\n tags: Object.values(this.tags).reduce((accumulator, value) => {\n accumulator.push(...value);\n return accumulator;\n }, []).filter(tag => !tag.removed)\n .map(tag => tag.toJSON()),\n };\n\n return data;\n }\n\n get(frame) {\n const { tracks } = this;\n const shapes = this.shapes[frame] || [];\n const tags = this.tags[frame] || [];\n\n const objects = tracks.concat(shapes).concat(tags).filter(object => !object.removed);\n // filtering here\n\n const objectStates = [];\n for (const object of objects) {\n const stateData = object.get(frame);\n if (stateData.outside && !stateData.keyframe) {\n continue;\n }\n\n const objectState = objectStateFactory.call(object, frame, stateData);\n objectStates.push(objectState);\n }\n\n return objectStates;\n }\n\n merge(objectStates) {\n checkObjectType('shapes for merge', objectStates, null, Array);\n if (!objectStates.length) return;\n const objectsForMerge = objectStates.map((state) => {\n checkObjectType('object state', state, null, ObjectState);\n const object = this.objects[state.clientID];\n if (typeof (object) === 'undefined') {\n throw new ArgumentError(\n 'The object has not been saved yet. Call ObjectState.put([state]) before you can merge it',\n );\n }\n return object;\n });\n\n const keyframes = {}; // frame: position\n const { label, shapeType } = objectStates[0];\n if (!(label.id in this.labels)) {\n throw new ArgumentError(\n `Unknown label for the task: ${label.id}`,\n );\n }\n\n if (!Object.values(ObjectShape).includes(shapeType)) {\n throw new ArgumentError(\n `Got unknown shapeType \"${shapeType}\"`,\n );\n }\n\n const labelAttributes = label.attributes.reduce((accumulator, attribute) => {\n accumulator[attribute.id] = attribute;\n return accumulator;\n }, {});\n\n for (let i = 0; i < objectsForMerge.length; i++) {\n // For each state get corresponding object\n const object = objectsForMerge[i];\n const state = objectStates[i];\n if (state.label.id !== label.id) {\n throw new ArgumentError(\n `All shape labels are expected to be ${label.name}, but got ${state.label.name}`,\n );\n }\n\n if (state.shapeType !== shapeType) {\n throw new ArgumentError(\n `All shapes are expected to be ${shapeType}, but got ${state.shapeType}`,\n );\n }\n\n // If this object is shape, get it position and save as a keyframe\n if (object instanceof Shape) {\n // Frame already saved and it is not outside\n if (object.frame in keyframes && !keyframes[object.frame].outside) {\n throw new ArgumentError(\n 'Expected only one visible shape per frame',\n );\n }\n\n keyframes[object.frame] = {\n type: shapeType,\n frame: object.frame,\n points: [...object.points],\n occluded: object.occluded,\n zOrder: object.zOrder,\n outside: false,\n attributes: Object.keys(object.attributes).reduce((accumulator, attrID) => {\n // We save only mutable attributes inside a keyframe\n if (attrID in labelAttributes && labelAttributes[attrID].mutable) {\n accumulator.push({\n spec_id: +attrID,\n value: object.attributes[attrID],\n });\n }\n return accumulator;\n }, []),\n };\n\n // Push outside shape after each annotation shape\n // Any not outside shape rewrites it\n if (!((object.frame + 1) in keyframes)) {\n keyframes[object.frame + 1] = JSON\n .parse(JSON.stringify(keyframes[object.frame]));\n keyframes[object.frame + 1].outside = true;\n keyframes[object.frame + 1].frame++;\n }\n } else if (object instanceof Track) {\n // If this object is track, iterate through all its\n // keyframes and push copies to new keyframes\n const attributes = {}; // id:value\n for (const keyframe of Object.keys(object.shapes)) {\n const shape = object.shapes[keyframe];\n // Frame already saved and it is not outside\n if (keyframe in keyframes && !keyframes[keyframe].outside) {\n // This shape is outside and non-outside shape already exists\n if (shape.outside) {\n continue;\n }\n\n throw new ArgumentError(\n 'Expected only one visible shape per frame',\n );\n }\n\n // We do not save an attribute if it has the same value\n // We save only updates\n let updatedAttributes = false;\n for (const attrID in shape.attributes) {\n if (!(attrID in attributes)\n || attributes[attrID] !== shape.attributes[attrID]) {\n updatedAttributes = true;\n attributes[attrID] = shape.attributes[attrID];\n }\n }\n\n keyframes[keyframe] = {\n type: shapeType,\n frame: +keyframe,\n points: [...shape.points],\n occluded: shape.occluded,\n outside: shape.outside,\n zOrder: shape.zOrder,\n attributes: updatedAttributes ? Object.keys(attributes)\n .reduce((accumulator, attrID) => {\n accumulator.push({\n spec_id: +attrID,\n value: attributes[attrID],\n });\n\n return accumulator;\n }, []) : [],\n };\n }\n } else {\n throw new ArgumentError(\n `Trying to merge unknown object type: ${object.constructor.name}. `\n + 'Only shapes and tracks are expected.',\n );\n }\n }\n\n let firstNonOutside = false;\n for (const frame of Object.keys(keyframes).sort((a, b) => +a - +b)) {\n // Remove all outside frames at the begin\n firstNonOutside = firstNonOutside || keyframes[frame].outside;\n if (!firstNonOutside && keyframes[frame].outside) {\n delete keyframes[frame];\n } else {\n break;\n }\n }\n\n const clientID = ++this.count;\n const track = {\n frame: Math.min.apply(null, Object.keys(keyframes).map(frame => +frame)),\n shapes: Object.values(keyframes),\n group: 0,\n label_id: label.id,\n attributes: Object.keys(objectStates[0].attributes)\n .reduce((accumulator, attrID) => {\n if (!labelAttributes[attrID].mutable) {\n accumulator.push({\n spec_id: +attrID,\n value: objectStates[0].attributes[attrID],\n });\n }\n\n return accumulator;\n }, []),\n };\n\n const trackModel = trackFactory(track, clientID, this.injection);\n this.tracks.push(trackModel);\n this.objects[clientID] = trackModel;\n\n // Remove other shapes\n for (const object of objectsForMerge) {\n object.removed = true;\n if (typeof (object.resetCache) === 'function') {\n object.resetCache();\n }\n }\n }\n\n split(objectState, frame) {\n checkObjectType('object state', objectState, null, ObjectState);\n checkObjectType('frame', frame, 'integer', null);\n\n const object = this.objects[objectState.clientID];\n if (typeof (object) === 'undefined') {\n throw new ArgumentError(\n 'The object has not been saved yet. Call annotations.put([state]) before',\n );\n }\n\n if (objectState.objectType !== ObjectType.TRACK) {\n return;\n }\n\n const keyframes = Object.keys(object.shapes).sort((a, b) => +a - +b);\n if (frame <= +keyframes[0] || frame > keyframes[keyframes.length - 1]) {\n return;\n }\n\n const labelAttributes = object.label.attributes.reduce((accumulator, attribute) => {\n accumulator[attribute.id] = attribute;\n return accumulator;\n }, {});\n\n const exported = object.toJSON();\n const position = {\n type: objectState.shapeType,\n points: [...objectState.points],\n occluded: objectState.occluded,\n outside: objectState.outside,\n zOrder: 0,\n attributes: Object.keys(objectState.attributes)\n .reduce((accumulator, attrID) => {\n if (!labelAttributes[attrID].mutable) {\n accumulator.push({\n spec_id: +attrID,\n value: objectState.attributes[attrID],\n });\n }\n\n return accumulator;\n }, []),\n frame,\n };\n\n const prev = {\n frame: exported.frame,\n group: 0,\n label_id: exported.label_id,\n attributes: exported.attributes,\n shapes: [],\n };\n\n const next = JSON.parse(JSON.stringify(prev));\n next.frame = frame;\n\n next.shapes.push(JSON.parse(JSON.stringify(position)));\n exported.shapes.map((shape) => {\n delete shape.id;\n if (shape.frame < frame) {\n prev.shapes.push(JSON.parse(JSON.stringify(shape)));\n } else if (shape.frame > frame) {\n next.shapes.push(JSON.parse(JSON.stringify(shape)));\n }\n\n return shape;\n });\n prev.shapes.push(position);\n prev.shapes[prev.shapes.length - 1].outside = true;\n\n let clientID = ++this.count;\n const prevTrack = trackFactory(prev, clientID, this.injection);\n this.tracks.push(prevTrack);\n this.objects[clientID] = prevTrack;\n\n clientID = ++this.count;\n const nextTrack = trackFactory(next, clientID, this.injection);\n this.tracks.push(nextTrack);\n this.objects[clientID] = nextTrack;\n\n // Remove source object\n object.removed = true;\n object.resetCache();\n }\n\n group(objectStates, reset) {\n checkObjectType('shapes for group', objectStates, null, Array);\n\n const objectsForGroup = objectStates.map((state) => {\n checkObjectType('object state', state, null, ObjectState);\n const object = this.objects[state.clientID];\n if (typeof (object) === 'undefined') {\n throw new ArgumentError(\n 'The object has not been saved yet. Call annotations.put([state]) before',\n );\n }\n return object;\n });\n\n const groupIdx = reset ? 0 : ++this.groups.max;\n for (const object of objectsForGroup) {\n object.group = groupIdx;\n if (typeof (object.resetCache) === 'function') {\n object.resetCache();\n }\n }\n\n return groupIdx;\n }\n\n clear() {\n this.shapes = {};\n this.tags = {};\n this.tracks = [];\n this.objects = {}; // by id\n this.count = 0;\n\n this.flush = true;\n }\n\n statistics() {\n const labels = {};\n const skeleton = {\n rectangle: {\n shape: 0,\n track: 0,\n },\n polygon: {\n shape: 0,\n track: 0,\n },\n polyline: {\n shape: 0,\n track: 0,\n },\n points: {\n shape: 0,\n track: 0,\n },\n tags: 0,\n manually: 0,\n interpolated: 0,\n total: 0,\n };\n\n const total = JSON.parse(JSON.stringify(skeleton));\n for (const label of Object.values(this.labels)) {\n const { name } = label;\n labels[name] = JSON.parse(JSON.stringify(skeleton));\n }\n\n for (const object of Object.values(this.objects)) {\n let objectType = null;\n if (object instanceof Shape) {\n objectType = 'shape';\n } else if (object instanceof Track) {\n objectType = 'track';\n } else if (object instanceof Tag) {\n objectType = 'tag';\n } else {\n throw new ScriptingError(\n `Unexpected object type: \"${objectType}\"`,\n );\n }\n\n const label = object.label.name;\n if (objectType === 'tag') {\n labels[label].tags++;\n labels[label].manually++;\n labels[label].total++;\n } else {\n const { shapeType } = object;\n labels[label][shapeType][objectType]++;\n\n if (objectType === 'track') {\n const keyframes = Object.keys(object.shapes)\n .sort((a, b) => +a - +b).map(el => +el);\n\n let prevKeyframe = keyframes[0];\n let visible = false;\n\n for (const keyframe of keyframes) {\n if (visible) {\n const interpolated = keyframe - prevKeyframe - 1;\n labels[label].interpolated += interpolated;\n labels[label].total += interpolated;\n }\n visible = !object.shapes[keyframe].outside;\n prevKeyframe = keyframe;\n\n if (visible) {\n labels[label].manually++;\n labels[label].total++;\n }\n }\n\n const lastKey = keyframes[keyframes.length - 1];\n if (lastKey !== this.stopFrame && !object.shapes[lastKey].outside) {\n const interpolated = this.stopFrame - lastKey;\n labels[label].interpolated += interpolated;\n labels[label].total += interpolated;\n }\n } else {\n labels[label].manually++;\n labels[label].total++;\n }\n }\n }\n\n for (const label of Object.keys(labels)) {\n for (const key of Object.keys(labels[label])) {\n if (typeof (labels[label][key]) === 'object') {\n for (const objectType of Object.keys(labels[label][key])) {\n total[key][objectType] += labels[label][key][objectType];\n }\n } else {\n total[key] += labels[label][key];\n }\n }\n }\n\n return new Statistics(labels, total);\n }\n\n put(objectStates) {\n checkObjectType('shapes for put', objectStates, null, Array);\n const constructed = {\n shapes: [],\n tracks: [],\n tags: [],\n };\n\n function convertAttributes(accumulator, attrID) {\n const specID = +attrID;\n const value = this.attributes[attrID];\n\n checkObjectType('attribute id', specID, 'integer', null);\n checkObjectType('attribute value', value, 'string', null);\n\n accumulator.push({\n spec_id: specID,\n value,\n });\n\n return accumulator;\n }\n\n for (const state of objectStates) {\n checkObjectType('object state', state, null, ObjectState);\n checkObjectType('state client ID', state.clientID, 'undefined', null);\n checkObjectType('state frame', state.frame, 'integer', null);\n checkObjectType('state attributes', state.attributes, null, Object);\n checkObjectType('state label', state.label, null, Label);\n\n const attributes = Object.keys(state.attributes)\n .reduce(convertAttributes.bind(state), []);\n const labelAttributes = state.label.attributes.reduce((accumulator, attribute) => {\n accumulator[attribute.id] = attribute;\n return accumulator;\n }, {});\n\n // Construct whole objects from states\n if (state.objectType === 'tag') {\n constructed.tags.push({\n attributes,\n frame: state.frame,\n label_id: state.label.id,\n group: 0,\n });\n } else {\n checkObjectType('state occluded', state.occluded, 'boolean', null);\n checkObjectType('state points', state.points, null, Array);\n\n for (const coord of state.points) {\n checkObjectType('point coordinate', coord, 'number', null);\n }\n\n if (!Object.values(ObjectShape).includes(state.shapeType)) {\n throw new ArgumentError(\n 'Object shape must be one of: '\n + `${JSON.stringify(Object.values(ObjectShape))}`,\n );\n }\n\n if (state.objectType === 'shape') {\n constructed.shapes.push({\n attributes,\n frame: state.frame,\n group: 0,\n label_id: state.label.id,\n occluded: state.occluded || false,\n points: [...state.points],\n type: state.shapeType,\n z_order: 0,\n });\n } else if (state.objectType === 'track') {\n constructed.tracks.push({\n attributes: attributes\n .filter(attr => !labelAttributes[attr.spec_id].mutable),\n frame: state.frame,\n group: 0,\n label_id: state.label.id,\n shapes: [{\n attributes: attributes\n .filter(attr => labelAttributes[attr.spec_id].mutable),\n frame: state.frame,\n occluded: state.occluded || false,\n outside: false,\n points: [...state.points],\n type: state.shapeType,\n z_order: 0,\n }],\n });\n } else {\n throw new ArgumentError(\n 'Object type must be one of: '\n + `${JSON.stringify(Object.values(ObjectType))}`,\n );\n }\n }\n }\n\n // Add constructed objects to a collection\n this.import(constructed);\n }\n\n select(objectStates, x, y) {\n checkObjectType('shapes for select', objectStates, null, Array);\n checkObjectType('x coordinate', x, 'number', null);\n checkObjectType('y coordinate', y, 'number', null);\n\n let minimumDistance = null;\n let minimumState = null;\n for (const state of objectStates) {\n checkObjectType('object state', state, null, ObjectState);\n if (state.outside) continue;\n\n const object = this.objects[state.clientID];\n if (typeof (object) === 'undefined') {\n throw new ArgumentError(\n 'The object has not been saved yet. Call annotations.put([state]) before',\n );\n }\n\n const distance = object.constructor.distance(state.points, x, y);\n if (distance !== null && (minimumDistance === null || distance < minimumDistance)) {\n minimumDistance = distance;\n minimumState = state;\n }\n }\n\n return {\n state: minimumState,\n distance: minimumDistance,\n };\n }\n }\n\n module.exports = Collection;\n})();\n","'use strict';\nvar fails = require('../internals/fails');\n\nmodule.exports = function (METHOD_NAME, argument) {\n var method = [][METHOD_NAME];\n return !method || !fails(function () {\n // eslint-disable-next-line no-useless-call,no-throw-literal\n method.call(null, argument || function () { throw 1; }, 1);\n });\n};\n","/*\n* Copyright (C) 2019 Intel Corporation\n* SPDX-License-Identifier: MIT\n*/\n\n/* global\n require:false\n*/\n\n(() => {\n const ObjectState = require('./object-state');\n const {\n checkObjectType,\n isEnum,\n } = require('./common');\n const {\n ObjectShape,\n ObjectType,\n AttributeType,\n VisibleState,\n } = require('./enums');\n\n const {\n DataError,\n ArgumentError,\n ScriptingError,\n } = require('./exceptions');\n\n const { Label } = require('./labels');\n\n // Called with the Annotation context\n function objectStateFactory(frame, data) {\n const objectState = new ObjectState(data);\n\n objectState.hidden = {\n save: this.save.bind(this, frame, objectState),\n delete: this.delete.bind(this),\n up: this.up.bind(this, frame, objectState),\n down: this.down.bind(this, frame, objectState),\n };\n\n return objectState;\n }\n\n function checkNumberOfPoints(shapeType, points) {\n if (shapeType === ObjectShape.RECTANGLE) {\n if (points.length / 2 !== 2) {\n throw new DataError(\n `Rectangle must have 2 points, but got ${points.length / 2}`,\n );\n }\n } else if (shapeType === ObjectShape.POLYGON) {\n if (points.length / 2 < 3) {\n throw new DataError(\n `Polygon must have at least 3 points, but got ${points.length / 2}`,\n );\n }\n } else if (shapeType === ObjectShape.POLYLINE) {\n if (points.length / 2 < 2) {\n throw new DataError(\n `Polyline must have at least 2 points, but got ${points.length / 2}`,\n );\n }\n } else if (shapeType === ObjectShape.POINTS) {\n if (points.length / 2 < 1) {\n throw new DataError(\n `Points must have at least 1 points, but got ${points.length / 2}`,\n );\n }\n } else {\n throw new ArgumentError(\n `Unknown value of shapeType has been recieved ${shapeType}`,\n );\n }\n }\n\n function checkShapeArea(shapeType, points) {\n const MIN_SHAPE_LENGTH = 3;\n const MIN_SHAPE_AREA = 9;\n\n if (shapeType === ObjectShape.POINTS) {\n return true;\n }\n\n let xmin = Number.MAX_SAFE_INTEGER;\n let xmax = Number.MIN_SAFE_INTEGER;\n let ymin = Number.MAX_SAFE_INTEGER;\n let ymax = Number.MIN_SAFE_INTEGER;\n\n for (let i = 0; i < points.length - 1; i += 2) {\n xmin = Math.min(xmin, points[i]);\n xmax = Math.max(xmax, points[i]);\n ymin = Math.min(ymin, points[i + 1]);\n ymax = Math.max(ymax, points[i + 1]);\n }\n\n if (shapeType === ObjectShape.POLYLINE) {\n const length = Math.max(\n xmax - xmin,\n ymax - ymin,\n );\n\n return length >= MIN_SHAPE_LENGTH;\n }\n\n const area = (xmax - xmin) * (ymax - ymin);\n return area >= MIN_SHAPE_AREA;\n }\n\n function validateAttributeValue(value, attr) {\n const { values } = attr;\n const type = attr.inputType;\n\n if (typeof (value) !== 'string') {\n throw new ArgumentError(\n `Attribute value is expected to be string, but got ${typeof (value)}`,\n );\n }\n\n if (type === AttributeType.NUMBER) {\n return +value >= +values[0]\n && +value <= +values[1]\n && !((+value - +values[0]) % +values[2]);\n }\n\n if (type === AttributeType.CHECKBOX) {\n return ['true', 'false'].includes(value.toLowerCase());\n }\n\n return values.includes(value);\n }\n\n class Annotation {\n constructor(data, clientID, injection) {\n this.taskLabels = injection.labels;\n this.clientID = clientID;\n this.serverID = data.id;\n this.group = data.group;\n this.label = this.taskLabels[data.label_id];\n this.frame = data.frame;\n this.removed = false;\n this.lock = false;\n this.attributes = data.attributes.reduce((attributeAccumulator, attr) => {\n attributeAccumulator[attr.spec_id] = attr.value;\n return attributeAccumulator;\n }, {});\n this.appendDefaultAttributes(this.label);\n\n injection.groups.max = Math.max(injection.groups.max, this.group);\n }\n\n appendDefaultAttributes(label) {\n const labelAttributes = label.attributes;\n for (const attribute of labelAttributes) {\n if (!(attribute.id in this.attributes)) {\n this.attributes[attribute.id] = attribute.defaultValue;\n }\n }\n }\n\n delete(force) {\n if (!this.lock || force) {\n this.removed = true;\n }\n\n return true;\n }\n }\n\n class Drawn extends Annotation {\n constructor(data, clientID, color, injection) {\n super(data, clientID, injection);\n\n this.frameMeta = injection.frameMeta;\n this.collectionZ = injection.collectionZ;\n this.visibility = VisibleState.SHAPE;\n\n this.color = color;\n this.shapeType = null;\n }\n\n _getZ(frame) {\n this.collectionZ[frame] = this.collectionZ[frame] || {\n max: 0,\n min: 0,\n };\n\n return this.collectionZ[frame];\n }\n\n save() {\n throw new ScriptingError(\n 'Is not implemented',\n );\n }\n\n get() {\n throw new ScriptingError(\n 'Is not implemented',\n );\n }\n\n toJSON() {\n throw new ScriptingError(\n 'Is not implemented',\n );\n }\n\n // Increase ZOrder within frame\n up(frame, objectState) {\n const z = this._getZ(frame);\n z.max++;\n objectState.zOrder = z.max;\n }\n\n // Decrease ZOrder within frame\n down(frame, objectState) {\n const z = this._getZ(frame);\n z.min--;\n objectState.zOrder = z.min;\n }\n }\n\n class Shape extends Drawn {\n constructor(data, clientID, color, injection) {\n super(data, clientID, color, injection);\n this.points = data.points;\n this.occluded = data.occluded;\n this.zOrder = data.z_order;\n\n const z = this._getZ(this.frame);\n z.max = Math.max(z.max, this.zOrder || 0);\n z.min = Math.min(z.min, this.zOrder || 0);\n }\n\n // Method is used to export data to the server\n toJSON() {\n return {\n type: this.shapeType,\n clientID: this.clientID,\n occluded: this.occluded,\n z_order: this.zOrder,\n points: [...this.points],\n attributes: Object.keys(this.attributes).reduce((attributeAccumulator, attrId) => {\n attributeAccumulator.push({\n spec_id: attrId,\n value: this.attributes[attrId],\n });\n\n return attributeAccumulator;\n }, []),\n id: this.serverID,\n frame: this.frame,\n label_id: this.label.id,\n group: this.group,\n };\n }\n\n // Method is used to construct ObjectState objects\n get(frame) {\n if (frame !== this.frame) {\n throw new ScriptingError(\n 'Got frame is not equal to the frame of the shape',\n );\n }\n\n return {\n objectType: ObjectType.SHAPE,\n shapeType: this.shapeType,\n clientID: this.clientID,\n serverID: this.serverID,\n occluded: this.occluded,\n lock: this.lock,\n zOrder: this.zOrder,\n points: [...this.points],\n attributes: Object.assign({}, this.attributes),\n label: this.label,\n group: this.group,\n color: this.color,\n visibility: this.visibility,\n };\n }\n\n save(frame, data) {\n if (frame !== this.frame) {\n throw new ScriptingError(\n 'Got frame is not equal to the frame of the shape',\n );\n }\n\n if (this.lock && data.lock) {\n return objectStateFactory.call(this, frame, this.get(frame));\n }\n\n // All changes are done in this temporary object\n const copy = this.get(frame);\n const updated = data.updateFlags;\n\n if (updated.label) {\n checkObjectType('label', data.label, null, Label);\n copy.label = data.label;\n copy.attributes = {};\n this.appendDefaultAttributes.call(copy, copy.label);\n }\n\n if (updated.attributes) {\n const labelAttributes = copy.label.attributes\n .reduce((accumulator, value) => {\n accumulator[value.id] = value;\n return accumulator;\n }, {});\n\n for (const attrID of Object.keys(data.attributes)) {\n const value = data.attributes[attrID];\n if (attrID in labelAttributes\n && validateAttributeValue(value, labelAttributes[attrID])) {\n copy.attributes[attrID] = value;\n } else {\n throw new ArgumentError(\n `Trying to save unknown attribute with id ${attrID} and value ${value}`,\n );\n }\n }\n }\n\n if (updated.points) {\n checkObjectType('points', data.points, null, Array);\n checkNumberOfPoints(this.shapeType, data.points);\n\n // cut points\n const { width, height } = this.frameMeta[frame];\n const cutPoints = [];\n for (let i = 0; i < data.points.length - 1; i += 2) {\n const x = data.points[i];\n const y = data.points[i + 1];\n\n checkObjectType('coordinate', x, 'number', null);\n checkObjectType('coordinate', y, 'number', null);\n\n cutPoints.push(\n Math.clamp(x, 0, width),\n Math.clamp(y, 0, height),\n );\n }\n\n if (checkShapeArea(this.shapeType, cutPoints)) {\n copy.points = cutPoints;\n }\n }\n\n if (updated.occluded) {\n checkObjectType('occluded', data.occluded, 'boolean', null);\n copy.occluded = data.occluded;\n }\n\n if (updated.group) {\n checkObjectType('group', data.group, 'integer', null);\n copy.group = data.group;\n }\n\n if (updated.zOrder) {\n checkObjectType('zOrder', data.zOrder, 'integer', null);\n copy.zOrder = data.zOrder;\n }\n\n if (updated.lock) {\n checkObjectType('lock', data.lock, 'boolean', null);\n copy.lock = data.lock;\n }\n\n if (updated.color) {\n checkObjectType('color', data.color, 'string', null);\n if (/^#[0-9A-F]{6}$/i.test(data.color)) {\n throw new ArgumentError(\n `Got invalid color value: \"${data.color}\"`,\n );\n }\n\n copy.color = data.color;\n }\n\n if (updated.visibility) {\n if (!isEnum.call(VisibleState, data.visibility)) {\n throw new ArgumentError(\n `Got invalid visibility value: \"${data.visibility}\"`,\n );\n }\n\n copy.visibility = data.visibility;\n }\n\n // Reset flags and commit all changes\n updated.reset();\n for (const prop of Object.keys(copy)) {\n if (prop in this) {\n this[prop] = copy[prop];\n }\n }\n\n return objectStateFactory.call(this, frame, this.get(frame));\n }\n }\n\n class Track extends Drawn {\n constructor(data, clientID, color, injection) {\n super(data, clientID, color, injection);\n this.shapes = data.shapes.reduce((shapeAccumulator, value) => {\n shapeAccumulator[value.frame] = {\n serverID: value.id,\n occluded: value.occluded,\n zOrder: value.z_order,\n points: value.points,\n outside: value.outside,\n attributes: value.attributes.reduce((attributeAccumulator, attr) => {\n attributeAccumulator[attr.spec_id] = attr.value;\n return attributeAccumulator;\n }, {}),\n };\n\n const z = this._getZ(value.frame);\n z.max = Math.max(z.max, value.z_order);\n z.min = Math.min(z.min, value.z_order);\n\n return shapeAccumulator;\n }, {});\n\n this.cache = {};\n }\n\n // Method is used to export data to the server\n toJSON() {\n const labelAttributes = this.label.attributes.reduce((accumulator, attribute) => {\n accumulator[attribute.id] = attribute;\n return accumulator;\n }, {});\n\n return {\n clientID: this.clientID,\n id: this.serverID,\n frame: this.frame,\n label_id: this.label.id,\n group: this.group,\n attributes: Object.keys(this.attributes).reduce((attributeAccumulator, attrId) => {\n if (!labelAttributes[attrId].mutable) {\n attributeAccumulator.push({\n spec_id: attrId,\n value: this.attributes[attrId],\n });\n }\n\n return attributeAccumulator;\n }, []),\n shapes: Object.keys(this.shapes).reduce((shapesAccumulator, frame) => {\n shapesAccumulator.push({\n type: this.shapeType,\n occluded: this.shapes[frame].occluded,\n z_order: this.shapes[frame].zOrder,\n points: [...this.shapes[frame].points],\n outside: this.shapes[frame].outside,\n attributes: Object.keys(this.shapes[frame].attributes)\n .reduce((attributeAccumulator, attrId) => {\n if (labelAttributes[attrId].mutable) {\n attributeAccumulator.push({\n spec_id: attrId,\n value: this.shapes[frame].attributes[attrId],\n });\n }\n\n return attributeAccumulator;\n }, []),\n id: this.shapes[frame].serverID,\n frame: +frame,\n });\n\n return shapesAccumulator;\n }, []),\n };\n }\n\n // Method is used to construct ObjectState objects\n get(frame) {\n if (!(frame in this.cache)) {\n const interpolation = Object.assign(\n {}, this.getPosition(frame),\n {\n attributes: this.getAttributes(frame),\n group: this.group,\n objectType: ObjectType.TRACK,\n shapeType: this.shapeType,\n clientID: this.clientID,\n serverID: this.serverID,\n lock: this.lock,\n color: this.color,\n visibility: this.visibility,\n },\n );\n\n this.cache[frame] = interpolation;\n }\n\n const result = JSON.parse(JSON.stringify(this.cache[frame]));\n result.label = this.label;\n return result;\n }\n\n neighborsFrames(targetFrame) {\n const frames = Object.keys(this.shapes).map(frame => +frame);\n let lDiff = Number.MAX_SAFE_INTEGER;\n let rDiff = Number.MAX_SAFE_INTEGER;\n\n for (const frame of frames) {\n const diff = Math.abs(targetFrame - frame);\n if (frame <= targetFrame && diff < lDiff) {\n lDiff = diff;\n } else if (diff < rDiff) {\n rDiff = diff;\n }\n }\n\n const leftFrame = lDiff === Number.MAX_SAFE_INTEGER ? null : targetFrame - lDiff;\n const rightFrame = rDiff === Number.MAX_SAFE_INTEGER ? null : targetFrame + rDiff;\n\n return {\n leftFrame,\n rightFrame,\n };\n }\n\n getAttributes(targetFrame) {\n const result = {};\n\n // First of all copy all unmutable attributes\n for (const attrID in this.attributes) {\n if (Object.prototype.hasOwnProperty.call(this.attributes, attrID)) {\n result[attrID] = this.attributes[attrID];\n }\n }\n\n // Secondly get latest mutable attributes up to target frame\n const frames = Object.keys(this.shapes).sort((a, b) => +a - +b);\n for (const frame of frames) {\n if (frame <= targetFrame) {\n const { attributes } = this.shapes[frame];\n\n for (const attrID in attributes) {\n if (Object.prototype.hasOwnProperty.call(attributes, attrID)) {\n result[attrID] = attributes[attrID];\n }\n }\n }\n }\n\n return result;\n }\n\n save(frame, data) {\n if (this.lock && data.lock) {\n return objectStateFactory.call(this, frame, this.get(frame));\n }\n\n // All changes are done in this temporary object\n const copy = Object.assign(this.get(frame));\n copy.attributes = Object.assign(copy.attributes);\n copy.points = [...copy.points];\n\n const updated = data.updateFlags;\n let positionUpdated = false;\n\n if (updated.label) {\n checkObjectType('label', data.label, null, Label);\n copy.label = data.label;\n copy.attributes = {};\n\n // Shape attributes will be removed later after all checks\n this.appendDefaultAttributes.call(copy, copy.label);\n }\n\n const labelAttributes = copy.label.attributes\n .reduce((accumulator, value) => {\n accumulator[value.id] = value;\n return accumulator;\n }, {});\n\n if (updated.attributes) {\n for (const attrID of Object.keys(data.attributes)) {\n const value = data.attributes[attrID];\n if (attrID in labelAttributes\n && validateAttributeValue(value, labelAttributes[attrID])) {\n copy.attributes[attrID] = value;\n } else {\n throw new ArgumentError(\n `Trying to save unknown attribute with id ${attrID} and value ${value}`,\n );\n }\n }\n }\n\n if (updated.points) {\n checkObjectType('points', data.points, null, Array);\n checkNumberOfPoints(this.shapeType, data.points);\n\n // cut points\n const { width, height } = this.frameMeta[frame];\n const cutPoints = [];\n for (let i = 0; i < data.points.length - 1; i += 2) {\n const x = data.points[i];\n const y = data.points[i + 1];\n\n checkObjectType('coordinate', x, 'number', null);\n checkObjectType('coordinate', y, 'number', null);\n\n cutPoints.push(\n Math.clamp(x, 0, width),\n Math.clamp(y, 0, height),\n );\n }\n\n if (checkShapeArea(this.shapeType, cutPoints)) {\n copy.points = cutPoints;\n positionUpdated = true;\n }\n }\n\n if (updated.occluded) {\n checkObjectType('occluded', data.occluded, 'boolean', null);\n copy.occluded = data.occluded;\n positionUpdated = true;\n }\n\n if (updated.outside) {\n checkObjectType('outside', data.outside, 'boolean', null);\n copy.outside = data.outside;\n positionUpdated = true;\n }\n\n if (updated.group) {\n checkObjectType('group', data.group, 'integer', null);\n copy.group = data.group;\n }\n\n if (updated.zOrder) {\n checkObjectType('zOrder', data.zOrder, 'integer', null);\n copy.zOrder = data.zOrder;\n positionUpdated = true;\n }\n\n if (updated.lock) {\n checkObjectType('lock', data.lock, 'boolean', null);\n copy.lock = data.lock;\n }\n\n if (updated.color) {\n checkObjectType('color', data.color, 'string', null);\n if (/^#[0-9A-F]{6}$/i.test(data.color)) {\n throw new ArgumentError(\n `Got invalid color value: \"${data.color}\"`,\n );\n }\n\n copy.color = data.color;\n }\n\n if (updated.visibility) {\n if (!isEnum.call(VisibleState, data.visibility)) {\n throw new ArgumentError(\n `Got invalid visibility value: \"${data.visibility}\"`,\n );\n }\n\n copy.visibility = data.visibility;\n }\n\n if (updated.keyframe) {\n // Just check here\n checkObjectType('keyframe', data.keyframe, 'boolean', null);\n }\n\n // Commit all changes\n for (const prop of Object.keys(copy)) {\n if (prop in this) {\n this[prop] = copy[prop];\n }\n\n this.cache[frame][prop] = copy[prop];\n }\n\n if (updated.attributes) {\n // Mutable attributes will be updated below\n for (const attrID of Object.keys(copy.attributes)) {\n if (!labelAttributes[attrID].mutable) {\n this.shapes[frame].attributes[attrID] = data.attributes[attrID];\n this.shapes[frame].attributes[attrID] = data.attributes[attrID];\n }\n }\n }\n\n if (updated.label) {\n for (const shape of Object.values(this.shapes)) {\n shape.attributes = {};\n }\n }\n\n // Remove keyframe\n if (updated.keyframe && !data.keyframe) {\n // Remove all cache after this keyframe because it have just become outdated\n for (const cacheFrame in this.cache) {\n if (+cacheFrame > frame) {\n delete this.cache[cacheFrame];\n }\n }\n\n this.cache[frame].keyframe = false;\n delete this.shapes[frame];\n updated.reset();\n\n return objectStateFactory.call(this, frame, this.get(frame));\n }\n\n // Add/update keyframe\n if (positionUpdated || (updated.keyframe && data.keyframe)) {\n // Remove all cache after this keyframe because it have just become outdated\n for (const cacheFrame in this.cache) {\n if (+cacheFrame > frame) {\n delete this.cache[cacheFrame];\n }\n }\n\n this.cache[frame].keyframe = true;\n data.keyframe = true;\n\n this.shapes[frame] = {\n frame,\n zOrder: copy.zOrder,\n points: copy.points,\n outside: copy.outside,\n occluded: copy.occluded,\n attributes: {},\n };\n\n if (updated.attributes) {\n // Unmutable attributes were updated above\n for (const attrID of Object.keys(copy.attributes)) {\n if (labelAttributes[attrID].mutable) {\n this.shapes[frame].attributes[attrID] = data.attributes[attrID];\n this.shapes[frame].attributes[attrID] = data.attributes[attrID];\n }\n }\n }\n }\n\n updated.reset();\n\n return objectStateFactory.call(this, frame, this.get(frame));\n }\n\n getPosition(targetFrame) {\n const {\n leftFrame,\n rightFrame,\n } = this.neighborsFrames(targetFrame);\n\n const rightPosition = Number.isInteger(rightFrame) ? this.shapes[rightFrame] : null;\n const leftPosition = Number.isInteger(leftFrame) ? this.shapes[leftFrame] : null;\n\n if (leftPosition && leftFrame === targetFrame) {\n return {\n points: [...leftPosition.points],\n occluded: leftPosition.occluded,\n outside: leftPosition.outside,\n zOrder: leftPosition.zOrder,\n keyframe: true,\n };\n }\n\n if (rightPosition && leftPosition) {\n return Object.assign({}, this.interpolatePosition(\n leftPosition,\n rightPosition,\n (targetFrame - leftFrame) / (rightFrame - leftFrame),\n ), {\n keyframe: false,\n });\n }\n\n if (rightPosition) {\n return {\n points: [...rightPosition.points],\n occluded: rightPosition.occluded,\n outside: true,\n zOrder: 0,\n keyframe: false,\n };\n }\n\n if (leftPosition) {\n return {\n points: [...leftPosition.points],\n occluded: leftPosition.occluded,\n outside: leftPosition.outside,\n zOrder: 0,\n keyframe: false,\n };\n }\n\n throw new ScriptingError(\n `No one neightbour frame found for the track with client ID: \"${this.id}\"`,\n );\n }\n\n delete(force) {\n if (!this.lock || force) {\n this.removed = true;\n this.resetCache();\n }\n\n return true;\n }\n\n resetCache() {\n this.cache = {};\n }\n }\n\n class Tag extends Annotation {\n constructor(data, clientID, injection) {\n super(data, clientID, injection);\n }\n\n // Method is used to export data to the server\n toJSON() {\n return {\n clientID: this.clientID,\n id: this.serverID,\n frame: this.frame,\n label_id: this.label.id,\n group: this.group,\n attributes: Object.keys(this.attributes).reduce((attributeAccumulator, attrId) => {\n attributeAccumulator.push({\n spec_id: attrId,\n value: this.attributes[attrId],\n });\n\n return attributeAccumulator;\n }, []),\n };\n }\n\n // Method is used to construct ObjectState objects\n get(frame) {\n if (frame !== this.frame) {\n throw new ScriptingError(\n 'Got frame is not equal to the frame of the shape',\n );\n }\n\n return {\n objectType: ObjectType.TAG,\n clientID: this.clientID,\n serverID: this.serverID,\n lock: this.lock,\n attributes: Object.assign({}, this.attributes),\n label: this.label,\n group: this.group,\n };\n }\n\n save(frame, data) {\n if (frame !== this.frame) {\n throw new ScriptingError(\n 'Got frame is not equal to the frame of the shape',\n );\n }\n\n if (this.lock && data.lock) {\n return objectStateFactory.call(this, frame, this.get(frame));\n }\n\n // All changes are done in this temporary object\n const copy = this.get(frame);\n const updated = data.updateFlags;\n\n if (updated.label) {\n checkObjectType('label', data.label, null, Label);\n copy.label = data.label;\n copy.attributes = {};\n this.appendDefaultAttributes.call(copy, copy.label);\n }\n\n if (updated.attributes) {\n const labelAttributes = copy.label\n .attributes.map(attr => `${attr.id}`);\n\n for (const attrID of Object.keys(data.attributes)) {\n if (labelAttributes.includes(attrID)) {\n copy.attributes[attrID] = data.attributes[attrID];\n }\n }\n }\n\n if (updated.group) {\n checkObjectType('group', data.group, 'integer', null);\n copy.group = data.group;\n }\n\n if (updated.lock) {\n checkObjectType('lock', data.lock, 'boolean', null);\n copy.lock = data.lock;\n }\n\n // Reset flags and commit all changes\n updated.reset();\n for (const prop of Object.keys(copy)) {\n if (prop in this) {\n this[prop] = copy[prop];\n }\n }\n\n return objectStateFactory.call(this, frame, this.get(frame));\n }\n }\n\n class RectangleShape extends Shape {\n constructor(data, clientID, color, injection) {\n super(data, clientID, color, injection);\n this.shapeType = ObjectShape.RECTANGLE;\n checkNumberOfPoints(this.shapeType, this.points);\n }\n\n static distance(points, x, y) {\n const [xtl, ytl, xbr, ybr] = points;\n\n if (!(x >= xtl && x <= xbr && y >= ytl && y <= ybr)) {\n // Cursor is outside of a box\n return null;\n }\n\n // The shortest distance from point to an edge\n return Math.min.apply(null, [x - xtl, y - ytl, xbr - x, ybr - y]);\n }\n }\n\n class PolyShape extends Shape {\n constructor(data, clientID, color, injection) {\n super(data, clientID, color, injection);\n }\n }\n\n class PolygonShape extends PolyShape {\n constructor(data, clientID, color, injection) {\n super(data, clientID, color, injection);\n this.shapeType = ObjectShape.POLYGON;\n checkNumberOfPoints(this.shapeType, this.points);\n }\n\n static distance(points, x, y) {\n function position(x1, y1, x2, y2) {\n return ((x2 - x1) * (y - y1) - (x - x1) * (y2 - y1));\n }\n\n let wn = 0;\n const distances = [];\n\n for (let i = 0, j = points.length - 2; i < points.length - 1; j = i, i += 2) {\n // Current point\n const x1 = points[j];\n const y1 = points[j + 1];\n\n // Next point\n const x2 = points[i];\n const y2 = points[i + 1];\n\n // Check if a point is inside a polygon\n // with a winding numbers algorithm\n // https://en.wikipedia.org/wiki/Point_in_polygon#Winding_number_algorithm\n if (y1 <= y) {\n if (y2 > y) {\n if (position(x1, y1, x2, y2) > 0) {\n wn++;\n }\n }\n } else if (y2 <= y) {\n if (position(x1, y1, x2, y2) < 0) {\n wn--;\n }\n }\n\n // Find the shortest distance from point to an edge\n // Get an equation of a line in general\n const aCoef = (y1 - y2);\n const bCoef = (x2 - x1);\n\n // Vector (aCoef, bCoef) is a perpendicular to line\n // Now find the point where two lines\n // (edge and its perpendicular through the point (x,y)) are cross\n const xCross = x - aCoef;\n const yCross = y - bCoef;\n\n if (((xCross - x1) * (x2 - xCross)) >= 0\n && ((yCross - y1) * (y2 - yCross)) >= 0) {\n // Cross point is on segment between p1(x1,y1) and p2(x2,y2)\n distances.push(Math.sqrt(\n Math.pow(x - xCross, 2)\n + Math.pow(y - yCross, 2),\n ));\n } else {\n distances.push(\n Math.min(\n Math.sqrt(Math.pow(x1 - x, 2) + Math.pow(y1 - y, 2)),\n Math.sqrt(Math.pow(x2 - x, 2) + Math.pow(y2 - y, 2)),\n ),\n );\n }\n }\n\n if (wn !== 0) {\n return Math.min.apply(null, distances);\n }\n\n return null;\n }\n }\n\n class PolylineShape extends PolyShape {\n constructor(data, clientID, color, injection) {\n super(data, clientID, color, injection);\n this.shapeType = ObjectShape.POLYLINE;\n checkNumberOfPoints(this.shapeType, this.points);\n }\n\n static distance(points, x, y) {\n const distances = [];\n for (let i = 0; i < points.length - 2; i += 2) {\n // Current point\n const x1 = points[i];\n const y1 = points[i + 1];\n\n // Next point\n const x2 = points[i + 2];\n const y2 = points[i + 3];\n\n // Find the shortest distance from point to an edge\n if (((x - x1) * (x2 - x)) >= 0 && ((y - y1) * (y2 - y)) >= 0) {\n // Find the length of a perpendicular\n // https://en.wikipedia.org/wiki/Distance_from_a_point_to_a_line\n distances.push(\n Math.abs((y2 - y1) * x - (x2 - x1) * y + x2 * y1 - y2 * x1) / Math\n .sqrt(Math.pow(y2 - y1, 2) + Math.pow(x2 - x1, 2)),\n );\n } else {\n // The link below works for lines (which have infinit length)\n // There is a case when perpendicular doesn't cross the edge\n // In this case we don't use the computed distance\n // Instead we use just distance to the nearest point\n distances.push(\n Math.min(\n Math.sqrt(Math.pow(x1 - x, 2) + Math.pow(y1 - y, 2)),\n Math.sqrt(Math.pow(x2 - x, 2) + Math.pow(y2 - y, 2)),\n ),\n );\n }\n }\n\n return Math.min.apply(null, distances);\n }\n }\n\n class PointsShape extends PolyShape {\n constructor(data, clientID, color, injection) {\n super(data, clientID, color, injection);\n this.shapeType = ObjectShape.POINTS;\n checkNumberOfPoints(this.shapeType, this.points);\n }\n\n static distance(points, x, y) {\n const distances = [];\n for (let i = 0; i < points.length; i += 2) {\n const x1 = points[i];\n const y1 = points[i + 1];\n\n distances.push(\n Math.sqrt(Math.pow(x1 - x, 2) + Math.pow(y1 - y, 2)),\n );\n }\n\n return Math.min.apply(null, distances);\n }\n }\n\n class RectangleTrack extends Track {\n constructor(data, clientID, color, injection) {\n super(data, clientID, color, injection);\n this.shapeType = ObjectShape.RECTANGLE;\n for (const shape of Object.values(this.shapes)) {\n checkNumberOfPoints(this.shapeType, shape.points);\n }\n }\n\n interpolatePosition(leftPosition, rightPosition, offset) {\n const positionOffset = [\n rightPosition.points[0] - leftPosition.points[0],\n rightPosition.points[1] - leftPosition.points[1],\n rightPosition.points[2] - leftPosition.points[2],\n rightPosition.points[3] - leftPosition.points[3],\n ];\n\n return { // xtl, ytl, xbr, ybr\n points: [\n leftPosition.points[0] + positionOffset[0] * offset,\n leftPosition.points[1] + positionOffset[1] * offset,\n leftPosition.points[2] + positionOffset[2] * offset,\n leftPosition.points[3] + positionOffset[3] * offset,\n ],\n occluded: leftPosition.occluded,\n outside: leftPosition.outside,\n zOrder: leftPosition.zOrder,\n };\n }\n }\n\n class PolyTrack extends Track {\n constructor(data, clientID, color, injection) {\n super(data, clientID, color, injection);\n }\n\n interpolatePosition(leftPosition, rightPosition, offset) {\n function findBox(points) {\n let xmin = Number.MAX_SAFE_INTEGER;\n let ymin = Number.MAX_SAFE_INTEGER;\n let xmax = Number.MIN_SAFE_INTEGER;\n let ymax = Number.MIN_SAFE_INTEGER;\n\n for (let i = 0; i < points.length; i += 2) {\n if (points[i] < xmin) xmin = points[i];\n if (points[i + 1] < ymin) ymin = points[i + 1];\n if (points[i] > xmax) xmax = points[i];\n if (points[i + 1] > ymax) ymax = points[i + 1];\n }\n\n return {\n xmin,\n ymin,\n xmax,\n ymax,\n };\n }\n\n function normalize(points, box) {\n const normalized = [];\n const width = box.xmax - box.xmin;\n const height = box.ymax - box.ymin;\n\n for (let i = 0; i < points.length; i += 2) {\n normalized.push(\n (points[i] - box.xmin) / width,\n (points[i + 1] - box.ymin) / height,\n );\n }\n\n return normalized;\n }\n\n function denormalize(points, box) {\n const denormalized = [];\n const width = box.xmax - box.xmin;\n const height = box.ymax - box.ymin;\n\n for (let i = 0; i < points.length; i += 2) {\n denormalized.push(\n points[i] * width + box.xmin,\n points[i + 1] * height + box.ymin,\n );\n }\n\n return denormalized;\n }\n\n function toPoints(array) {\n const points = [];\n for (let i = 0; i < array.length; i += 2) {\n points.push({\n x: array[i],\n y: array[i + 1],\n });\n }\n\n return points;\n }\n\n function toArray(points) {\n const array = [];\n for (const point of points) {\n array.push(point.x, point.y);\n }\n\n return array;\n }\n\n function computeDistances(source, target) {\n const distances = {};\n for (let i = 0; i < source.length; i++) {\n distances[i] = distances[i] || {};\n for (let j = 0; j < target.length; j++) {\n const dx = source[i].x - target[j].x;\n const dy = source[i].y - target[j].y;\n\n distances[i][j] = Math.sqrt(Math.pow(dx, 2) + Math.pow(dy, 2));\n }\n }\n\n return distances;\n }\n\n function truncateByThreshold(mapping, threshold) {\n for (const key of Object.keys(mapping)) {\n if (mapping[key].distance > threshold) {\n delete mapping[key];\n }\n }\n }\n\n // https://en.wikipedia.org/wiki/Stable_marriage_problem\n // TODO: One of important part of the algorithm is to correctly match\n // \"corner\" points. Thus it is possible for each of such point calculate\n // a descriptor (d) and use (x, y, d) to calculate the distance. One more\n // idea is to be sure that order or matched points is preserved. For example,\n // if p1 matches q1 and p2 matches q2 and between p1 and p2 we don't have any\n // points thus we should not have points between q1 and q2 as well.\n function stableMarriageProblem(men, women, distances) {\n const menPreferences = {};\n for (const man of men) {\n menPreferences[man] = women.concat()\n .sort((w1, w2) => distances[man][w1] - distances[man][w2]);\n }\n\n // Start alghoritm with max N^2 complexity\n const womenMaybe = {}; // id woman:id man,distance\n const menBusy = {}; // id man:boolean\n let prefIndex = 0;\n\n // While there is at least one free man\n while (Object.values(menBusy).length !== men.length) {\n // Every man makes offer to the best woman\n for (const man of men) {\n // The man have already found a woman\n if (menBusy[man]) {\n continue;\n }\n\n const woman = menPreferences[man][prefIndex];\n const distance = distances[man][woman];\n\n // A women chooses the best offer and says \"maybe\"\n if (woman in womenMaybe && womenMaybe[woman].distance > distance) {\n // A woman got better offer\n const prevChoice = womenMaybe[woman].value;\n delete womenMaybe[woman];\n delete menBusy[prevChoice];\n }\n\n if (!(woman in womenMaybe)) {\n womenMaybe[woman] = {\n value: man,\n distance,\n };\n\n menBusy[man] = true;\n }\n }\n\n prefIndex++;\n }\n\n const result = {};\n for (const woman of Object.keys(womenMaybe)) {\n result[womenMaybe[woman].value] = {\n value: woman,\n distance: womenMaybe[woman].distance,\n };\n }\n\n return result;\n }\n\n function getMapping(source, target) {\n function sumEdges(points) {\n let result = 0;\n for (let i = 1; i < points.length; i += 2) {\n const distance = Math.sqrt(Math.pow(points[i].x - points[i - 1].x, 2)\n + Math.pow(points[i].y - points[i - 1].y, 2));\n result += distance;\n }\n\n // Corner case when work with one point\n // Mapping in this case can't be wrong\n if (!result) {\n return Number.MAX_SAFE_INTEGER;\n }\n\n return result;\n }\n\n function computeDeviation(points, average) {\n let result = 0;\n for (let i = 1; i < points.length; i += 2) {\n const distance = Math.sqrt(Math.pow(points[i].x - points[i - 1].x, 2)\n + Math.pow(points[i].y - points[i - 1].y, 2));\n result += Math.pow(distance - average, 2);\n }\n\n return result;\n }\n\n const processedSource = [];\n const processedTarget = [];\n\n const distances = computeDistances(source, target);\n const mapping = stableMarriageProblem(Array.from(source.keys()),\n Array.from(target.keys()), distances);\n\n const average = (sumEdges(target)\n + sumEdges(source)) / (target.length + source.length);\n const meanSquareDeviation = Math.sqrt((computeDeviation(source, average)\n + computeDeviation(target, average)) / (source.length + target.length));\n const threshold = average + 3 * meanSquareDeviation; // 3 sigma rule\n truncateByThreshold(mapping, threshold);\n for (const key of Object.keys(mapping)) {\n mapping[key] = mapping[key].value;\n }\n\n // const receivingOrder = Object.keys(mapping).map(x => +x).sort((a,b) => a - b);\n const receivingOrder = this.appendMapping(mapping, source, target);\n\n for (const pointIdx of receivingOrder) {\n processedSource.push(source[pointIdx]);\n processedTarget.push(target[mapping[pointIdx]]);\n }\n\n return [processedSource, processedTarget];\n }\n\n let leftBox = findBox(leftPosition.points);\n let rightBox = findBox(rightPosition.points);\n\n // Sometimes (if shape has one point or shape is line),\n // We can get box with zero area\n // Next computation will be with NaN in this case\n // We have to prevent it\n const delta = 1;\n if (leftBox.xmax - leftBox.xmin < delta || rightBox.ymax - rightBox.ymin < delta) {\n leftBox = {\n xmin: 0,\n xmax: 1024, // TODO: Get actual image size\n ymin: 0,\n ymax: 768,\n };\n\n rightBox = leftBox;\n }\n\n const leftPoints = toPoints(normalize(leftPosition.points, leftBox));\n const rightPoints = toPoints(normalize(rightPosition.points, rightBox));\n\n let newLeftPoints = [];\n let newRightPoints = [];\n if (leftPoints.length > rightPoints.length) {\n const [\n processedRight,\n processedLeft,\n ] = getMapping.call(this, rightPoints, leftPoints);\n newLeftPoints = processedLeft;\n newRightPoints = processedRight;\n } else {\n const [\n processedLeft,\n processedRight,\n ] = getMapping.call(this, leftPoints, rightPoints);\n newLeftPoints = processedLeft;\n newRightPoints = processedRight;\n }\n\n const absoluteLeftPoints = denormalize(toArray(newLeftPoints), leftBox);\n const absoluteRightPoints = denormalize(toArray(newRightPoints), rightBox);\n\n const interpolation = [];\n for (let i = 0; i < absoluteLeftPoints.length; i++) {\n interpolation.push(absoluteLeftPoints[i] + (\n absoluteRightPoints[i] - absoluteLeftPoints[i]) * offset);\n }\n\n return {\n points: interpolation,\n occluded: leftPosition.occluded,\n outside: leftPosition.outside,\n zOrder: leftPosition.zOrder,\n };\n }\n\n // mapping is predicted order of points sourse_idx:target_idx\n // some points from source and target can absent in mapping\n // source, target - arrays of points. Target array size >= sourse array size\n appendMapping(mapping, source, target) {\n const targetMatched = Object.values(mapping).map(x => +x);\n const sourceMatched = Object.keys(mapping).map(x => +x);\n const orderForReceive = [];\n\n function findNeighbors(point) {\n let prev = point;\n let next = point;\n\n if (!targetMatched.length) {\n // Prevent infinity loop\n throw new ScriptingError('Interpolation mapping is empty');\n }\n\n while (!targetMatched.includes(prev)) {\n prev--;\n if (prev < 0) {\n prev = target.length - 1;\n }\n }\n\n while (!targetMatched.includes(next)) {\n next++;\n if (next >= target.length) {\n next = 0;\n }\n }\n\n return [prev, next];\n }\n\n function computeOffset(point, prev, next) {\n const pathPoints = [];\n\n while (prev !== next) {\n pathPoints.push(target[prev]);\n prev++;\n if (prev >= target.length) {\n prev = 0;\n }\n }\n pathPoints.push(target[next]);\n\n let curveLength = 0;\n let offset = 0;\n let iCrossed = false;\n for (let k = 1; k < pathPoints.length; k++) {\n const p1 = pathPoints[k];\n const p2 = pathPoints[k - 1];\n const distance = Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2));\n\n if (!iCrossed) {\n offset += distance;\n }\n curveLength += distance;\n if (target[point] === pathPoints[k]) {\n iCrossed = true;\n }\n }\n\n if (!curveLength) {\n return 0;\n }\n\n return offset / curveLength;\n }\n\n for (let i = 0; i < target.length; i++) {\n const index = targetMatched.indexOf(i);\n if (index === -1) {\n // We have to find a neighbours which have been mapped\n const [prev, next] = findNeighbors(i);\n\n // Now compute edge offset\n const offset = computeOffset(i, prev, next);\n\n // Get point between two neighbors points\n const prevPoint = target[prev];\n const nextPoint = target[next];\n const autoPoint = {\n x: prevPoint.x + (nextPoint.x - prevPoint.x) * offset,\n y: prevPoint.y + (nextPoint.y - prevPoint.y) * offset,\n };\n\n // Put it into matched\n source.push(autoPoint);\n mapping[source.length - 1] = i;\n orderForReceive.push(source.length - 1);\n } else {\n orderForReceive.push(sourceMatched[index]);\n }\n }\n\n return orderForReceive;\n }\n }\n\n class PolygonTrack extends PolyTrack {\n constructor(data, clientID, color, injection) {\n super(data, clientID, color, injection);\n this.shapeType = ObjectShape.POLYGON;\n for (const shape of Object.values(this.shapes)) {\n checkNumberOfPoints(this.shapeType, shape.points);\n }\n }\n }\n\n class PolylineTrack extends PolyTrack {\n constructor(data, clientID, color, injection) {\n super(data, clientID, color, injection);\n this.shapeType = ObjectShape.POLYLINE;\n for (const shape of Object.values(this.shapes)) {\n checkNumberOfPoints(this.shapeType, shape.points);\n }\n }\n }\n\n class PointsTrack extends PolyTrack {\n constructor(data, clientID, color, injection) {\n super(data, clientID, color, injection);\n this.shapeType = ObjectShape.POINTS;\n for (const shape of Object.values(this.shapes)) {\n checkNumberOfPoints(this.shapeType, shape.points);\n }\n }\n }\n\n RectangleTrack.distance = RectangleShape.distance;\n PolygonTrack.distance = PolygonShape.distance;\n PolylineTrack.distance = PolylineShape.distance;\n PointsTrack.distance = PointsShape.distance;\n\n module.exports = {\n RectangleShape,\n PolygonShape,\n PolylineShape,\n PointsShape,\n RectangleTrack,\n PolygonTrack,\n PolylineTrack,\n PointsTrack,\n Track,\n Shape,\n Tag,\n objectStateFactory,\n };\n})();\n","/*\n* Copyright (C) 2019 Intel Corporation\n* SPDX-License-Identifier: MIT\n*/\n\n/* global\n require:false\n*/\n\n(() => {\n const serverProxy = require('./server-proxy');\n const { Task } = require('./session');\n const { ScriptingError } = ('./exceptions');\n\n class AnnotationsSaver {\n constructor(version, collection, session) {\n this.sessionType = session instanceof Task ? 'task' : 'job';\n this.id = session.id;\n this.version = version;\n this.collection = collection;\n this.initialObjects = [];\n this.hash = this._getHash();\n\n // We need use data from export instead of initialData\n // Otherwise we have differ keys order and JSON comparison code incorrect\n const exported = this.collection.export();\n for (const shape of exported.shapes) {\n this.initialObjects[shape.id] = shape;\n }\n\n for (const track of exported.tracks) {\n this.initialObjects[track.id] = track;\n }\n\n for (const tag of exported.tags) {\n this.initialObjects[tag.id] = tag;\n }\n }\n\n _getHash() {\n const exported = this.collection.export();\n return JSON.stringify(exported);\n }\n\n async _request(data, action) {\n const result = await serverProxy.annotations.updateAnnotations(\n this.sessionType,\n this.id,\n data,\n action,\n );\n\n return result;\n }\n\n async _put(data) {\n const result = await this._request(data, 'put');\n return result;\n }\n\n async _create(created) {\n const result = await this._request(created, 'create');\n return result;\n }\n\n async _update(updated) {\n const result = await this._request(updated, 'update');\n return result;\n }\n\n async _delete(deleted) {\n const result = await this._request(deleted, 'delete');\n return result;\n }\n\n _split(exported) {\n const splitted = {\n created: {\n shapes: [],\n tracks: [],\n tags: [],\n },\n updated: {\n shapes: [],\n tracks: [],\n tags: [],\n },\n deleted: {\n shapes: [],\n tracks: [],\n tags: [],\n },\n };\n\n // Find created and updated objects\n for (const type of Object.keys(exported)) {\n for (const object of exported[type]) {\n if (object.id in this.initialObjects) {\n const exportedHash = JSON.stringify(object);\n const initialHash = JSON.stringify(this.initialObjects[object.id]);\n if (exportedHash !== initialHash) {\n splitted.updated[type].push(object);\n }\n } else if (typeof (object.id) === 'undefined') {\n splitted.created[type].push(object);\n } else {\n throw new ScriptingError(\n `Id of object is defined \"${object.id}\"`\n + 'but it absents in initial state',\n );\n }\n }\n }\n\n // Now find deleted objects\n const indexes = exported.tracks.concat(exported.shapes)\n .concat(exported.tags).map(object => object.id);\n\n for (const id of Object.keys(this.initialObjects)) {\n if (!indexes.includes(+id)) {\n const object = this.initialObjects[id];\n let type = null;\n if ('shapes' in object) {\n type = 'tracks';\n } else if ('points' in object) {\n type = 'shapes';\n } else {\n type = 'tags';\n }\n splitted.deleted[type].push(object);\n }\n }\n\n return splitted;\n }\n\n _updateCreatedObjects(saved, indexes) {\n const savedLength = saved.tracks.length\n + saved.shapes.length + saved.tags.length;\n\n const indexesLength = indexes.tracks.length\n + indexes.shapes.length + indexes.tags.length;\n\n if (indexesLength !== savedLength) {\n throw new ScriptingError(\n 'Number of indexes is differed by number of saved objects'\n + `${indexesLength} vs ${savedLength}`,\n );\n }\n\n // Updated IDs of created objects\n for (const type of Object.keys(indexes)) {\n for (let i = 0; i < indexes[type].length; i++) {\n const clientID = indexes[type][i];\n this.collection.objects[clientID].serverID = saved[type][i].id;\n if (type === 'tracks') {\n // We have to reset cache because of old value of serverID was saved there\n this.collection.objects[clientID].resetCache();\n }\n }\n }\n }\n\n _receiveIndexes(exported) {\n // Receive client indexes before saving\n const indexes = {\n tracks: exported.tracks.map(track => track.clientID),\n shapes: exported.shapes.map(shape => shape.clientID),\n tags: exported.tags.map(tag => tag.clientID),\n };\n\n // Remove them from the request body\n exported.tracks.concat(exported.shapes).concat(exported.tags)\n .map((value) => {\n delete value.clientID;\n return value;\n });\n\n return indexes;\n }\n\n async save(onUpdate) {\n if (typeof onUpdate !== 'function') {\n onUpdate = (message) => {\n console.log(message);\n };\n }\n\n try {\n const exported = this.collection.export();\n const { flush } = this.collection;\n if (flush) {\n onUpdate('New objects are being saved..');\n const indexes = this._receiveIndexes(exported);\n const savedData = await this._put(Object.assign({}, exported, {\n version: this.version,\n }));\n this.version = savedData.version;\n this.collection.flush = false;\n\n onUpdate('Saved objects are being updated in the client');\n this._updateCreatedObjects(savedData, indexes);\n\n onUpdate('Initial state is being updated');\n for (const object of savedData.shapes\n .concat(savedData.tracks).concat(savedData.tags)) {\n this.initialObjects[object.id] = object;\n }\n } else {\n const {\n created,\n updated,\n deleted,\n } = this._split(exported);\n\n onUpdate('New objects are being saved..');\n const indexes = this._receiveIndexes(created);\n const createdData = await this._create(Object.assign({}, created, {\n version: this.version,\n }));\n this.version = createdData.version;\n\n onUpdate('Saved objects are being updated in the client');\n this._updateCreatedObjects(createdData, indexes);\n\n onUpdate('Initial state is being updated');\n for (const object of createdData.shapes\n .concat(createdData.tracks).concat(createdData.tags)) {\n this.initialObjects[object.id] = object;\n }\n\n onUpdate('Changed objects are being saved..');\n this._receiveIndexes(updated);\n const updatedData = await this._update(Object.assign({}, updated, {\n version: this.version,\n }));\n this.version = createdData.version;\n\n onUpdate('Initial state is being updated');\n for (const object of updatedData.shapes\n .concat(updatedData.tracks).concat(updatedData.tags)) {\n this.initialObjects[object.id] = object;\n }\n\n onUpdate('Changed objects are being saved..');\n this._receiveIndexes(deleted);\n const deletedData = await this._delete(Object.assign({}, deleted, {\n version: this.version,\n }));\n this._version = deletedData.version;\n\n onUpdate('Initial state is being updated');\n for (const object of deletedData.shapes\n .concat(deletedData.tracks).concat(deletedData.tags)) {\n delete this.initialObjects[object.id];\n }\n }\n\n this.hash = this._getHash();\n onUpdate('Saving is done');\n } catch (error) {\n onUpdate(`Can not save annotations: ${error.message}`);\n throw error;\n }\n }\n\n hasUnsavedChanges() {\n return this._getHash() !== this.hash;\n }\n }\n\n module.exports = AnnotationsSaver;\n})();\n","/*\n* Copyright (C) 2019 Intel Corporation\n* SPDX-License-Identifier: MIT\n*/\n\n/* eslint prefer-arrow-callback: [ \"error\", { \"allowNamedFunctions\": true } ] */\n\n/* global\n require:false\n*/\n\n\n(() => {\n const PluginRegistry = require('./plugins');\n const serverProxy = require('./server-proxy');\n const {\n isBoolean,\n isInteger,\n isEnum,\n isString,\n checkFilter,\n } = require('./common');\n\n const {\n TaskStatus,\n TaskMode,\n } = require('./enums');\n\n const User = require('./user');\n const { AnnotationFormat } = require('./annotation-format.js');\n const { ArgumentError } = require('./exceptions');\n const { Task } = require('./session');\n\n function implementAPI(cvat) {\n cvat.plugins.list.implementation = PluginRegistry.list;\n cvat.plugins.register.implementation = PluginRegistry.register.bind(cvat);\n\n cvat.server.about.implementation = async () => {\n const result = await serverProxy.server.about();\n return result;\n };\n\n cvat.server.share.implementation = async (directory) => {\n const result = await serverProxy.server.share(directory);\n return result;\n };\n\n cvat.server.formats.implementation = async () => {\n const result = await serverProxy.server.formats();\n return result.map(el => new AnnotationFormat(el));\n };\n\n cvat.server.register.implementation = async (username, firstName, lastName,\n email, password1, password2) => {\n await serverProxy.server.register(username, firstName, lastName, email,\n password1, password2);\n };\n\n cvat.server.login.implementation = async (username, password) => {\n await serverProxy.server.login(username, password);\n };\n\n cvat.server.logout.implementation = async () => {\n await serverProxy.server.logout();\n };\n\n cvat.server.authorized.implementation = async () => {\n const result = await serverProxy.server.authorized();\n return result;\n };\n\n cvat.users.get.implementation = async (filter) => {\n checkFilter(filter, {\n self: isBoolean,\n });\n\n let users = null;\n if ('self' in filter && filter.self) {\n users = await serverProxy.users.getSelf();\n users = [users];\n } else {\n users = await serverProxy.users.getUsers();\n }\n\n users = users.map(user => new User(user));\n return users;\n };\n\n cvat.jobs.get.implementation = async (filter) => {\n checkFilter(filter, {\n taskID: isInteger,\n jobID: isInteger,\n });\n\n if (('taskID' in filter) && ('jobID' in filter)) {\n throw new ArgumentError(\n 'Only one of fields \"taskID\" and \"jobID\" allowed simultaneously',\n );\n }\n\n if (!Object.keys(filter).length) {\n throw new ArgumentError(\n 'Job filter must not be empty',\n );\n }\n\n let tasks = null;\n if ('taskID' in filter) {\n tasks = await serverProxy.tasks.getTasks(`id=${filter.taskID}`);\n } else {\n const job = await serverProxy.jobs.getJob(filter.jobID);\n if (typeof (job.task_id) !== 'undefined') {\n tasks = await serverProxy.tasks.getTasks(`id=${job.task_id}`);\n }\n }\n\n // If task was found by its id, then create task instance and get Job instance from it\n if (tasks !== null && tasks.length) {\n const task = new Task(tasks[0]);\n return filter.jobID ? task.jobs.filter(job => job.id === filter.jobID) : task.jobs;\n }\n\n return [];\n };\n\n cvat.tasks.get.implementation = async (filter) => {\n checkFilter(filter, {\n page: isInteger,\n name: isString,\n id: isInteger,\n owner: isString,\n assignee: isString,\n search: isString,\n status: isEnum.bind(TaskStatus),\n mode: isEnum.bind(TaskMode),\n });\n\n if ('search' in filter && Object.keys(filter).length > 1) {\n if (!('page' in filter && Object.keys(filter).length === 2)) {\n throw new ArgumentError(\n 'Do not use the filter field \"search\" with others',\n );\n }\n }\n\n if ('id' in filter && Object.keys(filter).length > 1) {\n if (!('page' in filter && Object.keys(filter).length === 2)) {\n throw new ArgumentError(\n 'Do not use the filter field \"id\" with others',\n );\n }\n }\n\n const searchParams = new URLSearchParams();\n for (const field of ['name', 'owner', 'assignee', 'search', 'status', 'mode', 'id', 'page']) {\n if (Object.prototype.hasOwnProperty.call(filter, field)) {\n searchParams.set(field, filter[field]);\n }\n }\n\n const tasksData = await serverProxy.tasks.getTasks(searchParams.toString());\n const tasks = tasksData.map(task => new Task(task));\n tasks.count = tasksData.count;\n\n return tasks;\n };\n\n return cvat;\n }\n\n module.exports = implementAPI;\n})();\n","'use strict';\n// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\nrequire('../modules/es.string.iterator');\nvar $ = require('../internals/export');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar USE_NATIVE_URL = require('../internals/native-url');\nvar global = require('../internals/global');\nvar defineProperties = require('../internals/object-define-properties');\nvar redefine = require('../internals/redefine');\nvar anInstance = require('../internals/an-instance');\nvar has = require('../internals/has');\nvar assign = require('../internals/object-assign');\nvar arrayFrom = require('../internals/array-from');\nvar codeAt = require('../internals/string-multibyte').codeAt;\nvar toASCII = require('../internals/punycode-to-ascii');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar URLSearchParamsModule = require('../modules/web.url-search-params');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar NativeURL = global.URL;\nvar URLSearchParams = URLSearchParamsModule.URLSearchParams;\nvar getInternalSearchParamsState = URLSearchParamsModule.getState;\nvar setInternalState = InternalStateModule.set;\nvar getInternalURLState = InternalStateModule.getterFor('URL');\nvar floor = Math.floor;\nvar pow = Math.pow;\n\nvar INVALID_AUTHORITY = 'Invalid authority';\nvar INVALID_SCHEME = 'Invalid scheme';\nvar INVALID_HOST = 'Invalid host';\nvar INVALID_PORT = 'Invalid port';\n\nvar ALPHA = /[A-Za-z]/;\nvar ALPHANUMERIC = /[\\d+\\-.A-Za-z]/;\nvar DIGIT = /\\d/;\nvar HEX_START = /^(0x|0X)/;\nvar OCT = /^[0-7]+$/;\nvar DEC = /^\\d+$/;\nvar HEX = /^[\\dA-Fa-f]+$/;\n// eslint-disable-next-line no-control-regex\nvar FORBIDDEN_HOST_CODE_POINT = /[\\u0000\\u0009\\u000A\\u000D #%/:?@[\\\\]]/;\n// eslint-disable-next-line no-control-regex\nvar FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT = /[\\u0000\\u0009\\u000A\\u000D #/:?@[\\\\]]/;\n// eslint-disable-next-line no-control-regex\nvar LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE = /^[\\u0000-\\u001F ]+|[\\u0000-\\u001F ]+$/g;\n// eslint-disable-next-line no-control-regex\nvar TAB_AND_NEW_LINE = /[\\u0009\\u000A\\u000D]/g;\nvar EOF;\n\nvar parseHost = function (url, input) {\n var result, codePoints, index;\n if (input.charAt(0) == '[') {\n if (input.charAt(input.length - 1) != ']') return INVALID_HOST;\n result = parseIPv6(input.slice(1, -1));\n if (!result) return INVALID_HOST;\n url.host = result;\n // opaque host\n } else if (!isSpecial(url)) {\n if (FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT.test(input)) return INVALID_HOST;\n result = '';\n codePoints = arrayFrom(input);\n for (index = 0; index < codePoints.length; index++) {\n result += percentEncode(codePoints[index], C0ControlPercentEncodeSet);\n }\n url.host = result;\n } else {\n input = toASCII(input);\n if (FORBIDDEN_HOST_CODE_POINT.test(input)) return INVALID_HOST;\n result = parseIPv4(input);\n if (result === null) return INVALID_HOST;\n url.host = result;\n }\n};\n\nvar parseIPv4 = function (input) {\n var parts = input.split('.');\n var partsLength, numbers, index, part, radix, number, ipv4;\n if (parts.length && parts[parts.length - 1] == '') {\n parts.pop();\n }\n partsLength = parts.length;\n if (partsLength > 4) return input;\n numbers = [];\n for (index = 0; index < partsLength; index++) {\n part = parts[index];\n if (part == '') return input;\n radix = 10;\n if (part.length > 1 && part.charAt(0) == '0') {\n radix = HEX_START.test(part) ? 16 : 8;\n part = part.slice(radix == 8 ? 1 : 2);\n }\n if (part === '') {\n number = 0;\n } else {\n if (!(radix == 10 ? DEC : radix == 8 ? OCT : HEX).test(part)) return input;\n number = parseInt(part, radix);\n }\n numbers.push(number);\n }\n for (index = 0; index < partsLength; index++) {\n number = numbers[index];\n if (index == partsLength - 1) {\n if (number >= pow(256, 5 - partsLength)) return null;\n } else if (number > 255) return null;\n }\n ipv4 = numbers.pop();\n for (index = 0; index < numbers.length; index++) {\n ipv4 += numbers[index] * pow(256, 3 - index);\n }\n return ipv4;\n};\n\n// eslint-disable-next-line max-statements\nvar parseIPv6 = function (input) {\n var address = [0, 0, 0, 0, 0, 0, 0, 0];\n var pieceIndex = 0;\n var compress = null;\n var pointer = 0;\n var value, length, numbersSeen, ipv4Piece, number, swaps, swap;\n\n var char = function () {\n return input.charAt(pointer);\n };\n\n if (char() == ':') {\n if (input.charAt(1) != ':') return;\n pointer += 2;\n pieceIndex++;\n compress = pieceIndex;\n }\n while (char()) {\n if (pieceIndex == 8) return;\n if (char() == ':') {\n if (compress !== null) return;\n pointer++;\n pieceIndex++;\n compress = pieceIndex;\n continue;\n }\n value = length = 0;\n while (length < 4 && HEX.test(char())) {\n value = value * 16 + parseInt(char(), 16);\n pointer++;\n length++;\n }\n if (char() == '.') {\n if (length == 0) return;\n pointer -= length;\n if (pieceIndex > 6) return;\n numbersSeen = 0;\n while (char()) {\n ipv4Piece = null;\n if (numbersSeen > 0) {\n if (char() == '.' && numbersSeen < 4) pointer++;\n else return;\n }\n if (!DIGIT.test(char())) return;\n while (DIGIT.test(char())) {\n number = parseInt(char(), 10);\n if (ipv4Piece === null) ipv4Piece = number;\n else if (ipv4Piece == 0) return;\n else ipv4Piece = ipv4Piece * 10 + number;\n if (ipv4Piece > 255) return;\n pointer++;\n }\n address[pieceIndex] = address[pieceIndex] * 256 + ipv4Piece;\n numbersSeen++;\n if (numbersSeen == 2 || numbersSeen == 4) pieceIndex++;\n }\n if (numbersSeen != 4) return;\n break;\n } else if (char() == ':') {\n pointer++;\n if (!char()) return;\n } else if (char()) return;\n address[pieceIndex++] = value;\n }\n if (compress !== null) {\n swaps = pieceIndex - compress;\n pieceIndex = 7;\n while (pieceIndex != 0 && swaps > 0) {\n swap = address[pieceIndex];\n address[pieceIndex--] = address[compress + swaps - 1];\n address[compress + --swaps] = swap;\n }\n } else if (pieceIndex != 8) return;\n return address;\n};\n\nvar findLongestZeroSequence = function (ipv6) {\n var maxIndex = null;\n var maxLength = 1;\n var currStart = null;\n var currLength = 0;\n var index = 0;\n for (; index < 8; index++) {\n if (ipv6[index] !== 0) {\n if (currLength > maxLength) {\n maxIndex = currStart;\n maxLength = currLength;\n }\n currStart = null;\n currLength = 0;\n } else {\n if (currStart === null) currStart = index;\n ++currLength;\n }\n }\n if (currLength > maxLength) {\n maxIndex = currStart;\n maxLength = currLength;\n }\n return maxIndex;\n};\n\nvar serializeHost = function (host) {\n var result, index, compress, ignore0;\n // ipv4\n if (typeof host == 'number') {\n result = [];\n for (index = 0; index < 4; index++) {\n result.unshift(host % 256);\n host = floor(host / 256);\n } return result.join('.');\n // ipv6\n } else if (typeof host == 'object') {\n result = '';\n compress = findLongestZeroSequence(host);\n for (index = 0; index < 8; index++) {\n if (ignore0 && host[index] === 0) continue;\n if (ignore0) ignore0 = false;\n if (compress === index) {\n result += index ? ':' : '::';\n ignore0 = true;\n } else {\n result += host[index].toString(16);\n if (index < 7) result += ':';\n }\n }\n return '[' + result + ']';\n } return host;\n};\n\nvar C0ControlPercentEncodeSet = {};\nvar fragmentPercentEncodeSet = assign({}, C0ControlPercentEncodeSet, {\n ' ': 1, '\"': 1, '<': 1, '>': 1, '`': 1\n});\nvar pathPercentEncodeSet = assign({}, fragmentPercentEncodeSet, {\n '#': 1, '?': 1, '{': 1, '}': 1\n});\nvar userinfoPercentEncodeSet = assign({}, pathPercentEncodeSet, {\n '/': 1, ':': 1, ';': 1, '=': 1, '@': 1, '[': 1, '\\\\': 1, ']': 1, '^': 1, '|': 1\n});\n\nvar percentEncode = function (char, set) {\n var code = codeAt(char, 0);\n return code > 0x20 && code < 0x7F && !has(set, char) ? char : encodeURIComponent(char);\n};\n\nvar specialSchemes = {\n ftp: 21,\n file: null,\n gopher: 70,\n http: 80,\n https: 443,\n ws: 80,\n wss: 443\n};\n\nvar isSpecial = function (url) {\n return has(specialSchemes, url.scheme);\n};\n\nvar includesCredentials = function (url) {\n return url.username != '' || url.password != '';\n};\n\nvar cannotHaveUsernamePasswordPort = function (url) {\n return !url.host || url.cannotBeABaseURL || url.scheme == 'file';\n};\n\nvar isWindowsDriveLetter = function (string, normalized) {\n var second;\n return string.length == 2 && ALPHA.test(string.charAt(0))\n && ((second = string.charAt(1)) == ':' || (!normalized && second == '|'));\n};\n\nvar startsWithWindowsDriveLetter = function (string) {\n var third;\n return string.length > 1 && isWindowsDriveLetter(string.slice(0, 2)) && (\n string.length == 2 ||\n ((third = string.charAt(2)) === '/' || third === '\\\\' || third === '?' || third === '#')\n );\n};\n\nvar shortenURLsPath = function (url) {\n var path = url.path;\n var pathSize = path.length;\n if (pathSize && (url.scheme != 'file' || pathSize != 1 || !isWindowsDriveLetter(path[0], true))) {\n path.pop();\n }\n};\n\nvar isSingleDot = function (segment) {\n return segment === '.' || segment.toLowerCase() === '%2e';\n};\n\nvar isDoubleDot = function (segment) {\n segment = segment.toLowerCase();\n return segment === '..' || segment === '%2e.' || segment === '.%2e' || segment === '%2e%2e';\n};\n\n// States:\nvar SCHEME_START = {};\nvar SCHEME = {};\nvar NO_SCHEME = {};\nvar SPECIAL_RELATIVE_OR_AUTHORITY = {};\nvar PATH_OR_AUTHORITY = {};\nvar RELATIVE = {};\nvar RELATIVE_SLASH = {};\nvar SPECIAL_AUTHORITY_SLASHES = {};\nvar SPECIAL_AUTHORITY_IGNORE_SLASHES = {};\nvar AUTHORITY = {};\nvar HOST = {};\nvar HOSTNAME = {};\nvar PORT = {};\nvar FILE = {};\nvar FILE_SLASH = {};\nvar FILE_HOST = {};\nvar PATH_START = {};\nvar PATH = {};\nvar CANNOT_BE_A_BASE_URL_PATH = {};\nvar QUERY = {};\nvar FRAGMENT = {};\n\n// eslint-disable-next-line max-statements\nvar parseURL = function (url, input, stateOverride, base) {\n var state = stateOverride || SCHEME_START;\n var pointer = 0;\n var buffer = '';\n var seenAt = false;\n var seenBracket = false;\n var seenPasswordToken = false;\n var codePoints, char, bufferCodePoints, failure;\n\n if (!stateOverride) {\n url.scheme = '';\n url.username = '';\n url.password = '';\n url.host = null;\n url.port = null;\n url.path = [];\n url.query = null;\n url.fragment = null;\n url.cannotBeABaseURL = false;\n input = input.replace(LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE, '');\n }\n\n input = input.replace(TAB_AND_NEW_LINE, '');\n\n codePoints = arrayFrom(input);\n\n while (pointer <= codePoints.length) {\n char = codePoints[pointer];\n switch (state) {\n case SCHEME_START:\n if (char && ALPHA.test(char)) {\n buffer += char.toLowerCase();\n state = SCHEME;\n } else if (!stateOverride) {\n state = NO_SCHEME;\n continue;\n } else return INVALID_SCHEME;\n break;\n\n case SCHEME:\n if (char && (ALPHANUMERIC.test(char) || char == '+' || char == '-' || char == '.')) {\n buffer += char.toLowerCase();\n } else if (char == ':') {\n if (stateOverride && (\n (isSpecial(url) != has(specialSchemes, buffer)) ||\n (buffer == 'file' && (includesCredentials(url) || url.port !== null)) ||\n (url.scheme == 'file' && !url.host)\n )) return;\n url.scheme = buffer;\n if (stateOverride) {\n if (isSpecial(url) && specialSchemes[url.scheme] == url.port) url.port = null;\n return;\n }\n buffer = '';\n if (url.scheme == 'file') {\n state = FILE;\n } else if (isSpecial(url) && base && base.scheme == url.scheme) {\n state = SPECIAL_RELATIVE_OR_AUTHORITY;\n } else if (isSpecial(url)) {\n state = SPECIAL_AUTHORITY_SLASHES;\n } else if (codePoints[pointer + 1] == '/') {\n state = PATH_OR_AUTHORITY;\n pointer++;\n } else {\n url.cannotBeABaseURL = true;\n url.path.push('');\n state = CANNOT_BE_A_BASE_URL_PATH;\n }\n } else if (!stateOverride) {\n buffer = '';\n state = NO_SCHEME;\n pointer = 0;\n continue;\n } else return INVALID_SCHEME;\n break;\n\n case NO_SCHEME:\n if (!base || (base.cannotBeABaseURL && char != '#')) return INVALID_SCHEME;\n if (base.cannotBeABaseURL && char == '#') {\n url.scheme = base.scheme;\n url.path = base.path.slice();\n url.query = base.query;\n url.fragment = '';\n url.cannotBeABaseURL = true;\n state = FRAGMENT;\n break;\n }\n state = base.scheme == 'file' ? FILE : RELATIVE;\n continue;\n\n case SPECIAL_RELATIVE_OR_AUTHORITY:\n if (char == '/' && codePoints[pointer + 1] == '/') {\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n pointer++;\n } else {\n state = RELATIVE;\n continue;\n } break;\n\n case PATH_OR_AUTHORITY:\n if (char == '/') {\n state = AUTHORITY;\n break;\n } else {\n state = PATH;\n continue;\n }\n\n case RELATIVE:\n url.scheme = base.scheme;\n if (char == EOF) {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.query = base.query;\n } else if (char == '/' || (char == '\\\\' && isSpecial(url))) {\n state = RELATIVE_SLASH;\n } else if (char == '?') {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.query = base.query;\n url.fragment = '';\n state = FRAGMENT;\n } else {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.path.pop();\n state = PATH;\n continue;\n } break;\n\n case RELATIVE_SLASH:\n if (isSpecial(url) && (char == '/' || char == '\\\\')) {\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n } else if (char == '/') {\n state = AUTHORITY;\n } else {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n state = PATH;\n continue;\n } break;\n\n case SPECIAL_AUTHORITY_SLASHES:\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n if (char != '/' || buffer.charAt(pointer + 1) != '/') continue;\n pointer++;\n break;\n\n case SPECIAL_AUTHORITY_IGNORE_SLASHES:\n if (char != '/' && char != '\\\\') {\n state = AUTHORITY;\n continue;\n } break;\n\n case AUTHORITY:\n if (char == '@') {\n if (seenAt) buffer = '%40' + buffer;\n seenAt = true;\n bufferCodePoints = arrayFrom(buffer);\n for (var i = 0; i < bufferCodePoints.length; i++) {\n var codePoint = bufferCodePoints[i];\n if (codePoint == ':' && !seenPasswordToken) {\n seenPasswordToken = true;\n continue;\n }\n var encodedCodePoints = percentEncode(codePoint, userinfoPercentEncodeSet);\n if (seenPasswordToken) url.password += encodedCodePoints;\n else url.username += encodedCodePoints;\n }\n buffer = '';\n } else if (\n char == EOF || char == '/' || char == '?' || char == '#' ||\n (char == '\\\\' && isSpecial(url))\n ) {\n if (seenAt && buffer == '') return INVALID_AUTHORITY;\n pointer -= arrayFrom(buffer).length + 1;\n buffer = '';\n state = HOST;\n } else buffer += char;\n break;\n\n case HOST:\n case HOSTNAME:\n if (stateOverride && url.scheme == 'file') {\n state = FILE_HOST;\n continue;\n } else if (char == ':' && !seenBracket) {\n if (buffer == '') return INVALID_HOST;\n failure = parseHost(url, buffer);\n if (failure) return failure;\n buffer = '';\n state = PORT;\n if (stateOverride == HOSTNAME) return;\n } else if (\n char == EOF || char == '/' || char == '?' || char == '#' ||\n (char == '\\\\' && isSpecial(url))\n ) {\n if (isSpecial(url) && buffer == '') return INVALID_HOST;\n if (stateOverride && buffer == '' && (includesCredentials(url) || url.port !== null)) return;\n failure = parseHost(url, buffer);\n if (failure) return failure;\n buffer = '';\n state = PATH_START;\n if (stateOverride) return;\n continue;\n } else {\n if (char == '[') seenBracket = true;\n else if (char == ']') seenBracket = false;\n buffer += char;\n } break;\n\n case PORT:\n if (DIGIT.test(char)) {\n buffer += char;\n } else if (\n char == EOF || char == '/' || char == '?' || char == '#' ||\n (char == '\\\\' && isSpecial(url)) ||\n stateOverride\n ) {\n if (buffer != '') {\n var port = parseInt(buffer, 10);\n if (port > 0xFFFF) return INVALID_PORT;\n url.port = (isSpecial(url) && port === specialSchemes[url.scheme]) ? null : port;\n buffer = '';\n }\n if (stateOverride) return;\n state = PATH_START;\n continue;\n } else return INVALID_PORT;\n break;\n\n case FILE:\n url.scheme = 'file';\n if (char == '/' || char == '\\\\') state = FILE_SLASH;\n else if (base && base.scheme == 'file') {\n if (char == EOF) {\n url.host = base.host;\n url.path = base.path.slice();\n url.query = base.query;\n } else if (char == '?') {\n url.host = base.host;\n url.path = base.path.slice();\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.host = base.host;\n url.path = base.path.slice();\n url.query = base.query;\n url.fragment = '';\n state = FRAGMENT;\n } else {\n if (!startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) {\n url.host = base.host;\n url.path = base.path.slice();\n shortenURLsPath(url);\n }\n state = PATH;\n continue;\n }\n } else {\n state = PATH;\n continue;\n } break;\n\n case FILE_SLASH:\n if (char == '/' || char == '\\\\') {\n state = FILE_HOST;\n break;\n }\n if (base && base.scheme == 'file' && !startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) {\n if (isWindowsDriveLetter(base.path[0], true)) url.path.push(base.path[0]);\n else url.host = base.host;\n }\n state = PATH;\n continue;\n\n case FILE_HOST:\n if (char == EOF || char == '/' || char == '\\\\' || char == '?' || char == '#') {\n if (!stateOverride && isWindowsDriveLetter(buffer)) {\n state = PATH;\n } else if (buffer == '') {\n url.host = '';\n if (stateOverride) return;\n state = PATH_START;\n } else {\n failure = parseHost(url, buffer);\n if (failure) return failure;\n if (url.host == 'localhost') url.host = '';\n if (stateOverride) return;\n buffer = '';\n state = PATH_START;\n } continue;\n } else buffer += char;\n break;\n\n case PATH_START:\n if (isSpecial(url)) {\n state = PATH;\n if (char != '/' && char != '\\\\') continue;\n } else if (!stateOverride && char == '?') {\n url.query = '';\n state = QUERY;\n } else if (!stateOverride && char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (char != EOF) {\n state = PATH;\n if (char != '/') continue;\n } break;\n\n case PATH:\n if (\n char == EOF || char == '/' ||\n (char == '\\\\' && isSpecial(url)) ||\n (!stateOverride && (char == '?' || char == '#'))\n ) {\n if (isDoubleDot(buffer)) {\n shortenURLsPath(url);\n if (char != '/' && !(char == '\\\\' && isSpecial(url))) {\n url.path.push('');\n }\n } else if (isSingleDot(buffer)) {\n if (char != '/' && !(char == '\\\\' && isSpecial(url))) {\n url.path.push('');\n }\n } else {\n if (url.scheme == 'file' && !url.path.length && isWindowsDriveLetter(buffer)) {\n if (url.host) url.host = '';\n buffer = buffer.charAt(0) + ':'; // normalize windows drive letter\n }\n url.path.push(buffer);\n }\n buffer = '';\n if (url.scheme == 'file' && (char == EOF || char == '?' || char == '#')) {\n while (url.path.length > 1 && url.path[0] === '') {\n url.path.shift();\n }\n }\n if (char == '?') {\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n }\n } else {\n buffer += percentEncode(char, pathPercentEncodeSet);\n } break;\n\n case CANNOT_BE_A_BASE_URL_PATH:\n if (char == '?') {\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (char != EOF) {\n url.path[0] += percentEncode(char, C0ControlPercentEncodeSet);\n } break;\n\n case QUERY:\n if (!stateOverride && char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (char != EOF) {\n if (char == \"'\" && isSpecial(url)) url.query += '%27';\n else if (char == '#') url.query += '%23';\n else url.query += percentEncode(char, C0ControlPercentEncodeSet);\n } break;\n\n case FRAGMENT:\n if (char != EOF) url.fragment += percentEncode(char, fragmentPercentEncodeSet);\n break;\n }\n\n pointer++;\n }\n};\n\n// `URL` constructor\n// https://url.spec.whatwg.org/#url-class\nvar URLConstructor = function URL(url /* , base */) {\n var that = anInstance(this, URLConstructor, 'URL');\n var base = arguments.length > 1 ? arguments[1] : undefined;\n var urlString = String(url);\n var state = setInternalState(that, { type: 'URL' });\n var baseState, failure;\n if (base !== undefined) {\n if (base instanceof URLConstructor) baseState = getInternalURLState(base);\n else {\n failure = parseURL(baseState = {}, String(base));\n if (failure) throw TypeError(failure);\n }\n }\n failure = parseURL(state, urlString, null, baseState);\n if (failure) throw TypeError(failure);\n var searchParams = state.searchParams = new URLSearchParams();\n var searchParamsState = getInternalSearchParamsState(searchParams);\n searchParamsState.updateSearchParams(state.query);\n searchParamsState.updateURL = function () {\n state.query = String(searchParams) || null;\n };\n if (!DESCRIPTORS) {\n that.href = serializeURL.call(that);\n that.origin = getOrigin.call(that);\n that.protocol = getProtocol.call(that);\n that.username = getUsername.call(that);\n that.password = getPassword.call(that);\n that.host = getHost.call(that);\n that.hostname = getHostname.call(that);\n that.port = getPort.call(that);\n that.pathname = getPathname.call(that);\n that.search = getSearch.call(that);\n that.searchParams = getSearchParams.call(that);\n that.hash = getHash.call(that);\n }\n};\n\nvar URLPrototype = URLConstructor.prototype;\n\nvar serializeURL = function () {\n var url = getInternalURLState(this);\n var scheme = url.scheme;\n var username = url.username;\n var password = url.password;\n var host = url.host;\n var port = url.port;\n var path = url.path;\n var query = url.query;\n var fragment = url.fragment;\n var output = scheme + ':';\n if (host !== null) {\n output += '//';\n if (includesCredentials(url)) {\n output += username + (password ? ':' + password : '') + '@';\n }\n output += serializeHost(host);\n if (port !== null) output += ':' + port;\n } else if (scheme == 'file') output += '//';\n output += url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';\n if (query !== null) output += '?' + query;\n if (fragment !== null) output += '#' + fragment;\n return output;\n};\n\nvar getOrigin = function () {\n var url = getInternalURLState(this);\n var scheme = url.scheme;\n var port = url.port;\n if (scheme == 'blob') try {\n return new URL(scheme.path[0]).origin;\n } catch (error) {\n return 'null';\n }\n if (scheme == 'file' || !isSpecial(url)) return 'null';\n return scheme + '://' + serializeHost(url.host) + (port !== null ? ':' + port : '');\n};\n\nvar getProtocol = function () {\n return getInternalURLState(this).scheme + ':';\n};\n\nvar getUsername = function () {\n return getInternalURLState(this).username;\n};\n\nvar getPassword = function () {\n return getInternalURLState(this).password;\n};\n\nvar getHost = function () {\n var url = getInternalURLState(this);\n var host = url.host;\n var port = url.port;\n return host === null ? ''\n : port === null ? serializeHost(host)\n : serializeHost(host) + ':' + port;\n};\n\nvar getHostname = function () {\n var host = getInternalURLState(this).host;\n return host === null ? '' : serializeHost(host);\n};\n\nvar getPort = function () {\n var port = getInternalURLState(this).port;\n return port === null ? '' : String(port);\n};\n\nvar getPathname = function () {\n var url = getInternalURLState(this);\n var path = url.path;\n return url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';\n};\n\nvar getSearch = function () {\n var query = getInternalURLState(this).query;\n return query ? '?' + query : '';\n};\n\nvar getSearchParams = function () {\n return getInternalURLState(this).searchParams;\n};\n\nvar getHash = function () {\n var fragment = getInternalURLState(this).fragment;\n return fragment ? '#' + fragment : '';\n};\n\nvar accessorDescriptor = function (getter, setter) {\n return { get: getter, set: setter, configurable: true, enumerable: true };\n};\n\nif (DESCRIPTORS) {\n defineProperties(URLPrototype, {\n // `URL.prototype.href` accessors pair\n // https://url.spec.whatwg.org/#dom-url-href\n href: accessorDescriptor(serializeURL, function (href) {\n var url = getInternalURLState(this);\n var urlString = String(href);\n var failure = parseURL(url, urlString);\n if (failure) throw TypeError(failure);\n getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query);\n }),\n // `URL.prototype.origin` getter\n // https://url.spec.whatwg.org/#dom-url-origin\n origin: accessorDescriptor(getOrigin),\n // `URL.prototype.protocol` accessors pair\n // https://url.spec.whatwg.org/#dom-url-protocol\n protocol: accessorDescriptor(getProtocol, function (protocol) {\n var url = getInternalURLState(this);\n parseURL(url, String(protocol) + ':', SCHEME_START);\n }),\n // `URL.prototype.username` accessors pair\n // https://url.spec.whatwg.org/#dom-url-username\n username: accessorDescriptor(getUsername, function (username) {\n var url = getInternalURLState(this);\n var codePoints = arrayFrom(String(username));\n if (cannotHaveUsernamePasswordPort(url)) return;\n url.username = '';\n for (var i = 0; i < codePoints.length; i++) {\n url.username += percentEncode(codePoints[i], userinfoPercentEncodeSet);\n }\n }),\n // `URL.prototype.password` accessors pair\n // https://url.spec.whatwg.org/#dom-url-password\n password: accessorDescriptor(getPassword, function (password) {\n var url = getInternalURLState(this);\n var codePoints = arrayFrom(String(password));\n if (cannotHaveUsernamePasswordPort(url)) return;\n url.password = '';\n for (var i = 0; i < codePoints.length; i++) {\n url.password += percentEncode(codePoints[i], userinfoPercentEncodeSet);\n }\n }),\n // `URL.prototype.host` accessors pair\n // https://url.spec.whatwg.org/#dom-url-host\n host: accessorDescriptor(getHost, function (host) {\n var url = getInternalURLState(this);\n if (url.cannotBeABaseURL) return;\n parseURL(url, String(host), HOST);\n }),\n // `URL.prototype.hostname` accessors pair\n // https://url.spec.whatwg.org/#dom-url-hostname\n hostname: accessorDescriptor(getHostname, function (hostname) {\n var url = getInternalURLState(this);\n if (url.cannotBeABaseURL) return;\n parseURL(url, String(hostname), HOSTNAME);\n }),\n // `URL.prototype.port` accessors pair\n // https://url.spec.whatwg.org/#dom-url-port\n port: accessorDescriptor(getPort, function (port) {\n var url = getInternalURLState(this);\n if (cannotHaveUsernamePasswordPort(url)) return;\n port = String(port);\n if (port == '') url.port = null;\n else parseURL(url, port, PORT);\n }),\n // `URL.prototype.pathname` accessors pair\n // https://url.spec.whatwg.org/#dom-url-pathname\n pathname: accessorDescriptor(getPathname, function (pathname) {\n var url = getInternalURLState(this);\n if (url.cannotBeABaseURL) return;\n url.path = [];\n parseURL(url, pathname + '', PATH_START);\n }),\n // `URL.prototype.search` accessors pair\n // https://url.spec.whatwg.org/#dom-url-search\n search: accessorDescriptor(getSearch, function (search) {\n var url = getInternalURLState(this);\n search = String(search);\n if (search == '') {\n url.query = null;\n } else {\n if ('?' == search.charAt(0)) search = search.slice(1);\n url.query = '';\n parseURL(url, search, QUERY);\n }\n getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query);\n }),\n // `URL.prototype.searchParams` getter\n // https://url.spec.whatwg.org/#dom-url-searchparams\n searchParams: accessorDescriptor(getSearchParams),\n // `URL.prototype.hash` accessors pair\n // https://url.spec.whatwg.org/#dom-url-hash\n hash: accessorDescriptor(getHash, function (hash) {\n var url = getInternalURLState(this);\n hash = String(hash);\n if (hash == '') {\n url.fragment = null;\n return;\n }\n if ('#' == hash.charAt(0)) hash = hash.slice(1);\n url.fragment = '';\n parseURL(url, hash, FRAGMENT);\n })\n });\n}\n\n// `URL.prototype.toJSON` method\n// https://url.spec.whatwg.org/#dom-url-tojson\nredefine(URLPrototype, 'toJSON', function toJSON() {\n return serializeURL.call(this);\n}, { enumerable: true });\n\n// `URL.prototype.toString` method\n// https://url.spec.whatwg.org/#URL-stringification-behavior\nredefine(URLPrototype, 'toString', function toString() {\n return serializeURL.call(this);\n}, { enumerable: true });\n\nif (NativeURL) {\n var nativeCreateObjectURL = NativeURL.createObjectURL;\n var nativeRevokeObjectURL = NativeURL.revokeObjectURL;\n // `URL.createObjectURL` method\n // https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL\n // eslint-disable-next-line no-unused-vars\n if (nativeCreateObjectURL) redefine(URLConstructor, 'createObjectURL', function createObjectURL(blob) {\n return nativeCreateObjectURL.apply(NativeURL, arguments);\n });\n // `URL.revokeObjectURL` method\n // https://developer.mozilla.org/en-US/docs/Web/API/URL/revokeObjectURL\n // eslint-disable-next-line no-unused-vars\n if (nativeRevokeObjectURL) redefine(URLConstructor, 'revokeObjectURL', function revokeObjectURL(url) {\n return nativeRevokeObjectURL.apply(NativeURL, arguments);\n });\n}\n\nsetToStringTag(URLConstructor, 'URL');\n\n$({ global: true, forced: !USE_NATIVE_URL, sham: !DESCRIPTORS }, {\n URL: URLConstructor\n});\n","'use strict';\nvar charAt = require('../internals/string-multibyte').charAt;\nvar InternalStateModule = require('../internals/internal-state');\nvar defineIterator = require('../internals/define-iterator');\n\nvar STRING_ITERATOR = 'String Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(STRING_ITERATOR);\n\n// `String.prototype[@@iterator]` method\n// https://tc39.github.io/ecma262/#sec-string.prototype-@@iterator\ndefineIterator(String, 'String', function (iterated) {\n setInternalState(this, {\n type: STRING_ITERATOR,\n string: String(iterated),\n index: 0\n });\n// `%StringIteratorPrototype%.next` method\n// https://tc39.github.io/ecma262/#sec-%stringiteratorprototype%.next\n}, function next() {\n var state = getInternalState(this);\n var string = state.string;\n var index = state.index;\n var point;\n if (index >= string.length) return { value: undefined, done: true };\n point = charAt(string, index);\n state.index += point.length;\n return { value: point, done: false };\n});\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar objectKeys = require('../internals/object-keys');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar toObject = require('../internals/to-object');\nvar IndexedObject = require('../internals/indexed-object');\n\nvar nativeAssign = Object.assign;\n\n// `Object.assign` method\n// https://tc39.github.io/ecma262/#sec-object.assign\n// should work with symbols and should have deterministic property order (V8 bug)\nmodule.exports = !nativeAssign || fails(function () {\n var A = {};\n var B = {};\n // eslint-disable-next-line no-undef\n var symbol = Symbol();\n var alphabet = 'abcdefghijklmnopqrst';\n A[symbol] = 7;\n alphabet.split('').forEach(function (chr) { B[chr] = chr; });\n return nativeAssign({}, A)[symbol] != 7 || objectKeys(nativeAssign({}, B)).join('') != alphabet;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n var T = toObject(target);\n var argumentsLength = arguments.length;\n var index = 1;\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n var propertyIsEnumerable = propertyIsEnumerableModule.f;\n while (argumentsLength > index) {\n var S = IndexedObject(arguments[index++]);\n var keys = getOwnPropertySymbols ? objectKeys(S).concat(getOwnPropertySymbols(S)) : objectKeys(S);\n var length = keys.length;\n var j = 0;\n var key;\n while (length > j) {\n key = keys[j++];\n if (!DESCRIPTORS || propertyIsEnumerable.call(S, key)) T[key] = S[key];\n }\n } return T;\n} : nativeAssign;\n","'use strict';\nvar bind = require('../internals/bind-context');\nvar toObject = require('../internals/to-object');\nvar callWithSafeIterationClosing = require('../internals/call-with-safe-iteration-closing');\nvar isArrayIteratorMethod = require('../internals/is-array-iterator-method');\nvar toLength = require('../internals/to-length');\nvar createProperty = require('../internals/create-property');\nvar getIteratorMethod = require('../internals/get-iterator-method');\n\n// `Array.from` method implementation\n// https://tc39.github.io/ecma262/#sec-array.from\nmodule.exports = function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n var O = toObject(arrayLike);\n var C = typeof this == 'function' ? this : Array;\n var argumentsLength = arguments.length;\n var mapfn = argumentsLength > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var index = 0;\n var iteratorMethod = getIteratorMethod(O);\n var length, result, step, iterator;\n if (mapping) mapfn = bind(mapfn, argumentsLength > 2 ? arguments[2] : undefined, 2);\n // if the target is not iterable or it's an array with the default iterator - use a simple case\n if (iteratorMethod != undefined && !(C == Array && isArrayIteratorMethod(iteratorMethod))) {\n iterator = iteratorMethod.call(O);\n result = new C();\n for (;!(step = iterator.next()).done; index++) {\n createProperty(result, index, mapping\n ? callWithSafeIterationClosing(iterator, mapfn, [step.value, index], true)\n : step.value\n );\n }\n } else {\n length = toLength(O.length);\n result = new C(length);\n for (;length > index; index++) {\n createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);\n }\n }\n result.length = index;\n return result;\n};\n","'use strict';\nvar toPrimitive = require('../internals/to-primitive');\nvar definePropertyModule = require('../internals/object-define-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = function (object, key, value) {\n var propertyKey = toPrimitive(key);\n if (propertyKey in object) definePropertyModule.f(object, propertyKey, createPropertyDescriptor(0, value));\n else object[propertyKey] = value;\n};\n","'use strict';\n// based on https://github.com/bestiejs/punycode.js/blob/master/punycode.js\nvar maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1\nvar base = 36;\nvar tMin = 1;\nvar tMax = 26;\nvar skew = 38;\nvar damp = 700;\nvar initialBias = 72;\nvar initialN = 128; // 0x80\nvar delimiter = '-'; // '\\x2D'\nvar regexNonASCII = /[^\\0-\\u007E]/; // non-ASCII chars\nvar regexSeparators = /[.\\u3002\\uFF0E\\uFF61]/g; // RFC 3490 separators\nvar OVERFLOW_ERROR = 'Overflow: input needs wider integers to process';\nvar baseMinusTMin = base - tMin;\nvar floor = Math.floor;\nvar stringFromCharCode = String.fromCharCode;\n\n/**\n * Creates an array containing the numeric code points of each Unicode\n * character in the string. While JavaScript uses UCS-2 internally,\n * this function will convert a pair of surrogate halves (each of which\n * UCS-2 exposes as separate characters) into a single code point,\n * matching UTF-16.\n */\nvar ucs2decode = function (string) {\n var output = [];\n var counter = 0;\n var length = string.length;\n while (counter < length) {\n var value = string.charCodeAt(counter++);\n if (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n // It's a high surrogate, and there is a next character.\n var extra = string.charCodeAt(counter++);\n if ((extra & 0xFC00) == 0xDC00) { // Low surrogate.\n output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n } else {\n // It's an unmatched surrogate; only append this code unit, in case the\n // next code unit is the high surrogate of a surrogate pair.\n output.push(value);\n counter--;\n }\n } else {\n output.push(value);\n }\n }\n return output;\n};\n\n/**\n * Converts a digit/integer into a basic code point.\n */\nvar digitToBasic = function (digit) {\n // 0..25 map to ASCII a..z or A..Z\n // 26..35 map to ASCII 0..9\n return digit + 22 + 75 * (digit < 26);\n};\n\n/**\n * Bias adaptation function as per section 3.4 of RFC 3492.\n * https://tools.ietf.org/html/rfc3492#section-3.4\n */\nvar adapt = function (delta, numPoints, firstTime) {\n var k = 0;\n delta = firstTime ? floor(delta / damp) : delta >> 1;\n delta += floor(delta / numPoints);\n for (; delta > baseMinusTMin * tMax >> 1; k += base) {\n delta = floor(delta / baseMinusTMin);\n }\n return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n};\n\n/**\n * Converts a string of Unicode symbols (e.g. a domain name label) to a\n * Punycode string of ASCII-only symbols.\n */\n// eslint-disable-next-line max-statements\nvar encode = function (input) {\n var output = [];\n\n // Convert the input in UCS-2 to an array of Unicode code points.\n input = ucs2decode(input);\n\n // Cache the length.\n var inputLength = input.length;\n\n // Initialize the state.\n var n = initialN;\n var delta = 0;\n var bias = initialBias;\n var i, currentValue;\n\n // Handle the basic code points.\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue < 0x80) {\n output.push(stringFromCharCode(currentValue));\n }\n }\n\n var basicLength = output.length; // number of basic code points.\n var handledCPCount = basicLength; // number of code points that have been handled;\n\n // Finish the basic string with a delimiter unless it's empty.\n if (basicLength) {\n output.push(delimiter);\n }\n\n // Main encoding loop:\n while (handledCPCount < inputLength) {\n // All non-basic code points < n have been handled already. Find the next larger one:\n var m = maxInt;\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue >= n && currentValue < m) {\n m = currentValue;\n }\n }\n\n // Increase `delta` enough to advance the decoder's state to , but guard against overflow.\n var handledCPCountPlusOne = handledCPCount + 1;\n if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n throw RangeError(OVERFLOW_ERROR);\n }\n\n delta += (m - n) * handledCPCountPlusOne;\n n = m;\n\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue < n && ++delta > maxInt) {\n throw RangeError(OVERFLOW_ERROR);\n }\n if (currentValue == n) {\n // Represent delta as a generalized variable-length integer.\n var q = delta;\n for (var k = base; /* no condition */; k += base) {\n var t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n if (q < t) break;\n var qMinusT = q - t;\n var baseMinusT = base - t;\n output.push(stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT)));\n q = floor(qMinusT / baseMinusT);\n }\n\n output.push(stringFromCharCode(digitToBasic(q)));\n bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);\n delta = 0;\n ++handledCPCount;\n }\n }\n\n ++delta;\n ++n;\n }\n return output.join('');\n};\n\nmodule.exports = function (input) {\n var encoded = [];\n var labels = input.toLowerCase().replace(regexSeparators, '\\u002E').split('.');\n var i, label;\n for (i = 0; i < labels.length; i++) {\n label = labels[i];\n encoded.push(regexNonASCII.test(label) ? 'xn--' + encode(label) : label);\n }\n return encoded.join('.');\n};\n","'use strict';\n// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\nrequire('../modules/es.array.iterator');\nvar $ = require('../internals/export');\nvar USE_NATIVE_URL = require('../internals/native-url');\nvar redefine = require('../internals/redefine');\nvar redefineAll = require('../internals/redefine-all');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar createIteratorConstructor = require('../internals/create-iterator-constructor');\nvar InternalStateModule = require('../internals/internal-state');\nvar anInstance = require('../internals/an-instance');\nvar hasOwn = require('../internals/has');\nvar bind = require('../internals/bind-context');\nvar anObject = require('../internals/an-object');\nvar isObject = require('../internals/is-object');\nvar getIterator = require('../internals/get-iterator');\nvar getIteratorMethod = require('../internals/get-iterator-method');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar URL_SEARCH_PARAMS = 'URLSearchParams';\nvar URL_SEARCH_PARAMS_ITERATOR = URL_SEARCH_PARAMS + 'Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalParamsState = InternalStateModule.getterFor(URL_SEARCH_PARAMS);\nvar getInternalIteratorState = InternalStateModule.getterFor(URL_SEARCH_PARAMS_ITERATOR);\n\nvar plus = /\\+/g;\nvar sequences = Array(4);\n\nvar percentSequence = function (bytes) {\n return sequences[bytes - 1] || (sequences[bytes - 1] = RegExp('((?:%[\\\\da-f]{2}){' + bytes + '})', 'gi'));\n};\n\nvar percentDecode = function (sequence) {\n try {\n return decodeURIComponent(sequence);\n } catch (error) {\n return sequence;\n }\n};\n\nvar deserialize = function (it) {\n var result = it.replace(plus, ' ');\n var bytes = 4;\n try {\n return decodeURIComponent(result);\n } catch (error) {\n while (bytes) {\n result = result.replace(percentSequence(bytes--), percentDecode);\n }\n return result;\n }\n};\n\nvar find = /[!'()~]|%20/g;\n\nvar replace = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+'\n};\n\nvar replacer = function (match) {\n return replace[match];\n};\n\nvar serialize = function (it) {\n return encodeURIComponent(it).replace(find, replacer);\n};\n\nvar parseSearchParams = function (result, query) {\n if (query) {\n var attributes = query.split('&');\n var index = 0;\n var attribute, entry;\n while (index < attributes.length) {\n attribute = attributes[index++];\n if (attribute.length) {\n entry = attribute.split('=');\n result.push({\n key: deserialize(entry.shift()),\n value: deserialize(entry.join('='))\n });\n }\n }\n }\n};\n\nvar updateSearchParams = function (query) {\n this.entries.length = 0;\n parseSearchParams(this.entries, query);\n};\n\nvar validateArgumentsLength = function (passed, required) {\n if (passed < required) throw TypeError('Not enough arguments');\n};\n\nvar URLSearchParamsIterator = createIteratorConstructor(function Iterator(params, kind) {\n setInternalState(this, {\n type: URL_SEARCH_PARAMS_ITERATOR,\n iterator: getIterator(getInternalParamsState(params).entries),\n kind: kind\n });\n}, 'Iterator', function next() {\n var state = getInternalIteratorState(this);\n var kind = state.kind;\n var step = state.iterator.next();\n var entry = step.value;\n if (!step.done) {\n step.value = kind === 'keys' ? entry.key : kind === 'values' ? entry.value : [entry.key, entry.value];\n } return step;\n});\n\n// `URLSearchParams` constructor\n// https://url.spec.whatwg.org/#interface-urlsearchparams\nvar URLSearchParamsConstructor = function URLSearchParams(/* init */) {\n anInstance(this, URLSearchParamsConstructor, URL_SEARCH_PARAMS);\n var init = arguments.length > 0 ? arguments[0] : undefined;\n var that = this;\n var entries = [];\n var iteratorMethod, iterator, step, entryIterator, first, second, key;\n\n setInternalState(that, {\n type: URL_SEARCH_PARAMS,\n entries: entries,\n updateURL: function () { /* empty */ },\n updateSearchParams: updateSearchParams\n });\n\n if (init !== undefined) {\n if (isObject(init)) {\n iteratorMethod = getIteratorMethod(init);\n if (typeof iteratorMethod === 'function') {\n iterator = iteratorMethod.call(init);\n while (!(step = iterator.next()).done) {\n entryIterator = getIterator(anObject(step.value));\n if (\n (first = entryIterator.next()).done ||\n (second = entryIterator.next()).done ||\n !entryIterator.next().done\n ) throw TypeError('Expected sequence with length 2');\n entries.push({ key: first.value + '', value: second.value + '' });\n }\n } else for (key in init) if (hasOwn(init, key)) entries.push({ key: key, value: init[key] + '' });\n } else {\n parseSearchParams(entries, typeof init === 'string' ? init.charAt(0) === '?' ? init.slice(1) : init : init + '');\n }\n }\n};\n\nvar URLSearchParamsPrototype = URLSearchParamsConstructor.prototype;\n\nredefineAll(URLSearchParamsPrototype, {\n // `URLSearchParams.prototype.appent` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-append\n append: function append(name, value) {\n validateArgumentsLength(arguments.length, 2);\n var state = getInternalParamsState(this);\n state.entries.push({ key: name + '', value: value + '' });\n state.updateURL();\n },\n // `URLSearchParams.prototype.delete` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-delete\n 'delete': function (name) {\n validateArgumentsLength(arguments.length, 1);\n var state = getInternalParamsState(this);\n var entries = state.entries;\n var key = name + '';\n var index = 0;\n while (index < entries.length) {\n if (entries[index].key === key) entries.splice(index, 1);\n else index++;\n }\n state.updateURL();\n },\n // `URLSearchParams.prototype.get` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-get\n get: function get(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = name + '';\n var index = 0;\n for (; index < entries.length; index++) {\n if (entries[index].key === key) return entries[index].value;\n }\n return null;\n },\n // `URLSearchParams.prototype.getAll` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-getall\n getAll: function getAll(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = name + '';\n var result = [];\n var index = 0;\n for (; index < entries.length; index++) {\n if (entries[index].key === key) result.push(entries[index].value);\n }\n return result;\n },\n // `URLSearchParams.prototype.has` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-has\n has: function has(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = name + '';\n var index = 0;\n while (index < entries.length) {\n if (entries[index++].key === key) return true;\n }\n return false;\n },\n // `URLSearchParams.prototype.set` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-set\n set: function set(name, value) {\n validateArgumentsLength(arguments.length, 1);\n var state = getInternalParamsState(this);\n var entries = state.entries;\n var found = false;\n var key = name + '';\n var val = value + '';\n var index = 0;\n var entry;\n for (; index < entries.length; index++) {\n entry = entries[index];\n if (entry.key === key) {\n if (found) entries.splice(index--, 1);\n else {\n found = true;\n entry.value = val;\n }\n }\n }\n if (!found) entries.push({ key: key, value: val });\n state.updateURL();\n },\n // `URLSearchParams.prototype.sort` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-sort\n sort: function sort() {\n var state = getInternalParamsState(this);\n var entries = state.entries;\n // Array#sort is not stable in some engines\n var slice = entries.slice();\n var entry, entriesIndex, sliceIndex;\n entries.length = 0;\n for (sliceIndex = 0; sliceIndex < slice.length; sliceIndex++) {\n entry = slice[sliceIndex];\n for (entriesIndex = 0; entriesIndex < sliceIndex; entriesIndex++) {\n if (entries[entriesIndex].key > entry.key) {\n entries.splice(entriesIndex, 0, entry);\n break;\n }\n }\n if (entriesIndex === sliceIndex) entries.push(entry);\n }\n state.updateURL();\n },\n // `URLSearchParams.prototype.forEach` method\n forEach: function forEach(callback /* , thisArg */) {\n var entries = getInternalParamsState(this).entries;\n var boundFunction = bind(callback, arguments.length > 1 ? arguments[1] : undefined, 3);\n var index = 0;\n var entry;\n while (index < entries.length) {\n entry = entries[index++];\n boundFunction(entry.value, entry.key, this);\n }\n },\n // `URLSearchParams.prototype.keys` method\n keys: function keys() {\n return new URLSearchParamsIterator(this, 'keys');\n },\n // `URLSearchParams.prototype.values` method\n values: function values() {\n return new URLSearchParamsIterator(this, 'values');\n },\n // `URLSearchParams.prototype.entries` method\n entries: function entries() {\n return new URLSearchParamsIterator(this, 'entries');\n }\n}, { enumerable: true });\n\n// `URLSearchParams.prototype[@@iterator]` method\nredefine(URLSearchParamsPrototype, ITERATOR, URLSearchParamsPrototype.entries);\n\n// `URLSearchParams.prototype.toString` method\n// https://url.spec.whatwg.org/#urlsearchparams-stringification-behavior\nredefine(URLSearchParamsPrototype, 'toString', function toString() {\n var entries = getInternalParamsState(this).entries;\n var result = [];\n var index = 0;\n var entry;\n while (index < entries.length) {\n entry = entries[index++];\n result.push(serialize(entry.key) + '=' + serialize(entry.value));\n } return result.join('&');\n}, { enumerable: true });\n\nsetToStringTag(URLSearchParamsConstructor, URL_SEARCH_PARAMS);\n\n$({ global: true, forced: !USE_NATIVE_URL }, {\n URLSearchParams: URLSearchParamsConstructor\n});\n\nmodule.exports = {\n URLSearchParams: URLSearchParamsConstructor,\n getState: getInternalParamsState\n};\n","var anObject = require('../internals/an-object');\nvar getIteratorMethod = require('../internals/get-iterator-method');\n\nmodule.exports = function (it) {\n var iteratorMethod = getIteratorMethod(it);\n if (typeof iteratorMethod != 'function') {\n throw TypeError(String(it) + ' is not iterable');\n } return anObject(iteratorMethod.call(it));\n};\n"],"sourceRoot":""} \ No newline at end of file diff --git a/cvat-canvas/src/canvas.ts b/cvat-canvas/src/canvas.ts index 14782a1b..15ce6e22 100644 --- a/cvat-canvas/src/canvas.ts +++ b/cvat-canvas/src/canvas.ts @@ -4,12 +4,19 @@ */ import { - CanvasModel, - CanvasModelImpl, Rotation, DrawData, + MergeData, + SplitData, + GroupData, + CanvasModel, + CanvasModelImpl, } from './canvasModel'; +import { + Master, +} from './master'; + import { CanvasController, CanvasControllerImpl, @@ -20,6 +27,7 @@ import { CanvasViewImpl, } from './canvasView'; + interface Canvas { html(): HTMLDivElement; setup(frameData: any, objectStates: any[]): void; @@ -30,15 +38,15 @@ interface Canvas { grid(stepX: number, stepY: number): void; draw(drawData: DrawData): void; - split(enabled?: boolean): void; - group(enabled?: boolean): void; - merge(enabled?: boolean): void; + group(groupData: GroupData): void; + split(splitData: SplitData): void; + merge(mergeData: MergeData): void; cancel(): void; } class CanvasImpl implements Canvas { - private model: CanvasModel; + private model: CanvasModel & Master; private controller: CanvasController; private view: CanvasView; @@ -60,7 +68,7 @@ class CanvasImpl implements Canvas { this.model.activate(clientID, attributeID); } - public rotate(rotation: Rotation, remember: boolean): void { + public rotate(rotation: Rotation, remember: boolean = false): void { this.model.rotate(rotation, remember); } @@ -80,16 +88,16 @@ class CanvasImpl implements Canvas { this.model.draw(drawData); } - public split(enabled: boolean = false): void { - this.model.split(enabled); + public split(splitData: SplitData): void { + this.model.split(splitData); } - public group(enabled: boolean = false): void { - this.model.group(enabled); + public group(groupData: GroupData): void { + this.model.group(groupData); } - public merge(enabled: boolean = false): void { - this.model.merge(enabled); + public merge(mergeData: MergeData): void { + this.model.merge(mergeData); } public cancel(): void { @@ -97,6 +105,7 @@ class CanvasImpl implements Canvas { } } + export { CanvasImpl as Canvas, Rotation, diff --git a/cvat-canvas/src/canvasModel.ts b/cvat-canvas/src/canvasModel.ts index 23128eb1..d3023a9f 100644 --- a/cvat-canvas/src/canvasModel.ts +++ b/cvat-canvas/src/canvasModel.ts @@ -47,6 +47,19 @@ export interface DrawData { crosshair?: boolean; } +export interface GroupData { + enabled: boolean; + resetGroup: boolean; +} + +export interface MergeData { + enabled: boolean; +} + +export interface SplitData { + enabled: boolean; +} + export enum FrameZoom { MIN = 0.1, MAX = 10, @@ -67,9 +80,12 @@ export enum UpdateReasons { FOCUS = 'focus', ACTIVATE = 'activate', DRAW = 'draw', + MERGE = 'merge', + SPLIT = 'split', + GROUP = 'group', } -export interface CanvasModel extends MasterImpl { +export interface CanvasModel { readonly image: string; readonly objects: any[]; readonly gridSize: Size; @@ -90,9 +106,9 @@ export interface CanvasModel extends MasterImpl { grid(stepX: number, stepY: number): void; draw(drawData: DrawData): void; - split(enabled: boolean): void; - group(enabled: boolean): void; - merge(enabled: boolean): void; + group(groupData: GroupData): void; + split(splitData: SplitData): void; + merge(mergeData: MergeData): void; cancel(): void; } @@ -103,7 +119,6 @@ export class CanvasModelImpl extends MasterImpl implements CanvasModel { activeElement: ActiveElement; angle: number; canvasSize: Size; - drawData: DrawData; image: string; imageOffset: number; imageSize: Size; @@ -114,6 +129,10 @@ export class CanvasModelImpl extends MasterImpl implements CanvasModel { rememberAngle: boolean; scale: number; top: number; + drawData: DrawData; + mergeData: MergeData; + groupData: GroupData; + splitData: SplitData; }; public constructor(ObjectStateClass: any) { @@ -129,12 +148,6 @@ export class CanvasModelImpl extends MasterImpl implements CanvasModel { height: 0, width: 0, }, - drawData: { - enabled: false, - shapeType: null, - numberOfPoints: null, - initialState: null, - }, image: '', imageOffset: 0, imageSize: { @@ -155,6 +168,22 @@ export class CanvasModelImpl extends MasterImpl implements CanvasModel { rememberAngle: false, scale: 1, top: 0, + drawData: { + enabled: false, + shapeType: null, + numberOfPoints: null, + initialState: null, + }, + mergeData: { + enabled: false, + }, + groupData: { + enabled: false, + resetGroup: false, + }, + splitData: { + enabled: false, + }, }; } @@ -209,10 +238,8 @@ export class CanvasModelImpl extends MasterImpl implements CanvasModel { this.data.objects = objectStates; this.notify(UpdateReasons.OBJECTS); }).catch((exception: any): void => { - console.log(exception.toString()); + throw exception; }); - - console.log(objectStates); } public activate(clientID: number, attributeID: number): void { @@ -300,16 +327,43 @@ export class CanvasModelImpl extends MasterImpl implements CanvasModel { this.notify(UpdateReasons.DRAW); } - public split(enabled: boolean): any { - return enabled; + public split(splitData: SplitData): void { + if (this.data.splitData.enabled && splitData.enabled) { + return; + } + + if (!this.data.splitData.enabled && !splitData.enabled) { + return; + } + + this.data.splitData = splitData; + this.notify(UpdateReasons.SPLIT); } - public group(enabled: boolean): any { - return enabled; + public group(groupData: GroupData): void { + if (this.data.groupData.enabled && groupData.enabled) { + return; + } + + if (!this.data.groupData.enabled && !groupData.enabled) { + return; + } + + this.data.groupData = groupData; + this.notify(UpdateReasons.GROUP); } - public merge(enabled: boolean): any { - return enabled; + public merge(mergeData: MergeData): void { + if (this.data.mergeData.enabled && mergeData.enabled) { + return; + } + + if (!this.data.mergeData.enabled && !mergeData.enabled) { + return; + } + + this.data.mergeData = mergeData; + this.notify(UpdateReasons.MERGE); } public cancel(): void { diff --git a/cvat-canvas/src/canvasView.ts b/cvat-canvas/src/canvasView.ts index 8f04cf4c..fcaa5fc1 100644 --- a/cvat-canvas/src/canvasView.ts +++ b/cvat-canvas/src/canvasView.ts @@ -3,9 +3,6 @@ * SPDX-License-Identifier: MIT */ -// Disable till full implementation -/* eslint class-methods-use-this: "off" */ - import * as SVG from 'svg.js'; // tslint:disable-next-line: ordered-imports @@ -16,6 +13,9 @@ import 'svg.select.js'; import { CanvasController } from './canvasController'; import { Listener, Master } from './master'; import { DrawHandler, DrawHandlerImpl } from './drawHandler'; +import { MergeHandler, MergeHandlerImpl } from './mergeHandler'; +import { SplitHandler, SplitHandlerImpl } from './splitHandler'; +import { GroupHandler, GroupHandlerImpl } from './groupHandler'; import { translateToSVG, translateFromSVG } from './shared'; import consts from './consts'; import { @@ -49,6 +49,48 @@ enum Mode { DRAW = 'draw', } +function selectize(value: boolean, shape: SVG.Element, geometry: Geometry): void { + if (value) { + (shape as any).selectize(value, { + deepSelect: true, + pointSize: consts.BASE_POINT_SIZE / geometry.scale, + rotationPoint: false, + pointType(cx: number, cy: number): SVG.Circle { + const circle: SVG.Circle = this.nested + .circle(this.options.pointSize) + .stroke('black') + .fill(shape.node.getAttribute('fill')) + .center(cx, cy) + .attr({ + 'stroke-width': consts.BASE_STROKE_WIDTH / (3 * geometry.scale), + }); + + circle.node.addEventListener('mouseenter', (): void => { + circle.attr({ + 'stroke-width': circle.attr('stroke-width') * 2, + }); + + circle.addClass('cvat_canvas_selected_point'); + }); + + circle.node.addEventListener('mouseleave', (): void => { + circle.attr({ + 'stroke-width': circle.attr('stroke-width') / 2, + }); + + circle.removeClass('cvat_canvas_selected_point'); + }); + + return circle; + }, + }); + } else { + (shape as any).selectize(false, { + deepSelect: true, + }); + } +} + function darker(color: string, percentage: number): string { const R = Math.round(parseInt(color.slice(1, 3), 16) * (1 - percentage / 100)); const G = Math.round(parseInt(color.slice(3, 5), 16) * (1 - percentage / 100)); @@ -78,6 +120,9 @@ export class CanvasViewImpl implements CanvasView, Listener { private svgShapes: ShapeDict; private svgTexts: TextDict; private drawHandler: DrawHandler; + private mergeHandler: MergeHandler; + private splitHandler: SplitHandler; + private groupHandler: GroupHandler; private activeElement: { state: any; attributeID: number; @@ -85,7 +130,7 @@ export class CanvasViewImpl implements CanvasView, Listener { private mode: Mode; - private onDrawDone(data: Record): void { + private onDrawDone(data: object): void { if (data) { const event: CustomEvent = new CustomEvent('canvas.drawn', { bubbles: false, @@ -111,6 +156,70 @@ export class CanvasViewImpl implements CanvasView, Listener { }); } + private onMergeDone(objects: any[]): void { + if (objects) { + const event: CustomEvent = new CustomEvent('canvas.merged', { + bubbles: false, + cancelable: true, + detail: { + states: objects, + }, + }); + + this.canvas.dispatchEvent(event); + } else { + const event: CustomEvent = new CustomEvent('canvas.canceled', { + bubbles: false, + cancelable: true, + }); + + this.canvas.dispatchEvent(event); + } + } + + private onSplitDone(object: any): void { + if (object) { + const event: CustomEvent = new CustomEvent('canvas.splitted', { + bubbles: false, + cancelable: true, + detail: { + state: object, + }, + }); + + this.canvas.dispatchEvent(event); + } else { + const event: CustomEvent = new CustomEvent('canvas.canceled', { + bubbles: false, + cancelable: true, + }); + + this.canvas.dispatchEvent(event); + } + } + + private onGroupDone(objects: any[], reset: boolean): void { + if (objects) { + const event: CustomEvent = new CustomEvent('canvas.groupped', { + bubbles: false, + cancelable: true, + detail: { + states: objects, + reset, + }, + }); + + this.canvas.dispatchEvent(event); + } else { + const event: CustomEvent = new CustomEvent('canvas.canceled', { + bubbles: false, + cancelable: true, + }); + + this.canvas.dispatchEvent(event); + } + } + public constructor(model: CanvasModel & Master, controller: CanvasController) { this.controller = controller; this.svgShapes = {}; @@ -131,7 +240,7 @@ export class CanvasViewImpl implements CanvasView, Listener { this.content = window.document.createElementNS('http://www.w3.org/2000/svg', 'svg'); this.adoptedContent = (SVG.adopt((this.content as any as HTMLElement)) as SVG.Container); - this.drawHandler = new DrawHandlerImpl(this.onDrawDone.bind(this), this.adoptedContent); + this.canvas = window.document.createElement('div'); const loadingCircle: SVGCircleElement = window.document @@ -203,6 +312,24 @@ export class CanvasViewImpl implements CanvasView, Listener { this.canvas.addEventListener('animationstart', canvasFirstMounted); + // Setup API handlers + this.drawHandler = new DrawHandlerImpl( + this.onDrawDone.bind(this), + this.adoptedContent, + this.background, + ); + this.mergeHandler = new MergeHandlerImpl( + this.onMergeDone.bind(this), + ); + this.splitHandler = new SplitHandlerImpl( + this.onSplitDone.bind(this), + ); + this.groupHandler = new GroupHandlerImpl( + this.onGroupDone.bind(this), + ); + + + // Setup event handlers this.content.addEventListener('dblclick', (): void => { self.controller.fit(); }); @@ -239,7 +366,7 @@ export class CanvasViewImpl implements CanvasView, Listener { detail: { x, y, - objects: this.controller.objects, + states: this.controller.objects, }, }); @@ -383,14 +510,31 @@ export class CanvasViewImpl implements CanvasView, Listener { } function setupObjects(objects: any[], geometry: Geometry): void { - this.adoptedContent.clear(); const ctm = this.content.getScreenCTM() .inverse().multiply(this.background.getScreenCTM()); + this.deactivate(); + // TODO: Compute difference + + // Instead of simple clearing let's remove all objects properly + for (const id of Object.keys(this.svgShapes)) { + if (id in this.svgTexts) { + this.svgTexts[id].remove(); + } + + this.svgShapes[id].remove(); + } + + this.svgTexts = {}; + this.svgShapes = {}; + this.addObjects(ctm, objects, geometry); // TODO: Update objects // TODO: Delete objects + this.mergeHandler.updateObjects(objects); + this.groupHandler.updateObjects(objects); + this.splitHandler.updateObjects(objects); } const { geometry } = this.controller; @@ -498,7 +642,7 @@ export class CanvasViewImpl implements CanvasView, Listener { (shape as any).draggable(false); if (state.shapeType !== 'points') { - this.selectize(false, shape, null); + selectize(false, shape, null); } (shape as any).resize(false); @@ -513,48 +657,6 @@ export class CanvasViewImpl implements CanvasView, Listener { } } - private selectize(value: boolean, shape: SVG.Element, geometry: Geometry): void { - if (value) { - (shape as any).selectize(value, { - deepSelect: true, - pointSize: consts.BASE_POINT_SIZE / geometry.scale, - rotationPoint: false, - pointType(cx: number, cy: number): SVG.Circle { - const circle: SVG.Circle = this.nested - .circle(this.options.pointSize) - .stroke('black') - .fill(shape.node.getAttribute('fill')) - .center(cx, cy) - .attr({ - 'stroke-width': consts.BASE_STROKE_WIDTH / (3 * geometry.scale), - }); - - circle.node.addEventListener('mouseenter', (): void => { - circle.attr({ - 'stroke-width': circle.attr('stroke-width') * 2, - }); - - circle.addClass('cvat_canvas_selected_point'); - }); - - circle.node.addEventListener('mouseleave', (): void => { - circle.attr({ - 'stroke-width': circle.attr('stroke-width') / 2, - }); - - circle.removeClass('cvat_canvas_selected_point'); - }); - - return circle; - }, - }); - } else { - (shape as any).selectize(false, { - deepSelect: true, - }); - } - } - private activate(geometry: Geometry, activeElement: ActiveElement): void { // Check if other element have been already activated if (this.activeElement) { @@ -605,7 +707,7 @@ export class CanvasViewImpl implements CanvasView, Listener { }); if (state.shapeType !== 'points') { - this.selectize(true, shape, geometry); + selectize(true, shape, geometry); } (shape as any).resize().on('resizestart', (): void => { @@ -731,12 +833,17 @@ export class CanvasViewImpl implements CanvasView, Listener { zOrder: state.zOrder, }).addClass('cvat_canvas_shape'); - this.selectize(true, shape, geometry); + selectize(true, shape, geometry); + shape.remove = function remove(): void { + this.selectize(false, shape); + shape.constructor.prototype.remove.call(shape); + }.bind(this); shape.attr('fill', 'none'); return shape; } + /* eslint-disable-next-line */ private addTag(state: any, geometry: Geometry): void { console.log(state, geometry); } diff --git a/cvat-canvas/src/drawHandler.ts b/cvat-canvas/src/drawHandler.ts index 7eae5f45..1bb8d1e2 100644 --- a/cvat-canvas/src/drawHandler.ts +++ b/cvat-canvas/src/drawHandler.ts @@ -23,8 +23,10 @@ export interface DrawHandler { } export class DrawHandlerImpl implements DrawHandler { - private onDrawDone: any; // callback is used to notify about creating new shape + // callback is used to notify about creating new shape + private onDrawDone: (data: object) => void; private canvas: SVG.Container; + private background: SVGSVGElement; private crosshair: { x: SVG.Line; y: SVG.Line; @@ -70,8 +72,12 @@ export class DrawHandlerImpl implements DrawHandler { } else { this.drawInstance.draw('done'); } - this.drawInstance.remove(); - this.drawInstance = null; + + // We should check again because state can be changed in 'cancel' and 'done' + if (this.drawInstance) { + this.drawInstance.remove(); + this.drawInstance = null; + } } } @@ -91,6 +97,11 @@ export class DrawHandlerImpl implements DrawHandler { [bbox.x, bbox.y, bbox.x + bbox.width, bbox.y + bbox.height], ); + ([xtl, ytl, xbr, ybr] = translateToSVG( + this.background, + [xtl, ytl, xbr, ybr], + )); + xtl = Math.min(Math.max(xtl, 0), frameWidth); xbr = Math.min(Math.max(xbr, 0), frameWidth); ytl = Math.min(Math.max(ytl, 0), frameHeight); @@ -178,7 +189,7 @@ export class DrawHandlerImpl implements DrawHandler { }); this.drawInstance.on('drawdone', (e: CustomEvent): void => { - const points = translateFromSVG( + let points = translateFromSVG( this.canvas.node as any as SVGSVGElement, (e.target as SVGElement) .getAttribute('points') @@ -186,6 +197,11 @@ export class DrawHandlerImpl implements DrawHandler { .map((coord): number => +coord), ); + points = translateToSVG( + this.background, + points, + ); + const bbox = { xtl: Number.MAX_SAFE_INTEGER, ytl: Number.MAX_SAFE_INTEGER, @@ -271,9 +287,10 @@ export class DrawHandlerImpl implements DrawHandler { } } - public constructor(onDrawDone: any, canvas: SVG.Container) { + public constructor(onDrawDone: any, canvas: SVG.Container, background: SVGSVGElement) { this.onDrawDone = onDrawDone; this.canvas = canvas; + this.background = background; this.drawData = null; this.geometry = null; this.crosshair = null; @@ -317,9 +334,9 @@ export class DrawHandlerImpl implements DrawHandler { 'stroke-width': consts.BASE_STROKE_WIDTH / geometry.scale, }); - const PaintHandler = Object.values(this.drawInstance.memory())[0]; + const paintHandler = this.drawInstance.remember('_paintHandler'); - for (const point of (PaintHandler as any).set.members) { + for (const point of (paintHandler as any).set.members) { point.style( 'stroke-width', `${consts.BASE_STROKE_WIDTH / (3 * geometry.scale)}`, diff --git a/cvat-canvas/src/groupHandler.ts b/cvat-canvas/src/groupHandler.ts new file mode 100644 index 00000000..f658b06f --- /dev/null +++ b/cvat-canvas/src/groupHandler.ts @@ -0,0 +1,19 @@ +import { GroupData } from './canvasModel'; + +export interface GroupHandler { + group(groupData: GroupData): void; +} + +export class GroupHandlerImpl implements GroupHandler { + // callback is used to notify about grouping end + private onGroupDone: (objects: any[], reset: boolean) => void; + + public constructor(onGroupDone: any) { + this.onGroupDone = onGroupDone; + } + + /* eslint-disable-next-line */ + public group(groupData: GroupData): void { + throw new Error('Method not implemented.'); + } +} diff --git a/cvat-canvas/src/mergeHandler.ts b/cvat-canvas/src/mergeHandler.ts new file mode 100644 index 00000000..b02a3d0c --- /dev/null +++ b/cvat-canvas/src/mergeHandler.ts @@ -0,0 +1,19 @@ +import { MergeData } from './canvasModel'; + +export interface MergeHandler { + merge(mergeData: MergeData): void; +} + +export class MergeHandlerImpl implements MergeHandler { + // callback is used to notify about merging end + private onMergeDone: (objects: any[]) => void; + + public constructor(onMergeDone: any) { + this.onMergeDone = onMergeDone; + } + + /* eslint-disable-next-line */ + public merge(mergeData: MergeData): void { + throw new Error('Method not implemented.'); + } +} diff --git a/cvat-canvas/src/splitHandler.ts b/cvat-canvas/src/splitHandler.ts new file mode 100644 index 00000000..e2d70a24 --- /dev/null +++ b/cvat-canvas/src/splitHandler.ts @@ -0,0 +1,19 @@ +import { SplitData } from './canvasModel'; + +export interface SplitHandler { + split(splitData: SplitData): void; +} + +export class SplitHandlerImpl implements SplitHandler { + // callback is used to notify about splitting end + private onSplitDone: (object: any) => void; + + public constructor(onSplitDone: any) { + this.onSplitDone = onSplitDone; + } + + /* eslint-disable-next-line */ + public split(splitData: SplitData): void { + throw new Error('Method not implemented.'); + } +} diff --git a/cvat-canvas/tsconfig.json b/cvat-canvas/tsconfig.json index e8603b52..62cf8e1d 100644 --- a/cvat-canvas/tsconfig.json +++ b/cvat-canvas/tsconfig.json @@ -1,5 +1,6 @@ { "compilerOptions": { + "baseUrl": ".", "emitDeclarationOnly": true, "module": "es6", "target": "es6", @@ -7,9 +8,12 @@ "preserveConstEnums": true, "declaration": true, "moduleResolution": "node", - "declarationDir": "dist/declaration" + "declarationDir": "dist/declaration", + "paths": { + "cvat-canvas.node": ["dist/cvat-canvas.node"] + } }, "include": [ "src/*.ts" - ], + ] } diff --git a/cvat-canvas/webpack.config.js b/cvat-canvas/webpack.config.js index 8b40dfa3..d4e59f54 100644 --- a/cvat-canvas/webpack.config.js +++ b/cvat-canvas/webpack.config.js @@ -1,11 +1,46 @@ -/* global - require:true, - __dirname:true, -*/ - +/* eslint-disable */ const path = require('path'); +const DtsBundleWebpack = require('dts-bundle-webpack') -module.exports = { +const nodeConfig = { + target: 'node', + mode: 'production', + devtool: 'source-map', + entry: './src/canvas.ts', + output: { + path: path.resolve(__dirname, 'dist'), + filename: 'cvat-canvas.node.js', + library: 'canvas', + libraryTarget: 'commonjs', + }, + resolve: { + extensions: ['.ts', '.js', '.json'], + }, + module: { + rules: [{ + exclude: /node_modules/, + use: { + loader: 'babel-loader', + options: { + presets: [ + ['@babel/preset-env'], + ['@babel/typescript'], + ], + sourceType: 'unambiguous', + }, + }, + }], + }, + plugins: [ + new DtsBundleWebpack({ + name: 'cvat-canvas.node', + main: 'dist/declaration/canvas.d.ts', + out: '../cvat-canvas.node.d.ts', + }), + ] +}; + +const webConfig = { target: 'web', mode: 'production', devtool: 'source-map', @@ -32,16 +67,21 @@ module.exports = { loader: 'babel-loader', options: { presets: [ - [ - '@babel/preset-env', - ], - [ - '@babel/typescript', - ], + ['@babel/preset-env'], + ['@babel/typescript'], ], sourceType: 'unambiguous', }, }, }], }, + plugins: [ + new DtsBundleWebpack({ + name: 'cvat-canvas', + main: 'dist/declaration/canvas.d.ts', + out: '../cvat-canvas.d.ts', + }), + ] }; + +module.exports = [webConfig, nodeConfig]