-
Notifications
You must be signed in to change notification settings - Fork 4
/
reasons.min.js
1 lines (1 loc) · 63.7 KB
/
reasons.min.js
1
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Reasons=f()}})(function(){var define,module,exports;return function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r}()({1:[function(require,module,exports){"use strict";const Utils=require("./Utils");const maxWidth=200;const padding=10;const fontSize=16;module.exports={mixin:mixin,isEdge:isEdge,isNode:isNode,save:save};function mixin(element){element.isEdge=isEdge;element.isNode=isNode;element.export=save;element.collides=collides;element.move=move;return init(element)}function init(element){element.id=element.id||Math.random().toString(36).slice(-5);if(element.isEdge()){element.from=Utils.flatten([element.from]).map(from=>{return from.id||from});element.to=element.to.id||element.to;element.type=element.type||"supports";element.paths=[]}else{element.text=element.text||"A reason";element.width=maxWidth;element.height=fontSize*3.5;locate(element,{x:element.x||0,y:element.y||0})}return element}function isEdge(){return this.to&&this.from?true:false}function isNode(){return this.isEdge()?false:true}function collides(el){if(this.isEdge()){let hit=false;this.paths.forEach(path=>{if(differenceOfVectors(el,path)<.05)hit=true});if(!this.center)return false;let width=this.type.length*5;hit=el.x<this.center.x-width||el.x>this.center.x+width||el.y<this.center.y-10||el.y>this.center.y+10?false:true;return hit}else{if(el.isNode&&el.isNode())return this.x2<el.x1||this.x1>el.x2||this.y1>el.y2||this.y2<el.y1?false:true;else return el.x>this.x1&&el.x<this.x2&&el.y>this.y1&&el.y<this.y2?true:false}}function move(position){if(this.isNode()){this.x=position.x;this.y=position.y;locate(this,position)}}function save(){if(this.isEdge()){return{id:this.id,type:this.type,from:convertObjectsToIds(this.from),to:convertObjectsToIds(this.to)}}else{return{id:this.id,text:this.text,x:parseInt(this.x1+this.width/2),y:parseInt(this.y1+this.height/2),lineType:this.lineType?this.lineType:"solid"}}}function locate(element,position){if(element.isNode()){element.x1=parseInt(position.x-element.width/2);element.x2=parseInt(position.x+element.width/2);element.y1=parseInt(position.y-element.height/2);element.y2=parseInt(position.y+element.height/2)}}function convertObjectsToIds(obj){if(obj instanceof Array){return obj.map(el=>el.id||el)}else{return obj.id||obj}}function differenceOfVectors(point,path){return Math.abs(Math.atan2(point.y-path.y1,point.x-path.x1)-Math.atan2(path.y2-point.y,path.x2-point.x))}},{"./Utils":2}],2:[function(require,module,exports){module.exports={buildNode:function(type,options,attributes){const node=document.createElement(type);for(var key in options){node[key]=options[key]}for(var key in attributes){node.setAttribute(key,attributes[key])}return node},intersection:function(array1,array2){return array1.filter(function(n){return array2.indexOf(n)!==-1})},unique:require("array-unique"),flatten:require("array-flatten"),diff:require("array-difference")}},{"array-difference":10,"array-flatten":11,"array-unique":12}],3:[function(require,module,exports){arguments[4][1][0].apply(exports,arguments)},{"./Utils":2,dup:1}],4:[function(require,module,exports){"use strict";const Utils=require("./utils");const Element=require("./element");module.exports=Graph;function Graph(elements){if(elements instanceof Array){elements.sort((a,b)=>{return a.to?1:-1}).forEach(el=>this.add(el))}}Graph.prototype=Object.create(Array.prototype);Graph.prototype.add=function(element){Element.mixin(element);if(element.isNode()){this.push(element)}else{if(this.hasDuplicate(element)||this.isFromEdge(element)||this.isToEdge(element)){return false}let commonChildren=Utils.intersection(Utils.flatten(element.from.map(e=>this.children(e))),this.children(element.to)).map(el=>el.id);if(commonChildren.length>0){let commonParents=Utils.flatten([element.from,element.to]).map(el=>el.id||el);this.edges().forEach(edge=>{if(Utils.intersection(element.from,edge.from).length>0)this.remove(edge);if(edge.from.includes(element.to)){this.push(Element.mixin({from:Utils.flatten([edge.from,element.from]),to:edge.to,type:edge.type}));this.remove(edge)}})}else{this.push(element)}}};Graph.prototype.remove=function(el){let i=this.indexOf(el);if(i>-1){if(el.isNode()){let edgesTo=this.edges().filter(edge=>edge.to==el.id);let edgesFrom=this.edges().filter(edge=>edge.from.includes(el.id));let conjoined=edgesFrom.filter(edge=>edge.from.length>1);this.splice(i,1);edgesTo.forEach(edge=>{if(this.indexOf(edge)>-1)this.splice(this.indexOf(edge),1)});edgesFrom.forEach(edge=>{if(this.indexOf(edge)>-1)this.splice(this.indexOf(edge),1)});edgesFrom.filter(e=>e.from instanceof Array).map(e=>{if(e.from.indexOf(el)>-1)e.from.splice(e.from.indexOf(el),1);if(e.from.length===1)e.from=e.from[0]});conjoined.forEach(edge=>{edge.from.splice(edge.from.indexOf(el.id),1);this.push(edge)})}else{this.splice(i,1)}}return this};Graph.prototype.focus=function(el){let index=this.indexOf(el);if(index>-1){this.push(this.splice(index,1)[0])}this.forEach(function(e){e.focused=e===el?true:false});return el};Graph.prototype.undoFocus=function(){const last=this.pop();this.unshift(last);this.forEach(function(e){e.focused=e===last?true:false});return last};Graph.prototype.unfocus=function(){this.forEach(function(el){el.focused=false});return this};Graph.prototype.last=function(){return this[this.length-1]};Graph.prototype.edges=function(){return this.filter(el=>el.from&&el.to)};Graph.prototype.nodes=function(){return this.filter(el=>!el.from||!el.to)};Graph.prototype.elements=function(){return this};Graph.prototype.parents=function(id){if(id instanceof Object)id=id.id;return Utils.flatten(this.edges().filter(el=>el.to==id).map(el=>el.from)).map(el=>this.find(i=>i.id==el))};Graph.prototype.children=function(id){if(id instanceof Object)id=id.id;return Utils.unique(this.edges().filter(el=>{return Utils.flatten([el.from]).map(el=>el.id||el).indexOf(id)>-1}).map(el=>el.to).map(el=>this.find(i=>i==el||i.id==el)))};Graph.prototype.hasDuplicate=function(el){Element.mixin(el);let dupe=false;if(el.isEdge()){this.edges().forEach(edge=>{if(el.to===edge.to&&el.from.toString()===edge.from.toString()){dupe=true}})}return dupe};Graph.prototype.isFromEdge=function(element){var fromEdge=false;element.from.forEach(el=>{var match=this.edges().find(e=>e.id==el);if(match)fromEdge=true});return fromEdge};Graph.prototype.isToEdge=function(element){let to=this.find(el=>el.id==element.to);if(to&&to.isEdge()){return true}}},{"./element":3,"./utils":8}],5:[function(require,module,exports){"use strict";const Graph=require("./graph");const UI=require("./ui");const View=require("./view");module.exports=Mapper;function Mapper(elementID){this.DOM=document.querySelector(elementID);if(this.DOM){View.init(this);UI.setup(this);UI.addEventListeners(this)}}Mapper.prototype.render=function(elements){this.graph=new Graph(elements);View.draw(this);View.resize(this);View.zero(this);View.draw(this);return this};Mapper.prototype.export=function(){return this.graph.map(element=>element.export())}},{"./graph":4,"./ui":7,"./view":9}],6:[function(require,module,exports){const Mapper=require("./mapper");module.exports={mapper:function(dom){return new Mapper(dom)}}},{"./mapper":5}],7:[function(require,module,exports){"use strict";const View=require("./view");const Utils=require("./utils");const Graph=require("./graph");const Keycode=require("keycode");const Hammer=require("hammerjs");module.exports={addEventListeners:addEventListeners,setup:setup};function setup(mapper){setupSharedStyles();const styleTag=Utils.buildNode("style");styleTag.innerHTML=`\n #${mapper.DOM.id} {\n min-height: 100px;\n }\n `;document.head.appendChild(styleTag);View.resize(mapper);mapper.History=[];mapper.Future=[]}function setupSharedStyles(){if(!document.head.querySelector("style[data-reasons-shared]")){const sharedStyles=Utils.buildNode("style",undefined,{"data-reasons-shared":true});sharedStyles.innerHTML=`\n body.modal {\n overflow-y: hidden;\n }\n #reason-overlay {\n font-size: 18px;\n position: fixed;\n top: 0; left: 0; right: 0;\n height: 100vh;\n background: rgba(0,0,0,0.75);\n touch-action: none;\n }\n #edit-reason-input {\n font-size: 18px;\n padding: 1rem 1rem 0 1rem;\n margin-top: 10vh;\n box-sizing: border-box;\n }\n #reason-overlay__wrapper {\n margin: auto;\n margin-top: 10vh;\n width:50%;\n padding: 1rem;\n flex-direction: column;\n display: flex;\n }\n #reasons-overlay-toolbar {\n margin: 0.75rem -0.5rem;\n }\n .reason-overlay__button {\n font-size: inherit;\n background-color: white;\n padding: 0.5rem 1rem;\n border: 1px solid grey;\n border-radius: 4px;\n margin: 0 0.5rem;\n }\n [data-reasons-layout="inline"] {\n touch-action: pinch-zoom;\n }\n .show-touch, .show-pointer {\n display: none;\n }\n `;document.head.appendChild(sharedStyles)}}function addEventListeners(mapper){const hammer=new Hammer(mapper.DOM,{});if(!mapper.inline){hammer.get("pan").set({direction:Hammer.DIRECTION_ALL})}hammer.get("pinch").set({enable:true});hammer.add(new Hammer.Swipe({pointers:3}));mapper.altered=true;mapper.editMode=false;mapper.dirty=false;let mouseDown=false;let selected=null;let dragging=null;let clickPos=null;let clickOffset=null;let metaKeyPressed=false;const localPosition=event=>{const{x:x,y:y}=mapper.offset;const parent=event.target.getClientRects()[0];return{x:parseInt((event.x||event.pageX)-parseInt(parent.left))/mapper.scale-x,y:parseInt((event.y||event.pageY)-parseInt(parent.top))/mapper.scale-y}};function detect(event){const local=localPosition(event);return{position:local,collision:mapper.graph.elements().find(el=>el.collides(local))}}const doubleClick=event=>{const{position:position,collision:collision}=detect(event);if(collision){addOverlay(mapper,collision)}else{mapper.graph.add({x:position.x,y:position.y});selected=mapper.graph.last();mapper.graph.focus(selected);mapper.altered=true;addOverlay(mapper,selected,true)}redraw(mapper)};hammer.on("doubletap",hammerEvent=>{const event=hammerEvent.srcEvent;event.preventDefault();doubleClick(event)});function triggerRedo(){save(mapper.History,mapper);const next=mapper.Future.pop();if(next){mapper.graph=new Graph(JSON.parse(next));mapper.dirty=true}}function triggerUndo(){save(mapper.Future,mapper);const last=mapper.History.pop();if(last){mapper.graph=new Graph(JSON.parse(last));mapper.dirty=true}}hammer.on("swipe",hammerEvent=>{if(hammerEvent.direction&Hammer.DIRECTION_HORIZONTAL){mapper._isSwipping=true;if(hammerEvent.direction===Hammer.DIRECTION_LEFT){triggerUndo()}else{triggerRedo()}setTimeout(()=>{mapper._isSwipping=false},250)}});hammer.on("panstart",function(hammerEvent){const event=hammerEvent.srcEvent;const{collision:collision}=detect(event);if(mapper._isSwipping){return}if(collision){dragStart(event)}else{mapper._startPan={...mapper.offset}}});const panMove=function(hammerEvent){const event=hammerEvent.srcEvent;const{collision:collision}=detect(event);if(collision){return dragMove(event)}if(dragging||mapper._isSwipping){return}mapper.offset={x:mapper._startPan.x+hammerEvent.deltaX/mapper.scale,y:mapper._startPan.y+hammerEvent.deltaY/mapper.scale};mapper.dirty=true;View.zero(mapper);redraw(mapper)};hammer.on("panmove",panMove);const dragStart=event=>{const{position:position,collision:collision}=detect(event);if(dragging){return}if(collision){selected=collision;mapper.graph.focus(selected);mapper.dirty=true;clickPos=position;clickOffset={x:selected.x1+selected.width/2-position.x,y:selected.y1+selected.height/2-position.y};dragging=selected}redraw(mapper)};mapper.DOM.addEventListener("mousedown",dragStart);const dragMove=event=>{window.currentMapper=mapper;const mouse=localPosition(event);mapper.graph.forEach(el=>{if(el.collides(mouse)){if(!el.hovering)mapper.dirty=true;el.hovering=true}else{if(el.hovering)mapper.dirty=true;el.hovering=false}});if(dragging){const localPos=localPosition(event);dragging.move({x:localPos.x+clickOffset.x,y:localPos.y+clickOffset.y});mapper.dirty=true}redraw(mapper)};mapper.DOM.addEventListener("mousemove",dragMove);const dragEnd=event=>{const{collision:collision}=detect(event);if(dragging){const target=mapper.graph.nodes().find(el=>dragging.collides(el)&&dragging.id!==el.id);if(target){mapper.graph.add({from:dragging,to:target});dragging.move(clickPos)}mapper.altered=true;dragging=null}else if(!collision){selected=null;mapper.graph.unfocus();mapper.dirty=true}redraw(mapper)};mapper.DOM.addEventListener("mouseup",dragEnd);mapper.DOM.addEventListener("touchend",dragEnd);window.addEventListener("click",event=>{if(mapper.editMode&&event.target.id==="reason-overlay"){removeOverlay(mapper)}});window.addEventListener("keydown",event=>{if(window.currentMapper!==mapper){return}if(mapper.editMode){if(Keycode.isEventKey(event,"Escape"))removeOverlay(mapper);if(Keycode.isEventKey(event,"Enter"))submitOverlay(mapper)}else{if(isMetaKey(event))metaKeyPressed=true;if(!isMetaKey(event)&&Keycode.isEventKey(event,"tab")){event.preventDefault();if(event.shiftKey){mapper.graph.undoFocus()}else{selected=mapper.graph[0];mapper.graph.focus(selected)}console.log(mapper.graph.map(g=>g.id));mapper.dirty=true}if(metaKeyPressed&&Keycode.isEventKey(event,"z")){event.preventDefault();triggerUndo()}if(metaKeyPressed&&Keycode.isEventKey(event,"y")){event.preventDefault();triggerRedo()}if(selected&&Keycode.isEventKey(event,"Enter")){addOverlay(mapper,selected)}if(Keycode.isEventKey(event,"Delete")||Keycode.isEventKey(event,"Backspace")){if(document.activeElement.tagName!=="INPUT"){event.preventDefault()}if(selected){deleteElement(mapper,selected)}}}redraw(mapper)});window.addEventListener("keyup",event=>{if(isMetaKey(event))metaKeyPressed=false});window.addEventListener("resize",event=>{mapper.dirty=true;View.resize(mapper);View.zero(mapper);redraw(mapper)});const zoomAction=event=>{if(event.target.id===mapper.DOM.firstElementChild.id||event.type==="wheel"&&event.target.id===mapper.DOM.id){event.preventDefault();mapper.dirty=true;View.setScale(mapper,event.deltaY);View.zero(mapper);redraw(mapper)}else{if(mapper.inline&&!event.metaKey)metaWarning(mapper);return}};window.addEventListener("wheel",zoomAction,{passive:false});let _lastScale=1;hammer.on("pinch",hammerEvent=>{if(mapper._isSwipping){return}if(mapper.inline){panMove(hammerEvent)}hammerEvent.preventDefault();let tmpScale=hammerEvent.scale-_lastScale;mapper.dirty=true;View.setScale(mapper,tmpScale*1e3,true);View.zero(mapper);redraw(mapper);_lastScale=hammerEvent.scale});hammer.on("pinchend",()=>{_lastScale=1})}let timeout;function deleteElement(mapper,selected){mapper.graph.remove(selected);mapper.dirty=true}function metaWarning(mapper){console.log("Please hold CMD while scrolling to zoom")}function redraw(mapper){if(mapper.altered||mapper.dirty){if(timeout){window.cancelAnimationFrame(timeout)}timeout=window.requestAnimationFrame(function(){_redraw(mapper)})}}function _redraw(mapper){if(mapper.altered||mapper.dirty){if(mapper.altered){save(mapper.History,mapper);mapper.Future.length=0}View.draw(mapper);mapper.altered=false;mapper.dirty=false}}function save(store,mapper){const last=store.length==0?JSON.stringify([]):store[store.length-1];const current=JSON.stringify(mapper.graph.map(function(element){return element.export(mapper.offset)}));if(current!==last)store.push(current)}function changeLine(mapper,element,type){element.lineType=type;mapper.altered=true;redraw(mapper)}function toolbarNode(mapper,element){const node=Utils.buildNode("div",{id:"reasons-overlay-toolbar"});node.setAttribute("style","display: flex; flex-direction: row;");node.appendChild(Utils.buildNode("div",{style:"flex-grow: 1;"}));node.appendChild(toolButton({name:"<b>—</b>",onclick:()=>changeLine(mapper,element,"solid")}));node.appendChild(toolButton({name:"<b>- -</b>",onclick:()=>changeLine(mapper,element,"dashed")}));node.appendChild(toolButton({name:"Delete",onclick:()=>{if(confirm("Really remove this?")){deleteElement(mapper,element);removeOverlay(mapper);redraw(mapper)}}}));node.appendChild(toolButton({name:"OK",onclick:()=>{submitOverlay(mapper);redraw(mapper)}}));return node}function toolButton(opts){const{name:name}=opts;delete opts.name;const button=Utils.buildNode("button",opts,{class:"reason-overlay__button"});button.innerHTML=name;return button}function addOverlay(mapper,element,highlightAll=false){mapper.editMode=true;let overlay=Utils.buildNode("div",{id:"reason-overlay"});const wrapper=Utils.buildNode("div",{id:"reason-overlay__wrapper"});let input=Utils.buildNode("textarea",{id:"edit-reason-input",value:element.text||element.type});input.setAttribute("data-element",element.id);overlay.appendChild(wrapper);wrapper.appendChild(input);wrapper.appendChild(toolbarNode(mapper,element));document.body.appendChild(overlay);document.body.classList.add("modal");if(highlightAll){input.select();input.setSelectionRange(0,input.value.length)}input.scrollIntoView()}function submitOverlay(mapper){let input=document.querySelector("#edit-reason-input");let el=mapper.graph.elements().find(el=>el.id==input.getAttribute("data-element"));if(el.isNode()){el.text=input.value}else{el.type=input.value}removeOverlay(mapper)}function removeOverlay(argumentMap){argumentMap.editMode=false;argumentMap.altered=true;document.querySelector("#reason-overlay").remove();document.body.classList.remove("modal")}function isMetaKey(event){return event.metaKey||Keycode.isEventKey(event,"Alt")||Keycode.isEventKey(event,"Meta")||Keycode.isEventKey(event,"Command")||Keycode.isEventKey(event,"Control")||Keycode.isEventKey(event,"Win")||Keycode.isEventKey(event,"ControlLeft")||Keycode.isEventKey(event,"ControlRight")?true:false}},{"./graph":4,"./utils":8,"./view":9,hammerjs:13,keycode:14}],8:[function(require,module,exports){arguments[4][2][0].apply(exports,arguments)},{"array-difference":10,"array-flatten":11,"array-unique":12,dup:2}],9:[function(require,module,exports){"use strict";const Element=require("./Element");const Utils=require("./utils");const maxWidth=200;const padding=10;const fontSize=16;const cornerRadius=4;const rgbFocused="81,36,122";const rgbDefault="0,0,0";let dpr=1;let graph={};function getLocal(point){return point}function getGlobal(point){return point/dpr}module.exports=function(){function init(mapper){dpr=window.devicePixelRatio||1;mapper.scale=1;mapper.offset={x:0,y:0};mapper.inline=mapper.DOM.getAttribute("data-reasons-layout")=="inline";let domBB=mapper.DOM.getBoundingClientRect();let canvas=Utils.buildNode("canvas",{id:"reasons-"+mapper.DOM.id},{width:domBB.width,height:domBB.height||window.innerHeight});mapper.context=canvas.getContext("2d",{alpha:true});mapper.DOM.style["min-height"]="100px";mapper.DOM.style["min-width"]="100px";mapper.DOM.appendChild(canvas);resize(mapper)}function draw(mapper){clear(mapper);graph=mapper.graph;graph.edges().forEach(el=>draw_edge(el,mapper));graph.nodes().forEach(el=>draw_node(el,mapper))}function zero(mapper){let nodeBB=mapper.graph.nodes().map(node=>{return{x1:node.x1,x2:node.x2,y1:node.y1,y2:node.y2}}).reduce((acc,cur)=>{return{x1:Math.min(acc.x1,cur.x1),x2:Math.max(acc.x2,cur.x2),y1:Math.min(acc.y1,cur.y1),y2:Math.max(acc.y2,cur.y2)}});let mid={x:(mapper.DOM.clientWidth-mapper.DOM.clientLeft)/2/mapper.scale+mapper.DOM.clientLeft-((nodeBB.x2-nodeBB.x1)/2+nodeBB.x1),y:(mapper.DOM.clientHeight-mapper.DOM.clientTop)/2/mapper.scale+mapper.DOM.clientTop-((nodeBB.y2-nodeBB.y1)/2+nodeBB.y1)};mapper.graph.nodes().forEach(node=>{node.x1+=mid.x;node.x2+=mid.x;node.y1+=mid.y;node.y2+=mid.y})}function resize(mapper){mapper.DOM.width=mapper.DOM.clientWidth-mapper.DOM.clientLeft;mapper.DOM.height=mapper.DOM.clientHeight-mapper.DOM.clientTop;const canvas=mapper.DOM.querySelector("canvas");canvas.width=mapper.DOM.width*dpr;canvas.height=mapper.DOM.height*dpr;mapper.DOM.style.overflow="hidden";canvas.style["transform-origin"]="top left";canvas.style.transform="scale("+1/dpr+")";mapper.context.scale(dpr*mapper.scale,dpr*mapper.scale)}function setScale(mapper,newScale,transform=true){const relativeScale=transform?1+newScale/1e3:newScale;const updatedScale=mapper.scale*relativeScale;if(updatedScale<10&&updatedScale>.4){mapper.scale=mapper.scale*relativeScale;mapper.context.scale(relativeScale,relativeScale)}}return{init:init,draw:draw,zero:zero,setScale:setScale,resize:resize}}();function clear(mapper){let domBB=mapper.DOM.getBoundingClientRect();mapper.context.clearRect(0,0,domBB.width/mapper.scale,domBB.height/mapper.scale)}function draw_node(node,{context:context,offset:offset}){context.font=fontSize+"px sans-serif";const text=wordWrap(node.text,context);const rgb=node.hovering?rgbFocused:rgbDefault;const opacity=node.focused?.9:node.hovering?.75:.5;const ox=offset.x;const oy=offset.y;node.height=text.length*fontSize*1.22+fontSize*(text.length>1?2:1.75);resizeNode(node);context.clearRect(node.x1+ox,node.y1+oy,node.width,node.height);context.strokeStyle="rgba("+rgb+","+opacity+")";context.lineJoin="round";context.lineWidth=cornerRadius;if(node.lineType=="dashed"){context.setLineDash([10,10]);context.lineWidth*=.75}context.strokeRect(node.x1+cornerRadius/2+ox,node.y1+cornerRadius/2+oy,node.width-cornerRadius,node.height-cornerRadius);context.setLineDash([]);context.fillStyle="rgba("+rgb+",0.8)";context.textAlign="center";const lineHeight=fontSize*1.25;const textX=node.x1+ox+node.width/2;const textY=node.y1+oy+cornerRadius*2;text.forEach((line,i)=>{context.fillText(line,textX,textY+(i+1)*lineHeight,node.width)})}function draw_edge(edge,{context:context,offset:offset}){locate(edge);const ox=offset.x;const oy=offset.y;const rgb=edge.hovering?rgbFocused:rgbDefault;const opacity=edge.focused?.9:edge.hovering?.75:.5;context.strokeStyle="rgba("+rgb+","+opacity+")";context.lineWidth=4;context.beginPath();edge.paths.forEach(path=>{context.moveTo(path.x1+ox,path.y1+oy);context.lineTo(path.x2+ox,path.y2+oy)});let last=edge.paths[edge.paths.length-1];let arrow=arrowify(last);context.lineTo(arrow.x1+ox,arrow.y1+oy);context.moveTo(last.x2+ox,last.y2+oy);context.lineTo(arrow.x2+ox,arrow.y2+oy);context.stroke();let textWidth=context.measureText(edge.type).width+padding;context.clearRect(edge.center.x+ox-textWidth/2,edge.center.y+oy-15,textWidth,25);context.fillStyle="rgba("+rgb+",0.8)";context.font=14+"px sans-serif";context.textAlign="center";context.fillText(edge.type,edge.center.x+ox,edge.center.y+oy);if(edge.intersection)context.fillRect(edge.intersection.x+ox,edge.intersection.y+oy,10,10)}function locate(edge){let ids=Utils.flatten([edge.from,edge.to]);let elements=graph.filter(el=>{return ids.includes(el.id)});let coords=elements.map(el=>{return{x:getLocal(el.x1+el.width/2),y:getLocal(el.y1+el.height/2)}});let xs=coords.map(el=>el.x);let ys=coords.map(el=>el.y);edge.center={x:getLocal(Math.max(...xs)-(Math.max(...xs)-Math.min(...xs))/2),y:getLocal(Math.max(...ys)-(Math.max(...ys)-Math.min(...ys))/2)};edge.paths=edge.from.map(node=>{let el=elements.find(e=>e.id==node);return{x1:el.x1+(el.x2-el.x1)/2,y1:el.y1+(el.y2-el.y1)/2,x2:edge.center.x,y2:edge.center.y}});let to=elements.find(e=>e.id==edge.to);let offset=pointOfIntersection(edge.center,to,5);edge.paths.push({x1:edge.center.x,y1:edge.center.y,x2:to.x1+(to.x2-to.x1)/2-offset.x,y2:to.y1+(to.y2-to.y1)/2+offset.y})}function resizeNode(node){node.x2=node.x1+node.width;node.y2=node.y1+node.height}function wordWrap(text,context){let words=text.split(" ");let lines=[];let line="";words.forEach(word=>{let width=context.measureText(line+" "+word).width;if(width<maxWidth-padding*2){line+=" "+word}else{lines.push(line);line=word}});lines.push(line);return lines}function arrowify(path){let angle=Math.atan2(path.y1-path.y2,path.x1-path.x2);return{x1:path.x2+10*Math.cos(angle+.5),y1:path.y2+10*Math.sin(angle+.5),x2:path.x2+10*Math.cos(angle-.5),y2:path.y2+10*Math.sin(angle-.5)}}function pointOfIntersection(from,rect,buffer){let center={x:rect.x1+rect.width/2,y:rect.y1+rect.height/2};let angle=Math.atan2(from.y-center.y,center.x-from.x);let absCos=Math.abs(Math.cos(angle));let absSin=Math.abs(Math.sin(angle));let distance=rect.width/2*absSin<=rect.height/2*absCos?rect.width/2/absCos:rect.height/2/absSin;distance+=buffer||0;return{x:distance*Math.cos(angle),y:distance*Math.sin(angle)}}},{"./Element":1,"./utils":8}],10:[function(require,module,exports){(function(global){var indexOf=Array.prototype.indexOf||function(elem){var idx,len;if(this==null){throw new TypeError("indexOf called on null or undefined")}for(idx=0,len=this.length;idx<len;++idx){if(this[idx]===elem){return idx}}return-1};function difference(a,b){var idx,len;var res=[];for(idx=0,len=a.length;idx<len;++idx){if(indexOf.call(b,a[idx])===-1){res.push(a[idx])}}for(idx=0,len=b.length;idx<len;++idx){if(indexOf.call(a,b[idx])===-1){res.push(b[idx])}}return res}if(typeof module==="object"&&module.exports){module.exports=difference}else if(typeof define==="function"&&define.amd){define(function(){return difference})}else{global.difference=difference}})(this)},{}],11:[function(require,module,exports){"use strict";module.exports=flatten;module.exports.from=flattenFrom;module.exports.depth=flattenDepth;module.exports.fromDepth=flattenFromDepth;function flatten(array){if(!Array.isArray(array)){throw new TypeError("Expected value to be an array")}return flattenFrom(array)}function flattenFrom(array){return flattenDown(array,[])}function flattenDepth(array,depth){if(!Array.isArray(array)){throw new TypeError("Expected value to be an array")}return flattenFromDepth(array,depth)}function flattenFromDepth(array,depth){if(typeof depth!=="number"){throw new TypeError("Expected the depth to be a number")}return flattenDownDepth(array,[],depth)}function flattenDown(array,result){for(var i=0;i<array.length;i++){var value=array[i];if(Array.isArray(value)){flattenDown(value,result)}else{result.push(value)}}return result}function flattenDownDepth(array,result,depth){depth--;for(var i=0;i<array.length;i++){var value=array[i];if(depth>-1&&Array.isArray(value)){flattenDownDepth(value,result,depth)}else{result.push(value)}}return result}},{}],12:[function(require,module,exports){"use strict";module.exports=function unique(arr){if(!Array.isArray(arr)){throw new TypeError("array-unique expects an array.")}var len=arr.length;var i=-1;while(i++<len){var j=i+1;for(;j<arr.length;++j){if(arr[i]===arr[j]){arr.splice(j--,1)}}}return arr};module.exports.immutable=function uniqueImmutable(arr){if(!Array.isArray(arr)){throw new TypeError("array-unique expects an array.")}var arrLen=arr.length;var newArr=new Array(arrLen);for(var i=0;i<arrLen;i++){newArr[i]=arr[i]}return module.exports(newArr)}},{}],13:[function(require,module,exports){(function(window,document,exportName,undefined){"use strict";var VENDOR_PREFIXES=["","webkit","Moz","MS","ms","o"];var TEST_ELEMENT=document.createElement("div");var TYPE_FUNCTION="function";var round=Math.round;var abs=Math.abs;var now=Date.now;function setTimeoutContext(fn,timeout,context){return setTimeout(bindFn(fn,context),timeout)}function invokeArrayArg(arg,fn,context){if(Array.isArray(arg)){each(arg,context[fn],context);return true}return false}function each(obj,iterator,context){var i;if(!obj){return}if(obj.forEach){obj.forEach(iterator,context)}else if(obj.length!==undefined){i=0;while(i<obj.length){iterator.call(context,obj[i],i,obj);i++}}else{for(i in obj){obj.hasOwnProperty(i)&&iterator.call(context,obj[i],i,obj)}}}function deprecate(method,name,message){var deprecationMessage="DEPRECATED METHOD: "+name+"\n"+message+" AT \n";return function(){var e=new Error("get-stack-trace");var stack=e&&e.stack?e.stack.replace(/^[^\(]+?[\n$]/gm,"").replace(/^\s+at\s+/gm,"").replace(/^Object.<anonymous>\s*\(/gm,"{anonymous}()@"):"Unknown Stack Trace";var log=window.console&&(window.console.warn||window.console.log);if(log){log.call(window.console,deprecationMessage,stack)}return method.apply(this,arguments)}}var assign;if(typeof Object.assign!=="function"){assign=function assign(target){if(target===undefined||target===null){throw new TypeError("Cannot convert undefined or null to object")}var output=Object(target);for(var index=1;index<arguments.length;index++){var source=arguments[index];if(source!==undefined&&source!==null){for(var nextKey in source){if(source.hasOwnProperty(nextKey)){output[nextKey]=source[nextKey]}}}}return output}}else{assign=Object.assign}var extend=deprecate(function extend(dest,src,merge){var keys=Object.keys(src);var i=0;while(i<keys.length){if(!merge||merge&&dest[keys[i]]===undefined){dest[keys[i]]=src[keys[i]]}i++}return dest},"extend","Use `assign`.");var merge=deprecate(function merge(dest,src){return extend(dest,src,true)},"merge","Use `assign`.");function inherit(child,base,properties){var baseP=base.prototype,childP;childP=child.prototype=Object.create(baseP);childP.constructor=child;childP._super=baseP;if(properties){assign(childP,properties)}}function bindFn(fn,context){return function boundFn(){return fn.apply(context,arguments)}}function boolOrFn(val,args){if(typeof val==TYPE_FUNCTION){return val.apply(args?args[0]||undefined:undefined,args)}return val}function ifUndefined(val1,val2){return val1===undefined?val2:val1}function addEventListeners(target,types,handler){each(splitStr(types),function(type){target.addEventListener(type,handler,false)})}function removeEventListeners(target,types,handler){each(splitStr(types),function(type){target.removeEventListener(type,handler,false)})}function hasParent(node,parent){while(node){if(node==parent){return true}node=node.parentNode}return false}function inStr(str,find){return str.indexOf(find)>-1}function splitStr(str){return str.trim().split(/\s+/g)}function inArray(src,find,findByKey){if(src.indexOf&&!findByKey){return src.indexOf(find)}else{var i=0;while(i<src.length){if(findByKey&&src[i][findByKey]==find||!findByKey&&src[i]===find){return i}i++}return-1}}function toArray(obj){return Array.prototype.slice.call(obj,0)}function uniqueArray(src,key,sort){var results=[];var values=[];var i=0;while(i<src.length){var val=key?src[i][key]:src[i];if(inArray(values,val)<0){results.push(src[i])}values[i]=val;i++}if(sort){if(!key){results=results.sort()}else{results=results.sort(function sortUniqueArray(a,b){return a[key]>b[key]})}}return results}function prefixed(obj,property){var prefix,prop;var camelProp=property[0].toUpperCase()+property.slice(1);var i=0;while(i<VENDOR_PREFIXES.length){prefix=VENDOR_PREFIXES[i];prop=prefix?prefix+camelProp:property;if(prop in obj){return prop}i++}return undefined}var _uniqueId=1;function uniqueId(){return _uniqueId++}function getWindowForElement(element){var doc=element.ownerDocument||element;return doc.defaultView||doc.parentWindow||window}var MOBILE_REGEX=/mobile|tablet|ip(ad|hone|od)|android/i;var SUPPORT_TOUCH="ontouchstart"in window;var SUPPORT_POINTER_EVENTS=prefixed(window,"PointerEvent")!==undefined;var SUPPORT_ONLY_TOUCH=SUPPORT_TOUCH&&MOBILE_REGEX.test(navigator.userAgent);var INPUT_TYPE_TOUCH="touch";var INPUT_TYPE_PEN="pen";var INPUT_TYPE_MOUSE="mouse";var INPUT_TYPE_KINECT="kinect";var COMPUTE_INTERVAL=25;var INPUT_START=1;var INPUT_MOVE=2;var INPUT_END=4;var INPUT_CANCEL=8;var DIRECTION_NONE=1;var DIRECTION_LEFT=2;var DIRECTION_RIGHT=4;var DIRECTION_UP=8;var DIRECTION_DOWN=16;var DIRECTION_HORIZONTAL=DIRECTION_LEFT|DIRECTION_RIGHT;var DIRECTION_VERTICAL=DIRECTION_UP|DIRECTION_DOWN;var DIRECTION_ALL=DIRECTION_HORIZONTAL|DIRECTION_VERTICAL;var PROPS_XY=["x","y"];var PROPS_CLIENT_XY=["clientX","clientY"];function Input(manager,callback){var self=this;this.manager=manager;this.callback=callback;this.element=manager.element;this.target=manager.options.inputTarget;this.domHandler=function(ev){if(boolOrFn(manager.options.enable,[manager])){self.handler(ev)}};this.init()}Input.prototype={handler:function(){},init:function(){this.evEl&&addEventListeners(this.element,this.evEl,this.domHandler);this.evTarget&&addEventListeners(this.target,this.evTarget,this.domHandler);this.evWin&&addEventListeners(getWindowForElement(this.element),this.evWin,this.domHandler)},destroy:function(){this.evEl&&removeEventListeners(this.element,this.evEl,this.domHandler);this.evTarget&&removeEventListeners(this.target,this.evTarget,this.domHandler);this.evWin&&removeEventListeners(getWindowForElement(this.element),this.evWin,this.domHandler)}};function createInputInstance(manager){var Type;var inputClass=manager.options.inputClass;if(inputClass){Type=inputClass}else if(SUPPORT_POINTER_EVENTS){Type=PointerEventInput}else if(SUPPORT_ONLY_TOUCH){Type=TouchInput}else if(!SUPPORT_TOUCH){Type=MouseInput}else{Type=TouchMouseInput}return new Type(manager,inputHandler)}function inputHandler(manager,eventType,input){var pointersLen=input.pointers.length;var changedPointersLen=input.changedPointers.length;var isFirst=eventType&INPUT_START&&pointersLen-changedPointersLen===0;var isFinal=eventType&(INPUT_END|INPUT_CANCEL)&&pointersLen-changedPointersLen===0;input.isFirst=!!isFirst;input.isFinal=!!isFinal;if(isFirst){manager.session={}}input.eventType=eventType;computeInputData(manager,input);manager.emit("hammer.input",input);manager.recognize(input);manager.session.prevInput=input}function computeInputData(manager,input){var session=manager.session;var pointers=input.pointers;var pointersLength=pointers.length;if(!session.firstInput){session.firstInput=simpleCloneInputData(input)}if(pointersLength>1&&!session.firstMultiple){session.firstMultiple=simpleCloneInputData(input)}else if(pointersLength===1){session.firstMultiple=false}var firstInput=session.firstInput;var firstMultiple=session.firstMultiple;var offsetCenter=firstMultiple?firstMultiple.center:firstInput.center;var center=input.center=getCenter(pointers);input.timeStamp=now();input.deltaTime=input.timeStamp-firstInput.timeStamp;input.angle=getAngle(offsetCenter,center);input.distance=getDistance(offsetCenter,center);computeDeltaXY(session,input);input.offsetDirection=getDirection(input.deltaX,input.deltaY);var overallVelocity=getVelocity(input.deltaTime,input.deltaX,input.deltaY);input.overallVelocityX=overallVelocity.x;input.overallVelocityY=overallVelocity.y;input.overallVelocity=abs(overallVelocity.x)>abs(overallVelocity.y)?overallVelocity.x:overallVelocity.y;input.scale=firstMultiple?getScale(firstMultiple.pointers,pointers):1;input.rotation=firstMultiple?getRotation(firstMultiple.pointers,pointers):0;input.maxPointers=!session.prevInput?input.pointers.length:input.pointers.length>session.prevInput.maxPointers?input.pointers.length:session.prevInput.maxPointers;computeIntervalInputData(session,input);var target=manager.element;if(hasParent(input.srcEvent.target,target)){target=input.srcEvent.target}input.target=target}function computeDeltaXY(session,input){var center=input.center;var offset=session.offsetDelta||{};var prevDelta=session.prevDelta||{};var prevInput=session.prevInput||{};if(input.eventType===INPUT_START||prevInput.eventType===INPUT_END){prevDelta=session.prevDelta={x:prevInput.deltaX||0,y:prevInput.deltaY||0};offset=session.offsetDelta={x:center.x,y:center.y}}input.deltaX=prevDelta.x+(center.x-offset.x);input.deltaY=prevDelta.y+(center.y-offset.y)}function computeIntervalInputData(session,input){var last=session.lastInterval||input,deltaTime=input.timeStamp-last.timeStamp,velocity,velocityX,velocityY,direction;if(input.eventType!=INPUT_CANCEL&&(deltaTime>COMPUTE_INTERVAL||last.velocity===undefined)){var deltaX=input.deltaX-last.deltaX;var deltaY=input.deltaY-last.deltaY;var v=getVelocity(deltaTime,deltaX,deltaY);velocityX=v.x;velocityY=v.y;velocity=abs(v.x)>abs(v.y)?v.x:v.y;direction=getDirection(deltaX,deltaY);session.lastInterval=input}else{velocity=last.velocity;velocityX=last.velocityX;velocityY=last.velocityY;direction=last.direction}input.velocity=velocity;input.velocityX=velocityX;input.velocityY=velocityY;input.direction=direction}function simpleCloneInputData(input){var pointers=[];var i=0;while(i<input.pointers.length){pointers[i]={clientX:round(input.pointers[i].clientX),clientY:round(input.pointers[i].clientY)};i++}return{timeStamp:now(),pointers:pointers,center:getCenter(pointers),deltaX:input.deltaX,deltaY:input.deltaY}}function getCenter(pointers){var pointersLength=pointers.length;if(pointersLength===1){return{x:round(pointers[0].clientX),y:round(pointers[0].clientY)}}var x=0,y=0,i=0;while(i<pointersLength){x+=pointers[i].clientX;y+=pointers[i].clientY;i++}return{x:round(x/pointersLength),y:round(y/pointersLength)}}function getVelocity(deltaTime,x,y){return{x:x/deltaTime||0,y:y/deltaTime||0}}function getDirection(x,y){if(x===y){return DIRECTION_NONE}if(abs(x)>=abs(y)){return x<0?DIRECTION_LEFT:DIRECTION_RIGHT}return y<0?DIRECTION_UP:DIRECTION_DOWN}function getDistance(p1,p2,props){if(!props){props=PROPS_XY}var x=p2[props[0]]-p1[props[0]],y=p2[props[1]]-p1[props[1]];return Math.sqrt(x*x+y*y)}function getAngle(p1,p2,props){if(!props){props=PROPS_XY}var x=p2[props[0]]-p1[props[0]],y=p2[props[1]]-p1[props[1]];return Math.atan2(y,x)*180/Math.PI}function getRotation(start,end){return getAngle(end[1],end[0],PROPS_CLIENT_XY)+getAngle(start[1],start[0],PROPS_CLIENT_XY)}function getScale(start,end){return getDistance(end[0],end[1],PROPS_CLIENT_XY)/getDistance(start[0],start[1],PROPS_CLIENT_XY)}var MOUSE_INPUT_MAP={mousedown:INPUT_START,mousemove:INPUT_MOVE,mouseup:INPUT_END};var MOUSE_ELEMENT_EVENTS="mousedown";var MOUSE_WINDOW_EVENTS="mousemove mouseup";function MouseInput(){this.evEl=MOUSE_ELEMENT_EVENTS;this.evWin=MOUSE_WINDOW_EVENTS;this.pressed=false;Input.apply(this,arguments)}inherit(MouseInput,Input,{handler:function MEhandler(ev){var eventType=MOUSE_INPUT_MAP[ev.type];if(eventType&INPUT_START&&ev.button===0){this.pressed=true}if(eventType&INPUT_MOVE&&ev.which!==1){eventType=INPUT_END}if(!this.pressed){return}if(eventType&INPUT_END){this.pressed=false}this.callback(this.manager,eventType,{pointers:[ev],changedPointers:[ev],pointerType:INPUT_TYPE_MOUSE,srcEvent:ev})}});var POINTER_INPUT_MAP={pointerdown:INPUT_START,pointermove:INPUT_MOVE,pointerup:INPUT_END,pointercancel:INPUT_CANCEL,pointerout:INPUT_CANCEL};var IE10_POINTER_TYPE_ENUM={2:INPUT_TYPE_TOUCH,3:INPUT_TYPE_PEN,4:INPUT_TYPE_MOUSE,5:INPUT_TYPE_KINECT};var POINTER_ELEMENT_EVENTS="pointerdown";var POINTER_WINDOW_EVENTS="pointermove pointerup pointercancel";if(window.MSPointerEvent&&!window.PointerEvent){POINTER_ELEMENT_EVENTS="MSPointerDown";POINTER_WINDOW_EVENTS="MSPointerMove MSPointerUp MSPointerCancel"}function PointerEventInput(){this.evEl=POINTER_ELEMENT_EVENTS;this.evWin=POINTER_WINDOW_EVENTS;Input.apply(this,arguments);this.store=this.manager.session.pointerEvents=[]}inherit(PointerEventInput,Input,{handler:function PEhandler(ev){var store=this.store;var removePointer=false;var eventTypeNormalized=ev.type.toLowerCase().replace("ms","");var eventType=POINTER_INPUT_MAP[eventTypeNormalized];var pointerType=IE10_POINTER_TYPE_ENUM[ev.pointerType]||ev.pointerType;var isTouch=pointerType==INPUT_TYPE_TOUCH;var storeIndex=inArray(store,ev.pointerId,"pointerId");if(eventType&INPUT_START&&(ev.button===0||isTouch)){if(storeIndex<0){store.push(ev);storeIndex=store.length-1}}else if(eventType&(INPUT_END|INPUT_CANCEL)){removePointer=true}if(storeIndex<0){return}store[storeIndex]=ev;this.callback(this.manager,eventType,{pointers:store,changedPointers:[ev],pointerType:pointerType,srcEvent:ev});if(removePointer){store.splice(storeIndex,1)}}});var SINGLE_TOUCH_INPUT_MAP={touchstart:INPUT_START,touchmove:INPUT_MOVE,touchend:INPUT_END,touchcancel:INPUT_CANCEL};var SINGLE_TOUCH_TARGET_EVENTS="touchstart";var SINGLE_TOUCH_WINDOW_EVENTS="touchstart touchmove touchend touchcancel";function SingleTouchInput(){this.evTarget=SINGLE_TOUCH_TARGET_EVENTS;this.evWin=SINGLE_TOUCH_WINDOW_EVENTS;this.started=false;Input.apply(this,arguments)}inherit(SingleTouchInput,Input,{handler:function TEhandler(ev){var type=SINGLE_TOUCH_INPUT_MAP[ev.type];if(type===INPUT_START){this.started=true}if(!this.started){return}var touches=normalizeSingleTouches.call(this,ev,type);if(type&(INPUT_END|INPUT_CANCEL)&&touches[0].length-touches[1].length===0){this.started=false}this.callback(this.manager,type,{pointers:touches[0],changedPointers:touches[1],pointerType:INPUT_TYPE_TOUCH,srcEvent:ev})}});function normalizeSingleTouches(ev,type){var all=toArray(ev.touches);var changed=toArray(ev.changedTouches);if(type&(INPUT_END|INPUT_CANCEL)){all=uniqueArray(all.concat(changed),"identifier",true)}return[all,changed]}var TOUCH_INPUT_MAP={touchstart:INPUT_START,touchmove:INPUT_MOVE,touchend:INPUT_END,touchcancel:INPUT_CANCEL};var TOUCH_TARGET_EVENTS="touchstart touchmove touchend touchcancel";function TouchInput(){this.evTarget=TOUCH_TARGET_EVENTS;this.targetIds={};Input.apply(this,arguments)}inherit(TouchInput,Input,{handler:function MTEhandler(ev){var type=TOUCH_INPUT_MAP[ev.type];var touches=getTouches.call(this,ev,type);if(!touches){return}this.callback(this.manager,type,{pointers:touches[0],changedPointers:touches[1],pointerType:INPUT_TYPE_TOUCH,srcEvent:ev})}});function getTouches(ev,type){var allTouches=toArray(ev.touches);var targetIds=this.targetIds;if(type&(INPUT_START|INPUT_MOVE)&&allTouches.length===1){targetIds[allTouches[0].identifier]=true;return[allTouches,allTouches]}var i,targetTouches,changedTouches=toArray(ev.changedTouches),changedTargetTouches=[],target=this.target;targetTouches=allTouches.filter(function(touch){return hasParent(touch.target,target)});if(type===INPUT_START){i=0;while(i<targetTouches.length){targetIds[targetTouches[i].identifier]=true;i++}}i=0;while(i<changedTouches.length){if(targetIds[changedTouches[i].identifier]){changedTargetTouches.push(changedTouches[i])}if(type&(INPUT_END|INPUT_CANCEL)){delete targetIds[changedTouches[i].identifier]}i++}if(!changedTargetTouches.length){return}return[uniqueArray(targetTouches.concat(changedTargetTouches),"identifier",true),changedTargetTouches]}var DEDUP_TIMEOUT=2500;var DEDUP_DISTANCE=25;function TouchMouseInput(){Input.apply(this,arguments);var handler=bindFn(this.handler,this);this.touch=new TouchInput(this.manager,handler);this.mouse=new MouseInput(this.manager,handler);this.primaryTouch=null;this.lastTouches=[]}inherit(TouchMouseInput,Input,{handler:function TMEhandler(manager,inputEvent,inputData){var isTouch=inputData.pointerType==INPUT_TYPE_TOUCH,isMouse=inputData.pointerType==INPUT_TYPE_MOUSE;if(isMouse&&inputData.sourceCapabilities&&inputData.sourceCapabilities.firesTouchEvents){return}if(isTouch){recordTouches.call(this,inputEvent,inputData)}else if(isMouse&&isSyntheticEvent.call(this,inputData)){return}this.callback(manager,inputEvent,inputData)},destroy:function destroy(){this.touch.destroy();this.mouse.destroy()}});function recordTouches(eventType,eventData){if(eventType&INPUT_START){this.primaryTouch=eventData.changedPointers[0].identifier;setLastTouch.call(this,eventData)}else if(eventType&(INPUT_END|INPUT_CANCEL)){setLastTouch.call(this,eventData)}}function setLastTouch(eventData){var touch=eventData.changedPointers[0];if(touch.identifier===this.primaryTouch){var lastTouch={x:touch.clientX,y:touch.clientY};this.lastTouches.push(lastTouch);var lts=this.lastTouches;var removeLastTouch=function(){var i=lts.indexOf(lastTouch);if(i>-1){lts.splice(i,1)}};setTimeout(removeLastTouch,DEDUP_TIMEOUT)}}function isSyntheticEvent(eventData){var x=eventData.srcEvent.clientX,y=eventData.srcEvent.clientY;for(var i=0;i<this.lastTouches.length;i++){var t=this.lastTouches[i];var dx=Math.abs(x-t.x),dy=Math.abs(y-t.y);if(dx<=DEDUP_DISTANCE&&dy<=DEDUP_DISTANCE){return true}}return false}var PREFIXED_TOUCH_ACTION=prefixed(TEST_ELEMENT.style,"touchAction");var NATIVE_TOUCH_ACTION=PREFIXED_TOUCH_ACTION!==undefined;var TOUCH_ACTION_COMPUTE="compute";var TOUCH_ACTION_AUTO="auto";var TOUCH_ACTION_MANIPULATION="manipulation";var TOUCH_ACTION_NONE="none";var TOUCH_ACTION_PAN_X="pan-x";var TOUCH_ACTION_PAN_Y="pan-y";var TOUCH_ACTION_MAP=getTouchActionProps();function TouchAction(manager,value){this.manager=manager;this.set(value)}TouchAction.prototype={set:function(value){if(value==TOUCH_ACTION_COMPUTE){value=this.compute()}if(NATIVE_TOUCH_ACTION&&this.manager.element.style&&TOUCH_ACTION_MAP[value]){this.manager.element.style[PREFIXED_TOUCH_ACTION]=value}this.actions=value.toLowerCase().trim()},update:function(){this.set(this.manager.options.touchAction)},compute:function(){var actions=[];each(this.manager.recognizers,function(recognizer){if(boolOrFn(recognizer.options.enable,[recognizer])){actions=actions.concat(recognizer.getTouchAction())}});return cleanTouchActions(actions.join(" "))},preventDefaults:function(input){var srcEvent=input.srcEvent;var direction=input.offsetDirection;if(this.manager.session.prevented){srcEvent.preventDefault();return}var actions=this.actions;var hasNone=inStr(actions,TOUCH_ACTION_NONE)&&!TOUCH_ACTION_MAP[TOUCH_ACTION_NONE];var hasPanY=inStr(actions,TOUCH_ACTION_PAN_Y)&&!TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_Y];var hasPanX=inStr(actions,TOUCH_ACTION_PAN_X)&&!TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_X];if(hasNone){var isTapPointer=input.pointers.length===1;var isTapMovement=input.distance<2;var isTapTouchTime=input.deltaTime<250;if(isTapPointer&&isTapMovement&&isTapTouchTime){return}}if(hasPanX&&hasPanY){return}if(hasNone||hasPanY&&direction&DIRECTION_HORIZONTAL||hasPanX&&direction&DIRECTION_VERTICAL){return this.preventSrc(srcEvent)}},preventSrc:function(srcEvent){this.manager.session.prevented=true;srcEvent.preventDefault()}};function cleanTouchActions(actions){if(inStr(actions,TOUCH_ACTION_NONE)){return TOUCH_ACTION_NONE}var hasPanX=inStr(actions,TOUCH_ACTION_PAN_X);var hasPanY=inStr(actions,TOUCH_ACTION_PAN_Y);if(hasPanX&&hasPanY){return TOUCH_ACTION_NONE}if(hasPanX||hasPanY){return hasPanX?TOUCH_ACTION_PAN_X:TOUCH_ACTION_PAN_Y}if(inStr(actions,TOUCH_ACTION_MANIPULATION)){return TOUCH_ACTION_MANIPULATION}return TOUCH_ACTION_AUTO}function getTouchActionProps(){if(!NATIVE_TOUCH_ACTION){return false}var touchMap={};var cssSupports=window.CSS&&window.CSS.supports;["auto","manipulation","pan-y","pan-x","pan-x pan-y","none"].forEach(function(val){touchMap[val]=cssSupports?window.CSS.supports("touch-action",val):true});return touchMap}var STATE_POSSIBLE=1;var STATE_BEGAN=2;var STATE_CHANGED=4;var STATE_ENDED=8;var STATE_RECOGNIZED=STATE_ENDED;var STATE_CANCELLED=16;var STATE_FAILED=32;function Recognizer(options){this.options=assign({},this.defaults,options||{});this.id=uniqueId();this.manager=null;this.options.enable=ifUndefined(this.options.enable,true);this.state=STATE_POSSIBLE;this.simultaneous={};this.requireFail=[]}Recognizer.prototype={defaults:{},set:function(options){assign(this.options,options);this.manager&&this.manager.touchAction.update();return this},recognizeWith:function(otherRecognizer){if(invokeArrayArg(otherRecognizer,"recognizeWith",this)){return this}var simultaneous=this.simultaneous;otherRecognizer=getRecognizerByNameIfManager(otherRecognizer,this);if(!simultaneous[otherRecognizer.id]){simultaneous[otherRecognizer.id]=otherRecognizer;otherRecognizer.recognizeWith(this)}return this},dropRecognizeWith:function(otherRecognizer){if(invokeArrayArg(otherRecognizer,"dropRecognizeWith",this)){return this}otherRecognizer=getRecognizerByNameIfManager(otherRecognizer,this);delete this.simultaneous[otherRecognizer.id];return this},requireFailure:function(otherRecognizer){if(invokeArrayArg(otherRecognizer,"requireFailure",this)){return this}var requireFail=this.requireFail;otherRecognizer=getRecognizerByNameIfManager(otherRecognizer,this);if(inArray(requireFail,otherRecognizer)===-1){requireFail.push(otherRecognizer);otherRecognizer.requireFailure(this)}return this},dropRequireFailure:function(otherRecognizer){if(invokeArrayArg(otherRecognizer,"dropRequireFailure",this)){return this}otherRecognizer=getRecognizerByNameIfManager(otherRecognizer,this);var index=inArray(this.requireFail,otherRecognizer);if(index>-1){this.requireFail.splice(index,1)}return this},hasRequireFailures:function(){return this.requireFail.length>0},canRecognizeWith:function(otherRecognizer){return!!this.simultaneous[otherRecognizer.id]},emit:function(input){var self=this;var state=this.state;function emit(event){self.manager.emit(event,input)}if(state<STATE_ENDED){emit(self.options.event+stateStr(state))}emit(self.options.event);if(input.additionalEvent){emit(input.additionalEvent)}if(state>=STATE_ENDED){emit(self.options.event+stateStr(state))}},tryEmit:function(input){if(this.canEmit()){return this.emit(input)}this.state=STATE_FAILED},canEmit:function(){var i=0;while(i<this.requireFail.length){if(!(this.requireFail[i].state&(STATE_FAILED|STATE_POSSIBLE))){return false}i++}return true},recognize:function(inputData){var inputDataClone=assign({},inputData);if(!boolOrFn(this.options.enable,[this,inputDataClone])){this.reset();this.state=STATE_FAILED;return}if(this.state&(STATE_RECOGNIZED|STATE_CANCELLED|STATE_FAILED)){this.state=STATE_POSSIBLE}this.state=this.process(inputDataClone);if(this.state&(STATE_BEGAN|STATE_CHANGED|STATE_ENDED|STATE_CANCELLED)){this.tryEmit(inputDataClone)}},process:function(inputData){},getTouchAction:function(){},reset:function(){}};function stateStr(state){if(state&STATE_CANCELLED){return"cancel"}else if(state&STATE_ENDED){return"end"}else if(state&STATE_CHANGED){return"move"}else if(state&STATE_BEGAN){return"start"}return""}function directionStr(direction){if(direction==DIRECTION_DOWN){return"down"}else if(direction==DIRECTION_UP){return"up"}else if(direction==DIRECTION_LEFT){return"left"}else if(direction==DIRECTION_RIGHT){return"right"}return""}function getRecognizerByNameIfManager(otherRecognizer,recognizer){var manager=recognizer.manager;if(manager){return manager.get(otherRecognizer)}return otherRecognizer}function AttrRecognizer(){Recognizer.apply(this,arguments)}inherit(AttrRecognizer,Recognizer,{defaults:{pointers:1},attrTest:function(input){var optionPointers=this.options.pointers;return optionPointers===0||input.pointers.length===optionPointers},process:function(input){var state=this.state;var eventType=input.eventType;var isRecognized=state&(STATE_BEGAN|STATE_CHANGED);var isValid=this.attrTest(input);if(isRecognized&&(eventType&INPUT_CANCEL||!isValid)){return state|STATE_CANCELLED}else if(isRecognized||isValid){if(eventType&INPUT_END){return state|STATE_ENDED}else if(!(state&STATE_BEGAN)){return STATE_BEGAN}return state|STATE_CHANGED}return STATE_FAILED}});function PanRecognizer(){AttrRecognizer.apply(this,arguments);this.pX=null;this.pY=null}inherit(PanRecognizer,AttrRecognizer,{defaults:{event:"pan",threshold:10,pointers:1,direction:DIRECTION_ALL},getTouchAction:function(){var direction=this.options.direction;var actions=[];if(direction&DIRECTION_HORIZONTAL){actions.push(TOUCH_ACTION_PAN_Y)}if(direction&DIRECTION_VERTICAL){actions.push(TOUCH_ACTION_PAN_X)}return actions},directionTest:function(input){var options=this.options;var hasMoved=true;var distance=input.distance;var direction=input.direction;var x=input.deltaX;var y=input.deltaY;if(!(direction&options.direction)){if(options.direction&DIRECTION_HORIZONTAL){direction=x===0?DIRECTION_NONE:x<0?DIRECTION_LEFT:DIRECTION_RIGHT;hasMoved=x!=this.pX;distance=Math.abs(input.deltaX)}else{direction=y===0?DIRECTION_NONE:y<0?DIRECTION_UP:DIRECTION_DOWN;hasMoved=y!=this.pY;distance=Math.abs(input.deltaY)}}input.direction=direction;return hasMoved&&distance>options.threshold&&direction&options.direction},attrTest:function(input){return AttrRecognizer.prototype.attrTest.call(this,input)&&(this.state&STATE_BEGAN||!(this.state&STATE_BEGAN)&&this.directionTest(input))},emit:function(input){this.pX=input.deltaX;this.pY=input.deltaY;var direction=directionStr(input.direction);if(direction){input.additionalEvent=this.options.event+direction}this._super.emit.call(this,input)}});function PinchRecognizer(){AttrRecognizer.apply(this,arguments)}inherit(PinchRecognizer,AttrRecognizer,{defaults:{event:"pinch",threshold:0,pointers:2},getTouchAction:function(){return[TOUCH_ACTION_NONE]},attrTest:function(input){return this._super.attrTest.call(this,input)&&(Math.abs(input.scale-1)>this.options.threshold||this.state&STATE_BEGAN)},emit:function(input){if(input.scale!==1){var inOut=input.scale<1?"in":"out";input.additionalEvent=this.options.event+inOut}this._super.emit.call(this,input)}});function PressRecognizer(){Recognizer.apply(this,arguments);this._timer=null;this._input=null}inherit(PressRecognizer,Recognizer,{defaults:{event:"press",pointers:1,time:251,threshold:9},getTouchAction:function(){return[TOUCH_ACTION_AUTO]},process:function(input){var options=this.options;var validPointers=input.pointers.length===options.pointers;var validMovement=input.distance<options.threshold;var validTime=input.deltaTime>options.time;this._input=input;if(!validMovement||!validPointers||input.eventType&(INPUT_END|INPUT_CANCEL)&&!validTime){this.reset()}else if(input.eventType&INPUT_START){this.reset();this._timer=setTimeoutContext(function(){this.state=STATE_RECOGNIZED;this.tryEmit()},options.time,this)}else if(input.eventType&INPUT_END){return STATE_RECOGNIZED}return STATE_FAILED},reset:function(){clearTimeout(this._timer)},emit:function(input){if(this.state!==STATE_RECOGNIZED){return}if(input&&input.eventType&INPUT_END){this.manager.emit(this.options.event+"up",input)}else{this._input.timeStamp=now();this.manager.emit(this.options.event,this._input)}}});function RotateRecognizer(){AttrRecognizer.apply(this,arguments)}inherit(RotateRecognizer,AttrRecognizer,{defaults:{event:"rotate",threshold:0,pointers:2},getTouchAction:function(){return[TOUCH_ACTION_NONE]},attrTest:function(input){return this._super.attrTest.call(this,input)&&(Math.abs(input.rotation)>this.options.threshold||this.state&STATE_BEGAN)}});function SwipeRecognizer(){AttrRecognizer.apply(this,arguments)}inherit(SwipeRecognizer,AttrRecognizer,{defaults:{event:"swipe",threshold:10,velocity:.3,direction:DIRECTION_HORIZONTAL|DIRECTION_VERTICAL,pointers:1},getTouchAction:function(){return PanRecognizer.prototype.getTouchAction.call(this)},attrTest:function(input){var direction=this.options.direction;var velocity;if(direction&(DIRECTION_HORIZONTAL|DIRECTION_VERTICAL)){velocity=input.overallVelocity}else if(direction&DIRECTION_HORIZONTAL){velocity=input.overallVelocityX}else if(direction&DIRECTION_VERTICAL){velocity=input.overallVelocityY}return this._super.attrTest.call(this,input)&&direction&input.offsetDirection&&input.distance>this.options.threshold&&input.maxPointers==this.options.pointers&&abs(velocity)>this.options.velocity&&input.eventType&INPUT_END},emit:function(input){var direction=directionStr(input.offsetDirection);if(direction){this.manager.emit(this.options.event+direction,input)}this.manager.emit(this.options.event,input)}});function TapRecognizer(){Recognizer.apply(this,arguments);this.pTime=false;this.pCenter=false;this._timer=null;this._input=null;this.count=0}inherit(TapRecognizer,Recognizer,{defaults:{event:"tap",pointers:1,taps:1,interval:300,time:250,threshold:9,posThreshold:10},getTouchAction:function(){return[TOUCH_ACTION_MANIPULATION]},process:function(input){var options=this.options;var validPointers=input.pointers.length===options.pointers;var validMovement=input.distance<options.threshold;var validTouchTime=input.deltaTime<options.time;this.reset();if(input.eventType&INPUT_START&&this.count===0){return this.failTimeout()}if(validMovement&&validTouchTime&&validPointers){if(input.eventType!=INPUT_END){return this.failTimeout()}var validInterval=this.pTime?input.timeStamp-this.pTime<options.interval:true;var validMultiTap=!this.pCenter||getDistance(this.pCenter,input.center)<options.posThreshold;this.pTime=input.timeStamp;this.pCenter=input.center;if(!validMultiTap||!validInterval){this.count=1}else{this.count+=1}this._input=input;var tapCount=this.count%options.taps;if(tapCount===0){if(!this.hasRequireFailures()){return STATE_RECOGNIZED}else{this._timer=setTimeoutContext(function(){this.state=STATE_RECOGNIZED;this.tryEmit()},options.interval,this);return STATE_BEGAN}}}return STATE_FAILED},failTimeout:function(){this._timer=setTimeoutContext(function(){this.state=STATE_FAILED},this.options.interval,this);return STATE_FAILED},reset:function(){clearTimeout(this._timer)},emit:function(){if(this.state==STATE_RECOGNIZED){this._input.tapCount=this.count;this.manager.emit(this.options.event,this._input)}}});function Hammer(element,options){options=options||{};options.recognizers=ifUndefined(options.recognizers,Hammer.defaults.preset);return new Manager(element,options)}Hammer.VERSION="2.0.7";Hammer.defaults={domEvents:false,touchAction:TOUCH_ACTION_COMPUTE,enable:true,inputTarget:null,inputClass:null,preset:[[RotateRecognizer,{enable:false}],[PinchRecognizer,{enable:false},["rotate"]],[SwipeRecognizer,{direction:DIRECTION_HORIZONTAL}],[PanRecognizer,{direction:DIRECTION_HORIZONTAL},["swipe"]],[TapRecognizer],[TapRecognizer,{event:"doubletap",taps:2},["tap"]],[PressRecognizer]],cssProps:{userSelect:"none",touchSelect:"none",touchCallout:"none",contentZooming:"none",userDrag:"none",tapHighlightColor:"rgba(0,0,0,0)"}};var STOP=1;var FORCED_STOP=2;function Manager(element,options){this.options=assign({},Hammer.defaults,options||{});this.options.inputTarget=this.options.inputTarget||element;this.handlers={};this.session={};this.recognizers=[];this.oldCssProps={};this.element=element;this.input=createInputInstance(this);this.touchAction=new TouchAction(this,this.options.touchAction);toggleCssProps(this,true);each(this.options.recognizers,function(item){var recognizer=this.add(new item[0](item[1]));item[2]&&recognizer.recognizeWith(item[2]);item[3]&&recognizer.requireFailure(item[3])},this)}Manager.prototype={set:function(options){assign(this.options,options);if(options.touchAction){this.touchAction.update()}if(options.inputTarget){this.input.destroy();this.input.target=options.inputTarget;this.input.init()}return this},stop:function(force){this.session.stopped=force?FORCED_STOP:STOP},recognize:function(inputData){var session=this.session;if(session.stopped){return}this.touchAction.preventDefaults(inputData);var recognizer;var recognizers=this.recognizers;var curRecognizer=session.curRecognizer;if(!curRecognizer||curRecognizer&&curRecognizer.state&STATE_RECOGNIZED){curRecognizer=session.curRecognizer=null}var i=0;while(i<recognizers.length){recognizer=recognizers[i];if(session.stopped!==FORCED_STOP&&(!curRecognizer||recognizer==curRecognizer||recognizer.canRecognizeWith(curRecognizer))){recognizer.recognize(inputData)}else{recognizer.reset()}if(!curRecognizer&&recognizer.state&(STATE_BEGAN|STATE_CHANGED|STATE_ENDED)){curRecognizer=session.curRecognizer=recognizer}i++}},get:function(recognizer){if(recognizer instanceof Recognizer){return recognizer}var recognizers=this.recognizers;for(var i=0;i<recognizers.length;i++){if(recognizers[i].options.event==recognizer){return recognizers[i]}}return null},add:function(recognizer){if(invokeArrayArg(recognizer,"add",this)){return this}var existing=this.get(recognizer.options.event);if(existing){this.remove(existing)}this.recognizers.push(recognizer);recognizer.manager=this;this.touchAction.update();return recognizer},remove:function(recognizer){if(invokeArrayArg(recognizer,"remove",this)){return this}recognizer=this.get(recognizer);if(recognizer){var recognizers=this.recognizers;var index=inArray(recognizers,recognizer);if(index!==-1){recognizers.splice(index,1);this.touchAction.update()}}return this},on:function(events,handler){if(events===undefined){return}if(handler===undefined){return}var handlers=this.handlers;each(splitStr(events),function(event){handlers[event]=handlers[event]||[];handlers[event].push(handler)});return this},off:function(events,handler){if(events===undefined){return}var handlers=this.handlers;each(splitStr(events),function(event){if(!handler){delete handlers[event]}else{handlers[event]&&handlers[event].splice(inArray(handlers[event],handler),1)}});return this},emit:function(event,data){if(this.options.domEvents){triggerDomEvent(event,data)}var handlers=this.handlers[event]&&this.handlers[event].slice();if(!handlers||!handlers.length){return}data.type=event;data.preventDefault=function(){data.srcEvent.preventDefault()};var i=0;while(i<handlers.length){handlers[i](data);i++}},destroy:function(){this.element&&toggleCssProps(this,false);this.handlers={};this.session={};this.input.destroy();this.element=null}};function toggleCssProps(manager,add){var element=manager.element;if(!element.style){return}var prop;each(manager.options.cssProps,function(value,name){prop=prefixed(element.style,name);if(add){manager.oldCssProps[prop]=element.style[prop];element.style[prop]=value}else{element.style[prop]=manager.oldCssProps[prop]||""}});if(!add){manager.oldCssProps={}}}function triggerDomEvent(event,data){var gestureEvent=document.createEvent("Event");gestureEvent.initEvent(event,true,true);gestureEvent.gesture=data;data.target.dispatchEvent(gestureEvent)}assign(Hammer,{INPUT_START:INPUT_START,INPUT_MOVE:INPUT_MOVE,INPUT_END:INPUT_END,INPUT_CANCEL:INPUT_CANCEL,STATE_POSSIBLE:STATE_POSSIBLE,STATE_BEGAN:STATE_BEGAN,STATE_CHANGED:STATE_CHANGED,STATE_ENDED:STATE_ENDED,STATE_RECOGNIZED:STATE_RECOGNIZED,STATE_CANCELLED:STATE_CANCELLED,STATE_FAILED:STATE_FAILED,DIRECTION_NONE:DIRECTION_NONE,DIRECTION_LEFT:DIRECTION_LEFT,DIRECTION_RIGHT:DIRECTION_RIGHT,DIRECTION_UP:DIRECTION_UP,DIRECTION_DOWN:DIRECTION_DOWN,DIRECTION_HORIZONTAL:DIRECTION_HORIZONTAL,DIRECTION_VERTICAL:DIRECTION_VERTICAL,DIRECTION_ALL:DIRECTION_ALL,Manager:Manager,Input:Input,TouchAction:TouchAction,TouchInput:TouchInput,MouseInput:MouseInput,PointerEventInput:PointerEventInput,TouchMouseInput:TouchMouseInput,SingleTouchInput:SingleTouchInput,Recognizer:Recognizer,AttrRecognizer:AttrRecognizer,Tap:TapRecognizer,Pan:PanRecognizer,Swipe:SwipeRecognizer,Pinch:PinchRecognizer,Rotate:RotateRecognizer,Press:PressRecognizer,on:addEventListeners,off:removeEventListeners,each:each,merge:merge,extend:extend,assign:assign,inherit:inherit,bindFn:bindFn,prefixed:prefixed});var freeGlobal=typeof window!=="undefined"?window:typeof self!=="undefined"?self:{};freeGlobal.Hammer=Hammer;if(typeof define==="function"&&define.amd){define(function(){return Hammer})}else if(typeof module!="undefined"&&module.exports){module.exports=Hammer}else{window[exportName]=Hammer}})(window,document,"Hammer")},{}],14:[function(require,module,exports){function keyCode(searchInput){if(searchInput&&"object"===typeof searchInput){var hasKeyCode=searchInput.which||searchInput.keyCode||searchInput.charCode;if(hasKeyCode)searchInput=hasKeyCode}if("number"===typeof searchInput)return names[searchInput];var search=String(searchInput);var foundNamedKey=codes[search.toLowerCase()];if(foundNamedKey)return foundNamedKey;var foundNamedKey=aliases[search.toLowerCase()];if(foundNamedKey)return foundNamedKey;if(search.length===1)return search.charCodeAt(0);return undefined}keyCode.isEventKey=function isEventKey(event,nameOrCode){if(event&&"object"===typeof event){var keyCode=event.which||event.keyCode||event.charCode;if(keyCode===null||keyCode===undefined){return false}if(typeof nameOrCode==="string"){var foundNamedKey=codes[nameOrCode.toLowerCase()];if(foundNamedKey){return foundNamedKey===keyCode}var foundNamedKey=aliases[nameOrCode.toLowerCase()];if(foundNamedKey){return foundNamedKey===keyCode}}else if(typeof nameOrCode==="number"){return nameOrCode===keyCode}return false}};exports=module.exports=keyCode;var codes=exports.code=exports.codes={backspace:8,tab:9,enter:13,shift:16,ctrl:17,alt:18,"pause/break":19,"caps lock":20,esc:27,space:32,"page up":33,"page down":34,end:35,home:36,left:37,up:38,right:39,down:40,insert:45,delete:46,command:91,"left command":91,"right command":93,"numpad *":106,"numpad +":107,"numpad -":109,"numpad .":110,"numpad /":111,"num lock":144,"scroll lock":145,"my computer":182,"my calculator":183,";":186,"=":187,",":188,"-":189,".":190,"/":191,"`":192,"[":219,"\\":220,"]":221,"'":222};var aliases=exports.aliases={windows:91,"⇧":16,"⌥":18,"⌃":17,"⌘":91,ctl:17,control:17,option:18,pause:19,break:19,caps:20,return:13,escape:27,spc:32,spacebar:32,pgup:33,pgdn:34,ins:45,del:46,cmd:91};for(i=97;i<123;i++)codes[String.fromCharCode(i)]=i-32;for(var i=48;i<58;i++)codes[i-48]=i;for(i=1;i<13;i++)codes["f"+i]=i+111;for(i=0;i<10;i++)codes["numpad "+i]=i+96;var names=exports.names=exports.title={};for(i in codes)names[codes[i]]=i;for(var alias in aliases){codes[alias]=aliases[alias]}},{}]},{},[6])(6)});