Skip to content

Instantly share code, notes, and snippets.

@klokan
Last active February 14, 2017 06:59
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save klokan/9ba0fd74e9c77db4c3540cf2b1c95dba to your computer and use it in GitHub Desktop.
Save klokan/9ba0fd74e9c77db4c3540cf2b1c95dba to your computer and use it in GitHub Desktop.
/*!
* domready (c) Dustin Diaz 2012 - License MIT
*/
!function (name, context, definition) {
if (typeof module != 'undefined') module.exports = definition()
else if (typeof define == 'function' && typeof define.amd == 'object') define(definition)
else context[name] = definition()
}('domready', this, function (ready) {
var fns = [], fn, f = false
, doc = document
, testEl = doc.documentElement
, hack = testEl.doScroll
, domContentLoaded = 'DOMContentLoaded'
, addEventListener = 'addEventListener'
, onreadystatechange = 'onreadystatechange'
, readyState = 'readyState'
, loaded = /^loade|c/.test(doc[readyState])
function flush(f) {
loaded = 1
while (f = fns.shift()) f()
}
doc[addEventListener] && doc[addEventListener](domContentLoaded, fn = function () {
doc.removeEventListener(domContentLoaded, fn, f)
flush()
}, f)
hack && doc.attachEvent(onreadystatechange, fn = function () {
if (/^c/.test(doc[readyState])) {
doc.detachEvent(onreadystatechange, fn)
flush()
}
})
return (ready = hack ?
function (fn) {
self != top ?
loaded ? fn() : fns.push(fn) :
function () {
try {
testEl.doScroll('left')
} catch (e) {
return setTimeout(function() { ready(fn) }, 50)
}
fn()
}()
} :
function (fn) {
loaded ? fn() : fns.push(fn)
})
})
/**
* @fileoverview gl-matrix - High performance matrix and vector operations
* @author Brandon Jones
* @author Colin MacKenzie IV
* @version 2.2.0
*/
/* Copyright (c) 2013, Brandon Jones, Colin MacKenzie IV. All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
(function(e){"use strict";var t={};typeof exports=="undefined"?typeof define=="function"&&typeof define.amd=="object"&&define.amd?(t.exports={},define(function(){return t.exports})):t.exports=typeof window!="undefined"?window:e:t.exports=exports,function(e){if(!t)var t=1e-6;if(!n)var n=typeof Float32Array!="undefined"?Float32Array:Array;if(!r)var r=Math.random;var i={};i.setMatrixArrayType=function(e){n=e},typeof e!="undefined"&&(e.glMatrix=i);var s={};s.create=function(){var e=new n(2);return e[0]=0,e[1]=0,e},s.clone=function(e){var t=new n(2);return t[0]=e[0],t[1]=e[1],t},s.fromValues=function(e,t){var r=new n(2);return r[0]=e,r[1]=t,r},s.copy=function(e,t){return e[0]=t[0],e[1]=t[1],e},s.set=function(e,t,n){return e[0]=t,e[1]=n,e},s.add=function(e,t,n){return e[0]=t[0]+n[0],e[1]=t[1]+n[1],e},s.subtract=function(e,t,n){return e[0]=t[0]-n[0],e[1]=t[1]-n[1],e},s.sub=s.subtract,s.multiply=function(e,t,n){return e[0]=t[0]*n[0],e[1]=t[1]*n[1],e},s.mul=s.multiply,s.divide=function(e,t,n){return e[0]=t[0]/n[0],e[1]=t[1]/n[1],e},s.div=s.divide,s.min=function(e,t,n){return e[0]=Math.min(t[0],n[0]),e[1]=Math.min(t[1],n[1]),e},s.max=function(e,t,n){return e[0]=Math.max(t[0],n[0]),e[1]=Math.max(t[1],n[1]),e},s.scale=function(e,t,n){return e[0]=t[0]*n,e[1]=t[1]*n,e},s.scaleAndAdd=function(e,t,n,r){return e[0]=t[0]+n[0]*r,e[1]=t[1]+n[1]*r,e},s.distance=function(e,t){var n=t[0]-e[0],r=t[1]-e[1];return Math.sqrt(n*n+r*r)},s.dist=s.distance,s.squaredDistance=function(e,t){var n=t[0]-e[0],r=t[1]-e[1];return n*n+r*r},s.sqrDist=s.squaredDistance,s.length=function(e){var t=e[0],n=e[1];return Math.sqrt(t*t+n*n)},s.len=s.length,s.squaredLength=function(e){var t=e[0],n=e[1];return t*t+n*n},s.sqrLen=s.squaredLength,s.negate=function(e,t){return e[0]=-t[0],e[1]=-t[1],e},s.normalize=function(e,t){var n=t[0],r=t[1],i=n*n+r*r;return i>0&&(i=1/Math.sqrt(i),e[0]=t[0]*i,e[1]=t[1]*i),e},s.dot=function(e,t){return e[0]*t[0]+e[1]*t[1]},s.cross=function(e,t,n){var r=t[0]*n[1]-t[1]*n[0];return e[0]=e[1]=0,e[2]=r,e},s.lerp=function(e,t,n,r){var i=t[0],s=t[1];return e[0]=i+r*(n[0]-i),e[1]=s+r*(n[1]-s),e},s.random=function(e,t){t=t||1;var n=r()*2*Math.PI;return e[0]=Math.cos(n)*t,e[1]=Math.sin(n)*t,e},s.transformMat2=function(e,t,n){var r=t[0],i=t[1];return e[0]=n[0]*r+n[2]*i,e[1]=n[1]*r+n[3]*i,e},s.transformMat2d=function(e,t,n){var r=t[0],i=t[1];return e[0]=n[0]*r+n[2]*i+n[4],e[1]=n[1]*r+n[3]*i+n[5],e},s.transformMat3=function(e,t,n){var r=t[0],i=t[1];return e[0]=n[0]*r+n[3]*i+n[6],e[1]=n[1]*r+n[4]*i+n[7],e},s.transformMat4=function(e,t,n){var r=t[0],i=t[1];return e[0]=n[0]*r+n[4]*i+n[12],e[1]=n[1]*r+n[5]*i+n[13],e},s.forEach=function(){var e=s.create();return function(t,n,r,i,s,o){var u,a;n||(n=2),r||(r=0),i?a=Math.min(i*n+r,t.length):a=t.length;for(u=r;u<a;u+=n)e[0]=t[u],e[1]=t[u+1],s(e,e,o),t[u]=e[0],t[u+1]=e[1];return t}}(),s.str=function(e){return"vec2("+e[0]+", "+e[1]+")"},typeof e!="undefined"&&(e.vec2=s);var o={};o.create=function(){var e=new n(3);return e[0]=0,e[1]=0,e[2]=0,e},o.clone=function(e){var t=new n(3);return t[0]=e[0],t[1]=e[1],t[2]=e[2],t},o.fromValues=function(e,t,r){var i=new n(3);return i[0]=e,i[1]=t,i[2]=r,i},o.copy=function(e,t){return e[0]=t[0],e[1]=t[1],e[2]=t[2],e},o.set=function(e,t,n,r){return e[0]=t,e[1]=n,e[2]=r,e},o.add=function(e,t,n){return e[0]=t[0]+n[0],e[1]=t[1]+n[1],e[2]=t[2]+n[2],e},o.subtract=function(e,t,n){return e[0]=t[0]-n[0],e[1]=t[1]-n[1],e[2]=t[2]-n[2],e},o.sub=o.subtract,o.multiply=function(e,t,n){return e[0]=t[0]*n[0],e[1]=t[1]*n[1],e[2]=t[2]*n[2],e},o.mul=o.multiply,o.divide=function(e,t,n){return e[0]=t[0]/n[0],e[1]=t[1]/n[1],e[2]=t[2]/n[2],e},o.div=o.divide,o.min=function(e,t,n){return e[0]=Math.min(t[0],n[0]),e[1]=Math.min(t[1],n[1]),e[2]=Math.min(t[2],n[2]),e},o.max=function(e,t,n){return e[0]=Math.max(t[0],n[0]),e[1]=Math.max(t[1],n[1]),e[2]=Math.max(t[2],n[2]),e},o.scale=function(e,t,n){return e[0]=t[0]*n,e[1]=t[1]*n,e[2]=t[2]*n,e},o.scaleAndAdd=function(e,t,n,r){return e[0]=t[0]+n[0]*r,e[1]=t[1]+n[1]*r,e[2]=t[2]+n[2]*r,e},o.distance=function(e,t){var n=t[0]-e[0],r=t[1]-e[1],i=t[2]-e[2];return Math.sqrt(n*n+r*r+i*i)},o.dist=o.distance,o.squaredDistance=function(e,t){var n=t[0]-e[0],r=t[1]-e[1],i=t[2]-e[2];return n*n+r*r+i*i},o.sqrDist=o.squaredDistance,o.length=function(e){var t=e[0],n=e[1],r=e[2];return Math.sqrt(t*t+n*n+r*r)},o.len=o.length,o.squaredLength=function(e){var t=e[0],n=e[1],r=e[2];return t*t+n*n+r*r},o.sqrLen=o.squaredLength,o.negate=function(e,t){return e[0]=-t[0],e[1]=-t[1],e[2]=-t[2],e},o.normalize=function(e,t){var n=t[0],r=t[1],i=t[2],s=n*n+r*r+i*i;return s>0&&(s=1/Math.sqrt(s),e[0]=t[0]*s,e[1]=t[1]*s,e[2]=t[2]*s),e},o.dot=function(e,t){return e[0]*t[0]+e[1]*t[1]+e[2]*t[2]},o.cross=function(e,t,n){var r=t[0],i=t[1],s=t[2],o=n[0],u=n[1],a=n[2];return e[0]=i*a-s*u,e[1]=s*o-r*a,e[2]=r*u-i*o,e},o.lerp=function(e,t,n,r){var i=t[0],s=t[1],o=t[2];return e[0]=i+r*(n[0]-i),e[1]=s+r*(n[1]-s),e[2]=o+r*(n[2]-o),e},o.random=function(e,t){t=t||1;var n=r()*2*Math.PI,i=r()*2-1,s=Math.sqrt(1-i*i)*t;return e[0]=Math.cos(n)*s,e[1]=Math.sin(n)*s,e[2]=i*t,e},o.transformMat4=function(e,t,n){var r=t[0],i=t[1],s=t[2];return e[0]=n[0]*r+n[4]*i+n[8]*s+n[12],e[1]=n[1]*r+n[5]*i+n[9]*s+n[13],e[2]=n[2]*r+n[6]*i+n[10]*s+n[14],e},o.transformMat3=function(e,t,n){var r=t[0],i=t[1],s=t[2];return e[0]=r*n[0]+i*n[3]+s*n[6],e[1]=r*n[1]+i*n[4]+s*n[7],e[2]=r*n[2]+i*n[5]+s*n[8],e},o.transformQuat=function(e,t,n){var r=t[0],i=t[1],s=t[2],o=n[0],u=n[1],a=n[2],f=n[3],l=f*r+u*s-a*i,c=f*i+a*r-o*s,h=f*s+o*i-u*r,p=-o*r-u*i-a*s;return e[0]=l*f+p*-o+c*-a-h*-u,e[1]=c*f+p*-u+h*-o-l*-a,e[2]=h*f+p*-a+l*-u-c*-o,e},o.forEach=function(){var e=o.create();return function(t,n,r,i,s,o){var u,a;n||(n=3),r||(r=0),i?a=Math.min(i*n+r,t.length):a=t.length;for(u=r;u<a;u+=n)e[0]=t[u],e[1]=t[u+1],e[2]=t[u+2],s(e,e,o),t[u]=e[0],t[u+1]=e[1],t[u+2]=e[2];return t}}(),o.str=function(e){return"vec3("+e[0]+", "+e[1]+", "+e[2]+")"},typeof e!="undefined"&&(e.vec3=o);var u={};u.create=function(){var e=new n(4);return e[0]=0,e[1]=0,e[2]=0,e[3]=0,e},u.clone=function(e){var t=new n(4);return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t},u.fromValues=function(e,t,r,i){var s=new n(4);return s[0]=e,s[1]=t,s[2]=r,s[3]=i,s},u.copy=function(e,t){return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e},u.set=function(e,t,n,r,i){return e[0]=t,e[1]=n,e[2]=r,e[3]=i,e},u.add=function(e,t,n){return e[0]=t[0]+n[0],e[1]=t[1]+n[1],e[2]=t[2]+n[2],e[3]=t[3]+n[3],e},u.subtract=function(e,t,n){return e[0]=t[0]-n[0],e[1]=t[1]-n[1],e[2]=t[2]-n[2],e[3]=t[3]-n[3],e},u.sub=u.subtract,u.multiply=function(e,t,n){return e[0]=t[0]*n[0],e[1]=t[1]*n[1],e[2]=t[2]*n[2],e[3]=t[3]*n[3],e},u.mul=u.multiply,u.divide=function(e,t,n){return e[0]=t[0]/n[0],e[1]=t[1]/n[1],e[2]=t[2]/n[2],e[3]=t[3]/n[3],e},u.div=u.divide,u.min=function(e,t,n){return e[0]=Math.min(t[0],n[0]),e[1]=Math.min(t[1],n[1]),e[2]=Math.min(t[2],n[2]),e[3]=Math.min(t[3],n[3]),e},u.max=function(e,t,n){return e[0]=Math.max(t[0],n[0]),e[1]=Math.max(t[1],n[1]),e[2]=Math.max(t[2],n[2]),e[3]=Math.max(t[3],n[3]),e},u.scale=function(e,t,n){return e[0]=t[0]*n,e[1]=t[1]*n,e[2]=t[2]*n,e[3]=t[3]*n,e},u.scaleAndAdd=function(e,t,n,r){return e[0]=t[0]+n[0]*r,e[1]=t[1]+n[1]*r,e[2]=t[2]+n[2]*r,e[3]=t[3]+n[3]*r,e},u.distance=function(e,t){var n=t[0]-e[0],r=t[1]-e[1],i=t[2]-e[2],s=t[3]-e[3];return Math.sqrt(n*n+r*r+i*i+s*s)},u.dist=u.distance,u.squaredDistance=function(e,t){var n=t[0]-e[0],r=t[1]-e[1],i=t[2]-e[2],s=t[3]-e[3];return n*n+r*r+i*i+s*s},u.sqrDist=u.squaredDistance,u.length=function(e){var t=e[0],n=e[1],r=e[2],i=e[3];return Math.sqrt(t*t+n*n+r*r+i*i)},u.len=u.length,u.squaredLength=function(e){var t=e[0],n=e[1],r=e[2],i=e[3];return t*t+n*n+r*r+i*i},u.sqrLen=u.squaredLength,u.negate=function(e,t){return e[0]=-t[0],e[1]=-t[1],e[2]=-t[2],e[3]=-t[3],e},u.normalize=function(e,t){var n=t[0],r=t[1],i=t[2],s=t[3],o=n*n+r*r+i*i+s*s;return o>0&&(o=1/Math.sqrt(o),e[0]=t[0]*o,e[1]=t[1]*o,e[2]=t[2]*o,e[3]=t[3]*o),e},u.dot=function(e,t){return e[0]*t[0]+e[1]*t[1]+e[2]*t[2]+e[3]*t[3]},u.lerp=function(e,t,n,r){var i=t[0],s=t[1],o=t[2],u=t[3];return e[0]=i+r*(n[0]-i),e[1]=s+r*(n[1]-s),e[2]=o+r*(n[2]-o),e[3]=u+r*(n[3]-u),e},u.random=function(e,t){return t=t||1,e[0]=r(),e[1]=r(),e[2]=r(),e[3]=r(),u.normalize(e,e),u.scale(e,e,t),e},u.transformMat4=function(e,t,n){var r=t[0],i=t[1],s=t[2],o=t[3];return e[0]=n[0]*r+n[4]*i+n[8]*s+n[12]*o,e[1]=n[1]*r+n[5]*i+n[9]*s+n[13]*o,e[2]=n[2]*r+n[6]*i+n[10]*s+n[14]*o,e[3]=n[3]*r+n[7]*i+n[11]*s+n[15]*o,e},u.transformQuat=function(e,t,n){var r=t[0],i=t[1],s=t[2],o=n[0],u=n[1],a=n[2],f=n[3],l=f*r+u*s-a*i,c=f*i+a*r-o*s,h=f*s+o*i-u*r,p=-o*r-u*i-a*s;return e[0]=l*f+p*-o+c*-a-h*-u,e[1]=c*f+p*-u+h*-o-l*-a,e[2]=h*f+p*-a+l*-u-c*-o,e},u.forEach=function(){var e=u.create();return function(t,n,r,i,s,o){var u,a;n||(n=4),r||(r=0),i?a=Math.min(i*n+r,t.length):a=t.length;for(u=r;u<a;u+=n)e[0]=t[u],e[1]=t[u+1],e[2]=t[u+2],e[3]=t[u+3],s(e,e,o),t[u]=e[0],t[u+1]=e[1],t[u+2]=e[2],t[u+3]=e[3];return t}}(),u.str=function(e){return"vec4("+e[0]+", "+e[1]+", "+e[2]+", "+e[3]+")"},typeof e!="undefined"&&(e.vec4=u);var a={};a.create=function(){var e=new n(4);return e[0]=1,e[1]=0,e[2]=0,e[3]=1,e},a.clone=function(e){var t=new n(4);return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t},a.copy=function(e,t){return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e},a.identity=function(e){return e[0]=1,e[1]=0,e[2]=0,e[3]=1,e},a.transpose=function(e,t){if(e===t){var n=t[1];e[1]=t[2],e[2]=n}else e[0]=t[0],e[1]=t[2],e[2]=t[1],e[3]=t[3];return e},a.invert=function(e,t){var n=t[0],r=t[1],i=t[2],s=t[3],o=n*s-i*r;return o?(o=1/o,e[0]=s*o,e[1]=-r*o,e[2]=-i*o,e[3]=n*o,e):null},a.adjoint=function(e,t){var n=t[0];return e[0]=t[3],e[1]=-t[1],e[2]=-t[2],e[3]=n,e},a.determinant=function(e){return e[0]*e[3]-e[2]*e[1]},a.multiply=function(e,t,n){var r=t[0],i=t[1],s=t[2],o=t[3],u=n[0],a=n[1],f=n[2],l=n[3];return e[0]=r*u+i*f,e[1]=r*a+i*l,e[2]=s*u+o*f,e[3]=s*a+o*l,e},a.mul=a.multiply,a.rotate=function(e,t,n){var r=t[0],i=t[1],s=t[2],o=t[3],u=Math.sin(n),a=Math.cos(n);return e[0]=r*a+i*u,e[1]=r*-u+i*a,e[2]=s*a+o*u,e[3]=s*-u+o*a,e},a.scale=function(e,t,n){var r=t[0],i=t[1],s=t[2],o=t[3],u=n[0],a=n[1];return e[0]=r*u,e[1]=i*a,e[2]=s*u,e[3]=o*a,e},a.str=function(e){return"mat2("+e[0]+", "+e[1]+", "+e[2]+", "+e[3]+")"},typeof e!="undefined"&&(e.mat2=a);var f={};f.create=function(){var e=new n(6);return e[0]=1,e[1]=0,e[2]=0,e[3]=1,e[4]=0,e[5]=0,e},f.clone=function(e){var t=new n(6);return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t},f.copy=function(e,t){return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e},f.identity=function(e){return e[0]=1,e[1]=0,e[2]=0,e[3]=1,e[4]=0,e[5]=0,e},f.invert=function(e,t){var n=t[0],r=t[1],i=t[2],s=t[3],o=t[4],u=t[5],a=n*s-r*i;return a?(a=1/a,e[0]=s*a,e[1]=-r*a,e[2]=-i*a,e[3]=n*a,e[4]=(i*u-s*o)*a,e[5]=(r*o-n*u)*a,e):null},f.determinant=function(e){return e[0]*e[3]-e[1]*e[2]},f.multiply=function(e,t,n){var r=t[0],i=t[1],s=t[2],o=t[3],u=t[4],a=t[5],f=n[0],l=n[1],c=n[2],h=n[3],p=n[4],d=n[5];return e[0]=r*f+i*c,e[1]=r*l+i*h,e[2]=s*f+o*c,e[3]=s*l+o*h,e[4]=f*u+c*a+p,e[5]=l*u+h*a+d,e},f.mul=f.multiply,f.rotate=function(e,t,n){var r=t[0],i=t[1],s=t[2],o=t[3],u=t[4],a=t[5],f=Math.sin(n),l=Math.cos(n);return e[0]=r*l+i*f,e[1]=-r*f+i*l,e[2]=s*l+o*f,e[3]=-s*f+l*o,e[4]=l*u+f*a,e[5]=l*a-f*u,e},f.scale=function(e,t,n){var r=n[0],i=n[1];return e[0]=t[0]*r,e[1]=t[1]*i,e[2]=t[2]*r,e[3]=t[3]*i,e[4]=t[4]*r,e[5]=t[5]*i,e},f.translate=function(e,t,n){return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4]+n[0],e[5]=t[5]+n[1],e},f.str=function(e){return"mat2d("+e[0]+", "+e[1]+", "+e[2]+", "+e[3]+", "+e[4]+", "+e[5]+")"},typeof e!="undefined"&&(e.mat2d=f);var l={};l.create=function(){var e=new n(9);return e[0]=1,e[1]=0,e[2]=0,e[3]=0,e[4]=1,e[5]=0,e[6]=0,e[7]=0,e[8]=1,e},l.fromMat4=function(e,t){return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[4],e[4]=t[5],e[5]=t[6],e[6]=t[8],e[7]=t[9],e[8]=t[10],e},l.clone=function(e){var t=new n(9);return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t[6]=e[6],t[7]=e[7],t[8]=e[8],t},l.copy=function(e,t){return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},l.identity=function(e){return e[0]=1,e[1]=0,e[2]=0,e[3]=0,e[4]=1,e[5]=0,e[6]=0,e[7]=0,e[8]=1,e},l.transpose=function(e,t){if(e===t){var n=t[1],r=t[2],i=t[5];e[1]=t[3],e[2]=t[6],e[3]=n,e[5]=t[7],e[6]=r,e[7]=i}else e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8];return e},l.invert=function(e,t){var n=t[0],r=t[1],i=t[2],s=t[3],o=t[4],u=t[5],a=t[6],f=t[7],l=t[8],c=l*o-u*f,h=-l*s+u*a,p=f*s-o*a,d=n*c+r*h+i*p;return d?(d=1/d,e[0]=c*d,e[1]=(-l*r+i*f)*d,e[2]=(u*r-i*o)*d,e[3]=h*d,e[4]=(l*n-i*a)*d,e[5]=(-u*n+i*s)*d,e[6]=p*d,e[7]=(-f*n+r*a)*d,e[8]=(o*n-r*s)*d,e):null},l.adjoint=function(e,t){var n=t[0],r=t[1],i=t[2],s=t[3],o=t[4],u=t[5],a=t[6],f=t[7],l=t[8];return e[0]=o*l-u*f,e[1]=i*f-r*l,e[2]=r*u-i*o,e[3]=u*a-s*l,e[4]=n*l-i*a,e[5]=i*s-n*u,e[6]=s*f-o*a,e[7]=r*a-n*f,e[8]=n*o-r*s,e},l.determinant=function(e){var t=e[0],n=e[1],r=e[2],i=e[3],s=e[4],o=e[5],u=e[6],a=e[7],f=e[8];return t*(f*s-o*a)+n*(-f*i+o*u)+r*(a*i-s*u)},l.multiply=function(e,t,n){var r=t[0],i=t[1],s=t[2],o=t[3],u=t[4],a=t[5],f=t[6],l=t[7],c=t[8],h=n[0],p=n[1],d=n[2],v=n[3],m=n[4],g=n[5],y=n[6],b=n[7],w=n[8];return e[0]=h*r+p*o+d*f,e[1]=h*i+p*u+d*l,e[2]=h*s+p*a+d*c,e[3]=v*r+m*o+g*f,e[4]=v*i+m*u+g*l,e[5]=v*s+m*a+g*c,e[6]=y*r+b*o+w*f,e[7]=y*i+b*u+w*l,e[8]=y*s+b*a+w*c,e},l.mul=l.multiply,l.translate=function(e,t,n){var r=t[0],i=t[1],s=t[2],o=t[3],u=t[4],a=t[5],f=t[6],l=t[7],c=t[8],h=n[0],p=n[1];return e[0]=r,e[1]=i,e[2]=s,e[3]=o,e[4]=u,e[5]=a,e[6]=h*r+p*o+f,e[7]=h*i+p*u+l,e[8]=h*s+p*a+c,e},l.rotate=function(e,t,n){var r=t[0],i=t[1],s=t[2],o=t[3],u=t[4],a=t[5],f=t[6],l=t[7],c=t[8],h=Math.sin(n),p=Math.cos(n);return e[0]=p*r+h*o,e[1]=p*i+h*u,e[2]=p*s+h*a,e[3]=p*o-h*r,e[4]=p*u-h*i,e[5]=p*a-h*s,e[6]=f,e[7]=l,e[8]=c,e},l.scale=function(e,t,n){var r=n[0],i=n[1];return e[0]=r*t[0],e[1]=r*t[1],e[2]=r*t[2],e[3]=i*t[3],e[4]=i*t[4],e[5]=i*t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},l.fromMat2d=function(e,t){return e[0]=t[0],e[1]=t[1],e[2]=0,e[3]=t[2],e[4]=t[3],e[5]=0,e[6]=t[4],e[7]=t[5],e[8]=1,e},l.fromQuat=function(e,t){var n=t[0],r=t[1],i=t[2],s=t[3],o=n+n,u=r+r,a=i+i,f=n*o,l=n*u,c=n*a,h=r*u,p=r*a,d=i*a,v=s*o,m=s*u,g=s*a;return e[0]=1-(h+d),e[3]=l+g,e[6]=c-m,e[1]=l-g,e[4]=1-(f+d),e[7]=p+v,e[2]=c+m,e[5]=p-v,e[8]=1-(f+h),e},l.normalFromMat4=function(e,t){var n=t[0],r=t[1],i=t[2],s=t[3],o=t[4],u=t[5],a=t[6],f=t[7],l=t[8],c=t[9],h=t[10],p=t[11],d=t[12],v=t[13],m=t[14],g=t[15],y=n*u-r*o,b=n*a-i*o,w=n*f-s*o,E=r*a-i*u,S=r*f-s*u,x=i*f-s*a,T=l*v-c*d,N=l*m-h*d,C=l*g-p*d,k=c*m-h*v,L=c*g-p*v,A=h*g-p*m,O=y*A-b*L+w*k+E*C-S*N+x*T;return O?(O=1/O,e[0]=(u*A-a*L+f*k)*O,e[1]=(a*C-o*A-f*N)*O,e[2]=(o*L-u*C+f*T)*O,e[3]=(i*L-r*A-s*k)*O,e[4]=(n*A-i*C+s*N)*O,e[5]=(r*C-n*L-s*T)*O,e[6]=(v*x-m*S+g*E)*O,e[7]=(m*w-d*x-g*b)*O,e[8]=(d*S-v*w+g*y)*O,e):null},l.str=function(e){return"mat3("+e[0]+", "+e[1]+", "+e[2]+", "+e[3]+", "+e[4]+", "+e[5]+", "+e[6]+", "+e[7]+", "+e[8]+")"},typeof e!="undefined"&&(e.mat3=l);var c={};c.create=function(){var e=new n(16);return e[0]=1,e[1]=0,e[2]=0,e[3]=0,e[4]=0,e[5]=1,e[6]=0,e[7]=0,e[8]=0,e[9]=0,e[10]=1,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,e},c.clone=function(e){var t=new n(16);return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t[6]=e[6],t[7]=e[7],t[8]=e[8],t[9]=e[9],t[10]=e[10],t[11]=e[11],t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15],t},c.copy=function(e,t){return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e[9]=t[9],e[10]=t[10],e[11]=t[11],e[12]=t[12],e[13]=t[13],e[14]=t[14],e[15]=t[15],e},c.identity=function(e){return e[0]=1,e[1]=0,e[2]=0,e[3]=0,e[4]=0,e[5]=1,e[6]=0,e[7]=0,e[8]=0,e[9]=0,e[10]=1,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,e},c.transpose=function(e,t){if(e===t){var n=t[1],r=t[2],i=t[3],s=t[6],o=t[7],u=t[11];e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=n,e[6]=t[9],e[7]=t[13],e[8]=r,e[9]=s,e[11]=t[14],e[12]=i,e[13]=o,e[14]=u}else e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15];return e},c.invert=function(e,t){var n=t[0],r=t[1],i=t[2],s=t[3],o=t[4],u=t[5],a=t[6],f=t[7],l=t[8],c=t[9],h=t[10],p=t[11],d=t[12],v=t[13],m=t[14],g=t[15],y=n*u-r*o,b=n*a-i*o,w=n*f-s*o,E=r*a-i*u,S=r*f-s*u,x=i*f-s*a,T=l*v-c*d,N=l*m-h*d,C=l*g-p*d,k=c*m-h*v,L=c*g-p*v,A=h*g-p*m,O=y*A-b*L+w*k+E*C-S*N+x*T;return O?(O=1/O,e[0]=(u*A-a*L+f*k)*O,e[1]=(i*L-r*A-s*k)*O,e[2]=(v*x-m*S+g*E)*O,e[3]=(h*S-c*x-p*E)*O,e[4]=(a*C-o*A-f*N)*O,e[5]=(n*A-i*C+s*N)*O,e[6]=(m*w-d*x-g*b)*O,e[7]=(l*x-h*w+p*b)*O,e[8]=(o*L-u*C+f*T)*O,e[9]=(r*C-n*L-s*T)*O,e[10]=(d*S-v*w+g*y)*O,e[11]=(c*w-l*S-p*y)*O,e[12]=(u*N-o*k-a*T)*O,e[13]=(n*k-r*N+i*T)*O,e[14]=(v*b-d*E-m*y)*O,e[15]=(l*E-c*b+h*y)*O,e):null},c.adjoint=function(e,t){var n=t[0],r=t[1],i=t[2],s=t[3],o=t[4],u=t[5],a=t[6],f=t[7],l=t[8],c=t[9],h=t[10],p=t[11],d=t[12],v=t[13],m=t[14],g=t[15];return e[0]=u*(h*g-p*m)-c*(a*g-f*m)+v*(a*p-f*h),e[1]=-(r*(h*g-p*m)-c*(i*g-s*m)+v*(i*p-s*h)),e[2]=r*(a*g-f*m)-u*(i*g-s*m)+v*(i*f-s*a),e[3]=-(r*(a*p-f*h)-u*(i*p-s*h)+c*(i*f-s*a)),e[4]=-(o*(h*g-p*m)-l*(a*g-f*m)+d*(a*p-f*h)),e[5]=n*(h*g-p*m)-l*(i*g-s*m)+d*(i*p-s*h),e[6]=-(n*(a*g-f*m)-o*(i*g-s*m)+d*(i*f-s*a)),e[7]=n*(a*p-f*h)-o*(i*p-s*h)+l*(i*f-s*a),e[8]=o*(c*g-p*v)-l*(u*g-f*v)+d*(u*p-f*c),e[9]=-(n*(c*g-p*v)-l*(r*g-s*v)+d*(r*p-s*c)),e[10]=n*(u*g-f*v)-o*(r*g-s*v)+d*(r*f-s*u),e[11]=-(n*(u*p-f*c)-o*(r*p-s*c)+l*(r*f-s*u)),e[12]=-(o*(c*m-h*v)-l*(u*m-a*v)+d*(u*h-a*c)),e[13]=n*(c*m-h*v)-l*(r*m-i*v)+d*(r*h-i*c),e[14]=-(n*(u*m-a*v)-o*(r*m-i*v)+d*(r*a-i*u)),e[15]=n*(u*h-a*c)-o*(r*h-i*c)+l*(r*a-i*u),e},c.determinant=function(e){var t=e[0],n=e[1],r=e[2],i=e[3],s=e[4],o=e[5],u=e[6],a=e[7],f=e[8],l=e[9],c=e[10],h=e[11],p=e[12],d=e[13],v=e[14],m=e[15],g=t*o-n*s,y=t*u-r*s,b=t*a-i*s,w=n*u-r*o,E=n*a-i*o,S=r*a-i*u,x=f*d-l*p,T=f*v-c*p,N=f*m-h*p,C=l*v-c*d,k=l*m-h*d,L=c*m-h*v;return g*L-y*k+b*C+w*N-E*T+S*x},c.multiply=function(e,t,n){var r=t[0],i=t[1],s=t[2],o=t[3],u=t[4],a=t[5],f=t[6],l=t[7],c=t[8],h=t[9],p=t[10],d=t[11],v=t[12],m=t[13],g=t[14],y=t[15],b=n[0],w=n[1],E=n[2],S=n[3];return e[0]=b*r+w*u+E*c+S*v,e[1]=b*i+w*a+E*h+S*m,e[2]=b*s+w*f+E*p+S*g,e[3]=b*o+w*l+E*d+S*y,b=n[4],w=n[5],E=n[6],S=n[7],e[4]=b*r+w*u+E*c+S*v,e[5]=b*i+w*a+E*h+S*m,e[6]=b*s+w*f+E*p+S*g,e[7]=b*o+w*l+E*d+S*y,b=n[8],w=n[9],E=n[10],S=n[11],e[8]=b*r+w*u+E*c+S*v,e[9]=b*i+w*a+E*h+S*m,e[10]=b*s+w*f+E*p+S*g,e[11]=b*o+w*l+E*d+S*y,b=n[12],w=n[13],E=n[14],S=n[15],e[12]=b*r+w*u+E*c+S*v,e[13]=b*i+w*a+E*h+S*m,e[14]=b*s+w*f+E*p+S*g,e[15]=b*o+w*l+E*d+S*y,e},c.mul=c.multiply,c.translate=function(e,t,n){var r=n[0],i=n[1],s=n[2],o,u,a,f,l,c,h,p,d,v,m,g;return t===e?(e[12]=t[0]*r+t[4]*i+t[8]*s+t[12],e[13]=t[1]*r+t[5]*i+t[9]*s+t[13],e[14]=t[2]*r+t[6]*i+t[10]*s+t[14],e[15]=t[3]*r+t[7]*i+t[11]*s+t[15]):(o=t[0],u=t[1],a=t[2],f=t[3],l=t[4],c=t[5],h=t[6],p=t[7],d=t[8],v=t[9],m=t[10],g=t[11],e[0]=o,e[1]=u,e[2]=a,e[3]=f,e[4]=l,e[5]=c,e[6]=h,e[7]=p,e[8]=d,e[9]=v,e[10]=m,e[11]=g,e[12]=o*r+l*i+d*s+t[12],e[13]=u*r+c*i+v*s+t[13],e[14]=a*r+h*i+m*s+t[14],e[15]=f*r+p*i+g*s+t[15]),e},c.scale=function(e,t,n){var r=n[0],i=n[1],s=n[2];return e[0]=t[0]*r,e[1]=t[1]*r,e[2]=t[2]*r,e[3]=t[3]*r,e[4]=t[4]*i,e[5]=t[5]*i,e[6]=t[6]*i,e[7]=t[7]*i,e[8]=t[8]*s,e[9]=t[9]*s,e[10]=t[10]*s,e[11]=t[11]*s,e[12]=t[12],e[13]=t[13],e[14]=t[14],e[15]=t[15],e},c.rotate=function(e,n,r,i){var s=i[0],o=i[1],u=i[2],a=Math.sqrt(s*s+o*o+u*u),f,l,c,h,p,d,v,m,g,y,b,w,E,S,x,T,N,C,k,L,A,O,M,_;return Math.abs(a)<t?null:(a=1/a,s*=a,o*=a,u*=a,f=Math.sin(r),l=Math.cos(r),c=1-l,h=n[0],p=n[1],d=n[2],v=n[3],m=n[4],g=n[5],y=n[6],b=n[7],w=n[8],E=n[9],S=n[10],x=n[11],T=s*s*c+l,N=o*s*c+u*f,C=u*s*c-o*f,k=s*o*c-u*f,L=o*o*c+l,A=u*o*c+s*f,O=s*u*c+o*f,M=o*u*c-s*f,_=u*u*c+l,e[0]=h*T+m*N+w*C,e[1]=p*T+g*N+E*C,e[2]=d*T+y*N+S*C,e[3]=v*T+b*N+x*C,e[4]=h*k+m*L+w*A,e[5]=p*k+g*L+E*A,e[6]=d*k+y*L+S*A,e[7]=v*k+b*L+x*A,e[8]=h*O+m*M+w*_,e[9]=p*O+g*M+E*_,e[10]=d*O+y*M+S*_,e[11]=v*O+b*M+x*_,n!==e&&(e[12]=n[12],e[13]=n[13],e[14]=n[14],e[15]=n[15]),e)},c.rotateX=function(e,t,n){var r=Math.sin(n),i=Math.cos(n),s=t[4],o=t[5],u=t[6],a=t[7],f=t[8],l=t[9],c=t[10],h=t[11];return t!==e&&(e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[12]=t[12],e[13]=t[13],e[14]=t[14],e[15]=t[15]),e[4]=s*i+f*r,e[5]=o*i+l*r,e[6]=u*i+c*r,e[7]=a*i+h*r,e[8]=f*i-s*r,e[9]=l*i-o*r,e[10]=c*i-u*r,e[11]=h*i-a*r,e},c.rotateY=function(e,t,n){var r=Math.sin(n),i=Math.cos(n),s=t[0],o=t[1],u=t[2],a=t[3],f=t[8],l=t[9],c=t[10],h=t[11];return t!==e&&(e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[12]=t[12],e[13]=t[13],e[14]=t[14],e[15]=t[15]),e[0]=s*i-f*r,e[1]=o*i-l*r,e[2]=u*i-c*r,e[3]=a*i-h*r,e[8]=s*r+f*i,e[9]=o*r+l*i,e[10]=u*r+c*i,e[11]=a*r+h*i,e},c.rotateZ=function(e,t,n){var r=Math.sin(n),i=Math.cos(n),s=t[0],o=t[1],u=t[2],a=t[3],f=t[4],l=t[5],c=t[6],h=t[7];return t!==e&&(e[8]=t[8],e[9]=t[9],e[10]=t[10],e[11]=t[11],e[12]=t[12],e[13]=t[13],e[14]=t[14],e[15]=t[15]),e[0]=s*i+f*r,e[1]=o*i+l*r,e[2]=u*i+c*r,e[3]=a*i+h*r,e[4]=f*i-s*r,e[5]=l*i-o*r,e[6]=c*i-u*r,e[7]=h*i-a*r,e},c.fromRotationTranslation=function(e,t,n){var r=t[0],i=t[1],s=t[2],o=t[3],u=r+r,a=i+i,f=s+s,l=r*u,c=r*a,h=r*f,p=i*a,d=i*f,v=s*f,m=o*u,g=o*a,y=o*f;return e[0]=1-(p+v),e[1]=c+y,e[2]=h-g,e[3]=0,e[4]=c-y,e[5]=1-(l+v),e[6]=d+m,e[7]=0,e[8]=h+g,e[9]=d-m,e[10]=1-(l+p),e[11]=0,e[12]=n[0],e[13]=n[1],e[14]=n[2],e[15]=1,e},c.fromQuat=function(e,t){var n=t[0],r=t[1],i=t[2],s=t[3],o=n+n,u=r+r,a=i+i,f=n*o,l=n*u,c=n*a,h=r*u,p=r*a,d=i*a,v=s*o,m=s*u,g=s*a;return e[0]=1-(h+d),e[1]=l+g,e[2]=c-m,e[3]=0,e[4]=l-g,e[5]=1-(f+d),e[6]=p+v,e[7]=0,e[8]=c+m,e[9]=p-v,e[10]=1-(f+h),e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,e},c.frustum=function(e,t,n,r,i,s,o){var u=1/(n-t),a=1/(i-r),f=1/(s-o);return e[0]=s*2*u,e[1]=0,e[2]=0,e[3]=0,e[4]=0,e[5]=s*2*a,e[6]=0,e[7]=0,e[8]=(n+t)*u,e[9]=(i+r)*a,e[10]=(o+s)*f,e[11]=-1,e[12]=0,e[13]=0,e[14]=o*s*2*f,e[15]=0,e},c.perspective=function(e,t,n,r,i){var s=1/Math.tan(t/2),o=1/(r-i);return e[0]=s/n,e[1]=0,e[2]=0,e[3]=0,e[4]=0,e[5]=s,e[6]=0,e[7]=0,e[8]=0,e[9]=0,e[10]=(i+r)*o,e[11]=-1,e[12]=0,e[13]=0,e[14]=2*i*r*o,e[15]=0,e},c.ortho=function(e,t,n,r,i,s,o){var u=1/(t-n),a=1/(r-i),f=1/(s-o);return e[0]=-2*u,e[1]=0,e[2]=0,e[3]=0,e[4]=0,e[5]=-2*a,e[6]=0,e[7]=0,e[8]=0,e[9]=0,e[10]=2*f,e[11]=0,e[12]=(t+n)*u,e[13]=(i+r)*a,e[14]=(o+s)*f,e[15]=1,e},c.lookAt=function(e,n,r,i){var s,o,u,a,f,l,h,p,d,v,m=n[0],g=n[1],y=n[2],b=i[0],w=i[1],E=i[2],S=r[0],x=r[1],T=r[2];return Math.abs(m-S)<t&&Math.abs(g-x)<t&&Math.abs(y-T)<t?c.identity(e):(h=m-S,p=g-x,d=y-T,v=1/Math.sqrt(h*h+p*p+d*d),h*=v,p*=v,d*=v,s=w*d-E*p,o=E*h-b*d,u=b*p-w*h,v=Math.sqrt(s*s+o*o+u*u),v?(v=1/v,s*=v,o*=v,u*=v):(s=0,o=0,u=0),a=p*u-d*o,f=d*s-h*u,l=h*o-p*s,v=Math.sqrt(a*a+f*f+l*l),v?(v=1/v,a*=v,f*=v,l*=v):(a=0,f=0,l=0),e[0]=s,e[1]=a,e[2]=h,e[3]=0,e[4]=o,e[5]=f,e[6]=p,e[7]=0,e[8]=u,e[9]=l,e[10]=d,e[11]=0,e[12]=-(s*m+o*g+u*y),e[13]=-(a*m+f*g+l*y),e[14]=-(h*m+p*g+d*y),e[15]=1,e)},c.str=function(e){return"mat4("+e[0]+", "+e[1]+", "+e[2]+", "+e[3]+", "+e[4]+", "+e[5]+", "+e[6]+", "+e[7]+", "+e[8]+", "+e[9]+", "+e[10]+", "+e[11]+", "+e[12]+", "+e[13]+", "+e[14]+", "+e[15]+")"},typeof e!="undefined"&&(e.mat4=c);var h={};h.create=function(){var e=new n(4);return e[0]=0,e[1]=0,e[2]=0,e[3]=1,e},h.rotationTo=function(){var e=o.create(),t=o.fromValues(1,0,0),n=o.fromValues(0,1,0);return function(r,i,s){var u=o.dot(i,s);return u<-0.999999?(o.cross(e,t,i),o.length(e)<1e-6&&o.cross(e,n,i),o.normalize(e,e),h.setAxisAngle(r,e,Math.PI),r):u>.999999?(r[0]=0,r[1]=0,r[2]=0,r[3]=1,r):(o.cross(e,i,s),r[0]=e[0],r[1]=e[1],r[2]=e[2],r[3]=1+u,h.normalize(r,r))}}(),h.setAxes=function(){var e=l.create();return function(t,n,r,i){return e[0]=r[0],e[3]=r[1],e[6]=r[2],e[1]=i[0],e[4]=i[1],e[7]=i[2],e[2]=n[0],e[5]=n[1],e[8]=n[2],h.normalize(t,h.fromMat3(t,e))}}(),h.clone=u.clone,h.fromValues=u.fromValues,h.copy=u.copy,h.set=u.set,h.identity=function(e){return e[0]=0,e[1]=0,e[2]=0,e[3]=1,e},h.setAxisAngle=function(e,t,n){n*=.5;var r=Math.sin(n);return e[0]=r*t[0],e[1]=r*t[1],e[2]=r*t[2],e[3]=Math.cos(n),e},h.add=u.add,h.multiply=function(e,t,n){var r=t[0],i=t[1],s=t[2],o=t[3],u=n[0],a=n[1],f=n[2],l=n[3];return e[0]=r*l+o*u+i*f-s*a,e[1]=i*l+o*a+s*u-r*f,e[2]=s*l+o*f+r*a-i*u,e[3]=o*l-r*u-i*a-s*f,e},h.mul=h.multiply,h.scale=u.scale,h.rotateX=function(e,t,n){n*=.5;var r=t[0],i=t[1],s=t[2],o=t[3],u=Math.sin(n),a=Math.cos(n);return e[0]=r*a+o*u,e[1]=i*a+s*u,e[2]=s*a-i*u,e[3]=o*a-r*u,e},h.rotateY=function(e,t,n){n*=.5;var r=t[0],i=t[1],s=t[2],o=t[3],u=Math.sin(n),a=Math.cos(n);return e[0]=r*a-s*u,e[1]=i*a+o*u,e[2]=s*a+r*u,e[3]=o*a-i*u,e},h.rotateZ=function(e,t,n){n*=.5;var r=t[0],i=t[1],s=t[2],o=t[3],u=Math.sin(n),a=Math.cos(n);return e[0]=r*a+i*u,e[1]=i*a-r*u,e[2]=s*a+o*u,e[3]=o*a-s*u,e},h.calculateW=function(e,t){var n=t[0],r=t[1],i=t[2];return e[0]=n,e[1]=r,e[2]=i,e[3]=-Math.sqrt(Math.abs(1-n*n-r*r-i*i)),e},h.dot=u.dot,h.lerp=u.lerp,h.slerp=function(e,t,n,r){var i=t[0],s=t[1],o=t[2],u=t[3],a=n[0],f=n[1],l=n[2],c=n[3],h,p,d,v,m;return p=i*a+s*f+o*l+u*c,p<0&&(p=-p,a=-a,f=-f,l=-l,c=-c),1-p>1e-6?(h=Math.acos(p),d=Math.sin(h),v=Math.sin((1-r)*h)/d,m=Math.sin(r*h)/d):(v=1-r,m=r),e[0]=v*i+m*a,e[1]=v*s+m*f,e[2]=v*o+m*l,e[3]=v*u+m*c,e},h.invert=function(e,t){var n=t[0],r=t[1],i=t[2],s=t[3],o=n*n+r*r+i*i+s*s,u=o?1/o:0;return e[0]=-n*u,e[1]=-r*u,e[2]=-i*u,e[3]=s*u,e},h.conjugate=function(e,t){return e[0]=-t[0],e[1]=-t[1],e[2]=-t[2],e[3]=t[3],e},h.length=u.length,h.len=h.length,h.squaredLength=u.squaredLength,h.sqrLen=h.squaredLength,h.normalize=u.normalize,h.fromMat3=function(){var e=typeof Int8Array!="undefined"?new Int8Array([1,2,0]):[1,2,0];return function(t,n){var r=n[0]+n[4]+n[8],i;if(r>0)i=Math.sqrt(r+1),t[3]=.5*i,i=.5/i,t[0]=(n[7]-n[5])*i,t[1]=(n[2]-n[6])*i,t[2]=(n[3]-n[1])*i;else{var s=0;n[4]>n[0]&&(s=1),n[8]>n[s*3+s]&&(s=2);var o=e[s],u=e[o];i=Math.sqrt(n[s*3+s]-n[o*3+o]-n[u*3+u]+1),t[s]=.5*i,i=.5/i,t[3]=(n[u*3+o]-n[o*3+u])*i,t[o]=(n[o*3+s]+n[s*3+o])*i,t[u]=(n[u*3+s]+n[s*3+u])*i}return t}}(),h.str=function(e){return"quat("+e[0]+", "+e[1]+", "+e[2]+", "+e[3]+")"},typeof e!="undefined"&&(e.quat=h)}(t.exports)})(this);
if (WebGLRenderingContext) {
WebGLRenderingContext.prototype.getShader = function(id) {
var script = document.getElementById(id);
if (!script) {
console.error('Shader not found');
alert("Could not find shader " + id);
return null;
}
switch (script && script.type) {
case 'x-shader/x-fragment': var shader = this.createShader(this.FRAGMENT_SHADER); break;
case 'x-shader/x-vertex': var shader = this.createShader(this.VERTEX_SHADER); break;
default: return null;
}
this.shaderSource(shader, script.innerText || script.text);
this.compileShader(shader);
if (!this.getShaderParameter(shader, this.COMPILE_STATUS)) {
console.error(this.getShaderInfoLog(shader));
return null;
} else {
return shader;
}
};
WebGLRenderingContext.prototype.initializeShader = function(name, attributes, uniforms) {
var shader = {
program: this.createProgram(),
fragment: this.getShader(name + "-fragment"),
vertex: this.getShader(name + "-vertex"),
attributes: []
};
this.attachShader(shader.program, shader.vertex);
this.attachShader(shader.program, shader.fragment);
this.linkProgram(shader.program);
if (!this.getProgramParameter(shader.program, this.LINK_STATUS)) {
console.error(this.getProgramInfoLog(shader.program));
alert("Could not initialize shader " + name);
} else {
for (var i = 0; i < attributes.length; i++) {
shader[attributes[i]] = this.getAttribLocation(shader.program, attributes[i]);
shader.attributes.push(shader[attributes[i]]);
}
for (var i = 0; i < uniforms.length; i++) {
shader[uniforms[i]] = this.getUniformLocation(shader.program, uniforms[i]);
}
}
return shader;
};
// Switches to a different shader program.
WebGLRenderingContext.prototype.switchShader = function(shader, matrix) {
if (!matrix) {
console.trace('matrix does not have required argument');
}
if (this.currentShader !== shader) {
this.useProgram(shader.program);
// Disable all attributes from the existing shader that aren't used in
// the new shader. Note: attribute indices are *not* program specific!
var enabled = this.currentShader ? this.currentShader.attributes : [];
var required = shader.attributes;
for (var i = 0; i < enabled.length; i++) {
if (required.indexOf(enabled[i]) < 0) {
this.disableVertexAttribArray(enabled[i]);
}
}
// Enable all attributes for the new shader.
for (var j = 0; j < required.length; j++) {
if (enabled.indexOf(required[j]) < 0) {
this.enableVertexAttribArray(required[j]);
}
}
this.currentShader = shader;
}
// Update the matrices if necessary. Note: This relies on object identity!
// This means changing the matrix values without the actual matrix object
// will FAIL to update the matrix properly.
if (shader.matrix !== matrix) {
this.uniformMatrix4fv(shader.u_matrix, false, matrix);
shader.matrix = matrix;
}
};
}
<head>
<meta charset="utf-8">
<script src="glutil.js"></script>
<script src="glmatrix.js"></script>
<script src="domready.js"></script>
<script src="OpenSans-Regular.json"></script>
</head>
<body>
<style>
canvas {
position: absolute;
top:140px;
left:0;
border:1px solid black;
}
</style>
<canvas id="webgl" width="1024" height="512" style=""></canvas>
<div style="float:left;">
<label><input type="range" style="width:400px" value="26" step="0.01" min="6" max="128.0" id="scale"> Size</label><br>
<label><input type="range" style="width:400px" value="0" step="0.01" min="0.0" max="10.0" id="translateX"> Translate X</label><br>
<label><input type="range" style="width:400px" value="0.2" step="0.01" min="0.1" max="0.7" id="buffer"> Buffer</label><br>
<label><input type="range" style="width:400px" value="0" step="0.01" min="-3.141592" max="3.141592" id="angle"> Angle</label><br>
<label><input type="range" style="width:400px" value="1" step="0.01" min="0" max="4" id="gamma"> Gamma</label><br>
<label><input type="checkbox" id="debug"> Texture</label><br>
</div>
<a href="https://www.mapbox.com/blog/text-signed-distance-fields/"/>Read blog post</a>
<script id="sdf-vertex" type="x-shader/x-vertex">
attribute vec2 a_pos;
attribute vec2 a_texcoord;
uniform mat4 u_matrix;
uniform vec2 u_texsize;
varying vec2 v_texcoord;
void main() {
gl_Position = u_matrix * vec4(a_pos.xy, 0, 1);
v_texcoord = a_texcoord / u_texsize;
}
</script>
<script id="sdf-fragment" type="x-shader/x-fragment">
precision mediump float;
uniform sampler2D u_texture;
uniform vec4 u_color;
uniform float u_buffer;
uniform float u_gamma;
uniform float u_debug;
varying vec2 v_texcoord;
void main() {
float dist = texture2D(u_texture, v_texcoord).r;
if (u_debug > 0.0) {
gl_FragColor = vec4(dist, dist, dist, 1);
} else {
float alpha = smoothstep(u_buffer - u_gamma, u_buffer + u_gamma, dist);
gl_FragColor = vec4(u_color.rgb, alpha * u_color.a);
}
}
</script>
<script type="text/javascript">
function loadCanvas(url, done) {
var img = new Image();
img.onload = function() { done(img); };
img.src = url;
}
var scale = 64;
function drawGlyph(chr, pen, size, vertexElements, textureElements) {
var metric = metrics.chars[chr];
if (!metric) return;
var scale = size / metrics.size;
var factor = 1;
var width = metric[0];
var height = metric[1];
var horiBearingX = metric[2];
var horiBearingY = metric[3];
var horiAdvance = metric[4];
var posX = metric[5];
var posY = metric[6];
if (width > 0 && height > 0) {
width += metrics.buffer * 2;
height += metrics.buffer * 2;
// Add a quad (= two triangles) per glyph.
vertexElements.push(
(factor * (pen.x + ((horiBearingX - metrics.buffer) * scale))), (factor * (pen.y - horiBearingY * scale)),
(factor * (pen.x + ((horiBearingX - metrics.buffer + width) * scale))), (factor * (pen.y - horiBearingY * scale)),
(factor * (pen.x + ((horiBearingX - metrics.buffer) * scale))), (factor * (pen.y + (height - horiBearingY) * scale)),
(factor * (pen.x + ((horiBearingX - metrics.buffer + width) * scale))), (factor * (pen.y - horiBearingY * scale)),
(factor * (pen.x + ((horiBearingX - metrics.buffer) * scale))), (factor * (pen.y + (height - horiBearingY) * scale)),
(factor * (pen.x + ((horiBearingX - metrics.buffer + width) * scale))), (factor * (pen.y + (height - horiBearingY) * scale))
);
textureElements.push(
posX, posY,
posX + width, posY,
posX, posY + height,
posX + width, posY,
posX, posY + height,
posX + width, posY + height
);
}
// pen.x += Math.ceil(horiAdvance * scale);
pen.x = pen.x + horiAdvance * scale;
}
function measureText(text, size) {
var dimensions = {
advance: 0
}
var scale = size / metrics.size;
for (var i = 0; i < text.length; i++) {
var horiAdvance = metrics.chars[text[i]][4];
dimensions.advance += horiAdvance * scale;
}
return dimensions;
}
// Initialize GL Canvas
var canvas = document.getElementById('webgl');
var pixelRatio = 'devicePixelRatio' in window ? devicePixelRatio : 1;
if (devicePixelRatio > 1 && !canvas.scaled) {
pixelRatio = devicePixelRatio;
canvas.style.width = canvas.width + 'px';
canvas.width = canvas.width * pixelRatio;
canvas.style.height = canvas.height + 'px';
canvas.height = canvas.height * pixelRatio;
canvas.scaled = true;
}
var gl = canvas.getContext("experimental-webgl", { antialias: false });
if (!gl) {
alert('Failed to initialize WebGL');
}
gl.getExtension("OES_standard_derivatives");
// Initialize shaders
var shader = gl.initializeShader('sdf',
['a_pos', 'a_texcoord'],
['u_matrix', 'u_texture', 'u_texsize', 'u_color', 'u_buffer', 'u_gamma', 'u_debug']);
gl.useProgram(shader.program);
gl.enableVertexAttribArray(shader.a_pos);
gl.enableVertexAttribArray(shader.a_texcoord);
var pMatrix = mat4.create();
mat4.ortho(pMatrix, 0, gl.canvas.width, gl.canvas.height, 0, 0, -1);
gl.blendFuncSeparate(
gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA,
gl.ONE, gl.ONE);
gl.enable(gl.BLEND);
var texture = gl.createTexture();
var vertexBuffer = gl.createBuffer();
var textureBuffer = gl.createBuffer();
var str = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUu";
function createText(size) {
var vertexElements = [];
var textureElements = [];
var dimensions = measureText(str, size);
var pen = { x: canvas.width / 2 - dimensions.advance / 2, y: canvas.height / 2 };
for (var i = 0; i < str.length; i++) {
var chr = str[i];
drawGlyph(chr, pen, size, vertexElements, textureElements);
}
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertexElements), gl.STATIC_DRAW);
vertexBuffer.numItems = vertexElements.length / 2;
gl.bindBuffer(gl.ARRAY_BUFFER, textureBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(textureElements), gl.STATIC_DRAW);
textureBuffer.numItems = textureElements.length / 2;
}
loadCanvas("OpenSans-Regular.png", function(atlas) {
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.LUMINANCE, gl.LUMINANCE, gl.UNSIGNED_BYTE, atlas);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
gl.uniform2f(shader.u_texsize, atlas.width, atlas.height)
draw();
});
function draw() {
gl.clearColor(0.9, 0.9, 0.9, 1);
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
var scale = +document.getElementById('scale').value;
var buffer = +document.getElementById('buffer').value;
var angle = +document.getElementById('angle').value;
var translateX = +document.getElementById('translateX').value;
var gamma = +document.getElementById('gamma').value;
var debug = +document.getElementById('debug').checked;
createText(scale);
var mvMatrix = mat4.create();
mat4.identity(mvMatrix);
mat4.translate(mvMatrix, mvMatrix, [ canvas.width / 2, canvas.height / 2, 0 ]);
mat4.rotateZ(mvMatrix, mvMatrix, angle);
mat4.translate(mvMatrix, mvMatrix, [ -canvas.width / 2, -canvas.height / 2, 0 ]);
mat4.translate(mvMatrix, mvMatrix, [ translateX, 0, 0 ]);
var mvpMatrix = mat4.create();
mat4.multiply(mvpMatrix, pMatrix, mvMatrix);
gl.uniformMatrix4fv(shader.u_matrix, false, mvpMatrix);
gl.activeTexture(gl.TEXTURE0);
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.uniform1i(shader.u_texture, 0);
gl.uniform1f(shader.u_scale, 1.0);
gl.uniform1f(shader.u_debug, debug ? 1 : 0);
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
gl.vertexAttribPointer(shader.a_pos, 2, gl.FLOAT, false, 0, 0);
gl.bindBuffer(gl.ARRAY_BUFFER, textureBuffer);
gl.vertexAttribPointer(shader.a_texcoord, 2, gl.FLOAT, false, 0, 0);
gl.uniform4fv(shader.u_color, [ 1, 1, 1, 1 ]);
gl.uniform1f(shader.u_buffer, buffer);
gl.drawArrays(gl.TRIANGLES, 0, vertexBuffer.numItems);
gl.uniform4fv(shader.u_color, [ 0, 0, 0, 1 ]);
gl.uniform1f(shader.u_buffer, 192 / 256);
gl.uniform1f(shader.u_gamma, gamma * 1.4142 / scale);
gl.drawArrays(gl.TRIANGLES, 0, vertexBuffer.numItems);
}
document.getElementById('scale').oninput = draw;
document.getElementById('buffer').oninput = draw;
document.getElementById('angle').oninput = draw;
document.getElementById('translateX').oninput = draw;
document.getElementById('gamma').oninput = draw;
document.getElementById('debug').oninput = draw;
</script>
var metrics = {"family":"Open Sans","style":"Regular","buffer":3,"size":24,"chars":{" ":[0,0,0,0,6],"!":[4,19,1,18,6,2,2],"\"":[8,8,1,18,9,14,2],"#":[15,18,0,18,15,30,2],"$":[12,21,1,19,13,53,2],"%":[18,19,1,18,19,73,2],"&":[17,19,1,18,17,99,2],"'":[3,8,1,18,5,124,2],"(":[7,22,0,18,7,135,2],")":[7,22,0,18,7,150,2],"*":[12,12,1,19,13,165,2],"+":[12,13,1,15,13,185,2],",":[5,7,0,3,5,205,2],"-":[7,3,0,8,7,218,2],".":[4,4,1,3,6,233,2],"/":[9,18,0,18,8,245,2],"0":[12,19,1,18,13,262,2],"1":[7,18,2,18,13,282,2],"2":[12,18,1,18,13,297,2],"3":[12,19,1,18,13,317,2],"4":[14,18,0,18,13,337,2],"5":[12,19,1,18,13,359,2],"6":[12,19,1,18,13,379,2],"7":[12,18,1,18,13,399,2],"8":[12,19,1,18,13,419,2],"9":[12,19,1,18,13,439,2],":":[4,15,1,14,6,459,2],";":[5,18,0,14,6,471,2],"<":[12,13,1,15,13,484,2],"=":[12,7,1,12,13,218,14],">":[12,13,1,15,13,165,22],"?":[10,19,0,18,10,185,23],"@":[20,21,1,18,21,484,23],"A":[16,18,0,18,15,238,28],"B":[13,18,2,18,15,459,28],"C":[14,19,1,18,15,14,28],"D":[15,18,2,18,17,282,28],"E":[10,18,2,18,13,399,28],"F":[10,18,2,18,12,337,28],"G":[15,19,1,18,17,203,29],"H":[14,18,2,18,17,417,29],"I":[3,18,2,18,6,124,18],"J":[7,23,-2,18,6,36,28],"K":[13,18,2,18,14,355,29],"L":[10,18,2,18,12,305,29],"M":[18,18,2,18,21,73,29],"N":[14,18,2,18,18,376,29],"O":[17,19,1,18,18,99,29],"P":[12,18,2,18,14,262,29],"Q":[17,23,1,18,18,135,32],"R":[13,18,2,18,14,51,31],"S":[12,19,1,18,13,439,29],"T":[14,18,0,18,13,160,43],"U":[14,19,2,18,17,480,52],"V":[15,18,0,18,14,226,54],"W":[22,18,0,18,22,323,54],"X":[14,18,0,18,13,282,54],"Y":[14,18,0,18,13,72,55],"Z":[13,18,0,18,13,182,50],"[":[7,22,1,18,7,398,54],"\\":[9,18,0,18,8,459,54],"]":[6,22,0,18,7,304,55],"^":[13,12,0,18,13,353,55],"_":[12,2,-1,-2,10,413,55],"`":[6,5,4,19,13,2,55],"a":[11,15,1,14,13,249,55],"b":[12,20,2,19,14,16,55],"c":[10,15,1,14,11,374,55],"d":[12,20,1,19,14,94,56],"e":[12,15,1,14,13,433,56],"f":[10,19,0,19,8,114,56],"g":[13,20,0,14,13,203,56],"h":[11,19,2,19,14,51,57],"i":[4,18,1,18,6,268,55],"j":[7,24,-2,18,6,36,59],"k":[11,19,2,19,12,132,63],"l":[3,19,2,19,6,413,65],"m":[19,14,2,14,22,151,69],"n":[11,14,2,14,14,353,75],"o":[13,15,1,14,14,178,76],"p":[12,20,2,14,14,372,78],"q":[12,20,1,14,14,476,79],"r":[8,14,2,14,9,249,78],"s":[10,15,1,14,11,424,79],"t":[8,17,0,16,8,496,79],"u":[12,14,1,13,14,224,80],"v":[13,13,0,13,12,280,80],"w":[19,13,0,13,18,318,80],"x":[13,13,0,13,12,453,80],"y":[13,19,0,13,12,70,81],"z":[11,13,0,13,11,2,83],"{":[9,22,0,18,9,114,83],"|":[3,25,5,19,13,442,79],"}":[9,22,0,18,9,91,84],"~":[12,4,1,10,13,199,84]," ":[0,0,0,0,6],"¡":[4,19,1,14,6,265,81],"¢":[10,19,2,18,13,392,84],"£":[13,18,0,18,13,131,91],"¤":[12,11,1,14,13,21,91],"¥":[14,18,0,18,13,41,91],"¦":[3,25,5,19,13,301,85],"§":[10,20,1,19,12,152,91],"¨":[8,3,3,18,13,199,96],"©":[18,19,1,18,19,345,97],"ª":[8,9,0,18,8,170,99],"«":[11,11,0,12,11,244,100],"¬":[12,7,1,10,13,277,101],"­":[7,3,0,8,7,312,101],"®":[18,19,1,18,19,410,102],"¯":[14,2,-1,20,12,453,101],"°":[8,8,1,18,10,327,101],"±":[12,16,1,15,13,215,102],"²":[8,12,0,18,8,496,104],"³":[8,12,0,18,8,2,104],"´":[6,5,4,19,13,371,106],"µ":[11,19,2,13,14,475,107],"¶":[13,23,1,19,15,186,107],"·":[4,5,1,11,6,263,108],"¸":[6,6,0,0,5,63,108],"¹":[6,12,0,18,8,77,108],"º":[9,9,0,18,9,18,110],"»":[11,11,0,12,11,385,111],"¼":[18,19,0,18,18,436,112],"½":[18,19,0,18,18,91,114],"¾":[19,19,0,18,18,35,117],"¿":[10,19,0,14,10,275,116],"À":[16,23,0,23,15,117,117],"Á":[16,23,0,23,15,312,117],"Â":[16,23,0,23,15,235,119],"Ã":[16,22,0,22,15,141,119],"Ä":[16,22,0,22,15,343,124],"Å":[16,22,0,22,15,207,126],"Æ":[21,18,-1,18,20,2,127],"Ç":[14,24,1,18,15,62,128],"È":[10,23,2,23,13,293,118],"É":[10,23,2,23,13,165,119],"Ê":[10,23,2,23,13,494,124],"Ë":[10,22,2,22,13,367,124],"Ì":[6,23,-1,23,6,259,121],"Í":[6,23,1,23,6,404,129],"Î":[9,23,-1,23,6,418,129],"Ï":[8,22,-1,22,6,385,130],"Ð":[16,18,0,18,17,462,134],"Ñ":[14,22,2,22,18,183,138],"Ò":[17,24,1,23,18,435,139],"Ó":[17,24,1,23,18,84,141],"Ô":[17,24,1,23,18,31,144],"Õ":[17,23,1,22,18,311,148],"Ö":[17,23,1,22,18,109,148],"×":[12,11,1,14,13,273,143],"Ø":[17,19,1,18,18,134,149],"Ù":[14,24,2,23,17,231,150],"Ú":[14,24,2,23,17,159,150],"Û":[14,24,2,23,17,2,153],"Ü":[14,23,2,22,17,336,154],"Ý":[14,23,0,23,13,358,154],"Þ":[12,18,2,18,14,253,152],"ß":[12,20,2,19,14,486,155],"à":[11,20,1,19,13,205,156],"á":[11,20,1,19,13,460,160],"â":[11,20,1,19,13,401,160],"ã":[11,19,1,18,13,380,160],"ä":[11,19,1,18,13,56,160],"å":[11,21,1,20,13,273,162],"æ":[19,15,1,14,20,420,171],"ç":[10,20,1,14,11,293,149],"è":[12,20,1,19,13,181,168],"é":[12,20,1,19,13,75,173],"ê":[12,20,1,19,13,24,176],"ë":[12,19,1,18,13,134,176],"ì":[6,19,-1,19,6,95,173],"í":[6,19,1,19,6,292,177],"î":[9,19,-1,19,6,253,178],"ï":[8,18,-1,18,6,306,179],"ð":[13,20,1,19,14,109,179],"ñ":[11,18,2,18,14,154,182],"ò":[13,20,1,19,14,224,182],"ó":[13,20,1,19,14,479,183],"ô":[13,20,1,19,14,201,184],"õ":[13,19,1,18,14,322,185],"ö":[13,19,1,18,14,2,185],"÷":[12,12,1,14,13,343,185],"ø":[13,15,1,14,14,44,187],"ù":[12,20,1,19,14,363,187],"ú":[12,20,1,19,14,399,188],"û":[12,20,1,19,14,447,188],"ü":[12,19,1,18,14,270,191],"ý":[13,25,0,19,12,419,194],"þ":[12,25,2,19,14,173,196],"ÿ":[13,24,0,18,12,65,201],"Ā":[16,21,0,21,15,130,203],"ā":[11,18,1,17,13,86,201],"Ă":[16,22,0,22,15,290,205],"ă":[11,19,1,18,13,23,204],"Ą":[16,24,0,18,15,245,205],"ą":[12,20,1,14,13,343,205],"Ć":[14,24,1,23,15,105,207],"ć":[10,20,1,19,11,154,208],"Ĉ":[14,24,1,23,15,42,210],"ĉ":[10,20,1,19,11,222,210],"Ċ":[14,23,1,22,15,467,211],"ċ":[10,19,1,18,11,489,211],"Č":[14,24,1,23,15,193,212],"č":[11,20,1,19,11,314,212],"Ď":[15,23,2,23,17,363,215],"ď":[16,20,1,19,14,440,216],"Đ":[16,18,0,18,17,386,216],"đ":[14,20,1,19,14,410,227],"Ē":[10,21,2,21,13,2,212],"ē":[12,18,1,17,13,269,218],"Ĕ":[10,22,2,22,13,86,227],"ĕ":[12,19,1,18,13,172,229],"Ė":[10,22,2,22,13,20,231],"ė":[12,19,1,18,13,127,232],"Ę":[10,24,2,18,13,64,233],"ę":[12,20,1,14,13,333,233],"Ě":[10,23,2,23,13,289,235],"ě":[12,20,1,19,13,147,236],"Ĝ":[15,24,1,23,17,240,237],"ĝ":[13,25,0,19,13,215,238],"Ğ":[15,23,1,22,17,489,238],"ğ":[13,24,0,18,13,104,239],"Ġ":[15,23,1,22,17,307,240],"ġ":[13,24,0,18,13,464,242],"Ģ":[15,24,1,18,17,38,242],"ģ":[13,25,0,19,13,386,242],"Ĥ":[14,23,2,23,17,192,244],"ĥ":[11,24,2,24,14,263,244],"Ħ":[18,18,0,18,17,432,244],"ħ":[13,19,0,19,14,353,246],"Ĩ":[9,22,-1,22,6,2,241],"ĩ":[9,18,-1,18,6,407,255],"Ī":[8,21,-1,21,6,167,256],"ī":[8,17,-1,17,6,82,257],"Ĭ":[8,22,-1,22,6,125,259],"ĭ":[8,18,-1,18,6,19,261],"Į":[5,24,1,18,6,330,261],"į":[5,24,0,18,6,141,264],"İ":[4,22,1,22,6,374,246],"ı":[3,13,2,13,6,154,264],"IJ":[10,23,2,18,13,61,265],"ij":[10,24,1,18,12,282,266],"Ĵ":[10,28,-2,23,6,236,269],"ĵ":[10,25,-2,19,6,485,269],"Ķ":[13,24,2,18,14,424,270],"ķ":[11,25,2,19,12,445,270],"ĸ":[11,13,2,13,12,214,271],"Ĺ":[10,23,2,23,12,98,271],"ĺ":[6,24,1,24,6,300,271],"Ļ":[10,24,2,18,12,343,273],"ļ":[4,25,1,19,6,314,271],"Ľ":[10,18,2,18,12,35,274],"ľ":[7,19,2,19,6,2,271],"Ŀ":[10,18,2,18,12,464,274],"ŀ":[7,19,2,19,7,183,275],"Ł":[12,18,0,18,12,386,275],"ł":[8,19,-1,19,6,198,275],"Ń":[14,23,2,23,18,254,276],"ń":[11,19,2,19,14,361,276],"Ņ":[14,24,2,18,18,154,285],"ņ":[11,20,2,14,14,79,282],"Ň":[14,23,2,23,18,116,289],"ň":[11,19,2,19,14,214,292],"ʼn":[15,18,0,18,16,53,296],"Ŋ":[14,23,2,18,18,276,298],"ŋ":[11,20,2,14,14,2,298],"Ō":[17,22,1,21,18,21,300],"ō":[13,18,1,17,14,464,300],"Ŏ":[17,23,1,22,18,380,301],"ŏ":[13,19,1,18,14,405,302],"Ő":[17,24,1,23,18,176,302],"ő":[13,20,1,19,14,485,302],"Œ":[20,19,1,18,22,426,303],"œ":[21,15,1,14,22,298,304],"Ŕ":[13,23,2,23,14,233,305],"ŕ":[8,19,2,19,9,327,293],"Ŗ":[13,24,2,18,14,343,305],"ŗ":[9,20,1,14,9,98,302],"Ř":[13,23,2,23,14,254,307],"ř":[9,19,1,19,9,76,310],"Ś":[12,24,1,23,13,138,317],"ś":[10,20,1,19,11,158,317],"Ŝ":[12,24,1,23,13,201,319],"ŝ":[10,20,1,19,11,115,320],"Ş":[12,24,1,18,13,46,322],"ş":[10,20,1,14,11,454,326],"Š":[12,24,1,23,13,298,327],"š":[10,20,1,19,11,2,326],"Ţ":[14,24,0,18,13,318,327],"ţ":[8,22,0,16,8,364,303],"Ť":[14,23,0,23,13,275,329],"ť":[9,20,0,19,8,405,329],"Ŧ":[14,18,0,18,13,20,330],"ŧ":[8,17,0,16,8,422,330],"Ũ":[14,23,2,22,17,93,330],"ũ":[12,19,1,18,14,472,330],"Ū":[14,22,2,21,17,380,332],"ū":[12,18,1,17,14,492,330],"Ŭ":[14,23,2,22,17,176,334],"ŭ":[12,19,1,18,14,221,336],"Ů":[14,25,2,24,17,340,337],"ů":[12,21,1,20,14,66,337],"Ű":[14,24,2,23,17,241,338],"ű":[12,20,1,19,14,115,348],"Ų":[14,24,2,18,17,135,349],"ų":[13,19,1,13,14,198,351],"Ŵ":[22,23,0,23,22,438,354],"ŵ":[19,19,0,19,18,2,356],"Ŷ":[14,23,0,23,13,42,354],"ŷ":[13,25,0,19,12,402,357],"Ÿ":[14,22,0,22,13,468,357],"Ź":[13,23,0,23,13,490,357],"ź":[11,19,0,19,11,157,349],"Ż":[13,22,0,22,13,297,359],"ż":[11,18,0,18,11,318,359],"Ž":[13,23,0,23,13,263,360],"ž":[11,19,0,19,11,86,361],"ſ":[7,19,2,19,7,364,333],"ƒ":[11,24,2,18,13,379,362],"Ơ":[19,20,1,19,18,219,370],"ơ":[15,16,1,15,14,337,370],"Ư":[18,20,2,19,18,105,376],"ư":[16,16,1,15,15,157,376],"ǰ":[10,25,-2,19,6,64,366],"Ǻ":[16,23,0,23,15,181,378],"ǻ":[11,24,1,23,13,360,370],"Ǽ":[21,23,-1,23,20,2,383],"ǽ":[19,20,1,19,20,31,385],"Ǿ":[17,24,1,23,18,131,381],"ǿ":[13,20,1,19,14,423,385],"Ș":[12,24,1,18,13,444,385],"ș":[10,20,1,14,11,318,385],"Ț":[14,24,0,18,13,464,387],"ț":[8,22,0,16,8,246,370],"ȷ":[7,19,-2,13,6,82,388],"ʼ":[4,7,0,18,4,284,360],"ˆ":[9,5,3,19,14,486,388],"ˇ":[9,5,3,19,14,296,389],"ˉ":[8,3,3,17,14,398,390],"˘":[8,4,3,18,14,262,391],"˙":[4,3,1,18,6,284,375],"˚":[6,6,4,20,13,205,378],"˛":[5,6,0,0,4,278,391],"˜":[9,4,3,18,14,336,394],"˝":[10,5,2,19,13,379,394],"˳":[6,6,1,-1,8,205,392],"̀":[6,5,-12,19,0,219,398],"́":[6,5,-9,19,0,58,399],"̃":[9,4,-12,18,0,156,400],"̉":[5,6,-9,20,0,233,398],"̏":[10,5,-13,19,0,397,401],"̣":[4,4,-9,-1,0,246,400],"΄":[5,6,5,20,13,486,401],"΅":[8,6,3,21,13,291,402],"Ά":[17,19,-1,19,15,353,402],"·":[4,5,1,11,6,499,401],"Έ":[14,19,-1,19,14,97,404],"Ή":[19,19,-1,19,19,258,405],"Ί":[8,19,-1,19,8,336,406],"Ό":[20,20,-1,19,19,173,409],"Ύ":[18,19,-1,19,16,201,411],"Ώ":[20,19,-1,19,19,227,412],"ΐ":[9,22,-1,21,8,378,407],"Α":[16,18,0,18,15,58,412],"Β":[13,18,2,18,15,313,413],"Γ":[10,18,2,18,12,415,413],"Δ":[14,18,0,18,13,119,413],"Ε":[10,18,2,18,13,141,413],"Ζ":[13,18,0,18,13,31,413],"Η":[14,18,2,18,17,2,414],"Θ":[17,19,1,18,18,486,415],"Ι":[3,18,2,18,6,159,412],"Κ":[13,18,2,18,14,285,416],"Λ":[15,18,0,18,14,433,417],"Μ":[18,18,2,18,21,456,419],"Ν":[14,18,2,18,18,352,429],"Ξ":[13,18,0,18,13,82,431],"Ο":[17,19,1,18,18,255,432],"Π":[14,18,2,18,17,170,437],"Ρ":[12,18,2,18,14,395,414],"Σ":[14,18,0,18,13,52,438],"Τ":[14,18,0,18,13,192,438],"Υ":[14,18,0,18,13,306,439],"Φ":[17,19,1,18,19,24,439],"Χ":[14,18,0,18,13,328,439],"Ψ":[17,18,1,18,19,214,439],"Ω":[18,18,0,18,18,103,439],"Ϊ":[8,22,-1,22,6,374,437],"Ϋ":[14,22,0,22,13,129,439],"ά":[14,21,1,20,14,390,440],"έ":[10,21,1,20,11,151,439],"ή":[11,26,2,20,14,412,440],"ί":[7,21,1,20,8,239,439],"ΰ":[13,22,1,21,14,2,440],"α":[14,15,1,14,14,482,442],"β":[12,25,2,19,15,280,442],"γ":[13,19,0,13,12,431,443],"δ":[13,20,1,19,13,452,445],"ε":[10,15,1,14,11,350,455],"ζ":[10,24,1,19,11,74,457],"η":[11,20,2,14,14,254,459],"θ":[12,20,1,19,14,169,463],"ι":[7,14,1,13,8,49,464],"κ":[11,13,2,13,12,189,464],"λ":[14,20,-1,19,12,208,465],"μ":[11,19,2,13,14,300,465],"ν":[13,13,0,13,13,473,465],"ξ":[10,24,1,19,11,494,465],"ο":[13,15,1,14,14,92,465],"π":[15,14,0,13,15,319,465],"ρ":[13,20,1,14,14,23,466],"ς":[10,19,1,14,11,368,467],"σ":[14,14,1,13,14,230,468],"τ":[11,14,0,13,11,386,469],"υ":[13,14,1,13,14,113,469],"φ":[15,20,1,14,17,134,469],"χ":[14,19,-1,13,13,431,473],"ψ":[16,25,1,19,18,405,474],"ω":[17,14,1,13,18,273,475],"ϊ":[9,19,-1,18,8,2,470],"ϋ":[13,19,1,18,14,342,478],"ό":[13,21,1,20,14,44,486],"ύ":[13,21,1,20,14,453,486],"ώ":[17,21,1,20,18,65,489],"ϑ":[15,20,0,19,14,319,487],"ϒ":[14,18,0,18,13,90,489],"ϖ":[20,14,0,13,20,230,490],"Ѐ":[10,23,2,23,13,189,485],"Ё":[10,22,2,22,13,474,486],"Ђ":[16,19,0,18,17,157,491],"Ѓ":[10,23,2,23,12,112,491],"Є":[14,19,1,18,15,207,493],"Ѕ":[12,19,1,18,13,298,492],"І":[3,18,2,18,6,258,487],"Ї":[8,22,-1,22,6,386,491],"Ј":[7,23,-2,18,6,19,494],"Љ":[22,19,0,18,22,342,505],"Њ":[20,18,2,18,22,269,497],"Ћ":[16,18,0,18,17,130,497],"Ќ":[13,23,2,23,14,429,500],"Ѝ":[14,23,2,23,18,402,507],"Ў":[15,24,0,23,14,229,512],"Џ":[14,23,2,18,17,318,515],"А":[16,18,0,18,15,450,515],"Б":[12,18,2,18,14,492,497],"В":[13,18,2,18,15,34,515],"Г":[10,18,2,18,12,90,515],"Д":[16,23,0,18,16,181,516],"Е":[10,18,2,18,13,474,516],"Ж":[21,18,0,18,20,55,518],"З":[13,19,0,18,13,154,518],"И":[14,18,2,18,18,205,520],"Й":[14,23,2,23,18,372,521],"К":[13,18,2,18,14,297,519],"Л":[15,19,0,18,16,108,523],"М":[18,18,2,18,21,252,523],"Н":[14,18,2,18,17,131,523],"О":[17,19,1,18,18,2,525],"П":[14,18,2,18,17,424,531],"Р":[12,18,2,18,14,492,523],"С":[14,19,1,18,15,340,532],"Т":[14,18,0,18,13,394,538],"У":[15,19,0,18,14,446,541],"Ф":[17,19,1,18,19,27,541],"Х":[14,18,0,18,13,84,541],"Ц":[16,23,2,18,17,227,544],"Ч":[13,18,2,18,16,469,542],"Ш":[21,18,2,18,24,52,544],"Щ":[23,23,2,18,24,278,545],"Ъ":[16,18,0,18,16,153,545],"Ы":[17,18,2,18,20,309,546],"Ь":[13,18,2,18,15,205,546],"Э":[14,19,0,18,15,177,547],"Ю":[22,19,2,18,25,106,550],"Я":[13,18,0,18,15,251,549],"а":[11,15,1,14,13,490,549],"б":[12,20,1,19,14,362,552],"в":[11,13,2,13,13,2,552],"г":[8,13,2,13,10,136,549],"д":[14,18,0,13,13,416,557],"е":[12,15,1,14,13,334,559],"ж":[18,13,0,13,17,382,564],"з":[11,15,0,14,11,81,567],"и":[12,13,2,13,15,21,568],"й":[12,19,2,19,15,438,568],"к":[11,13,2,13,12,458,568],"л":[12,14,0,13,13,41,570],"м":[14,13,2,13,17,152,571],"н":[12,13,2,13,15,61,570],"о":[13,15,1,14,14,199,572],"п":[11,13,2,13,14,477,572],"р":[12,20,2,14,14,309,572],"с":[10,15,1,14,11,2,573],"т":[11,13,0,13,11,174,574],"у":[13,19,0,13,12,226,575],"ф":[15,25,1,19,17,247,575],"х":[13,13,0,13,12,270,576],"ц":[13,18,2,13,15,100,577],"ч":[12,13,1,13,14,121,577],"ш":[18,13,2,13,21,354,580],"щ":[20,18,2,13,21,408,583],"ъ":[16,13,0,13,16,329,582],"ы":[15,13,2,13,18,380,585],"ь":[11,13,2,13,14,20,589],"э":[11,15,0,14,11,458,589],"ю":[17,15,2,14,19,61,591],"я":[12,13,0,13,13,39,592],"ѐ":[12,20,1,19,13,141,592],"ё":[12,19,1,18,13,477,593],"ђ":[13,25,0,19,14,436,595],"ѓ":[8,19,2,19,10,291,576],"є":[10,15,1,14,11,193,595],"ѕ":[10,15,1,14,11,161,595],"і":[4,18,1,18,6,497,572],"ї":[8,18,-1,18,6,2,596],"ј":[7,24,-2,18,6,211,595],"љ":[19,14,0,13,20,353,601],"њ":[18,13,2,13,21,307,603],"ћ":[13,19,0,19,14,270,597],"ќ":[11,19,2,19,12,121,598],"ѝ":[12,19,2,19,15,226,602],"ў":[13,25,0,19,12,86,603],"џ":[11,18,2,13,14,333,603],"Ѡ":[22,19,1,18,24,403,609],"ѡ":[19,13,0,13,19,18,613],"Ѣ":[15,19,0,19,16,380,606],"ѣ":[14,16,0,16,15,246,608],"Ѥ":[20,19,2,18,22,45,614],"ѥ":[15,15,2,14,17,179,618],"Ѧ":[17,18,0,18,16,140,620],"ѧ":[14,13,0,13,13,457,620],"Ѩ":[21,18,2,18,22,479,620],"ѩ":[17,13,2,13,18,352,623],"Ѫ":[18,18,0,18,17,268,624],"ѫ":[16,13,0,13,15,294,624],"Ѭ":[22,18,2,18,23,107,625],"ѭ":[19,13,2,13,20,202,629],"Ѯ":[13,27,0,21,13,433,628],"ѯ":[11,21,0,16,11,318,629],"Ѱ":[17,18,1,18,19,229,632],"ѱ":[16,25,1,19,18,377,633],"Ѳ":[17,19,1,18,18,2,634],"ѳ":[13,15,1,14,14,401,636],"Ѵ":[16,18,0,18,15,73,636],"ѵ":[13,13,0,13,12,454,641],"Ѷ":[16,23,0,23,15,165,641],"ѷ":[13,19,0,19,12,27,641],"Ѹ":[28,24,1,18,29,337,644],"ѹ":[25,20,1,14,25,475,646],"Ѻ":[18,21,1,19,19,137,646],"ѻ":[14,17,1,15,15,48,641],"Ѽ":[22,26,1,25,23,189,650],"ѽ":[18,23,1,22,19,254,650],"Ѿ":[22,23,1,22,23,280,650],"ѿ":[19,17,0,17,19,97,651],"Ҁ":[14,24,1,18,15,310,658],"ҁ":[10,20,1,14,11,219,658],"҂":[13,17,1,16,14,401,659],"҃":[10,5,2,18,13,2,661],"҄":[10,4,2,18,13,70,662],"҅":[4,5,5,19,13,124,651],"҆":[4,5,5,19,13,237,658],"҈":[24,21,0,17,23,422,663],"҉":[23,23,0,18,22,20,668],"Ҋ":[17,28,2,23,18,373,666],"ҋ":[14,24,2,19,15,163,672],"Ҍ":[14,18,0,18,14,70,674],"ҍ":[13,19,0,19,14,454,662],"Ҏ":[12,18,2,18,14,475,674],"ҏ":[12,20,2,14,14,136,675],"Ґ":[11,21,2,21,12,51,666],"ґ":[8,17,2,17,10,237,671],"Ғ":[13,18,0,18,12,92,676],"ғ":[10,13,0,13,10,2,674],"Ҕ":[13,24,2,18,15,332,676],"ҕ":[10,19,2,13,12,113,676],"Җ":[21,23,0,18,21,253,681],"җ":[19,18,0,13,18,282,681],"Ҙ":[13,24,0,18,13,398,684],"ҙ":[11,20,0,14,11,353,676],"Қ":[14,23,2,18,15,185,684],"қ":[11,18,2,13,13,207,686],"Ҝ":[13,18,2,18,14,454,689],"ҝ":[11,13,2,13,12,309,690],"Ҟ":[15,18,0,18,14,419,692],"ҟ":[13,19,0,19,12,226,696],"Ҡ":[17,18,0,18,16,2,699],"ҡ":[15,13,0,13,14,27,699],"Ң":[16,23,2,18,17,50,700],"ң":[13,18,2,13,15,475,700],"Ҥ":[18,18,2,18,19,372,702],"ҥ":[16,13,2,13,17,74,702],"Ҧ":[23,24,2,18,25,131,703],"ҧ":[18,19,2,13,20,98,703],"Ҩ":[17,19,1,18,18,282,707],"ҩ":[14,15,1,14,15,162,704],"Ҫ":[14,24,1,18,15,328,708],"ҫ":[10,20,1,14,11,353,704],"Ҭ":[14,23,0,18,13,247,712],"ҭ":[11,18,0,13,11,307,711],"Ү":[14,18,0,18,13,184,715],"ү":[13,19,0,13,12,442,715],"Ұ":[14,18,0,18,13,398,718],"ұ":[13,19,0,13,12,420,718],"Ҳ":[15,23,0,18,14,27,720],"ҳ":[13,18,0,13,13,206,723],"Ҵ":[20,23,0,18,20,463,726],"ҵ":[17,18,0,13,17,2,725],"Ҷ":[15,23,2,18,16,74,723],"ҷ":[14,18,1,13,14,162,727],"Ҹ":[13,18,2,18,16,491,726],"ҹ":[12,13,1,13,14,227,723],"Һ":[13,18,2,18,16,371,728],"һ":[11,13,2,13,14,97,730],"Ҽ":[19,19,0,18,20,269,734],"ҽ":[15,15,0,14,15,50,731],"Ҿ":[19,23,0,18,20,124,735],"ҿ":[15,19,0,14,15,296,737],"Ӏ":[3,18,2,18,6,350,732],"Ӂ":[21,23,0,23,20,319,740],"ӂ":[18,19,0,19,17,392,744],"Ӄ":[14,24,2,18,16,184,741],"ӄ":[11,19,2,13,13,441,742],"Ӆ":[17,23,0,18,16,227,744],"ӆ":[14,18,0,13,13,418,745],"Ӈ":[14,24,2,18,17,97,751],"ӈ":[12,19,2,13,14,206,749],"Ӊ":[16,23,2,18,17,2,751],"ӊ":[14,18,2,13,15,26,751],"Ӌ":[13,23,2,18,16,491,752],"ӌ":[12,18,1,13,14,151,753],"Ӎ":[20,23,2,18,21,48,754],"ӎ":[16,18,2,13,17,361,754],"ӏ":[3,18,2,18,6,252,743],"Ӑ":[16,23,0,23,15,460,757],"ӑ":[11,20,1,19,13,76,754],"Ӓ":[16,22,0,22,15,263,761],"ӓ":[11,19,1,18,13,287,764],"Ӕ":[21,18,-1,18,20,119,766],"ӕ":[19,15,1,14,20,385,771],"Ӗ":[10,23,2,23,13,440,769],"ӗ":[12,20,1,19,13,306,771],"Ә":[16,19,1,18,17,326,771],"ә":[12,15,1,14,13,412,771],"Ӛ":[16,23,1,22,17,171,773],"ӛ":[12,19,1,18,13,226,775],"Ӝ":[21,22,0,22,20,195,776],"ӝ":[18,18,0,18,17,350,780],"Ӟ":[13,23,0,22,13,26,777],"ӟ":[11,19,0,18,11,148,779],"Ӡ":[13,19,0,18,14,76,782],"ӡ":[11,19,0,13,11,2,782],"Ӣ":[14,21,2,21,18,484,783],"ӣ":[12,17,2,17,15,97,783],"Ӥ":[14,22,2,22,18,47,785],"ӥ":[12,18,2,18,15,458,788],"Ӧ":[17,23,1,22,18,246,791],"ӧ":[13,19,1,18,14,271,791],"Ө":[17,19,1,18,18,117,792],"ө":[13,15,1,14,14,376,794],"Ӫ":[17,23,1,22,18,397,794],"ӫ":[13,19,1,18,14,326,798],"Ӭ":[14,23,0,22,15,292,799],"ӭ":[11,19,0,18,11,432,800],"Ӯ":[15,22,0,21,14,167,804],"ӯ":[13,23,0,17,12,224,802],"Ӱ":[15,23,0,22,14,347,806],"ӱ":[13,24,0,18,12,190,806],"Ӳ":[15,24,0,23,14,142,806],"ӳ":[13,25,0,19,12,21,808],"Ӵ":[13,22,2,22,16,69,809],"ӵ":[12,18,1,18,14,97,808],"Ӷ":[11,23,2,18,12,2,809],"ӷ":[8,18,2,13,10,478,812],"Ӹ":[17,22,2,22,20,451,814],"ӹ":[15,18,2,18,18,42,815],"Ӻ":[13,23,0,18,12,370,817],"ӻ":[10,18,0,13,10,494,812],"Ӽ":[15,23,0,18,14,117,819],"ӽ":[13,18,0,13,12,271,818],"Ӿ":[14,18,0,18,13,245,822],"ӿ":[13,13,0,13,12,391,825],"Ԁ":[12,18,1,18,14,412,825],"ԁ":[12,20,1,19,14,314,825],"Ԃ":[19,19,1,18,21,211,833],"ԃ":[19,20,1,19,21,90,834],"Ԅ":[20,19,0,18,21,334,837],"ԅ":[18,15,0,14,19,140,838],"Ԇ":[15,23,0,18,15,166,834],"ԇ":[13,19,0,14,12,292,830],"Ԉ":[22,19,0,18,23,476,838],"ԉ":[19,14,0,13,20,2,841],"Ԋ":[21,19,2,18,24,29,841],"ԋ":[18,14,2,13,21,58,841],"Ԍ":[16,19,1,18,18,267,844],"ԍ":[14,15,1,14,15,189,838],"Ԏ":[15,19,0,18,17,432,844],"ԏ":[14,14,0,13,15,238,848],"Ԑ":[13,19,1,18,14,455,844],"ԑ":[10,15,1,14,11,391,846],"Ԓ":[17,23,0,18,16,362,848],"ԓ":[14,18,0,13,13,117,850],"Ḁ":[16,25,0,18,15,291,857],"ḁ":[11,21,1,14,13,409,851],"Ḿ":[18,23,2,23,21,211,860],"ḿ":[19,19,2,19,22,139,861],"Ẁ":[22,23,0,23,22,84,862],"ẁ":[19,19,0,19,18,2,863],"Ẃ":[22,23,0,23,22,315,864],"ẃ":[19,19,0,19,18,166,865],"Ẅ":[22,22,0,22,22,476,865],"ẅ":[19,18,0,18,18,29,868],"Ạ":[16,23,0,18,15,58,863],"ạ":[11,19,1,14,13,387,869],"Ả":[16,24,0,24,15,237,870],"ả":[11,21,1,20,13,428,871],"Ấ":[16,24,0,24,15,261,871],"ấ":[13,21,1,20,13,447,871],"Ầ":[16,24,0,24,15,114,876],"ầ":[12,21,0,20,13,345,879],"Ẩ":[16,25,0,25,15,138,888],"ẩ":[12,22,1,21,13,365,879],"Ẫ":[16,26,0,26,15,285,890],"ẫ":[11,23,1,22,13,406,880],"Ậ":[16,28,0,23,15,2,890],"ậ":[11,24,1,19,13,193,891],"Ắ":[16,25,0,25,15,212,891],"ắ":[11,22,1,21,13,162,892],"Ằ":[16,25,0,25,15,82,893],"ằ":[11,22,1,21,13,56,894],"Ẳ":[16,26,0,26,15,26,894],"ẳ":[11,23,1,22,13,309,895],"Ẵ":[16,26,0,26,15,468,895],"ẵ":[11,23,1,22,13,492,895],"Ặ":[16,27,0,22,15,425,900],"ặ":[11,23,1,18,13,385,896],"Ẹ":[10,23,2,18,13,449,900],"ẹ":[12,19,1,14,13,236,902],"Ẻ":[10,24,2,24,13,256,903],"ẻ":[12,21,1,20,13,106,908],"Ẽ":[10,22,2,22,13,328,908],"ẽ":[12,19,1,18,13,346,909],"Ế":[12,24,2,24,13,404,911],"ế":[13,21,1,20,13,126,921],"Ề":[12,24,0,24,13,147,922],"ề":[13,21,0,20,13,167,922],"Ể":[11,25,2,25,13,366,909],"ể":[12,22,1,21,13,188,923],"Ễ":[10,26,2,26,13,208,924],"ễ":[12,23,1,22,13,50,924],"Ệ":[10,28,2,23,13,274,924],"ệ":[12,24,1,19,13,70,926],"Ỉ":[5,24,2,24,6,292,924],"ỉ":[5,20,1,20,6,305,926],"Ị":[4,23,1,18,6,90,926],"ị":[4,23,1,18,6,492,926],"Ọ":[17,23,1,18,18,2,928],"ọ":[13,19,1,14,14,27,928],"Ỏ":[17,25,1,24,18,467,929],"ỏ":[13,21,1,20,14,226,929],"Ố":[17,25,1,24,18,424,935],"ố":[13,21,1,20,14,247,935],"Ồ":[17,25,1,24,18,318,938],"ồ":[14,21,0,20,14,102,937],"Ổ":[17,26,1,25,18,343,942],"ổ":[13,22,1,21,14,368,942],"Ỗ":[17,27,1,26,18,389,943],"ỗ":[13,23,1,22,14,124,950],"Ộ":[17,28,1,23,18,167,953],"ộ":[13,24,1,19,14,145,954],"Ớ":[19,24,1,23,18,27,955],"ớ":[15,20,1,19,14,292,956],"Ờ":[19,24,1,23,18,54,958],"ờ":[15,20,1,19,14,192,958],"Ở":[19,25,1,24,18,215,958],"ở":[15,21,1,20,14,2,959],"Ỡ":[19,23,1,22,18,449,962],"ỡ":[15,19,1,18,14,268,960],"Ợ":[19,24,1,19,18,476,962],"ợ":[15,20,1,15,14,242,964],"Ụ":[14,23,2,18,17,81,966],"ụ":[12,18,1,13,14,103,966],"Ủ":[14,25,2,24,17,414,968],"ủ":[12,21,1,20,14,315,971],"Ứ":[18,24,2,23,18,335,976],"ứ":[16,20,1,19,15,361,976],"Ừ":[18,24,2,23,18,385,978],"ừ":[16,20,1,19,15,291,984],"Ử":[18,25,2,24,18,123,986],"ử":[16,21,1,20,15,25,987],"Ữ":[18,23,2,22,18,265,987],"ữ":[16,19,1,18,15,166,989],"Ự":[18,24,2,19,18,49,990],"ự":[16,20,1,15,15,190,989],"Ỳ":[14,23,0,23,13,2,988],"ỳ":[13,25,0,19,12,214,991],"Ỵ":[14,23,0,18,13,235,992],"ỵ":[13,19,0,13,12,436,993],"Ỷ":[14,24,0,24,13],"ỷ":[13,26,0,20,12],"Ỹ":[14,22,0,22,13,457,994],"ỹ":[13,24,0,18,12],"Ὅ":[22,19,-4,18,18,479,994]," ":[0,0,0,0,12]," ":[0,0,0,0,24]," ":[0,0,0,0,12]," ":[0,0,0,0,24]," ":[0,0,0,0,8]," ":[0,0,0,0,6]," ":[0,0,0,0,4]," ":[0,0,0,0,13]," ":[0,0,0,0,6]," ":[0,0,0,0,4]," ":[0,0,0,0,2],"​":[0,0,0,0,0],"–":[12,3,0,8,12,103,992],"—":[24,3,0,8,24,75,1003],"―":[24,3,0,8,24,315,1008],"‗":[11,6,-1,0,9,411,1001],"‘":[4,7,0,18,4,149,986],"’":[4,7,0,18,4,149,1001],"‚":[5,7,0,3,5,107,1003],"‛":[4,7,0,18,4,361,1004],"“":[9,7,0,18,8],"”":[9,7,0,18,8],"„":[9,7,0,4,9],"†":[10,19,1,19,12],"‡":[10,19,1,19,12],"•":[7,7,1,12,9],"…":[16,4,1,3,18,373,1010],"‰":[27,19,1,18,28],"′":[3,8,1,18,5,347,1008],"″":[8,8,1,18,9],"‹":[7,11,0,12,7],"›":[7,11,0,12,7],"‼":[9,19,1,18,11],"⁄":[13,18,-5,18,3],"⁰":[8,12,0,18,8],"⁴":[9,12,0,18,8],"⁵":[8,11,0,17,8],"⁶":[8,12,0,18,8],"⁷":[8,12,0,18,8],"⁸":[8,12,0,18,8],"⁹":[8,12,0,18,8],"ⁿ":[8,9,1,18,9],"₣":[12,18,1,18,13],"₤":[13,18,0,18,13],"₧":[17,19,1,18,18],"₫":[14,23,1,19,14],"€":[14,19,0,18,14],"℅":[18,19,1,18,19],"ℓ":[10,19,1,18,12],"№":[22,18,2,18,24],"℠":[16,10,1,18,19],"™":[17,10,0,18,18],"Ω":[18,18,0,18,18],"℮":[13,14,1,13,14],"⅛":[18,19,0,18,18],"⅜":[18,19,0,18,18],"⅝":[18,19,0,18,18],"⅞":[17,19,1,18,18],"∂":[12,19,1,18,13],"∆":[14,18,0,18,13],"∏":[14,24,2,18,17],"∑":[15,24,0,18,15],"−":[12,3,1,10,13,291,1012],"√":[15,21,0,20,13],"∞":[15,9,1,13,16],"∫":[9,25,0,19,9],"≈":[12,9,1,13,13],"≠":[12,15,1,16,13],"≤":[12,16,1,15,13],"≥":[12,16,1,15,13],"◊":[12,18,1,18,14],"ff":[18,19,0,19,16],"fi":[13,19,0,19,14],"fl":[13,19,0,19,14],"ffi":[21,19,0,19,22],"ffl":[21,19,0,19,22],"":[0,0,0,0,0],"":[24,23,0,18,24],"�":[23,23,0,19,24]}}
@klokan
Copy link
Author

klokan commented Jul 19, 2016

@xduoo
Copy link

xduoo commented Feb 14, 2017

hi, I want to know how the font png and json file generated? can you tell me ?

Your friend
xduoo@qq.com
Best wishes

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment