├── README.md ├── images ├── defunkt.jpg ├── rsanheim.jpg ├── thedaniel.jpg ├── github-mark.png ├── obama-square.jpg └── technoweenie.jpg ├── index.html ├── LICENSE └── js ├── app.js ├── color.min.js ├── dat.gui.min.js └── two.min.js /README.md: -------------------------------------------------------------------------------- 1 | duotune 2 | ============ 3 | -------------------------------------------------------------------------------- /images/defunkt.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/duotune/master/images/defunkt.jpg -------------------------------------------------------------------------------- /images/rsanheim.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/duotune/master/images/rsanheim.jpg -------------------------------------------------------------------------------- /images/thedaniel.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/duotune/master/images/thedaniel.jpg -------------------------------------------------------------------------------- /images/github-mark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/duotune/master/images/github-mark.png -------------------------------------------------------------------------------- /images/obama-square.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/duotune/master/images/obama-square.jpg -------------------------------------------------------------------------------- /images/technoweenie.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonlong/duotune/master/images/technoweenie.jpg -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Dancing Dots 5 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 Jason Long 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /js/app.js: -------------------------------------------------------------------------------- 1 | var BLOCK_SIZE = 12; 2 | 3 | var img = new Image(); 4 | var canvas = document.getElementsByClassName('dots-canvas')[0]; 5 | canvas.style.display = "none"; 6 | var ctx = canvas.getContext('2d'); 7 | 8 | var pixels = []; 9 | 10 | var two = new Two({ 11 | fullscreen: true, 12 | autostart: true 13 | }).appendTo(document.body); 14 | 15 | img.onload = function() { 16 | canvas.width = 800; 17 | canvas.height = 800; 18 | ctx.drawImage(img, 0, 0, 800, 800); 19 | 20 | 21 | for (var y=0; y < canvas.height; y+=BLOCK_SIZE) { 22 | for (var x=0; x < canvas.width; x+=BLOCK_SIZE) { 23 | var imgData = ctx.getImageData(x, y, BLOCK_SIZE, BLOCK_SIZE); 24 | var data = imgData.data; 25 | 26 | total_red = 0; 27 | total_green = 0; 28 | total_blue = 0; 29 | 30 | for (var i = 0; i < data.length; i += 4) { 31 | var red = data[i]; 32 | var green = data[i+1]; 33 | var blue = data[i+2]; 34 | 35 | total_red += red; 36 | total_green += green; 37 | total_blue += blue; 38 | } 39 | 40 | var color = Color().rgb(total_red/data.length*4, total_green/data.length*4, total_blue/data.length*4); 41 | 42 | var pixel = two.makeCircle(x + BLOCK_SIZE/2, y + BLOCK_SIZE/2, BLOCK_SIZE/2 * (color.luminosity())); 43 | pixel.noStroke().fill = "#ff0dff"; 44 | pixels.push(pixel); 45 | } 46 | } 47 | 48 | var group = two.makeGroup(pixels); 49 | var bounds = group.getBoundingClientRect(true); 50 | group.translation.set(two.width/2 - bounds.right/2, two.height/2 - bounds.bottom/2); 51 | two.update(); 52 | 53 | } 54 | img.src = 'images/thedaniel.jpg'; 55 | // img.src = 'images/github-mark.png'; 56 | -------------------------------------------------------------------------------- /js/color.min.js: -------------------------------------------------------------------------------- 1 | (function(e,t,n){function i(n,s){if(!t[n]){if(!e[n]){var o=typeof require=="function"&&require;if(!s&&o)return o(n,!0);if(r)return r(n,!0);throw new Error("Cannot find module '"+n+"'")}var u=t[n]={exports:{}};e[n][0].call(u.exports,function(t){var r=e[n][1][t];return i(r?r:t)},u,u.exports)}return t[n].exports}var r=typeof require=="function"&&require;for(var s=0;slum2){return(lum1+.05)/(lum2+.05)}return(lum2+.05)/(lum1+.05)},dark:function(){var rgb=this.values.rgb,yiq=(rgb[0]*299+rgb[1]*587+rgb[2]*114)/1e3;return yiq<128},light:function(){return!this.dark()},negate:function(){var rgb=[];for(var i=0;i<3;i++){rgb[i]=255-this.values.rgb[i]}this.setValues("rgb",rgb);return this},lighten:function(ratio){this.values.hsl[2]+=this.values.hsl[2]*ratio;this.setValues("hsl",this.values.hsl);return this},darken:function(ratio){this.values.hsl[2]-=this.values.hsl[2]*ratio;this.setValues("hsl",this.values.hsl);return this},saturate:function(ratio){this.values.hsl[1]+=this.values.hsl[1]*ratio;this.setValues("hsl",this.values.hsl);return this},desaturate:function(ratio){this.values.hsl[1]-=this.values.hsl[1]*ratio;this.setValues("hsl",this.values.hsl);return this},greyscale:function(){var rgb=this.values.rgb;var val=rgb[0]*.3+rgb[1]*.59+rgb[2]*.11;this.setValues("rgb",[val,val,val]);return this},clearer:function(ratio){this.setValues("alpha",this.values.alpha-this.values.alpha*ratio);return this},opaquer:function(ratio){this.setValues("alpha",this.values.alpha+this.values.alpha*ratio);return this},rotate:function(degrees){var hue=this.values.hsl[0];hue=(hue+degrees)%360;hue=hue<0?360+hue:hue;this.values.hsl[0]=hue;this.setValues("hsl",this.values.hsl);return this},mix:function(color2,weight){weight=1-(weight==null?.5:weight);var t1=weight*2-1,d=this.alpha()-color2.alpha();var weight1=((t1*d==-1?t1:(t1+d)/(1+t1*d))+1)/2;var weight2=1-weight1;var rgb=this.rgbArray();var rgb2=color2.rgbArray();for(var i=0;i.04045?Math.pow((r+.055)/1.055,2.4):r/12.92;g=g>.04045?Math.pow((g+.055)/1.055,2.4):g/12.92;b=b>.04045?Math.pow((b+.055)/1.055,2.4):b/12.92;var x=r*.4124+g*.3576+b*.1805;var y=r*.2126+g*.7152+b*.0722;var z=r*.0193+g*.1192+b*.9505;return[x*100,y*100,z*100]}function rgb2lab(rgb){var xyz=rgb2xyz(rgb),x=xyz[0],y=xyz[1],z=xyz[2],l,a,b;x/=95.047;y/=100;z/=108.883;x=x>.008856?Math.pow(x,1/3):7.787*x+16/116;y=y>.008856?Math.pow(y,1/3):7.787*y+16/116;z=z>.008856?Math.pow(z,1/3):7.787*z+16/116;l=116*y-16;a=500*(x-y);b=200*(y-z);return[l,a,b]}function hsl2rgb(hsl){var h=hsl[0]/360,s=hsl[1]/100,l=hsl[2]/100,t1,t2,t3,rgb,val;if(s==0){val=l*255;return[val,val,val]}if(l<.5)t2=l*(1+s);else t2=l+s-l*s;t1=2*l-t2;rgb=[0,0,0];for(var i=0;i<3;i++){t3=h+1/3*-(i-1);t3<0&&t3++;t3>1&&t3--;if(6*t3<1)val=t1+(t2-t1)*6*t3;else if(2*t3<1)val=t2;else if(3*t3<2)val=t1+(t2-t1)*(2/3-t3)*6;else val=t1;rgb[i]=val*255}return rgb}function hsl2hsv(hsl){var h=hsl[0],s=hsl[1]/100,l=hsl[2]/100,sv,v;l*=2;s*=l<=1?l:2-l;v=(l+s)/2;sv=2*s/(l+s);return[h,s*100,v*100]}function hsl2cmyk(args){return rgb2cmyk(hsl2rgb(args))}function hsl2keyword(args){return rgb2keyword(hsl2rgb(args))}function hsv2rgb(hsv){var h=hsv[0]/60,s=hsv[1]/100,v=hsv[2]/100,hi=Math.floor(h)%6;var f=h-Math.floor(h),p=255*v*(1-s),q=255*v*(1-s*f),t=255*v*(1-s*(1-f)),v=255*v;switch(hi){case 0:return[v,t,p];case 1:return[q,v,p];case 2:return[p,v,t];case 3:return[p,q,v];case 4:return[t,p,v];case 5:return[v,p,q]}}function hsv2hsl(hsv){var h=hsv[0],s=hsv[1]/100,v=hsv[2]/100,sl,l;l=(2-s)*v;sl=s*v;sl/=l<=1?l:2-l;l/=2;return[h,sl*100,l*100]}function hsv2cmyk(args){return rgb2cmyk(hsv2rgb(args))}function hsv2keyword(args){return rgb2keyword(hsv2rgb(args))}function cmyk2rgb(cmyk){var c=cmyk[0]/100,m=cmyk[1]/100,y=cmyk[2]/100,k=cmyk[3]/100,r,g,b;r=1-Math.min(1,c*(1-k)+k);g=1-Math.min(1,m*(1-k)+k);b=1-Math.min(1,y*(1-k)+k);return[r*255,g*255,b*255]}function cmyk2hsl(args){return rgb2hsl(cmyk2rgb(args))}function cmyk2hsv(args){return rgb2hsv(cmyk2rgb(args))}function cmyk2keyword(args){return rgb2keyword(cmyk2rgb(args))}function xyz2rgb(xyz){var x=xyz[0]/100,y=xyz[1]/100,z=xyz[2]/100,r,g,b;r=x*3.2406+y*-1.5372+z*-.4986;g=x*-.9689+y*1.8758+z*.0415;b=x*.0557+y*-.204+z*1.057;r=r>.0031308?1.055*Math.pow(r,1/2.4)-.055:r=r*12.92;g=g>.0031308?1.055*Math.pow(g,1/2.4)-.055:g=g*12.92;b=b>.0031308?1.055*Math.pow(b,1/2.4)-.055:b=b*12.92;r=r<0?0:r;g=g<0?0:g;b=b<0?0:b;return[r*255,g*255,b*255]}function keyword2rgb(keyword){return cssKeywords[keyword]}function keyword2hsl(args){return rgb2hsl(keyword2rgb(args))}function keyword2hsv(args){return rgb2hsv(keyword2rgb(args))}function keyword2cmyk(args){return rgb2cmyk(keyword2rgb(args))}var cssKeywords={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]};var reverseKeywords={};for(var key in cssKeywords){reverseKeywords[JSON.stringify(cssKeywords[key])]=key}},{}],4:[function(require,module,exports){var convert=require("color-convert");module.exports={getRgba:getRgba,getHsla:getHsla,getRgb:getRgb,getHsl:getHsl,getAlpha:getAlpha,hexString:hexString,rgbString:rgbString,rgbaString:rgbaString,percentString:percentString,percentaString:percentaString,hslString:hslString,hslaString:hslaString,keyword:keyword};function getRgba(string){if(!string){return}var abbr=/^#([a-fA-F0-9]{3})$/,hex=/^#([a-fA-F0-9]{6})$/,rgba=/^rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*([\d\.]+)\s*)?\)$/,per=/^rgba?\(\s*([\d\.]+)\%\s*,\s*([\d\.]+)\%\s*,\s*([\d\.]+)\%\s*(?:,\s*([\d\.]+)\s*)?\)$/,keyword=/(\D+)/;var rgb=[0,0,0],a=1,match=string.match(abbr);if(match){match=match[1];for(var i=0;i.04045?Math.pow((r+.055)/1.055,2.4):r/12.92;g=g>.04045?Math.pow((g+.055)/1.055,2.4):g/12.92;b=b>.04045?Math.pow((b+.055)/1.055,2.4):b/12.92;var x=r*.4124+g*.3576+b*.1805;var y=r*.2126+g*.7152+b*.0722;var z=r*.0193+g*.1192+b*.9505;return[x*100,y*100,z*100]}function rgb2lab(rgb){var xyz=rgb2xyz(rgb),x=xyz[0],y=xyz[1],z=xyz[2],l,a,b;x/=95.047;y/=100;z/=108.883;x=x>.008856?Math.pow(x,1/3):7.787*x+16/116;y=y>.008856?Math.pow(y,1/3):7.787*y+16/116;z=z>.008856?Math.pow(z,1/3):7.787*z+16/116;l=116*y-16;a=500*(x-y);b=200*(y-z);return[l,a,b]}function hsl2rgb(hsl){var h=hsl[0]/360,s=hsl[1]/100,l=hsl[2]/100,t1,t2,t3,rgb,val;if(s==0){val=l*255;return[val,val,val]}if(l<.5)t2=l*(1+s);else t2=l+s-l*s;t1=2*l-t2;rgb=[0,0,0];for(var i=0;i<3;i++){t3=h+1/3*-(i-1);t3<0&&t3++;t3>1&&t3--;if(6*t3<1)val=t1+(t2-t1)*6*t3;else if(2*t3<1)val=t2;else if(3*t3<2)val=t1+(t2-t1)*(2/3-t3)*6;else val=t1;rgb[i]=val*255}return rgb}function hsl2hsv(hsl){var h=hsl[0],s=hsl[1]/100,l=hsl[2]/100,sv,v;l*=2;s*=l<=1?l:2-l;v=(l+s)/2;sv=2*s/(l+s);return[h,s*100,v*100]}function hsl2cmyk(args){return rgb2cmyk(hsl2rgb(args))}function hsl2keyword(args){return rgb2keyword(hsl2rgb(args))}function hsv2rgb(hsv){var h=hsv[0]/60,s=hsv[1]/100,v=hsv[2]/100,hi=Math.floor(h)%6;var f=h-Math.floor(h),p=255*v*(1-s),q=255*v*(1-s*f),t=255*v*(1-s*(1-f)),v=255*v;switch(hi){case 0:return[v,t,p];case 1:return[q,v,p];case 2:return[p,v,t];case 3:return[p,q,v];case 4:return[t,p,v];case 5:return[v,p,q]}}function hsv2hsl(hsv){var h=hsv[0],s=hsv[1]/100,v=hsv[2]/100,sl,l;l=(2-s)*v;sl=s*v;sl/=l<=1?l:2-l;l/=2;return[h,sl*100,l*100]}function hsv2cmyk(args){return rgb2cmyk(hsv2rgb(args))}function hsv2keyword(args){return rgb2keyword(hsv2rgb(args))}function cmyk2rgb(cmyk){var c=cmyk[0]/100,m=cmyk[1]/100,y=cmyk[2]/100,k=cmyk[3]/100,r,g,b;r=1-Math.min(1,c*(1-k)+k);g=1-Math.min(1,m*(1-k)+k);b=1-Math.min(1,y*(1-k)+k);return[r*255,g*255,b*255]}function cmyk2hsl(args){return rgb2hsl(cmyk2rgb(args))}function cmyk2hsv(args){return rgb2hsv(cmyk2rgb(args))}function cmyk2keyword(args){return rgb2keyword(cmyk2rgb(args))}function xyz2rgb(xyz){var x=xyz[0]/100,y=xyz[1]/100,z=xyz[2]/100,r,g,b;r=x*3.2406+y*-1.5372+z*-.4986;g=x*-.9689+y*1.8758+z*.0415;b=x*.0557+y*-.204+z*1.057;r=r>.0031308?1.055*Math.pow(r,1/2.4)-.055:r=r*12.92;g=g>.0031308?1.055*Math.pow(g,1/2.4)-.055:g=g*12.92;b=b>.0031308?1.055*Math.pow(b,1/2.4)-.055:b=b*12.92;r=r<0?0:r;g=g<0?0:g;b=b<0?0:b;return[r*255,g*255,b*255]}function keyword2rgb(keyword){return cssKeywords[keyword]}function keyword2hsl(args){return rgb2hsl(keyword2rgb(args))}function keyword2hsv(args){return rgb2hsv(keyword2rgb(args))}function keyword2cmyk(args){return rgb2cmyk(keyword2rgb(args))}var cssKeywords={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]};var reverseKeywords={};for(var key in cssKeywords){reverseKeywords[JSON.stringify(cssKeywords[key])]=key}},{}]},{},[1]); -------------------------------------------------------------------------------- /js/dat.gui.min.js: -------------------------------------------------------------------------------- 1 | var dat=dat||{};dat.gui=dat.gui||{};dat.utils=dat.utils||{};dat.controllers=dat.controllers||{};dat.dom=dat.dom||{};dat.color=dat.color||{};dat.utils.css=function(){return{load:function(e,a){a=a||document;var b=a.createElement("link");b.type="text/css";b.rel="stylesheet";b.href=e;a.getElementsByTagName("head")[0].appendChild(b)},inject:function(e,a){a=a||document;var b=document.createElement("style");b.type="text/css";b.innerHTML=e;a.getElementsByTagName("head")[0].appendChild(b)}}}(); 2 | dat.utils.common=function(){var e=Array.prototype.forEach,a=Array.prototype.slice;return{BREAK:{},extend:function(b){this.each(a.call(arguments,1),function(a){for(var f in a)this.isUndefined(a[f])||(b[f]=a[f])},this);return b},defaults:function(b){this.each(a.call(arguments,1),function(a){for(var f in a)this.isUndefined(b[f])&&(b[f]=a[f])},this);return b},compose:function(){var b=a.call(arguments);return function(){for(var d=a.call(arguments),f=b.length-1;0<=f;f--)d=[b[f].apply(this,d)];return d[0]}}, 3 | each:function(a,d,f){if(e&&a.forEach===e)a.forEach(d,f);else if(a.length===a.length+0)for(var c=0,p=a.length;cthis.__max&&(a=this.__max);void 0!==this.__step&&0!=a%this.__step&&(a=Math.round(a/this.__step)*this.__step);return b.superclass.prototype.setValue.call(this,a)},min:function(a){this.__min=a;return this},max:function(a){this.__max=a;return this},step:function(a){this.__step=a;return this}});return b}(dat.controllers.Controller,dat.utils.common); 17 | dat.controllers.NumberControllerBox=function(e,a,b){var d=function(f,c,e){function k(){var a=parseFloat(n.__input.value);b.isNaN(a)||n.setValue(a)}function l(a){var c=r-a.clientY;n.setValue(n.getValue()+c*n.__impliedStep);r=a.clientY}function q(){a.unbind(window,"mousemove",l);a.unbind(window,"mouseup",q)}this.__truncationSuspended=!1;d.superclass.call(this,f,c,e);var n=this,r;this.__input=document.createElement("input");this.__input.setAttribute("type","text");a.bind(this.__input,"change",k);a.bind(this.__input, 18 | "blur",function(){k();n.__onFinishChange&&n.__onFinishChange.call(n,n.getValue())});a.bind(this.__input,"mousedown",function(c){a.bind(window,"mousemove",l);a.bind(window,"mouseup",q);r=c.clientY});a.bind(this.__input,"keydown",function(a){13===a.keyCode&&(n.__truncationSuspended=!0,this.blur(),n.__truncationSuspended=!1)});this.updateDisplay();this.domElement.appendChild(this.__input)};d.superclass=e;b.extend(d.prototype,e.prototype,{updateDisplay:function(){var a=this.__input,c;if(this.__truncationSuspended)c= 19 | this.getValue();else{c=this.getValue();var b=Math.pow(10,this.__precision);c=Math.round(c*b)/b}a.value=c;return d.superclass.prototype.updateDisplay.call(this)}});return d}(dat.controllers.NumberController,dat.dom.dom,dat.utils.common); 20 | dat.controllers.NumberControllerSlider=function(e,a,b,d,f){function c(a,c,d,b,f){return b+(a-c)/(d-c)*(f-b)}var p=function(d,b,f,e,r){function y(d){d.preventDefault();var b=a.getOffset(h.__background),f=a.getWidth(h.__background);h.setValue(c(d.clientX,b.left,b.left+f,h.__min,h.__max));return!1}function g(){a.unbind(window,"mousemove",y);a.unbind(window,"mouseup",g);h.__onFinishChange&&h.__onFinishChange.call(h,h.getValue())}p.superclass.call(this,d,b,{min:f,max:e,step:r});var h=this;this.__background= 21 | document.createElement("div");this.__foreground=document.createElement("div");a.bind(this.__background,"mousedown",function(c){a.bind(window,"mousemove",y);a.bind(window,"mouseup",g);y(c)});a.addClass(this.__background,"slider");a.addClass(this.__foreground,"slider-fg");this.updateDisplay();this.__background.appendChild(this.__foreground);this.domElement.appendChild(this.__background)};p.superclass=e;p.useDefaultStyles=function(){b.inject(f)};d.extend(p.prototype,e.prototype,{updateDisplay:function(){var a= 22 | (this.getValue()-this.__min)/(this.__max-this.__min);this.__foreground.style.width=100*a+"%";return p.superclass.prototype.updateDisplay.call(this)}});return p}(dat.controllers.NumberController,dat.dom.dom,dat.utils.css,dat.utils.common,"/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\n.slider {\n box-shadow: inset 0 2px 4px rgba(0,0,0,0.15);\n height: 1em;\n border-radius: 1em;\n background-color: #eee;\n padding: 0 0.5em;\n overflow: hidden;\n}\n\n.slider-fg {\n padding: 1px 0 2px 0;\n background-color: #aaa;\n height: 1em;\n margin-left: -0.5em;\n padding-right: 0.5em;\n border-radius: 1em 0 0 1em;\n}\n\n.slider-fg:after {\n display: inline-block;\n border-radius: 1em;\n background-color: #fff;\n border: 1px solid #aaa;\n content: '';\n float: right;\n margin-right: -1em;\n margin-top: -1px;\n height: 0.9em;\n width: 0.9em;\n}"); 23 | dat.controllers.FunctionController=function(e,a,b){var d=function(b,c,e){d.superclass.call(this,b,c);var k=this;this.__button=document.createElement("div");this.__button.innerHTML=void 0===e?"Fire":e;a.bind(this.__button,"click",function(a){a.preventDefault();k.fire();return!1});a.addClass(this.__button,"button");this.domElement.appendChild(this.__button)};d.superclass=e;b.extend(d.prototype,e.prototype,{fire:function(){this.__onChange&&this.__onChange.call(this);this.__onFinishChange&&this.__onFinishChange.call(this, 24 | this.getValue());this.getValue().call(this.object)}});return d}(dat.controllers.Controller,dat.dom.dom,dat.utils.common); 25 | dat.controllers.BooleanController=function(e,a,b){var d=function(b,c){d.superclass.call(this,b,c);var e=this;this.__prev=this.getValue();this.__checkbox=document.createElement("input");this.__checkbox.setAttribute("type","checkbox");a.bind(this.__checkbox,"change",function(){e.setValue(!e.__prev)},!1);this.domElement.appendChild(this.__checkbox);this.updateDisplay()};d.superclass=e;b.extend(d.prototype,e.prototype,{setValue:function(a){a=d.superclass.prototype.setValue.call(this,a);this.__onFinishChange&& 26 | this.__onFinishChange.call(this,this.getValue());this.__prev=this.getValue();return a},updateDisplay:function(){!0===this.getValue()?(this.__checkbox.setAttribute("checked","checked"),this.__checkbox.checked=!0):this.__checkbox.checked=!1;return d.superclass.prototype.updateDisplay.call(this)}});return d}(dat.controllers.Controller,dat.dom.dom,dat.utils.common); 27 | dat.color.toString=function(e){return function(a){if(1==a.a||e.isUndefined(a.a)){for(a=a.hex.toString(16);6>a.length;)a="0"+a;return"#"+a}return"rgba("+Math.round(a.r)+","+Math.round(a.g)+","+Math.round(a.b)+","+a.a+")"}}(dat.utils.common); 28 | dat.color.interpret=function(e,a){var b,d,f=[{litmus:a.isString,conversions:{THREE_CHAR_HEX:{read:function(a){a=a.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);return null===a?!1:{space:"HEX",hex:parseInt("0x"+a[1].toString()+a[1].toString()+a[2].toString()+a[2].toString()+a[3].toString()+a[3].toString())}},write:e},SIX_CHAR_HEX:{read:function(a){a=a.match(/^#([A-F0-9]{6})$/i);return null===a?!1:{space:"HEX",hex:parseInt("0x"+a[1].toString())}},write:e},CSS_RGB:{read:function(a){a=a.match(/^rgb\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\)/); 29 | return null===a?!1:{space:"RGB",r:parseFloat(a[1]),g:parseFloat(a[2]),b:parseFloat(a[3])}},write:e},CSS_RGBA:{read:function(a){a=a.match(/^rgba\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\,\s*(.+)\s*\)/);return null===a?!1:{space:"RGB",r:parseFloat(a[1]),g:parseFloat(a[2]),b:parseFloat(a[3]),a:parseFloat(a[4])}},write:e}}},{litmus:a.isNumber,conversions:{HEX:{read:function(a){return{space:"HEX",hex:a,conversionName:"HEX"}},write:function(a){return a.hex}}}},{litmus:a.isArray,conversions:{RGB_ARRAY:{read:function(a){return 3!= 30 | a.length?!1:{space:"RGB",r:a[0],g:a[1],b:a[2]}},write:function(a){return[a.r,a.g,a.b]}},RGBA_ARRAY:{read:function(a){return 4!=a.length?!1:{space:"RGB",r:a[0],g:a[1],b:a[2],a:a[3]}},write:function(a){return[a.r,a.g,a.b,a.a]}}}},{litmus:a.isObject,conversions:{RGBA_OBJ:{read:function(c){return a.isNumber(c.r)&&a.isNumber(c.g)&&a.isNumber(c.b)&&a.isNumber(c.a)?{space:"RGB",r:c.r,g:c.g,b:c.b,a:c.a}:!1},write:function(a){return{r:a.r,g:a.g,b:a.b,a:a.a}}},RGB_OBJ:{read:function(c){return a.isNumber(c.r)&& 31 | a.isNumber(c.g)&&a.isNumber(c.b)?{space:"RGB",r:c.r,g:c.g,b:c.b}:!1},write:function(a){return{r:a.r,g:a.g,b:a.b}}},HSVA_OBJ:{read:function(c){return a.isNumber(c.h)&&a.isNumber(c.s)&&a.isNumber(c.v)&&a.isNumber(c.a)?{space:"HSV",h:c.h,s:c.s,v:c.v,a:c.a}:!1},write:function(a){return{h:a.h,s:a.s,v:a.v,a:a.a}}},HSV_OBJ:{read:function(d){return a.isNumber(d.h)&&a.isNumber(d.s)&&a.isNumber(d.v)?{space:"HSV",h:d.h,s:d.s,v:d.v}:!1},write:function(a){return{h:a.h,s:a.s,v:a.v}}}}}];return function(){d=!1; 32 | var c=1\n\n Here\'s the new load parameter for your GUI\'s constructor:\n\n \n\n
\n\n Automatically save\n values to localStorage on exit.\n\n
The values saved to localStorage will\n override those passed to dat.GUI\'s constructor. This makes it\n easier to work incrementally, but localStorage is fragile,\n and your friends may not see the same values you do.\n \n
\n \n
\n\n', 59 | ".dg {\n /** Clear list styles */\n /* Auto-place container */\n /* Auto-placed GUI's */\n /* Line items that don't contain folders. */\n /** Folder names */\n /** Hides closed items */\n /** Controller row */\n /** Name-half (left) */\n /** Controller-half (right) */\n /** Controller placement */\n /** Shorter number boxes when slider is present. */\n /** Ensure the entire boolean and function row shows a hand */ }\n .dg ul {\n list-style: none;\n margin: 0;\n padding: 0;\n width: 100%;\n clear: both; }\n .dg.ac {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n height: 0;\n z-index: 0; }\n .dg:not(.ac) .main {\n /** Exclude mains in ac so that we don't hide close button */\n overflow: hidden; }\n .dg.main {\n -webkit-transition: opacity 0.1s linear;\n -o-transition: opacity 0.1s linear;\n -moz-transition: opacity 0.1s linear;\n transition: opacity 0.1s linear; }\n .dg.main.taller-than-window {\n overflow-y: auto; }\n .dg.main.taller-than-window .close-button {\n opacity: 1;\n /* TODO, these are style notes */\n margin-top: -1px;\n border-top: 1px solid #2c2c2c; }\n .dg.main ul.closed .close-button {\n opacity: 1 !important; }\n .dg.main:hover .close-button,\n .dg.main .close-button.drag {\n opacity: 1; }\n .dg.main .close-button {\n /*opacity: 0;*/\n -webkit-transition: opacity 0.1s linear;\n -o-transition: opacity 0.1s linear;\n -moz-transition: opacity 0.1s linear;\n transition: opacity 0.1s linear;\n border: 0;\n position: absolute;\n line-height: 19px;\n height: 20px;\n /* TODO, these are style notes */\n cursor: pointer;\n text-align: center;\n background-color: #000; }\n .dg.main .close-button:hover {\n background-color: #111; }\n .dg.a {\n float: right;\n margin-right: 15px;\n overflow-x: hidden; }\n .dg.a.has-save > ul {\n margin-top: 27px; }\n .dg.a.has-save > ul.closed {\n margin-top: 0; }\n .dg.a .save-row {\n position: fixed;\n top: 0;\n z-index: 1002; }\n .dg li {\n -webkit-transition: height 0.1s ease-out;\n -o-transition: height 0.1s ease-out;\n -moz-transition: height 0.1s ease-out;\n transition: height 0.1s ease-out; }\n .dg li:not(.folder) {\n cursor: auto;\n height: 27px;\n line-height: 27px;\n overflow: hidden;\n padding: 0 4px 0 5px; }\n .dg li.folder {\n padding: 0;\n border-left: 4px solid rgba(0, 0, 0, 0); }\n .dg li.title {\n cursor: pointer;\n margin-left: -4px; }\n .dg .closed li:not(.title),\n .dg .closed ul li,\n .dg .closed ul li > * {\n height: 0;\n overflow: hidden;\n border: 0; }\n .dg .cr {\n clear: both;\n padding-left: 3px;\n height: 27px; }\n .dg .property-name {\n cursor: default;\n float: left;\n clear: left;\n width: 40%;\n overflow: hidden;\n text-overflow: ellipsis; }\n .dg .c {\n float: left;\n width: 60%; }\n .dg .c input[type=text] {\n border: 0;\n margin-top: 4px;\n padding: 3px;\n width: 100%;\n float: right; }\n .dg .has-slider input[type=text] {\n width: 30%;\n /*display: none;*/\n margin-left: 0; }\n .dg .slider {\n float: left;\n width: 66%;\n margin-left: -5px;\n margin-right: 0;\n height: 19px;\n margin-top: 4px; }\n .dg .slider-fg {\n height: 100%; }\n .dg .c input[type=checkbox] {\n margin-top: 9px; }\n .dg .c select {\n margin-top: 5px; }\n .dg .cr.function,\n .dg .cr.function .property-name,\n .dg .cr.function *,\n .dg .cr.boolean,\n .dg .cr.boolean * {\n cursor: pointer; }\n .dg .selector {\n display: none;\n position: absolute;\n margin-left: -9px;\n margin-top: 23px;\n z-index: 10; }\n .dg .c:hover .selector,\n .dg .selector.drag {\n display: block; }\n .dg li.save-row {\n padding: 0; }\n .dg li.save-row .button {\n display: inline-block;\n padding: 0px 6px; }\n .dg.dialogue {\n background-color: #222;\n width: 460px;\n padding: 15px;\n font-size: 13px;\n line-height: 15px; }\n\n/* TODO Separate style and structure */\n#dg-new-constructor {\n padding: 10px;\n color: #222;\n font-family: Monaco, monospace;\n font-size: 10px;\n border: 0;\n resize: none;\n box-shadow: inset 1px 1px 1px #888;\n word-wrap: break-word;\n margin: 12px 0;\n display: block;\n width: 440px;\n overflow-y: scroll;\n height: 100px;\n position: relative; }\n\n#dg-local-explain {\n display: none;\n font-size: 11px;\n line-height: 17px;\n border-radius: 3px;\n background-color: #333;\n padding: 8px;\n margin-top: 10px; }\n #dg-local-explain code {\n font-size: 10px; }\n\n#dat-gui-save-locally {\n display: none; }\n\n/** Main type */\n.dg {\n color: #eee;\n font: 11px 'Lucida Grande', sans-serif;\n text-shadow: 0 -1px 0 #111;\n /** Auto place */\n /* Controller row,
  • */\n /** Controllers */ }\n .dg.main {\n /** Scrollbar */ }\n .dg.main::-webkit-scrollbar {\n width: 5px;\n background: #1a1a1a; }\n .dg.main::-webkit-scrollbar-corner {\n height: 0;\n display: none; }\n .dg.main::-webkit-scrollbar-thumb {\n border-radius: 5px;\n background: #676767; }\n .dg li:not(.folder) {\n background: #1a1a1a;\n border-bottom: 1px solid #2c2c2c; }\n .dg li.save-row {\n line-height: 25px;\n background: #dad5cb;\n border: 0; }\n .dg li.save-row select {\n margin-left: 5px;\n width: 108px; }\n .dg li.save-row .button {\n margin-left: 5px;\n margin-top: 1px;\n border-radius: 2px;\n font-size: 9px;\n line-height: 7px;\n padding: 4px 4px 5px 4px;\n background: #c5bdad;\n color: #fff;\n text-shadow: 0 1px 0 #b0a58f;\n box-shadow: 0 -1px 0 #b0a58f;\n cursor: pointer; }\n .dg li.save-row .button.gears {\n background: #c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;\n height: 7px;\n width: 8px; }\n .dg li.save-row .button:hover {\n background-color: #bab19e;\n box-shadow: 0 -1px 0 #b0a58f; }\n .dg li.folder {\n border-bottom: 0; }\n .dg li.title {\n padding-left: 16px;\n background: black url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;\n cursor: pointer;\n border-bottom: 1px solid rgba(255, 255, 255, 0.2); }\n .dg .closed li.title {\n background-image: url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==); }\n .dg .cr.boolean {\n border-left: 3px solid #806787; }\n .dg .cr.function {\n border-left: 3px solid #e61d5f; }\n .dg .cr.number {\n border-left: 3px solid #2fa1d6; }\n .dg .cr.number input[type=text] {\n color: #2fa1d6; }\n .dg .cr.string {\n border-left: 3px solid #1ed36f; }\n .dg .cr.string input[type=text] {\n color: #1ed36f; }\n .dg .cr.function:hover, .dg .cr.boolean:hover {\n background: #111; }\n .dg .c input[type=text] {\n background: #303030;\n outline: none; }\n .dg .c input[type=text]:hover {\n background: #3c3c3c; }\n .dg .c input[type=text]:focus {\n background: #494949;\n color: #fff; }\n .dg .c .slider {\n background: #303030;\n cursor: ew-resize; }\n .dg .c .slider-fg {\n background: #2fa1d6; }\n .dg .c .slider:hover {\n background: #3c3c3c; }\n .dg .c .slider:hover .slider-fg {\n background: #44abda; }\n", 60 | dat.controllers.factory=function(e,a,b,d,f,c,p){return function(k,l,q,n){var r=k[l];if(p.isArray(q)||p.isObject(q))return new e(k,l,q);if(p.isNumber(r))return p.isNumber(q)&&p.isNumber(n)?new b(k,l,q,n):new a(k,l,{min:q,max:n});if(p.isString(r))return new d(k,l);if(p.isFunction(r))return new f(k,l,"");if(p.isBoolean(r))return new c(k,l)}}(dat.controllers.OptionController,dat.controllers.NumberControllerBox,dat.controllers.NumberControllerSlider,dat.controllers.StringController=function(e,a,b){var d= 61 | function(b,c){function e(){k.setValue(k.__input.value)}d.superclass.call(this,b,c);var k=this;this.__input=document.createElement("input");this.__input.setAttribute("type","text");a.bind(this.__input,"keyup",e);a.bind(this.__input,"change",e);a.bind(this.__input,"blur",function(){k.__onFinishChange&&k.__onFinishChange.call(k,k.getValue())});a.bind(this.__input,"keydown",function(a){13===a.keyCode&&this.blur()});this.updateDisplay();this.domElement.appendChild(this.__input)};d.superclass=e;b.extend(d.prototype, 62 | e.prototype,{updateDisplay:function(){a.isActive(this.__input)||(this.__input.value=this.getValue());return d.superclass.prototype.updateDisplay.call(this)}});return d}(dat.controllers.Controller,dat.dom.dom,dat.utils.common),dat.controllers.FunctionController,dat.controllers.BooleanController,dat.utils.common),dat.controllers.Controller,dat.controllers.BooleanController,dat.controllers.FunctionController,dat.controllers.NumberControllerBox,dat.controllers.NumberControllerSlider,dat.controllers.OptionController, 63 | dat.controllers.ColorController=function(e,a,b,d,f){function c(a,b,d,c){a.style.background="";f.each(l,function(e){a.style.cssText+="background: "+e+"linear-gradient("+b+", "+d+" 0%, "+c+" 100%); "})}function p(a){a.style.background="";a.style.cssText+="background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);";a.style.cssText+="background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);"; 64 | a.style.cssText+="background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);";a.style.cssText+="background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);";a.style.cssText+="background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);"}var k=function(e,n){function r(b){t(b);a.bind(window,"mousemove",t);a.bind(window, 65 | "mouseup",l)}function l(){a.unbind(window,"mousemove",t);a.unbind(window,"mouseup",l)}function g(){var a=d(this.value);!1!==a?(s.__color.__state=a,s.setValue(s.__color.toOriginal())):this.value=s.__color.toString()}function h(){a.unbind(window,"mousemove",u);a.unbind(window,"mouseup",h)}function t(b){b.preventDefault();var d=a.getWidth(s.__saturation_field),c=a.getOffset(s.__saturation_field),e=(b.clientX-c.left+document.body.scrollLeft)/d;b=1-(b.clientY-c.top+document.body.scrollTop)/d;1 66 | b&&(b=0);1e&&(e=0);s.__color.v=b;s.__color.s=e;s.setValue(s.__color.toOriginal());return!1}function u(b){b.preventDefault();var d=a.getHeight(s.__hue_field),c=a.getOffset(s.__hue_field);b=1-(b.clientY-c.top+document.body.scrollTop)/d;1b&&(b=0);s.__color.h=360*b;s.setValue(s.__color.toOriginal());return!1}k.superclass.call(this,e,n);this.__color=new b(this.getValue());this.__temp=new b(0);var s=this;this.domElement=document.createElement("div");a.makeSelectable(this.domElement,!1); 67 | this.__selector=document.createElement("div");this.__selector.className="selector";this.__saturation_field=document.createElement("div");this.__saturation_field.className="saturation-field";this.__field_knob=document.createElement("div");this.__field_knob.className="field-knob";this.__field_knob_border="2px solid ";this.__hue_knob=document.createElement("div");this.__hue_knob.className="hue-knob";this.__hue_field=document.createElement("div");this.__hue_field.className="hue-field";this.__input=document.createElement("input"); 68 | this.__input.type="text";this.__input_textShadow="0 1px 1px ";a.bind(this.__input,"keydown",function(a){13===a.keyCode&&g.call(this)});a.bind(this.__input,"blur",g);a.bind(this.__selector,"mousedown",function(b){a.addClass(this,"drag").bind(window,"mouseup",function(b){a.removeClass(s.__selector,"drag")})});var v=document.createElement("div");f.extend(this.__selector.style,{width:"122px",height:"102px",padding:"3px",backgroundColor:"#222",boxShadow:"0px 1px 3px rgba(0,0,0,0.3)"});f.extend(this.__field_knob.style, 69 | {position:"absolute",width:"12px",height:"12px",border:this.__field_knob_border+(0.5>this.__color.v?"#fff":"#000"),boxShadow:"0px 1px 3px rgba(0,0,0,0.5)",borderRadius:"12px",zIndex:1});f.extend(this.__hue_knob.style,{position:"absolute",width:"15px",height:"2px",borderRight:"4px solid #fff",zIndex:1});f.extend(this.__saturation_field.style,{width:"100px",height:"100px",border:"1px solid #555",marginRight:"3px",display:"inline-block",cursor:"pointer"});f.extend(v.style,{width:"100%",height:"100%", 70 | background:"none"});c(v,"top","rgba(0,0,0,0)","#000");f.extend(this.__hue_field.style,{width:"15px",height:"100px",display:"inline-block",border:"1px solid #555",cursor:"ns-resize"});p(this.__hue_field);f.extend(this.__input.style,{outline:"none",textAlign:"center",color:"#fff",border:0,fontWeight:"bold",textShadow:this.__input_textShadow+"rgba(0,0,0,0.7)"});a.bind(this.__saturation_field,"mousedown",r);a.bind(this.__field_knob,"mousedown",r);a.bind(this.__hue_field,"mousedown",function(b){u(b);a.bind(window, 71 | "mousemove",u);a.bind(window,"mouseup",h)});this.__saturation_field.appendChild(v);this.__selector.appendChild(this.__field_knob);this.__selector.appendChild(this.__saturation_field);this.__selector.appendChild(this.__hue_field);this.__hue_field.appendChild(this.__hue_knob);this.domElement.appendChild(this.__input);this.domElement.appendChild(this.__selector);this.updateDisplay()};k.superclass=e;f.extend(k.prototype,e.prototype,{updateDisplay:function(){var a=d(this.getValue());if(!1!==a){var e=!1; 72 | f.each(b.COMPONENTS,function(b){if(!f.isUndefined(a[b])&&!f.isUndefined(this.__color.__state[b])&&a[b]!==this.__color.__state[b])return e=!0,{}},this);e&&f.extend(this.__color.__state,a)}f.extend(this.__temp.__state,this.__color.__state);this.__temp.a=1;var k=0.5>this.__color.v||0.5a&&(a+=1);return{h:360*a,s:e/c,v:c/255}},rgb_to_hex:function(a,b,d){a=this.hex_with_component(0,2,a);a=this.hex_with_component(a,1,b);return a=this.hex_with_component(a,0,d)},component_from_hex:function(a,b){return a>>8*b&255},hex_with_component:function(a,b,d){return d<<(e=8*b)|a&~(255<f.length)return Math.max.apply(Math,f);if(!h&&a.isEmpty(f))return-Infinity;var d={computed:-Infinity,value:-Infinity};b(f,function(a,f,b){f=h?h.call(E,a,f,b):a;f>d.computed&&(d={value:a,computed:f})});return d.value};a.min= 7 | function(f,h,E){if(!h&&a.isArray(f)&&f[0]===+f[0]&&65535>f.length)return Math.min.apply(Math,f);if(!h&&a.isEmpty(f))return Infinity;var d={computed:Infinity,value:Infinity};b(f,function(a,f,b){f=h?h.call(E,a,f,b):a;fb||void 0===h)return 1;if(h>>1;b.call(d,f[l])d?Math.max(0,c+d):d;else return k=a.sortedIndex(f,b),f[k]===b?k:-1;if(x&&f.indexOf===x)return f.indexOf(b,d);for(;k=arguments.length&&(b=a||0,a=0);d=arguments[2]||1;for(var k=Math.max(Math.ceil((b-a)/d),0),c=0,v=Array(k);c=I?(clearTimeout(l),l=null,e=t,v=a.apply(k,c)):l||!1===d.trailing||(l=setTimeout(u,I));return v}};a.debounce=function(a,b,d){var k,c=null;return function(){var v=this,l=arguments,e=d&&!c;clearTimeout(c);c=setTimeout(function(){c=null;d||(k=a.apply(v,l))},b);e&&(k=a.apply(v,l));return k}};a.once=function(a){var b=!1,d;return function(){if(b)return d;b=!0;d=a.apply(this,arguments);a=null;return d}};a.wrap=function(a,b){return function(){var d= 17 | [a];n.apply(d,arguments);return b.apply(this,d)}};a.compose=function(){var a=arguments;return function(){for(var b=arguments,d=a.length-1;0<=d;d--)b=[a[d].apply(this,b)];return b[0]}};a.after=function(a,b){return function(){if(1>--a)return b.apply(this,arguments)}};a.keys=H||function(f){if(f!==Object(f))throw new TypeError("Invalid object");var b=[],d;for(d in f)a.has(f,d)&&b.push(d);return b};a.values=function(f){var b=[],d;for(d in f)a.has(f,d)&&b.push(f[d]);return b};a.pairs=function(f){var b= 18 | [],d;for(d in f)a.has(f,d)&&b.push([d,f[d]]);return b};a.invert=function(f){var b={},d;for(d in f)a.has(f,d)&&(b[f[d]]=d);return b};a.functions=a.methods=function(f){var b=[],d;for(d in f)a.isFunction(f[d])&&b.push(d);return b.sort()};a.extend=function(a){b(c.call(arguments,1),function(b){if(b)for(var d in b)a[d]=b[d]});return a};a.pick=function(a){var d={},k=p.apply(e,c.call(arguments,1));b(k,function(b){b in a&&(d[b]=a[b])});return d};a.omit=function(f){var b={},d=p.apply(e,c.call(arguments,1)), 19 | k;for(k in f)a.contains(d,k)||(b[k]=f[k]);return b};a.defaults=function(a){b(c.call(arguments,1),function(b){if(b)for(var d in b)void 0===a[d]&&(a[d]=b[d])});return a};a.clone=function(f){return a.isObject(f)?a.isArray(f)?f.slice():a.extend({},f):f};a.tap=function(a,b){b(a);return a};var L=function(b,d,k,c){if(b===d)return 0!==b||1/b==1/d;if(null==b||null==d)return b===d;b instanceof a&&(b=b._wrapped);d instanceof a&&(d=d._wrapped);var v=l.call(b);if(v!=l.call(d))return!1;switch(v){case "[object String]":return b== 20 | String(d);case "[object Number]":return b!=+b?d!=+d:0==b?1/b==1/d:b==+d;case "[object Date]":case "[object Boolean]":return+b==+d;case "[object RegExp]":return b.source==d.source&&b.global==d.global&&b.multiline==d.multiline&&b.ignoreCase==d.ignoreCase}if("object"!=typeof b||"object"!=typeof d)return!1;for(var e=k.length;e--;)if(k[e]==b)return c[e]==d;var e=b.constructor,u=d.constructor;if(e!==u&&!(a.isFunction(e)&&e instanceof e&&a.isFunction(u)&&u instanceof u))return!1;k.push(b);c.push(d);e=0; 21 | u=!0;if("[object Array]"==v){if(e=b.length,u=e==d.length)for(;e--&&(u=L(b[e],d[e],k,c)););}else{for(var t in b)if(a.has(b,t)&&(e++,!(u=a.has(d,t)&&L(b[t],d[t],k,c))))break;if(u){for(t in d)if(a.has(d,t)&&!e--)break;u=!e}}k.pop();c.pop();return u};a.isEqual=function(a,b){return L(a,b,[],[])};a.isEmpty=function(b){if(null==b)return!0;if(a.isArray(b)||a.isString(b))return 0===b.length;for(var d in b)if(a.has(b,d))return!1;return!0};a.isElement=function(a){return!(!a||1!==a.nodeType)};a.isArray=m||function(a){return"[object Array]"== 22 | l.call(a)};a.isObject=function(a){return a===Object(a)};b("Arguments Function String Number Date RegExp".split(" "),function(b){a["is"+b]=function(a){return l.call(a)=="[object "+b+"]"}});a.isArguments(arguments)||(a.isArguments=function(b){return!(!b||!a.has(b,"callee"))});"function"!==typeof/./&&(a.isFunction=function(a){return"function"===typeof a});a.isFinite=function(a){return isFinite(a)&&!isNaN(parseFloat(a))};a.isNaN=function(b){return a.isNumber(b)&&b!=+b};a.isBoolean=function(a){return!0=== 23 | a||!1===a||"[object Boolean]"==l.call(a)};a.isNull=function(a){return null===a};a.isUndefined=function(a){return void 0===a};a.has=function(a,b){return D.call(a,b)};a.noConflict=function(){C._=r;return this};a.identity=function(a){return a};a.times=function(a,b,d){for(var k=Array(Math.max(0,a)),c=0;c":">",'"':""","'":"'","/":"/"}}; 24 | J.unescape=a.invert(J.escape);var O={escape:RegExp("["+a.keys(J.escape).join("")+"]","g"),unescape:RegExp("("+a.keys(J.unescape).join("|")+")","g")};a.each(["escape","unescape"],function(b){a[b]=function(a){return null==a?"":(""+a).replace(O[b],function(a){return J[b][a]})}});a.result=function(b,d){if(null!=b){var k=b[d];return a.isFunction(k)?k.call(b):k}};a.mixin=function(d){b(a.functions(d),function(b){var k=a[b]=d[b];a.prototype[b]=function(){var b=[this._wrapped];n.apply(b,arguments);b=k.apply(a, 25 | b);return this._chain?a(b).chain():b}})};var M=0;a.uniqueId=function(a){var b=++M+"";return a?a+b:b};a.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var t=/(.)^/,I={"'":"'","\\":"\\","\r":"r","\n":"n","\t":"t","\u2028":"u2028","\u2029":"u2029"},T=/\\|'|\r|\n|\t|\u2028|\u2029/g;a.template=function(b,d,k){var c;k=a.defaults({},k,a.templateSettings);var v=RegExp([(k.escape||t).source,(k.interpolate||t).source,(k.evaluate||t).source].join("|")+ 26 | "|$","g"),l=0,e="__p+='";b.replace(v,function(a,d,k,c,v){e+=b.slice(l,v).replace(T,function(a){return"\\"+I[a]});d&&(e+="'+\n((__t=("+d+"))==null?'':_.escape(__t))+\n'");k&&(e+="'+\n((__t=("+k+"))==null?'':__t)+\n'");c&&(e+="';\n"+c+"\n__p+='");l=v+a.length;return a});e+="';\n";k.variable||(e="with(obj||{}){\n"+e+"}\n");e="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+e+"return __p;\n";try{c=new Function(k.variable||"obj","_",e)}catch(u){throw u.source= 27 | e,u;}if(d)return c(d,a);d=function(b){return c.call(this,b,a)};d.source="function("+(k.variable||"obj")+"){\n"+e+"}";return d};a.chain=function(b){return a(b).chain()};a.mixin(a);b("pop push reverse shift sort splice unshift".split(" "),function(b){var d=e[b];a.prototype[b]=function(){var k=this._wrapped;d.apply(k,arguments);"shift"!=b&&"splice"!=b||0!==k.length||delete k[0];return this._chain?a(k).chain():k}});b(["concat","join","slice"],function(b){var d=e[b];a.prototype[b]=function(){var b=d.apply(this._wrapped, 28 | arguments);return this._chain?a(b).chain():b}});a.extend(a.prototype,{chain:function(){this._chain=!0;return this},value:function(){return this._wrapped}})}).call(this);var Backbone=Backbone||{}; 29 | (function(){var C=[].slice,r=function(e,m,g){var c;e=-1;var p=m.length;switch(g.length){case 0:for(;++e=p?l=!0:(t=b.x,m=b.y,m=new d.Anchor(t,m,void 0,void 0,void 0,void 0,d.Commands.close));break;case "m":case "l":t=parseFloat(c[0]);m=parseFloat(c[1]);m=new d.Anchor(t,m,void 0,void 0,void 0,void 0,"m"===q?d.Commands.move:d.Commands.line); 42 | e&&m.addSelf(b);b=m;break;case "h":case "v":t="h"===q?"x":"y";I="x"===t?"y":"x";m=new d.Anchor(void 0,void 0,void 0,void 0,void 0,void 0,d.Commands.line);m[t]=parseFloat(c[0]);m[I]=b[I];e&&(m[t]+=b[t]);b=m;break;case "s":case "c":m=b.x;I=b.y;k||(k=(new d.Vector).copy(b));"c"===q?(f=parseFloat(c[0]),t=parseFloat(c[1]),q=parseFloat(c[2]),h=parseFloat(c[3]),w=parseFloat(c[4]),n=parseFloat(c[5])):(h=d.Utils.getReflection(b,k,e),f=h.x,t=h.y,q=parseFloat(c[0]),h=parseFloat(c[1]),w=parseFloat(c[2]),n=parseFloat(c[3])); 43 | e&&(f+=m,t+=I,q+=m,h+=I,w+=m,n+=I);_.isObject(b.controls)||d.Anchor.AppendCurveProperties(b);b.controls.right.set(f-b.x,t-b.y);b=m=new d.Anchor(w,n,q-w,h-n,void 0,void 0,d.Commands.curve);k=m.controls.left;break;case "t":case "q":m=b.x;I=b.y;k||(k=(new d.Vector).copy(b));k.isZero()?(f=m,t=I):(f=k.x,I=k.y);"q"===q?(q=parseFloat(c[0]),h=parseFloat(c[1]),w=parseFloat(c[1]),n=parseFloat(c[2])):(h=d.Utils.getReflection(b,k,e),q=h.x,h=h.y,w=parseFloat(c[0]),n=parseFloat(c[1]));e&&(f+=m,t+=I,q+=m,h+=I,w+= 44 | m,n+=I);_.isObject(b.controls)||d.Anchor.AppendCurveProperties(b);b.controls.right.set(f-b.x,t-b.y);b=m=new d.Anchor(w,n,q-w,h-n,void 0,void 0,d.Commands.curve);k=m.controls.left;break;case "a":throw new d.Utils.Error("not yet able to interpret Elliptical Arcs.");}return m}));if(!(1>=g.length))return g=_.compact(g),g=(new d.Polygon(g,l,void 0,!0)).noStroke(),g.fill="black",d.Utils.applySvgAttributes(a,g)},circle:function(a){var b=parseFloat(a.getAttribute("cx")),c=parseFloat(a.getAttribute("cy")), 45 | v=parseFloat(a.getAttribute("r")),g=d.Resolution,u=_.map(_.range(g),function(a){var b=a/g*l;a=v*m(b);b=v*e(b);return new d.Anchor(a,b)},this),u=(new d.Polygon(u,!0,!0)).noStroke();u.translation.set(b,c);u.fill="black";return d.Utils.applySvgAttributes(a,u)},ellipse:function(a){var b=parseFloat(a.getAttribute("cx")),c=parseFloat(a.getAttribute("cy")),v=parseFloat(a.getAttribute("rx")),g=parseFloat(a.getAttribute("ry")),u=d.Resolution,p=_.map(_.range(u),function(a){var b=a/u*l;a=v*m(b);b=g*e(b);return new d.Anchor(a, 46 | b)},this),p=(new d.Polygon(p,!0,!0)).noStroke();p.translation.set(b,c);p.fill="black";return d.Utils.applySvgAttributes(a,p)},rect:function(a){var b=parseFloat(a.getAttribute("x")),c=parseFloat(a.getAttribute("y")),e=parseFloat(a.getAttribute("width")),l=parseFloat(a.getAttribute("height")),e=e/2,l=l/2,g=[new d.Anchor(e,l),new d.Anchor(-e,l),new d.Anchor(-e,-l),new d.Anchor(e,-l)],g=(new d.Polygon(g,!0)).noStroke();g.translation.set(b+e,c+l);g.fill="black";return d.Utils.applySvgAttributes(a,g)}, 47 | line:function(a){var b=parseFloat(a.getAttribute("x1")),c=parseFloat(a.getAttribute("y1")),e=parseFloat(a.getAttribute("x2")),l=parseFloat(a.getAttribute("y2")),e=(e-b)/2,l=(l-c)/2,g=[new d.Anchor(-e,-l),new d.Anchor(e,l)],g=(new d.Polygon(g)).noFill();g.translation.set(b+e,c+l);return d.Utils.applySvgAttributes(a,g)}},subdivide:function(a,b,c,e,l,g,m,p,q){q=q||d.Utils.Curve.RecursionLimit;var w=q+1;return _.map(_.range(0,w),function(q){var t=q/w;q=G(t,a,c,l,m);t=G(t,b,e,g,p);return new d.Anchor(q, 48 | t)})},getPointOnCubicBezier:function(a,b,d,c,e){var l=1-a;return l*l*l*b+3*l*l*a*d+3*l*a*a*c+a*a*a*e},getCurveFromPoints:function(a,b){for(var c=a.length,e=c-1,l=0;la||1E-4>c)return b._relative||(b.controls.left.copy(b),b.controls.right.copy(b)),b;a*=0.33;c*=0.33;q=ga;)a+=b;return a%b},Collection:function(){Array.call(this);1this.distanceTo(c)},lerp:function(c,e){C=(c.x-this.x)*e+this.x;r=(c.y-this.y)*e+this.y;return this.set(C,r)},isZero:function(){return 1E-4>this.length()},toString:function(){return this.x+","+this.y},toObject:function(){return{x:this.x,y:this.y}}});var n={set:function(c, 62 | e){this._x=c;this._y=e;return this.trigger(Two.Events.change)},copy:function(c){this._x=c.x;this._y=c.y;return this.trigger(Two.Events.change)},clear:function(){this._y=this._x=0;return this.trigger(Two.Events.change)},clone:function(){return new m(this._x,this._y)},add:function(c,e){this._x=c.x+e.x;this._y=c.y+e.y;return this.trigger(Two.Events.change)},addSelf:function(c){this._x+=c.x;this._y+=c.y;return this.trigger(Two.Events.change)},sub:function(c,e){this._x=c.x-e.x;this._y=c.y-e.y;return this.trigger(Two.Events.change)}, 63 | subSelf:function(c){this._x-=c.x;this._y-=c.y;return this.trigger(Two.Events.change)},multiplySelf:function(c){this._x*=c.x;this._y*=c.y;return this.trigger(Two.Events.change)},multiplyScalar:function(c){this._x*=c;this._y*=c;return this.trigger(Two.Events.change)},divideScalar:function(c){return c?(this._x/=c,this._y/=c,this.trigger(Two.Events.change)):this.clear()},negate:function(){return this.multiplyScalar(-1)},dot:function(c){return this._x*c.x+this._y*c.y},lengthSquared:function(){return this._x* 64 | this._x+this._y*this._y},length:function(){return Math.sqrt(this.lengthSquared())},normalize:function(){return this.divideScalar(this.length())},distanceTo:function(c){return Math.sqrt(this.distanceToSquared(c))},distanceToSquared:function(c){g=this._x-c.x;e=this._y-c.y;return g*g+e*e},setLength:function(c){return this.normalize().multiplyScalar(c)},equals:function(c){return 1E-4>this.distanceTo(c)},lerp:function(c,e){C=(c.x-this._x)*e+this._x;r=(c.y-this._y)*e+this._y;return this.set(C,r)},isZero:function(){return 1E-4> 65 | this.length()},toString:function(){return this._x+","+this._y},toObject:function(){return{x:this._x,y:this._y}}},c={get:function(){return this._x},set:function(c){this._x=c;this.trigger(Two.Events.change,"x")}},p={get:function(){return this._y},set:function(c){this._y=c;this.trigger(Two.Events.change,"y")}};Two.Vector.prototype.bind=Two.Vector.prototype.on=function(){this._bound||(this._x=this.x,this._y=this.y,Object.defineProperty(this,"x",c),Object.defineProperty(this,"y",p),_.extend(this,n),this._bound= 66 | !0);Backbone.Events.bind.apply(this,arguments);return this}})();(function(){var C=Two.Commands,r,g,e,m=Two.Anchor=function(c,e,g,n,r,s,y){Two.Vector.call(this,c,e);this._broadcast=_.bind(function(){this.trigger(Two.Events.change)},this);this._command=y||C.move;this._relative=!0;if(!y)return this;m.AppendCurveProperties(this);_.isNumber(g)&&(this.controls.left.x=g);_.isNumber(n)&&(this.controls.left.y=n);_.isNumber(r)&&(this.controls.right.x=r);_.isNumber(s)&&(this.controls.right.y=s)};_.extend(m,{AppendCurveProperties:function(c){c.controls={left:new Two.Vector(0, 67 | 0),right:new Two.Vector(0,0)}}});var n={listen:function(){_.isObject(this.controls)||m.AppendCurveProperties(this);_.each(this.controls,function(c){c.bind(Two.Events.change,this._broadcast)},this);return this},ignore:function(){_.each(this.controls,function(c){c.unbind(Two.Events.change,this._broadcast)},this);return this},clone:function(){g=this.controls;e=new Two.Anchor(this.x,this.y,g&&g.left.x,g&&g.left.y,g&&g.right.x,g&&g.right.y,this.command);e.relative=this._relative;return e},toObject:function(){r= 68 | {x:this.x,y:this.y};this._command&&(r.command=this._command);this._relative&&(r.relative=this._relative);this.controls&&(r.controls={left:this.controls.left.toObject(),right:this.controls.right.toObject()});return r}};Object.defineProperty(m.prototype,"command",{get:function(){return this._command},set:function(c){this._command=c;this._command!==C.curve||_.isObject(this.controls)||m.AppendCurveProperties(this);return this.trigger(Two.Events.change)}});Object.defineProperty(m.prototype,"relative", 69 | {get:function(){return this._relative},set:function(c){if(this._relative==c)return this;this._relative=!!c;return this.trigger(Two.Events.change)}});_.extend(m.prototype,Two.Vector.prototype,n);Two.Anchor.prototype.bind=Two.Anchor.prototype.on=function(){Two.Vector.prototype.bind.apply(this,arguments);_.extend(this,n)};Two.Anchor.prototype.unbind=Two.Anchor.prototype.off=function(){Two.Vector.prototype.unbind.apply(this,arguments);_.extend(this,n)}})();(function(){_.range(6);var C=Math.cos,r=Math.sin,g=Math.tan,e,m,n,c,p,l,D,F,s,y,d,z,q,w,x,B,H,G,a,b,k,v,K,u,A,L,J,O,M,t,I,T,f,h,E,ea,P,Q,aa,da,U,V,W,X,Y,ba,ca,Z,R,$=[],fa=Two.Matrix=function(a,b,d,c,f,e){this.elements=new Two.Array(9);var g=a;_.isArray(g)||(g=_.toArray(arguments));this.identity().set(g)};_.extend(fa,{Identity:[1,0,0,0,1,0,0,0,1],Multiply:function(d,c,f){if(3>=c.length)return z,q,w,e=c[0]||0,m=c[1]||0,n=c[2]||0,p=d,z=p[0]*e+p[1]*m+p[2]*n,q=p[3]*e+p[4]*m+p[5]*n,w=p[6]*e+p[7]*m+p[8]* 70 | n,{x:z,y:q,z:w};x=d[0];B=d[1];H=d[2];G=d[3];a=d[4];b=d[5];k=d[6];v=d[7];K=d[8];u=c[0];A=c[1];L=c[2];J=c[3];O=c[4];M=c[5];t=c[6];I=c[7];T=c[8];f=f||new Two.Array(9);f[0]=x*u+B*J+H*t;f[1]=x*A+B*O+H*I;f[2]=x*L+B*M+H*T;f[3]=G*u+a*J+b*t;f[4]=G*A+a*O+b*I;f[5]=G*L+a*M+b*T;f[6]=k*u+v*J+K*t;f[7]=k*A+v*O+K*I;f[8]=k*L+v*M+K*T;return f}});_.extend(fa.prototype,Backbone.Events,{set:function(a,b,c,f,e,g){d=a;E=arguments.length;_.isArray(d)||(d=_.toArray(arguments));_.each(d,function(a,b){_.isNumber(a)&&(this.elements[b]= 71 | a)},this);return this.trigger(Two.Events.change)},identity:function(){this.set(fa.Identity);return this},multiply:function(c,e,g,m,l,p,n,s,ma){d=arguments;E=d.length;if(1>=E)return _.each(this.elements,function(a,b){this.elements[b]=a*c},this),this.trigger(Two.Events.change);if(3>=E)return z,q,w,c=c||0,e=e||0,g=g||0,l=this.elements,z=l[0]*c+l[1]*e+l[2]*g,q=l[3]*c+l[4]*e+l[5]*g,w=l[6]*c+l[7]*e+l[8]*g,{x:z,y:q,z:w};f=this.elements;h=d;x=f[0];B=f[1];H=f[2];G=f[3];a=f[4];b=f[5];k=f[6];v=f[7];K=f[8];u= 72 | h[0];A=h[1];L=h[2];J=h[3];O=h[4];M=h[5];t=h[6];I=h[7];T=h[8];this.elements[0]=x*u+B*J+H*t;this.elements[1]=x*A+B*O+H*I;this.elements[2]=x*L+B*M+H*T;this.elements[3]=G*u+a*J+b*t;this.elements[4]=G*A+a*O+b*I;this.elements[5]=G*L+a*M+b*T;this.elements[6]=k*u+v*J+K*t;this.elements[7]=k*A+v*O+K*I;this.elements[8]=k*L+v*M+K*T;return this.trigger(Two.Events.change)},inverse:function(a){e=this.elements;a=a||new Two.Matrix;P=e[0];Q=e[1];aa=e[2];da=e[3];U=e[4];V=e[5];W=e[6];X=e[7];Y=e[8];ba=Y*U-V*X;ca=-Y*da+ 73 | V*W;Z=X*da-U*W;R=P*ba+Q*ca+aa*Z;if(!R)return null;R=1/R;a.elements[0]=ba*R;a.elements[1]=(-Y*Q+aa*X)*R;a.elements[2]=(V*Q-aa*U)*R;a.elements[3]=ca*R;a.elements[4]=(Y*P-aa*W)*R;a.elements[5]=(-V*P+aa*da)*R;a.elements[6]=Z*R;a.elements[7]=(-X*P+Q*W)*R;a.elements[8]=(U*P-Q*da)*R;return a},scale:function(a,b){E=arguments.length;1>=E&&(b=a);return this.multiply(a,0,0,0,b,0,0,0,1)},rotate:function(a){n=C(a);ea=r(a);return this.multiply(n,-ea,0,ea,n,0,0,0,1)},translate:function(a,b){return this.multiply(1, 74 | 0,a,0,1,b,0,0,1)},skewX:function(a){e=g(a);return this.multiply(1,e,0,0,1,0,0,0,1)},skewY:function(a){e=g(a);return this.multiply(1,0,0,e,1,0,0,0,1)},toString:function(a){this.toArray(a,$);return $.join(" ")},toArray:function(a,b){d=this.elements;y=!!b;e=parseFloat(d[0].toFixed(3));m=parseFloat(d[1].toFixed(3));n=parseFloat(d[2].toFixed(3));c=parseFloat(d[3].toFixed(3));p=parseFloat(d[4].toFixed(3));l=parseFloat(d[5].toFixed(3));if(a){D=parseFloat(d[6].toFixed(3));F=parseFloat(d[7].toFixed(3));s= 75 | parseFloat(d[8].toFixed(3));if(y){b[0]=e;b[1]=c;b[2]=D;b[3]=m;b[4]=p;b[5]=F;b[6]=n;b[7]=l;b[8]=s;return}return[e,c,D,m,p,F,n,l,s]}if(y)b[0]=e,b[1]=c,b[2]=m,b[3]=p,b[4]=n,b[5]=l;else return[e,c,m,p,n,l]},clone:function(){e=this.elements[0];m=this.elements[1];n=this.elements[2];c=this.elements[3];p=this.elements[4];l=this.elements[5];D=this.elements[6];F=this.elements[7];s=this.elements[8];return new Two.Matrix(e,m,n,c,p,l,D,F,s)}})})();(function(){var C=Two.Utils.mod,r,g,e,m={version:1.1,ns:"http://www.w3.org/2000/svg",xlink:"http://www.w3.org/1999/xlink",createElement:function(c,p){e=c;g=document.createElementNS(this.ns,e);"svg"===e&&(p=_.defaults(p||{},{version:this.version}));_.isObject(p)&&m.setAttributes(g,p);return g},setAttribute:function(c,e){this.setAttribute(e,c)},setAttributes:function(c,e){_.each(e,m.setAttribute,c);return this},removeAttribute:function(c,e){this.removeAttribute(e)},removeAttributes:function(c,e){_.each(e, 76 | m.removeAttribute,c);return this},toString:function(c,e){var g=c.length,m=g-1,n;return _.map(c,function(s,r){var d,z=e?C(r-1,g):Math.max(r-1,0),q=e?C(r+1,g):Math.min(r+1,m);d=c[z];var w=c[q],x,B,H,z=s.x.toFixed(3),w=s.y.toFixed(3);switch(s._command){case Two.Commands.close:d=Two.Commands.close;break;case Two.Commands.curve:x=d.controls&&d.controls.right||d;H=s.controls&&s.controls.left||s;d._relative?(q=(x.x+d.x).toFixed(3),x=(x.y+d.y).toFixed(3)):(q=x.x.toFixed(3),x=x.y.toFixed(3));s._relative?(B= 77 | (H.x+s.x).toFixed(3),H=(H.y+s.y).toFixed(3)):(B=H.x.toFixed(3),H=H.y.toFixed(3));d=(0===r?Two.Commands.move:Two.Commands.curve)+" "+q+" "+x+" "+B+" "+H+" "+z+" "+w;break;case Two.Commands.move:n=s;d=Two.Commands.move+" "+z+" "+w;break;default:d=s._command+" "+z+" "+w}r>=m&&e&&(s._command===Two.Commands.curve&&(w=n,x=s.controls&&s.controls.right||s,z=w.controls&&w.controls.left||w,s._relative?(q=(x.x+s.x).toFixed(3),x=(x.y+s.y).toFixed(3)):(q=x.x.toFixed(3),x=x.y.toFixed(3)),w._relative?(B=(z.x+w.x).toFixed(3), 78 | H=(z.y+w.y).toFixed(3)):(B=z.x.toFixed(3),H=z.y.toFixed(3)),z=w.x.toFixed(3),w=w.y.toFixed(3),d+=" C "+q+" "+x+" "+B+" "+H+" "+z+" "+w),d+=" Z");return d}).join(" ")},group:{appendChild:function(c){(g=this.domElement.querySelector("#"+Two.Identifier+c))&&this.elem.appendChild(g)},removeChild:function(c){(g=this.domElement.querySelector("#"+Two.Identifier+c))&&this.elem.removeChild(g)},renderChild:function(c){m[c._renderer.type].render.call(c,this)},render:function(c){this._update();this._renderer.elem|| 79 | (this._renderer.elem=m.createElement("g",{id:Two.Identifier+this.id}),c.appendChild(this._renderer.elem));r=this._matrix.manual||this._flagMatrix;var e={domElement:c,elem:this._renderer.elem};r&&this._renderer.elem.setAttribute("transform","matrix("+this._matrix.toString()+")");_.each(this.children,m.group.renderChild,c);this._flagAdditions&&_.each(this.additions,m.group.appendChild,e);this._flagSubtractions&&_.each(this.subtractions,m.group.removeChild,e);return this.flagReset()}},polygon:{render:function(c){this._update(); 80 | this._renderer.elem||(this._renderer.elem=m.createElement("path",{id:Two.Identifier+this.id}),c.appendChild(this._renderer.elem));g=this._renderer.elem;(r=this._matrix.manual||this._flagMatrix)&&g.setAttribute("transform","matrix("+this._matrix.toString()+")");this._flagVertices&&(vertices=m.toString(this._vertices,this._closed),g.setAttribute("d",vertices));this._flagFill&&g.setAttribute("fill",this._fill);this._flagStroke&&g.setAttribute("stroke",this._stroke);this._flagLinewidth&&g.setAttribute("stroke-width", 81 | this._linewidth);this._flagOpacity&&(g.setAttribute("stroke-opacity",this._opacity),g.setAttribute("fill-opacity",this._opacity));this._flagVisible&&g.setAttribute("visibility",this._visible?"visible":"hidden");this._flagCap&&g.setAttribute("stroke-linecap",this._cap);this._flagJoin&&g.setAttribute("stroke-linejoin",this._join);this._flagMiter&&g.setAttribute("stroke-miterlimit",this.miter);return this.flagReset()}}},n=Two[Two.Types.svg]=function(c){this.domElement=c.domElement||m.createElement("svg"); 82 | this.scene=new Two.Group;this.scene.parent=this};_.extend(n,{Utils:m});_.extend(n.prototype,Backbone.Events,{setSize:function(c,e){this.width=c;this.height=e;m.setAttributes(this.domElement,{width:c,height:e});return this},render:function(){m.group.render.call(this.scene,this.domElement);return this}})})();(function(){var C=Two.Utils.mod,r=Two.Utils.getRatio,g,e,m,n,c,p,l,D,F,s,y,d,z,q,w,x,B,H,G,a,b,k,v,K,u,A,L,J,O={group:{renderChild:function(a){O[a._renderer.type].render.call(a,this)},render:function(a){this._update();g=this._matrix.elements;a.save();a.transform(g[0],g[3],g[1],g[4],g[2],g[5]);_.each(this.children,O.group.renderChild,a);a.restore();return this.flagReset()}},polygon:{render:function(t){this._update();g=this._matrix.elements;e=this.stroke;m=this.linewidth;n=this.fill;c=this.opacity; 83 | p=this.visible;l=this.cap;D=this.join;F=this.miter;s=this.closed;y=this._vertices;d=y.length;z=d-1;if(!p)return this;t.save();g&&t.transform(g[0],g[3],g[1],g[4],g[2],g[5]);n&&(t.fillStyle=n);e&&(t.strokeStyle=e);m&&(t.lineWidth=m);F&&(t.miterLimit=F);D&&(t.lineJoin=D);l&&(t.lineCap=l);_.isNumber(c)&&(t.globalAlpha=c);t.beginPath();_.each(y,function(c,e){L=c.x.toFixed(3);J=c.y.toFixed(3);switch(c._command){case Two.Commands.close:t.closePath();break;case Two.Commands.curve:w=s?C(e-1,d):Math.max(e- 84 | 1,0);q=s?C(e+1,d):Math.min(e+1,z);x=y[w];B=y[q];v=x.controls&&x.controls.right||x;K=c.controls&&c.controls.left||c;x._relative?(b=(v.x+x.x).toFixed(3),k=(v.y+x.y).toFixed(3)):(b=v.x.toFixed(3),k=v.y.toFixed(3));c._relative?(G=(K.x+c.x).toFixed(3),a=(K.y+c.y).toFixed(3)):(G=K.x.toFixed(3),a=K.y.toFixed(3));t.bezierCurveTo(b,k,G,a,L,J);e>=z&&s&&(B=H,u=c.controls&&c.controls.right||c,A=B.controls&&B.controls.left||B,c._relative?(b=(u.x+c.x).toFixed(3),k=(u.y+c.y).toFixed(3)):(b=u.x.toFixed(3),k=u.y.toFixed(3)), 85 | B._relative?(G=(A.x+B.x).toFixed(3),a=(A.y+B.y).toFixed(3)):(G=A.x.toFixed(3),a=A.y.toFixed(3)),L=B.x.toFixed(3),J=B.y.toFixed(3),t.bezierCurveTo(b,k,G,a,L,J));break;case Two.Commands.line:t.lineTo(L,J);break;case Two.Commands.move:H=c,t.moveTo(L,J)}});s&&t.closePath();t.fill();t.stroke();t.restore();return this.flagReset()}}},M=Two[Two.Types.canvas]=function(a){this.domElement=a.domElement||document.createElement("canvas");this.ctx=this.domElement.getContext("2d");this.overdraw=a.overdraw||!1;this.scene= 86 | new Two.Group;this.scene.parent=this};_.extend(M,{Utils:O});_.extend(M.prototype,Backbone.Events,{setSize:function(a,b,c){this.width=a;this.height=b;this.ratio=_.isUndefined(c)?r(this.ctx):c;this.domElement.width=a*this.ratio;this.domElement.height=b*this.ratio;_.extend(this.domElement.style,{width:a+"px",height:b+"px"});return this},render:function(){var a=1===this.ratio;a||(this.ctx.save(),this.ctx.scale(this.ratio,this.ratio));this.overdraw||this.ctx.clearRect(0,0,this.width,this.height);O.group.render.call(this.scene, 87 | this.ctx);a||this.ctx.restore();return this}})})();(function(){var C=Two.Matrix.Multiply,r=Two.Utils.mod,g=[1,0,0,0,1,0,0,0,1],e=new Two.Array(9),m=Two.Utils.getRatio,n,c,p,l,D,F,s,y,d,z,q,w,x,B,H,G,a,b,k,v,K,u,A,L,J,O,M,t,I,T,f,h,E,ea,P,Q,aa,da,U,V,W,X,Y,ba,ca,Z,R,$,fa,ga,N,ia,ja,ka,ha,S={canvas:document.createElement("canvas"),uv:new Two.Array([0,0,1,0,0,1,0,1,1,0,1,1]),group:{renderChild:function(a){S[a._renderer.type].render.call(a,this.gl,this.program)},render:function(a,b){this._update();n=this.parent;c=n._matrix&&n._matrix.manual||n._flagMatrix; 88 | p=this._matrix.manual||this._flagMatrix;if(c||p)this._renderer.matrix||(this._renderer.matrix=new Two.Array(9)),this._matrix.toArray(!0,e),C(e,n._renderer.matrix,this._renderer.matrix),this._renderer.scale=this._scale*n._renderer.scale,c&&(this._flagMatrix=!0);_.each(this.children,S.group.renderChild,{gl:a,program:b});return this.flagReset()}},polygon:{render:function(a,b){if(!this._visible||!this._opacity)return this;n=this.parent;c=n._matrix.manual||n._flagMatrix;p=this._matrix.manual||this._flagMatrix; 89 | l=this._flagVertices||this._flagFill||this._flagStroke||this._flagLinewidth||this._flagOpacity||this._flagVisible||this._flagCap||this._flagJoin||this._flagMiter||this._flagScale;this._update();if(c||p)this._renderer.matrix||(this._renderer.matrix=new Two.Array(9)),this._matrix.toArray(!0,e),C(e,n._renderer.matrix,this._renderer.matrix),this._renderer.scale=this._scale*n._renderer.scale;l&&(this._renderer.rect||(this._renderer.rect={}),this._renderer.triangles||(this._renderer.triangles=new Two.Array(12)), 90 | S.getBoundingClientRect(this._vertices,this._linewidth,this._renderer.rect),S.getTriangles(this._renderer.rect,this._renderer.triangles),S.updateBuffer(a,this,b),S.updateTexture(a,this));a.bindBuffer(a.ARRAY_BUFFER,this._renderer.textureCoordsBuffer);a.vertexAttribPointer(b.textureCoords,2,a.FLOAT,!1,0,0);a.bindTexture(a.TEXTURE_2D,this._renderer.texture);a.uniformMatrix3fv(b.matrix,!1,this._renderer.matrix);a.bindBuffer(a.ARRAY_BUFFER,this._renderer.buffer);a.vertexAttribPointer(b.position,2,a.FLOAT, 91 | !1,0,0);a.drawArrays(a.TRIANGLES,0,6);return this.flagReset()}},getBoundingClientRect:function(c,e,f){D=Infinity;F=-Infinity;s=Infinity;y=-Infinity;_.each(c,function(b,c){d=b.x;z=b.y;q;w;x;B;H=b.controls;s=Math.min(z,s);D=Math.min(d,D);F=Math.max(d,F);y=Math.max(z,y);b.controls&&(G=H.left,a=H.right,G&&a&&(q=b._relative?G.x+d:G.x,w=b._relative?G.y+z:G.y,x=b._relative?a.x+d:a.x,B=b._relative?a.y+z:a.y,q&&(w&&x&&B)&&(s=Math.min(w,B,s),D=Math.min(q,x,D),F=Math.max(q,x,F),y=Math.max(w,B,y))))});_.isNumber(e)&& 92 | (s-=e,D-=e,F+=e,y+=e);b=F-D;k=y-s;f.top=s;f.left=D;f.right=F;f.bottom=y;f.width=b;f.height=k;f.centroid||(f.centroid={});f.centroid.x=-D;f.centroid.y=-s},getTriangles:function(a,b){s=a.top;D=a.left;F=a.right;y=a.bottom;b[0]=D;b[1]=s;b[2]=F;b[3]=s;b[4]=D;b[5]=y;b[6]=D;b[7]=y;b[8]=F;b[9]=s;b[10]=F;b[11]=y},updateCanvas:function(a){v=a._vertices;K=this.canvas;u=this.ctx;A=a._renderer.scale;L=a._stroke;J=a._linewidth*A;O=a._fill;M=a._opacity;t=a._cap;I=a._join;T=a._miter;f=a._closed;h=v.length;E=h-1; 93 | K.width=Math.max(Math.ceil(a._renderer.rect.width*A),1);K.height=Math.max(Math.ceil(a._renderer.rect.height*A),1);ea=a._renderer.rect.centroid;P=ea.x*A;Q=ea.y*A;u.clearRect(0,0,K.width,K.height);O&&(u.fillStyle=O);L&&(u.strokeStyle=L);J&&(u.lineWidth=J);T&&(u.miterLimit=T);I&&(u.lineJoin=I);t&&(u.lineCap=t);_.isNumber(M)&&(u.globalAlpha=M);u.beginPath();_.each(v,function(a,b){aa;da;q;x;U;V;W;X;Y;ba;ca;G;d=(a.x*A+P).toFixed(3);z=(a.y*A+Q).toFixed(3);switch(a._command){case Two.Commands.close:u.closePath(); 94 | break;case Two.Commands.curve:da=f?r(b-1,h):Math.max(b-1,0);aa=f?r(b+1,h):Math.min(b+1,E);q=v[da];x=v[aa];Y=q.controls&&q.controls.right||q;ba=a.controls&&a.controls.left||a;q._relative?(W=((Y.x+q.x)*A+P).toFixed(3),X=((Y.y+q.y)*A+Q).toFixed(3)):(W=(Y.x*A+P).toFixed(3),X=(Y.y*A+Q).toFixed(3));a._relative?(U=((ba.x+a.x)*A+P).toFixed(3),V=((ba.y+a.y)*A+Q).toFixed(3)):(U=(ba.x*A+P).toFixed(3),V=(ba.y*A+Q).toFixed(3));u.bezierCurveTo(W,X,U,V,d,z);b>=E&&f&&(x=B,ca=a.controls&&a.controls.right||a,G=x.controls&& 95 | x.controls.left||x,a._relative?(W=((ca.x+a.x)*A+P).toFixed(3),X=((ca.y+a.y)*A+Q).toFixed(3)):(W=(ca.x*A+P).toFixed(3),X=(ca.y*A+Q).toFixed(3)),x._relative?(U=((G.x+x.x)*A+P).toFixed(3),V=((G.y+x.y)*A+P).toFixed(3)):(U=(G.x*A+P).toFixed(3),V=(G.y*A+Q).toFixed(3)),d=(x.x*A+P).toFixed(3),z=(x.y*A+Q).toFixed(3),u.bezierCurveTo(W,X,U,V,d,z));break;case Two.Commands.line:u.lineTo(d,z);break;case Two.Commands.move:B=a,u.moveTo(d,z)}});f&&u.closePath();u.fill();u.stroke()},updateTexture:function(a,b){this.updateCanvas(b); 96 | b._renderer.texture&&a.deleteTexture(b._renderer.texture);a.bindBuffer(a.ARRAY_BUFFER,b._renderer.textureCoordsBuffer);b._renderer.texture=a.createTexture();a.bindTexture(a.TEXTURE_2D,b._renderer.texture);a.texParameteri(a.TEXTURE_2D,a.TEXTURE_WRAP_S,a.CLAMP_TO_EDGE);a.texParameteri(a.TEXTURE_2D,a.TEXTURE_WRAP_T,a.CLAMP_TO_EDGE);a.texParameteri(a.TEXTURE_2D,a.TEXTURE_MIN_FILTER,a.LINEAR);0>=this.canvas.width||0>=this.canvas.height||a.texImage2D(a.TEXTURE_2D,0,a.RGBA,a.RGBA,a.UNSIGNED_BYTE,this.canvas)}, 97 | updateBuffer:function(a,b,c){_.isObject(b._renderer.buffer)&&a.deleteBuffer(b._renderer.buffer);b._renderer.buffer=a.createBuffer();a.bindBuffer(a.ARRAY_BUFFER,b._renderer.buffer);a.enableVertexAttribArray(c.position);a.bufferData(a.ARRAY_BUFFER,b._renderer.triangles,a.STATIC_DRAW);_.isObject(b._renderer.textureCoordsBuffer)&&a.deleteBuffer(b._renderer.textureCoordsBuffer);b._renderer.textureCoordsBuffer=a.createBuffer();a.bindBuffer(a.ARRAY_BUFFER,b._renderer.textureCoordsBuffer);a.enableVertexAttribArray(c.textureCoords); 98 | a.bufferData(a.ARRAY_BUFFER,this.uv,a.STATIC_DRAW)},program:{create:function(a,b){Z=a.createProgram();_.each(b,function(b){a.attachShader(Z,b)});a.linkProgram(Z);R=a.getProgramParameter(Z,a.LINK_STATUS);if(!R)throw ga=a.getProgramInfoLog(Z),a.deleteProgram(Z),new Two.Utils.Error("unable to link program: "+ga);return Z}},shaders:{create:function(a,b,c){$=a.createShader(a[c]);a.shaderSource($,b);a.compileShader($);fa=a.getShaderParameter($,a.COMPILE_STATUS);if(!fa)throw ga=a.getShaderInfoLog($),a.deleteShader($), 99 | new Two.Utils.Error("unable to compile shader "+$+": "+ga);return $},types:{vertex:"VERTEX_SHADER",fragment:"FRAGMENT_SHADER"},vertex:"attribute vec2 a_position;\nattribute vec2 a_textureCoords;\n\nuniform mat3 u_matrix;\nuniform vec2 u_resolution;\n\nvarying vec2 v_textureCoords;\n\nvoid main() {\n vec2 projected = (u_matrix * vec3(a_position, 1.0)).xy;\n vec2 normal = projected / u_resolution;\n vec2 clipspace = (normal * 2.0) - 1.0;\n\n gl_Position = vec4(clipspace * vec2(1.0, -1.0), 0.0, 1.0);\n v_textureCoords = a_textureCoords;\n}", 100 | fragment:"precision mediump float;\n\nuniform sampler2D u_image;\nvarying vec2 v_textureCoords;\n\nvoid main() {\n gl_FragColor = texture2D(u_image, v_textureCoords);\n}"}};S.ctx=S.canvas.getContext("2d");var la=Two[Two.Types.webgl]=function(a){this.domElement=a.domElement||document.createElement("canvas");this.scene=new Two.Group;this.scene.parent=this;this._renderer={matrix:new Two.Array(g),scale:1};this._flagMatrix=!0;ha=_.defaults(a||{},{antialias:!1,alpha:!0,premultipliedAlpha:!0,stencil:!0, 101 | preserveDrawingBuffer:!0,overdraw:!1});this.overdraw=ha.overdraw;N=this.ctx=this.domElement.getContext("webgl",ha)||this.domElement.getContext("experimental-webgl",ha);if(!this.ctx)throw new Two.Utils.Error("unable to create a webgl context. Try using another renderer.");ka=S.shaders.create(N,S.shaders.vertex,S.shaders.types.vertex);ja=S.shaders.create(N,S.shaders.fragment,S.shaders.types.fragment);this.program=S.program.create(N,[ka,ja]);N.useProgram(this.program);this.program.position=N.getAttribLocation(this.program, 102 | "a_position");this.program.matrix=N.getUniformLocation(this.program,"u_matrix");this.program.textureCoords=N.getAttribLocation(this.program,"a_textureCoords");N.disable(N.DEPTH_TEST);N.enable(N.BLEND);N.blendEquationSeparate(N.FUNC_ADD,N.FUNC_ADD);N.blendFuncSeparate(N.SRC_ALPHA,N.ONE_MINUS_SRC_ALPHA,N.ONE,N.ONE_MINUS_SRC_ALPHA)};_.extend(la.prototype,Backbone.Events,{setSize:function(a,b,c){this.width=a;this.height=b;this.ratio=_.isUndefined(c)?m(this.ctx):c;this.domElement.width=a*this.ratio;this.domElement.height= 103 | b*this.ratio;_.extend(this.domElement.style,{width:a+"px",height:b+"px"});a*=this.ratio;b*=this.ratio;this._renderer.matrix[0]=this._renderer.matrix[4]=this._renderer.scale=this.ratio;this._flagMatrix=!0;this.ctx.viewport(0,0,a,b);ia=this.ctx.getUniformLocation(this.program,"u_resolution");this.ctx.uniform2f(ia,a,b);return this},render:function(){N=this.ctx;this.overdraw||N.clear(N.COLOR_BUFFER_BIT|N.DEPTH_BUFFER_BIT);S.group.render.call(this.scene,N,this.program);this._flagMatrix=!1;return this}})})();(function(){var C,r=Two.Shape=function(g){this._renderer={};this.id=Two.uniqueId();this._matrix=new Two.Matrix;this.translation=new Two.Vector;this.translation.bind(Two.Events.change,_.bind(r.FlagMatrix,this));this.rotation=0;this.scale=1};_.extend(r,Backbone.Events,{FlagMatrix:function(){this._flagMatrix=!0},MakeObservable:function(g){Object.defineProperty(g,"rotation",{get:function(){return this._rotation},set:function(e){this._rotation=e;this._flagMatrix=!0}});Object.defineProperty(g,"scale",{get:function(){return this._scale}, 104 | set:function(e){this._scale=e;this._flagScale=this._flagMatrix=!0}})}});_.extend(r.prototype,{_flagMatrix:!0,_rotation:0,_scale:1,addTo:function(g){g.add(this);return this},clone:function(){C=new r;C.translation.copy(this.translation);C.rotation=this.rotation;C.scale=this.scale;_.each(r.Properties,function(g){C[g]=this[g]},this);return C._update()},_update:function(){!this._matrix.manual&&this._flagMatrix&&this._matrix.identity().translate(this.translation.x,this.translation.y).scale(this.scale).rotate(this.rotation); 105 | this.parent&&_.isFunction(this.parent._update)&&this.parent._update();return this},flagReset:function(){this._flagScale=this._flagMatrix=!1;return this}});r.MakeObservable(r.prototype)})();(function(){var C=Math.min,r=Math.max,g=Math.round,e=Two.Utils.getComputedMatrix,m,n,c,p,l,D,F,s,y,d,z,q,w,x,B,H,G,a,b,k,v,K,u,A,L,J,O,M=Two.Polygon=function(a,b,c,d){Two.Shape.call(this);this._renderer.type="polygon";this._closed=!!b;this._curved=!!c;this.beginning=0;this.ending=1;this.fill="#fff";this.stroke="#000";this.opacity=this.linewidth=1;this.visible=!0;this.cap="butt";this.join="miter";this.miter=4;this._vertices=[];this.vertices=a;this.automatic=!d};_.extend(M,{Properties:"fill stroke linewidth opacity visible cap join miter closed curved automatic beginning ending".split(" "), 106 | FlagVertices:function(){this._flagVertices=!0},MakeObservable:function(a){Two.Shape.MakeObservable(a);_.each(M.Properties.slice(0,8),function(b){var c="_"+b,d="_flag"+b.charAt(0).toUpperCase()+b.slice(1);Object.defineProperty(a,b,{get:function(){return this[c]},set:function(a){this[c]=a;this[d]=!0}})});Object.defineProperty(a,"closed",{get:function(){return this._closed},set:function(a){this._closed=!!a;this._flagVertices=!0}});Object.defineProperty(a,"curved",{get:function(){return this._curved}, 107 | set:function(a){this._curved=!!a;this._flagVertices=!0}});Object.defineProperty(M.prototype,"automatic",{get:function(){return this._automatic},set:function(a){a!==this._automatic&&(method=(this._automatic=!!a)?"ignore":"listen",_.each(this.vertices,function(a){a[method]()}))}});Object.defineProperty(a,"beginning",{get:function(){return this._beginning},set:function(a){this._beginning=C(r(a,0),this._ending);this._flagVertices=!0}});Object.defineProperty(a,"ending",{get:function(){return this._ending}, 108 | set:function(a){this._ending=C(r(a,this._beginning),1);this._flagVertices=!0}});Object.defineProperty(a,"vertices",{get:function(){return this._collection},set:function(a){var b=_.bind(M.FlagVertices,this),c=_.bind(function(a){_.each(a,function(a){a.bind(Two.Events.change,b)},this);b()},this),d=_.bind(function(a){_.each(a,function(a){a.unbind(Two.Events.change,b)},this);b()},this);this._collection&&this._collection.unbind();this._collection=new Two.Utils.Collection(a.slice(0));this._collection.bind(Two.Events.insert, 109 | c);this._collection.bind(Two.Events.remove,d);verticesChanged=!0;c(this._collection)}})}});_.extend(M.prototype,Two.Shape.prototype,{_flagVertices:!0,_flagFill:!0,_flagStroke:!0,_flagLinewidth:!0,_flagOpacity:!0,_flagVisible:!0,_flagCap:!0,_flagJoin:!0,_flagMiter:!0,_fill:"#fff",_stroke:"#000",_linewidth:1,_opacity:1,_visible:!0,_cap:"round",_join:"round",_miter:4,_closed:!0,_curved:!1,_automatic:!0,_beginning:0,_ending:1,clone:function(a){a=a||this.parent;s=_.map(this.vertices,function(a){return a.clone()}); 110 | y=new M(s,this.closed,this.curved,!this.automatic);_.each(Two.Shape.Properties,function(a){y[a]=this[a]},this);y.translation.copy(this.translation);y.rotation=this.rotation;y.scale=this.scale;a.add(y);return y},toObject:function(){var a={vertices:_.map(this.vertices,function(a){return a.toObject()})};_.each(Two.Shape.Properties,function(b){a[b]=this[b]},this);a.translation=this.translation.toObject;a.rotation=this.rotation;a.scale=this.scale;return a},noFill:function(){this.fill="transparent";return this}, 111 | noStroke:function(){this.stroke="transparent";return this},corner:function(){d=this.getBoundingClientRect(!0);d.centroid={x:d.left+d.width/2,y:d.top+d.height/2};_.each(this.vertices,function(a){a.addSelf(d.centroid)});return this},center:function(){d=this.getBoundingClientRect(!0);d.centroid={x:d.left+d.width/2,y:d.top+d.height/2};_.each(this.vertices,function(a){a.subSelf(d.centroid)});return this},remove:function(){if(!this.parent)return this;this.parent.remove(this);return this},getBoundingClientRect:function(a){this._update(); 112 | b=a?this._matrix:e(this);z=this.linewidth/2;void 0;q=Infinity;w=-Infinity;x=Infinity;B=-Infinity;_.each(this._vertices,function(a){H=a.x;G=a.y;a=b.multiply(H,G,1);x=C(a.y-z,x);q=C(a.x-z,q);w=r(a.x+z,w);B=r(a.y+z,B)});return{top:x,left:q,right:w,bottom:B,width:w-q,height:B-x}},plot:function(){if(this.curved)return Two.Utils.getCurveFromPoints(this._vertices,this.closed),this;_.each(this._vertices,function(a,b){a._command=0===b?Two.Commands.move:Two.Commands.line},this);return this},subdivide:function(b){this._update(); 113 | p=this.vertices.length-1;a=this.vertices[p];l=this._closed||this.vertices[p]._command===Two.Commands.close;s=[];_.each(this.vertices,function(c,d){if(!(0>=d)||l)if(c.command===Two.Commands.move)s.push(new Two.Anchor(a.x,a.y)),0=c&&a.command===Two.Commands.move?Two.Commands.move:Two.Commands.line});d>=p&&(s.push(new Two.Anchor(J,O)),s[s.length-1].command=l?Two.Commands.close:Two.Commands.line)}a=c},this);this._curved=this._automatic=!1;this.vertices=s;return this},_update:function(){if(this._flagVertices){m=this.vertices.length;p=m-1;n=g(this._beginning*p);c=g(this._ending*p);this._vertices.length=0;for(F=n;F=l&&F)return F.remove(this),this;_.isArray(c)||(D=_.toArray(arguments));_.each(D,function(c){y=c.id;grandchildren= 119 | c.children;e=c.parent;y in m&&(delete m[y],delete c.parent,d=_.indexOf(e.additions,y),0<=d&&e.additions.splice(d,1),s.push(y),this._flagSubtractions=!0)},this);return this},getBoundingClientRect:function(d){this._update();var e=Infinity,g=-Infinity,l=Infinity,m=-Infinity;_.each(this.children,function(d){c=d.getBoundingClientRect();_.isNumber(c.top)&&(_.isNumber(c.left)&&_.isNumber(c.right)&&_.isNumber(c.bottom))&&(l=C(c.top,l),e=C(c.left,e),g=r(c.right,g),m=r(c.bottom,m))},this);return{top:l,left:e, 120 | right:g,bottom:m,width:g-e,height:m-l}},noFill:function(){_.each(this.children,function(c){c.noFill()});return this},noStroke:function(){_.each(this.children,function(c){c.noStroke()});return this},subdivide:function(){var c=arguments;_.each(this.children,function(d){d.subdivide.apply(d,c)});return this},flagReset:function(){this._flagAdditions&&(this.additions.length=0,this._flagAdditions=!1);this._flagSubtractions&&(this.subtractions.length=0,this._flagSubtractions=!1);Two.Shape.prototype.flagReset.call(this); 121 | return this}});z.MakeObservable(z.prototype)})(); 122 | --------------------------------------------------------------------------------