From 0c09a00a0b298cbd3bbd0082cc1026e22db9b1c5 Mon Sep 17 00:00:00 2001 From: Sébastien Dailly Date: Sun, 3 Jan 2021 20:10:08 +0100 Subject: New article, and blog application --- content/Informatique/2021-01-03-calligraphie.rst | 106 + content/pages/script.it/script.js | 3286 ++++++++++++++++++++ content/pages/script.it/script.rst | 26 + content/pages/script.it/worker.js | 2351 ++++++++++++++ pelicanconf.py | 17 +- plugins/render_math/Readme.md | 167 + plugins/render_math/__init__.py | 1 + plugins/render_math/math.py | 367 +++ plugins/render_math/mathjax_script_template | 61 + .../pelican_mathjax_markdown_extension.py | 158 + plugins/render_math/requirements.txt | 1 + plugins/render_math/test_data/article.ipynb | 42 + plugins/render_math/test_data/article.nbdata | 5 + .../test_data/article_with_math_formulas.rst | 20 + plugins/render_math/test_render_math.py | 56 + 15 files changed, 6655 insertions(+), 9 deletions(-) create mode 100755 content/Informatique/2021-01-03-calligraphie.rst create mode 100755 content/pages/script.it/script.js create mode 100755 content/pages/script.it/script.rst create mode 100755 content/pages/script.it/worker.js create mode 100755 plugins/render_math/Readme.md create mode 100755 plugins/render_math/__init__.py create mode 100755 plugins/render_math/math.py create mode 100755 plugins/render_math/mathjax_script_template create mode 100755 plugins/render_math/pelican_mathjax_markdown_extension.py create mode 100755 plugins/render_math/requirements.txt create mode 100755 plugins/render_math/test_data/article.ipynb create mode 100755 plugins/render_math/test_data/article.nbdata create mode 100755 plugins/render_math/test_data/article_with_math_formulas.rst create mode 100755 plugins/render_math/test_render_math.py diff --git a/content/Informatique/2021-01-03-calligraphie.rst b/content/Informatique/2021-01-03-calligraphie.rst new file mode 100755 index 0000000..3fd6e30 --- /dev/null +++ b/content/Informatique/2021-01-03-calligraphie.rst @@ -0,0 +1,106 @@ +.. -*- mode: rst -*- +.. -*- coding: utf-8 -*- + +================================ +De la calligraphie en javascript +================================ + +:date: 2021-01-03 +:tags: javascript +:summary: |summary| + +.. default-role:: literal + +.. |summary| replace:: + + Un petit bilan après avoir réalisé une application de calligraphie sur le + blog :) + +À la suite de mon article précédent, j'ai essayé d'aller un peu plus loin dans +ce qu'il était possible de faire en javascript. La page pour construire les +graphes montrait déjà qu'il était possible de charger du javascript dans la +page, et modifier directement le contenu du blog à partir du code exécuté. + +En suivant toujours la même démarche (code en OCaml, compilé en javascript), +j'ai mis en place une *ardoise* dans laquelle je souhaitais retrouver sur PC le +rendu que l'on peut avoir avec une plume dans la main : `l'ardoise calligraphique`_. + +.. _l'ardoise calligraphique: {filename}/pages/script.it/script.rst#ardoise-calligraphique + +Ce que j'ai appris +================== + +Les courbes de beziers ! Je ne pensais pas qu'il y aurait autant à faire avec ! +Pour ceux que cela intéresse, la page `A Primer on Bézier Curves`_ est une +référence avec tout ce qu'il faut pour mettre en place ses propres librairies. + +.. _A Primer on Bézier Curves: https://pomax.github.io/bezierinfo/ + +Afin d'avoir un tracé souple de la courbe, j'ai suivi un document de l'UCLA_ +qui explique comment construire les courbes de beziers en suivant une série de +points, ce qui m'a fait faire un détour par les produits matriciels pour +résoudre ce genre d'équations : + +.. _ucla: https://www.math.ucla.edu/~baker/149.1.02w/handouts/dd_splines.pdf + +.. math:: + + \begin{bmatrix}4 && 1 && 0 && 0 \\\\ 1 && 4 && 1 && 0 \\\\0 && 1 && 4 && 1 \\\\0 && 0 && 1 && 4 \end{bmatrix} + \begin{bmatrix} B_1 \\\\ B_2 \\\\ B_3 \\\\ B_4 \end{bmatrix} + = + \begin{bmatrix} (6 S_1 - S_0) \\\\ 6S_2 \\\\ 6 S_3 \\\\ (6S_4 - S_5) \end{bmatrix} + +A priori, il n'existe pas de librairie pour faire de la réduction de matrice en +javascript, mais l'avantage d'utiliser OCaml est d'avoir sous la main `quelques +librairies`_ permettant de faire le boulot directement. + +.. _quelques librairies: https://github.com/kandluis/ocaml-matrix + +Ensuite, travailler le DOM. Vu que le site est statique, j'ai choisi de +modifier la page directement à partir du code javascript. En ajoutant un +élément, en retirant ceux dont je n'avais nécessité, cela permet de changer +l'apparence directement pour se construire son application. Cela m'a permis de +me plonger dans la librairie `brr`_ qui permet d'interagir avec la page via +des évènements fonctionnels. + +.. _brr: https://erratique.ch/software/brr + +Enfin, les webWorkers_, qui sont des threads pouvant être lancés dans le code +javascript. Dans l'application, je les utilise pour *lisser* la courbe une fois +que celle-ci a été construite une première fois. + +.. _webworkers: https://developer.mozilla.org/fr/docs/Web/API/Web_Workers_API/Utilisation_des_web_workers + +Ce qu'il faudrait continuer +=========================== + +Il me manque tout un cadre mathématique pour aller plus loin, j'aurai par +exemple besoin de déterminer l'extrémité_ exacte de la courbe afin de traiter +ces cas de manière précise, et j'ai besoin de comprendre le code avant de m'y +mettre… + +.. _extrémité: https://pomax.github.io/bezierinfo/#extremities + +Par conséquent, l'export SVG est un peu biaisé, on retrouve bien ce qui est +affiché sur l'écran, mais cela donne quelque chose qui n'est pas vraiment +éditable comme je l'aurai souhaité. + +Il faudrait aussi aller plus loin dans les mouvements de plumes, permettre des +rotations locales, juste sur un segment et non pas sur la totalité du tracé, +enfin des petits ajustements pour qu'il y ait vraiment une plus-value. + +D'autres pistes +=============== + +Cela m'a aussi donné d'autres pistes pour continuer avec javascript et le blog. +En utilisant l'API `Web Storage`_, on peut également stocker des données comme +si l'on travaillait sur un fichier, les données étant stockées dans l'espace du +navigateur. En combinant cela avec le côté statique du site, je pense à une +page de prise de note, qui dont le code serait uniquement exécuté dans le +navigateur, sans avoir besoin de serveur comme support. + +.. _web storage: https://developer.mozilla.org/fr/docs/Web/API/Web_Storage_API + +Le blog offrant un espace dans lequel je peux mettre en ligne mes applications, +cela me donne envie de continuer et m'en servir comme petit terrain +d'exipérimentation… diff --git a/content/pages/script.it/script.js b/content/pages/script.it/script.js new file mode 100755 index 0000000..337c80c --- /dev/null +++ b/content/pages/script.it/script.js @@ -0,0 +1,3286 @@ +// Generated by js_of_ocaml 3.8.0 +(function(h){"use strict";var +fV="%Li",gC=" : flags Open_text and Open_binary are not compatible",gj="#81a1c1",gv="Invalid_argument",gJ=",",dE=0.5,dw=1255,f_=255,gI=0x800,ao=0xffff,f9="range",dv="jsError",an=0x8000,gu="%ni",fU="input",gi=12520,bO=256,g3=-646333223,f8=180.,f6="unsupported bigarray kind",f7="End_of_file",gB="Unix.Unix_error",f5="Failure",gS="infinity",aA=0xff,bK=1000,gh="Row out of bounds.",f="",gA="Stack_overflow",dA="^",g2=122,gt=224465929,gH=-577755674,dz="fill",gs="height",T="0",bl=0x3f,gz=-97,gy="Not_found",dF=0xf,dM=0.66666666666666663,bP=128,f3=-48,f4=0xdc00,gq="Sys_blocked_io",gr="p",g1="fd ",bN=781515427,gg="Match_failure",v=248,g0=0.017453292519943295,gp=3954798,fT="static/",f2="bigarray kind can't be represented by a Gg.Ba.scalar_type",A="camlinternalFormat.ml",gG="Division_by_zero",dH="src/note.ml",gZ=">",dG=252,gY=1027,dy=848053268,gx=1000.,dt="stroke",f1="Sys_error",aY=".",bk="+",gR=0xf0,gQ=0.3,dC=246,gn="Column out of bounds.",go="%u",gP="width",gF="%d",gf="%li",gw=1026,aW="shapes/matrix/Matrix.ml",gO="max",gE="buffer.ml",cg="int_of_string",gX="_bigarray",ge=-641915856,dB=127,bM=1024,gN=-32,ac=" ",ad=0x80,gW="1",dL="e",fS="Undefined_recursive_module",fZ=120,f0=103,gl=-611587032,gm=" : flags Open_rdonly and Open_wronly are not compatible",dK="d",gV="([^/]*)",du=512,aX="-",dx="nan",fY=0x7ff0,gM="100%",gd="#2e3440",gL="value",gc=0xe0,gk=" : file already exists",gD="min",cj="#eceff4",gb=906998707,cf="Set.bal",ga=0xdfff,bL=-280577236,az=0xffffff,ay="/",dD="compare: functional value",gK="Assert_failure",fX="0x",fR="%i",fW=527250507,gU="Out_of_memory",f$=1073741823,I=254,gT="fas",dJ="index out of bounds",ci=100,ch=250,dI="_bigarr02";function +ht(b,a){throw[0,b,a]}var +u=[0];function +nt(b,c){function +f(a){ht(u.Undefined_recursive_module,b)}function +e(b,c,a){if(typeof +b==="number")switch(b){case +0:c[a]={fun:f};break;case +1:c[a]=[dC,f];break;default:c[a]=[]}else +switch(b[0]){case +0:c[a]=[0];for(var +d=1;d>=1;if(b==0)return d;a+=a;c++;if(c==9)a.slice(0,1)}}function +cr(c,b,a){var +d=String.fromCharCode;if(b==0&&a<=4096&&a==c.length)return d.apply(null,c);var +e=f;for(;0dB)return false;return true}else +return!/[^\x00-\x7f]/.test(a)}function +d1(e){for(var +k=f,c=f,h,g,i,a,b=0,j=e.length;bdu){c.substr(0,1);k+=c;c=f;k+=e.slice(b,d)}else +c+=e.slice(b,d);if(d==j)break;b=d}a=1;if(++b=0xd7ff&&a<0xe000)a=2}else{a=3;if(++b0x10ffff)a=3}}}}}if(a<4){b-=a;c+="\ufffd"}else +if(a>ao)c+=String.fromCharCode(0xd7c0+(a>>10),f4+(a&0x3FF));else +c+=String.fromCharCode(a);if(c.length>bM){c.substr(0,1);k+=c;c=f}}return k+c}function +aB(c,a,b){this.t=c;this.c=a;this.l=b}aB.prototype.toString=function(){switch(this.t){case +9:return this.c;default:aO(this);case +0:if(hy(this.c)){this.t=9;return this.c}this.t=8;case +8:return this.c}};aB.prototype.toUtf16=function(){var +a=this.toString();if(this.t==9)return a;return d1(a)};aB.prototype.slice=function(){var +a=this.t==4?this.c.slice():this.c;return new +aB(this.t,a,this.l)};function +hd(a){return new +aB(0,a,a.length)}function +b(a){return hd(a)}function +dZ(c,a){ht(c,b(a))}function +C(a){dZ(u.Invalid_argument,a)}function +bn(){C(dJ)}function +g6(b,a){if(a<0||a>=b.length-1)bn();return b[a+1]}function +ck(b){if(h.Uint8Array)var +c=new(h.Uint8Array)(b.l);else +var +c=new +Array(b.l);var +e=b.c,d=e.length,a=0;for(;a=b.l||b.t==2&&c>=b.c.length)){b.c=d.t==4?cr(d.c,e,c):e==0&&d.c.length==c?d.c:d.c.substr(e,c);b.t=b.c.length==b.l?0:2}else +if(b.t==2&&f==b.c.length){b.c+=d.t==4?cr(d.c,e,c):e==0&&d.c.length==c?d.c:d.c.substr(e,c);b.t=b.c.length==b.l?0:2}else{if(b.t!=4)ck(b);var +g=d.c,h=b.c;if(d.t==4)if(f<=e)for(var +a=0;a=0;a--)h[f+a]=g[e+a];else{var +i=Math.min(c,g.length-e);for(var +a=0;a>>0>=b.l)hb();return w(b,a,c)}function +bQ(a,b){switch(a.t&6){default:if(b>=a.c.length)return 0;case +0:return a.c.charCodeAt(b);case +4:return a.c[b]}}function +aN(c,a){if(c.fun)return aN(c.fun,a);if(typeof +c!=="function")return c;var +b=c.length|0;if(b===0)return c.apply(null,a);var +e=a.length|0,d=b-e|0;if(d==0)return c.apply(null,a);else +if(d<0)return aN(c.apply(null,a.slice(0,b)),a.slice(b));else +return function(){var +e=arguments.length==0?1:arguments.length,d=new +Array(a.length+e);for(var +b=0;b>>0>=a.length-1)bn();return a}function +nC(a){if(isFinite(a)){if(Math.abs(a)>=2.2250738585072014e-308)return 0;if(a!=0)return 1;return 2}return isNaN(a)?4:3}function +B(a){if(a<0)C("Bytes.create");return new +aB(a?2:9,f,a)}function +as(a){if((a.t&6)!=0)aO(a);return a.c}var +ot=Math.log2&&Math.log2(1.1235582092889474E+307)==1020;function +os(a){if(ot)return Math.floor(Math.log2(a));var +b=0;if(a==0)return-Infinity;if(a>=1)while(a>=2){a/=2;b++}else +while(a<1){a*=2;b--}return b}function +dS(c){var +a=new(h.Float32Array)(1);a[0]=c;var +b=new(h.Int32Array)(a.buffer);return b[0]|0}var +hj=Math.pow(2,-24);function +hs(a){throw a}function +d0(){hs(u.Division_by_zero)}function +g(b,c,a){this.lo=b&az;this.mi=c&az;this.hi=a&ao}g.prototype.caml_custom="_j";g.prototype.copy=function(){return new +g(this.lo,this.mi,this.hi)};g.prototype.ucompare=function(a){if(this.hi>a.hi)return 1;if(this.hia.mi)return 1;if(this.mia.lo)return 1;if(this.loc)return 1;if(ba.mi)return 1;if(this.mia.lo)return 1;if(this.lo>24),c=-this.hi+(b>>24);return new +g(a,b,c)};g.prototype.add=function(a){var +b=this.lo+a.lo,c=this.mi+a.mi+(b>>24),d=this.hi+a.hi+(c>>24);return new +g(b,c,d)};g.prototype.sub=function(a){var +b=this.lo-a.lo,c=this.mi-a.mi+(b>>24),d=this.hi-a.hi+(c>>24);return new +g(b,c,d)};g.prototype.mul=function(a){var +b=this.lo*a.lo,c=(b*hj|0)+this.mi*a.lo+this.lo*a.mi,d=(c*hj|0)+this.hi*a.lo+this.mi*a.mi+this.lo*a.hi;return new +g(b,c,d)};g.prototype.isZero=function(){return(this.lo|this.mi|this.hi)==0};g.prototype.isNeg=function(){return this.hi<<16<0};g.prototype.and=function(a){return new +g(this.lo&a.lo,this.mi&a.mi,this.hi&a.hi)};g.prototype.or=function(a){return new +g(this.lo|a.lo,this.mi|a.mi,this.hi|a.hi)};g.prototype.xor=function(a){return new +g(this.lo^a.lo,this.mi^a.mi,this.hi^a.hi)};g.prototype.shift_left=function(a){a=a&63;if(a==0)return this;if(a<24)return new +g(this.lo<>24-a,this.hi<>24-a);if(a<48)return new +g(0,this.lo<>48-a);return new +g(0,0,this.lo<>a|this.mi<<24-a,this.mi>>a|this.hi<<24-a,this.hi>>a);if(a<48)return new +g(this.mi>>a-24|this.hi<<48-a,this.hi>>a-24,0);return new +g(this.hi>>a-48,0,0)};g.prototype.shift_right=function(a){a=a&63;if(a==0)return this;var +c=this.hi<<16>>16;if(a<24)return new +g(this.lo>>a|this.mi<<24-a,this.mi>>a|c<<24-a,this.hi<<16>>a>>>16);var +b=this.hi<<16>>31;if(a<48)return new +g(this.mi>>a-24|this.hi<<48-a,this.hi<<16>>a-24>>16,b&ao);return new +g(this.hi<<16>>a-32,b,b)};g.prototype.lsl1=function(){this.hi=this.hi<<1|this.mi>>23;this.mi=(this.mi<<1|this.lo>>23)&az;this.lo=this.lo<<1&az};g.prototype.lsr1=function(){this.lo=(this.lo>>>1|this.mi<<23)&az;this.mi=(this.mi>>>1|this.hi<<23)&az;this.hi=this.hi>>>1};g.prototype.udivmod=function(e){var +c=0,b=this.copy(),a=e.copy(),d=new +g(0,0,0);while(b.ucompare(a)>0){c++;a.lsl1()}while(c>=0){c--;d.lsl1();if(b.ucompare(a)>=0){d.lo++;b=b.sub(a)}a.lsr1()}return{quotient:d,modulus:b}};g.prototype.div=function(a){var +b=this;if(a.isZero())d0();var +d=b.hi^a.hi;if(b.hi&an)b=b.neg();if(a.hi&an)a=a.neg();var +c=b.udivmod(a).quotient;if(d&an)c=c.neg();return c};g.prototype.mod=function(b){var +a=this;if(b.isZero())d0();var +d=a.hi;if(a.hi&an)a=a.neg();if(b.hi&an)b=b.neg();var +c=a.udivmod(b).modulus;if(d&an)c=c.neg();return c};g.prototype.toInt=function(){return this.lo|this.mi<<24};g.prototype.toFloat=function(){return(this.hi<<16)*Math.pow(2,32)+this.mi*Math.pow(2,24)+this.lo};g.prototype.toArray=function(){return[this.hi>>8,this.hi&aA,this.mi>>16,this.mi>>8&aA,this.mi&aA,this.lo>>16,this.lo>>8&aA,this.lo&aA]};g.prototype.lo32=function(){return this.lo|(this.mi&aA)<<24};g.prototype.hi32=function(){return this.mi>>>8&ao|this.hi<<16};function +cn(b,c,a){return new +g(b,c,a)}function +cm(a){if(!isFinite(a)){if(isNaN(a))return cn(1,0,fY);return a>0?cn(0,0,fY):cn(0,0,0xfff0)}var +f=a==0&&1/a==-Infinity?an:a>=0?0:an;if(f)a=-a;var +b=os(a)+1023;if(b<=0){b=0;a/=Math.pow(2,-gw)}else{a/=Math.pow(2,b-gY);if(a<16){a*=2;b-=1}if(b==0)a/=2}var +d=Math.pow(2,24),c=a|0;a=(a-c)*d;var +e=a|0;a=(a-e)*d;var +g=a|0;c=c&dF|f|b<<4;return cn(g,e,c)}function +bV(a){return a.toArray()}function +ha(c,b,g){c.write(32,b.dims.length);c.write(32,b.kind|b.layout<<8);if(b.caml_custom==dI)for(var +a=0;a>4;if(c==2047)return(f|g|b&dF)==0?b&an?-Infinity:Infinity:NaN;var +e=Math.pow(2,-24),a=(f*e+g)*e+(b&dF);if(c>0){a+=16;a*=Math.pow(2,c-gY)}else +a*=Math.pow(2,-gw);if(b&an)a=-a;return a}function +dN(b){var +d=b.length,c=1;for(var +a=0;a>>24&aA|(a&ao)<<8,a>>>16&ao)}function +dV(a){return a.hi32()}function +dW(a){return a.lo32()}var +nx=gX;function +aK(c,d,b,a){this.kind=c;this.layout=d;this.dims=b;this.data=a}aK.prototype.caml_custom=nx;aK.prototype.offset=function(b){var +c=0;if(typeof +b==="number")b=[b];if(!(b +instanceof +Array))C("bigarray.js: invalid offset");if(this.dims.length!=b.length)C("Bigarray.get/set: bad number of dimensions");if(this.layout==0)for(var +a=0;a=this.dims[a])bn();c=c*this.dims[a]+b[a]}else +for(var +a=this.dims.length-1;a>=0;a--){if(b[a]<1||b[a]>this.dims[a])bn();c=c*this.dims[a]+(b[a]-1)}return c};aK.prototype.get=function(a){switch(this.kind){case +7:var +d=this.data[a*2+0],b=this.data[a*2+1];return nQ(d,b);case +10:case +11:var +e=this.data[a*2+0],c=this.data[a*2+1];return[I,e,c];default:return this.data[a]}};aK.prototype.set=function(a,b){switch(this.kind){case +7:this.data[a*2+0]=dW(b);this.data[a*2+1]=dV(b);break;case +10:case +11:this.data[a*2+0]=b[1];this.data[a*2+1]=b[2];break;default:this.data[a]=b;break}return 0};aK.prototype.fill=function(b){switch(this.kind){case +7:var +c=dW(b),e=dV(b);if(c==e)this.data.fill(c);else +for(var +a=0;ad)return 1;if(c!=d){if(!g)return NaN;if(c==c)return 1;if(d==d)return-1}}break;case +7:for(var +a=0;ab.data[a+1])return 1;if(this.data[a]>>>0>>0)return-1;if(this.data[a]>>>0>b.data[a]>>>0)return 1}break;case +2:case +3:case +4:case +5:case +6:case +8:case +9:case +12:for(var +a=0;ab.data[a])return 1}break}return 0};function +bm(c,d,b,a){this.kind=c;this.layout=d;this.dims=b;this.data=a}bm.prototype=new +aK();bm.prototype.offset=function(a){if(typeof +a!=="number")if(a +instanceof +Array&&a.length==1)a=a[0];else +C("Ml_Bigarray_c_1_1.offset");if(a<0||a>=this.dims[0])bn();return a};bm.prototype.get=function(a){return this.data[a]};bm.prototype.set=function(a,b){this.data[a]=b;return 0};bm.prototype.fill=function(a){this.data.fill(a);return 0};function +g8(c,d,a,b){var +e=g_(c);if(dN(a)*e!=b.length)C("length doesn't match dims");if(d==0&&a.length==1&&e==1)return new +bm(c,d,a,b);return new +aK(c,d,a,b)}function +ar(a){dZ(u.Failure,a)}function +g9(b,v,r){var +i=b.read32s();if(i<0||i>16)ar("input_value: wrong number of bigarray dimensions");var +p=b.read32s(),j=p&aA,o=p>>8&1,h=[];if(r==dI)for(var +a=0;a>>32-15;a=cq(a,0x1b873593);b^=a;b=b<<13|b>>>32-13;return(b+(b<<2)|0)+(0xe6546b64|0)|0}function +nK(a,b){a=K(a,dW(b));a=K(a,dV(b));return a}function +dQ(a,b){return nK(a,cm(b))}function +g$(c){var +b=dN(c.dims),d=0;switch(c.kind){case +2:case +3:case +12:if(b>bO)b=bO;var +e=0,a=0;for(a=0;a+4<=c.data.length;a+=4){e=c.data[a+0]|c.data[a+1]<<8|c.data[a+2]<<16|c.data[a+3]<<24;d=K(d,e)}e=0;switch(b&3){case +3:e=c.data[a+2]<<16;case +2:e|=c.data[a+1]<<8;case +1:e|=c.data[a+0];d=K(d,e)}break;case +4:case +5:if(b>bP)b=bP;var +e=0,a=0;for(a=0;a+2<=c.data.length;a+=2){e=c.data[a+0]|c.data[a+1]<<16;d=K(d,e)}if((b&1)!=0)d=K(d,c.data[a]);break;case +6:if(b>64)b=64;for(var +a=0;a64)b=64;for(var +a=0;a32)b=32;b*=2;for(var +a=0;a64)b=64;for(var +a=0;a32)b=32;for(var +a=0;a0?b(c,f,e):b(f,c,e);if(e&&a!=a)return d;if(+a!=+a)return+a;if((a|0)!=0)return a|0}return d}function +bW(a){return a +instanceof +aB}function +co(a){return bW(a)}function +hf(a){if(typeof +a==="number")return bK;else +if(bW(a))return dG;else +if(co(a))return 1252;else +if(a +instanceof +Array&&a[0]===a[0]>>>0&&a[0]<=f_){var +b=a[0]|0;return b==I?0:b}else +if(a +instanceof +String)return gi;else +if(typeof +a=="string")return gi;else +if(a +instanceof +Number)return bK;else +if(a&&a.caml_custom)return dw;else +if(a&&a.compare)return 1256;else +if(typeof +a=="function")return 1247;else +if(typeof +a=="symbol")return 1251;return 1001}function +hk(a,b){if(ab.c?1:0}function +ov(a,b){return hc(a,b)}function +bR(a,b,d){var +e=[];for(;;){if(!(d&&a===b)){var +f=hf(a);if(f==ch){a=a[1];continue}var +g=hf(b);if(g==ch){b=b[1];continue}if(f!==g){if(f==bK){if(g==dw)return he(a,b,-1,d);return-1}if(g==bK){if(f==dw)return he(b,a,1,d);return 1}return fb)return 1;if(a!=b){if(!d)return NaN;if(a==a)return 1;if(b==b)return-1}break;case +1001:if(ab)return 1;if(a!=b){if(!d)return NaN;if(a==a)return 1;if(b==b)return-1}break;case +1251:if(a!==b){if(!d)return NaN;return 1}break;case +1252:var +a=as(a),b=as(b);if(a!==b){if(ab)return 1}break;case +12520:var +a=a.toString(),b=b.toString();if(a!==b){if(ab)return 1}break;case +246:case +254:default:if(a.length!=b.length)return a.length1)e.push(a,b,1);break}}if(e.length==0)return 0;var +h=e.pop();b=e.pop();a=e.pop();if(h+10)if(c==0&&(b>=a.l||a.t==2&&b>=a.c.length))if(d==0){a.c=f;a.t=2}else{a.c=bq(b,String.fromCharCode(d));a.t=b==a.l?0:2}else{if(a.t!=4)ck(a);for(b+=c;cb)return 1;if(a===a)return 1;if(b===b)return-1;return 0}function +dY(d){d=as(d);var +e=d.length;if(e>31)C("format_int: format too long");var +a={justify:bk,signstyle:aX,filler:ac,alternate:false,base:0,signedconv:false,width:0,uppercase:false,sign:1,prec:-1,conv:"f"};for(var +c=0;c=0&&b<=9){a.width=a.width*10+b;c++}c--;break;case".":a.prec=0;c++;while(b=d.charCodeAt(c)-48,b>=0&&b<=9){a.prec=a.prec*10+b;c++}c--;case"d":case"i":a.signedconv=true;case"u":a.base=10;break;case"x":a.base=16;break;case"X":a.base=16;a.uppercase=true;break;case"o":a.base=8;break;case"e":case"f":case"g":a.signedconv=true;a.conv=b;break;case"E":case"F":case"G":a.signedconv=true;a.uppercase=true;a.conv=b.toLowerCase();break}}return a}function +dP(a,g){if(a.uppercase)g=g.toUpperCase();var +e=g.length;if(a.signedconv&&(a.sign<0||a.signstyle!=aX))e++;if(a.alternate){if(a.base==8)e+=1;if(a.base==16)e+=2}var +c=f;if(a.justify==bk&&a.filler==ac)for(var +d=e;d20){c-=20;a/=Math.pow(10,c);a+=new +Array(c+1).join(T);if(b>0)a=a+aY+new +Array(b+1).join(T);return a}else +return a.toFixed(b)}}var +a,e=dY(i),d=e.prec<0?6:e.prec;if(c<0||c==0&&1/c==-Infinity){e.sign=-1;c=-c}if(isNaN(c)){a=dx;e.filler=ac}else +if(!isFinite(c)){a="inf";e.filler=ac}else +switch(e.conv){case"e":var +a=c.toExponential(d),b=a.length;if(a.charAt(b-3)==dL)a=a.slice(0,b-1)+T+a.slice(b-1);break;case"f":a=j(c,d);break;case"g":d=d?d:1;a=c.toExponential(d-1);var +h=a.indexOf(dL),g=+a.slice(h+1);if(g<-4||c>=1e21||c.toFixed(0).length>d){var +b=h-1;while(a.charAt(b)==T)b--;if(a.charAt(b)==aY)b--;a=a.slice(0,b+1)+a.slice(h);b=a.length;if(a.charAt(b-3)==dL)a=a.slice(0,b-1)+T+a.slice(b-1);break}else{var +f=d;if(g<0){f-=g+1;a=c.toFixed(f)}else +while(a=c.toFixed(f),a.length>d+1)f--;if(f){var +b=a.length-1;while(a.charAt(b)==T)b--;if(a.charAt(b)==aY)b--;a=a.slice(0,b+1)}}break}return dP(e,a)}function +cl(e,c){if(as(e)==gF)return b(f+c);var +a=dY(e);if(c<0)if(a.signedconv){a.sign=-1;c=-c}else +c>>>=0;var +d=c.toString(a.base);if(a.prec>=0){a.filler=ac;var +g=a.prec-d.length;if(g>0)d=bq(g,T)+d}return dP(a,d)}var +od=0;function +J(){return od++}function +cp(a){return a.toUtf16()}if(h.process&&h.process.cwd)var +bS=h.process.cwd().replace(/\\/g,ay);else +var +bS="/static";if(bS.slice(-1)!==ay)bS+=ay;function +n5(a){a=cp(a);if(a.charCodeAt(0)!=47)a=bS+a;var +d=a.split(ay),b=[];for(var +c=0;c1)b.pop();break;case".":break;case"":if(b.length==0)b.push(f);break;default:b.push(d[c]);break}b.orig=a;return b}function +nA(a){return new +aB(4,a,a.length)}function +oo(e){for(var +g=f,b=g,a,i,c=0,h=e.length;cdu){b.substr(0,1);g+=b;b=f;g+=e.slice(c,d)}else +b+=e.slice(c,d);if(d==h)break;c=d}if(a>6);b+=String.fromCharCode(ad|a&bl)}else +if(a<0xd800||a>=ga)b+=String.fromCharCode(gc|a>>12,ad|a>>6&bl,ad|a&bl);else +if(a>=0xdbff||c+1==h||(i=e.charCodeAt(c+1))ga)b+="\xef\xbf\xbd";else{c++;a=(a<<10)+i-0x35fdc00;b+=String.fromCharCode(gR|a>>18,ad|a>>12&bl,ad|a>>6&bl,ad|a&bl)}if(b.length>bM){b.substr(0,1);g+=b;b=f}}return g+b}function +nB(a){var +b=9;if(!hy(a))b=8,a=oo(a);return new +aB(b,a,a.length)}function +a0(a){return nB(a)}function +s(a){dZ(u.Sys_error,a)}function +of(a){a=as(a);s(a+": No such file or directory")}function +nz(b,a){if(a>>>0>=b.l)hb();return bQ(b,a)}function +Y(a){return a.l}function +g4(){}function +F(a){this.data=a}F.prototype=new +g4();F.prototype.truncate=function(a){var +b=this.data;this.data=B(a|0);aL(b,0,this.data,0,a)};F.prototype.length=function(){return Y(this.data)};F.prototype.write=function(b,d,g,a){var +c=this.length();if(b+a>=c){var +e=B(b+a),f=this.data;this.data=e;aL(f,0,this.data,0,c)}aM(d,g,this.data,b,a);return 0};F.prototype.read=function(c,a,d,b){var +e=this.length();aL(this.data,c,a,d,b);return 0};F.prototype.read_one=function(a){return nz(this.data,a)};F.prototype.close=function(){};F.prototype.constructor=F;function +ae(b,a){this.content={};this.root=b;this.lookupFun=a}ae.prototype.nm=function(a){return this.root+a};ae.prototype.lookup=function(a){if(!this.content[a]&&this.lookupFun){var +c=this.lookupFun(b(this.root),b(a));if(c!==0)this.content[a]=new +F(aC(c[1]))}};ae.prototype.exists=function(a){if(a==f)return 1;var +c=a+ay,d=new +RegExp(dA+c);for(var +b +in +this.content)if(b.match(d))return 1;this.lookup(a);return this.content[a]?1:0};ae.prototype.readdir=function(c){var +g=c==f?f:c+ay,h=new +RegExp(dA+g+gV),d={},b=[];for(var +e +in +this.content){var +a=e.match(h);if(a&&!d[a[1]]){d[a[1]]=true;b.push(a[1])}}return b};ae.prototype.is_dir=function(a){var +d=a==f?f:a+ay,e=new +RegExp(dA+d+gV),g=[];for(var +c +in +this.content){var +b=c.match(e);if(b)return 1}return 0};ae.prototype.unlink=function(a){var +b=this.content[a]?true:false;delete +this.content[a];return b};ae.prototype.open=function(a,b){if(b.rdonly&&b.wronly)s(this.nm(a)+gm);if(b.text&&b.binary)s(this.nm(a)+gC);this.lookup(a);if(this.content[a]){if(this.is_dir(a))s(this.nm(a)+" : is a directory");if(b.create&&b.excl)s(this.nm(a)+gk);var +c=this.content[a];if(b.truncate)c.truncate();return c}else +if(b.create){this.content[a]=new +F(B(0));return this.content[a]}else +of(this.nm(a))};ae.prototype.register=function(b,a){if(this.content[b])s(this.nm(b)+gk);if(bW(a))this.content[b]=new +F(a);if(co(a))this.content[b]=new +F(aC(a));else +if(a +instanceof +Array)this.content[b]=new +F(nA(a));else +if(typeof +a==="string")this.content[b]=new +F(hd(a));else +if(a.toString){var +c=aC(a0(a.toString()));this.content[b]=new +F(c)}else +s(this.nm(b)+" : registering file with invalid content type")};ae.prototype.constructor=ae;function +l(a){return Y(a)}function +aj(b,a){return bQ(b,a)}function +nv(d){var +c=l(d),b=new +Array(c),a=0;for(;a=0)}function +dR(d,b){var +e=b.length,a,c;for(a=0;a+4<=e;a+=4){c=b.charCodeAt(a)|b.charCodeAt(a+1)<<8|b.charCodeAt(a+2)<<16|b.charCodeAt(a+3)<<24;d=K(d,c)}c=0;switch(e&3){case +3:c=b.charCodeAt(a+2)<<16;case +2:c|=b.charCodeAt(a+1)<<8;case +1:c|=b.charCodeAt(a);d=K(d,c)}d^=e;return d}function +nL(a,b){return dR(a,as(b))}function +nI(d,b){var +e=b.length,a,c;for(a=0;a+4<=e;a+=4){c=b[a]|b[a+1]<<8|b[a+2]<<16|b[a+3]<<24;d=K(d,c)}c=0;switch(e&3){case +3:c=b[a+2]<<16;case +2:c|=b[a+1]<<8;case +1:c|=b[a];d=K(d,c)}d^=e;return d}function +nH(a,b){switch(b.t&6){default:aO(b);case +0:a=dR(a,b.c);break;case +2:a=nI(a,b.c)}return a}function +nJ(a){a^=a>>>16;a=cq(a,0x85ebca6b|0);a^=a>>>13;a=cq(a,0xc2b2ae35|0);a^=a>>>16;return a}function +hi(j,l,n,m){var +f,g,h,d,c,b,a,e,i;d=l;if(d<0||d>bO)d=bO;c=j;b=n;f=[m];g=0;h=1;while(g0){a=f[g++];if(a&&a.caml_custom){if(bT[a.caml_custom]&&bT[a.caml_custom].hash){var +k=bT[a.caml_custom].hash(a);b=K(b,k);c--}}else +if(a +instanceof +Array&&a[0]===(a[0]|0))switch(a[0]){case +248:b=K(b,a[2]);c--;break;case +250:f[--g]=a[1];break;default:var +o=a.length-1<<10|a[0];b=K(b,o);for(e=1,i=a.length;e=d)break;f[h++]=a[e]}break}else +if(bW(a)){b=nH(b,a);c--}else +if(co(a)){b=nL(b,a);c--}else +if(typeof +a==="string"){b=dR(b,a);c--}else +if(a===(a|0)){b=K(b,a+a+1);c--}else +if(a===+a){b=dQ(b,a);c--}}b=nJ(b);return b&0x3FFFFFFF}function +nM(a,c,l){if(!isFinite(a)){if(isNaN(a))return a0(dx);return a0(a>0?gS:"-infinity")}var +j=a==0&&1/a==-Infinity?1:a>=0?0:1;if(j)a=-a;var +d=0;if(a==0);else +if(a<1)while(a<1&&d>-1022){a*=2;d--}else +while(a>=2){a/=2;d++}var +k=d<0?f:bk,e=f;if(j)e=aX;else +switch(l){case +43:e=bk;break;case +32:e=ac;break;default:break}if(c>=0&&c<13){var +h=Math.pow(2,c*4);a=Math.round(a*h)/h}var +b=a.toString(16);if(c>=0){var +i=b.indexOf(aY);if(i<0)b+=aY+bq(c,T);else{var +g=i+1+c;if(b.length>24&az,a>>31&ao)}function +nY(a){return a.toInt()}function +nT(a){return+a.isNeg()}function +nW(a){return a.neg()}function +nR(h,c){var +a=dY(h);if(a.signedconv&&nT(c)){a.sign=-1;c=nW(c)}var +b=f,i=nX(a.base),g="0123456789abcdef";do{var +e=c.udivmod(i);c=e.quotient;b=g.charAt(nY(e.modulus))+b}while(!nU(c));if(a.prec>=0){a.filler=ac;var +d=a.prec-b.length;if(d>0)b=bq(d,T)+b}return dP(a,b)}function +oe(c){var +a=0,e=l(c),b=10,d=1;if(e>0)switch(aj(c,a)){case +45:a++;d=-1;break;case +43:a++;d=1;break}if(a+1=48&&a<=57)return a-48;if(a>=65&&a<=90)return a-55;if(a>=97&&a<=g2)return a-87;return-1}function +n0(f){var +h=oe(f),c=h[0],i=h[1],d=h[2],g=l(f),j=-1>>>0,e=c=d)ar(cg);var +a=b;for(c++;c=d)break;a=d*a+b;if(a>j)ar(cg)}if(c!=g)ar(cg);a=i*a;if(d==10&&(a|0)!=a)ar(cg);return a|0}function +n1(a){return a.slice(1)}function +hl(a,c,b){return a[cp(c)].apply(a,n1(b))}function +n2(c){var +d=c.length,b=new +Array(d+1);b[0]=0;for(var +a=0;a>>32-b,c)}function +g(c,b,d,e,h,f,g){return a(b&d|~b&e,c,b,h,f,g)}function +h(d,b,e,c,h,f,g){return a(b&c|e&~c,d,b,h,f,g)}function +i(c,b,d,e,h,f,g){return a(b^d^e,c,b,h,f,g)}function +j(c,b,d,e,h,f,g){return a(d^(b|~e),c,b,h,f,g)}function +k(f,n){var +e=n;f[e>>2]|=ad<<8*(e&3);for(e=(e&~0x3)+8;(e&0x3F)<60;e+=4)f[(e>>2)-1]=0;f[(e>>2)-1]=n<<3;f[e>>2]=n>>29&0x1FFFFFFF;var +k=[0x67452301,0xEFCDAB89,0x98BADCFE,0x10325476];for(e=0;e>8*m&0xFF;return o}return function(h,g,f){var +e=[];switch(h.t&6){default:aO(h);case +0:var +d=h.c;for(var +a=0;a>2]=d.charCodeAt(b)|d.charCodeAt(b+1)<<8|d.charCodeAt(b+2)<<16|d.charCodeAt(b+3)<<24}for(;a>2]|=d.charCodeAt(a+g)<<8*(a&3);break;case +4:var +c=h.c;for(var +a=0;a>2]=c[b]|c[b+1]<<8|c[b+2]<<16|c[b+3]<<24}for(;a>2]|=c[a+g]<<8*(a&3)}return oj(k(e,f))}}();function +n7(c,b,a){return n6(aC(c),b,a)}var +at=new +Array();function +dX(c){var +a=at[c];if(!a.opened)s("Cannot flush a closed channel");if(!a.buffer||a.buffer==f)return 0;if(a.fd&&u.fds[a.fd]&&u.fds[a.fd].output){var +b=u.fds[a.fd].output;switch(b.length){case +2:b(c,a.buffer);break;default:b(a.buffer)}}a.buffer=f;return 0}function +hv(e,f){var +a=at[e],d=b(f),c=l(d);a.file.write(a.offset,d,0,c);a.offset+=c;return 0}function +oq(a){var +a=d1(a),b=h;if(b.process&&b.process.stdout&&b.process.stdout.write)b.process.stderr.write(a);else{if(a.charCodeAt(a.length-1)==10)a=a.substr(0,a.length-1);var +c=b.console;c&&c.error&&c.error(a)}}function +or(a){var +a=d1(a),b=h;if(b.process&&b.process.stdout&&b.process.stdout.write)b.process.stdout.write(a);else{if(a.charCodeAt(a.length-1)==10)a=a.substr(0,a.length-1);var +c=b.console;c&&c.log&&c.log(a)}}function +ct(c,e,d,a){if(u.fds===undefined)u.fds=new +Array();a=a?a:{};var +b={};b.file=d;b.offset=a.append?d.length():0;b.flags=a;b.output=e;u.fds[c]=b;if(!u.fd_last_idx||c>u.fd_last_idx)u.fd_last_idx=c;return c}function +ow(c,b,g){var +a={};while(b){switch(b[1]){case +0:a.rdonly=1;break;case +1:a.wronly=1;break;case +2:a.append=1;break;case +3:a.create=1;break;case +4:a.truncate=1;break;case +5:a.excl=1;break;case +6:a.binary=1;break;case +7:a.text=1;break;case +8:a.nonblock=1;break}b=b[2]}if(a.rdonly&&a.wronly)s(as(c)+gm);if(a.text&&a.binary)s(as(c)+gC);var +d=hz(c),e=d.device.open(d.rest,a),f=u.fd_last_idx?u.fd_last_idx:0;return ct(f+1,hv,e,a)}ct(0,hv,new +F(B(0)));ct(1,or,new +F(B(0)));ct(2,oq,new +F(B(0)));function +n8(c){var +b=u.fds[c];if(b.flags.wronly)s(g1+c+" is writeonly");var +a={file:b.file,offset:b.offset,fd:c,opened:true,out:false,refill:null};at[a.fd]=a;return a.fd}function +hn(c){var +b=u.fds[c];if(b.flags.rdonly)s(g1+c+" is readonly");var +a={file:b.file,offset:b.offset,fd:c,opened:true,out:true,buffer:f};at[a.fd]=a;return a.fd}function +n9(){var +b=0;for(var +a=0;a>>0)return a[0];else +if(bW(a))return dG;else +if(co(a))return dG;else +if(a +instanceof +Function||typeof +a=="function")return 247;else +if(a&&a.caml_custom)return f_;else +return bK}function +ag(b,c,a){if(a&&h.toplevelReloc)b=h.toplevelReloc(a);u[b+1]=c;if(a)u[a]=c}var +hp={};function +oh(a,b){hp[as(a)]=b;return 0}function +ny(a,b){if(a===b)return 1;a.t&6&&aO(a);b.t&6&&aO(b);return a.c==b.c?1:0}function +hw(a,b){return ny(a,b)}function +oi(){C(dJ)}function +D(b,a){if(a>>>0>=l(b))oi();return aj(b,a)}function +aE(a,b){return 1-hw(a,b)}function +ok(){return[0,b("js_of_ocaml")]}function +ol(){return 0x7FFFFFFF/4|0}function +om(){return[0,b("Unix"),32,0]}function +og(){hs(u.Not_found)}function +cs(c){var +a=h,b=cp(c);if(a.process&&a.process.env&&a.process.env[b]!=undefined)return a0(a.process.env[b]);if(h.jsoo_static_env&&h.jsoo_static_env[b])return a0(h.jsoo_static_env[b]);og()}function +on(){var +a=new +Date().getTime(),b=a^0xffffffff*Math.random();return[0,b]}function +bX(a){var +b=1;while(a&&a.joo_tramp){a=a.joo_tramp.apply(null,a.joo_args);b++}return a}function +y(b,a){return{joo_tramp:b,joo_args:a}}function +hu(a){return a}function +ho(a){return hp[a]}function +Z(a){if(a +instanceof +Array)return a;if(h.RangeError&&a +instanceof +h.RangeError&&a.message&&a.message.match(/maximum call stack/i))return hu(u.Stack_overflow);if(h.InternalError&&a +instanceof +h.InternalError&&a.message&&a.message.match(/too much recursion/i))return hu(u.Stack_overflow);if(a +instanceof +h.Error&&ho(dv))return[0,ho(dv),a];return[0,u.Failure,a0(String(a))]}function +cu(){return 0}function +ou(){}function +a(a,b){return a.length==1?a(b):aN(a,[b])}function +c(a,b,c){return a.length==2?a(b,c):aN(a,[b,c])}function +o(a,b,c,d){return a.length==3?a(b,c,d):aN(a,[b,c,d])}function +am(a,b,c,d,e){return a.length==4?a(b,c,d,e):aN(a,[b,c,d,e])}function +aJ(a,b,c,d,e,f){return a.length==5?a(b,c,d,e,f):aN(a,[b,c,d,e,f])}nF();var +d3=[v,b(f1),-2],au=[v,b(f5),-3],d2=[v,b(gv),-4],P=[v,b(gy),-7],m=[v,b(gK),-11],eh=[0,f0],dn=b("No element with id '%s' found"),fN=[0,0];ag(11,[v,b(fS),-12],fS);ag(10,m,gK);ag(9,[v,b(gq),-10],gq);ag(8,[v,b(gA),-9],gA);ag(7,[v,b(gg),-8],gg);ag(6,P,gy);ag(5,[v,b(gG),-6],gG);ag(4,[v,b(f7),-5],f7);ag(3,d2,gv);ag(2,au,f5);ag(1,d3,f1);ag(0,[v,b(gU),-1],gU);var +hG=b("output_substring"),hC=b("true"),hD=b("false"),hI=b("\\\\"),hJ=b("\\'"),hK=b("\\b"),hL=b("\\t"),hM=b("\\n"),hN=b("\\r"),hR=b("String.blit / Bytes.blit_string"),hQ=b("Bytes.blit"),hP=b("String.sub / Bytes.sub"),hU=b("String.contains_from / Bytes.contains_from"),hW=b("Array.init"),h4=b("Set.remove_min_elt"),h5=[0,0,0,0],h6=[0,0,0],h7=[0,b("set.ml"),547,18],h0=b(cf),h1=b(cf),h2=b(cf),h3=b(cf),h9=b("Stdlib.Queue.Empty"),h$=b("CamlinternalLazy.Undefined"),ii=b("Buffer.add_substring/add_subbytes"),ih=b("Buffer.add: cannot grow buffer"),ig=[0,b(gE),93,2],ie=[0,b(gE),94,2],id=b("Buffer.sub"),is=b("%c"),it=b("%s"),iu=b(fR),iv=b(gf),iw=b(gu),ix=b(fV),iy=b("%f"),iz=b("%B"),iA=b("%{"),iB=b("%}"),iC=b("%("),iD=b("%)"),iE=b("%a"),iF=b("%t"),iG=b("%?"),iH=b("%r"),iI=b("%_r"),iJ=[0,b(A),850,23],iU=[0,b(A),814,21],iM=[0,b(A),815,21],iV=[0,b(A),818,21],iN=[0,b(A),819,21],iW=[0,b(A),822,19],iO=[0,b(A),823,19],iX=[0,b(A),826,22],iP=[0,b(A),827,22],iY=[0,b(A),831,30],iQ=[0,b(A),832,30],iS=[0,b(A),836,26],iK=[0,b(A),837,26],iT=[0,b(A),846,28],iL=[0,b(A),847,28],iR=[0,b(A),851,23],j0=b(go),jY=[0,b(A),1558,4],jZ=b("Printf: bad conversion %["),j1=[0,b(A),1626,39],j2=[0,b(A),1649,31],j3=[0,b(A),1650,31],j4=b("Printf: bad conversion %_"),j5=b("@{"),j6=b("@["),j_=[0,[11,b("invalid box description "),[3,0,0]],b("invalid box description %S")],j8=b(f),j9=[0,0,4],j$=b(f),ka=b("b"),kb=b("h"),kc=b("hov"),kd=b("hv"),ke=b("v"),jW=b(dx),jU=b("neg_infinity"),jV=b(gS),jT=b(aY),jD=b("%+nd"),jE=b("% nd"),jG=b("%+ni"),jH=b("% ni"),jI=b("%nx"),jJ=b("%#nx"),jK=b("%nX"),jL=b("%#nX"),jM=b("%no"),jN=b("%#no"),jC=b("%nd"),jF=b(gu),jO=b("%nu"),jq=b("%+ld"),jr=b("% ld"),jt=b("%+li"),ju=b("% li"),jv=b("%lx"),jw=b("%#lx"),jx=b("%lX"),jy=b("%#lX"),jz=b("%lo"),jA=b("%#lo"),jp=b("%ld"),js=b(gf),jB=b("%lu"),jd=b("%+Ld"),je=b("% Ld"),jg=b("%+Li"),jh=b("% Li"),ji=b("%Lx"),jj=b("%#Lx"),jk=b("%LX"),jl=b("%#LX"),jm=b("%Lo"),jn=b("%#Lo"),jc=b("%Ld"),jf=b(fV),jo=b("%Lu"),i2=b("%+d"),i3=b("% d"),i5=b("%+i"),i6=b("% i"),i7=b("%x"),i8=b("%#x"),i9=b("%X"),i_=b("%#X"),i$=b("%o"),ja=b("%#o"),i1=b(gF),i4=b(fR),jb=b(go),ij=b("@]"),ik=b("@}"),il=b("@?"),im=b("@\n"),io=b("@."),ip=b("@@"),iq=b("@%"),ir=b("@"),iZ=b("CamlinternalFormat.Type_mismatch"),kf=b("x"),nr=b("OCAMLRUNPARAM"),np=b("CAMLRUNPARAM"),kg=b(f),kI=[3,0,3],kJ=b(aY),kD=b(gZ),kE=b("<\/"),kF=b(f),kz=b(gZ),kA=b("<"),kB=b(f),kx=b("\n"),kr=b(f),ks=b(f),kt=b(f),ku=b(f),kq=[0,b(f)],km=b(f),kn=b(f),ko=b(f),kp=b(f),kl=[0,b(f),0,b(f)],kk=b(f),kj=b("Stdlib.Format.String_tag"),no=b("TMPDIR"),nn=b("TEMP"),kO=b("Cygwin"),kP=b("Win32"),kT=b(dv),kS=b("Jv.Error"),ls=b("warn"),lr=b("error"),lq=b("log"),k$=b("append"),kU=b("capture"),kV=b("once"),kW=b("passive"),md=[0,[18,[1,[0,0,b(f)]],[12,123,[15,[12,125,[17,0,0]]]]],b("@[{%a}@]")],ma=b("TOOD"),lH=b("step already executed"),lA=[0,[0,0,0,0,0,0,0,0,0,0,0]],lB=[0,b(dH),19,6],lC=[0,[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]],lD=[0,b(dH),99,6],lE=[0,[0,0,0,0,0,0,0,0,0,0,0,0,0]],lF=[0,b(dH),232,6],lQ=b("Note.Src.Step"),lS=[0,[0,0,0,0,0,0,0,0,0,0,0]],me=[0,[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]],mj=[0,[0,0,0,0,0,0,0,0,0,0,0,0,0]],mp=b("brr_add"),mo=b("brr_rem"),mr=[0,0.,0.],mu=b(gB),mv=b(f),mw=b(f),mx=b(gB),my=b("0.0.0.0"),mz=b("127.0.0.1"),nm=b("::"),nl=b("::1"),mA=[0,[11,b(f6),0],b(f6)],mB=[0,[11,b(f2),0],b(f2)],mR=[0,b(aW),422,10],mQ=[0,b(aW),433,16],mP=[0,b(aW),409,4],mO=[0,b(aW),348,12],mN=[0,b(aW),339,12],mL=[0,b(aW),92,8],mM=b(gn),mJ=[0,b(aW),80,8],mK=b(gh),mI=b(gn),mH=b(gh),mD=b("Matrix.NonSquare"),mF=b("Matrix.ImproperDimensions"),mX=b("NonElt"),m1=[0,0.,0.],m2=[0,0,0],m4=[0,0,0],nh=[0,bL,bN],ni=[0,bL,dy],nj=[0,bL,-806423680],ng=[0,bL,bN],nb=b("\xc2\xb0"),nc=b("Angle : "),na=b("Width : "),m_=b("Delete "),m$=b("Download"),nd=b("Ductus"),ne=b("Fill"),nf=b("Rendering : ");function +t(a){if(typeof +a==="number")return 0;else +switch(a[0]){case +0:return[0,t(a[1])];case +1:return[1,t(a[1])];case +2:return[2,t(a[1])];case +3:return[3,t(a[1])];case +4:return[4,t(a[1])];case +5:return[5,t(a[1])];case +6:return[6,t(a[1])];case +7:return[7,t(a[1])];case +8:var +c=a[1];return[8,c,t(a[2])];case +9:var +b=a[1];return[9,b,b,t(a[3])];case +10:return[10,t(a[1])];case +11:return[11,t(a[1])];case +12:return[12,t(a[1])];case +13:return[13,t(a[1])];default:return[14,t(a[1])]}}function +L(a,b){if(typeof +a==="number")return b;else +switch(a[0]){case +0:return[0,L(a[1],b)];case +1:return[1,L(a[1],b)];case +2:return[2,L(a[1],b)];case +3:return[3,L(a[1],b)];case +4:return[4,L(a[1],b)];case +5:return[5,L(a[1],b)];case +6:return[6,L(a[1],b)];case +7:return[7,L(a[1],b)];case +8:var +c=a[1];return[8,c,L(a[2],b)];case +9:var +d=a[2],e=a[1];return[9,e,d,L(a[3],b)];case +10:return[10,L(a[1],b)];case +11:return[11,L(a[1],b)];case +12:return[12,L(a[1],b)];case +13:return[13,L(a[1],b)];default:return[14,L(a[1],b)]}}function +q(a,b){if(typeof +a==="number")return b;else +switch(a[0]){case +0:return[0,q(a[1],b)];case +1:return[1,q(a[1],b)];case +2:var +c=a[1];return[2,c,q(a[2],b)];case +3:var +d=a[1];return[3,d,q(a[2],b)];case +4:var +e=a[3],f=a[2],g=a[1];return[4,g,f,e,q(a[4],b)];case +5:var +h=a[3],i=a[2],j=a[1];return[5,j,i,h,q(a[4],b)];case +6:var +k=a[3],l=a[2],m=a[1];return[6,m,l,k,q(a[4],b)];case +7:var +n=a[3],o=a[2],p=a[1];return[7,p,o,n,q(a[4],b)];case +8:var +r=a[3],s=a[2],t=a[1];return[8,t,s,r,q(a[4],b)];case +9:var +u=a[1];return[9,u,q(a[2],b)];case +10:return[10,q(a[1],b)];case +11:var +v=a[1];return[11,v,q(a[2],b)];case +12:var +w=a[1];return[12,w,q(a[2],b)];case +13:var +x=a[2],y=a[1];return[13,y,x,q(a[3],b)];case +14:var +z=a[2],A=a[1];return[14,A,z,q(a[3],b)];case +15:return[15,q(a[1],b)];case +16:return[16,q(a[1],b)];case +17:var +B=a[1];return[17,B,q(a[2],b)];case +18:var +C=a[1];return[18,C,q(a[2],b)];case +19:return[19,q(a[1],b)];case +20:var +D=a[2],E=a[1];return[20,E,D,q(a[3],b)];case +21:var +F=a[1];return[21,F,q(a[2],b)];case +22:return[22,q(a[1],b)];case +23:var +G=a[1];return[23,G,q(a[2],b)];default:var +H=a[2],I=a[1];return[24,I,H,q(a[3],b)]}}function +cv(a){throw[0,au,a]}function +M(a){throw[0,d2,a]}J(0);function +d4(b,a){return nG(b,a)?b:a}function +cw(a){return 0<=a?a:-a|0}var +hA=2147483647;function +aP(d,c){var +a=l(d),e=l(c),b=B(a+e|0);aM(d,0,b,0,a);aM(c,0,b,a,e);return O(b)}function +hB(a){return a?hC:hD}n8(0);var +hE=hn(1),hF=hn(2),cx=[0,function(b){function +a(b){var +a=b;for(;;){if(a){var +c=a[2],d=a[1];try{dX(d)}catch(a){a=Z(a);if(a[1]!==d3)throw a;var +e=a}var +a=c;continue}return 0}}return a(n9(0))}];function +d5(c){var +b=[0,0],d=cx[1];cx[1]=function(e){if(1-b[1]){b[1]=1;a(c,0)}return a(d,0)};return 0}function +hH(b){return a(cx[1],0)}var +d6=om(0)[1],d7=ol(0),br=(4*d7|0)-1|0;J(0);var +hO=ok(0);function +a1(c){var +b=0,a=c;for(;;){if(a){var +b=b+1|0,a=a[2];continue}return b}}function +aQ(d,c){var +a=d,b=c;for(;;){if(a){var +e=[0,a[1],b],a=a[2],b=e;continue}return b}}function +d8(a){return aQ(a,0)}typeof +hO==="number";function +a2(c,b){if(b){var +d=b[2],e=a(c,b[1]);return[0,e,a2(c,d)]}return 0}function +_(d,c){var +b=c;for(;;){if(b){var +e=b[2];a(d,b[1]);var +b=e;continue}return 0}}function +cy(f,e){var +b=0,a=e;for(;;){if(a){var +d=a[2];c(f,b,a[1]);var +b=b+1|0,a=d;continue}return 0}}function +aF(f,e,d){var +b=e,a=d;for(;;){if(a){var +g=a[2],b=c(f,b,a[1]),a=g;continue}return b}}function +d9(e,d){var +b=d;for(;;){if(b){var +c=b[1],f=b[2];if(a(e,c))return c;var +b=f;continue}throw P}}function +aR(a,c){var +b=B(a);nD(b,0,a,c);return b}function +d_(c,b,a){if(0<=b&&0<=a&&!((Y(c)-a|0)>1,A=n(z,g),L=A[1],B=n(j-z|0,A[2]),i=L,h=B[1],f=0,M=B[2];for(;;){if(i){if(h){var +u=h[2],v=h[1],w=i[2],l=i[1],x=c(d,l,v);if(0===x){var +i=w,h=u,f=[0,l,f];continue}if(0<=x){var +h=u,f=[0,v,f];continue}var +i=w,f=[0,l,f];continue}var +C=aQ(i,f)}else +var +C=aQ(h,f);return[0,C,M]}},n=function(j,g){if(2===j){if(g){var +m=g[2];if(m){var +n=m[1],k=g[1],J=m[2],y=c(d,k,n),K=0===y?[0,k,0]:0<=y?[0,n,[0,k,0]]:[0,k,[0,n,0]];return[0,K,J]}}}else +if(3===j&&g){var +o=g[2];if(o){var +p=o[2];if(p){var +b=p[1],a=o[1],e=g[1],N=p[2],D=c(d,e,a);if(0===D)var +E=c(d,a,b),O=0===E?[0,a,0]:0<=E?[0,b,[0,a,0]]:[0,a,[0,b,0]],q=O;else +if(0<=D){var +F=c(d,e,b);if(0===F)var +r=[0,a,[0,e,0]];else +if(0<=F)var +G=c(d,a,b),P=0===G?[0,a,[0,e,0]]:0<=G?[0,b,[0,a,[0,e,0]]]:[0,a,[0,b,[0,e,0]]],r=P;else +var +r=[0,a,[0,e,[0,b,0]]];var +q=r}else{var +H=c(d,a,b);if(0===H)var +s=[0,e,[0,a,0]];else +if(0<=H)var +I=c(d,e,b),Q=0===I?[0,e,[0,a,0]]:0<=I?[0,b,[0,e,[0,a,0]]]:[0,e,[0,b,[0,a,0]]],s=Q;else +var +s=[0,e,[0,a,[0,b,0]]];var +q=s}return[0,q,N]}}}var +z=j>>1,A=x(z,g),L=A[1],B=x(j-z|0,A[2]),i=L,h=B[1],f=0,M=B[2];for(;;){if(i){if(h){var +t=h[2],u=h[1],v=i[2],l=i[1],w=c(d,l,u);if(0===w){var +i=v,h=t,f=[0,l,f];continue}if(0>>0))switch(b){case +0:return[0,0,a];case +1:if(a)return[0,[0,0,a[1],0,1],a[2]];break;case +2:if(a){var +d=a[2];if(d)return[0,[0,[0,0,a[1],0,1],d[1],0,2],d[2]]}break;default:if(a){var +e=a[2];if(e){var +g=e[2];if(g)return[0,[0,[0,0,a[1],0,1],e[1],[0,0,g[1],0,1],2],g[2]]}}}var +h=b/2|0,i=j(h,a),c=i[2],l=i[1];if(c){var +n=c[1],k=j((b-h|0)-1|0,c[2]),o=k[2];return[0,f(l,n,k[1]),o]}throw[0,m,h7]};return j(a1(u),u)[1]}var +v=q[1];return b(v,b(s,b(p,b(i,h(g)))))}return b(s,b(p,b(i,h(g))))}return b(p,b(i,h(g)))}return b(i,h(g))}return h(g)}return t}function +N(h,g){var +c=g,e=h;for(;;){var +d=a(e,0);if(d){var +f=d[2],c=b(d[1],c),e=f;continue}return c}}function +$(a){return N(a,t)}function +A(a,d){if(a){var +b=a[1],c=k(a[2],a[3]);return[0,b,function(a){return A(c,a)}]}return 0}function +aa(a){var +b=k(a,0);return function(a){return A(b,a)}}return[0,t,Q,R,b,h,u,j,o,F,p,G,S,r,H,z,I,J,K,w,x,y,T,l,D,E,O,l,D,i,U,Z,V,W,X,Y,_,function(j,i){var +a=i,b=0;for(;;){if(a){var +d=a[3],f=a[2],k=a[1],g=c(e[1],f,j);if(0!==g){if(0<=g){var +a=k,b=[0,f,d,b];continue}var +a=d;continue}var +h=[0,f,d,b]}else +var +h=b;return function(a){return A(h,a)}}},aa,N,$]}J(0);function +bs(a){return[0,0,0]}function +bt(a){a[1]=0;a[2]=0;return 0}function +aS(b,a){a[1]=[0,b,a[1]];a[2]=a[2]+1|0;return 0}function +a4(a){var +b=a[1];if(b){var +c=b[1];a[1]=b[2];a[2]=a[2]-1|0;return[0,c]}return 0}function +a5(b){var +a=b[1];return a?[0,a[1]]:0}var +h_=[v,h9,J(0)];function +cD(a){a[1]=0;a[2]=0;a[3]=0;return 0}function +ec(d,a){var +b=[0,d,0],c=a[3];return c?(a[1]=a[1]+1|0,c[2]=b,a[3]=b,0):(a[1]=1,a[2]=b,a[3]=b,0)}var +ia=[v,h$,J(0)];function +ib(a){throw ia}function +ic(b){var +d=b[1];b[1]=ib;try{var +c=a(d,0);oc(b,c);return c}catch(a){a=Z(a);b[1]=function(b){throw a};throw a}}function +cE(a){var +b=1<=a?a:1,c=br>>0))e=1}else +if(65<=d)e=1}else{var +f=0;if(32!==d)if(43<=d)switch(d-43|0){case +5:if(a<(c+2|0)&&1>>0){if(33<(o-61|0)>>>0)q=1}else +if(2===o)q=1;if(!q){var +j=j+1|0;continue}var +e=aC(k),a=[0,0],u=Y(e)-1|0,A=0;if(!(u<0)){var +i=A;for(;;){var +f=bQ(e,i),g=0;if(32<=f){var +m=f-34|0,r=0;if(58>>0){if(93<=m)r=1}else +if(56<(m-1|0)>>>0){g=1;r=1}if(!r){var +n=1;g=2}}else +if(11<=f){if(13===f)g=1}else +if(8<=f)g=1;switch(g){case +0:var +n=4;break;case +1:var +n=2;break}a[1]=a[1]+n|0;var +E=i+1|0;if(u!==i){var +i=E;continue}break}}if(a[1]===Y(e)){var +s=Y(e),t=B(s);aL(e,0,t,0,s);var +x=t}else{var +b=B(a[1]);a[1]=0;var +v=Y(e)-1|0,C=0;if(!(v<0)){var +h=C;for(;;){var +c=bQ(e,h),d=0;if(35<=c)if(92===c)d=2;else +if(dB<=c)d=1;else +d=3;else +if(32<=c)if(34<=c)d=2;else +d=3;else +if(14<=c)d=1;else +switch(c){case +8:w(b,a[1],92);a[1]++;w(b,a[1],98);break;case +9:w(b,a[1],92);a[1]++;w(b,a[1],116);break;case +10:w(b,a[1],92);a[1]++;w(b,a[1],110);break;case +13:w(b,a[1],92);a[1]++;w(b,a[1],114);break;default:d=1}switch(d){case +1:w(b,a[1],92);a[1]++;w(b,a[1],48+(c/ci|0)|0);a[1]++;w(b,a[1],48+((c/10|0)%10|0)|0);a[1]++;w(b,a[1],48+(c%10|0)|0);break;case +2:w(b,a[1],92);a[1]++;w(b,a[1],c);break;case +3:w(b,a[1],c);break}a[1]++;var +D=h+1|0;if(v!==h){var +h=D;continue}break}}var +x=b}var +p=O(x)}var +y=l(p),z=aR(y+2|0,34);aM(p,0,z,1,y);return O(z)}}function +eg(d,g){var +h=cw(g),e=eh?eh[1]:70;switch(d[2]){case +0:var +a=102;break;case +1:var +a=101;break;case +2:var +a=69;break;case +3:var +a=f0;break;case +4:var +a=71;break;case +5:var +a=e;break;case +6:var +a=104;break;case +7:var +a=72;break;default:var +a=70}var +c=ed(16);a6(c,37);switch(d[1]){case +0:break;case +1:a6(c,43);break;default:a6(c,32)}if(8<=d[2])a6(c,35);a6(c,46);G(c,b(f+h));a6(c,a);return ef(c)}function +b2(n,a){if(13<=n){var +g=[0,0],h=l(a)-1|0,o=0;if(!(h<0)){var +c=o;for(;;){if(!(9<(aj(a,c)+f3|0)>>>0))g[1]++;var +r=c+1|0;if(h!==c){var +c=r;continue}break}}var +i=g[1],j=B(l(a)+((i-1|0)/3|0)|0),k=[0,0],d=function(a){aZ(j,k[1],a);k[1]++;return 0},e=[0,((i-1|0)%3|0)+1|0],m=l(a)-1|0,p=0;if(!(m<0)){var +b=p;for(;;){var +f=aj(a,b);if(9<(f+f3|0)>>>0)d(f);else{if(0===e[1]){d(95);e[1]=3}e[1]+=-1;d(f)}var +q=b+1|0;if(m!==b){var +b=q;continue}break}}return O(j)}return a}function +jP(b,c){switch(b){case +1:var +a=i2;break;case +2:var +a=i3;break;case +4:var +a=i5;break;case +5:var +a=i6;break;case +6:var +a=i7;break;case +7:var +a=i8;break;case +8:var +a=i9;break;case +9:var +a=i_;break;case +10:var +a=i$;break;case +11:var +a=ja;break;case +0:case +13:var +a=i1;break;case +3:case +14:var +a=i4;break;default:var +a=jb}return b2(b,cl(a,c))}function +jQ(b,c){switch(b){case +1:var +a=jq;break;case +2:var +a=jr;break;case +4:var +a=jt;break;case +5:var +a=ju;break;case +6:var +a=jv;break;case +7:var +a=jw;break;case +8:var +a=jx;break;case +9:var +a=jy;break;case +10:var +a=jz;break;case +11:var +a=jA;break;case +0:case +13:var +a=jp;break;case +3:case +14:var +a=js;break;default:var +a=jB}return b2(b,cl(a,c))}function +jR(b,c){switch(b){case +1:var +a=jD;break;case +2:var +a=jE;break;case +4:var +a=jG;break;case +5:var +a=jH;break;case +6:var +a=jI;break;case +7:var +a=jJ;break;case +8:var +a=jK;break;case +9:var +a=jL;break;case +10:var +a=jM;break;case +11:var +a=jN;break;case +0:case +13:var +a=jC;break;case +3:case +14:var +a=jF;break;default:var +a=jO}return b2(b,cl(a,c))}function +jS(b,c){switch(b){case +1:var +a=jd;break;case +2:var +a=je;break;case +4:var +a=jg;break;case +5:var +a=jh;break;case +6:var +a=ji;break;case +7:var +a=jj;break;case +8:var +a=jk;break;case +9:var +a=jl;break;case +10:var +a=jm;break;case +11:var +a=jn;break;case +0:case +13:var +a=jc;break;case +3:case +14:var +a=jf;break;default:var +a=jo}return b2(b,nR(a,c))}function +aw(d,i,b){function +j(c){switch(d[1]){case +0:var +a=45;break;case +1:var +a=43;break;default:var +a=32}return nM(b,i,a)}function +s(c){var +a=nC(b);return 3===a?b<0.?jU:jV:4<=a?jW:c}switch(d[2]){case +5:var +f=hh(eg(d,i),b),e=0,x=l(f);for(;;){if(e===x)var +r=0;else{var +k=D(f,e)-46|0,m=0;if(23>>0){if(55===k)m=1}else +if(21<(k-1|0)>>>0)m=1;if(!m){var +e=e+1|0;continue}var +r=1}var +y=r?f:aP(f,jT);return s(y)}case +6:return j(0);case +7:var +h=aC(j(0)),g=Y(h);if(0===g)var +q=h;else{var +n=B(g),o=g-1|0,u=0;if(!(o<0)){var +a=u;for(;;){var +c=bQ(h,a),t=0;if(97<=c&&!(g2>>0)return a;var +a=a+1|0;continue}}function +q(g,f){var +a=f;for(;;){if(a===e)return a;var +c=D(b,a),d=0;if(48<=c){if(!(58<=c))d=1}else +if(45===c)d=1;if(d){var +a=a+1|0;continue}return a}}var +f=h(0),m=p(f,f),c=ea(b,f,m-f|0),d=h(m),i=q(d,d);if(d===i)var +k=0;else +try{var +r=n0(ea(b,d,i-d|0)),k=r}catch(a){a=Z(a);if(a[1]!==au)throw a;var +k=g(0)}if(h(i)!==e)g(0);var +o=0;if(aE(c,j$)&&aE(c,ka))var +n=aE(c,kb)?aE(c,kc)?aE(c,kd)?aE(c,ke)?g(0):1:2:3:0;else +o=1;if(o)var +n=4;return[0,k,n]}J(0);try{var +ns=cs(nr),ej=ns}catch(a){a=Z(a);if(a!==P)throw a;try{var +nq=cs(np),ei=nq}catch(a){a=Z(a);if(a!==P)throw a;var +ei=kg}var +ej=ei}var +kh=hV(ej,82),b4=[dC,function(z){var +p=on(0),c=[0,af(55,0),0],k=0===p.length-1?[0,0]:p,m=k.length-1,a=0;for(;;){e(c[1],a)[1+a]=a;var +y=a+1|0;if(54!==a){var +a=y;continue}var +i=[0,kf],n=54+d4(55,m)|0,u=0;if(!(n<0)){var +d=u;for(;;){var +g=d%55|0,o=oa(d,m),v=e(k,o)[1+o],j=aP(i[1],b(f+v));i[1]=n7(j,0,l(j));var +h=i[1],q=D(h,3)<<24,r=D(h,2)<<16,s=D(h,1)<<8,t=((D(h,0)+s|0)+r|0)+q|0,w=(e(c[1],g)[1+g]^t)&f$;e(c[1],g)[1+g]=w;var +x=d+1|0;if(n!==d){var +d=x;continue}break}}c[2]=0;return c}}];function +ki(i,l){var +m=i?i[1]:kh,b=16;for(;;){if(!(l<=b)&&!(d7<(b*2|0))){var +b=b*2|0;continue}if(m){var +j=hq(b4),a=ch===j?b4[1]:dC===j?ic(b4):b4;a[2]=(a[2]+1|0)%55|0;var +c=a[2],d=e(a[1],c)[1+c],f=(a[2]+24|0)%55|0,g=(e(a[1],f)[1+f]+(d^(d>>>25|0)&31)|0)&f$,h=a[2];e(a[1],h)[1+h]=g;var +k=g}else +var +k=0;return[0,0,af(b,0),k,b]}}var +cK=[v,kj,J(0)],b5=0,ek=-1;function +bw(a,b){a[13]=a[13]+b[3]|0;return ec(b,a[28])}var +el=1000000010;function +cL(b,a){return o(b[17],a,0,l(a))}function +b6(b){return a(b[19],0)}function +em(a,c,b){a[9]=a[9]-c|0;cL(a,b);a[11]=0;return 0}function +b7(c,a){var +b=aE(a,kk);return b?em(c,l(a),a):b}function +a8(b,c,f){var +g=c[3],h=c[2];b7(b,c[1]);b6(b);b[11]=1;var +d=(b[6]-f|0)+h|0,e=b[8],i=n3(e,d)?e:d;b[10]=i;b[9]=b[6]-b[10]|0;a(b[21],b[10]);return b7(b,g)}function +en(b,a){return a8(b,kl,a)}function +bx(b,c){var +d=c[2],e=c[3];b7(b,c[1]);b[9]=b[9]-d|0;a(b[20],d);return b7(b,e)}function +eo(b){for(;;){var +s=b[28][2],O=s?[0,s[1]]:0;if(O){var +q=O[1],r=q[1],c=q[2],ac=0<=r?1:0,aa=q[3],ab=b[13]-b[12]|0,P=ac||(b[9]<=ab?1:0);if(P){var +g=b[28],n=g[2];if(n){if(n[2]){var +Q=n[2];g[1]=g[1]-1|0;g[2]=Q}else +cD(g);var +m=0<=r?r:el;if(typeof +c==="number")switch(c){case +0:var +y=a5(b[3]);if(y){var +z=y[1][1],A=function(b,a){if(a){var +c=a[1],d=a[2];return n4(b,c)?[0,b,a]:[0,c,A(b,d)]}return[0,b,0]};z[1]=A(b[6]-b[9]|0,z[1])}break;case +1:a4(b[2]);break;case +2:a4(b[3]);break;case +3:var +B=a5(b[2]);if(B)en(b,B[1][2]);else +b6(b);break;case +4:if(b[10]!==(b[6]-b[9]|0)){var +e=b[28],h=e[2];if(h){var +t=h[1];if(h[2]){var +R=h[2];e[1]=e[1]-1|0;e[2]=R;var +i=[0,t]}else{cD(e);var +i=[0,t]}}else +var +i=0;if(i){var +x=i[1],T=x[1];b[12]=b[12]-x[3]|0;b[9]=b[9]+T|0}}break;default:var +C=a4(b[5]);if(C)cL(b,a(b[25],C[1]))}else +switch(c[0]){case +0:em(b,m,c[1]);break;case +1:var +d=c[2],j=c[1],D=d[1],U=d[2],E=a5(b[2]);if(E){var +F=E[1],f=F[2];switch(F[1]){case +0:bx(b,j);break;case +1:a8(b,d,f);break;case +2:a8(b,d,f);break;case +3:if(b[9]<(m+l(D)|0))a8(b,d,f);else +bx(b,j);break;case +4:if(b[11]||!(b[9]<(m+l(D)|0)||((b[6]-f|0)+U|0)>>0))en(b,w)}else +b6(b)}var +_=b[9]-Z|0,$=1===M?1:b[9]>>0){fp(0);var +h=a[17],g=a[13]}else{switch(f){case +0:var +d=[0,a[13],a[17]];break;case +1:var +d=[0,a[19],a[23]];break;default:var +d=[0,a[25],a[29]]}var +h=d[2],g=d[1]}c(g,[0,b],0);c(h,[0,b],i);return a$(b)}function +fs(c){var +a=ak.fullscreenElement,b=b9(a)?0:[0,a];return b?1:0}var +ms=ba(0,fs(0))[2];bC(0,kZ,function(a){return c(ms,0,fs(0))},ak);var +mt=ah(0)[2];bC(0,k5,function(a){return c(mt,0,0)},ak);function +db(a){return lt.now()/gx}db(0);function +ft(a){return db(0)}function +fu(a){return db(0)-a}d5(function(a){return ou(a)});eF(mx,[0,[v,mu,J(0)],0,mw,mv]);cu(my);cu(mz);try{cu(nm)}catch(a){a=Z(a);if(a[1]!==au)throw a}try{cu(nl)}catch(a){a=Z(a);if(a[1]!==au)throw a}ki(0,7);eE(mA);eE(mB);var +mC=[I,0.,0.];function +dc(a){return[I,a[1],a[2]]}function +ai(a){return[0,a[1],a[2]]}function +fv(b,a){return[I,b[1]+a[1],b[2]+a[2]]}function +ax(b,a){return[I,b[1]-a[1],b[2]-a[2]]}function +bG(b,a){return[I,b*a[1],b*a[2]]}function +bc(a){return nN(a[1],a[2])}function +aU(a,c,b){return[I,a[1]+b*(c[1]-a[1]),a[2]+b*(c[2]-a[2])]}function +fw(b,a){return bG(1./a,b)}function +fx(b,a){if(b[1]>>0)return 0.;switch(a){case +0:return 1.;case +1:return 4.;default:return 1.}})}),k=a(bd[3],y),q=b-1|0,z=0;if(!(q<0)){var +f=z;for(;;){if(0===f)var +G=e(d,0)[1],i=ax(bG(6.,e(d,1)[2]),G);else +if((f+1|0)===b)var +t=b+1|0,K=e(d,b)[1+b],L=e(d,t)[1+t],i=ax(bG(6.,K),L);else +var +u=f+1|0,i=bG(6.,e(d,u)[1+u]);var +H=i[2];o(bd[10],k,[0,f+1|0,b+1|0],i[1]);o(bd[10],k,[0,f+1|0,b+2|0],H);var +J=f+1|0;if(q!==f){var +f=J;continue}break}}var +r=a(bd[12],k),A=c(bd[6],r,b+1|0)[2],s=b+1|0,B=c(bd[6],r,b+2|0)[2],l=af(b+2|0,e(d,s)[1+s]),C=1;if(!(b<1)){var +g=C;for(;;){var +E=[I,g6(A,g-1|0),g6(B,g-1|0)];e(l,g)[1+g]=E;var +F=g+1|0;if(b!==g){var +g=F;continue}break}}var +D=e(d,0)[1];e(l,0)[1]=D;var +j=[0,l]}else +var +j=[1,378784796];if(0===j[0]){var +h=j[1],x=n?2:1,N=m?h.length-1-2|0:h.length-1-1|0;return[0,cA((N-x|0)+1|0,function(i){var +a=i+x|0,b=a-1|0,c=e(h,b)[1+b],f=e(h,a)[1+a],g=a-1|0,j=e(d,g)[1+g],k=e(d,a)[1+a],l=aU(c,f,0.33333333333333331);return[0,j,k,l,aU(c,f,dM)]})]}return j}function +fC(a,b){var +d=a[1],e=a[2];a[3]=ft(0);e5(d);a[1]=R.setInterval(function(b){return c(e,0,fu(a[3]))},b*gx|0);return 0}function +fD(a){return fu(a[3])}var +mY=cb("offsetWidth"),mZ=cb("offsetHeight"),m0=eV("outerHTML");function +fE(b){var +a=eY(lm,0,[0,b],0),c=eH(a9(cY,a));return[0,a,fi(0,c,da(0,0,0,k0,function(b){return eH(a9(cY,a))},a))]}function +fF(a){var +b=eT(0,a);return _(function(a){if(!ca("nav",a)&&!ca("ul",a))return fF(a);a.remove(a);return 0},b)}var +be=gd,fG=[0,dc(m1),0.,0.,0.];function +dd(e,d,c,b,a){return[0,[I,b,a],d,(f8-e)*g0,c]}function +aV(a,b){return[0,b,a[2],a[3],a[4]]}function +fH(a){return a[1]}function +S(a){var +b=a[3],c=a[2];return fv(a[1],[I,c*Math.cos(b),c*Math.sin(b)])}function +m3(b){function +d(f,k){var +c=k[2],d=k[1],v=c?[0,a(b[2],c[1][2])]:0;if(d){var +g=d[2];if(g){var +h=g[2];if(h){var +n=h[2];if(n){var +o=n[1],i=h[1],p=g[1],q=d[1],r=a(b[2],f),s=a(b[2],q),t=a(b[2],p),u=a(b[2],i),j=fB(v,0,[0,a(b[2],o),[0,u,[0,t,[0,s,[0,r,0]]]]]);if(0===j[0]){var +l=j[1];if(0>>0))switch(c){case +0:return nh;case +1:return ni;default:return nj}}return ng},as),cq=[0,af,[0,ag,[0,as,[0,e0(0,0,0),[0,ao,[0,cj,[0,ar,[0,cl,0]]]]]]]];hl(at,k$,b0([0,e0(0,0,0),cq]));var +h=[0,an,aq,cg,cc,cp]}else +var +h=cX(0,"No sidebar");var +cr=h[4],cs=ab(function(a){return fW},cr),ct=h[3],cu=ab(function(a){return-116259436},ct),cv=bF(h[2]),cw=ab(function(a){return[0,gb,a]},cv),cx=bF(h[1]),cy=ab(function(a){return[0,gH,a]},cx);if(b9(e)){var +cz=[0,e,0],cA=cV(dn)?"null":bB(dn)?"undefined":dn.toString();return c1(c2,lr,c3([0,cA,cz]))}var +A=nk(0);if(0===A[0]){var +au=A[1],av=ah(0),aw=av[1],cB=av[2];if(hi(10,ci,0,eM(e3(e4)))===gt)bC(0,lu,function(a){return c(cB,0,a.data)},au);cZ(0,eX,gM,e);cZ(0,le,gM,e);eW(ld,a9(mY,e),e);eW(lc,a9(mZ,e),e);cZ(0,eX,f,e);var +ad=ca(li,e)?e:cX(0,"Expected canvas element but found: ".concat(eS(e))),bZ=function(b,a){return[0,b,a]},s=0,t=0,u=0,a7=fN?fN[1]:1,M=ba(0,[0,0.,0.]),a8=M[2],bc=M[1],N=ah(0),bd=N[2],bf=N[1],O=ba(0,0),bg=O[2],bh=O[1],P=ba(0,0),bk=P[2],bl=P[1],Q=ah(0),bm=Q[2],bn=Q[1],S=ah(0),bo=S[2],bp=S[1],U=ba(0,0),bq=U[2],br=U[1],V=ah(0),bs=V[2],bt=V[1],W=ah(0),bu=W[2],bv=W[1],Y=ba(0,0),bw=Y[2],bx=Y[1],Z=ah(0),by=Z[2],bz=Z[1],$=ah(0),b=[0,e,a7,bZ,mr,0,bc,a8,bf,bd,bh,bg,bl,bk,bn,bm,bp,bo,br,bq,bt,bs,bv,bu,bx,bw,bz,by,$[1],$[2]],bG=0,bJ=[0,bb(u,t,s,ak,eL,function(d){if(!a(bE,b[10])){var +c=0;if(!a(bE,b[12])&&!a(bE,b[18])&&!a(bE,b[24]))c=1;if(!c)return fr(b,d)}return 0}),bG],bK=0,bM=function(a){return fq(bK,b,a)},bO=[0,bb(u,t,s,b[1],k3,bM),bJ],bP=1,bQ=function(a){return fq(bP,b,a)},bR=[0,bb(u,t,s,b[1],k2,bQ),bO],bS=function(c){var +a=aI(0);ce(a,b,c);return a$(a)},bT=[0,bb(u,t,s,b[1],k4,bS),bR],bU=function(a){return fr(b,a)},bV=[0,bb(u,t,s,b[1],eL,bU),bT],bW=function(h){var +a=aI(0),i=ce(a,b,h),e=h.button;if(2>>0){fp(0);var +g=b[15],f=b[13]}else{switch(e){case +0:var +d=[0,b[13],b[15]];break;case +1:var +d=[0,b[19],b[21]];break;default:var +d=[0,b[25],b[27]]}var +g=d[2],f=d[1]}c(f,[0,a],1);c(g,[0,a],i);return a$(a)};b[5]=[0,bb(u,t,s,b[1],k1,bW),bV];fm(function(d){var +c=b[5];return _(function(b){return a(b,0)},c)},e);var +b1=b[14],b2=ab(function(a){return[0,gl,a]},b1),b3=b[16],b4=ab(function(a){return[0,gp,a]},b3),j=b[6],l=b[12],ae=function(b,a){return b?[0,a]:0},b5=0,aX=function(e,b){c(d[15],e,l);c(d[15],e,j);var +g=a(d[9],l),h=g||a(d[9],j);if(h){var +i=a(d[8],j),m=a(d[8],l),n=c(k[7],m,i);c(d[10],b,n)}var +o=a(d[13],l),f=o||a(d[13],j);if(f){var +p=a(d[12],j),q=ae(a(d[12],l),p);return c(d[14],b,q)}return f},aY=a(d[8],l),aZ=c(i[9],r,aY),a0=a(d[8],j),y=c(i[9],aZ,a0);c(d[15],y,l);c(d[15],y,j);var +a1=a(d[8],j),a3=a(d[8],l),a4=c(k[7],a3,a1),a5=a(d[12],j),a6=ae(a(d[12],l),a5),g=aJ(d[1],b5,y,a4,a6,aX),b6=c_([0,b2,[0,b4,0]]),ax=function(a,b){return a?[0,[0,ge,[0,b,a[1]]]]:0},aO=function(b,e){c(d[15],b,n);c(d[15],b,g);var +h=a(d[9],n),i=h||a(d[9],g);if(i){var +j=a(d[8],n),l=a(d[8],g),m=c(k[7],l,j);c(d[10],e,m)}var +f=a(d[12],n);if(f){var +p=f[1],q=[0,ax(a(d[12],g),p)];return o(d[21],b,e,q)}return 0},aP=a(d[8],g),aQ=c(i[9],r,aP),aR=a(d[8],n),x=c(i[9],aQ,aR);c(d[15],x,n);c(d[15],x,g);var +aS=a(d[8],n),aU=a(d[8],g),aV=c(k[7],aU,aS),J=a(d[12],n);if(J)var +aW=J[1],K=[0,ax(a(d[12],g),aW)];else +var +K=0;var +m=am(d[19],x,aV,K,aO),I=function(a){return a},E=function(c,b){return b?a(c,b[1]):0},aB=function(e,b){c(d[15],e,m);if(a(d[9],m)){var +f=a(d[8],m);c(d[10],b,f)}var +g=E(I,a(d[12],m));return o(d[21],e,b,g)},aC=a(d[8],m),F=c(i[9],r,aC);c(d[15],F,m);var +aE=E(I,a(d[12],m)),aF=a(d[8],m),aG=am(d[19],F,aF,aE,aB),cC=c_([0,aw,[0,b6,[0,aG,[0,cw,[0,cy,[0,cs,[0,cu,[0,h[5],0]]]]]]]]),p=ab(function(e,b){var +d=b[1];if(typeof +e==="number"){if(!(fW<=e)){if(hi(10,ci,0,eM(e3(e4)))===gt){var +E=b[2],F=a9(m0,bD(0,[0,[0,[0,"xmlns","http://www.w3.org/2000/svg"],[0,[0,"xmlns:xlink","http://www.w3.org/1999/xlink"],0]]],"svg",a2(function(d){var +f=b[6],e=X[3];if(bN===f){var +c=[0,0],g=function(a){var +b=de(0,[0,[0,[0,dK,a],0]],0);c[1]=[0,b,c[1]];return bA},h=a(bH[1],g);o(e,d,[0,bH[2],bH[3],bH[4],bH[5]],h);return bD(0,[0,[0,[0,dz,be],[0,[0,dt,be],0]]],"g",c[1])}if(dy<=f){var +i=function(a){return 0},j=a(bi[1],i),k=o(e,d,[0,bi[2],bi[3],bi[4],bi[5]],j);return de(0,[0,[0,[0,dz,be],[0,[0,dt,be],[0,[0,dK,a(bi[6],k)],0]]]],0)}function +l(a){return 0}var +m=a(bj[1],l),n=o(e,d,[0,bj[2],bj[3],bj[4],bj[5]],m);return de(0,[0,[0,[0,dz,be],[0,[0,dt,be],[0,[0,dK,a(bj[6],n)],0]]]],0)},E)));aT(lf,0,[0,[0,[0,k8,"data:image/svg+xml;base64,".concat(R.btoa(F))],[0,[0,"download","out.svg"],0]]],0).click()}return b}if(typeof +d!=="number"){var +i=0,g=b[2],D=d[1];for(;;){if(g){var +m=g[2],n=g[1];if(a(X[1],n)!==D){var +i=[0,n,i],g=m;continue}var +g=m;continue}var +C=d8(i);return[0,1,C,b[3],b[4],b[5],b[6]]}}if(d)return b}else{var +f=e[1];if(gH<=f){if(!(gp<=f)){if(bL<=f)return[0,b[1],b[2],b[3],b[4],b[5],e[2]];var +l=e[2];if(typeof +d==="number")return[0,b[1],b[2],b[3],l,b[5],b[6]];var +M=d[1],N=[0,b[1],b[2],b[3],l,b[5],b[6]];return fM(M,N,function(a){return[0,a[1],l,a[3],a[4]]})}if(gb<=f){var +j=e[2];if(typeof +d==="number")return[0,b[1],b[2],b[3],b[4],j,b[6]];var +G=d[1],H=[0,b[1],b[2],b[3],b[4],j,b[6]];return fM(G,H,function(a){return[0,a[1],a[2],(f8-j)*g0,a[4]]})}if(typeof +d==="number"&&!d){var +p=e[2],I=fD(q);e5(q[1]);if(a(al[5],b[3])){var +J=dl(b,p,I,b[3]),k=c(X[2],[0,al[6]],J),K=a(X[1],k);au.postMessage([0,g3,[0,K,a(X[6],k)]],b8);return[0,1,[0,k,b[2]],al[1],b[4],b[5],b[6]]}var +r=al[1],s=dm(p,b[2]);if(s){var +L=a(X[1],s[1][2]);return[0,[0,L],b[2],r,b[4],b[5],b[6]]}return[0,1,b[2],r,b[4],b[5],b[6]]}}else{if(!(ge<=f)){if(g3<=f){var +B=e[2],U=B[2],V=B[1],W=b[2],Y=a2(function(b){return V===a(X[1],b)?c(X[7],b,U):b},W);return[0,b[1],Y,b[3],b[4],b[5],b[6]]}c1(c2,lq,c3([0,e[2],0]));return b}if(gl<=f){var +h=e[2],O=h[2],P=h[1];if(typeof +d!=="number"){var +z=dm(h,b[2]);if(z){var +S=a(X[1],z[1][2]);fC(q,gQ);return[0,[0,S],b[2],b[3],b[4],b[5],b[6]]}return[0,1,b[2],b[3],b[4],b[5],b[6]]}if(d){fC(q,gQ);var +t=b[4],u=b[5],w=dm(h,b[2]),v=0.;if(w)var +x=ai(w[1][1]),y=dd(u,t,v,x[1],x[2]);else +var +y=dd(u,t,v,P,O);var +Q=c(al[2],y,b[3]);return[0,0,b[2],Q,b[4],b[5],b[6]]}}else +if(typeof +d==="number"&&!d){var +A=e[2],T=dl(b,A[2],A[1],b[3]);return[0,b[1],b[2],T,b[4],b[5],b[6]]}}}return b},cC),w=[0,bI],cD=0,G=function(b){return b?(w[1]=a(b[1],w[1]),[0,w[1]]):0},aK=function(e,b){c(d[15],e,p);if(a(d[9],p)){var +f=a(d[8],p);c(d[10],b,f)}var +g=G(a(d[12],p));return o(d[21],e,b,g)},aL=a(d[8],p),H=c(i[9],r,aL);c(d[15],H,p);var +aM=G(a(d[12],p)),aN=a(d[8],p),L=fi(cD,bI,am(d[19],H,aN,aM,aK)),cE=[0,h[4],0],cF=[0,ab(function(a){return 0},aw),cE],cG=h[5],cH=[0,ab(function(a){return 0},cG),cF],cI=bF(h[1]),cJ=[0,ab(function(a){return 0},cI),cH],cK=bF(h[2]),cL=[0,ab(function(a){return 0},cK),cJ],cM=bF(g),cN=c_([0,ab(function(a){return 0},cM),cL]),cO=0,aA=function(b){return b?fQ(ad,g,q,a(mk,L)):0},D=o(a_[6],cO,cN,aA);if([0,D])a(fk,D);fQ(ad,g,q,bI);a(fk,o(fh,0,L,function(a){return 0}));return 0}return eU(e,[0,aT(lo,0,0,[0,eR(0,A[1].message),0]),0])}}};hH(0);return}(function(){return this}())); diff --git a/content/pages/script.it/script.rst b/content/pages/script.it/script.rst new file mode 100755 index 0000000..39617e1 --- /dev/null +++ b/content/pages/script.it/script.rst @@ -0,0 +1,26 @@ +.. -*- mode: rst -*- +.. -*- coding: utf-8 -*- + +Ardoise calligraphique +====================== + +:status: hidden +:save_as: pages/script.it/index.html +:url: pages/script.it + +.. raw:: html + + + + +
+ +
+ +Cliquez dans l'ardoise pour commencer à dessiner ! diff --git a/content/pages/script.it/worker.js b/content/pages/script.it/worker.js new file mode 100755 index 0000000..32d6514 --- /dev/null +++ b/content/pages/script.it/worker.js @@ -0,0 +1,2351 @@ +// Generated by js_of_ocaml 3.8.0 +(function(f){"use strict";var +db="%Li",dc=" : flags Open_text and Open_binary are not compatible",dW="Invalid_argument",bV=1255,du=255,dv=0x800,V=0xffff,bU="jsError",U=0x8000,dV="%ni",dG=12520,bT=256,dU=-646333223,ds="unsupported bigarray kind",dt="End_of_file",da="Unix.Unix_error",dr="Failure",dF="infinity",af=0xff,a0=1000,c$="Stack_overflow",dE="Row out of bounds.",e="",bY="^",dT=122,L="0",c_=-97,aJ=0x3f,c9="Not_found",bS=0xf,a2=128,dp=-48,dq=0xdc00,dR="Sys_blocked_io",dS="fd ",dn="Worker.onmessage is undefined",dD="Match_failure",p=248,c8="static/",dl="bigarray kind can't be represented by a Gg.Ba.scalar_type",u="camlinternalFormat.ml",dm="Division_by_zero",dQ=">",bX=252,dP=1027,dk="Sys_error",ay=".",aI="+",dC=0xf0,dO=246,dM="Column out of bounds.",dN="%u",dj="%d",c7=1026,dB="%li",ax="shapes/matrix/Matrix.ml",di="buffer.ml",bg="int_of_string",dL="_bigarray",dA=-32,b2=127,a1=1024,ac=" ",P=0x80,b1="e",c6="Undefined_recursive_module",dg=120,dh=103,dK=" : flags Open_rdonly and Open_wronly are not compatible",dJ="([^/]*)",bR=512,az="-",bW="nan",df=0x7ff0,dz=0xe0,dI=" : file already exists",dy=0xdfff,ae=0xffffff,bQ="compare: functional value",dx="Assert_failure",ad="/",de="0x",c5="%i",dH="Out_of_memory",an=254,dw=1073741823,b0="index out of bounds",dd=100,bh=250,bZ="_bigarr02";function +iY(b,a){throw[0,b,a]}function +aN(b,a){if(b==0)return e;if(a.repeat)return a.repeat(b);var +d=e,c=0;for(;;){if(b&1)d+=a;b>>=1;if(b==0)return d;a+=a;c++;if(c==9)a.slice(0,1)}}function +bn(c,b,a){var +d=String.fromCharCode;if(b==0&&a<=4096&&a==c.length)return d.apply(null,c);var +f=e;for(;0b2)return false;return true}else +return!/[^\x00-\x7f]/.test(a)}function +cg(f){for(var +k=e,c=e,h,g,i,a,b=0,j=f.length;bbR){c.substr(0,1);k+=c;c=e;k+=f.slice(b,d)}else +c+=f.slice(b,d);if(d==j)break;b=d}a=1;if(++b=0xd7ff&&a<0xe000)a=2}else{a=3;if(++b0x10ffff)a=3}}}}}if(a<4){b-=a;c+="\ufffd"}else +if(a>V)c+=String.fromCharCode(0xd7c0+(a>>10),dq+(a&0x3FF));else +c+=String.fromCharCode(a);if(c.length>a1){c.substr(0,1);k+=c;c=e}}return k+c}function +ag(c,a,b){this.t=c;this.c=a;this.l=b}ag.prototype.toString=function(){switch(this.t){case +9:return this.c;default:aB(this);case +0:if(eo(this.c)){this.t=9;return this.c}this.t=8;case +8:return this.c}};ag.prototype.toUtf16=function(){var +a=this.toString();if(this.t==9)return a;return cg(a)};ag.prototype.slice=function(){var +a=this.t==4?this.c.slice():this.c;return new +ag(this.t,a,this.l)};function +d7(a){return new +ag(0,a,a.length)}function +a(a){return d7(a)}function +cd(c,b){iY(c,a(b))}var +r=[0];function +w(a){cd(r.Invalid_argument,a)}function +aL(){w(b0)}function +dY(b,a){if(a<0||a>=b.length-1)aL();return b[a+1]}function +bi(b){if(f.Uint8Array)var +c=new(f.Uint8Array)(b.l);else +var +c=new +Array(b.l);var +e=b.c,d=e.length,a=0;for(;a=b.l||b.t==2&&c>=b.c.length)){b.c=d.t==4?bn(d.c,e,c):e==0&&d.c.length==c?d.c:d.c.substr(e,c);b.t=b.c.length==b.l?0:2}else +if(b.t==2&&f==b.c.length){b.c+=d.t==4?bn(d.c,e,c):e==0&&d.c.length==c?d.c:d.c.substr(e,c);b.t=b.c.length==b.l?0:2}else{if(b.t!=4)bi(b);var +g=d.c,h=b.c;if(d.t==4)if(f<=e)for(var +a=0;a=0;a--)h[f+a]=g[e+a];else{var +i=Math.min(c,g.length-e);for(var +a=0;a>>0>=b.l)d5();return q(b,a,c)}function +a3(a,b){switch(a.t&6){default:if(b>=a.c.length)return 0;case +0:return a.c.charCodeAt(b);case +4:return a.c[b]}}function +ar(c,a){if(c.fun)return ar(c.fun,a);if(typeof +c!=="function")return c;var +b=c.length|0;if(b===0)return c.apply(null,a);var +e=a.length|0,d=b-e|0;if(d==0)return c.apply(null,a);else +if(d<0)return ar(c.apply(null,a.slice(0,b)),a.slice(b));else +return function(){var +e=arguments.length==0?1:arguments.length,d=new +Array(a.length+e);for(var +b=0;b>>0>=a.length-1)aL();return a}function +il(a){if(isFinite(a)){if(Math.abs(a)>=2.2250738585072014e-308)return 0;if(a!=0)return 1;return 2}return isNaN(a)?4:3}function +v(a){if(a<0)w("Bytes.create");return new +ag(a?2:9,e,a)}function +aj(a){if((a.t&6)!=0)aB(a);return a.c}var +i$=Math.log2&&Math.log2(1.1235582092889474E+307)==1020;function +i_(a){if(i$)return Math.floor(Math.log2(a));var +b=0;if(a==0)return-Infinity;if(a>=1)while(a>=2){a/=2;b++}else +while(a<1){a*=2;b--}return b}function +b7(c){var +a=new(f.Float32Array)(1);a[0]=c;var +b=new(f.Int32Array)(a.buffer);return b[0]|0}var +ec=Math.pow(2,-24);function +ek(a){throw a}function +ce(){ek(r.Division_by_zero)}function +d(b,c,a){this.lo=b&ae;this.mi=c&ae;this.hi=a&V}d.prototype.caml_custom="_j";d.prototype.copy=function(){return new +d(this.lo,this.mi,this.hi)};d.prototype.ucompare=function(a){if(this.hi>a.hi)return 1;if(this.hia.mi)return 1;if(this.mia.lo)return 1;if(this.loc)return 1;if(ba.mi)return 1;if(this.mia.lo)return 1;if(this.lo>24),c=-this.hi+(b>>24);return new +d(a,b,c)};d.prototype.add=function(a){var +b=this.lo+a.lo,c=this.mi+a.mi+(b>>24),e=this.hi+a.hi+(c>>24);return new +d(b,c,e)};d.prototype.sub=function(a){var +b=this.lo-a.lo,c=this.mi-a.mi+(b>>24),e=this.hi-a.hi+(c>>24);return new +d(b,c,e)};d.prototype.mul=function(a){var +b=this.lo*a.lo,c=(b*ec|0)+this.mi*a.lo+this.lo*a.mi,e=(c*ec|0)+this.hi*a.lo+this.mi*a.mi+this.lo*a.hi;return new +d(b,c,e)};d.prototype.isZero=function(){return(this.lo|this.mi|this.hi)==0};d.prototype.isNeg=function(){return this.hi<<16<0};d.prototype.and=function(a){return new +d(this.lo&a.lo,this.mi&a.mi,this.hi&a.hi)};d.prototype.or=function(a){return new +d(this.lo|a.lo,this.mi|a.mi,this.hi|a.hi)};d.prototype.xor=function(a){return new +d(this.lo^a.lo,this.mi^a.mi,this.hi^a.hi)};d.prototype.shift_left=function(a){a=a&63;if(a==0)return this;if(a<24)return new +d(this.lo<>24-a,this.hi<>24-a);if(a<48)return new +d(0,this.lo<>48-a);return new +d(0,0,this.lo<>a|this.mi<<24-a,this.mi>>a|this.hi<<24-a,this.hi>>a);if(a<48)return new +d(this.mi>>a-24|this.hi<<48-a,this.hi>>a-24,0);return new +d(this.hi>>a-48,0,0)};d.prototype.shift_right=function(a){a=a&63;if(a==0)return this;var +c=this.hi<<16>>16;if(a<24)return new +d(this.lo>>a|this.mi<<24-a,this.mi>>a|c<<24-a,this.hi<<16>>a>>>16);var +b=this.hi<<16>>31;if(a<48)return new +d(this.mi>>a-24|this.hi<<48-a,this.hi<<16>>a-24>>16,b&V);return new +d(this.hi<<16>>a-32,b,b)};d.prototype.lsl1=function(){this.hi=this.hi<<1|this.mi>>23;this.mi=(this.mi<<1|this.lo>>23)&ae;this.lo=this.lo<<1&ae};d.prototype.lsr1=function(){this.lo=(this.lo>>>1|this.mi<<23)&ae;this.mi=(this.mi>>>1|this.hi<<23)&ae;this.hi=this.hi>>>1};d.prototype.udivmod=function(f){var +c=0,b=this.copy(),a=f.copy(),e=new +d(0,0,0);while(b.ucompare(a)>0){c++;a.lsl1()}while(c>=0){c--;e.lsl1();if(b.ucompare(a)>=0){e.lo++;b=b.sub(a)}a.lsr1()}return{quotient:e,modulus:b}};d.prototype.div=function(a){var +b=this;if(a.isZero())ce();var +d=b.hi^a.hi;if(b.hi&U)b=b.neg();if(a.hi&U)a=a.neg();var +c=b.udivmod(a).quotient;if(d&U)c=c.neg();return c};d.prototype.mod=function(b){var +a=this;if(b.isZero())ce();var +d=a.hi;if(a.hi&U)a=a.neg();if(b.hi&U)b=b.neg();var +c=a.udivmod(b).modulus;if(d&U)c=c.neg();return c};d.prototype.toInt=function(){return this.lo|this.mi<<24};d.prototype.toFloat=function(){return(this.hi<<16)*Math.pow(2,32)+this.mi*Math.pow(2,24)+this.lo};d.prototype.toArray=function(){return[this.hi>>8,this.hi&af,this.mi>>16,this.mi>>8&af,this.mi&af,this.lo>>16,this.lo>>8&af,this.lo&af]};d.prototype.lo32=function(){return this.lo|(this.mi&af)<<24};d.prototype.hi32=function(){return this.mi>>>8&V|this.hi<<16};function +bl(b,c,a){return new +d(b,c,a)}function +bk(a){if(!isFinite(a)){if(isNaN(a))return bl(1,0,df);return a>0?bl(0,0,df):bl(0,0,0xfff0)}var +f=a==0&&1/a==-Infinity?U:a>=0?0:U;if(f)a=-a;var +b=i_(a)+1023;if(b<=0){b=0;a/=Math.pow(2,-c7)}else{a/=Math.pow(2,b-dP);if(a<16){a*=2;b-=1}if(b==0)a/=2}var +d=Math.pow(2,24),c=a|0;a=(a-c)*d;var +e=a|0;a=(a-e)*d;var +g=a|0;c=c&bS|f|b<<4;return bl(g,e,c)}function +a7(a){return a.toArray()}function +d4(c,b,g){c.write(32,b.dims.length);c.write(32,b.kind|b.layout<<8);if(b.caml_custom==bZ)for(var +a=0;a>4;if(c==2047)return(f|g|b&bS)==0?b&U?-Infinity:Infinity:NaN;var +e=Math.pow(2,-24),a=(f*e+g)*e+(b&bS);if(c>0){a+=16;a*=Math.pow(2,c-dP)}else +a*=Math.pow(2,-c7);if(b&U)a=-a;return a}function +b3(b){var +d=b.length,c=1;for(var +a=0;a>>24&af|(a&V)<<8,a>>>16&V)}function +b_(a){return a.hi32()}function +b$(a){return a.lo32()}var +ig=dL;function +ao(c,d,b,a){this.kind=c;this.layout=d;this.dims=b;this.data=a}ao.prototype.caml_custom=ig;ao.prototype.offset=function(b){var +c=0;if(typeof +b==="number")b=[b];if(!(b +instanceof +Array))w("bigarray.js: invalid offset");if(this.dims.length!=b.length)w("Bigarray.get/set: bad number of dimensions");if(this.layout==0)for(var +a=0;a=this.dims[a])aL();c=c*this.dims[a]+b[a]}else +for(var +a=this.dims.length-1;a>=0;a--){if(b[a]<1||b[a]>this.dims[a])aL();c=c*this.dims[a]+(b[a]-1)}return c};ao.prototype.get=function(a){switch(this.kind){case +7:var +d=this.data[a*2+0],b=this.data[a*2+1];return iv(d,b);case +10:case +11:var +e=this.data[a*2+0],c=this.data[a*2+1];return[an,e,c];default:return this.data[a]}};ao.prototype.set=function(a,b){switch(this.kind){case +7:this.data[a*2+0]=b$(b);this.data[a*2+1]=b_(b);break;case +10:case +11:this.data[a*2+0]=b[1];this.data[a*2+1]=b[2];break;default:this.data[a]=b;break}return 0};ao.prototype.fill=function(b){switch(this.kind){case +7:var +c=b$(b),e=b_(b);if(c==e)this.data.fill(c);else +for(var +a=0;ad)return 1;if(c!=d){if(!g)return NaN;if(c==c)return 1;if(d==d)return-1}}break;case +7:for(var +a=0;ab.data[a+1])return 1;if(this.data[a]>>>0>>0)return-1;if(this.data[a]>>>0>b.data[a]>>>0)return 1}break;case +2:case +3:case +4:case +5:case +6:case +8:case +9:case +12:for(var +a=0;ab.data[a])return 1}break}return 0};function +aK(c,d,b,a){this.kind=c;this.layout=d;this.dims=b;this.data=a}aK.prototype=new +ao();aK.prototype.offset=function(a){if(typeof +a!=="number")if(a +instanceof +Array&&a.length==1)a=a[0];else +w("Ml_Bigarray_c_1_1.offset");if(a<0||a>=this.dims[0])aL();return a};aK.prototype.get=function(a){return this.data[a]};aK.prototype.set=function(a,b){this.data[a]=b;return 0};aK.prototype.fill=function(a){this.data.fill(a);return 0};function +d0(c,d,a,b){var +e=d2(c);if(b3(a)*e!=b.length)w("length doesn't match dims");if(d==0&&a.length==1&&e==1)return new +aK(c,d,a,b);return new +ao(c,d,a,b)}function +Y(a){cd(r.Failure,a)}function +d1(b,v,r){var +i=b.read32s();if(i<0||i>16)Y("input_value: wrong number of bigarray dimensions");var +p=b.read32s(),j=p&af,o=p>>8&1,h=[];if(r==bZ)for(var +a=0;a>>32-15;a=ef(a,0x1b873593);b^=a;b=b<<13|b>>>32-13;return(b+(b<<2)|0)+(0xe6546b64|0)|0}function +ir(a,b){a=ai(a,b$(b));a=ai(a,b_(b));return a}function +eb(a,b){return ir(a,bk(b))}function +d3(c){var +b=b3(c.dims),d=0;switch(c.kind){case +2:case +3:case +12:if(b>bT)b=bT;var +e=0,a=0;for(a=0;a+4<=c.data.length;a+=4){e=c.data[a+0]|c.data[a+1]<<8|c.data[a+2]<<16|c.data[a+3]<<24;d=ai(d,e)}e=0;switch(b&3){case +3:e=c.data[a+2]<<16;case +2:e|=c.data[a+1]<<8;case +1:e|=c.data[a+0];d=ai(d,e)}break;case +4:case +5:if(b>a2)b=a2;var +e=0,a=0;for(a=0;a+2<=c.data.length;a+=2){e=c.data[a+0]|c.data[a+1]<<16;d=ai(d,e)}if((b&1)!=0)d=ai(d,c.data[a]);break;case +6:if(b>64)b=64;for(var +a=0;a64)b=64;for(var +a=0;a32)b=32;b*=2;for(var +a=0;a64)b=64;for(var +a=0;a32)b=32;for(var +a=0;a0?b(c,f,e):b(f,c,e);if(e&&a!=a)return d;if(+a!=+a)return+a;if((a|0)!=0)return a|0}return d}function +bm(a){return a +instanceof +ag}function +ca(a){return bm(a)}function +d9(a){if(typeof +a==="number")return a0;else +if(bm(a))return bX;else +if(ca(a))return 1252;else +if(a +instanceof +Array&&a[0]===a[0]>>>0&&a[0]<=du){var +b=a[0]|0;return b==an?0:b}else +if(a +instanceof +String)return dG;else +if(typeof +a=="string")return dG;else +if(a +instanceof +Number)return a0;else +if(a&&a.caml_custom)return bV;else +if(a&&a.compare)return 1256;else +if(typeof +a=="function")return 1247;else +if(typeof +a=="symbol")return 1251;return 1001}function +iF(a,b){if(ab.c?1:0}function +jb(a,b){return d6(a,b)}function +a4(a,b,d){var +e=[];for(;;){if(!(d&&a===b)){var +f=d9(a);if(f==bh){a=a[1];continue}var +g=d9(b);if(g==bh){b=b[1];continue}if(f!==g){if(f==a0){if(g==bV)return d8(a,b,-1,d);return-1}if(g==a0){if(f==bV)return d8(b,a,1,d);return 1}return fb)return 1;if(a!=b){if(!d)return NaN;if(a==a)return 1;if(b==b)return-1}break;case +1001:if(ab)return 1;if(a!=b){if(!d)return NaN;if(a==a)return 1;if(b==b)return-1}break;case +1251:if(a!==b){if(!d)return NaN;return 1}break;case +1252:var +a=aj(a),b=aj(b);if(a!==b){if(ab)return 1}break;case +12520:var +a=a.toString(),b=b.toString();if(a!==b){if(ab)return 1}break;case +246:case +254:default:if(a.length!=b.length)return a.length1)e.push(a,b,1);break}}if(e.length==0)return 0;var +h=e.pop();b=e.pop();a=e.pop();if(h+10)if(c==0&&(b>=a.l||a.t==2&&b>=a.c.length))if(d==0){a.c=e;a.t=2}else{a.c=aN(b,String.fromCharCode(d));a.t=b==a.l?0:2}else{if(a.t!=4)bi(a);for(b+=c;cb)return 1;if(a===a)return 1;if(b===b)return-1;return 0}function +cc(d){d=aj(d);var +e=d.length;if(e>31)w("format_int: format too long");var +a={justify:aI,signstyle:az,filler:ac,alternate:false,base:0,signedconv:false,width:0,uppercase:false,sign:1,prec:-1,conv:"f"};for(var +c=0;c=0&&b<=9){a.width=a.width*10+b;c++}c--;break;case".":a.prec=0;c++;while(b=d.charCodeAt(c)-48,b>=0&&b<=9){a.prec=a.prec*10+b;c++}c--;case"d":case"i":a.signedconv=true;case"u":a.base=10;break;case"x":a.base=16;break;case"X":a.base=16;a.uppercase=true;break;case"o":a.base=8;break;case"e":case"f":case"g":a.signedconv=true;a.conv=b;break;case"E":case"F":case"G":a.signedconv=true;a.uppercase=true;a.conv=b.toLowerCase();break}}return a}function +b6(b,g){if(b.uppercase)g=g.toUpperCase();var +f=g.length;if(b.signedconv&&(b.sign<0||b.signstyle!=az))f++;if(b.alternate){if(b.base==8)f+=1;if(b.base==16)f+=2}var +c=e;if(b.justify==aI&&b.filler==ac)for(var +d=f;d20){c-=20;a/=Math.pow(10,c);a+=new +Array(c+1).join(L);if(b>0)a=a+ay+new +Array(b+1).join(L);return a}else +return a.toFixed(b)}}var +a,e=cc(i),d=e.prec<0?6:e.prec;if(c<0||c==0&&1/c==-Infinity){e.sign=-1;c=-c}if(isNaN(c)){a=bW;e.filler=ac}else +if(!isFinite(c)){a="inf";e.filler=ac}else +switch(e.conv){case"e":var +a=c.toExponential(d),b=a.length;if(a.charAt(b-3)==b1)a=a.slice(0,b-1)+L+a.slice(b-1);break;case"f":a=j(c,d);break;case"g":d=d?d:1;a=c.toExponential(d-1);var +h=a.indexOf(b1),g=+a.slice(h+1);if(g<-4||c>=1e21||c.toFixed(0).length>d){var +b=h-1;while(a.charAt(b)==L)b--;if(a.charAt(b)==ay)b--;a=a.slice(0,b+1)+a.slice(h);b=a.length;if(a.charAt(b-3)==b1)a=a.slice(0,b-1)+L+a.slice(b-1);break}else{var +f=d;if(g<0){f-=g+1;a=c.toFixed(f)}else +while(a=c.toFixed(f),a.length>d+1)f--;if(f){var +b=a.length-1;while(a.charAt(b)==L)b--;if(a.charAt(b)==ay)b--;a=a.slice(0,b+1)}}break}return b6(e,a)}function +bj(f,c){if(aj(f)==dj)return a(e+c);var +b=cc(f);if(c<0)if(b.signedconv){b.sign=-1;c=-c}else +c>>>=0;var +d=c.toString(b.base);if(b.prec>=0){b.filler=ac;var +g=b.prec-d.length;if(g>0)d=aN(g,L)+d}return b6(b,d)}var +iU=0;function +H(){return iU++}function +ed(a){return a.toUtf16()}if(f.process&&f.process.cwd)var +a5=f.process.cwd().replace(/\\/g,ad);else +var +a5="/static";if(a5.slice(-1)!==ad)a5+=ad;function +iK(a){a=ed(a);if(a.charCodeAt(0)!=47)a=a5+a;var +d=a.split(ad),b=[];for(var +c=0;c1)b.pop();break;case".":break;case"":if(b.length==0)b.push(e);break;default:b.push(d[c]);break}b.orig=a;return b}function +ij(a){return new +ag(4,a,a.length)}function +i6(f){for(var +g=e,b=g,a,i,c=0,h=f.length;cbR){b.substr(0,1);g+=b;b=e;g+=f.slice(c,d)}else +b+=f.slice(c,d);if(d==h)break;c=d}if(a>6);b+=String.fromCharCode(P|a&aJ)}else +if(a<0xd800||a>=dy)b+=String.fromCharCode(dz|a>>12,P|a>>6&aJ,P|a&aJ);else +if(a>=0xdbff||c+1==h||(i=f.charCodeAt(c+1))dy)b+="\xef\xbf\xbd";else{c++;a=(a<<10)+i-0x35fdc00;b+=String.fromCharCode(dC|a>>18,P|a>>12&aJ,P|a>>6&aJ,P|a&aJ)}if(b.length>a1){b.substr(0,1);g+=b;b=e}}return g+b}function +ik(a){var +b=9;if(!eo(a))b=8,a=i6(a);return new +ag(b,a,a.length)}function +al(a){return ik(a)}function +n(a){cd(r.Sys_error,a)}function +iW(a){a=aj(a);n(a+": No such file or directory")}function +ii(b,a){if(a>>>0>=b.l)d5();return a3(b,a)}function +M(a){return a.l}function +dX(){}function +z(a){this.data=a}z.prototype=new +dX();z.prototype.truncate=function(a){var +b=this.data;this.data=v(a|0);ap(b,0,this.data,0,a)};z.prototype.length=function(){return M(this.data)};z.prototype.write=function(b,d,g,a){var +c=this.length();if(b+a>=c){var +e=v(b+a),f=this.data;this.data=e;ap(f,0,this.data,0,c)}aq(d,g,this.data,b,a);return 0};z.prototype.read=function(c,a,d,b){var +e=this.length();ap(this.data,c,a,d,b);return 0};z.prototype.read_one=function(a){return ii(this.data,a)};z.prototype.close=function(){};z.prototype.constructor=z;function +Q(b,a){this.content={};this.root=b;this.lookupFun=a}Q.prototype.nm=function(a){return this.root+a};Q.prototype.lookup=function(b){if(!this.content[b]&&this.lookupFun){var +c=this.lookupFun(a(this.root),a(b));if(c!==0)this.content[b]=new +z(ah(c[1]))}};Q.prototype.exists=function(a){if(a==e)return 1;var +c=a+ad,d=new +RegExp(bY+c);for(var +b +in +this.content)if(b.match(d))return 1;this.lookup(a);return this.content[a]?1:0};Q.prototype.readdir=function(c){var +g=c==e?e:c+ad,h=new +RegExp(bY+g+dJ),d={},b=[];for(var +f +in +this.content){var +a=f.match(h);if(a&&!d[a[1]]){d[a[1]]=true;b.push(a[1])}}return b};Q.prototype.is_dir=function(a){var +d=a==e?e:a+ad,f=new +RegExp(bY+d+dJ),g=[];for(var +c +in +this.content){var +b=c.match(f);if(b)return 1}return 0};Q.prototype.unlink=function(a){var +b=this.content[a]?true:false;delete +this.content[a];return b};Q.prototype.open=function(a,b){if(b.rdonly&&b.wronly)n(this.nm(a)+dK);if(b.text&&b.binary)n(this.nm(a)+dc);this.lookup(a);if(this.content[a]){if(this.is_dir(a))n(this.nm(a)+" : is a directory");if(b.create&&b.excl)n(this.nm(a)+dI);var +c=this.content[a];if(b.truncate)c.truncate();return c}else +if(b.create){this.content[a]=new +z(v(0));return this.content[a]}else +iW(this.nm(a))};Q.prototype.register=function(b,a){if(this.content[b])n(this.nm(b)+dI);if(bm(a))this.content[b]=new +z(a);if(ca(a))this.content[b]=new +z(ah(a));else +if(a +instanceof +Array)this.content[b]=new +z(ij(a));else +if(typeof +a==="string")this.content[b]=new +z(d7(a));else +if(a.toString){var +c=ah(al(a.toString()));this.content[b]=new +z(c)}else +n(this.nm(b)+" : registering file with invalid content type")};Q.prototype.constructor=Q;function +i(a){return M(a)}function +T(b,a){return a3(b,a)}function +id(d){var +c=i(d),b=new +Array(c),a=0;for(;a=0)}function +is(a,c,l){if(!isFinite(a)){if(isNaN(a))return al(bW);return al(a>0?dF:"-infinity")}var +j=a==0&&1/a==-Infinity?1:a>=0?0:1;if(j)a=-a;var +d=0;if(a==0);else +if(a<1)while(a<1&&d>-1022){a*=2;d--}else +while(a>=2){a/=2;d++}var +k=d<0?e:aI,f=e;if(j)f=az;else +switch(l){case +43:f=aI;break;case +32:f=ac;break;default:break}if(c>=0&&c<13){var +h=Math.pow(2,c*4);a=Math.round(a*h)/h}var +b=a.toString(16);if(c>=0){var +i=b.indexOf(ay);if(i<0)b+=ay+aN(c,L);else{var +g=i+1+c;if(b.length>24&ae,a>>31&V)}function +iD(a){return a.toInt()}function +iy(a){return+a.isNeg()}function +iB(a){return a.neg()}function +iw(h,c){var +a=cc(h);if(a.signedconv&&iy(c)){a.sign=-1;c=iB(c)}var +b=e,i=iC(a.base),g="0123456789abcdef";do{var +f=c.udivmod(i);c=f.quotient;b=g.charAt(iD(f.modulus))+b}while(!iz(c));if(a.prec>=0){a.filler=ac;var +d=a.prec-b.length;if(d>0)b=aN(d,L)+b}return b6(a,b)}function +iV(c){var +a=0,e=i(c),b=10,d=1;if(e>0)switch(T(c,a)){case +45:a++;d=-1;break;case +43:a++;d=1;break}if(a+1=48&&a<=57)return a-48;if(a>=65&&a<=90)return a-55;if(a>=97&&a<=dT)return a-87;return-1}function +iG(f){var +h=iV(f),c=h[0],j=h[1],d=h[2],g=i(f),k=-1>>>0,e=c=d)Y(bg);var +a=b;for(c++;c=d)break;a=d*a+b;if(a>k)Y(bg)}if(c!=g)Y(bg);a=j*a;if(d==10&&(a|0)!=a)Y(bg);return a|0}function +iH(d){return function(){var +b=arguments.length;if(b>0){var +c=new +Array(b);for(var +a=0;a>>32-b,c)}function +g(c,b,d,e,h,f,g){return a(b&d|~b&e,c,b,h,f,g)}function +h(d,b,e,c,h,f,g){return a(b&c|e&~c,d,b,h,f,g)}function +i(c,b,d,e,h,f,g){return a(b^d^e,c,b,h,f,g)}function +j(c,b,d,e,h,f,g){return a(d^(b|~e),c,b,h,f,g)}function +k(f,n){var +e=n;f[e>>2]|=P<<8*(e&3);for(e=(e&~0x3)+8;(e&0x3F)<60;e+=4)f[(e>>2)-1]=0;f[(e>>2)-1]=n<<3;f[e>>2]=n>>29&0x1FFFFFFF;var +k=[0x67452301,0xEFCDAB89,0x98BADCFE,0x10325476];for(e=0;e>8*m&0xFF;return o}return function(h,g,f){var +e=[];switch(h.t&6){default:aB(h);case +0:var +d=h.c;for(var +a=0;a>2]=d.charCodeAt(b)|d.charCodeAt(b+1)<<8|d.charCodeAt(b+2)<<16|d.charCodeAt(b+3)<<24}for(;a>2]|=d.charCodeAt(a+g)<<8*(a&3);break;case +4:var +c=h.c;for(var +a=0;a>2]=c[b]|c[b+1]<<8|c[b+2]<<16|c[b+3]<<24}for(;a>2]|=c[a+g]<<8*(a&3)}return i1(k(e,f))}}();function +iM(c,b,a){return iL(ah(c),b,a)}var +Z=new +Array();function +cb(c){var +a=Z[c];if(!a.opened)n("Cannot flush a closed channel");if(!a.buffer||a.buffer==e)return 0;if(a.fd&&r.fds[a.fd]&&r.fds[a.fd].output){var +b=r.fds[a.fd].output;switch(b.length){case +2:b(c,a.buffer);break;default:b(a.buffer)}}a.buffer=e;return 0}function +em(e,f){var +b=Z[e],d=a(f),c=i(d);b.file.write(b.offset,d,0,c);b.offset+=c;return 0}function +i8(a){var +a=cg(a),b=f;if(b.process&&b.process.stdout&&b.process.stdout.write)b.process.stderr.write(a);else{if(a.charCodeAt(a.length-1)==10)a=a.substr(0,a.length-1);var +c=b.console;c&&c.error&&c.error(a)}}function +i9(a){var +a=cg(a),b=f;if(b.process&&b.process.stdout&&b.process.stdout.write)b.process.stdout.write(a);else{if(a.charCodeAt(a.length-1)==10)a=a.substr(0,a.length-1);var +c=b.console;c&&c.log&&c.log(a)}}function +bp(c,e,d,a){if(r.fds===undefined)r.fds=new +Array();a=a?a:{};var +b={};b.file=d;b.offset=a.append?d.length():0;b.flags=a;b.output=e;r.fds[c]=b;if(!r.fd_last_idx||c>r.fd_last_idx)r.fd_last_idx=c;return c}function +jc(c,b,g){var +a={};while(b){switch(b[1]){case +0:a.rdonly=1;break;case +1:a.wronly=1;break;case +2:a.append=1;break;case +3:a.create=1;break;case +4:a.truncate=1;break;case +5:a.excl=1;break;case +6:a.binary=1;break;case +7:a.text=1;break;case +8:a.nonblock=1;break}b=b[2]}if(a.rdonly&&a.wronly)n(aj(c)+dK);if(a.text&&a.binary)n(aj(c)+dc);var +d=ep(c),e=d.device.open(d.rest,a),f=r.fd_last_idx?r.fd_last_idx:0;return bp(f+1,em,e,a)}bp(0,em,new +z(v(0)));bp(1,i9,new +z(v(0)));bp(2,i8,new +z(v(0)));function +iN(c){var +b=r.fds[c];if(b.flags.wronly)n(dS+c+" is writeonly");var +a={file:b.file,offset:b.offset,fd:c,opened:true,out:false,refill:null};Z[a.fd]=a;return a.fd}function +ee(c){var +b=r.fds[c];if(b.flags.rdonly)n(dS+c+" is readonly");var +a={file:b.file,offset:b.offset,fd:c,opened:true,out:true,buffer:e};Z[a.fd]=a;return a.fd}function +iO(){var +b=0;for(var +a=0;a>>0)return a[0];else +if(bm(a))return bX;else +if(ca(a))return bX;else +if(a +instanceof +Function||typeof +a=="function")return 247;else +if(a&&a.caml_custom)return du;else +return a0}function +R(b,c,a){if(a&&f.toplevelReloc)b=f.toplevelReloc(a);r[b+1]=c;if(a)r[a]=c}var +eh={};function +iZ(a,b){eh[aj(a)]=b;return 0}function +ih(a,b){if(a===b)return 1;a.t&6&&aB(a);b.t&6&&aB(b);return a.c==b.c?1:0}function +en(a,b){return ih(a,b)}function +i0(){w(b0)}function +x(b,a){if(a>>>0>=i(b))i0();return T(b,a)}function +ak(a,b){return 1-en(a,b)}function +i2(){return[0,a("js_of_ocaml")]}function +i3(){return 0x7FFFFFFF/4|0}function +i4(){return[0,a("Unix"),32,0]}function +iX(){ek(r.Not_found)}function +bo(c){var +a=f,b=ed(c);if(a.process&&a.process.env&&a.process.env[b]!=undefined)return al(a.process.env[b]);if(f.jsoo_static_env&&f.jsoo_static_env[b])return al(f.jsoo_static_env[b]);iX()}function +i5(){var +a=new +Date().getTime(),b=a^0xffffffff*Math.random();return[0,b]}function +cf(a){var +b=1;while(a&&a.joo_tramp){a=a.joo_tramp.apply(null,a.joo_args);b++}return a}function +A(b,a){return{joo_tramp:b,joo_args:a}}function +el(a){return a}function +eg(a){return eh[a]}function +_(a){if(a +instanceof +Array)return a;if(f.RangeError&&a +instanceof +f.RangeError&&a.message&&a.message.match(/maximum call stack/i))return el(r.Stack_overflow);if(f.InternalError&&a +instanceof +f.InternalError&&a.message&&a.message.match(/too much recursion/i))return el(r.Stack_overflow);if(a +instanceof +f.Error&&eg(bU))return[0,eg(bU),a];return[0,r.Failure,al(String(a))]}function +bq(){return 0}function +ja(){}function +c(a,b){return a.length==1?a(b):ar(a,[b])}function +g(a,b,c){return a.length==2?a(b,c):ar(a,[b,c])}function +aw(a,b,c,d){return a.length==3?a(b,c,d):ar(a,[b,c,d])}ip();var +cj=[p,a(dk),-2],$=[p,a(dr),-3],ch=[p,a(dW),-4],as=[p,a(c9),-7],j=[p,a(dx),-11],cz=[0,dh];R(11,[p,a(c6),-12],c6);R(10,j,dx);R(9,[p,a(dR),-10],dR);R(8,[p,a(c$),-9],c$);R(7,[p,a(dD),-8],dD);R(6,as,c9);R(5,[p,a(dm),-6],dm);R(4,[p,a(dt),-5],dt);R(3,ch,dW);R(2,$,dr);R(1,cj,dk);R(0,[p,a(dH),-1],dH);var +ew=a("output_substring"),es=a("true"),et=a("false"),ey=a("\\\\"),ez=a("\\'"),eA=a("\\b"),eB=a("\\t"),eC=a("\\n"),eD=a("\\r"),eG=a("List.init"),eJ=a("String.blit / Bytes.blit_string"),eI=a("Bytes.blit"),eH=a("String.sub / Bytes.sub"),eM=a("String.contains_from / Bytes.contains_from"),eQ=a("Array.map2: arrays must have the same length"),eO=a("Array.init"),eT=a("Stdlib.Queue.Empty"),eV=a("CamlinternalLazy.Undefined"),e3=a("Buffer.add_substring/add_subbytes"),e2=a("Buffer.add: cannot grow buffer"),e1=[0,a(di),93,2],e0=[0,a(di),94,2],eZ=a("Buffer.sub"),fa=a("%c"),fb=a("%s"),fc=a(c5),fd=a(dB),fe=a(dV),ff=a(db),fg=a("%f"),fh=a("%B"),fi=a("%{"),fj=a("%}"),fk=a("%("),fl=a("%)"),fm=a("%a"),fn=a("%t"),fo=a("%?"),fp=a("%r"),fq=a("%_r"),fr=[0,a(u),850,23],fC=[0,a(u),814,21],fu=[0,a(u),815,21],fD=[0,a(u),818,21],fv=[0,a(u),819,21],fE=[0,a(u),822,19],fw=[0,a(u),823,19],fF=[0,a(u),826,22],fx=[0,a(u),827,22],fG=[0,a(u),831,30],fy=[0,a(u),832,30],fA=[0,a(u),836,26],fs=[0,a(u),837,26],fB=[0,a(u),846,28],ft=[0,a(u),847,28],fz=[0,a(u),851,23],gI=a(dN),gG=[0,a(u),1558,4],gH=a("Printf: bad conversion %["),gJ=[0,a(u),1626,39],gK=[0,a(u),1649,31],gL=[0,a(u),1650,31],gM=a("Printf: bad conversion %_"),gN=a("@{"),gO=a("@["),gS=[0,[11,a("invalid box description "),[3,0,0]],a("invalid box description %S")],gQ=a(e),gR=[0,0,4],gT=a(e),gU=a("b"),gV=a("h"),gW=a("hov"),gX=a("hv"),gY=a("v"),gE=a(bW),gC=a("neg_infinity"),gD=a(dF),gB=a(ay),gl=a("%+nd"),gm=a("% nd"),go=a("%+ni"),gp=a("% ni"),gq=a("%nx"),gr=a("%#nx"),gs=a("%nX"),gt=a("%#nX"),gu=a("%no"),gv=a("%#no"),gk=a("%nd"),gn=a(dV),gw=a("%nu"),f_=a("%+ld"),f$=a("% ld"),gb=a("%+li"),gc=a("% li"),gd=a("%lx"),ge=a("%#lx"),gf=a("%lX"),gg=a("%#lX"),gh=a("%lo"),gi=a("%#lo"),f9=a("%ld"),ga=a(dB),gj=a("%lu"),fX=a("%+Ld"),fY=a("% Ld"),f0=a("%+Li"),f1=a("% Li"),f2=a("%Lx"),f3=a("%#Lx"),f4=a("%LX"),f5=a("%#LX"),f6=a("%Lo"),f7=a("%#Lo"),fW=a("%Ld"),fZ=a(db),f8=a("%Lu"),fK=a("%+d"),fL=a("% d"),fN=a("%+i"),fO=a("% i"),fP=a("%x"),fQ=a("%#x"),fR=a("%X"),fS=a("%#X"),fT=a("%o"),fU=a("%#o"),fJ=a(dj),fM=a(c5),fV=a(dN),e4=a("@]"),e5=a("@}"),e6=a("@?"),e7=a("@\n"),e8=a("@."),e9=a("@@"),e_=a("@%"),e$=a("@"),fH=a("CamlinternalFormat.Type_mismatch"),gZ=a("x"),ia=a("OCAMLRUNPARAM"),h_=a("CAMLRUNPARAM"),g0=a(e),ho=[3,0,3],hp=a(ay),hj=a(dQ),hk=a("<\/"),hl=a(e),hf=a(dQ),hg=a("<"),hh=a(e),hd=a("\n"),g$=a(e),ha=a(e),hb=a(e),hc=a(e),g_=[0,a(e)],g6=a(e),g7=a(e),g8=a(e),g9=a(e),g5=[0,a(e),0,a(e)],g4=a(e),g3=a("Stdlib.Format.String_tag"),h9=a("TMPDIR"),h8=a("TEMP"),hu=a("Cygwin"),hv=a("Win32"),hx=a("Js_of_ocaml__Js.Error"),hy=a(bU),hB=a(dn),hA=a(dn),hC=a(da),hD=a(e),hE=a(e),hF=a(da),hG=a("0.0.0.0"),hH=a("127.0.0.1"),h7=a("::"),h6=a("::1"),hI=[0,[11,a(ds),0],a(ds)],hJ=[0,[11,a(dl),0],a(dl)],hY=[0,a(ax),422,10],hX=[0,a(ax),433,16],hW=[0,a(ax),409,4],hV=[0,a(ax),348,12],hU=[0,a(ax),339,12],hS=[0,a(ax),92,8],hT=a(dM),hQ=[0,a(ax),80,8],hR=a(dE),hP=a(dM),hO=a(dE),hK=a("Matrix.NonSquare"),hM=a("Matrix.ImproperDimensions"),h4=a("NonElt"),h5=a("Dune__exe__Worker.Empty_Element");function +o(a){if(typeof +a==="number")return 0;else +switch(a[0]){case +0:return[0,o(a[1])];case +1:return[1,o(a[1])];case +2:return[2,o(a[1])];case +3:return[3,o(a[1])];case +4:return[4,o(a[1])];case +5:return[5,o(a[1])];case +6:return[6,o(a[1])];case +7:return[7,o(a[1])];case +8:var +c=a[1];return[8,c,o(a[2])];case +9:var +b=a[1];return[9,b,b,o(a[3])];case +10:return[10,o(a[1])];case +11:return[11,o(a[1])];case +12:return[12,o(a[1])];case +13:return[13,o(a[1])];default:return[14,o(a[1])]}}function +D(a,b){if(typeof +a==="number")return b;else +switch(a[0]){case +0:return[0,D(a[1],b)];case +1:return[1,D(a[1],b)];case +2:return[2,D(a[1],b)];case +3:return[3,D(a[1],b)];case +4:return[4,D(a[1],b)];case +5:return[5,D(a[1],b)];case +6:return[6,D(a[1],b)];case +7:return[7,D(a[1],b)];case +8:var +c=a[1];return[8,c,D(a[2],b)];case +9:var +d=a[2],e=a[1];return[9,e,d,D(a[3],b)];case +10:return[10,D(a[1],b)];case +11:return[11,D(a[1],b)];case +12:return[12,D(a[1],b)];case +13:return[13,D(a[1],b)];default:return[14,D(a[1],b)]}}function +m(a,b){if(typeof +a==="number")return b;else +switch(a[0]){case +0:return[0,m(a[1],b)];case +1:return[1,m(a[1],b)];case +2:var +c=a[1];return[2,c,m(a[2],b)];case +3:var +d=a[1];return[3,d,m(a[2],b)];case +4:var +e=a[3],f=a[2],g=a[1];return[4,g,f,e,m(a[4],b)];case +5:var +h=a[3],i=a[2],j=a[1];return[5,j,i,h,m(a[4],b)];case +6:var +k=a[3],l=a[2],n=a[1];return[6,n,l,k,m(a[4],b)];case +7:var +o=a[3],p=a[2],q=a[1];return[7,q,p,o,m(a[4],b)];case +8:var +r=a[3],s=a[2],t=a[1];return[8,t,s,r,m(a[4],b)];case +9:var +u=a[1];return[9,u,m(a[2],b)];case +10:return[10,m(a[1],b)];case +11:var +v=a[1];return[11,v,m(a[2],b)];case +12:var +w=a[1];return[12,w,m(a[2],b)];case +13:var +x=a[2],y=a[1];return[13,y,x,m(a[3],b)];case +14:var +z=a[2],A=a[1];return[14,A,z,m(a[3],b)];case +15:return[15,m(a[1],b)];case +16:return[16,m(a[1],b)];case +17:var +B=a[1];return[17,B,m(a[2],b)];case +18:var +C=a[1];return[18,C,m(a[2],b)];case +19:return[19,m(a[1],b)];case +20:var +D=a[2],E=a[1];return[20,E,D,m(a[3],b)];case +21:var +F=a[1];return[21,F,m(a[2],b)];case +22:return[22,m(a[1],b)];case +23:var +G=a[1];return[23,G,m(a[2],b)];default:var +H=a[2],I=a[1];return[24,I,H,m(a[3],b)]}}function +ci(a){throw[0,$,a]}function +I(a){throw[0,ch,a]}H(0);function +ck(b,a){return iq(b,a)?b:a}function +br(a){return 0<=a?a:-a|0}var +eq=2147483647;function +at(d,c){var +a=i(d),e=i(c),b=v(a+e|0);aq(d,0,b,0,a);aq(c,0,b,a,e);return F(b)}function +er(a){return a?es:et}iN(0);var +eu=ee(1),ev=ee(2),bs=[0,function(b){function +a(b){var +a=b;for(;;){if(a){var +c=a[2],d=a[1];try{cb(d)}catch(a){a=_(a);if(a[1]!==cj)throw a;var +e=a}var +a=c;continue}return 0}}return a(iO(0))}];function +cl(b){var +a=[0,0],d=bs[1];bs[1]=function(e){if(1-a[1]){a[1]=1;c(b,0)}return c(d,0)};return 0}function +ex(a){return c(bs[1],0)}var +cm=i4(0)[1],cn=i3(0),aO=(4*cn|0)-1|0;H(0);var +eE=i2(0);function +bt(c){var +b=0,a=c;for(;;){if(a){var +b=b+1|0,a=a[2];continue}return b}}function +co(d){var +a=d,b=0;for(;;){if(a){var +c=[0,a[1],b],a=a[2],b=c;continue}return b}}function +cp(a,d,b){if(d<=a)return 0;var +e=c(b,a);return[0,e,cp(a+1|0,d,b)]}var +eF=typeof +eE==="number"?10000:50;function +au(a,c){var +b=v(a);im(b,0,a,c);return b}function +cq(c,b,a){if(0<=b&&0<=a&&!((M(c)-a|0)>>0))e=1}else +if(65<=d)e=1}else{var +f=0;if(32!==d)if(43<=d)switch(d-43|0){case +5:if(a<(c+2|0)&&1>>0){if(33<(o-61|0)>>>0)r=1}else +if(2===o)r=1;if(!r){var +k=k+1|0;continue}var +e=ah(l),a=[0,0],w=M(e)-1|0,B=0;if(!(w<0)){var +j=B;for(;;){var +f=a3(e,j),g=0;if(32<=f){var +m=f-34|0,s=0;if(58>>0){if(93<=m)s=1}else +if(56<(m-1|0)>>>0){g=1;s=1}if(!s){var +n=1;g=2}}else +if(11<=f){if(13===f)g=1}else +if(8<=f)g=1;switch(g){case +0:var +n=4;break;case +1:var +n=2;break}a[1]=a[1]+n|0;var +E=j+1|0;if(w!==j){var +j=E;continue}break}}if(a[1]===M(e)){var +t=M(e),u=v(t);ap(e,0,u,0,t);var +y=u}else{var +b=v(a[1]);a[1]=0;var +x=M(e)-1|0,C=0;if(!(x<0)){var +h=C;for(;;){var +c=a3(e,h),d=0;if(35<=c)if(92===c)d=2;else +if(b2<=c)d=1;else +d=3;else +if(32<=c)if(34<=c)d=2;else +d=3;else +if(14<=c)d=1;else +switch(c){case +8:q(b,a[1],92);a[1]++;q(b,a[1],98);break;case +9:q(b,a[1],92);a[1]++;q(b,a[1],116);break;case +10:q(b,a[1],92);a[1]++;q(b,a[1],110);break;case +13:q(b,a[1],92);a[1]++;q(b,a[1],114);break;default:d=1}switch(d){case +1:q(b,a[1],92);a[1]++;q(b,a[1],48+(c/dd|0)|0);a[1]++;q(b,a[1],48+((c/10|0)%10|0)|0);a[1]++;q(b,a[1],48+(c%10|0)|0);break;case +2:q(b,a[1],92);a[1]++;q(b,a[1],c);break;case +3:q(b,a[1],c);break}a[1]++;var +D=h+1|0;if(x!==h){var +h=D;continue}break}}var +y=b}var +p=F(y)}var +z=i(p),A=au(z+2|0,34);aq(p,0,A,1,z);return F(A)}}function +cy(d,g){var +h=br(g),f=cz?cz[1]:70;switch(d[2]){case +0:var +b=102;break;case +1:var +b=101;break;case +2:var +b=69;break;case +3:var +b=dh;break;case +4:var +b=71;break;case +5:var +b=f;break;case +6:var +b=104;break;case +7:var +b=72;break;default:var +b=70}var +c=cv(16);aE(c,37);switch(d[1]){case +0:break;case +1:aE(c,43);break;default:aE(c,32)}if(8<=d[2])aE(c,35);aE(c,46);B(c,a(e+h));aE(c,b);return cx(c)}function +ba(n,a){if(13<=n){var +g=[0,0],h=i(a)-1|0,o=0;if(!(h<0)){var +c=o;for(;;){if(!(9<(T(a,c)+dp|0)>>>0))g[1]++;var +r=c+1|0;if(h!==c){var +c=r;continue}break}}var +j=g[1],k=v(i(a)+((j-1|0)/3|0)|0),l=[0,0],d=function(a){aA(k,l[1],a);l[1]++;return 0},e=[0,((j-1|0)%3|0)+1|0],m=i(a)-1|0,p=0;if(!(m<0)){var +b=p;for(;;){var +f=T(a,b);if(9<(f+dp|0)>>>0)d(f);else{if(0===e[1]){d(95);e[1]=3}e[1]+=-1;d(f)}var +q=b+1|0;if(m!==b){var +b=q;continue}break}}return F(k)}return a}function +gx(b,c){switch(b){case +1:var +a=fK;break;case +2:var +a=fL;break;case +4:var +a=fN;break;case +5:var +a=fO;break;case +6:var +a=fP;break;case +7:var +a=fQ;break;case +8:var +a=fR;break;case +9:var +a=fS;break;case +10:var +a=fT;break;case +11:var +a=fU;break;case +0:case +13:var +a=fJ;break;case +3:case +14:var +a=fM;break;default:var +a=fV}return ba(b,bj(a,c))}function +gy(b,c){switch(b){case +1:var +a=f_;break;case +2:var +a=f$;break;case +4:var +a=gb;break;case +5:var +a=gc;break;case +6:var +a=gd;break;case +7:var +a=ge;break;case +8:var +a=gf;break;case +9:var +a=gg;break;case +10:var +a=gh;break;case +11:var +a=gi;break;case +0:case +13:var +a=f9;break;case +3:case +14:var +a=ga;break;default:var +a=gj}return ba(b,bj(a,c))}function +gz(b,c){switch(b){case +1:var +a=gl;break;case +2:var +a=gm;break;case +4:var +a=go;break;case +5:var +a=gp;break;case +6:var +a=gq;break;case +7:var +a=gr;break;case +8:var +a=gs;break;case +9:var +a=gt;break;case +10:var +a=gu;break;case +11:var +a=gv;break;case +0:case +13:var +a=gk;break;case +3:case +14:var +a=gn;break;default:var +a=gw}return ba(b,bj(a,c))}function +gA(b,c){switch(b){case +1:var +a=fX;break;case +2:var +a=fY;break;case +4:var +a=f0;break;case +5:var +a=f1;break;case +6:var +a=f2;break;case +7:var +a=f3;break;case +8:var +a=f4;break;case +9:var +a=f5;break;case +10:var +a=f6;break;case +11:var +a=f7;break;case +0:case +13:var +a=fW;break;case +3:case +14:var +a=fZ;break;default:var +a=f8}return ba(b,iw(a,c))}function +ab(d,j,b){function +k(c){switch(d[1]){case +0:var +a=45;break;case +1:var +a=43;break;default:var +a=32}return is(b,j,a)}function +t(c){var +a=il(b);return 3===a?b<0.?gC:gD:4<=a?gE:c}switch(d[2]){case +5:var +f=ea(cy(d,j),b),e=0,z=i(f);for(;;){if(e===z)var +s=0;else{var +l=x(f,e)-46|0,m=0;if(23>>0){if(55===l)m=1}else +if(21<(l-1|0)>>>0)m=1;if(!m){var +e=e+1|0;continue}var +s=1}var +A=s?f:at(f,gB);return t(A)}case +6:return k(0);case +7:var +h=ah(k(0)),g=M(h);if(0===g)var +r=h;else{var +n=v(g),o=g-1|0,w=0;if(!(o<0)){var +a=w;for(;;){var +c=a3(h,a),u=0;if(97<=c&&!(dT>>0)return b;var +b=b+1|0;continue}}function +q(g,f){var +b=f;for(;;){if(b===e)return b;var +c=x(a,b),d=0;if(48<=c){if(!(58<=c))d=1}else +if(45===c)d=1;if(d){var +b=b+1|0;continue}return b}}var +f=j(0),m=p(f,f),b=cs(a,f,m-f|0),d=j(m),k=q(d,d);if(d===k)var +l=0;else +try{var +r=iG(cs(a,d,k-d|0)),l=r}catch(a){a=_(a);if(a[1]!==$)throw a;var +l=g(0)}if(j(k)!==e)g(0);var +o=0;if(ak(b,gT)&&ak(b,gU))var +n=ak(b,gV)?ak(b,gW)?ak(b,gX)?ak(b,gY)?g(0):1:2:3:0;else +o=1;if(o)var +n=4;return[0,l,n]}function +cB(a){cA[1]=[0,a,cA[1]];return 0}try{var +ib=bo(ia),cD=ib}catch(a){a=_(a);if(a!==as)throw a;try{var +h$=bo(h_),cC=h$}catch(a){a=_(a);if(a!==as)throw a;var +cC=g0}var +cD=cC}var +g1=eN(cD,82),bc=[dO,function(A){var +p=i5(0),d=[0,S(55,0),0],l=0===p.length-1?[0,0]:p,m=l.length-1,c=0;for(;;){b(d[1],c)[1+c]=c;var +z=c+1|0;if(54!==c){var +c=z;continue}var +j=[0,gZ],n=54+ck(55,m)|0,u=0;if(!(n<0)){var +f=u;for(;;){var +g=f%55|0,o=iR(f,m),v=b(l,o)[1+o],k=at(j[1],a(e+v));j[1]=iM(k,0,i(k));var +h=j[1],q=x(h,3)<<24,r=x(h,2)<<16,s=x(h,1)<<8,t=((x(h,0)+s|0)+r|0)+q|0,w=(b(d[1],g)[1+g]^t)&dw;b(d[1],g)[1+g]=w;var +y=f+1|0;if(n!==f){var +f=y;continue}break}}d[2]=0;return d}}];function +g2(i,l){var +m=i?i[1]:g1,c=16;for(;;){if(!(l<=c)&&!(cn<(c*2|0))){var +c=c*2|0;continue}if(m){var +j=ei(bc),a=bh===j?bc[1]:dO===j?eY(bc):bc;a[2]=(a[2]+1|0)%55|0;var +d=a[2],e=b(a[1],d)[1+d],f=(a[2]+24|0)%55|0,g=(b(a[1],f)[1+f]+(e^(e>>>25|0)&31)|0)&dw,h=a[2];b(a[1],h)[1+h]=g;var +k=g}else +var +k=0;return[0,0,S(c,0),k,c]}}var +bF=[p,g3,H(0)],bd=0,cE=-1;function +aU(a,b){a[13]=a[13]+b[3]|0;return cu(b,a[28])}var +cF=1000000010;function +bG(b,a){return aw(b[17],a,0,i(a))}function +be(a){return c(a[19],0)}function +cG(a,c,b){a[9]=a[9]-c|0;bG(a,b);a[11]=0;return 0}function +bf(c,a){var +b=ak(a,g4);return b?cG(c,i(a),a):b}function +aG(a,b,f){var +g=b[3],h=b[2];bf(a,b[1]);be(a);a[11]=1;var +d=(a[6]-f|0)+h|0,e=a[8],i=iI(e,d)?e:d;a[10]=i;a[9]=a[6]-a[10]|0;c(a[21],a[10]);return bf(a,g)}function +cH(b,a){return aG(b,g5,a)}function +aV(a,b){var +d=b[2],e=b[3];bf(a,b[1]);a[9]=a[9]-d|0;c(a[20],d);return bf(a,e)}function +cI(a){for(;;){var +s=a[28][2],O=s?[0,s[1]]:0;if(O){var +q=O[1],r=q[1],b=q[2],ac=0<=r?1:0,aa=q[3],ab=a[13]-a[12]|0,P=ac||(a[9]<=ab?1:0);if(P){var +g=a[28],n=g[2];if(n){if(n[2]){var +Q=n[2];g[1]=g[1]-1|0;g[2]=Q}else +by(g);var +m=0<=r?r:cF;if(typeof +b==="number")switch(b){case +0:var +y=aD(a[3]);if(y){var +z=y[1][1],A=function(b,a){if(a){var +c=a[1],d=a[2];return iJ(b,c)?[0,b,a]:[0,c,A(b,d)]}return[0,b,0]};z[1]=A(a[6]-a[9]|0,z[1])}break;case +1:aC(a[2]);break;case +2:aC(a[3]);break;case +3:var +B=aD(a[2]);if(B)cH(a,B[1][2]);else +be(a);break;case +4:if(a[10]!==(a[6]-a[9]|0)){var +e=a[28],h=e[2];if(h){var +t=h[1];if(h[2]){var +R=h[2];e[1]=e[1]-1|0;e[2]=R;var +j=[0,t]}else{by(e);var +j=[0,t]}}else +var +j=0;if(j){var +x=j[1],T=x[1];a[12]=a[12]-x[3]|0;a[9]=a[9]+T|0}}break;default:var +C=aC(a[5]);if(C)bG(a,c(a[25],C[1]))}else +switch(b[0]){case +0:cG(a,m,b[1]);break;case +1:var +d=b[2],k=b[1],D=d[1],U=d[2],E=aD(a[2]);if(E){var +F=E[1],f=F[2];switch(F[1]){case +0:aV(a,k);break;case +1:aG(a,d,f);break;case +2:aG(a,d,f);break;case +3:if(a[9]<(m+i(D)|0))aG(a,d,f);else +aV(a,k);break;case +4:if(a[11]||!(a[9]<(m+i(D)|0)||((a[6]-f|0)+U|0)>>0))cH(a,w)}else +be(a)}var +_=a[9]-Z|0,$=1===M?1:a[9]>>0)return 0.;switch(a){case +0:return 1.;case +1:return 4.;default:return 1.}})}),s=c(aH[3],K),A=a-1|0,L=0;if(!(A<0)){var +e=L;for(;;){if(0===e)var +T=b(d,0)[1],l=c1(bM(6.,b(d,1)[2]),T);else +if((e+1|0)===a)var +D=a+1|0,W=b(d,a)[1+a],X=b(d,D)[1+D],l=c1(bM(6.,W),X);else +var +E=e+1|0,l=bM(6.,b(d,E)[1+E]);var +U=l[2];aw(aH[10],s,[0,e+1|0,a+1|0],l[1]);aw(aH[10],s,[0,e+1|0,a+2|0],U);var +V=e+1|0;if(A!==e){var +e=V;continue}break}}var +B=c(aH[12],s),M=g(aH[6],B,a+1|0)[2],C=a+1|0,N=g(aH[6],B,a+2|0)[2],t=S(a+2|0,b(d,C)[1+C]),O=1;if(!(a<1)){var +f=O;for(;;){var +Q=[an,dY(M,f-1|0),dY(N,f-1|0)];b(t,f)[1+f]=Q;var +R=f+1|0;if(a!==f){var +f=R;continue}break}}var +P=b(d,0)[1];b(t,0)[1]=P;var +m=[0,t]}else +var +m=[1,378784796];if(0===m[0])var +q=m[1],Y=q.length-1-1|0,v=[0,bv((Y-1|0)+1|0,function(h){var +a=h+1|0,c=a-1|0,e=b(q,c)[1+c],f=b(q,a)[1+a],g=a-1|0,i=b(d,g)[1+g],j=b(d,a)[1+a],k=c2(e,f,0.33333333333333331);return[0,i,j,k,c2(e,f,0.66666666666666663)]})];else +var +v=m;if(0===v[0]){var +w=v[1],k=w.length-1;if(k!==i.length-1)var +x=I(eQ);else +if(0===k)var +x=[0];else{var +y=S(k,c4(w[1],i[1])),z=k-1|0,H=1;if(!(z<1)){var +h=H;for(;;){y[1+h]=c4(w[1+h],i[1+h]);var +J=h+1|0;if(z!==h){var +h=J;continue}break}}var +x=y}return c0([0,dU,[0,Z,x]])}return 0}return c0([0,-912009552,n])});ex(0);return}(function(){return this}())); diff --git a/pelicanconf.py b/pelicanconf.py index e81d9ea..a572382 100755 --- a/pelicanconf.py +++ b/pelicanconf.py @@ -53,20 +53,18 @@ TYPOGRIFY = False TEMPLATE_PAGES = {'../extras/404.html': '404.html'} STATIC_PATHS = \ - ( 'images/profile.png' + ( 'images' , '../extras/robots.txt' , '../extras/htaccess' , '../extras/custom.css' + , 'pages/script.it' ) EXTRA_PATH_METADATA = \ - { '../extras/robots.txt': \ - {'path': 'robots.txt'} - , '../extras/htaccess': \ - {'path': '.htaccess'} - , '../extras/custom.css': \ - {'path': 'custom.css'}} - + { '../extras/robots.txt': {'path': 'robots.txt'} + , '../extras/htaccess': {'path': '.htaccess'} + , '../extras/custom.css': {'path': 'custom.css'} + } PLUGIN_PATHS = ['plugins'] @@ -74,7 +72,8 @@ PLUGIN_PATHS = ['plugins'] PLUGINS = \ ( 'related_posts' , 'typogrify' - , 'i18n_subsites' ) + , 'i18n_subsites' + , 'render_math' ) RELATED_POSTS_IGNORE_TAGS = ["Libre"] diff --git a/plugins/render_math/Readme.md b/plugins/render_math/Readme.md new file mode 100755 index 0000000..7d541aa --- /dev/null +++ b/plugins/render_math/Readme.md @@ -0,0 +1,167 @@ +Math Render Plugin For Pelican +============================== + +**NOTE: [This plugin has been moved to its own repository](https://github.com/pelican-plugins/render-math). Please file any issues/PRs there. Once all plugins have been migrated to the [new Pelican Plugins organization](https://github.com/pelican-plugins), this monolithic repository will be archived.** + +This plugin gives pelican the ability to render mathematics. It accomplishes +this by using the [MathJax](http://www.mathjax.org/) javascript engine. + +The plugin also ensures that Typogrify and recognized math "play" nicely together, by +ensuring [Typogrify](https://github.com/mintchaos/typogrify) does not alter math content. + +Both Markdown and reStructuredText is supported. + +Requirements +------------ + + * Pelican version *3.6* or above is required. + * Typogrify version *2.0.7* or higher is needed for Typogrify to play + "nicely" with this plugin. If this version is not available, Typogrify + will be disabled for the entire site. + * BeautifulSoup4 is required to correct summaries. If BeautifulSoup4 is + not installed, summary processing will be ignored, even if specified + in user settings. + +Installation +------------ +To enable, ensure that `render_math` plugin is accessible. +Then add the following to settings.py: + + PLUGINS = ["render_math"] + +Your site is now capable of rendering math math using the mathjax JavaScript +engine. No alterations to the template is needed, just use and enjoy! + +However, if you wish, you can set the `auto_insert` setting to `False` which +will disable the mathjax script from being automatically inserted into the +content. You would only want to do this if you had control over the template +and wanted to insert the script manually. + +### Typogrify +In the past, using [Typgogrify](https://github.com/mintchaos/typogrify) would +alter the math contents resulting in math that could not be rendered by MathJax. +The only option was to ensure that Typogrify was disabled in the settings. + +The problem has been rectified in this plugin, but it requires at a minimum +[Typogrify version 2.0.7](https://pypi.python.org/pypi/typogrify) (or higher). +If this version is not present, the plugin will disable Typogrify for the entire +site. + +### BeautifulSoup4 +Pelican creates summaries by truncating the contents to a specified user length. +The truncation process is oblivious to any math and can therefore destroy +the math output in the summary. + +To restore math, [BeautifulSoup4](https://pypi.python.org/pypi/beautifulsoup4/4.4.0) +is used. If it is not installed, no summary processing will happen. + +Usage +----- +### Templates +No alteration is needed to a template for this plugin to work. Just install +the plugin and start writing your Math. + +### Settings +Certain MathJax rendering options can be set. These options +are in a dictionary variable called `MATH_JAX` in the pelican +settings file. + +The dictionary can be set with the following keys: + + * `align`: [string] controls how displayed math will be aligned. Can be set to either +`'left'`, `'right'` or `'center'`. **Default Value**: `'center'`. + * `auto_insert`: [boolean] will insert the mathjax script into content that it is +detected to have math in it. Setting it to false is not recommended. +**Default Value**: `True` + * `indent`: [string] if `align` not set to `'center'`, then this controls the indent +level. **Default Value**: `'0em'`. + * `show_menu`: [boolean] controls whether the mathjax contextual menu is shown. +**Default Value**: `True` + * `process_escapes`: [boolean] controls whether mathjax processes escape sequences. +**Default Value**: `True` + * `mathjax_font`: [string] will force mathjax to use the chosen font. Current choices +for the font is `sanserif`, `typewriter` or `fraktur`. If this is not set, it will +use the default font settings. **Default Value**: `default` + * `latex_preview`: [string] controls the preview message users are shown while mathjax is +rendering LaTex. If set to `'Tex'`, then the TeX code is used as the preview +(which will be visible until it is processed by MathJax). **Default Value**: `'Tex'` + * `color`: [string] controls the color of the mathjax rendered font. **Default Value**: `'inherit'` + * `linebreak_automatic`: [boolean] If set, Mathjax will try to *intelligently* break up displayed math +(Note: It will not work for inline math). This is very useful for a responsive site. It +is turned off by default due to it potentially being CPU expensive. **Default Value**: `False` + * `tex_extensions`: [list] a list of [latex extensions](http://docs.mathjax.org/en/latest/tex.html#tex-and-latex-extensions) +accepted by mathjax. **Default Value**: `[]` (empty list) + * `responsive`: [boolean] tries to make displayed math render responsively. It does by determining if the width +is less than `responsive_break` (see below) and if so, sets `align` to `left`, `indent` to `0em` and `linebreak_automatic` to `True`. +**Default Value**: `False` (defaults to `False` for backward compatibility) + * `responsive_break`: [integer] a number (in pixels) representing the width breakpoint that is used +when setting `responsive_align` to `True`. **Default Value**: 768 + * `process_summary`: [boolean] ensures math will render in summaries and fixes math in that were cut off. +Requires [BeautifulSoup4](http://www.crummy.com/software/BeautifulSoup/bs4/doc/) be installed. **Default Value**: `True` + * `message_style`: [string] This value controls the verbosity of the messages in the lower left-hand corner. Set it to `None` to eliminate all messages. +**Default Value**: normal + +#### Settings Examples +Make math render in blue and displaymath align to the left: + + MATH_JAX = {'color':'blue','align':left} + +Use the [color](http://docs.mathjax.org/en/latest/tex.html#color) and +[mhchem](http://docs.mathjax.org/en/latest/tex.html#mhchem) extensions: + + MATH_JAX = {'tex_extensions': ['color.js','mhchem.js']} + +#### Resulting HTML +Inlined math is wrapped in `span` tags, while displayed math is wrapped in `div` tags. +These tags will have a class attribute that is set to `math` which +can be used by template designers to alter the display of the math. + +Markdown +-------- +This plugin implements a custom extension for markdown resulting in math +being a "first class citizen" for Pelican. + +### Inlined Math +Math between `$`..`$`, for example, `$`x^2`$`, will be rendered inline +with respect to the current html block. Note: To use inline math, there +must *not* be any whitespace before the ending `$`. So for example: + + * **Relevant inline math**: `$e=mc^2$` + * **Will not render as inline math**: `$40 vs $50` + +### Displayed Math +Math between `$$`..`$$` will be rendered "block style", for example, `$$`x^2`$$`, will be rendered centered in a +new paragraph. + +#### Other Latex Display Math commands +The other LaTeX commands which usually invoke display math mode from text mode +are supported, +and are automatically treated like `$$`-style displayed math +in that they are rendered "block" style on their own lines. +For example, `\begin{equation}` x^2 `\end{equation}`, +will be rendered in its own block with a right justified equation number +at the top of the block. This equation number can be referenced in the document. +To do this, use a `label` inside of the equation format and then refer to that label +using `ref`. For example: `\begin{equation}` `\label{eq}` X^2 `\end{equation}`. +Now refer to that equation number by `$`\ref{eq}`$`. + +reStructuredText +---------------- +If there is math detected in reStructuredText document, the plugin will automatically +set the [math_output](http://docutils.sourceforge.net/docs/user/config.html#math-output) configuration setting to `MathJax`. + +### Inlined Math +Inlined math needs to use the [math role](http://docutils.sourceforge.net/docs/ref/rst/roles.html#math): + +``` +The area of a circle is :math:`A_\text{c} = (\pi/4) d^2`. +``` + +### Displayed Math +Displayed math uses the [math block](http://docutils.sourceforge.net/docs/ref/rst/directives.html#math): + +``` +.. math:: + + α_t(i) = P(O_1, O_2, … O_t, q_t = S_i λ) +``` diff --git a/plugins/render_math/__init__.py b/plugins/render_math/__init__.py new file mode 100755 index 0000000..2ac15dd --- /dev/null +++ b/plugins/render_math/__init__.py @@ -0,0 +1 @@ +from .math import * diff --git a/plugins/render_math/math.py b/plugins/render_math/math.py new file mode 100755 index 0000000..165d59e --- /dev/null +++ b/plugins/render_math/math.py @@ -0,0 +1,367 @@ +# -*- coding: utf-8 -*- +""" +Math Render Plugin for Pelican +============================== +This plugin allows your site to render Math. It uses +the MathJax JavaScript engine. + +For markdown, the plugin works by creating a Markdown +extension which is used during the markdown compilation +stage. Math therefore gets treated like a "first class +citizen" in Pelican + +For reStructuredText, the plugin instructs the rst engine +to output Mathjax for all math. + +The mathjax script is by default automatically inserted +into the HTML. + +Typogrify Compatibility +----------------------- +This plugin now plays nicely with Typogrify, but it +requires Typogrify version 2.07 or above. + +User Settings +------------- +Users are also able to pass a dictionary of settings +in the settings file which will control how the MathJax +library renders things. This could be very useful for +template builders that want to adjust the look and feel of +the math. See README for more details. +""" + +import os +import sys + +from pelican import signals, generators + +try: + from bs4 import BeautifulSoup +except ImportError as e: + BeautifulSoup = None + +try: + from . pelican_mathjax_markdown_extension import PelicanMathJaxExtension +except ImportError as e: + PelicanMathJaxExtension = None + +try: + string_type = basestring +except NameError: + string_type = str + + +def process_settings(pelicanobj): + """Sets user specified MathJax settings (see README for more details)""" + + mathjax_settings = {} + + # NOTE TO FUTURE DEVELOPERS: Look at the README and what is happening in + # this function if any additional changes to the mathjax settings need to + # be incorporated. Also, please inline comment what the variables + # will be used for + + # Default settings + mathjax_settings['auto_insert'] = True # if set to true, it will insert mathjax script automatically into content without needing to alter the template. + mathjax_settings['align'] = 'center' # controls alignment of of displayed equations (values can be: left, right, center) + mathjax_settings['indent'] = '0em' # if above is not set to 'center', then this setting acts as an indent + mathjax_settings['show_menu'] = 'true' # controls whether to attach mathjax contextual menu + mathjax_settings['process_escapes'] = 'true' # controls whether escapes are processed + mathjax_settings['latex_preview'] = 'TeX' # controls what user sees while waiting for LaTex to render + mathjax_settings['color'] = 'inherit' # controls color math is rendered in + mathjax_settings['linebreak_automatic'] = 'false' # Set to false by default for performance reasons (see http://docs.mathjax.org/en/latest/output.html#automatic-line-breaking) + mathjax_settings['tex_extensions'] = '' # latex extensions that can be embedded inside mathjax (see http://docs.mathjax.org/en/latest/tex.html#tex-and-latex-extensions) + mathjax_settings['responsive'] = 'false' # Tries to make displayed math responsive + mathjax_settings['responsive_break'] = '768' # The break point at which it math is responsively aligned (in pixels) + mathjax_settings['mathjax_font'] = 'default' # forces mathjax to use the specified font. + mathjax_settings['process_summary'] = BeautifulSoup is not None # will fix up summaries if math is cut off. Requires beautiful soup + mathjax_settings['message_style'] = 'normal' # This value controls the verbosity of the messages in the lower left-hand corner. Set it to "none" to eliminate all messages + mathjax_settings['font_list'] = ['STIX', 'TeX'] # Include in order of preference among TeX, STIX-Web, Asana-Math, Neo-Euler, Gyre-Pagella, Gyre-Termes and Latin-Modern + mathjax_settings['equation_numbering'] = 'none' # AMS, auto, none + + # Source for MathJax + mathjax_settings['source'] = "'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML'" + + # Get the user specified settings + try: + settings = pelicanobj.settings['MATH_JAX'] + except: + settings = None + + # If no settings have been specified, then return the defaults + if not isinstance(settings, dict): + return mathjax_settings + + # The following mathjax settings can be set via the settings dictionary + for key, value in ((key, settings[key]) for key in settings): + # Iterate over dictionary in a way that is compatible with both version 2 + # and 3 of python + + if key == 'align': + typeVal = isinstance(value, string_type) + + if not typeVal: + continue + + if value == 'left' or value == 'right' or value == 'center': + mathjax_settings[key] = value + else: + mathjax_settings[key] = 'center' + + if key == 'indent': + mathjax_settings[key] = value + + if key == 'source': + mathjax_settings[key] = value + + if key == 'show_menu' and isinstance(value, bool): + mathjax_settings[key] = 'true' if value else 'false' + + if key == 'message_style': + mathjax_settings[key] = value if value is not None else 'none' + + if key == 'auto_insert' and isinstance(value, bool): + mathjax_settings[key] = value + + if key == 'process_escapes' and isinstance(value, bool): + mathjax_settings[key] = 'true' if value else 'false' + + if key == 'latex_preview': + typeVal = isinstance(value, string_type) + + if not typeVal: + continue + + mathjax_settings[key] = value + + if key == 'color': + typeVal = isinstance(value, string_type) + + if not typeVal: + continue + + mathjax_settings[key] = value + + if key == 'linebreak_automatic' and isinstance(value, bool): + mathjax_settings[key] = 'true' if value else 'false' + + if key == 'process_summary' and isinstance(value, bool): + if value and BeautifulSoup is None: + print("BeautifulSoup4 is needed for summaries to be processed by render_math\nPlease install it") + value = False + + mathjax_settings[key] = value + + if key == 'responsive' and isinstance(value, bool): + mathjax_settings[key] = 'true' if value else 'false' + + if key == 'responsive_break' and isinstance(value, int): + mathjax_settings[key] = str(value) + + if key == 'tex_extensions' and isinstance(value, list): + # filter string values, then add '' to them + value = filter(lambda string: isinstance(string, string_type), value) + value = map(lambda string: "'%s'" % string, value) + mathjax_settings[key] = ',' + ','.join(value) + + if key == 'mathjax_font': + typeVal = isinstance(value, string_type) + + if not typeVal: + continue + + value = value.lower() + + if value == 'sanserif': + value = 'SansSerif' + elif value == 'fraktur': + value = 'Fraktur' + elif value == 'typewriter': + value = 'Typewriter' + else: + value = 'default' + + mathjax_settings[key] = value + + if key == 'font_list' and isinstance(value, list): + # make an array string from the list + value = filter(lambda string: isinstance(string, string_type), value) + value = map(lambda string: ",'%s'" % string, value) + mathjax_settings[key] = ''.join(value)[1:] + + if key == 'equation_numbering': + mathjax_settings[key] = value if value is not None else 'none' + + return mathjax_settings + +def process_summary(article): + """Ensures summaries are not cut off. Also inserts + mathjax script so that math will be rendered""" + + summary = article.summary + summary_parsed = BeautifulSoup(summary, 'html.parser') + math = summary_parsed.find_all(class_='math') + + if len(math) > 0: + last_math_text = math[-1].get_text() + if len(last_math_text) > 3 and last_math_text[-3:] == '...': + content_parsed = BeautifulSoup(article._content, 'html.parser') + full_text = content_parsed.find_all(class_='math')[len(math)-1].get_text() + math[-1].string = "%s ..." % full_text + summary = summary_parsed.decode() + + # clear memoization cache + import functools + if isinstance(article.get_summary, functools.partial): + memoize_instance = article.get_summary.func.__self__ + memoize_instance.cache.clear() + + article._summary = "%s" % (summary, process_summary.mathjax_script) + +def configure_typogrify(pelicanobj, mathjax_settings): + """Instructs Typogrify to ignore math tags - which allows Typogrify + to play nicely with math related content""" + + # If Typogrify is not being used, then just exit + if not pelicanobj.settings.get('TYPOGRIFY', False): + return + + try: + import typogrify + from distutils.version import LooseVersion + + if LooseVersion(typogrify.__version__) < LooseVersion('2.0.7'): + raise TypeError('Incorrect version of Typogrify') + + from typogrify.filters import typogrify + + # At this point, we are happy to use Typogrify, meaning + # it is installed and it is a recent enough version + # that can be used to ignore all math + # Instantiate markdown extension and append it to the current extensions + pelicanobj.settings['TYPOGRIFY_IGNORE_TAGS'].extend(['.math', 'script']) # ignore math class and script + + except (ImportError, TypeError) as e: + pelicanobj.settings['TYPOGRIFY'] = False # disable Typogrify + + if isinstance(e, ImportError): + print("\nTypogrify is not installed, so it is being ignored.\nIf you want to use it, please install via: pip install typogrify\n") + + if isinstance(e, TypeError): + print("\nA more recent version of Typogrify is needed for the render_math module.\nPlease upgrade Typogrify to the latest version (anything equal or above version 2.0.7 is okay).\nTypogrify will be turned off due to this reason.\n") + +def process_mathjax_script(mathjax_settings): + """Load the mathjax script template from file, and render with the settings""" + + # Read the mathjax javascript template from file + with open (os.path.dirname(os.path.realpath(__file__)) + + '/mathjax_script_template', 'r') as mathjax_script_template: + mathjax_template = mathjax_script_template.read() + + return mathjax_template.format(**mathjax_settings) + +def mathjax_for_markdown(pelicanobj, mathjax_script, mathjax_settings): + """Instantiates a customized markdown extension for handling mathjax + related content""" + + # Create the configuration for the markdown template + config = {} + config['mathjax_script'] = mathjax_script + config['math_tag_class'] = 'math' + config['auto_insert'] = mathjax_settings['auto_insert'] + + # Instantiate markdown extension and append it to the current extensions + try: + if isinstance(pelicanobj.settings.get('MD_EXTENSIONS'), list): # pelican 3.6.3 and earlier + pelicanobj.settings['MD_EXTENSIONS'].append(PelicanMathJaxExtension(config)) + else: + pelicanobj.settings['MARKDOWN'].setdefault('extensions', []).append(PelicanMathJaxExtension(config)) + except: + sys.excepthook(*sys.exc_info()) + sys.stderr.write("\nError - the pelican mathjax markdown extension failed to configure. MathJax is non-functional.\n") + sys.stderr.flush() + +def mathjax_for_rst(pelicanobj, mathjax_script, mathjax_settings): + """Setup math for RST""" + docutils_settings = pelicanobj.settings.get('DOCUTILS_SETTINGS', {}) + docutils_settings.setdefault('math_output', 'MathJax %s' % mathjax_settings['source']) + pelicanobj.settings['DOCUTILS_SETTINGS'] = docutils_settings + rst_add_mathjax.mathjax_script = mathjax_script + +def pelican_init(pelicanobj): + """ + Loads the mathjax script according to the settings. + Instantiate the Python markdown extension, passing in the mathjax + script as config parameter. + """ + + # Process settings, and set global var + mathjax_settings = process_settings(pelicanobj) + + # Generate mathjax script + mathjax_script = process_mathjax_script(mathjax_settings) + + # Configure Typogrify + configure_typogrify(pelicanobj, mathjax_settings) + + # Configure Mathjax For Markdown + if PelicanMathJaxExtension: + mathjax_for_markdown(pelicanobj, mathjax_script, mathjax_settings) + + # Configure Mathjax For RST + mathjax_for_rst(pelicanobj, mathjax_script, mathjax_settings) + + # Set process_summary's mathjax_script variable + process_summary.mathjax_script = None + if mathjax_settings['process_summary']: + process_summary.mathjax_script = mathjax_script + +def rst_add_mathjax(content): + """Adds mathjax script for reStructuredText""" + + # .rst is the only valid extension for reStructuredText files + _, ext = os.path.splitext(os.path.basename(content.source_path)) + if ext != '.rst': + return + + # If math class is present in text, add the javascript + # note that RST hardwires mathjax to be class "math" + if 'class="math"' in content._content: + content._content += "" % rst_add_mathjax.mathjax_script + +def process_rst_and_summaries(content_generators): + """ + Ensure mathjax script is applied to RST and summaries are + corrected if specified in user settings. + + Handles content attached to ArticleGenerator and PageGenerator objects, + since the plugin doesn't know how to handle other Generator types. + + For reStructuredText content, examine both articles and pages. + If article or page is reStructuredText and there is math present, + append the mathjax script. + + Also process summaries if present (only applies to articles) + and user wants summaries processed (via user settings) + """ + + for generator in content_generators: + if isinstance(generator, generators.ArticlesGenerator): + for article in ( + generator.articles + + generator.translations + + generator.drafts): + rst_add_mathjax(article) + #optionally fix truncated formulae in summaries. + if process_summary.mathjax_script is not None: + process_summary(article) + elif isinstance(generator, generators.PagesGenerator): + for page in generator.pages: + rst_add_mathjax(page) + for page in generator.hidden_pages: + rst_add_mathjax(page) + +def register(): + """Plugin registration""" + signals.initialized.connect(pelican_init) + signals.all_generators_finalized.connect(process_rst_and_summaries) diff --git a/plugins/render_math/mathjax_script_template b/plugins/render_math/mathjax_script_template new file mode 100755 index 0000000..db8aeba --- /dev/null +++ b/plugins/render_math/mathjax_script_template @@ -0,0 +1,61 @@ +if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {{ + var align = "{align}", + indent = "{indent}", + linebreak = "{linebreak_automatic}"; + + if ({responsive}) {{ + align = (screen.width < {responsive_break}) ? "left" : align; + indent = (screen.width < {responsive_break}) ? "0em" : indent; + linebreak = (screen.width < {responsive_break}) ? 'true' : linebreak; + }} + + var mathjaxscript = document.createElement('script'); + mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#'; + mathjaxscript.type = 'text/javascript'; + mathjaxscript.src = {source}; + + var configscript = document.createElement('script'); + configscript.type = 'text/x-mathjax-config'; + configscript[(window.opera ? "innerHTML" : "text")] = + "MathJax.Hub.Config({{" + + " config: ['MMLorHTML.js']," + + " TeX: {{ extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'{tex_extensions}], equationNumbers: {{ autoNumber: '{equation_numbering}' }} }}," + + " jax: ['input/TeX','input/MathML','output/HTML-CSS']," + + " extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," + + " displayAlign: '"+ align +"'," + + " displayIndent: '"+ indent +"'," + + " showMathMenu: {show_menu}," + + " messageStyle: '{message_style}'," + + " tex2jax: {{ " + + " inlineMath: [ ['\\\\(','\\\\)'] ], " + + " displayMath: [ ['$$','$$'] ]," + + " processEscapes: {process_escapes}," + + " preview: '{latex_preview}'," + + " }}, " + + " 'HTML-CSS': {{ " + + " availableFonts: {font_list}," + + " preferredFont: 'STIX'," + + " styles: {{ '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {{color: '{color} ! important'}} }}," + + " linebreaks: {{ automatic: "+ linebreak +", width: '90% container' }}," + + " }}, " + + "}}); " + + "if ('{mathjax_font}' !== 'default') {{" + + "MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {{" + + "var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" + + "VARIANT['normal'].fonts.unshift('MathJax_{mathjax_font}');" + + "VARIANT['bold'].fonts.unshift('MathJax_{mathjax_font}-bold');" + + "VARIANT['italic'].fonts.unshift('MathJax_{mathjax_font}-italic');" + + "VARIANT['-tex-mathit'].fonts.unshift('MathJax_{mathjax_font}-italic');" + + "}});" + + "MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {{" + + "var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" + + "VARIANT['normal'].fonts.unshift('MathJax_{mathjax_font}');" + + "VARIANT['bold'].fonts.unshift('MathJax_{mathjax_font}-bold');" + + "VARIANT['italic'].fonts.unshift('MathJax_{mathjax_font}-italic');" + + "VARIANT['-tex-mathit'].fonts.unshift('MathJax_{mathjax_font}-italic');" + + "}});" + + "}}"; + + (document.body || document.getElementsByTagName('head')[0]).appendChild(configscript); + (document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript); +}} diff --git a/plugins/render_math/pelican_mathjax_markdown_extension.py b/plugins/render_math/pelican_mathjax_markdown_extension.py new file mode 100755 index 0000000..e739363 --- /dev/null +++ b/plugins/render_math/pelican_mathjax_markdown_extension.py @@ -0,0 +1,158 @@ +# -*- coding: utf-8 -*- +""" +Pelican Mathjax Markdown Extension +================================== +An extension for the Python Markdown module that enables +the Pelican python blog to process mathjax. This extension +gives Pelican the ability to use Mathjax as a "first class +citizen" of the blog +""" + +import markdown + +from markdown.util import etree +from markdown.util import AtomicString + +class PelicanMathJaxPattern(markdown.inlinepatterns.Pattern): + """Inline markdown processing that matches mathjax""" + + def __init__(self, pelican_mathjax_extension, tag, pattern): + super(PelicanMathJaxPattern,self).__init__(pattern) + self.math_tag_class = pelican_mathjax_extension.getConfig('math_tag_class') + self.pelican_mathjax_extension = pelican_mathjax_extension + self.tag = tag + + def handleMatch(self, m): + node = markdown.util.etree.Element(self.tag) + node.set('class', self.math_tag_class) + + prefix = '\\(' if m.group('prefix') == '$' else m.group('prefix') + suffix = '\\)' if m.group('suffix') == '$' else m.group('suffix') + node.text = markdown.util.AtomicString(prefix + m.group('math') + suffix) + + # If mathjax was successfully matched, then JavaScript needs to be added + # for rendering. The boolean below indicates this + self.pelican_mathjax_extension.mathjax_needed = True + return node + +class PelicanMathJaxCorrectDisplayMath(markdown.treeprocessors.Treeprocessor): + """Corrects invalid html that results from a
being put inside + a

for displayed math""" + + def __init__(self, pelican_mathjax_extension): + self.pelican_mathjax_extension = pelican_mathjax_extension + + def correct_html(self, root, children, div_math, insert_idx, text): + """Separates out

from the parent tag

. Anything + in between is put into its own parent tag of

""" + + current_idx = 0 + + for idx in div_math: + el = markdown.util.etree.Element('p') + el.text = text + el.extend(children[current_idx:idx]) + + # Test to ensure that empty

is not inserted + if len(el) != 0 or (el.text and not el.text.isspace()): + root.insert(insert_idx, el) + insert_idx += 1 + + text = children[idx].tail + children[idx].tail = None + root.insert(insert_idx, children[idx]) + insert_idx += 1 + current_idx = idx+1 + + el = markdown.util.etree.Element('p') + el.text = text + el.extend(children[current_idx:]) + + if len(el) != 0 or (el.text and not el.text.isspace()): + root.insert(insert_idx, el) + + def run(self, root): + """Searches for

that are children in

tags and corrects + the invalid HTML that results""" + + math_tag_class = self.pelican_mathjax_extension.getConfig('math_tag_class') + + for parent in root: + div_math = [] + children = list(parent) + + for div in parent.findall('div'): + if div.get('class') == math_tag_class: + div_math.append(children.index(div)) + + # Do not process further if no displayed math has been found + if not div_math: + continue + + insert_idx = list(root).index(parent) + self.correct_html(root, children, div_math, insert_idx, parent.text) + root.remove(parent) # Parent must be removed last for correct insertion index + + return root + +class PelicanMathJaxAddJavaScript(markdown.treeprocessors.Treeprocessor): + """Tree Processor for adding Mathjax JavaScript to the blog""" + + def __init__(self, pelican_mathjax_extension): + self.pelican_mathjax_extension = pelican_mathjax_extension + + def run(self, root): + # If no mathjax was present, then exit + if (not self.pelican_mathjax_extension.mathjax_needed): + return root + + # Add the mathjax script to the html document + mathjax_script = etree.Element('script') + mathjax_script.set('type','text/javascript') + mathjax_script.text = AtomicString(self.pelican_mathjax_extension.getConfig('mathjax_script')) + root.append(mathjax_script) + + # Reset the boolean switch to false so that script is only added + # to other pages if needed + self.pelican_mathjax_extension.mathjax_needed = False + return root + +class PelicanMathJaxExtension(markdown.Extension): + """A markdown extension enabling mathjax processing in Markdown for Pelican""" + def __init__(self, config): + + try: + # Needed for markdown versions >= 2.5 + self.config['mathjax_script'] = ['', 'Mathjax JavaScript script'] + self.config['math_tag_class'] = ['math', 'The class of the tag in which mathematics is wrapped'] + self.config['auto_insert'] = [True, 'Determines if mathjax script is automatically inserted into content'] + super(PelicanMathJaxExtension,self).__init__(**config) + except AttributeError: + # Markdown versions < 2.5 + config['mathjax_script'] = [config['mathjax_script'], 'Mathjax JavaScript script'] + config['math_tag_class'] = [config['math_tag_class'], 'The class of the tag in which mathematic is wrapped'] + config['auto_insert'] = [config['auto_insert'], 'Determines if mathjax script is automatically inserted into content'] + super(PelicanMathJaxExtension,self).__init__(config) + + # Used as a flag to determine if javascript + # needs to be injected into a document + self.mathjax_needed = False + + def extendMarkdown(self, md): + # Regex to detect mathjax + mathjax_inline_regex = r'(?P\$)(?P.+?)(?P(?\$\$|\\begin\{(.+?)\})(?P.+?)(?P\2|\\end\{\3\})' + + # Process mathjax before escapes are processed since escape processing will + # intefer with mathjax. The order in which the displayed and inlined math + # is registered below matters: we should have higher priority than 'escape' which has 180 + md.inlinePatterns.register(PelicanMathJaxPattern(self, 'div', mathjax_display_regex), 'mathjax_displayed', 186) + md.inlinePatterns.register(PelicanMathJaxPattern(self, 'span', mathjax_inline_regex), 'mathjax_inlined', 185) + + # Correct the invalid HTML that results from teh displayed math (

tag within a

tag) + md.treeprocessors.register(PelicanMathJaxCorrectDisplayMath(self), 'mathjax_correctdisplayedmath', 15) + + # If necessary, add the JavaScript Mathjax library to the document. This must + # be last in the ordered dict (hence it is given the position '_end') + if self.getConfig('auto_insert'): + md.treeprocessors.register(PelicanMathJaxAddJavaScript(self), 'mathjax_addjavascript', 0) diff --git a/plugins/render_math/requirements.txt b/plugins/render_math/requirements.txt new file mode 100755 index 0000000..be64ec9 --- /dev/null +++ b/plugins/render_math/requirements.txt @@ -0,0 +1 @@ +typogrify diff --git a/plugins/render_math/test_data/article.ipynb b/plugins/render_math/test_data/article.ipynb new file mode 100755 index 0000000..890f8be --- /dev/null +++ b/plugins/render_math/test_data/article.ipynb @@ -0,0 +1,42 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "source": [ + "The formula is:\n", + "\n", + "\\begin{align*}A =\n", + "LL^{T}\n", + "\\end{align*}\n" + ], + "metadata": {} + } + ], + "metadata": { + "kernelspec": { + "name": "python3", + "language": "python", + "display_name": "Python 3" + }, + "language_info": { + "name": "python", + "version": "3.7.3", + "mimetype": "text/x-python", + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "pygments_lexer": "ipython3", + "nbconvert_exporter": "python", + "file_extension": ".py" + }, + "kernel_info": { + "name": "python3" + }, + "nteract": { + "version": "0.14.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} \ No newline at end of file diff --git a/plugins/render_math/test_data/article.nbdata b/plugins/render_math/test_data/article.nbdata new file mode 100755 index 0000000..bf13538 --- /dev/null +++ b/plugins/render_math/test_data/article.nbdata @@ -0,0 +1,5 @@ +Title: An article from a Jupyter notebook +Date: 2019-03-05 12:14 +Category: Mathematics +Tags: Linear Algebra, Python, Numpy, Scipy +Summary: This is a advance part of Linear Algebra with Python \ No newline at end of file diff --git a/plugins/render_math/test_data/article_with_math_formulas.rst b/plugins/render_math/test_data/article_with_math_formulas.rst new file mode 100755 index 0000000..87dcc45 --- /dev/null +++ b/plugins/render_math/test_data/article_with_math_formulas.rst @@ -0,0 +1,20 @@ +Math formulas +############# + +:date: 2019-09-10 +:yeah: oh yeah ! +:summary: :math:`A_\text{c} = (\pi/4) d^2` + +The area of a circle is :math:`A_\text{c} = (\pi/4) d^2`. + +.. math:: + + α_t(i) = P(O_1, O_2, … O_t, q_t = S_i λ) + + A = + \begin{bmatrix} + a_{11} & a_{12} & a_{13} \ + a_{21} & a_{22} & a_{23} \ + a_{31} & a_{32} & a_{33} + \end{bmatrix} + \ No newline at end of file diff --git a/plugins/render_math/test_render_math.py b/plugins/render_math/test_render_math.py new file mode 100755 index 0000000..b71f4e7 --- /dev/null +++ b/plugins/render_math/test_render_math.py @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- +from os.path import dirname, join +from tempfile import TemporaryDirectory + +from pelican import Pelican +from pelican.generators import ArticlesGenerator +from pelican.settings import configure_settings +from pelican.tests.support import get_settings, unittest +from pelican.writers import Writer + +from .math import pelican_init, process_rst_and_summaries + + +CUR_DIR = dirname(__file__) + + +class RenderMathTest(unittest.TestCase): + def test_ok_on_shared_test_data(self): + settings = get_settings(filenames={}) + settings['PATH'] = join(CUR_DIR, '..', 'test_data') + pelican_init(PelicanMock(settings)) + with TemporaryDirectory() as tmpdirname: + generator = _build_article_generator(settings, tmpdirname) + process_rst_and_summaries([generator]) + def test_ok_on_custom_data(self): + settings = get_settings(filenames={}) + settings['PATH'] = join(CUR_DIR, 'test_data') + settings['PLUGINS'] = ['pelican-ipynb.markup'] # to also parse .ipynb files + configure_settings(settings) + pelican_mock = PelicanMock(settings) + pelican_init(pelican_mock) + Pelican.init_plugins(pelican_mock) + with TemporaryDirectory() as tmpdirname: + generator = _build_article_generator(settings, tmpdirname) + process_rst_and_summaries([generator]) + for article in generator.articles: + if article.source_path.endswith('.rst'): + self.assertIn('mathjaxscript_pelican', article.content) + generator.generate_output(Writer(tmpdirname, settings=settings)) + + +def _build_article_generator(settings, output_path): + context = settings.copy() + context['generated_content'] = dict() + context['static_links'] = set() + article_generator = ArticlesGenerator( + context=context, settings=settings, + path=settings['PATH'], theme=settings['THEME'], output_path=output_path) + article_generator.generate_context() + return article_generator + +class PelicanMock: + 'A dummy class exposing the only attributes needed' + def __init__(self, settings): + self.plugins = [] + self.settings = settings -- cgit v1.2.3