Showing preview only (2,318K chars total). Download the full file or copy to clipboard to get everything.
Repository: xem/W
Branch: gh-pages
Commit: db8b725b1cfd
Files: 36
Total size: 2.2 MB
Directory structure:
gitextract_kmmeootv/
├── .gitattributes
├── .gitignore
├── README.md
├── build.mjs
├── demos/
│ ├── 1.html
│ ├── 2.html
│ ├── 3.html
│ ├── 4.html
│ ├── 5.html
│ ├── 6.html
│ ├── 7.html
│ ├── 8.html
│ ├── bricktexture.js
│ ├── castle.html
│ ├── freerotation.html
│ ├── jscolor.js
│ ├── mario.js
│ ├── mariotexture.js
│ ├── treetexture.js
│ └── yoshi.js
├── index.html
├── obj2js/
│ ├── 3d-model.obj
│ ├── coin.obj
│ ├── cube.obj
│ ├── index.html
│ ├── mario.mtl
│ ├── mario.obj
│ ├── parse.js
│ ├── wolf.obj
│ ├── yoshi.mtl
│ └── yoshi.obj
├── package.json
├── src/
│ └── w.js
├── w.js
├── w.min.full.js
└── w.min.lite.js
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitattributes
================================================
# Auto detect text files and perform LF normalization
* text=auto
================================================
FILE: .gitignore
================================================
*.zip
node_modules
================================================
FILE: README.md
================================================
# W
A micro WebGL2 framework with a ton of features
https://xem.github.io/W
license: public domain
Install via NPM with `npm install https://github.com/xem/W/#semver:1.0.2`
## Building
To build the project, first make sure to install the projects dependencies:
```sh
npm install
```
Then run the build script like shown below, and artifacts will appear in the `dist` folder:
```sh
npm run build
```
## Release policy
This project follows [semantic versioning](https://semver.org).
Release files will be located in the `dist` folder.
Files with a version number in their file name, will only receive backwards compatible updates.
Any time a breaking change is introduced, a new pair of files is created in the `dist` folder, with the new major version name.
The files without version number are rolling release.
They are minified versions of `src/w.js`, and must always be kept in sync when changes are made.
The files `w.js`, `w.min.full.js` and `w.min.lite.js` are legacy artifacts, and should not be used.
================================================
FILE: build.mjs
================================================
import { execFile } from 'node:child_process';
import fs from "node:fs/promises";
import { minify } from "terser";
import ect from "ect-bin";
// Current latest version
const version = "1.0";
// List of all available plugins and their names
const availablePlugins = [
// Enables shader compilation logs
"debug",
// Enables code for calculation of smooth normals
"smooth",
// Enables the built-in shapes
"builtinShapes",
];
// Minifies any shader source code found in the src string
function minifyFileShaders(src) {
for (const shaderOld of src.match(/"#version 300 es[^"]*"/g)) {
let shader = shaderOld;
// Remove comments and newlines
shader = shader.replace(/(\/\/.*?)?\\n/g, " ");
// Remove any unneeded whitespace
// Run these twice, to catch one-width character sequences
for (let i = 0; i < 2; i++) {
shader = shader.
replace(/([\w\.])\s+([\w\.])/g, "$1 $2").
replace(/([\w\.])\s+([^\w\.])/g, "$1$2").
replace(/([^\w\.])\s+([\w\.])/g, "$1$2").
replace(/([^\w\.])\s+([^\w\.])/g, "$1$2");
}
// Re-add newline after #version directive
shader = shader.replace(/(#version 300 es)\s+/, "$1\\n");
// Finally, replace shader source with new minified version
src = src.replace(shaderOld, shader);
}
// Return modified js source
return src;
}
// Main build function
async function buildW(editionName, plugins = []) {
// Build output filenames
const outFnameJs = `./dist/w.${editionName}.min.js`;
const outFnameZip = `./dist/w.${editionName}.min.zip`;
const outFnameVersionedJs = `./dist/w${version}.${editionName}.min.js`;
// Add plugin states to a map
const pluginsObj = {};
for (const pluginName of availablePlugins) {
pluginsObj[`W.plugin.${pluginName}`] = plugins.includes(pluginName);
}
// Read W source file
const wSrc = (await fs.readFile("./src/w.js")).toString();
// Run terser with provided flags
const tersed = await minify(wSrc, {
mangle: true,
compress: {
passes: 2,
global_defs: {
"W.built": true,
...pluginsObj,
},
},
});
// Minify any shaders hanging about
const code = minifyFileShaders(tersed.code);
// Write .js file to file system
await fs.writeFile(outFnameJs, code);
await fs.writeFile(outFnameVersionedJs, code);
// Remove existing .zip, to avoid ect throwing errors
try {
await fs.unlink(outFnameZip);
} catch (err) {
}
// Put the .js file into a .zip using ect
await new Promise((resolve, reject) => {
execFile(ect, ["-9", "-strip", "-zip", outFnameZip, outFnameJs], (err, stdout) => {
if (err) reject(stdout);
else resolve();
});
})
}
// Define plugins for the different versions
const versionConfigs = {
"full": ["smooth", "builtinShapes"],
"lite": [],
};
// Build the different versions
for (const [edition, plugins] of Object.entries(versionConfigs)) {
await buildW(edition, plugins);
}
// Print file sizes
console.log(`w.full.min.js: ${(await fs.stat("./dist/w.full.min.js")).size} bytes`);
console.log(`w.lite.min.js: ${(await fs.stat("./dist/w.lite.min.js")).size} bytes`);
console.log(`w.full.min.zip: ${(await fs.stat("./dist/w.full.min.zip")).size} bytes`);
console.log(`w.lite.min.zip: ${(await fs.stat("./dist/w.lite.min.zip")).size} bytes`);
================================================
FILE: demos/1.html
================================================
<!doctype html>
<script src='../src/w.js'></script>
<script src="jscolor.js"></script>
<table>
<tr>
<td>
<canvas id=c width=450 height=430></canvas>
<div style="font:25px arial;color:red;position:fixed;top:280px;left:370px">X</div>
<div style="font:25px arial;color:green;position:fixed;top:45px;left:155px">Y</div>
<div style="font:25px arial;color:blue;position:fixed;top:385px;left:25px">Z</div>
<div style="font:25px arial;color:black;position:fixed;top:310px;left:170px">0</div>
<!--div style="font:20px arial;color:#dd0;position:fixed;top:60px;left:450px">light</div-->
<td>
<pre class=language-js><code id=code>W.reset(canvas);
W.camera({x:0,y:0,z:0});
W.light({x:0,y:-1,z:0});
W.ambient(0.2);
W.clearColor("#FFFFFF");</code></pre>
<p><b>Camera</b>
<p>
<span class=a>x</span> <input type=range id=cx min=-10 max=10 value=0>
<span class=a>y</span> <input type=range id=cy min=-10 max=10 value=0>
<span class=a>z</span> <input type=range id=cz min=-10 max=10 value=0>
<br>
<span class=a>rx</span> <input type=range id=crx min=-90 max=90 value=0>
<span class=a>ry</span> <input type=range id=cry min=-90 max=90 value=0>
<span class=a>rz</span> <input type=range id=crz min=-90 max=90 value=0>
<br>
fov <input type=range id=fov min=10 max=50 value=30 step=1>
<p><b>Directional light</b>
<p>
<span class=a>x</span> <input type=range id=lx min=-1 max=1 value=0 step=.01>
<span class=a>y</span> <input type=range id=ly min=-1 max=1 value=-1 step=.01>
<span class=a>z</span> <input type=range id=lz min=-1 max=1 value=0 step=.01>
<br>
<p><b>Ambient light</b>
<p>
<input type=range id=a min=0 max=1 value=.2 step=.01>
<br>
<p><b>Clear color</b>
<p><input id=clear value="#ffffff" data-jscolor="{}">
</table>
<script>
onload = () => {
W.reset(c);
W.camera({x:9,y:8,z:20,rx:-13,ry:15});
W.cube({x:5,w:10,h:.5,d:.5,b:"f44"});
W.cube({y:5,h:10,w:.5,d:.5,b:"4f4"});
W.cube({z:5,d:10,w:.5,h:.5,b:"44f"});
W.pyramid({size:1,x:10,rz:-90,b:"f44"});
W.pyramid({size:1,y:10,b:"4f4"});
W.pyramid({size:1,z:10,rx:90,b:"44f"});
//W.group({x:12,y:10,n:'l'});
//W.cube({g:"l",x:0,y:0,h:2,w:.5,d:.5,b:"ee0",ns:1});
//W.pyramid({g:"l",x:0,y:-1,size:1,rx:180,b:"ee0",ns:1});
W.group({n:"cam"});
W.cube({g:"cam",w:2,h:2,d:4});
W.pyramid({g:"cam",w:3,h:2,d:3,z:-3,rx:90});
W.models.pyramid2 = {
vertices: [
-.5, -.5, .5, .5, -.5, .5, 0, .5, 0, // Front
.5, -.5, .5, .5, -.5,-.5, 0, .5, 0, // Right
.5, -.5,-.5, -.5, -.5,-.5, 0, .5, 0, // Back
-.5, -.5,-.5, -.5, -.5, .5, 0, .5, 0, // Left
],
uv: [
0, 0, 1, 0, .5, 1, // Front
0, 0, 1, 0, .5, 1, // Right
0, 0, 1, 0, .5, 1, // Back
0, 0, 1, 0, .5, 1, // Left
]
};
W.pyramid2 = settings => W.setState(settings, 'pyramid2');
W.pyramid2({n:"frustum",g:"cam",w:20,h:40,d:15,z:-24,rx:90,mode:"LINE_LOOP"});
onchange = oninput = () => {
W.clearColor(clear.value);
W.move({n:"cam",x:+cx.value,y:+cy.value,z:+cz.value,rx:+crx.value,ry:+cry.value,rz:+crz.value});
W.move({n:"frustum",w:(+fov.value)*20/30,d:(+fov.value)*15/30});
W.light({x:+lx.value,y:+ly.value,z:+lz.value});
W.ambient(+a.value);
//W.move({n:"l",M:new DOMMatrix(lookAt([12,10,0],[+lx.value+12,+ly.value+10,+lz.value],[0,1,0]))});
//console.log(lookAt([10,10,10],[+lx.value,+ly.value,+lz.value],[0,1,0]));
code.innerHTML = `W.reset(canvas);
W.camera({x:${cx.value},y:${cy.value},z:${cz.value}${+crx.value?(",rx:"+crx.value):""}${+cry.value?(",ry:"+cry.value):""}${+crz.value?(",rz:"+crz.value):""}${fov.value!="30"?(",fov:"+fov.value):""});
W.light({x:${lx.value},y:${ly.value},z:${lz.value}});
W.ambient(${a.value});
W.clearColor("${clear.value}");`
Prism.highlightAll();
}
}
</script>
<style>
body { font: 12px/18px calibri; margin: 0; }
pre { background: #eee; padding: 8px !important; display: block; width:325px; margin: 0 !important; border: 2px solid #000; border-right-width: 4px; }
input[type="range"] { width: 80px; margin: 0 15px 0 0 }
td+td { padding: 0 0 0 20px; vertical-align: top; position: relative; }
#clear { width: 70px }
span.a { display: inline-block; min-width: 15px; }
code * { letter-spacing: -.5px; }
p { margin: 6px 0 }
b { margin: 8px 0 6px; display: inline-block; }
canvas { border: 2px solid #000; border-right-width: 4px; }
</style>
<style>
/* PrismJS 1.25.0
https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f8f8f8}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}
</style>
<script>
/* PrismJS 1.25.0
https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(u){var t=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,n=0,e={},M={manual:u.Prism&&u.Prism.manual,disableWorkerMessageHandler:u.Prism&&u.Prism.disableWorkerMessageHandler,util:{encode:function e(n){return n instanceof W?new W(n.type,e(n.content),n.alias):Array.isArray(n)?n.map(e):n.replace(/&/g,"&").replace(/</g,"<").replace(/\u00a0/g," ")},type:function(e){return Object.prototype.toString.call(e).slice(8,-1)},objId:function(e){return e.__id||Object.defineProperty(e,"__id",{value:++n}),e.__id},clone:function t(e,r){var a,n;switch(r=r||{},M.util.type(e)){case"Object":if(n=M.util.objId(e),r[n])return r[n];for(var i in a={},r[n]=a,e)e.hasOwnProperty(i)&&(a[i]=t(e[i],r));return a;case"Array":return n=M.util.objId(e),r[n]?r[n]:(a=[],r[n]=a,e.forEach(function(e,n){a[n]=t(e,r)}),a);default:return e}},getLanguage:function(e){for(;e;){var n=t.exec(e.className);if(n)return n[1].toLowerCase();e=e.parentElement}return"none"},setLanguage:function(e,n){e.className=e.className.replace(RegExp(t,"gi"),""),e.classList.add("language-"+n)},currentScript:function(){if("undefined"==typeof document)return null;if("currentScript"in document)return document.currentScript;try{throw new Error}catch(e){var n=(/at [^(\r\n]*\((.*):[^:]+:[^:]+\)$/i.exec(e.stack)||[])[1];if(n){var t=document.getElementsByTagName("script");for(var r in t)if(t[r].src==n)return t[r]}return null}},isActive:function(e,n,t){for(var r="no-"+n;e;){var a=e.classList;if(a.contains(n))return!0;if(a.contains(r))return!1;e=e.parentElement}return!!t}},languages:{plain:e,plaintext:e,text:e,txt:e,extend:function(e,n){var t=M.util.clone(M.languages[e]);for(var r in n)t[r]=n[r];return t},insertBefore:function(t,e,n,r){var a=(r=r||M.languages)[t],i={};for(var l in a)if(a.hasOwnProperty(l)){if(l==e)for(var o in n)n.hasOwnProperty(o)&&(i[o]=n[o]);n.hasOwnProperty(l)||(i[l]=a[l])}var s=r[t];return r[t]=i,M.languages.DFS(M.languages,function(e,n){n===s&&e!=t&&(this[e]=i)}),i},DFS:function e(n,t,r,a){a=a||{};var i=M.util.objId;for(var l in n)if(n.hasOwnProperty(l)){t.call(n,l,n[l],r||l);var o=n[l],s=M.util.type(o);"Object"!==s||a[i(o)]?"Array"!==s||a[i(o)]||(a[i(o)]=!0,e(o,t,l,a)):(a[i(o)]=!0,e(o,t,null,a))}}},plugins:{},highlightAll:function(e,n){M.highlightAllUnder(document,e,n)},highlightAllUnder:function(e,n,t){var r={callback:t,container:e,selector:'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'};M.hooks.run("before-highlightall",r),r.elements=Array.prototype.slice.apply(r.container.querySelectorAll(r.selector)),M.hooks.run("before-all-elements-highlight",r);for(var a,i=0;a=r.elements[i++];)M.highlightElement(a,!0===n,r.callback)},highlightElement:function(e,n,t){var r=M.util.getLanguage(e),a=M.languages[r];M.util.setLanguage(e,r);var i=e.parentElement;i&&"pre"===i.nodeName.toLowerCase()&&M.util.setLanguage(i,r);var l={element:e,language:r,grammar:a,code:e.textContent};function o(e){l.highlightedCode=e,M.hooks.run("before-insert",l),l.element.innerHTML=l.highlightedCode,M.hooks.run("after-highlight",l),M.hooks.run("complete",l),t&&t.call(l.element)}if(M.hooks.run("before-sanity-check",l),(i=l.element.parentElement)&&"pre"===i.nodeName.toLowerCase()&&!i.hasAttribute("tabindex")&&i.setAttribute("tabindex","0"),!l.code)return M.hooks.run("complete",l),void(t&&t.call(l.element));if(M.hooks.run("before-highlight",l),l.grammar)if(n&&u.Worker){var s=new Worker(M.filename);s.onmessage=function(e){o(e.data)},s.postMessage(JSON.stringify({language:l.language,code:l.code,immediateClose:!0}))}else o(M.highlight(l.code,l.grammar,l.language));else o(M.util.encode(l.code))},highlight:function(e,n,t){var r={code:e,grammar:n,language:t};return M.hooks.run("before-tokenize",r),r.tokens=M.tokenize(r.code,r.grammar),M.hooks.run("after-tokenize",r),W.stringify(M.util.encode(r.tokens),r.language)},tokenize:function(e,n){var t=n.rest;if(t){for(var r in t)n[r]=t[r];delete n.rest}var a=new i;return I(a,a.head,e),function e(n,t,r,a,i,l){for(var o in r)if(r.hasOwnProperty(o)&&r[o]){var s=r[o];s=Array.isArray(s)?s:[s];for(var u=0;u<s.length;++u){if(l&&l.cause==o+","+u)return;var c=s[u],g=c.inside,f=!!c.lookbehind,h=!!c.greedy,d=c.alias;if(h&&!c.pattern.global){var v=c.pattern.toString().match(/[imsuy]*$/)[0];c.pattern=RegExp(c.pattern.source,v+"g")}for(var p=c.pattern||c,m=a.next,y=i;m!==t.tail&&!(l&&y>=l.reach);y+=m.value.length,m=m.next){var k=m.value;if(t.length>n.length)return;if(!(k instanceof W)){var x,b=1;if(h){if(!(x=z(p,y,n,f))||x.index>=n.length)break;var w=x.index,A=x.index+x[0].length,P=y;for(P+=m.value.length;P<=w;)m=m.next,P+=m.value.length;if(P-=m.value.length,y=P,m.value instanceof W)continue;for(var E=m;E!==t.tail&&(P<A||"string"==typeof E.value);E=E.next)b++,P+=E.value.length;b--,k=n.slice(y,P),x.index-=y}else if(!(x=z(p,0,k,f)))continue;var w=x.index,L=x[0],S=k.slice(0,w),O=k.slice(w+L.length),j=y+k.length;l&&j>l.reach&&(l.reach=j);var C=m.prev;S&&(C=I(t,C,S),y+=S.length),q(t,C,b);var N=new W(o,g?M.tokenize(L,g):L,d,L);if(m=I(t,C,N),O&&I(t,m,O),1<b){var _={cause:o+","+u,reach:j};e(n,t,r,m.prev,y,_),l&&_.reach>l.reach&&(l.reach=_.reach)}}}}}}(e,a,n,a.head,0),function(e){var n=[],t=e.head.next;for(;t!==e.tail;)n.push(t.value),t=t.next;return n}(a)},hooks:{all:{},add:function(e,n){var t=M.hooks.all;t[e]=t[e]||[],t[e].push(n)},run:function(e,n){var t=M.hooks.all[e];if(t&&t.length)for(var r,a=0;r=t[a++];)r(n)}},Token:W};function W(e,n,t,r){this.type=e,this.content=n,this.alias=t,this.length=0|(r||"").length}function z(e,n,t,r){e.lastIndex=n;var a=e.exec(t);if(a&&r&&a[1]){var i=a[1].length;a.index+=i,a[0]=a[0].slice(i)}return a}function i(){var e={value:null,prev:null,next:null},n={value:null,prev:e,next:null};e.next=n,this.head=e,this.tail=n,this.length=0}function I(e,n,t){var r=n.next,a={value:t,prev:n,next:r};return n.next=a,r.prev=a,e.length++,a}function q(e,n,t){for(var r=n.next,a=0;a<t&&r!==e.tail;a++)r=r.next;(n.next=r).prev=n,e.length-=a}if(u.Prism=M,W.stringify=function n(e,t){if("string"==typeof e)return e;if(Array.isArray(e)){var r="";return e.forEach(function(e){r+=n(e,t)}),r}var a={type:e.type,content:n(e.content,t),tag:"span",classes:["token",e.type],attributes:{},language:t},i=e.alias;i&&(Array.isArray(i)?Array.prototype.push.apply(a.classes,i):a.classes.push(i)),M.hooks.run("wrap",a);var l="";for(var o in a.attributes)l+=" "+o+'="'+(a.attributes[o]||"").replace(/"/g,""")+'"';return"<"+a.tag+' class="'+a.classes.join(" ")+'"'+l+">"+a.content+"</"+a.tag+">"},!u.document)return u.addEventListener&&(M.disableWorkerMessageHandler||u.addEventListener("message",function(e){var n=JSON.parse(e.data),t=n.language,r=n.code,a=n.immediateClose;u.postMessage(M.highlight(r,M.languages[t],t)),a&&u.close()},!1)),M;var r=M.util.currentScript();function a(){M.manual||M.highlightAll()}if(r&&(M.filename=r.src,r.hasAttribute("data-manual")&&(M.manual=!0)),!M.manual){var l=document.readyState;"loading"===l||"interactive"===l&&r&&r.defer?document.addEventListener("DOMContentLoaded",a):window.requestAnimationFrame?window.requestAnimationFrame(a):window.setTimeout(a,16)}return M}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism);
Prism.languages.markup={comment:{pattern:/<!--(?:(?!<!--)[\s\S])*?-->/,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/<!DOCTYPE(?:[^>"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^<!|>$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&/,"&"))}),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(a,e){var s={};s["language-"+e]={pattern:/(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,lookbehind:!0,inside:Prism.languages[e]},s.cdata=/^<!\[CDATA\[|\]\]>$/i;var t={"included-cdata":{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,inside:s}};t["language-"+e]={pattern:/[\s\S]+/,inside:Prism.languages[e]};var n={};n[a]={pattern:RegExp("(<__[^>]*>)(?:<!\\[CDATA\\[(?:[^\\]]|\\](?!\\]>))*\\]\\]>|(?!<!\\[CDATA\\[)[^])*?(?=</__>)".replace(/__/g,function(){return a}),"i"),lookbehind:!0,greedy:!0,inside:t},Prism.languages.insertBefore("markup","cdata",n)}}),Object.defineProperty(Prism.languages.markup.tag,"addAttribute",{value:function(a,e){Prism.languages.markup.tag.inside["special-attr"].push({pattern:RegExp("(^|[\"'\\s])(?:"+a+")\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))","i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[e,"language-"+e],inside:Prism.languages[e]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml;
!function(s){var e=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;s.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+e.source+"|(?:[^\\\\\r\n()\"']|\\\\[^])*)\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+e.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+e.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:e,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},s.languages.css.atrule.inside.rest=s.languages.css;var t=s.languages.markup;t&&(t.tag.addInlined("style","css"),t.tag.addAttribute("style","css"))}(Prism);
Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/};
Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp("(^|[^\\w$])(?:NaN|Infinity|0[bB][01]+(?:_[01]+)*n?|0[oO][0-7]+(?:_[0-7]+)*n?|0[xX][\\dA-Fa-f]+(?:_[\\dA-Fa-f]+)*n?|\\d+(?:_\\d+)*n|(?:\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\.\\d+(?:_\\d+)*)(?:[Ee][+-]?\\d+(?:_\\d+)*)?)(?![\\w$])"),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),Prism.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute("on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)","javascript")),Prism.languages.js=Prism.languages.javascript;
</script>
================================================
FILE: demos/2.html
================================================
<!doctype html>
<img src='brick.png' id=brick hidden>
<img src='tree.png' id=tree hidden>
<script src='../src/w.js'></script>
<script src="jscolor.js"></script>
<table>
<tr>
<td>
<canvas id=c2 width=360 height=410></canvas>
<td>
<pre class=language-js><code id=code>W.group({n:"G"});
W.plane({g:"G",x:-1,y:1});
W.billboard({g:"G",x:1,y:1});
W.cube({g:"G",x:-1.5,y:-1});
W.pyramid({g:"G",x:0,y:-1});
W.sphere({g:"G",x:1.5,y:-1});</code></pre>
<p>
<div hidden>
<b>Group settings</b>
<p>
ry: <input type=range id=gry min=-90 max=90 value=0 step="1" readonly>
</div>
<p>
<b>Settings</b>
<p>
Size: <input type=range id=size min=.1 max=2 value=1 step=".01">
<p>
rx: <input type=range id=rx min=-180 max=180 value=0 step="1">
<p>
<b>Background</b>
<p>
<label><input type=checkbox id=cbb> Color: </label> <input size=2 id=c value="#113366ff" data-jscolor="{}">
<p><label><input type=checkbox id=cbt> Texture: </label><input type=radio id=t1 name=b checked>brick</label> <label><input type=radio id=t2 name=b>tree
<p>Mix: <input type=range id=mix min=0 max=1 value=1 step=".01" disabled>
<p>
<b>Rendering</b>
<p>
Draw mode: <label><input type=radio id=tri name=mode checked> TRIANGLES</label> <label><input type=radio id=line name=mode> LINE_LOOP</label>
<p>
Shading: <label><input type=radio name=shading id=auto checked>Auto (flat)</label>
<label><input type=radio name=shading id=sm>Smooth</label>
<label><input type=radio name=shading id=ns>None</label>
</table>
<script>
onload = () => {
W.reset(c2);
W.group({n:"g"});
W.camera({z:5});
W.light({z:-1});
W.plane({g:"g",n:"a",x:-1,y:1});
W.billboard({g:"g",n:"b",x:1,y:1});
W.cube({g:"g",n:"c",x:-1.5,y:-1});
W.pyramid({g:"g",n:"d",x:0,y:-1});
W.sphere({g:"g",n:"e",x:1.5,y:-1});
t=0;
setInterval(()=>{
W.move({n:"g",ry:gry.value=Math.sin(t/100)*55});
html = `\
W.group({n:"G",ry:${gry.value}});
W.plane({g:"G",x:-1,y:1${size.value != 1 ? (",size:"+ (+size.value).toFixed(2)):""}${rx.value != 0 ? (",rx:"+rx.value):""}${cbb.checked ? (",b:'"+c.value+"'") : ""}${cbt.checked && t1.checked ? (",b:brick") : ""}${cbt.checked && t2.checked ? (",b:tree") : ""}${cbb.checked && cbt.checked ? ",mix:"+mix.value : ""}${tri.checked ? "" : ",mode:2"}${ns.checked ? ",ns:1" : ""}${sm.checked ? (",s:1") : ""}});
W.billboard({g:"G",x:1,y:1${size.value != 1 ? (",size:"+ (+size.value).toFixed(2)):""}${rx.value != 0 ? (",rx:"+rx.value):""}${cbb.checked ? (",b:'"+c.value+"'") : ""}${cbt.checked && t1.checked ? (",t:brick") : ""}${cbt.checked && t2.checked ? (",t:tree") : ""}${cbb.checked && cbt.checked ? ",mix:"+mix.value : ""}${tri.checked ? "" : ",mode:2"}${ns.checked ? ",ns:1" : ""}${sm.checked ? (",s:1") : ""}});
W.cube({g:"G",x:-1.5,y:-1${size.value != 1 ? (",size:"+ (+size.value).toFixed(2)):""}${rx.value != 0 ? (",rx:"+rx.value):""}${cbb.checked ? (",b:'"+c.value+"'") : ""}${cbt.checked && t1.checked ? (",t:brick") : ""}${cbt.checked && t2.checked ? (",t:tree") : ""}${cbb.checked && cbt.checked ? ",mix:"+mix.value : ""}${tri.checked ? "" : ",mode:2"}${ns.checked ? ",ns:1" : ""}${sm.checked ? (",s:1") : ""}});
W.pyramid({g:"G",x:0,y:-1${size.value != 1 ? (",size:"+ (+size.value).toFixed(2)):""}${rx.value != 0 ? (",rx:"+rx.value):""}${cbb.checked ? (",b:'"+c.value+"'") : ""}${cbt.checked && t1.checked ? (",t:brick") : ""}${cbt.checked && t2.checked ? (",t:tree") : ""}${cbb.checked && cbt.checked ? ",mix:"+mix.value : ""}${tri.checked ? "" : ",mode:2"}${ns.checked ? ",ns:1" : ""}${sm.checked ? (",s:1") : ""}});
W.sphere({g:"G",x:1.5,y:-1${size.value != 1 ? (",size:"+ (+size.value).toFixed(2)):""}${rx.value != 0 ? (",rx:"+rx.value):""}${cbb.checked ? (",b:'"+c.value+"'") : ""}${cbt.checked && t1.checked ? (",t:brick") : ""}${cbt.checked && t2.checked ? (",t:tree") : ""}${cbb.checked && cbt.checked ? ",mix:"+mix.value : ""}${tri.checked ? "" : ",mode:2"}${ns.checked ? ",ns:1" : ""}${sm.checked ? (",s:1") : ""}});`;
code.innerHTML = html;
Prism.highlightAll();
W.move({n:"a",size:+size.value,rx:+rx.value,b:cbb.checked?c.value:"888",t:t1.checked?brick:tree,mix:+mix.value,mode:(tri.checked?"TRIANGLES":2),s:sm.checked?0:0,ns:ns.checked});
W.move({n:"b",size:+size.value,rx:+rx.value,b:cbb.checked?c.value:"888",t:t1.checked?brick:tree,mix:+mix.value,mode:(tri.checked?"TRIANGLES":2),s:sm.checked?0:0,ns:ns.checked});
W.move({n:"c",size:+size.value,rx:+rx.value,b:cbb.checked?c.value:"888",t:t1.checked?brick:tree,mix:+mix.value,mode:(tri.checked?"TRIANGLES":2),s:sm.checked?0:0,ns:ns.checked});
W.move({n:"d",size:+size.value,rx:+rx.value,b:cbb.checked?c.value:"888",t:t1.checked?brick:tree,mix:+mix.value,mode:(tri.checked?"TRIANGLES":2),s:sm.checked?0:0,ns:ns.checked});
W.move({n:"e",size:+size.value,rx:+rx.value,b:cbb.checked?c.value:"888",t:t1.checked?brick:tree,mix:+mix.value,mode:(tri.checked?"TRIANGLES":2),s:sm.checked?1:0,ns:ns.checked});
t++;
},16);
onchange = oninput = () => {
mix.disabled = !cbb.checked || !cbt.checked;
sm.disabled = !tri.checked;
if(!cbb.checked && cbt.checked) mix.value = 0;
if(!cbt.checked && cbb.checked) mix.value = 1;
}
};
</script>
<style>
body { font-family: calibri; font-size: 12px; margin: 0; }
pre { background: #eee; padding: 8px !important; display: block; width:395px; overflow-x: auto; margin: 0 !important; border: 2px solid #000; border-right-width: 4px; }
td+td { padding: 0 0 0 20px; vertical-align: top; position: relative; }
input[type="range"] { width: 150px; position: absolute; left: 70px; }
br { line-height: 20px }
#c { width: 90px }
code * { letter-spacing: -.5px; }
p { margin: 6px 0 }
b { margin: 8px 0 6px; display: inline-block; }
canvas { border: 2px solid #000; border-right-width: 4px; }
</style>
<style>
/* PrismJS 1.25.0
https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f8f8f8}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}
</style>
<script>
/* PrismJS 1.25.0
https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(u){var t=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,n=0,e={},M={manual:u.Prism&&u.Prism.manual,disableWorkerMessageHandler:u.Prism&&u.Prism.disableWorkerMessageHandler,util:{encode:function e(n){return n instanceof W?new W(n.type,e(n.content),n.alias):Array.isArray(n)?n.map(e):n.replace(/&/g,"&").replace(/</g,"<").replace(/\u00a0/g," ")},type:function(e){return Object.prototype.toString.call(e).slice(8,-1)},objId:function(e){return e.__id||Object.defineProperty(e,"__id",{value:++n}),e.__id},clone:function t(e,r){var a,n;switch(r=r||{},M.util.type(e)){case"Object":if(n=M.util.objId(e),r[n])return r[n];for(var i in a={},r[n]=a,e)e.hasOwnProperty(i)&&(a[i]=t(e[i],r));return a;case"Array":return n=M.util.objId(e),r[n]?r[n]:(a=[],r[n]=a,e.forEach(function(e,n){a[n]=t(e,r)}),a);default:return e}},getLanguage:function(e){for(;e;){var n=t.exec(e.className);if(n)return n[1].toLowerCase();e=e.parentElement}return"none"},setLanguage:function(e,n){e.className=e.className.replace(RegExp(t,"gi"),""),e.classList.add("language-"+n)},currentScript:function(){if("undefined"==typeof document)return null;if("currentScript"in document)return document.currentScript;try{throw new Error}catch(e){var n=(/at [^(\r\n]*\((.*):[^:]+:[^:]+\)$/i.exec(e.stack)||[])[1];if(n){var t=document.getElementsByTagName("script");for(var r in t)if(t[r].src==n)return t[r]}return null}},isActive:function(e,n,t){for(var r="no-"+n;e;){var a=e.classList;if(a.contains(n))return!0;if(a.contains(r))return!1;e=e.parentElement}return!!t}},languages:{plain:e,plaintext:e,text:e,txt:e,extend:function(e,n){var t=M.util.clone(M.languages[e]);for(var r in n)t[r]=n[r];return t},insertBefore:function(t,e,n,r){var a=(r=r||M.languages)[t],i={};for(var l in a)if(a.hasOwnProperty(l)){if(l==e)for(var o in n)n.hasOwnProperty(o)&&(i[o]=n[o]);n.hasOwnProperty(l)||(i[l]=a[l])}var s=r[t];return r[t]=i,M.languages.DFS(M.languages,function(e,n){n===s&&e!=t&&(this[e]=i)}),i},DFS:function e(n,t,r,a){a=a||{};var i=M.util.objId;for(var l in n)if(n.hasOwnProperty(l)){t.call(n,l,n[l],r||l);var o=n[l],s=M.util.type(o);"Object"!==s||a[i(o)]?"Array"!==s||a[i(o)]||(a[i(o)]=!0,e(o,t,l,a)):(a[i(o)]=!0,e(o,t,null,a))}}},plugins:{},highlightAll:function(e,n){M.highlightAllUnder(document,e,n)},highlightAllUnder:function(e,n,t){var r={callback:t,container:e,selector:'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'};M.hooks.run("before-highlightall",r),r.elements=Array.prototype.slice.apply(r.container.querySelectorAll(r.selector)),M.hooks.run("before-all-elements-highlight",r);for(var a,i=0;a=r.elements[i++];)M.highlightElement(a,!0===n,r.callback)},highlightElement:function(e,n,t){var r=M.util.getLanguage(e),a=M.languages[r];M.util.setLanguage(e,r);var i=e.parentElement;i&&"pre"===i.nodeName.toLowerCase()&&M.util.setLanguage(i,r);var l={element:e,language:r,grammar:a,code:e.textContent};function o(e){l.highlightedCode=e,M.hooks.run("before-insert",l),l.element.innerHTML=l.highlightedCode,M.hooks.run("after-highlight",l),M.hooks.run("complete",l),t&&t.call(l.element)}if(M.hooks.run("before-sanity-check",l),(i=l.element.parentElement)&&"pre"===i.nodeName.toLowerCase()&&!i.hasAttribute("tabindex")&&i.setAttribute("tabindex","0"),!l.code)return M.hooks.run("complete",l),void(t&&t.call(l.element));if(M.hooks.run("before-highlight",l),l.grammar)if(n&&u.Worker){var s=new Worker(M.filename);s.onmessage=function(e){o(e.data)},s.postMessage(JSON.stringify({language:l.language,code:l.code,immediateClose:!0}))}else o(M.highlight(l.code,l.grammar,l.language));else o(M.util.encode(l.code))},highlight:function(e,n,t){var r={code:e,grammar:n,language:t};return M.hooks.run("before-tokenize",r),r.tokens=M.tokenize(r.code,r.grammar),M.hooks.run("after-tokenize",r),W.stringify(M.util.encode(r.tokens),r.language)},tokenize:function(e,n){var t=n.rest;if(t){for(var r in t)n[r]=t[r];delete n.rest}var a=new i;return I(a,a.head,e),function e(n,t,r,a,i,l){for(var o in r)if(r.hasOwnProperty(o)&&r[o]){var s=r[o];s=Array.isArray(s)?s:[s];for(var u=0;u<s.length;++u){if(l&&l.cause==o+","+u)return;var c=s[u],g=c.inside,f=!!c.lookbehind,h=!!c.greedy,d=c.alias;if(h&&!c.pattern.global){var v=c.pattern.toString().match(/[imsuy]*$/)[0];c.pattern=RegExp(c.pattern.source,v+"g")}for(var p=c.pattern||c,m=a.next,y=i;m!==t.tail&&!(l&&y>=l.reach);y+=m.value.length,m=m.next){var k=m.value;if(t.length>n.length)return;if(!(k instanceof W)){var x,b=1;if(h){if(!(x=z(p,y,n,f))||x.index>=n.length)break;var w=x.index,A=x.index+x[0].length,P=y;for(P+=m.value.length;P<=w;)m=m.next,P+=m.value.length;if(P-=m.value.length,y=P,m.value instanceof W)continue;for(var E=m;E!==t.tail&&(P<A||"string"==typeof E.value);E=E.next)b++,P+=E.value.length;b--,k=n.slice(y,P),x.index-=y}else if(!(x=z(p,0,k,f)))continue;var w=x.index,L=x[0],S=k.slice(0,w),O=k.slice(w+L.length),j=y+k.length;l&&j>l.reach&&(l.reach=j);var C=m.prev;S&&(C=I(t,C,S),y+=S.length),q(t,C,b);var N=new W(o,g?M.tokenize(L,g):L,d,L);if(m=I(t,C,N),O&&I(t,m,O),1<b){var _={cause:o+","+u,reach:j};e(n,t,r,m.prev,y,_),l&&_.reach>l.reach&&(l.reach=_.reach)}}}}}}(e,a,n,a.head,0),function(e){var n=[],t=e.head.next;for(;t!==e.tail;)n.push(t.value),t=t.next;return n}(a)},hooks:{all:{},add:function(e,n){var t=M.hooks.all;t[e]=t[e]||[],t[e].push(n)},run:function(e,n){var t=M.hooks.all[e];if(t&&t.length)for(var r,a=0;r=t[a++];)r(n)}},Token:W};function W(e,n,t,r){this.type=e,this.content=n,this.alias=t,this.length=0|(r||"").length}function z(e,n,t,r){e.lastIndex=n;var a=e.exec(t);if(a&&r&&a[1]){var i=a[1].length;a.index+=i,a[0]=a[0].slice(i)}return a}function i(){var e={value:null,prev:null,next:null},n={value:null,prev:e,next:null};e.next=n,this.head=e,this.tail=n,this.length=0}function I(e,n,t){var r=n.next,a={value:t,prev:n,next:r};return n.next=a,r.prev=a,e.length++,a}function q(e,n,t){for(var r=n.next,a=0;a<t&&r!==e.tail;a++)r=r.next;(n.next=r).prev=n,e.length-=a}if(u.Prism=M,W.stringify=function n(e,t){if("string"==typeof e)return e;if(Array.isArray(e)){var r="";return e.forEach(function(e){r+=n(e,t)}),r}var a={type:e.type,content:n(e.content,t),tag:"span",classes:["token",e.type],attributes:{},language:t},i=e.alias;i&&(Array.isArray(i)?Array.prototype.push.apply(a.classes,i):a.classes.push(i)),M.hooks.run("wrap",a);var l="";for(var o in a.attributes)l+=" "+o+'="'+(a.attributes[o]||"").replace(/"/g,""")+'"';return"<"+a.tag+' class="'+a.classes.join(" ")+'"'+l+">"+a.content+"</"+a.tag+">"},!u.document)return u.addEventListener&&(M.disableWorkerMessageHandler||u.addEventListener("message",function(e){var n=JSON.parse(e.data),t=n.language,r=n.code,a=n.immediateClose;u.postMessage(M.highlight(r,M.languages[t],t)),a&&u.close()},!1)),M;var r=M.util.currentScript();function a(){M.manual||M.highlightAll()}if(r&&(M.filename=r.src,r.hasAttribute("data-manual")&&(M.manual=!0)),!M.manual){var l=document.readyState;"loading"===l||"interactive"===l&&r&&r.defer?document.addEventListener("DOMContentLoaded",a):window.requestAnimationFrame?window.requestAnimationFrame(a):window.setTimeout(a,16)}return M}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism);
Prism.languages.markup={comment:{pattern:/<!--(?:(?!<!--)[\s\S])*?-->/,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/<!DOCTYPE(?:[^>"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^<!|>$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&/,"&"))}),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(a,e){var s={};s["language-"+e]={pattern:/(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,lookbehind:!0,inside:Prism.languages[e]},s.cdata=/^<!\[CDATA\[|\]\]>$/i;var t={"included-cdata":{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,inside:s}};t["language-"+e]={pattern:/[\s\S]+/,inside:Prism.languages[e]};var n={};n[a]={pattern:RegExp("(<__[^>]*>)(?:<!\\[CDATA\\[(?:[^\\]]|\\](?!\\]>))*\\]\\]>|(?!<!\\[CDATA\\[)[^])*?(?=</__>)".replace(/__/g,function(){return a}),"i"),lookbehind:!0,greedy:!0,inside:t},Prism.languages.insertBefore("markup","cdata",n)}}),Object.defineProperty(Prism.languages.markup.tag,"addAttribute",{value:function(a,e){Prism.languages.markup.tag.inside["special-attr"].push({pattern:RegExp("(^|[\"'\\s])(?:"+a+")\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))","i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[e,"language-"+e],inside:Prism.languages[e]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml;
!function(s){var e=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;s.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+e.source+"|(?:[^\\\\\r\n()\"']|\\\\[^])*)\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+e.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+e.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:e,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},s.languages.css.atrule.inside.rest=s.languages.css;var t=s.languages.markup;t&&(t.tag.addInlined("style","css"),t.tag.addAttribute("style","css"))}(Prism);
Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/};
Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp("(^|[^\\w$])(?:NaN|Infinity|0[bB][01]+(?:_[01]+)*n?|0[oO][0-7]+(?:_[0-7]+)*n?|0[xX][\\dA-Fa-f]+(?:_[\\dA-Fa-f]+)*n?|\\d+(?:_\\d+)*n|(?:\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\.\\d+(?:_\\d+)*)(?:[Ee][+-]?\\d+(?:_\\d+)*)?)(?![\\w$])"),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),Prism.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute("on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)","javascript")),Prism.languages.js=Prism.languages.javascript;
</script>
================================================
FILE: demos/3.html
================================================
<!doctype html>
<img src='mario.png' id=mario hidden>
<script src='../src/w.js'></script>
<script src='mario.js'></script>
<script src="jscolor.js"></script>
<table>
<tr>
<td>
<canvas id=c3 width=340 height=410></canvas>
<td>
<b>HTML</b>
<pre class=language-html><code><img src='mario.png' id=mario hidden></code></pre>
<p>
<b>JS</b>
<pre class=language-js><code id=code>W.add("mario", {vertices: [...], uv: [...], indices: [...]});
W.camera({z:4});
W.light({x:.5,y:0,z:-.5});
W.mario({n:"M",size:3,t:mario});</code></pre>
<p>
<b>Background</b>
<p>
<label><input type=checkbox id=cbb> Color: </label><input size=2 id=c value="#113366ff" data-jscolor="{}">
<p><label><input type=checkbox id=cbt checked> Texture</label>
<p>Mix: <input type=range id=mix min=0 max=1 value=0 step=".01" disabled>
<p>
<b>Shading</b>
<p>
<label><input type=radio name=shading id=auto checked>Auto (flat)</label>
<label><input type=radio name=shading id=sm>Smooth</label>
<label><input type=radio name=shading id=ns>None</label>
</table>
<script>
onload = () => {
W.reset(c3);
W.light({x:.5,y:0,z:-.5});
W.camera({z:4});
W.mario({n:"mario",size:3,z:0,rx:-90,ry:180,t:mario});
onchange = oninput = () => {
mix.disabled = !cbb.checked || !cbt.checked;
if(!cbb.checked && cbt.checked) mix.value = 0;
if(!cbt.checked && cbb.checked) mix.value = 1;
W.move({n:"mario",b:c.value,t:mario,mix:+mix.value,s:sm.checked,ns:ns.checked});
html = `\
W.add("mario", {vertices: [...], uv: [...], indices: [...]});
W.camera({z:4});
W.light({x:.5,y:0,z:-.5});
W.mario({n:"M",size:3${cbb.checked ? (",b:'"+c.value+"'") : ""}${cbt.checked ? (",t:mario") : ""}${cbb.checked && cbt.checked ? ",mix:"+mix.value : ""}${ns.checked ? ",ns:1" : ""}${sm.checked ? (",s:1") : ""}});`;
code.innerHTML = html;
Prism.highlightAll();
}
};
</script>
<style>
body { font-family: calibri; font-size: 12px; margin: 0; }
pre { background: #eee; padding: 8px !important; display: block; width:415px; overflow-x: auto; margin: 0 !important; border: 2px solid #000; border-right-width: 4px; }
td+td { padding: 0 0 0 20px; vertical-align: top; position: relative; }
input[type="range"] { width: 150px; position: absolute; left: 70px; }
br { line-height: 20px }
#c { width: 90px }
code * { letter-spacing: -.5px; }
p { margin: 6px 0 }
b { margin: 8px 0 6px; display: inline-block; }
canvas { border: 2px solid #000; border-right-width: 4px; }
</style>
<style>
/* PrismJS 1.25.0
https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f8f8f8}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}
</style>
<script>
/* PrismJS 1.25.0
https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(u){var t=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,n=0,e={},M={manual:u.Prism&&u.Prism.manual,disableWorkerMessageHandler:u.Prism&&u.Prism.disableWorkerMessageHandler,util:{encode:function e(n){return n instanceof W?new W(n.type,e(n.content),n.alias):Array.isArray(n)?n.map(e):n.replace(/&/g,"&").replace(/</g,"<").replace(/\u00a0/g," ")},type:function(e){return Object.prototype.toString.call(e).slice(8,-1)},objId:function(e){return e.__id||Object.defineProperty(e,"__id",{value:++n}),e.__id},clone:function t(e,r){var a,n;switch(r=r||{},M.util.type(e)){case"Object":if(n=M.util.objId(e),r[n])return r[n];for(var i in a={},r[n]=a,e)e.hasOwnProperty(i)&&(a[i]=t(e[i],r));return a;case"Array":return n=M.util.objId(e),r[n]?r[n]:(a=[],r[n]=a,e.forEach(function(e,n){a[n]=t(e,r)}),a);default:return e}},getLanguage:function(e){for(;e;){var n=t.exec(e.className);if(n)return n[1].toLowerCase();e=e.parentElement}return"none"},setLanguage:function(e,n){e.className=e.className.replace(RegExp(t,"gi"),""),e.classList.add("language-"+n)},currentScript:function(){if("undefined"==typeof document)return null;if("currentScript"in document)return document.currentScript;try{throw new Error}catch(e){var n=(/at [^(\r\n]*\((.*):[^:]+:[^:]+\)$/i.exec(e.stack)||[])[1];if(n){var t=document.getElementsByTagName("script");for(var r in t)if(t[r].src==n)return t[r]}return null}},isActive:function(e,n,t){for(var r="no-"+n;e;){var a=e.classList;if(a.contains(n))return!0;if(a.contains(r))return!1;e=e.parentElement}return!!t}},languages:{plain:e,plaintext:e,text:e,txt:e,extend:function(e,n){var t=M.util.clone(M.languages[e]);for(var r in n)t[r]=n[r];return t},insertBefore:function(t,e,n,r){var a=(r=r||M.languages)[t],i={};for(var l in a)if(a.hasOwnProperty(l)){if(l==e)for(var o in n)n.hasOwnProperty(o)&&(i[o]=n[o]);n.hasOwnProperty(l)||(i[l]=a[l])}var s=r[t];return r[t]=i,M.languages.DFS(M.languages,function(e,n){n===s&&e!=t&&(this[e]=i)}),i},DFS:function e(n,t,r,a){a=a||{};var i=M.util.objId;for(var l in n)if(n.hasOwnProperty(l)){t.call(n,l,n[l],r||l);var o=n[l],s=M.util.type(o);"Object"!==s||a[i(o)]?"Array"!==s||a[i(o)]||(a[i(o)]=!0,e(o,t,l,a)):(a[i(o)]=!0,e(o,t,null,a))}}},plugins:{},highlightAll:function(e,n){M.highlightAllUnder(document,e,n)},highlightAllUnder:function(e,n,t){var r={callback:t,container:e,selector:'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'};M.hooks.run("before-highlightall",r),r.elements=Array.prototype.slice.apply(r.container.querySelectorAll(r.selector)),M.hooks.run("before-all-elements-highlight",r);for(var a,i=0;a=r.elements[i++];)M.highlightElement(a,!0===n,r.callback)},highlightElement:function(e,n,t){var r=M.util.getLanguage(e),a=M.languages[r];M.util.setLanguage(e,r);var i=e.parentElement;i&&"pre"===i.nodeName.toLowerCase()&&M.util.setLanguage(i,r);var l={element:e,language:r,grammar:a,code:e.textContent};function o(e){l.highlightedCode=e,M.hooks.run("before-insert",l),l.element.innerHTML=l.highlightedCode,M.hooks.run("after-highlight",l),M.hooks.run("complete",l),t&&t.call(l.element)}if(M.hooks.run("before-sanity-check",l),(i=l.element.parentElement)&&"pre"===i.nodeName.toLowerCase()&&!i.hasAttribute("tabindex")&&i.setAttribute("tabindex","0"),!l.code)return M.hooks.run("complete",l),void(t&&t.call(l.element));if(M.hooks.run("before-highlight",l),l.grammar)if(n&&u.Worker){var s=new Worker(M.filename);s.onmessage=function(e){o(e.data)},s.postMessage(JSON.stringify({language:l.language,code:l.code,immediateClose:!0}))}else o(M.highlight(l.code,l.grammar,l.language));else o(M.util.encode(l.code))},highlight:function(e,n,t){var r={code:e,grammar:n,language:t};return M.hooks.run("before-tokenize",r),r.tokens=M.tokenize(r.code,r.grammar),M.hooks.run("after-tokenize",r),W.stringify(M.util.encode(r.tokens),r.language)},tokenize:function(e,n){var t=n.rest;if(t){for(var r in t)n[r]=t[r];delete n.rest}var a=new i;return I(a,a.head,e),function e(n,t,r,a,i,l){for(var o in r)if(r.hasOwnProperty(o)&&r[o]){var s=r[o];s=Array.isArray(s)?s:[s];for(var u=0;u<s.length;++u){if(l&&l.cause==o+","+u)return;var c=s[u],g=c.inside,f=!!c.lookbehind,h=!!c.greedy,d=c.alias;if(h&&!c.pattern.global){var v=c.pattern.toString().match(/[imsuy]*$/)[0];c.pattern=RegExp(c.pattern.source,v+"g")}for(var p=c.pattern||c,m=a.next,y=i;m!==t.tail&&!(l&&y>=l.reach);y+=m.value.length,m=m.next){var k=m.value;if(t.length>n.length)return;if(!(k instanceof W)){var x,b=1;if(h){if(!(x=z(p,y,n,f))||x.index>=n.length)break;var w=x.index,A=x.index+x[0].length,P=y;for(P+=m.value.length;P<=w;)m=m.next,P+=m.value.length;if(P-=m.value.length,y=P,m.value instanceof W)continue;for(var E=m;E!==t.tail&&(P<A||"string"==typeof E.value);E=E.next)b++,P+=E.value.length;b--,k=n.slice(y,P),x.index-=y}else if(!(x=z(p,0,k,f)))continue;var w=x.index,L=x[0],S=k.slice(0,w),O=k.slice(w+L.length),j=y+k.length;l&&j>l.reach&&(l.reach=j);var C=m.prev;S&&(C=I(t,C,S),y+=S.length),q(t,C,b);var N=new W(o,g?M.tokenize(L,g):L,d,L);if(m=I(t,C,N),O&&I(t,m,O),1<b){var _={cause:o+","+u,reach:j};e(n,t,r,m.prev,y,_),l&&_.reach>l.reach&&(l.reach=_.reach)}}}}}}(e,a,n,a.head,0),function(e){var n=[],t=e.head.next;for(;t!==e.tail;)n.push(t.value),t=t.next;return n}(a)},hooks:{all:{},add:function(e,n){var t=M.hooks.all;t[e]=t[e]||[],t[e].push(n)},run:function(e,n){var t=M.hooks.all[e];if(t&&t.length)for(var r,a=0;r=t[a++];)r(n)}},Token:W};function W(e,n,t,r){this.type=e,this.content=n,this.alias=t,this.length=0|(r||"").length}function z(e,n,t,r){e.lastIndex=n;var a=e.exec(t);if(a&&r&&a[1]){var i=a[1].length;a.index+=i,a[0]=a[0].slice(i)}return a}function i(){var e={value:null,prev:null,next:null},n={value:null,prev:e,next:null};e.next=n,this.head=e,this.tail=n,this.length=0}function I(e,n,t){var r=n.next,a={value:t,prev:n,next:r};return n.next=a,r.prev=a,e.length++,a}function q(e,n,t){for(var r=n.next,a=0;a<t&&r!==e.tail;a++)r=r.next;(n.next=r).prev=n,e.length-=a}if(u.Prism=M,W.stringify=function n(e,t){if("string"==typeof e)return e;if(Array.isArray(e)){var r="";return e.forEach(function(e){r+=n(e,t)}),r}var a={type:e.type,content:n(e.content,t),tag:"span",classes:["token",e.type],attributes:{},language:t},i=e.alias;i&&(Array.isArray(i)?Array.prototype.push.apply(a.classes,i):a.classes.push(i)),M.hooks.run("wrap",a);var l="";for(var o in a.attributes)l+=" "+o+'="'+(a.attributes[o]||"").replace(/"/g,""")+'"';return"<"+a.tag+' class="'+a.classes.join(" ")+'"'+l+">"+a.content+"</"+a.tag+">"},!u.document)return u.addEventListener&&(M.disableWorkerMessageHandler||u.addEventListener("message",function(e){var n=JSON.parse(e.data),t=n.language,r=n.code,a=n.immediateClose;u.postMessage(M.highlight(r,M.languages[t],t)),a&&u.close()},!1)),M;var r=M.util.currentScript();function a(){M.manual||M.highlightAll()}if(r&&(M.filename=r.src,r.hasAttribute("data-manual")&&(M.manual=!0)),!M.manual){var l=document.readyState;"loading"===l||"interactive"===l&&r&&r.defer?document.addEventListener("DOMContentLoaded",a):window.requestAnimationFrame?window.requestAnimationFrame(a):window.setTimeout(a,16)}return M}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism);
Prism.languages.markup={comment:{pattern:/<!--(?:(?!<!--)[\s\S])*?-->/,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/<!DOCTYPE(?:[^>"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^<!|>$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&/,"&"))}),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(a,e){var s={};s["language-"+e]={pattern:/(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,lookbehind:!0,inside:Prism.languages[e]},s.cdata=/^<!\[CDATA\[|\]\]>$/i;var t={"included-cdata":{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,inside:s}};t["language-"+e]={pattern:/[\s\S]+/,inside:Prism.languages[e]};var n={};n[a]={pattern:RegExp("(<__[^>]*>)(?:<!\\[CDATA\\[(?:[^\\]]|\\](?!\\]>))*\\]\\]>|(?!<!\\[CDATA\\[)[^])*?(?=</__>)".replace(/__/g,function(){return a}),"i"),lookbehind:!0,greedy:!0,inside:t},Prism.languages.insertBefore("markup","cdata",n)}}),Object.defineProperty(Prism.languages.markup.tag,"addAttribute",{value:function(a,e){Prism.languages.markup.tag.inside["special-attr"].push({pattern:RegExp("(^|[\"'\\s])(?:"+a+")\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))","i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[e,"language-"+e],inside:Prism.languages[e]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml;
!function(s){var e=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;s.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+e.source+"|(?:[^\\\\\r\n()\"']|\\\\[^])*)\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+e.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+e.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:e,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},s.languages.css.atrule.inside.rest=s.languages.css;var t=s.languages.markup;t&&(t.tag.addInlined("style","css"),t.tag.addAttribute("style","css"))}(Prism);
Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/};
Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp("(^|[^\\w$])(?:NaN|Infinity|0[bB][01]+(?:_[01]+)*n?|0[oO][0-7]+(?:_[0-7]+)*n?|0[xX][\\dA-Fa-f]+(?:_[\\dA-Fa-f]+)*n?|\\d+(?:_\\d+)*n|(?:\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\.\\d+(?:_\\d+)*)(?:[Ee][+-]?\\d+(?:_\\d+)*)?)(?![\\w$])"),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),Prism.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute("on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)","javascript")),Prism.languages.js=Prism.languages.javascript;
</script>
================================================
FILE: demos/4.html
================================================
<!doctype html>
<img src='mario.png' id=mario hidden>
<script src='../src/w.js'></script>
<script src='mario.js'></script>
<script src="jscolor.js"></script>
<table>
<tr>
<td>
<canvas id=c4 width=340 height=300></canvas>
<td>
<pre class=language-js><code id=code>W.move({n:"M",size:3,rx:0,ry:0,rz:0,a:1000},100);</code></pre>
<b>Settings</b>
<p>
Size <input id=size type=number value=3>
<p>
<span class=a>rx</span> <input type=range id=rx min=-90 max=90 value=0>
<p>
<span class=a>ry</span> <input type=range id=ry min=-90 max=90 value=0>
<p>
<span class=a>rz</span> <input type=range id=rz min=-90 max=90 value=0>
<p>
Animation <input id=a type=number value=1000 step=100 min=0>
<p>
Delay <input id=delay type=number value=100 step=100 min=0>
<p>
<button id=ok>Execute</button>
<p>
</table>
<script>
onload = () => {
W.reset(c4);
W.light({x:.5,y:0,z:-.5});
W.camera({z:4});
W.mario({n:"M",size:3,z:0,rx:-90,ry:180,t:mario,s:1});
onchange = oninput = () => {
html = `\
W.move({n:"M",size:${+size.value},rx:${+rx.value},ry:${+ry.value},rz:${+rz.value},a:${+a.value}},${+delay.value});`;
code.innerHTML = html;
Prism.highlightAll();
}
ok.onclick = () => {
W.move({n:"M",size:+size.value,rx:-90+(+rx.value),ry:180+(+ry.value),rz:+rz.value,a:+a.value},+delay.value);
}
};
</script>
<style>
body { font-family: calibri; font-size: 12px; margin: 0; }
pre { background: #eee; padding: 8px !important; display: block; width:415px; overflow-x: auto; margin: 0 0 20px 0 !important; border: 2px solid #000; border-right-width: 4px; }
td+td { padding: 0 0 0 20px; vertical-align: top; position: relative; line-height: 25px; }
input { width: 100px; position: absolute; left: 90px; }
br { line-height: 20px }
#c { width: 90px }
code * { letter-spacing: -.5px; }
p { margin: 6px 0 }
b { margin: 0px 0 6px; display: inline-block; }
canvas { border: 2px solid #000; border-right-width: 4px; }
</style>
<style>
/* PrismJS 1.25.0
https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f8f8f8}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}
</style>
<script>
/* PrismJS 1.25.0
https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(u){var t=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,n=0,e={},M={manual:u.Prism&&u.Prism.manual,disableWorkerMessageHandler:u.Prism&&u.Prism.disableWorkerMessageHandler,util:{encode:function e(n){return n instanceof W?new W(n.type,e(n.content),n.alias):Array.isArray(n)?n.map(e):n.replace(/&/g,"&").replace(/</g,"<").replace(/\u00a0/g," ")},type:function(e){return Object.prototype.toString.call(e).slice(8,-1)},objId:function(e){return e.__id||Object.defineProperty(e,"__id",{value:++n}),e.__id},clone:function t(e,r){var a,n;switch(r=r||{},M.util.type(e)){case"Object":if(n=M.util.objId(e),r[n])return r[n];for(var i in a={},r[n]=a,e)e.hasOwnProperty(i)&&(a[i]=t(e[i],r));return a;case"Array":return n=M.util.objId(e),r[n]?r[n]:(a=[],r[n]=a,e.forEach(function(e,n){a[n]=t(e,r)}),a);default:return e}},getLanguage:function(e){for(;e;){var n=t.exec(e.className);if(n)return n[1].toLowerCase();e=e.parentElement}return"none"},setLanguage:function(e,n){e.className=e.className.replace(RegExp(t,"gi"),""),e.classList.add("language-"+n)},currentScript:function(){if("undefined"==typeof document)return null;if("currentScript"in document)return document.currentScript;try{throw new Error}catch(e){var n=(/at [^(\r\n]*\((.*):[^:]+:[^:]+\)$/i.exec(e.stack)||[])[1];if(n){var t=document.getElementsByTagName("script");for(var r in t)if(t[r].src==n)return t[r]}return null}},isActive:function(e,n,t){for(var r="no-"+n;e;){var a=e.classList;if(a.contains(n))return!0;if(a.contains(r))return!1;e=e.parentElement}return!!t}},languages:{plain:e,plaintext:e,text:e,txt:e,extend:function(e,n){var t=M.util.clone(M.languages[e]);for(var r in n)t[r]=n[r];return t},insertBefore:function(t,e,n,r){var a=(r=r||M.languages)[t],i={};for(var l in a)if(a.hasOwnProperty(l)){if(l==e)for(var o in n)n.hasOwnProperty(o)&&(i[o]=n[o]);n.hasOwnProperty(l)||(i[l]=a[l])}var s=r[t];return r[t]=i,M.languages.DFS(M.languages,function(e,n){n===s&&e!=t&&(this[e]=i)}),i},DFS:function e(n,t,r,a){a=a||{};var i=M.util.objId;for(var l in n)if(n.hasOwnProperty(l)){t.call(n,l,n[l],r||l);var o=n[l],s=M.util.type(o);"Object"!==s||a[i(o)]?"Array"!==s||a[i(o)]||(a[i(o)]=!0,e(o,t,l,a)):(a[i(o)]=!0,e(o,t,null,a))}}},plugins:{},highlightAll:function(e,n){M.highlightAllUnder(document,e,n)},highlightAllUnder:function(e,n,t){var r={callback:t,container:e,selector:'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'};M.hooks.run("before-highlightall",r),r.elements=Array.prototype.slice.apply(r.container.querySelectorAll(r.selector)),M.hooks.run("before-all-elements-highlight",r);for(var a,i=0;a=r.elements[i++];)M.highlightElement(a,!0===n,r.callback)},highlightElement:function(e,n,t){var r=M.util.getLanguage(e),a=M.languages[r];M.util.setLanguage(e,r);var i=e.parentElement;i&&"pre"===i.nodeName.toLowerCase()&&M.util.setLanguage(i,r);var l={element:e,language:r,grammar:a,code:e.textContent};function o(e){l.highlightedCode=e,M.hooks.run("before-insert",l),l.element.innerHTML=l.highlightedCode,M.hooks.run("after-highlight",l),M.hooks.run("complete",l),t&&t.call(l.element)}if(M.hooks.run("before-sanity-check",l),(i=l.element.parentElement)&&"pre"===i.nodeName.toLowerCase()&&!i.hasAttribute("tabindex")&&i.setAttribute("tabindex","0"),!l.code)return M.hooks.run("complete",l),void(t&&t.call(l.element));if(M.hooks.run("before-highlight",l),l.grammar)if(n&&u.Worker){var s=new Worker(M.filename);s.onmessage=function(e){o(e.data)},s.postMessage(JSON.stringify({language:l.language,code:l.code,immediateClose:!0}))}else o(M.highlight(l.code,l.grammar,l.language));else o(M.util.encode(l.code))},highlight:function(e,n,t){var r={code:e,grammar:n,language:t};return M.hooks.run("before-tokenize",r),r.tokens=M.tokenize(r.code,r.grammar),M.hooks.run("after-tokenize",r),W.stringify(M.util.encode(r.tokens),r.language)},tokenize:function(e,n){var t=n.rest;if(t){for(var r in t)n[r]=t[r];delete n.rest}var a=new i;return I(a,a.head,e),function e(n,t,r,a,i,l){for(var o in r)if(r.hasOwnProperty(o)&&r[o]){var s=r[o];s=Array.isArray(s)?s:[s];for(var u=0;u<s.length;++u){if(l&&l.cause==o+","+u)return;var c=s[u],g=c.inside,f=!!c.lookbehind,h=!!c.greedy,d=c.alias;if(h&&!c.pattern.global){var v=c.pattern.toString().match(/[imsuy]*$/)[0];c.pattern=RegExp(c.pattern.source,v+"g")}for(var p=c.pattern||c,m=a.next,y=i;m!==t.tail&&!(l&&y>=l.reach);y+=m.value.length,m=m.next){var k=m.value;if(t.length>n.length)return;if(!(k instanceof W)){var x,b=1;if(h){if(!(x=z(p,y,n,f))||x.index>=n.length)break;var w=x.index,A=x.index+x[0].length,P=y;for(P+=m.value.length;P<=w;)m=m.next,P+=m.value.length;if(P-=m.value.length,y=P,m.value instanceof W)continue;for(var E=m;E!==t.tail&&(P<A||"string"==typeof E.value);E=E.next)b++,P+=E.value.length;b--,k=n.slice(y,P),x.index-=y}else if(!(x=z(p,0,k,f)))continue;var w=x.index,L=x[0],S=k.slice(0,w),O=k.slice(w+L.length),j=y+k.length;l&&j>l.reach&&(l.reach=j);var C=m.prev;S&&(C=I(t,C,S),y+=S.length),q(t,C,b);var N=new W(o,g?M.tokenize(L,g):L,d,L);if(m=I(t,C,N),O&&I(t,m,O),1<b){var _={cause:o+","+u,reach:j};e(n,t,r,m.prev,y,_),l&&_.reach>l.reach&&(l.reach=_.reach)}}}}}}(e,a,n,a.head,0),function(e){var n=[],t=e.head.next;for(;t!==e.tail;)n.push(t.value),t=t.next;return n}(a)},hooks:{all:{},add:function(e,n){var t=M.hooks.all;t[e]=t[e]||[],t[e].push(n)},run:function(e,n){var t=M.hooks.all[e];if(t&&t.length)for(var r,a=0;r=t[a++];)r(n)}},Token:W};function W(e,n,t,r){this.type=e,this.content=n,this.alias=t,this.length=0|(r||"").length}function z(e,n,t,r){e.lastIndex=n;var a=e.exec(t);if(a&&r&&a[1]){var i=a[1].length;a.index+=i,a[0]=a[0].slice(i)}return a}function i(){var e={value:null,prev:null,next:null},n={value:null,prev:e,next:null};e.next=n,this.head=e,this.tail=n,this.length=0}function I(e,n,t){var r=n.next,a={value:t,prev:n,next:r};return n.next=a,r.prev=a,e.length++,a}function q(e,n,t){for(var r=n.next,a=0;a<t&&r!==e.tail;a++)r=r.next;(n.next=r).prev=n,e.length-=a}if(u.Prism=M,W.stringify=function n(e,t){if("string"==typeof e)return e;if(Array.isArray(e)){var r="";return e.forEach(function(e){r+=n(e,t)}),r}var a={type:e.type,content:n(e.content,t),tag:"span",classes:["token",e.type],attributes:{},language:t},i=e.alias;i&&(Array.isArray(i)?Array.prototype.push.apply(a.classes,i):a.classes.push(i)),M.hooks.run("wrap",a);var l="";for(var o in a.attributes)l+=" "+o+'="'+(a.attributes[o]||"").replace(/"/g,""")+'"';return"<"+a.tag+' class="'+a.classes.join(" ")+'"'+l+">"+a.content+"</"+a.tag+">"},!u.document)return u.addEventListener&&(M.disableWorkerMessageHandler||u.addEventListener("message",function(e){var n=JSON.parse(e.data),t=n.language,r=n.code,a=n.immediateClose;u.postMessage(M.highlight(r,M.languages[t],t)),a&&u.close()},!1)),M;var r=M.util.currentScript();function a(){M.manual||M.highlightAll()}if(r&&(M.filename=r.src,r.hasAttribute("data-manual")&&(M.manual=!0)),!M.manual){var l=document.readyState;"loading"===l||"interactive"===l&&r&&r.defer?document.addEventListener("DOMContentLoaded",a):window.requestAnimationFrame?window.requestAnimationFrame(a):window.setTimeout(a,16)}return M}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism);
Prism.languages.markup={comment:{pattern:/<!--(?:(?!<!--)[\s\S])*?-->/,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/<!DOCTYPE(?:[^>"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^<!|>$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&/,"&"))}),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(a,e){var s={};s["language-"+e]={pattern:/(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,lookbehind:!0,inside:Prism.languages[e]},s.cdata=/^<!\[CDATA\[|\]\]>$/i;var t={"included-cdata":{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,inside:s}};t["language-"+e]={pattern:/[\s\S]+/,inside:Prism.languages[e]};var n={};n[a]={pattern:RegExp("(<__[^>]*>)(?:<!\\[CDATA\\[(?:[^\\]]|\\](?!\\]>))*\\]\\]>|(?!<!\\[CDATA\\[)[^])*?(?=</__>)".replace(/__/g,function(){return a}),"i"),lookbehind:!0,greedy:!0,inside:t},Prism.languages.insertBefore("markup","cdata",n)}}),Object.defineProperty(Prism.languages.markup.tag,"addAttribute",{value:function(a,e){Prism.languages.markup.tag.inside["special-attr"].push({pattern:RegExp("(^|[\"'\\s])(?:"+a+")\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))","i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[e,"language-"+e],inside:Prism.languages[e]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml;
!function(s){var e=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;s.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+e.source+"|(?:[^\\\\\r\n()\"']|\\\\[^])*)\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+e.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+e.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:e,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},s.languages.css.atrule.inside.rest=s.languages.css;var t=s.languages.markup;t&&(t.tag.addInlined("style","css"),t.tag.addAttribute("style","css"))}(Prism);
Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/};
Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp("(^|[^\\w$])(?:NaN|Infinity|0[bB][01]+(?:_[01]+)*n?|0[oO][0-7]+(?:_[0-7]+)*n?|0[xX][\\dA-Fa-f]+(?:_[\\dA-Fa-f]+)*n?|\\d+(?:_\\d+)*n|(?:\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\.\\d+(?:_\\d+)*)(?:[Ee][+-]?\\d+(?:_\\d+)*)?)(?![\\w$])"),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),Prism.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute("on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)","javascript")),Prism.languages.js=Prism.languages.javascript;
</script>
================================================
FILE: demos/5.html
================================================
<!doctype html>
<img src='mario.png' id=mario hidden>
<img src='brick.png' id=brick hidden>
<script src='../src/w.js'></script>
<script src='mario.js'></script>
<script src="jscolor.js"></script>
<table width=850>
<tr>
<td width=320>
<canvas id=c5 width=320 height=340></canvas>
<td>
<pre class=language-js><code id=code>orthogonal = ({left, right, top, bottom, near, far }) => {
return new DOMMatrix([
2/(right - left), 0, 0, 0,
0, 2/(top - bottom), 0, 0,
0, 0, -2/(far - near), 0,
-(right + left)/(right - left), -(top + bottom)/(top - bottom),
-(far + near)/(far - near), 1
]);
}
W.camera({x:4.5,y:2,z:0,rx:-20,ry:30,fov:22});
</code></pre>
<b>Projection</b>
<p>
<label><input type=radio name=p id=p1 checked> Perspective (default)</label>
<label><input type=radio name=p id=p2> Orthogonal (custom)</label>
<!--p style="position:absolute;top:270px">(You can find an example of orthogonal matrix function <a href="https://github.com/xem/webgl-guide/blob/gh-pages/lib/matrix.js#L20-L39">here</a>)-->
</table>
<script>
orthogonal = ({left, right, top, bottom, near, far }) => {
return new DOMMatrix([
2 / (right - left), 0, 0, 0,
0, 2 / (top - bottom), 0, 0,
0, 0, -2 / (far - near), 0,
-(right + left) / (right - left), -(top + bottom) / (top - bottom), -(far + near) / (far - near), 1
]);
}
onload = () => {
W.reset(c5);
W.light({x:.5,y:0,z:-.5});
W.camera({x:4.5,y:2,z:0,rx:-20,ry:30,fov:22});
W.cube({x:-2,y:-2,z:-6,b:"146"});
W.pyramid({x:0,y:-2,z:-6,b:"146"});
W.sphere({x:2,y:-2,z:-6,b:"146"});
W.cube({x:-2,y:-1,z:-8,t:brick});
W.pyramid({x:0,y:-1,z:-8,t:brick});
W.sphere({x:2,y:-1,z:-8,t:brick});
W.cube({x:-2,y:0,z:-10,b:"16f8"});
W.pyramid({x:0,y:0,z:-10,b:"16f8"});
W.sphere({x:2,y:0,z:-10,b:"16f8"});
onchange = oninput = () => {
if(p1.checked){
code.innerHTML = `orthogonal = ({left, right, top, bottom, near, far }) => {
return new DOMMatrix([
2/(right - left), 0, 0, 0,
0, 2/(top - bottom), 0, 0,
0, 0, -2/(far - near), 0,
-(right + left)/(right - left), -(top + bottom)/(top - bottom),
-(far + near)/(far - near), 1
]);
}
W.camera({x:4.5,y:2,z:0,rx:-20,ry:30,fov:22});
`;
W.camera({x:4.5,y:2,z:0,rx:-20,ry:30,fov:22});
}
else {
code.innerHTML = `orthogonal = ({left, right, top, bottom, near, far }) => {
return new DOMMatrix([
2/(right - left), 0, 0, 0,
0, 2/(top - bottom), 0, 0,
0, 0, -2/(far - near), 0,
-(right + left)/(right - left), -(top + bottom)/(top - bottom),
-(far + near)/(far - near), 1
]);
}
W.projection = orthogonal({left:-4,right:4,top:4,bottom:-4,near:1,far:99});
W.camera({x:4.5,y:2,z:0,rx:-20,ry:30});`;
W.projection = orthogonal({left:-4,right:4,top:4,bottom:-4,near:1,far:99});
W.camera({x:4.5,y:2,z:0,rx:-20,ry:30});
}
Prism.highlightAll();
}
};
</script>
<style>
body { font-family: calibri; font-size: 12px; margin: 0; }
pre { background: #eee; padding: 8px !important; display: block; width:465px; overflow-x: auto; margin: 0 0 20px 0 !important; border: 2px solid #000; border-right-width: 4px; }
td+td { padding: 0 0 0 20px; vertical-align: top; position: relative; line-height: 25px; }
br { line-height: 20px }
#c { width: 90px }
code * { letter-spacing: -.5px; }
p { margin: 6px 0 }
b { margin: 0px 0 6px; display: inline-block; }
canvas { border: 2px solid #000; border-right-width: 4px; }
</style>
<style>
/* PrismJS 1.25.0
https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f8f8f8}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}
</style>
<script>
/* PrismJS 1.25.0
https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(u){var t=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,n=0,e={},M={manual:u.Prism&&u.Prism.manual,disableWorkerMessageHandler:u.Prism&&u.Prism.disableWorkerMessageHandler,util:{encode:function e(n){return n instanceof W?new W(n.type,e(n.content),n.alias):Array.isArray(n)?n.map(e):n.replace(/&/g,"&").replace(/</g,"<").replace(/\u00a0/g," ")},type:function(e){return Object.prototype.toString.call(e).slice(8,-1)},objId:function(e){return e.__id||Object.defineProperty(e,"__id",{value:++n}),e.__id},clone:function t(e,r){var a,n;switch(r=r||{},M.util.type(e)){case"Object":if(n=M.util.objId(e),r[n])return r[n];for(var i in a={},r[n]=a,e)e.hasOwnProperty(i)&&(a[i]=t(e[i],r));return a;case"Array":return n=M.util.objId(e),r[n]?r[n]:(a=[],r[n]=a,e.forEach(function(e,n){a[n]=t(e,r)}),a);default:return e}},getLanguage:function(e){for(;e;){var n=t.exec(e.className);if(n)return n[1].toLowerCase();e=e.parentElement}return"none"},setLanguage:function(e,n){e.className=e.className.replace(RegExp(t,"gi"),""),e.classList.add("language-"+n)},currentScript:function(){if("undefined"==typeof document)return null;if("currentScript"in document)return document.currentScript;try{throw new Error}catch(e){var n=(/at [^(\r\n]*\((.*):[^:]+:[^:]+\)$/i.exec(e.stack)||[])[1];if(n){var t=document.getElementsByTagName("script");for(var r in t)if(t[r].src==n)return t[r]}return null}},isActive:function(e,n,t){for(var r="no-"+n;e;){var a=e.classList;if(a.contains(n))return!0;if(a.contains(r))return!1;e=e.parentElement}return!!t}},languages:{plain:e,plaintext:e,text:e,txt:e,extend:function(e,n){var t=M.util.clone(M.languages[e]);for(var r in n)t[r]=n[r];return t},insertBefore:function(t,e,n,r){var a=(r=r||M.languages)[t],i={};for(var l in a)if(a.hasOwnProperty(l)){if(l==e)for(var o in n)n.hasOwnProperty(o)&&(i[o]=n[o]);n.hasOwnProperty(l)||(i[l]=a[l])}var s=r[t];return r[t]=i,M.languages.DFS(M.languages,function(e,n){n===s&&e!=t&&(this[e]=i)}),i},DFS:function e(n,t,r,a){a=a||{};var i=M.util.objId;for(var l in n)if(n.hasOwnProperty(l)){t.call(n,l,n[l],r||l);var o=n[l],s=M.util.type(o);"Object"!==s||a[i(o)]?"Array"!==s||a[i(o)]||(a[i(o)]=!0,e(o,t,l,a)):(a[i(o)]=!0,e(o,t,null,a))}}},plugins:{},highlightAll:function(e,n){M.highlightAllUnder(document,e,n)},highlightAllUnder:function(e,n,t){var r={callback:t,container:e,selector:'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'};M.hooks.run("before-highlightall",r),r.elements=Array.prototype.slice.apply(r.container.querySelectorAll(r.selector)),M.hooks.run("before-all-elements-highlight",r);for(var a,i=0;a=r.elements[i++];)M.highlightElement(a,!0===n,r.callback)},highlightElement:function(e,n,t){var r=M.util.getLanguage(e),a=M.languages[r];M.util.setLanguage(e,r);var i=e.parentElement;i&&"pre"===i.nodeName.toLowerCase()&&M.util.setLanguage(i,r);var l={element:e,language:r,grammar:a,code:e.textContent};function o(e){l.highlightedCode=e,M.hooks.run("before-insert",l),l.element.innerHTML=l.highlightedCode,M.hooks.run("after-highlight",l),M.hooks.run("complete",l),t&&t.call(l.element)}if(M.hooks.run("before-sanity-check",l),(i=l.element.parentElement)&&"pre"===i.nodeName.toLowerCase()&&!i.hasAttribute("tabindex")&&i.setAttribute("tabindex","0"),!l.code)return M.hooks.run("complete",l),void(t&&t.call(l.element));if(M.hooks.run("before-highlight",l),l.grammar)if(n&&u.Worker){var s=new Worker(M.filename);s.onmessage=function(e){o(e.data)},s.postMessage(JSON.stringify({language:l.language,code:l.code,immediateClose:!0}))}else o(M.highlight(l.code,l.grammar,l.language));else o(M.util.encode(l.code))},highlight:function(e,n,t){var r={code:e,grammar:n,language:t};return M.hooks.run("before-tokenize",r),r.tokens=M.tokenize(r.code,r.grammar),M.hooks.run("after-tokenize",r),W.stringify(M.util.encode(r.tokens),r.language)},tokenize:function(e,n){var t=n.rest;if(t){for(var r in t)n[r]=t[r];delete n.rest}var a=new i;return I(a,a.head,e),function e(n,t,r,a,i,l){for(var o in r)if(r.hasOwnProperty(o)&&r[o]){var s=r[o];s=Array.isArray(s)?s:[s];for(var u=0;u<s.length;++u){if(l&&l.cause==o+","+u)return;var c=s[u],g=c.inside,f=!!c.lookbehind,h=!!c.greedy,d=c.alias;if(h&&!c.pattern.global){var v=c.pattern.toString().match(/[imsuy]*$/)[0];c.pattern=RegExp(c.pattern.source,v+"g")}for(var p=c.pattern||c,m=a.next,y=i;m!==t.tail&&!(l&&y>=l.reach);y+=m.value.length,m=m.next){var k=m.value;if(t.length>n.length)return;if(!(k instanceof W)){var x,b=1;if(h){if(!(x=z(p,y,n,f))||x.index>=n.length)break;var w=x.index,A=x.index+x[0].length,P=y;for(P+=m.value.length;P<=w;)m=m.next,P+=m.value.length;if(P-=m.value.length,y=P,m.value instanceof W)continue;for(var E=m;E!==t.tail&&(P<A||"string"==typeof E.value);E=E.next)b++,P+=E.value.length;b--,k=n.slice(y,P),x.index-=y}else if(!(x=z(p,0,k,f)))continue;var w=x.index,L=x[0],S=k.slice(0,w),O=k.slice(w+L.length),j=y+k.length;l&&j>l.reach&&(l.reach=j);var C=m.prev;S&&(C=I(t,C,S),y+=S.length),q(t,C,b);var N=new W(o,g?M.tokenize(L,g):L,d,L);if(m=I(t,C,N),O&&I(t,m,O),1<b){var _={cause:o+","+u,reach:j};e(n,t,r,m.prev,y,_),l&&_.reach>l.reach&&(l.reach=_.reach)}}}}}}(e,a,n,a.head,0),function(e){var n=[],t=e.head.next;for(;t!==e.tail;)n.push(t.value),t=t.next;return n}(a)},hooks:{all:{},add:function(e,n){var t=M.hooks.all;t[e]=t[e]||[],t[e].push(n)},run:function(e,n){var t=M.hooks.all[e];if(t&&t.length)for(var r,a=0;r=t[a++];)r(n)}},Token:W};function W(e,n,t,r){this.type=e,this.content=n,this.alias=t,this.length=0|(r||"").length}function z(e,n,t,r){e.lastIndex=n;var a=e.exec(t);if(a&&r&&a[1]){var i=a[1].length;a.index+=i,a[0]=a[0].slice(i)}return a}function i(){var e={value:null,prev:null,next:null},n={value:null,prev:e,next:null};e.next=n,this.head=e,this.tail=n,this.length=0}function I(e,n,t){var r=n.next,a={value:t,prev:n,next:r};return n.next=a,r.prev=a,e.length++,a}function q(e,n,t){for(var r=n.next,a=0;a<t&&r!==e.tail;a++)r=r.next;(n.next=r).prev=n,e.length-=a}if(u.Prism=M,W.stringify=function n(e,t){if("string"==typeof e)return e;if(Array.isArray(e)){var r="";return e.forEach(function(e){r+=n(e,t)}),r}var a={type:e.type,content:n(e.content,t),tag:"span",classes:["token",e.type],attributes:{},language:t},i=e.alias;i&&(Array.isArray(i)?Array.prototype.push.apply(a.classes,i):a.classes.push(i)),M.hooks.run("wrap",a);var l="";for(var o in a.attributes)l+=" "+o+'="'+(a.attributes[o]||"").replace(/"/g,""")+'"';return"<"+a.tag+' class="'+a.classes.join(" ")+'"'+l+">"+a.content+"</"+a.tag+">"},!u.document)return u.addEventListener&&(M.disableWorkerMessageHandler||u.addEventListener("message",function(e){var n=JSON.parse(e.data),t=n.language,r=n.code,a=n.immediateClose;u.postMessage(M.highlight(r,M.languages[t],t)),a&&u.close()},!1)),M;var r=M.util.currentScript();function a(){M.manual||M.highlightAll()}if(r&&(M.filename=r.src,r.hasAttribute("data-manual")&&(M.manual=!0)),!M.manual){var l=document.readyState;"loading"===l||"interactive"===l&&r&&r.defer?document.addEventListener("DOMContentLoaded",a):window.requestAnimationFrame?window.requestAnimationFrame(a):window.setTimeout(a,16)}return M}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism);
Prism.languages.markup={comment:{pattern:/<!--(?:(?!<!--)[\s\S])*?-->/,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/<!DOCTYPE(?:[^>"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^<!|>$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&/,"&"))}),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(a,e){var s={};s["language-"+e]={pattern:/(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,lookbehind:!0,inside:Prism.languages[e]},s.cdata=/^<!\[CDATA\[|\]\]>$/i;var t={"included-cdata":{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,inside:s}};t["language-"+e]={pattern:/[\s\S]+/,inside:Prism.languages[e]};var n={};n[a]={pattern:RegExp("(<__[^>]*>)(?:<!\\[CDATA\\[(?:[^\\]]|\\](?!\\]>))*\\]\\]>|(?!<!\\[CDATA\\[)[^])*?(?=</__>)".replace(/__/g,function(){return a}),"i"),lookbehind:!0,greedy:!0,inside:t},Prism.languages.insertBefore("markup","cdata",n)}}),Object.defineProperty(Prism.languages.markup.tag,"addAttribute",{value:function(a,e){Prism.languages.markup.tag.inside["special-attr"].push({pattern:RegExp("(^|[\"'\\s])(?:"+a+")\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))","i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[e,"language-"+e],inside:Prism.languages[e]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml;
!function(s){var e=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;s.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+e.source+"|(?:[^\\\\\r\n()\"']|\\\\[^])*)\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+e.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+e.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:e,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},s.languages.css.atrule.inside.rest=s.languages.css;var t=s.languages.markup;t&&(t.tag.addInlined("style","css"),t.tag.addAttribute("style","css"))}(Prism);
Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/};
Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp("(^|[^\\w$])(?:NaN|Infinity|0[bB][01]+(?:_[01]+)*n?|0[oO][0-7]+(?:_[0-7]+)*n?|0[xX][\\dA-Fa-f]+(?:_[\\dA-Fa-f]+)*n?|\\d+(?:_\\d+)*n|(?:\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\.\\d+(?:_\\d+)*)(?:[Ee][+-]?\\d+(?:_\\d+)*)?)(?![\\w$])"),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),Prism.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute("on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)","javascript")),Prism.languages.js=Prism.languages.javascript;
</script>
================================================
FILE: demos/6.html
================================================
<!doctype html>
<img src='mario.png' id=mario hidden>
<img src='brick.png' id=brick hidden>
<script src='../src/w.js'></script>
<script src="jscolor.js"></script>
<table width=850>
<tr>
<td width=320>
<canvas id=c6 width=320 height=280></canvas>
<table style="text-align:center;margin:10px auto 0">
<tr>
<td colspan=2>
<button id=u>up</button>
<tr>
<td>
<button id=l>left</button>
<td>
<button id=r>right</button>
<tr>
<td colspan=2>
<button id=d>down</button>
</table>
<td>
<pre class=language-js><code id=code>keys = {u:0, l:0, r:0, d:0};
W.camera({z:2});
W.light({z:-.5});
W.cube({n:"cube", b:"5af"});
t = new DOMMatrix();
onmousedown = e => keys[e.target.id] = 1;
onmouseup = e => keys[e.target.id] = 0;
setInterval(()=>{
let axis = new DOMPoint(
rx = keys.d - keys.u,
ry = keys.r - keys.l,
0
);
let newAxis = axis.matrixTransform((new DOMMatrix(t)).invertSelf());
t.rotateAxisAngleSelf(
newAxis.x, newAxis.y, newAxis.z, Math.hypot(rx, ry) * 2
);
W.move({n:"cube", M: t});
}, 16);</code></pre>
</table>
<script>
onload = () => {
keys = {u:0, l:0, r:0, d:0};
W.reset(c6);
W.camera({z:2});
W.light({x:.5,y:.5,z:-.5});
W.cube({n:"cube", b:"5af"});
t = new DOMMatrix();
onmousedown = e => {
keys[e.target.id] = 1;
}
onmouseup = e => {
keys[e.target.id] = 0;
}
setInterval(()=>{
let axis = new DOMPoint(rx = keys.d - keys.u, ry = keys.r - keys.l, 0);
let newAxis = axis.matrixTransform((new DOMMatrix(t)).invertSelf());
t.rotateAxisAngleSelf(newAxis.x, newAxis.y, newAxis.z, Math.hypot(rx, ry) * 2);
W.move({n:"cube", M: t});
}, 16);
}
</script>
<style>
body { font-family: calibri; font-size: 12px; margin: 0; }
pre { background: #eee; padding: 8px !important; display: block; width:465px; overflow-x: auto; margin: 0 0 20px 0 !important; border: 2px solid #000; border-right-width: 4px; }
td+td { padding: 0 0 0 20px; vertical-align: top; position: relative; line-height: 25px; }
br { line-height: 20px }
#c { width: 90px }
code * { letter-spacing: -.5px; }
p { margin: 6px 0 }
b { margin: 0px 0 6px; display: inline-block; }
canvas { border: 2px solid #000; border-right-width: 4px; }
</style>
<style>
/* PrismJS 1.25.0
https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f8f8f8}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}
</style>
<script>
/* PrismJS 1.25.0
https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(u){var t=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,n=0,e={},M={manual:u.Prism&&u.Prism.manual,disableWorkerMessageHandler:u.Prism&&u.Prism.disableWorkerMessageHandler,util:{encode:function e(n){return n instanceof W?new W(n.type,e(n.content),n.alias):Array.isArray(n)?n.map(e):n.replace(/&/g,"&").replace(/</g,"<").replace(/\u00a0/g," ")},type:function(e){return Object.prototype.toString.call(e).slice(8,-1)},objId:function(e){return e.__id||Object.defineProperty(e,"__id",{value:++n}),e.__id},clone:function t(e,r){var a,n;switch(r=r||{},M.util.type(e)){case"Object":if(n=M.util.objId(e),r[n])return r[n];for(var i in a={},r[n]=a,e)e.hasOwnProperty(i)&&(a[i]=t(e[i],r));return a;case"Array":return n=M.util.objId(e),r[n]?r[n]:(a=[],r[n]=a,e.forEach(function(e,n){a[n]=t(e,r)}),a);default:return e}},getLanguage:function(e){for(;e;){var n=t.exec(e.className);if(n)return n[1].toLowerCase();e=e.parentElement}return"none"},setLanguage:function(e,n){e.className=e.className.replace(RegExp(t,"gi"),""),e.classList.add("language-"+n)},currentScript:function(){if("undefined"==typeof document)return null;if("currentScript"in document)return document.currentScript;try{throw new Error}catch(e){var n=(/at [^(\r\n]*\((.*):[^:]+:[^:]+\)$/i.exec(e.stack)||[])[1];if(n){var t=document.getElementsByTagName("script");for(var r in t)if(t[r].src==n)return t[r]}return null}},isActive:function(e,n,t){for(var r="no-"+n;e;){var a=e.classList;if(a.contains(n))return!0;if(a.contains(r))return!1;e=e.parentElement}return!!t}},languages:{plain:e,plaintext:e,text:e,txt:e,extend:function(e,n){var t=M.util.clone(M.languages[e]);for(var r in n)t[r]=n[r];return t},insertBefore:function(t,e,n,r){var a=(r=r||M.languages)[t],i={};for(var l in a)if(a.hasOwnProperty(l)){if(l==e)for(var o in n)n.hasOwnProperty(o)&&(i[o]=n[o]);n.hasOwnProperty(l)||(i[l]=a[l])}var s=r[t];return r[t]=i,M.languages.DFS(M.languages,function(e,n){n===s&&e!=t&&(this[e]=i)}),i},DFS:function e(n,t,r,a){a=a||{};var i=M.util.objId;for(var l in n)if(n.hasOwnProperty(l)){t.call(n,l,n[l],r||l);var o=n[l],s=M.util.type(o);"Object"!==s||a[i(o)]?"Array"!==s||a[i(o)]||(a[i(o)]=!0,e(o,t,l,a)):(a[i(o)]=!0,e(o,t,null,a))}}},plugins:{},highlightAll:function(e,n){M.highlightAllUnder(document,e,n)},highlightAllUnder:function(e,n,t){var r={callback:t,container:e,selector:'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'};M.hooks.run("before-highlightall",r),r.elements=Array.prototype.slice.apply(r.container.querySelectorAll(r.selector)),M.hooks.run("before-all-elements-highlight",r);for(var a,i=0;a=r.elements[i++];)M.highlightElement(a,!0===n,r.callback)},highlightElement:function(e,n,t){var r=M.util.getLanguage(e),a=M.languages[r];M.util.setLanguage(e,r);var i=e.parentElement;i&&"pre"===i.nodeName.toLowerCase()&&M.util.setLanguage(i,r);var l={element:e,language:r,grammar:a,code:e.textContent};function o(e){l.highlightedCode=e,M.hooks.run("before-insert",l),l.element.innerHTML=l.highlightedCode,M.hooks.run("after-highlight",l),M.hooks.run("complete",l),t&&t.call(l.element)}if(M.hooks.run("before-sanity-check",l),(i=l.element.parentElement)&&"pre"===i.nodeName.toLowerCase()&&!i.hasAttribute("tabindex")&&i.setAttribute("tabindex","0"),!l.code)return M.hooks.run("complete",l),void(t&&t.call(l.element));if(M.hooks.run("before-highlight",l),l.grammar)if(n&&u.Worker){var s=new Worker(M.filename);s.onmessage=function(e){o(e.data)},s.postMessage(JSON.stringify({language:l.language,code:l.code,immediateClose:!0}))}else o(M.highlight(l.code,l.grammar,l.language));else o(M.util.encode(l.code))},highlight:function(e,n,t){var r={code:e,grammar:n,language:t};return M.hooks.run("before-tokenize",r),r.tokens=M.tokenize(r.code,r.grammar),M.hooks.run("after-tokenize",r),W.stringify(M.util.encode(r.tokens),r.language)},tokenize:function(e,n){var t=n.rest;if(t){for(var r in t)n[r]=t[r];delete n.rest}var a=new i;return I(a,a.head,e),function e(n,t,r,a,i,l){for(var o in r)if(r.hasOwnProperty(o)&&r[o]){var s=r[o];s=Array.isArray(s)?s:[s];for(var u=0;u<s.length;++u){if(l&&l.cause==o+","+u)return;var c=s[u],g=c.inside,f=!!c.lookbehind,h=!!c.greedy,d=c.alias;if(h&&!c.pattern.global){var v=c.pattern.toString().match(/[imsuy]*$/)[0];c.pattern=RegExp(c.pattern.source,v+"g")}for(var p=c.pattern||c,m=a.next,y=i;m!==t.tail&&!(l&&y>=l.reach);y+=m.value.length,m=m.next){var k=m.value;if(t.length>n.length)return;if(!(k instanceof W)){var x,b=1;if(h){if(!(x=z(p,y,n,f))||x.index>=n.length)break;var w=x.index,A=x.index+x[0].length,P=y;for(P+=m.value.length;P<=w;)m=m.next,P+=m.value.length;if(P-=m.value.length,y=P,m.value instanceof W)continue;for(var E=m;E!==t.tail&&(P<A||"string"==typeof E.value);E=E.next)b++,P+=E.value.length;b--,k=n.slice(y,P),x.index-=y}else if(!(x=z(p,0,k,f)))continue;var w=x.index,L=x[0],S=k.slice(0,w),O=k.slice(w+L.length),j=y+k.length;l&&j>l.reach&&(l.reach=j);var C=m.prev;S&&(C=I(t,C,S),y+=S.length),q(t,C,b);var N=new W(o,g?M.tokenize(L,g):L,d,L);if(m=I(t,C,N),O&&I(t,m,O),1<b){var _={cause:o+","+u,reach:j};e(n,t,r,m.prev,y,_),l&&_.reach>l.reach&&(l.reach=_.reach)}}}}}}(e,a,n,a.head,0),function(e){var n=[],t=e.head.next;for(;t!==e.tail;)n.push(t.value),t=t.next;return n}(a)},hooks:{all:{},add:function(e,n){var t=M.hooks.all;t[e]=t[e]||[],t[e].push(n)},run:function(e,n){var t=M.hooks.all[e];if(t&&t.length)for(var r,a=0;r=t[a++];)r(n)}},Token:W};function W(e,n,t,r){this.type=e,this.content=n,this.alias=t,this.length=0|(r||"").length}function z(e,n,t,r){e.lastIndex=n;var a=e.exec(t);if(a&&r&&a[1]){var i=a[1].length;a.index+=i,a[0]=a[0].slice(i)}return a}function i(){var e={value:null,prev:null,next:null},n={value:null,prev:e,next:null};e.next=n,this.head=e,this.tail=n,this.length=0}function I(e,n,t){var r=n.next,a={value:t,prev:n,next:r};return n.next=a,r.prev=a,e.length++,a}function q(e,n,t){for(var r=n.next,a=0;a<t&&r!==e.tail;a++)r=r.next;(n.next=r).prev=n,e.length-=a}if(u.Prism=M,W.stringify=function n(e,t){if("string"==typeof e)return e;if(Array.isArray(e)){var r="";return e.forEach(function(e){r+=n(e,t)}),r}var a={type:e.type,content:n(e.content,t),tag:"span",classes:["token",e.type],attributes:{},language:t},i=e.alias;i&&(Array.isArray(i)?Array.prototype.push.apply(a.classes,i):a.classes.push(i)),M.hooks.run("wrap",a);var l="";for(var o in a.attributes)l+=" "+o+'="'+(a.attributes[o]||"").replace(/"/g,""")+'"';return"<"+a.tag+' class="'+a.classes.join(" ")+'"'+l+">"+a.content+"</"+a.tag+">"},!u.document)return u.addEventListener&&(M.disableWorkerMessageHandler||u.addEventListener("message",function(e){var n=JSON.parse(e.data),t=n.language,r=n.code,a=n.immediateClose;u.postMessage(M.highlight(r,M.languages[t],t)),a&&u.close()},!1)),M;var r=M.util.currentScript();function a(){M.manual||M.highlightAll()}if(r&&(M.filename=r.src,r.hasAttribute("data-manual")&&(M.manual=!0)),!M.manual){var l=document.readyState;"loading"===l||"interactive"===l&&r&&r.defer?document.addEventListener("DOMContentLoaded",a):window.requestAnimationFrame?window.requestAnimationFrame(a):window.setTimeout(a,16)}return M}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism);
Prism.languages.markup={comment:{pattern:/<!--(?:(?!<!--)[\s\S])*?-->/,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/<!DOCTYPE(?:[^>"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^<!|>$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&/,"&"))}),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(a,e){var s={};s["language-"+e]={pattern:/(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,lookbehind:!0,inside:Prism.languages[e]},s.cdata=/^<!\[CDATA\[|\]\]>$/i;var t={"included-cdata":{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,inside:s}};t["language-"+e]={pattern:/[\s\S]+/,inside:Prism.languages[e]};var n={};n[a]={pattern:RegExp("(<__[^>]*>)(?:<!\\[CDATA\\[(?:[^\\]]|\\](?!\\]>))*\\]\\]>|(?!<!\\[CDATA\\[)[^])*?(?=</__>)".replace(/__/g,function(){return a}),"i"),lookbehind:!0,greedy:!0,inside:t},Prism.languages.insertBefore("markup","cdata",n)}}),Object.defineProperty(Prism.languages.markup.tag,"addAttribute",{value:function(a,e){Prism.languages.markup.tag.inside["special-attr"].push({pattern:RegExp("(^|[\"'\\s])(?:"+a+")\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))","i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[e,"language-"+e],inside:Prism.languages[e]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml;
!function(s){var e=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;s.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+e.source+"|(?:[^\\\\\r\n()\"']|\\\\[^])*)\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+e.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+e.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:e,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},s.languages.css.atrule.inside.rest=s.languages.css;var t=s.languages.markup;t&&(t.tag.addInlined("style","css"),t.tag.addAttribute("style","css"))}(Prism);
Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/};
Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp("(^|[^\\w$])(?:NaN|Infinity|0[bB][01]+(?:_[01]+)*n?|0[oO][0-7]+(?:_[0-7]+)*n?|0[xX][\\dA-Fa-f]+(?:_[\\dA-Fa-f]+)*n?|\\d+(?:_\\d+)*n|(?:\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\.\\d+(?:_\\d+)*)(?:[Ee][+-]?\\d+(?:_\\d+)*)?)(?![\\w$])"),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),Prism.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute("on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)","javascript")),Prism.languages.js=Prism.languages.javascript;
</script>
================================================
FILE: demos/7.html
================================================
<!doctype html>
<img src='mario.png' id=mario hidden>
<img src='tree.png' id=tree hidden>
<script src='../src/w.js'></script>
<script src='mario.js'></script>
<script src="jscolor.js"></script>
<table width=850>
<tr>
<td width=320>
<canvas id=c7 width=320 height=300></canvas>
<table style="text-align:center;margin:10px auto 0">
<tr>
<td colspan=2>
<button id=u>front</button>
<tr>
<td>
<button id=l>left</button>
<td>
<button id=r>right</button>
<tr>
<td colspan=2>
<button id=d>back</button>
</table>
<td>
<pre class=language-js><code id=code>keys = {u:0, l:0, r:0, d:0};
X = -1.5;
Z = 18;
RY = 0;
W.clearColor("8af");
for(i = 0; i < 10; i++)
for(j = 0; j < 10; j++)
W.billboard({size:3,x:(i-5)*5,z:(j-5)*5,t:tree,ns:1});
W.mario({n:"M",size:1,x:X,y:-.9,z:Z,t:"mario",s:1});
W.camera({g:"M",y:.5,z:-2.5});
W.plane({g:"camera",size:100,b:"3d2",z:-100,y:-50,ns:1});
setInterval(()=>{
if(keys.u || keys.d)
W.move({
n:"M",
z: Z += (keys.d - keys.u) * Math.cos(RY*Math.PI/180) / 40,
x: X += (keys.d - keys.u) * Math.sin(RY*Math.PI/180) / 40
});
if(keys.r || keys.l) RY += (keys.l - keys.r)/5, W.move({n:"M", ry: RY});
});</code></pre>
</table>
<script>
onload = () => {
keys = {u:0, l:0, r:0, d:0};
W.ambient(0.7);
W.reset(c7);
W.light({x:.5,y:-.3,z:-.5});
for(i = 0; i < 10; i++){
for(j = 0; j < 10; j++){
W.billboard({size:3,x:(i-5)*5,z:(j-5)*5,t:tree,ns:1});
}
}
W.group({n:"G",y:-.9,z:18});
W.mario({g:"G",n:"M",size:1,y:0,z:.4,rx:-90,ry:0,t:mario,s:1});
W.camera({g:"G",z:2.5,y:.5,rx:0});
W.clearColor("8Af");
W.plane({g:"camera",size:150,b:"3d2",z:-100,y:-75,ns:1});
X = 0;
Z = 18;
RY = 0;
onmousedown = e => {
keys[e.target.id] = 1;
}
onmouseup = e => {
keys[e.target.id] = 0;
}
animate = ()=>{
requestAnimationFrame(animate);
if(keys.u || keys.d)
W.move({n:"G", z: Z += (-keys.u + keys.d) * Math.cos(RY*Math.PI/180) / 20, x: X += (-keys.u + keys.d) * Math.sin(RY*Math.PI/180) / 20});
if(keys.r || keys.l){
RY += (-keys.r + keys.l)/2;
W.move({n:"G", ry: RY});
}
}
animate();
}
</script>
<style>
body { font-family: calibri; font-size: 12px; margin: 0; }
pre { background: #eee; padding: 8px !important; display: block; width:475px; overflow-x: auto; margin: 0 0 20px 0 !important; border: 2px solid #000; border-right-width: 4px; }
td+td { padding: 0 0 0 10px; vertical-align: top; position: relative; line-height: 25px; }
br { line-height: 20px }
#c { width: 90px }
code * { letter-spacing: -.5px; }
p { margin: 6px 0 }
b { margin: 0px 0 6px; display: inline-block; }
canvas { border: 2px solid #000; border-right-width: 4px; }
* { user-select: none }
</style>
<style>
/* PrismJS 1.25.0
https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f8f8f8}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}
</style>
<script>
/* PrismJS 1.25.0
https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(u){var t=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,n=0,e={},M={manual:u.Prism&&u.Prism.manual,disableWorkerMessageHandler:u.Prism&&u.Prism.disableWorkerMessageHandler,util:{encode:function e(n){return n instanceof W?new W(n.type,e(n.content),n.alias):Array.isArray(n)?n.map(e):n.replace(/&/g,"&").replace(/</g,"<").replace(/\u00a0/g," ")},type:function(e){return Object.prototype.toString.call(e).slice(8,-1)},objId:function(e){return e.__id||Object.defineProperty(e,"__id",{value:++n}),e.__id},clone:function t(e,r){var a,n;switch(r=r||{},M.util.type(e)){case"Object":if(n=M.util.objId(e),r[n])return r[n];for(var i in a={},r[n]=a,e)e.hasOwnProperty(i)&&(a[i]=t(e[i],r));return a;case"Array":return n=M.util.objId(e),r[n]?r[n]:(a=[],r[n]=a,e.forEach(function(e,n){a[n]=t(e,r)}),a);default:return e}},getLanguage:function(e){for(;e;){var n=t.exec(e.className);if(n)return n[1].toLowerCase();e=e.parentElement}return"none"},setLanguage:function(e,n){e.className=e.className.replace(RegExp(t,"gi"),""),e.classList.add("language-"+n)},currentScript:function(){if("undefined"==typeof document)return null;if("currentScript"in document)return document.currentScript;try{throw new Error}catch(e){var n=(/at [^(\r\n]*\((.*):[^:]+:[^:]+\)$/i.exec(e.stack)||[])[1];if(n){var t=document.getElementsByTagName("script");for(var r in t)if(t[r].src==n)return t[r]}return null}},isActive:function(e,n,t){for(var r="no-"+n;e;){var a=e.classList;if(a.contains(n))return!0;if(a.contains(r))return!1;e=e.parentElement}return!!t}},languages:{plain:e,plaintext:e,text:e,txt:e,extend:function(e,n){var t=M.util.clone(M.languages[e]);for(var r in n)t[r]=n[r];return t},insertBefore:function(t,e,n,r){var a=(r=r||M.languages)[t],i={};for(var l in a)if(a.hasOwnProperty(l)){if(l==e)for(var o in n)n.hasOwnProperty(o)&&(i[o]=n[o]);n.hasOwnProperty(l)||(i[l]=a[l])}var s=r[t];return r[t]=i,M.languages.DFS(M.languages,function(e,n){n===s&&e!=t&&(this[e]=i)}),i},DFS:function e(n,t,r,a){a=a||{};var i=M.util.objId;for(var l in n)if(n.hasOwnProperty(l)){t.call(n,l,n[l],r||l);var o=n[l],s=M.util.type(o);"Object"!==s||a[i(o)]?"Array"!==s||a[i(o)]||(a[i(o)]=!0,e(o,t,l,a)):(a[i(o)]=!0,e(o,t,null,a))}}},plugins:{},highlightAll:function(e,n){M.highlightAllUnder(document,e,n)},highlightAllUnder:function(e,n,t){var r={callback:t,container:e,selector:'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'};M.hooks.run("before-highlightall",r),r.elements=Array.prototype.slice.apply(r.container.querySelectorAll(r.selector)),M.hooks.run("before-all-elements-highlight",r);for(var a,i=0;a=r.elements[i++];)M.highlightElement(a,!0===n,r.callback)},highlightElement:function(e,n,t){var r=M.util.getLanguage(e),a=M.languages[r];M.util.setLanguage(e,r);var i=e.parentElement;i&&"pre"===i.nodeName.toLowerCase()&&M.util.setLanguage(i,r);var l={element:e,language:r,grammar:a,code:e.textContent};function o(e){l.highlightedCode=e,M.hooks.run("before-insert",l),l.element.innerHTML=l.highlightedCode,M.hooks.run("after-highlight",l),M.hooks.run("complete",l),t&&t.call(l.element)}if(M.hooks.run("before-sanity-check",l),(i=l.element.parentElement)&&"pre"===i.nodeName.toLowerCase()&&!i.hasAttribute("tabindex")&&i.setAttribute("tabindex","0"),!l.code)return M.hooks.run("complete",l),void(t&&t.call(l.element));if(M.hooks.run("before-highlight",l),l.grammar)if(n&&u.Worker){var s=new Worker(M.filename);s.onmessage=function(e){o(e.data)},s.postMessage(JSON.stringify({language:l.language,code:l.code,immediateClose:!0}))}else o(M.highlight(l.code,l.grammar,l.language));else o(M.util.encode(l.code))},highlight:function(e,n,t){var r={code:e,grammar:n,language:t};return M.hooks.run("before-tokenize",r),r.tokens=M.tokenize(r.code,r.grammar),M.hooks.run("after-tokenize",r),W.stringify(M.util.encode(r.tokens),r.language)},tokenize:function(e,n){var t=n.rest;if(t){for(var r in t)n[r]=t[r];delete n.rest}var a=new i;return I(a,a.head,e),function e(n,t,r,a,i,l){for(var o in r)if(r.hasOwnProperty(o)&&r[o]){var s=r[o];s=Array.isArray(s)?s:[s];for(var u=0;u<s.length;++u){if(l&&l.cause==o+","+u)return;var c=s[u],g=c.inside,f=!!c.lookbehind,h=!!c.greedy,d=c.alias;if(h&&!c.pattern.global){var v=c.pattern.toString().match(/[imsuy]*$/)[0];c.pattern=RegExp(c.pattern.source,v+"g")}for(var p=c.pattern||c,m=a.next,y=i;m!==t.tail&&!(l&&y>=l.reach);y+=m.value.length,m=m.next){var k=m.value;if(t.length>n.length)return;if(!(k instanceof W)){var x,b=1;if(h){if(!(x=z(p,y,n,f))||x.index>=n.length)break;var w=x.index,A=x.index+x[0].length,P=y;for(P+=m.value.length;P<=w;)m=m.next,P+=m.value.length;if(P-=m.value.length,y=P,m.value instanceof W)continue;for(var E=m;E!==t.tail&&(P<A||"string"==typeof E.value);E=E.next)b++,P+=E.value.length;b--,k=n.slice(y,P),x.index-=y}else if(!(x=z(p,0,k,f)))continue;var w=x.index,L=x[0],S=k.slice(0,w),O=k.slice(w+L.length),j=y+k.length;l&&j>l.reach&&(l.reach=j);var C=m.prev;S&&(C=I(t,C,S),y+=S.length),q(t,C,b);var N=new W(o,g?M.tokenize(L,g):L,d,L);if(m=I(t,C,N),O&&I(t,m,O),1<b){var _={cause:o+","+u,reach:j};e(n,t,r,m.prev,y,_),l&&_.reach>l.reach&&(l.reach=_.reach)}}}}}}(e,a,n,a.head,0),function(e){var n=[],t=e.head.next;for(;t!==e.tail;)n.push(t.value),t=t.next;return n}(a)},hooks:{all:{},add:function(e,n){var t=M.hooks.all;t[e]=t[e]||[],t[e].push(n)},run:function(e,n){var t=M.hooks.all[e];if(t&&t.length)for(var r,a=0;r=t[a++];)r(n)}},Token:W};function W(e,n,t,r){this.type=e,this.content=n,this.alias=t,this.length=0|(r||"").length}function z(e,n,t,r){e.lastIndex=n;var a=e.exec(t);if(a&&r&&a[1]){var i=a[1].length;a.index+=i,a[0]=a[0].slice(i)}return a}function i(){var e={value:null,prev:null,next:null},n={value:null,prev:e,next:null};e.next=n,this.head=e,this.tail=n,this.length=0}function I(e,n,t){var r=n.next,a={value:t,prev:n,next:r};return n.next=a,r.prev=a,e.length++,a}function q(e,n,t){for(var r=n.next,a=0;a<t&&r!==e.tail;a++)r=r.next;(n.next=r).prev=n,e.length-=a}if(u.Prism=M,W.stringify=function n(e,t){if("string"==typeof e)return e;if(Array.isArray(e)){var r="";return e.forEach(function(e){r+=n(e,t)}),r}var a={type:e.type,content:n(e.content,t),tag:"span",classes:["token",e.type],attributes:{},language:t},i=e.alias;i&&(Array.isArray(i)?Array.prototype.push.apply(a.classes,i):a.classes.push(i)),M.hooks.run("wrap",a);var l="";for(var o in a.attributes)l+=" "+o+'="'+(a.attributes[o]||"").replace(/"/g,""")+'"';return"<"+a.tag+' class="'+a.classes.join(" ")+'"'+l+">"+a.content+"</"+a.tag+">"},!u.document)return u.addEventListener&&(M.disableWorkerMessageHandler||u.addEventListener("message",function(e){var n=JSON.parse(e.data),t=n.language,r=n.code,a=n.immediateClose;u.postMessage(M.highlight(r,M.languages[t],t)),a&&u.close()},!1)),M;var r=M.util.currentScript();function a(){M.manual||M.highlightAll()}if(r&&(M.filename=r.src,r.hasAttribute("data-manual")&&(M.manual=!0)),!M.manual){var l=document.readyState;"loading"===l||"interactive"===l&&r&&r.defer?document.addEventListener("DOMContentLoaded",a):window.requestAnimationFrame?window.requestAnimationFrame(a):window.setTimeout(a,16)}return M}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism);
Prism.languages.markup={comment:{pattern:/<!--(?:(?!<!--)[\s\S])*?-->/,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/<!DOCTYPE(?:[^>"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^<!|>$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&/,"&"))}),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(a,e){var s={};s["language-"+e]={pattern:/(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,lookbehind:!0,inside:Prism.languages[e]},s.cdata=/^<!\[CDATA\[|\]\]>$/i;var t={"included-cdata":{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,inside:s}};t["language-"+e]={pattern:/[\s\S]+/,inside:Prism.languages[e]};var n={};n[a]={pattern:RegExp("(<__[^>]*>)(?:<!\\[CDATA\\[(?:[^\\]]|\\](?!\\]>))*\\]\\]>|(?!<!\\[CDATA\\[)[^])*?(?=</__>)".replace(/__/g,function(){return a}),"i"),lookbehind:!0,greedy:!0,inside:t},Prism.languages.insertBefore("markup","cdata",n)}}),Object.defineProperty(Prism.languages.markup.tag,"addAttribute",{value:function(a,e){Prism.languages.markup.tag.inside["special-attr"].push({pattern:RegExp("(^|[\"'\\s])(?:"+a+")\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))","i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[e,"language-"+e],inside:Prism.languages[e]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml;
!function(s){var e=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;s.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+e.source+"|(?:[^\\\\\r\n()\"']|\\\\[^])*)\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+e.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+e.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:e,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},s.languages.css.atrule.inside.rest=s.languages.css;var t=s.languages.markup;t&&(t.tag.addInlined("style","css"),t.tag.addAttribute("style","css"))}(Prism);
Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/};
Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp("(^|[^\\w$])(?:NaN|Infinity|0[bB][01]+(?:_[01]+)*n?|0[oO][0-7]+(?:_[0-7]+)*n?|0[xX][\\dA-Fa-f]+(?:_[\\dA-Fa-f]+)*n?|\\d+(?:_\\d+)*n|(?:\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\.\\d+(?:_\\d+)*)(?:[Ee][+-]?\\d+(?:_\\d+)*)?)(?![\\w$])"),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),Prism.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute("on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)","javascript")),Prism.languages.js=Prism.languages.javascript;
</script>
================================================
FILE: demos/8.html
================================================
<!doctype html>
<img src='mario.png' id=mario hidden>
<img src='tree.png' id=tree hidden>
<script src='../src/w.js'></script>
<script src='mario.js'></script>
<script src="jscolor.js"></script>
<table width=850>
<tr>
<td width=320>
<canvas id=c8 width=320 height=300></canvas>
<td>
<pre class=language-js><code id=code>// x, y, z: relative coordinates inside the group
W.move({n:"ball",g:"M",x:.9,y:.2,z:.35});</code></pre>
<button id=b1>Pick the ball</button>
<br><br>
<pre class=language-js><code id=code>// x, y, z: World coordinates
W.move({n:"ball",g:null,x:0,y:-.3,z:0});</code></pre>
<button id=b2>Put down the ball</button>
</table>
<script>
onload = () => {
W.reset(c8);
W.ambient(.7);
W.clearColor("8Af");
W.plane({g:"camera",size:150,b:"3d2",z:-100,y:-75,ns:1});
W.group({n:"g"});
W.mario({n:"M",g:"g",size:1,x:.5,z:0,rx:-90,ry:0,t:mario,s:1});
W.sphere({n:"ball",size:.4,y:-.3,s:1});
W.camera({z:2.8,fov:22});
RY = 0;
animate = ()=>{
requestAnimationFrame(animate);
W.move({n:"g", ry: RY+= 1});
};
animate();
b1.onclick = () => {
W.move({n:"ball",g:"M",x:.4,y:.0,z:-.12});
}
b2.onclick = () => {
W.move({n:"ball",g:null,x:0,y:-.3,z:0});
}
}
</script>
<style>
body { font-family: calibri; font-size: 12px; margin: 0; }
pre { background: #eee; padding: 8px !important; display: block; width:475px; overflow-x: auto; margin: 0 0 20px 0 !important; border: 2px solid #000; border-right-width: 4px; }
td+td { padding: 0 0 0 10px; vertical-align: top; position: relative; line-height: 25px; }
br { line-height: 20px }
#c { width: 90px }
code * { letter-spacing: -.5px; }
p { margin: 6px 0 }
b { margin: 0px 0 6px; display: inline-block; }
canvas { border: 2px solid #000; border-right-width: 4px; }
* { user-select: none }
</style>
<style>
/* PrismJS 1.25.0
https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f8f8f8}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}
</style>
<script>
/* PrismJS 1.25.0
https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(u){var t=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,n=0,e={},M={manual:u.Prism&&u.Prism.manual,disableWorkerMessageHandler:u.Prism&&u.Prism.disableWorkerMessageHandler,util:{encode:function e(n){return n instanceof W?new W(n.type,e(n.content),n.alias):Array.isArray(n)?n.map(e):n.replace(/&/g,"&").replace(/</g,"<").replace(/\u00a0/g," ")},type:function(e){return Object.prototype.toString.call(e).slice(8,-1)},objId:function(e){return e.__id||Object.defineProperty(e,"__id",{value:++n}),e.__id},clone:function t(e,r){var a,n;switch(r=r||{},M.util.type(e)){case"Object":if(n=M.util.objId(e),r[n])return r[n];for(var i in a={},r[n]=a,e)e.hasOwnProperty(i)&&(a[i]=t(e[i],r));return a;case"Array":return n=M.util.objId(e),r[n]?r[n]:(a=[],r[n]=a,e.forEach(function(e,n){a[n]=t(e,r)}),a);default:return e}},getLanguage:function(e){for(;e;){var n=t.exec(e.className);if(n)return n[1].toLowerCase();e=e.parentElement}return"none"},setLanguage:function(e,n){e.className=e.className.replace(RegExp(t,"gi"),""),e.classList.add("language-"+n)},currentScript:function(){if("undefined"==typeof document)return null;if("currentScript"in document)return document.currentScript;try{throw new Error}catch(e){var n=(/at [^(\r\n]*\((.*):[^:]+:[^:]+\)$/i.exec(e.stack)||[])[1];if(n){var t=document.getElementsByTagName("script");for(var r in t)if(t[r].src==n)return t[r]}return null}},isActive:function(e,n,t){for(var r="no-"+n;e;){var a=e.classList;if(a.contains(n))return!0;if(a.contains(r))return!1;e=e.parentElement}return!!t}},languages:{plain:e,plaintext:e,text:e,txt:e,extend:function(e,n){var t=M.util.clone(M.languages[e]);for(var r in n)t[r]=n[r];return t},insertBefore:function(t,e,n,r){var a=(r=r||M.languages)[t],i={};for(var l in a)if(a.hasOwnProperty(l)){if(l==e)for(var o in n)n.hasOwnProperty(o)&&(i[o]=n[o]);n.hasOwnProperty(l)||(i[l]=a[l])}var s=r[t];return r[t]=i,M.languages.DFS(M.languages,function(e,n){n===s&&e!=t&&(this[e]=i)}),i},DFS:function e(n,t,r,a){a=a||{};var i=M.util.objId;for(var l in n)if(n.hasOwnProperty(l)){t.call(n,l,n[l],r||l);var o=n[l],s=M.util.type(o);"Object"!==s||a[i(o)]?"Array"!==s||a[i(o)]||(a[i(o)]=!0,e(o,t,l,a)):(a[i(o)]=!0,e(o,t,null,a))}}},plugins:{},highlightAll:function(e,n){M.highlightAllUnder(document,e,n)},highlightAllUnder:function(e,n,t){var r={callback:t,container:e,selector:'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'};M.hooks.run("before-highlightall",r),r.elements=Array.prototype.slice.apply(r.container.querySelectorAll(r.selector)),M.hooks.run("before-all-elements-highlight",r);for(var a,i=0;a=r.elements[i++];)M.highlightElement(a,!0===n,r.callback)},highlightElement:function(e,n,t){var r=M.util.getLanguage(e),a=M.languages[r];M.util.setLanguage(e,r);var i=e.parentElement;i&&"pre"===i.nodeName.toLowerCase()&&M.util.setLanguage(i,r);var l={element:e,language:r,grammar:a,code:e.textContent};function o(e){l.highlightedCode=e,M.hooks.run("before-insert",l),l.element.innerHTML=l.highlightedCode,M.hooks.run("after-highlight",l),M.hooks.run("complete",l),t&&t.call(l.element)}if(M.hooks.run("before-sanity-check",l),(i=l.element.parentElement)&&"pre"===i.nodeName.toLowerCase()&&!i.hasAttribute("tabindex")&&i.setAttribute("tabindex","0"),!l.code)return M.hooks.run("complete",l),void(t&&t.call(l.element));if(M.hooks.run("before-highlight",l),l.grammar)if(n&&u.Worker){var s=new Worker(M.filename);s.onmessage=function(e){o(e.data)},s.postMessage(JSON.stringify({language:l.language,code:l.code,immediateClose:!0}))}else o(M.highlight(l.code,l.grammar,l.language));else o(M.util.encode(l.code))},highlight:function(e,n,t){var r={code:e,grammar:n,language:t};return M.hooks.run("before-tokenize",r),r.tokens=M.tokenize(r.code,r.grammar),M.hooks.run("after-tokenize",r),W.stringify(M.util.encode(r.tokens),r.language)},tokenize:function(e,n){var t=n.rest;if(t){for(var r in t)n[r]=t[r];delete n.rest}var a=new i;return I(a,a.head,e),function e(n,t,r,a,i,l){for(var o in r)if(r.hasOwnProperty(o)&&r[o]){var s=r[o];s=Array.isArray(s)?s:[s];for(var u=0;u<s.length;++u){if(l&&l.cause==o+","+u)return;var c=s[u],g=c.inside,f=!!c.lookbehind,h=!!c.greedy,d=c.alias;if(h&&!c.pattern.global){var v=c.pattern.toString().match(/[imsuy]*$/)[0];c.pattern=RegExp(c.pattern.source,v+"g")}for(var p=c.pattern||c,m=a.next,y=i;m!==t.tail&&!(l&&y>=l.reach);y+=m.value.length,m=m.next){var k=m.value;if(t.length>n.length)return;if(!(k instanceof W)){var x,b=1;if(h){if(!(x=z(p,y,n,f))||x.index>=n.length)break;var w=x.index,A=x.index+x[0].length,P=y;for(P+=m.value.length;P<=w;)m=m.next,P+=m.value.length;if(P-=m.value.length,y=P,m.value instanceof W)continue;for(var E=m;E!==t.tail&&(P<A||"string"==typeof E.value);E=E.next)b++,P+=E.value.length;b--,k=n.slice(y,P),x.index-=y}else if(!(x=z(p,0,k,f)))continue;var w=x.index,L=x[0],S=k.slice(0,w),O=k.slice(w+L.length),j=y+k.length;l&&j>l.reach&&(l.reach=j);var C=m.prev;S&&(C=I(t,C,S),y+=S.length),q(t,C,b);var N=new W(o,g?M.tokenize(L,g):L,d,L);if(m=I(t,C,N),O&&I(t,m,O),1<b){var _={cause:o+","+u,reach:j};e(n,t,r,m.prev,y,_),l&&_.reach>l.reach&&(l.reach=_.reach)}}}}}}(e,a,n,a.head,0),function(e){var n=[],t=e.head.next;for(;t!==e.tail;)n.push(t.value),t=t.next;return n}(a)},hooks:{all:{},add:function(e,n){var t=M.hooks.all;t[e]=t[e]||[],t[e].push(n)},run:function(e,n){var t=M.hooks.all[e];if(t&&t.length)for(var r,a=0;r=t[a++];)r(n)}},Token:W};function W(e,n,t,r){this.type=e,this.content=n,this.alias=t,this.length=0|(r||"").length}function z(e,n,t,r){e.lastIndex=n;var a=e.exec(t);if(a&&r&&a[1]){var i=a[1].length;a.index+=i,a[0]=a[0].slice(i)}return a}function i(){var e={value:null,prev:null,next:null},n={value:null,prev:e,next:null};e.next=n,this.head=e,this.tail=n,this.length=0}function I(e,n,t){var r=n.next,a={value:t,prev:n,next:r};return n.next=a,r.prev=a,e.length++,a}function q(e,n,t){for(var r=n.next,a=0;a<t&&r!==e.tail;a++)r=r.next;(n.next=r).prev=n,e.length-=a}if(u.Prism=M,W.stringify=function n(e,t){if("string"==typeof e)return e;if(Array.isArray(e)){var r="";return e.forEach(function(e){r+=n(e,t)}),r}var a={type:e.type,content:n(e.content,t),tag:"span",classes:["token",e.type],attributes:{},language:t},i=e.alias;i&&(Array.isArray(i)?Array.prototype.push.apply(a.classes,i):a.classes.push(i)),M.hooks.run("wrap",a);var l="";for(var o in a.attributes)l+=" "+o+'="'+(a.attributes[o]||"").replace(/"/g,""")+'"';return"<"+a.tag+' class="'+a.classes.join(" ")+'"'+l+">"+a.content+"</"+a.tag+">"},!u.document)return u.addEventListener&&(M.disableWorkerMessageHandler||u.addEventListener("message",function(e){var n=JSON.parse(e.data),t=n.language,r=n.code,a=n.immediateClose;u.postMessage(M.highlight(r,M.languages[t],t)),a&&u.close()},!1)),M;var r=M.util.currentScript();function a(){M.manual||M.highlightAll()}if(r&&(M.filename=r.src,r.hasAttribute("data-manual")&&(M.manual=!0)),!M.manual){var l=document.readyState;"loading"===l||"interactive"===l&&r&&r.defer?document.addEventListener("DOMContentLoaded",a):window.requestAnimationFrame?window.requestAnimationFrame(a):window.setTimeout(a,16)}return M}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism);
Prism.languages.markup={comment:{pattern:/<!--(?:(?!<!--)[\s\S])*?-->/,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/<!DOCTYPE(?:[^>"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^<!|>$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&/,"&"))}),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(a,e){var s={};s["language-"+e]={pattern:/(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,lookbehind:!0,inside:Prism.languages[e]},s.cdata=/^<!\[CDATA\[|\]\]>$/i;var t={"included-cdata":{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,inside:s}};t["language-"+e]={pattern:/[\s\S]+/,inside:Prism.languages[e]};var n={};n[a]={pattern:RegExp("(<__[^>]*>)(?:<!\\[CDATA\\[(?:[^\\]]|\\](?!\\]>))*\\]\\]>|(?!<!\\[CDATA\\[)[^])*?(?=</__>)".replace(/__/g,function(){return a}),"i"),lookbehind:!0,greedy:!0,inside:t},Prism.languages.insertBefore("markup","cdata",n)}}),Object.defineProperty(Prism.languages.markup.tag,"addAttribute",{value:function(a,e){Prism.languages.markup.tag.inside["special-attr"].push({pattern:RegExp("(^|[\"'\\s])(?:"+a+")\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))","i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[e,"language-"+e],inside:Prism.languages[e]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml;
!function(s){var e=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;s.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+e.source+"|(?:[^\\\\\r\n()\"']|\\\\[^])*)\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+e.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+e.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:e,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},s.languages.css.atrule.inside.rest=s.languages.css;var t=s.languages.markup;t&&(t.tag.addInlined("style","css"),t.tag.addAttribute("style","css"))}(Prism);
Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/};
Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp("(^|[^\\w$])(?:NaN|Infinity|0[bB][01]+(?:_[01]+)*n?|0[oO][0-7]+(?:_[0-7]+)*n?|0[xX][\\dA-Fa-f]+(?:_[\\dA-Fa-f]+)*n?|\\d+(?:_\\d+)*n|(?:\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\.\\d+(?:_\\d+)*)(?:[Ee][+-]?\\d+(?:_\\d+)*)?)(?![\\w$])"),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),Prism.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute("on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)","javascript")),Prism.languages.js=Prism.languages.javascript;
</script>
================================================
FILE: demos/bricktexture.js
================================================
document.write('<img src="data:image/png;base64,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
gitextract_kmmeootv/ ├── .gitattributes ├── .gitignore ├── README.md ├── build.mjs ├── demos/ │ ├── 1.html │ ├── 2.html │ ├── 3.html │ ├── 4.html │ ├── 5.html │ ├── 6.html │ ├── 7.html │ ├── 8.html │ ├── bricktexture.js │ ├── castle.html │ ├── freerotation.html │ ├── jscolor.js │ ├── mario.js │ ├── mariotexture.js │ ├── treetexture.js │ └── yoshi.js ├── index.html ├── obj2js/ │ ├── 3d-model.obj │ ├── coin.obj │ ├── cube.obj │ ├── index.html │ ├── mario.mtl │ ├── mario.obj │ ├── parse.js │ ├── wolf.obj │ ├── yoshi.mtl │ └── yoshi.obj ├── package.json ├── src/ │ └── w.js ├── w.js ├── w.min.full.js └── w.min.lite.js
SYMBOL INDEX (17 symbols across 2 files)
FILE: build.mjs
function minifyFileShaders (line 22) | function minifyFileShaders(src) {
function buildW (line 51) | async function buildW(editionName, plugins = []) {
FILE: demos/jscolor.js
function getFuncName (line 619) | function getFuncName () {
function setOption (line 2369) | function setOption (option, value) {
function getOption (line 2413) | function getOption (option) {
function detachPicker (line 2445) | function detachPicker () {
function drawPicker (line 2452) | function drawPicker () {
function redrawPad (line 2887) | function redrawPad () {
function redrawSld (line 2928) | function redrawSld () {
function redrawASld (line 2941) | function redrawASld () {
function isPickerOwner (line 2947) | function isPickerOwner () {
function onValueKeyDown (line 2952) | function onValueKeyDown (ev) {
function onAlphaKeyDown (line 2962) | function onAlphaKeyDown (ev) {
function onValueChange (line 2972) | function onValueChange (ev) {
function onAlphaChange (line 2990) | function onAlphaChange (ev) {
function onValueInput (line 3011) | function onValueInput (ev) {
function onAlphaInput (line 3027) | function onAlphaInput (ev) {
Condensed preview — 36 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,447K chars).
[
{
"path": ".gitattributes",
"chars": 66,
"preview": "# Auto detect text files and perform LF normalization\n* text=auto\n"
},
{
"path": ".gitignore",
"chars": 19,
"preview": "*.zip\nnode_modules\n"
},
{
"path": "README.md",
"chars": 1019,
"preview": "# W\nA micro WebGL2 framework with a ton of features\n\nhttps://xem.github.io/W\n\nlicense: public domain\n\nInstall via NPM wi"
},
{
"path": "build.mjs",
"chars": 3567,
"preview": "import { execFile } from 'node:child_process';\nimport fs from \"node:fs/promises\";\nimport { minify } from \"terser\";\nimpor"
},
{
"path": "demos/1.html",
"chars": 22910,
"preview": "<!doctype html>\n<script src='../src/w.js'></script>\n<script src=\"jscolor.js\"></script>\n<table>\n<tr>\n<td>\n<canvas id=c wi"
},
{
"path": "demos/2.html",
"chars": 24304,
"preview": "<!doctype html>\n<img src='brick.png' id=brick hidden>\n<img src='tree.png' id=tree hidden>\n<script src='../src/w.js'></sc"
},
{
"path": "demos/3.html",
"chars": 21005,
"preview": "<!doctype html>\n<img src='mario.png' id=mario hidden>\n<script src='../src/w.js'></script>\n<script src='mario.js'></scrip"
},
{
"path": "demos/4.html",
"chars": 20482,
"preview": "<!doctype html>\n<img src='mario.png' id=mario hidden>\n<script src='../src/w.js'></script>\n<script src='mario.js'></scrip"
},
{
"path": "demos/5.html",
"chars": 22026,
"preview": "<!doctype html>\n<img src='mario.png' id=mario hidden>\n<img src='brick.png' id=brick hidden>\n<script src='../src/w.js'></"
},
{
"path": "demos/6.html",
"chars": 20724,
"preview": "<!doctype html>\n<img src='mario.png' id=mario hidden>\n<img src='brick.png' id=brick hidden>\n<script src='../src/w.js'></"
},
{
"path": "demos/7.html",
"chars": 21260,
"preview": "<!doctype html>\n<img src='mario.png' id=mario hidden>\n<img src='tree.png' id=tree hidden>\n<script src='../src/w.js'></sc"
},
{
"path": "demos/8.html",
"chars": 20338,
"preview": "<!doctype html>\n<img src='mario.png' id=mario hidden>\n<img src='tree.png' id=tree hidden>\n<script src='../src/w.js'></s"
},
{
"path": "demos/bricktexture.js",
"chars": 914733,
"preview": "document.write('<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAfQAAAH0CAYAAADL1t+KAAAAAXNSR0IArs4c6QAAAARnQU1B"
},
{
"path": "demos/castle.html",
"chars": 1795,
"preview": "<!doctype html>\n<canvas id=canvas width=850 height=500 style='border:1px solid'></canvas>\n<img src='tree.png' id=tree h"
},
{
"path": "demos/freerotation.html",
"chars": 1334,
"preview": "<!doctype html>\n<canvas id=canvas width=1200 height=500 style='border:1px solid'></canvas>\n<script src='../src/w.js'></s"
},
{
"path": "demos/jscolor.js",
"chars": 99581,
"preview": "/**\n * jscolor - JavaScript Color Picker\n *\n * @link http://jscolor.com\n * @license For open source use: GPLv3\n * "
},
{
"path": "demos/mario.js",
"chars": 35293,
"preview": "W.add(\"mario\", {\n vertices: [.01,.19,.15,.01,.17,.13,0,.17,.12,.02,.17,.12,-.02,.16,.12,.04,.16,.12,-.03,.18,.15,.05,.1"
},
{
"path": "demos/mariotexture.js",
"chars": 70057,
"preview": "document.write('<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAAGHRFWHRTb2Z0d2FyZQBQYWlu"
},
{
"path": "demos/treetexture.js",
"chars": 106912,
"preview": "document.write('<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUAAAAFACAYAAADNkKWqAAAABGdBTUEAALGPC/xhBQAAACBj"
},
{
"path": "demos/yoshi.js",
"chars": 48304,
"preview": "W.models.yoshi = {\r\n vertices: [...\r\n '\u00189X\u0019;X\u0016<R\u00189X\u0016<R\u0015:R*<R\\';X(9X*<R(9X+:R\u0015<K\u0015:R\u0016<R\u0015<K\u0016<R\u0016>L*<R+:R+<K*<R+<K*>L\u0018?E\u0015"
},
{
"path": "index.html",
"chars": 33597,
"preview": "<!doctype html>\n<link rel=\"preconnect\" href=\"https://fonts.googleapis.com\">\n<link rel=\"preconnect\" href=\"https://fonts."
},
{
"path": "obj2js/3d-model.obj",
"chars": 166238,
"preview": "# 3ds Max Wavefront OBJ Exporter v0.97b - (c)2007 guruware\n# File Created: 13.09.2015 12:13:11\n\nmtllib 3d-model.mtl\n\n#\n#"
},
{
"path": "obj2js/coin.obj",
"chars": 188427,
"preview": "# WaveFront *.obj file (generated by CINEMA 4D)\n\ng Block\nusemtl Block\nv 34.937191 40.051856 -34.854415\nv 34.92883 34.848"
},
{
"path": "obj2js/cube.obj",
"chars": 419,
"preview": "# Blender v2.60 (sub 0) OBJ File: ''\n# www.blender.org\nmtllib cube.mtl\no Cube\nv 1.000000 -1.000000 -1.000000\nv 1.000000 "
},
{
"path": "obj2js/index.html",
"chars": 8976,
"preview": "<!doctype html>\n<script src=\"parse.js\"></script>\n<h2>OBJ to WebGL buffer converter</h2>\n<b>OBJ file</b>: <button id=mari"
},
{
"path": "obj2js/mario.mtl",
"chars": 227,
"preview": "# Blender3D MTL File: mario_yoshi.blend\n# Material Count: 1\nnewmtl mario\nNs 0.000000\nKa 0.000000 0.000000 0.000000\nKd 0."
},
{
"path": "obj2js/mario.obj",
"chars": 64532,
"preview": "# Blender3D v249 OBJ File: mario_yoshi.blend\n# www.blender3d.org\nmtllib mario.mtl\nv 0.025303 0.494453 0.390066\nv -0.0120"
},
{
"path": "obj2js/parse.js",
"chars": 10956,
"preview": "// parseOBJ\n// ========\n//\n// This function is a minimal OBJ file loader and parser for WebGL.\n// A more complete OBJ/M"
},
{
"path": "obj2js/wolf.obj",
"chars": 201453,
"preview": "# Blender v2.78 (sub 0) OBJ File: 'Wolf_With_Baked_Action_Animations_For_Export_One_Mesh.blend'\n# www.blender.org\nmtllib"
},
{
"path": "obj2js/yoshi.mtl",
"chars": 234,
"preview": "# Blender3D MTL File: mario_yoshi.blend\n# Material Count: 1\nnewmtl yoshi_green\nNs 96.078431\nKa 0.000000 0.000000 0.00000"
},
{
"path": "obj2js/yoshi.obj",
"chars": 118230,
"preview": "# Blender3D v249 OBJ File: mario_yoshi.blend\n# www.blender3d.org\nmtllib yoshi.mtl\nv 0.172743 13.416319 -1.213921\nv 0.124"
},
{
"path": "package.json",
"chars": 456,
"preview": "{\n \"name\": \"w\",\n \"version\": \"1.0.2\",\n \"description\": \"A micro WebGL2 framework\",\n \"main\": \"./src/w.js\",\n \"scripts\":"
},
{
"path": "src/w.js",
"chars": 23730,
"preview": "// WebGL framework\n// ===============\n\nW = {\n \n // List of 3D models that can be rendered by the framework\n // (See t"
},
{
"path": "w.js",
"chars": 24026,
"preview": "// This file is here exclusively to preserve old links pointing to it.\n// For any future code changes, please edit \"./sr"
},
{
"path": "w.min.full.js",
"chars": 8772,
"preview": "// This file is here exclusively to preserve old links pointing to it.\n// For any future use, please use \"xem.github.io/"
},
{
"path": "w.min.lite.js",
"chars": 6196,
"preview": "// This file is here exclusively to preserve old links pointing to it.\n// For any future use, please use \"xem.github.io/"
}
]
About this extraction
This page contains the full source code of the xem/W GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 36 files (2.2 MB), approximately 579.5k tokens, and a symbol index with 17 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.