Skip to content

Instantly share code, notes, and snippets.

@stla
Last active December 18, 2015 23:29
Show Gist options
  • Save stla/5861876 to your computer and use it in GitHub Desktop.
Save stla/5861876 to your computer and use it in GitHub Desktop.
Preliminary version of Kantorovich in R
<!DOCTYPE html>
<!-- saved from url=(0014)about:internet -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>Using R to compute the Kantorovich distance </title>
<style type="text/css">
body, td {
font-family: sans-serif;
background-color: white;
font-size: 12px;
margin: 8px;
}
tt, code, pre {
font-family: 'DejaVu Sans Mono', 'Droid Sans Mono', 'Lucida Console', Consolas, Monaco, monospace;
}
h1 {
font-size:2.2em;
}
h2 {
font-size:1.8em;
}
h3 {
font-size:1.4em;
}
h4 {
font-size:1.0em;
}
h5 {
font-size:0.9em;
}
h6 {
font-size:0.8em;
}
a:visited {
color: rgb(50%, 0%, 50%);
}
pre {
margin-top: 0;
max-width: 95%;
border: 1px solid #ccc;
white-space: pre-wrap;
}
pre code {
display: block; padding: 0.5em;
}
code.r, code.cpp {
background-color: #F8F8F8;
}
table, td, th {
border: none;
}
blockquote {
color:#666666;
margin:0;
padding-left: 1em;
border-left: 0.5em #EEE solid;
}
hr {
height: 0px;
border-bottom: none;
border-top-width: thin;
border-top-style: dotted;
border-top-color: #999999;
}
@media print {
* {
background: transparent !important;
color: black !important;
filter:none !important;
-ms-filter: none !important;
}
body {
font-size:12pt;
max-width:100%;
}
a, a:visited {
text-decoration: underline;
}
hr {
visibility: hidden;
page-break-before: always;
}
pre, blockquote {
padding-right: 1em;
page-break-inside: avoid;
}
tr, img {
page-break-inside: avoid;
}
img {
max-width: 100% !important;
}
@page :left {
margin: 15mm 20mm 15mm 10mm;
}
@page :right {
margin: 15mm 10mm 15mm 20mm;
}
p, h2, h3 {
orphans: 3; widows: 3;
}
h2, h3 {
page-break-after: avoid;
}
}
</style>
<!-- Styles for R syntax highlighter -->
<style type="text/css">
pre .operator,
pre .paren {
color: rgb(104, 118, 135)
}
pre .literal {
color: rgb(88, 72, 246)
}
pre .number {
color: rgb(0, 0, 205);
}
pre .comment {
color: rgb(76, 136, 107);
}
pre .keyword {
color: rgb(0, 0, 255);
}
pre .identifier {
color: rgb(0, 0, 0);
}
pre .string {
color: rgb(3, 106, 7);
}
</style>
<!-- R syntax highlighter -->
<script type="text/javascript">
var hljs=new function(){function m(p){return p.replace(/&/gm,"&amp;").replace(/</gm,"&lt;")}function f(r,q,p){return RegExp(q,"m"+(r.cI?"i":"")+(p?"g":""))}function b(r){for(var p=0;p<r.childNodes.length;p++){var q=r.childNodes[p];if(q.nodeName=="CODE"){return q}if(!(q.nodeType==3&&q.nodeValue.match(/\s+/))){break}}}function h(t,s){var p="";for(var r=0;r<t.childNodes.length;r++){if(t.childNodes[r].nodeType==3){var q=t.childNodes[r].nodeValue;if(s){q=q.replace(/\n/g,"")}p+=q}else{if(t.childNodes[r].nodeName=="BR"){p+="\n"}else{p+=h(t.childNodes[r])}}}if(/MSIE [678]/.test(navigator.userAgent)){p=p.replace(/\r/g,"\n")}return p}function a(s){var r=s.className.split(/\s+/);r=r.concat(s.parentNode.className.split(/\s+/));for(var q=0;q<r.length;q++){var p=r[q].replace(/^language-/,"");if(e[p]){return p}}}function c(q){var p=[];(function(s,t){for(var r=0;r<s.childNodes.length;r++){if(s.childNodes[r].nodeType==3){t+=s.childNodes[r].nodeValue.length}else{if(s.childNodes[r].nodeName=="BR"){t+=1}else{if(s.childNodes[r].nodeType==1){p.push({event:"start",offset:t,node:s.childNodes[r]});t=arguments.callee(s.childNodes[r],t);p.push({event:"stop",offset:t,node:s.childNodes[r]})}}}}return t})(q,0);return p}function k(y,w,x){var q=0;var z="";var s=[];function u(){if(y.length&&w.length){if(y[0].offset!=w[0].offset){return(y[0].offset<w[0].offset)?y:w}else{return w[0].event=="start"?y:w}}else{return y.length?y:w}}function t(D){var A="<"+D.nodeName.toLowerCase();for(var B=0;B<D.attributes.length;B++){var C=D.attributes[B];A+=" "+C.nodeName.toLowerCase();if(C.value!==undefined&&C.value!==false&&C.value!==null){A+='="'+m(C.value)+'"'}}return A+">"}while(y.length||w.length){var v=u().splice(0,1)[0];z+=m(x.substr(q,v.offset-q));q=v.offset;if(v.event=="start"){z+=t(v.node);s.push(v.node)}else{if(v.event=="stop"){var p,r=s.length;do{r--;p=s[r];z+=("</"+p.nodeName.toLowerCase()+">")}while(p!=v.node);s.splice(r,1);while(r<s.length){z+=t(s[r]);r++}}}}return z+m(x.substr(q))}function j(){function q(x,y,v){if(x.compiled){return}var u;var s=[];if(x.k){x.lR=f(y,x.l||hljs.IR,true);for(var w in x.k){if(!x.k.hasOwnProperty(w)){continue}if(x.k[w] instanceof Object){u=x.k[w]}else{u=x.k;w="keyword"}for(var r in u){if(!u.hasOwnProperty(r)){continue}x.k[r]=[w,u[r]];s.push(r)}}}if(!v){if(x.bWK){x.b="\\b("+s.join("|")+")\\s"}x.bR=f(y,x.b?x.b:"\\B|\\b");if(!x.e&&!x.eW){x.e="\\B|\\b"}if(x.e){x.eR=f(y,x.e)}}if(x.i){x.iR=f(y,x.i)}if(x.r===undefined){x.r=1}if(!x.c){x.c=[]}x.compiled=true;for(var t=0;t<x.c.length;t++){if(x.c[t]=="self"){x.c[t]=x}q(x.c[t],y,false)}if(x.starts){q(x.starts,y,false)}}for(var p in e){if(!e.hasOwnProperty(p)){continue}q(e[p].dM,e[p],true)}}function d(B,C){if(!j.called){j();j.called=true}function q(r,M){for(var L=0;L<M.c.length;L++){if((M.c[L].bR.exec(r)||[null])[0]==r){return M.c[L]}}}function v(L,r){if(D[L].e&&D[L].eR.test(r)){return 1}if(D[L].eW){var M=v(L-1,r);return M?M+1:0}return 0}function w(r,L){return L.i&&L.iR.test(r)}function K(N,O){var M=[];for(var L=0;L<N.c.length;L++){M.push(N.c[L].b)}var r=D.length-1;do{if(D[r].e){M.push(D[r].e)}r--}while(D[r+1].eW);if(N.i){M.push(N.i)}return f(O,M.join("|"),true)}function p(M,L){var N=D[D.length-1];if(!N.t){N.t=K(N,E)}N.t.lastIndex=L;var r=N.t.exec(M);return r?[M.substr(L,r.index-L),r[0],false]:[M.substr(L),"",true]}function z(N,r){var L=E.cI?r[0].toLowerCase():r[0];var M=N.k[L];if(M&&M instanceof Array){return M}return false}function F(L,P){L=m(L);if(!P.k){return L}var r="";var O=0;P.lR.lastIndex=0;var M=P.lR.exec(L);while(M){r+=L.substr(O,M.index-O);var N=z(P,M);if(N){x+=N[1];r+='<span class="'+N[0]+'">'+M[0]+"</span>"}else{r+=M[0]}O=P.lR.lastIndex;M=P.lR.exec(L)}return r+L.substr(O,L.length-O)}function J(L,M){if(M.sL&&e[M.sL]){var r=d(M.sL,L);x+=r.keyword_count;return r.value}else{return F(L,M)}}function I(M,r){var L=M.cN?'<span class="'+M.cN+'">':"";if(M.rB){y+=L;M.buffer=""}else{if(M.eB){y+=m(r)+L;M.buffer=""}else{y+=L;M.buffer=r}}D.push(M);A+=M.r}function G(N,M,Q){var R=D[D.length-1];if(Q){y+=J(R.buffer+N,R);return false}var P=q(M,R);if(P){y+=J(R.buffer+N,R);I(P,M);return P.rB}var L=v(D.length-1,M);if(L){var O=R.cN?"</span>":"";if(R.rE){y+=J(R.buffer+N,R)+O}else{if(R.eE){y+=J(R.buffer+N,R)+O+m(M)}else{y+=J(R.buffer+N+M,R)+O}}while(L>1){O=D[D.length-2].cN?"</span>":"";y+=O;L--;D.length--}var r=D[D.length-1];D.length--;D[D.length-1].buffer="";if(r.starts){I(r.starts,"")}return R.rE}if(w(M,R)){throw"Illegal"}}var E=e[B];var D=[E.dM];var A=0;var x=0;var y="";try{var s,u=0;E.dM.buffer="";do{s=p(C,u);var t=G(s[0],s[1],s[2]);u+=s[0].length;if(!t){u+=s[1].length}}while(!s[2]);if(D.length>1){throw"Illegal"}return{r:A,keyword_count:x,value:y}}catch(H){if(H=="Illegal"){return{r:0,keyword_count:0,value:m(C)}}else{throw H}}}function g(t){var p={keyword_count:0,r:0,value:m(t)};var r=p;for(var q in e){if(!e.hasOwnProperty(q)){continue}var s=d(q,t);s.language=q;if(s.keyword_count+s.r>r.keyword_count+r.r){r=s}if(s.keyword_count+s.r>p.keyword_count+p.r){r=p;p=s}}if(r.language){p.second_best=r}return p}function i(r,q,p){if(q){r=r.replace(/^((<[^>]+>|\t)+)/gm,function(t,w,v,u){return w.replace(/\t/g,q)})}if(p){r=r.replace(/\n/g,"<br>")}return r}function n(t,w,r){var x=h(t,r);var v=a(t);var y,s;if(v){y=d(v,x)}else{return}var q=c(t);if(q.length){s=document.createElement("pre");s.innerHTML=y.value;y.value=k(q,c(s),x)}y.value=i(y.value,w,r);var u=t.className;if(!u.match("(\\s|^)(language-)?"+v+"(\\s|$)")){u=u?(u+" "+v):v}if(/MSIE [678]/.test(navigator.userAgent)&&t.tagName=="CODE"&&t.parentNode.tagName=="PRE"){s=t.parentNode;var p=document.createElement("div");p.innerHTML="<pre><code>"+y.value+"</code></pre>";t=p.firstChild.firstChild;p.firstChild.cN=s.cN;s.parentNode.replaceChild(p.firstChild,s)}else{t.innerHTML=y.value}t.className=u;t.result={language:v,kw:y.keyword_count,re:y.r};if(y.second_best){t.second_best={language:y.second_best.language,kw:y.second_best.keyword_count,re:y.second_best.r}}}function o(){if(o.called){return}o.called=true;var r=document.getElementsByTagName("pre");for(var p=0;p<r.length;p++){var q=b(r[p]);if(q){n(q,hljs.tabReplace)}}}function l(){if(window.addEventListener){window.addEventListener("DOMContentLoaded",o,false);window.addEventListener("load",o,false)}else{if(window.attachEvent){window.attachEvent("onload",o)}else{window.onload=o}}}var e={};this.LANGUAGES=e;this.highlight=d;this.highlightAuto=g;this.fixMarkup=i;this.highlightBlock=n;this.initHighlighting=o;this.initHighlightingOnLoad=l;this.IR="[a-zA-Z][a-zA-Z0-9_]*";this.UIR="[a-zA-Z_][a-zA-Z0-9_]*";this.NR="\\b\\d+(\\.\\d+)?";this.CNR="\\b(0[xX][a-fA-F0-9]+|(\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)";this.BNR="\\b(0b[01]+)";this.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|\\.|-|-=|/|/=|:|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~";this.ER="(?![\\s\\S])";this.BE={b:"\\\\.",r:0};this.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[this.BE],r:0};this.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[this.BE],r:0};this.CLCM={cN:"comment",b:"//",e:"$"};this.CBLCLM={cN:"comment",b:"/\\*",e:"\\*/"};this.HCM={cN:"comment",b:"#",e:"$"};this.NM={cN:"number",b:this.NR,r:0};this.CNM={cN:"number",b:this.CNR,r:0};this.BNM={cN:"number",b:this.BNR,r:0};this.inherit=function(r,s){var p={};for(var q in r){p[q]=r[q]}if(s){for(var q in s){p[q]=s[q]}}return p}}();hljs.LANGUAGES.cpp=function(){var a={keyword:{"false":1,"int":1,"float":1,"while":1,"private":1,"char":1,"catch":1,"export":1,virtual:1,operator:2,sizeof:2,dynamic_cast:2,typedef:2,const_cast:2,"const":1,struct:1,"for":1,static_cast:2,union:1,namespace:1,unsigned:1,"long":1,"throw":1,"volatile":2,"static":1,"protected":1,bool:1,template:1,mutable:1,"if":1,"public":1,friend:2,"do":1,"return":1,"goto":1,auto:1,"void":2,"enum":1,"else":1,"break":1,"new":1,extern:1,using:1,"true":1,"class":1,asm:1,"case":1,typeid:1,"short":1,reinterpret_cast:2,"default":1,"double":1,register:1,explicit:1,signed:1,typename:1,"try":1,"this":1,"switch":1,"continue":1,wchar_t:1,inline:1,"delete":1,alignof:1,char16_t:1,char32_t:1,constexpr:1,decltype:1,noexcept:1,nullptr:1,static_assert:1,thread_local:1,restrict:1,_Bool:1,complex:1},built_in:{std:1,string:1,cin:1,cout:1,cerr:1,clog:1,stringstream:1,istringstream:1,ostringstream:1,auto_ptr:1,deque:1,list:1,queue:1,stack:1,vector:1,map:1,set:1,bitset:1,multiset:1,multimap:1,unordered_set:1,unordered_map:1,unordered_multiset:1,unordered_multimap:1,array:1,shared_ptr:1}};return{dM:{k:a,i:"</",c:[hljs.CLCM,hljs.CBLCLM,hljs.QSM,{cN:"string",b:"'\\\\?.",e:"'",i:"."},{cN:"number",b:"\\b(\\d+(\\.\\d*)?|\\.\\d+)(u|U|l|L|ul|UL|f|F)"},hljs.CNM,{cN:"preprocessor",b:"#",e:"$"},{cN:"stl_container",b:"\\b(deque|list|queue|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\s*<",e:">",k:a,r:10,c:["self"]}]}}}();hljs.LANGUAGES.r={dM:{c:[hljs.HCM,{cN:"number",b:"\\b0[xX][0-9a-fA-F]+[Li]?\\b",e:hljs.IMMEDIATE_RE,r:0},{cN:"number",b:"\\b\\d+(?:[eE][+\\-]?\\d*)?L\\b",e:hljs.IMMEDIATE_RE,r:0},{cN:"number",b:"\\b\\d+\\.(?!\\d)(?:i\\b)?",e:hljs.IMMEDIATE_RE,r:1},{cN:"number",b:"\\b\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d*)?i?\\b",e:hljs.IMMEDIATE_RE,r:0},{cN:"number",b:"\\.\\d+(?:[eE][+\\-]?\\d*)?i?\\b",e:hljs.IMMEDIATE_RE,r:1},{cN:"keyword",b:"(?:tryCatch|library|setGeneric|setGroupGeneric)\\b",e:hljs.IMMEDIATE_RE,r:10},{cN:"keyword",b:"\\.\\.\\.",e:hljs.IMMEDIATE_RE,r:10},{cN:"keyword",b:"\\.\\.\\d+(?![\\w.])",e:hljs.IMMEDIATE_RE,r:10},{cN:"keyword",b:"\\b(?:function)",e:hljs.IMMEDIATE_RE,r:2},{cN:"keyword",b:"(?:if|in|break|next|repeat|else|for|return|switch|while|try|stop|warning|require|attach|detach|source|setMethod|setClass)\\b",e:hljs.IMMEDIATE_RE,r:1},{cN:"literal",b:"(?:NA|NA_integer_|NA_real_|NA_character_|NA_complex_)\\b",e:hljs.IMMEDIATE_RE,r:10},{cN:"literal",b:"(?:NULL|TRUE|FALSE|T|F|Inf|NaN)\\b",e:hljs.IMMEDIATE_RE,r:1},{cN:"identifier",b:"[a-zA-Z.][a-zA-Z0-9._]*\\b",e:hljs.IMMEDIATE_RE,r:0},{cN:"operator",b:"<\\-(?!\\s*\\d)",e:hljs.IMMEDIATE_RE,r:2},{cN:"operator",b:"\\->|<\\-",e:hljs.IMMEDIATE_RE,r:1},{cN:"operator",b:"%%|~",e:hljs.IMMEDIATE_RE},{cN:"operator",b:">=|<=|==|!=|\\|\\||&&|=|\\+|\\-|\\*|/|\\^|>|<|!|&|\\||\\$|:",e:hljs.IMMEDIATE_RE,r:0},{cN:"operator",b:"%",e:"%",i:"\\n",r:1},{cN:"identifier",b:"`",e:"`",r:0},{cN:"string",b:'"',e:'"',c:[hljs.BE],r:0},{cN:"string",b:"'",e:"'",c:[hljs.BE],r:0},{cN:"paren",b:"[[({\\])}]",e:hljs.IMMEDIATE_RE,r:0}]}};
hljs.initHighlightingOnLoad();
</script>
<!-- MathJax scripts -->
<script type="text/javascript" src="https://c328740.ssl.cf1.rackcdn.com/mathjax/2.0-latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
</script>
</head>
<body>
<h1>Using R to compute the Kantorovich distance </h1>
<p>The Kantorovich distance between two probability measures \(\mu\) and \(\nu\) on a finite set \(A\) equipped with a metric \(d\) is defined as
\[d'(\mu,\nu)=
\min_{\Lambda \in {\cal J}(\mu, \nu)} \int d(x,y)\textrm{d}\Lambda(x,y) \]
where \({\cal J}(\mu, \nu)\) is the set of all joinings of \(\mu\) and \(\nu\), that is, the set of all probability measures \(\Lambda\) on \(A \times A\) whose margins
are \(\mu\) and \(\nu\). </p>
<p>The Kantorovich distance can also be defined for more general metric spaces
\((A,d)\) but our purpose is to show how to compute the Kantorovich distance in R when \(A\) is finite. </p>
<p>Actually the main part of the work will be to get the <em>extreme points</em> of
the set of joinings \({\cal J}(\mu, \nu)\).
Indeed,
this set has a convex structure and the numerical application
\[{\cal J}(\mu, \nu) \ni \Lambda \mapsto \int d(x,y)\textrm{d}\Lambda(x,y)\]
is linear.
Therefore, any extremal value of this application,
in particular the Kantorovich distance \(d'(\mu,\nu)\),
is attained by an extreme joining \(\Lambda \in {\cal J}(\mu, \nu)\).
This latter point will be explained below, and we will also see
that \({\cal J}(\mu, \nu)\) is a <em>convex polyhedron</em>. </p>
<h2>Computing extreme joinings in R</h2>
<p>What is an extreme joining in \({\cal J}(\mu, \nu)\) ?
First of all, what is a joining in \({\cal J}(\mu, \nu)\) ?
Consider for instance \(A=\{a_1,a_2,a_3\}\) then a joining of \(\mu\) and \(\nu\) is
given by a matrix
\[P=\begin{pmatrix}
p_{11} & p_{12} & p_{13} \\
p_{21} & p_{22} & p_{23} \\
p_{31} & p_{32} & p_{33}
\end{pmatrix}\]
whose \((i,j)\)-th entry \(p_{ij}\) is the probability
\(p_{ij}=\Pr(X=i,Y=j)\) where \(X \sim \mu\) and \(Y \sim \nu\) are random variables on \(A\).
Given a distance \(d\) on \(A\),
the Kantorovich distance \(d'(\mu,\nu)\) is then the minimal possible value
of the mean distance \(\mathbb{E}[d(X,Y)]\) between \(X\) and \(Y\).
Note that \(\mathbb{E}[d(X,Y)]=\Pr(X \neq Y)\) when taking \(d\) as the
discrete \(0-1\) distance on \(A\). </p>
<h3>The \(H\)-representation of \({\cal J}(\mu, \nu)\)</h3>
<p>The possible values of the \(p_{ij}\) satisfy the following three sets of
linear equality/inequality constraints:
\[\begin{cases}
{\rm (1a) } \quad \sum_j p_{ij} = \mu(a_i) & \forall i \\
{\rm (1b) } \quad \sum_i p_{ij} = \nu(a_j) & \forall j \\
{\rm (2) } \quad p_{ij} \geq 0 & \forall i,j
\end{cases}.\]
Considering \(P\) written in stacked form :
\[P={\begin{pmatrix}
p_{11} & p_{12} & p_{13} &
p_{21} & p_{22} & p_{23} &
p_{31} & p_{32} & p_{33}
\end{pmatrix}}&lsquo;\]
then the first set \({\rm (1a)}\) of linear equality constraints is \(M_1 P = 0\) with
\[ M_1 = \begin{pmatrix}
1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\
0 & 0 & 0 & 1 & 1 & 1 & 0 & 0 & 0 \\
0 & 0 & 0 & 0 & 0 & 0 & 1 & 1 & 1
\end{pmatrix} \]
and the second set \({\rm (1b)}\) of linear equality constraints is \(M_2 P = 0\) with
\[ M_2 = \begin{pmatrix}
1 & 0 & 0 & 1 & 0 & 0 & 1 & 0 & 0 \\
0 & 1 & 0 & 0 & 1 & 0 & 0 & 1 & 0 \\
0 & 0 & 1 & 0 & 0 & 1 & 0 & 0 & 1
\end{pmatrix}. \]</p>
<p>With the terminology of the <a href="http://web.mit.edu/sage/export/tmp/cddlib-094b/doc/cddlibman.pdf">cddlibb library</a>, \({\cal J}(\mu, \nu)\) is a <em>convex polyhedron</em> and the linear constraints above define its <em>H-representation</em>.
Schematically, one can imagine \({\cal J}(\mu, \nu)\) as a convex polyhedra embedded in a higher dimensional space:</p>
<script src="http://data.over-blog-kiwi.com/0/26/54/14/201303/ob_b160da4168843e0be0e6cd05efa0f482_canvasmatrix.js" type="text/javascript"></script>
<p><canvas id="unnamed_chunk_1textureCanvas" style="display: none;" width="256" height="256">
<img src="data:image/png;base64,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" alt="unnamed_chunk_1snapshot" width=505/><br>
Your browser does not support the HTML5 canvas element.</canvas></p>
<!-- ****** points object 42 ****** -->
<script id="unnamed_chunk_1vshader42" type="x-shader/x-vertex">
attribute vec3 aPos;
attribute vec4 aCol;
uniform mat4 mvMatrix;
uniform mat4 prMatrix;
varying vec4 vDiffuse;
void main(void) {
gl_Position = prMatrix * mvMatrix * vec4(aPos, 1.);
gl_PointSize = 3.;
vDiffuse = aCol;
}
</script>
<script id="unnamed_chunk_1fshader42" type="x-shader/x-fragment">
#ifdef GL_ES
precision highp float;
#endif
varying vec4 vDiffuse; // carries alpha
void main(void) {
vec4 diffuse;
diffuse = vDiffuse;
gl_FragColor = diffuse;
}
</script>
<!-- ****** quads object 43 ****** -->
<script id="unnamed_chunk_1vshader43" type="x-shader/x-vertex">
attribute vec3 aPos;
attribute vec4 aCol;
uniform mat4 mvMatrix;
uniform mat4 prMatrix;
varying vec4 vDiffuse;
attribute vec3 aNorm;
uniform mat4 normMatrix;
varying vec3 vNormal;
const vec3 diffuse = vec3(1., 1., 1.); // light only
void main(void) {
gl_Position = prMatrix * mvMatrix * vec4(aPos, 1.);
vDiffuse = vec4(aCol.rgb * diffuse, aCol.a);
vNormal = normalize((normMatrix * vec4(aNorm, 1.)).xyz);
}
</script>
<script id="unnamed_chunk_1fshader43" type="x-shader/x-fragment">
#ifdef GL_ES
precision highp float;
#endif
varying vec4 vDiffuse; // carries alpha
const vec3 ambient_plus_emission = vec3(0., 0., 0.);
const vec3 specular = vec3(1., 1., 1.);// light*material
const float shininess = 50.;
const vec3 lightDir = vec3(0., 0., 1.);
const vec3 halfVec = vec3(0., 0., 1.);
const vec3 eye = vec3(0., 0., 1.);
varying vec3 vNormal;
void main(void) {
vec4 diffuse;
vec3 n = normalize(vNormal);
vec3 col = ambient_plus_emission;
n = -faceforward(n, n, eye);
float nDotL = dot(n, lightDir);
col = col + max(nDotL, 0.) * vDiffuse.rgb;
col = col + pow(max(dot(halfVec, n), 0.), shininess) * specular;
diffuse = vec4(col, vDiffuse.a);
gl_FragColor = diffuse;
}
</script>
<script type="text/javascript">
function getShader ( gl, id ){
var shaderScript = document.getElementById ( id );
var str = "";
var k = shaderScript.firstChild;
while ( k ){
if ( k.nodeType == 3 ) str += k.textContent;
k = k.nextSibling;
}
var shader;
if ( shaderScript.type == "x-shader/x-fragment" )
shader = gl.createShader ( gl.FRAGMENT_SHADER );
else if ( shaderScript.type == "x-shader/x-vertex" )
shader = gl.createShader(gl.VERTEX_SHADER);
else return null;
gl.shaderSource(shader, str);
gl.compileShader(shader);
if (gl.getShaderParameter(shader, gl.COMPILE_STATUS) == 0)
alert(gl.getShaderInfoLog(shader));
return shader;
}
var min = Math.min;
var max = Math.max;
var sqrt = Math.sqrt;
var sin = Math.sin;
var acos = Math.acos;
var tan = Math.tan;
var SQRT2 = Math.SQRT2;
var PI = Math.PI;
var log = Math.log;
var exp = Math.exp;
function unnamed_chunk_1webGLStart() {
var debug = function(msg) {
document.getElementById("unnamed_chunk_1debug").innerHTML = msg;
}
debug("");
var canvas = document.getElementById("unnamed_chunk_1canvas");
if (!window.WebGLRenderingContext){
debug("<img src=\"unnamed_chunk_1snapshot.png\" alt=\"unnamed_chunk_1snapshot\" width=505/><br> Your browser does not support WebGL. See <a href=\"http://get.webgl.org\">http://get.webgl.org</a>");
return;
}
var gl;
try {
// Try to grab the standard context. If it fails, fallback to experimental.
gl = canvas.getContext("webgl")
|| canvas.getContext("experimental-webgl");
}
catch(e) {}
if ( !gl ) {
debug("<img src=\"unnamed_chunk_1snapshot.png\" alt=\"unnamed_chunk_1snapshot\" width=505/><br> Your browser appears to support WebGL, but did not create a WebGL context. See <a href=\"http://get.webgl.org\">http://get.webgl.org</a>");
return;
}
var width = 505; var height = 505;
canvas.width = width; canvas.height = height;
gl.viewport(0, 0, width, height);
var prMatrix = new CanvasMatrix4();
var mvMatrix = new CanvasMatrix4();
var normMatrix = new CanvasMatrix4();
var saveMat = new CanvasMatrix4();
saveMat.makeIdentity();
var distance;
var zoom = 1;
var fov = 30;
var userMatrix = new CanvasMatrix4();
userMatrix.load([
1, 0, 0, 0,
0, 0.3420201, -0.9396926, 0,
0, 0.9396926, 0.3420201, 0,
0, 0, 0, 1
]);
function getPowerOfTwo(value) {
var pow = 1;
while(pow<value) {
pow *= 2;
}
return pow;
}
function handleLoadedTexture(texture, textureCanvas) {
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, textureCanvas);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_NEAREST);
gl.generateMipmap(gl.TEXTURE_2D);
gl.bindTexture(gl.TEXTURE_2D, null);
}
function loadImageToTexture(filename, texture) {
var canvas = document.getElementById("unnamed_chunk_1textureCanvas");
var ctx = canvas.getContext("2d");
var image = new Image();
image.onload = function() {
var w = image.width;
var h = image.height;
var canvasX = getPowerOfTwo(w);
var canvasY = getPowerOfTwo(h);
canvas.width = canvasX;
canvas.height = canvasY;
ctx.imageSmoothingEnabled = true;
ctx.drawImage(image, 0, 0, canvasX, canvasY);
handleLoadedTexture(texture, canvas);
drawScene();
}
image.src = filename;
}
// ****** points object 42 ******
var prog42 = gl.createProgram();
gl.attachShader(prog42, getShader( gl, "unnamed_chunk_1vshader42" ));
gl.attachShader(prog42, getShader( gl, "unnamed_chunk_1fshader42" ));
gl.linkProgram(prog42);
var v=new Float32Array([
0, 0, 0,
-1, 4, 0,
4, 9, 0,
6, 3, 0
]);
var posLoc42 = gl.getAttribLocation(prog42, "aPos");
var colLoc42 = gl.getAttribLocation(prog42, "aCol");
var buf42 = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, buf42);
gl.bufferData(gl.ARRAY_BUFFER, v, gl.STATIC_DRAW);
var mvMatLoc42 = gl.getUniformLocation(prog42,"mvMatrix");
var prMatLoc42 = gl.getUniformLocation(prog42,"prMatrix");
// ****** quads object 43 ******
var prog43 = gl.createProgram();
gl.attachShader(prog43, getShader( gl, "unnamed_chunk_1vshader43" ));
gl.attachShader(prog43, getShader( gl, "unnamed_chunk_1fshader43" ));
gl.linkProgram(prog43);
var v=new Float32Array([
0, 0, 0, 0, 0, -1,
-1, 4, 0, 0, 0, -1,
4, 9, 0, 0, 0, -1,
6, 3, 0, 0, 0, -1
]);
var posLoc43 = gl.getAttribLocation(prog43, "aPos");
var colLoc43 = gl.getAttribLocation(prog43, "aCol");
var normLoc43 = gl.getAttribLocation(prog43, "aNorm");
var f=new Uint16Array([
0, 1, 2, 0, 2, 3
]);
var buf43 = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, buf43);
gl.bufferData(gl.ARRAY_BUFFER, v, gl.STATIC_DRAW);
var ibuf43 = gl.createBuffer();
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, ibuf43);
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, f, gl.STATIC_DRAW);
var mvMatLoc43 = gl.getUniformLocation(prog43,"mvMatrix");
var prMatLoc43 = gl.getUniformLocation(prog43,"prMatrix");
var normMatLoc43 = gl.getUniformLocation(prog43,"normMatrix");
gl.enable(gl.DEPTH_TEST);
gl.depthFunc(gl.LEQUAL);
gl.clearDepth(1.0);
gl.clearColor(1, 1, 1, 1);
var xOffs = yOffs = 0, drag = 0;
drawScene();
function drawScene(){
gl.depthMask(true);
gl.disable(gl.BLEND);
var radius = 6.270965;
var s = sin(fov*PI/360);
var t = tan(fov*PI/360);
var distance = radius/s;
var near = distance - radius;
var far = distance + radius;
var hlen = t*near;
var aspect = width/height;
prMatrix.makeIdentity();
if (aspect > 1)
prMatrix.frustum(-hlen*aspect*zoom, hlen*aspect*zoom,
-hlen*zoom, hlen*zoom, near, far);
else
prMatrix.frustum(-hlen*zoom, hlen*zoom,
-hlen*zoom/aspect, hlen*zoom/aspect,
near, far);
mvMatrix.makeIdentity();
mvMatrix.translate( -2.5, -4.5, -0 );
mvMatrix.scale( 1, 1, 1 );
mvMatrix.multRight( userMatrix );
mvMatrix.translate(0, 0, -distance);
normMatrix.makeIdentity();
normMatrix.scale( 1, 1, 1 );
normMatrix.multRight( userMatrix );
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
// ****** points object 42 *******
gl.useProgram(prog42);
gl.bindBuffer(gl.ARRAY_BUFFER, buf42);
gl.uniformMatrix4fv( prMatLoc42, false, new Float32Array(prMatrix.getAsArray()) );
gl.uniformMatrix4fv( mvMatLoc42, false, new Float32Array(mvMatrix.getAsArray()) );
gl.enableVertexAttribArray( posLoc42 );
gl.disableVertexAttribArray( colLoc42 );
gl.vertexAttrib4f( colLoc42, 1, 0, 0, 1 );
gl.vertexAttribPointer(posLoc42, 3, gl.FLOAT, false, 12, 0);
gl.drawArrays(gl.POINTS, 0, 4);
// ****** quads object 43 *******
gl.useProgram(prog43);
gl.bindBuffer(gl.ARRAY_BUFFER, buf43);
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, ibuf43);
gl.uniformMatrix4fv( prMatLoc43, false, new Float32Array(prMatrix.getAsArray()) );
gl.uniformMatrix4fv( mvMatLoc43, false, new Float32Array(mvMatrix.getAsArray()) );
gl.uniformMatrix4fv( normMatLoc43, false, new Float32Array(normMatrix.getAsArray()) );
gl.enableVertexAttribArray( posLoc43 );
gl.disableVertexAttribArray( colLoc43 );
gl.vertexAttrib4f( colLoc43, 0, 1, 0, 1 );
gl.enableVertexAttribArray( normLoc43 );
gl.vertexAttribPointer(normLoc43, 3, gl.FLOAT, false, 24, 12);
gl.vertexAttribPointer(posLoc43, 3, gl.FLOAT, false, 24, 0);
gl.drawElements(gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0);
gl.flush ();
}
var vlen = function(v) {
return sqrt(v[0]*v[0] + v[1]*v[1] + v[2]*v[2])
}
var xprod = function(a, b) {
return [a[1]*b[2] - a[2]*b[1],
a[2]*b[0] - a[0]*b[2],
a[0]*b[1] - a[1]*b[0]];
}
var screenToVector = function(x, y) {
var radius = max(width, height)/2.0;
var cx = width/2.0;
var cy = height/2.0;
var px = (x-cx)/radius;
var py = (y-cy)/radius;
var plen = sqrt(px*px+py*py);
if (plen > 1.e-6) {
px = px/plen;
py = py/plen;
}
var angle = (SQRT2 - plen)/SQRT2*PI/2;
var z = sin(angle);
var zlen = sqrt(1.0 - z*z);
px = px * zlen;
py = py * zlen;
return [px, py, z];
}
var rotBase;
var trackballdown = function(x,y) {
rotBase = screenToVector(x, y);
saveMat.load(userMatrix);
}
var trackballmove = function(x,y) {
var rotCurrent = screenToVector(x,y);
var dot = rotBase[0]*rotCurrent[0] +
rotBase[1]*rotCurrent[1] +
rotBase[2]*rotCurrent[2];
var angle = acos( dot/vlen(rotBase)/vlen(rotCurrent) )*180./PI;
var axis = xprod(rotBase, rotCurrent);
userMatrix.load(saveMat);
userMatrix.rotate(angle, axis[0], axis[1], axis[2]);
drawScene();
}
var y0zoom = 0;
var zoom0 = 1;
var zoomdown = function(x, y) {
y0zoom = y;
zoom0 = log(zoom);
}
var zoommove = function(x, y) {
zoom = exp(zoom0 + (y-y0zoom)/height);
drawScene();
}
var y0fov = 0;
var fov0 = 1;
var fovdown = function(x, y) {
y0fov = y;
fov0 = fov;
}
var fovmove = function(x, y) {
fov = max(1, min(179, fov0 + 180*(y-y0fov)/height));
drawScene();
}
var mousedown = [trackballdown, zoomdown, fovdown];
var mousemove = [trackballmove, zoommove, fovmove];
function relMouseCoords(event){
var totalOffsetX = 0;
var totalOffsetY = 0;
var currentElement = canvas;
do{
totalOffsetX += currentElement.offsetLeft;
totalOffsetY += currentElement.offsetTop;
}
while(currentElement = currentElement.offsetParent)
var canvasX = event.pageX - totalOffsetX;
var canvasY = event.pageY - totalOffsetY;
return {x:canvasX, y:canvasY}
}
canvas.onmousedown = function ( ev ){
if (!ev.which) // Use w3c defns in preference to MS
switch (ev.button) {
case 0: ev.which = 1; break;
case 1:
case 4: ev.which = 2; break;
case 2: ev.which = 3;
}
drag = ev.which;
var f = mousedown[drag-1];
if (f) {
var coords = relMouseCoords(ev);
f(coords.x, height-coords.y);
ev.preventDefault();
}
}
canvas.onmouseup = function ( ev ){
drag = 0;
}
canvas.onmouseout = canvas.onmouseup;
canvas.onmousemove = function ( ev ){
if ( drag == 0 ) return;
var f = mousemove[drag-1];
if (f) {
var coords = relMouseCoords(ev);
f(coords.x, height-coords.y);
}
}
var wheelHandler = function(ev) {
var del = 1.1;
if (ev.shiftKey) del = 1.01;
var ds = ((ev.detail || ev.wheelDelta) > 0) ? del : (1 / del);
zoom *= ds;
drawScene();
ev.preventDefault();
};
canvas.addEventListener("DOMMouseScroll", wheelHandler, false);
canvas.addEventListener("mousewheel", wheelHandler, false);
}
</script>
<p><canvas id="unnamed_chunk_1canvas" width="1" height="1"></canvas> </p>
<p id="unnamed_chunk_1debug">
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAfgAAAH4CAIAAAApSmgoAAAAHXRFWHRTb2Z0d2FyZQBSL1JHTCBwYWNrYWdlL2xpYnBuZ7GveO8AAAsySURBVHic7d1RjhvHAUXR2WX2vxIFyTiOLEvykOzmI2+fg7cAoqvqYqAffXwDIO1j/QMAOJfQA8QJPUCc0APECT1AnNADxAk9QJzQA8QJPUCc0APECT1AnNADxAk9QJzQA8QJPUCc0APECT1AnNADxAk9QJzQA8QJPUCc0APECT1AnNADxAk9QJzQA8QJPUCc0APECT1AnNADxAk9QJzQA8QJPUCc0APECT1AnNADxAk9QJzQA8QJPUCc0APECT1AnNADxAk9QJzQA8QJPUCc0APECT1AnNADxAk9QJzQA8QJPUCc0APECT1AnNADxAk9QJzQA8QJPUCc0APECT1AnNADxAk9QJzQA8QJPUCc0APECT1AnNADxAk9QJzQA8QJPUCc0APECT1AnNADxAk9QJzQA8QJPUCc0APECT1AnNADxAk9QJzQA8QJPUCc0APECT1AnNADxAk9QJzQA8QJPUCc0APECT1AnNADxAk9QJzQA8QJPUCc0APECT1AnNADxAk9QJzQA8QJPUCc0APECT1AnNADxAk9QJzQA8QJPUCc0APECT1AnNADxAk9QJzQA8QJPUCc0APECT1AnNADxAk9QJzQA8QJPUCc0APECT1AnNADxAk9QJzQA8QJPUCc0APECT1AnNADxAk9QJzQA8QJPUCc0APECT1AnNADxAk9QJzQA8QJPUCc0APECT1AnNADxAk9QJzQA8QJPUCc0APECT1AnNADxAk9QJzQA8QJPUCc0APECT1AnNADxAk9QJzQA8QJPUCc0APECT1AnNADxAk9QJzQA8QJPUCc0APECT1AnNADxAk9QJzQA8QJPUCc0APECT1AnNADxAk9QJzQA8QJPUCc0APECT1AnNADxAk9QJzQA8QJPUCc0APECT1AnNADxAk9QJzQA8QJPUCc0APECT1AnNADxAk9QJzQA8QJPUCc0APECT1AnNADxAk9QJzQA8QJPbySj48/Bsdxn+CVCD0ncJ/ghXz86+Nz6x9CivsEY3/G/YetfxcdLhNs/KrvWs/h3CR4qq/0Xe45ljsEp7sj7lrPgVwgOMvjfdd6DuH2wMGO7bvc8zj3Bo5xat+1nke4NHC/p8Vd63mEGwM3W/Vd7rmPuwJfNS+71nMfFwV+Z55yredxbgn8xDzfcs+B3A/4v3mvtZ4zuBxc3TzQWs/Z3Awuah5luedp3AmuZV5href5XAguYV5euWfIVSBr3tlX2PoQeAnuATXztr7a1gfCnktAxLynL771+bDk+Hlj83q+19bHxYyz5/3Mi/m+Wx8dGw6etzGvZGbrk+TZHDkvbd7E6tYHy1M5b17RvINX2PqQeR6HzQuZt++CW585z+CY2ZvH7uJbnz+nc8ZszOtm3299HTiXA+ap5kWz32x9OziLo+UZ5gmzL259UziFc+Us82bZfVtfHI7nUDnYvFN2yNb3iCM5To4xD5MdvvWd4jDOkofMY2Snbn2/OIaD5Gbz+tiTt75xPMoR8lXz3Nhw69vHQ5wf/2CeGHuRrW8i93N4/MS8KfayW99N7uHY+L95ROwttr6n3MyZoe92z9bXlhs4rYuaZ8ICW99ivspRXcs8DRbb+kbzJc7pEuY5sPbWF5x/4ITK5u/frrP1Zed3HE/N/MHbZbe++/ySs4mYP3Kzz62fAj/hVN7b/FWb/X3rZ8GPHMn7mT9js3/c+pXwF87jbcyfrtmtWz8a/uAkXt38rZo9svUD4j8cwyuaP06zA7d+Twj9K5k/SLPztn5el+br781foNlztn5q1+XTz8xfndnzt352F+W7P9X8mZm9wtYP8XJ88WeYvyuzV9v6UV6Lz32i+Vsye+WtH+iF+NYHmz8es/fa+slegq98jPlrMXvfrZ9vn0/8kPkLMcts/ZrLfNyv+fj4Y+JudtrW7zzLl/2aj/0bMLvC1k+9yWf9mv/+OT9/A2YX2frB1/igN5jffrPrbP3cU3zNG8yvvtmltn7xHT7lDeb33uyCW7/7Ah/xNvNLb3bBrd/92/MFbzO/8WbX3Prpvzef7zbz62525a0D8K58uJvN77rZlbcOwFvy1W42v+hmF9+6Ae/HJ7vZ/Jab2Yfc38LHutn8fpvZ59YxeBu+1D3m99vMPreOwXvwme4xv9xm9v3WSXh1PtA95tfazH7Yugovzde5x/xOm9nf9/3/G8H3fJE7ze+0mf19Qv9Tvsid5hfazD5++Bcbf9H/gi9yp/n9Nrvm1k//Lflq95vfeLMrbP3QC3zE+80fgFly65cd5Jveb/4ezBpbP+U+n/h+8+dh9qZbv93L8cUfMn8wZm+x9Uu9OgfwkPn7MXvNrZ8mf+E8HjJ/TmYvsvVb5Hccz6PmD8xssvXL4wZO61Hz92b2nK2fGvdzeI+aPz+zk7Z+WxzGWT5q/hrNjtr6MXEWR3uA+fs0u2/rp8OTOOkDzJ+r2Re3fitsOPgDzF+v2a+2fhy8BPfgGPP3bPa59VPgFbkWx5g/b7vs1nefN+CWHGP+2u0iW9903pJ7c4z5+7fq1lebAtfoMPMiWGPri0yQW3WYeSDsTbe+ufS5ZIeZ98LeZeuryuW4c4eZ58Neduu7ydW5gkeaB8VeZOubCH/hRh5p3hdbbX314Hdc0CPNc2NP2/quwQ3c14PNA2QnbX2z4H6u78HmPbKjtr5KcBi3+WDzPNndW98dOIvLfbB5rezrW18WeBJ3/Xjzftmvtr4asOHqH2+eM/tz67sAL8FLON68blfe+vDhFXkYp5j37jpbHzW8Ae/kFPP8hbc+W3g/ns0p5jUsbX2Y8Pa8olPM4/jWW58e1HhUZ5nn8o22PiuI88bOMq/nK299OHAtntxZ5jF9qa1PAy7NCzzLvK3KDnzyIE80r62yA9+E/lTz+Co78E3oTzVvsbID34T+bPM6yzrgPZ9r3mtlBzzvc83zreyA136uec2VHfD4T6fswJYWnE7ZgS1pOJ2yA1tK8QzKDgwJxzMoOzCkI8+g7MCQrDyDsgNDKnO+j4/PKTswITrn+1/o178DuCj1OZ/QA1PqAxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxD3b0FgtOYHCqDXAAAAAElFTkSuQmCC" alt="unnamed_chunk_1snapshot" width=505/><br>
You must enable Javascript to view this page properly.</p>
<script>unnamed_chunk_1webGLStart();</script>
<p>Here \({\cal J}(\mu, \nu)\) is a \(4\)-dimensional convex polyhedron embedded in a \(9\)-dimensional space: its elements are given by \(9\) parameters \(p_{ij}\) but they are determined by only \(4\) of them because of the linear equality constraints \({\rm (1a)}\) and \({\rm (1b)}\). </p>
<h3>Vertices of \({\cal J}(\mu, \nu)\) achieve the Kantorovich distance</h3>
<p>In the introduction we mentionned that the application<br/>
\[{\cal J}(\mu, \nu) \ni \Lambda \mapsto \int d(x,y)\textrm{d}\Lambda(x,y)\]
is linear and we claimed that consequently any of its extremal values is attained by an <em>extreme point</em> of \({\cal J}(\mu, \nu)\). Why ?</p>
<p>Extreme points of a convex polyhedron are nothing but its vertices. Consider a point \(x\) in a convex polyhedron which is not a vertex, as in the figure below.
Then \(x\) is a convex combination of the vertices \(a\), \(b\), \(c\), \(d\), and therefore the image \(\ell(x)\) of \(x\) by any linear function \(\ell\) is the same convex combination of \(\ell(a)\), \(\ell(b)\), \(\ell&copy;\), \(\ell(d)\).
See figure below, where the polyhedron is in the \(xy\)-plane and the value of
\(\ell\) is given on the \(z\)-axis. </p>
<script src="http://data.over-blog-kiwi.com/0/26/54/14/201303/ob_b160da4168843e0be0e6cd05efa0f482_canvasmatrix.js" type="text/javascript"></script>
<p><canvas id="unnamed_chunk_2textureCanvas" style="display: none;" width="256" height="256">
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAfgAAAH4CAIAAAApSmgoAAAAHXRFWHRTb2Z0d2FyZQBSL1JHTCBwYWNrYWdlL2xpYnBuZ7GveO8AABTJSURBVHic7d1bchXJlkVRGkUH8id7U72jA/zcblGQARI6Oo94eMRy3z6GrZ+ya2mlFNunyUghvvwAoLQv6Q8AgHMJPUBxQg9QnNADFCf0AMUJPUBxQg9QnNADFCf0AMUJPUBxQg9QnNADFCf0AMUJPUBxQg9QnNADFCf0AMUJPUBxQg9QnNADFCf0AMUJPUBxQg9QnNADFCf0AMUJPUBxQg9QnNADFCf0AMUJPUBxQg9QnNADFCf0AMUJPUBxQg9QnNADFCf0AMUJPUBxQg9QnNADFCf0AMUJPUBxQg9QnNADFCf0AMUJPUBxQg9QnNADFCf0AMUJPUBxQg9QnNADFCf0AMUJPUBxQg9QnNADFCf0AMUJPUBxQg9QnNADFCf0AMUJPUBxQg9QnNADFCf0AMUJPUBxQg9QnNADFCf0AMUJPUBxQg9QnNADFCf0AMUJPUBxQg9QnNADFCf0AMUJPUBxQg9QnNADFCf0AMUJPUBxQg9QnNADFCf0AMUJPUBxQg9QnNADFCf0AMUJPUBxQg9QnNADFCf0AMUJPUBxQg9QnNADFCf0AMUJPUBxQg9QnNADFCf0AMUJPUBxQg9QnNADFCf0AMUJPUBxQg9QnNADFCf0AMUJPUBxQg9QnNADFCf0AMUJPUBxQg9QnNADFCf0AMUJPUBxQg9QnNADFCf0AMUJPUBxQg9QnNADFCf0AMUJPUBxQg9QnNADFCf0AMUJPUBxQg9QnNADFCf0AMUJPUBxQg9QnNADHfn2/X9/L/3hFCH0QNJN2T8v/QFWIPTAdV5mXejPIPTAWXZkXejPIPRAG02yLvRnEHpgj5OyrvVnEHrgtSuzLvTNCT1wK5t1oW9O6GF28Y4L/dmEHuYSr7bWX0/oobJ4oIW+B0IPdcRzLPR9EnoYWLy/Qj8EoYdhxGsr9IMSeuhUvK29Lf0LMjChhy7EM9r/0r9EAxN6CIhHc8Slf9EGJvRwungiayz9yzgwoYfG4kEsvPSv7aiEHg6Jt2+qpX+1RyX0sEG8dJMv/es/KqGHh+Jds5ulL2JUQg+/xStma5Y+kyEJPfOKN8t2LH01QxJ6ZhEvlDVZ+o6GJPTUFO+RnbT0ZQ1J6KkgXh+7bOlbG5LQM554ayy79AGOR+jpXTwr1tvSJzkeoacv8YhY/0sf6XiEnqR4MmzEpc92PELPdeKBsDJL3/JghJ6zxFtghZe+7sEIPW3EX75NtfS9D0bo2Sn+1G3mpc9/MELPKvGHbXaz9JsYidBzR/wNm71c+pWMROiRdRty6XczEqGfTvx9mjVZ+iWNROiLi79Gs5OWflsjEfpS4m/P7MqlH9wwhH5g8Wdmll36CQ5D6IcRf1RmvS39KIch9J2KPyGz/pd+psMQ+i7EH4zZoEu/3TEIfUb8eZjVWPopj0HorxB/DGZVl37cYxD69uKnbzbP0s99DELfUvzozSZc+t0PQOhbil+82YRLv/sBCH1L8Ys3m3Dpdz8AoW8mfu5mcy799Acg9M3Ez92u3I8vX5bFPxJLP/0BCH0z8XO3Kyf0XS39+nsn9M3Eb90u2+/E//Pvr6U/GPsm9K8IfTPxW7dr9v5VvMp3s/Tr753QtxE/dLtgt79XI/TdLB2A3gl9G/FDt1N3/7fjhb6npRvQNaFvI37ldtKe/RdXoe9p6QZ0TejbiF+5Nd/rb6oR+p6WbkDXhL6N+JVbw639vkmh72npBnRN6BuIn7i12rZvjRf6zpYuQb+EvoH4fdvx7fnTT0Lf2dIl6JfQNxC/bzuy/X/AVeg7W7oE/RL6BuL3bft29GcYCH1nS5egX0LfQPy+bcca/Jgaoe9s6RL0S+iPih+3bV2zH0Ym9P0t3YNOCf1R8cu29Wv88yaFvr+le9ApoT8qftm2Zqf8SGGh72/pHnRK6I+KX7Y934k/NV7o+1u6B50S+kPiZ21PdvpfDCL0XS5dhR4J/SHxm7a7u+jvfhL6LpeuQo+E/pD4TdvNLv3r/YS+y6Wr0COhPyR+0/a2wN/gKvRdLl2FHgn9IfGbtmWZv6Rb6HtdOgzdEfr94tds3yJfyL9N6Htdug3dEfr94tc8+ZKJXyb0vS7dhu4I/X7xa552+cQvE/pel25Dd4R+v/g1T7heEr9M6Htdug3dEfr94tc81fpK/DKh73jpPPRF6HeK3/E86zHxy4S+46UL0Reh3yl+xzOs38QvE/qOly5EX4R+p/gd117viV8m9B0vXYi+CP1O8TuuujESv0zo+146Eh0R+p3iR1xywyR+mdD3vXQkOiL0e8QvuN5G+kL+bULf99Kd6IjQ7xG/4EobMvHLhL7vpTvREaHfI37BNTZw4pcJffdLp6IXQr9H/HxH3/CJXyb03S+dil4I/Wbx2x16RRK/TOi7X7oWvRD6zeK3O+hKJX6Z0He/dC16IfSbxW93uBVM/DKh737pWvRC6DeL3+5AK5v4ZUI/wtLB6ILQbxY/3CFWPPHLhH6EpYPRBaHfJn61Q6x+4pcJ/QhLN6MLQr9N/Go73xRfyL9N6EdYuhldEPpt4lfb7eZK/DKhH2TpbOQJ/Tbxk+1wMyZ+mdAPsnQ28oR+m/jJdrV5E79M6AdZOht5Qr9B/F772eyJXyb0gyxdjjyh3yB+rz1M4t8n9OMsHY8wod8gfqzhpyLxNxP6cZaOR5jQbxA/1tgjkfi7E/pxlo5HmNBvED/WzAuR+EcT+nGWjkeY0K8Vv9TA2/CF/PMJ/ThL9yNM6NeKX+qlr0Li10zoh1o6IUlCv1b8TC96DBK/fkI/1NIJSRL6teJnevozkPitE/qhlk5IktCvEr/Rcx+AxO+b0A+1dEWShH6V+I2edfoSf2RCP9rSIYkR+lXiB9r+4iX++IR+tKVDEiP0q8QPtOWtS3yrCf1oS4ckRuhXiR9omyuX+LYT+tGWDkmM0L8Wv842Jy7xzSf0Ay6dkwyhfy1+mkcv2xfyJ03oB1w6JxlC/1r8NK3TCf2AS+ckQ+hfi5/mkX3xtfx5E/oBl85JhtC/Fj/NIxP6Eyf0Ay6dkwyhfyF+lwcn9CdO6MdcOioBQv9C/CgPTuhPnNCPuXRUAoT+hfhRHpzQnzihH3PpqAQI/Qvxozw+rT9rQj/m0lEJEPoX4kd5fEJ/1oR+2KW7cjWhfyZ+jk0m9GdtqNAvf27OH537/dmYjNA/Ez/HJhP6s9Z36N/K/p74nx9w3x/zdZ+cyQj9M/FzbLJioX/rVvwj6Sqad7L++aMV+rdP12SE/pn4OTZZvdB//f7vz8U/klQ0Pzd97W/IqPzfn8aZCP1D8UNstTKhX5K2VH6S0O9veugDHmjpwFxK6B+KH2KrFQj9ze/VdFH574272bjp53/Aoy8dmEsJ/UPxQ2y1oUN/97fjRw/9FU1v+gGXXDowlxL6h+KH2GqDhv7Jf3EdKPSxpu/9gOdZOjCXEvqH4ofYasOF/uU31fQZ+r6avuIDtnRjriP098VPsOEGCv3K75uMh36Apt+d0H9cOjPXEfr74ifYcEOEftO3xl8Z+mdNH66bw33AJy+dmesI/X3xE2y4zkO/408/nRT6bV+nj/jnj8b6aM9fOjPXEfr74ifYcN2GfvcfcG0S+qO/9yL0JZYuzUWE/r74/TVch6E/+DMMtoa+7W+pf/2/f982WDrH+mgvWbo0FxH6O+LH13Zdhb7Jj6l5Evrz/jPp333/0Pr0p3TDhP7T0rG5iNDfET++tusk9A1/EtkS+gu+9eVR3EfNvdB/Wjo2FxH6O+LHd/8i97YsHvrjib/42xnX932w1gv9vaV7cwWhvyN+effPccDQ70j8mqaf9F03+/o+UuuF/t7SvbmC0N8Rv7z7++ffH8vfHbHxH4yEfk3id3+d3jD0x+M+UuuF/t7SvbmC0N+Kn92zLa3f+E9dGfq3YN++pbbf93I49M37Pkbuhf7e0sm5gtDfip/ds/33ULcm8prQv/X9iv9Guiv0Z8d9gNYL/YOlq3M6ob8Vv7ln6yz0qR/5sin0F/e969YL/YOlq3M6ob8Vv7ln+/NQN/W0Veg/N73hd0xu2prQB/veb+uF/sHS1Tmd0H8QP7gXuyr0L79UTyV+2aPQx7Pee+uF/sHS4Tmd0H8QP7gX++uhrm/989Bv/e2XbOKX3YQ+nvJhci/0D5YOz+mE/oP4wb3YsdAf/C31HhK/bAl9vN3jtV7oHy/dnnMJ/Qfxa3uxT3+l0Zp/6svh/0zaUeKXaH7PV3vI1gv946Xbcy6h/yB+bS+2K/TfDvz32E4Sf1vMYUMfbr3QP166PecS+nfxU3u9Tw91/Rf1W/9/xRP/LJcjhz6Ze6F/vHR+ziX07+Kntmq7Wr8p9OHvqFkTyvFDn2m90D9dukAnEvp38TtbtTNDH0z8tkqWCH2g9UL/dOkCnUjo38XvbNXuvdWXrX8Z+kji9yeySugvbb3Kv1q6QCcS+nfxO1u11qG/PvEN+lgo9Ne1XuhfLV2gEwn9b/EjW7sHz/XFn3K6979emfjGcawV+otyL/Qrlu7QWYT+t/iFrV2L0F+W+LOyWDH0p7de6Fcs3aGzCP1v8Qtbu8fP9Unr30J/TeJPb2LR0J/beqFfsXSHziL0v8UvbO22h/6/nzN5+k+avDSIdUN/YuuFfsXSHTqL0P8Wv7C1e/pc77b+0d/61GSZGpYO/Vm5F/oVS3foLEL/S/y8NuzVc/3c+uahj0dwhtC3b73Qr1u6RqcQ+l/it7Vh20P/rdHfPRIP32yhb9x6oV+3dI1OIfS/xG9rw1Y81ztf1B/5m7jTsZs59C1bL/Trlq7RKYT+l/htbdgloY/X7cVmCv3XVq0X+nVL1+gUQj9U5b+vfa63f/PfutDHi7Z2k4V+2TWXY98qtl7oZw99vF97NmXovx5svdCvXrpJ7Ql9zdB/+9j6z6GPN+vQZg391yOtF/rVSzepPaGfK/TxTrXZxKH/urv1Qr966Sa1J/RlQ//tT+t/puFn6ON5arm5Q/91X+uFfsvSWWps9tDH72nzVj/XpQg//ku80JfcSZdj34S+mPg9bd6r53rTAqGvvYaXY38vXabGhD5/Utt277k+b8HyM83iSWo5of9rRy7HHi1dpsaEPn9SG/bzrS777/9cGYJqof/+Z/GPpJutPZ74AY+zdJkaE/r8SW3Yf5XfEYJSobcHe3088QMeauk4tTR16OOXtHl/vqLfmgChn2Qvjid+wEMt3aeWhH7IbX3/Qj/PHp6N0G9cuk8tCf2o2/T4hX6q3b8Zod+4dJ9aEvpRt/Xxa/1Uu3MzQr996UQ1I/QDb9PLF/oJ9+FghH770olqZt7Qx2/o+Da9eaGfc+8HI/Tbl65UM0I/9tY/eKGfdr+vRei3L12pZoR+7K1/7UI/827+qJ2tXzpUbQj98Fv51IV+2v26E6Hfu3So2pg09PHrabiVr13oJ9n9OxH6vUu3qg2hr7A171/oSy5+e+WXblUbQl9ha4og9AUWv7QJl25VG0JfZC8bIfTDLX5UtiydqwaEvsheVkPoO1/8hOzR0rlqYMbQx+/mpD3viNB3tfi12Pqli9WA0NfZ87IIfXDx27AjSxerAaEvtSetEfrLFj8Da750tI4S+lJ7Uh+hl3XbvXS0jhL6ahN6ZbfmS0frqOlCH7+Ysyf0sm7Nl+7WUUJfcEIv69Z86XQdIvQFJ/Sybs2XTtchQl9zQi/r1nbpdB0i9DV307gfX375MVPr478EVmzpdB0yV+jjt3LlPlTvz0+pjfdX1m3Qpet1iNCXXeHQxz+3NufSAdtP6CvvQx+HrXz802i2LB2w/YS+8kYMffyTZvZo6YDtN1Ho41cSWeehj39+zNYv3bD9hL74ugp9/LNhdnDpjO0k9PUXDH38392s7dIZ20no6++yL+rj/6ZmZy+dsZ2EfoqdEfr4v5TZ9UtnbKdZQh+/j+yOhz7+r2DWydIx20PoZ9mm0Mc/WrOulg7YUUI/zf75Ffq7fzg2/7GZ9bR0rtoT+mn2J/T5j8Ssm6XLdBGhn2Z/ftxN/iMxCy3doZgpQh8/LzO7eOnq9EXozWz4pRvTO6E3s5GWzsmQhN7M+l06HkUIvZn1snQqyqof+vjtmtnnpcMwF6E3s9OXzsDshN7MWi794rlD6M1s/9Lvm1WKhz7+DMwqLf2g2UnozezO0m+XloTezGS9OKE3m2vpR0mA0JtVXvoJ0oXKoY+/MbMrl35w9EvozYZc+nkxEqE3G2Dpx8TYhN6sr6XfDQUJvVly6VfCFMqGPv6AzW6WfhPMS+jNTln6BcA7oTc7uvSxwwtCb7Zt6dOGzYTe7NnShwwN1Ax9vA424tJnC2cRept06SOF6wi91V/6HiFM6K3a0tcH3SkY+nho7LKlbw3GIPQ2zNKXBaMSeut06TuCOoTe8kufDBQn9Hb10gcC06kW+njF7O+lzwH4RehN1qE4oTdNh+KE3mQdihN6k3UorlTo44kcbulfMeAKQj/R0r8+QIbQ11z6lwLoiNBXWPoTD3RN6Adb+nMMjKdO6OMJlnWgT0Lf0dKfQqAmodd0oDihl3WguCKhj6dc04FuCb2sA8UJvawDxQm9pgPFCb2sA8VVCL2mAzxRPPTpDw0gr07o0x8FQKcqhB6AJ4QeoDihByhO6AGKE3qA4oQeoDihByhO6AGKE3qA4oQeoDihByhO6AGKE3qA4oQeoDihByhO6AGKE3qA4oQeoDihByhO6AGKE3qA4oQeoDihByhO6AGKE3qA4oQeoDihByhO6AGKE3qA4oQeoDihByhO6AGKE3qA4oQeoDihByhO6AGKE3qA4oQeoDihByhO6AGKE3qA4oQeoDihByhO6AGKE3qA4oQeoDihByhO6AGKE3qA4oQeoDihByhO6AGKE3qA4oQeoDihByhO6AGKE3qA4oQeoDihByhO6AGKE3qA4oQeoDihByhO6AGKE3qA4oQeoDihByhO6AGKE3qA4oQeoDihByhO6AGKE3qA4oQeoDihByhO6AGKE3qA4oQeoDihByhO6AGKE3qA4oQeoDihByhO6AGKE3qA4oQeoDihByhO6AGKE3qA4oQeoDihByhO6AGKE3qA4oQeoDihByhO6AGKE3qA4oQeoDihByhO6AGK+3/IHrLb7n5xqAAAAABJRU5ErkJggg==" alt="unnamed_chunk_2snapshot" width=505/><br>
Your browser does not support the HTML5 canvas element.</canvas></p>
<!-- ****** lines object 45 ****** -->
<script id="unnamed_chunk_2vshader45" type="x-shader/x-vertex">
attribute vec3 aPos;
attribute vec4 aCol;
uniform mat4 mvMatrix;
uniform mat4 prMatrix;
varying vec4 vDiffuse;
void main(void) {
gl_Position = prMatrix * mvMatrix * vec4(aPos, 1.);
vDiffuse = aCol;
}
</script>
<script id="unnamed_chunk_2fshader45" type="x-shader/x-fragment">
#ifdef GL_ES
precision highp float;
#endif
varying vec4 vDiffuse; // carries alpha
void main(void) {
vec4 diffuse;
diffuse = vDiffuse;
gl_FragColor = diffuse;
}
</script>
<!-- ****** text object 46 ****** -->
<script id="unnamed_chunk_2vshader46" type="x-shader/x-vertex">
attribute vec3 aPos;
attribute vec4 aCol;
uniform mat4 mvMatrix;
uniform mat4 prMatrix;
varying vec4 vDiffuse;
attribute vec2 aTexcoord;
varying vec2 vTexcoord;
attribute vec2 aOfs;
void main(void) {
vDiffuse = aCol;
vTexcoord = aTexcoord;
vec4 pos = prMatrix * mvMatrix * vec4(aPos, 1.);
pos = pos/pos.w;
gl_Position = pos + vec4(aOfs, 0.,0.);
}
</script>
<script id="unnamed_chunk_2fshader46" type="x-shader/x-fragment">
#ifdef GL_ES
precision highp float;
#endif
varying vec4 vDiffuse; // carries alpha
varying vec2 vTexcoord;
uniform sampler2D uSampler;
void main(void) {
vec4 diffuse;
diffuse = vDiffuse;
vec4 textureColor = diffuse*texture2D(uSampler, vTexcoord);
if (textureColor.a < 0.1)
discard;
else
gl_FragColor = textureColor;
}
</script>
<!-- ****** text object 47 ****** -->
<script id="unnamed_chunk_2vshader47" type="x-shader/x-vertex">
attribute vec3 aPos;
attribute vec4 aCol;
uniform mat4 mvMatrix;
uniform mat4 prMatrix;
varying vec4 vDiffuse;
attribute vec2 aTexcoord;
varying vec2 vTexcoord;
attribute vec2 aOfs;
void main(void) {
vDiffuse = aCol;
vTexcoord = aTexcoord;
vec4 pos = prMatrix * mvMatrix * vec4(aPos, 1.);
pos = pos/pos.w;
gl_Position = pos + vec4(aOfs, 0.,0.);
}
</script>
<script id="unnamed_chunk_2fshader47" type="x-shader/x-fragment">
#ifdef GL_ES
precision highp float;
#endif
varying vec4 vDiffuse; // carries alpha
varying vec2 vTexcoord;
uniform sampler2D uSampler;
void main(void) {
vec4 diffuse;
diffuse = vDiffuse;
vec4 textureColor = diffuse*texture2D(uSampler, vTexcoord);
if (textureColor.a < 0.1)
discard;
else
gl_FragColor = textureColor;
}
</script>
<!-- ****** text object 48 ****** -->
<script id="unnamed_chunk_2vshader48" type="x-shader/x-vertex">
attribute vec3 aPos;
attribute vec4 aCol;
uniform mat4 mvMatrix;
uniform mat4 prMatrix;
varying vec4 vDiffuse;
attribute vec2 aTexcoord;
varying vec2 vTexcoord;
attribute vec2 aOfs;
void main(void) {
vDiffuse = aCol;
vTexcoord = aTexcoord;
vec4 pos = prMatrix * mvMatrix * vec4(aPos, 1.);
pos = pos/pos.w;
gl_Position = pos + vec4(aOfs, 0.,0.);
}
</script>
<script id="unnamed_chunk_2fshader48" type="x-shader/x-fragment">
#ifdef GL_ES
precision highp float;
#endif
varying vec4 vDiffuse; // carries alpha
varying vec2 vTexcoord;
uniform sampler2D uSampler;
void main(void) {
vec4 diffuse;
diffuse = vDiffuse;
vec4 textureColor = diffuse*texture2D(uSampler, vTexcoord);
if (textureColor.a < 0.1)
discard;
else
gl_FragColor = textureColor;
}
</script>
<!-- ****** surface object 49 ****** -->
<script id="unnamed_chunk_2vshader49" type="x-shader/x-vertex">
attribute vec3 aPos;
attribute vec4 aCol;
uniform mat4 mvMatrix;
uniform mat4 prMatrix;
varying vec4 vDiffuse;
attribute vec3 aNorm;
uniform mat4 normMatrix;
varying vec3 vNormal;
const vec3 diffuse = vec3(1., 1., 1.); // light only
void main(void) {
gl_Position = prMatrix * mvMatrix * vec4(aPos, 1.);
vDiffuse = vec4(aCol.rgb * diffuse, aCol.a);
vNormal = normalize((normMatrix * vec4(aNorm, 1.)).xyz);
}
</script>
<script id="unnamed_chunk_2fshader49" type="x-shader/x-fragment">
#ifdef GL_ES
precision highp float;
#endif
varying vec4 vDiffuse; // carries alpha
const vec3 ambient_plus_emission = vec3(0., 0., 0.);
const vec3 specular = vec3(1., 1., 1.);// light*material
const float shininess = 50.;
const vec3 lightDir = vec3(0., 0., 1.);
const vec3 halfVec = vec3(0., 0., 1.);
const vec3 eye = vec3(0., 0., 1.);
varying vec3 vNormal;
void main(void) {
vec4 diffuse;
vec3 n = normalize(vNormal);
vec3 col = ambient_plus_emission;
n = -faceforward(n, n, eye);
float nDotL = dot(n, lightDir);
col = col + max(nDotL, 0.) * vDiffuse.rgb;
col = col + pow(max(dot(halfVec, n), 0.), shininess) * specular;
diffuse = vec4(col, vDiffuse.a);
gl_FragColor = diffuse;
}
</script>
<!-- ****** lines object 50 ****** -->
<script id="unnamed_chunk_2vshader50" type="x-shader/x-vertex">
attribute vec3 aPos;
attribute vec4 aCol;
uniform mat4 mvMatrix;
uniform mat4 prMatrix;
varying vec4 vDiffuse;
void main(void) {
gl_Position = prMatrix * mvMatrix * vec4(aPos, 1.);
vDiffuse = aCol;
}
</script>
<script id="unnamed_chunk_2fshader50" type="x-shader/x-fragment">
#ifdef GL_ES
precision highp float;
#endif
varying vec4 vDiffuse; // carries alpha
void main(void) {
vec4 diffuse;
diffuse = vDiffuse;
gl_FragColor = diffuse;
}
</script>
<!-- ****** points object 51 ****** -->
<script id="unnamed_chunk_2vshader51" type="x-shader/x-vertex">
attribute vec3 aPos;
attribute vec4 aCol;
uniform mat4 mvMatrix;
uniform mat4 prMatrix;
varying vec4 vDiffuse;
void main(void) {
gl_Position = prMatrix * mvMatrix * vec4(aPos, 1.);
gl_PointSize = 3.;
vDiffuse = aCol;
}
</script>
<script id="unnamed_chunk_2fshader51" type="x-shader/x-fragment">
#ifdef GL_ES
precision highp float;
#endif
varying vec4 vDiffuse; // carries alpha
void main(void) {
vec4 diffuse;
diffuse = vDiffuse;
gl_FragColor = diffuse;
}
</script>
<!-- ****** quads object 52 ****** -->
<script id="unnamed_chunk_2vshader52" type="x-shader/x-vertex">
attribute vec3 aPos;
attribute vec4 aCol;
uniform mat4 mvMatrix;
uniform mat4 prMatrix;
varying vec4 vDiffuse;
attribute vec3 aNorm;
uniform mat4 normMatrix;
varying vec3 vNormal;
const vec3 diffuse = vec3(1., 1., 1.); // light only
void main(void) {
gl_Position = prMatrix * mvMatrix * vec4(aPos, 1.);
vDiffuse = vec4(aCol.rgb * diffuse, aCol.a);
vNormal = normalize((normMatrix * vec4(aNorm, 1.)).xyz);
}
</script>
<script id="unnamed_chunk_2fshader52" type="x-shader/x-fragment">
#ifdef GL_ES
precision highp float;
#endif
varying vec4 vDiffuse; // carries alpha
const vec3 ambient_plus_emission = vec3(0., 0., 0.);
const vec3 specular = vec3(1., 1., 1.);// light*material
const float shininess = 50.;
const vec3 lightDir = vec3(0., 0., 1.);
const vec3 halfVec = vec3(0., 0., 1.);
const vec3 eye = vec3(0., 0., 1.);
varying vec3 vNormal;
void main(void) {
vec4 diffuse;
vec3 n = normalize(vNormal);
vec3 col = ambient_plus_emission;
n = -faceforward(n, n, eye);
float nDotL = dot(n, lightDir);
col = col + max(nDotL, 0.) * vDiffuse.rgb;
col = col + pow(max(dot(halfVec, n), 0.), shininess) * specular;
diffuse = vec4(col, vDiffuse.a);
gl_FragColor = diffuse;
}
</script>
<!-- ****** points object 53 ****** -->
<script id="unnamed_chunk_2vshader53" type="x-shader/x-vertex">
attribute vec3 aPos;
attribute vec4 aCol;
uniform mat4 mvMatrix;
uniform mat4 prMatrix;
varying vec4 vDiffuse;
void main(void) {
gl_Position = prMatrix * mvMatrix * vec4(aPos, 1.);
gl_PointSize = 3.;
vDiffuse = aCol;
}
</script>
<script id="unnamed_chunk_2fshader53" type="x-shader/x-fragment">
#ifdef GL_ES
precision highp float;
#endif
varying vec4 vDiffuse; // carries alpha
void main(void) {
vec4 diffuse;
diffuse = vDiffuse;
gl_FragColor = diffuse;
}
</script>
<!-- ****** lines object 54 ****** -->
<script id="unnamed_chunk_2vshader54" type="x-shader/x-vertex">
attribute vec3 aPos;
attribute vec4 aCol;
uniform mat4 mvMatrix;
uniform mat4 prMatrix;
varying vec4 vDiffuse;
void main(void) {
gl_Position = prMatrix * mvMatrix * vec4(aPos, 1.);
vDiffuse = aCol;
}
</script>
<script id="unnamed_chunk_2fshader54" type="x-shader/x-fragment">
#ifdef GL_ES
precision highp float;
#endif
varying vec4 vDiffuse; // carries alpha
void main(void) {
vec4 diffuse;
diffuse = vDiffuse;
gl_FragColor = diffuse;
}
</script>
<!-- ****** lines object 55 ****** -->
<script id="unnamed_chunk_2vshader55" type="x-shader/x-vertex">
attribute vec3 aPos;
attribute vec4 aCol;
uniform mat4 mvMatrix;
uniform mat4 prMatrix;
varying vec4 vDiffuse;
void main(void) {
gl_Position = prMatrix * mvMatrix * vec4(aPos, 1.);
vDiffuse = aCol;
}
</script>
<script id="unnamed_chunk_2fshader55" type="x-shader/x-fragment">
#ifdef GL_ES
precision highp float;
#endif
varying vec4 vDiffuse; // carries alpha
void main(void) {
vec4 diffuse;
diffuse = vDiffuse;
gl_FragColor = diffuse;
}
</script>
<!-- ****** points object 56 ****** -->
<script id="unnamed_chunk_2vshader56" type="x-shader/x-vertex">
attribute vec3 aPos;
attribute vec4 aCol;
uniform mat4 mvMatrix;
uniform mat4 prMatrix;
varying vec4 vDiffuse;
void main(void) {
gl_Position = prMatrix * mvMatrix * vec4(aPos, 1.);
gl_PointSize = 3.;
vDiffuse = aCol;
}
</script>
<script id="unnamed_chunk_2fshader56" type="x-shader/x-fragment">
#ifdef GL_ES
precision highp float;
#endif
varying vec4 vDiffuse; // carries alpha
void main(void) {
vec4 diffuse;
diffuse = vDiffuse;
gl_FragColor = diffuse;
}
</script>
<!-- ****** linestrip object 57 ****** -->
<script id="unnamed_chunk_2vshader57" type="x-shader/x-vertex">
attribute vec3 aPos;
attribute vec4 aCol;
uniform mat4 mvMatrix;
uniform mat4 prMatrix;
varying vec4 vDiffuse;
void main(void) {
gl_Position = prMatrix * mvMatrix * vec4(aPos, 1.);
vDiffuse = aCol;
}
</script>
<script id="unnamed_chunk_2fshader57" type="x-shader/x-fragment">
#ifdef GL_ES
precision highp float;
#endif
varying vec4 vDiffuse; // carries alpha
void main(void) {
vec4 diffuse;
diffuse = vDiffuse;
gl_FragColor = diffuse;
}
</script>
<script type="text/javascript">
function getShader ( gl, id ){
var shaderScript = document.getElementById ( id );
var str = "";
var k = shaderScript.firstChild;
while ( k ){
if ( k.nodeType == 3 ) str += k.textContent;
k = k.nextSibling;
}
var shader;
if ( shaderScript.type == "x-shader/x-fragment" )
shader = gl.createShader ( gl.FRAGMENT_SHADER );
else if ( shaderScript.type == "x-shader/x-vertex" )
shader = gl.createShader(gl.VERTEX_SHADER);
else return null;
gl.shaderSource(shader, str);
gl.compileShader(shader);
if (gl.getShaderParameter(shader, gl.COMPILE_STATUS) == 0)
alert(gl.getShaderInfoLog(shader));
return shader;
}
var min = Math.min;
var max = Math.max;
var sqrt = Math.sqrt;
var sin = Math.sin;
var acos = Math.acos;
var tan = Math.tan;
var SQRT2 = Math.SQRT2;
var PI = Math.PI;
var log = Math.log;
var exp = Math.exp;
function unnamed_chunk_2webGLStart() {
var debug = function(msg) {
document.getElementById("unnamed_chunk_2debug").innerHTML = msg;
}
debug("");
var canvas = document.getElementById("unnamed_chunk_2canvas");
if (!window.WebGLRenderingContext){
debug("<img src=\"unnamed_chunk_2snapshot.png\" alt=\"unnamed_chunk_2snapshot\" width=505/><br> Your browser does not support WebGL. See <a href=\"http://get.webgl.org\">http://get.webgl.org</a>");
return;
}
var gl;
try {
// Try to grab the standard context. If it fails, fallback to experimental.
gl = canvas.getContext("webgl")
|| canvas.getContext("experimental-webgl");
}
catch(e) {}
if ( !gl ) {
debug("<img src=\"unnamed_chunk_2snapshot.png\" alt=\"unnamed_chunk_2snapshot\" width=505/><br> Your browser appears to support WebGL, but did not create a WebGL context. See <a href=\"http://get.webgl.org\">http://get.webgl.org</a>");
return;
}
var width = 505; var height = 505;
canvas.width = width; canvas.height = height;
gl.viewport(0, 0, width, height);
var prMatrix = new CanvasMatrix4();
var mvMatrix = new CanvasMatrix4();
var normMatrix = new CanvasMatrix4();
var saveMat = new CanvasMatrix4();
saveMat.makeIdentity();
var distance;
var zoom = 1;
var fov = 30;
var userMatrix = new CanvasMatrix4();
userMatrix.load([
1, 0, 0, 0,
0, 0.3420201, -0.9396926, 0,
0, 0.9396926, 0.3420201, 0,
0, 0, 0, 1
]);
function getPowerOfTwo(value) {
var pow = 1;
while(pow<value) {
pow *= 2;
}
return pow;
}
function handleLoadedTexture(texture, textureCanvas) {
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, textureCanvas);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_NEAREST);
gl.generateMipmap(gl.TEXTURE_2D);
gl.bindTexture(gl.TEXTURE_2D, null);
}
function loadImageToTexture(filename, texture) {
var canvas = document.getElementById("unnamed_chunk_2textureCanvas");
var ctx = canvas.getContext("2d");
var image = new Image();
image.onload = function() {
var w = image.width;
var h = image.height;
var canvasX = getPowerOfTwo(w);
var canvasY = getPowerOfTwo(h);
canvas.width = canvasX;
canvas.height = canvasY;
ctx.imageSmoothingEnabled = true;
ctx.drawImage(image, 0, 0, canvasX, canvasY);
handleLoadedTexture(texture, canvas);
drawScene();
}
image.src = filename;
}
function drawTextToCanvas(text, cex) {
var canvasX, canvasY;
var textX, textY;
var textHeight = 20 * cex;
var textColour = "white";
var fontFamily = "Arial";
var backgroundColour = "rgba(0,0,0,0)";
var canvas = document.getElementById("unnamed_chunk_2textureCanvas");
var ctx = canvas.getContext("2d");
ctx.font = textHeight+"px "+fontFamily;
canvasX = 1;
var widths = [];
for (var i = 0; i < text.length; i++) {
widths[i] = ctx.measureText(text[i]).width;
canvasX = (widths[i] > canvasX) ? widths[i] : canvasX;
}
canvasX = getPowerOfTwo(canvasX);
var offset = 2*textHeight; // offset to first baseline
var skip = 2*textHeight; // skip between baselines
canvasY = getPowerOfTwo(offset + text.length*skip);
canvas.width = canvasX;
canvas.height = canvasY;
ctx.fillStyle = backgroundColour;
ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height);
ctx.fillStyle = textColour;
ctx.textAlign = "left";
ctx.textBaseline = "alphabetic";
ctx.font = textHeight+"px "+fontFamily;
for(var i = 0; i < text.length; i++) {
textY = i*skip + offset;
ctx.fillText(text[i], 0, textY);
}
return {canvasX:canvasX, canvasY:canvasY,
widths:widths, textHeight:textHeight,
offset:offset, skip:skip};
}
// ****** lines object 45 ******
var prog45 = gl.createProgram();
gl.attachShader(prog45, getShader( gl, "unnamed_chunk_2vshader45" ));
gl.attachShader(prog45, getShader( gl, "unnamed_chunk_2fshader45" ));
gl.linkProgram(prog45);
var v=new Float32Array([
-3, -3, -19,
-3, -3, -19,
9, 12, 119,
9, 12, 119
]);
var posLoc45 = gl.getAttribLocation(prog45, "aPos");
var colLoc45 = gl.getAttribLocation(prog45, "aCol");
var buf45 = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, buf45);
gl.bufferData(gl.ARRAY_BUFFER, v, gl.STATIC_DRAW);
var mvMatLoc45 = gl.getUniformLocation(prog45,"mvMatrix");
var prMatLoc45 = gl.getUniformLocation(prog45,"prMatrix");
// ****** text object 46 ******
var prog46 = gl.createProgram();
gl.attachShader(prog46, getShader( gl, "unnamed_chunk_2vshader46" ));
gl.attachShader(prog46, getShader( gl, "unnamed_chunk_2fshader46" ));
gl.linkProgram(prog46);
var texts = [
""
];
var texinfo = drawTextToCanvas(texts, 1);
var canvasX46 = texinfo.canvasX;
var canvasY46 = texinfo.canvasY;
var ofsLoc46 = gl.getAttribLocation(prog46, "aOfs");
var texture46 = gl.createTexture();
var texLoc46 = gl.getAttribLocation(prog46, "aTexcoord");
var sampler46 = gl.getUniformLocation(prog46,"uSampler");
handleLoadedTexture(texture46, document.getElementById("unnamed_chunk_2textureCanvas"));
var v=new Float32Array([
3, -5.5425, -42.391, 0, -0.5, 0.5, 0.5,
3, -5.5425, -42.391, 1, -0.5, 0.5, 0.5,
3, -5.5425, -42.391, 1, 1.5, 0.5, 0.5,
3, -5.5425, -42.391, 0, 1.5, 0.5, 0.5
]);
for (var i=0; i<1; i++)
for (var j=0; j<4; j++) {
ind = 7*(4*i + j) + 3;
v[ind+2] = 2*(v[ind]-v[ind+2])*texinfo.widths[i]/width;
v[ind+3] = 2*(v[ind+1]-v[ind+3])*texinfo.textHeight/height;
v[ind] *= texinfo.widths[i]/texinfo.canvasX;
v[ind+1] = 1.0-(texinfo.offset + i*texinfo.skip
- v[ind+1]*texinfo.textHeight)/texinfo.canvasY;
}
var posLoc46 = gl.getAttribLocation(prog46, "aPos");
var colLoc46 = gl.getAttribLocation(prog46, "aCol");
var f=new Uint16Array([
0, 1, 2, 0, 2, 3
]);
var buf46 = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, buf46);
gl.bufferData(gl.ARRAY_BUFFER, v, gl.STATIC_DRAW);
var ibuf46 = gl.createBuffer();
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, ibuf46);
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, f, gl.STATIC_DRAW);
var mvMatLoc46 = gl.getUniformLocation(prog46,"mvMatrix");
var prMatLoc46 = gl.getUniformLocation(prog46,"prMatrix");
// ****** text object 47 ******
var prog47 = gl.createProgram();
gl.attachShader(prog47, getShader( gl, "unnamed_chunk_2vshader47" ));
gl.attachShader(prog47, getShader( gl, "unnamed_chunk_2fshader47" ));
gl.linkProgram(prog47);
var texts = [
""
];
var texinfo = drawTextToCanvas(texts, 1);
var canvasX47 = texinfo.canvasX;
var canvasY47 = texinfo.canvasY;
var ofsLoc47 = gl.getAttribLocation(prog47, "aOfs");
var texture47 = gl.createTexture();
var texLoc47 = gl.getAttribLocation(prog47, "aTexcoord");
var sampler47 = gl.getUniformLocation(prog47,"uSampler");
handleLoadedTexture(texture47, document.getElementById("unnamed_chunk_2textureCanvas"));
var v=new Float32Array([
-5.034, 4.5, -42.391, 0, -0.5, 0.5, 0.5,
-5.034, 4.5, -42.391, 1, -0.5, 0.5, 0.5,
-5.034, 4.5, -42.391, 1, 1.5, 0.5, 0.5,
-5.034, 4.5, -42.391, 0, 1.5, 0.5, 0.5
]);
for (var i=0; i<1; i++)
for (var j=0; j<4; j++) {
ind = 7*(4*i + j) + 3;
v[ind+2] = 2*(v[ind]-v[ind+2])*texinfo.widths[i]/width;
v[ind+3] = 2*(v[ind+1]-v[ind+3])*texinfo.textHeight/height;
v[ind] *= texinfo.widths[i]/texinfo.canvasX;
v[ind+1] = 1.0-(texinfo.offset + i*texinfo.skip
- v[ind+1]*texinfo.textHeight)/texinfo.canvasY;
}
var posLoc47 = gl.getAttribLocation(prog47, "aPos");
var colLoc47 = gl.getAttribLocation(prog47, "aCol");
var f=new Uint16Array([
0, 1, 2, 0, 2, 3
]);
var buf47 = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, buf47);
gl.bufferData(gl.ARRAY_BUFFER, v, gl.STATIC_DRAW);
var ibuf47 = gl.createBuffer();
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, ibuf47);
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, f, gl.STATIC_DRAW);
var mvMatLoc47 = gl.getUniformLocation(prog47,"mvMatrix");
var prMatLoc47 = gl.getUniformLocation(prog47,"prMatrix");
// ****** text object 48 ******
var prog48 = gl.createProgram();
gl.attachShader(prog48, getShader( gl, "unnamed_chunk_2vshader48" ));
gl.attachShader(prog48, getShader( gl, "unnamed_chunk_2fshader48" ));
gl.linkProgram(prog48);
var texts = [
""
];
var texinfo = drawTextToCanvas(texts, 1);
var canvasX48 = texinfo.canvasX;
var canvasY48 = texinfo.canvasY;
var ofsLoc48 = gl.getAttribLocation(prog48, "aOfs");
var texture48 = gl.createTexture();
var texLoc48 = gl.getAttribLocation(prog48, "aTexcoord");
var sampler48 = gl.getUniformLocation(prog48,"uSampler");
handleLoadedTexture(texture48, document.getElementById("unnamed_chunk_2textureCanvas"));
var v=new Float32Array([
-5.034, -5.5425, 50, 0, -0.5, 0.5, 0.5,
-5.034, -5.5425, 50, 1, -0.5, 0.5, 0.5,
-5.034, -5.5425, 50, 1, 1.5, 0.5, 0.5,
-5.034, -5.5425, 50, 0, 1.5, 0.5, 0.5
]);
for (var i=0; i<1; i++)
for (var j=0; j<4; j++) {
ind = 7*(4*i + j) + 3;
v[ind+2] = 2*(v[ind]-v[ind+2])*texinfo.widths[i]/width;
v[ind+3] = 2*(v[ind+1]-v[ind+3])*texinfo.textHeight/height;
v[ind] *= texinfo.widths[i]/texinfo.canvasX;
v[ind+1] = 1.0-(texinfo.offset + i*texinfo.skip
- v[ind+1]*texinfo.textHeight)/texinfo.canvasY;
}
var posLoc48 = gl.getAttribLocation(prog48, "aPos");
var colLoc48 = gl.getAttribLocation(prog48, "aCol");
var f=new Uint16Array([
0, 1, 2, 0, 2, 3
]);
var buf48 = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, buf48);
gl.bufferData(gl.ARRAY_BUFFER, v, gl.STATIC_DRAW);
var ibuf48 = gl.createBuffer();
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, ibuf48);
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, f, gl.STATIC_DRAW);
var mvMatLoc48 = gl.getUniformLocation(prog48,"mvMatrix");
var prMatLoc48 = gl.getUniformLocation(prog48,"prMatrix");
// ****** surface object 49 ******
var prog49 = gl.createProgram();
gl.attachShader(prog49, getShader( gl, "unnamed_chunk_2vshader49" ));
gl.attachShader(prog49, getShader( gl, "unnamed_chunk_2fshader49" ));
gl.linkProgram(prog49);
var v=new Float32Array([
-3, -3, -19, 0.5494424, 0.8241633, -0.1373606,
-2.586207, -3, -17.34483, 0.5494424, 0.8241633, -0.1373606,
-2.172414, -3, -15.68966, 0.5494424, 0.8241633, -0.1373606,
-1.758621, -3, -14.03448, 0.5494422, 0.8241634, -0.1373606,
-1.344828, -3, -12.37931, 0.5494422, 0.8241634, -0.1373606,
-0.9310345, -3, -10.72414, 0.5494423, 0.8241634, -0.1373606,
-0.5172414, -3, -9.068966, 0.5494423, 0.8241633, -0.1373606,
-0.1034483, -3, -7.413793, 0.5494423, 0.8241633, -0.1373606,
0.3103448, -3, -5.758621, 0.5494423, 0.8241633, -0.1373606,
0.7241379, -3, -4.103448, 0.5494423, 0.8241633, -0.1373606,
1.137931, -3, -2.448276, 0.5494423, 0.8241633, -0.1373606,
1.551724, -3, -0.7931035, 0.5494423, 0.8241634, -0.1373606,
1.965517, -3, 0.862069, 0.5494423, 0.8241633, -0.1373606,
2.37931, -3, 2.517241, 0.5494423, 0.8241633, -0.1373606,
2.793103, -3, 4.172414, 0.5494423, 0.8241633, -0.1373606,
3.206897, -3, 5.827586, 0.5494423, 0.8241633, -0.1373606,
3.62069, -3, 7.482759, 0.5494423, 0.8241634, -0.1373606,
4.034483, -3, 9.137931, 0.5494422, 0.8241634, -0.1373606,
4.448276, -3, 10.7931, 0.5494423, 0.8241634, -0.1373606,
4.862069, -3, 12.44828, 0.5494423, 0.8241634, -0.1373606,
5.275862, -3, 14.10345, 0.5494423, 0.8241634, -0.1373606,
5.689655, -3, 15.75862, 0.5494424, 0.8241633, -0.1373606,
6.103448, -3, 17.41379, 0.5494425, 0.8241632, -0.1373606,
6.517241, -3, 19.06897, 0.5494425, 0.8241632, -0.1373606,
6.931035, -3, 20.72414, 0.5494425, 0.8241632, -0.1373606,
7.344828, -3, 22.37931, 0.5494423, 0.8241634, -0.1373606,
7.758621, -3, 24.03448, 0.5494423, 0.8241634, -0.1373606,
8.172414, -3, 25.68966, 0.5494424, 0.8241633, -0.1373605,
8.586206, -3, 27.34483, 0.5494424, 0.8241633, -0.1373605,
9, -3, 29, 0.5494417, 0.8241637, -0.1373607,
-3, -2.482759, -15.89655, 0.5494423, 0.8241634, -0.1373606,
-2.586207, -2.482759, -14.24138, 0.5494423, 0.8241634, -0.1373605,
-2.172414, -2.482759, -12.58621, 0.5494423, 0.8241634, -0.1373605,
-1.758621, -2.482759, -10.93103, 0.5494422, 0.8241634, -0.1373606,
-1.344828, -2.482759, -9.275862, 0.5494422, 0.8241634, -0.1373606,
-0.9310345, -2.482759, -7.62069, 0.5494422, 0.8241634, -0.1373606,
-0.5172414, -2.482759, -5.965517, 0.5494423, 0.8241634, -0.1373606,
-0.1034483, -2.482759, -4.310345, 0.5494422, 0.8241634, -0.1373606,
0.3103448, -2.482759, -2.655172, 0.5494422, 0.8241634, -0.1373606,
0.7241379, -2.482759, -1, 0.5494423, 0.8241634, -0.1373606,
1.137931, -2.482759, 0.6551724, 0.5494422, 0.8241634, -0.1373606,
1.551724, -2.482759, 2.310345, 0.5494422, 0.8241634, -0.1373606,
1.965517, -2.482759, 3.965517, 0.5494423, 0.8241634, -0.1373606,
2.37931, -2.482759, 5.62069, 0.5494423, 0.8241634, -0.1373606,
2.793103, -2.482759, 7.275862, 0.5494422, 0.8241634, -0.1373606,
3.206897, -2.482759, 8.931034, 0.5494422, 0.8241634, -0.1373606,
3.62069, -2.482759, 10.58621, 0.5494422, 0.8241634, -0.1373606,
4.034483, -2.482759, 12.24138, 0.5494422, 0.8241634, -0.1373606,
4.448276, -2.482759, 13.89655, 0.5494422, 0.8241634, -0.1373606,
4.862069, -2.482759, 15.55172, 0.5494422, 0.8241634, -0.1373606,
5.275862, -2.482759, 17.2069, 0.5494422, 0.8241634, -0.1373606,
5.689655, -2.482759, 18.86207, 0.5494423, 0.8241634, -0.1373606,
6.103448, -2.482759, 20.51724, 0.5494423, 0.8241634, -0.1373606,
6.517241, -2.482759, 22.17241, 0.5494424, 0.8241633, -0.1373605,
6.931035, -2.482759, 23.82759, 0.5494424, 0.8241633, -0.1373605,
7.344828, -2.482759, 25.48276, 0.5494423, 0.8241634, -0.1373606,
7.758621, -2.482759, 27.13793, 0.5494423, 0.8241634, -0.1373606,
8.172414, -2.482759, 28.7931, 0.5494425, 0.8241632, -0.1373605,
8.586206, -2.482759, 30.44828, 0.5494422, 0.8241634, -0.1373606,
9, -2.482759, 32.10345, 0.5494416, 0.8241638, -0.1373606,
-3, -1.965517, -12.7931, 0.5494422, 0.8241634, -0.1373605,
-2.586207, -1.965517, -11.13793, 0.5494423, 0.8241634, -0.1373606,
-2.172414, -1.965517, -9.482759, 0.5494423, 0.8241634, -0.1373606,
-1.758621, -1.965517, -7.827586, 0.5494422, 0.8241634, -0.1373606,
-1.344828, -1.965517, -6.172414, 0.5494422, 0.8241634, -0.1373606,
-0.9310345, -1.965517, -4.517241, 0.5494423, 0.8241634, -0.1373606,
-0.5172414, -1.965517, -2.862069, 0.5494422, 0.8241634, -0.1373606,
-0.1034483, -1.965517, -1.206897, 0.5494423, 0.8241634, -0.1373606,
0.3103448, -1.965517, 0.4482759, 0.5494423, 0.8241634, -0.1373606,
0.7241379, -1.965517, 2.103448, 0.5494423, 0.8241634, -0.1373606,
1.137931, -1.965517, 3.758621, 0.5494422, 0.8241634, -0.1373606,
1.551724, -1.965517, 5.413793, 0.5494422, 0.8241634, -0.1373606,
1.965517, -1.965517, 7.068965, 0.5494423, 0.8241634, -0.1373606,
2.37931, -1.965517, 8.724138, 0.5494423, 0.8241634, -0.1373606,
2.793103, -1.965517, 10.37931, 0.5494422, 0.8241634, -0.1373606,
3.206897, -1.965517, 12.03448, 0.5494422, 0.8241634, -0.1373606,
3.62069, -1.965517, 13.68966, 0.5494422, 0.8241634, -0.1373606,
4.034483, -1.965517, 15.34483, 0.5494421, 0.8241635, -0.1373606,
4.448276, -1.965517, 17, 0.5494422, 0.8241634, -0.1373606,
4.862069, -1.965517, 18.65517, 0.5494422, 0.8241634, -0.1373606,
5.275862, -1.965517, 20.31034, 0.5494422, 0.8241634, -0.1373605,
5.689655, -1.965517, 21.96552, 0.5494422, 0.8241634, -0.1373605,
6.103448, -1.965517, 23.62069, 0.5494422, 0.8241634, -0.1373605,
6.517241, -1.965517, 25.27586, 0.5494423, 0.8241634, -0.1373605,
6.931035, -1.965517, 26.93103, 0.5494423, 0.8241634, -0.1373606,
7.344828, -1.965517, 28.58621, 0.5494423, 0.8241634, -0.1373606,
7.758621, -1.965517, 30.24138, 0.5494423, 0.8241634, -0.1373606,
8.172414, -1.965517, 31.89655, 0.5494426, 0.8241631, -0.1373605,
8.586206, -1.965517, 33.55172, 0.5494423, 0.8241634, -0.1373605,
9, -1.965517, 35.2069, 0.5494418, 0.8241637, -0.1373606,
-3, -1.448276, -9.689655, 0.5494423, 0.8241633, -0.1373606,
-2.586207, -1.448276, -8.034483, 0.5494423, 0.8241634, -0.1373606,
-2.172414, -1.448276, -6.37931, 0.5494423, 0.8241634, -0.1373606,
-1.758621, -1.448276, -4.724138, 0.5494422, 0.8241634, -0.1373606,
-1.344828, -1.448276, -3.068965, 0.5494422, 0.8241634, -0.1373606,
-0.9310345, -1.448276, -1.413793, 0.5494423, 0.8241634, -0.1373606,
-0.5172414, -1.448276, 0.2413793, 0.5494423, 0.8241634, -0.1373606,
-0.1034483, -1.448276, 1.896552, 0.5494423, 0.8241634, -0.1373606,
0.3103448, -1.448276, 3.551724, 0.5494423, 0.8241634, -0.1373606,
0.7241379, -1.448276, 5.206897, 0.5494423, 0.8241634, -0.1373606,
1.137931, -1.448276, 6.862069, 0.5494422, 0.8241634, -0.1373606,
1.551724, -1.448276, 8.517241, 0.5494422, 0.8241634, -0.1373606,
1.965517, -1.448276, 10.17241, 0.5494423, 0.8241633, -0.1373606,
2.37931, -1.448276, 11.82759, 0.5494423, 0.8241633, -0.1373606,
2.793103, -1.448276, 13.48276, 0.5494423, 0.8241633, -0.1373606,
3.206897, -1.448276, 15.13793, 0.5494424, 0.8241633, -0.1373606,
3.62069, -1.448276, 16.7931, 0.5494423, 0.8241634, -0.1373606,
4.034483, -1.448276, 18.44828, 0.5494422, 0.8241634, -0.1373606,
4.448276, -1.448276, 20.10345, 0.5494423, 0.8241633, -0.1373606,
4.862069, -1.448276, 21.75862, 0.5494423, 0.8241633, -0.1373606,
5.275862, -1.448276, 23.41379, 0.5494423, 0.8241633, -0.1373606,
5.689655, -1.448276, 25.06897, 0.5494423, 0.8241633, -0.1373606,
6.103448, -1.448276, 26.72414, 0.5494423, 0.8241634, -0.1373605,
6.517241, -1.448276, 28.37931, 0.5494422, 0.8241634, -0.1373605,
6.931035, -1.448276, 30.03448, 0.5494422, 0.8241634, -0.1373605,
7.344828, -1.448276, 31.68966, 0.5494421, 0.8241635, -0.1373606,
7.758621, -1.448276, 33.34483, 0.5494423, 0.8241634, -0.1373605,
8.172414, -1.448276, 35, 0.5494426, 0.8241631, -0.1373605,
8.586206, -1.448276, 36.65517, 0.5494424, 0.8241633, -0.1373606,
9, -1.448276, 38.31034, 0.5494415, 0.8241639, -0.1373607,
-3, -0.9310345, -6.586207, 0.5494422, 0.8241634, -0.1373606,
-2.586207, -0.9310345, -4.931035, 0.5494423, 0.8241634, -0.1373606,
-2.172414, -0.9310345, -3.275862, 0.5494423, 0.8241634, -0.1373606,
-1.758621, -0.9310345, -1.62069, 0.5494422, 0.8241634, -0.1373606,
-1.344828, -0.9310345, 0.03448276, 0.5494422, 0.8241634, -0.1373606,
-0.9310345, -0.9310345, 1.689655, 0.5494422, 0.8241634, -0.1373606,
-0.5172414, -0.9310345, 3.344828, 0.5494422, 0.8241634, -0.1373606,
-0.1034483, -0.9310345, 5, 0.5494422, 0.8241634, -0.1373606,
0.3103448, -0.9310345, 6.655172, 0.5494423, 0.8241634, -0.1373606,
0.7241379, -0.9310345, 8.310345, 0.5494423, 0.8241634, -0.1373606,
1.137931, -0.9310345, 9.965517, 0.5494422, 0.8241634, -0.1373606,
1.551724, -0.9310345, 11.62069, 0.5494422, 0.8241634, -0.1373606,
1.965517, -0.9310345, 13.27586, 0.5494422, 0.8241634, -0.1373606,
2.37931, -0.9310345, 14.93103, 0.5494422, 0.8241634, -0.1373606,
2.793103, -0.9310345, 16.58621, 0.5494422, 0.8241634, -0.1373606,
3.206897, -0.9310345, 18.24138, 0.5494423, 0.8241634, -0.1373606,
3.62069, -0.9310345, 19.89655, 0.5494422, 0.8241634, -0.1373606,
4.034483, -0.9310345, 21.55172, 0.5494422, 0.8241634, -0.1373606,
4.448276, -0.9310345, 23.2069, 0.5494423, 0.8241634, -0.1373606,
4.862069, -0.9310345, 24.86207, 0.5494423, 0.8241634, -0.1373606,
5.275862, -0.9310345, 26.51724, 0.5494423, 0.8241634, -0.1373606,
5.689655, -0.9310345, 28.17241, 0.5494424, 0.8241633, -0.1373605,
6.103448, -0.9310345, 29.82759, 0.5494424, 0.8241633, -0.1373605,
6.517241, -0.9310345, 31.48276, 0.5494423, 0.8241634, -0.1373605,
6.931035, -0.9310345, 33.13793, 0.5494421, 0.8241635, -0.1373606,
7.344828, -0.9310345, 34.7931, 0.5494422, 0.8241635, -0.1373605,
7.758621, -0.9310345, 36.44828, 0.5494422, 0.8241635, -0.1373605,
8.172414, -0.9310345, 38.10345, 0.5494426, 0.8241632, -0.1373605,
8.586206, -0.9310345, 39.75862, 0.5494422, 0.8241634, -0.1373606,
9, -0.9310345, 41.41379, 0.5494417, 0.8241638, -0.1373606,
-3, -0.4137931, -3.482759, 0.5494423, 0.8241634, -0.1373606,
-2.586207, -0.4137931, -1.827586, 0.5494423, 0.8241634, -0.1373606,
-2.172414, -0.4137931, -0.1724138, 0.5494423, 0.8241634, -0.1373606,
-1.758621, -0.4137931, 1.482759, 0.5494422, 0.8241634, -0.1373606,
-1.344828, -0.4137931, 3.137931, 0.5494422, 0.8241634, -0.1373606,
-0.9310345, -0.4137931, 4.793103, 0.5494423, 0.8241634, -0.1373606,
-0.5172414, -0.4137931, 6.448276, 0.5494423, 0.8241634, -0.1373606,
-0.1034483, -0.4137931, 8.103448, 0.5494422, 0.8241634, -0.1373606,
0.3103448, -0.4137931, 9.75862, 0.5494423, 0.8241634, -0.1373606,
0.7241379, -0.4137931, 11.41379, 0.5494423, 0.8241634, -0.1373606,
1.137931, -0.4137931, 13.06897, 0.5494422, 0.8241634, -0.1373606,
1.551724, -0.4137931, 14.72414, 0.5494423, 0.8241634, -0.1373606,
1.965517, -0.4137931, 16.37931, 0.5494422, 0.8241634, -0.1373605,
2.37931, -0.4137931, 18.03448, 0.5494422, 0.8241634, -0.1373605,
2.793103, -0.4137931, 19.68966, 0.5494422, 0.8241634, -0.1373605,
3.206897, -0.4137931, 21.34483, 0.5494422, 0.8241634, -0.1373605,
3.62069, -0.4137931, 23, 0.5494421, 0.8241635, -0.1373606,
4.034483, -0.4137931, 24.65517, 0.5494421, 0.8241635, -0.1373606,
4.448276, -0.4137931, 26.31034, 0.5494422, 0.8241634, -0.1373605,
4.862069, -0.4137931, 27.96552, 0.5494422, 0.8241634, -0.1373605,
5.275862, -0.4137931, 29.62069, 0.5494422, 0.8241634, -0.1373606,
5.689655, -0.4137931, 31.27586, 0.5494424, 0.8241633, -0.1373606,
6.103448, -0.4137931, 32.93103, 0.5494424, 0.8241633, -0.1373606,
6.517241, -0.4137931, 34.58621, 0.5494424, 0.8241633, -0.1373606,
6.931035, -0.4137931, 36.24138, 0.5494422, 0.8241634, -0.1373606,
7.344828, -0.4137931, 37.89655, 0.5494424, 0.8241633, -0.1373606,
7.758621, -0.4137931, 39.55172, 0.5494422, 0.8241634, -0.1373605,
8.172414, -0.4137931, 41.2069, 0.5494424, 0.8241633, -0.1373605,
8.586206, -0.4137931, 42.86207, 0.5494422, 0.8241634, -0.1373605,
9, -0.4137931, 44.51724, 0.5494418, 0.8241637, -0.1373606,
-3, 0.1034483, -0.3793103, 0.5494423, 0.8241634, -0.1373606,
-2.586207, 0.1034483, 1.275862, 0.5494423, 0.8241634, -0.1373606,
-2.172414, 0.1034483, 2.931035, 0.5494423, 0.8241634, -0.1373606,
-1.758621, 0.1034483, 4.586207, 0.5494422, 0.8241634, -0.1373606,
-1.344828, 0.1034483, 6.241379, 0.5494422, 0.8241634, -0.1373606,
-0.9310345, 0.1034483, 7.896552, 0.5494423, 0.8241634, -0.1373606,
-0.5172414, 0.1034483, 9.551724, 0.5494422, 0.8241634, -0.1373606,
-0.1034483, 0.1034483, 11.2069, 0.5494422, 0.8241634, -0.1373606,
0.3103448, 0.1034483, 12.86207, 0.5494423, 0.8241634, -0.1373606,
0.7241379, 0.1034483, 14.51724, 0.5494422, 0.8241634, -0.1373606,
1.137931, 0.1034483, 16.17241, 0.5494423, 0.8241634, -0.1373606,
1.551724, 0.1034483, 17.82759, 0.5494423, 0.8241633, -0.1373606,
1.965517, 0.1034483, 19.48276, 0.5494423, 0.8241634, -0.1373606,
2.37931, 0.1034483, 21.13793, 0.5494423, 0.8241634, -0.1373606,
2.793103, 0.1034483, 22.7931, 0.5494423, 0.8241634, -0.1373606,
3.206897, 0.1034483, 24.44828, 0.5494423, 0.8241634, -0.1373606,
3.62069, 0.1034483, 26.10345, 0.5494422, 0.8241634, -0.1373606,
4.034483, 0.1034483, 27.75862, 0.5494422, 0.8241634, -0.1373606,
4.448276, 0.1034483, 29.41379, 0.5494423, 0.8241634, -0.1373605,
4.862069, 0.1034483, 31.06897, 0.5494421, 0.8241635, -0.1373606,
5.275862, 0.1034483, 32.72414, 0.5494423, 0.8241634, -0.1373605,
5.689655, 0.1034483, 34.37931, 0.5494422, 0.8241634, -0.1373606,
6.103448, 0.1034483, 36.03448, 0.5494424, 0.8241633, -0.1373605,
6.517241, 0.1034483, 37.68966, 0.5494422, 0.8241634, -0.1373606,
6.931035, 0.1034483, 39.34483, 0.5494424, 0.8241633, -0.1373605,
7.344828, 0.1034483, 41, 0.5494424, 0.8241633, -0.1373605,
7.758621, 0.1034483, 42.65517, 0.5494424, 0.8241633, -0.1373605,
8.172414, 0.1034483, 44.31034, 0.5494424, 0.8241633, -0.1373606,
8.586206, 0.1034483, 45.96552, 0.5494424, 0.8241633, -0.1373605,
9, 0.1034483, 47.62069, 0.5494415, 0.8241639, -0.1373607,
-3, 0.6206896, 2.724138, 0.5494422, 0.8241634, -0.1373606,
-2.586207, 0.6206896, 4.37931, 0.5494423, 0.8241634, -0.1373606,
-2.172414, 0.6206896, 6.034483, 0.5494423, 0.8241634, -0.1373606,
-1.758621, 0.6206896, 7.689655, 0.5494422, 0.8241634, -0.1373606,
-1.344828, 0.6206896, 9.344828, 0.5494422, 0.8241634, -0.1373606,
-0.9310345, 0.6206896, 11, 0.5494423, 0.8241634, -0.1373606,
-0.5172414, 0.6206896, 12.65517, 0.5494423, 0.8241634, -0.1373606,
-0.1034483, 0.6206896, 14.31034, 0.5494423, 0.8241634, -0.1373606,
0.3103448, 0.6206896, 15.96552, 0.5494422, 0.8241634, -0.1373606,
0.7241379, 0.6206896, 17.62069, 0.5494422, 0.8241634, -0.1373606,
1.137931, 0.6206896, 19.27586, 0.5494422, 0.8241634, -0.1373605,
1.551724, 0.6206896, 20.93103, 0.5494422, 0.8241634, -0.1373606,
1.965517, 0.6206896, 22.58621, 0.5494423, 0.8241634, -0.1373606,
2.37931, 0.6206896, 24.24138, 0.5494423, 0.8241634, -0.1373606,
2.793103, 0.6206896, 25.89655, 0.5494423, 0.8241634, -0.1373606,
3.206897, 0.6206896, 27.55172, 0.5494423, 0.8241634, -0.1373606,
3.62069, 0.6206896, 29.2069, 0.5494422, 0.8241634, -0.1373606,
4.034483, 0.6206896, 30.86207, 0.5494423, 0.8241634, -0.1373605,
4.448276, 0.6206896, 32.51724, 0.5494422, 0.8241634, -0.1373606,
4.862069, 0.6206896, 34.17241, 0.5494422, 0.8241634, -0.1373605,
5.275862, 0.6206896, 35.82759, 0.5494422, 0.8241634, -0.1373605,
5.689655, 0.6206896, 37.48276, 0.5494422, 0.8241634, -0.1373605,
6.103448, 0.6206896, 39.13793, 0.5494422, 0.8241634, -0.1373605,
6.517241, 0.6206896, 40.7931, 0.5494422, 0.8241634, -0.1373605,
6.931035, 0.6206896, 42.44828, 0.5494422, 0.8241634, -0.1373605,
7.344828, 0.6206896, 44.10345, 0.5494424, 0.8241633, -0.1373605,
7.758621, 0.6206896, 45.75862, 0.5494422, 0.8241634, -0.1373606,
8.172414, 0.6206896, 47.41379, 0.5494426, 0.8241632, -0.1373605,
8.586206, 0.6206896, 49.06897, 0.5494422, 0.8241634, -0.1373606,
9, 0.6206896, 50.72414, 0.5494417, 0.8241638, -0.1373606,
-3, 1.137931, 5.827586, 0.5494423, 0.8241634, -0.1373606,
-2.586207, 1.137931, 7.482759, 0.5494423, 0.8241633, -0.1373606,
-2.172414, 1.137931, 9.137931, 0.5494423, 0.8241633, -0.1373606,
-1.758621, 1.137931, 10.7931, 0.5494422, 0.8241634, -0.1373606,
-1.344828, 1.137931, 12.44828, 0.5494422, 0.8241634, -0.1373606,
-0.9310345, 1.137931, 14.10345, 0.5494423, 0.8241634, -0.1373606,
-0.5172414, 1.137931, 15.75862, 0.5494424, 0.8241633, -0.1373606,
-0.1034483, 1.137931, 17.41379, 0.5494424, 0.8241633, -0.1373606,
0.3103448, 1.137931, 19.06897, 0.5494423, 0.8241633, -0.1373606,
0.7241379, 1.137931, 20.72414, 0.5494423, 0.8241633, -0.1373606,
1.137931, 1.137931, 22.37931, 0.5494422, 0.8241634, -0.1373606,
1.551724, 1.137931, 24.03448, 0.5494422, 0.8241634, -0.1373606,
1.965517, 1.137931, 25.68966, 0.5494422, 0.8241634, -0.1373606,
2.37931, 1.137931, 27.34483, 0.5494422, 0.8241634, -0.1373606,
2.793103, 1.137931, 29, 0.5494422, 0.8241634, -0.1373606,
3.206897, 1.137931, 30.65517, 0.5494423, 0.8241633, -0.1373606,
3.62069, 1.137931, 32.31034, 0.5494422, 0.8241634, -0.1373606,
4.034483, 1.137931, 33.96552, 0.5494423, 0.8241633, -0.1373606,
4.448276, 1.137931, 35.62069, 0.5494422, 0.8241634, -0.1373606,
4.862069, 1.137931, 37.27586, 0.5494424, 0.8241633, -0.1373606,
5.275862, 1.137931, 38.93103, 0.5494422, 0.8241634, -0.1373606,
5.689655, 1.137931, 40.58621, 0.5494424, 0.8241633, -0.1373606,
6.103448, 1.137931, 42.24138, 0.5494422, 0.8241634, -0.1373606,
6.517241, 1.137931, 43.89655, 0.5494424, 0.8241633, -0.1373606,
6.931035, 1.137931, 45.55172, 0.5494422, 0.8241634, -0.1373606,
7.344828, 1.137931, 47.2069, 0.5494422, 0.8241634, -0.1373606,
7.758621, 1.137931, 48.86207, 0.5494422, 0.8241634, -0.1373606,
8.172414, 1.137931, 50.51724, 0.5494424, 0.8241633, -0.1373605,
8.586206, 1.137931, 52.17241, 0.5494422, 0.8241634, -0.1373606,
9, 1.137931, 53.82759, 0.5494419, 0.8241636, -0.1373606,
-3, 1.655172, 8.931034, 0.5494423, 0.8241633, -0.1373606,
-2.586207, 1.655172, 10.58621, 0.5494423, 0.8241633, -0.1373606,
-2.172414, 1.655172, 12.24138, 0.5494423, 0.8241633, -0.1373606,
-1.758621, 1.655172, 13.89655, 0.5494422, 0.8241634, -0.1373606,
-1.344828, 1.655172, 15.55172, 0.5494422, 0.8241634, -0.1373606,
-0.9310345, 1.655172, 17.2069, 0.5494422, 0.8241634, -0.1373606,
-0.5172414, 1.655172, 18.86207, 0.5494423, 0.8241634, -0.1373606,
-0.1034483, 1.655172, 20.51724, 0.5494423, 0.8241633, -0.1373606,
0.3103448, 1.655172, 22.17241, 0.5494424, 0.8241633, -0.1373606,
0.7241379, 1.655172, 23.82759, 0.5494424, 0.8241633, -0.1373606,
1.137931, 1.655172, 25.48276, 0.5494423, 0.8241634, -0.1373606,
1.551724, 1.655172, 27.13793, 0.5494423, 0.8241634, -0.1373606,
1.965517, 1.655172, 28.7931, 0.5494423, 0.8241633, -0.1373606,
2.37931, 1.655172, 30.44828, 0.5494422, 0.8241634, -0.1373606,
2.793103, 1.655172, 32.10345, 0.5494423, 0.8241633, -0.1373606,
3.206897, 1.655172, 33.75862, 0.5494422, 0.8241634, -0.1373606,
3.62069, 1.655172, 35.41379, 0.5494423, 0.8241633, -0.1373606,
4.034483, 1.655172, 37.06897, 0.5494421, 0.8241635, -0.1373606,
4.448276, 1.655172, 38.72414, 0.5494424, 0.8241633, -0.1373606,
4.862069, 1.655172, 40.37931, 0.5494422, 0.8241634, -0.1373606,
5.275862, 1.655172, 42.03448, 0.5494424, 0.8241633, -0.1373606,
5.689655, 1.655172, 43.68966, 0.5494422, 0.8241634, -0.1373606,
6.103448, 1.655172, 45.34483, 0.5494424, 0.8241633, -0.1373606,
6.517241, 1.655172, 47, 0.5494424, 0.8241633, -0.1373606,
6.931035, 1.655172, 48.65517, 0.5494424, 0.8241633, -0.1373606,
7.344828, 1.655172, 50.31034, 0.5494422, 0.8241634, -0.1373606,
7.758621, 1.655172, 51.96552, 0.5494424, 0.8241633, -0.1373606,
8.172414, 1.655172, 53.62069, 0.5494424, 0.8241633, -0.1373606,
8.586206, 1.655172, 55.27586, 0.5494424, 0.8241633, -0.1373606,
9, 1.655172, 56.93103, 0.5494415, 0.8241638, -0.1373607,
-3, 2.172414, 12.03448, 0.5494422, 0.8241634, -0.1373605,
-2.586207, 2.172414, 13.68966, 0.5494422, 0.8241634, -0.1373605,
-2.172414, 2.172414, 15.34483, 0.5494422, 0.8241634, -0.1373605,
-1.758621, 2.172414, 17, 0.5494421, 0.8241635, -0.1373606,
-1.344828, 2.172414, 18.65517, 0.5494421, 0.8241635, -0.1373605,
-0.9310345, 2.172414, 20.31034, 0.5494421, 0.8241635, -0.1373605,
-0.5172414, 2.172414, 21.96552, 0.5494421, 0.8241635, -0.1373605,
-0.1034483, 2.172414, 23.62069, 0.5494421, 0.8241635, -0.1373605,
0.3103448, 2.172414, 25.27586, 0.5494422, 0.8241634, -0.1373605,
0.7241379, 2.172414, 26.93103, 0.5494422, 0.8241634, -0.1373606,
1.137931, 2.172414, 28.58621, 0.5494422, 0.8241634, -0.1373606,
1.551724, 2.172414, 30.24138, 0.5494422, 0.8241634, -0.1373606,
1.965517, 2.172414, 31.89655, 0.5494424, 0.8241633, -0.1373606,
2.37931, 2.172414, 33.55172, 0.5494422, 0.8241634, -0.1373605,
2.793103, 2.172414, 35.2069, 0.5494421, 0.8241635, -0.1373605,
3.206897, 2.172414, 36.86207, 0.5494421, 0.8241635, -0.1373605,
3.62069, 2.172414, 38.51724, 0.549442, 0.8241635, -0.1373605,
4.034483, 2.172414, 40.17241, 0.549442, 0.8241635, -0.1373605,
4.448276, 2.172414, 41.82759, 0.5494421, 0.8241635, -0.1373605,
4.862069, 2.172414, 43.48276, 0.5494421, 0.8241635, -0.1373605,
5.275862, 2.172414, 45.13793, 0.5494421, 0.8241635, -0.1373605,
5.689655, 2.172414, 46.7931, 0.5494421, 0.8241635, -0.1373605,
6.103448, 2.172414, 48.44828, 0.5494421, 0.8241635, -0.1373605,
6.517241, 2.172414, 50.10345, 0.5494424, 0.8241633, -0.1373605,
6.931035, 2.172414, 51.75862, 0.5494421, 0.8241635, -0.1373606,
7.344828, 2.172414, 53.41379, 0.5494424, 0.8241633, -0.1373605,
7.758621, 2.172414, 55.06897, 0.5494421, 0.8241635, -0.1373606,
8.172414, 2.172414, 56.72414, 0.5494426, 0.8241632, -0.1373605,
8.586206, 2.172414, 58.37931, 0.5494421, 0.8241635, -0.1373606,
9, 2.172414, 60.03448, 0.5494416, 0.8241638, -0.1373606,
-3, 2.689655, 15.13793, 0.5494424, 0.8241633, -0.1373605,
-2.586207, 2.689655, 16.7931, 0.5494423, 0.8241633, -0.1373606,
-2.172414, 2.689655, 18.44828, 0.5494423, 0.8241634, -0.1373606,
-1.758621, 2.689655, 20.10345, 0.5494422, 0.8241634, -0.1373606,
-1.344828, 2.689655, 21.75862, 0.5494423, 0.8241634, -0.1373606,
-0.9310345, 2.689655, 23.41379, 0.5494423, 0.8241634, -0.1373606,
-0.5172414, 2.689655, 25.06897, 0.5494423, 0.8241634, -0.1373606,
-0.1034483, 2.689655, 26.72414, 0.5494423, 0.8241634, -0.1373605,
0.3103448, 2.689655, 28.37931, 0.5494422, 0.8241634, -0.1373605,
0.7241379, 2.689655, 30.03448, 0.5494422, 0.8241634, -0.1373605,
1.137931, 2.689655, 31.68966, 0.549442, 0.8241635, -0.1373606,
1.551724, 2.689655, 33.34483, 0.5494422, 0.8241634, -0.1373606,
1.965517, 2.689655, 35, 0.5494424, 0.8241633, -0.1373605,
2.37931, 2.689655, 36.65517, 0.5494424, 0.8241633, -0.1373605,
2.793103, 2.689655, 38.31034, 0.5494422, 0.8241634, -0.1373606,
3.206897, 2.689655, 39.96552, 0.5494424, 0.8241633, -0.1373605,
3.62069, 2.689655, 41.62069, 0.5494421, 0.8241635, -0.1373606,
4.034483, 2.689655, 43.27586, 0.5494423, 0.8241634, -0.1373606,
4.448276, 2.689655, 44.93103, 0.5494422, 0.8241634, -0.1373606,
4.862069, 2.689655, 46.58621, 0.5494424, 0.8241633, -0.1373605,
5.275862, 2.689655, 48.24138, 0.5494422, 0.8241634, -0.1373606,
5.689655, 2.689655, 49.89655, 0.5494424, 0.8241633, -0.1373605,
6.103448, 2.689655, 51.55172, 0.5494422, 0.8241634, -0.1373605,
6.517241, 2.689655, 53.2069, 0.5494422, 0.8241634, -0.1373605,
6.931035, 2.689655, 54.86207, 0.5494422, 0.8241634, -0.1373605,
7.344828, 2.689655, 56.51724, 0.5494422, 0.8241634, -0.1373605,
7.758621, 2.689655, 58.17241, 0.5494422, 0.8241634, -0.1373605,
8.172414, 2.689655, 59.82759, 0.5494424, 0.8241633, -0.1373605,
8.586206, 2.689655, 61.48276, 0.5494422, 0.8241634, -0.1373606,
9, 2.689655, 63.13793, 0.5494423, 0.8241634, -0.1373606,
-3, 3.206897, 18.24138, 0.5494424, 0.8241633, -0.1373606,
-2.586207, 3.206897, 19.89655, 0.5494424, 0.8241633, -0.1373606,
-2.172414, 3.206897, 21.55172, 0.5494424, 0.8241633, -0.1373606,
-1.758621, 3.206897, 23.2069, 0.5494423, 0.8241633, -0.1373606,
-1.344828, 3.206897, 24.86207, 0.5494423, 0.8241633, -0.1373606,
-0.9310345, 3.206897, 26.51724, 0.5494424, 0.8241633, -0.1373606,
-0.5172414, 3.206897, 28.17241, 0.5494425, 0.8241632, -0.1373606,
-0.1034483, 3.206897, 29.82759, 0.5494425, 0.8241632, -0.1373606,
0.3103448, 3.206897, 31.48276, 0.5494424, 0.8241633, -0.1373606,
0.7241379, 3.206897, 33.13793, 0.5494421, 0.8241634, -0.1373606,
1.137931, 3.206897, 34.7931, 0.5494422, 0.8241634, -0.1373606,
1.551724, 3.206897, 36.44828, 0.5494422, 0.8241634, -0.1373606,
1.965517, 3.206897, 38.10345, 0.5494425, 0.8241632, -0.1373606,
2.37931, 3.206897, 39.75862, 0.5494423, 0.8241634, -0.1373606,
2.793103, 3.206897, 41.41379, 0.5494425, 0.8241632, -0.1373606,
3.206897, 3.206897, 43.06897, 0.5494423, 0.8241634, -0.1373606,
3.62069, 3.206897, 44.72414, 0.5494424, 0.8241633, -0.1373606,
4.034483, 3.206897, 46.37931, 0.5494422, 0.8241634, -0.1373606,
4.448276, 3.206897, 48.03448, 0.5494425, 0.8241632, -0.1373606,
4.862069, 3.206897, 49.68966, 0.5494423, 0.8241634, -0.1373606,
5.275862, 3.206897, 51.34483, 0.5494425, 0.8241632, -0.1373606,
5.689655, 3.206897, 53, 0.5494425, 0.8241632, -0.1373606,
6.103448, 3.206897, 54.65517, 0.5494425, 0.8241632, -0.1373606,
6.517241, 3.206897, 56.31034, 0.5494423, 0.8241634, -0.1373606,
6.931035, 3.206897, 57.96552, 0.5494425, 0.8241632, -0.1373606,
7.344828, 3.206897, 59.62069, 0.5494423, 0.8241634, -0.1373606,
7.758621, 3.206897, 61.27586, 0.5494425, 0.8241632, -0.1373606,
8.172414, 3.206897, 62.93103, 0.5494423, 0.8241634, -0.1373606,
8.586206, 3.206897, 64.5862, 0.5494423, 0.8241634, -0.1373606,
9, 3.206897, 66.24138, 0.5494425, 0.8241632, -0.1373606,
-3, 3.724138, 21.34483, 0.5494422, 0.8241634, -0.1373605,
-2.586207, 3.724138, 23, 0.5494422, 0.8241634, -0.1373605,
-2.172414, 3.724138, 24.65517, 0.5494422, 0.8241634, -0.1373605,
-1.758621, 3.724138, 26.31034, 0.5494421, 0.8241635, -0.1373605,
-1.344828, 3.724138, 27.96552, 0.5494421, 0.8241635, -0.1373605,
-0.9310345, 3.724138, 29.62069, 0.5494422, 0.8241634, -0.1373606,
-0.5172414, 3.724138, 31.27586, 0.5494424, 0.8241633, -0.1373605,
-0.1034483, 3.724138, 32.93103, 0.5494424, 0.8241633, -0.1373606,
0.3103448, 3.724138, 34.58621, 0.5494424, 0.8241633, -0.1373606,
0.7241379, 3.724138, 36.24138, 0.5494422, 0.8241634, -0.1373606,
1.137931, 3.724138, 37.89655, 0.5494423, 0.8241633, -0.1373606,
1.551724, 3.724138, 39.55172, 0.5494421, 0.8241635, -0.1373605,
1.965517, 3.724138, 41.2069, 0.5494422, 0.8241634, -0.1373605,
2.37931, 3.724138, 42.86207, 0.5494422, 0.8241634, -0.1373605,
2.793103, 3.724138, 44.51724, 0.5494422, 0.8241634, -0.1373605,
3.206897, 3.724138, 46.17241, 0.5494422, 0.8241634, -0.1373605,
3.62069, 3.724138, 47.82759, 0.5494421, 0.8241635, -0.1373606,
4.034483, 3.724138, 49.48276, 0.5494421, 0.8241635, -0.1373606,
4.448276, 3.724138, 51.13793, 0.5494422, 0.8241634, -0.1373605,
4.862069, 3.724138, 52.7931, 0.5494422, 0.8241634, -0.1373605,
5.275862, 3.724138, 54.44828, 0.5494422, 0.8241634, -0.1373605,
5.689655, 3.724138, 56.10345, 0.5494424, 0.8241633, -0.1373605,
6.103448, 3.724138, 57.75862, 0.5494422, 0.8241634, -0.1373606,
6.517241, 3.724138, 59.41379, 0.5494424, 0.8241633, -0.1373605,
6.931035, 3.724138, 61.06897, 0.5494422, 0.8241634, -0.1373605,
7.344828, 3.724138, 62.72414, 0.5494422, 0.8241634, -0.1373606,
7.758621, 3.724138, 64.37931, 0.5494426, 0.8241631, -0.1373605,
8.172414, 3.724138, 66.03448, 0.5494422, 0.8241634, -0.1373606,
8.586206, 3.724138, 67.68965, 0.5494419, 0.8241636, -0.1373605,
9, 3.724138, 69.34483, 0.5494415, 0.8241639, -0.1373606,
-3, 4.241379, 24.44828, 0.5494422, 0.8241634, -0.1373606,
-2.586207, 4.241379, 26.10345, 0.5494423, 0.8241634, -0.1373606,
-2.172414, 4.241379, 27.75862, 0.5494423, 0.8241634, -0.1373606,
-1.758621, 4.241379, 29.41379, 0.5494422, 0.8241634, -0.1373606,
-1.344828, 4.241379, 31.06897, 0.549442, 0.8241635, -0.1373606,
-0.9310345, 4.241379, 32.72414, 0.5494423, 0.8241634, -0.1373605,
-0.5172414, 4.241379, 34.37931, 0.5494421, 0.8241635, -0.1373606,
-0.1034483, 4.241379, 36.03448, 0.5494424, 0.8241633, -0.1373605,
0.3103448, 4.241379, 37.68966, 0.5494422, 0.8241634, -0.1373606,
0.7241379, 4.241379, 39.34483, 0.5494424, 0.8241633, -0.1373605,
1.137931, 4.241379, 41, 0.5494423, 0.8241633, -0.1373606,
1.551724, 4.241379, 42.65517, 0.5494423, 0.8241633, -0.1373606,
1.965517, 4.241379, 44.31034, 0.5494422, 0.8241634, -0.1373606,
2.37931, 4.241379, 45.96552, 0.5494424, 0.8241633, -0.1373605,
2.793103, 4.241379, 47.62069, 0.5494422, 0.8241634, -0.1373606,
3.206897, 4.241379, 49.27586, 0.5494424, 0.8241633, -0.1373605,
3.62069, 4.241379, 50.93103, 0.5494421, 0.8241635, -0.1373606,
4.034483, 4.241379, 52.58621, 0.5494423, 0.8241634, -0.1373606,
4.448276, 4.241379, 54.24138, 0.5494422, 0.8241634, -0.1373606,
4.862069, 4.241379, 55.89655, 0.5494424, 0.8241633, -0.1373605,
5.275862, 4.241379, 57.55172, 0.5494422, 0.8241634, -0.1373605,
5.689655, 4.241379, 59.2069, 0.5494422, 0.8241634, -0.1373605,
6.103448, 4.241379, 60.86207, 0.5494422, 0.8241634, -0.1373605,
6.517241, 4.241379, 62.51724, 0.5494424, 0.8241633, -0.1373605,
6.931035, 4.241379, 64.17242, 0.549442, 0.8241636, -0.1373606,
7.344828, 4.241379, 65.82758, 0.5494419, 0.8241636, -0.1373605,
7.758621, 4.241379, 67.48276, 0.5494424, 0.8241633, -0.1373605,
8.172414, 4.241379, 69.13793, 0.5494426, 0.8241632, -0.1373605,
8.586206, 4.241379, 70.79311, 0.5494419, 0.8241636, -0.1373605,
9, 4.241379, 72.44827, 0.5494409, 0.8241642, -0.1373607,
-3, 4.758621, 27.55172, 0.5494424, 0.8241633, -0.1373606,
-2.586207, 4.758621, 29.2069, 0.5494424, 0.8241633, -0.1373606,
-2.172414, 4.758621, 30.86207, 0.5494425, 0.8241632, -0.1373605,
-1.758621, 4.758621, 32.51724, 0.5494422, 0.8241634, -0.1373606,
-1.344828, 4.758621, 34.17241, 0.5494422, 0.8241634, -0.1373606,
-0.9310345, 4.758621, 35.82759, 0.5494423, 0.8241634, -0.1373606,
-0.5172414, 4.758621, 37.48276, 0.5494422, 0.8241634, -0.1373606,
-0.1034483, 4.758621, 39.13793, 0.5494423, 0.8241634, -0.1373606,
0.3103448, 4.758621, 40.7931, 0.5494423, 0.8241634, -0.1373606,
0.7241379, 4.758621, 42.44828, 0.5494423, 0.8241634, -0.1373606,
1.137931, 4.758621, 44.10345, 0.5494424, 0.8241633, -0.1373606,
1.551724, 4.758621, 45.75862, 0.5494422, 0.8241634, -0.1373606,
1.965517, 4.758621, 47.41379, 0.5494425, 0.8241632, -0.1373606,
2.37931, 4.758621, 49.06897, 0.5494423, 0.8241634, -0.1373606,
2.793103, 4.758621, 50.72414, 0.5494425, 0.8241632, -0.1373606,
3.206897, 4.758621, 52.37931, 0.5494423, 0.8241634, -0.1373606,
3.62069, 4.758621, 54.03448, 0.5494424, 0.8241633, -0.1373606,
4.034483, 4.758621, 55.68966, 0.5494422, 0.8241634, -0.1373606,
4.448276, 4.758621, 57.34483, 0.5494425, 0.8241632, -0.1373606,
4.862069, 4.758621, 59, 0.5494425, 0.8241632, -0.1373606,
5.275862, 4.758621, 60.65517, 0.5494425, 0.8241632, -0.1373606,
5.689655, 4.758621, 62.31034, 0.5494423, 0.8241634, -0.1373606,
6.103448, 4.758621, 63.96552, 0.5494423, 0.8241634, -0.1373606,
6.517241, 4.758621, 65.62069, 0.5494427, 0.8241631, -0.1373606,
6.931035, 4.758621, 67.27586, 0.5494425, 0.8241632, -0.1373606,
7.344828, 4.758621, 68.93104, 0.549442, 0.8241635, -0.1373606,
7.758621, 4.758621, 70.5862, 0.549442, 0.8241635, -0.1373607,
8.172414, 4.758621, 72.24138, 0.5494431, 0.8241628, -0.1373605,
8.586206, 4.758621, 73.89655, 0.5494425, 0.8241632, -0.1373606,
9, 4.758621, 75.55173, 0.5494422, 0.8241634, -0.1373605,
-3, 5.275862, 30.65517, 0.5494421, 0.8241635, -0.1373605,
-2.586207, 5.275862, 32.31034, 0.5494422, 0.8241634, -0.1373605,
-2.172414, 5.275862, 33.96552, 0.5494423, 0.8241634, -0.1373605,
-1.758621, 5.275862, 35.62069, 0.549442, 0.8241635, -0.1373606,
-1.344828, 5.275862, 37.27586, 0.5494423, 0.8241634, -0.1373605,
-0.9310345, 5.275862, 38.93103, 0.5494421, 0.8241635, -0.1373606,
-0.5172414, 5.275862, 40.58621, 0.5494423, 0.8241634, -0.1373605,
-0.1034483, 5.275862, 42.24138, 0.5494421, 0.8241635, -0.1373606,
0.3103448, 5.275862, 43.89655, 0.5494423, 0.8241634, -0.1373605,
0.7241379, 5.275862, 45.55172, 0.5494421, 0.8241635, -0.1373605,
1.137931, 5.275862, 47.2069, 0.549442, 0.8241635, -0.1373605,
1.551724, 5.275862, 48.86207, 0.549442, 0.8241635, -0.1373605,
1.965517, 5.275862, 50.51724, 0.5494421, 0.8241635, -0.1373605,
2.37931, 5.275862, 52.17241, 0.5494421, 0.8241635, -0.1373605,
2.793103, 5.275862, 53.82759, 0.5494421, 0.8241635, -0.1373605,
3.206897, 5.275862, 55.48276, 0.5494421, 0.8241635, -0.1373605,
3.62069, 5.275862, 57.13793, 0.549442, 0.8241636, -0.1373605,
4.034483, 5.275862, 58.7931, 0.549442, 0.8241636, -0.1373605,
4.448276, 5.275862, 60.44828, 0.5494421, 0.8241635, -0.1373605,
4.862069, 5.275862, 62.10345, 0.5494423, 0.8241633, -0.1373606,
5.275862, 5.275862, 63.75862, 0.5494425, 0.8241632, -0.1373605,
5.689655, 5.275862, 65.4138, 0.5494421, 0.8241635, -0.1373606,
6.103448, 5.275862, 67.06896, 0.5494419, 0.8241636, -0.1373606,
6.517241, 5.275862, 68.72414, 0.5494423, 0.8241634, -0.1373605,
6.931035, 5.275862, 70.37931, 0.5494428, 0.8241631, -0.1373605,
7.344828, 5.275862, 72.03448, 0.5494419, 0.8241636, -0.1373606,
7.758621, 5.275862, 73.68965, 0.5494419, 0.8241637, -0.1373605,
8.172414, 5.275862, 75.34483, 0.5494425, 0.8241632, -0.1373605,
8.586206, 5.275862, 77, 0.5494428, 0.8241631, -0.1373605,
9, 5.275862, 78.65517, 0.5494423, 0.8241634, -0.1373606,
-3, 5.793103, 33.75862, 0.5494419, 0.8241636, -0.1373606,
-2.586207, 5.793103, 35.41379, 0.5494423, 0.8241634, -0.1373605,
-2.172414, 5.793103, 37.06897, 0.5494421, 0.8241635, -0.1373606,
-1.758621, 5.793103, 38.72414, 0.5494423, 0.8241634, -0.1373605,
-1.344828, 5.793103, 40.37931, 0.5494421, 0.8241635, -0.1373606,
-0.9310345, 5.793103, 42.03448, 0.5494423, 0.8241634, -0.1373605,
-0.5172414, 5.793103, 43.68966, 0.5494421, 0.8241635, -0.1373606,
-0.1034483, 5.793103, 45.34483, 0.5494423, 0.8241634, -0.1373605,
0.3103448, 5.793103, 47, 0.5494423, 0.8241634, -0.1373605,
0.7241379, 5.793103, 48.65517, 0.5494423, 0.8241634, -0.1373605,
1.137931, 5.793103, 50.31034, 0.549442, 0.8241635, -0.1373606,
1.551724, 5.793103, 51.96552, 0.5494423, 0.8241634, -0.1373605,
1.965517, 5.793103, 53.62069, 0.5494421, 0.8241635, -0.1373606,
2.37931, 5.793103, 55.27586, 0.5494423, 0.8241634, -0.1373605,
2.793103, 5.793103, 56.93103, 0.5494421, 0.8241635, -0.1373606,
3.206897, 5.793103, 58.58621, 0.5494423, 0.8241634, -0.1373605,
3.62069, 5.793103, 60.24138, 0.549442, 0.8241636, -0.1373606,
4.034483, 5.793103, 61.89655, 0.5494422, 0.8241634, -0.1373605,
4.448276, 5.793103, 63.55172, 0.5494419, 0.8241636, -0.1373606,
4.862069, 5.793103, 65.20689, 0.5494421, 0.8241635, -0.1373605,
5.275862, 5.793103, 66.86207, 0.5494423, 0.8241634, -0.1373605,
5.689655, 5.793103, 68.51724, 0.5494423, 0.8241634, -0.1373605,
6.103448, 5.793103, 70.17242, 0.5494419, 0.8241637, -0.1373605,
6.517241, 5.793103, 71.82758, 0.5494419, 0.8241637, -0.1373605,
6.931035, 5.793103, 73.48276, 0.5494423, 0.8241634, -0.1373605,
7.344828, 5.793103, 75.13793, 0.5494423, 0.8241634, -0.1373605,
7.758621, 5.793103, 76.79311, 0.5494419, 0.8241637, -0.1373605,
8.172414, 5.793103, 78.44827, 0.5494421, 0.8241635, -0.1373605,
8.586206, 5.793103, 80.10345, 0.5494423, 0.8241634, -0.1373605,
9, 5.793103, 81.75862, 0.5494424, 0.8241633, -0.1373606,
-3, 6.310345, 36.86207, 0.5494423, 0.8241633, -0.1373605,
-2.586207, 6.310345, 38.51724, 0.5494423, 0.8241634, -0.1373606,
-2.172414, 6.310345, 40.17241, 0.5494423, 0.8241634, -0.1373606,
-1.758621, 6.310345, 41.82759, 0.5494422, 0.8241634, -0.1373606,
-1.344828, 6.310345, 43.48276, 0.5494422, 0.8241634, -0.1373606,
-0.9310345, 6.310345, 45.13793, 0.5494423, 0.8241634, -0.1373606,
-0.5172414, 6.310345, 46.7931, 0.5494422, 0.8241634, -0.1373606,
-0.1034483, 6.310345, 48.44828, 0.5494423, 0.8241634, -0.1373606,
0.3103448, 6.310345, 50.10345, 0.5494425, 0.8241632, -0.1373606,
0.7241379, 6.310345, 51.75862, 0.5494423, 0.8241634, -0.1373606,
1.137931, 6.310345, 53.41379, 0.5494424, 0.8241633, -0.1373606,
1.551724, 6.310345, 55.06897, 0.5494422, 0.8241634, -0.1373606,
1.965517, 6.310345, 56.72414, 0.5494425, 0.8241632, -0.1373606,
2.37931, 6.310345, 58.37931, 0.5494423, 0.8241634, -0.1373606,
2.793103, 6.310345, 60.03448, 0.5494425, 0.8241632, -0.1373606,
3.206897, 6.310345, 61.68966, 0.5494423, 0.8241634, -0.1373606,
3.62069, 6.310345, 63.34483, 0.5494422, 0.8241634, -0.1373606,
4.034483, 6.310345, 65, 0.5494426, 0.8241632, -0.1373606,
4.448276, 6.310345, 66.65517, 0.5494425, 0.8241632, -0.1373605,
4.862069, 6.310345, 68.31035, 0.549442, 0.8241635, -0.1373606,
5.275862, 6.310345, 69.96552, 0.549442, 0.8241635, -0.1373607,
5.689655, 6.310345, 71.62069, 0.5494429, 0.8241629, -0.1373606,
6.103448, 6.310345, 73.27586, 0.5494425, 0.8241632, -0.1373606,
6.517241, 6.310345, 74.93104, 0.549442, 0.8241635, -0.1373606,
6.931035, 6.310345, 76.5862, 0.549442, 0.8241635, -0.1373607,
7.344828, 6.310345, 78.24138, 0.5494429, 0.8241629, -0.1373606,
7.758621, 6.310345, 79.89655, 0.5494425, 0.8241632, -0.1373606,
8.172414, 6.310345, 81.55173, 0.5494423, 0.8241634, -0.1373605,
8.586206, 6.310345, 83.20689, 0.549442, 0.8241635, -0.1373606,
9, 6.310345, 84.86207, 0.5494416, 0.8241638, -0.1373606,
-3, 6.827586, 39.96552, 0.5494422, 0.8241634, -0.1373606,
-2.586207, 6.827586, 41.62069, 0.5494423, 0.8241634, -0.1373606,
-2.172414, 6.827586, 43.27586, 0.5494425, 0.8241632, -0.1373606,
-1.758621, 6.827586, 44.93103, 0.5494422, 0.8241634, -0.1373606,
-1.344828, 6.827586, 46.58621, 0.5494425, 0.8241633, -0.1373606,
-0.9310345, 6.827586, 48.24138, 0.5494423, 0.8241634, -0.1373606,
-0.5172414, 6.827586, 49.89655, 0.5494425, 0.8241632, -0.1373606,
-0.1034483, 6.827586, 51.55172, 0.5494423, 0.8241634, -0.1373606,
0.3103448, 6.827586, 53.2069, 0.5494423, 0.8241634, -0.1373606,
0.7241379, 6.827586, 54.86207, 0.5494423, 0.8241634, -0.1373606,
1.137931, 6.827586, 56.51724, 0.5494422, 0.8241634, -0.1373606,
1.551724, 6.827586, 58.17241, 0.5494422, 0.8241634, -0.1373606,
1.965517, 6.827586, 59.82759, 0.5494423, 0.8241634, -0.1373606,
2.37931, 6.827586, 61.48276, 0.5494423, 0.8241634, -0.1373606,
2.793103, 6.827586, 63.13793, 0.5494427, 0.8241631, -0.1373605,
3.206897, 6.827586, 64.79311, 0.549442, 0.8241635, -0.1373606,
3.62069, 6.827586, 66.44827, 0.5494419, 0.8241636, -0.1373606,
4.034483, 6.827586, 68.10345, 0.5494424, 0.8241633, -0.1373606,
4.448276, 6.827586, 69.75862, 0.5494429, 0.8241629, -0.1373606,
4.862069, 6.827586, 71.4138, 0.549442, 0.8241635, -0.1373607,
5.275862, 6.827586, 73.06896, 0.549442, 0.8241635, -0.1373606,
5.689655, 6.827586, 74.72414, 0.5494425, 0.8241632, -0.1373606,
6.103448, 6.827586, 76.37931, 0.5494429, 0.8241629, -0.1373606,
6.517241, 6.827586, 78.03448, 0.549442, 0.8241635, -0.1373607,
6.931035, 6.827586, 79.68965, 0.549442, 0.8241635, -0.1373606,
7.344828, 6.827586, 81.34483, 0.5494425, 0.8241632, -0.1373606,
7.758621, 6.827586, 83, 0.5494429, 0.8241629, -0.1373606,
8.172414, 6.827586, 84.65517, 0.5494427, 0.8241631, -0.1373605,
8.586206, 6.827586, 86.31035, 0.549442, 0.8241635, -0.1373606,
9, 6.827586, 87.96552, 0.5494407, 0.8241644, -0.1373608,
-3, 7.344828, 43.06897, 0.549442, 0.8241635, -0.1373607,
-2.586207, 7.344828, 44.72414, 0.5494425, 0.8241632, -0.1373606,
-2.172414, 7.344828, 46.37931, 0.5494423, 0.8241634, -0.1373606,
-1.758621, 7.344828, 48.03448, 0.5494424, 0.8241633, -0.1373606,
-1.344828, 7.344828, 49.68966, 0.5494422, 0.8241634, -0.1373606,
-0.9310345, 7.344828, 51.34483, 0.5494425, 0.8241632, -0.1373606,
-0.5172414, 7.344828, 53, 0.5494425, 0.8241632, -0.1373606,
-0.1034483, 7.344828, 54.65517, 0.5494425, 0.8241632, -0.1373606,
0.3103448, 7.344828, 56.31034, 0.5494423, 0.8241634, -0.1373606,
0.7241379, 7.344828, 57.96552, 0.5494425, 0.8241632, -0.1373606,
1.137931, 7.344828, 59.62069, 0.5494422, 0.8241634, -0.1373606,
1.551724, 7.344828, 61.27586, 0.5494424, 0.8241633, -0.1373606,
1.965517, 7.344828, 62.93103, 0.549442, 0.8241635, -0.1373606,
2.37931, 7.344828, 64.5862, 0.5494423, 0.8241634, -0.1373606,
2.793103, 7.344828, 66.24138, 0.5494429, 0.8241629, -0.1373606,
3.206897, 7.344828, 67.89655, 0.5494425, 0.8241632, -0.1373606,
3.62069, 7.344828, 69.55173, 0.5494419, 0.8241636, -0.1373606,
4.034483, 7.344828, 71.20689, 0.5494419, 0.8241636, -0.1373606,
4.448276, 7.344828, 72.86207, 0.5494425, 0.8241632, -0.1373606,
4.862069, 7.344828, 74.51724, 0.5494425, 0.8241632, -0.1373606,
5.275862, 7.344828, 76.17242, 0.549442, 0.8241635, -0.1373606,
5.689655, 7.344828, 77.82758, 0.549442, 0.8241635, -0.1373606,
6.103448, 7.344828, 79.48276, 0.5494425, 0.8241632, -0.1373606,
6.517241, 7.344828, 81.13793, 0.5494425, 0.8241632, -0.1373606,
6.931035, 7.344828, 82.79311, 0.549442, 0.8241635, -0.1373606,
7.344828, 7.344828, 84.44827, 0.549442, 0.8241635, -0.1373606,
7.758621, 7.344828, 86.10345, 0.5494425, 0.8241632, -0.1373606,
8.172414, 7.344828, 87.75862, 0.5494431, 0.8241628, -0.1373605,
8.586206, 7.344828, 89.4138, 0.549442, 0.8241635, -0.1373607,
9, 7.344828, 91.06896, 0.549441, 0.8241642, -0.1373607,
-3, 7.862069, 46.17241, 0.5494423, 0.8241633, -0.1373605,
-2.586207, 7.862069, 47.82759, 0.5494423, 0.8241634, -0.1373606,
-2.172414, 7.862069, 49.48276, 0.5494423, 0.8241634, -0.1373606,
-1.758621, 7.862069, 51.13793, 0.5494422, 0.8241634, -0.1373606,
-1.344828, 7.862069, 52.7931, 0.5494422, 0.8241634, -0.1373606,
-0.9310345, 7.862069, 54.44828, 0.5494423, 0.8241634, -0.1373606,
-0.5172414, 7.862069, 56.10345, 0.5494425, 0.8241632, -0.1373606,
-0.1034483, 7.862069, 57.75862, 0.5494423, 0.8241634, -0.1373606,
0.3103448, 7.862069, 59.41379, 0.5494425, 0.8241632, -0.1373606,
0.7241379, 7.862069, 61.06897, 0.5494423, 0.8241634, -0.1373606,
1.137931, 7.862069, 62.72414, 0.5494422, 0.8241634, -0.1373606,
1.551724, 7.862069, 64.37931, 0.5494426, 0.8241631, -0.1373606,
1.965517, 7.862069, 66.03448, 0.549442, 0.8241635, -0.1373606,
2.37931, 7.862069, 67.68965, 0.549442, 0.8241635, -0.1373606,
2.793103, 7.862069, 69.34483, 0.5494425, 0.8241632, -0.1373606,
3.206897, 7.862069, 71, 0.5494429, 0.8241629, -0.1373606,
3.62069, 7.862069, 72.65517, 0.5494424, 0.8241633, -0.1373606,
4.034483, 7.862069, 74.31035, 0.5494419, 0.8241636, -0.1373606,
4.448276, 7.862069, 75.96552, 0.549442, 0.8241635, -0.1373607,
4.862069, 7.862069, 77.62069, 0.5494429, 0.8241629, -0.1373606,
5.275862, 7.862069, 79.27586, 0.5494425, 0.8241632, -0.1373606,
5.689655, 7.862069, 80.93104, 0.549442, 0.8241635, -0.1373606,
6.103448, 7.862069, 82.5862, 0.549442, 0.8241635, -0.1373607,
6.517241, 7.862069, 84.24138, 0.5494429, 0.8241629, -0.1373606,
6.931035, 7.862069, 85.89655, 0.5494425, 0.8241632, -0.1373606,
7.344828, 7.862069, 87.55173, 0.549442, 0.8241635, -0.1373606,
7.758621, 7.862069, 89.20689, 0.549442, 0.8241635, -0.1373606,
8.172414, 7.862069, 90.86207, 0.5494427, 0.8241631, -0.1373605,
8.586206, 7.862069, 92.51724, 0.5494425, 0.8241632, -0.1373606,
9, 7.862069, 94.17242, 0.5494422, 0.8241634, -0.1373605,
-3, 8.379311, 49.27586, 0.5494422, 0.8241634, -0.1373606,
-2.586207, 8.379311, 50.93103, 0.5494423, 0.8241634, -0.1373606,
-2.172414, 8.379311, 52.58621, 0.5494425, 0.8241632, -0.1373606,
-1.758621, 8.379311, 54.24138, 0.5494422, 0.8241634, -0.1373606,
-1.344828, 8.379311, 55.89655, 0.5494425, 0.8241633, -0.1373606,
-0.9310345, 8.379311, 57.55172, 0.5494423, 0.8241634, -0.1373606,
-0.5172414, 8.379311, 59.2069, 0.5494422, 0.8241634, -0.1373606,
-0.1034483, 8.379311, 60.86207, 0.5494423, 0.8241634, -0.1373606,
0.3103448, 8.379311, 62.51724, 0.5494425, 0.8241632, -0.1373605,
0.7241379, 8.379311, 64.17242, 0.549442, 0.8241635, -0.1373606,
1.137931, 8.379311, 65.82758, 0.549442, 0.8241636, -0.1373606,
1.551724, 8.379311, 67.48276, 0.5494424, 0.8241633, -0.1373606,
1.965517, 8.379311, 69.13793, 0.5494425, 0.8241632, -0.1373606,
2.37931, 8.379311, 70.79311, 0.549442, 0.8241635, -0.1373606,
2.793103, 8.379311, 72.44827, 0.549442, 0.8241635, -0.1373606,
3.206897, 8.379311, 74.10345, 0.5494425, 0.8241632, -0.1373606,
3.62069, 8.379311, 75.75862, 0.5494428, 0.824163, -0.1373606,
4.034483, 8.379311, 77.4138, 0.5494419, 0.8241636, -0.1373607,
4.448276, 8.379311, 79.06896, 0.549442, 0.8241635, -0.1373606,
4.862069, 8.379311, 80.72414, 0.5494425, 0.8241632, -0.1373606,
5.275862, 8.379311, 82.37931, 0.5494429, 0.8241629, -0.1373606,
5.689655, 8.379311, 84.03448, 0.549442, 0.8241635, -0.1373607,
6.103448, 8.379311, 85.68965, 0.549442, 0.8241635, -0.1373606,
6.517241, 8.379311, 87.34483, 0.5494425, 0.8241632, -0.1373606,
6.931035, 8.379311, 89, 0.5494429, 0.8241629, -0.1373606,
7.344828, 8.379311, 90.65517, 0.5494425, 0.8241632, -0.1373606,
7.758621, 8.379311, 92.31035, 0.549442, 0.8241635, -0.1373606,
8.172414, 8.379311, 93.96552, 0.5494423, 0.8241634, -0.1373606,
8.586206, 8.379311, 95.62069, 0.5494429, 0.8241629, -0.1373606,
9, 8.379311, 97.27586, 0.5494425, 0.8241632, -0.1373606,
-3, 8.896552, 52.37931, 0.549442, 0.8241635, -0.1373607,
-2.586207, 8.896552, 54.03448, 0.5494425, 0.8241632, -0.1373606,
-2.172414, 8.896552, 55.68966, 0.5494423, 0.8241634, -0.1373606,
-1.758621, 8.896552, 57.34483, 0.5494424, 0.8241633, -0.1373606,
-1.344828, 8.896552, 59, 0.5494425, 0.8241633, -0.1373606,
-0.9310345, 8.896552, 60.65517, 0.5494425, 0.8241632, -0.1373606,
-0.5172414, 8.896552, 62.31034, 0.5494422, 0.8241634, -0.1373606,
-0.1034483, 8.896552, 63.96552, 0.5494423, 0.8241634, -0.1373606,
0.3103448, 8.896552, 65.62069, 0.5494427, 0.8241631, -0.1373606,
0.7241379, 8.896552, 67.27586, 0.5494425, 0.8241632, -0.1373606,
1.137931, 8.896552, 68.93104, 0.549442, 0.8241636, -0.1373606,
1.551724, 8.896552, 70.5862, 0.549442, 0.8241635, -0.1373607,
1.965517, 8.896552, 72.24138, 0.5494429, 0.8241629, -0.1373606,
2.37931, 8.896552, 73.89655, 0.5494425, 0.8241632, -0.1373606,
2.793103, 8.896552, 75.55173, 0.549442, 0.8241635, -0.1373606,
3.206897, 8.896552, 77.20689, 0.549442, 0.8241635, -0.1373606,
3.62069, 8.896552, 78.86207, 0.5494424, 0.8241633, -0.1373606,
4.034483, 8.896552, 80.51724, 0.5494424, 0.8241633, -0.1373606,
4.448276, 8.896552, 82.17242, 0.549442, 0.8241635, -0.1373606,
4.862069, 8.896552, 83.82758, 0.549442, 0.8241635, -0.1373606,
5.275862, 8.896552, 85.48276, 0.5494425, 0.8241632, -0.1373606,
5.689655, 8.896552, 87.13793, 0.5494425, 0.8241632, -0.1373606,
6.103448, 8.896552, 88.79311, 0.549442, 0.8241635, -0.1373606,
6.517241, 8.896552, 90.44827, 0.549442, 0.8241635, -0.1373606,
6.931035, 8.896552, 92.10345, 0.5494425, 0.8241632, -0.1373606,
7.344828, 8.896552, 93.75862, 0.5494429, 0.8241629, -0.1373606,
7.758621, 8.896552, 95.4138, 0.549442, 0.8241635, -0.1373607,
8.172414, 8.896552, 97.06896, 0.5494423, 0.8241634, -0.1373605,
8.586206, 8.896552, 98.72414, 0.5494425, 0.8241632, -0.1373606,
9, 8.896552, 100.3793, 0.5494425, 0.8241632, -0.1373606,
-3, 9.413794, 55.48276, 0.5494421, 0.8241635, -0.1373605,
-2.586207, 9.413794, 57.13793, 0.5494419, 0.8241636, -0.1373605,
-2.172414, 9.413794, 58.7931, 0.5494419, 0.8241636, -0.1373605,
-1.758621, 9.413794, 60.44828, 0.5494419, 0.8241637, -0.1373605,
-1.344828, 9.413794, 62.10345, 0.5494421, 0.8241635, -0.1373605,
-0.9310345, 9.413794, 63.75862, 0.5494424, 0.8241633, -0.1373605,
-0.5172414, 9.413794, 65.4138, 0.5494419, 0.8241636, -0.1373605,
-0.1034483, 9.413794, 67.06896, 0.5494417, 0.8241638, -0.1373605,
0.3103448, 9.413794, 68.72414, 0.5494421, 0.8241635, -0.1373605,
0.7241379, 9.413794, 70.37931, 0.5494426, 0.8241632, -0.1373605,
1.137931, 9.413794, 72.03448, 0.5494416, 0.8241638, -0.1373606,
1.551724, 9.413794, 73.68965, 0.5494416, 0.8241638, -0.1373605,
1.965517, 9.413794, 75.34483, 0.5494421, 0.8241635, -0.1373605,
2.37931, 9.413794, 77, 0.5494426, 0.8241632, -0.1373605,
2.793103, 9.413794, 78.65517, 0.5494421, 0.8241635, -0.1373605,
3.206897, 9.413794, 80.31035, 0.5494417, 0.8241638, -0.1373605,
3.62069, 9.413794, 81.96552, 0.5494416, 0.8241638, -0.1373606,
4.034483, 9.413794, 83.62069, 0.5494425, 0.8241632, -0.1373605,
4.448276, 9.413794, 85.27586, 0.5494421, 0.8241635, -0.1373605,
4.862069, 9.413794, 86.93104, 0.5494417, 0.8241638, -0.1373605,
5.275862, 9.413794, 88.5862, 0.5494417, 0.8241638, -0.1373606,
5.689655, 9.413794, 90.24138, 0.5494426, 0.8241632, -0.1373605,
6.103448, 9.413794, 91.89655, 0.5494421, 0.8241635, -0.1373605,
6.517241, 9.413794, 93.55173, 0.5494417, 0.8241638, -0.1373605,
6.931035, 9.413794, 95.20689, 0.5494417, 0.8241638, -0.1373605,
7.344828, 9.413794, 96.86207, 0.5494421, 0.8241635, -0.1373605,
7.758621, 9.413794, 98.51724, 0.5494421, 0.8241635, -0.1373605,
8.172414, 9.413794, 100.1724, 0.5494419, 0.8241636, -0.1373605,
8.586206, 9.413794, 101.8276, 0.5494417, 0.8241638, -0.1373605,
9, 9.413794, 103.4828, 0.5494411, 0.8241641, -0.1373605,
-3, 9.931034, 58.58621, 0.5494417, 0.8241638, -0.1373605,
-2.586207, 9.931034, 60.24138, 0.5494419, 0.8241636, -0.1373605,
-2.172414, 9.931034, 61.89655, 0.5494421, 0.8241635, -0.1373605,
-1.758621, 9.931034, 63.55172, 0.5494416, 0.8241638, -0.1373605,
-1.344828, 9.931034, 65.20689, 0.5494419, 0.8241637, -0.1373604,
-0.9310345, 9.931034, 66.86207, 0.5494421, 0.8241635, -0.1373605,
-0.5172414, 9.931034, 68.51724, 0.5494421, 0.8241635, -0.1373605,
-0.1034483, 9.931034, 70.17242, 0.5494417, 0.8241638, -0.1373605,
0.3103448, 9.931034, 71.82758, 0.5494417, 0.8241638, -0.1373605,
0.7241379, 9.931034, 73.48276, 0.5494421, 0.8241635, -0.1373605,
1.137931, 9.931034, 75.13793, 0.5494421, 0.8241635, -0.1373605,
1.551724, 9.931034, 76.79311, 0.5494416, 0.8241638, -0.1373605,
1.965517, 9.931034, 78.44827, 0.5494417, 0.8241638, -0.1373605,
2.37931, 9.931034, 80.10345, 0.5494421, 0.8241635, -0.1373605,
2.793103, 9.931034, 81.75862, 0.5494426, 0.8241632, -0.1373605,
3.206897, 9.931034, 83.4138, 0.5494417, 0.8241638, -0.1373606,
3.62069, 9.931034, 85.06896, 0.5494416, 0.8241638, -0.1373605,
4.034483, 9.931034, 86.72414, 0.549442, 0.8241635, -0.1373605,
4.448276, 9.931034, 88.37931, 0.5494426, 0.8241632, -0.1373605,
4.862069, 9.931034, 90.03448, 0.5494417, 0.8241638, -0.1373606,
5.275862, 9.931034, 91.68965, 0.5494417, 0.8241638, -0.1373605,
5.689655, 9.931034, 93.34483, 0.5494421, 0.8241635, -0.1373605,
6.103448, 9.931034, 95, 0.5494426, 0.8241632, -0.1373605,
6.517241, 9.931034, 96.65517, 0.5494421, 0.8241635, -0.1373605,
6.931035, 9.931034, 98.31035, 0.5494417, 0.8241638, -0.1373605,
7.344828, 9.931034, 99.96552, 0.5494417, 0.8241638, -0.1373606,
7.758621, 9.931034, 101.6207, 0.5494426, 0.8241632, -0.1373605,
8.172414, 9.931034, 103.2759, 0.5494424, 0.8241633, -0.1373605,
8.586206, 9.931034, 104.931, 0.5494417, 0.8241638, -0.1373605,
9, 9.931034, 106.5862, 0.5494405, 0.8241645, -0.1373608,
-3, 10.44828, 61.68966, 0.5494419, 0.8241636, -0.1373606,
-2.586207, 10.44828, 63.34483, 0.5494423, 0.8241634, -0.1373606,
-2.172414, 10.44828, 65, 0.5494427, 0.8241631, -0.1373606,
-1.758621, 10.44828, 66.65517, 0.5494424, 0.8241633, -0.1373605,
-1.344828, 10.44828, 68.31035, 0.549442, 0.8241636, -0.1373606,
-0.9310345, 10.44828, 69.96552, 0.549442, 0.8241635, -0.1373607,
-0.5172414, 10.44828, 71.62069, 0.5494429, 0.824163, -0.1373606,
-0.1034483, 10.44828, 73.27586, 0.5494425, 0.8241632, -0.1373606,
0.3103448, 10.44828, 74.93104, 0.549442, 0.8241635, -0.1373606,
0.7241379, 10.44828, 76.5862, 0.549442, 0.8241635, -0.1373607,
1.137931, 10.44828, 78.24138, 0.5494429, 0.824163, -0.1373606,
1.551724, 10.44828, 79.89655, 0.5494424, 0.8241633, -0.1373606,
1.965517, 10.44828, 81.55173, 0.549442, 0.8241635, -0.1373606,
2.37931, 10.44828, 83.20689, 0.549442, 0.8241635, -0.1373606,
2.793103, 10.44828, 84.86207, 0.5494425, 0.8241632, -0.1373606,
3.206897, 10.44828, 86.51724, 0.5494425, 0.8241632, -0.1373606,
3.62069, 10.44828, 88.17242, 0.5494419, 0.8241636, -0.1373606,
4.034483, 10.44828, 89.82758, 0.5494419, 0.8241636, -0.1373606,
4.448276, 10.44828, 91.48276, 0.5494425, 0.8241632, -0.1373606,
4.862069, 10.44828, 93.13793, 0.5494425, 0.8241632, -0.1373606,
5.275862, 10.44828, 94.79311, 0.549442, 0.8241635, -0.1373606,
5.689655, 10.44828, 96.44827, 0.549442, 0.8241635, -0.1373606,
6.103448, 10.44828, 98.10345, 0.5494425, 0.8241632, -0.1373606,
6.517241, 10.44828, 99.75862, 0.5494429, 0.8241629, -0.1373606,
6.931035, 10.44828, 101.4138, 0.549442, 0.8241635, -0.1373607,
7.344828, 10.44828, 103.069, 0.549442, 0.8241635, -0.1373606,
7.758621, 10.44828, 104.7241, 0.5494425, 0.8241632, -0.1373606,
8.172414, 10.44828, 106.3793, 0.5494431, 0.8241628, -0.1373605,
8.586206, 10.44828, 108.0345, 0.549442, 0.8241635, -0.1373607,
9, 10.44828, 109.6897, 0.549441, 0.8241642, -0.1373607,
-3, 10.96552, 64.79311, 0.5494413, 0.824164, -0.1373607,
-2.586207, 10.96552, 66.44827, 0.549442, 0.8241635, -0.1373606,
-2.172414, 10.96552, 68.10345, 0.5494425, 0.8241632, -0.1373606,
-1.758621, 10.96552, 69.75862, 0.5494429, 0.824163, -0.1373606,
-1.344828, 10.96552, 71.4138, 0.549442, 0.8241635, -0.1373607,
-0.9310345, 10.96552, 73.06896, 0.549442, 0.8241635, -0.1373606,
-0.5172414, 10.96552, 74.72414, 0.5494425, 0.8241632, -0.1373606,
-0.1034483, 10.96552, 76.37931, 0.5494429, 0.8241629, -0.1373606,
0.3103448, 10.96552, 78.03448, 0.549442, 0.8241635, -0.1373607,
0.7241379, 10.96552, 79.68965, 0.549442, 0.8241635, -0.1373606,
1.137931, 10.96552, 81.34483, 0.5494424, 0.8241633, -0.1373606,
1.551724, 10.96552, 83, 0.5494429, 0.824163, -0.1373606,
1.965517, 10.96552, 84.65517, 0.5494425, 0.8241632, -0.1373606,
2.37931, 10.96552, 86.31035, 0.549442, 0.8241635, -0.1373606,
2.793103, 10.96552, 87.96552, 0.549442, 0.8241635, -0.1373607,
3.206897, 10.96552, 89.62069, 0.5494429, 0.8241629, -0.1373606,
3.62069, 10.96552, 91.27586, 0.5494424, 0.8241633, -0.1373606,
4.034483, 10.96552, 92.93104, 0.5494419, 0.8241636, -0.1373606,
4.448276, 10.96552, 94.5862, 0.549442, 0.8241635, -0.1373607,
4.862069, 10.96552, 96.24138, 0.5494429, 0.8241629, -0.1373606,
5.275862, 10.96552, 97.89655, 0.5494425, 0.8241632, -0.1373606,
5.689655, 10.96552, 99.55173, 0.549442, 0.8241635, -0.1373606,
6.103448, 10.96552, 101.2069, 0.549442, 0.8241635, -0.1373606,
6.517241, 10.96552, 102.8621, 0.5494425, 0.8241632, -0.1373606,
6.931035, 10.96552, 104.5172, 0.5494425, 0.8241632, -0.1373606,
7.344828, 10.96552, 106.1724, 0.549442, 0.8241635, -0.1373606,
7.758621, 10.96552, 107.8276, 0.549442, 0.8241635, -0.1373606,
8.172414, 10.96552, 109.4828, 0.5494427, 0.8241631, -0.1373605,
8.586206, 10.96552, 111.1379, 0.5494425, 0.8241632, -0.1373606,
9, 10.96552, 112.7931, 0.5494422, 0.8241634, -0.1373605,
-3, 11.48276, 67.89655, 0.549442, 0.8241635, -0.1373606,
-2.586207, 11.48276, 69.55173, 0.549442, 0.8241635, -0.1373606,
-2.172414, 11.48276, 71.20689, 0.549442, 0.8241635, -0.1373606,
-1.758621, 11.48276, 72.86207, 0.5494424, 0.8241633, -0.1373606,
-1.344828, 11.48276, 74.51724, 0.5494425, 0.8241633, -0.1373606,
-0.9310345, 11.48276, 76.17242, 0.549442, 0.8241635, -0.1373606,
-0.5172414, 11.48276, 77.82758, 0.549442, 0.8241635, -0.1373606,
-0.1034483, 11.48276, 79.48276, 0.5494425, 0.8241632, -0.1373606,
0.3103448, 11.48276, 81.13793, 0.5494425, 0.8241632, -0.1373606,
0.7241379, 11.48276, 82.79311, 0.549442, 0.8241635, -0.1373606,
1.137931, 11.48276, 84.44827, 0.549442, 0.8241636, -0.1373606,
1.551724, 11.48276, 86.10345, 0.5494424, 0.8241633, -0.1373606,
1.965517, 11.48276, 87.75862, 0.5494429, 0.8241629, -0.1373606,
2.37931, 11.48276, 89.4138, 0.549442, 0.8241635, -0.1373607,
2.793103, 11.48276, 91.06896, 0.549442, 0.8241635, -0.1373606,
3.206897, 11.48276, 92.72414, 0.5494425, 0.8241632, -0.1373606,
3.62069, 11.48276, 94.37931, 0.5494428, 0.824163, -0.1373606,
4.034483, 11.48276, 96.03448, 0.5494419, 0.8241636, -0.1373607,
4.448276, 11.48276, 97.68965, 0.549442, 0.8241635, -0.1373606,
4.862069, 11.48276, 99.34483, 0.5494425, 0.8241632, -0.1373606,
5.275862, 11.48276, 101, 0.5494429, 0.8241629, -0.1373606,
5.689655, 11.48276, 102.6552, 0.5494425, 0.8241632, -0.1373606,
6.103448, 11.48276, 104.3103, 0.549442, 0.8241635, -0.1373606,
6.517241, 11.48276, 105.9655, 0.549442, 0.8241635, -0.1373607,
6.931035, 11.48276, 107.6207, 0.5494429, 0.8241629, -0.1373606,
7.344828, 11.48276, 109.2759, 0.5494425, 0.8241632, -0.1373606,
7.758621, 11.48276, 110.931, 0.549442, 0.8241635, -0.1373606,
8.172414, 11.48276, 112.5862, 0.5494423, 0.8241634, -0.1373606,
8.586206, 11.48276, 114.2414, 0.5494429, 0.8241629, -0.1373606,
9, 11.48276, 115.8966, 0.5494425, 0.8241632, -0.1373606,
-3, 12, 71, 0.5494429, 0.8241629, -0.1373606,
-2.586207, 12, 72.65517, 0.549442, 0.8241635, -0.1373606,
-2.172414, 12, 74.31035, 0.5494417, 0.8241638, -0.1373605,
-1.758621, 12, 75.96552, 0.5494423, 0.8241634, -0.1373606,
-1.344828, 12, 77.62069, 0.5494429, 0.8241629, -0.1373606,
-0.9310345, 12, 79.27586, 0.549442, 0.8241635, -0.1373606,
-0.5172414, 12, 80.93104, 0.5494417, 0.8241638, -0.1373605,
-0.1034483, 12, 82.5862, 0.5494423, 0.8241633, -0.1373606,
0.3103448, 12, 84.24138, 0.5494429, 0.8241629, -0.1373606,
0.7241379, 12, 85.89655, 0.549442, 0.8241635, -0.1373606,
1.137931, 12, 87.55173, 0.5494417, 0.8241638, -0.1373605,
1.551724, 12, 89.20689, 0.5494423, 0.8241633, -0.1373606,
1.965517, 12, 90.86207, 0.5494429, 0.8241629, -0.1373606,
2.37931, 12, 92.51724, 0.549442, 0.8241635, -0.1373606,
2.793103, 12, 94.17242, 0.5494417, 0.8241638, -0.1373605,
3.206897, 12, 95.82758, 0.5494423, 0.8241633, -0.1373606,
3.62069, 12, 97.48276, 0.5494428, 0.824163, -0.1373606,
4.034483, 12, 99.13793, 0.549442, 0.8241636, -0.1373606,
4.448276, 12, 100.7931, 0.5494417, 0.8241638, -0.1373605,
4.862069, 12, 102.4483, 0.5494423, 0.8241633, -0.1373606,
5.275862, 12, 104.1034, 0.5494429, 0.8241629, -0.1373606,
5.689655, 12, 105.7586, 0.5494429, 0.8241629, -0.1373606,
6.103448, 12, 107.4138, 0.5494417, 0.8241637, -0.1373607,
6.517241, 12, 109.069, 0.5494423, 0.8241633, -0.1373606,
6.931035, 12, 110.7241, 0.5494429, 0.8241629, -0.1373606,
7.344828, 12, 112.3793, 0.5494429, 0.8241629, -0.1373606,
7.758621, 12, 114.0345, 0.5494417, 0.8241637, -0.1373607,
8.172414, 12, 115.6897, 0.5494426, 0.8241631, -0.1373606,
8.586206, 12, 117.3448, 0.5494428, 0.824163, -0.1373606,
9, 12, 119, 0.5494425, 0.8241632, -0.1373606
]);
var posLoc49 = gl.getAttribLocation(prog49, "aPos");
var colLoc49 = gl.getAttribLocation(prog49, "aCol");
var normLoc49 = gl.getAttribLocation(prog49, "aNorm");
var centers49 = new Float32Array([
-2.793103, -2.741379, -16.62069,
-2.37931, -2.741379, -14.96552,
-1.965517, -2.741379, -13.31034,
-1.551724, -2.741379, -11.65517,
-1.137931, -2.741379, -10,
-0.7241379, -2.741379, -8.344828,
-0.3103448, -2.741379, -6.689655,
0.1034483, -2.741379, -5.034482,
0.5172414, -2.741379, -3.37931,
0.9310344, -2.741379, -1.724138,
1.344828, -2.741379, -0.06896549,
1.758621, -2.741379, 1.586207,
2.172414, -2.741379, 3.241379,
2.586207, -2.741379, 4.896552,
3, -2.741379, 6.551724,
3.413793, -2.741379, 8.206896,
3.827586, -2.741379, 9.862069,
4.24138, -2.741379, 11.51724,
4.655172, -2.741379, 13.17241,
5.068966, -2.741379, 14.82759,
5.482759, -2.741379, 16.48276,
5.896552, -2.741379, 18.13793,
6.310345, -2.741379, 19.7931,
6.724138, -2.741379, 21.44828,
7.137931, -2.741379, 23.10345,
7.551724, -2.741379, 24.75862,
7.965517, -2.741379, 26.41379,
8.379311, -2.741379, 28.06897,
8.793103, -2.741379, 29.72414,
-2.793103, -2.224138, -13.51724,
-2.37931, -2.224138, -11.86207,
-1.965517, -2.224138, -10.2069,
-1.551724, -2.224138, -8.551723,
-1.137931, -2.224138, -6.896552,
-0.7241379, -2.224138, -5.241379,
-0.3103448, -2.224138, -3.586207,
0.1034483, -2.224138, -1.931034,
0.5172414, -2.224138, -0.275862,
0.9310344, -2.224138, 1.37931,
1.344828, -2.224138, 3.034483,
1.758621, -2.224138, 4.689655,
2.172414, -2.224138, 6.344828,
2.586207, -2.224138, 8,
3, -2.224138, 9.655172,
3.413793, -2.224138, 11.31034,
3.827586, -2.224138, 12.96552,
4.24138, -2.224138, 14.62069,
4.655172, -2.224138, 16.27586,
5.068966, -2.224138, 17.93103,
5.482759, -2.224138, 19.58621,
5.896552, -2.224138, 21.24138,
6.310345, -2.224138, 22.89655,
6.724138, -2.224138, 24.55172,
7.137931, -2.224138, 26.2069,
7.551724, -2.224138, 27.86207,
7.965517, -2.224138, 29.51724,
8.379311, -2.224138, 31.17241,
8.793103, -2.224138, 32.82759,
-2.793103, -1.706897, -10.41379,
-2.37931, -1.706897, -8.75862,
-1.965517, -1.706897, -7.103448,
-1.551724, -1.706897, -5.448276,
-1.137931, -1.706897, -3.793104,
-0.7241379, -1.706897, -2.137931,
-0.3103448, -1.706897, -0.4827586,
0.1034483, -1.706897, 1.172414,
0.5172414, -1.706897, 2.827586,
0.9310344, -1.706897, 4.482759,
1.344828, -1.706897, 6.137931,
1.758621, -1.706897, 7.793103,
2.172414, -1.706897, 9.448277,
2.586207, -1.706897, 11.10345,
3, -1.706897, 12.75862,
3.413793, -1.706897, 14.41379,
3.827586, -1.706897, 16.06897,
4.24138, -1.706897, 17.72414,
4.655172, -1.706897, 19.37931,
5.068966, -1.706897, 21.03448,
5.482759, -1.706897, 22.68966,
5.896552, -1.706897, 24.34483,
6.310345, -1.706897, 26,
6.724138, -1.706897, 27.65517,
7.137931, -1.706897, 29.31034,
7.551724, -1.706897, 30.96552,
7.965517, -1.706897, 32.62069,
8.379311, -1.706897, 34.27586,
8.793103, -1.706897, 35.93103,
-2.793103, -1.189655, -7.310345,
-2.37931, -1.189655, -5.655172,
-1.965517, -1.189655, -4,
-1.551724, -1.189655, -2.344827,
-1.137931, -1.189655, -0.6896551,
-0.7241379, -1.189655, 0.9655173,
-0.3103448, -1.189655, 2.62069,
0.1034483, -1.189655, 4.275862,
0.5172414, -1.189655, 5.931035,
0.9310344, -1.189655, 7.586207,
1.344828, -1.189655, 9.241379,
1.758621, -1.189655, 10.89655,
2.172414, -1.189655, 12.55172,
2.586207, -1.189655, 14.2069,
3, -1.189655, 15.86207,
3.413793, -1.189655, 17.51724,
3.827586, -1.189655, 19.17241,
4.24138, -1.189655, 20.82759,
4.655172, -1.189655, 22.48276,
5.068966, -1.189655, 24.13793,
5.482759, -1.189655, 25.7931,
5.896552, -1.189655, 27.44828,
6.310345, -1.189655, 29.10345,
6.724138, -1.189655, 30.75862,
7.137931, -1.189655, 32.41379,
7.551724, -1.189655, 34.06897,
7.965517, -1.189655, 35.72414,
8.379311, -1.189655, 37.37931,
8.793103, -1.189655, 39.03448,
-2.793103, -0.6724138, -4.206897,
-2.37931, -0.6724138, -2.551724,
-1.965517, -0.6724138, -0.8965517,
-1.551724, -0.6724138, 0.7586207,
-1.137931, -0.6724138, 2.413793,
-0.7241379, -0.6724138, 4.068965,
-0.3103448, -0.6724138, 5.724138,
0.1034483, -0.6724138, 7.379311,
0.5172414, -0.6724138, 9.034483,
0.9310344, -0.6724138, 10.68966,
1.344828, -0.6724138, 12.34483,
1.758621, -0.6724138, 14,
2.172414, -0.6724138, 15.65517,
2.586207, -0.6724138, 17.31034,
3, -0.6724138, 18.96552,
3.413793, -0.6724138, 20.62069,
3.827586, -0.6724138, 22.27586,
4.24138, -0.6724138, 23.93103,
4.655172, -0.6724138, 25.5862,
5.068966, -0.6724138, 27.24138,
5.482759, -0.6724138, 28.89655,
5.896552, -0.6724138, 30.55172,
6.310345, -0.6724138, 32.2069,
6.724138, -0.6724138, 33.86207,
7.137931, -0.6724138, 35.51724,
7.551724, -0.6724138, 37.17241,
7.965517, -0.6724138, 38.82759,
8.379311, -0.6724138, 40.48276,
8.793103, -0.6724138, 42.13793,
-2.793103, -0.1551724, -1.103448,
-2.37931, -0.1551724, 0.5517242,
-1.965517, -0.1551724, 2.206897,
-1.551724, -0.1551724, 3.862069,
-1.137931, -0.1551724, 5.517241,
-0.7241379, -0.1551724, 7.172414,
-0.3103448, -0.1551724, 8.827586,
0.1034483, -0.1551724, 10.48276,
0.5172414, -0.1551724, 12.13793,
0.9310344, -0.1551724, 13.7931,
1.344828, -0.1551724, 15.44828,
1.758621, -0.1551724, 17.10345,
2.172414, -0.1551724, 18.75862,
2.586207, -0.1551724, 20.41379,
3, -0.1551724, 22.06897,
3.413793, -0.1551724, 23.72414,
3.827586, -0.1551724, 25.37931,
4.24138, -0.1551724, 27.03448,
4.655172, -0.1551724, 28.68966,
5.068966, -0.1551724, 30.34483,
5.482759, -0.1551724, 32,
5.896552, -0.1551724, 33.65517,
6.310345, -0.1551724, 35.31034,
6.724138, -0.1551724, 36.96552,
7.137931, -0.1551724, 38.62069,
7.551724, -0.1551724, 40.27586,
7.965517, -0.1551724, 41.93103,
8.379311, -0.1551724, 43.58621,
8.793103, -0.1551724, 45.24138,
-2.793103, 0.362069, 2,
-2.37931, 0.362069, 3.655172,
-1.965517, 0.362069, 5.310345,
-1.551724, 0.362069, 6.965518,
-1.137931, 0.362069, 8.620689,
-0.7241379, 0.362069, 10.27586,
-0.3103448, 0.362069, 11.93104,
0.1034483, 0.362069, 13.58621,
0.5172414, 0.362069, 15.24138,
0.9310344, 0.362069, 16.89655,
1.344828, 0.362069, 18.55172,
1.758621, 0.362069, 20.2069,
2.172414, 0.362069, 21.86207,
2.586207, 0.362069, 23.51724,
3, 0.362069, 25.17241,
3.413793, 0.362069, 26.82759,
3.827586, 0.362069, 28.48276,
4.24138, 0.362069, 30.13793,
4.655172, 0.362069, 31.7931,
5.068966, 0.362069, 33.44828,
5.482759, 0.362069, 35.10345,
5.896552, 0.362069, 36.75862,
6.310345, 0.362069, 38.41379,
6.724138, 0.362069, 40.06897,
7.137931, 0.362069, 41.72414,
7.551724, 0.362069, 43.37931,
7.965517, 0.362069, 45.03448,
8.379311, 0.362069, 46.68966,
8.793103, 0.362069, 48.34483,
-2.793103, 0.8793103, 5.103448,
-2.37931, 0.8793103, 6.758621,
-1.965517, 0.8793103, 8.413793,
-1.551724, 0.8793103, 10.06897,
-1.137931, 0.8793103, 11.72414,
-0.7241379, 0.8793103, 13.37931,
-0.3103448, 0.8793103, 15.03448,
0.1034483, 0.8793103, 16.68966,
0.5172414, 0.8793103, 18.34483,
0.9310344, 0.8793103, 20,
1.344828, 0.8793103, 21.65517,
1.758621, 0.8793103, 23.31034,
2.172414, 0.8793103, 24.96552,
2.586207, 0.8793103, 26.62069,
3, 0.8793103, 28.27586,
3.413793, 0.8793103, 29.93103,
3.827586, 0.8793103, 31.5862,
4.24138, 0.8793103, 33.24138,
4.655172, 0.8793103, 34.89655,
5.068966, 0.8793103, 36.55172,
5.482759, 0.8793103, 38.2069,
5.896552, 0.8793103, 39.86207,
6.310345, 0.8793103, 41.51724,
6.724138, 0.8793103, 43.17241,
7.137931, 0.8793103, 44.82759,
7.551724, 0.8793103, 46.48276,
7.965517, 0.8793103, 48.13793,
8.379311, 0.8793103, 49.7931,
8.793103, 0.8793103, 51.44828,
-2.793103, 1.396552, 8.206896,
-2.37931, 1.396552, 9.862069,
-1.965517, 1.396552, 11.51724,
-1.551724, 1.396552, 13.17241,
-1.137931, 1.396552, 14.82759,
-0.7241379, 1.396552, 16.48276,
-0.3103448, 1.396552, 18.13793,
0.1034483, 1.396552, 19.7931,
0.5172414, 1.396552, 21.44828,
0.9310344, 1.396552, 23.10345,
1.344828, 1.396552, 24.75862,
1.758621, 1.396552, 26.41379,
2.172414, 1.396552, 28.06897,
2.586207, 1.396552, 29.72414,
3, 1.396552, 31.37931,
3.413793, 1.396552, 33.03448,
3.827586, 1.396552, 34.68966,
4.24138, 1.396552, 36.34483,
4.655172, 1.396552, 38,
5.068966, 1.396552, 39.65517,
5.482759, 1.396552, 41.31034,
5.896552, 1.396552, 42.96552,
6.310345, 1.396552, 44.62069,
6.724138, 1.396552, 46.27586,
7.137931, 1.396552, 47.93103,
7.551724, 1.396552, 49.58621,
7.965517, 1.396552, 51.24138,
8.379311, 1.396552, 52.89655,
8.793103, 1.396552, 54.55172,
-2.793103, 1.913793, 11.31034,
-2.37931, 1.913793, 12.96552,
-1.965517, 1.913793, 14.62069,
-1.551724, 1.913793, 16.27586,
-1.137931, 1.913793, 17.93103,
-0.7241379, 1.913793, 19.58621,
-0.3103448, 1.913793, 21.24138,
0.1034483, 1.913793, 22.89655,
0.5172414, 1.913793, 24.55172,
0.9310344, 1.913793, 26.2069,
1.344828, 1.913793, 27.86207,
1.758621, 1.913793, 29.51724,
2.172414, 1.913793, 31.17241,
2.586207, 1.913793, 32.82759,
3, 1.913793, 34.48276,
3.413793, 1.913793, 36.13793,
3.827586, 1.913793, 37.7931,
4.24138, 1.913793, 39.44828,
4.655172, 1.913793, 41.10345,
5.068966, 1.913793, 42.75862,
5.482759, 1.913793, 44.41379,
5.896552, 1.913793, 46.06897,
6.310345, 1.913793, 47.72414,
6.724138, 1.913793, 49.37931,
7.137931, 1.913793, 51.03448,
7.551724, 1.913793, 52.68966,
7.965517, 1.913793, 54.34483,
8.379311, 1.913793, 56,
8.793103, 1.913793, 57.65517,
-2.793103, 2.431035, 14.41379,
-2.37931, 2.431035, 16.06897,
-1.965517, 2.431035, 17.72414,
-1.551724, 2.431035, 19.37931,
-1.137931, 2.431035, 21.03448,
-0.7241379, 2.431035, 22.68966,
-0.3103448, 2.431035, 24.34483,
0.1034483, 2.431035, 26,
0.5172414, 2.431035, 27.65517,
0.9310344, 2.431035, 29.31034,
1.344828, 2.431035, 30.96552,
1.758621, 2.431035, 32.62069,
2.172414, 2.431035, 34.27586,
2.586207, 2.431035, 35.93103,
3, 2.431035, 37.58621,
3.413793, 2.431035, 39.24138,
3.827586, 2.431035, 40.89655,
4.24138, 2.431035, 42.55172,
4.655172, 2.431035, 44.2069,
5.068966, 2.431035, 45.86207,
5.482759, 2.431035, 47.51724,
5.896552, 2.431035, 49.17242,
6.310345, 2.431035, 50.82759,
6.724138, 2.431035, 52.48276,
7.137931, 2.431035, 54.13793,
7.551724, 2.431035, 55.7931,
7.965517, 2.431035, 57.44828,
8.379311, 2.431035, 59.10345,
8.793103, 2.431035, 60.75862,
-2.793103, 2.948276, 17.51724,
-2.37931, 2.948276, 19.17241,
-1.965517, 2.948276, 20.82759,
-1.551724, 2.948276, 22.48276,
-1.137931, 2.948276, 24.13793,
-0.7241379, 2.948276, 25.7931,
-0.3103448, 2.948276, 27.44828,
0.1034483, 2.948276, 29.10345,
0.5172414, 2.948276, 30.75862,
0.9310344, 2.948276, 32.41379,
1.344828, 2.948276, 34.06897,
1.758621, 2.948276, 35.72414,
2.172414, 2.948276, 37.37931,
2.586207, 2.948276, 39.03448,
3, 2.948276, 40.68966,
3.413793, 2.948276, 42.34483,
3.827586, 2.948276, 44,
4.24138, 2.948276, 45.65517,
4.655172, 2.948276, 47.31034,
5.068966, 2.948276, 48.96552,
5.482759, 2.948276, 50.62069,
5.896552, 2.948276, 52.27586,
6.310345, 2.948276, 53.93103,
6.724138, 2.948276, 55.58621,
7.137931, 2.948276, 57.24138,
7.551724, 2.948276, 58.89655,
7.965517, 2.948276, 60.55172,
8.379311, 2.948276, 62.20689,
8.793103, 2.948276, 63.86207,
-2.793103, 3.465517, 20.62069,
-2.37931, 3.465517, 22.27586,
-1.965517, 3.465517, 23.93103,
-1.551724, 3.465517, 25.5862,
-1.137931, 3.465517, 27.24138,
-0.7241379, 3.465517, 28.89655,
-0.3103448, 3.465517, 30.55172,
0.1034483, 3.465517, 32.2069,
0.5172414, 3.465517, 33.86207,
0.9310344, 3.465517, 35.51724,
1.344828, 3.465517, 37.17241,
1.758621, 3.465517, 38.82759,
2.172414, 3.465517, 40.48276,
2.586207, 3.465517, 42.13793,
3, 3.465517, 43.7931,
3.413793, 3.465517, 45.44828,
3.827586, 3.465517, 47.10345,
4.24138, 3.465517, 48.75862,
4.655172, 3.465517, 50.41379,
5.068966, 3.465517, 52.06897,
5.482759, 3.465517, 53.72414,
5.896552, 3.465517, 55.37931,
6.310345, 3.465517, 57.03448,
6.724138, 3.465517, 58.68966,
7.137931, 3.465517, 60.34483,
7.551724, 3.465517, 62,
7.965517, 3.465517, 63.65517,
8.379311, 3.465517, 65.31035,
8.793103, 3.465517, 66.96552,
-2.793103, 3.982759, 23.72414,
-2.37931, 3.982759, 25.37931,
-1.965517, 3.982759, 27.03448,
-1.551724, 3.982759, 28.68966,
-1.137931, 3.982759, 30.34483,
-0.7241379, 3.982759, 32,
-0.3103448, 3.982759, 33.65517,
0.1034483, 3.982759, 35.31034,
0.5172414, 3.982759, 36.96552,
0.9310344, 3.982759, 38.62069,
1.344828, 3.982759, 40.27586,
1.758621, 3.982759, 41.93103,
2.172414, 3.982759, 43.58621,
2.586207, 3.982759, 45.24138,
3, 3.982759, 46.89655,
3.413793, 3.982759, 48.55172,
3.827586, 3.982759, 50.2069,
4.24138, 3.982759, 51.86207,
4.655172, 3.982759, 53.51724,
5.068966, 3.982759, 55.17242,
5.482759, 3.982759, 56.82759,
5.896552, 3.982759, 58.48276,
6.310345, 3.982759, 60.13793,
6.724138, 3.982759, 61.79311,
7.137931, 3.982759, 63.44827,
7.551724, 3.982759, 65.10345,
7.965517, 3.982759, 66.75862,
8.379311, 3.982759, 68.41379,
8.793103, 3.982759, 70.06897,
-2.793103, 4.5, 26.82759,
-2.37931, 4.5, 28.48276,
-1.965517, 4.5, 30.13793,
-1.551724, 4.5, 31.7931,
-1.137931, 4.5, 33.44828,
-0.7241379, 4.5, 35.10345,
-0.3103448, 4.5, 36.75862,
0.1034483, 4.5, 38.41379,
0.5172414, 4.5, 40.06897,
0.9310344, 4.5, 41.72414,
1.344828, 4.5, 43.37931,
1.758621, 4.5, 45.03448,
2.172414, 4.5, 46.68966,
2.586207, 4.5, 48.34483,
3, 4.5, 50,
3.413793, 4.5, 51.65517,
3.827586, 4.5, 53.31034,
4.24138, 4.5, 54.96552,
4.655172, 4.5, 56.62069,
5.068966, 4.5, 58.27586,
5.482759, 4.5, 59.93103,
5.896552, 4.5, 61.58621,
6.310345, 4.5, 63.24138,
6.724138, 4.5, 64.89655,
7.137931, 4.5, 66.55173,
7.551724, 4.5, 68.20689,
7.965517, 4.5, 69.86208,
8.379311, 4.5, 71.51724,
8.793103, 4.5, 73.17242,
-2.793103, 5.017241, 29.93103,
-2.37931, 5.017241, 31.5862,
-1.965517, 5.017241, 33.24138,
-1.551724, 5.017241, 34.89655,
-1.137931, 5.017241, 36.55172,
-0.7241379, 5.017241, 38.2069,
-0.3103448, 5.017241, 39.86207,
0.1034483, 5.017241, 41.51724,
0.5172414, 5.017241, 43.17241,
0.9310344, 5.017241, 44.82759,
1.344828, 5.017241, 46.48276,
1.758621, 5.017241, 48.13793,
2.172414, 5.017241, 49.7931,
2.586207, 5.017241, 51.44828,
3, 5.017241, 53.10345,
3.413793, 5.017241, 54.75862,
3.827586, 5.017241, 56.41379,
4.24138, 5.017241, 58.06897,
4.655172, 5.017241, 59.72414,
5.068966, 5.017241, 61.37931,
5.482759, 5.017241, 63.03448,
5.896552, 5.017241, 64.68966,
6.310345, 5.017241, 66.34483,
6.724138, 5.017241, 68,
7.137931, 5.017241, 69.65517,
7.551724, 5.017241, 71.31035,
7.965517, 5.017241, 72.96552,
8.379311, 5.017241, 74.62069,
8.793103, 5.017241, 76.27586,
-2.793103, 5.534483, 33.03448,
-2.37931, 5.534483, 34.68966,
-1.965517, 5.534483, 36.34483,
-1.551724, 5.534483, 38,
-1.137931, 5.534483, 39.65517,
-0.7241379, 5.534483, 41.31034,
-0.3103448, 5.534483, 42.96552,
0.1034483, 5.534483, 44.62069,
0.5172414, 5.534483, 46.27586,
0.9310344, 5.534483, 47.93103,
1.344828, 5.534483, 49.58621,
1.758621, 5.534483, 51.24138,
2.172414, 5.534483, 52.89655,
2.586207, 5.534483, 54.55172,
3, 5.534483, 56.2069,
3.413793, 5.534483, 57.86207,
3.827586, 5.534483, 59.51724,
4.24138, 5.534483, 61.17242,
4.655172, 5.534483, 62.82759,
5.068966, 5.534483, 64.48276,
5.482759, 5.534483, 66.13793,
5.896552, 5.534483, 67.79311,
6.310345, 5.534483, 69.44827,
6.724138, 5.534483, 71.10345,
7.137931, 5.534483, 72.75862,
7.551724, 5.534483, 74.41379,
7.965517, 5.534483, 76.06897,
8.379311, 5.534483, 77.72414,
8.793103, 5.534483, 79.37932,
-2.793103, 6.051724, 36.13793,
-2.37931, 6.051724, 37.7931,
-1.965517, 6.051724, 39.44828,
-1.551724, 6.051724, 41.10345,
-1.137931, 6.051724, 42.75862,
-0.7241379, 6.051724, 44.41379,
-0.3103448, 6.051724, 46.06897,
0.1034483, 6.051724, 47.72414,
0.5172414, 6.051724, 49.37931,
0.9310344, 6.051724, 51.03448,
1.344828, 6.051724, 52.68966,
1.758621, 6.051724, 54.34483,
2.172414, 6.051724, 56,
2.586207, 6.051724, 57.65517,
3, 6.051724, 59.31034,
3.413793, 6.051724, 60.96552,
3.827586, 6.051724, 62.62069,
4.24138, 6.051724, 64.27586,
4.655172, 6.051724, 65.93103,
5.068966, 6.051724, 67.58621,
5.482759, 6.051724, 69.24138,
5.896552, 6.051724, 70.89656,
6.310345, 6.051724, 72.55173,
6.724138, 6.051724, 74.20689,
7.137931, 6.051724, 75.86208,
7.551724, 6.051724, 77.51724,
7.965517, 6.051724, 79.17242,
8.379311, 6.051724, 80.82759,
8.793103, 6.051724, 82.48276,
-2.793103, 6.568966, 39.24138,
-2.37931, 6.568966, 40.89655,
-1.965517, 6.568966, 42.55172,
-1.551724, 6.568966, 44.2069,
-1.137931, 6.568966, 45.86207,
-0.7241379, 6.568966, 47.51724,
-0.3103448, 6.568966, 49.17242,
0.1034483, 6.568966, 50.82759,
0.5172414, 6.568966, 52.48276,
0.9310344, 6.568966, 54.13793,
1.344828, 6.568966, 55.7931,
1.758621, 6.568966, 57.44828,
2.172414, 6.568966, 59.10345,
2.586207, 6.568966, 60.75862,
3, 6.568966, 62.41379,
3.413793, 6.568966, 64.06897,
3.827586, 6.568966, 65.72414,
4.24138, 6.568966, 67.37932,
4.655172, 6.568966, 69.03448,
5.068966, 6.568966, 70.68966,
5.482759, 6.568966, 72.34483,
5.896552, 6.568966, 74,
6.310345, 6.568966, 75.65517,
6.724138, 6.568966, 77.31035,
7.137931, 6.568966, 78.96552,
7.551724, 6.568966, 80.62069,
7.965517, 6.568966, 82.27586,
8.379311, 6.568966, 83.93103,
8.793103, 6.568966, 85.58621,
-2.793103, 7.086207, 42.34483,
-2.37931, 7.086207, 44,
-1.965517, 7.086207, 45.65517,
-1.551724, 7.086207, 47.31034,
-1.137931, 7.086207, 48.96552,
-0.7241379, 7.086207, 50.62069,
-0.3103448, 7.086207, 52.27586,
0.1034483, 7.086207, 53.93103,
0.5172414, 7.086207, 55.58621,
0.9310344, 7.086207, 57.24138,
1.344828, 7.086207, 58.89655,
1.758621, 7.086207, 60.55172,
2.172414, 7.086207, 62.20689,
2.586207, 7.086207, 63.86207,
3, 7.086207, 65.51724,
3.413793, 7.086207, 67.17242,
3.827586, 7.086207, 68.82759,
4.24138, 7.086207, 70.48276,
4.655172, 7.086207, 72.13793,
5.068966, 7.086207, 73.79311,
5.482759, 7.086207, 75.44827,
5.896552, 7.086207, 77.10345,
6.310345, 7.086207, 78.75862,
6.724138, 7.086207, 80.41379,
7.137931, 7.086207, 82.06897,
7.551724, 7.086207, 83.72414,
7.965517, 7.086207, 85.37932,
8.379311, 7.086207, 87.03448,
8.793103, 7.086207, 88.68966,
-2.793103, 7.603448, 45.44828,
-2.37931, 7.603448, 47.10345,
-1.965517, 7.603448, 48.75862,
-1.551724, 7.603448, 50.41379,
-1.137931, 7.603448, 52.06897,
-0.7241379, 7.603448, 53.72414,
-0.3103448, 7.603448, 55.37931,
0.1034483, 7.603448, 57.03448,
0.5172414, 7.603448, 58.68966,
0.9310344, 7.603448, 60.34483,
1.344828, 7.603448, 62,
1.758621, 7.603448, 63.65517,
2.172414, 7.603448, 65.31035,
2.586207, 7.603448, 66.96552,
3, 7.603448, 68.62069,
3.413793, 7.603448, 70.27586,
3.827586, 7.603448, 71.93103,
4.24138, 7.603448, 73.58621,
4.655172, 7.603448, 75.24138,
5.068966, 7.603448, 76.89656,
5.482759, 7.603448, 78.55173,
5.896552, 7.603448, 80.20689,
6.310345, 7.603448, 81.86208,
6.724138, 7.603448, 83.51724,
7.137931, 7.603448, 85.17242,
7.551724, 7.603448, 86.82759,
7.965517, 7.603448, 88.48276,
8.379311, 7.603448, 90.13793,
8.793103, 7.603448, 91.79311,
-2.793103, 8.120689, 48.55172,
-2.37931, 8.120689, 50.2069,
-1.965517, 8.120689, 51.86207,
-1.551724, 8.120689, 53.51724,
-1.137931, 8.120689, 55.17242,
-0.7241379, 8.120689, 56.82759,
-0.3103448, 8.120689, 58.48276,
0.1034483, 8.120689, 60.13793,
0.5172414, 8.120689, 61.79311,
0.9310344, 8.120689, 63.44827,
1.344828, 8.120689, 65.10345,
1.758621, 8.120689, 66.75862,
2.172414, 8.120689, 68.41379,
2.586207, 8.120689, 70.06897,
3, 8.120689, 71.72414,
3.413793, 8.120689, 73.37932,
3.827586, 8.120689, 75.03448,
4.24138, 8.120689, 76.68966,
4.655172, 8.120689, 78.34483,
5.068966, 8.120689, 80,
5.482759, 8.120689, 81.65517,
5.896552, 8.120689, 83.31035,
6.310345, 8.120689, 84.96552,
6.724138, 8.120689, 86.62069,
7.137931, 8.120689, 88.27586,
7.551724, 8.120689, 89.93103,
7.965517, 8.120689, 91.58621,
8.379311, 8.120689, 93.24138,
8.793103, 8.120689, 94.89656,
-2.793103, 8.637932, 51.65517,
-2.37931, 8.637932, 53.31034,
-1.965517, 8.637932, 54.96552,
-1.551724, 8.637932, 56.62069,
-1.137931, 8.637932, 58.27586,
-0.7241379, 8.637932, 59.93103,
-0.3103448, 8.637932, 61.58621,
0.1034483, 8.637932, 63.24138,
0.5172414, 8.637932, 64.89655,
0.9310344, 8.637932, 66.55173,
1.344828, 8.637932, 68.20689,
1.758621, 8.637932, 69.86208,
2.172414, 8.637932, 71.51724,
2.586207, 8.637932, 73.17242,
3, 8.637932, 74.82759,
3.413793, 8.637932, 76.48276,
3.827586, 8.637932, 78.13793,
4.24138, 8.637932, 79.79311,
4.655172, 8.637932, 81.44827,
5.068966, 8.637932, 83.10345,
5.482759, 8.637932, 84.75862,
5.896552, 8.637932, 86.41379,
6.310345, 8.637932, 88.06896,
6.724138, 8.637932, 89.72414,
7.137931, 8.637932, 91.37932,
7.551724, 8.637932, 93.03448,
7.965517, 8.637932, 94.68966,
8.379311, 8.637932, 96.34483,
8.793103, 8.637932, 97.99999,
-2.793103, 9.155172, 54.75862,
-2.37931, 9.155172, 56.41379,
-1.965517, 9.155172, 58.06897,
-1.551724, 9.155172, 59.72414,
-1.137931, 9.155172, 61.37931,
-0.7241379, 9.155172, 63.03448,
-0.3103448, 9.155172, 64.68966,
0.1034483, 9.155172, 66.34483,
0.5172414, 9.155172, 68,
0.9310344, 9.155172, 69.65517,
1.344828, 9.155172, 71.31035,
1.758621, 9.155172, 72.96552,
2.172414, 9.155172, 74.62069,
2.586207, 9.155172, 76.27586,
3, 9.155172, 77.93103,
3.413793, 9.155172, 79.58621,
3.827586, 9.155172, 81.24138,
4.24138, 9.155172, 82.89656,
4.655172, 9.155172, 84.55173,
5.068966, 9.155172, 86.20689,
5.482759, 9.155172, 87.86208,
5.896552, 9.155172, 89.51724,
6.310345, 9.155172, 91.17242,
6.724138, 9.155172, 92.82759,
7.137931, 9.155172, 94.48276,
7.551724, 9.155172, 96.13793,
7.965517, 9.155172, 97.79311,
8.379311, 9.155172, 99.44827,
8.793103, 9.155172, 101.1034,
-2.793103, 9.672414, 57.86207,
-2.37931, 9.672414, 59.51724,
-1.965517, 9.672414, 61.17242,
-1.551724, 9.672414, 62.82759,
-1.137931, 9.672414, 64.48276,
-0.7241379, 9.672414, 66.13793,
-0.3103448, 9.672414, 67.79311,
0.1034483, 9.672414, 69.44827,
0.5172414, 9.672414, 71.10345,
0.9310344, 9.672414, 72.75862,
1.344828, 9.672414, 74.41379,
1.758621, 9.672414, 76.06897,
2.172414, 9.672414, 77.72414,
2.586207, 9.672414, 79.37932,
3, 9.672414, 81.03448,
3.413793, 9.672414, 82.68966,
3.827586, 9.672414, 84.34483,
4.24138, 9.672414, 86,
4.655172, 9.672414, 87.65517,
5.068966, 9.672414, 89.31035,
5.482759, 9.672414, 90.96551,
5.896552, 9.672414, 92.62069,
6.310345, 9.672414, 94.27586,
6.724138, 9.672414, 95.93103,
7.137931, 9.672414, 97.58621,
7.551724, 9.672414, 99.24138,
7.965517, 9.672414, 100.8966,
8.379311, 9.672414, 102.5517,
8.793103, 9.672414, 104.2069,
-2.793103, 10.18966, 60.96552,
-2.37931, 10.18966, 62.62069,
-1.965517, 10.18966, 64.27586,
-1.551724, 10.18966, 65.93103,
-1.137931, 10.18966, 67.58621,
-0.7241379, 10.18966, 69.24138,
-0.3103448, 10.18966, 70.89656,
0.1034483, 10.18966, 72.55173,
0.5172414, 10.18966, 74.20689,
0.9310344, 10.18966, 75.86208,
1.344828, 10.18966, 77.51724,
1.758621, 10.18966, 79.17242,
2.172414, 10.18966, 80.82759,
2.586207, 10.18966, 82.48276,
3, 10.18966, 84.13793,
3.413793, 10.18966, 85.79311,
3.827586, 10.18966, 87.44827,
4.24138, 10.18966, 89.10345,
4.655172, 10.18966, 90.75862,
5.068966, 10.18966, 92.41379,
5.482759, 10.18966, 94.06896,
5.896552, 10.18966, 95.72414,
6.310345, 10.18966, 97.37932,
6.724138, 10.18966, 99.03448,
7.137931, 10.18966, 100.6897,
7.551724, 10.18966, 102.3448,
7.965517, 10.18966, 104,
8.379311, 10.18966, 105.6552,
8.793103, 10.18966, 107.3103,
-2.793103, 10.7069, 64.06897,
-2.37931, 10.7069, 65.72414,
-1.965517, 10.7069, 67.37932,
-1.551724, 10.7069, 69.03448,
-1.137931, 10.7069, 70.68966,
-0.7241379, 10.7069, 72.34483,
-0.3103448, 10.7069, 74,
0.1034483, 10.7069, 75.65517,
0.5172414, 10.7069, 77.31035,
0.9310344, 10.7069, 78.96552,
1.344828, 10.7069, 80.62069,
1.758621, 10.7069, 82.27586,
2.172414, 10.7069, 83.93103,
2.586207, 10.7069, 85.58621,
3, 10.7069, 87.24138,
3.413793, 10.7069, 88.89656,
3.827586, 10.7069, 90.55173,
4.24138, 10.7069, 92.20689,
4.655172, 10.7069, 93.86208,
5.068966, 10.7069, 95.51724,
5.482759, 10.7069, 97.17242,
5.896552, 10.7069, 98.82759,
6.310345, 10.7069, 100.4828,
6.724138, 10.7069, 102.1379,
7.137931, 10.7069, 103.7931,
7.551724, 10.7069, 105.4483,
7.965517, 10.7069, 107.1034,
8.379311, 10.7069, 108.7586,
8.793103, 10.7069, 110.4138,
-2.793103, 11.22414, 67.17242,
-2.37931, 11.22414, 68.82759,
-1.965517, 11.22414, 70.48276,
-1.551724, 11.22414, 72.13793,
-1.137931, 11.22414, 73.79311,
-0.7241379, 11.22414, 75.44827,
-0.3103448, 11.22414, 77.10345,
0.1034483, 11.22414, 78.75862,
0.5172414, 11.22414, 80.41379,
0.9310344, 11.22414, 82.06897,
1.344828, 11.22414, 83.72414,
1.758621, 11.22414, 85.37932,
2.172414, 11.22414, 87.03448,
2.586207, 11.22414, 88.68966,
3, 11.22414, 90.34483,
3.413793, 11.22414, 91.99999,
3.827586, 11.22414, 93.65517,
4.24138, 11.22414, 95.31035,
4.655172, 11.22414, 96.96551,
5.068966, 11.22414, 98.62069,
5.482759, 11.22414, 100.2759,
5.896552, 11.22414, 101.931,
6.310345, 11.22414, 103.5862,
6.724138, 11.22414, 105.2414,
7.137931, 11.22414, 106.8966,
7.551724, 11.22414, 108.5517,
7.965517, 11.22414, 110.2069,
8.379311, 11.22414, 111.8621,
8.793103, 11.22414, 113.5172,
-2.793103, 11.74138, 70.27586,
-2.37931, 11.74138, 71.93103,
-1.965517, 11.74138, 73.58621,
-1.551724, 11.74138, 75.24138,
-1.137931, 11.74138, 76.89656,
-0.7241379, 11.74138, 78.55173,
-0.3103448, 11.74138, 80.20689,
0.1034483, 11.74138, 81.86208,
0.5172414, 11.74138, 83.51724,
0.9310344, 11.74138, 85.17242,
1.344828, 11.74138, 86.82759,
1.758621, 11.74138, 88.48276,
2.172414, 11.74138, 90.13793,
2.586207, 11.74138, 91.79311,
3, 11.74138, 93.44827,
3.413793, 11.74138, 95.10345,
3.827586, 11.74138, 96.75862,
4.24138, 11.74138, 98.41379,
4.655172, 11.74138, 100.069,
5.068966, 11.74138, 101.7241,
5.482759, 11.74138, 103.3793,
5.896552, 11.74138, 105.0345,
6.310345, 11.74138, 106.6897,
6.724138, 11.74138, 108.3448,
7.137931, 11.74138, 110,
7.551724, 11.74138, 111.6552,
7.965517, 11.74138, 113.3103,
8.379311, 11.74138, 114.9655,
8.793103, 11.74138, 116.6207
]);
var f49=new Uint16Array([
0, 30, 31, 0, 31, 1,
30, 60, 61, 30, 61, 31,
60, 90, 91, 60, 91, 61,
90, 120, 121, 90, 121, 91,
120, 150, 151, 120, 151, 121,
150, 180, 181, 150, 181, 151,
180, 210, 211, 180, 211, 181,
210, 240, 241, 210, 241, 211,
240, 270, 271, 240, 271, 241,
270, 300, 301, 270, 301, 271,
300, 330, 331, 300, 331, 301,
330, 360, 361, 330, 361, 331,
360, 390, 391, 360, 391, 361,
390, 420, 421, 390, 421, 391,
420, 450, 451, 420, 451, 421,
450, 480, 481, 450, 481, 451,
480, 510, 511, 480, 511, 481,
510, 540, 541, 510, 541, 511,
540, 570, 571, 540, 571, 541,
570, 600, 601, 570, 601, 571,
600, 630, 631, 600, 631, 601,
630, 660, 661, 630, 661, 631,
660, 690, 691, 660, 691, 661,
690, 720, 721, 690, 721, 691,
720, 750, 751, 720, 751, 721,
750, 780, 781, 750, 781, 751,
780, 810, 811, 780, 811, 781,
810, 840, 841, 810, 841, 811,
840, 870, 871, 840, 871, 841,
1, 31, 32, 1, 32, 2,
31, 61, 62, 31, 62, 32,
61, 91, 92, 61, 92, 62,
91, 121, 122, 91, 122, 92,
121, 151, 152, 121, 152, 122,
151, 181, 182, 151, 182, 152,
181, 211, 212, 181, 212, 182,
211, 241, 242, 211, 242, 212,
241, 271, 272, 241, 272, 242,
271, 301, 302, 271, 302, 272,
301, 331, 332, 301, 332, 302,
331, 361, 362, 331, 362, 332,
361, 391, 392, 361, 392, 362,
391, 421, 422, 391, 422, 392,
421, 451, 452, 421, 452, 422,
451, 481, 482, 451, 482, 452,
481, 511, 512, 481, 512, 482,
511, 541, 542, 511, 542, 512,
541, 571, 572, 541, 572, 542,
571, 601, 602, 571, 602, 572,
601, 631, 632, 601, 632, 602,
631, 661, 662, 631, 662, 632,
661, 691, 692, 661, 692, 662,
691, 721, 722, 691, 722, 692,
721, 751, 752, 721, 752, 722,
751, 781, 782, 751, 782, 752,
781, 811, 812, 781, 812, 782,
811, 841, 842, 811, 842, 812,
841, 871, 872, 841, 872, 842,
2, 32, 33, 2, 33, 3,
32, 62, 63, 32, 63, 33,
62, 92, 93, 62, 93, 63,
92, 122, 123, 92, 123, 93,
122, 152, 153, 122, 153, 123,
152, 182, 183, 152, 183, 153,
182, 212, 213, 182, 213, 183,
212, 242, 243, 212, 243, 213,
242, 272, 273, 242, 273, 243,
272, 302, 303, 272, 303, 273,
302, 332, 333, 302, 333, 303,
332, 362, 363, 332, 363, 333,
362, 392, 393, 362, 393, 363,
392, 422, 423, 392, 423, 393,
422, 452, 453, 422, 453, 423,
452, 482, 483, 452, 483, 453,
482, 512, 513, 482, 513, 483,
512, 542, 543, 512, 543, 513,
542, 572, 573, 542, 573, 543,
572, 602, 603, 572, 603, 573,
602, 632, 633, 602, 633, 603,
632, 662, 663, 632, 663, 633,
662, 692, 693, 662, 693, 663,
692, 722, 723, 692, 723, 693,
722, 752, 753, 722, 753, 723,
752, 782, 783, 752, 783, 753,
782, 812, 813, 782, 813, 783,
812, 842, 843, 812, 843, 813,
842, 872, 873, 842, 873, 843,
3, 33, 34, 3, 34, 4,
33, 63, 64, 33, 64, 34,
63, 93, 94, 63, 94, 64,
93, 123, 124, 93, 124, 94,
123, 153, 154, 123, 154, 124,
153, 183, 184, 153, 184, 154,
183, 213, 214, 183, 214, 184,
213, 243, 244, 213, 244, 214,
243, 273, 274, 243, 274, 244,
273, 303, 304, 273, 304, 274,
303, 333, 334, 303, 334, 304,
333, 363, 364, 333, 364, 334,
363, 393, 394, 363, 394, 364,
393, 423, 424, 393, 424, 394,
423, 453, 454, 423, 454, 424,
453, 483, 484, 453, 484, 454,
483, 513, 514, 483, 514, 484,
513, 543, 544, 513, 544, 514,
543, 573, 574, 543, 574, 544,
573, 603, 604, 573, 604, 574,
603, 633, 634, 603, 634, 604,
633, 663, 664, 633, 664, 634,
663, 693, 694, 663, 694, 664,
693, 723, 724, 693, 724, 694,
723, 753, 754, 723, 754, 724,
753, 783, 784, 753, 784, 754,
783, 813, 814, 783, 814, 784,
813, 843, 844, 813, 844, 814,
843, 873, 874, 843, 874, 844,
4, 34, 35, 4, 35, 5,
34, 64, 65, 34, 65, 35,
64, 94, 95, 64, 95, 65,
94, 124, 125, 94, 125, 95,
124, 154, 155, 124, 155, 125,
154, 184, 185, 154, 185, 155,
184, 214, 215, 184, 215, 185,
214, 244, 245, 214, 245, 215,
244, 274, 275, 244, 275, 245,
274, 304, 305, 274, 305, 275,
304, 334, 335, 304, 335, 305,
334, 364, 365, 334, 365, 335,
364, 394, 395, 364, 395, 365,
394, 424, 425, 394, 425, 395,
424, 454, 455, 424, 455, 425,
454, 484, 485, 454, 485, 455,
484, 514, 515, 484, 515, 485,
514, 544, 545, 514, 545, 515,
544, 574, 575, 544, 575, 545,
574, 604, 605, 574, 605, 575,
604, 634, 635, 604, 635, 605,
634, 664, 665, 634, 665, 635,
664, 694, 695, 664, 695, 665,
694, 724, 725, 694, 725, 695,
724, 754, 755, 724, 755, 725,
754, 784, 785, 754, 785, 755,
784, 814, 815, 784, 815, 785,
814, 844, 845, 814, 845, 815,
844, 874, 875, 844, 875, 845,
5, 35, 36, 5, 36, 6,
35, 65, 66, 35, 66, 36,
65, 95, 96, 65, 96, 66,
95, 125, 126, 95, 126, 96,
125, 155, 156, 125, 156, 126,
155, 185, 186, 155, 186, 156,
185, 215, 216, 185, 216, 186,
215, 245, 246, 215, 246, 216,
245, 275, 276, 245, 276, 246,
275, 305, 306, 275, 306, 276,
305, 335, 336, 305, 336, 306,
335, 365, 366, 335, 366, 336,
365, 395, 396, 365, 396, 366,
395, 425, 426, 395, 426, 396,
425, 455, 456, 425, 456, 426,
455, 485, 486, 455, 486, 456,
485, 515, 516, 485, 516, 486,
515, 545, 546, 515, 546, 516,
545, 575, 576, 545, 576, 546,
575, 605, 606, 575, 606, 576,
605, 635, 636, 605, 636, 606,
635, 665, 666, 635, 666, 636,
665, 695, 696, 665, 696, 666,
695, 725, 726, 695, 726, 696,
725, 755, 756, 725, 756, 726,
755, 785, 786, 755, 786, 756,
785, 815, 816, 785, 816, 786,
815, 845, 846, 815, 846, 816,
845, 875, 876, 845, 876, 846,
6, 36, 37, 6, 37, 7,
36, 66, 67, 36, 67, 37,
66, 96, 97, 66, 97, 67,
96, 126, 127, 96, 127, 97,
126, 156, 157, 126, 157, 127,
156, 186, 187, 156, 187, 157,
186, 216, 217, 186, 217, 187,
216, 246, 247, 216, 247, 217,
246, 276, 277, 246, 277, 247,
276, 306, 307, 276, 307, 277,
306, 336, 337, 306, 337, 307,
336, 366, 367, 336, 367, 337,
366, 396, 397, 366, 397, 367,
396, 426, 427, 396, 427, 397,
426, 456, 457, 426, 457, 427,
456, 486, 487, 456, 487, 457,
486, 516, 517, 486, 517, 487,
516, 546, 547, 516, 547, 517,
546, 576, 577, 546, 577, 547,
576, 606, 607, 576, 607, 577,
606, 636, 637, 606, 637, 607,
636, 666, 667, 636, 667, 637,
666, 696, 697, 666, 697, 667,
696, 726, 727, 696, 727, 697,
726, 756, 757, 726, 757, 727,
756, 786, 787, 756, 787, 757,
786, 816, 817, 786, 817, 787,
816, 846, 847, 816, 847, 817,
846, 876, 877, 846, 877, 847,
7, 37, 38, 7, 38, 8,
37, 67, 68, 37, 68, 38,
67, 97, 98, 67, 98, 68,
97, 127, 128, 97, 128, 98,
127, 157, 158, 127, 158, 128,
157, 187, 188, 157, 188, 158,
187, 217, 218, 187, 218, 188,
217, 247, 248, 217, 248, 218,
247, 277, 278, 247, 278, 248,
277, 307, 308, 277, 308, 278,
307, 337, 338, 307, 338, 308,
337, 367, 368, 337, 368, 338,
367, 397, 398, 367, 398, 368,
397, 427, 428, 397, 428, 398,
427, 457, 458, 427, 458, 428,
457, 487, 488, 457, 488, 458,
487, 517, 518, 487, 518, 488,
517, 547, 548, 517, 548, 518,
547, 577, 578, 547, 578, 548,
577, 607, 608, 577, 608, 578,
607, 637, 638, 607, 638, 608,
637, 667, 668, 637, 668, 638,
667, 697, 698, 667, 698, 668,
697, 727, 728, 697, 728, 698,
727, 757, 758, 727, 758, 728,
757, 787, 788, 757, 788, 758,
787, 817, 818, 787, 818, 788,
817, 847, 848, 817, 848, 818,
847, 877, 878, 847, 878, 848,
8, 38, 39, 8, 39, 9,
38, 68, 69, 38, 69, 39,
68, 98, 99, 68, 99, 69,
98, 128, 129, 98, 129, 99,
128, 158, 159, 128, 159, 129,
158, 188, 189, 158, 189, 159,
188, 218, 219, 188, 219, 189,
218, 248, 249, 218, 249, 219,
248, 278, 279, 248, 279, 249,
278, 308, 309, 278, 309, 279,
308, 338, 339, 308, 339, 309,
338, 368, 369, 338, 369, 339,
368, 398, 399, 368, 399, 369,
398, 428, 429, 398, 429, 399,
428, 458, 459, 428, 459, 429,
458, 488, 489, 458, 489, 459,
488, 518, 519, 488, 519, 489,
518, 548, 549, 518, 549, 519,
548, 578, 579, 548, 579, 549,
578, 608, 609, 578, 609, 579,
608, 638, 639, 608, 639, 609,
638, 668, 669, 638, 669, 639,
668, 698, 699, 668, 699, 669,
698, 728, 729, 698, 729, 699,
728, 758, 759, 728, 759, 729,
758, 788, 789, 758, 789, 759,
788, 818, 819, 788, 819, 789,
818, 848, 849, 818, 849, 819,
848, 878, 879, 848, 879, 849,
9, 39, 40, 9, 40, 10,
39, 69, 70, 39, 70, 40,
69, 99, 100, 69, 100, 70,
99, 129, 130, 99, 130, 100,
129, 159, 160, 129, 160, 130,
159, 189, 190, 159, 190, 160,
189, 219, 220, 189, 220, 190,
219, 249, 250, 219, 250, 220,
249, 279, 280, 249, 280, 250,
279, 309, 310, 279, 310, 280,
309, 339, 340, 309, 340, 310,
339, 369, 370, 339, 370, 340,
369, 399, 400, 369, 400, 370,
399, 429, 430, 399, 430, 400,
429, 459, 460, 429, 460, 430,
459, 489, 490, 459, 490, 460,
489, 519, 520, 489, 520, 490,
519, 549, 550, 519, 550, 520,
549, 579, 580, 549, 580, 550,
579, 609, 610, 579, 610, 580,
609, 639, 640, 609, 640, 610,
639, 669, 670, 639, 670, 640,
669, 699, 700, 669, 700, 670,
699, 729, 730, 699, 730, 700,
729, 759, 760, 729, 760, 730,
759, 789, 790, 759, 790, 760,
789, 819, 820, 789, 820, 790,
819, 849, 850, 819, 850, 820,
849, 879, 880, 849, 880, 850,
10, 40, 41, 10, 41, 11,
40, 70, 71, 40, 71, 41,
70, 100, 101, 70, 101, 71,
100, 130, 131, 100, 131, 101,
130, 160, 161, 130, 161, 131,
160, 190, 191, 160, 191, 161,
190, 220, 221, 190, 221, 191,
220, 250, 251, 220, 251, 221,
250, 280, 281, 250, 281, 251,
280, 310, 311, 280, 311, 281,
310, 340, 341, 310, 341, 311,
340, 370, 371, 340, 371, 341,
370, 400, 401, 370, 401, 371,
400, 430, 431, 400, 431, 401,
430, 460, 461, 430, 461, 431,
460, 490, 491, 460, 491, 461,
490, 520, 521, 490, 521, 491,
520, 550, 551, 520, 551, 521,
550, 580, 581, 550, 581, 551,
580, 610, 611, 580, 611, 581,
610, 640, 641, 610, 641, 611,
640, 670, 671, 640, 671, 641,
670, 700, 701, 670, 701, 671,
700, 730, 731, 700, 731, 701,
730, 760, 761, 730, 761, 731,
760, 790, 791, 760, 791, 761,
790, 820, 821, 790, 821, 791,
820, 850, 851, 820, 851, 821,
850, 880, 881, 850, 881, 851,
11, 41, 42, 11, 42, 12,
41, 71, 72, 41, 72, 42,
71, 101, 102, 71, 102, 72,
101, 131, 132, 101, 132, 102,
131, 161, 162, 131, 162, 132,
161, 191, 192, 161, 192, 162,
191, 221, 222, 191, 222, 192,
221, 251, 252, 221, 252, 222,
251, 281, 282, 251, 282, 252,
281, 311, 312, 281, 312, 282,
311, 341, 342, 311, 342, 312,
341, 371, 372, 341, 372, 342,
371, 401, 402, 371, 402, 372,
401, 431, 432, 401, 432, 402,
431, 461, 462, 431, 462, 432,
461, 491, 492, 461, 492, 462,
491, 521, 522, 491, 522, 492,
521, 551, 552, 521, 552, 522,
551, 581, 582, 551, 582, 552,
581, 611, 612, 581, 612, 582,
611, 641, 642, 611, 642, 612,
641, 671, 672, 641, 672, 642,
671, 701, 702, 671, 702, 672,
701, 731, 732, 701, 732, 702,
731, 761, 762, 731, 762, 732,
761, 791, 792, 761, 792, 762,
791, 821, 822, 791, 822, 792,
821, 851, 852, 821, 852, 822,
851, 881, 882, 851, 882, 852,
12, 42, 43, 12, 43, 13,
42, 72, 73, 42, 73, 43,
72, 102, 103, 72, 103, 73,
102, 132, 133, 102, 133, 103,
132, 162, 163, 132, 163, 133,
162, 192, 193, 162, 193, 163,
192, 222, 223, 192, 223, 193,
222, 252, 253, 222, 253, 223,
252, 282, 283, 252, 283, 253,
282, 312, 313, 282, 313, 283,
312, 342, 343, 312, 343, 313,
342, 372, 373, 342, 373, 343,
372, 402, 403, 372, 403, 373,
402, 432, 433, 402, 433, 403,
432, 462, 463, 432, 463, 433,
462, 492, 493, 462, 493, 463,
492, 522, 523, 492, 523, 493,
522, 552, 553, 522, 553, 523,
552, 582, 583, 552, 583, 553,
582, 612, 613, 582, 613, 583,
612, 642, 643, 612, 643, 613,
642, 672, 673, 642, 673, 643,
672, 702, 703, 672, 703, 673,
702, 732, 733, 702, 733, 703,
732, 762, 763, 732, 763, 733,
762, 792, 793, 762, 793, 763,
792, 822, 823, 792, 823, 793,
822, 852, 853, 822, 853, 823,
852, 882, 883, 852, 883, 853,
13, 43, 44, 13, 44, 14,
43, 73, 74, 43, 74, 44,
73, 103, 104, 73, 104, 74,
103, 133, 134, 103, 134, 104,
133, 163, 164, 133, 164, 134,
163, 193, 194, 163, 194, 164,
193, 223, 224, 193, 224, 194,
223, 253, 254, 223, 254, 224,
253, 283, 284, 253, 284, 254,
283, 313, 314, 283, 314, 284,
313, 343, 344, 313, 344, 314,
343, 373, 374, 343, 374, 344,
373, 403, 404, 373, 404, 374,
403, 433, 434, 403, 434, 404,
433, 463, 464, 433, 464, 434,
463, 493, 494, 463, 494, 464,
493, 523, 524, 493, 524, 494,
523, 553, 554, 523, 554, 524,
553, 583, 584, 553, 584, 554,
583, 613, 614, 583, 614, 584,
613, 643, 644, 613, 644, 614,
643, 673, 674, 643, 674, 644,
673, 703, 704, 673, 704, 674,
703, 733, 734, 703, 734, 704,
733, 763, 764, 733, 764, 734,
763, 793, 794, 763, 794, 764,
793, 823, 824, 793, 824, 794,
823, 853, 854, 823, 854, 824,
853, 883, 884, 853, 884, 854,
14, 44, 45, 14, 45, 15,
44, 74, 75, 44, 75, 45,
74, 104, 105, 74, 105, 75,
104, 134, 135, 104, 135, 105,
134, 164, 165, 134, 165, 135,
164, 194, 195, 164, 195, 165,
194, 224, 225, 194, 225, 195,
224, 254, 255, 224, 255, 225,
254, 284, 285, 254, 285, 255,
284, 314, 315, 284, 315, 285,
314, 344, 345, 314, 345, 315,
344, 374, 375, 344, 375, 345,
374, 404, 405, 374, 405, 375,
404, 434, 435, 404, 435, 405,
434, 464, 465, 434, 465, 435,
464, 494, 495, 464, 495, 465,
494, 524, 525, 494, 525, 495,
524, 554, 555, 524, 555, 525,
554, 584, 585, 554, 585, 555,
584, 614, 615, 584, 615, 585,
614, 644, 645, 614, 645, 615,
644, 674, 675, 644, 675, 645,
674, 704, 705, 674, 705, 675,
704, 734, 735, 704, 735, 705,
734, 764, 765, 734, 765, 735,
764, 794, 795, 764, 795, 765,
794, 824, 825, 794, 825, 795,
824, 854, 855, 824, 855, 825,
854, 884, 885, 854, 885, 855,
15, 45, 46, 15, 46, 16,
45, 75, 76, 45, 76, 46,
75, 105, 106, 75, 106, 76,
105, 135, 136, 105, 136, 106,
135, 165, 166, 135, 166, 136,
165, 195, 196, 165, 196, 166,
195, 225, 226, 195, 226, 196,
225, 255, 256, 225, 256, 226,
255, 285, 286, 255, 286, 256,
285, 315, 316, 285, 316, 286,
315, 345, 346, 315, 346, 316,
345, 375, 376, 345, 376, 346,
375, 405, 406, 375, 406, 376,
405, 435, 436, 405, 436, 406,
435, 465, 466, 435, 466, 436,
465, 495, 496, 465, 496, 466,
495, 525, 526, 495, 526, 496,
525, 555, 556, 525, 556, 526,
555, 585, 586, 555, 586, 556,
585, 615, 616, 585, 616, 586,
615, 645, 646, 615, 646, 616,
645, 675, 676, 645, 676, 646,
675, 705, 706, 675, 706, 676,
705, 735, 736, 705, 736, 706,
735, 765, 766, 735, 766, 736,
765, 795, 796, 765, 796, 766,
795, 825, 826, 795, 826, 796,
825, 855, 856, 825, 856, 826,
855, 885, 886, 855, 886, 856,
16, 46, 47, 16, 47, 17,
46, 76, 77, 46, 77, 47,
76, 106, 107, 76, 107, 77,
106, 136, 137, 106, 137, 107,
136, 166, 167, 136, 167, 137,
166, 196, 197, 166, 197, 167,
196, 226, 227, 196, 227, 197,
226, 256, 257, 226, 257, 227,
256, 286, 287, 256, 287, 257,
286, 316, 317, 286, 317, 287,
316, 346, 347, 316, 347, 317,
346, 376, 377, 346, 377, 347,
376, 406, 407, 376, 407, 377,
406, 436, 437, 406, 437, 407,
436, 466, 467, 436, 467, 437,
466, 496, 497, 466, 497, 467,
496, 526, 527, 496, 527, 497,
526, 556, 557, 526, 557, 527,
556, 586, 587, 556, 587, 557,
586, 616, 617, 586, 617, 587,
616, 646, 647, 616, 647, 617,
646, 676, 677, 646, 677, 647,
676, 706, 707, 676, 707, 677,
706, 736, 737, 706, 737, 707,
736, 766, 767, 736, 767, 737,
766, 796, 797, 766, 797, 767,
796, 826, 827, 796, 827, 797,
826, 856, 857, 826, 857, 827,
856, 886, 887, 856, 887, 857,
17, 47, 48, 17, 48, 18,
47, 77, 78, 47, 78, 48,
77, 107, 108, 77, 108, 78,
107, 137, 138, 107, 138, 108,
137, 167, 168, 137, 168, 138,
167, 197, 198, 167, 198, 168,
197, 227, 228, 197, 228, 198,
227, 257, 258, 227, 258, 228,
257, 287, 288, 257, 288, 258,
287, 317, 318, 287, 318, 288,
317, 347, 348, 317, 348, 318,
347, 377, 378, 347, 378, 348,
377, 407, 408, 377, 408, 378,
407, 437, 438, 407, 438, 408,
437, 467, 468, 437, 468, 438,
467, 497, 498, 467, 498, 468,
497, 527, 528, 497, 528, 498,
527, 557, 558, 527, 558, 528,
557, 587, 588, 557, 588, 558,
587, 617, 618, 587, 618, 588,
617, 647, 648, 617, 648, 618,
647, 677, 678, 647, 678, 648,
677, 707, 708, 677, 708, 678,
707, 737, 738, 707, 738, 708,
737, 767, 768, 737, 768, 738,
767, 797, 798, 767, 798, 768,
797, 827, 828, 797, 828, 798,
827, 857, 858, 827, 858, 828,
857, 887, 888, 857, 888, 858,
18, 48, 49, 18, 49, 19,
48, 78, 79, 48, 79, 49,
78, 108, 109, 78, 109, 79,
108, 138, 139, 108, 139, 109,
138, 168, 169, 138, 169, 139,
168, 198, 199, 168, 199, 169,
198, 228, 229, 198, 229, 199,
228, 258, 259, 228, 259, 229,
258, 288, 289, 258, 289, 259,
288, 318, 319, 288, 319, 289,
318, 348, 349, 318, 349, 319,
348, 378, 379, 348, 379, 349,
378, 408, 409, 378, 409, 379,
408, 438, 439, 408, 439, 409,
438, 468, 469, 438, 469, 439,
468, 498, 499, 468, 499, 469,
498, 528, 529, 498, 529, 499,
528, 558, 559, 528, 559, 529,
558, 588, 589, 558, 589, 559,
588, 618, 619, 588, 619, 589,
618, 648, 649, 618, 649, 619,
648, 678, 679, 648, 679, 649,
678, 708, 709, 678, 709, 679,
708, 738, 739, 708, 739, 709,
738, 768, 769, 738, 769, 739,
768, 798, 799, 768, 799, 769,
798, 828, 829, 798, 829, 799,
828, 858, 859, 828, 859, 829,
858, 888, 889, 858, 889, 859,
19, 49, 50, 19, 50, 20,
49, 79, 80, 49, 80, 50,
79, 109, 110, 79, 110, 80,
109, 139, 140, 109, 140, 110,
139, 169, 170, 139, 170, 140,
169, 199, 200, 169, 200, 170,
199, 229, 230, 199, 230, 200,
229, 259, 260, 229, 260, 230,
259, 289, 290, 259, 290, 260,
289, 319, 320, 289, 320, 290,
319, 349, 350, 319, 350, 320,
349, 379, 380, 349, 380, 350,
379, 409, 410, 379, 410, 380,
409, 439, 440, 409, 440, 410,
439, 469, 470, 439, 470, 440,
469, 499, 500, 469, 500, 470,
499, 529, 530, 499, 530, 500,
529, 559, 560, 529, 560, 530,
559, 589, 590, 559, 590, 560,
589, 619, 620, 589, 620, 590,
619, 649, 650, 619, 650, 620,
649, 679, 680, 649, 680, 650,
679, 709, 710, 679, 710, 680,
709, 739, 740, 709, 740, 710,
739, 769, 770, 739, 770, 740,
769, 799, 800, 769, 800, 770,
799, 829, 830, 799, 830, 800,
829, 859, 860, 829, 860, 830,
859, 889, 890, 859, 890, 860,
20, 50, 51, 20, 51, 21,
50, 80, 81, 50, 81, 51,
80, 110, 111, 80, 111, 81,
110, 140, 141, 110, 141, 111,
140, 170, 171, 140, 171, 141,
170, 200, 201, 170, 201, 171,
200, 230, 231, 200, 231, 201,
230, 260, 261, 230, 261, 231,
260, 290, 291, 260, 291, 261,
290, 320, 321, 290, 321, 291,
320, 350, 351, 320, 351, 321,
350, 380, 381, 350, 381, 351,
380, 410, 411, 380, 411, 381,
410, 440, 441, 410, 441, 411,
440, 470, 471, 440, 471, 441,
470, 500, 501, 470, 501, 471,
500, 530, 531, 500, 531, 501,
530, 560, 561, 530, 561, 531,
560, 590, 591, 560, 591, 561,
590, 620, 621, 590, 621, 591,
620, 650, 651, 620, 651, 621,
650, 680, 681, 650, 681, 651,
680, 710, 711, 680, 711, 681,
710, 740, 741, 710, 741, 711,
740, 770, 771, 740, 771, 741,
770, 800, 801, 770, 801, 771,
800, 830, 831, 800, 831, 801,
830, 860, 861, 830, 861, 831,
860, 890, 891, 860, 891, 861,
21, 51, 52, 21, 52, 22,
51, 81, 82, 51, 82, 52,
81, 111, 112, 81, 112, 82,
111, 141, 142, 111, 142, 112,
141, 171, 172, 141, 172, 142,
171, 201, 202, 171, 202, 172,
201, 231, 232, 201, 232, 202,
231, 261, 262, 231, 262, 232,
261, 291, 292, 261, 292, 262,
291, 321, 322, 291, 322, 292,
321, 351, 352, 321, 352, 322,
351, 381, 382, 351, 382, 352,
381, 411, 412, 381, 412, 382,
411, 441, 442, 411, 442, 412,
441, 471, 472, 441, 472, 442,
471, 501, 502, 471, 502, 472,
501, 531, 532, 501, 532, 502,
531, 561, 562, 531, 562, 532,
561, 591, 592, 561, 592, 562,
591, 621, 622, 591, 622, 592,
621, 651, 652, 621, 652, 622,
651, 681, 682, 651, 682, 652,
681, 711, 712, 681, 712, 682,
711, 741, 742, 711, 742, 712,
741, 771, 772, 741, 772, 742,
771, 801, 802, 771, 802, 772,
801, 831, 832, 801, 832, 802,
831, 861, 862, 831, 862, 832,
861, 891, 892, 861, 892, 862,
22, 52, 53, 22, 53, 23,
52, 82, 83, 52, 83, 53,
82, 112, 113, 82, 113, 83,
112, 142, 143, 112, 143, 113,
142, 172, 173, 142, 173, 143,
172, 202, 203, 172, 203, 173,
202, 232, 233, 202, 233, 203,
232, 262, 263, 232, 263, 233,
262, 292, 293, 262, 293, 263,
292, 322, 323, 292, 323, 293,
322, 352, 353, 322, 353, 323,
352, 382, 383, 352, 383, 353,
382, 412, 413, 382, 413, 383,
412, 442, 443, 412, 443, 413,
442, 472, 473, 442, 473, 443,
472, 502, 503, 472, 503, 473,
502, 532, 533, 502, 533, 503,
532, 562, 563, 532, 563, 533,
562, 592, 593, 562, 593, 563,
592, 622, 623, 592, 623, 593,
622, 652, 653, 622, 653, 623,
652, 682, 683, 652, 683, 653,
682, 712, 713, 682, 713, 683,
712, 742, 743, 712, 743, 713,
742, 772, 773, 742, 773, 743,
772, 802, 803, 772, 803, 773,
802, 832, 833, 802, 833, 803,
832, 862, 863, 832, 863, 833,
862, 892, 893, 862, 893, 863,
23, 53, 54, 23, 54, 24,
53, 83, 84, 53, 84, 54,
83, 113, 114, 83, 114, 84,
113, 143, 144, 113, 144, 114,
143, 173, 174, 143, 174, 144,
173, 203, 204, 173, 204, 174,
203, 233, 234, 203, 234, 204,
233, 263, 264, 233, 264, 234,
263, 293, 294, 263, 294, 264,
293, 323, 324, 293, 324, 294,
323, 353, 354, 323, 354, 324,
353, 383, 384, 353, 384, 354,
383, 413, 414, 383, 414, 384,
413, 443, 444, 413, 444, 414,
443, 473, 474, 443, 474, 444,
473, 503, 504, 473, 504, 474,
503, 533, 534, 503, 534, 504,
533, 563, 564, 533, 564, 534,
563, 593, 594, 563, 594, 564,
593, 623, 624, 593, 624, 594,
623, 653, 654, 623, 654, 624,
653, 683, 684, 653, 684, 654,
683, 713, 714, 683, 714, 684,
713, 743, 744, 713, 744, 714,
743, 773, 774, 743, 774, 744,
773, 803, 804, 773, 804, 774,
803, 833, 834, 803, 834, 804,
833, 863, 864, 833, 864, 834,
863, 893, 894, 863, 894, 864,
24, 54, 55, 24, 55, 25,
54, 84, 85, 54, 85, 55,
84, 114, 115, 84, 115, 85,
114, 144, 145, 114, 145, 115,
144, 174, 175, 144, 175, 145,
174, 204, 205, 174, 205, 175,
204, 234, 235, 204, 235, 205,
234, 264, 265, 234, 265, 235,
264, 294, 295, 264, 295, 265,
294, 324, 325, 294, 325, 295,
324, 354, 355, 324, 355, 325,
354, 384, 385, 354, 385, 355,
384, 414, 415, 384, 415, 385,
414, 444, 445, 414, 445, 415,
444, 474, 475, 444, 475, 445,
474, 504, 505, 474, 505, 475,
504, 534, 535, 504, 535, 505,
534, 564, 565, 534, 565, 535,
564, 594, 595, 564, 595, 565,
594, 624, 625, 594, 625, 595,
624, 654, 655, 624, 655, 625,
654, 684, 685, 654, 685, 655,
684, 714, 715, 684, 715, 685,
714, 744, 745, 714, 745, 715,
744, 774, 775, 744, 775, 745,
774, 804, 805, 774, 805, 775,
804, 834, 835, 804, 835, 805,
834, 864, 865, 834, 865, 835,
864, 894, 895, 864, 895, 865,
25, 55, 56, 25, 56, 26,
55, 85, 86, 55, 86, 56,
85, 115, 116, 85, 116, 86,
115, 145, 146, 115, 146, 116,
145, 175, 176, 145, 176, 146,
175, 205, 206, 175, 206, 176,
205, 235, 236, 205, 236, 206,
235, 265, 266, 235, 266, 236,
265, 295, 296, 265, 296, 266,
295, 325, 326, 295, 326, 296,
325, 355, 356, 325, 356, 326,
355, 385, 386, 355, 386, 356,
385, 415, 416, 385, 416, 386,
415, 445, 446, 415, 446, 416,
445, 475, 476, 445, 476, 446,
475, 505, 506, 475, 506, 476,
505, 535, 536, 505, 536, 506,
535, 565, 566, 535, 566, 536,
565, 595, 596, 565, 596, 566,
595, 625, 626, 595, 626, 596,
625, 655, 656, 625, 656, 626,
655, 685, 686, 655, 686, 656,
685, 715, 716, 685, 716, 686,
715, 745, 746, 715, 746, 716,
745, 775, 776, 745, 776, 746,
775, 805, 806, 775, 806, 776,
805, 835, 836, 805, 836, 806,
835, 865, 866, 835, 866, 836,
865, 895, 896, 865, 896, 866,
26, 56, 57, 26, 57, 27,
56, 86, 87, 56, 87, 57,
86, 116, 117, 86, 117, 87,
116, 146, 147, 116, 147, 117,
146, 176, 177, 146, 177, 147,
176, 206, 207, 176, 207, 177,
206, 236, 237, 206, 237, 207,
236, 266, 267, 236, 267, 237,
266, 296, 297, 266, 297, 267,
296, 326, 327, 296, 327, 297,
326, 356, 357, 326, 357, 327,
356, 386, 387, 356, 387, 357,
386, 416, 417, 386, 417, 387,
416, 446, 447, 416, 447, 417,
446, 476, 477, 446, 477, 447,
476, 506, 507, 476, 507, 477,
506, 536, 537, 506, 537, 507,
536, 566, 567, 536, 567, 537,
566, 596, 597, 566, 597, 567,
596, 626, 627, 596, 627, 597,
626, 656, 657, 626, 657, 627,
656, 686, 687, 656, 687, 657,
686, 716, 717, 686, 717, 687,
716, 746, 747, 716, 747, 717,
746, 776, 777, 746, 777, 747,
776, 806, 807, 776, 807, 777,
806, 836, 837, 806, 837, 807,
836, 866, 867, 836, 867, 837,
866, 896, 897, 866, 897, 867,
27, 57, 58, 27, 58, 28,
57, 87, 88, 57, 88, 58,
87, 117, 118, 87, 118, 88,
117, 147, 148, 117, 148, 118,
147, 177, 178, 147, 178, 148,
177, 207, 208, 177, 208, 178,
207, 237, 238, 207, 238, 208,
237, 267, 268, 237, 268, 238,
267, 297, 298, 267, 298, 268,
297, 327, 328, 297, 328, 298,
327, 357, 358, 327, 358, 328,
357, 387, 388, 357, 388, 358,
387, 417, 418, 387, 418, 388,
417, 447, 448, 417, 448, 418,
447, 477, 478, 447, 478, 448,
477, 507, 508, 477, 508, 478,
507, 537, 538, 507, 538, 508,
537, 567, 568, 537, 568, 538,
567, 597, 598, 567, 598, 568,
597, 627, 628, 597, 628, 598,
627, 657, 658, 627, 658, 628,
657, 687, 688, 657, 688, 658,
687, 717, 718, 687, 718, 688,
717, 747, 748, 717, 748, 718,
747, 777, 778, 747, 778, 748,
777, 807, 808, 777, 808, 778,
807, 837, 838, 807, 838, 808,
837, 867, 868, 837, 868, 838,
867, 897, 898, 867, 898, 868,
28, 58, 59, 28, 59, 29,
58, 88, 89, 58, 89, 59,
88, 118, 119, 88, 119, 89,
118, 148, 149, 118, 149, 119,
148, 178, 179, 148, 179, 149,
178, 208, 209, 178, 209, 179,
208, 238, 239, 208, 239, 209,
238, 268, 269, 238, 269, 239,
268, 298, 299, 268, 299, 269,
298, 328, 329, 298, 329, 299,
328, 358, 359, 328, 359, 329,
358, 388, 389, 358, 389, 359,
388, 418, 419, 388, 419, 389,
418, 448, 449, 418, 449, 419,
448, 478, 479, 448, 479, 449,
478, 508, 509, 478, 509, 479,
508, 538, 539, 508, 539, 509,
538, 568, 569, 538, 569, 539,
568, 598, 599, 568, 599, 569,
598, 628, 629, 598, 629, 599,
628, 658, 659, 628, 659, 629,
658, 688, 689, 658, 689, 659,
688, 718, 719, 688, 719, 689,
718, 748, 749, 718, 749, 719,
748, 778, 779, 748, 779, 749,
778, 808, 809, 778, 809, 779,
808, 838, 839, 808, 839, 809,
838, 868, 869, 838, 869, 839,
868, 898, 899, 868, 899, 869
]);
var buf49 = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, buf49);
gl.bufferData(gl.ARRAY_BUFFER, v, gl.STATIC_DRAW);
var ibuf49 = gl.createBuffer();
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, ibuf49);
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, f49, gl.DYNAMIC_DRAW);
var mvMatLoc49 = gl.getUniformLocation(prog49,"mvMatrix");
var prMatLoc49 = gl.getUniformLocation(prog49,"prMatrix");
var normMatLoc49 = gl.getUniformLocation(prog49,"normMatrix");
// ****** lines object 50 ******
var prog50 = gl.createProgram();
gl.attachShader(prog50, getShader( gl, "unnamed_chunk_2vshader50" ));
gl.attachShader(prog50, getShader( gl, "unnamed_chunk_2fshader50" ));
gl.linkProgram(prog50);
var v=new Float32Array([
0, 0, 0,
0, 0, 80
]);
var posLoc50 = gl.getAttribLocation(prog50, "aPos");
var colLoc50 = gl.getAttribLocation(prog50, "aCol");
var buf50 = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, buf50);
gl.bufferData(gl.ARRAY_BUFFER, v, gl.STATIC_DRAW);
var mvMatLoc50 = gl.getUniformLocation(prog50,"mvMatrix");
var prMatLoc50 = gl.getUniformLocation(prog50,"prMatrix");
// ****** points object 51 ******
var prog51 = gl.createProgram();
gl.attachShader(prog51, getShader( gl, "unnamed_chunk_2vshader51" ));
gl.attachShader(prog51, getShader( gl, "unnamed_chunk_2fshader51" ));
gl.linkProgram(prog51);
var v=new Float32Array([
0, 0, 0,
-1, 4, 0,
4, 9, 0,
6, 3, 0
]);
var posLoc51 = gl.getAttribLocation(prog51, "aPos");
var colLoc51 = gl.getAttribLocation(prog51, "aCol");
var buf51 = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, buf51);
gl.bufferData(gl.ARRAY_BUFFER, v, gl.STATIC_DRAW);
var mvMatLoc51 = gl.getUniformLocation(prog51,"mvMatrix");
var prMatLoc51 = gl.getUniformLocation(prog51,"prMatrix");
// ****** quads object 52 ******
var prog52 = gl.createProgram();
gl.attachShader(prog52, getShader( gl, "unnamed_chunk_2vshader52" ));
gl.attachShader(prog52, getShader( gl, "unnamed_chunk_2fshader52" ));
gl.linkProgram(prog52);
var v=new Float32Array([
0, 0, 0, 0, 0, -1,
-1, 4, 0, 0, 0, -1,
4, 9, 0, 0, 0, -1,
6, 3, 0, 0, 0, -1
]);
var posLoc52 = gl.getAttribLocation(prog52, "aPos");
var colLoc52 = gl.getAttribLocation(prog52, "aCol");
var normLoc52 = gl.getAttribLocation(prog52, "aNorm");
var f=new Uint16Array([
0, 1, 2, 0, 2, 3
]);
var buf52 = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, buf52);
gl.bufferData(gl.ARRAY_BUFFER, v, gl.STATIC_DRAW);
var ibuf52 = gl.createBuffer();
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, ibuf52);
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, f, gl.STATIC_DRAW);
var mvMatLoc52 = gl.getUniformLocation(prog52,"mvMatrix");
var prMatLoc52 = gl.getUniformLocation(prog52,"prMatrix");
var normMatLoc52 = gl.getUniformLocation(prog52,"normMatrix");
// ****** points object 53 ******
var prog53 = gl.createProgram();
gl.attachShader(prog53, getShader( gl, "unnamed_chunk_2vshader53" ));
gl.attachShader(prog53, getShader( gl, "unnamed_chunk_2fshader53" ));
gl.linkProgram(prog53);
var v=new Float32Array([
0, 0, 11,
-1, 4, 31,
4, 9, 81,
6, 3, 53
]);
var posLoc53 = gl.getAttribLocation(prog53, "aPos");
var colLoc53 = gl.getAttribLocation(prog53, "aCol");
var buf53 = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, buf53);
gl.bufferData(gl.ARRAY_BUFFER, v, gl.STATIC_DRAW);
var mvMatLoc53 = gl.getUniformLocation(prog53,"mvMatrix");
var prMatLoc53 = gl.getUniformLocation(prog53,"prMatrix");
// ****** lines object 54 ******
var prog54 = gl.createProgram();
gl.attachShader(prog54, getShader( gl, "unnamed_chunk_2vshader54" ));
gl.attachShader(prog54, getShader( gl, "unnamed_chunk_2fshader54" ));
gl.linkProgram(prog54);
var v=new Float32Array([
0, 0, 0,
0, 0, 11,
-1, 4, 0,
-1, 4, 31,
4, 9, 0,
4, 9, 81,
6, 3, 0,
6, 3, 53
]);
var posLoc54 = gl.getAttribLocation(prog54, "aPos");
var colLoc54 = gl.getAttribLocation(prog54, "aCol");
var buf54 = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, buf54);
gl.bufferData(gl.ARRAY_BUFFER, v, gl.STATIC_DRAW);
var mvMatLoc54 = gl.getUniformLocation(prog54,"mvMatrix");
var prMatLoc54 = gl.getUniformLocation(prog54,"prMatrix");
// ****** lines object 55 ******
var prog55 = gl.createProgram();
gl.attachShader(prog55, getShader( gl, "unnamed_chunk_2vshader55" ));
gl.attachShader(prog55, getShader( gl, "unnamed_chunk_2fshader55" ));
gl.linkProgram(prog55);
var v=new Float32Array([
0, 0, 11,
0, 0, 11,
-1, 4, 31,
0, 0, 31,
4, 9, 81,
0, 0, 81,
6, 3, 53,
0, 0, 53
]);
var posLoc55 = gl.getAttribLocation(prog55, "aPos");
var colLoc55 = gl.getAttribLocation(prog55, "aCol");
var buf55 = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, buf55);
gl.bufferData(gl.ARRAY_BUFFER, v, gl.STATIC_DRAW);
var mvMatLoc55 = gl.getUniformLocation(prog55,"mvMatrix");
var prMatLoc55 = gl.getUniformLocation(prog55,"prMatrix");
// ****** points object 56 ******
var prog56 = gl.createProgram();
gl.attachShader(prog56, getShader( gl, "unnamed_chunk_2vshader56" ));
gl.attachShader(prog56, getShader( gl, "unnamed_chunk_2fshader56" ));
gl.linkProgram(prog56);
var v=new Float32Array([
2.25, 4, 0,
2.25, 4, 44,
0, 0, 44
]);
var posLoc56 = gl.getAttribLocation(prog56, "aPos");
var colLoc56 = gl.getAttribLocation(prog56, "aCol");
var buf56 = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, buf56);
gl.bufferData(gl.ARRAY_BUFFER, v, gl.STATIC_DRAW);
var mvMatLoc56 = gl.getUniformLocation(prog56,"mvMatrix");
var prMatLoc56 = gl.getUniformLocation(prog56,"prMatrix");
// ****** linestrip object 57 ******
var prog57 = gl.createProgram();
gl.attachShader(prog57, getShader( gl, "unnamed_chunk_2vshader57" ));
gl.attachShader(prog57, getShader( gl, "unnamed_chunk_2fshader57" ));
gl.linkProgram(prog57);
var v=new Float32Array([
2.25, 4, 0,
2.25, 4, 44,
0, 0, 44
]);
var posLoc57 = gl.getAttribLocation(prog57, "aPos");
var colLoc57 = gl.getAttribLocation(prog57, "aCol");
var buf57 = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, buf57);
gl.bufferData(gl.ARRAY_BUFFER, v, gl.STATIC_DRAW);
var mvMatLoc57 = gl.getUniformLocation(prog57,"mvMatrix");
var prMatLoc57 = gl.getUniformLocation(prog57,"prMatrix");
gl.enable(gl.DEPTH_TEST);
gl.depthFunc(gl.LEQUAL);
gl.clearDepth(1.0);
gl.clearColor(1, 1, 1, 1);
var xOffs = yOffs = 0, drag = 0;
drawScene();
function drawScene(){
gl.depthMask(true);
gl.disable(gl.BLEND);
var radius = 66.36508;
var s = sin(fov*PI/360);
var t = tan(fov*PI/360);
var distance = radius/s;
var near = distance - radius;
var far = distance + radius;
var hlen = t*near;
var aspect = width/height;
prMatrix.makeIdentity();
if (aspect > 1)
prMatrix.frustum(-hlen*aspect*zoom, hlen*aspect*zoom,
-hlen*zoom, hlen*zoom, near, far);
else
prMatrix.frustum(-hlen*zoom, hlen*zoom,
-hlen*zoom/aspect, hlen*zoom/aspect,
near, far);
mvMatrix.makeIdentity();
mvMatrix.translate( -3, -4.5, -50 );
mvMatrix.scale( 6.703544, 5.362835, 0.2914584 );
mvMatrix.multRight( userMatrix );
mvMatrix.translate(0, 0, -distance);
normMatrix.makeIdentity();
normMatrix.scale( 0.1491748, 0.1864685, 3.431021 );
normMatrix.multRight( userMatrix );
var prmvMatrix = new CanvasMatrix4();
prmvMatrix.load(mvMatrix);
prmvMatrix.multRight( prMatrix );
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
// ****** lines object 45 *******
gl.useProgram(prog45);
gl.bindBuffer(gl.ARRAY_BUFFER, buf45);
gl.uniformMatrix4fv( prMatLoc45, false, new Float32Array(prMatrix.getAsArray()) );
gl.uniformMatrix4fv( mvMatLoc45, false, new Float32Array(mvMatrix.getAsArray()) );
gl.enableVertexAttribArray( posLoc45 );
gl.disableVertexAttribArray( colLoc45 );
gl.vertexAttrib4f( colLoc45, 0, 0, 0, 1 );
gl.lineWidth( 1 );
gl.vertexAttribPointer(posLoc45, 3, gl.FLOAT, false, 12, 0);
gl.drawArrays(gl.LINES, 0, 4);
// ****** text object 46 *******
gl.useProgram(prog46);
gl.bindBuffer(gl.ARRAY_BUFFER, buf46);
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, ibuf46);
gl.uniformMatrix4fv( prMatLoc46, false, new Float32Array(prMatrix.getAsArray()) );
gl.uniformMatrix4fv( mvMatLoc46, false, new Float32Array(mvMatrix.getAsArray()) );
gl.enableVertexAttribArray( posLoc46 );
gl.disableVertexAttribArray( colLoc46 );
gl.vertexAttrib4f( colLoc46, 0, 0, 0, 1 );
gl.enableVertexAttribArray( texLoc46 );
gl.vertexAttribPointer(texLoc46, 2, gl.FLOAT, false, 28, 12);
gl.activeTexture(gl.TEXTURE0);
gl.bindTexture(gl.TEXTURE_2D, texture46);
gl.uniform1i( sampler46, 0);
gl.enableVertexAttribArray( ofsLoc46 );
gl.vertexAttribPointer(ofsLoc46, 2, gl.FLOAT, false, 28, 20);
gl.vertexAttribPointer(posLoc46, 3, gl.FLOAT, false, 28, 0);
gl.drawElements(gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0);
// ****** text object 47 *******
gl.useProgram(prog47);
gl.bindBuffer(gl.ARRAY_BUFFER, buf47);
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, ibuf47);
gl.uniformMatrix4fv( prMatLoc47, false, new Float32Array(prMatrix.getAsArray()) );
gl.uniformMatrix4fv( mvMatLoc47, false, new Float32Array(mvMatrix.getAsArray()) );
gl.enableVertexAttribArray( posLoc47 );
gl.disableVertexAttribArray( colLoc47 );
gl.vertexAttrib4f( colLoc47, 0, 0, 0, 1 );
gl.enableVertexAttribArray( texLoc47 );
gl.vertexAttribPointer(texLoc47, 2, gl.FLOAT, false, 28, 12);
gl.activeTexture(gl.TEXTURE0);
gl.bindTexture(gl.TEXTURE_2D, texture47);
gl.uniform1i( sampler47, 0);
gl.enableVertexAttribArray( ofsLoc47 );
gl.vertexAttribPointer(ofsLoc47, 2, gl.FLOAT, false, 28, 20);
gl.vertexAttribPointer(posLoc47, 3, gl.FLOAT, false, 28, 0);
gl.drawElements(gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0);
// ****** text object 48 *******
gl.useProgram(prog48);
gl.bindBuffer(gl.ARRAY_BUFFER, buf48);
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, ibuf48);
gl.uniformMatrix4fv( prMatLoc48, false, new Float32Array(prMatrix.getAsArray()) );
gl.uniformMatrix4fv( mvMatLoc48, false, new Float32Array(mvMatrix.getAsArray()) );
gl.enableVertexAttribArray( posLoc48 );
gl.disableVertexAttribArray( colLoc48 );
gl.vertexAttrib4f( colLoc48, 0, 0, 0, 1 );
gl.enableVertexAttribArray( texLoc48 );
gl.vertexAttribPointer(texLoc48, 2, gl.FLOAT, false, 28, 12);
gl.activeTexture(gl.TEXTURE0);
gl.bindTexture(gl.TEXTURE_2D, texture48);
gl.uniform1i( sampler48, 0);
gl.enableVertexAttribArray( ofsLoc48 );
gl.vertexAttribPointer(ofsLoc48, 2, gl.FLOAT, false, 28, 20);
gl.vertexAttribPointer(posLoc48, 3, gl.FLOAT, false, 28, 0);
gl.drawElements(gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0);
// ****** lines object 50 *******
gl.useProgram(prog50);
gl.bindBuffer(gl.ARRAY_BUFFER, buf50);
gl.uniformMatrix4fv( prMatLoc50, false, new Float32Array(prMatrix.getAsArray()) );
gl.uniformMatrix4fv( mvMatLoc50, false, new Float32Array(mvMatrix.getAsArray()) );
gl.enableVertexAttribArray( posLoc50 );
gl.disableVertexAttribArray( colLoc50 );
gl.vertexAttrib4f( colLoc50, 0, 0, 0, 1 );
gl.lineWidth( 1 );
gl.vertexAttribPointer(posLoc50, 3, gl.FLOAT, false, 12, 0);
gl.drawArrays(gl.LINES, 0, 2);
// ****** points object 51 *******
gl.useProgram(prog51);
gl.bindBuffer(gl.ARRAY_BUFFER, buf51);
gl.uniformMatrix4fv( prMatLoc51, false, new Float32Array(prMatrix.getAsArray()) );
gl.uniformMatrix4fv( mvMatLoc51, false, new Float32Array(mvMatrix.getAsArray()) );
gl.enableVertexAttribArray( posLoc51 );
gl.disableVertexAttribArray( colLoc51 );
gl.vertexAttrib4f( colLoc51, 1, 0, 0, 1 );
gl.vertexAttribPointer(posLoc51, 3, gl.FLOAT, false, 12, 0);
gl.drawArrays(gl.POINTS, 0, 4);
// ****** quads object 52 *******
gl.useProgram(prog52);
gl.bindBuffer(gl.ARRAY_BUFFER, buf52);
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, ibuf52);
gl.uniformMatrix4fv( prMatLoc52, false, new Float32Array(prMatrix.getAsArray()) );
gl.uniformMatrix4fv( mvMatLoc52, false, new Float32Array(mvMatrix.getAsArray()) );
gl.uniformMatrix4fv( normMatLoc52, false, new Float32Array(normMatrix.getAsArray()) );
gl.enableVertexAttribArray( posLoc52 );
gl.disableVertexAttribArray( colLoc52 );
gl.vertexAttrib4f( colLoc52, 0, 1, 0, 1 );
gl.enableVertexAttribArray( normLoc52 );
gl.vertexAttribPointer(normLoc52, 3, gl.FLOAT, false, 24, 12);
gl.vertexAttribPointer(posLoc52, 3, gl.FLOAT, false, 24, 0);
gl.drawElements(gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0);
// ****** points object 53 *******
gl.useProgram(prog53);
gl.bindBuffer(gl.ARRAY_BUFFER, buf53);
gl.uniformMatrix4fv( prMatLoc53, false, new Float32Array(prMatrix.getAsArray()) );
gl.uniformMatrix4fv( mvMatLoc53, false, new Float32Array(mvMatrix.getAsArray()) );
gl.enableVertexAttribArray( posLoc53 );
gl.disableVertexAttribArray( colLoc53 );
gl.vertexAttrib4f( colLoc53, 1, 0, 0, 1 );
gl.vertexAttribPointer(posLoc53, 3, gl.FLOAT, false, 12, 0);
gl.drawArrays(gl.POINTS, 0, 4);
// ****** lines object 54 *******
gl.useProgram(prog54);
gl.bindBuffer(gl.ARRAY_BUFFER, buf54);
gl.uniformMatrix4fv( prMatLoc54, false, new Float32Array(prMatrix.getAsArray()) );
gl.uniformMatrix4fv( mvMatLoc54, false, new Float32Array(mvMatrix.getAsArray()) );
gl.enableVertexAttribArray( posLoc54 );
gl.disableVertexAttribArray( colLoc54 );
gl.vertexAttrib4f( colLoc54, 1, 0, 0, 1 );
gl.lineWidth( 1 );
gl.vertexAttribPointer(posLoc54, 3, gl.FLOAT, false, 12, 0);
gl.drawArrays(gl.LINES, 0, 8);
// ****** lines object 55 *******
gl.useProgram(prog55);
gl.bindBuffer(gl.ARRAY_BUFFER, buf55);
gl.uniformMatrix4fv( prMatLoc55, false, new Float32Array(prMatrix.getAsArray()) );
gl.uniformMatrix4fv( mvMatLoc55, false, new Float32Array(mvMatrix.getAsArray()) );
gl.enableVertexAttribArray( posLoc55 );
gl.disableVertexAttribArray( colLoc55 );
gl.vertexAttrib4f( colLoc55, 1, 0, 0, 1 );
gl.lineWidth( 1 );
gl.vertexAttribPointer(posLoc55, 3, gl.FLOAT, false, 12, 0);
gl.drawArrays(gl.LINES, 0, 8);
// ****** points object 56 *******
gl.useProgram(prog56);
gl.bindBuffer(gl.ARRAY_BUFFER, buf56);
gl.uniformMatrix4fv( prMatLoc56, false, new Float32Array(prMatrix.getAsArray()) );
gl.uniformMatrix4fv( mvMatLoc56, false, new Float32Array(mvMatrix.getAsArray()) );
gl.enableVertexAttribArray( posLoc56 );
gl.disableVertexAttribArray( colLoc56 );
gl.vertexAttrib4f( colLoc56, 0, 1, 0, 1 );
gl.vertexAttribPointer(posLoc56, 3, gl.FLOAT, false, 12, 0);
gl.drawArrays(gl.POINTS, 0, 3);
// ****** linestrip object 57 *******
gl.useProgram(prog57);
gl.bindBuffer(gl.ARRAY_BUFFER, buf57);
gl.uniformMatrix4fv( prMatLoc57, false, new Float32Array(prMatrix.getAsArray()) );
gl.uniformMatrix4fv( mvMatLoc57, false, new Float32Array(mvMatrix.getAsArray()) );
gl.enableVertexAttribArray( posLoc57 );
gl.disableVertexAttribArray( colLoc57 );
gl.vertexAttrib4f( colLoc57, 0, 1, 0, 1 );
gl.lineWidth( 1 );
gl.vertexAttribPointer(posLoc57, 3, gl.FLOAT, false, 12, 0);
gl.drawArrays(gl.LINE_STRIP, 0, 3);
// ***** Transparent objects next ****
gl.depthMask(false);
gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA,
gl.ONE, gl.ONE);
gl.enable(gl.BLEND);
// ****** surface object 49 *******
gl.useProgram(prog49);
gl.bindBuffer(gl.ARRAY_BUFFER, buf49);
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, ibuf49);
gl.uniformMatrix4fv( prMatLoc49, false, new Float32Array(prMatrix.getAsArray()) );
gl.uniformMatrix4fv( mvMatLoc49, false, new Float32Array(mvMatrix.getAsArray()) );
gl.uniformMatrix4fv( normMatLoc49, false, new Float32Array(normMatrix.getAsArray()) );
gl.enableVertexAttribArray( posLoc49 );
var depths = new Float32Array(841);
var faces = new Array(841);
for(var i=0; i<841; i++) {
var z = prmvMatrix.m13*centers49[3*i]
+ prmvMatrix.m23*centers49[3*i+1]
+ prmvMatrix.m33*centers49[3*i+2]
+ prmvMatrix.m43;
var w = prmvMatrix.m14*centers49[3*i]
+ prmvMatrix.m24*centers49[3*i+1]
+ prmvMatrix.m34*centers49[3*i+2]
+ prmvMatrix.m44;
depths[i] = z/w;
faces[i] = i;
}
var depthsort = function(i,j) { return depths[j] - depths[i] }
faces.sort(depthsort);
var f = new Uint16Array(f49.length);
for (var i=0; i<841; i++) {
for (var j=0; j<6; j++) {
f[6*i + j] = f49[6*faces[i] + j];
}
}
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, f, gl.DYNAMIC_DRAW);
gl.disableVertexAttribArray( colLoc49 );
gl.vertexAttrib4f( colLoc49, 0.6784314, 0.8470588, 0.9019608, 0.4980392 );
gl.enableVertexAttribArray( normLoc49 );
gl.vertexAttribPointer(normLoc49, 3, gl.FLOAT, false, 24, 12);
gl.vertexAttribPointer(posLoc49, 3, gl.FLOAT, false, 24, 0);
gl.drawElements(gl.TRIANGLES, 5046, gl.UNSIGNED_SHORT, 0);
gl.flush ();
}
var vlen = function(v) {
return sqrt(v[0]*v[0] + v[1]*v[1] + v[2]*v[2])
}
var xprod = function(a, b) {
return [a[1]*b[2] - a[2]*b[1],
a[2]*b[0] - a[0]*b[2],
a[0]*b[1] - a[1]*b[0]];
}
var screenToVector = function(x, y) {
var radius = max(width, height)/2.0;
var cx = width/2.0;
var cy = height/2.0;
var px = (x-cx)/radius;
var py = (y-cy)/radius;
var plen = sqrt(px*px+py*py);
if (plen > 1.e-6) {
px = px/plen;
py = py/plen;
}
var angle = (SQRT2 - plen)/SQRT2*PI/2;
var z = sin(angle);
var zlen = sqrt(1.0 - z*z);
px = px * zlen;
py = py * zlen;
return [px, py, z];
}
var rotBase;
var trackballdown = function(x,y) {
rotBase = screenToVector(x, y);
saveMat.load(userMatrix);
}
var trackballmove = function(x,y) {
var rotCurrent = screenToVector(x,y);
var dot = rotBase[0]*rotCurrent[0] +
rotBase[1]*rotCurrent[1] +
rotBase[2]*rotCurrent[2];
var angle = acos( dot/vlen(rotBase)/vlen(rotCurrent) )*180./PI;
var axis = xprod(rotBase, rotCurrent);
userMatrix.load(saveMat);
userMatrix.rotate(angle, axis[0], axis[1], axis[2]);
drawScene();
}
var y0zoom = 0;
var zoom0 = 1;
var zoomdown = function(x, y) {
y0zoom = y;
zoom0 = log(zoom);
}
var zoommove = function(x, y) {
zoom = exp(zoom0 + (y-y0zoom)/height);
drawScene();
}
var y0fov = 0;
var fov0 = 1;
var fovdown = function(x, y) {
y0fov = y;
fov0 = fov;
}
var fovmove = function(x, y) {
fov = max(1, min(179, fov0 + 180*(y-y0fov)/height));
drawScene();
}
var mousedown = [trackballdown, zoomdown, fovdown];
var mousemove = [trackballmove, zoommove, fovmove];
function relMouseCoords(event){
var totalOffsetX = 0;
var totalOffsetY = 0;
var currentElement = canvas;
do{
totalOffsetX += currentElement.offsetLeft;
totalOffsetY += currentElement.offsetTop;
}
while(currentElement = currentElement.offsetParent)
var canvasX = event.pageX - totalOffsetX;
var canvasY = event.pageY - totalOffsetY;
return {x:canvasX, y:canvasY}
}
canvas.onmousedown = function ( ev ){
if (!ev.which) // Use w3c defns in preference to MS
switch (ev.button) {
case 0: ev.which = 1; break;
case 1:
case 4: ev.which = 2; break;
case 2: ev.which = 3;
}
drag = ev.which;
var f = mousedown[drag-1];
if (f) {
var coords = relMouseCoords(ev);
f(coords.x, height-coords.y);
ev.preventDefault();
}
}
canvas.onmouseup = function ( ev ){
drag = 0;
}
canvas.onmouseout = canvas.onmouseup;
canvas.onmousemove = function ( ev ){
if ( drag == 0 ) return;
var f = mousemove[drag-1];
if (f) {
var coords = relMouseCoords(ev);
f(coords.x, height-coords.y);
}
}
var wheelHandler = function(ev) {
var del = 1.1;
if (ev.shiftKey) del = 1.01;
var ds = ((ev.detail || ev.wheelDelta) > 0) ? del : (1 / del);
zoom *= ds;
drawScene();
ev.preventDefault();
};
canvas.addEventListener("DOMMouseScroll", wheelHandler, false);
canvas.addEventListener("mousewheel", wheelHandler, false);
}
</script>
<p><canvas id="unnamed_chunk_2canvas" width="1" height="1"></canvas> </p>
<p id="unnamed_chunk_2debug">
<img src="data:image/png;base64,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" alt="unnamed_chunk_2snapshot" width=505/><br>
You must enable Javascript to view this page properly.</p>
<script>unnamed_chunk_2webGLStart();</script>
<p>Consequently, among the four values \(\ell(a)\), \(\ell(b)\), \(\ell&copy;\), \(\ell(d)\) of \(\ell\) at the vertices, there is at least one lower than \(\ell(x)\) and at least one higher than \(\ell(x)\). </p>
<h3>Getting the \(V\)-representation of \({\cal J}(\mu, \nu)\) and the Kantorovich distance with R</h3>
<p>The <a href="http://cran.r-project.org/web/packages/rcdd/vignettes/vinny.pdf">rccd package</a> for R provides an R interface to the cddlib library.
Its main function <code>scdd()</code> performs the conversion between <em>\(H\)-representation</em> and <em>\(V\)-representation</em> of a convex polyhedron, which is given by the
set of vertices of the convex polyhedron.
The set of vertices provide a representation of a polyhedron because
each point in the polyhedron is a barycenter of the vertices;
we say that the convex polyhedra is the convex hull of its extreme points. </p>
<p>Let us use <code>scdd()</code> to get the vertices of \({\cal J}(\mu, \nu)\).
We consider the following example:</p>
<pre><code class="r">mu &lt;- c(1/7, 2/7, 4/7)
nu &lt;- c(1/4, 1/4, 1/2)
</code></pre>
<p>We firstly define its \(H\)-representation in a R object with the
<code>makeH()</code> function, whose help page begins as follows:</p>
<pre><code class="r">library(rcdd)
help(makeH)
</code></pre>
<p><img src="data:image/png;base64,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" alt=""/></p>
<p>The matrix <code>a1</code> and the vector <code>b1</code> specify the linear equality constraints. Our linear inequality constraints \({\rm 2)}\) are defined in this way in R as follows:</p>
<pre><code class="r">m &lt;- length(mu)
n &lt;- length(nu)
a1 &lt;- -diag(m * n)
b1 &lt;- rep(0, m * n)
</code></pre>
<p>The matrix <code>a2</code> and the vector <code>b2</code> specify the linear equality constraints.
We simply construct <code>b2</code> by concatenating \(\mu\) and \(\nu\):</p>
<pre><code class="r">b2 &lt;- c(mu, nu)
</code></pre>
<p>The matrix <code>a2</code>
is obtained by stacking the two matrices \(M_1\) and \(M_2\) defined above.
We construct it as follows in R:</p>
<pre><code class="r">M1 &lt;- t(model.matrix(~0 + gl(m, n)))[, ]
M2 &lt;- t(model.matrix(~0 + factor(rep(1:n, m))))[, ]
a2 &lt;- rbind(M1, M2)
</code></pre>
<p>Then we can get the vertices of \({\cal J}(\mu, \nu)\) in a list as follows:</p>
<pre><code class="r">H &lt;- makeH(a1, b1, a2, b2) # H-representation
V &lt;- scdd(H)$output[, -c(1, 2)] # V-representation (vertices), but not convenient
V &lt;- lapply(1:nrow(V), function(i) matrix(V[i, ], ncol = n, byrow = TRUE))
</code></pre>
<p>The command lines below show that there are 15 vertices (extreme joinings) and display the first five of them:</p>
<pre><code class="r">length(V)
</code></pre>
<pre><code>## [1] 15
</code></pre>
<pre><code class="r">head(V, 5)
</code></pre>
<pre><code>## [[1]]
## [,1] [,2] [,3]
## [1,] 0.1429 0.00 0.0000
## [2,] 0.0000 0.00 0.2857
## [3,] 0.1071 0.25 0.2143
##
## [[2]]
## [,1] [,2] [,3]
## [1,] 0.1429 0.00 0.0000
## [2,] 0.1071 0.00 0.1786
## [3,] 0.0000 0.25 0.3214
##
## [[3]]
## [,1] [,2] [,3]
## [1,] 0.1429 0.00000 0.0
## [2,] 0.1071 0.17857 0.0
## [3,] 0.0000 0.07143 0.5
##
## [[4]]
## [,1] [,2] [,3]
## [1,] 0.1429 0.00 0.00000
## [2,] 0.0000 0.25 0.03571
## [3,] 0.1071 0.00 0.46429
##
## [[5]]
## [,1] [,2] [,3]
## [1,] 0.14286 0.00 0.0
## [2,] 0.03571 0.25 0.0
## [3,] 0.07143 0.00 0.5
</code></pre>
<p>Now, to get the Kantorovich distance, it suffices to evaluate
\(\mathbb{E}[d(X,Y)]\) for all extreme joinings, and to take the lower value.
Consider for instance the discrete distance \(d\). Set it as a matrix in R:</p>
<pre><code class="r">(D &lt;- 1 - diag(3))
</code></pre>
<pre><code>## [,1] [,2] [,3]
## [1,] 0 1 1
## [2,] 1 0 1
## [3,] 1 1 0
</code></pre>
<pre><code class="r">sapply(V, function(P) {
sum(D * P)
})
</code></pre>
<pre><code>## [1] 0.6429 0.5357 0.1786 0.1429 0.1071 0.7857 0.5357 0.4643 0.5714 0.3929
## [11] 0.3929 0.4286 0.9286 0.6071 0.6786
</code></pre>
<p>Then call <code>min()</code> to get the Kantorovich distance \(d(\mu,\nu)\)</p>
<h2>Use exact arithmetic !</h2>
<p>Are you satisfied ? I&#39;m not: my probability measures \(\mu\) and \(\nu\) have rational weights, and then the coordinates of the vertices should be rational too. </p>
<p>How to get the vertices in exact rational arithmetic ? Remember <a href="http://stla.overblog.com/the-binary-splitting-with-the-r-gmp-package-application-to-gauss-hypergeometric-function">my article about the Gauss hypergeometric function</a>.
Let&#39;s load the <code>gmp</code> package:</p>
<pre><code class="r">library(gmp)
</code></pre>
<p>Actually this is the point suggested by the message appearing when loading <code>rcdd</code>:</p>
<pre><code class="r">library(rcdd)
If you want correct answers, use rational arithmetic.
See the Warnings sections added to help pages for
functions that do computational geometry.
</code></pre>
<p>There&#39;s almost nothing to change to our previous code: everything is done in <code>rcdd</code> to handle rational arithmetic. You just have to set the input parameters as <code>bigq</code> numbers. Firstly define \(\mu\) and \(\nu\) as &ldquo;<code>bigq</code>&rdquo; objects:</p>
<pre><code class="r">(mu &lt;- as.bigq(c(1, 2, 4), 7))
</code></pre>
<pre><code>## Big Rational (&#39;bigq&#39;) object of length 3:
## [1] 1/7 2/7 4/7
</code></pre>
<pre><code class="r">(nu &lt;- as.bigq(c(1, 1, 1), c(4, 4, 2)))
</code></pre>
<pre><code>## Big Rational (&#39;bigq&#39;) object of length 3:
## [1] 1/4 1/4 1/2
</code></pre>
<p>Then define <code>b2</code> as before:</p>
<pre><code class="r">b2 &lt;- c(mu, nu)
</code></pre>
<p>The other input parameters <code>a1</code>, <code>b1</code>, <code>a2</code> contain integers only, it is more straightforward to convert them. Actually these parameters must be in character mode to input them in the <code>makeH()</code> function, then we convert them as follows:</p>
<pre><code class="r">asab &lt;- function(x) as.character(as.bigq(x))
a1 &lt;- asab(a1)
b1 &lt;- asab(b1)
a2 &lt;- asab(a2)
b2 &lt;- asab(b2)
</code></pre>
<p>And now we run exactly the same code as before:</p>
<pre><code class="r">H &lt;- makeH(a1, b1, a2, b2) # H-representation
V &lt;- scdd(H)$output[, -c(1, 2)] # V-representation (vertices), but not convenient
V &lt;- lapply(1:nrow(V), function(i) matrix(V[i, ], ncol = n, byrow = TRUE))
head(V, 5)
</code></pre>
<pre><code>## [[1]]
## [,1] [,2] [,3]
## [1,] &quot;1/7&quot; &quot;0&quot; &quot;0&quot;
## [2,] &quot;0&quot; &quot;0&quot; &quot;2/7&quot;
## [3,] &quot;3/28&quot; &quot;1/4&quot; &quot;3/14&quot;
##
## [[2]]
## [,1] [,2] [,3]
## [1,] &quot;1/7&quot; &quot;0&quot; &quot;0&quot;
## [2,] &quot;3/28&quot; &quot;0&quot; &quot;5/28&quot;
## [3,] &quot;0&quot; &quot;1/4&quot; &quot;9/28&quot;
##
## [[3]]
## [,1] [,2] [,3]
## [1,] &quot;1/7&quot; &quot;0&quot; &quot;0&quot;
## [2,] &quot;3/28&quot; &quot;5/28&quot; &quot;0&quot;
## [3,] &quot;0&quot; &quot;1/14&quot; &quot;1/2&quot;
##
## [[4]]
## [,1] [,2] [,3]
## [1,] &quot;1/7&quot; &quot;0&quot; &quot;0&quot;
## [2,] &quot;0&quot; &quot;1/4&quot; &quot;1/28&quot;
## [3,] &quot;3/28&quot; &quot;0&quot; &quot;13/28&quot;
##
## [[5]]
## [,1] [,2] [,3]
## [1,] &quot;1/7&quot; &quot;0&quot; &quot;0&quot;
## [2,] &quot;1/28&quot; &quot;1/4&quot; &quot;0&quot;
## [3,] &quot;1/14&quot; &quot;0&quot; &quot;1/2&quot;
</code></pre>
<p>There&#39;s a slight problem when applying the <code>sapply()</code> function to a list of <code>bigq</code> objects.
You can use the <code>lapply()</code> function which works well but returns a list:</p>
<pre><code class="r">D &lt;- as.bigq(D)
lapply(V, function(P) {
sum(D * P)
})
</code></pre>
<pre><code>## [[1]]
## Big Rational (&#39;bigq&#39;) :
## [1] 9/14
##
## [[2]]
## Big Rational (&#39;bigq&#39;) :
## [1] 15/28
##
## [[3]]
## Big Rational (&#39;bigq&#39;) :
## [1] 5/28
##
## [[4]]
## Big Rational (&#39;bigq&#39;) :
## [1] 1/7
##
## [[5]]
## Big Rational (&#39;bigq&#39;) :
## [1] 3/28
##
## [[6]]
## Big Rational (&#39;bigq&#39;) :
## [1] 11/14
##
## [[7]]
## Big Rational (&#39;bigq&#39;) :
## [1] 15/28
##
## [[8]]
## Big Rational (&#39;bigq&#39;) :
## [1] 13/28
##
## [[9]]
## Big Rational (&#39;bigq&#39;) :
## [1] 4/7
##
## [[10]]
## Big Rational (&#39;bigq&#39;) :
## [1] 11/28
##
## [[11]]
## Big Rational (&#39;bigq&#39;) :
## [1] 11/28
##
## [[12]]
## Big Rational (&#39;bigq&#39;) :
## [1] 3/7
##
## [[13]]
## Big Rational (&#39;bigq&#39;) :
## [1] 13/14
##
## [[14]]
## Big Rational (&#39;bigq&#39;) :
## [1] 17/28
##
## [[15]]
## Big Rational (&#39;bigq&#39;) :
## [1] 19/28
</code></pre>
<p>We can&#39;t convert this list to a <code>bigq</code> vector with the <code>unlist()</code> function:
this does not work, and this is why <code>sapply()</code> does not work too. </p>
<p>To get a vector, use a loop:</p>
<pre><code class="r">distances &lt;- as.bigq(rep(NA, length(V)))
for (i in 1:length(V)) {
distances[i] &lt;- sum(D * V[[i]])
}
distances
</code></pre>
<pre><code>## Big Rational (&#39;bigq&#39;) 15 x 1 matrix:
## [,1]
## [1,] 9/14
## [2,] 15/28
## [3,] 5/28
## [4,] 1/7
## [5,] 3/28
## [6,] 11/14
## [7,] 15/28
## [8,] 13/28
## [9,] 4/7
## [10,] 11/28
## [11,] 11/28
## [12,] 3/7
## [13,] 13/14
## [14,] 17/28
## [15,] 19/28
</code></pre>
<p>The column structure of <code>distances</code> is unexpected. To get a usual vector, type:</p>
<pre><code class="r">attr(distances, &quot;nrow&quot;) &lt;- NULL
distances
</code></pre>
<pre><code>## Big Rational (&#39;bigq&#39;) object of length 15:
## [1] 9/14 15/28 5/28 1/7 3/28 11/14 15/28 13/28 4/7 11/28 11/28
## [12] 3/7 13/14 17/28 19/28
</code></pre>
<p>The <code>min()</code> function directly works with <code>bigq</code> objects:</p>
<pre><code class="r">(Kantorovich &lt;- min(distances))
</code></pre>
<pre><code>## Big Rational (&#39;bigq&#39;) :
## [1] 3/28
</code></pre>
<p>To get the numeric evaluation, use:</p>
<pre><code class="r">asNumeric(Kantorovich)
</code></pre>
<pre><code>## [1] 0.1071
</code></pre>
<p>That&#39;s all.</p>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment