From f50f9f8045d630c3d1360b086e8f637e3aac615d Mon Sep 17 00:00:00 2001 From: Quinton Ashley Date: Fri, 24 May 2024 15:20:36 -0500 Subject: [PATCH] 1.9.21 --- .gitignore | 1 + .npmignore | 6 +- LICENSE.md | 157 +++++++++++++++++++++++++++++++++++ README.md | 6 +- assets/q5js_brand-light.webp | Bin 0 -> 6220 bytes assets/q5js_logo-light.webp | Bin 0 -> 5422 bytes dev/index.html | 25 ++++++ dev/p5.html | 26 ++++++ home/index.css | 106 +++++++++++++++++++++++ home/index.html | 108 ++++++++++++++++++++++++ home/index.md | 13 +++ index.html | 12 +++ package.json | 2 +- q5-server.js | 6 ++ q5.js | 16 ++-- q5.min.js | 2 +- q5js_brand.webp | Bin 6274 -> 6286 bytes q5js_logo.webp | Bin 5422 -> 5360 bytes 18 files changed, 476 insertions(+), 10 deletions(-) create mode 100644 .gitignore create mode 100644 LICENSE.md create mode 100644 assets/q5js_brand-light.webp create mode 100644 assets/q5js_logo-light.webp create mode 100644 dev/index.html create mode 100644 dev/p5.html create mode 100644 home/index.css create mode 100644 home/index.html create mode 100644 home/index.md create mode 100644 index.html diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5bd7036 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +dev/*.js diff --git a/.npmignore b/.npmignore index 2a655ec..96e9b9e 100644 --- a/.npmignore +++ b/.npmignore @@ -1,2 +1,6 @@ CNAME -web +assets +dev +home +lang +learn diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..6fb6a01 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,157 @@ +# GNU LESSER GENERAL PUBLIC LICENSE + +Version 3, 29 June 2007 + +Copyright (C) 2007 Free Software Foundation, Inc. + + +Everyone is permitted to copy and distribute verbatim copies of this +license document, but changing it is not allowed. + +This version of the GNU Lesser General Public License incorporates the +terms and conditions of version 3 of the GNU General Public License, +supplemented by the additional permissions listed below. + +## 0. Additional Definitions. + +As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the +GNU General Public License. + +"The Library" refers to a covered work governed by this License, other +than an Application or a Combined Work as defined below. + +An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + +A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + +The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + +The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + +## 1. Exception to Section 3 of the GNU GPL. + +You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + +## 2. Conveying Modified Versions. + +If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + +- a) under this License, provided that you make a good faith effort + to ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or +- b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + +## 3. Object Code Incorporating Material from Library Header Files. + +The object code form of an Application may incorporate material from a +header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + +- a) Give prominent notice with each copy of the object code that + the Library is used in it and that the Library and its use are + covered by this License. +- b) Accompany the object code with a copy of the GNU GPL and this + license document. + +## 4. Combined Works. + +You may convey a Combined Work under terms of your choice that, taken +together, effectively do not restrict modification of the portions of +the Library contained in the Combined Work and reverse engineering for +debugging such modifications, if you also do each of the following: + +- a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. +- b) Accompany the Combined Work with a copy of the GNU GPL and this + license document. +- c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. +- d) Do one of the following: + - 0) Convey the Minimal Corresponding Source under the terms of + this License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + - 1) Use a suitable shared library mechanism for linking with + the Library. A suitable mechanism is one that (a) uses at run + time a copy of the Library already present on the user's + computer system, and (b) will operate properly with a modified + version of the Library that is interface-compatible with the + Linked Version. +- e) Provide Installation Information, but only if you would + otherwise be required to provide such information under section 6 + of the GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the Application + with a modified version of the Linked Version. (If you use option + 4d0, the Installation Information must accompany the Minimal + Corresponding Source and Corresponding Application Code. If you + use option 4d1, you must provide the Installation Information in + the manner specified by section 6 of the GNU GPL for conveying + Corresponding Source.) + +## 5. Combined Libraries. + +You may place library facilities that are a work based on the Library +side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + +- a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities, conveyed under the terms of this License. +- b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + +## 6. Revised Versions of the GNU Lesser General Public License. + +The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +as you received it specifies that a certain numbered version of the +GNU Lesser General Public License "or any later version" applies to +it, you have the option of following the terms and conditions either +of that published version or of any later version published by the +Free Software Foundation. If the Library as you received it does not +specify a version number of the GNU Lesser General Public License, you +may choose any version of the GNU Lesser General Public License ever +published by the Free Software Foundation. + +If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/README.md b/README.md index 5d8e37f..332ab8f 100644 --- a/README.md +++ b/README.md @@ -105,7 +105,7 @@ https://en.wikipedia.org/wiki/HSL_and_HSV#Disadvantages ## New Features: Customize Canvas Context Attributes -In **p5**, you're stuck with the default [canvas context attributes][], which can't be changed. So the canvas must have an alpha layer, even if you don't need one. Also p5 doesn't support HDR color spaces or [desynchronized rendering][]. +In **p5**, you're stuck with the default [canvas context attributes][], which can't be changed. So the canvas must have an alpha layer, even if you don't need one. HDR color space and [desynchronized rendering][] are not supported. But **q5** has its own defaults: @@ -117,7 +117,9 @@ Q5.canvasOptions = { }; ``` -The `Q5.canvasOptions` object can be overridden, which will effect all q5 instances.You can also override any of these defaults by passing an options object as the fourth parameter to the `createCanvas()` function: +The "display-p3" color space will be used by default on supported devices, falling back to "srgb". + +The `Q5.canvasOptions` object can be overridden, which will effect all q5 instances. You can also override any of these defaults by passing an options object as the fourth parameter to the `createCanvas()` function: ```js createCanvas(400, 400, '2d', { diff --git a/assets/q5js_brand-light.webp b/assets/q5js_brand-light.webp new file mode 100644 index 0000000000000000000000000000000000000000..635ccf4e08faa702778cd8ca1baacc8a6156711f GIT binary patch literal 6220 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 literal 0 HcmV?d00001 diff --git a/assets/q5js_logo-light.webp b/assets/q5js_logo-light.webp new file mode 100644 index 0000000000000000000000000000000000000000..5bac5644623f6a8df04a3c888d406cf86ed14186 GIT binary patch literal 5422 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 + + + + + + q5.js testing + + + + + +

+ + + + + diff --git a/dev/p5.html b/dev/p5.html new file mode 100644 index 0000000..c4a53b2 --- /dev/null +++ b/dev/p5.html @@ -0,0 +1,26 @@ + + + + + + + p5.js testing + + + + + +
+ + + + + + diff --git a/home/index.css b/home/index.css new file mode 100644 index 0000000..770a8db --- /dev/null +++ b/home/index.css @@ -0,0 +1,106 @@ +html { + --blue: #b7ebff; + --black: #000; + + --brand-primary: #000; + --brand-secondary: #b7ebff; + + --primary: #fff; + --secondary: #000; +} + +body.dark { + --brand-primary: #b7ebff; + --brand-secondary: #000; + + --primary: #c8c3bc; + --secondary: #131516; +} + +body { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + margin: 0; + background-color: var(--brand-secondary); + font-family: sans-serif; + height: 100vh; +} + +main { + position: absolute; + top: 0; +} + +.reel0 { + z-index: 1; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + height: 100vh; +} + +a { + text-decoration: none; +} + +.brand a { + display: flex; + gap: 8px; +} + +.brand .img { + height: 128px; + border-radius: 16px; + background-size: contain; +} + +.q5js_logo { + width: 128px; + background-image: url('/q5js_logo.webp'); +} + +.dark .q5js_logo { + background-image: url('/assets/q5js_logo-light.webp'); +} + +.q5js_brand { + width: 256px; + background-image: url('/q5js_brand.webp'); +} + +.dark .q5js_brand { + background-image: url('/assets/q5js_brand-light.webp'); +} + +.reel0 textarea { + width: 100%; + background-color: var(--brand-primary); + color: var(--brand-secondary); + text-align: center; + margin-top: 8px; + padding: 0; + padding-top: 8px; + padding-bottom: 8px; + border-radius: 16px; + font-weight: bold; + font-size: 13px; + line-height: 1; + resize: none; + box-sizing: border-box; + border: none; + white-space: nowrap; +} + +@media screen and (max-width: 400px) { + + .brand .img:first-child { + display: none; + } + + .reel0 textarea { + font-size: 8px; + } +} diff --git a/home/index.html b/home/index.html new file mode 100644 index 0000000..9dec28c --- /dev/null +++ b/home/index.html @@ -0,0 +1,108 @@ + + + + + + + q5.js + + + + + +
+
+
+ + +
+
+ +
+
+ + + + + diff --git a/home/index.md b/home/index.md new file mode 100644 index 0000000..d85a422 --- /dev/null +++ b/home/index.md @@ -0,0 +1,13 @@ +## The sequel to p5.js is here! ๐ŸŽ‰ + +q5 implements all of [p5](https://p5js.org)'s 2D drawing, math, and user input functionality, making it a drop-in replacement! + +## More vibrant colors ๐ŸŽจ + +p5 has no HDR support ๐Ÿ˜• vs q5 supports HDR ๐Ÿคฉ + +## Better help with errors ๐Ÿค– + +JavaScript's error messages can be confusing for beginners. ๐Ÿคจ + +q5 enables users to ask AI for more helpful explanations with just one click! โœจ diff --git a/index.html b/index.html new file mode 100644 index 0000000..965b83d --- /dev/null +++ b/index.html @@ -0,0 +1,12 @@ + + + + + + + q5.js redirect + + + + + diff --git a/package.json b/package.json index d38d075..182edee 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "author": "quinton-ashley", "name": "q5", - "version": "1.9.20", + "version": "1.9.21", "description": "An implementation of the p5.js 2D API that's smaller and faster", "main": "q5-server.js", "scripts": { diff --git a/q5-server.js b/q5-server.js index d00d2cd..fa72b5c 100644 --- a/q5-server.js +++ b/q5-server.js @@ -1,3 +1,9 @@ +/** + * q5-server.js + * @author quinton-ashley + * @license LGPL-3.0 + */ + try { global.CairoCanvas ??= require('canvas'); global.JSDOM ??= require('jsdom').JSDOM; diff --git a/q5.js b/q5.js index e8c1b38..9718946 100644 --- a/q5.js +++ b/q5.js @@ -93,8 +93,8 @@ function Q5(scope, parent) { $.createCanvas = function (width, height, renderer, options) { if (renderer == 'webgl') throw `webgl renderer is not supported in q5, use '2d'`; if (typeof renderer == 'object') options = renderer; - $.width = $.canvas.width = width; - $.height = $.canvas.height = height; + $.width = $.canvas.width = width || window.innerWidth; + $.height = $.canvas.height = height || window.innerHeight; $.canvas.renderer = '2d'; let opt = Object.assign({}, Q5.canvasOptions); if (options) Object.assign(opt, options); @@ -736,6 +736,8 @@ function Q5(scope, parent) { } function _resizeCanvas(w, h) { + w ??= window.innerWidth; + h ??= window.innerHeight; $.width = w; $.height = h; let c = cloneCtx(); @@ -1154,9 +1156,12 @@ function Q5(scope, parent) { y = x.y; x = x.x; } + ctx.save(); ctx.beginPath(); - ctx.ellipse(x, y, 0.4, 0.4, 0, 0, $.TAU); - ctx.stroke(); + ctx.arc(x, y, ctx.lineWidth / 2, 0, Math.PI * 2); + ctx.fillStyle = ctx.strokeStyle; + ctx.fill(); + ctx.restore(); }; function rectImpl(x, y, w, h) { if ($._doFill) ctx.fillRect(x, y, w, h); @@ -1688,7 +1693,7 @@ function Q5(scope, parent) { }; var p_perlin; - $.noise = (x = 0, y = 0, z) => { + $.noise = (x = 0, y = 0, z = 0) => { if (p_perlin == null) { p_perlin = new Array(PERLIN_SIZE + 1); for (var i = 0; i < PERLIN_SIZE + 1; i++) { @@ -2377,6 +2382,7 @@ function Q5(scope, parent) { window.addEventListener('mousemove', (e) => $._onmousemove(e), false); window.addEventListener('keydown', (e) => $._onkeydown(e), false); window.addEventListener('keyup', (e) => $._onkeyup(e), false); + window.addEventListener('resize', () => ($._shouldResize = true)); } if (!($.setup || $.draw)) return; diff --git a/q5.min.js b/q5.min.js index b138446..00ee62a 100644 --- a/q5.min.js +++ b/q5.min.js @@ -4,4 +4,4 @@ * @author quinton-ashley and LingDong- * @license LGPL-3.0 */ -function Q5(e,t){let a=this;a._q5=!0;let o=0;if(e||(e="global"),"auto"==e){if(!window.setup&&!window.draw)return;e="global"}"global"==e&&(Q5._hasGlobal=a._isGlobal=!0);let n=window.OffscreenCanvas||function(){return document.createElement("canvas")},i=null,r=a.ctx=a.drawingContext=null;if(a.canvas=null,a.pixels=[],a.noCanvas=()=>{a.canvas?.remove&&a.canvas.remove(),a.canvas=0,r=a.ctx=a.drawingContext=0},Q5._nodejs?Q5._createNodeJSCanvas&&(a.canvas=Q5._createNodeJSCanvas(100,100)):"image"!=e&&"graphics"!=e||(a.canvas=new n(100,100)),a.canvas||("object"==typeof document?(a.canvas=document.createElement("canvas"),a.canvas.id="defaultCanvas"+Q5._instanceCount++,a.canvas.classList.add("p5Canvas","q5Canvas")):a.noCanvas()),a.canvas.width=a.width=100,a.canvas.height=a.height=100,a.canvas&&"graphics"!=e&&"image"!=e){function s(){t??=document.getElementsByTagName("main")[0],t||(t=document.createElement("main"),document.body.append(t)),a.canvas.parent(t)}a._setupDone=!1,a._resize=()=>{a.frameCount>1&&(a._shouldResize=!0)},t&&"string"==typeof t&&(t=document.getElementById(t)),a.canvas.parent=e=>{"string"==typeof e&&(e=document.getElementById(e)),e.append(a.canvas),"function"==typeof ResizeObserver?(a._ro&&a._ro.disconnect(),a._ro=new ResizeObserver(a._resize),a._ro.observe(t)):a.frameCount||window.addEventListener("resize",a._resize)},document.body?s():document.addEventListener("DOMContentLoaded",s)}function l(e,t){t??=e||a.canvas.height,e??=a.canvas.width,null==f&&(f=new n(e,t).getContext("2d",{colorSpace:a.canvas.colorSpace})),f.canvas.width==e&&f.canvas.height==t||(f.canvas.width=e,f.canvas.height=t)}function c(){let e=a.canvas.width*a.canvas.height*4;x&&e==x.length||(x=new Uint8ClampedArray(e))}function h(e,t){a._filters||(a._filters=[],a._filters[a.THRESHOLD]=(e,t)=>{void 0===t?t=127.5:t*=255;for(let a=0;a=t?255:0}},a._filters[a.GRAY]=e=>{for(let t=0;t{for(let t=0;t{for(let t=0;t{let a=t-1;for(let o=0;o>8)/a,e[o+1]=255*(e[o+1]*t>>8)/a,e[o+2]=255*(e[o+2]*t>>8)/a},a._filters[a.DILATE]=e=>{c(),x.set(e);let[t,o]=[a.canvas.width,a.canvas.height];for(let a=0;a{c(),x.set(e);let[t,o]=[a.canvas.width,a.canvas.height];for(let a=0;a{t=t||1,t=Math.floor(t*a._pixelDensity),c(),x.set(e);let o=2*t+1,n=function(e){let a=new Float32Array(e),o=.3*t+.8,n=o*o*2;for(let t=0;t{i=r.getImageData(0,0,a.canvas.width,a.canvas.height),a.pixels=i.data},a.updatePixels=()=>{null!=i&&r.putImageData(i,0,0)},a.filter=(e,t)=>{if(!r.filter)return h(e,t);if(l(),"string"==typeof e)d(e);else if(e==a.THRESHOLD){t??=.5,t=Math.max(t,1e-5),d(`saturate(0%) brightness(${Math.floor(.5/t*100)}%) contrast(1000000%)`)}else e==a.GRAY?d("saturate(0%)"):e==a.OPAQUE?(f.fillStyle="black",f.fillRect(0,0,f.canvas.width,f.canvas.height),f.drawImage(a.canvas,0,0),r.save(),r.resetTransform(),r.drawImage(f.canvas,0,0),r.restore()):e==a.INVERT?d("invert(100%)"):e==a.BLUR?d(`blur(${Math.ceil(t*a._pixelDensity/1)||1}px)`):h(e,t)},a.resize=(e,t)=>{l(),f.drawImage(a.canvas,0,0),a.width=e,a.height=t,a.canvas.width=e*a._pixelDensity,a.canvas.height=t*a._pixelDensity,r.save(),r.resetTransform(),r.clearRect(0,0,a.canvas.width,a.canvas.height),r.drawImage(f.canvas,0,0,a.canvas.width,a.canvas.height),r.restore()},a.trim=()=>{let e=a._pixelDensity||1,t=r.getImageData(0,0,a.width*e,a.height*e).data,o=a.width,n=0,i=a.height,s=0;for(let r=0;rn&&(n=l),rs&&(s=r))}return i=Math.floor(i/e),s=Math.floor(s/e),o=Math.floor(o/e),n=Math.floor(n/e),a.get(o,i,n-o+1,s-i+1)},a.get=(e,t,o,n)=>{let i=a._pixelDensity||1;if(void 0!==e&&void 0===o){let o=r.getImageData(e*i,t*i,1,1).data;return new a.Color(o[0],o[1],o[2],o[3]/255)}e=(e||0)*i,t=(t||0)*i;let s=o=o||a.width,l=n=n||a.height;o*=i,n*=i;let c=a.createImage(o,n),h=r.getImageData(e,t,o,n);return c.ctx.putImageData(h,0,0),c._pixelDensity=i,c.width=s,c.height=l,c},a.set=(e,t,o)=>{if(o._q5){let n=a._tint;return a._tint=null,a.image(o,e,t),void(a._tint=n)}a.pixels.length||a.loadPixels();let n=a._pixelDensity||1;for(let i=0;ia._tint=null,a.mask=e=>{r.save(),r.resetTransform();let t=r.globalCompositeOperation;r.globalCompositeOperation="destination-in",r.drawImage(e.canvas,0,0),r.globalCompositeOperation=t,r.restore()},a._save=async(e,t,a)=>{if(t=t||"untitled","jpg"==(a=a||"png")||"png"==a||"webp"==a)if(e instanceof OffscreenCanvas){const t=await e.convertToBlob({type:"image/"+a});e=await new Promise((e=>{const a=new FileReader;a.onloadend=()=>e(a.result),a.readAsDataURL(t)}))}else e=e.toDataURL("image/"+a);else{let t="text/plain";"json"==a&&("string"!=typeof e&&(e=JSON.stringify(e)),t="text/json"),e=new Blob([e],{type:t}),e=URL.createObjectURL(e)}let o=document.createElement("a");o.href=e,o.download=t+"."+a,document.body.append(o),o.click(),document.body.removeChild(o),URL.revokeObjectURL(o.href)},a.save=(e,t,o)=>{if((!e||"string"==typeof e&&(!t||!o&&t.length<5))&&(o=t,t=e,e=a.canvas),o)return a._save(e,t,o);t?(t=t.split("."),a._save(e,t[0],t.at(-1))):a._save(e)},a.canvas.save=a.save,a.saveCanvas=a.save,a.createImage=(e,t,a)=>new Q5.Image(e,t,a);let u=null,g=!0,_=[],p={},m=0,f=null,v=null,x=null;if(a.THRESHOLD=1,a.GRAY=2,a.OPAQUE=3,a.INVERT=4,a.POSTERIZE=5,a.DILATE=6,a.ERODE=7,a.BLUR=8,"image"==e)return;function y(e,t){a.width=e,a.height=t;let o=function(){let e={};for(let t in r)"function"!=typeof r[t]&&(e[t]=r[t]);return delete e.canvas,e}();a.canvas.width=Math.ceil(e*a._pixelDensity),a.canvas.height=Math.ceil(t*a._pixelDensity),!a.canvas.fullscreen&&a.canvas.style&&(a.canvas.style.width=e+"px",a.canvas.style.height=t+"px");for(let e in o)a.ctx[e]=o[e];r.scale(a._pixelDensity,a._pixelDensity)}a.BLEND="source-over",a.REMOVE="destination-out",a.ADD="lighter",a.DARKEST="darken",a.LIGHTEST="lighten",a.DIFFERENCE="difference",a.SUBTRACT="subtract",a.EXCLUSION="exclusion",a.MULTIPLY="multiply",a.SCREEN="screen",a.REPLACE="copy",a.OVERLAY="overlay",a.HARD_LIGHT="hard-light",a.SOFT_LIGHT="soft-light",a.DODGE="color-dodge",a.BURN="color-burn",a.RGB="rgb",a.RGBA="rgb",a.HSB="hsb",a.CHORD=0,a.PIE=1,a.OPEN=2,a.RADIUS="radius",a.CORNER="corner",a.CORNERS="corners",a.ROUND="round",a.SQUARE="butt",a.PROJECT="square",a.MITER="miter",a.BEVEL="bevel",a.CLOSE=1,a.NORMAL="normal",a.ITALIC="italic",a.BOLD="bold",a.BOLDITALIC="italic bold",a.CENTER="center",a.LEFT="left",a.RIGHT="right",a.TOP="top",a.BOTTOM="bottom",a.BASELINE="alphabetic",a.LANDSCAPE="landscape",a.PORTRAIT="portrait",a.ALT=18,a.BACKSPACE=8,a.CONTROL=17,a.DELETE=46,a.DOWN_ARROW=40,a.ENTER=13,a.ESCAPE=27,a.LEFT_ARROW=37,a.OPTION=18,a.RETURN=13,a.RIGHT_ARROW=39,a.SHIFT=16,a.TAB=9,a.UP_ARROW=38,a.DEGREES="degrees",a.RADIANS="radians",a.HALF_PI=Math.PI/2,a.PI=Math.PI,a.QUARTER_PI=Math.PI/4,a.TAU=2*Math.PI,a.TWO_PI=2*Math.PI,a.ARROW="default",a.CROSS="crosshair",a.HAND="pointer",a.MOVE="move",a.TEXT="text",a.VIDEO={video:!0,audio:!1},a.AUDIO={video:!1,audio:!0},a.SHR3=1,a.LCG=2,a.hint=(e,t)=>{a[e]=t},a.frameCount=0,a.deltaTime=16,a.mouseX=0,a.mouseY=0,a.touches=[],a.mouseButton=null,a.keyIsPressed=!1,a.mouseIsPressed=!1,a.key=null,a.keyCode=null,a.accelerationX=0,a.accelerationY=0,a.accelerationZ=0,a.rotationX=0,a.rotationY=0,a.rotationZ=0,a.relRotationX=0,a.relRotationY=0,a.relRotationZ=0,a.pmouseX=0,a.pmouseY=0,a.pAccelerationX=0,a.pAccelerationY=0,a.pAccelerationZ=0,a.pRotationX=0,a.pRotationY=0,a.pRotationZ=0,a.pRelRotationX=0,a.pRelRotationY=0,a.pRelRotationZ=0,Object.defineProperty(a,"deviceOrientation",{get:()=>window.screen?.orientation?.type}),Object.defineProperty(a,"windowWidth",{get:()=>window.innerWidth}),Object.defineProperty(a,"windowHeight",{get:()=>window.innerHeight}),a._colorMode="rgb",a._doStroke=!0,a._doFill=!0,a._strokeSet=!1,a._fillSet=!1,a._tint=null,a._ellipseMode=a.CENTER,a._rectMode=a.CORNER,a._curveDetail=20,a._curveAlpha=0,a._loop=!0,a._textFont="sans-serif",a._textSize=12,a._textLeading=15,a._textLeadDiff=3,a._textStyle="normal",a._pixelDensity=1,a._targetFrameRate=0,a._targetFrameDuration=16.666666666666668,a._frameRate=a._fps=60,a.resizeCanvas=(e,t)=>{e==a.width&&t==a.height||y(e,t)},a.createGraphics=function(e,t,o){let n=new Q5("graphics");return o??={},o.alpha??=!0,n._createCanvas.call(a,e,t,o),n},a.displayDensity=()=>window.devicePixelRatio,a.pixelDensity=e=>e&&e!=a._pixelDensity?(a._pixelDensity=e,y(a.width,a.height),e):a._pixelDensity,a.fullscreen=e=>{if(void 0===e)return document.fullscreenElement;e?document.body.requestFullscreen():document.body.exitFullscreen()},a.map=(e,t,a,o,n,i)=>{let r=o+1*(e-t)/(a-t)*(n-o);return i?oe*(1-a)+t*a,a.constrain=(e,t,a)=>Math.min(Math.max(e,t),a),a.dist=function(){let e=arguments;return 4==e.length?Math.hypot(e[0]-e[2],e[1]-e[3]):Math.hypot(e[0]-e[3],e[1]-e[4],e[2]-e[5])},a.norm=(e,t,o)=>a.map(e,t,o,0,1),a.sq=e=>e*e,a.fract=e=>e-Math.floor(e),a.angleMode=e=>a._angleMode=e,a._DEGTORAD=Math.PI/180,a._RADTODEG=180/Math.PI,a.degrees=e=>e*a._RADTODEG,a.radians=e=>e*a._DEGTORAD,a.abs=Math.abs,a.ceil=Math.ceil,a.exp=Math.exp,a.floor=Math.floor,a.log=Math.log,a.mag=Math.hypot,a.max=Math.max,a.min=Math.min,a.round=Math.round,a.pow=Math.pow,a.sqrt=Math.sqrt,a.sin=e=>("degrees"==a._angleMode&&(e=a.radians(e)),Math.sin(e)),a.cos=e=>("degrees"==a._angleMode&&(e=a.radians(e)),Math.cos(e)),a.tan=e=>("degrees"==a._angleMode&&(e=a.radians(e)),Math.tan(e)),a.asin=e=>{let t=Math.asin(e);return"degrees"==a._angleMode&&(t=a.degrees(t)),t},a.acos=e=>{let t=Math.acos(e);return"degrees"==a._angleMode&&(t=a.degrees(t)),t},a.atan=e=>{let t=Math.atan(e);return"degrees"==a._angleMode&&(t=a.degrees(t)),t},a.atan2=(e,t)=>{let o=Math.atan2(e,t);return"degrees"==a._angleMode&&(o=a.degrees(o)),o},a.nf=(e,t,a)=>{let o=e<0,n=(e=Math.abs(e)).toFixed(a).split(".");n[0]=n[0].padStart(t,"0");let i=n.join(".");return o&&(i="-"+i),i},a.createVector=(e,t,o)=>new Q5.Vector(e,t,o,a),a.curvePoint=(e,t,a,o,n)=>{const i=n*n*n,r=n*n;return e*(-.5*i+r-.5*n)+t*(1.5*i-2.5*r+1)+a*(-1.5*i+2*r+.5*n)+o*(.5*i-.5*r)},a.bezierPoint=(e,t,a,o,n)=>{const i=1-n;return Math.pow(i,3)*e+3*Math.pow(i,2)*n*t+3*i*Math.pow(n,2)*a+Math.pow(n,3)*o},a.curveTangent=(e,t,a,o,n)=>{const i=n*n;return e*(-3*i/2+2*n-.5)+t*(9*i/2-5*n)+a*(-9*i/2+4*n+.5)+o*(3*i/2-n)},a.bezierTangent=(e,t,a,o,n)=>{const i=1-n;return 3*o*Math.pow(n,2)-3*a*Math.pow(n,2)+6*a*i*n-6*t*i*n+3*t*Math.pow(i,2)-3*e*Math.pow(i,2)},Q5.supportsHDR?a.Color=Q5.ColorRGBA_P3:a.Color=Q5.ColorRGBA,a.colorMode=e=>{a._colorMode=e,"oklch"==e?a.Color=Q5.ColorOKLCH:"rgb"==e?"srgb"==a.canvas.colorSpace?a.Color=Q5.ColorRGBA:a.Color=Q5.ColorRGBA_P3:"srgb"==e&&(a.Color=Q5.ColorRGBA,a._colorMode="rgb")};let w={aqua:[0,255,255],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],crimson:[220,20,60],darkviolet:[148,0,211],gold:[255,215,0],green:[0,128,0],gray:[128,128,128],grey:[128,128,128],hotpink:[255,105,180],indigo:[75,0,130],khaki:[240,230,140],lightgreen:[144,238,144],lime:[0,255,0],magenta:[255,0,255],navy:[0,0,128],orange:[255,165,0],olive:[128,128,0],peachpuff:[255,218,185],pink:[255,192,203],purple:[128,0,128],red:[255,0,0],skyblue:[135,206,235],tan:[210,180,140],turquoise:[64,224,208],transparent:[0,0,0,0],white:[255,255,255],violet:[238,130,238],yellow:[255,255,0]};function M(e){let t=a._angleMode==a.DEGREES?180:Math.PI,o=2*t;if(0<=e&&e<=o)return e;for(;e<0;)e+=o;for(;e>=t;)e-=o;return e}function R(e,t,o,n,i,s,l,c){if(!a._doFill&&!a._doStroke)return;let h=M(i),d=M(s);if(h>d&&([h,d]=[d,h]),0==h){if(0==d)return;if(a._angleMode==a.DEGREES&&360==d||d==a.TAU)return a.ellipse(e,t,o,n)}r.beginPath();for(let i=0;ie.r,a.green=e=>e.g,a.blue=e=>e.b,a.alpha=e=>e.a,a.lightness=e=>100*(.2126*e.r+.7152*e.g+.0722*e.b)/255,a.lerpColor=(e,t,o)=>{if("rgb"==a._colorMode)return new a.Color(a.constrain(a.lerp(e.r,t.r,o),0,255),a.constrain(a.lerp(e.g,t.g,o),0,255),a.constrain(a.lerp(e.b,t.b,o),0,255),a.constrain(a.lerp(e.a,t.a,o),0,255));{let n=t.h-e.h;n>180&&(n-=360),n<-180&&(n+=360);let i=e.h+o*n;return i<0&&(i+=360),i>360&&(i-=360),new a.Color(a.constrain(a.lerp(e.l,t.l,o),0,100),a.constrain(a.lerp(e.c,t.c,o),0,100),i,a.constrain(a.lerp(e.a,t.a,o),0,255))}},a.strokeWeight=e=>{e||(a._doStroke=!1),r.lineWidth=e||1e-4},a.stroke=function(e){if(a._doStroke=!0,a._strokeSet=!0,e._q5Color||"string"==typeof e||(e=a.color(...arguments)),e.a<=0)return a._doStroke=!1;r.strokeStyle=e.toString()},a.noStroke=()=>a._doStroke=!1,a.fill=function(e){if(a._doFill=!0,a._fillSet=!0,e._q5Color||"string"==typeof e||(e=a.color(...arguments)),e.a<=0)return a._doFill=!1;r.fillStyle=e.toString()},a.noFill=()=>a._doFill=!1,a.smooth=()=>a._smooth=!0,a.noSmooth=()=>a._smooth=!1,a.blendMode=e=>r.globalCompositeOperation=e,a.strokeCap=e=>r.lineCap=e,a.strokeJoin=e=>r.lineJoin=e,a.ellipseMode=e=>a._ellipseMode=e,a.rectMode=e=>a._rectMode=e,a.curveDetail=e=>a._curveDetail=e,a.curveAlpha=e=>a._curveAlpha=e,a.curveTightness=e=>a._curveAlpha=e,a.clear=()=>{r.clearRect(0,0,a.canvas.width,a.canvas.height)},a.background=function(e){if(e._q5)return a.image(e,0,0,a.width,a.height);r.save(),r.resetTransform(),e._q5color||"string"==typeof e||(e=a.color(...arguments)),r.fillStyle=e.toString(),r.fillRect(0,0,a.canvas.width,a.canvas.height),r.restore()},a.line=(e,t,o,n)=>{a._doStroke&&(r.beginPath(),r.moveTo(e,t),r.lineTo(o,n),r.stroke())},a.arc=(e,t,o,n,i,r,s,l=25)=>{if(i==r)return a.ellipse(e,t,o,n);s??=a.PIE,a._ellipseMode==a.CENTER?R(e,t,o,n,i,r,s,l):a._ellipseMode==a.RADIUS?R(e,t,2*o,2*n,i,r,s,l):a._ellipseMode==a.CORNER?R(e+o/2,t+n/2,o,n,i,r,s,l):a._ellipseMode==a.CORNERS&&R((e+o)/2,(t+n)/2,o-e,n-t,i,r,s,l)},a.ellipse=(e,t,o,n)=>{n??=o,a._ellipseMode==a.CENTER?S(e,t,o,n):a._ellipseMode==a.RADIUS?S(e,t,2*o,2*n):a._ellipseMode==a.CORNER?S(e+o/2,t+n/2,o,n):a._ellipseMode==a.CORNERS&&S((e+o)/2,(t+n)/2,o-e,n-t)},a.circle=(e,t,o)=>a.ellipse(e,t,o,o),a.point=(e,t)=>{e.x&&(t=e.y,e=e.x),r.beginPath(),r.ellipse(e,t,.4,.4,0,0,a.TAU),r.stroke()},a.rect=(e,t,o,n,i,r,s,l)=>{a._rectMode==a.CENTER?C(e-o/2,t-n/2,o,n,i,r,s,l):a._rectMode==a.RADIUS?C(e-o,t-n,2*o,2*n,i,r,s,l):a._rectMode==a.CORNER?C(e,t,o,n,i,r,s,l):a._rectMode==a.CORNERS&&C(e,t,o-e,n-t,i,r,s,l)},a.square=(e,t,o,n,i,r,s)=>a.rect(e,t,o,o,n,i,r,s),a.beginShape=()=>{b(),r.beginPath(),g=!0},a.beginContour=()=>{r.closePath(),b(),g=!0},a.endContour=()=>{b(),g=!0},a.vertex=(e,t)=>{b(),g?r.moveTo(e,t):r.lineTo(e,t),g=!1},a.bezierVertex=(e,t,a,o,n,i)=>{b(),r.bezierCurveTo(e,t,a,o,n,i)},a.quadraticVertex=(e,t,a,o)=>{b(),r.quadraticCurveTo(e,t,a,o)},a.bezier=(e,t,o,n,i,r,s,l)=>{a.beginShape(),a.vertex(e,t),a.bezierVertex(o,n,i,r,s,l),a.endShape()},a.triangle=(e,t,o,n,i,r)=>{a.beginShape(),a.vertex(e,t),a.vertex(o,n),a.vertex(i,r),a.endShape(a.CLOSE)},a.quad=(e,t,o,n,i,r,s,l)=>{a.beginShape(),a.vertex(e,t),a.vertex(o,n),a.vertex(i,r),a.vertex(s,l),a.endShape(a.CLOSE)},a.endShape=e=>{b(),e&&r.closePath(),a._doFill&&r.fill(),a._doStroke&&r.stroke()},a.curveVertex=(e,t)=>{if(_.push([e,t]),_.length<4)return;let o=function(e,t,a,o,n,i,r,s,l,c){function h(e,t,a,o,n,i){let r=Math.pow(o-t,2)+Math.pow(n-a,2);return Math.pow(r,.5*i)+e}let d=[],u=h(0,e,t,a,o,c),g=h(u,a,o,n,i,c),_=h(g,n,i,r,s,c);for(let c=0;c0?(p[e]=1,p[e+1]=0):(p[e]=0,p[e+1]=1));let m=e*p[0]+a*p[1],f=t*p[0]+o*p[1],v=a*p[2]+n*p[3],x=o*p[2]+i*p[3],y=n*p[4]+r*p[5],w=i*p[4]+s*p[5],M=m*p[6]+v*p[7],R=f*p[6]+x*p[7],S=v*p[8]+y*p[9],C=x*p[8]+w*p[9],b=M*p[2]+S*p[3],D=R*p[2]+C*p[3];d.push([b,D])}return d}(..._[_.length-4],..._[_.length-3],..._[_.length-2],..._[_.length-1],a._curveDetail,a._curveAlpha);for(let e=0;e{a.beginShape(),a.curveVertex(e,t),a.curveVertex(o,n),a.curveVertex(i,r),a.curveVertex(s,l),a.endShape()},a.opacity=e=>r.globalAlpha=e,a.translate=(e,t)=>r.translate(e,t),a.rotate=e=>{"degrees"==a._angleMode&&(e=a.radians(e)),r.rotate(e)},a.scale=(e,t)=>{t??=e,r.scale(e,t)},a.applyMatrix=(e,t,a,o,n,i)=>r.transform(e,t,a,o,n,i),a.shearX=e=>r.transform(1,0,a.tan(e),1,0,0),a.shearY=e=>r.transform(1,a.tan(e),0,1,0,0),a.resetMatrix=()=>{r.resetTransform(),r.scale(a._pixelDensity,a._pixelDensity)},a._styleNames=["_doStroke","_doFill","_strokeSet","_fillSet","_tint","_imageMode","_rectMode","_ellipseMode","_textFont","_textLeading","_leadingSet","_textSize","_textAlign","_textBaseline","_textStyle","_textWrap"],a._styles=[],a.push=a.pushMatrix=()=>{r.save();let e={};for(let t of a._styleNames)e[t]=a[t];a._styles.push(e)},a.pop=a.popMatrix=()=>{r.restore();let e=a._styles.pop();for(let t of a._styleNames)a[t]=e[t]},a.imageMode=e=>a._imageMode=e,a.image=(e,t,o,i,s,l=0,c=0,h,d)=>{let u=e._q5?e.canvas:e;var g,_;Q5._createNodeJSCanvas&&(u=u.context.canvas),e._q5&&null!=a._tint&&(g=e.canvas.width,_=e.canvas.height,_??=g||a.canvas.height,g??=a.canvas.width,null==v&&(v=new n(g,_).getContext("2d",{colorSpace:a.canvas.colorSpace})),v.canvas.width==g&&v.canvas.height==_||(v.canvas.width=g,v.canvas.height=_),v.drawImage(e.canvas,0,0),e.tinted(a._tint)),i??=e.width||e.videoWidth,s??=e.height||e.videoHeight,"center"==a._imageMode&&(t-=.5*i,o-=.5*s);let p=e._pixelDensity||1;h?h*=p:h=u.width||u.videoWidth,d?d*=p:d=u.height||u.videoHeight,r.drawImage(u,l*p,c*p,h,d,t,o,i,s),function(){if(!e._q5||!a._tint)return;let t=e.ctx;t.save(),t.resetTransform(),t.clearRect(0,0,t.canvas.width,t.canvas.height),t.drawImage(v.canvas,0,0),t.restore()}()},a._incrementPreload=()=>o++,a._decrementPreload=()=>o--,a.loadImage=function(e,t,n){o++;let i=[...arguments].at(-1);n="object"!=typeof i||i;let r=a.createImage(1,1,n.alpha),s=r.ctx;if(Q5._nodejs&&global.CairoCanvas)CairoCanvas.loadImage(e).then((e=>{r.width=s.canvas.width=e.width,r.height=s.canvas.height=e.height,s.drawImage(e,0,0),o--,t&&t(r)})).catch((e=>{throw o--,e}));else{let a=new window.Image;a.src=e,a.crossOrigin="Anonymous",a._pixelDensity=1,a.onload=()=>{r.width=s.canvas.width=a.naturalWidth,r.height=s.canvas.height=a.naturalHeight,s.drawImage(a,0,0),o--,t&&t(r)},a.onerror=e=>{throw o--,e}}return r},a._clearTemporaryBuffers=()=>{f=null,v=null,x=null},a.loadFont=(e,t)=>{o++;let a=e.split("/"),n=a[a.length-1].split(".")[0].replace(" ",""),i=new FontFace(n,"url("+e+")");return document.fonts.add(i),i.load().then((()=>{o--,t&&t(n)})),n},a.textFont=e=>a._textFont=e,a.textSize=e=>{if(void 0===e)return a._textSize;a._textSize=e,a._leadingSet||(a._textLeading=1.25*e,a._textLeadDiff=a._textLeading-e)},a.textLeading=e=>{if(void 0===e)return a._textLeading;a._textLeading=e,a._textLeadDiff=e-a._textSize,a._leadingSet=!0},a.textStyle=e=>a._textStyle=e,a.textAlign=(e,t)=>{r.textAlign=e,t&&(r.textBaseline=t==a.CENTER?"middle":t)},a.textWidth=e=>(r.font=`${a._textStyle} ${a._textSize}px ${a._textFont}`,r.measureText(e).width),a.textAscent=e=>(r.font=`${a._textStyle} ${a._textSize}px ${a._textFont}`,r.measureText(e).actualBoundingBoxAscent),a.textDescent=e=>(r.font=`${a._textStyle} ${a._textSize}px ${a._textFont}`,r.measureText(e).actualBoundingBoxDescent),a._textCache=!0,a._TimedCache=class extends Map{constructor(){super(),this.maxSize=500}set(e,t){t.lastAccessed=Date.now(),super.set(e,t),this.size>this.maxSize&&this.gc()}get(e){const t=super.get(e);return t&&(t.lastAccessed=Date.now()),t}gc(){let e,t=1/0,a=0;for(const[o,n]of this.entries())n.lastAccessed(t&&(a._tic.maxSize=t),void 0!==e&&(a._textCache=e),a._textCache),a._genTextImageKey=(e,t,o)=>e.slice(0,200)+a._textStyle+a._textSize+a._textFont+(a._doFill?r.fillStyle:"")+"_"+(a._doStroke&&a._strokeSet?r.lineWidth+r.strokeStyle+"_":"")+(t||"")+(o?"x"+o:""),a.createTextImage=(e,t,o)=>{let n=a._textCache;a._textCache=!0,a._genTextImage=!0,a.text(e,0,0,t,o),a._genTextImage=!1;let i=a._genTextImageKey(e,t,o);return a._textCache=n,a._tic.get(i)},a.text=(e,t,o,n,i)=>{if(void 0===e)return;if(e=e.toString(),!a._doFill&&!a._doStroke)return;let s,l,c,h,d,u,g,_,p=1,m=r.getTransform(),f=a._genTextImage||a._textCache&&(0!=m.b||0!=m.c);if(f){if(h=a._genTextImageKey(e,n,i),l=a._tic.get(h),l&&!a._genTextImage)return void a.textImage(l,t,o);c=a.createGraphics.call(a,1,1),s=c.ctx,p=a._pixelDensity}else s=r,d=t,u=o;s.font=`${a._textStyle} ${a._textSize}px ${a._textFont}`;let v=e.split("\n");if(f){d=0,u=a._textLeading*v.length;let t=s.measureText(" ");g=t.fontBoundingBoxAscent,_=t.fontBoundingBoxDescent,i??=u+_,c.resizeCanvas(Math.ceil(s.measureText(e).width),Math.ceil(i)),s.fillStyle=r.fillStyle,s.strokeStyle=r.strokeStyle,s.lineWidth=r.lineWidth}let x=s.fillStyle;a._fillSet||(s.fillStyle="black");for(let e=0;ei));e++);a._fillSet||(s.fillStyle=x),f&&(l=c.get(),l._ascent=g,l._descent=_,a._tic.set(h,l),a._genTextImage||a.textImage(l,t,o))},a.textImage=(e,t,o)=>{let n=a._imageMode;a._imageMode="corner","center"==r.textAlign?t-=.5*e.width:"right"==r.textAlign&&(t-=e.width),"alphabetic"==r.textBaseline&&(o-=a._textLeading),"middle"==r.textBaseline?o-=e._descent+.5*e._ascent+a._textLeadDiff:"bottom"==r.textBaseline?o-=e._ascent+e._descent+a._textLeadDiff:"top"==r.textBaseline&&(o-=e._descent+a._textLeadDiff),a.image(e,t,o),a._imageMode=n};var D,I=4095,E=4,T=.5,A=e=>.5*(1-Math.cos(e*Math.PI));a.noise=(e=0,t=0,a)=>{if(null==D){D=new Array(4096);for(var o=0;o<4096;o++)D[o]=Math.random()}e<0&&(e=-e),t<0&&(t=-t),a<0&&(a=-a);for(var n,i,r,s,l,c=Math.floor(e),h=Math.floor(t),d=Math.floor(a),u=e-c,g=t-h,_=a-d,p=0,m=.5,f=0;f=1&&(c++,u--),(g*=2)>=1&&(h++,g--),(_*=2)>=1&&(d++,_--)}return p},a.noiseDetail=(e,t)=>{e>0&&(E=e),t>0&&(T=t)};const O=()=>{let e,t,a=4294967295;return{setSeed(o){e=t=(o??Math.random()*a)>>>0},getSeed:()=>t,rand:()=>(e^=e<<17,e^=e>>13,e^=e<<5,(e>>>0)/a)}};let P=O();P.setSeed(),a.noiseSeed=e=>{let t=void 0===e?4294967295*Math.random():e;D||(D=new Float32Array(4096));for(var a=0;a<4096;a++)t^=t<<17,t^=t>>13,t^=t<<5,D[a]=(t>>>0)/4294967295},a.randomSeed=e=>P.setSeed(e),a.random=(e,t)=>void 0===e?P.rand():"number"==typeof e?void 0!==t?P.rand()*(t-e)+e:P.rand()*e:e[Math.trunc(e.length*P.rand())],a.randomGenerator=e=>{e==a.LCG?P=(()=>{const e=4294967296;let t,a;return{setSeed(o){a=t=(o??Math.random()*e)>>>0},getSeed:()=>t,rand:()=>(a=(1664525*a+1013904223)%e,a/e)}})():e==a.SHR3&&(P=O()),P.setSeed()};var k=new function(){var e,t,a,o=new Array(128),n=new Array(256),i=new Array(128),r=new Array(128),s=new Array(256),l=new Array(256),c=()=>4294967296*P.rand()-2147483648,h=()=>.5+2.328306e-10*(c()|0),d=()=>{for(var t,n,s,l,d=3.44262;;){if(t=a*i[e],0==e){do{s=h(),l=h(),t=.2904764*-Math.log(s),n=-Math.log(l)}while(n+n0?d+t:-d-t}if(r[e]+h()*(r[e-1]-r[e]){for(var a;;){if(0==e)return 7.69711-Math.log(h());if(a=t*s[e],l[e]+h()*(l[e-1]-l[e])(a=c(),e=127&a,Math.abs(a)(t=c()>>>0){var e,t,a=2147483648,c=4294967296,h=3.442619855899,d=h,u=.00991256303526217,g=7.697117470131487,_=g,p=.003949659822581572;for(e=u/Math.exp(-.5*h*h),o[0]=Math.floor(h/e*a),o[1]=0,i[0]=e/a,i[127]=h/a,r[0]=1,r[127]=Math.exp(-.5*h*h),t=126;t>=1;t--)h=Math.sqrt(-2*Math.log(u/h+Math.exp(-.5*h*h))),o[t+1]=Math.floor(h/d*a),d=h,r[t]=Math.exp(-.5*h*h),i[t]=h/a;for(e=p/Math.exp(-g),n[0]=Math.floor(g/e*c),n[1]=0,s[0]=e/c,s[255]=g/c,l[0]=1,l[255]=Math.exp(-g),t=254;t>=1;t--)g=-Math.log(p/g+Math.exp(-g)),n[t+1]=Math.floor(g/_*c),_=g,l[t]=Math.exp(-g),s[t]=g/c}};function z(e){let t=e||performance.now();if(a._lastFrameTime??=t-a._targetFrameDuration,a._loop)u=L(z);else if(a.frameCount&&!a._redraw)return;if(u&&a.frameCount){if(t-a._lastFrameTime(k.hasInit||(k.zigset(),k.hasInit=!0),k.RNOR()*t+e),a.randomExponential=()=>(k.hasInit||(k.zigset(),k.hasInit=!0),k.REXP()),a.Element=function(e){this.elt=e},a._elements=[],a.createCapture=e=>{var t=document.createElement("video");return t.playsinline="playsinline",t.autoplay="autoplay",navigator.mediaDevices.getUserMedia(e).then((e=>{t.srcObject=e})),t.style.position="absolute",t.style.opacity=1e-5,t.style.zIndex=-1e3,document.body.append(t),t},a.print=console.log,a.describe=()=>{},a.noLoop=()=>{a._loop=!1,u=null},a.loop=()=>{a._loop=!0,null==u&&z()},a.redraw=(e=1)=>{a._redraw=!0;for(let t=0;t{a.noLoop(),a.canvas.remove()},a.frameRate=e=>(e&&(a._targetFrameRate=e,a._targetFrameDuration=1e3/e),a._frameRate),a.getTargetFrameRate=()=>a._targetFrameRate,a.getFPS=()=>a._fps,"object"==typeof localStorage&&(a.storeItem=localStorage.setItem,a.getItem=localStorage.getItem,a.removeItem=localStorage.removeItem,a.clearStorage=localStorage.clear),a._updateMouse=e=>{if(e.changedTouches)return;let t=a.canvas.getBoundingClientRect(),o=a.canvas.scrollWidth/a.width||1,n=a.canvas.scrollHeight/a.height||1;a.mouseX=(e.clientX-t.left)/o,a.mouseY=(e.clientY-t.top)/n},a._onmousedown=e=>{a._updateMouse(e),a.mouseIsPressed=!0,a.mouseButton=[a.LEFT,a.CENTER,a.RIGHT][e.button],a.mousePressed(e)},a._onmousemove=e=>{a._updateMouse(e),a.mouseIsPressed?a.mouseDragged(e):a.mouseMoved(e)},a._onmouseup=e=>{a._updateMouse(e),a.mouseIsPressed=!1,a.mouseReleased(e)},a._onclick=e=>{a._updateMouse(e),a.mouseIsPressed=!0,a.mouseClicked(e),a.mouseIsPressed=!1},a.cursor=(e,t,o)=>{let n="";e.includes(".")&&(e=`url("${e}")`,n=", auto"),void 0!==t&&(e+=" "+t+" "+o),a.canvas.style.cursor=e+n},a.noCursor=()=>{a.canvas.style.cursor="none"},a._onkeydown=e=>{e.repeat||(a.keyIsPressed=!0,a.key=e.key,a.keyCode=e.keyCode,p[a.keyCode]=!0,a.keyPressed(e),1==e.key.length&&a.keyTyped(e))},a._onkeyup=e=>{a.keyIsPressed=!1,a.key=e.key,a.keyCode=e.keyCode,p[a.keyCode]=!1,a.keyReleased(e)},a._ontouchstart=e=>{a.touches=[...e.touches].map(Q),a._isTouchAware||(a.mouseX=a.touches[0].x,a.mouseY=a.touches[0].y,a.mouseIsPressed=!0,a.mouseButton=a.LEFT,a.mousePressed(e)||e.preventDefault()),a.touchStarted(e)||e.preventDefault(),"running"!=a.getAudioContext()?.state&&a.userStartAudio()},a._ontouchmove=e=>{a.touches=[...e.touches].map(Q),a._isTouchAware||(a.mouseX=a.touches[0].x,a.mouseY=a.touches[0].y,a.mouseDragged(e)||e.preventDefault()),a.touchMoved(e)||e.preventDefault()},a._ontouchend=e=>{a.touches=[...e.touches].map(Q),a._isTouchAware||a.touches.length||(a.mouseIsPressed=!1,a.mouseReleased(e)||e.preventDefault()),a.touchEnded(e)||e.preventDefault()},"graphics"!=e&&(a.keyIsDown=e=>!!p[e],a.canvas.onmousedown=e=>a._onmousedown(e),a.canvas.onmouseup=e=>a._onmouseup(e),a.canvas.onclick=e=>a._onclick(e),a.canvas.ontouchstart=e=>a._ontouchstart(e),a.canvas.ontouchmove=e=>a._ontouchmove(e),a.canvas.ontouchcancel=a.canvas.ontouchend=e=>a._ontouchend(e)),a.hasSensorPermission=!window.DeviceOrientationEvent&&!window.DeviceMotionEvent||!(DeviceOrientationEvent.requestPermission||DeviceMotionEvent.requestPermission),a.requestSensorPermissions=()=>{DeviceOrientationEvent.requestPermission&&DeviceOrientationEvent.requestPermission().then((e=>{"granted"==e&&DeviceMotionEvent.requestPermission&&DeviceMotionEvent.requestPermission().then((e=>{"granted"==e&&(a.hasSensorPermission=!0)})).catch(alert)})).catch(alert)};window.ondeviceorientation=e=>{a.pRotationX=a.rotationX,a.pRotationY=a.rotationY,a.pRotationZ=a.rotationZ,a.pRelRotationX=a.relRotationX,a.pRelRotationY=a.relRotationY,a.pRelRotationZ=a.relRotationZ,a.rotationX=e.beta*(Math.PI/180),a.rotationY=e.gamma*(Math.PI/180),a.rotationZ=e.alpha*(Math.PI/180),a.relRotationX=[-a.rotationY,-a.rotationX,a.rotationY][Math.trunc(window.orientation/90)+1],a.relRotationY=[-a.rotationX,a.rotationY,a.rotationX][Math.trunc(window.orientation/90)+1],a.relRotationZ=a.rotationZ},window.ondevicemotion=e=>{if(a.pAccelerationX=a.accelerationX,a.pAccelerationY=a.accelerationY,a.pAccelerationZ=a.accelerationZ,!e.acceleration){let i=((e,t)=>[(e[0]*t[0]+e[1]*t[1]+e[2]*t[2]+e[3])/(e[12]*t[0]+e[13]*t[1]+e[14]*t[2]+e[15]),(e[4]*t[0]+e[5]*t[1]+e[6]*t[2]+e[7])/(e[12]*t[0]+e[13]*t[1]+e[14]*t[2]+e[15]),(e[8]*t[0]+e[9]*t[1]+e[10]*t[2]+e[11])/(e[12]*t[0]+e[13]*t[1]+e[14]*t[2]+e[15])])((n=a.rotationY,t=[a.cos(n),0,a.sin(n),0,0,1,0,0,-a.sin(n),0,a.cos(n),0,0,0,0,1],o=(e=>[1,0,0,0,0,a.cos(e),-a.sin(e),0,0,a.sin(e),a.cos(e),0,0,0,0,1])(a.rotationX),[t[0]*o[0]+t[1]*o[4]+t[2]*o[8]+t[3]*o[12],t[0]*o[1]+t[1]*o[5]+t[2]*o[9]+t[3]*o[13],t[0]*o[2]+t[1]*o[6]+t[2]*o[10]+t[3]*o[14],t[0]*o[3]+t[1]*o[7]+t[2]*o[11]+t[3]*o[15],t[4]*o[0]+t[5]*o[4]+t[6]*o[8]+t[7]*o[12],t[4]*o[1]+t[5]*o[5]+t[6]*o[9]+t[7]*o[13],t[4]*o[2]+t[5]*o[6]+t[6]*o[10]+t[7]*o[14],t[4]*o[3]+t[5]*o[7]+t[6]*o[11]+t[7]*o[15],t[8]*o[0]+t[9]*o[4]+t[10]*o[8]+t[11]*o[12],t[8]*o[1]+t[9]*o[5]+t[10]*o[9]+t[11]*o[13],t[8]*o[2]+t[9]*o[6]+t[10]*o[10]+t[11]*o[14],t[8]*o[3]+t[9]*o[7]+t[10]*o[11]+t[11]*o[15],t[12]*o[0]+t[13]*o[4]+t[14]*o[8]+t[15]*o[12],t[12]*o[1]+t[13]*o[5]+t[14]*o[9]+t[15]*o[13],t[12]*o[2]+t[13]*o[6]+t[14]*o[10]+t[15]*o[14],t[12]*o[3]+t[13]*o[7]+t[14]*o[11]+t[15]*o[15]]),[0,0,-9.80665]);a.accelerationX=e.accelerationIncludingGravity.x+i[0],a.accelerationY=e.accelerationIncludingGravity.y+i[1],a.accelerationZ=e.accelerationIncludingGravity.z-i[2]}var t,o,n},a.year=()=>(new Date).getFullYear(),a.day=()=>(new Date).getDay(),a.hour=()=>(new Date).getHours(),a.minute=()=>(new Date).getMinutes(),a.second=()=>(new Date).getSeconds(),a.millis=()=>performance.now()-m,a._loadFile=(e,t,a)=>{o++;let n={};return fetch(e).then((e=>"json"==a?e.json():"text"==a?e.text():void 0)).then((e=>{o--,Object.assign(n,e),t&&t(e)})),n},a.loadStrings=(e,t)=>a._loadFile(e,t,"text"),a.loadJSON=(e,t)=>a._loadFile(e,t,"json"),a.loadSound=(e,t)=>{o++;let a=new Audio(e);return a.addEventListener("canplaythrough",(()=>{o--,t&&t(a)})),a.load(),a.setVolume=e=>a.volume=e,a.setLoop=e=>a.loop=e,a},a.getAudioContext=()=>a.audioContext,a.userStartAudio=()=>(a.audioContext??=new window.AudioContext,a.audioContext.resume()),"global"==e&&(Object.assign(Q5,a),delete Q5.Q5),Q5.Image??=_Q5Image;for(let $ of Q5.prototype._methods.init)$.call(a);for(let[G,V]of Object.entries(Q5.prototype))"_"!=G[0]&&"function"==typeof a[G]&&(a[G]=V.bind(a));if("global"==e){let Y=Object.getOwnPropertyNames(a),j=Q5._nodejs?global:window;for(let H of Y)"function"==typeof a[H]?j[H]=a[H]:Object.defineProperty(j,H,{get:()=>a[H],set:e=>a[H]=e})}if("function"==typeof e&&e(a),"image"==e||"graphics"==e)return;let L=window.requestAnimationFrame||function(e){const t=a._lastFrameTime+a._targetFrameDuration;return setTimeout((()=>{e(t)}),t-performance.now())},F="global"==e?Q5._nodejs?global:window:a,N=F.preload,q=["setup","draw","preload","mouseMoved","mousePressed","mouseReleased","mouseDragged","mouseClicked","keyPressed","keyReleased","keyTyped","touchStarted","touchMoved","touchEnded","windowResized"];for(let U of q)F[U]?a._isGlobal&&(a[U]=F[U]):a[U]=()=>{};function B(){if(a._startDone=!0,o>0)return L(B);m=performance.now(),a.setup(),a.frameCount||(null===r&&a.createCanvas(100,100),a._setupDone=!0,r&&a.resetMatrix(),L(z))}a._isTouchAware=a.touchStarted||a.touchMoved||a.mouseReleased,window&&"graphics"!=e&&(window.addEventListener("mousemove",(e=>a._onmousemove(e)),!1),window.addEventListener("keydown",(e=>a._onkeydown(e)),!1),window.addEventListener("keyup",(e=>a._onkeyup(e)),!1)),(a.setup||a.draw)&&(a._startDone=!1,arguments.length&&"namespace"!=e||N?(a.preload(),B()):(F.preload=a.preload=()=>{a._startDone||B()},setTimeout(a.preload,32)))}Q5.Color=class{constructor(){this._q5Color=!0}},Q5.ColorOKLCH=class extends Q5.Color{constructor(e,t,a,o){super(),this.l=e,this.c=t,this.h=a,this.a=o??1}toString(){return`color(oklch ${this.l} ${this.c} ${this.h} / ${this.a})`}},Q5.ColorRGBA=class extends Q5.Color{constructor(e,t,a,o){super(),this.r=e,this.g=t,this.b=a,this.a=o??255}setRed(e){this.r=e}setGreen(e){this.g=e}setBlue(e){this.b=e}setAlpha(e){this.a=e}get levels(){return[this.r,this.g,this.b,this.a]}toString(){return`rgb(${this.r} ${this.g} ${this.b} / ${this.a/255})`}},Q5.ColorRGBA_P3=class extends Q5.ColorRGBA{constructor(e,t,a,o){super(e,t,a,o),this._edited=!0}get r(){return this._r}set r(e){this._r=e,this._edited=!0}get g(){return this._g}set g(e){this._g=e,this._edited=!0}get b(){return this._b}set b(e){this._b=e,this._edited=!0}get a(){return this._a}set a(e){this._a=e,this._edited=!0}toString(){if(this._edited){let e=(this._r/255).toFixed(3),t=(this._g/255).toFixed(3),a=(this._b/255).toFixed(3),o=(this._a/255).toFixed(3);this._css=`color(display-p3 ${e} ${t} ${a} / ${o})`,this._edited=!1}return this._css}},Q5.Vector=class{constructor(e,t,a,o){this.x=e||0,this.y=t||0,this.z=a||0,this._$=o||window,this._cn=null,this._cnsq=null}set(e,t,a){this.x=e||0,this.y=t||0,this.z=a||0}copy(){return new Q5.Vector(this.x,this.y,this.z)}_arg2v(e,t,a){return void 0!==e.x?e:void 0!==t?{x:e,y:t,z:a||0}:{x:e,y:e,z:e}}_calcNorm(){this._cnsq=this.x*this.x+this.y*this.y+this.z*this.z,this._cn=Math.sqrt(this._cnsq)}add(){let e=this._arg2v(...arguments);return this.x+=e.x,this.y+=e.y,this.z+=e.z,this}rem(){let e=this._arg2v(...arguments);return this.x%=e.x,this.y%=e.y,this.z%=e.z,this}sub(){let e=this._arg2v(...arguments);return this.x-=e.x,this.y-=e.y,this.z-=e.z,this}mult(){let e=this._arg2v(...arguments);return this.x*=e.x,this.y*=e.y,this.z*=e.z,this}div(){let e=this._arg2v(...arguments);return e.x?this.x/=e.x:this.x=0,e.y?this.y/=e.y:this.y=0,e.z?this.z/=e.z:this.z=0,this}mag(){return this._calcNorm(),this._cn}magSq(){return this._calcNorm(),this._cnsq}dot(){let e=this._arg2v(...arguments);return this.x*e.x+this.y*e.y+this.z*e.z}dist(){let e=this._arg2v(...arguments),t=this.x-e.x,a=this.y-e.y,o=this.z-e.z;return Math.sqrt(t*t+a*a+o*o)}cross(){let e=this._arg2v(...arguments),t=this.y*e.z-this.z*e.y,a=this.z*e.x-this.x*e.z,o=this.x*e.y-this.y*e.x;return this.x=t,this.y=a,this.z=o,this}normalize(){this._calcNorm();let e=this._cn;return 0!=e&&(this.x/=e,this.y/=e,this.z/=e),this._cn=1,this._cnsq=1,this}limit(e){this._calcNorm();let t=this._cn;if(t>e){let a=e/t;this.x*=a,this.y*=a,this.z*=a,this._cn=e,this._cnsq=e*e}return this}setMag(e){this._calcNorm();let t=e/this._cn;return this.x*=t,this.y*=t,this.z*=t,this._cn=e,this._cnsq=e*e,this}heading(){return this._$.atan2(this.y,this.x)}rotate(e){let t=this._$.cos(e),a=this._$.sin(e),o=this.x*t-this.y*a,n=this.x*a+this.y*t;return this.x=o,this.y=n,this}angleBetween(){let e=this._arg2v(...arguments),t=Q5.Vector.cross(this,e);return this._$.atan2(t.mag(),this.dot(e))*Math.sign(t.z||1)}lerp(){let e=[...arguments],t=this._arg2v(...e.slice(0,-1)),a=e[e.length-1];return this.x+=(t.x-this.x)*a,this.y+=(t.y-this.y)*a,this.z+=(t.z-this.z)*a,this}reflect(e){return e.normalize(),this.sub(e.mult(2*this.dot(e)))}array(){return[this.x,this.y,this.z]}equals(e,t){return t??=Number.EPSILON||0,Math.abs(e.x-this.x)e.copy().add(t),Q5.Vector.cross=(e,t)=>e.copy().cross(t),Q5.Vector.dist=(e,t)=>Math.hypot(e.x-t.x,e.y-t.y,e.z-t.z),Q5.Vector.div=(e,t)=>e.copy().div(t),Q5.Vector.dot=(e,t)=>e.copy().dot(t),Q5.Vector.equals=(e,t,a)=>e.equals(t,a),Q5.Vector.lerp=(e,t,a)=>e.copy().lerp(t,a),Q5.Vector.limit=(e,t)=>e.copy().limit(t),Q5.Vector.heading=e=>this._$.atan2(e.y,e.x),Q5.Vector.magSq=e=>e.x*e.x+e.y*e.y+e.z*e.z,Q5.Vector.mag=e=>Math.sqrt(Q5.Vector.magSq(e)),Q5.Vector.mult=(e,t)=>e.copy().mult(t),Q5.Vector.normalize=e=>e.copy().normalize(),Q5.Vector.rem=(e,t)=>e.copy().rem(t),Q5.Vector.sub=(e,t)=>e.copy().sub(t);for(let e of["fromAngle","fromAngles","random2D","random3D"])Q5.Vector[e]=(t,a,o)=>(new Q5.Vector)[e](t,a,o);class _Q5Image extends Q5{constructor(e,t,a){super("image"),delete this.createCanvas,a??={},a.alpha??=!0,this._createCanvas(e,t,"2d",a),this._loop=!1}get w(){return this.width}get h(){return this.height}}"object"!=typeof window&&(window=0),Q5._nodejs="object"==typeof process,Q5.canvasOptions={alpha:!1,desynchronized:!1,colorSpace:"display-p3"},window.matchMedia&&matchMedia("(dynamic-range: high) and (color-gamut: p3)").matches?Q5.supportsHDR=!0:Q5.canvasOptions.colorSpace="srgb",Q5._instanceCount=0,Q5._friendlyError=(e,t)=>{throw t+": "+e},Q5._validateParameters=()=>!0,Q5.prototype._methods={init:[],pre:[],post:[],remove:[]},Q5.prototype.registerMethod=(e,t)=>Q5.prototype._methods[e].push(t),Q5.prototype.registerPreloadMethod=(e,t)=>Q5.prototype[e]=t[e],"object"==typeof module?(global.p5??=Q5,module.exports=global.Q5=Q5):(window.p5??=Q5,window.Q5=Q5),"object"==typeof document&&document.addEventListener("DOMContentLoaded",(()=>{Q5._hasGlobal||new Q5("auto")})); +function Q5(e,t){let a=this;a._q5=!0;let o=0;if(e||(e="global"),"auto"==e){if(!window.setup&&!window.draw)return;e="global"}"global"==e&&(Q5._hasGlobal=a._isGlobal=!0);let n=window.OffscreenCanvas||function(){return document.createElement("canvas")},i=null,r=a.ctx=a.drawingContext=null;if(a.canvas=null,a.pixels=[],a.noCanvas=()=>{a.canvas?.remove&&a.canvas.remove(),a.canvas=0,r=a.ctx=a.drawingContext=0},Q5._nodejs?Q5._createNodeJSCanvas&&(a.canvas=Q5._createNodeJSCanvas(100,100)):"image"!=e&&"graphics"!=e||(a.canvas=new n(100,100)),a.canvas||("object"==typeof document?(a.canvas=document.createElement("canvas"),a.canvas.id="defaultCanvas"+Q5._instanceCount++,a.canvas.classList.add("p5Canvas","q5Canvas")):a.noCanvas()),a.canvas.width=a.width=100,a.canvas.height=a.height=100,a.canvas&&"graphics"!=e&&"image"!=e){function s(){t??=document.getElementsByTagName("main")[0],t||(t=document.createElement("main"),document.body.append(t)),a.canvas.parent(t)}a._setupDone=!1,a._resize=()=>{a.frameCount>1&&(a._shouldResize=!0)},t&&"string"==typeof t&&(t=document.getElementById(t)),a.canvas.parent=e=>{"string"==typeof e&&(e=document.getElementById(e)),e.append(a.canvas),"function"==typeof ResizeObserver?(a._ro&&a._ro.disconnect(),a._ro=new ResizeObserver(a._resize),a._ro.observe(t)):a.frameCount||window.addEventListener("resize",a._resize)},document.body?s():document.addEventListener("DOMContentLoaded",s)}function l(e,t){t??=e||a.canvas.height,e??=a.canvas.width,null==f&&(f=new n(e,t).getContext("2d",{colorSpace:a.canvas.colorSpace})),f.canvas.width==e&&f.canvas.height==t||(f.canvas.width=e,f.canvas.height=t)}function c(){let e=a.canvas.width*a.canvas.height*4;x&&e==x.length||(x=new Uint8ClampedArray(e))}function h(e,t){a._filters||(a._filters=[],a._filters[a.THRESHOLD]=(e,t)=>{void 0===t?t=127.5:t*=255;for(let a=0;a=t?255:0}},a._filters[a.GRAY]=e=>{for(let t=0;t{for(let t=0;t{for(let t=0;t{let a=t-1;for(let o=0;o>8)/a,e[o+1]=255*(e[o+1]*t>>8)/a,e[o+2]=255*(e[o+2]*t>>8)/a},a._filters[a.DILATE]=e=>{c(),x.set(e);let[t,o]=[a.canvas.width,a.canvas.height];for(let a=0;a{c(),x.set(e);let[t,o]=[a.canvas.width,a.canvas.height];for(let a=0;a{t=t||1,t=Math.floor(t*a._pixelDensity),c(),x.set(e);let o=2*t+1,n=function(e){let a=new Float32Array(e),o=.3*t+.8,n=o*o*2;for(let t=0;t{i=r.getImageData(0,0,a.canvas.width,a.canvas.height),a.pixels=i.data},a.updatePixels=()=>{null!=i&&r.putImageData(i,0,0)},a.filter=(e,t)=>{if(!r.filter)return h(e,t);if(l(),"string"==typeof e)d(e);else if(e==a.THRESHOLD){t??=.5,t=Math.max(t,1e-5),d(`saturate(0%) brightness(${Math.floor(.5/t*100)}%) contrast(1000000%)`)}else e==a.GRAY?d("saturate(0%)"):e==a.OPAQUE?(f.fillStyle="black",f.fillRect(0,0,f.canvas.width,f.canvas.height),f.drawImage(a.canvas,0,0),r.save(),r.resetTransform(),r.drawImage(f.canvas,0,0),r.restore()):e==a.INVERT?d("invert(100%)"):e==a.BLUR?d(`blur(${Math.ceil(t*a._pixelDensity/1)||1}px)`):h(e,t)},a.resize=(e,t)=>{l(),f.drawImage(a.canvas,0,0),a.width=e,a.height=t,a.canvas.width=e*a._pixelDensity,a.canvas.height=t*a._pixelDensity,r.save(),r.resetTransform(),r.clearRect(0,0,a.canvas.width,a.canvas.height),r.drawImage(f.canvas,0,0,a.canvas.width,a.canvas.height),r.restore()},a.trim=()=>{let e=a._pixelDensity||1,t=r.getImageData(0,0,a.width*e,a.height*e).data,o=a.width,n=0,i=a.height,s=0;for(let r=0;rn&&(n=l),rs&&(s=r))}return i=Math.floor(i/e),s=Math.floor(s/e),o=Math.floor(o/e),n=Math.floor(n/e),a.get(o,i,n-o+1,s-i+1)},a.get=(e,t,o,n)=>{let i=a._pixelDensity||1;if(void 0!==e&&void 0===o){let o=r.getImageData(e*i,t*i,1,1).data;return new a.Color(o[0],o[1],o[2],o[3]/255)}e=(e||0)*i,t=(t||0)*i;let s=o=o||a.width,l=n=n||a.height;o*=i,n*=i;let c=a.createImage(o,n),h=r.getImageData(e,t,o,n);return c.ctx.putImageData(h,0,0),c._pixelDensity=i,c.width=s,c.height=l,c},a.set=(e,t,o)=>{if(o._q5){let n=a._tint;return a._tint=null,a.image(o,e,t),void(a._tint=n)}a.pixels.length||a.loadPixels();let n=a._pixelDensity||1;for(let i=0;ia._tint=null,a.mask=e=>{r.save(),r.resetTransform();let t=r.globalCompositeOperation;r.globalCompositeOperation="destination-in",r.drawImage(e.canvas,0,0),r.globalCompositeOperation=t,r.restore()},a._save=async(e,t,a)=>{if(t=t||"untitled","jpg"==(a=a||"png")||"png"==a||"webp"==a)if(e instanceof OffscreenCanvas){const t=await e.convertToBlob({type:"image/"+a});e=await new Promise((e=>{const a=new FileReader;a.onloadend=()=>e(a.result),a.readAsDataURL(t)}))}else e=e.toDataURL("image/"+a);else{let t="text/plain";"json"==a&&("string"!=typeof e&&(e=JSON.stringify(e)),t="text/json"),e=new Blob([e],{type:t}),e=URL.createObjectURL(e)}let o=document.createElement("a");o.href=e,o.download=t+"."+a,document.body.append(o),o.click(),document.body.removeChild(o),URL.revokeObjectURL(o.href)},a.save=(e,t,o)=>{if((!e||"string"==typeof e&&(!t||!o&&t.length<5))&&(o=t,t=e,e=a.canvas),o)return a._save(e,t,o);t?(t=t.split("."),a._save(e,t[0],t.at(-1))):a._save(e)},a.canvas.save=a.save,a.saveCanvas=a.save,a.createImage=(e,t,a)=>new Q5.Image(e,t,a);let u=null,g=!0,_=[],p={},m=0,f=null,v=null,x=null;if(a.THRESHOLD=1,a.GRAY=2,a.OPAQUE=3,a.INVERT=4,a.POSTERIZE=5,a.DILATE=6,a.ERODE=7,a.BLUR=8,"image"==e)return;function y(e,t){e??=window.innerWidth,t??=window.innerHeight,a.width=e,a.height=t;let o=function(){let e={};for(let t in r)"function"!=typeof r[t]&&(e[t]=r[t]);return delete e.canvas,e}();a.canvas.width=Math.ceil(e*a._pixelDensity),a.canvas.height=Math.ceil(t*a._pixelDensity),!a.canvas.fullscreen&&a.canvas.style&&(a.canvas.style.width=e+"px",a.canvas.style.height=t+"px");for(let e in o)a.ctx[e]=o[e];r.scale(a._pixelDensity,a._pixelDensity)}a.BLEND="source-over",a.REMOVE="destination-out",a.ADD="lighter",a.DARKEST="darken",a.LIGHTEST="lighten",a.DIFFERENCE="difference",a.SUBTRACT="subtract",a.EXCLUSION="exclusion",a.MULTIPLY="multiply",a.SCREEN="screen",a.REPLACE="copy",a.OVERLAY="overlay",a.HARD_LIGHT="hard-light",a.SOFT_LIGHT="soft-light",a.DODGE="color-dodge",a.BURN="color-burn",a.RGB="rgb",a.RGBA="rgb",a.HSB="hsb",a.CHORD=0,a.PIE=1,a.OPEN=2,a.RADIUS="radius",a.CORNER="corner",a.CORNERS="corners",a.ROUND="round",a.SQUARE="butt",a.PROJECT="square",a.MITER="miter",a.BEVEL="bevel",a.CLOSE=1,a.NORMAL="normal",a.ITALIC="italic",a.BOLD="bold",a.BOLDITALIC="italic bold",a.CENTER="center",a.LEFT="left",a.RIGHT="right",a.TOP="top",a.BOTTOM="bottom",a.BASELINE="alphabetic",a.LANDSCAPE="landscape",a.PORTRAIT="portrait",a.ALT=18,a.BACKSPACE=8,a.CONTROL=17,a.DELETE=46,a.DOWN_ARROW=40,a.ENTER=13,a.ESCAPE=27,a.LEFT_ARROW=37,a.OPTION=18,a.RETURN=13,a.RIGHT_ARROW=39,a.SHIFT=16,a.TAB=9,a.UP_ARROW=38,a.DEGREES="degrees",a.RADIANS="radians",a.HALF_PI=Math.PI/2,a.PI=Math.PI,a.QUARTER_PI=Math.PI/4,a.TAU=2*Math.PI,a.TWO_PI=2*Math.PI,a.ARROW="default",a.CROSS="crosshair",a.HAND="pointer",a.MOVE="move",a.TEXT="text",a.VIDEO={video:!0,audio:!1},a.AUDIO={video:!1,audio:!0},a.SHR3=1,a.LCG=2,a.hint=(e,t)=>{a[e]=t},a.frameCount=0,a.deltaTime=16,a.mouseX=0,a.mouseY=0,a.touches=[],a.mouseButton=null,a.keyIsPressed=!1,a.mouseIsPressed=!1,a.key=null,a.keyCode=null,a.accelerationX=0,a.accelerationY=0,a.accelerationZ=0,a.rotationX=0,a.rotationY=0,a.rotationZ=0,a.relRotationX=0,a.relRotationY=0,a.relRotationZ=0,a.pmouseX=0,a.pmouseY=0,a.pAccelerationX=0,a.pAccelerationY=0,a.pAccelerationZ=0,a.pRotationX=0,a.pRotationY=0,a.pRotationZ=0,a.pRelRotationX=0,a.pRelRotationY=0,a.pRelRotationZ=0,Object.defineProperty(a,"deviceOrientation",{get:()=>window.screen?.orientation?.type}),Object.defineProperty(a,"windowWidth",{get:()=>window.innerWidth}),Object.defineProperty(a,"windowHeight",{get:()=>window.innerHeight}),a._colorMode="rgb",a._doStroke=!0,a._doFill=!0,a._strokeSet=!1,a._fillSet=!1,a._tint=null,a._ellipseMode=a.CENTER,a._rectMode=a.CORNER,a._curveDetail=20,a._curveAlpha=0,a._loop=!0,a._textFont="sans-serif",a._textSize=12,a._textLeading=15,a._textLeadDiff=3,a._textStyle="normal",a._pixelDensity=1,a._targetFrameRate=0,a._targetFrameDuration=16.666666666666668,a._frameRate=a._fps=60,a.resizeCanvas=(e,t)=>{e==a.width&&t==a.height||y(e,t)},a.createGraphics=function(e,t,o){let n=new Q5("graphics");return o??={},o.alpha??=!0,n._createCanvas.call(a,e,t,o),n},a.displayDensity=()=>window.devicePixelRatio,a.pixelDensity=e=>e&&e!=a._pixelDensity?(a._pixelDensity=e,y(a.width,a.height),e):a._pixelDensity,a.fullscreen=e=>{if(void 0===e)return document.fullscreenElement;e?document.body.requestFullscreen():document.body.exitFullscreen()},a.map=(e,t,a,o,n,i)=>{let r=o+1*(e-t)/(a-t)*(n-o);return i?oe*(1-a)+t*a,a.constrain=(e,t,a)=>Math.min(Math.max(e,t),a),a.dist=function(){let e=arguments;return 4==e.length?Math.hypot(e[0]-e[2],e[1]-e[3]):Math.hypot(e[0]-e[3],e[1]-e[4],e[2]-e[5])},a.norm=(e,t,o)=>a.map(e,t,o,0,1),a.sq=e=>e*e,a.fract=e=>e-Math.floor(e),a.angleMode=e=>a._angleMode=e,a._DEGTORAD=Math.PI/180,a._RADTODEG=180/Math.PI,a.degrees=e=>e*a._RADTODEG,a.radians=e=>e*a._DEGTORAD,a.abs=Math.abs,a.ceil=Math.ceil,a.exp=Math.exp,a.floor=Math.floor,a.log=Math.log,a.mag=Math.hypot,a.max=Math.max,a.min=Math.min,a.round=Math.round,a.pow=Math.pow,a.sqrt=Math.sqrt,a.sin=e=>("degrees"==a._angleMode&&(e=a.radians(e)),Math.sin(e)),a.cos=e=>("degrees"==a._angleMode&&(e=a.radians(e)),Math.cos(e)),a.tan=e=>("degrees"==a._angleMode&&(e=a.radians(e)),Math.tan(e)),a.asin=e=>{let t=Math.asin(e);return"degrees"==a._angleMode&&(t=a.degrees(t)),t},a.acos=e=>{let t=Math.acos(e);return"degrees"==a._angleMode&&(t=a.degrees(t)),t},a.atan=e=>{let t=Math.atan(e);return"degrees"==a._angleMode&&(t=a.degrees(t)),t},a.atan2=(e,t)=>{let o=Math.atan2(e,t);return"degrees"==a._angleMode&&(o=a.degrees(o)),o},a.nf=(e,t,a)=>{let o=e<0,n=(e=Math.abs(e)).toFixed(a).split(".");n[0]=n[0].padStart(t,"0");let i=n.join(".");return o&&(i="-"+i),i},a.createVector=(e,t,o)=>new Q5.Vector(e,t,o,a),a.curvePoint=(e,t,a,o,n)=>{const i=n*n*n,r=n*n;return e*(-.5*i+r-.5*n)+t*(1.5*i-2.5*r+1)+a*(-1.5*i+2*r+.5*n)+o*(.5*i-.5*r)},a.bezierPoint=(e,t,a,o,n)=>{const i=1-n;return Math.pow(i,3)*e+3*Math.pow(i,2)*n*t+3*i*Math.pow(n,2)*a+Math.pow(n,3)*o},a.curveTangent=(e,t,a,o,n)=>{const i=n*n;return e*(-3*i/2+2*n-.5)+t*(9*i/2-5*n)+a*(-9*i/2+4*n+.5)+o*(3*i/2-n)},a.bezierTangent=(e,t,a,o,n)=>{const i=1-n;return 3*o*Math.pow(n,2)-3*a*Math.pow(n,2)+6*a*i*n-6*t*i*n+3*t*Math.pow(i,2)-3*e*Math.pow(i,2)},Q5.supportsHDR?a.Color=Q5.ColorRGBA_P3:a.Color=Q5.ColorRGBA,a.colorMode=e=>{a._colorMode=e,"oklch"==e?a.Color=Q5.ColorOKLCH:"rgb"==e?"srgb"==a.canvas.colorSpace?a.Color=Q5.ColorRGBA:a.Color=Q5.ColorRGBA_P3:"srgb"==e&&(a.Color=Q5.ColorRGBA,a._colorMode="rgb")};let w={aqua:[0,255,255],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],crimson:[220,20,60],darkviolet:[148,0,211],gold:[255,215,0],green:[0,128,0],gray:[128,128,128],grey:[128,128,128],hotpink:[255,105,180],indigo:[75,0,130],khaki:[240,230,140],lightgreen:[144,238,144],lime:[0,255,0],magenta:[255,0,255],navy:[0,0,128],orange:[255,165,0],olive:[128,128,0],peachpuff:[255,218,185],pink:[255,192,203],purple:[128,0,128],red:[255,0,0],skyblue:[135,206,235],tan:[210,180,140],turquoise:[64,224,208],transparent:[0,0,0,0],white:[255,255,255],violet:[238,130,238],yellow:[255,255,0]};function M(e){let t=a._angleMode==a.DEGREES?180:Math.PI,o=2*t;if(0<=e&&e<=o)return e;for(;e<0;)e+=o;for(;e>=t;)e-=o;return e}function R(e,t,o,n,i,s,l,c){if(!a._doFill&&!a._doStroke)return;let h=M(i),d=M(s);if(h>d&&([h,d]=[d,h]),0==h){if(0==d)return;if(a._angleMode==a.DEGREES&&360==d||d==a.TAU)return a.ellipse(e,t,o,n)}r.beginPath();for(let i=0;ie.r,a.green=e=>e.g,a.blue=e=>e.b,a.alpha=e=>e.a,a.lightness=e=>100*(.2126*e.r+.7152*e.g+.0722*e.b)/255,a.lerpColor=(e,t,o)=>{if("rgb"==a._colorMode)return new a.Color(a.constrain(a.lerp(e.r,t.r,o),0,255),a.constrain(a.lerp(e.g,t.g,o),0,255),a.constrain(a.lerp(e.b,t.b,o),0,255),a.constrain(a.lerp(e.a,t.a,o),0,255));{let n=t.h-e.h;n>180&&(n-=360),n<-180&&(n+=360);let i=e.h+o*n;return i<0&&(i+=360),i>360&&(i-=360),new a.Color(a.constrain(a.lerp(e.l,t.l,o),0,100),a.constrain(a.lerp(e.c,t.c,o),0,100),i,a.constrain(a.lerp(e.a,t.a,o),0,255))}},a.strokeWeight=e=>{e||(a._doStroke=!1),r.lineWidth=e||1e-4},a.stroke=function(e){if(a._doStroke=!0,a._strokeSet=!0,e._q5Color||"string"==typeof e||(e=a.color(...arguments)),e.a<=0)return a._doStroke=!1;r.strokeStyle=e.toString()},a.noStroke=()=>a._doStroke=!1,a.fill=function(e){if(a._doFill=!0,a._fillSet=!0,e._q5Color||"string"==typeof e||(e=a.color(...arguments)),e.a<=0)return a._doFill=!1;r.fillStyle=e.toString()},a.noFill=()=>a._doFill=!1,a.smooth=()=>a._smooth=!0,a.noSmooth=()=>a._smooth=!1,a.blendMode=e=>r.globalCompositeOperation=e,a.strokeCap=e=>r.lineCap=e,a.strokeJoin=e=>r.lineJoin=e,a.ellipseMode=e=>a._ellipseMode=e,a.rectMode=e=>a._rectMode=e,a.curveDetail=e=>a._curveDetail=e,a.curveAlpha=e=>a._curveAlpha=e,a.curveTightness=e=>a._curveAlpha=e,a.clear=()=>{r.clearRect(0,0,a.canvas.width,a.canvas.height)},a.background=function(e){if(e._q5)return a.image(e,0,0,a.width,a.height);r.save(),r.resetTransform(),e._q5color||"string"==typeof e||(e=a.color(...arguments)),r.fillStyle=e.toString(),r.fillRect(0,0,a.canvas.width,a.canvas.height),r.restore()},a.line=(e,t,o,n)=>{a._doStroke&&(r.beginPath(),r.moveTo(e,t),r.lineTo(o,n),r.stroke())},a.arc=(e,t,o,n,i,r,s,l=25)=>{if(i==r)return a.ellipse(e,t,o,n);s??=a.PIE,a._ellipseMode==a.CENTER?R(e,t,o,n,i,r,s,l):a._ellipseMode==a.RADIUS?R(e,t,2*o,2*n,i,r,s,l):a._ellipseMode==a.CORNER?R(e+o/2,t+n/2,o,n,i,r,s,l):a._ellipseMode==a.CORNERS&&R((e+o)/2,(t+n)/2,o-e,n-t,i,r,s,l)},a.ellipse=(e,t,o,n)=>{n??=o,a._ellipseMode==a.CENTER?S(e,t,o,n):a._ellipseMode==a.RADIUS?S(e,t,2*o,2*n):a._ellipseMode==a.CORNER?S(e+o/2,t+n/2,o,n):a._ellipseMode==a.CORNERS&&S((e+o)/2,(t+n)/2,o-e,n-t)},a.circle=(e,t,o)=>a.ellipse(e,t,o,o),a.point=(e,t)=>{e.x&&(t=e.y,e=e.x),r.save(),r.beginPath(),r.arc(e,t,r.lineWidth/2,0,2*Math.PI),r.fillStyle=r.strokeStyle,r.fill(),r.restore()},a.rect=(e,t,o,n,i,r,s,l)=>{a._rectMode==a.CENTER?C(e-o/2,t-n/2,o,n,i,r,s,l):a._rectMode==a.RADIUS?C(e-o,t-n,2*o,2*n,i,r,s,l):a._rectMode==a.CORNER?C(e,t,o,n,i,r,s,l):a._rectMode==a.CORNERS&&C(e,t,o-e,n-t,i,r,s,l)},a.square=(e,t,o,n,i,r,s)=>a.rect(e,t,o,o,n,i,r,s),a.beginShape=()=>{b(),r.beginPath(),g=!0},a.beginContour=()=>{r.closePath(),b(),g=!0},a.endContour=()=>{b(),g=!0},a.vertex=(e,t)=>{b(),g?r.moveTo(e,t):r.lineTo(e,t),g=!1},a.bezierVertex=(e,t,a,o,n,i)=>{b(),r.bezierCurveTo(e,t,a,o,n,i)},a.quadraticVertex=(e,t,a,o)=>{b(),r.quadraticCurveTo(e,t,a,o)},a.bezier=(e,t,o,n,i,r,s,l)=>{a.beginShape(),a.vertex(e,t),a.bezierVertex(o,n,i,r,s,l),a.endShape()},a.triangle=(e,t,o,n,i,r)=>{a.beginShape(),a.vertex(e,t),a.vertex(o,n),a.vertex(i,r),a.endShape(a.CLOSE)},a.quad=(e,t,o,n,i,r,s,l)=>{a.beginShape(),a.vertex(e,t),a.vertex(o,n),a.vertex(i,r),a.vertex(s,l),a.endShape(a.CLOSE)},a.endShape=e=>{b(),e&&r.closePath(),a._doFill&&r.fill(),a._doStroke&&r.stroke()},a.curveVertex=(e,t)=>{if(_.push([e,t]),_.length<4)return;let o=function(e,t,a,o,n,i,r,s,l,c){function h(e,t,a,o,n,i){let r=Math.pow(o-t,2)+Math.pow(n-a,2);return Math.pow(r,.5*i)+e}let d=[],u=h(0,e,t,a,o,c),g=h(u,a,o,n,i,c),_=h(g,n,i,r,s,c);for(let c=0;c0?(p[e]=1,p[e+1]=0):(p[e]=0,p[e+1]=1));let m=e*p[0]+a*p[1],f=t*p[0]+o*p[1],v=a*p[2]+n*p[3],x=o*p[2]+i*p[3],y=n*p[4]+r*p[5],w=i*p[4]+s*p[5],M=m*p[6]+v*p[7],R=f*p[6]+x*p[7],S=v*p[8]+y*p[9],C=x*p[8]+w*p[9],b=M*p[2]+S*p[3],D=R*p[2]+C*p[3];d.push([b,D])}return d}(..._[_.length-4],..._[_.length-3],..._[_.length-2],..._[_.length-1],a._curveDetail,a._curveAlpha);for(let e=0;e{a.beginShape(),a.curveVertex(e,t),a.curveVertex(o,n),a.curveVertex(i,r),a.curveVertex(s,l),a.endShape()},a.opacity=e=>r.globalAlpha=e,a.translate=(e,t)=>r.translate(e,t),a.rotate=e=>{"degrees"==a._angleMode&&(e=a.radians(e)),r.rotate(e)},a.scale=(e,t)=>{t??=e,r.scale(e,t)},a.applyMatrix=(e,t,a,o,n,i)=>r.transform(e,t,a,o,n,i),a.shearX=e=>r.transform(1,0,a.tan(e),1,0,0),a.shearY=e=>r.transform(1,a.tan(e),0,1,0,0),a.resetMatrix=()=>{r.resetTransform(),r.scale(a._pixelDensity,a._pixelDensity)},a._styleNames=["_doStroke","_doFill","_strokeSet","_fillSet","_tint","_imageMode","_rectMode","_ellipseMode","_textFont","_textLeading","_leadingSet","_textSize","_textAlign","_textBaseline","_textStyle","_textWrap"],a._styles=[],a.push=a.pushMatrix=()=>{r.save();let e={};for(let t of a._styleNames)e[t]=a[t];a._styles.push(e)},a.pop=a.popMatrix=()=>{r.restore();let e=a._styles.pop();for(let t of a._styleNames)a[t]=e[t]},a.imageMode=e=>a._imageMode=e,a.image=(e,t,o,i,s,l=0,c=0,h,d)=>{let u=e._q5?e.canvas:e;var g,_;Q5._createNodeJSCanvas&&(u=u.context.canvas),e._q5&&null!=a._tint&&(g=e.canvas.width,_=e.canvas.height,_??=g||a.canvas.height,g??=a.canvas.width,null==v&&(v=new n(g,_).getContext("2d",{colorSpace:a.canvas.colorSpace})),v.canvas.width==g&&v.canvas.height==_||(v.canvas.width=g,v.canvas.height=_),v.drawImage(e.canvas,0,0),e.tinted(a._tint)),i??=e.width||e.videoWidth,s??=e.height||e.videoHeight,"center"==a._imageMode&&(t-=.5*i,o-=.5*s);let p=e._pixelDensity||1;h?h*=p:h=u.width||u.videoWidth,d?d*=p:d=u.height||u.videoHeight,r.drawImage(u,l*p,c*p,h,d,t,o,i,s),function(){if(!e._q5||!a._tint)return;let t=e.ctx;t.save(),t.resetTransform(),t.clearRect(0,0,t.canvas.width,t.canvas.height),t.drawImage(v.canvas,0,0),t.restore()}()},a._incrementPreload=()=>o++,a._decrementPreload=()=>o--,a.loadImage=function(e,t,n){o++;let i=[...arguments].at(-1);n="object"!=typeof i||i;let r=a.createImage(1,1,n.alpha),s=r.ctx;if(Q5._nodejs&&global.CairoCanvas)CairoCanvas.loadImage(e).then((e=>{r.width=s.canvas.width=e.width,r.height=s.canvas.height=e.height,s.drawImage(e,0,0),o--,t&&t(r)})).catch((e=>{throw o--,e}));else{let a=new window.Image;a.src=e,a.crossOrigin="Anonymous",a._pixelDensity=1,a.onload=()=>{r.width=s.canvas.width=a.naturalWidth,r.height=s.canvas.height=a.naturalHeight,s.drawImage(a,0,0),o--,t&&t(r)},a.onerror=e=>{throw o--,e}}return r},a._clearTemporaryBuffers=()=>{f=null,v=null,x=null},a.loadFont=(e,t)=>{o++;let a=e.split("/"),n=a[a.length-1].split(".")[0].replace(" ",""),i=new FontFace(n,"url("+e+")");return document.fonts.add(i),i.load().then((()=>{o--,t&&t(n)})),n},a.textFont=e=>a._textFont=e,a.textSize=e=>{if(void 0===e)return a._textSize;a._textSize=e,a._leadingSet||(a._textLeading=1.25*e,a._textLeadDiff=a._textLeading-e)},a.textLeading=e=>{if(void 0===e)return a._textLeading;a._textLeading=e,a._textLeadDiff=e-a._textSize,a._leadingSet=!0},a.textStyle=e=>a._textStyle=e,a.textAlign=(e,t)=>{r.textAlign=e,t&&(r.textBaseline=t==a.CENTER?"middle":t)},a.textWidth=e=>(r.font=`${a._textStyle} ${a._textSize}px ${a._textFont}`,r.measureText(e).width),a.textAscent=e=>(r.font=`${a._textStyle} ${a._textSize}px ${a._textFont}`,r.measureText(e).actualBoundingBoxAscent),a.textDescent=e=>(r.font=`${a._textStyle} ${a._textSize}px ${a._textFont}`,r.measureText(e).actualBoundingBoxDescent),a._textCache=!0,a._TimedCache=class extends Map{constructor(){super(),this.maxSize=500}set(e,t){t.lastAccessed=Date.now(),super.set(e,t),this.size>this.maxSize&&this.gc()}get(e){const t=super.get(e);return t&&(t.lastAccessed=Date.now()),t}gc(){let e,t=1/0,a=0;for(const[o,n]of this.entries())n.lastAccessed(t&&(a._tic.maxSize=t),void 0!==e&&(a._textCache=e),a._textCache),a._genTextImageKey=(e,t,o)=>e.slice(0,200)+a._textStyle+a._textSize+a._textFont+(a._doFill?r.fillStyle:"")+"_"+(a._doStroke&&a._strokeSet?r.lineWidth+r.strokeStyle+"_":"")+(t||"")+(o?"x"+o:""),a.createTextImage=(e,t,o)=>{let n=a._textCache;a._textCache=!0,a._genTextImage=!0,a.text(e,0,0,t,o),a._genTextImage=!1;let i=a._genTextImageKey(e,t,o);return a._textCache=n,a._tic.get(i)},a.text=(e,t,o,n,i)=>{if(void 0===e)return;if(e=e.toString(),!a._doFill&&!a._doStroke)return;let s,l,c,h,d,u,g,_,p=1,m=r.getTransform(),f=a._genTextImage||a._textCache&&(0!=m.b||0!=m.c);if(f){if(h=a._genTextImageKey(e,n,i),l=a._tic.get(h),l&&!a._genTextImage)return void a.textImage(l,t,o);c=a.createGraphics.call(a,1,1),s=c.ctx,p=a._pixelDensity}else s=r,d=t,u=o;s.font=`${a._textStyle} ${a._textSize}px ${a._textFont}`;let v=e.split("\n");if(f){d=0,u=a._textLeading*v.length;let t=s.measureText(" ");g=t.fontBoundingBoxAscent,_=t.fontBoundingBoxDescent,i??=u+_,c.resizeCanvas(Math.ceil(s.measureText(e).width),Math.ceil(i)),s.fillStyle=r.fillStyle,s.strokeStyle=r.strokeStyle,s.lineWidth=r.lineWidth}let x=s.fillStyle;a._fillSet||(s.fillStyle="black");for(let e=0;ei));e++);a._fillSet||(s.fillStyle=x),f&&(l=c.get(),l._ascent=g,l._descent=_,a._tic.set(h,l),a._genTextImage||a.textImage(l,t,o))},a.textImage=(e,t,o)=>{let n=a._imageMode;a._imageMode="corner","center"==r.textAlign?t-=.5*e.width:"right"==r.textAlign&&(t-=e.width),"alphabetic"==r.textBaseline&&(o-=a._textLeading),"middle"==r.textBaseline?o-=e._descent+.5*e._ascent+a._textLeadDiff:"bottom"==r.textBaseline?o-=e._ascent+e._descent+a._textLeadDiff:"top"==r.textBaseline&&(o-=e._descent+a._textLeadDiff),a.image(e,t,o),a._imageMode=n};var D,I=4095,E=4,T=.5,A=e=>.5*(1-Math.cos(e*Math.PI));a.noise=(e=0,t=0,a=0)=>{if(null==D){D=new Array(4096);for(var o=0;o<4096;o++)D[o]=Math.random()}e<0&&(e=-e),t<0&&(t=-t),a<0&&(a=-a);for(var n,i,r,s,l,c=Math.floor(e),h=Math.floor(t),d=Math.floor(a),u=e-c,g=t-h,_=a-d,p=0,m=.5,f=0;f=1&&(c++,u--),(g*=2)>=1&&(h++,g--),(_*=2)>=1&&(d++,_--)}return p},a.noiseDetail=(e,t)=>{e>0&&(E=e),t>0&&(T=t)};const O=()=>{let e,t,a=4294967295;return{setSeed(o){e=t=(o??Math.random()*a)>>>0},getSeed:()=>t,rand:()=>(e^=e<<17,e^=e>>13,e^=e<<5,(e>>>0)/a)}};let P=O();P.setSeed(),a.noiseSeed=e=>{let t=void 0===e?4294967295*Math.random():e;D||(D=new Float32Array(4096));for(var a=0;a<4096;a++)t^=t<<17,t^=t>>13,t^=t<<5,D[a]=(t>>>0)/4294967295},a.randomSeed=e=>P.setSeed(e),a.random=(e,t)=>void 0===e?P.rand():"number"==typeof e?void 0!==t?P.rand()*(t-e)+e:P.rand()*e:e[Math.trunc(e.length*P.rand())],a.randomGenerator=e=>{e==a.LCG?P=(()=>{const e=4294967296;let t,a;return{setSeed(o){a=t=(o??Math.random()*e)>>>0},getSeed:()=>t,rand:()=>(a=(1664525*a+1013904223)%e,a/e)}})():e==a.SHR3&&(P=O()),P.setSeed()};var k=new function(){var e,t,a,o=new Array(128),n=new Array(256),i=new Array(128),r=new Array(128),s=new Array(256),l=new Array(256),c=()=>4294967296*P.rand()-2147483648,h=()=>.5+2.328306e-10*(c()|0),d=()=>{for(var t,n,s,l,d=3.44262;;){if(t=a*i[e],0==e){do{s=h(),l=h(),t=.2904764*-Math.log(s),n=-Math.log(l)}while(n+n0?d+t:-d-t}if(r[e]+h()*(r[e-1]-r[e]){for(var a;;){if(0==e)return 7.69711-Math.log(h());if(a=t*s[e],l[e]+h()*(l[e-1]-l[e])(a=c(),e=127&a,Math.abs(a)(t=c()>>>0){var e,t,a=2147483648,c=4294967296,h=3.442619855899,d=h,u=.00991256303526217,g=7.697117470131487,_=g,p=.003949659822581572;for(e=u/Math.exp(-.5*h*h),o[0]=Math.floor(h/e*a),o[1]=0,i[0]=e/a,i[127]=h/a,r[0]=1,r[127]=Math.exp(-.5*h*h),t=126;t>=1;t--)h=Math.sqrt(-2*Math.log(u/h+Math.exp(-.5*h*h))),o[t+1]=Math.floor(h/d*a),d=h,r[t]=Math.exp(-.5*h*h),i[t]=h/a;for(e=p/Math.exp(-g),n[0]=Math.floor(g/e*c),n[1]=0,s[0]=e/c,s[255]=g/c,l[0]=1,l[255]=Math.exp(-g),t=254;t>=1;t--)g=-Math.log(p/g+Math.exp(-g)),n[t+1]=Math.floor(g/_*c),_=g,l[t]=Math.exp(-g),s[t]=g/c}};function z(e){let t=e||performance.now();if(a._lastFrameTime??=t-a._targetFrameDuration,a._loop)u=L(z);else if(a.frameCount&&!a._redraw)return;if(u&&a.frameCount){if(t-a._lastFrameTime(k.hasInit||(k.zigset(),k.hasInit=!0),k.RNOR()*t+e),a.randomExponential=()=>(k.hasInit||(k.zigset(),k.hasInit=!0),k.REXP()),a.Element=function(e){this.elt=e},a._elements=[],a.createCapture=e=>{var t=document.createElement("video");return t.playsinline="playsinline",t.autoplay="autoplay",navigator.mediaDevices.getUserMedia(e).then((e=>{t.srcObject=e})),t.style.position="absolute",t.style.opacity=1e-5,t.style.zIndex=-1e3,document.body.append(t),t},a.print=console.log,a.describe=()=>{},a.noLoop=()=>{a._loop=!1,u=null},a.loop=()=>{a._loop=!0,null==u&&z()},a.redraw=(e=1)=>{a._redraw=!0;for(let t=0;t{a.noLoop(),a.canvas.remove()},a.frameRate=e=>(e&&(a._targetFrameRate=e,a._targetFrameDuration=1e3/e),a._frameRate),a.getTargetFrameRate=()=>a._targetFrameRate,a.getFPS=()=>a._fps,"object"==typeof localStorage&&(a.storeItem=localStorage.setItem,a.getItem=localStorage.getItem,a.removeItem=localStorage.removeItem,a.clearStorage=localStorage.clear),a._updateMouse=e=>{if(e.changedTouches)return;let t=a.canvas.getBoundingClientRect(),o=a.canvas.scrollWidth/a.width||1,n=a.canvas.scrollHeight/a.height||1;a.mouseX=(e.clientX-t.left)/o,a.mouseY=(e.clientY-t.top)/n},a._onmousedown=e=>{a._updateMouse(e),a.mouseIsPressed=!0,a.mouseButton=[a.LEFT,a.CENTER,a.RIGHT][e.button],a.mousePressed(e)},a._onmousemove=e=>{a._updateMouse(e),a.mouseIsPressed?a.mouseDragged(e):a.mouseMoved(e)},a._onmouseup=e=>{a._updateMouse(e),a.mouseIsPressed=!1,a.mouseReleased(e)},a._onclick=e=>{a._updateMouse(e),a.mouseIsPressed=!0,a.mouseClicked(e),a.mouseIsPressed=!1},a.cursor=(e,t,o)=>{let n="";e.includes(".")&&(e=`url("${e}")`,n=", auto"),void 0!==t&&(e+=" "+t+" "+o),a.canvas.style.cursor=e+n},a.noCursor=()=>{a.canvas.style.cursor="none"},a._onkeydown=e=>{e.repeat||(a.keyIsPressed=!0,a.key=e.key,a.keyCode=e.keyCode,p[a.keyCode]=!0,a.keyPressed(e),1==e.key.length&&a.keyTyped(e))},a._onkeyup=e=>{a.keyIsPressed=!1,a.key=e.key,a.keyCode=e.keyCode,p[a.keyCode]=!1,a.keyReleased(e)},a._ontouchstart=e=>{a.touches=[...e.touches].map(Q),a._isTouchAware||(a.mouseX=a.touches[0].x,a.mouseY=a.touches[0].y,a.mouseIsPressed=!0,a.mouseButton=a.LEFT,a.mousePressed(e)||e.preventDefault()),a.touchStarted(e)||e.preventDefault(),"running"!=a.getAudioContext()?.state&&a.userStartAudio()},a._ontouchmove=e=>{a.touches=[...e.touches].map(Q),a._isTouchAware||(a.mouseX=a.touches[0].x,a.mouseY=a.touches[0].y,a.mouseDragged(e)||e.preventDefault()),a.touchMoved(e)||e.preventDefault()},a._ontouchend=e=>{a.touches=[...e.touches].map(Q),a._isTouchAware||a.touches.length||(a.mouseIsPressed=!1,a.mouseReleased(e)||e.preventDefault()),a.touchEnded(e)||e.preventDefault()},"graphics"!=e&&(a.keyIsDown=e=>!!p[e],a.canvas.onmousedown=e=>a._onmousedown(e),a.canvas.onmouseup=e=>a._onmouseup(e),a.canvas.onclick=e=>a._onclick(e),a.canvas.ontouchstart=e=>a._ontouchstart(e),a.canvas.ontouchmove=e=>a._ontouchmove(e),a.canvas.ontouchcancel=a.canvas.ontouchend=e=>a._ontouchend(e)),a.hasSensorPermission=!window.DeviceOrientationEvent&&!window.DeviceMotionEvent||!(DeviceOrientationEvent.requestPermission||DeviceMotionEvent.requestPermission),a.requestSensorPermissions=()=>{DeviceOrientationEvent.requestPermission&&DeviceOrientationEvent.requestPermission().then((e=>{"granted"==e&&DeviceMotionEvent.requestPermission&&DeviceMotionEvent.requestPermission().then((e=>{"granted"==e&&(a.hasSensorPermission=!0)})).catch(alert)})).catch(alert)};window.ondeviceorientation=e=>{a.pRotationX=a.rotationX,a.pRotationY=a.rotationY,a.pRotationZ=a.rotationZ,a.pRelRotationX=a.relRotationX,a.pRelRotationY=a.relRotationY,a.pRelRotationZ=a.relRotationZ,a.rotationX=e.beta*(Math.PI/180),a.rotationY=e.gamma*(Math.PI/180),a.rotationZ=e.alpha*(Math.PI/180),a.relRotationX=[-a.rotationY,-a.rotationX,a.rotationY][Math.trunc(window.orientation/90)+1],a.relRotationY=[-a.rotationX,a.rotationY,a.rotationX][Math.trunc(window.orientation/90)+1],a.relRotationZ=a.rotationZ},window.ondevicemotion=e=>{if(a.pAccelerationX=a.accelerationX,a.pAccelerationY=a.accelerationY,a.pAccelerationZ=a.accelerationZ,!e.acceleration){let i=((e,t)=>[(e[0]*t[0]+e[1]*t[1]+e[2]*t[2]+e[3])/(e[12]*t[0]+e[13]*t[1]+e[14]*t[2]+e[15]),(e[4]*t[0]+e[5]*t[1]+e[6]*t[2]+e[7])/(e[12]*t[0]+e[13]*t[1]+e[14]*t[2]+e[15]),(e[8]*t[0]+e[9]*t[1]+e[10]*t[2]+e[11])/(e[12]*t[0]+e[13]*t[1]+e[14]*t[2]+e[15])])((n=a.rotationY,t=[a.cos(n),0,a.sin(n),0,0,1,0,0,-a.sin(n),0,a.cos(n),0,0,0,0,1],o=(e=>[1,0,0,0,0,a.cos(e),-a.sin(e),0,0,a.sin(e),a.cos(e),0,0,0,0,1])(a.rotationX),[t[0]*o[0]+t[1]*o[4]+t[2]*o[8]+t[3]*o[12],t[0]*o[1]+t[1]*o[5]+t[2]*o[9]+t[3]*o[13],t[0]*o[2]+t[1]*o[6]+t[2]*o[10]+t[3]*o[14],t[0]*o[3]+t[1]*o[7]+t[2]*o[11]+t[3]*o[15],t[4]*o[0]+t[5]*o[4]+t[6]*o[8]+t[7]*o[12],t[4]*o[1]+t[5]*o[5]+t[6]*o[9]+t[7]*o[13],t[4]*o[2]+t[5]*o[6]+t[6]*o[10]+t[7]*o[14],t[4]*o[3]+t[5]*o[7]+t[6]*o[11]+t[7]*o[15],t[8]*o[0]+t[9]*o[4]+t[10]*o[8]+t[11]*o[12],t[8]*o[1]+t[9]*o[5]+t[10]*o[9]+t[11]*o[13],t[8]*o[2]+t[9]*o[6]+t[10]*o[10]+t[11]*o[14],t[8]*o[3]+t[9]*o[7]+t[10]*o[11]+t[11]*o[15],t[12]*o[0]+t[13]*o[4]+t[14]*o[8]+t[15]*o[12],t[12]*o[1]+t[13]*o[5]+t[14]*o[9]+t[15]*o[13],t[12]*o[2]+t[13]*o[6]+t[14]*o[10]+t[15]*o[14],t[12]*o[3]+t[13]*o[7]+t[14]*o[11]+t[15]*o[15]]),[0,0,-9.80665]);a.accelerationX=e.accelerationIncludingGravity.x+i[0],a.accelerationY=e.accelerationIncludingGravity.y+i[1],a.accelerationZ=e.accelerationIncludingGravity.z-i[2]}var t,o,n},a.year=()=>(new Date).getFullYear(),a.day=()=>(new Date).getDay(),a.hour=()=>(new Date).getHours(),a.minute=()=>(new Date).getMinutes(),a.second=()=>(new Date).getSeconds(),a.millis=()=>performance.now()-m,a._loadFile=(e,t,a)=>{o++;let n={};return fetch(e).then((e=>"json"==a?e.json():"text"==a?e.text():void 0)).then((e=>{o--,Object.assign(n,e),t&&t(e)})),n},a.loadStrings=(e,t)=>a._loadFile(e,t,"text"),a.loadJSON=(e,t)=>a._loadFile(e,t,"json"),a.loadSound=(e,t)=>{o++;let a=new Audio(e);return a.addEventListener("canplaythrough",(()=>{o--,t&&t(a)})),a.load(),a.setVolume=e=>a.volume=e,a.setLoop=e=>a.loop=e,a},a.getAudioContext=()=>a.audioContext,a.userStartAudio=()=>(a.audioContext??=new window.AudioContext,a.audioContext.resume()),"global"==e&&(Object.assign(Q5,a),delete Q5.Q5),Q5.Image??=_Q5Image;for(let $ of Q5.prototype._methods.init)$.call(a);for(let[G,V]of Object.entries(Q5.prototype))"_"!=G[0]&&"function"==typeof a[G]&&(a[G]=V.bind(a));if("global"==e){let H=Object.getOwnPropertyNames(a),Y=Q5._nodejs?global:window;for(let j of H)"function"==typeof a[j]?Y[j]=a[j]:Object.defineProperty(Y,j,{get:()=>a[j],set:e=>a[j]=e})}if("function"==typeof e&&e(a),"image"==e||"graphics"==e)return;let L=window.requestAnimationFrame||function(e){const t=a._lastFrameTime+a._targetFrameDuration;return setTimeout((()=>{e(t)}),t-performance.now())},F="global"==e?Q5._nodejs?global:window:a,N=F.preload,q=["setup","draw","preload","mouseMoved","mousePressed","mouseReleased","mouseDragged","mouseClicked","keyPressed","keyReleased","keyTyped","touchStarted","touchMoved","touchEnded","windowResized"];for(let X of q)F[X]?a._isGlobal&&(a[X]=F[X]):a[X]=()=>{};function B(){if(a._startDone=!0,o>0)return L(B);m=performance.now(),a.setup(),a.frameCount||(null===r&&a.createCanvas(100,100),a._setupDone=!0,r&&a.resetMatrix(),L(z))}a._isTouchAware=a.touchStarted||a.touchMoved||a.mouseReleased,window&&"graphics"!=e&&(window.addEventListener("mousemove",(e=>a._onmousemove(e)),!1),window.addEventListener("keydown",(e=>a._onkeydown(e)),!1),window.addEventListener("keyup",(e=>a._onkeyup(e)),!1),window.addEventListener("resize",(()=>a._shouldResize=!0))),(a.setup||a.draw)&&(a._startDone=!1,arguments.length&&"namespace"!=e||N?(a.preload(),B()):(F.preload=a.preload=()=>{a._startDone||B()},setTimeout(a.preload,32)))}Q5.Color=class{constructor(){this._q5Color=!0}},Q5.ColorOKLCH=class extends Q5.Color{constructor(e,t,a,o){super(),this.l=e,this.c=t,this.h=a,this.a=o??1}toString(){return`color(oklch ${this.l} ${this.c} ${this.h} / ${this.a})`}},Q5.ColorRGBA=class extends Q5.Color{constructor(e,t,a,o){super(),this.r=e,this.g=t,this.b=a,this.a=o??255}setRed(e){this.r=e}setGreen(e){this.g=e}setBlue(e){this.b=e}setAlpha(e){this.a=e}get levels(){return[this.r,this.g,this.b,this.a]}toString(){return`rgb(${this.r} ${this.g} ${this.b} / ${this.a/255})`}},Q5.ColorRGBA_P3=class extends Q5.ColorRGBA{constructor(e,t,a,o){super(e,t,a,o),this._edited=!0}get r(){return this._r}set r(e){this._r=e,this._edited=!0}get g(){return this._g}set g(e){this._g=e,this._edited=!0}get b(){return this._b}set b(e){this._b=e,this._edited=!0}get a(){return this._a}set a(e){this._a=e,this._edited=!0}toString(){if(this._edited){let e=(this._r/255).toFixed(3),t=(this._g/255).toFixed(3),a=(this._b/255).toFixed(3),o=(this._a/255).toFixed(3);this._css=`color(display-p3 ${e} ${t} ${a} / ${o})`,this._edited=!1}return this._css}},Q5.Vector=class{constructor(e,t,a,o){this.x=e||0,this.y=t||0,this.z=a||0,this._$=o||window,this._cn=null,this._cnsq=null}set(e,t,a){this.x=e||0,this.y=t||0,this.z=a||0}copy(){return new Q5.Vector(this.x,this.y,this.z)}_arg2v(e,t,a){return void 0!==e.x?e:void 0!==t?{x:e,y:t,z:a||0}:{x:e,y:e,z:e}}_calcNorm(){this._cnsq=this.x*this.x+this.y*this.y+this.z*this.z,this._cn=Math.sqrt(this._cnsq)}add(){let e=this._arg2v(...arguments);return this.x+=e.x,this.y+=e.y,this.z+=e.z,this}rem(){let e=this._arg2v(...arguments);return this.x%=e.x,this.y%=e.y,this.z%=e.z,this}sub(){let e=this._arg2v(...arguments);return this.x-=e.x,this.y-=e.y,this.z-=e.z,this}mult(){let e=this._arg2v(...arguments);return this.x*=e.x,this.y*=e.y,this.z*=e.z,this}div(){let e=this._arg2v(...arguments);return e.x?this.x/=e.x:this.x=0,e.y?this.y/=e.y:this.y=0,e.z?this.z/=e.z:this.z=0,this}mag(){return this._calcNorm(),this._cn}magSq(){return this._calcNorm(),this._cnsq}dot(){let e=this._arg2v(...arguments);return this.x*e.x+this.y*e.y+this.z*e.z}dist(){let e=this._arg2v(...arguments),t=this.x-e.x,a=this.y-e.y,o=this.z-e.z;return Math.sqrt(t*t+a*a+o*o)}cross(){let e=this._arg2v(...arguments),t=this.y*e.z-this.z*e.y,a=this.z*e.x-this.x*e.z,o=this.x*e.y-this.y*e.x;return this.x=t,this.y=a,this.z=o,this}normalize(){this._calcNorm();let e=this._cn;return 0!=e&&(this.x/=e,this.y/=e,this.z/=e),this._cn=1,this._cnsq=1,this}limit(e){this._calcNorm();let t=this._cn;if(t>e){let a=e/t;this.x*=a,this.y*=a,this.z*=a,this._cn=e,this._cnsq=e*e}return this}setMag(e){this._calcNorm();let t=e/this._cn;return this.x*=t,this.y*=t,this.z*=t,this._cn=e,this._cnsq=e*e,this}heading(){return this._$.atan2(this.y,this.x)}rotate(e){let t=this._$.cos(e),a=this._$.sin(e),o=this.x*t-this.y*a,n=this.x*a+this.y*t;return this.x=o,this.y=n,this}angleBetween(){let e=this._arg2v(...arguments),t=Q5.Vector.cross(this,e);return this._$.atan2(t.mag(),this.dot(e))*Math.sign(t.z||1)}lerp(){let e=[...arguments],t=this._arg2v(...e.slice(0,-1)),a=e[e.length-1];return this.x+=(t.x-this.x)*a,this.y+=(t.y-this.y)*a,this.z+=(t.z-this.z)*a,this}reflect(e){return e.normalize(),this.sub(e.mult(2*this.dot(e)))}array(){return[this.x,this.y,this.z]}equals(e,t){return t??=Number.EPSILON||0,Math.abs(e.x-this.x)e.copy().add(t),Q5.Vector.cross=(e,t)=>e.copy().cross(t),Q5.Vector.dist=(e,t)=>Math.hypot(e.x-t.x,e.y-t.y,e.z-t.z),Q5.Vector.div=(e,t)=>e.copy().div(t),Q5.Vector.dot=(e,t)=>e.copy().dot(t),Q5.Vector.equals=(e,t,a)=>e.equals(t,a),Q5.Vector.lerp=(e,t,a)=>e.copy().lerp(t,a),Q5.Vector.limit=(e,t)=>e.copy().limit(t),Q5.Vector.heading=e=>this._$.atan2(e.y,e.x),Q5.Vector.magSq=e=>e.x*e.x+e.y*e.y+e.z*e.z,Q5.Vector.mag=e=>Math.sqrt(Q5.Vector.magSq(e)),Q5.Vector.mult=(e,t)=>e.copy().mult(t),Q5.Vector.normalize=e=>e.copy().normalize(),Q5.Vector.rem=(e,t)=>e.copy().rem(t),Q5.Vector.sub=(e,t)=>e.copy().sub(t);for(let e of["fromAngle","fromAngles","random2D","random3D"])Q5.Vector[e]=(t,a,o)=>(new Q5.Vector)[e](t,a,o);class _Q5Image extends Q5{constructor(e,t,a){super("image"),delete this.createCanvas,a??={},a.alpha??=!0,this._createCanvas(e,t,"2d",a),this._loop=!1}get w(){return this.width}get h(){return this.height}}"object"!=typeof window&&(window=0),Q5._nodejs="object"==typeof process,Q5.canvasOptions={alpha:!1,desynchronized:!1,colorSpace:"display-p3"},window.matchMedia&&matchMedia("(dynamic-range: high) and (color-gamut: p3)").matches?Q5.supportsHDR=!0:Q5.canvasOptions.colorSpace="srgb",Q5._instanceCount=0,Q5._friendlyError=(e,t)=>{throw t+": "+e},Q5._validateParameters=()=>!0,Q5.prototype._methods={init:[],pre:[],post:[],remove:[]},Q5.prototype.registerMethod=(e,t)=>Q5.prototype._methods[e].push(t),Q5.prototype.registerPreloadMethod=(e,t)=>Q5.prototype[e]=t[e],"object"==typeof module?(global.p5??=Q5,module.exports=global.Q5=Q5):(window.p5??=Q5,window.Q5=Q5),"object"==typeof document&&document.addEventListener("DOMContentLoaded",(()=>{Q5._hasGlobal||new Q5("auto")})); diff --git a/q5js_brand.webp b/q5js_brand.webp index 25a834b8ff41da78ea772c154c61aaf99c3ff891..4db3508c3770b7a7831ae1a4378fad344020df50 100644 GIT binary patch literal 6286 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 E008uOF8}}l literal 6274 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 diff --git a/q5js_logo.webp b/q5js_logo.webp index f4aa99b431d0216311807a9dab95d31be6a5cb93..393c036b28fc98ab3979c9d8506dca876d2f74f0 100644 GIT binary patch literal 5360 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 P|JR)Ee;w*wnBn~ov4@fn literal 5422 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