Skip to content

Instantly share code, notes, and snippets.

@kamicane
Last active January 12, 2017 09:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kamicane/329faf2048f9e9528133 to your computer and use it in GitHub Desktop.
Save kamicane/329faf2048f9e9528133 to your computer and use it in GitHub Desktop.
requirebin sketch
an old test on 3d projections of vertices onto the screen
"use strict";
var $ = require("elements");
var ready = require("elements/domready");
var Matrix3d = require("matrix3d");
var Transform3d = require("transform3d");
var Vector3 = require("matrix3d/lib/Vector3");
var Vector4 = require("matrix3d/lib/Vector4");
var SCENE_WIDTH = window.innerWidth;
var SCENE_HEIGHT = window.innerHeight;
var PERSPECTIVE = 800;
var PERSPECTIVE_ORIGIN = new Vector3(SCENE_WIDTH / 2, SCENE_HEIGHT / 2, 0);
var OBJECT_WIDTH = 100;
var OBJECT_HEIGHT = 100;
var TRANSFORM_ORIGIN = new Vector3(OBJECT_WIDTH / 2, OBJECT_HEIGHT / 2, 0);
var TRANSFORMATION = new Transform3d().translateX(500).translateY(300).translateZ(400).rotateY(40).compose();
var translationMatrix1 = new Matrix3d()
.translate(new Vector3(PERSPECTIVE_ORIGIN.x - TRANSFORM_ORIGIN.x, PERSPECTIVE_ORIGIN.y - TRANSFORM_ORIGIN.y, PERSPECTIVE_ORIGIN.z - TRANSFORM_ORIGIN.z));
var perspectiveMatrix = new Matrix3d();
perspectiveMatrix.m34 = -1 / PERSPECTIVE;
var translationMatrix2 = new Matrix3d()
.translate(new Vector3(-(PERSPECTIVE_ORIGIN.x - TRANSFORM_ORIGIN.x), -(PERSPECTIVE_ORIGIN.y - TRANSFORM_ORIGIN.y), -(PERSPECTIVE_ORIGIN.z - TRANSFORM_ORIGIN.z)));
perspectiveMatrix = translationMatrix1.concat(perspectiveMatrix).concat(translationMatrix2);
var COMPUTED_PERSPECTIVE_TRANSFORMATION = perspectiveMatrix.concat(TRANSFORMATION);
// VERTEX CALCULATION
var vertices = [
new Vector4(0, 0, 0, 1),
new Vector4(OBJECT_WIDTH, OBJECT_HEIGHT, 0, 1),
new Vector4(OBJECT_WIDTH, 0, 0, 1),
new Vector4(0, OBJECT_HEIGHT, 0, 1),
new Vector4(OBJECT_WIDTH / 2, OBJECT_HEIGHT / 2, 0, 1) // CENTER
];
var pre = new Matrix3d().translate(new Vector3(TRANSFORM_ORIGIN.x, TRANSFORM_ORIGIN.y, TRANSFORM_ORIGIN.z));
var post = new Matrix3d().translate(new Vector3(-TRANSFORM_ORIGIN.x, -TRANSFORM_ORIGIN.y, -TRANSFORM_ORIGIN.z));
var FULL = pre.concat(COMPUTED_PERSPECTIVE_TRANSFORMATION).concat(post);
var transformedVertices = vertices.map(function(vertex) {
return FULL.map(vertex);
});
var PROJECTED_VERTICES = transformedVertices.map(function(vertex) {
return new Vector3(vertex.x / vertex.w, vertex.y / vertex.w, vertex.z / vertex.w);
});
ready(function() {
// set all the styles
var perspectiveNode = $("#perspective");
perspectiveNode[0].style.perspective = PERSPECTIVE + "px";
perspectiveNode[0].style.perspectiveOrigin = PERSPECTIVE_ORIGIN.x + "px " + PERSPECTIVE_ORIGIN.y + "px " + PERSPECTIVE_ORIGIN.z + "px";
perspectiveNode[0].style.transformStyle = "preserve-3d";
perspectiveNode[0].style.width = SCENE_WIDTH + "px";
perspectiveNode[0].style.height = SCENE_HEIGHT + "px";
var flatNode = $("#flat");
flatNode[0].style.width = SCENE_WIDTH + "px";
flatNode[0].style.height = SCENE_HEIGHT + "px";
var perspectiveSquare = $("#perspective .square");
perspectiveSquare[0].style.height = OBJECT_HEIGHT + "px";
perspectiveSquare[0].style.width = OBJECT_WIDTH + "px";
perspectiveSquare[0].style.transformOrigin = TRANSFORM_ORIGIN.x + "px " + TRANSFORM_ORIGIN.y + "px " + TRANSFORM_ORIGIN.z + "px";
var flatSquare = $("#flat .square");
flatSquare[0].style.height = OBJECT_HEIGHT + "px";
flatSquare[0].style.width = OBJECT_WIDTH + "px";
flatSquare[0].style.transformOrigin = TRANSFORM_ORIGIN.x + "px " + TRANSFORM_ORIGIN.y + "px " + TRANSFORM_ORIGIN.z + "px";
// set the transforms, they should look the same now.
perspectiveSquare[0].style.transform = TRANSFORMATION;
flatSquare[0].style.transform = COMPUTED_PERSPECTIVE_TRANSFORMATION;
// render vertices
var canvas = $("#vertices")[0];
canvas.width = SCENE_WIDTH;
canvas.height = SCENE_HEIGHT;
var ctx = canvas.getContext("2d");
PROJECTED_VERTICES.forEach(function(v, i) {
if (i !== 4) {
ctx.beginPath();
ctx.arc(v.x, v.y, 3, 0, Math.PI * 2);
ctx.closePath();
ctx.fill();
} else {
ctx.beginPath();
ctx.moveTo(v.x - 10, v.y - 10);
ctx.lineTo(v.x + 10, v.y + 10);
ctx.moveTo(v.x + 10, v.y - 10);
ctx.lineTo(v.x - 10, v.y + 10);
ctx.closePath();
ctx.stroke();
}
});
});
require=function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}({1:[function(require,module,exports){var process=module.exports={};process.nextTick=function(){var canSetImmediate=typeof window!=="undefined"&&window.setImmediate;var canMutationObserver=typeof window!=="undefined"&&window.MutationObserver;var canPost=typeof window!=="undefined"&&window.postMessage&&window.addEventListener;if(canSetImmediate){return function(f){return window.setImmediate(f)}}var queue=[];if(canMutationObserver){var hiddenDiv=document.createElement("div");var observer=new MutationObserver(function(){var queueList=queue.slice();queue.length=0;queueList.forEach(function(fn){fn()})});observer.observe(hiddenDiv,{attributes:true});return function nextTick(fn){if(!queue.length){hiddenDiv.setAttribute("yes","no")}queue.push(fn)}}if(canPost){window.addEventListener("message",function(ev){var source=ev.source;if((source===window||source===null)&&ev.data==="process-tick"){ev.stopPropagation();if(queue.length>0){var fn=queue.shift();fn()}}},true);return function nextTick(fn){queue.push(fn);window.postMessage("process-tick","*")}}return function nextTick(fn){setTimeout(fn,0)}}();process.title="browser";process.browser=true;process.env={};process.argv=[];function noop(){}process.on=noop;process.addListener=noop;process.once=noop;process.off=noop;process.removeListener=noop;process.removeAllListeners=noop;process.emit=noop;process.binding=function(name){throw new Error("process.binding is not supported")};process.cwd=function(){return"/"};process.chdir=function(dir){throw new Error("process.chdir is not supported")}},{}],2:[function(require,module,exports){"use strict";var $=require("./base");var trim=require("mout/string/trim"),forEach=require("mout/array/forEach"),filter=require("mout/array/filter"),indexOf=require("mout/array/indexOf");$.implement({setAttribute:function(name,value){return this.forEach(function(node){node.setAttribute(name,value)})},getAttribute:function(name){var attr=this[0].getAttributeNode(name);return attr&&attr.specified?attr.value:null},hasAttribute:function(name){var node=this[0];if(node.hasAttribute)return node.hasAttribute(name);var attr=node.getAttributeNode(name);return!!(attr&&attr.specified)},removeAttribute:function(name){return this.forEach(function(node){var attr=node.getAttributeNode(name);if(attr)node.removeAttributeNode(attr)})}});var accessors={};forEach(["type","value","name","href","title","id"],function(name){accessors[name]=function(value){return value!==undefined?this.forEach(function(node){node[name]=value}):this[0][name]}});forEach(["checked","disabled","selected"],function(name){accessors[name]=function(value){return value!==undefined?this.forEach(function(node){node[name]=!!value}):!!this[0][name]}});var classes=function(className){var classNames=trim(className).replace(/\s+/g," ").split(" "),uniques={};return filter(classNames,function(className){if(className!==""&&!uniques[className])return uniques[className]=className}).sort()};accessors.className=function(className){return className!==undefined?this.forEach(function(node){node.className=classes(className).join(" ")}):classes(this[0].className).join(" ")};$.implement({attribute:function(name,value){var accessor=accessors[name];if(accessor)return accessor.call(this,value);if(value!=null)return this.setAttribute(name,value);if(value===null)return this.removeAttribute(name);if(value===undefined)return this.getAttribute(name)}});$.implement(accessors);$.implement({check:function(){return this.checked(true)},uncheck:function(){return this.checked(false)},disable:function(){return this.disabled(true)},enable:function(){return this.disabled(false)},select:function(){return this.selected(true)},deselect:function(){return this.selected(false)}});$.implement({classNames:function(){return classes(this[0].className)},hasClass:function(className){return indexOf(this.classNames(),className)>-1},addClass:function(className){return this.forEach(function(node){var nodeClassName=node.className;var classNames=classes(nodeClassName+" "+className).join(" ");if(nodeClassName!==classNames)node.className=classNames})},removeClass:function(className){return this.forEach(function(node){var classNames=classes(node.className);forEach(classes(className),function(className){var index=indexOf(classNames,className);if(index>-1)classNames.splice(index,1)});node.className=classNames.join(" ")})},toggleClass:function(className,force){var add=force!==undefined?force:!this.hasClass(className);if(add)this.addClass(className);else this.removeClass(className);return!!add}});$.prototype.toString=function(){var tag=this.tag(),id=this.id(),classes=this.classNames();var str=tag;if(id)str+="#"+id;if(classes.length)str+="."+classes.join(".");return str};var textProperty=document.createElement("div").textContent==null?"innerText":"textContent";$.implement({tag:function(){return this[0].tagName.toLowerCase()},html:function(html){return html!==undefined?this.forEach(function(node){node.innerHTML=html}):this[0].innerHTML},text:function(text){return text!==undefined?this.forEach(function(node){node[textProperty]=text}):this[0][textProperty]},data:function(key,value){switch(value){case undefined:return this.getAttribute("data-"+key);case null:return this.removeAttribute("data-"+key);default:return this.setAttribute("data-"+key,value)}}});module.exports=$},{"./base":3,"mout/array/filter":8,"mout/array/forEach":9,"mout/array/indexOf":10,"mout/string/trim":29}],3:[function(require,module,exports){"use strict";var prime=require("prime");var forEach=require("mout/array/forEach"),map=require("mout/array/map"),filter=require("mout/array/filter"),every=require("mout/array/every"),some=require("mout/array/some");var index=0,__dc=document.__counter,counter=document.__counter=(__dc?parseInt(__dc,36)+1:0).toString(36),key="uid:"+counter;var uniqueID=function(n){if(n===window)return"window";if(n===document)return"document";if(n===document.documentElement)return"html";return n[key]||(n[key]=(index++).toString(36))};var instances={};var $=prime({constructor:function $(n,context){if(n==null)return this&&this.constructor===$?new Elements:null;var self,uid;if(n.constructor!==Elements){self=new Elements;if(typeof n==="string"){if(!self.search)return null;self[self.length++]=context||document;return self.search(n)}if(n.nodeType||n===window){self[self.length++]=n}else if(n.length){var uniques={};for(var i=0,l=n.length;i<l;i++){var nodes=$(n[i],context);if(nodes&&nodes.length)for(var j=0,k=nodes.length;j<k;j++){var node=nodes[j];uid=uniqueID(node);if(!uniques[uid]){self[self.length++]=node;uniques[uid]=true}}}}}else{self=n}if(!self.length)return null;if(self.length===1){uid=uniqueID(self[0]);return instances[uid]||(instances[uid]=self)}return self}});var Elements=prime({inherits:$,constructor:function Elements(){this.length=0},unlink:function(){return this.map(function(node){delete instances[uniqueID(node)];return node})},forEach:function(method,context){forEach(this,method,context);return this},map:function(method,context){return map(this,method,context)},filter:function(method,context){return filter(this,method,context)},every:function(method,context){return every(this,method,context)},some:function(method,context){return some(this,method,context)}});module.exports=$},{"mout/array/every":7,"mout/array/filter":8,"mout/array/forEach":9,"mout/array/map":11,"mout/array/some":12,prime:33}],4:[function(require,module,exports){"use strict";var Map=require("prime/map");var $=require("./events");require("./traversal");$.implement({delegate:function(event,selector,handle){return this.forEach(function(node){var self=$(node);var delegation=self._delegation||(self._delegation={}),events=delegation[event]||(delegation[event]={}),map=events[selector]||(events[selector]=new Map);if(map.get(handle))return;var action=function(e){var target=$(e.target||e.srcElement),match=target.matches(selector)?target:target.parent(selector);var res;if(match)res=handle.call(self,e,match);return res};map.set(handle,action);self.on(event,action)})},undelegate:function(event,selector,handle){return this.forEach(function(node){var self=$(node),delegation,events,map;if(!(delegation=self._delegation)||!(events=delegation[event])||!(map=events[selector]))return;var action=map.get(handle);if(action){self.off(event,action);map.remove(action);if(!map.count())delete events[selector];var e1=true,e2=true,x;for(x in events){e1=false;break}if(e1)delete delegation[event];for(x in delegation){e2=false;break}if(e2)delete self._delegation}})}});module.exports=$},{"./events":5,"./traversal":38,"prime/map":34}],5:[function(require,module,exports){"use strict";var Emitter=require("prime/emitter");var $=require("./base");var html=document.documentElement;var addEventListener=html.addEventListener?function(node,event,handle,useCapture){node.addEventListener(event,handle,useCapture||false);return handle}:function(node,event,handle){node.attachEvent("on"+event,handle);return handle};var removeEventListener=html.removeEventListener?function(node,event,handle,useCapture){node.removeEventListener(event,handle,useCapture||false)}:function(node,event,handle){node.detachEvent("on"+event,handle)};$.implement({on:function(event,handle,useCapture){return this.forEach(function(node){var self=$(node);var internalEvent=event+(useCapture?":capture":"");Emitter.prototype.on.call(self,internalEvent,handle);var domListeners=self._domListeners||(self._domListeners={});if(!domListeners[internalEvent])domListeners[internalEvent]=addEventListener(node,event,function(e){Emitter.prototype.emit.call(self,internalEvent,e||window.event,Emitter.EMIT_SYNC)},useCapture)})},off:function(event,handle,useCapture){return this.forEach(function(node){var self=$(node);var internalEvent=event+(useCapture?":capture":"");var domListeners=self._domListeners,domEvent,listeners=self._listeners,events;if(domListeners&&(domEvent=domListeners[internalEvent])&&listeners&&(events=listeners[internalEvent])){Emitter.prototype.off.call(self,internalEvent,handle);if(!self._listeners||!self._listeners[event]){removeEventListener(node,event,domEvent);delete domListeners[event];for(var l in domListeners)return;delete self._domListeners}}})},emit:function(){var args=arguments;return this.forEach(function(node){Emitter.prototype.emit.apply($(node),args)})}});module.exports=$},{"./base":3,"prime/emitter":32}],6:[function(require,module,exports){"use strict";var $=require("./base");$.implement({appendChild:function(child){this[0].appendChild($(child)[0]);return this},insertBefore:function(child,ref){this[0].insertBefore($(child)[0],$(ref)[0]);return this},removeChild:function(child){this[0].removeChild($(child)[0]);return this},replaceChild:function(child,ref){this[0].replaceChild($(child)[0],$(ref)[0]);return this}});$.implement({before:function(element){element=$(element)[0];var parent=element.parentNode;if(parent)this.forEach(function(node){parent.insertBefore(node,element)});return this},after:function(element){element=$(element)[0];var parent=element.parentNode;if(parent)this.forEach(function(node){parent.insertBefore(node,element.nextSibling)});return this},bottom:function(element){element=$(element)[0];return this.forEach(function(node){element.appendChild(node)})},top:function(element){element=$(element)[0];return this.forEach(function(node){element.insertBefore(node,element.firstChild)})}});$.implement({insert:$.prototype.bottom,remove:function(){return this.forEach(function(node){var parent=node.parentNode;if(parent)parent.removeChild(node)})},replace:function(element){element=$(element)[0];element.parentNode.replaceChild(this[0],element);return this}});module.exports=$},{"./base":3}],7:[function(require,module,exports){var makeIterator=require("../function/makeIterator_");function every(arr,callback,thisObj){callback=makeIterator(callback,thisObj);var result=true;if(arr==null){return result}var i=-1,len=arr.length;while(++i<len){if(!callback(arr[i],i,arr)){result=false;break}}return result}module.exports=every},{"../function/makeIterator_":14}],8:[function(require,module,exports){var makeIterator=require("../function/makeIterator_");function filter(arr,callback,thisObj){callback=makeIterator(callback,thisObj);var results=[];if(arr==null){return results}var i=-1,len=arr.length,value;while(++i<len){value=arr[i];if(callback(value,i,arr)){results.push(value)}}return results}module.exports=filter},{"../function/makeIterator_":14}],9:[function(require,module,exports){function forEach(arr,callback,thisObj){if(arr==null){return}var i=-1,len=arr.length;while(++i<len){if(callback.call(thisObj,arr[i],i,arr)===false){break}}}module.exports=forEach},{}],10:[function(require,module,exports){function indexOf(arr,item,fromIndex){fromIndex=fromIndex||0;if(arr==null){return-1}var len=arr.length,i=fromIndex<0?len+fromIndex:fromIndex;while(i<len){if(arr[i]===item){return i}i++}return-1}module.exports=indexOf},{}],11:[function(require,module,exports){var makeIterator=require("../function/makeIterator_");function map(arr,callback,thisObj){callback=makeIterator(callback,thisObj);var results=[];if(arr==null){return results}var i=-1,len=arr.length;while(++i<len){results[i]=callback(arr[i],i,arr)}return results}module.exports=map},{"../function/makeIterator_":14}],12:[function(require,module,exports){var makeIterator=require("../function/makeIterator_");function some(arr,callback,thisObj){callback=makeIterator(callback,thisObj);var result=false;if(arr==null){return result}var i=-1,len=arr.length;while(++i<len){if(callback(arr[i],i,arr)){result=true;break}}return result}module.exports=some},{"../function/makeIterator_":14}],13:[function(require,module,exports){function identity(val){return val}module.exports=identity},{}],14:[function(require,module,exports){var identity=require("./identity");var prop=require("./prop");var deepMatches=require("../object/deepMatches");function makeIterator(src,thisObj){if(src==null){return identity}switch(typeof src){case"function":return typeof thisObj!=="undefined"?function(val,i,arr){return src.call(thisObj,val,i,arr)}:src;case"object":return function(val){return deepMatches(val,src)};case"string":case"number":return prop(src)}}module.exports=makeIterator},{"../object/deepMatches":21,"./identity":13,"./prop":15}],15:[function(require,module,exports){function prop(name){return function(obj){return obj[name]}}module.exports=prop},{}],16:[function(require,module,exports){var mixIn=require("../object/mixIn");function createObject(parent,props){function F(){}F.prototype=parent;return mixIn(new F,props)}module.exports=createObject},{"../object/mixIn":25}],17:[function(require,module,exports){var isKind=require("./isKind");var isArray=Array.isArray||function(val){return isKind(val,"Array")};module.exports=isArray},{"./isKind":18}],18:[function(require,module,exports){var kindOf=require("./kindOf");function isKind(val,kind){return kindOf(val)===kind}module.exports=isKind},{"./kindOf":19}],19:[function(require,module,exports){var _rKind=/^\[object (.*)\]$/,_toString=Object.prototype.toString,UNDEF;function kindOf(val){if(val===null){return"Null"}else if(val===UNDEF){return"Undefined"}else{return _rKind.exec(_toString.call(val))[1]}}module.exports=kindOf},{}],20:[function(require,module,exports){function toString(val){return val==null?"":val.toString()}module.exports=toString},{}],21:[function(require,module,exports){var forOwn=require("./forOwn");var isArray=require("../lang/isArray");function containsMatch(array,pattern){var i=-1,length=array.length;while(++i<length){if(deepMatches(array[i],pattern)){return true}}return false}function matchArray(target,pattern){var i=-1,patternLength=pattern.length;while(++i<patternLength){if(!containsMatch(target,pattern[i])){return false}}return true}function matchObject(target,pattern){var result=true;forOwn(pattern,function(val,key){if(!deepMatches(target[key],val)){return result=false}});return result}function deepMatches(target,pattern){if(target&&typeof target==="object"){if(isArray(target)&&isArray(pattern)){return matchArray(target,pattern)}else{return matchObject(target,pattern)}}else{return target===pattern}}module.exports=deepMatches},{"../lang/isArray":17,"./forOwn":23}],22:[function(require,module,exports){var hasOwn=require("./hasOwn");var _hasDontEnumBug,_dontEnums;function checkDontEnum(){_dontEnums=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"];_hasDontEnumBug=true;for(var key in{toString:null}){_hasDontEnumBug=false}}function forIn(obj,fn,thisObj){var key,i=0;if(_hasDontEnumBug==null)checkDontEnum();for(key in obj){if(exec(fn,obj,key,thisObj)===false){break}}if(_hasDontEnumBug){var ctor=obj.constructor,isProto=!!ctor&&obj===ctor.prototype;while(key=_dontEnums[i++]){if((key!=="constructor"||!isProto&&hasOwn(obj,key))&&obj[key]!==Object.prototype[key]){if(exec(fn,obj,key,thisObj)===false){break}}}}}function exec(fn,obj,key,thisObj){return fn.call(thisObj,obj[key],key,obj)}module.exports=forIn},{"./hasOwn":24}],23:[function(require,module,exports){var hasOwn=require("./hasOwn");var forIn=require("./forIn");function forOwn(obj,fn,thisObj){forIn(obj,function(val,key){if(hasOwn(obj,key)){return fn.call(thisObj,obj[key],key,obj)}})}module.exports=forOwn},{"./forIn":22,"./hasOwn":24}],24:[function(require,module,exports){function hasOwn(obj,prop){return Object.prototype.hasOwnProperty.call(obj,prop)}module.exports=hasOwn},{}],25:[function(require,module,exports){var forOwn=require("./forOwn");function mixIn(target,objects){var i=0,n=arguments.length,obj;while(++i<n){obj=arguments[i];if(obj!=null){forOwn(obj,copyProp,target)}}return target}function copyProp(val,key){this[key]=val}module.exports=mixIn},{"./forOwn":23}],26:[function(require,module,exports){module.exports=[" ","\n","\r"," ","\f"," "," "," ","᠎"," "," "," "," "," "," "," "," "," "," "," ","\u2028","\u2029"," "," "," "]},{}],27:[function(require,module,exports){var toString=require("../lang/toString");var WHITE_SPACES=require("./WHITE_SPACES");function ltrim(str,chars){str=toString(str);chars=chars||WHITE_SPACES;var start=0,len=str.length,charLen=chars.length,found=true,i,c;while(found&&start<len){found=false;i=-1;c=str.charAt(start);while(++i<charLen){if(c===chars[i]){found=true;start++;break}}}return start>=len?"":str.substr(start,len)}module.exports=ltrim},{"../lang/toString":20,"./WHITE_SPACES":26}],28:[function(require,module,exports){var toString=require("../lang/toString");var WHITE_SPACES=require("./WHITE_SPACES");function rtrim(str,chars){str=toString(str);chars=chars||WHITE_SPACES;var end=str.length-1,charLen=chars.length,found=true,i,c;while(found&&end>=0){found=false;i=-1;c=str.charAt(end);while(++i<charLen){if(c===chars[i]){found=true;end--;break}}}return end>=0?str.substring(0,end+1):""}module.exports=rtrim},{"../lang/toString":20,"./WHITE_SPACES":26}],29:[function(require,module,exports){var toString=require("../lang/toString");var WHITE_SPACES=require("./WHITE_SPACES");var ltrim=require("./ltrim");var rtrim=require("./rtrim");function trim(str,chars){str=toString(str);chars=chars||WHITE_SPACES;return ltrim(rtrim(str,chars),chars)}module.exports=trim},{"../lang/toString":20,"./WHITE_SPACES":26,"./ltrim":27,"./rtrim":28}],30:[function(require,module,exports){function now(){return now.get()}now.get=typeof Date.now==="function"?Date.now:function(){return+new Date};module.exports=now},{}],31:[function(require,module,exports){(function(process,global){"use strict";var kindOf=require("mout/lang/kindOf"),now=require("mout/time/now"),forEach=require("mout/array/forEach"),indexOf=require("mout/array/indexOf");var callbacks={timeout:{},frame:[],immediate:[]};var push=function(collection,callback,context,defer){var iterator=function(){iterate(collection)};if(!collection.length)defer(iterator);var entry={callback:callback,context:context};collection.push(entry);return function(){var io=indexOf(collection,entry);if(io>-1)collection.splice(io,1)}};var iterate=function(collection){var time=now();forEach(collection.splice(0),function(entry){entry.callback.call(entry.context,time)})};var defer=function(callback,argument,context){return kindOf(argument)==="Number"?defer.timeout(callback,argument,context):defer.immediate(callback,argument)};if(global.process&&process.nextTick){defer.immediate=function(callback,context){return push(callbacks.immediate,callback,context,process.nextTick)}}else if(global.setImmediate){defer.immediate=function(callback,context){return push(callbacks.immediate,callback,context,setImmediate)}}else if(global.postMessage&&global.addEventListener){addEventListener("message",function(event){if(event.source===global&&event.data==="@deferred"){event.stopPropagation();iterate(callbacks.immediate)}},true);defer.immediate=function(callback,context){return push(callbacks.immediate,callback,context,function(){postMessage("@deferred","*")})}}else{defer.immediate=function(callback,context){return push(callbacks.immediate,callback,context,function(iterator){setTimeout(iterator,0)})}}var requestAnimationFrame=global.requestAnimationFrame||global.webkitRequestAnimationFrame||global.mozRequestAnimationFrame||global.oRequestAnimationFrame||global.msRequestAnimationFrame||function(callback){setTimeout(callback,1e3/60)};defer.frame=function(callback,context){return push(callbacks.frame,callback,context,requestAnimationFrame)};var clear;defer.timeout=function(callback,ms,context){var ct=callbacks.timeout;if(!clear)clear=defer.immediate(function(){clear=null;callbacks.timeout={}});return push(ct[ms]||(ct[ms]=[]),callback,context,function(iterator){setTimeout(iterator,ms)})};module.exports=defer}).call(this,require("_process"),typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{})},{_process:1,"mout/array/forEach":9,"mout/array/indexOf":10,"mout/lang/kindOf":19,"mout/time/now":30}],32:[function(require,module,exports){"use strict";var indexOf=require("mout/array/indexOf"),forEach=require("mout/array/forEach");var prime=require("./index"),defer=require("./defer");var slice=Array.prototype.slice;var Emitter=prime({on:function(event,fn){var listeners=this._listeners||(this._listeners={}),events=listeners[event]||(listeners[event]=[]);if(indexOf(events,fn)===-1)events.push(fn);return this},off:function(event,fn){var listeners=this._listeners,events,key,length=0;if(listeners&&(events=listeners[event])){var io=indexOf(events,fn);if(io>-1)events.splice(io,1);if(!events.length)delete listeners[event];for(var l in listeners)return this;delete this._listeners}return this},emit:function(event){var self=this,args=slice.call(arguments,1);var emit=function(){var listeners=self._listeners,events;if(listeners&&(events=listeners[event])){forEach(events.slice(0),function(event){return event.apply(self,args)})}};if(args[args.length-1]===Emitter.EMIT_SYNC){args.pop();emit()}else{defer(emit)}return this}});Emitter.EMIT_SYNC={};module.exports=Emitter},{"./defer":31,"./index":33,"mout/array/forEach":9,"mout/array/indexOf":10}],33:[function(require,module,exports){"use strict";var hasOwn=require("mout/object/hasOwn"),mixIn=require("mout/object/mixIn"),create=require("mout/lang/createObject"),kindOf=require("mout/lang/kindOf");var hasDescriptors=true;try{Object.defineProperty({},"~",{});Object.getOwnPropertyDescriptor({},"~")}catch(e){hasDescriptors=false}var hasEnumBug=!{valueOf:0}.propertyIsEnumerable("valueOf"),buggy=["toString","valueOf"];var verbs=/^constructor|inherits|mixin$/;var implement=function(proto){var prototype=this.prototype;for(var key in proto){if(key.match(verbs))continue;if(hasDescriptors){var descriptor=Object.getOwnPropertyDescriptor(proto,key);if(descriptor){Object.defineProperty(prototype,key,descriptor);continue}}prototype[key]=proto[key]}if(hasEnumBug)for(var i=0;key=buggy[i];i++){var value=proto[key];if(value!==Object.prototype[key])prototype[key]=value}return this};var prime=function(proto){if(kindOf(proto)==="Function")proto={constructor:proto};var superprime=proto.inherits;var constructor=hasOwn(proto,"constructor")?proto.constructor:superprime?function(){return superprime.apply(this,arguments)}:function(){};if(superprime){mixIn(constructor,superprime);var superproto=superprime.prototype;var cproto=constructor.prototype=create(superproto);constructor.parent=superproto;cproto.constructor=constructor}if(!constructor.implement)constructor.implement=implement;var mixins=proto.mixin;if(mixins){if(kindOf(mixins)!=="Array")mixins=[mixins];for(var i=0;i<mixins.length;i++)constructor.implement(create(mixins[i].prototype))}return constructor.implement(proto)};module.exports=prime},{"mout/lang/createObject":16,"mout/lang/kindOf":19,"mout/object/hasOwn":24,"mout/object/mixIn":25}],34:[function(require,module,exports){"use strict";var indexOf=require("mout/array/indexOf");var prime=require("./index");var Map=prime({constructor:function Map(){this.length=0;this._values=[];this._keys=[]},set:function(key,value){var index=indexOf(this._keys,key);if(index===-1){this._keys.push(key);this._values.push(value);this.length++}else{this._values[index]=value}return this},get:function(key){var index=indexOf(this._keys,key);return index===-1?null:this._values[index]},count:function(){return this.length},forEach:function(method,context){for(var i=0,l=this.length;i<l;i++){if(method.call(context,this._values[i],this._keys[i],this)===false)break}return this},map:function(method,context){var results=new Map;this.forEach(function(value,key){results.set(key,method.call(context,value,key,this))},this);return results},filter:function(method,context){var results=new Map;this.forEach(function(value,key){if(method.call(context,value,key,this))results.set(key,value)},this);return results},every:function(method,context){var every=true;this.forEach(function(value,key){if(!method.call(context,value,key,this))return every=false},this);return every},some:function(method,context){var some=false;this.forEach(function(value,key){if(method.call(context,value,key,this))return!(some=true)},this);return some},indexOf:function(value){var index=indexOf(this._values,value);return index>-1?this._keys[index]:null},remove:function(value){var index=indexOf(this._values,value);if(index!==-1){this._values.splice(index,1);this.length--;return this._keys.splice(index,1)[0]}return null},unset:function(key){var index=indexOf(this._keys,key);if(index!==-1){this._keys.splice(index,1);this.length--;return this._values.splice(index,1)[0]}return null},keys:function(){return this._keys.slice()},values:function(){return this._values.slice()}});var map=function(){return new Map};map.prototype=Map.prototype;module.exports=map},{"./index":33,"mout/array/indexOf":10}],35:[function(require,module,exports){"use strict";var parse=require("./parser");var index=0,counter=document.__counter=(parseInt(document.__counter||-1,36)+1).toString(36),key="uid:"+counter;var uniqueID=function(n,xml){if(n===window)return"window";if(n===document)return"document";if(n===document.documentElement)return"html";if(xml){var uid=n.getAttribute(key);if(!uid){uid=(index++).toString(36);n.setAttribute(key,uid)}return uid}else{return n[key]||(n[key]=(index++).toString(36))}};var uniqueIDXML=function(n){return uniqueID(n,true)};var isArray=Array.isArray||function(object){return Object.prototype.toString.call(object)==="[object Array]"};var uniqueIndex=0;var HAS={GET_ELEMENT_BY_ID:function(test,id){id="slick_"+uniqueIndex++;test.innerHTML='<a id="'+id+'"></a>';return!!this.getElementById(id)},QUERY_SELECTOR:function(test){test.innerHTML="_<style>:nth-child(2){}</style>";test.innerHTML='<a class="MiX"></a>';return test.querySelectorAll(".MiX").length===1},EXPANDOS:function(test,id){id="slick_"+uniqueIndex++;test._custom_property_=id;return test._custom_property_===id},MATCHES_SELECTOR:function(test){test.className="MiX";var matches=test.matchesSelector||test.mozMatchesSelector||test.webkitMatchesSelector;if(matches)try{matches.call(test,":slick")}catch(e){return matches.call(test,".MiX")?matches:false}return false},GET_ELEMENTS_BY_CLASS_NAME:function(test){test.innerHTML='<a class="f"></a><a class="b"></a>';if(test.getElementsByClassName("b").length!==1)return false;test.firstChild.className="b";if(test.getElementsByClassName("b").length!==2)return false;test.innerHTML='<a class="a"></a><a class="f b a"></a>';if(test.getElementsByClassName("a").length!==2)return false;return true},GET_ATTRIBUTE:function(test){var shout="fus ro dah";test.innerHTML='<a class="'+shout+'"></a>';return test.firstChild.getAttribute("class")===shout}};var Finder=function Finder(document){this.document=document;var root=this.root=document.documentElement;this.tested={};this.uniqueID=this.has("EXPANDOS")?uniqueID:uniqueIDXML;this.getAttribute=this.has("GET_ATTRIBUTE")?function(node,name){return node.getAttribute(name)}:function(node,name){node=node.getAttributeNode(name);return node&&node.specified?node.value:null};this.hasAttribute=root.hasAttribute?function(node,attribute){return node.hasAttribute(attribute)}:function(node,attribute){node=node.getAttributeNode(attribute);return!!(node&&node.specified)};this.contains=document.contains&&root.contains?function(context,node){return context.contains(node)}:root.compareDocumentPosition?function(context,node){return context===node||!!(context.compareDocumentPosition(node)&16)}:function(context,node){do{if(node===context)return true}while(node=node.parentNode);return false};this.sorter=root.compareDocumentPosition?function(a,b){if(!a.compareDocumentPosition||!b.compareDocumentPosition)return 0;return a.compareDocumentPosition(b)&4?-1:a===b?0:1}:"sourceIndex"in root?function(a,b){if(!a.sourceIndex||!b.sourceIndex)return 0;return a.sourceIndex-b.sourceIndex}:document.createRange?function(a,b){if(!a.ownerDocument||!b.ownerDocument)return 0;var aRange=a.ownerDocument.createRange(),bRange=b.ownerDocument.createRange();aRange.setStart(a,0);aRange.setEnd(a,0);bRange.setStart(b,0);bRange.setEnd(b,0);return aRange.compareBoundaryPoints(Range.START_TO_END,bRange)}:null;this.failed={};var nativeMatches=this.has("MATCHES_SELECTOR");if(nativeMatches)this.matchesSelector=function(node,expression){if(this.failed[expression])return null;try{return nativeMatches.call(node,expression)}catch(e){if(slick.debug)console.warn("matchesSelector failed on "+expression);this.failed[expression]=true;return null}};if(this.has("QUERY_SELECTOR")){this.querySelectorAll=function(node,expression){if(this.failed[expression])return true;var result,_id,_expression,_combinator,_node;if(node!==this.document){_combinator=expression[0].combinator;_id=node.getAttribute("id");_expression=expression;if(!_id){_node=node;_id="__slick__";_node.setAttribute("id",_id)}expression="#"+_id+" "+_expression;if(_combinator.indexOf("~")>-1||_combinator.indexOf("+")>-1){node=node.parentNode;if(!node)result=true}}if(!result)try{result=node.querySelectorAll(expression.toString())}catch(e){if(slick.debug)console.warn("querySelectorAll failed on "+(_expression||expression));result=this.failed[_expression||expression]=true}if(_node)_node.removeAttribute("id");return result}}};Finder.prototype.has=function(FEATURE){var tested=this.tested,testedFEATURE=tested[FEATURE];if(testedFEATURE!=null)return testedFEATURE;var root=this.root,document=this.document,testNode=document.createElement("div");testNode.setAttribute("style","display: none;");root.appendChild(testNode);var TEST=HAS[FEATURE],result=false;if(TEST)try{result=TEST.call(document,testNode)}catch(e){}if(slick.debug&&!result)console.warn("document has no "+FEATURE);root.removeChild(testNode);
return tested[FEATURE]=result};var combinators={" ":function(node,part,push){var item,items;var noId=!part.id,noTag=!part.tag,noClass=!part.classes;if(part.id&&node.getElementById&&this.has("GET_ELEMENT_BY_ID")){item=node.getElementById(part.id);if(item&&item.getAttribute("id")===part.id){items=[item];noId=true;if(part.tag==="*")noTag=true}}if(!items){if(part.classes&&node.getElementsByClassName&&this.has("GET_ELEMENTS_BY_CLASS_NAME")){items=node.getElementsByClassName(part.classList);noClass=true;if(part.tag==="*")noTag=true}else{items=node.getElementsByTagName(part.tag);if(part.tag!=="*")noTag=true}if(!items||!items.length)return false}for(var i=0;item=items[i++];)if(noTag&&noId&&noClass&&!part.attributes&&!part.pseudos||this.match(item,part,noTag,noId,noClass))push(item);return true},">":function(node,part,push){if(node=node.firstChild)do{if(node.nodeType==1&&this.match(node,part))push(node)}while(node=node.nextSibling)},"+":function(node,part,push){while(node=node.nextSibling)if(node.nodeType==1){if(this.match(node,part))push(node);break}},"^":function(node,part,push){node=node.firstChild;if(node){if(node.nodeType===1){if(this.match(node,part))push(node)}else{combinators["+"].call(this,node,part,push)}}},"~":function(node,part,push){while(node=node.nextSibling){if(node.nodeType===1&&this.match(node,part))push(node)}},"++":function(node,part,push){combinators["+"].call(this,node,part,push);combinators["!+"].call(this,node,part,push)},"~~":function(node,part,push){combinators["~"].call(this,node,part,push);combinators["!~"].call(this,node,part,push)},"!":function(node,part,push){while(node=node.parentNode)if(node!==this.document&&this.match(node,part))push(node)},"!>":function(node,part,push){node=node.parentNode;if(node!==this.document&&this.match(node,part))push(node)},"!+":function(node,part,push){while(node=node.previousSibling)if(node.nodeType==1){if(this.match(node,part))push(node);break}},"!^":function(node,part,push){node=node.lastChild;if(node){if(node.nodeType==1){if(this.match(node,part))push(node)}else{combinators["!+"].call(this,node,part,push)}}},"!~":function(node,part,push){while(node=node.previousSibling){if(node.nodeType===1&&this.match(node,part))push(node)}}};Finder.prototype.search=function(context,expression,found){if(!context)context=this.document;else if(!context.nodeType&&context.document)context=context.document;var expressions=parse(expression);if(!expressions||!expressions.length)throw new Error("invalid expression");if(!found)found=[];var uniques,push=isArray(found)?function(node){found[found.length]=node}:function(node){found[found.length++]=node};if(expressions.length>1){uniques={};var plush=push;push=function(node){var uid=uniqueID(node);if(!uniques[uid]){uniques[uid]=true;plush(node)}}}var node,nodes,part;main:for(var i=0;expression=expressions[i++];){if(!slick.noQSA&&this.querySelectorAll){nodes=this.querySelectorAll(context,expression);if(nodes!==true){if(nodes&&nodes.length)for(var j=0;node=nodes[j++];)if(node.nodeName>"@"){push(node)}continue main}}if(expression.length===1){part=expression[0];combinators[part.combinator].call(this,context,part,push)}else{var cs=[context],c,f,u,p=function(node){var uid=uniqueID(node);if(!u[uid]){u[uid]=true;f[f.length]=node}};for(var j=0;part=expression[j++];){f=[];u={};for(var k=0;c=cs[k++];)combinators[part.combinator].call(this,c,part,p);if(!f.length)continue main;cs=f}if(i===0)found=f;else for(var l=0;l<f.length;l++)push(f[l])}}if(uniques&&found&&found.length>1)this.sort(found);return found};Finder.prototype.sort=function(nodes){return this.sorter?Array.prototype.sort.call(nodes,this.sorter):nodes};var pseudos={empty:function(){return!(this&&this.nodeType===1)&&!(this.innerText||this.textContent||"").length},not:function(expression){return!slick.match(this,expression)},contains:function(text){return(this.innerText||this.textContent||"").indexOf(text)>-1},"first-child":function(){var node=this;while(node=node.previousSibling)if(node.nodeType==1)return false;return true},"last-child":function(){var node=this;while(node=node.nextSibling)if(node.nodeType==1)return false;return true},"only-child":function(){var prev=this;while(prev=prev.previousSibling)if(prev.nodeType==1)return false;var next=this;while(next=next.nextSibling)if(next.nodeType==1)return false;return true},"first-of-type":function(){var node=this,nodeName=node.nodeName;while(node=node.previousSibling)if(node.nodeName==nodeName)return false;return true},"last-of-type":function(){var node=this,nodeName=node.nodeName;while(node=node.nextSibling)if(node.nodeName==nodeName)return false;return true},"only-of-type":function(){var prev=this,nodeName=this.nodeName;while(prev=prev.previousSibling)if(prev.nodeName==nodeName)return false;var next=this;while(next=next.nextSibling)if(next.nodeName==nodeName)return false;return true},enabled:function(){return!this.disabled},disabled:function(){return this.disabled},checked:function(){return this.checked||this.selected},selected:function(){return this.selected},focus:function(){var doc=this.ownerDocument;return doc.activeElement===this&&(this.href||this.type||slick.hasAttribute(this,"tabindex"))},root:function(){return this===this.ownerDocument.documentElement}};Finder.prototype.match=function(node,bit,noTag,noId,noClass){if(!slick.noQSA&&this.matchesSelector){var matches=this.matchesSelector(node,bit);if(matches!==null)return matches}if(!noTag&&bit.tag){var nodeName=node.nodeName.toLowerCase();if(bit.tag==="*"){if(nodeName<"@")return false}else if(nodeName!=bit.tag){return false}}if(!noId&&bit.id&&node.getAttribute("id")!==bit.id)return false;var i,part;if(!noClass&&bit.classes){var className=this.getAttribute(node,"class");if(!className)return false;for(part in bit.classes)if(!RegExp("(^|\\s)"+bit.classes[part]+"(\\s|$)").test(className))return false}var name,value;if(bit.attributes)for(i=0;part=bit.attributes[i++];){var operator=part.operator,escaped=part.escapedValue;name=part.name;value=part.value;if(!operator){if(!this.hasAttribute(node,name))return false}else{var actual=this.getAttribute(node,name);if(actual==null)return false;switch(operator){case"^=":if(!RegExp("^"+escaped).test(actual))return false;break;case"$=":if(!RegExp(escaped+"$").test(actual))return false;break;case"~=":if(!RegExp("(^|\\s)"+escaped+"(\\s|$)").test(actual))return false;break;case"|=":if(!RegExp("^"+escaped+"(-|$)").test(actual))return false;break;case"=":if(actual!==value)return false;break;case"*=":if(actual.indexOf(value)===-1)return false;break;default:return false}}}if(bit.pseudos)for(i=0;part=bit.pseudos[i++];){name=part.name;value=part.value;if(pseudos[name])return pseudos[name].call(node,value);if(value!=null){if(this.getAttribute(node,name)!==value)return false}else{if(!this.hasAttribute(node,name))return false}}return true};Finder.prototype.matches=function(node,expression){var expressions=parse(expression);if(expressions.length===1&&expressions[0].length===1){return this.match(node,expressions[0][0])}if(!slick.noQSA&&this.matchesSelector){var matches=this.matchesSelector(node,expressions);if(matches!==null)return matches}var nodes=this.search(this.document,expression,{length:0});for(var i=0,res;res=nodes[i++];)if(node===res)return true;return false};var finders={};var finder=function(context){var doc=context||document;if(doc.ownerDocument)doc=doc.ownerDocument;else if(doc.document)doc=doc.document;if(doc.nodeType!==9)throw new TypeError("invalid document");var uid=uniqueID(doc);return finders[uid]||(finders[uid]=new Finder(doc))};var slick=function(expression,context){return slick.search(expression,context)};slick.search=function(expression,context,found){return finder(context).search(context,expression,found)};slick.find=function(expression,context){return finder(context).search(context,expression)[0]||null};slick.getAttribute=function(node,name){return finder(node).getAttribute(node,name)};slick.hasAttribute=function(node,name){return finder(node).hasAttribute(node,name)};slick.contains=function(context,node){return finder(context).contains(context,node)};slick.matches=function(node,expression){return finder(node).matches(node,expression)};slick.sort=function(nodes){if(nodes&&nodes.length>1)finder(nodes[0]).sort(nodes);return nodes};slick.parse=parse;module.exports=slick},{"./parser":37}],36:[function(require,module,exports){(function(global){"use strict";module.exports="document"in global?require("./finder"):{parse:require("./parser")}}).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{})},{"./finder":35,"./parser":37}],37:[function(require,module,exports){"use strict";var escapeRe=/([-.*+?^${}()|[\]\/\\])/g,unescapeRe=/\\/g;var escape=function(string){return(string+"").replace(escapeRe,"\\$1")};var unescape=function(string){return(string+"").replace(unescapeRe,"")};var slickRe=RegExp("^(?:\\s*(,)\\s*|\\s*(<combinator>+)\\s*|(\\s+)|(<unicode>+|\\*)|\\#(<unicode>+)|\\.(<unicode>+)|\\[\\s*(<unicode1>+)(?:\\s*([*^$!~|]?=)(?:\\s*(?:([\"']?)(.*?)\\9)))?\\s*\\](?!\\])|(:+)(<unicode>+)(?:\\((?:(?:([\"'])([^\\13]*)\\13)|((?:\\([^)]+\\)|[^()]*)+))\\))?)".replace(/<combinator>/,"["+escape(">+~`!@$%^&={}\\;</")+"]").replace(/<unicode>/g,"(?:[\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])").replace(/<unicode1>/g,"(?:[:\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])"));var Part=function Part(combinator){this.combinator=combinator||" ";this.tag="*"};Part.prototype.toString=function(){if(!this.raw){var xpr="",k,part;xpr+=this.tag||"*";if(this.id)xpr+="#"+this.id;if(this.classes)xpr+="."+this.classList.join(".");if(this.attributes)for(k=0;part=this.attributes[k++];){xpr+="["+part.name+(part.operator?part.operator+'"'+part.value+'"':"")+"]"}if(this.pseudos)for(k=0;part=this.pseudos[k++];){xpr+=":"+part.name;if(part.value)xpr+="("+part.value+")"}this.raw=xpr}return this.raw};var Expression=function Expression(){this.length=0};Expression.prototype.toString=function(){if(!this.raw){var xpr="";for(var j=0,bit;bit=this[j++];){if(j!==1)xpr+=" ";if(bit.combinator!==" ")xpr+=bit.combinator+" ";xpr+=bit}this.raw=xpr}return this.raw};var replacer=function(rawMatch,separator,combinator,combinatorChildren,tagName,id,className,attributeKey,attributeOperator,attributeQuote,attributeValue,pseudoMarker,pseudoClass,pseudoQuote,pseudoClassQuotedValue,pseudoClassValue){var expression,current;if(separator||!this.length){expression=this[this.length++]=new Expression;if(separator)return""}if(!expression)expression=this[this.length-1];if(combinator||combinatorChildren||!expression.length){current=expression[expression.length++]=new Part(combinator)}if(!current)current=expression[expression.length-1];if(tagName){current.tag=unescape(tagName)}else if(id){current.id=unescape(id)}else if(className){var unescaped=unescape(className);var classes=current.classes||(current.classes={});if(!classes[unescaped]){classes[unescaped]=escape(className);var classList=current.classList||(current.classList=[]);classList.push(unescaped);classList.sort()}}else if(pseudoClass){pseudoClassValue=pseudoClassValue||pseudoClassQuotedValue;(current.pseudos||(current.pseudos=[])).push({type:pseudoMarker.length==1?"class":"element",name:unescape(pseudoClass),escapedName:escape(pseudoClass),value:pseudoClassValue?unescape(pseudoClassValue):null,escapedValue:pseudoClassValue?escape(pseudoClassValue):null})}else if(attributeKey){attributeValue=attributeValue?escape(attributeValue):null;(current.attributes||(current.attributes=[])).push({operator:attributeOperator,name:unescape(attributeKey),escapedName:escape(attributeKey),value:attributeValue?unescape(attributeValue):null,escapedValue:attributeValue?escape(attributeValue):null})}return""};var Expressions=function Expressions(expression){this.length=0;var self=this;var original=expression,replaced;while(expression){replaced=expression.replace(slickRe,function(){return replacer.apply(self,arguments)});if(replaced===expression)throw new Error(original+" is an invalid expression");expression=replaced}};Expressions.prototype.toString=function(){if(!this.raw){var expressions=[];for(var i=0,expression;expression=this[i++];)expressions.push(expression);this.raw=expressions.join(", ")}return this.raw};var cache={};var parse=function(expression){if(expression==null)return null;expression=(""+expression).replace(/^\s+|\s+$/g,"");return cache[expression]||(cache[expression]=new Expressions(expression))};module.exports=parse},{}],38:[function(require,module,exports){"use strict";var map=require("mout/array/map");var slick=require("slick");var $=require("./base");var gen=function(combinator,expression){return map(slick.parse(expression||"*"),function(part){return combinator+" "+part}).join(", ")};var push_=Array.prototype.push;$.implement({search:function(expression){if(this.length===1)return $(slick.search(expression,this[0],new $));var buffer=[];for(var i=0,node;node=this[i];i++)push_.apply(buffer,slick.search(expression,node));buffer=$(buffer);return buffer&&buffer.sort()},find:function(expression){if(this.length===1)return $(slick.find(expression,this[0]));for(var i=0,node;node=this[i];i++){var found=slick.find(expression,node);if(found)return $(found)}return null},sort:function(){return slick.sort(this)},matches:function(expression){return slick.matches(this[0],expression)},contains:function(node){return slick.contains(this[0],node)},nextSiblings:function(expression){return this.search(gen("~",expression))},nextSibling:function(expression){return this.find(gen("+",expression))},previousSiblings:function(expression){return this.search(gen("!~",expression))},previousSibling:function(expression){return this.find(gen("!+",expression))},children:function(expression){return this.search(gen(">",expression))},firstChild:function(expression){return this.find(gen("^",expression))},lastChild:function(expression){return this.find(gen("!^",expression))},parent:function(expression){var buffer=[];loop:for(var i=0,node;node=this[i];i++)while((node=node.parentNode)&&node!==document){if(!expression||slick.matches(node,expression)){buffer.push(node);break loop;break}}return $(buffer)},parents:function(expression){var buffer=[];for(var i=0,node;node=this[i];i++)while((node=node.parentNode)&&node!==document){if(!expression||slick.matches(node,expression))buffer.push(node)}return $(buffer)}});module.exports=$},{"./base":3,"mout/array/map":11,slick:36}],elements:[function(require,module,exports){"use strict";var $=require("./base");require("./attributes");require("./events");require("./insertion");require("./traversal");require("./delegation");module.exports=$},{"./attributes":2,"./base":3,"./delegation":4,"./events":5,"./insertion":6,"./traversal":38}]},{},[]);require=function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}({1:[function(require,module,exports){"use strict";var prime=require("prime");var Vector3=require("./Vector3");var Vector4=require("./Vector4");var stringify=function(array,places){if(places==null||places>20)places=20;var strings=[];for(var i=0;i<array.length;i++)strings[i]=array[i].toFixed(10).replace(/\.?0+$/,"");return strings};var TypeMask={Identity:0,Translate:1,Scale:2,Affine:4,Perspective:8,All:15,Unknown:128};var Matrix3d=prime({constructor:function Matrix3d(){var values=arguments;if(values.length===1)values=values[0];if(!values.length)values=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];var i=0,j,k=0;if(values.length===6){var a=values[0];var b=values[1];var c=values[2];var d=values[3];var e=values[4];var f=values[5];values=[a,b,0,0,c,d,0,0,0,0,1,0,e,f,0,1]}if(values.length!==16)throw new Error("invalid matrix");for(i=0;i<4;i++){var col=this[i]=[];for(j=0;j<4;j++){col[j]=values[k++]}}},get a(){return this.m11},get b(){return this.m12},get c(){return this.m21},get d(){return this.m22},get e(){return this.m41},get f(){return this.m42},set a(value){this.m11=value},set b(value){this.m12=value},set c(value){this.m21=value},set d(value){this.m22=value},set e(value){this.m41=value},set f(value){this.m42=value},get m11(){return this[0][0]},get m12(){return this[0][1]},get m13(){return this[0][2]},get m14(){return this[0][3]},get m21(){return this[1][0]},get m22(){return this[1][1]},get m23(){return this[1][2]},get m24(){return this[1][3]},get m31(){return this[2][0]},get m32(){return this[2][1]},get m33(){return this[2][2]},get m34(){return this[2][3]},get m41(){return this[3][0]},get m42(){return this[3][1]},get m43(){return this[3][2]},get m44(){return this[3][3]},set m11(value){this[0][0]=value},set m12(value){this[0][1]=value},set m13(value){this[0][2]=value},set m14(value){this[0][3]=value},set m21(value){this[1][0]=value},set m22(value){this[1][1]=value},set m23(value){this[1][2]=value},set m24(value){this[1][3]=value},set m31(value){this[2][0]=value},set m32(value){this[2][1]=value},set m33(value){this[2][2]=value},set m34(value){this[2][3]=value},set m41(value){this[3][0]=value},set m42(value){this[3][1]=value},set m43(value){this[3][2]=value},set m44(value){this[3][3]=value},get transX(){return this[3][0]},get transY(){return this[3][1]},get transZ(){return this[3][2]},get scaleX(){return this[0][0]},get scaleY(){return this[1][1]},get scaleZ(){return this[2][2]},get perspX(){return this[0][3]},get perspY(){return this[1][3]},get perspZ(){return this[2][3]},set transX(value){this[3][0]=value},set transY(value){this[3][1]=value},set transZ(value){this[3][2]=value},set scaleX(value){this[0][0]=value},set scaleY(value){this[1][1]=value},set scaleZ(value){this[2][2]=value},set perspX(value){this[0][3]=value},set perspY(value){this[1][3]=value},set perspZ(value){this[2][3]=value},get type(){var m=this;var mask=0;if(0!==m.perspX||0!==m.perspY||0!==m.perspZ||1!==m[3][3]){return TypeMask.Translate|TypeMask.Scale|TypeMask.Affine|TypeMask.Perspective}if(0!==m.transX||0!==m.transY||0!==m.transZ){mask|=TypeMask.Translate}if(1!==m.scaleX||1!==m.scaleY||1!==m.scaleZ){mask|=TypeMask.Scale}if(0!==m[1][0]||0!==m[0][1]||0!==m[0][2]||0!==m[2][0]||0!==m[1][2]||0!==m[2][1]){mask|=TypeMask.Affine}return mask},is2d:function(){var m=this;return m.m31===0&&m.m32===0&&m.m13===0&&m.m14===0&&m.m23===0&&m.m24===0&&m.m33===1&&m.m34===0&&m.m43===0&&m.m44===1},equals:function(m2){var m1=this;return;m1.m11===m2.m11&&m1.m12===m2.m12&&m1.m13===m2.m13&&m1.m14===m2.m14&&m1.m21===m2.m21&&m1.m22===m2.m22&&m1.m23===m2.m23&&m1.m24===m2.m24&&m1.m31===m2.m31&&m1.m32===m2.m32&&m1.m33===m2.m33&&m1.m34===m2.m34&&m1.m41===m2.m41&&m1.m42===m2.m42&&m1.m43===m2.m43&&m1.m44===m2.m44},clone:function(){var m=this;return new Matrix3d(m.m11,m.m12,m.m13,m.m14,m.m21,m.m22,m.m23,m.m24,m.m31,m.m32,m.m33,m.m34,m.m41,m.m42,m.m43,m.m44)},isIdentity:function(){return this.type===TypeMask.Identity},isTranslate:function(){return!(this.type&~TypeMask.Translate)},isScaleTranslate:function(){return!(this.type&~(TypeMask.Scale|TypeMask.Translate))},concat:function(m2){if(this.isIdentity())return m2.clone();if(m2.isIdentity())return this.clone();var m=new Matrix3d;for(var j=0;j<4;j++){for(var i=0;i<4;i++){var value=0;for(var k=0;k<4;k++){value+=this[k][i]*m2[j][k]}m[j][i]=value}}return m},translate:function(v3){var translationMatrix=new Matrix3d;translationMatrix.m41=v3[0];translationMatrix.m42=v3[1];translationMatrix.m43=v3[2];return this.concat(translationMatrix)},scale:function(v3){var m=new Matrix3d;m.m11=v3[0];m.m22=v3[1];m.m33=v3[2];return this.concat(m)},rotate:function(v4q){var rotationMatrix=new Matrix3d;var x=v4q[0];var y=v4q[1];var z=v4q[2];var w=v4q[3];rotationMatrix.m11=1-2*(y*y+z*z);rotationMatrix.m21=2*(x*y-z*w);rotationMatrix.m31=2*(x*z+y*w);rotationMatrix.m12=2*(x*y+z*w);rotationMatrix.m22=1-2*(x*x+z*z);rotationMatrix.m32=2*(y*z-x*w);rotationMatrix.m13=2*(x*z-y*w);rotationMatrix.m23=2*(y*z+x*w);rotationMatrix.m33=1-2*(x*x+y*y);return this.concat(rotationMatrix)},skew:function(v3){var skewMatrix=new Matrix3d;skewMatrix[1][0]=v3[0];skewMatrix[2][0]=v3[1];skewMatrix[2][1]=v3[2];return this.concat(skewMatrix)},perspective:function(v4){var perspectiveMatrix=new Matrix3d;perspectiveMatrix.m14=v4[0];perspectiveMatrix.m24=v4[1];perspectiveMatrix.m34=v4[2];perspectiveMatrix.m44=v4[3];return this.concat(perspectiveMatrix)},map:function(v4){var result=new Vector4;for(var i=0;i<4;i++){var value=0;for(var j=0;j<4;j++){value+=this[j][i]*v4[j]}result[i]=value}return result},determinant:function(){if(this.isIdentity())return 1;if(this.isScaleTranslate())return this[0][0]*this[1][1]*this[2][2]*this[3][3];var a00=this[0][0];var a01=this[0][1];var a02=this[0][2];var a03=this[0][3];var a10=this[1][0];var a11=this[1][1];var a12=this[1][2];var a13=this[1][3];var a20=this[2][0];var a21=this[2][1];var a22=this[2][2];var a23=this[2][3];var a30=this[3][0];var a31=this[3][1];var a32=this[3][2];var a33=this[3][3];var b00=a00*a11-a01*a10;var b01=a00*a12-a02*a10;var b02=a00*a13-a03*a10;var b03=a01*a12-a02*a11;var b04=a01*a13-a03*a11;var b05=a02*a13-a03*a12;var b06=a20*a31-a21*a30;var b07=a20*a32-a22*a30;var b08=a20*a33-a23*a30;var b09=a21*a32-a22*a31;var b10=a21*a33-a23*a31;var b11=a22*a33-a23*a32;return b00*b11-b01*b10+b02*b09+b03*b08-b04*b07+b05*b06},normalize:function(){var m44=this.m44;if(m44===0)return false;var normalizedMatrix=new Matrix3d;var scale=1/m44;for(var i=0;i<4;i++)for(var j=0;j<4;j++)normalizedMatrix[j][i]=this[j][i]*scale;return normalizedMatrix},decompose:function(){var matrix=this.normalize();if(!matrix)return false;var perspectiveMatrix=matrix.clone();var i,j;for(i=0;i<3;i++)perspectiveMatrix[i][3]=0;perspectiveMatrix[3][3]=1;if(Math.abs(perspectiveMatrix.determinant())<1e-8)return false;var perspective;if(matrix[0][3]!==0||matrix[1][3]!==0||matrix[2][3]!==0){var rightHandSide=new Vector4(matrix[0][3],matrix[1][3],matrix[2][3],matrix[3][3]);var inversePerspectiveMatrix=perspectiveMatrix.invert();if(!inversePerspectiveMatrix)return false;var transposedInversePerspectiveMatrix=inversePerspectiveMatrix.transpose();perspective=transposedInversePerspectiveMatrix.map(rightHandSide)}else{perspective=new Vector4(0,0,0,1)}var translate=new Vector3;for(i=0;i<3;i++)translate[i]=matrix[3][i];var row=[];for(i=0;i<3;i++){var v3=row[i]=new Vector3;for(j=0;j<3;++j)v3[j]=matrix[i][j]}var scale=new Vector3;scale[0]=row[0].length();row[0]=row[0].normalize();var skew=new Vector3;skew[0]=row[0].dot(row[1]);row[1]=row[1].combine(row[0],1,-skew[0]);scale[1]=row[1].length();row[1]=row[1].normalize();skew[0]/=scale[1];skew[1]=row[0].dot(row[2]);row[2]=row[2].combine(row[0],1,-skew[1]);skew[2]=row[1].dot(row[2]);row[2]=row[2].combine(row[1],1,-skew[2]);scale[2]=row[2].length();row[2]=row[2].normalize();skew[1]/=scale[2];skew[2]/=scale[2];var pdum3=row[1].cross(row[2]);if(row[0].dot(pdum3)<0){for(i=0;i<3;i++){scale[i]*=-1;for(j=0;j<3;++j)row[i][j]*=-1}}var quaternion=new Vector4(.5*Math.sqrt(Math.max(1+row[0][0]-row[1][1]-row[2][2],0)),.5*Math.sqrt(Math.max(1-row[0][0]+row[1][1]-row[2][2],0)),.5*Math.sqrt(Math.max(1-row[0][0]-row[1][1]+row[2][2],0)),.5*Math.sqrt(Math.max(1+row[0][0]+row[1][1]+row[2][2],0)));if(row[2][1]>row[1][2])quaternion[0]=-quaternion[0];if(row[0][2]>row[2][0])quaternion[1]=-quaternion[1];if(row[1][0]>row[0][1])quaternion[2]=-quaternion[2];return new DecomposedMatrix(perspective,translate,quaternion,skew,scale)},invert:function(){var a00=this[0][0];var a01=this[0][1];var a02=this[0][2];var a03=this[0][3];var a10=this[1][0];var a11=this[1][1];var a12=this[1][2];var a13=this[1][3];var a20=this[2][0];var a21=this[2][1];var a22=this[2][2];var a23=this[2][3];var a30=this[3][0];var a31=this[3][1];var a32=this[3][2];var a33=this[3][3];var b00=a00*a11-a01*a10;var b01=a00*a12-a02*a10;var b02=a00*a13-a03*a10;var b03=a01*a12-a02*a11;var b04=a01*a13-a03*a11;var b05=a02*a13-a03*a12;var b06=a20*a31-a21*a30;var b07=a20*a32-a22*a30;var b08=a20*a33-a23*a30;var b09=a21*a32-a22*a31;var b10=a21*a33-a23*a31;var b11=a22*a33-a23*a32;var det=b00*b11-b01*b10+b02*b09+b03*b08-b04*b07+b05*b06;if(det===0||!isFinite(det))return false;var invdet=1/det;b00*=invdet;b01*=invdet;b02*=invdet;b03*=invdet;b04*=invdet;b05*=invdet;b06*=invdet;b07*=invdet;b08*=invdet;b09*=invdet;b10*=invdet;b11*=invdet;return new Matrix3d(a11*b11-a12*b10+a13*b09,a02*b10-a01*b11-a03*b09,a31*b05-a32*b04+a33*b03,a22*b04-a21*b05-a23*b03,a12*b08-a10*b11-a13*b07,a00*b11-a02*b08+a03*b07,a32*b02-a30*b05-a33*b01,a20*b05-a22*b02+a23*b01,a10*b10-a11*b08+a13*b06,a01*b08-a00*b10-a03*b06,a30*b04-a31*b02+a33*b00,a21*b02-a20*b04-a23*b00,a11*b07-a10*b09-a12*b06,a00*b09-a01*b07+a02*b06,a31*b01-a30*b03-a32*b00,a20*b03-a21*b01+a22*b00)},transpose:function(){var m=this;return new Matrix3d(m.m11,m.m21,m.m31,m.m41,m.m12,m.m22,m.m32,m.m42,m.m13,m.m23,m.m33,m.m43,m.m14,m.m24,m.m34,m.m44)},interpolation:function(matrix){return new MatrixInterpolation(this,matrix)},toArray:function(){return this.is2d()?this.toArray2d():this.toArray3d()},toArray3d:function(){var m=this;return[m.m11,m.m12,m.m13,m.m14,m.m21,m.m22,m.m23,m.m24,m.m31,m.m32,m.m33,m.m34,m.m41,m.m42,m.m43,m.m44]},toArray2d:function(){var m=this;return[m.a,m.b,m.c,m.d,m.e,m.f]},toString:function(places){return this.is2d()?this.toString2d(places):this.toString3d(places)},toString3d:function(places){return"matrix3d("+stringify(this.toArray3d()).join(", ")+")"},toString2d:function(places){return"matrix("+stringify(this.toArray2d()).join(", ")+")"}});var DecomposedMatrix=prime({constructor:function DecomposedMatrix(perspective,translate,quaternion,skew,scale){this.perspective=perspective;this.translate=translate;this.quaternion=quaternion;this.skew=skew;this.scale=scale},interpolate:function(to,delta){var from=this;var perspective=from.perspective.lerp(to.perspective,delta);var translate=from.translate.lerp(to.translate,delta);var quaternion=from.quaternion.slerp(to.quaternion,delta);var skew=from.skew.lerp(to.skew,delta);var scale=from.scale.lerp(to.scale,delta);return new DecomposedMatrix(perspective,translate,quaternion,skew,scale)},compose:function(){return(new Matrix3d).perspective(this.perspective).translate(this.translate).rotate(this.quaternion).skew(this.skew).scale(this.scale)}});var MatrixInterpolation=prime({constructor:function MatrixInterpolation(from,to){this.matrix1=from;this.matrix2=to;this.from=from.decompose();this.to=to.decompose()},step:function(delta){if(delta===0)return this.matrix1;if(delta===1)return this.matrix2;return this.from.interpolate(this.to,delta).compose()}});Matrix3d.Decomposed=DecomposedMatrix;Matrix3d.Interpolation=MatrixInterpolation;module.exports=Matrix3d},{"./Vector3":2,"./Vector4":3,prime:4}],2:[function(require,module,exports){"use strict";var prime=require("prime");var Vector3=prime({constructor:function Vector3(x,y,z){this[0]=x||0;this[1]=y||0;this[2]=z||0},clone:function(){return new Vector3(this[0],this[1],this[2])},get x(){return this[0]},get y(){return this[1]},get z(){return this[2]},equals:function(v3){return this[0]===v3[0]&&this[1]===v3[1]&&this[2]===v3[2]},length:function(){return Math.sqrt(this[0]*this[0]+this[1]*this[1]+this[2]*this[2])},normalize:function(){var length=this.length();if(length===0)return new Vector3;return new Vector3(this[0]/length,this[1]/length,this[2]/length)},dot:function(v3){return this[0]*v3[0]+this[1]*v3[1]+this[2]*v3[2]},cross:function(v3){var x=this[0],y=this[1],z=this[2];return new Vector3(y*v3[2]-z*v3[1],z*v3[0]-x*v3[2],x*v3[1]-y*v3[0])},lerp:function(v3,delta){var scale1=delta;var scale2=1-delta;return v3.combine(this,scale1,scale2)},combine:function(v3,scale1,scale2){var result=new Vector3;for(var i=0;i<3;i++)result[i]=this[i]*scale1+v3[i]*scale2;return result}});module.exports=Vector3},{prime:4}],3:[function(require,module,exports){"use strict";var prime=require("prime");var degToRad=function(degrees){return degrees*Math.PI/180};var radToDeg=function(radians){return radians*180/Math.PI};var Vector4=prime({constructor:function Vector4(x,y,z,w){this[0]=x||0;this[1]=y||0;this[2]=z||0;this[3]=w||0},clone:function(){return new Vector4(this[0],this[1],this[2],this[3])},get x(){return this[0]},get y(){return this[1]},get z(){return this[2]},get w(){return this[3]},equals:function(v3){return this[0]===v3[0]&&this[1]===v3[1]&&this[2]===v3[2]&&this[3]===v3[3]},length:function(){return Math.sqrt(this[0]*this[0]+this[1]*this[1]+this[2]*this[2]+this[3]*this[3])},dot:function(v4){return this[0]*v4[0]+this[1]*v4[1]+this[2]*v4[2]+this[3]*v4[3]},normalize:function(){var length=this.length();if(length===0)return new Vector4(0,0,0,1);var inv=1/length;return new Vector4(this[0]*inv,this[1]*inv,this[2]*inv,this[3]*inv)},quaternionToAngle:function(deg){var v4=this;if(v4[3]>1)v4=v4.normalize();var w=2*Math.acos(v4[3]);var s=Math.sqrt(1-v4[3]*v4[3]);if(s<1e-4){return new Vector4(v4[0],v4[1],v4[2],w)}else{return new Vector4(v4[0]/s,v4[1]/s,v4[2]/s,deg?radToDeg(w):w)}},angleToQuaternion:function(deg){var angle=deg?degToRad(this[3]):this[3];var half=angle/2,s=Math.sin(half);return new Vector4(this[0]*s,this[1]*s,this[2]*s,Math.cos(half))},combine:function(v4,scale1,scale2){var result=new Vector4;for(var i=0;i<4;i++)result[i]=this[i]*scale1+v4[i]*scale2;return result},lerp:function(v4,delta){var scale1=delta;var scale2=1-delta;return v4.combine(this,scale1,scale2)},slerp:function(v4q,delta){var interpolated=new Vector4;var product=this.dot(v4q);product=Math.min(Math.max(product,-1),1);var scale1=1;if(product<0){product=-product;scale1=-1}var epsilon=1e-5;if(Math.abs(product-1)<epsilon){for(var i=0;i<4;++i)interpolated[i]=this[i];return interpolated}var denom=Math.sqrt(1-product*product);var theta=Math.acos(product);var w=Math.sin(delta*theta)*(1/denom);scale1*=Math.cos(delta*theta)-product*w;var scale2=w;return this.combine(v4q,scale1,scale2)}});module.exports=Vector4},{prime:4}],4:[function(require,module,exports){"use strict";var hasOwn=require("mout/object/hasOwn"),mixIn=require("mout/object/mixIn"),create=require("mout/lang/createObject"),kindOf=require("mout/lang/kindOf");var hasDescriptors=true;try{Object.defineProperty({},"~",{});Object.getOwnPropertyDescriptor({},"~")}catch(e){hasDescriptors=false}var hasEnumBug=!{valueOf:0}.propertyIsEnumerable("valueOf"),buggy=["toString","valueOf"];var verbs=/^constructor|inherits|mixin$/;var implement=function(proto){var prototype=this.prototype;for(var key in proto){if(key.match(verbs))continue;if(hasDescriptors){var descriptor=Object.getOwnPropertyDescriptor(proto,key);if(descriptor){Object.defineProperty(prototype,key,descriptor);continue}}prototype[key]=proto[key]}if(hasEnumBug)for(var i=0;key=buggy[i];i++){var value=proto[key];if(value!==Object.prototype[key])prototype[key]=value}return this};var prime=function(proto){if(kindOf(proto)==="Function")proto={constructor:proto};var superprime=proto.inherits;var constructor=hasOwn(proto,"constructor")?proto.constructor:superprime?function(){return superprime.apply(this,arguments)}:function(){};if(superprime){mixIn(constructor,superprime);var superproto=superprime.prototype;var cproto=constructor.prototype=create(superproto);constructor.parent=superproto;cproto.constructor=constructor}if(!constructor.implement)constructor.implement=implement;var mixins=proto.mixin;if(mixins){if(kindOf(mixins)!=="Array")mixins=[mixins];for(var i=0;i<mixins.length;i++)constructor.implement(create(mixins[i].prototype))}return constructor.implement(proto)};module.exports=prime},{"mout/lang/createObject":5,"mout/lang/kindOf":6,"mout/object/hasOwn":9,"mout/object/mixIn":10}],5:[function(require,module,exports){var mixIn=require("../object/mixIn");function createObject(parent,props){function F(){}F.prototype=parent;return mixIn(new F,props)}module.exports=createObject},{"../object/mixIn":10}],6:[function(require,module,exports){var _rKind=/^\[object (.*)\]$/,_toString=Object.prototype.toString,UNDEF;
function kindOf(val){if(val===null){return"Null"}else if(val===UNDEF){return"Undefined"}else{return _rKind.exec(_toString.call(val))[1]}}module.exports=kindOf},{}],7:[function(require,module,exports){var hasOwn=require("./hasOwn");var _hasDontEnumBug,_dontEnums;function checkDontEnum(){_dontEnums=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"];_hasDontEnumBug=true;for(var key in{toString:null}){_hasDontEnumBug=false}}function forIn(obj,fn,thisObj){var key,i=0;if(_hasDontEnumBug==null)checkDontEnum();for(key in obj){if(exec(fn,obj,key,thisObj)===false){break}}if(_hasDontEnumBug){var ctor=obj.constructor,isProto=!!ctor&&obj===ctor.prototype;while(key=_dontEnums[i++]){if((key!=="constructor"||!isProto&&hasOwn(obj,key))&&obj[key]!==Object.prototype[key]){if(exec(fn,obj,key,thisObj)===false){break}}}}}function exec(fn,obj,key,thisObj){return fn.call(thisObj,obj[key],key,obj)}module.exports=forIn},{"./hasOwn":9}],8:[function(require,module,exports){var hasOwn=require("./hasOwn");var forIn=require("./forIn");function forOwn(obj,fn,thisObj){forIn(obj,function(val,key){if(hasOwn(obj,key)){return fn.call(thisObj,obj[key],key,obj)}})}module.exports=forOwn},{"./forIn":7,"./hasOwn":9}],9:[function(require,module,exports){function hasOwn(obj,prop){return Object.prototype.hasOwnProperty.call(obj,prop)}module.exports=hasOwn},{}],10:[function(require,module,exports){var forOwn=require("./forOwn");function mixIn(target,objects){var i=0,n=arguments.length,obj;while(++i<n){obj=arguments[i];if(obj!=null){forOwn(obj,copyProp,target)}}return target}function copyProp(val,key){this[key]=val}module.exports=mixIn},{"./forOwn":8}],matrix3d:[function(require,module,exports){"use strict";module.exports=require("./lib/Matrix3d")},{"./lib/Matrix3d":1}]},{},[]);require=function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}({1:[function(require,module,exports){"use strict";var prime=require("prime");var Matrix3d=require("matrix3d");var Vector3=require("matrix3d/lib/Vector3");var Vector4=require("matrix3d/lib/Vector4");var operations=require("./operations");var slice_=Array.prototype.slice;var Transform3d=prime({constructor:function Transform3d(operations){this.operations=operations||[]},append:function(operation){this.operations.push(operation);return this},isIdentity:function(){var operations=this.operations;for(var i=0;i<operations.length;i++){if(!operations[i].isIdentity())return false}return true},matrix3d:function(){return this.append(new operations.Matrix(new Matrix3d(arguments)))},matrix:function(a,b,c,d,e,f){return this.matrix3d(a,b,c,d,e,f)},translate3d:function(x,y,z){return this.append(new operations.Translate(new Vector3(x,y,z)))},translate:function(x,y){if(y==null)y=0;return this.translate3d(x,y,0)},translateX:function(x){return this.translate(x,0)},translateY:function(y){return this.translate(0,y)},translateZ:function(z){return this.translate3d(0,0,z)},scale3d:function(x,y,z){return this.append(new operations.Scale(new Vector3(x,y,z)))},scale:function(x,y){if(y==null)y=x;return this.scale3d(x,y,1)},scaleX:function(x){return this.scale(x,1)},scaleY:function(y){return this.scale(1,y)},scaleZ:function(z){return this.scale3d(1,1,z)},rotate3d:function(x,y,z,angle){return this.append(new operations.Rotate(new Vector4(x,y,z,angle)))},rotate:function(angle){return this.rotate3d(0,0,1,angle)},rotateX:function(angle){return this.rotate3d(1,0,0,angle)},rotateY:function(angle){return this.rotate3d(0,1,0,angle)},rotateZ:function(angle){return this.rotate3d(0,0,1,angle)},skew:function(x,y){if(y==null)y=0;return this.append(new operations.Skew([x,y]))},skewX:function(x){return this.skew(x,0)},skewY:function(y){return this.skew(0,y)},perspective:function(len){return this.append(new operations.Perspective(len))},interpolation:function(transform){return new TransformInterpolation(this,transform)},compose:function(){var matrix=new Matrix3d;var operations=this.operations;for(var i=0;i<operations.length;i++){matrix=matrix.concat(operations[i].compose())}return matrix},toString:function(){var string=[];var operations=this.operations;for(var i=0;i<operations.length;i++){string.push(operations[i].toString())}return string.join(" ")}});var TransformInterpolation=prime({constructor:function TransformInterpolation(from,to){var operations1=slice_.call(from.operations);var operations2=slice_.call(to.operations);var length1=operations1.length,length2=operations2.length;var operation1,operation2,i,interpolateTransform=true;if(!length1||from.isIdentity()){operations1=[];for(i=0;i<length2;i++)operations1.push(new operations[operations2[i].type]);length1=operations1.length}else if(!length2||to.isIdentity()){operations2=[];for(i=0;i<length1;i++)operations2.push(new operations[operations1[i].type]);length2=operations2.length}else if(length1===length2){for(i=0;i<length1;i++){operation1=operations1[i];operation2=operations2[i];var type1=operation1.type;var type2=operation2.type;if(type1!==type2){if(operation1.isIdentity()){operations1.splice(i,1,new operations[type2])}else if(operation2.isIdentity()){operations1.splice(i,1,new operations[type1])}else{interpolateTransform=false;break}}}}else{interpolateTransform=false}if(interpolateTransform){this.from=operations1;this.to=operations2;this.length=length1}else{this.from=[new operations.Matrix(from.compose())];this.to=[new operations.Matrix(to.compose())];this.length=1}},step:function(delta){if(delta===0)return new Transform3d(this.from);if(delta===1)return new Transform3d(this.to);var interpolated=new Transform3d;for(var i=0;i<this.length;i++){var from=this.from[i];var to=this.to[i];var operation=from.equals(to)?from:from.interpolate(to,delta);interpolated.append(operation)}return interpolated}});Transform3d.Interpolation=TransformInterpolation;module.exports=Transform3d},{"./operations":2,matrix3d:3,"matrix3d/lib/Vector3":5,"matrix3d/lib/Vector4":6,prime:7}],2:[function(require,module,exports){"use strict";var prime=require("prime");var Matrix3d=require("matrix3d");var Vector3=require("matrix3d/lib/Vector3");var Vector4=require("matrix3d/lib/Vector4");var epsilon=1e-4;var tanDeg=function(degrees){var radians=degrees*Math.PI/180;return Math.tan(radians)};var TranslateOperation=exports.Translate=prime({type:"Translate",constructor:function TranslateOperation(v3){this.value=v3||new Vector3(0,0,0)},equals:function(translateOperation){return this.value.equals(translateOperation.value)},interpolate:function(translateOperation,delta){return new TranslateOperation(this.value.lerp(translateOperation.value,delta))},isIdentity:function(){return this.value.equals(new Vector3(0,0,0))},compose:function(){return(new Matrix3d).translate(this.value)},toString:function(){var v=this.value;return"translate3d("+[v.x+"px",v.y+"px",v.z+"px"].join(", ")+")"}});var ScaleOperation=exports.Scale=prime({type:"Scale",constructor:function ScaleOperation(v3){this.value=v3||new Vector3(1,1,1)},equals:function(scaleOperation){return this.value.equals(scaleOperation.value)},interpolate:function(scaleOperation,delta){return new ScaleOperation(this.value.lerp(scaleOperation.value,delta))},isIdentity:function(){return this.value.equals(new Vector3(1,1,1))},compose:function(){return(new Matrix3d).scale(this.value)},toString:function(){var v=this.value;return"scale3d("+[v.x,v.y,v.z].join(", ")+")"}});var RotateOperation=exports.Rotate=prime({type:"Rotate",constructor:function RotateOperation(v4){this.value=v4||new Vector4(1,1,1,0)},equals:function(to){return this.value.equals(to.value)},interpolate:function(rotateOperation,delta){var from=this.value;var to=rotateOperation.value;var fromAxis=new Vector3(from.x,from.y,from.z);var toAxis=new Vector3(to.x,to.y,to.z);if(fromAxis.equals(toAxis)){return new RotateOperation(new Vector4(from.x,from.y,from.z,from.w*(1-delta)+to.w*delta))}var length1=fromAxis.length();var length2=toAxis.length();if(length1>epsilon&&length2>epsilon){var dot=fromAxis.dot(toAxis);var error=Math.abs(1-dot*dot/(length1*length2));var result=error<epsilon;if(result)return new RotateOperation(new Vector4(to.x,to.y,to.z,dot>0?from.w:-from.w))}var interpolated=from.angleToQuaternion(true).slerp(to.angleToQuaternion(true));return new RotateOperation(interpolated.quaternionToAngle(true))},isIdentity:function(){return this.value.equals(new Vector4(1,1,1,0))},compose:function(){return(new Matrix3d).rotate(this.value.angleToQuaternion(true))},toString:function(){var v=this.value;return"rotate3d("+[v.x,v.y,v.z,v.w+"deg"].join(", ")+")"}});var PerspectiveOperation=exports.Perspective=prime({type:"Perspective",constructor:function PerspectiveOperation(length){this.value=length||0},equals:function(perspectiveOperation){return this.value===perspectiveOperation.value},interpolate:function(perspectiveOperation,delta){return new PerspectiveOperation(this.value*(1-delta)+perspectiveOperation.value*delta)},isIdentity:function(){return this.value===0},compose:function(){var perspectiveMatrix=new Matrix3d;var value=this.value;if(value!==0)perspectiveMatrix.m34=-1/value;return perspectiveMatrix},toString:function(){return"perspective("+this.value+")"}});var SkewOperation=exports.Skew=prime({type:"Skew",constructor:function SkewOperation(XY){this.value=XY||[0,0]},equals:function(skewOperation){var array1=this.value;var array2=skewOperation.value;return array1[0]===array2[0]&&array1[1]===array2[1]},interpolate:function(skewOperation,delta){return new SkewOperation([this[0]*(1-delta)+skewOperation[0]*delta,this[1]*(1-delta)+skewOperation[1]*delta])},isIdentity:function(){var array=this.value;return array[0]===0&&array[1]===0},compose:function(){var value=this.value;var skewMatrix=new Matrix3d;skewMatrix.m21=tanDeg(value[0]);skewMatrix.m12=tanDeg(value[1]);return skewMatrix},toString:function(){var v=this.value;return"skewX("+v[0]+") skewY("+v[1]+")"}});var MatrixOperation=exports.Matrix=prime({type:"Matrix",constructor:function MatrixOperation(matrix,_decomposed){this.value=matrix||new Matrix3d;this.decomposed=_decomposed||this.value.decompose()},equals:function(matrixOperation){return this.value.equals(matrixOperation.value)},interpolate:function(matrixOperation,delta){var decomposed=this.decomposed.interpolate(matrixOperation.decomposed,delta);return new MatrixOperation(decomposed.compose(),decomposed)},isIdentity:function(){return this.value.isIdentity()},compose:function(){return this.value},toString:function(){return this.value.toString()}})},{matrix3d:3,"matrix3d/lib/Vector3":5,"matrix3d/lib/Vector4":6,prime:7}],3:[function(require,module,exports){"use strict";module.exports=require("./lib/Matrix3d")},{"./lib/Matrix3d":4}],4:[function(require,module,exports){"use strict";var prime=require("prime");var Vector3=require("./Vector3");var Vector4=require("./Vector4");var stringify=function(array,places){if(places==null||places>20)places=20;var strings=[];for(var i=0;i<array.length;i++)strings[i]=array[i].toFixed(10).replace(/\.?0+$/,"");return strings};var TypeMask={Identity:0,Translate:1,Scale:2,Affine:4,Perspective:8,All:15,Unknown:128};var Matrix3d=prime({constructor:function Matrix3d(){var values=arguments;if(values.length===1)values=values[0];if(!values.length)values=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];var i=0,j,k=0;if(values.length===6){var a=values[0];var b=values[1];var c=values[2];var d=values[3];var e=values[4];var f=values[5];values=[a,b,0,0,c,d,0,0,0,0,1,0,e,f,0,1]}if(values.length!==16)throw new Error("invalid matrix");for(i=0;i<4;i++){var col=this[i]=[];for(j=0;j<4;j++){col[j]=values[k++]}}},get a(){return this.m11},get b(){return this.m12},get c(){return this.m21},get d(){return this.m22},get e(){return this.m41},get f(){return this.m42},set a(value){this.m11=value},set b(value){this.m12=value},set c(value){this.m21=value},set d(value){this.m22=value},set e(value){this.m41=value},set f(value){this.m42=value},get m11(){return this[0][0]},get m12(){return this[0][1]},get m13(){return this[0][2]},get m14(){return this[0][3]},get m21(){return this[1][0]},get m22(){return this[1][1]},get m23(){return this[1][2]},get m24(){return this[1][3]},get m31(){return this[2][0]},get m32(){return this[2][1]},get m33(){return this[2][2]},get m34(){return this[2][3]},get m41(){return this[3][0]},get m42(){return this[3][1]},get m43(){return this[3][2]},get m44(){return this[3][3]},set m11(value){this[0][0]=value},set m12(value){this[0][1]=value},set m13(value){this[0][2]=value},set m14(value){this[0][3]=value},set m21(value){this[1][0]=value},set m22(value){this[1][1]=value},set m23(value){this[1][2]=value},set m24(value){this[1][3]=value},set m31(value){this[2][0]=value},set m32(value){this[2][1]=value},set m33(value){this[2][2]=value},set m34(value){this[2][3]=value},set m41(value){this[3][0]=value},set m42(value){this[3][1]=value},set m43(value){this[3][2]=value},set m44(value){this[3][3]=value},get transX(){return this[3][0]},get transY(){return this[3][1]},get transZ(){return this[3][2]},get scaleX(){return this[0][0]},get scaleY(){return this[1][1]},get scaleZ(){return this[2][2]},get perspX(){return this[0][3]},get perspY(){return this[1][3]},get perspZ(){return this[2][3]},set transX(value){this[3][0]=value},set transY(value){this[3][1]=value},set transZ(value){this[3][2]=value},set scaleX(value){this[0][0]=value},set scaleY(value){this[1][1]=value},set scaleZ(value){this[2][2]=value},set perspX(value){this[0][3]=value},set perspY(value){this[1][3]=value},set perspZ(value){this[2][3]=value},get type(){var m=this;var mask=0;if(0!==m.perspX||0!==m.perspY||0!==m.perspZ||1!==m[3][3]){return TypeMask.Translate|TypeMask.Scale|TypeMask.Affine|TypeMask.Perspective}if(0!==m.transX||0!==m.transY||0!==m.transZ){mask|=TypeMask.Translate}if(1!==m.scaleX||1!==m.scaleY||1!==m.scaleZ){mask|=TypeMask.Scale}if(0!==m[1][0]||0!==m[0][1]||0!==m[0][2]||0!==m[2][0]||0!==m[1][2]||0!==m[2][1]){mask|=TypeMask.Affine}return mask},is2d:function(){var m=this;return m.m31===0&&m.m32===0&&m.m13===0&&m.m14===0&&m.m23===0&&m.m24===0&&m.m33===1&&m.m34===0&&m.m43===0&&m.m44===1},equals:function(m2){var m1=this;return;m1.m11===m2.m11&&m1.m12===m2.m12&&m1.m13===m2.m13&&m1.m14===m2.m14&&m1.m21===m2.m21&&m1.m22===m2.m22&&m1.m23===m2.m23&&m1.m24===m2.m24&&m1.m31===m2.m31&&m1.m32===m2.m32&&m1.m33===m2.m33&&m1.m34===m2.m34&&m1.m41===m2.m41&&m1.m42===m2.m42&&m1.m43===m2.m43&&m1.m44===m2.m44},clone:function(){var m=this;return new Matrix3d(m.m11,m.m12,m.m13,m.m14,m.m21,m.m22,m.m23,m.m24,m.m31,m.m32,m.m33,m.m34,m.m41,m.m42,m.m43,m.m44)},isIdentity:function(){return this.type===TypeMask.Identity},isTranslate:function(){return!(this.type&~TypeMask.Translate)},isScaleTranslate:function(){return!(this.type&~(TypeMask.Scale|TypeMask.Translate))},concat:function(m2){if(this.isIdentity())return m2.clone();if(m2.isIdentity())return this.clone();var m=new Matrix3d;for(var j=0;j<4;j++){for(var i=0;i<4;i++){var value=0;for(var k=0;k<4;k++){value+=this[k][i]*m2[j][k]}m[j][i]=value}}return m},translate:function(v3){var translationMatrix=new Matrix3d;translationMatrix.m41=v3[0];translationMatrix.m42=v3[1];translationMatrix.m43=v3[2];return this.concat(translationMatrix)},scale:function(v3){var m=new Matrix3d;m.m11=v3[0];m.m22=v3[1];m.m33=v3[2];return this.concat(m)},rotate:function(v4q){var rotationMatrix=new Matrix3d;var x=v4q[0];var y=v4q[1];var z=v4q[2];var w=v4q[3];rotationMatrix.m11=1-2*(y*y+z*z);rotationMatrix.m21=2*(x*y-z*w);rotationMatrix.m31=2*(x*z+y*w);rotationMatrix.m12=2*(x*y+z*w);rotationMatrix.m22=1-2*(x*x+z*z);rotationMatrix.m32=2*(y*z-x*w);rotationMatrix.m13=2*(x*z-y*w);rotationMatrix.m23=2*(y*z+x*w);rotationMatrix.m33=1-2*(x*x+y*y);return this.concat(rotationMatrix)},skew:function(v3){var skewMatrix=new Matrix3d;skewMatrix[1][0]=v3[0];skewMatrix[2][0]=v3[1];skewMatrix[2][1]=v3[2];return this.concat(skewMatrix)},perspective:function(v4){var perspectiveMatrix=new Matrix3d;perspectiveMatrix.m14=v4[0];perspectiveMatrix.m24=v4[1];perspectiveMatrix.m34=v4[2];perspectiveMatrix.m44=v4[3];return this.concat(perspectiveMatrix)},map:function(v4){var result=new Vector4;for(var i=0;i<4;i++){var value=0;for(var j=0;j<4;j++){value+=this[j][i]*v4[j]}result[i]=value}return result},determinant:function(){if(this.isIdentity())return 1;if(this.isScaleTranslate())return this[0][0]*this[1][1]*this[2][2]*this[3][3];var a00=this[0][0];var a01=this[0][1];var a02=this[0][2];var a03=this[0][3];var a10=this[1][0];var a11=this[1][1];var a12=this[1][2];var a13=this[1][3];var a20=this[2][0];var a21=this[2][1];var a22=this[2][2];var a23=this[2][3];var a30=this[3][0];var a31=this[3][1];var a32=this[3][2];var a33=this[3][3];var b00=a00*a11-a01*a10;var b01=a00*a12-a02*a10;var b02=a00*a13-a03*a10;var b03=a01*a12-a02*a11;var b04=a01*a13-a03*a11;var b05=a02*a13-a03*a12;var b06=a20*a31-a21*a30;var b07=a20*a32-a22*a30;var b08=a20*a33-a23*a30;var b09=a21*a32-a22*a31;var b10=a21*a33-a23*a31;var b11=a22*a33-a23*a32;return b00*b11-b01*b10+b02*b09+b03*b08-b04*b07+b05*b06},normalize:function(){var m44=this.m44;if(m44===0)return false;var normalizedMatrix=new Matrix3d;var scale=1/m44;for(var i=0;i<4;i++)for(var j=0;j<4;j++)normalizedMatrix[j][i]=this[j][i]*scale;return normalizedMatrix},decompose:function(){var matrix=this.normalize();if(!matrix)return false;var perspectiveMatrix=matrix.clone();var i,j;for(i=0;i<3;i++)perspectiveMatrix[i][3]=0;perspectiveMatrix[3][3]=1;if(Math.abs(perspectiveMatrix.determinant())<1e-8)return false;var perspective;if(matrix[0][3]!==0||matrix[1][3]!==0||matrix[2][3]!==0){var rightHandSide=new Vector4(matrix[0][3],matrix[1][3],matrix[2][3],matrix[3][3]);var inversePerspectiveMatrix=perspectiveMatrix.invert();if(!inversePerspectiveMatrix)return false;var transposedInversePerspectiveMatrix=inversePerspectiveMatrix.transpose();perspective=transposedInversePerspectiveMatrix.map(rightHandSide)}else{perspective=new Vector4(0,0,0,1)}var translate=new Vector3;for(i=0;i<3;i++)translate[i]=matrix[3][i];var row=[];for(i=0;i<3;i++){var v3=row[i]=new Vector3;for(j=0;j<3;++j)v3[j]=matrix[i][j]}var scale=new Vector3;scale[0]=row[0].length();row[0]=row[0].normalize();var skew=new Vector3;skew[0]=row[0].dot(row[1]);row[1]=row[1].combine(row[0],1,-skew[0]);scale[1]=row[1].length();row[1]=row[1].normalize();skew[0]/=scale[1];skew[1]=row[0].dot(row[2]);row[2]=row[2].combine(row[0],1,-skew[1]);skew[2]=row[1].dot(row[2]);row[2]=row[2].combine(row[1],1,-skew[2]);scale[2]=row[2].length();row[2]=row[2].normalize();skew[1]/=scale[2];skew[2]/=scale[2];var pdum3=row[1].cross(row[2]);if(row[0].dot(pdum3)<0){for(i=0;i<3;i++){scale[i]*=-1;for(j=0;j<3;++j)row[i][j]*=-1}}var quaternion=new Vector4(.5*Math.sqrt(Math.max(1+row[0][0]-row[1][1]-row[2][2],0)),.5*Math.sqrt(Math.max(1-row[0][0]+row[1][1]-row[2][2],0)),.5*Math.sqrt(Math.max(1-row[0][0]-row[1][1]+row[2][2],0)),.5*Math.sqrt(Math.max(1+row[0][0]+row[1][1]+row[2][2],0)));if(row[2][1]>row[1][2])quaternion[0]=-quaternion[0];if(row[0][2]>row[2][0])quaternion[1]=-quaternion[1];if(row[1][0]>row[0][1])quaternion[2]=-quaternion[2];return new DecomposedMatrix(perspective,translate,quaternion,skew,scale)},invert:function(){var a00=this[0][0];var a01=this[0][1];var a02=this[0][2];var a03=this[0][3];var a10=this[1][0];var a11=this[1][1];var a12=this[1][2];var a13=this[1][3];var a20=this[2][0];var a21=this[2][1];var a22=this[2][2];var a23=this[2][3];var a30=this[3][0];var a31=this[3][1];var a32=this[3][2];var a33=this[3][3];var b00=a00*a11-a01*a10;var b01=a00*a12-a02*a10;var b02=a00*a13-a03*a10;var b03=a01*a12-a02*a11;var b04=a01*a13-a03*a11;var b05=a02*a13-a03*a12;var b06=a20*a31-a21*a30;var b07=a20*a32-a22*a30;var b08=a20*a33-a23*a30;var b09=a21*a32-a22*a31;var b10=a21*a33-a23*a31;var b11=a22*a33-a23*a32;var det=b00*b11-b01*b10+b02*b09+b03*b08-b04*b07+b05*b06;if(det===0||!isFinite(det))return false;var invdet=1/det;b00*=invdet;b01*=invdet;b02*=invdet;b03*=invdet;b04*=invdet;b05*=invdet;b06*=invdet;b07*=invdet;b08*=invdet;b09*=invdet;b10*=invdet;b11*=invdet;return new Matrix3d(a11*b11-a12*b10+a13*b09,a02*b10-a01*b11-a03*b09,a31*b05-a32*b04+a33*b03,a22*b04-a21*b05-a23*b03,a12*b08-a10*b11-a13*b07,a00*b11-a02*b08+a03*b07,a32*b02-a30*b05-a33*b01,a20*b05-a22*b02+a23*b01,a10*b10-a11*b08+a13*b06,a01*b08-a00*b10-a03*b06,a30*b04-a31*b02+a33*b00,a21*b02-a20*b04-a23*b00,a11*b07-a10*b09-a12*b06,a00*b09-a01*b07+a02*b06,a31*b01-a30*b03-a32*b00,a20*b03-a21*b01+a22*b00)},transpose:function(){var m=this;return new Matrix3d(m.m11,m.m21,m.m31,m.m41,m.m12,m.m22,m.m32,m.m42,m.m13,m.m23,m.m33,m.m43,m.m14,m.m24,m.m34,m.m44)},interpolation:function(matrix){return new MatrixInterpolation(this,matrix)},toArray:function(){return this.is2d()?this.toArray2d():this.toArray3d()},toArray3d:function(){var m=this;return[m.m11,m.m12,m.m13,m.m14,m.m21,m.m22,m.m23,m.m24,m.m31,m.m32,m.m33,m.m34,m.m41,m.m42,m.m43,m.m44]},toArray2d:function(){var m=this;return[m.a,m.b,m.c,m.d,m.e,m.f]},toString:function(places){return this.is2d()?this.toString2d(places):this.toString3d(places)},toString3d:function(places){return"matrix3d("+stringify(this.toArray3d()).join(", ")+")"},toString2d:function(places){return"matrix("+stringify(this.toArray2d()).join(", ")+")"}});var DecomposedMatrix=prime({constructor:function DecomposedMatrix(perspective,translate,quaternion,skew,scale){this.perspective=perspective;this.translate=translate;this.quaternion=quaternion;this.skew=skew;this.scale=scale},interpolate:function(to,delta){var from=this;var perspective=from.perspective.lerp(to.perspective,delta);var translate=from.translate.lerp(to.translate,delta);var quaternion=from.quaternion.slerp(to.quaternion,delta);var skew=from.skew.lerp(to.skew,delta);var scale=from.scale.lerp(to.scale,delta);return new DecomposedMatrix(perspective,translate,quaternion,skew,scale)},compose:function(){return(new Matrix3d).perspective(this.perspective).translate(this.translate).rotate(this.quaternion).skew(this.skew).scale(this.scale)}});var MatrixInterpolation=prime({constructor:function MatrixInterpolation(from,to){this.matrix1=from;this.matrix2=to;this.from=from.decompose();this.to=to.decompose()},step:function(delta){if(delta===0)return this.matrix1;if(delta===1)return this.matrix2;return this.from.interpolate(this.to,delta).compose()}});Matrix3d.Decomposed=DecomposedMatrix;Matrix3d.Interpolation=MatrixInterpolation;module.exports=Matrix3d},{"./Vector3":5,"./Vector4":6,prime:7}],5:[function(require,module,exports){"use strict";var prime=require("prime");var Vector3=prime({constructor:function Vector3(x,y,z){this[0]=x||0;this[1]=y||0;this[2]=z||0},clone:function(){return new Vector3(this[0],this[1],this[2])},get x(){return this[0]},get y(){return this[1]},get z(){return this[2]},equals:function(v3){return this[0]===v3[0]&&this[1]===v3[1]&&this[2]===v3[2]},length:function(){return Math.sqrt(this[0]*this[0]+this[1]*this[1]+this[2]*this[2])},normalize:function(){var length=this.length();if(length===0)return new Vector3;return new Vector3(this[0]/length,this[1]/length,this[2]/length)},dot:function(v3){return this[0]*v3[0]+this[1]*v3[1]+this[2]*v3[2]},cross:function(v3){var x=this[0],y=this[1],z=this[2];return new Vector3(y*v3[2]-z*v3[1],z*v3[0]-x*v3[2],x*v3[1]-y*v3[0])},lerp:function(v3,delta){var scale1=delta;var scale2=1-delta;return v3.combine(this,scale1,scale2)},combine:function(v3,scale1,scale2){var result=new Vector3;for(var i=0;i<3;i++)result[i]=this[i]*scale1+v3[i]*scale2;return result}});module.exports=Vector3},{prime:7}],6:[function(require,module,exports){"use strict";var prime=require("prime");var degToRad=function(degrees){return degrees*Math.PI/180};var radToDeg=function(radians){return radians*180/Math.PI};var Vector4=prime({constructor:function Vector4(x,y,z,w){this[0]=x||0;this[1]=y||0;this[2]=z||0;this[3]=w||0},clone:function(){return new Vector4(this[0],this[1],this[2],this[3])},get x(){return this[0]},get y(){return this[1]},get z(){return this[2]},get w(){return this[3]},equals:function(v3){return this[0]===v3[0]&&this[1]===v3[1]&&this[2]===v3[2]&&this[3]===v3[3]},length:function(){return Math.sqrt(this[0]*this[0]+this[1]*this[1]+this[2]*this[2]+this[3]*this[3])},dot:function(v4){return this[0]*v4[0]+this[1]*v4[1]+this[2]*v4[2]+this[3]*v4[3]},normalize:function(){var length=this.length();if(length===0)return new Vector4(0,0,0,1);var inv=1/length;return new Vector4(this[0]*inv,this[1]*inv,this[2]*inv,this[3]*inv)},quaternionToAngle:function(deg){var v4=this;if(v4[3]>1)v4=v4.normalize();var w=2*Math.acos(v4[3]);var s=Math.sqrt(1-v4[3]*v4[3]);if(s<1e-4){return new Vector4(v4[0],v4[1],v4[2],w)}else{return new Vector4(v4[0]/s,v4[1]/s,v4[2]/s,deg?radToDeg(w):w)}},angleToQuaternion:function(deg){var angle=deg?degToRad(this[3]):this[3];var half=angle/2,s=Math.sin(half);return new Vector4(this[0]*s,this[1]*s,this[2]*s,Math.cos(half))},combine:function(v4,scale1,scale2){var result=new Vector4;for(var i=0;i<4;i++)result[i]=this[i]*scale1+v4[i]*scale2;return result},lerp:function(v4,delta){var scale1=delta;var scale2=1-delta;return v4.combine(this,scale1,scale2)},slerp:function(v4q,delta){var interpolated=new Vector4;var product=this.dot(v4q);product=Math.min(Math.max(product,-1),1);var scale1=1;if(product<0){product=-product;scale1=-1}var epsilon=1e-5;if(Math.abs(product-1)<epsilon){for(var i=0;i<4;++i)interpolated[i]=this[i];return interpolated}var denom=Math.sqrt(1-product*product);var theta=Math.acos(product);var w=Math.sin(delta*theta)*(1/denom);scale1*=Math.cos(delta*theta)-product*w;var scale2=w;return this.combine(v4q,scale1,scale2)}});module.exports=Vector4},{prime:7}],7:[function(require,module,exports){"use strict";var hasOwn=require("mout/object/hasOwn"),mixIn=require("mout/object/mixIn"),create=require("mout/lang/createObject"),kindOf=require("mout/lang/kindOf");var hasDescriptors=true;try{Object.defineProperty({},"~",{});Object.getOwnPropertyDescriptor({},"~")}catch(e){hasDescriptors=false}var hasEnumBug=!{valueOf:0}.propertyIsEnumerable("valueOf"),buggy=["toString","valueOf"];var verbs=/^constructor|inherits|mixin$/;var implement=function(proto){var prototype=this.prototype;for(var key in proto){if(key.match(verbs))continue;if(hasDescriptors){var descriptor=Object.getOwnPropertyDescriptor(proto,key);if(descriptor){Object.defineProperty(prototype,key,descriptor);continue}}prototype[key]=proto[key]}if(hasEnumBug)for(var i=0;key=buggy[i];i++){var value=proto[key];if(value!==Object.prototype[key])prototype[key]=value}return this};var prime=function(proto){if(kindOf(proto)==="Function")proto={constructor:proto};var superprime=proto.inherits;var constructor=hasOwn(proto,"constructor")?proto.constructor:superprime?function(){return superprime.apply(this,arguments)}:function(){};if(superprime){mixIn(constructor,superprime);var superproto=superprime.prototype;var cproto=constructor.prototype=create(superproto);constructor.parent=superproto;cproto.constructor=constructor}if(!constructor.implement)constructor.implement=implement;var mixins=proto.mixin;if(mixins){if(kindOf(mixins)!=="Array")mixins=[mixins];for(var i=0;i<mixins.length;i++)constructor.implement(create(mixins[i].prototype))}return constructor.implement(proto)};module.exports=prime},{"mout/lang/createObject":8,"mout/lang/kindOf":9,"mout/object/hasOwn":12,"mout/object/mixIn":13}],8:[function(require,module,exports){var mixIn=require("../object/mixIn");function createObject(parent,props){function F(){}F.prototype=parent;return mixIn(new F,props)}module.exports=createObject},{"../object/mixIn":13}],9:[function(require,module,exports){var _rKind=/^\[object (.*)\]$/,_toString=Object.prototype.toString,UNDEF;function kindOf(val){if(val===null){return"Null"}else if(val===UNDEF){return"Undefined"}else{return _rKind.exec(_toString.call(val))[1]}}module.exports=kindOf},{}],10:[function(require,module,exports){var hasOwn=require("./hasOwn");var _hasDontEnumBug,_dontEnums;function checkDontEnum(){_dontEnums=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"];_hasDontEnumBug=true;for(var key in{toString:null}){_hasDontEnumBug=false}}function forIn(obj,fn,thisObj){var key,i=0;if(_hasDontEnumBug==null)checkDontEnum();for(key in obj){if(exec(fn,obj,key,thisObj)===false){break}}if(_hasDontEnumBug){var ctor=obj.constructor,isProto=!!ctor&&obj===ctor.prototype;while(key=_dontEnums[i++]){if((key!=="constructor"||!isProto&&hasOwn(obj,key))&&obj[key]!==Object.prototype[key]){if(exec(fn,obj,key,thisObj)===false){break}}}}}function exec(fn,obj,key,thisObj){return fn.call(thisObj,obj[key],key,obj)}module.exports=forIn},{"./hasOwn":12}],11:[function(require,module,exports){var hasOwn=require("./hasOwn");var forIn=require("./forIn");function forOwn(obj,fn,thisObj){forIn(obj,function(val,key){if(hasOwn(obj,key)){return fn.call(thisObj,obj[key],key,obj)}})}module.exports=forOwn},{"./forIn":10,"./hasOwn":12}],12:[function(require,module,exports){function hasOwn(obj,prop){return Object.prototype.hasOwnProperty.call(obj,prop)}module.exports=hasOwn},{}],13:[function(require,module,exports){var forOwn=require("./forOwn");function mixIn(target,objects){var i=0,n=arguments.length,obj;while(++i<n){obj=arguments[i];if(obj!=null){forOwn(obj,copyProp,target)}}return target}function copyProp(val,key){this[key]=val}module.exports=mixIn},{"./forOwn":11}],transform3d:[function(require,module,exports){"use strict";module.exports=require("./lib/Transform3d")},{"./lib/Transform3d":1}]},{},[]);require=function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}({1:[function(require,module,exports){var process=module.exports={};process.nextTick=function(){var canSetImmediate=typeof window!=="undefined"&&window.setImmediate;var canMutationObserver=typeof window!=="undefined"&&window.MutationObserver;var canPost=typeof window!=="undefined"&&window.postMessage&&window.addEventListener;if(canSetImmediate){return function(f){return window.setImmediate(f)}}var queue=[];if(canMutationObserver){var hiddenDiv=document.createElement("div");var observer=new MutationObserver(function(){var queueList=queue.slice();queue.length=0;queueList.forEach(function(fn){fn()})});observer.observe(hiddenDiv,{attributes:true});return function nextTick(fn){if(!queue.length){hiddenDiv.setAttribute("yes","no")}queue.push(fn)}}if(canPost){window.addEventListener("message",function(ev){var source=ev.source;if((source===window||source===null)&&ev.data==="process-tick"){ev.stopPropagation();if(queue.length>0){var fn=queue.shift();fn()}}},true);return function nextTick(fn){queue.push(fn);window.postMessage("process-tick","*")}}return function nextTick(fn){setTimeout(fn,0)}}();process.title="browser";process.browser=true;process.env={};process.argv=[];function noop(){}process.on=noop;process.addListener=noop;process.once=noop;process.off=noop;process.removeListener=noop;process.removeAllListeners=noop;process.emit=noop;process.binding=function(name){throw new Error("process.binding is not supported")};process.cwd=function(){return"/"};process.chdir=function(dir){throw new Error("process.chdir is not supported")}},{}],2:[function(require,module,exports){"use strict";var prime=require("prime");var forEach=require("mout/array/forEach"),map=require("mout/array/map"),filter=require("mout/array/filter"),every=require("mout/array/every"),some=require("mout/array/some");var index=0,__dc=document.__counter,counter=document.__counter=(__dc?parseInt(__dc,36)+1:0).toString(36),key="uid:"+counter;
var uniqueID=function(n){if(n===window)return"window";if(n===document)return"document";if(n===document.documentElement)return"html";return n[key]||(n[key]=(index++).toString(36))};var instances={};var $=prime({constructor:function $(n,context){if(n==null)return this&&this.constructor===$?new Elements:null;var self,uid;if(n.constructor!==Elements){self=new Elements;if(typeof n==="string"){if(!self.search)return null;self[self.length++]=context||document;return self.search(n)}if(n.nodeType||n===window){self[self.length++]=n}else if(n.length){var uniques={};for(var i=0,l=n.length;i<l;i++){var nodes=$(n[i],context);if(nodes&&nodes.length)for(var j=0,k=nodes.length;j<k;j++){var node=nodes[j];uid=uniqueID(node);if(!uniques[uid]){self[self.length++]=node;uniques[uid]=true}}}}}else{self=n}if(!self.length)return null;if(self.length===1){uid=uniqueID(self[0]);return instances[uid]||(instances[uid]=self)}return self}});var Elements=prime({inherits:$,constructor:function Elements(){this.length=0},unlink:function(){return this.map(function(node){delete instances[uniqueID(node)];return node})},forEach:function(method,context){forEach(this,method,context);return this},map:function(method,context){return map(this,method,context)},filter:function(method,context){return filter(this,method,context)},every:function(method,context){return every(this,method,context)},some:function(method,context){return some(this,method,context)}});module.exports=$},{"mout/array/every":4,"mout/array/filter":5,"mout/array/forEach":6,"mout/array/map":8,"mout/array/some":9,prime:25}],3:[function(require,module,exports){"use strict";var Emitter=require("prime/emitter");var $=require("./base");var html=document.documentElement;var addEventListener=html.addEventListener?function(node,event,handle,useCapture){node.addEventListener(event,handle,useCapture||false);return handle}:function(node,event,handle){node.attachEvent("on"+event,handle);return handle};var removeEventListener=html.removeEventListener?function(node,event,handle,useCapture){node.removeEventListener(event,handle,useCapture||false)}:function(node,event,handle){node.detachEvent("on"+event,handle)};$.implement({on:function(event,handle,useCapture){return this.forEach(function(node){var self=$(node);var internalEvent=event+(useCapture?":capture":"");Emitter.prototype.on.call(self,internalEvent,handle);var domListeners=self._domListeners||(self._domListeners={});if(!domListeners[internalEvent])domListeners[internalEvent]=addEventListener(node,event,function(e){Emitter.prototype.emit.call(self,internalEvent,e||window.event,Emitter.EMIT_SYNC)},useCapture)})},off:function(event,handle,useCapture){return this.forEach(function(node){var self=$(node);var internalEvent=event+(useCapture?":capture":"");var domListeners=self._domListeners,domEvent,listeners=self._listeners,events;if(domListeners&&(domEvent=domListeners[internalEvent])&&listeners&&(events=listeners[internalEvent])){Emitter.prototype.off.call(self,internalEvent,handle);if(!self._listeners||!self._listeners[event]){removeEventListener(node,event,domEvent);delete domListeners[event];for(var l in domListeners)return;delete self._domListeners}}})},emit:function(){var args=arguments;return this.forEach(function(node){Emitter.prototype.emit.apply($(node),args)})}});module.exports=$},{"./base":2,"prime/emitter":24}],4:[function(require,module,exports){var makeIterator=require("../function/makeIterator_");function every(arr,callback,thisObj){callback=makeIterator(callback,thisObj);var result=true;if(arr==null){return result}var i=-1,len=arr.length;while(++i<len){if(!callback(arr[i],i,arr)){result=false;break}}return result}module.exports=every},{"../function/makeIterator_":11}],5:[function(require,module,exports){var makeIterator=require("../function/makeIterator_");function filter(arr,callback,thisObj){callback=makeIterator(callback,thisObj);var results=[];if(arr==null){return results}var i=-1,len=arr.length,value;while(++i<len){value=arr[i];if(callback(value,i,arr)){results.push(value)}}return results}module.exports=filter},{"../function/makeIterator_":11}],6:[function(require,module,exports){function forEach(arr,callback,thisObj){if(arr==null){return}var i=-1,len=arr.length;while(++i<len){if(callback.call(thisObj,arr[i],i,arr)===false){break}}}module.exports=forEach},{}],7:[function(require,module,exports){function indexOf(arr,item,fromIndex){fromIndex=fromIndex||0;if(arr==null){return-1}var len=arr.length,i=fromIndex<0?len+fromIndex:fromIndex;while(i<len){if(arr[i]===item){return i}i++}return-1}module.exports=indexOf},{}],8:[function(require,module,exports){var makeIterator=require("../function/makeIterator_");function map(arr,callback,thisObj){callback=makeIterator(callback,thisObj);var results=[];if(arr==null){return results}var i=-1,len=arr.length;while(++i<len){results[i]=callback(arr[i],i,arr)}return results}module.exports=map},{"../function/makeIterator_":11}],9:[function(require,module,exports){var makeIterator=require("../function/makeIterator_");function some(arr,callback,thisObj){callback=makeIterator(callback,thisObj);var result=false;if(arr==null){return result}var i=-1,len=arr.length;while(++i<len){if(callback(arr[i],i,arr)){result=true;break}}return result}module.exports=some},{"../function/makeIterator_":11}],10:[function(require,module,exports){function identity(val){return val}module.exports=identity},{}],11:[function(require,module,exports){var identity=require("./identity");var prop=require("./prop");var deepMatches=require("../object/deepMatches");function makeIterator(src,thisObj){if(src==null){return identity}switch(typeof src){case"function":return typeof thisObj!=="undefined"?function(val,i,arr){return src.call(thisObj,val,i,arr)}:src;case"object":return function(val){return deepMatches(val,src)};case"string":case"number":return prop(src)}}module.exports=makeIterator},{"../object/deepMatches":17,"./identity":10,"./prop":12}],12:[function(require,module,exports){function prop(name){return function(obj){return obj[name]}}module.exports=prop},{}],13:[function(require,module,exports){var mixIn=require("../object/mixIn");function createObject(parent,props){function F(){}F.prototype=parent;return mixIn(new F,props)}module.exports=createObject},{"../object/mixIn":21}],14:[function(require,module,exports){var isKind=require("./isKind");var isArray=Array.isArray||function(val){return isKind(val,"Array")};module.exports=isArray},{"./isKind":15}],15:[function(require,module,exports){var kindOf=require("./kindOf");function isKind(val,kind){return kindOf(val)===kind}module.exports=isKind},{"./kindOf":16}],16:[function(require,module,exports){var _rKind=/^\[object (.*)\]$/,_toString=Object.prototype.toString,UNDEF;function kindOf(val){if(val===null){return"Null"}else if(val===UNDEF){return"Undefined"}else{return _rKind.exec(_toString.call(val))[1]}}module.exports=kindOf},{}],17:[function(require,module,exports){var forOwn=require("./forOwn");var isArray=require("../lang/isArray");function containsMatch(array,pattern){var i=-1,length=array.length;while(++i<length){if(deepMatches(array[i],pattern)){return true}}return false}function matchArray(target,pattern){var i=-1,patternLength=pattern.length;while(++i<patternLength){if(!containsMatch(target,pattern[i])){return false}}return true}function matchObject(target,pattern){var result=true;forOwn(pattern,function(val,key){if(!deepMatches(target[key],val)){return result=false}});return result}function deepMatches(target,pattern){if(target&&typeof target==="object"){if(isArray(target)&&isArray(pattern)){return matchArray(target,pattern)}else{return matchObject(target,pattern)}}else{return target===pattern}}module.exports=deepMatches},{"../lang/isArray":14,"./forOwn":19}],18:[function(require,module,exports){var hasOwn=require("./hasOwn");var _hasDontEnumBug,_dontEnums;function checkDontEnum(){_dontEnums=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"];_hasDontEnumBug=true;for(var key in{toString:null}){_hasDontEnumBug=false}}function forIn(obj,fn,thisObj){var key,i=0;if(_hasDontEnumBug==null)checkDontEnum();for(key in obj){if(exec(fn,obj,key,thisObj)===false){break}}if(_hasDontEnumBug){var ctor=obj.constructor,isProto=!!ctor&&obj===ctor.prototype;while(key=_dontEnums[i++]){if((key!=="constructor"||!isProto&&hasOwn(obj,key))&&obj[key]!==Object.prototype[key]){if(exec(fn,obj,key,thisObj)===false){break}}}}}function exec(fn,obj,key,thisObj){return fn.call(thisObj,obj[key],key,obj)}module.exports=forIn},{"./hasOwn":20}],19:[function(require,module,exports){var hasOwn=require("./hasOwn");var forIn=require("./forIn");function forOwn(obj,fn,thisObj){forIn(obj,function(val,key){if(hasOwn(obj,key)){return fn.call(thisObj,obj[key],key,obj)}})}module.exports=forOwn},{"./forIn":18,"./hasOwn":20}],20:[function(require,module,exports){function hasOwn(obj,prop){return Object.prototype.hasOwnProperty.call(obj,prop)}module.exports=hasOwn},{}],21:[function(require,module,exports){var forOwn=require("./forOwn");function mixIn(target,objects){var i=0,n=arguments.length,obj;while(++i<n){obj=arguments[i];if(obj!=null){forOwn(obj,copyProp,target)}}return target}function copyProp(val,key){this[key]=val}module.exports=mixIn},{"./forOwn":19}],22:[function(require,module,exports){function now(){return now.get()}now.get=typeof Date.now==="function"?Date.now:function(){return+new Date};module.exports=now},{}],23:[function(require,module,exports){(function(process,global){"use strict";var kindOf=require("mout/lang/kindOf"),now=require("mout/time/now"),forEach=require("mout/array/forEach"),indexOf=require("mout/array/indexOf");var callbacks={timeout:{},frame:[],immediate:[]};var push=function(collection,callback,context,defer){var iterator=function(){iterate(collection)};if(!collection.length)defer(iterator);var entry={callback:callback,context:context};collection.push(entry);return function(){var io=indexOf(collection,entry);if(io>-1)collection.splice(io,1)}};var iterate=function(collection){var time=now();forEach(collection.splice(0),function(entry){entry.callback.call(entry.context,time)})};var defer=function(callback,argument,context){return kindOf(argument)==="Number"?defer.timeout(callback,argument,context):defer.immediate(callback,argument)};if(global.process&&process.nextTick){defer.immediate=function(callback,context){return push(callbacks.immediate,callback,context,process.nextTick)}}else if(global.setImmediate){defer.immediate=function(callback,context){return push(callbacks.immediate,callback,context,setImmediate)}}else if(global.postMessage&&global.addEventListener){addEventListener("message",function(event){if(event.source===global&&event.data==="@deferred"){event.stopPropagation();iterate(callbacks.immediate)}},true);defer.immediate=function(callback,context){return push(callbacks.immediate,callback,context,function(){postMessage("@deferred","*")})}}else{defer.immediate=function(callback,context){return push(callbacks.immediate,callback,context,function(iterator){setTimeout(iterator,0)})}}var requestAnimationFrame=global.requestAnimationFrame||global.webkitRequestAnimationFrame||global.mozRequestAnimationFrame||global.oRequestAnimationFrame||global.msRequestAnimationFrame||function(callback){setTimeout(callback,1e3/60)};defer.frame=function(callback,context){return push(callbacks.frame,callback,context,requestAnimationFrame)};var clear;defer.timeout=function(callback,ms,context){var ct=callbacks.timeout;if(!clear)clear=defer.immediate(function(){clear=null;callbacks.timeout={}});return push(ct[ms]||(ct[ms]=[]),callback,context,function(iterator){setTimeout(iterator,ms)})};module.exports=defer}).call(this,require("_process"),typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{})},{_process:1,"mout/array/forEach":6,"mout/array/indexOf":7,"mout/lang/kindOf":16,"mout/time/now":22}],24:[function(require,module,exports){"use strict";var indexOf=require("mout/array/indexOf"),forEach=require("mout/array/forEach");var prime=require("./index"),defer=require("./defer");var slice=Array.prototype.slice;var Emitter=prime({on:function(event,fn){var listeners=this._listeners||(this._listeners={}),events=listeners[event]||(listeners[event]=[]);if(indexOf(events,fn)===-1)events.push(fn);return this},off:function(event,fn){var listeners=this._listeners,events,key,length=0;if(listeners&&(events=listeners[event])){var io=indexOf(events,fn);if(io>-1)events.splice(io,1);if(!events.length)delete listeners[event];for(var l in listeners)return this;delete this._listeners}return this},emit:function(event){var self=this,args=slice.call(arguments,1);var emit=function(){var listeners=self._listeners,events;if(listeners&&(events=listeners[event])){forEach(events.slice(0),function(event){return event.apply(self,args)})}};if(args[args.length-1]===Emitter.EMIT_SYNC){args.pop();emit()}else{defer(emit)}return this}});Emitter.EMIT_SYNC={};module.exports=Emitter},{"./defer":23,"./index":25,"mout/array/forEach":6,"mout/array/indexOf":7}],25:[function(require,module,exports){"use strict";var hasOwn=require("mout/object/hasOwn"),mixIn=require("mout/object/mixIn"),create=require("mout/lang/createObject"),kindOf=require("mout/lang/kindOf");var hasDescriptors=true;try{Object.defineProperty({},"~",{});Object.getOwnPropertyDescriptor({},"~")}catch(e){hasDescriptors=false}var hasEnumBug=!{valueOf:0}.propertyIsEnumerable("valueOf"),buggy=["toString","valueOf"];var verbs=/^constructor|inherits|mixin$/;var implement=function(proto){var prototype=this.prototype;for(var key in proto){if(key.match(verbs))continue;if(hasDescriptors){var descriptor=Object.getOwnPropertyDescriptor(proto,key);if(descriptor){Object.defineProperty(prototype,key,descriptor);continue}}prototype[key]=proto[key]}if(hasEnumBug)for(var i=0;key=buggy[i];i++){var value=proto[key];if(value!==Object.prototype[key])prototype[key]=value}return this};var prime=function(proto){if(kindOf(proto)==="Function")proto={constructor:proto};var superprime=proto.inherits;var constructor=hasOwn(proto,"constructor")?proto.constructor:superprime?function(){return superprime.apply(this,arguments)}:function(){};if(superprime){mixIn(constructor,superprime);var superproto=superprime.prototype;var cproto=constructor.prototype=create(superproto);constructor.parent=superproto;cproto.constructor=constructor}if(!constructor.implement)constructor.implement=implement;var mixins=proto.mixin;if(mixins){if(kindOf(mixins)!=="Array")mixins=[mixins];for(var i=0;i<mixins.length;i++)constructor.implement(create(mixins[i].prototype))}return constructor.implement(proto)};module.exports=prime},{"mout/lang/createObject":13,"mout/lang/kindOf":16,"mout/object/hasOwn":20,"mout/object/mixIn":21}],"elements/domready":[function(require,module,exports){"use strict";var $=require("./events");var readystatechange="onreadystatechange"in document,shouldPoll=false,loaded=false,readys=[],checks=[],ready=null,timer=null,test=document.createElement("div"),doc=$(document),win=$(window);var domready=function(){if(timer)timer=clearTimeout(timer);if(!loaded){if(readystatechange)doc.off("readystatechange",check);doc.off("DOMContentLoaded",domready);win.off("load",domready);loaded=true;for(var i=0;ready=readys[i++];)ready()}return loaded};var check=function(){for(var i=checks.length;i--;)if(checks[i]())return domready();return false};var poll=function(){clearTimeout(timer);if(!check())timer=setTimeout(poll,1e3/60)};if(document.readyState){var complete=function(){return!!/loaded|complete/.test(document.readyState)};checks.push(complete);if(!complete()){if(readystatechange)doc.on("readystatechange",check);else shouldPoll=true}else{domready()}}if(test.doScroll){var scrolls=function(){try{test.doScroll();return true}catch(e){}return false};if(!scrolls()){checks.push(scrolls);shouldPoll=true}}if(shouldPoll)poll();doc.on("DOMContentLoaded",domready);win.on("load",domready);module.exports=function(ready){loaded?ready():readys.push(ready);return null}},{"./events":3}]},{},[]);require=function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}({1:[function(require,module,exports){"use strict";var hasOwn=require("mout/object/hasOwn"),mixIn=require("mout/object/mixIn"),create=require("mout/lang/createObject"),kindOf=require("mout/lang/kindOf");var hasDescriptors=true;try{Object.defineProperty({},"~",{});Object.getOwnPropertyDescriptor({},"~")}catch(e){hasDescriptors=false}var hasEnumBug=!{valueOf:0}.propertyIsEnumerable("valueOf"),buggy=["toString","valueOf"];var verbs=/^constructor|inherits|mixin$/;var implement=function(proto){var prototype=this.prototype;for(var key in proto){if(key.match(verbs))continue;if(hasDescriptors){var descriptor=Object.getOwnPropertyDescriptor(proto,key);if(descriptor){Object.defineProperty(prototype,key,descriptor);continue}}prototype[key]=proto[key]}if(hasEnumBug)for(var i=0;key=buggy[i];i++){var value=proto[key];if(value!==Object.prototype[key])prototype[key]=value}return this};var prime=function(proto){if(kindOf(proto)==="Function")proto={constructor:proto};var superprime=proto.inherits;var constructor=hasOwn(proto,"constructor")?proto.constructor:superprime?function(){return superprime.apply(this,arguments)}:function(){};if(superprime){mixIn(constructor,superprime);var superproto=superprime.prototype;var cproto=constructor.prototype=create(superproto);constructor.parent=superproto;cproto.constructor=constructor}if(!constructor.implement)constructor.implement=implement;var mixins=proto.mixin;if(mixins){if(kindOf(mixins)!=="Array")mixins=[mixins];for(var i=0;i<mixins.length;i++)constructor.implement(create(mixins[i].prototype))}return constructor.implement(proto)};module.exports=prime},{"mout/lang/createObject":2,"mout/lang/kindOf":3,"mout/object/hasOwn":6,"mout/object/mixIn":7}],2:[function(require,module,exports){var mixIn=require("../object/mixIn");function createObject(parent,props){function F(){}F.prototype=parent;return mixIn(new F,props)}module.exports=createObject},{"../object/mixIn":7}],3:[function(require,module,exports){var _rKind=/^\[object (.*)\]$/,_toString=Object.prototype.toString,UNDEF;function kindOf(val){if(val===null){return"Null"}else if(val===UNDEF){return"Undefined"}else{return _rKind.exec(_toString.call(val))[1]}}module.exports=kindOf},{}],4:[function(require,module,exports){var hasOwn=require("./hasOwn");var _hasDontEnumBug,_dontEnums;function checkDontEnum(){_dontEnums=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"];_hasDontEnumBug=true;for(var key in{toString:null}){_hasDontEnumBug=false}}function forIn(obj,fn,thisObj){var key,i=0;if(_hasDontEnumBug==null)checkDontEnum();for(key in obj){if(exec(fn,obj,key,thisObj)===false){break}}if(_hasDontEnumBug){var ctor=obj.constructor,isProto=!!ctor&&obj===ctor.prototype;while(key=_dontEnums[i++]){if((key!=="constructor"||!isProto&&hasOwn(obj,key))&&obj[key]!==Object.prototype[key]){if(exec(fn,obj,key,thisObj)===false){break}}}}}function exec(fn,obj,key,thisObj){return fn.call(thisObj,obj[key],key,obj)}module.exports=forIn},{"./hasOwn":6}],5:[function(require,module,exports){var hasOwn=require("./hasOwn");var forIn=require("./forIn");function forOwn(obj,fn,thisObj){forIn(obj,function(val,key){if(hasOwn(obj,key)){return fn.call(thisObj,obj[key],key,obj)}})}module.exports=forOwn},{"./forIn":4,"./hasOwn":6}],6:[function(require,module,exports){function hasOwn(obj,prop){return Object.prototype.hasOwnProperty.call(obj,prop)}module.exports=hasOwn},{}],7:[function(require,module,exports){var forOwn=require("./forOwn");function mixIn(target,objects){var i=0,n=arguments.length,obj;while(++i<n){obj=arguments[i];if(obj!=null){forOwn(obj,copyProp,target)}}return target}function copyProp(val,key){this[key]=val}module.exports=mixIn},{"./forOwn":5}],"matrix3d/lib/Vector3":[function(require,module,exports){"use strict";var prime=require("prime");var Vector3=prime({constructor:function Vector3(x,y,z){this[0]=x||0;this[1]=y||0;this[2]=z||0},clone:function(){return new Vector3(this[0],this[1],this[2])},get x(){return this[0]},get y(){return this[1]},get z(){return this[2]},equals:function(v3){return this[0]===v3[0]&&this[1]===v3[1]&&this[2]===v3[2]},length:function(){return Math.sqrt(this[0]*this[0]+this[1]*this[1]+this[2]*this[2])},normalize:function(){var length=this.length();if(length===0)return new Vector3;return new Vector3(this[0]/length,this[1]/length,this[2]/length)},dot:function(v3){return this[0]*v3[0]+this[1]*v3[1]+this[2]*v3[2]},cross:function(v3){var x=this[0],y=this[1],z=this[2];return new Vector3(y*v3[2]-z*v3[1],z*v3[0]-x*v3[2],x*v3[1]-y*v3[0])},lerp:function(v3,delta){var scale1=delta;var scale2=1-delta;return v3.combine(this,scale1,scale2)},combine:function(v3,scale1,scale2){var result=new Vector3;for(var i=0;i<3;i++)result[i]=this[i]*scale1+v3[i]*scale2;return result}});module.exports=Vector3},{prime:1}]},{},[]);require=function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}({1:[function(require,module,exports){"use strict";var hasOwn=require("mout/object/hasOwn"),mixIn=require("mout/object/mixIn"),create=require("mout/lang/createObject"),kindOf=require("mout/lang/kindOf");var hasDescriptors=true;try{Object.defineProperty({},"~",{});Object.getOwnPropertyDescriptor({},"~")}catch(e){hasDescriptors=false}var hasEnumBug=!{valueOf:0}.propertyIsEnumerable("valueOf"),buggy=["toString","valueOf"];var verbs=/^constructor|inherits|mixin$/;var implement=function(proto){var prototype=this.prototype;for(var key in proto){if(key.match(verbs))continue;if(hasDescriptors){var descriptor=Object.getOwnPropertyDescriptor(proto,key);if(descriptor){Object.defineProperty(prototype,key,descriptor);continue}}prototype[key]=proto[key]}if(hasEnumBug)for(var i=0;key=buggy[i];i++){var value=proto[key];if(value!==Object.prototype[key])prototype[key]=value}return this};var prime=function(proto){if(kindOf(proto)==="Function")proto={constructor:proto};var superprime=proto.inherits;var constructor=hasOwn(proto,"constructor")?proto.constructor:superprime?function(){return superprime.apply(this,arguments)}:function(){};if(superprime){mixIn(constructor,superprime);var superproto=superprime.prototype;var cproto=constructor.prototype=create(superproto);constructor.parent=superproto;cproto.constructor=constructor}if(!constructor.implement)constructor.implement=implement;var mixins=proto.mixin;if(mixins){if(kindOf(mixins)!=="Array")mixins=[mixins];for(var i=0;i<mixins.length;i++)constructor.implement(create(mixins[i].prototype))}return constructor.implement(proto)};module.exports=prime},{"mout/lang/createObject":2,"mout/lang/kindOf":3,"mout/object/hasOwn":6,"mout/object/mixIn":7}],2:[function(require,module,exports){var mixIn=require("../object/mixIn");function createObject(parent,props){function F(){}F.prototype=parent;return mixIn(new F,props)}module.exports=createObject},{"../object/mixIn":7}],3:[function(require,module,exports){var _rKind=/^\[object (.*)\]$/,_toString=Object.prototype.toString,UNDEF;function kindOf(val){if(val===null){return"Null"}else if(val===UNDEF){return"Undefined"}else{return _rKind.exec(_toString.call(val))[1]}}module.exports=kindOf},{}],4:[function(require,module,exports){var hasOwn=require("./hasOwn");var _hasDontEnumBug,_dontEnums;function checkDontEnum(){_dontEnums=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"];_hasDontEnumBug=true;for(var key in{toString:null}){_hasDontEnumBug=false}}function forIn(obj,fn,thisObj){var key,i=0;if(_hasDontEnumBug==null)checkDontEnum();for(key in obj){if(exec(fn,obj,key,thisObj)===false){break}}if(_hasDontEnumBug){var ctor=obj.constructor,isProto=!!ctor&&obj===ctor.prototype;while(key=_dontEnums[i++]){if((key!=="constructor"||!isProto&&hasOwn(obj,key))&&obj[key]!==Object.prototype[key]){if(exec(fn,obj,key,thisObj)===false){break}}}}}function exec(fn,obj,key,thisObj){return fn.call(thisObj,obj[key],key,obj)}module.exports=forIn},{"./hasOwn":6}],5:[function(require,module,exports){var hasOwn=require("./hasOwn");var forIn=require("./forIn");function forOwn(obj,fn,thisObj){forIn(obj,function(val,key){if(hasOwn(obj,key)){return fn.call(thisObj,obj[key],key,obj)}})}module.exports=forOwn},{"./forIn":4,"./hasOwn":6}],6:[function(require,module,exports){function hasOwn(obj,prop){return Object.prototype.hasOwnProperty.call(obj,prop)}module.exports=hasOwn},{}],7:[function(require,module,exports){var forOwn=require("./forOwn");function mixIn(target,objects){var i=0,n=arguments.length,obj;while(++i<n){obj=arguments[i];if(obj!=null){forOwn(obj,copyProp,target)}}return target}function copyProp(val,key){this[key]=val}module.exports=mixIn},{"./forOwn":5}],"matrix3d/lib/Vector4":[function(require,module,exports){"use strict";var prime=require("prime");var degToRad=function(degrees){return degrees*Math.PI/180};var radToDeg=function(radians){return radians*180/Math.PI};var Vector4=prime({constructor:function Vector4(x,y,z,w){this[0]=x||0;this[1]=y||0;this[2]=z||0;this[3]=w||0},clone:function(){return new Vector4(this[0],this[1],this[2],this[3])},get x(){return this[0]},get y(){return this[1]},get z(){return this[2]},get w(){return this[3]},equals:function(v3){return this[0]===v3[0]&&this[1]===v3[1]&&this[2]===v3[2]&&this[3]===v3[3]},length:function(){return Math.sqrt(this[0]*this[0]+this[1]*this[1]+this[2]*this[2]+this[3]*this[3])},dot:function(v4){return this[0]*v4[0]+this[1]*v4[1]+this[2]*v4[2]+this[3]*v4[3]},normalize:function(){var length=this.length();if(length===0)return new Vector4(0,0,0,1);var inv=1/length;return new Vector4(this[0]*inv,this[1]*inv,this[2]*inv,this[3]*inv)},quaternionToAngle:function(deg){var v4=this;if(v4[3]>1)v4=v4.normalize();var w=2*Math.acos(v4[3]);var s=Math.sqrt(1-v4[3]*v4[3]);if(s<1e-4){return new Vector4(v4[0],v4[1],v4[2],w)}else{return new Vector4(v4[0]/s,v4[1]/s,v4[2]/s,deg?radToDeg(w):w)}},angleToQuaternion:function(deg){var angle=deg?degToRad(this[3]):this[3];var half=angle/2,s=Math.sin(half);return new Vector4(this[0]*s,this[1]*s,this[2]*s,Math.cos(half))},combine:function(v4,scale1,scale2){var result=new Vector4;for(var i=0;i<4;i++)result[i]=this[i]*scale1+v4[i]*scale2;return result},lerp:function(v4,delta){var scale1=delta;var scale2=1-delta;return v4.combine(this,scale1,scale2)},slerp:function(v4q,delta){var interpolated=new Vector4;var product=this.dot(v4q);product=Math.min(Math.max(product,-1),1);var scale1=1;if(product<0){product=-product;scale1=-1}var epsilon=1e-5;if(Math.abs(product-1)<epsilon){for(var i=0;i<4;++i)interpolated[i]=this[i];return interpolated}var denom=Math.sqrt(1-product*product);var theta=Math.acos(product);var w=Math.sin(delta*theta)*(1/denom);scale1*=Math.cos(delta*theta)-product*w;var scale2=w;return this.combine(v4q,scale1,scale2)}});module.exports=Vector4},{prime:1}]},{},[]);"use strict";var $=require("elements");var ready=require("elements/domready");var Matrix3d=require("matrix3d");var Transform3d=require("transform3d");var Vector3=require("matrix3d/lib/Vector3");var Vector4=require("matrix3d/lib/Vector4");var SCENE_WIDTH=window.innerWidth;var SCENE_HEIGHT=window.innerHeight;var PERSPECTIVE=800;var PERSPECTIVE_ORIGIN=new Vector3(SCENE_WIDTH/2,SCENE_HEIGHT/2,0);var OBJECT_WIDTH=100;var OBJECT_HEIGHT=100;var TRANSFORM_ORIGIN=new Vector3(OBJECT_WIDTH/2,OBJECT_HEIGHT/2,0);var TRANSFORMATION=(new Transform3d).translateX(500).translateY(300).translateZ(400).rotateY(40).compose();var translationMatrix1=(new Matrix3d).translate(new Vector3(PERSPECTIVE_ORIGIN.x-TRANSFORM_ORIGIN.x,PERSPECTIVE_ORIGIN.y-TRANSFORM_ORIGIN.y,PERSPECTIVE_ORIGIN.z-TRANSFORM_ORIGIN.z));var perspectiveMatrix=new Matrix3d;perspectiveMatrix.m34=-1/PERSPECTIVE;var translationMatrix2=(new Matrix3d).translate(new Vector3(-(PERSPECTIVE_ORIGIN.x-TRANSFORM_ORIGIN.x),-(PERSPECTIVE_ORIGIN.y-TRANSFORM_ORIGIN.y),-(PERSPECTIVE_ORIGIN.z-TRANSFORM_ORIGIN.z)));perspectiveMatrix=translationMatrix1.concat(perspectiveMatrix).concat(translationMatrix2);var COMPUTED_PERSPECTIVE_TRANSFORMATION=perspectiveMatrix.concat(TRANSFORMATION);var vertices=[new Vector4(0,0,0,1),new Vector4(OBJECT_WIDTH,OBJECT_HEIGHT,0,1),new Vector4(OBJECT_WIDTH,0,0,1),new Vector4(0,OBJECT_HEIGHT,0,1),new Vector4(OBJECT_WIDTH/2,OBJECT_HEIGHT/2,0,1)];var pre=(new Matrix3d).translate(new Vector3(TRANSFORM_ORIGIN.x,TRANSFORM_ORIGIN.y,TRANSFORM_ORIGIN.z));var post=(new Matrix3d).translate(new Vector3(-TRANSFORM_ORIGIN.x,-TRANSFORM_ORIGIN.y,-TRANSFORM_ORIGIN.z));var FULL=pre.concat(COMPUTED_PERSPECTIVE_TRANSFORMATION).concat(post);var transformedVertices=vertices.map(function(vertex){return FULL.map(vertex)});var PROJECTED_VERTICES=transformedVertices.map(function(vertex){return new Vector3(vertex.x/vertex.w,vertex.y/vertex.w,vertex.z/vertex.w)});ready(function(){var perspectiveNode=$("#perspective");perspectiveNode[0].style.perspective=PERSPECTIVE+"px";perspectiveNode[0].style.perspectiveOrigin=PERSPECTIVE_ORIGIN.x+"px "+PERSPECTIVE_ORIGIN.y+"px "+PERSPECTIVE_ORIGIN.z+"px";perspectiveNode[0].style.transformStyle="preserve-3d";perspectiveNode[0].style.width=SCENE_WIDTH+"px";perspectiveNode[0].style.height=SCENE_HEIGHT+"px";var flatNode=$("#flat");flatNode[0].style.width=SCENE_WIDTH+"px";flatNode[0].style.height=SCENE_HEIGHT+"px";var perspectiveSquare=$("#perspective .square");perspectiveSquare[0].style.height=OBJECT_HEIGHT+"px";perspectiveSquare[0].style.width=OBJECT_WIDTH+"px";perspectiveSquare[0].style.transformOrigin=TRANSFORM_ORIGIN.x+"px "+TRANSFORM_ORIGIN.y+"px "+TRANSFORM_ORIGIN.z+"px";var flatSquare=$("#flat .square");flatSquare[0].style.height=OBJECT_HEIGHT+"px";flatSquare[0].style.width=OBJECT_WIDTH+"px";flatSquare[0].style.transformOrigin=TRANSFORM_ORIGIN.x+"px "+TRANSFORM_ORIGIN.y+"px "+TRANSFORM_ORIGIN.z+"px";perspectiveSquare[0].style.transform=TRANSFORMATION;flatSquare[0].style.transform=COMPUTED_PERSPECTIVE_TRANSFORMATION;var canvas=$("#vertices")[0];canvas.width=SCENE_WIDTH;canvas.height=SCENE_HEIGHT;var ctx=canvas.getContext("2d");PROJECTED_VERTICES.forEach(function(v,i){if(i!==4){ctx.beginPath();ctx.arc(v.x,v.y,3,0,Math.PI*2);ctx.closePath();ctx.fill()}else{ctx.beginPath();ctx.moveTo(v.x-10,v.y-10);ctx.lineTo(v.x+10,v.y+10);ctx.moveTo(v.x+10,v.y-10);ctx.lineTo(v.x-10,v.y+10);ctx.closePath();ctx.stroke()}})});
{
"name": "requirebin-sketch",
"version": "1.0.0",
"dependencies": {
"elements": "0.5.0",
"matrix3d": "0.1.0",
"transform3d": "0.1.2"
}
}
<div id="flat">
<div class="square"></div>
</div>
<div id="perspective">
<div class="square"></div>
</div>
<canvas id="vertices"></canvas>
<style>
body {
margin: 0;
padding: 0;
}
#perspective, #vertices, #flat, .square {
position: absolute;
top: 0;
left: 0;
}
#flat .square {
background: rgba(0, 0, 255, 0.5);
}
#perspective .square {
background: rgba(255, 0, 0, 0.5);
}
</style>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment