From 1e429333f535fa3a8525f061fa1142fdd979b5ad Mon Sep 17 00:00:00 2001 From: GDWR Date: Wed, 20 Dec 2023 13:09:14 +0000 Subject: [PATCH 01/36] Refactor content used for site generation into top level folder --- {yaksha_blog => content/blog}/0001_initial_post.md | 0 {yaksha_demos => content/demos}/0001-tree.docbox | 0 {yaksha_demos => content/demos}/0002-space-blast.docbox | 0 {yaksha_demos => content/demos}/0003-gui.docbox | 0 {yaksha_demos => content/demos}/0004-wasm4-notes.docbox | 0 {yaksha_demos => content/demos}/0005-wasm4-snake.docbox | 0 {yaksha_docs => content/docs}/0000-features.docbox | 0 {yaksha_docs => content/docs}/0001-runtime-library.docbox | 0 {yaksha_docs => content/docs}/0002-grammar.docbox | 0 {yaksha_docs => content/docs}/0003-compiler.docbox | 0 {yaksha_lib_docs => content/lib_docs}/0000-core.docbox | 0 {yaksha_lib_docs => content/lib_docs}/0001-raylib.docbox | 0 {yaksha_lib_docs => content/lib_docs}/0002-w4.docbox | 0 {yaksha_proposals => content/proposals}/0001_c_enums.md | 0 {yaksha_proposals => content/proposals}/0002_structs.md | 0 .../proposals}/0003_syntax_sugar_for_loop.md | 0 {yaksha_proposals => content/proposals}/0004_iterator.md | 0 {yaksha_proposals => content/proposals}/0005_dsl_macros.md | 0 {yaksha_proposals => content/proposals}/0006_c2c.md | 0 {yaksha_proposals => content/proposals}/0007_structs_revisited.md | 0 {yaksha_proposals => content/proposals}/0008_sugar_methods.md | 0 {yaksha_proposals => content/proposals}/0009_strings_revisited.md | 0 .../proposals}/0010_number_auto_widening.md | 0 {yaksha_proposals => content/proposals}/0011_http.md | 0 {yaksha_proposals => content/proposals}/0012_fixed_size_arrays.md | 0 {yaksha_tutorials => content/tutorials}/0001_getting_started.md | 0 {yaksha_tutorials => content/tutorials}/0002_yaksha_lisp.md | 0 27 files changed, 0 insertions(+), 0 deletions(-) rename {yaksha_blog => content/blog}/0001_initial_post.md (100%) rename {yaksha_demos => content/demos}/0001-tree.docbox (100%) rename {yaksha_demos => content/demos}/0002-space-blast.docbox (100%) rename {yaksha_demos => content/demos}/0003-gui.docbox (100%) rename {yaksha_demos => content/demos}/0004-wasm4-notes.docbox (100%) rename {yaksha_demos => content/demos}/0005-wasm4-snake.docbox (100%) rename {yaksha_docs => content/docs}/0000-features.docbox (100%) rename {yaksha_docs => content/docs}/0001-runtime-library.docbox (100%) rename {yaksha_docs => content/docs}/0002-grammar.docbox (100%) rename {yaksha_docs => content/docs}/0003-compiler.docbox (100%) rename {yaksha_lib_docs => content/lib_docs}/0000-core.docbox (100%) rename {yaksha_lib_docs => content/lib_docs}/0001-raylib.docbox (100%) rename {yaksha_lib_docs => content/lib_docs}/0002-w4.docbox (100%) rename {yaksha_proposals => content/proposals}/0001_c_enums.md (100%) rename {yaksha_proposals => content/proposals}/0002_structs.md (100%) rename {yaksha_proposals => content/proposals}/0003_syntax_sugar_for_loop.md (100%) rename {yaksha_proposals => content/proposals}/0004_iterator.md (100%) rename {yaksha_proposals => content/proposals}/0005_dsl_macros.md (100%) rename {yaksha_proposals => content/proposals}/0006_c2c.md (100%) rename {yaksha_proposals => content/proposals}/0007_structs_revisited.md (100%) rename {yaksha_proposals => content/proposals}/0008_sugar_methods.md (100%) rename {yaksha_proposals => content/proposals}/0009_strings_revisited.md (100%) rename {yaksha_proposals => content/proposals}/0010_number_auto_widening.md (100%) rename {yaksha_proposals => content/proposals}/0011_http.md (100%) rename {yaksha_proposals => content/proposals}/0012_fixed_size_arrays.md (100%) rename {yaksha_tutorials => content/tutorials}/0001_getting_started.md (100%) rename {yaksha_tutorials => content/tutorials}/0002_yaksha_lisp.md (100%) diff --git a/yaksha_blog/0001_initial_post.md b/content/blog/0001_initial_post.md similarity index 100% rename from yaksha_blog/0001_initial_post.md rename to content/blog/0001_initial_post.md diff --git a/yaksha_demos/0001-tree.docbox b/content/demos/0001-tree.docbox similarity index 100% rename from yaksha_demos/0001-tree.docbox rename to content/demos/0001-tree.docbox diff --git a/yaksha_demos/0002-space-blast.docbox b/content/demos/0002-space-blast.docbox similarity index 100% rename from yaksha_demos/0002-space-blast.docbox rename to content/demos/0002-space-blast.docbox diff --git a/yaksha_demos/0003-gui.docbox b/content/demos/0003-gui.docbox similarity index 100% rename from yaksha_demos/0003-gui.docbox rename to content/demos/0003-gui.docbox diff --git a/yaksha_demos/0004-wasm4-notes.docbox b/content/demos/0004-wasm4-notes.docbox similarity index 100% rename from yaksha_demos/0004-wasm4-notes.docbox rename to content/demos/0004-wasm4-notes.docbox diff --git a/yaksha_demos/0005-wasm4-snake.docbox b/content/demos/0005-wasm4-snake.docbox similarity index 100% rename from yaksha_demos/0005-wasm4-snake.docbox rename to content/demos/0005-wasm4-snake.docbox diff --git a/yaksha_docs/0000-features.docbox b/content/docs/0000-features.docbox similarity index 100% rename from yaksha_docs/0000-features.docbox rename to content/docs/0000-features.docbox diff --git a/yaksha_docs/0001-runtime-library.docbox b/content/docs/0001-runtime-library.docbox similarity index 100% rename from yaksha_docs/0001-runtime-library.docbox rename to content/docs/0001-runtime-library.docbox diff --git a/yaksha_docs/0002-grammar.docbox b/content/docs/0002-grammar.docbox similarity index 100% rename from yaksha_docs/0002-grammar.docbox rename to content/docs/0002-grammar.docbox diff --git a/yaksha_docs/0003-compiler.docbox b/content/docs/0003-compiler.docbox similarity index 100% rename from yaksha_docs/0003-compiler.docbox rename to content/docs/0003-compiler.docbox diff --git a/yaksha_lib_docs/0000-core.docbox b/content/lib_docs/0000-core.docbox similarity index 100% rename from yaksha_lib_docs/0000-core.docbox rename to content/lib_docs/0000-core.docbox diff --git a/yaksha_lib_docs/0001-raylib.docbox b/content/lib_docs/0001-raylib.docbox similarity index 100% rename from yaksha_lib_docs/0001-raylib.docbox rename to content/lib_docs/0001-raylib.docbox diff --git a/yaksha_lib_docs/0002-w4.docbox b/content/lib_docs/0002-w4.docbox similarity index 100% rename from yaksha_lib_docs/0002-w4.docbox rename to content/lib_docs/0002-w4.docbox diff --git a/yaksha_proposals/0001_c_enums.md b/content/proposals/0001_c_enums.md similarity index 100% rename from yaksha_proposals/0001_c_enums.md rename to content/proposals/0001_c_enums.md diff --git a/yaksha_proposals/0002_structs.md b/content/proposals/0002_structs.md similarity index 100% rename from yaksha_proposals/0002_structs.md rename to content/proposals/0002_structs.md diff --git a/yaksha_proposals/0003_syntax_sugar_for_loop.md b/content/proposals/0003_syntax_sugar_for_loop.md similarity index 100% rename from yaksha_proposals/0003_syntax_sugar_for_loop.md rename to content/proposals/0003_syntax_sugar_for_loop.md diff --git a/yaksha_proposals/0004_iterator.md b/content/proposals/0004_iterator.md similarity index 100% rename from yaksha_proposals/0004_iterator.md rename to content/proposals/0004_iterator.md diff --git a/yaksha_proposals/0005_dsl_macros.md b/content/proposals/0005_dsl_macros.md similarity index 100% rename from yaksha_proposals/0005_dsl_macros.md rename to content/proposals/0005_dsl_macros.md diff --git a/yaksha_proposals/0006_c2c.md b/content/proposals/0006_c2c.md similarity index 100% rename from yaksha_proposals/0006_c2c.md rename to content/proposals/0006_c2c.md diff --git a/yaksha_proposals/0007_structs_revisited.md b/content/proposals/0007_structs_revisited.md similarity index 100% rename from yaksha_proposals/0007_structs_revisited.md rename to content/proposals/0007_structs_revisited.md diff --git a/yaksha_proposals/0008_sugar_methods.md b/content/proposals/0008_sugar_methods.md similarity index 100% rename from yaksha_proposals/0008_sugar_methods.md rename to content/proposals/0008_sugar_methods.md diff --git a/yaksha_proposals/0009_strings_revisited.md b/content/proposals/0009_strings_revisited.md similarity index 100% rename from yaksha_proposals/0009_strings_revisited.md rename to content/proposals/0009_strings_revisited.md diff --git a/yaksha_proposals/0010_number_auto_widening.md b/content/proposals/0010_number_auto_widening.md similarity index 100% rename from yaksha_proposals/0010_number_auto_widening.md rename to content/proposals/0010_number_auto_widening.md diff --git a/yaksha_proposals/0011_http.md b/content/proposals/0011_http.md similarity index 100% rename from yaksha_proposals/0011_http.md rename to content/proposals/0011_http.md diff --git a/yaksha_proposals/0012_fixed_size_arrays.md b/content/proposals/0012_fixed_size_arrays.md similarity index 100% rename from yaksha_proposals/0012_fixed_size_arrays.md rename to content/proposals/0012_fixed_size_arrays.md diff --git a/yaksha_tutorials/0001_getting_started.md b/content/tutorials/0001_getting_started.md similarity index 100% rename from yaksha_tutorials/0001_getting_started.md rename to content/tutorials/0001_getting_started.md diff --git a/yaksha_tutorials/0002_yaksha_lisp.md b/content/tutorials/0002_yaksha_lisp.md similarity index 100% rename from yaksha_tutorials/0002_yaksha_lisp.md rename to content/tutorials/0002_yaksha_lisp.md From 2da231243f7d8544f2bd7811a4cc122d5a4e0329 Mon Sep 17 00:00:00 2001 From: GDWR Date: Wed, 20 Dec 2023 13:18:44 +0000 Subject: [PATCH 02/36] Initial refactor to Astro --- .gitignore | 25 +- .vscode/extensions.json | 4 + .vscode/launch.json | 11 + README.md | 71 +- astro.config.mjs | 4 + package.json | 15 + public/favicon.svg | 9 + src/components/Card.astro | 61 + src/env.d.ts | 1 + src/layouts/Layout.astro | 51 + src/pages/index.astro | 123 ++ template/cell.html | 8 - template/main0.html | 68 - template/main1.html | 53 - tsconfig.json | 3 + yarn.lock | 3254 +++++++++++++++++++++++++++++++++++++ 16 files changed, 3605 insertions(+), 156 deletions(-) create mode 100644 .vscode/extensions.json create mode 100644 .vscode/launch.json create mode 100644 astro.config.mjs create mode 100644 package.json create mode 100644 public/favicon.svg create mode 100644 src/components/Card.astro create mode 100644 src/env.d.ts create mode 100644 src/layouts/Layout.astro create mode 100644 src/pages/index.astro delete mode 100644 template/cell.html delete mode 100644 template/main0.html delete mode 100644 template/main1.html create mode 100644 tsconfig.json create mode 100644 yarn.lock diff --git a/.gitignore b/.gitignore index ff99b90..6d4c0aa 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,21 @@ -.idea -.venv -__pycache__ +# build output +dist/ + +# generated types +.astro/ + +# dependencies +node_modules/ + +# logs +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + +# environment variables +.env +.env.production + +# macOS-specific files .DS_Store -*.pdf -*.zip diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..22a1505 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,4 @@ +{ + "recommendations": ["astro-build.astro-vscode"], + "unwantedRecommendations": [] +} diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..d642209 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,11 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "command": "./node_modules/.bin/astro dev", + "name": "Development server", + "request": "launch", + "type": "node-terminal" + } + ] +} diff --git a/README.md b/README.md index 3a5f42d..1db3fb3 100644 --- a/README.md +++ b/README.md @@ -1,27 +1,54 @@ -# Yaksha Lang Website & Docs Site +# Astro Starter Kit: Basics -* Documentation directories are `yaksha_docs`, `yaksha_lib_docs`, `yaksha_proposals` and `yaksha_tutorials` +```sh +npm create astro@latest -- --template basics +``` -Require `css-minify` and `html-minifier` in path. +[![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/github/withastro/astro/tree/latest/examples/basics) +[![Open with CodeSandbox](https://assets.codesandbox.io/github/button-edit-lime.svg)](https://codesandbox.io/p/sandbox/github/withastro/astro/tree/latest/examples/basics) +[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/withastro/astro?devcontainer_path=.devcontainer/basics/devcontainer.json) -* STEP 01: Install node.js -* STEP 02: -``` -npm install -g css-minify -npm install -g html-minifier -``` +> 🧑‍🚀 **Seasoned astronaut?** Delete this file. Have fun! -Uses Python to build the documentation. -* STEP 01: Create virtual environment -``` -python -m venv .venv -``` -* STEP 02: Activate virtual environment -* STEP 03: Install dependencies -``` -pip install -r requirements.txt -``` -* STEP 04: Run the build.py -``` -python build.py +![just-the-basics](https://github.com/withastro/astro/assets/2244813/a0a5533c-a856-4198-8470-2d67b1d7c554) + +## 🚀 Project Structure + +Inside of your Astro project, you'll see the following folders and files: + +```text +/ +├── public/ +│ └── favicon.svg +├── src/ +│ ├── components/ +│ │ └── Card.astro +│ ├── layouts/ +│ │ └── Layout.astro +│ └── pages/ +│ └── index.astro +└── package.json ``` + +Astro looks for `.astro` or `.md` files in the `src/pages/` directory. Each page is exposed as a route based on its file name. + +There's nothing special about `src/components/`, but that's where we like to put any Astro/React/Vue/Svelte/Preact components. + +Any static assets, like images, can be placed in the `public/` directory. + +## 🧞 Commands + +All commands are run from the root of the project, from a terminal: + +| Command | Action | +| :------------------------ | :----------------------------------------------- | +| `npm install` | Installs dependencies | +| `npm run dev` | Starts local dev server at `localhost:4321` | +| `npm run build` | Build your production site to `./dist/` | +| `npm run preview` | Preview your build locally, before deploying | +| `npm run astro ...` | Run CLI commands like `astro add`, `astro check` | +| `npm run astro -- --help` | Get help using the Astro CLI | + +## 👀 Want to learn more? + +Feel free to check [our documentation](https://docs.astro.build) or jump into our [Discord server](https://astro.build/chat). diff --git a/astro.config.mjs b/astro.config.mjs new file mode 100644 index 0000000..882e651 --- /dev/null +++ b/astro.config.mjs @@ -0,0 +1,4 @@ +import { defineConfig } from 'astro/config'; + +// https://astro.build/config +export default defineConfig({}); diff --git a/package.json b/package.json new file mode 100644 index 0000000..5c45ce3 --- /dev/null +++ b/package.json @@ -0,0 +1,15 @@ +{ + "name": "site", + "type": "module", + "version": "0.0.1", + "scripts": { + "dev": "astro dev", + "start": "astro dev", + "build": "astro build", + "preview": "astro preview", + "astro": "astro" + }, + "dependencies": { + "astro": "^4.0.6" + } +} \ No newline at end of file diff --git a/public/favicon.svg b/public/favicon.svg new file mode 100644 index 0000000..f157bd1 --- /dev/null +++ b/public/favicon.svg @@ -0,0 +1,9 @@ + + + + diff --git a/src/components/Card.astro b/src/components/Card.astro new file mode 100644 index 0000000..bd6d597 --- /dev/null +++ b/src/components/Card.astro @@ -0,0 +1,61 @@ +--- +interface Props { + title: string; + body: string; + href: string; +} + +const { href, title, body } = Astro.props; +--- + + + diff --git a/src/env.d.ts b/src/env.d.ts new file mode 100644 index 0000000..f964fe0 --- /dev/null +++ b/src/env.d.ts @@ -0,0 +1 @@ +/// diff --git a/src/layouts/Layout.astro b/src/layouts/Layout.astro new file mode 100644 index 0000000..7b552be --- /dev/null +++ b/src/layouts/Layout.astro @@ -0,0 +1,51 @@ +--- +interface Props { + title: string; +} + +const { title } = Astro.props; +--- + + + + + + + + + + {title} + + + + + + diff --git a/src/pages/index.astro b/src/pages/index.astro new file mode 100644 index 0000000..fb62628 --- /dev/null +++ b/src/pages/index.astro @@ -0,0 +1,123 @@ +--- +import Layout from '../layouts/Layout.astro'; +import Card from '../components/Card.astro'; +--- + + +
+ +

Welcome to Astro

+

+ To get started, open the directory src/pages in your project.
+ Code Challenge: Tweak the "Welcome to Astro" message above. +

+ +
+
+ + diff --git a/template/cell.html b/template/cell.html deleted file mode 100644 index 33845a7..0000000 --- a/template/cell.html +++ /dev/null @@ -1,8 +0,0 @@ -
-
- $CONTENT$ -
-
- $NOTE$ -
-
\ No newline at end of file diff --git a/template/main0.html b/template/main0.html deleted file mode 100644 index 827715c..0000000 --- a/template/main0.html +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - $TITLE$ - - - - - - - - - - - - - - - - - - - - -
-
- -

Pages

- - - - - -
 
-
-
 
-

Table of Contents

- $TOC$ -
-
-
-
diff --git a/template/main1.html b/template/main1.html deleted file mode 100644 index 9687226..0000000 --- a/template/main1.html +++ /dev/null @@ -1,53 +0,0 @@ -
-
- - - diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..d78f81e --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "astro/tsconfigs/base" +} diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..f6f7e00 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,3254 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@ampproject/remapping@^2.2.0": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@astrojs/compiler@^2.3.4": + version "2.3.4" + resolved "https://registry.yarnpkg.com/@astrojs/compiler/-/compiler-2.3.4.tgz#4dbc169de1f071508bf30db390890f16cb266416" + integrity sha512-33/YtWoBCE0cBUNy1kh78FCDXBoBANX87ShgATlAHECYbG2+buNTAgq4Xgz4t5NgnEHPN21GIBC2Mvvwisoutw== + +"@astrojs/internal-helpers@0.2.1": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@astrojs/internal-helpers/-/internal-helpers-0.2.1.tgz#4e2e6aabaa9819f17119aa10f413c4d6122c94cf" + integrity sha512-06DD2ZnItMwUnH81LBLco3tWjcZ1lGU9rLCCBaeUCGYe9cI0wKyY2W3kDyoW1I6GmcWgt1fu+D1CTvz+FIKf8A== + +"@astrojs/markdown-remark@4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@astrojs/markdown-remark/-/markdown-remark-4.0.1.tgz#e7654e89a7da5e2b8ec557d940c87725a62fd09c" + integrity sha512-RU4ESnqvyLpj8WZs0n5elS6idaDdtIIm7mIpMaRNPCebpxMjfcfdwcmBwz83ktAj5d2eO5bC3z92TcGdli+lRw== + dependencies: + "@astrojs/prism" "^3.0.0" + github-slugger "^2.0.0" + import-meta-resolve "^4.0.0" + mdast-util-definitions "^6.0.0" + rehype-raw "^7.0.0" + rehype-stringify "^10.0.0" + remark-gfm "^4.0.0" + remark-parse "^11.0.0" + remark-rehype "^11.0.0" + remark-smartypants "^2.0.0" + shikiji "^0.6.13" + unified "^11.0.4" + unist-util-visit "^5.0.0" + vfile "^6.0.1" + +"@astrojs/prism@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@astrojs/prism/-/prism-3.0.0.tgz#c9443e4cbf435acf0b5adc2c627d9789991514e7" + integrity sha512-g61lZupWq1bYbcBnYZqdjndShr/J3l/oFobBKPA3+qMat146zce3nz2kdO4giGbhYDt4gYdhmoBz0vZJ4sIurQ== + dependencies: + prismjs "^1.29.0" + +"@astrojs/telemetry@3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@astrojs/telemetry/-/telemetry-3.0.4.tgz#566257082c87df84fcc136db23e071e1104b13fd" + integrity sha512-A+0c7k/Xy293xx6odsYZuXiaHO0PL+bnDoXOc47sGDF5ffIKdKQGRPFl2NMlCF4L0NqN4Ynbgnaip+pPF0s7pQ== + dependencies: + ci-info "^3.8.0" + debug "^4.3.4" + dlv "^1.1.3" + dset "^3.1.2" + is-docker "^3.0.0" + is-wsl "^3.0.0" + which-pm-runs "^1.1.0" + +"@babel/code-frame@^7.22.13", "@babel/code-frame@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244" + integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== + dependencies: + "@babel/highlight" "^7.23.4" + chalk "^2.4.2" + +"@babel/compat-data@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.5.tgz#ffb878728bb6bdcb6f4510aa51b1be9afb8cfd98" + integrity sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw== + +"@babel/core@^7.23.3": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.6.tgz#8be77cd77c55baadcc1eae1c33df90ab6d2151d4" + integrity sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.23.5" + "@babel/generator" "^7.23.6" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helpers" "^7.23.6" + "@babel/parser" "^7.23.6" + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.23.6" + "@babel/types" "^7.23.6" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/generator@^7.23.3", "@babel/generator@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.6.tgz#9e1fca4811c77a10580d17d26b57b036133f3c2e" + integrity sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw== + dependencies: + "@babel/types" "^7.23.6" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + +"@babel/helper-annotate-as-pure@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" + integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-compilation-targets@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991" + integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== + dependencies: + "@babel/compat-data" "^7.23.5" + "@babel/helper-validator-option" "^7.23.5" + browserslist "^4.22.2" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-environment-visitor@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== + +"@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== + dependencies: + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" + +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-module-imports@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" + integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== + dependencies: + "@babel/types" "^7.22.15" + +"@babel/helper-module-transforms@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" + integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/helper-validator-identifier" "^7.22.20" + +"@babel/helper-plugin-utils@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== + +"@babel/helper-simple-access@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-string-parser@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz#9478c707febcbbe1ddb38a3d91a2e054ae622d83" + integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ== + +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== + +"@babel/helper-validator-option@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" + integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== + +"@babel/helpers@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.6.tgz#d03af2ee5fb34691eec0cda90f5ecbb4d4da145a" + integrity sha512-wCfsbN4nBidDRhpDhvcKlzHWCTlgJYUUdSJfzXb2NuBssDSIjc3xcb+znA7l+zYsFljAcGM0aFkN40cR3lXiGA== + dependencies: + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.23.6" + "@babel/types" "^7.23.6" + +"@babel/highlight@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b" + integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A== + dependencies: + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" + js-tokens "^4.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.22.15", "@babel/parser@^7.23.3", "@babel/parser@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.6.tgz#ba1c9e512bda72a47e285ae42aff9d2a635a9e3b" + integrity sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ== + +"@babel/plugin-syntax-jsx@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz#8f2e4f8a9b5f9aa16067e142c1ac9cd9f810f473" + integrity sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-react-jsx@^7.22.5": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz#393f99185110cea87184ea47bcb4a7b0c2e39312" + integrity sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-jsx" "^7.23.3" + "@babel/types" "^7.23.4" + +"@babel/template@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" + integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/parser" "^7.22.15" + "@babel/types" "^7.22.15" + +"@babel/traverse@^7.23.3", "@babel/traverse@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.6.tgz#b53526a2367a0dd6edc423637f3d2d0f2521abc5" + integrity sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ== + dependencies: + "@babel/code-frame" "^7.23.5" + "@babel/generator" "^7.23.6" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.23.6" + "@babel/types" "^7.23.6" + debug "^4.3.1" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.3", "@babel/types@^7.23.4", "@babel/types@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.6.tgz#be33fdb151e1f5a56877d704492c240fc71c7ccd" + integrity sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg== + dependencies: + "@babel/helper-string-parser" "^7.23.4" + "@babel/helper-validator-identifier" "^7.22.20" + to-fast-properties "^2.0.0" + +"@esbuild/aix-ppc64@0.19.10": + version "0.19.10" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.10.tgz#fb3922a0183d27446de00cf60d4f7baaadf98d84" + integrity sha512-Q+mk96KJ+FZ30h9fsJl+67IjNJm3x2eX+GBWGmocAKgzp27cowCOOqSdscX80s0SpdFXZnIv/+1xD1EctFx96Q== + +"@esbuild/android-arm64@0.19.10": + version "0.19.10" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.10.tgz#ef31015416dd79398082409b77aaaa2ade4d531a" + integrity sha512-1X4CClKhDgC3by7k8aOWZeBXQX8dHT5QAMCAQDArCLaYfkppoARvh0fit3X2Qs+MXDngKcHv6XXyQCpY0hkK1Q== + +"@esbuild/android-arm@0.19.10": + version "0.19.10" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.10.tgz#1c23c7e75473aae9fb323be5d9db225142f47f52" + integrity sha512-7W0bK7qfkw1fc2viBfrtAEkDKHatYfHzr/jKAHNr9BvkYDXPcC6bodtm8AyLJNNuqClLNaeTLuwURt4PRT9d7w== + +"@esbuild/android-x64@0.19.10": + version "0.19.10" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.10.tgz#df6a4e6d6eb8da5595cfce16d4e3f6bc24464707" + integrity sha512-O/nO/g+/7NlitUxETkUv/IvADKuZXyH4BHf/g/7laqKC4i/7whLpB0gvpPc2zpF0q9Q6FXS3TS75QHac9MvVWw== + +"@esbuild/darwin-arm64@0.19.10": + version "0.19.10" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.10.tgz#8462a55db07c1b2fad61c8244ce04469ef1043be" + integrity sha512-YSRRs2zOpwypck+6GL3wGXx2gNP7DXzetmo5pHXLrY/VIMsS59yKfjPizQ4lLt5vEI80M41gjm2BxrGZ5U+VMA== + +"@esbuild/darwin-x64@0.19.10": + version "0.19.10" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.10.tgz#d1de20bfd41bb75b955ba86a6b1004539e8218c1" + integrity sha512-alfGtT+IEICKtNE54hbvPg13xGBe4GkVxyGWtzr+yHO7HIiRJppPDhOKq3zstTcVf8msXb/t4eavW3jCDpMSmA== + +"@esbuild/freebsd-arm64@0.19.10": + version "0.19.10" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.10.tgz#16904879e34c53a2e039d1284695d2db3e664d57" + integrity sha512-dMtk1wc7FSH8CCkE854GyGuNKCewlh+7heYP/sclpOG6Cectzk14qdUIY5CrKDbkA/OczXq9WesqnPl09mj5dg== + +"@esbuild/freebsd-x64@0.19.10": + version "0.19.10" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.10.tgz#8ad9e5ca9786ca3f1ef1411bfd10b08dcd9d4cef" + integrity sha512-G5UPPspryHu1T3uX8WiOEUa6q6OlQh6gNl4CO4Iw5PS+Kg5bVggVFehzXBJY6X6RSOMS8iXDv2330VzaObm4Ag== + +"@esbuild/linux-arm64@0.19.10": + version "0.19.10" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.10.tgz#d82cf2c590faece82d28bbf1cfbe36f22ae25bd2" + integrity sha512-QxaouHWZ+2KWEj7cGJmvTIHVALfhpGxo3WLmlYfJ+dA5fJB6lDEIg+oe/0//FuyVHuS3l79/wyBxbHr0NgtxJQ== + +"@esbuild/linux-arm@0.19.10": + version "0.19.10" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.10.tgz#477b8e7c7bcd34369717b04dd9ee6972c84f4029" + integrity sha512-j6gUW5aAaPgD416Hk9FHxn27On28H4eVI9rJ4az7oCGTFW48+LcgNDBN+9f8rKZz7EEowo889CPKyeaD0iw9Kg== + +"@esbuild/linux-ia32@0.19.10": + version "0.19.10" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.10.tgz#d55ff822cf5b0252a57112f86857ff23be6cab0e" + integrity sha512-4ub1YwXxYjj9h1UIZs2hYbnTZBtenPw5NfXCRgEkGb0b6OJ2gpkMvDqRDYIDRjRdWSe/TBiZltm3Y3Q8SN1xNg== + +"@esbuild/linux-loong64@0.19.10": + version "0.19.10" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.10.tgz#a9ad057d7e48d6c9f62ff50f6f208e331c4543c7" + integrity sha512-lo3I9k+mbEKoxtoIbM0yC/MZ1i2wM0cIeOejlVdZ3D86LAcFXFRdeuZmh91QJvUTW51bOK5W2BznGNIl4+mDaA== + +"@esbuild/linux-mips64el@0.19.10": + version "0.19.10" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.10.tgz#b011a96924773d60ebab396fbd7a08de66668179" + integrity sha512-J4gH3zhHNbdZN0Bcr1QUGVNkHTdpijgx5VMxeetSk6ntdt+vR1DqGmHxQYHRmNb77tP6GVvD+K0NyO4xjd7y4A== + +"@esbuild/linux-ppc64@0.19.10": + version "0.19.10" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.10.tgz#5d8b59929c029811e473f2544790ea11d588d4dd" + integrity sha512-tgT/7u+QhV6ge8wFMzaklOY7KqiyitgT1AUHMApau32ZlvTB/+efeCtMk4eXS+uEymYK249JsoiklZN64xt6oQ== + +"@esbuild/linux-riscv64@0.19.10": + version "0.19.10" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.10.tgz#292b06978375b271bd8bc0a554e0822957508d22" + integrity sha512-0f/spw0PfBMZBNqtKe5FLzBDGo0SKZKvMl5PHYQr3+eiSscfJ96XEknCe+JoOayybWUFQbcJTrk946i3j9uYZA== + +"@esbuild/linux-s390x@0.19.10": + version "0.19.10" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.10.tgz#d30af63530f8d4fa96930374c9dd0d62bf59e069" + integrity sha512-pZFe0OeskMHzHa9U38g+z8Yx5FNCLFtUnJtQMpwhS+r4S566aK2ci3t4NCP4tjt6d5j5uo4h7tExZMjeKoehAA== + +"@esbuild/linux-x64@0.19.10": + version "0.19.10" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.10.tgz#898c72eeb74d9f2fb43acf316125b475548b75ce" + integrity sha512-SpYNEqg/6pZYoc+1zLCjVOYvxfZVZj6w0KROZ3Fje/QrM3nfvT2llI+wmKSrWuX6wmZeTapbarvuNNK/qepSgA== + +"@esbuild/netbsd-x64@0.19.10": + version "0.19.10" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.10.tgz#fd473a5ae261b43eab6dad4dbd5a3155906e6c91" + integrity sha512-ACbZ0vXy9zksNArWlk2c38NdKg25+L9pr/mVaj9SUq6lHZu/35nx2xnQVRGLrC1KKQqJKRIB0q8GspiHI3J80Q== + +"@esbuild/openbsd-x64@0.19.10": + version "0.19.10" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.10.tgz#96eb8992e526717b5272321eaad3e21f3a608e46" + integrity sha512-PxcgvjdSjtgPMiPQrM3pwSaG4kGphP+bLSb+cihuP0LYdZv1epbAIecHVl5sD3npkfYBZ0ZnOjR878I7MdJDFg== + +"@esbuild/sunos-x64@0.19.10": + version "0.19.10" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.10.tgz#c16ee1c167f903eaaa6acf7372bee42d5a89c9bc" + integrity sha512-ZkIOtrRL8SEJjr+VHjmW0znkPs+oJXhlJbNwfI37rvgeMtk3sxOQevXPXjmAPZPigVTncvFqLMd+uV0IBSEzqA== + +"@esbuild/win32-arm64@0.19.10": + version "0.19.10" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.10.tgz#7e417d1971dbc7e469b4eceb6a5d1d667b5e3dcc" + integrity sha512-+Sa4oTDbpBfGpl3Hn3XiUe4f8TU2JF7aX8cOfqFYMMjXp6ma6NJDztl5FDG8Ezx0OjwGikIHw+iA54YLDNNVfw== + +"@esbuild/win32-ia32@0.19.10": + version "0.19.10" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.10.tgz#2b52dfec6cd061ecb36171c13bae554888b439e5" + integrity sha512-EOGVLK1oWMBXgfttJdPHDTiivYSjX6jDNaATeNOaCOFEVcfMjtbx7WVQwPSE1eIfCp/CaSF2nSrDtzc4I9f8TQ== + +"@esbuild/win32-x64@0.19.10": + version "0.19.10" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.10.tgz#bd123a74f243d2f3a1f046447bb9b363ee25d072" + integrity sha512-whqLG6Sc70AbU73fFYvuYzaE4MNMBIlR1Y/IrUeOXFrWHxBEjjbZaQ3IXIQS8wJdAzue2GwYZCjOrgrU1oUHoA== + +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.20" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f" + integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@rollup/rollup-android-arm-eabi@4.9.1": + version "4.9.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.1.tgz#beaf518ee45a196448e294ad3f823d2d4576cf35" + integrity sha512-6vMdBZqtq1dVQ4CWdhFwhKZL6E4L1dV6jUjuBvsavvNJSppzi6dLBbuV+3+IyUREaj9ZFvQefnQm28v4OCXlig== + +"@rollup/rollup-android-arm64@4.9.1": + version "4.9.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.1.tgz#6f76cfa759c2d0fdb92122ffe28217181a1664eb" + integrity sha512-Jto9Fl3YQ9OLsTDWtLFPtaIMSL2kwGyGoVCmPC8Gxvym9TCZm4Sie+cVeblPO66YZsYH8MhBKDMGZ2NDxuk/XQ== + +"@rollup/rollup-darwin-arm64@4.9.1": + version "4.9.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.1.tgz#9aaefe33a5481d66322d1c62f368171c03eabe2b" + integrity sha512-LtYcLNM+bhsaKAIGwVkh5IOWhaZhjTfNOkGzGqdHvhiCUVuJDalvDxEdSnhFzAn+g23wgsycmZk1vbnaibZwwA== + +"@rollup/rollup-darwin-x64@4.9.1": + version "4.9.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.1.tgz#707dcaadcdc6bd3fd6c69f55d9456cd4446306a3" + integrity sha512-KyP/byeXu9V+etKO6Lw3E4tW4QdcnzDG/ake031mg42lob5tN+5qfr+lkcT/SGZaH2PdW4Z1NX9GHEkZ8xV7og== + +"@rollup/rollup-linux-arm-gnueabihf@4.9.1": + version "4.9.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.1.tgz#7a4dbbd1dd98731d88a55aefcef0ec4c578fa9c7" + integrity sha512-Yqz/Doumf3QTKplwGNrCHe/B2p9xqDghBZSlAY0/hU6ikuDVQuOUIpDP/YcmoT+447tsZTmirmjgG3znvSCR0Q== + +"@rollup/rollup-linux-arm64-gnu@4.9.1": + version "4.9.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.1.tgz#967ba8e6f68a5f21bd00cd97773dcdd6107e94ed" + integrity sha512-u3XkZVvxcvlAOlQJ3UsD1rFvLWqu4Ef/Ggl40WAVCuogf4S1nJPHh5RTgqYFpCOvuGJ7H5yGHabjFKEZGExk5Q== + +"@rollup/rollup-linux-arm64-musl@4.9.1": + version "4.9.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.1.tgz#d3a4e1c9f21eef3b9f4e4989f334a519a1341462" + integrity sha512-0XSYN/rfWShW+i+qjZ0phc6vZ7UWI8XWNz4E/l+6edFt+FxoEghrJHjX1EY/kcUGCnZzYYRCl31SNdfOi450Aw== + +"@rollup/rollup-linux-riscv64-gnu@4.9.1": + version "4.9.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.1.tgz#415c0533bb752164effd05f5613858e8f6779bc9" + integrity sha512-LmYIO65oZVfFt9t6cpYkbC4d5lKHLYv5B4CSHRpnANq0VZUQXGcCPXHzbCXCz4RQnx7jvlYB1ISVNCE/omz5cw== + +"@rollup/rollup-linux-x64-gnu@4.9.1": + version "4.9.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.1.tgz#0983385dd753a2e0ecaddea7a81dd37fea5114f5" + integrity sha512-kr8rEPQ6ns/Lmr/hiw8sEVj9aa07gh1/tQF2Y5HrNCCEPiCBGnBUt9tVusrcBBiJfIt1yNaXN6r1CCmpbFEDpg== + +"@rollup/rollup-linux-x64-musl@4.9.1": + version "4.9.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.1.tgz#eb7494ebc5199cbd2e5c38c2b8acbe2603f35e03" + integrity sha512-t4QSR7gN+OEZLG0MiCgPqMWZGwmeHhsM4AkegJ0Kiy6TnJ9vZ8dEIwHw1LcZKhbHxTY32hp9eVCMdR3/I8MGRw== + +"@rollup/rollup-win32-arm64-msvc@4.9.1": + version "4.9.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.1.tgz#5bebc66e3a7f82d4b9aa9ff448e7fc13a69656e9" + integrity sha512-7XI4ZCBN34cb+BH557FJPmh0kmNz2c25SCQeT9OiFWEgf8+dL6ZwJ8f9RnUIit+j01u07Yvrsuu1rZGxJCc51g== + +"@rollup/rollup-win32-ia32-msvc@4.9.1": + version "4.9.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.1.tgz#34156ebf8b4de3b20e6497260fe519a30263f8cf" + integrity sha512-yE5c2j1lSWOH5jp+Q0qNL3Mdhr8WuqCNVjc6BxbVfS5cAS6zRmdiw7ktb8GNpDCEUJphILY6KACoFoRtKoqNQg== + +"@rollup/rollup-win32-x64-msvc@4.9.1": + version "4.9.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.1.tgz#d146db7a5949e10837b323ce933ed882ac878262" + integrity sha512-PyJsSsafjmIhVgaI1Zdj7m8BB8mMckFah/xbpplObyHfiXzKcI5UOUXRyOdHW7nz4DpMCuzLnF7v5IWHenCwYA== + +"@types/babel__core@^7.20.4": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" + integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.8" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab" + integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" + integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*": + version "7.20.4" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.4.tgz#ec2c06fed6549df8bc0eb4615b683749a4a92e1b" + integrity sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA== + dependencies: + "@babel/types" "^7.20.7" + +"@types/debug@^4.0.0": + version "4.1.12" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" + integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== + dependencies: + "@types/ms" "*" + +"@types/estree@^1.0.0": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== + +"@types/hast@^3.0.0": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-3.0.3.tgz#7f75e6b43bc3f90316046a287d9ad3888309f7e1" + integrity sha512-2fYGlaDy/qyLlhidX42wAH0KBi2TCjKMH8CHmBXgRlJ3Y+OXTiqsPQ6IWarZKwF1JoUcAJdPogv1d4b0COTpmQ== + dependencies: + "@types/unist" "*" + +"@types/mdast@^4.0.0": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-4.0.3.tgz#1e011ff013566e919a4232d1701ad30d70cab333" + integrity sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg== + dependencies: + "@types/unist" "*" + +"@types/ms@*": + version "0.7.34" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433" + integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== + +"@types/nlcst@^1.0.0": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@types/nlcst/-/nlcst-1.0.4.tgz#3b8a9c279a2367602512588a0ba6a0e93634ee3e" + integrity sha512-ABoYdNQ/kBSsLvZAekMhIPMQ3YUZvavStpKYs7BjLLuKVmIMA0LUgZ7b54zzuWJRbHF80v1cNf4r90Vd6eMQDg== + dependencies: + "@types/unist" "^2" + +"@types/unist@*", "@types/unist@^3.0.0": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.2.tgz#6dd61e43ef60b34086287f83683a5c1b2dc53d20" + integrity sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ== + +"@types/unist@^2", "@types/unist@^2.0.0": + version "2.0.10" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.10.tgz#04ffa7f406ab628f7f7e97ca23e290cd8ab15efc" + integrity sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA== + +"@ungap/structured-clone@^1.0.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + +acorn@^8.11.2: + version "8.11.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.2.tgz#ca0d78b51895be5390a5903c5b3bdcdaf78ae40b" + integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w== + +ansi-align@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" + integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== + dependencies: + string-width "^4.1.0" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-iterate@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/array-iterate/-/array-iterate-2.0.1.tgz#6efd43f8295b3fee06251d3d62ead4bd9805dd24" + integrity sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg== + +astro@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/astro/-/astro-4.0.6.tgz#353ed2db7c1619086a5b5f5253ea1a3cbcceb780" + integrity sha512-P7CfFqWKzkJozzF6IoOC6qoI2ONndV8P3ULhGDgMiXPL7xVkWI5haTBSpyrcjBx643tVXspIRsSV/v+Cx+CjGw== + dependencies: + "@astrojs/compiler" "^2.3.4" + "@astrojs/internal-helpers" "0.2.1" + "@astrojs/markdown-remark" "4.0.1" + "@astrojs/telemetry" "3.0.4" + "@babel/core" "^7.23.3" + "@babel/generator" "^7.23.3" + "@babel/parser" "^7.23.3" + "@babel/plugin-transform-react-jsx" "^7.22.5" + "@babel/traverse" "^7.23.3" + "@babel/types" "^7.23.3" + "@types/babel__core" "^7.20.4" + acorn "^8.11.2" + boxen "^7.1.1" + chokidar "^3.5.3" + ci-info "^4.0.0" + clsx "^2.0.0" + common-ancestor-path "^1.0.1" + cookie "^0.6.0" + debug "^4.3.4" + deterministic-object-hash "^2.0.1" + devalue "^4.3.2" + diff "^5.1.0" + dlv "^1.1.3" + dset "^3.1.3" + es-module-lexer "^1.4.1" + esbuild "^0.19.6" + estree-walker "^3.0.3" + execa "^8.0.1" + fast-glob "^3.3.2" + flattie "^1.1.0" + github-slugger "^2.0.0" + gray-matter "^4.0.3" + html-escaper "^3.0.3" + http-cache-semantics "^4.1.1" + js-yaml "^4.1.0" + kleur "^4.1.4" + magic-string "^0.30.3" + mdast-util-to-hast "13.0.2" + mime "^3.0.0" + ora "^7.0.1" + p-limit "^5.0.0" + p-queue "^7.4.1" + path-to-regexp "^6.2.1" + preferred-pm "^3.1.2" + probe-image-size "^7.2.3" + prompts "^2.4.2" + rehype "^13.0.1" + resolve "^1.22.4" + semver "^7.5.4" + server-destroy "^1.0.1" + shikiji "^0.6.13" + string-width "^7.0.0" + strip-ansi "^7.1.0" + tsconfck "^3.0.0" + unist-util-visit "^5.0.0" + vfile "^6.0.1" + vite "^5.0.0" + vitefu "^0.2.5" + which-pm "^2.1.1" + yargs-parser "^21.1.1" + zod "^3.22.4" + optionalDependencies: + sharp "^0.32.5" + +b4a@^1.6.4: + version "1.6.4" + resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.6.4.tgz#ef1c1422cae5ce6535ec191baeed7567443f36c9" + integrity sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw== + +bail@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/bail/-/bail-2.0.2.tgz#d26f5cd8fe5d6f832a31517b9f7c356040ba6d5d" + integrity sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw== + +base-64@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/base-64/-/base-64-1.0.0.tgz#09d0f2084e32a3fd08c2475b973788eee6ae8f4a" + integrity sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg== + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bl@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +bl@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-5.1.0.tgz#183715f678c7188ecef9fe475d90209400624273" + integrity sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ== + dependencies: + buffer "^6.0.3" + inherits "^2.0.4" + readable-stream "^3.4.0" + +boxen@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-7.1.1.tgz#f9ba525413c2fec9cdb88987d835c4f7cad9c8f4" + integrity sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog== + dependencies: + ansi-align "^3.0.1" + camelcase "^7.0.1" + chalk "^5.2.0" + cli-boxes "^3.0.0" + string-width "^5.1.2" + type-fest "^2.13.0" + widest-line "^4.0.1" + wrap-ansi "^8.1.0" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browserslist@^4.22.2: + version "4.22.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.2.tgz#704c4943072bd81ea18997f3bd2180e89c77874b" + integrity sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A== + dependencies: + caniuse-lite "^1.0.30001565" + electron-to-chromium "^1.4.601" + node-releases "^2.0.14" + update-browserslist-db "^1.0.13" + +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + +camelcase@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-7.0.1.tgz#f02e50af9fd7782bc8b88a3558c32fd3a388f048" + integrity sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw== + +caniuse-lite@^1.0.30001565: + version "1.0.30001570" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001570.tgz#b4e5c1fa786f733ab78fc70f592df6b3f23244ca" + integrity sha512-+3e0ASu4sw1SWaoCtvPeyXp+5PsjigkSt8OXZbF9StH5pQWbxEjLAZE3n8Aup5udop1uRiKA7a4utUk/uoSpUw== + +ccount@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" + integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== + +chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^5.0.0, chalk@^5.2.0, chalk@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" + integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== + +character-entities-html4@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-2.1.0.tgz#1f1adb940c971a4b22ba39ddca6b618dc6e56b2b" + integrity sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA== + +character-entities-legacy@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz#76bc83a90738901d7bc223a9e93759fdd560125b" + integrity sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ== + +character-entities@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-2.0.2.tgz#2d09c2e72cd9523076ccb21157dff66ad43fcc22" + integrity sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ== + +chokidar@^3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +ci-info@^3.8.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== + +ci-info@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-4.0.0.tgz#65466f8b280fc019b9f50a5388115d17a63a44f2" + integrity sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg== + +cli-boxes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-3.0.0.tgz#71a10c716feeba005e4504f36329ef0b17cf3145" + integrity sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g== + +cli-cursor@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-4.0.0.tgz#3cecfe3734bf4fe02a8361cbdc0f6fe28c6a57ea" + integrity sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg== + dependencies: + restore-cursor "^4.0.0" + +cli-spinners@^2.9.0: + version "2.9.2" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" + integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== + +clsx@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.0.0.tgz#12658f3fd98fafe62075595a5c30e43d18f3d00b" + integrity sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q== + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@^1.0.0, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-string@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" + integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a" + integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A== + dependencies: + color-convert "^2.0.1" + color-string "^1.9.0" + +comma-separated-tokens@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" + integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== + +common-ancestor-path@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz#4f7d2d1394d91b7abdf51871c62f71eadb0182a7" + integrity sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w== + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +cookie@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" + integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== + +cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +debug@2: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^3.2.6: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.0.0, debug@^4.1.0, debug@^4.3.1, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +decode-named-character-reference@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz#daabac9690874c394c81e4162a0304b35d824f0e" + integrity sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg== + dependencies: + character-entities "^2.0.0" + +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +dequal@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== + +detect-libc@^2.0.0, detect-libc@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.2.tgz#8ccf2ba9315350e1241b88d0ac3b0e1fbd99605d" + integrity sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw== + +deterministic-object-hash@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/deterministic-object-hash/-/deterministic-object-hash-2.0.2.tgz#b251ddc801443905f0e9fef08816a46bc9fe3807" + integrity sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ== + dependencies: + base-64 "^1.0.0" + +devalue@^4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/devalue/-/devalue-4.3.2.tgz#cc44e4cf3872ac5a78229fbce3b77e57032727b5" + integrity sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg== + +devlop@^1.0.0, devlop@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/devlop/-/devlop-1.1.0.tgz#4db7c2ca4dc6e0e834c30be70c94bbc976dc7018" + integrity sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA== + dependencies: + dequal "^2.0.0" + +diff@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" + integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== + +dlv@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" + integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== + +dset@^3.1.2, dset@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/dset/-/dset-3.1.3.tgz#c194147f159841148e8e34ca41f638556d9542d2" + integrity sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ== + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + +electron-to-chromium@^1.4.601: + version "1.4.615" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.615.tgz#b1c41839962d2e4e63dca05519da9040e34848c2" + integrity sha512-/bKPPcgZVUziECqDc+0HkT87+0zhaWSZHNXqF8FLd2lQcptpmUFwoCSWjCdOng9Gdq+afKArPdEg/0ZW461Eng== + +emoji-regex@^10.2.1, emoji-regex@^10.3.0: + version "10.3.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.3.0.tgz#76998b9268409eb3dae3de989254d456e70cfe23" + integrity sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +end-of-stream@^1.1.0, end-of-stream@^1.4.1: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +entities@^4.4.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + +es-module-lexer@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.4.1.tgz#41ea21b43908fe6a287ffcbe4300f790555331f5" + integrity sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w== + +esbuild@^0.19.3, esbuild@^0.19.6: + version "0.19.10" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.10.tgz#55e83e4a6b702e3498b9f872d84bfb4ebcb6d16e" + integrity sha512-S1Y27QGt/snkNYrRcswgRFqZjaTG5a5xM3EQo97uNBnH505pdzSNe/HLBq1v0RO7iK/ngdbhJB6mDAp0OK+iUA== + optionalDependencies: + "@esbuild/aix-ppc64" "0.19.10" + "@esbuild/android-arm" "0.19.10" + "@esbuild/android-arm64" "0.19.10" + "@esbuild/android-x64" "0.19.10" + "@esbuild/darwin-arm64" "0.19.10" + "@esbuild/darwin-x64" "0.19.10" + "@esbuild/freebsd-arm64" "0.19.10" + "@esbuild/freebsd-x64" "0.19.10" + "@esbuild/linux-arm" "0.19.10" + "@esbuild/linux-arm64" "0.19.10" + "@esbuild/linux-ia32" "0.19.10" + "@esbuild/linux-loong64" "0.19.10" + "@esbuild/linux-mips64el" "0.19.10" + "@esbuild/linux-ppc64" "0.19.10" + "@esbuild/linux-riscv64" "0.19.10" + "@esbuild/linux-s390x" "0.19.10" + "@esbuild/linux-x64" "0.19.10" + "@esbuild/netbsd-x64" "0.19.10" + "@esbuild/openbsd-x64" "0.19.10" + "@esbuild/sunos-x64" "0.19.10" + "@esbuild/win32-arm64" "0.19.10" + "@esbuild/win32-ia32" "0.19.10" + "@esbuild/win32-x64" "0.19.10" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" + integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +estree-walker@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d" + integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== + dependencies: + "@types/estree" "^1.0.0" + +eventemitter3@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" + integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== + +execa@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" + integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^8.0.1" + human-signals "^5.0.0" + is-stream "^3.0.0" + merge-stream "^2.0.0" + npm-run-path "^5.1.0" + onetime "^6.0.0" + signal-exit "^4.1.0" + strip-final-newline "^3.0.0" + +expand-template@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" + integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== + dependencies: + is-extendable "^0.1.0" + +extend@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +fast-fifo@^1.1.0, fast-fifo@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" + integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== + +fast-glob@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fastq@^1.6.0: + version "1.16.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.16.0.tgz#83b9a9375692db77a822df081edb6a9cf6839320" + integrity sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA== + dependencies: + reusify "^1.0.4" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-up@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +find-yarn-workspace-root2@1.2.16: + version "1.2.16" + resolved "https://registry.yarnpkg.com/find-yarn-workspace-root2/-/find-yarn-workspace-root2-1.2.16.tgz#60287009dd2f324f59646bdb4b7610a6b301c2a9" + integrity sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA== + dependencies: + micromatch "^4.0.2" + pkg-dir "^4.2.0" + +flattie@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/flattie/-/flattie-1.1.0.tgz#1459504209f2001c478751b4e2fb69d6b1ee3241" + integrity sha512-xU99gDEnciIwJdGcBmNHnzTJ/w5AT+VFJOu6sTB6WM8diOYNA3Sa+K1DiEBQ7XH4QikQq3iFW1U+jRVcotQnBw== + +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + +fsevents@~2.3.2, fsevents@~2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-east-asian-width@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz#5e6ebd9baee6fb8b7b6bd505221065f0cd91f64e" + integrity sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA== + +get-stream@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" + integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== + +github-from-package@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" + integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== + +github-slugger@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-2.0.0.tgz#52cf2f9279a21eb6c59dd385b410f0c0adda8f1a" + integrity sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw== + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +graceful-fs@^4.1.5: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +gray-matter@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/gray-matter/-/gray-matter-4.0.3.tgz#e893c064825de73ea1f5f7d88c7a9f7274288798" + integrity sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q== + dependencies: + js-yaml "^3.13.1" + kind-of "^6.0.2" + section-matter "^1.0.0" + strip-bom-string "^1.0.0" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +hasown@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" + integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== + dependencies: + function-bind "^1.1.2" + +hast-util-from-html@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/hast-util-from-html/-/hast-util-from-html-2.0.1.tgz#9cd38ee81bf40b2607368b92a04b0905fa987488" + integrity sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g== + dependencies: + "@types/hast" "^3.0.0" + devlop "^1.1.0" + hast-util-from-parse5 "^8.0.0" + parse5 "^7.0.0" + vfile "^6.0.0" + vfile-message "^4.0.0" + +hast-util-from-parse5@^8.0.0: + version "8.0.1" + resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz#654a5676a41211e14ee80d1b1758c399a0327651" + integrity sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ== + dependencies: + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + devlop "^1.0.0" + hastscript "^8.0.0" + property-information "^6.0.0" + vfile "^6.0.0" + vfile-location "^5.0.0" + web-namespaces "^2.0.0" + +hast-util-parse-selector@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz#352879fa86e25616036037dd8931fb5f34cb4a27" + integrity sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A== + dependencies: + "@types/hast" "^3.0.0" + +hast-util-raw@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-9.0.1.tgz#2ba8510e4ed2a1e541cde2a4ebb5c38ab4c82c2d" + integrity sha512-5m1gmba658Q+lO5uqL5YNGQWeh1MYWZbZmWrM5lncdcuiXuo5E2HT/CIOp0rLF8ksfSwiCVJ3twlgVRyTGThGA== + dependencies: + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + "@ungap/structured-clone" "^1.0.0" + hast-util-from-parse5 "^8.0.0" + hast-util-to-parse5 "^8.0.0" + html-void-elements "^3.0.0" + mdast-util-to-hast "^13.0.0" + parse5 "^7.0.0" + unist-util-position "^5.0.0" + unist-util-visit "^5.0.0" + vfile "^6.0.0" + web-namespaces "^2.0.0" + zwitch "^2.0.0" + +hast-util-to-html@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/hast-util-to-html/-/hast-util-to-html-9.0.0.tgz#51c0ae2a3550b9aa988c094c4fc4e327af0dddd1" + integrity sha512-IVGhNgg7vANuUA2XKrT6sOIIPgaYZnmLx3l/CCOAK0PtgfoHrZwX7jCSYyFxHTrGmC6S9q8aQQekjp4JPZF+cw== + dependencies: + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + ccount "^2.0.0" + comma-separated-tokens "^2.0.0" + hast-util-raw "^9.0.0" + hast-util-whitespace "^3.0.0" + html-void-elements "^3.0.0" + mdast-util-to-hast "^13.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + stringify-entities "^4.0.0" + zwitch "^2.0.4" + +hast-util-to-parse5@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz#477cd42d278d4f036bc2ea58586130f6f39ee6ed" + integrity sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw== + dependencies: + "@types/hast" "^3.0.0" + comma-separated-tokens "^2.0.0" + devlop "^1.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + web-namespaces "^2.0.0" + zwitch "^2.0.0" + +hast-util-whitespace@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz#7778ed9d3c92dd9e8c5c8f648a49c21fc51cb621" + integrity sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw== + dependencies: + "@types/hast" "^3.0.0" + +hastscript@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-8.0.0.tgz#4ef795ec8dee867101b9f23cc830d4baf4fd781a" + integrity sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw== + dependencies: + "@types/hast" "^3.0.0" + comma-separated-tokens "^2.0.0" + hast-util-parse-selector "^4.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + +html-escaper@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-3.0.3.tgz#4d336674652beb1dcbc29ef6b6ba7f6be6fdfed6" + integrity sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ== + +html-void-elements@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-3.0.0.tgz#fc9dbd84af9e747249034d4d62602def6517f1d7" + integrity sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg== + +http-cache-semantics@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" + integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== + +human-signals@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" + integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== + +iconv-lite@^0.4.4: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ieee754@^1.1.13, ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +import-meta-resolve@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/import-meta-resolve/-/import-meta-resolve-4.0.0.tgz#0b1195915689f60ab00f830af0f15cc841e8919e" + integrity sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA== + +inherits@^2.0.3, inherits@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@~1.3.0: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-buffer@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== + +is-core-module@^2.13.0: + version "2.13.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== + dependencies: + hasown "^2.0.0" + +is-docker@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200" + integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== + +is-extendable@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-inside-container@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4" + integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== + dependencies: + is-docker "^3.0.0" + +is-interactive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-2.0.0.tgz#40c57614593826da1100ade6059778d597f16e90" + integrity sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ== + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-plain-obj@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" + integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== + +is-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" + integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== + +is-unicode-supported@^1.1.0, is-unicode-supported@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz#d824984b616c292a2e198207d4a609983842f714" + integrity sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ== + +is-wsl@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-3.1.0.tgz#e1c657e39c10090afcbedec61720f6b924c3cbd2" + integrity sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw== + dependencies: + is-inside-container "^1.0.0" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.0, js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +kleur@^4.1.4: + version "4.1.5" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" + integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== + +load-yaml-file@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/load-yaml-file/-/load-yaml-file-0.2.0.tgz#af854edaf2bea89346c07549122753c07372f64d" + integrity sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw== + dependencies: + graceful-fs "^4.1.5" + js-yaml "^3.13.0" + pify "^4.0.1" + strip-bom "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +log-symbols@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-5.1.0.tgz#a20e3b9a5f53fac6aeb8e2bb22c07cf2c8f16d93" + integrity sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA== + dependencies: + chalk "^5.0.0" + is-unicode-supported "^1.1.0" + +longest-streak@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-3.1.0.tgz#62fa67cd958742a1574af9f39866364102d90cd4" + integrity sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g== + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +magic-string@^0.30.3: + version "0.30.5" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.5.tgz#1994d980bd1c8835dc6e78db7cbd4ae4f24746f9" + integrity sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA== + dependencies: + "@jridgewell/sourcemap-codec" "^1.4.15" + +markdown-table@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-3.0.3.tgz#e6331d30e493127e031dd385488b5bd326e4a6bd" + integrity sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw== + +mdast-util-definitions@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-6.0.0.tgz#c1bb706e5e76bb93f9a09dd7af174002ae69ac24" + integrity sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ== + dependencies: + "@types/mdast" "^4.0.0" + "@types/unist" "^3.0.0" + unist-util-visit "^5.0.0" + +mdast-util-find-and-replace@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz#a6fc7b62f0994e973490e45262e4bc07607b04e0" + integrity sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA== + dependencies: + "@types/mdast" "^4.0.0" + escape-string-regexp "^5.0.0" + unist-util-is "^6.0.0" + unist-util-visit-parents "^6.0.0" + +mdast-util-from-markdown@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz#52f14815ec291ed061f2922fd14d6689c810cb88" + integrity sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA== + dependencies: + "@types/mdast" "^4.0.0" + "@types/unist" "^3.0.0" + decode-named-character-reference "^1.0.0" + devlop "^1.0.0" + mdast-util-to-string "^4.0.0" + micromark "^4.0.0" + micromark-util-decode-numeric-character-reference "^2.0.0" + micromark-util-decode-string "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + unist-util-stringify-position "^4.0.0" + +mdast-util-gfm-autolink-literal@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.0.tgz#5baf35407421310a08e68c15e5d8821e8898ba2a" + integrity sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg== + dependencies: + "@types/mdast" "^4.0.0" + ccount "^2.0.0" + devlop "^1.0.0" + mdast-util-find-and-replace "^3.0.0" + micromark-util-character "^2.0.0" + +mdast-util-gfm-footnote@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz#25a1753c7d16db8bfd53cd84fe50562bd1e6d6a9" + integrity sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ== + dependencies: + "@types/mdast" "^4.0.0" + devlop "^1.1.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + +mdast-util-gfm-strikethrough@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz#d44ef9e8ed283ac8c1165ab0d0dfd058c2764c16" + integrity sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-gfm-table@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz#7a435fb6223a72b0862b33afbd712b6dae878d38" + integrity sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg== + dependencies: + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + markdown-table "^3.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-gfm-task-list-item@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz#e68095d2f8a4303ef24094ab642e1047b991a936" + integrity sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ== + dependencies: + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-gfm@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz#3f2aecc879785c3cb6a81ff3a243dc11eca61095" + integrity sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw== + dependencies: + mdast-util-from-markdown "^2.0.0" + mdast-util-gfm-autolink-literal "^2.0.0" + mdast-util-gfm-footnote "^2.0.0" + mdast-util-gfm-strikethrough "^2.0.0" + mdast-util-gfm-table "^2.0.0" + mdast-util-gfm-task-list-item "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-phrasing@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-phrasing/-/mdast-util-phrasing-4.0.0.tgz#468cbbb277375523de807248b8ad969feb02a5c7" + integrity sha512-xadSsJayQIucJ9n053dfQwVu1kuXg7jCTdYsMK8rqzKZh52nLfSH/k0sAxE0u+pj/zKZX+o5wB+ML5mRayOxFA== + dependencies: + "@types/mdast" "^4.0.0" + unist-util-is "^6.0.0" + +mdast-util-to-hast@13.0.2, mdast-util-to-hast@^13.0.0: + version "13.0.2" + resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-13.0.2.tgz#74c0a9f014bb2340cae6118f6fccd75467792be7" + integrity sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og== + dependencies: + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + "@ungap/structured-clone" "^1.0.0" + devlop "^1.0.0" + micromark-util-sanitize-uri "^2.0.0" + trim-lines "^3.0.0" + unist-util-position "^5.0.0" + unist-util-visit "^5.0.0" + +mdast-util-to-markdown@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz#9813f1d6e0cdaac7c244ec8c6dabfdb2102ea2b4" + integrity sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ== + dependencies: + "@types/mdast" "^4.0.0" + "@types/unist" "^3.0.0" + longest-streak "^3.0.0" + mdast-util-phrasing "^4.0.0" + mdast-util-to-string "^4.0.0" + micromark-util-decode-string "^2.0.0" + unist-util-visit "^5.0.0" + zwitch "^2.0.0" + +mdast-util-to-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz#7a5121475556a04e7eddeb67b264aae79d312814" + integrity sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg== + dependencies: + "@types/mdast" "^4.0.0" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromark-core-commonmark@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz#50740201f0ee78c12a675bf3e68ffebc0bf931a3" + integrity sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA== + dependencies: + decode-named-character-reference "^1.0.0" + devlop "^1.0.0" + micromark-factory-destination "^2.0.0" + micromark-factory-label "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-factory-title "^2.0.0" + micromark-factory-whitespace "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-classify-character "^2.0.0" + micromark-util-html-tag-name "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-resolve-all "^2.0.0" + micromark-util-subtokenize "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-autolink-literal@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.0.0.tgz#f1e50b42e67d441528f39a67133eddde2bbabfd9" + integrity sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-sanitize-uri "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-footnote@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.0.0.tgz#91afad310065a94b636ab1e9dab2c60d1aab953c" + integrity sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg== + dependencies: + devlop "^1.0.0" + micromark-core-commonmark "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-sanitize-uri "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-strikethrough@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.0.0.tgz#6917db8e320da70e39ffbf97abdbff83e6783e61" + integrity sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw== + dependencies: + devlop "^1.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-classify-character "^2.0.0" + micromark-util-resolve-all "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-table@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.0.0.tgz#2cf3fe352d9e089b7ef5fff003bdfe0da29649b7" + integrity sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw== + dependencies: + devlop "^1.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-tagfilter@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz#f26d8a7807b5985fba13cf61465b58ca5ff7dc57" + integrity sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg== + dependencies: + micromark-util-types "^2.0.0" + +micromark-extension-gfm-task-list-item@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.0.1.tgz#ee8b208f1ced1eb9fb11c19a23666e59d86d4838" + integrity sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw== + dependencies: + devlop "^1.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz#3e13376ab95dd7a5cfd0e29560dfe999657b3c5b" + integrity sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w== + dependencies: + micromark-extension-gfm-autolink-literal "^2.0.0" + micromark-extension-gfm-footnote "^2.0.0" + micromark-extension-gfm-strikethrough "^2.0.0" + micromark-extension-gfm-table "^2.0.0" + micromark-extension-gfm-tagfilter "^2.0.0" + micromark-extension-gfm-task-list-item "^2.0.0" + micromark-util-combine-extensions "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-destination@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz#857c94debd2c873cba34e0445ab26b74f6a6ec07" + integrity sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-label@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz#17c5c2e66ce39ad6f4fc4cbf40d972f9096f726a" + integrity sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw== + dependencies: + devlop "^1.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-space@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz#5e7afd5929c23b96566d0e1ae018ae4fcf81d030" + integrity sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-title@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz#726140fc77892af524705d689e1cf06c8a83ea95" + integrity sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A== + dependencies: + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-whitespace@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz#9e92eb0f5468083381f923d9653632b3cfb5f763" + integrity sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA== + dependencies: + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-character@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-2.0.1.tgz#52b824c2e2633b6fb33399d2ec78ee2a90d6b298" + integrity sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw== + dependencies: + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-chunked@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz#e51f4db85fb203a79dbfef23fd41b2f03dc2ef89" + integrity sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg== + dependencies: + micromark-util-symbol "^2.0.0" + +micromark-util-classify-character@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz#8c7537c20d0750b12df31f86e976d1d951165f34" + integrity sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-combine-extensions@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz#75d6ab65c58b7403616db8d6b31315013bfb7ee5" + integrity sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ== + dependencies: + micromark-util-chunked "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-decode-numeric-character-reference@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz#2698bbb38f2a9ba6310e359f99fcb2b35a0d2bd5" + integrity sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ== + dependencies: + micromark-util-symbol "^2.0.0" + +micromark-util-decode-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz#7dfa3a63c45aecaa17824e656bcdb01f9737154a" + integrity sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA== + dependencies: + decode-named-character-reference "^1.0.0" + micromark-util-character "^2.0.0" + micromark-util-decode-numeric-character-reference "^2.0.0" + micromark-util-symbol "^2.0.0" + +micromark-util-encode@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz#0921ac7953dc3f1fd281e3d1932decfdb9382ab1" + integrity sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA== + +micromark-util-html-tag-name@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz#ae34b01cbe063363847670284c6255bb12138ec4" + integrity sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw== + +micromark-util-normalize-identifier@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz#91f9a4e65fe66cc80c53b35b0254ad67aa431d8b" + integrity sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w== + dependencies: + micromark-util-symbol "^2.0.0" + +micromark-util-resolve-all@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz#189656e7e1a53d0c86a38a652b284a252389f364" + integrity sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA== + dependencies: + micromark-util-types "^2.0.0" + +micromark-util-sanitize-uri@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz#ec8fbf0258e9e6d8f13d9e4770f9be64342673de" + integrity sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-encode "^2.0.0" + micromark-util-symbol "^2.0.0" + +micromark-util-subtokenize@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz#9f412442d77e0c5789ffdf42377fa8a2bcbdf581" + integrity sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg== + dependencies: + devlop "^1.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-symbol@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz#12225c8f95edf8b17254e47080ce0862d5db8044" + integrity sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw== + +micromark-util-types@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-2.0.0.tgz#63b4b7ffeb35d3ecf50d1ca20e68fc7caa36d95e" + integrity sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w== + +micromark@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/micromark/-/micromark-4.0.0.tgz#84746a249ebd904d9658cfabc1e8e5f32cbc6249" + integrity sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ== + dependencies: + "@types/debug" "^4.0.0" + debug "^4.0.0" + decode-named-character-reference "^1.0.0" + devlop "^1.0.0" + micromark-core-commonmark "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-combine-extensions "^2.0.0" + micromark-util-decode-numeric-character-reference "^2.0.0" + micromark-util-encode "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-resolve-all "^2.0.0" + micromark-util-sanitize-uri "^2.0.0" + micromark-util-subtokenize "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromatch@^4.0.2, micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mime@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-3.0.0.tgz#b374550dca3a0c18443b0c950a6a58f1931cf7a7" + integrity sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-fn@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" + integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== + +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + +minimist@^1.2.0, minimist@^1.2.3: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +nanoid@^3.3.7: + version "3.3.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + +napi-build-utils@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" + integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== + +needle@^2.5.2: + version "2.9.1" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.9.1.tgz#22d1dffbe3490c2b83e301f7709b6736cd8f2684" + integrity sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ== + dependencies: + debug "^3.2.6" + iconv-lite "^0.4.4" + sax "^1.2.4" + +nlcst-to-string@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/nlcst-to-string/-/nlcst-to-string-3.1.1.tgz#83b90f2e1ee2081e14701317efc26d3bbadc806e" + integrity sha512-63mVyqaqt0cmn2VcI2aH6kxe1rLAmSROqHMA0i4qqg1tidkfExgpb0FGMikMCn86mw5dFtBtEANfmSSK7TjNHw== + dependencies: + "@types/nlcst" "^1.0.0" + +node-abi@^3.3.0: + version "3.52.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.52.0.tgz#ffba0a85f54e552547e5849015f40f9514d5ba7c" + integrity sha512-JJ98b02z16ILv7859irtXn4oUaFWADtvkzy2c0IAatNVX2Mc9Yoh8z6hZInn3QwvMEYhHuQloYi+TTQy67SIdQ== + dependencies: + semver "^7.3.5" + +node-addon-api@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-6.1.0.tgz#ac8470034e58e67d0c6f1204a18ae6995d9c0d76" + integrity sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA== + +node-releases@^2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" + integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-path@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.1.0.tgz#bc62f7f3f6952d9894bd08944ba011a6ee7b7e00" + integrity sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q== + dependencies: + path-key "^4.0.0" + +once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +onetime@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" + integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== + dependencies: + mimic-fn "^4.0.0" + +ora@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/ora/-/ora-7.0.1.tgz#cdd530ecd865fe39e451a0e7697865669cb11930" + integrity sha512-0TUxTiFJWv+JnjWm4o9yvuskpEJLXTcng8MJuKd+SzAzp2o+OP3HWqNhB4OdJRt1Vsd9/mR0oyaEYlOnL7XIRw== + dependencies: + chalk "^5.3.0" + cli-cursor "^4.0.0" + cli-spinners "^2.9.0" + is-interactive "^2.0.0" + is-unicode-supported "^1.3.0" + log-symbols "^5.1.0" + stdin-discarder "^0.1.0" + string-width "^6.1.0" + strip-ansi "^7.1.0" + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-limit@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-5.0.0.tgz#6946d5b7140b649b7a33a027d89b4c625b3a5985" + integrity sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ== + dependencies: + yocto-queue "^1.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-queue@^7.4.1: + version "7.4.1" + resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-7.4.1.tgz#7f86f853048beca8272abdbb7cec1ed2afc0f265" + integrity sha512-vRpMXmIkYF2/1hLBKisKeVYJZ8S2tZ0zEAmIJgdVKP2nq0nh4qCdf8bgw+ZgKrkh71AOCaqzwbJJk1WtdcF3VA== + dependencies: + eventemitter3 "^5.0.1" + p-timeout "^5.0.2" + +p-timeout@^5.0.2: + version "5.1.0" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-5.1.0.tgz#b3c691cf4415138ce2d9cfe071dba11f0fee085b" + integrity sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew== + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +parse-latin@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/parse-latin/-/parse-latin-5.0.1.tgz#f3b4fac54d06f6a0501cf8b8ecfafa4cbb4f2f47" + integrity sha512-b/K8ExXaWC9t34kKeDV8kGXBkXZ1HCSAZRYE7HR14eA1GlXX5L8iWhs8USJNhQU9q5ci413jCKF0gOyovvyRBg== + dependencies: + nlcst-to-string "^3.0.0" + unist-util-modify-children "^3.0.0" + unist-util-visit-children "^2.0.0" + +parse5@^7.0.0: + version "7.1.2" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" + integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== + dependencies: + entities "^4.4.0" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-key@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" + integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-to-regexp@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.2.1.tgz#d54934d6798eb9e5ef14e7af7962c945906918e5" + integrity sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +postcss@^8.4.32: + version "8.4.32" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.32.tgz#1dac6ac51ab19adb21b8b34fd2d93a86440ef6c9" + integrity sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw== + dependencies: + nanoid "^3.3.7" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +prebuild-install@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.1.tgz#de97d5b34a70a0c81334fd24641f2a1702352e45" + integrity sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw== + dependencies: + detect-libc "^2.0.0" + expand-template "^2.0.3" + github-from-package "0.0.0" + minimist "^1.2.3" + mkdirp-classic "^0.5.3" + napi-build-utils "^1.0.1" + node-abi "^3.3.0" + pump "^3.0.0" + rc "^1.2.7" + simple-get "^4.0.0" + tar-fs "^2.0.0" + tunnel-agent "^0.6.0" + +preferred-pm@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/preferred-pm/-/preferred-pm-3.1.2.tgz#aedb70550734a574dffcbf2ce82642bd1753bdd6" + integrity sha512-nk7dKrcW8hfCZ4H6klWcdRknBOXWzNQByJ0oJyX97BOupsYD+FzLS4hflgEu/uPUEHZCuRfMxzCBsuWd7OzT8Q== + dependencies: + find-up "^5.0.0" + find-yarn-workspace-root2 "1.2.16" + path-exists "^4.0.0" + which-pm "2.0.0" + +prismjs@^1.29.0: + version "1.29.0" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.29.0.tgz#f113555a8fa9b57c35e637bba27509dcf802dd12" + integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q== + +probe-image-size@^7.2.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/probe-image-size/-/probe-image-size-7.2.3.tgz#d49c64be540ec8edea538f6f585f65a9b3ab4309" + integrity sha512-HubhG4Rb2UH8YtV4ba0Vp5bQ7L78RTONYu/ujmCu5nBI8wGv24s4E9xSKBi0N1MowRpxk76pFCpJtW0KPzOK0w== + dependencies: + lodash.merge "^4.6.2" + needle "^2.5.2" + stream-parser "~0.3.1" + +prompts@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +property-information@^6.0.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.4.0.tgz#6bc4c618b0c2d68b3bb8b552cbb97f8e300a0f82" + integrity sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ== + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +queue-tick@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/queue-tick/-/queue-tick-1.0.1.tgz#f6f07ac82c1fd60f82e098b417a80e52f1f4c142" + integrity sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag== + +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +readable-stream@^3.1.1, readable-stream@^3.4.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +rehype-parse@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/rehype-parse/-/rehype-parse-9.0.0.tgz#3949faeec6f466ec57774215661e0d75469195d9" + integrity sha512-WG7nfvmWWkCR++KEkZevZb/uw41E8TsH4DsY9UxsTbIXCVGbAs4S+r8FrQ+OtH5EEQAs+5UxKC42VinkmpA1Yw== + dependencies: + "@types/hast" "^3.0.0" + hast-util-from-html "^2.0.0" + unified "^11.0.0" + +rehype-raw@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/rehype-raw/-/rehype-raw-7.0.0.tgz#59d7348fd5dbef3807bbaa1d443efd2dd85ecee4" + integrity sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww== + dependencies: + "@types/hast" "^3.0.0" + hast-util-raw "^9.0.0" + vfile "^6.0.0" + +rehype-stringify@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/rehype-stringify/-/rehype-stringify-10.0.0.tgz#2031cf6fdd0355393706f0474ec794c75e5492f2" + integrity sha512-1TX1i048LooI9QoecrXy7nGFFbFSufxVRAfc6Y9YMRAi56l+oB0zP51mLSV312uRuvVLPV1opSlJmslozR1XHQ== + dependencies: + "@types/hast" "^3.0.0" + hast-util-to-html "^9.0.0" + unified "^11.0.0" + +rehype@^13.0.1: + version "13.0.1" + resolved "https://registry.yarnpkg.com/rehype/-/rehype-13.0.1.tgz#56384ba83955e2f3aa7eca1975b406c67d9dbd5e" + integrity sha512-AcSLS2mItY+0fYu9xKxOu1LhUZeBZZBx8//5HKzF+0XP+eP8+6a5MXn2+DW2kfXR6Dtp1FEXMVrjyKAcvcU8vg== + dependencies: + "@types/hast" "^3.0.0" + rehype-parse "^9.0.0" + rehype-stringify "^10.0.0" + unified "^11.0.0" + +remark-gfm@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/remark-gfm/-/remark-gfm-4.0.0.tgz#aea777f0744701aa288b67d28c43565c7e8c35de" + integrity sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-gfm "^3.0.0" + micromark-extension-gfm "^3.0.0" + remark-parse "^11.0.0" + remark-stringify "^11.0.0" + unified "^11.0.0" + +remark-parse@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-11.0.0.tgz#aa60743fcb37ebf6b069204eb4da304e40db45a1" + integrity sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-from-markdown "^2.0.0" + micromark-util-types "^2.0.0" + unified "^11.0.0" + +remark-rehype@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-11.0.0.tgz#7f21c08738bde024be5f16e4a8b13e5d7a04cf6b" + integrity sha512-vx8x2MDMcxuE4lBmQ46zYUDfcFMmvg80WYX+UNLeG6ixjdCCLcw1lrgAukwBTuOFsS78eoAedHGn9sNM0w7TPw== + dependencies: + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + mdast-util-to-hast "^13.0.0" + unified "^11.0.0" + vfile "^6.0.0" + +remark-smartypants@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/remark-smartypants/-/remark-smartypants-2.0.0.tgz#836cff43ec139b2e5ec9e488d80596ed677d1cb2" + integrity sha512-Rc0VDmr/yhnMQIz8n2ACYXlfw/P/XZev884QU1I5u+5DgJls32o97Vc1RbK3pfumLsJomS2yy8eT4Fxj/2MDVA== + dependencies: + retext "^8.1.0" + retext-smartypants "^5.1.0" + unist-util-visit "^4.1.0" + +remark-stringify@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-11.0.0.tgz#4c5b01dd711c269df1aaae11743eb7e2e7636fd3" + integrity sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-to-markdown "^2.0.0" + unified "^11.0.0" + +resolve@^1.22.4: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +restore-cursor@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-4.0.0.tgz#519560a4318975096def6e609d44100edaa4ccb9" + integrity sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +retext-latin@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/retext-latin/-/retext-latin-3.1.0.tgz#72b0176af2c69a373fd0d37eadd3924418bb3a89" + integrity sha512-5MrD1tuebzO8ppsja5eEu+ZbBeUNCjoEarn70tkXOS7Bdsdf6tNahsv2bY0Z8VooFF6cw7/6S+d3yI/TMlMVVQ== + dependencies: + "@types/nlcst" "^1.0.0" + parse-latin "^5.0.0" + unherit "^3.0.0" + unified "^10.0.0" + +retext-smartypants@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/retext-smartypants/-/retext-smartypants-5.2.0.tgz#da9cb79cc60f36aa33a20a462dfc663bec0068b4" + integrity sha512-Do8oM+SsjrbzT2UNIKgheP0hgUQTDDQYyZaIY3kfq0pdFzoPk+ZClYJ+OERNXveog4xf1pZL4PfRxNoVL7a/jw== + dependencies: + "@types/nlcst" "^1.0.0" + nlcst-to-string "^3.0.0" + unified "^10.0.0" + unist-util-visit "^4.0.0" + +retext-stringify@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/retext-stringify/-/retext-stringify-3.1.0.tgz#46ed45e077bfc4a8334977f6c2d6611e1d36263a" + integrity sha512-767TLOaoXFXyOnjx/EggXlb37ZD2u4P1n0GJqVdpipqACsQP+20W+BNpMYrlJkq7hxffnFk+jc6mAK9qrbuB8w== + dependencies: + "@types/nlcst" "^1.0.0" + nlcst-to-string "^3.0.0" + unified "^10.0.0" + +retext@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/retext/-/retext-8.1.0.tgz#c43437fb84cd46285ad240a9279142e239bada8d" + integrity sha512-N9/Kq7YTn6ZpzfiGW45WfEGJqFf1IM1q8OsRa1CGzIebCJBNCANDRmOrholiDRGKo/We7ofKR4SEvcGAWEMD3Q== + dependencies: + "@types/nlcst" "^1.0.0" + retext-latin "^3.0.0" + retext-stringify "^3.0.0" + unified "^10.0.0" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rollup@^4.2.0: + version "4.9.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.9.1.tgz#351d6c03e4e6bcd7a0339df3618d2aeeb108b507" + integrity sha512-pgPO9DWzLoW/vIhlSoDByCzcpX92bKEorbgXuZrqxByte3JFk2xSW2JEeAcyLc9Ru9pqcNNW+Ob7ntsk2oT/Xw== + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.9.1" + "@rollup/rollup-android-arm64" "4.9.1" + "@rollup/rollup-darwin-arm64" "4.9.1" + "@rollup/rollup-darwin-x64" "4.9.1" + "@rollup/rollup-linux-arm-gnueabihf" "4.9.1" + "@rollup/rollup-linux-arm64-gnu" "4.9.1" + "@rollup/rollup-linux-arm64-musl" "4.9.1" + "@rollup/rollup-linux-riscv64-gnu" "4.9.1" + "@rollup/rollup-linux-x64-gnu" "4.9.1" + "@rollup/rollup-linux-x64-musl" "4.9.1" + "@rollup/rollup-win32-arm64-msvc" "4.9.1" + "@rollup/rollup-win32-ia32-msvc" "4.9.1" + "@rollup/rollup-win32-x64-msvc" "4.9.1" + fsevents "~2.3.2" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-buffer@^5.0.1, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@^1.2.4: + version "1.3.0" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.3.0.tgz#a5dbe77db3be05c9d1ee7785dbd3ea9de51593d0" + integrity sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA== + +section-matter@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/section-matter/-/section-matter-1.0.0.tgz#e9041953506780ec01d59f292a19c7b850b84167" + integrity sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA== + dependencies: + extend-shallow "^2.0.1" + kind-of "^6.0.0" + +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.3.5, semver@^7.5.4: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +server-destroy@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/server-destroy/-/server-destroy-1.0.1.tgz#f13bf928e42b9c3e79383e61cc3998b5d14e6cdd" + integrity sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ== + +sharp@^0.32.5: + version "0.32.6" + resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.32.6.tgz#6ad30c0b7cd910df65d5f355f774aa4fce45732a" + integrity sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w== + dependencies: + color "^4.2.3" + detect-libc "^2.0.2" + node-addon-api "^6.1.0" + prebuild-install "^7.1.1" + semver "^7.5.4" + simple-get "^4.0.1" + tar-fs "^3.0.4" + tunnel-agent "^0.6.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shikiji@^0.6.13: + version "0.6.13" + resolved "https://registry.yarnpkg.com/shikiji/-/shikiji-0.6.13.tgz#c021bb8c2fabbc452bcf7e7030474cbe8fe3aadb" + integrity sha512-4T7X39csvhT0p7GDnq9vysWddf2b6BeioiN3Ymhnt3xcy9tXmDcnsEFVxX18Z4YcQgEE/w48dLJ4pPPUcG9KkA== + dependencies: + hast-util-to-html "^9.0.0" + +signal-exit@^3.0.2: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +signal-exit@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + +simple-concat@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" + integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== + +simple-get@^4.0.0, simple-get@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" + integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== + dependencies: + decompress-response "^6.0.0" + once "^1.3.1" + simple-concat "^1.0.0" + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== + dependencies: + is-arrayish "^0.3.1" + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +space-separated-tokens@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz#1ecd9d2350a3844572c3f4a312bceb018348859f" + integrity sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +stdin-discarder@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/stdin-discarder/-/stdin-discarder-0.1.0.tgz#22b3e400393a8e28ebf53f9958f3880622efde21" + integrity sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ== + dependencies: + bl "^5.0.0" + +stream-parser@~0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/stream-parser/-/stream-parser-0.3.1.tgz#1618548694420021a1182ff0af1911c129761773" + integrity sha512-bJ/HgKq41nlKvlhccD5kaCr/P+Hu0wPNKPJOH7en+YrJu/9EgqUF+88w5Jb6KNcjOFMhfX4B2asfeAtIGuHObQ== + dependencies: + debug "2" + +streamx@^2.15.0: + version "2.15.6" + resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.15.6.tgz#28bf36997ebc7bf6c08f9eba958735231b833887" + integrity sha512-q+vQL4AAz+FdfT137VF69Cc/APqUbxy+MDOImRrMvchJpigHj9GksgDU2LYbO9rx7RX6osWgxJB2WxhYv4SZAw== + dependencies: + fast-fifo "^1.1.0" + queue-tick "^1.0.1" + +string-width@^4.1.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +string-width@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-6.1.0.tgz#96488d6ed23f9ad5d82d13522af9e4c4c3fd7518" + integrity sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^10.2.1" + strip-ansi "^7.0.1" + +string-width@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-7.0.0.tgz#14aa1b7aaa126d5b64fa79d3c894da8a9650ba06" + integrity sha512-GPQHj7row82Hjo9hKZieKcHIhaAIKOJvFSIZXuCU9OASVZrMNUaZuz++SPVrBjnLsnk4k+z9f2EIypgxf2vNFw== + dependencies: + emoji-regex "^10.3.0" + get-east-asian-width "^1.0.0" + strip-ansi "^7.1.0" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +stringify-entities@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-4.0.3.tgz#cfabd7039d22ad30f3cc435b0ca2c1574fc88ef8" + integrity sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g== + dependencies: + character-entities-html4 "^2.0.0" + character-entities-legacy "^3.0.0" + +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.1, strip-ansi@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + +strip-bom-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92" + integrity sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g== + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-final-newline@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" + integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +tar-fs@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" + integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.1.4" + +tar-fs@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-3.0.4.tgz#a21dc60a2d5d9f55e0089ccd78124f1d3771dbbf" + integrity sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w== + dependencies: + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^3.1.5" + +tar-stream@^2.1.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + +tar-stream@^3.1.5: + version "3.1.6" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-3.1.6.tgz#6520607b55a06f4a2e2e04db360ba7d338cc5bab" + integrity sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg== + dependencies: + b4a "^1.6.4" + fast-fifo "^1.2.0" + streamx "^2.15.0" + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +trim-lines@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" + integrity sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== + +trough@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/trough/-/trough-2.1.0.tgz#0f7b511a4fde65a46f18477ab38849b22c554876" + integrity sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g== + +tsconfck@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/tsconfck/-/tsconfck-3.0.0.tgz#b469f1ced12973bbec3209a55ed8de3bb04223c9" + integrity sha512-w3wnsIrJNi7avf4Zb0VjOoodoO0woEqGgZGQm+LHH9przdUI+XDKsWAXwxHA1DaRTjeuZNcregSzr7RaA8zG9A== + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== + dependencies: + safe-buffer "^5.0.1" + +type-fest@^2.13.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" + integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== + +unherit@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/unherit/-/unherit-3.0.1.tgz#65b98bb7cb58cee755d7ec699a49e9e8ff172e23" + integrity sha512-akOOQ/Yln8a2sgcLj4U0Jmx0R5jpIg2IUyRrWOzmEbjBtGzBdHtSeFKgoEcoH4KYIG/Pb8GQ/BwtYm0GCq1Sqg== + +unified@^10.0.0: + version "10.1.2" + resolved "https://registry.yarnpkg.com/unified/-/unified-10.1.2.tgz#b1d64e55dafe1f0b98bb6c719881103ecf6c86df" + integrity sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q== + dependencies: + "@types/unist" "^2.0.0" + bail "^2.0.0" + extend "^3.0.0" + is-buffer "^2.0.0" + is-plain-obj "^4.0.0" + trough "^2.0.0" + vfile "^5.0.0" + +unified@^11.0.0, unified@^11.0.4: + version "11.0.4" + resolved "https://registry.yarnpkg.com/unified/-/unified-11.0.4.tgz#f4be0ac0fe4c88cb873687c07c64c49ed5969015" + integrity sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ== + dependencies: + "@types/unist" "^3.0.0" + bail "^2.0.0" + devlop "^1.0.0" + extend "^3.0.0" + is-plain-obj "^4.0.0" + trough "^2.0.0" + vfile "^6.0.0" + +unist-util-is@^5.0.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-5.2.1.tgz#b74960e145c18dcb6226bc57933597f5486deae9" + integrity sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw== + dependencies: + "@types/unist" "^2.0.0" + +unist-util-is@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-6.0.0.tgz#b775956486aff107a9ded971d996c173374be424" + integrity sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-modify-children@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/unist-util-modify-children/-/unist-util-modify-children-3.1.1.tgz#c4018b86441aa3b54b3edff1151d0aa062384c82" + integrity sha512-yXi4Lm+TG5VG+qvokP6tpnk+r1EPwyYL04JWDxLvgvPV40jANh7nm3udk65OOWquvbMDe+PL9+LmkxDpTv/7BA== + dependencies: + "@types/unist" "^2.0.0" + array-iterate "^2.0.0" + +unist-util-position@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-5.0.0.tgz#678f20ab5ca1207a97d7ea8a388373c9cf896be4" + integrity sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-stringify-position@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz#03ad3348210c2d930772d64b489580c13a7db39d" + integrity sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg== + dependencies: + "@types/unist" "^2.0.0" + +unist-util-stringify-position@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz#449c6e21a880e0855bf5aabadeb3a740314abac2" + integrity sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-visit-children@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/unist-util-visit-children/-/unist-util-visit-children-2.0.2.tgz#0f00a5caff567074568da2d89c54b5ee4a8c5440" + integrity sha512-+LWpMFqyUwLGpsQxpumsQ9o9DG2VGLFrpz+rpVXYIEdPy57GSy5HioC0g3bg/8WP9oCLlapQtklOzQ8uLS496Q== + dependencies: + "@types/unist" "^2.0.0" + +unist-util-visit-parents@^5.1.1: + version "5.1.3" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz#b4520811b0ca34285633785045df7a8d6776cfeb" + integrity sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^5.0.0" + +unist-util-visit-parents@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz#4d5f85755c3b8f0dc69e21eca5d6d82d22162815" + integrity sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw== + dependencies: + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" + +unist-util-visit@^4.0.0, unist-util-visit@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-4.1.2.tgz#125a42d1eb876283715a3cb5cceaa531828c72e2" + integrity sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^5.0.0" + unist-util-visit-parents "^5.1.1" + +unist-util-visit@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-5.0.0.tgz#a7de1f31f72ffd3519ea71814cccf5fd6a9217d6" + integrity sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg== + dependencies: + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" + unist-util-visit-parents "^6.0.0" + +update-browserslist-db@^1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" + integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +util-deprecate@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +vfile-location@^5.0.0: + version "5.0.2" + resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-5.0.2.tgz#220d9ca1ab6f8b2504a4db398f7ebc149f9cb464" + integrity sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg== + dependencies: + "@types/unist" "^3.0.0" + vfile "^6.0.0" + +vfile-message@^3.0.0: + version "3.1.4" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-3.1.4.tgz#15a50816ae7d7c2d1fa87090a7f9f96612b59dea" + integrity sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw== + dependencies: + "@types/unist" "^2.0.0" + unist-util-stringify-position "^3.0.0" + +vfile-message@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-4.0.2.tgz#c883c9f677c72c166362fd635f21fc165a7d1181" + integrity sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw== + dependencies: + "@types/unist" "^3.0.0" + unist-util-stringify-position "^4.0.0" + +vfile@^5.0.0: + version "5.3.7" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-5.3.7.tgz#de0677e6683e3380fafc46544cfe603118826ab7" + integrity sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g== + dependencies: + "@types/unist" "^2.0.0" + is-buffer "^2.0.0" + unist-util-stringify-position "^3.0.0" + vfile-message "^3.0.0" + +vfile@^6.0.0, vfile@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-6.0.1.tgz#1e8327f41eac91947d4fe9d237a2dd9209762536" + integrity sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw== + dependencies: + "@types/unist" "^3.0.0" + unist-util-stringify-position "^4.0.0" + vfile-message "^4.0.0" + +vite@^5.0.0: + version "5.0.10" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.0.10.tgz#1e13ef5c3cf5aa4eed81f5df6d107b3c3f1f6356" + integrity sha512-2P8J7WWgmc355HUMlFrwofacvr98DAjoE52BfdbwQtyLH06XKwaL/FMnmKM2crF0iX4MpmMKoDlNCB1ok7zHCw== + dependencies: + esbuild "^0.19.3" + postcss "^8.4.32" + rollup "^4.2.0" + optionalDependencies: + fsevents "~2.3.3" + +vitefu@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/vitefu/-/vitefu-0.2.5.tgz#c1b93c377fbdd3e5ddd69840ea3aa70b40d90969" + integrity sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q== + +web-namespaces@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-2.0.1.tgz#1010ff7c650eccb2592cebeeaf9a1b253fd40692" + integrity sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ== + +which-pm-runs@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.1.0.tgz#35ccf7b1a0fce87bd8b92a478c9d045785d3bf35" + integrity sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA== + +which-pm@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-pm/-/which-pm-2.0.0.tgz#8245609ecfe64bf751d0eef2f376d83bf1ddb7ae" + integrity sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w== + dependencies: + load-yaml-file "^0.2.0" + path-exists "^4.0.0" + +which-pm@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/which-pm/-/which-pm-2.1.1.tgz#0be2b70c67e94a32e87b9768a94a7f0954f2dcfa" + integrity sha512-xzzxNw2wMaoCWXiGE8IJ9wuPMU+EYhFksjHxrRT8kMT5SnocBPRg69YAMtyV4D12fP582RA+k3P8H9J5EMdIxQ== + dependencies: + load-yaml-file "^0.2.0" + path-exists "^4.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +widest-line@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-4.0.1.tgz#a0fc673aaba1ea6f0a0d35b3c2795c9a9cc2ebf2" + integrity sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig== + dependencies: + string-width "^5.0.1" + +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +yocto-queue@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" + integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== + +zod@^3.22.4: + version "3.22.4" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.22.4.tgz#f31c3a9386f61b1f228af56faa9255e845cf3fff" + integrity sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg== + +zwitch@^2.0.0, zwitch@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.4.tgz#c827d4b0acb76fc3e685a4c6ec2902d51070e9d7" + integrity sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A== From 4cf6b599b0c85d88e255080d89560ef71920f46e Mon Sep 17 00:00:00 2001 From: GDWR Date: Wed, 20 Dec 2023 15:10:32 +0000 Subject: [PATCH 03/36] Recreate homepage --- astro.config.mjs | 6 +- build.py | 24 - build.sh | 4 - build_artifacts.sh | 26 - css/large-font.css | 3 - css/medium-font.css | 3 - css/normalize.css | 349 -- css/printing.css | 155 - css/small-font.css | 3 - css/style.css | 898 ---- css/style.light.css | 870 ---- css/style_home.css | 1001 ----- docs/assets/.keep | 1 - docs/assets/big-font.min.css | 1 - docs/assets/large-font.min.css | 1 - docs/assets/medium-font.min.css | 1 - docs/assets/normalize.min.css | 1 - docs/assets/printing.min.css | 1 - docs/assets/script_home.js | 83 - docs/assets/small-font.min.css | 1 - docs/assets/style.light.min.css | 1 - docs/assets/style.min.css | 1 - docs/assets/style_home.min.css | 1 - docs/blog.html | 1 - docs/demos.html | 1120 ----- docs/documentation.html | 412 -- docs/images_home/apple-touch-icon.png | Bin 15465 -> 0 bytes docs/images_home/counter_app.gif | Bin 91865 -> 0 bytes docs/images_home/factorial.gif | Bin 123961 -> 0 bytes docs/images_home/favicon-16x16.png | Bin 1261 -> 0 bytes docs/images_home/favicon-32x32.png | Bin 2186 -> 0 bytes docs/images_home/safari-pinned-tab.svg | 49 - docs/images_home/site.webmanifest | 19 - docs/index.html | 415 -- docs/library-docs.html | 3625 ----------------- docs/safari-pinned-tab.svg | 49 - docs/site.webmanifest | 19 - docs/tutorials.html | 118 - docs/yama.html | 470 --- downloadable_artifacts/.keep | 1 - package.json | 7 +- {docs => public}/android-chrome-192x192.png | Bin {docs => public}/android-chrome-384x384.png | Bin {docs => public}/apple-touch-icon.png | Bin {docs => public}/browserconfig.xml | 0 .../drawings}/Yaksha-Imports.drawio | 0 .../drawings}/Yaksha-RT.drawio | 0 {docs => public}/favicon-16x16.png | Bin {docs => public}/favicon-32x32.png | Bin {docs => public}/favicon.ico | Bin public/favicon.svg | 9 - .../imgs}/carpntr_tool_run.gif | Bin .../imgs}/code_scroll_yaksha.gif | Bin .../imgs}/typing_code_yaksha.gif | Bin .../images_home => public/imgs}/wind_tree.gif | Bin .../imgs}/yaksha_logo.png | Bin .../imgs/yk-banner1.png | Bin .../imgs/yk-banner2.png | Bin {docs/images => public/imgs}/yk-imports.png | Bin {docs/images => public/imgs}/yk-rt.png | Bin {docs/images => public/imgs}/yk-sample1.png | Bin {docs/images => public/imgs}/yk-sample2.gif | Bin {docs => public}/mstile-150x150.png | Bin .../static_demos/gui/gui_window.html | 0 .../static_demos/gui/gui_window.js | 0 .../static_demos/gui/gui_window.wasm | Bin .../static_demos/gui/gui_window.yaka | 0 .../static_demos/notes_wasm4/notes.html | 0 .../static_demos/notes_wasm4/notes.wasm | Bin .../static_demos/notes_wasm4/notes.yaka | 0 .../static_demos/snake_wasm4/snake.html | 0 .../static_demos/snake_wasm4/snake_w4.wasm | Bin .../static_demos/snake_wasm4/snake_w4.yaka | 0 .../static_demos/space_blast/space_blast.data | Bin .../static_demos/space_blast/space_blast.html | 0 .../static_demos/space_blast/space_blast.js | 0 .../static_demos/space_blast/space_blast.wasm | Bin .../static_demos/space_blast/space_blast.yaka | 0 .../static_demos/tree/wind_tree.html | 0 .../static_demos/tree/wind_tree.js | 0 .../static_demos/tree/wind_tree.wasm | Bin run.sh | 3 - server.cmd | 1 - server.sh | 2 - src/components/Footer.astro | 26 + src/components/NavBar.astro | 55 + src/env.d.ts | 1 + src/layouts/Layout.astro | 40 +- src/pages/index.astro | 178 +- tailwind.config.mjs | 26 + yarn.lock | 343 +- 91 files changed, 521 insertions(+), 9903 deletions(-) delete mode 100644 build.py delete mode 100755 build.sh delete mode 100755 build_artifacts.sh delete mode 100644 css/large-font.css delete mode 100644 css/medium-font.css delete mode 100644 css/normalize.css delete mode 100644 css/printing.css delete mode 100644 css/small-font.css delete mode 100644 css/style.css delete mode 100644 css/style.light.css delete mode 100644 css/style_home.css delete mode 100644 docs/assets/.keep delete mode 100644 docs/assets/big-font.min.css delete mode 100644 docs/assets/large-font.min.css delete mode 100644 docs/assets/medium-font.min.css delete mode 100644 docs/assets/normalize.min.css delete mode 100644 docs/assets/printing.min.css delete mode 100644 docs/assets/script_home.js delete mode 100644 docs/assets/small-font.min.css delete mode 100644 docs/assets/style.light.min.css delete mode 100644 docs/assets/style.min.css delete mode 100644 docs/assets/style_home.min.css delete mode 100644 docs/blog.html delete mode 100644 docs/demos.html delete mode 100644 docs/documentation.html delete mode 100644 docs/images_home/apple-touch-icon.png delete mode 100644 docs/images_home/counter_app.gif delete mode 100644 docs/images_home/factorial.gif delete mode 100644 docs/images_home/favicon-16x16.png delete mode 100644 docs/images_home/favicon-32x32.png delete mode 100644 docs/images_home/safari-pinned-tab.svg delete mode 100644 docs/images_home/site.webmanifest delete mode 100644 docs/index.html delete mode 100644 docs/library-docs.html delete mode 100644 docs/safari-pinned-tab.svg delete mode 100644 docs/site.webmanifest delete mode 100644 docs/tutorials.html delete mode 100644 docs/yama.html delete mode 100644 downloadable_artifacts/.keep rename {docs => public}/android-chrome-192x192.png (100%) rename {docs => public}/android-chrome-384x384.png (100%) rename {docs => public}/apple-touch-icon.png (100%) rename {docs => public}/browserconfig.xml (100%) rename {other-sources => public/drawings}/Yaksha-Imports.drawio (100%) rename {other-sources => public/drawings}/Yaksha-RT.drawio (100%) rename {docs => public}/favicon-16x16.png (100%) rename {docs => public}/favicon-32x32.png (100%) rename {docs => public}/favicon.ico (100%) delete mode 100644 public/favicon.svg rename {docs/images_home => public/imgs}/carpntr_tool_run.gif (100%) rename {docs/images_home => public/imgs}/code_scroll_yaksha.gif (100%) rename {docs/images_home => public/imgs}/typing_code_yaksha.gif (100%) rename {docs/images_home => public/imgs}/wind_tree.gif (100%) rename {docs/images_home => public/imgs}/yaksha_logo.png (100%) rename docs/images_home/yk-banner.png => public/imgs/yk-banner1.png (100%) rename docs/images/yk-banner.png => public/imgs/yk-banner2.png (100%) rename {docs/images => public/imgs}/yk-imports.png (100%) rename {docs/images => public/imgs}/yk-rt.png (100%) rename {docs/images => public/imgs}/yk-sample1.png (100%) rename {docs/images => public/imgs}/yk-sample2.gif (100%) rename {docs => public}/mstile-150x150.png (100%) rename {docs => public}/static_demos/gui/gui_window.html (100%) rename {docs => public}/static_demos/gui/gui_window.js (100%) rename {docs => public}/static_demos/gui/gui_window.wasm (100%) rename {docs => public}/static_demos/gui/gui_window.yaka (100%) rename {docs => public}/static_demos/notes_wasm4/notes.html (100%) rename {docs => public}/static_demos/notes_wasm4/notes.wasm (100%) rename {docs => public}/static_demos/notes_wasm4/notes.yaka (100%) rename {docs => public}/static_demos/snake_wasm4/snake.html (100%) rename {docs => public}/static_demos/snake_wasm4/snake_w4.wasm (100%) rename {docs => public}/static_demos/snake_wasm4/snake_w4.yaka (100%) rename {docs => public}/static_demos/space_blast/space_blast.data (100%) rename {docs => public}/static_demos/space_blast/space_blast.html (100%) rename {docs => public}/static_demos/space_blast/space_blast.js (100%) rename {docs => public}/static_demos/space_blast/space_blast.wasm (100%) rename {docs => public}/static_demos/space_blast/space_blast.yaka (100%) rename {docs => public}/static_demos/tree/wind_tree.html (100%) rename {docs => public}/static_demos/tree/wind_tree.js (100%) rename {docs => public}/static_demos/tree/wind_tree.wasm (100%) delete mode 100755 run.sh delete mode 100644 server.cmd delete mode 100755 server.sh create mode 100644 src/components/Footer.astro create mode 100644 src/components/NavBar.astro create mode 100644 tailwind.config.mjs diff --git a/astro.config.mjs b/astro.config.mjs index 882e651..461bd30 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -1,4 +1,8 @@ import { defineConfig } from 'astro/config'; +import tailwind from "@astrojs/tailwind"; + // https://astro.build/config -export default defineConfig({}); +export default defineConfig({ + integrations: [tailwind()] +}); \ No newline at end of file diff --git a/build.py b/build.py deleted file mode 100644 index 6438657..0000000 --- a/build.py +++ /dev/null @@ -1,24 +0,0 @@ -import os.path -import subprocess - -from docbox_generator import docbox - - -def main(): - path = os.path.abspath(".") - subprocess.run("css-minify -d ./css/ -o ./docs/assets", shell=True) - docbox.conv(["--all-headers-in-toc", "--input", "yaksha_lib_docs", "-o", "docs/library-docs.html", "--title", - "Yaksha Programming Language"], root=path) - docbox.conv(["--all-headers-in-toc", "--input", "yaksha_docs", "-o", "docs/documentation.html", "--title", - "Yaksha Programming Language"], root=path) - docbox.conv(["--md", "--input", "yaksha_tutorials", "-o", "docs/tutorials.html", "--title", - "Yaksha Programming Language"], root=path) - docbox.conv(["--md", "--no-number", "--input", "yaksha_proposals", "-o", "docs/yama.html", "--title", - "Yaksha Programming Language"], root=path) - docbox.conv(["--md", "--no-number", "--input", "yaksha_blog", "-o", "docs/blog.html", "--title", - "Yaksha Programming Language"], root=path) - docbox.conv(["--all-headers-in-toc", "--no-number", "--input", "yaksha_demos", "-o", "docs/demos.html", "--title", - "Yaksha Programming Language"], root=path) -if __name__ == "__main__": - os.chdir(os.path.dirname(os.path.abspath(__file__))) - main() diff --git a/build.sh b/build.sh deleted file mode 100755 index 323ffcf..0000000 --- a/build.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env bash -python build.py -./build_artifacts.sh -./server.sh diff --git a/build_artifacts.sh b/build_artifacts.sh deleted file mode 100755 index a218f6f..0000000 --- a/build_artifacts.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env bash - -realpath() { - [[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}" -} - -cd pdf-builder -docker build -t pdf-builder . - -export DOCS=$(realpath "../docs") - -echo "docs path is $DOCS" - -docker run -v "$DOCS:/workspace" --rm -it pdf-builder --url http://localhost/documentation.html --pdf "yaksha-documentation-$(date +%Y-%m-%d).pdf" -docker run -v "$DOCS:/workspace" --rm -it pdf-builder --url http://localhost/library-docs.html --pdf "yaksha-library-docs-$(date +%Y-%m-%d).pdf" -docker run -v "$DOCS:/workspace" --rm -it pdf-builder --url http://localhost/tutorials.html --pdf "yaksha-tutorials-$(date +%Y-%m-%d).pdf" -docker run -v "$DOCS:/workspace" --rm -it pdf-builder --url http://localhost/yama.html --pdf "yaksha-yama-$(date +%Y-%m-%d).pdf" -docker run -v "$DOCS:/workspace" --rm -it pdf-builder --url http://localhost/blog.html --pdf "yaksha-blog-$(date +%Y-%m-%d).pdf" - -cd .. -rm -f downloadable_artifacts/*.pdf -rm -f downloadable_artifacts/*.zip -mv -f docs/*.pdf downloadable_artifacts/ -cp LICENSE docs/LICENSE -zip -r "downloadable_artifacts/yaksha-docs-html-$(date +%Y-%m-%d).zip" docs -rm -f docs/LICENSE \ No newline at end of file diff --git a/css/large-font.css b/css/large-font.css deleted file mode 100644 index bf07d86..0000000 --- a/css/large-font.css +++ /dev/null @@ -1,3 +0,0 @@ -body { - font-size: 2.0vw; -} \ No newline at end of file diff --git a/css/medium-font.css b/css/medium-font.css deleted file mode 100644 index b75fb06..0000000 --- a/css/medium-font.css +++ /dev/null @@ -1,3 +0,0 @@ -body { - font-size: 1.4vw; -} \ No newline at end of file diff --git a/css/normalize.css b/css/normalize.css deleted file mode 100644 index 192eb9c..0000000 --- a/css/normalize.css +++ /dev/null @@ -1,349 +0,0 @@ -/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ - -/* Document - ========================================================================== */ - -/** - * 1. Correct the line height in all browsers. - * 2. Prevent adjustments of font size after orientation changes in iOS. - */ - -html { - line-height: 1.15; /* 1 */ - -webkit-text-size-adjust: 100%; /* 2 */ -} - -/* Sections - ========================================================================== */ - -/** - * Remove the margin in all browsers. - */ - -body { - margin: 0; -} - -/** - * Render the `main` element consistently in IE. - */ - -main { - display: block; -} - -/** - * Correct the font size and margin on `h1` elements within `section` and - * `article` contexts in Chrome, Firefox, and Safari. - */ - -h1 { - font-size: 2em; - margin: 0.67em 0; -} - -/* Grouping content - ========================================================================== */ - -/** - * 1. Add the correct box sizing in Firefox. - * 2. Show the overflow in Edge and IE. - */ - -hr { - box-sizing: content-box; /* 1 */ - height: 0; /* 1 */ - overflow: visible; /* 2 */ -} - -/** - * 1. Correct the inheritance and scaling of font size in all browsers. - * 2. Correct the odd `em` font sizing in all browsers. - */ - -pre { - font-family: monospace, monospace; /* 1 */ - font-size: 1em; /* 2 */ -} - -/* Text-level semantics - ========================================================================== */ - -/** - * Remove the gray background on active links in IE 10. - */ - -a { - background-color: transparent; -} - -/** - * 1. Remove the bottom border in Chrome 57- - * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. - */ - -abbr[title] { - border-bottom: none; /* 1 */ - text-decoration: underline; /* 2 */ - text-decoration: underline dotted; /* 2 */ -} - -/** - * Add the correct font weight in Chrome, Edge, and Safari. - */ - -b, -strong { - font-weight: bolder; -} - -/** - * 1. Correct the inheritance and scaling of font size in all browsers. - * 2. Correct the odd `em` font sizing in all browsers. - */ - -code, -kbd, -samp { - font-family: monospace, monospace; /* 1 */ - font-size: 1em; /* 2 */ -} - -/** - * Add the correct font size in all browsers. - */ - -small { - font-size: 80%; -} - -/** - * Prevent `sub` and `sup` elements from affecting the line height in - * all browsers. - */ - -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sub { - bottom: -0.25em; -} - -sup { - top: -0.5em; -} - -/* Embedded content - ========================================================================== */ - -/** - * Remove the border on images inside links in IE 10. - */ - -img { - border-style: none; -} - -/* Forms - ========================================================================== */ - -/** - * 1. Change the font styles in all browsers. - * 2. Remove the margin in Firefox and Safari. - */ - -button, -input, -optgroup, -select, -textarea { - font-family: inherit; /* 1 */ - font-size: 100%; /* 1 */ - line-height: 1.15; /* 1 */ - margin: 0; /* 2 */ -} - -/** - * Show the overflow in IE. - * 1. Show the overflow in Edge. - */ - -button, -input { /* 1 */ - overflow: visible; -} - -/** - * Remove the inheritance of text transform in Edge, Firefox, and IE. - * 1. Remove the inheritance of text transform in Firefox. - */ - -button, -select { /* 1 */ - text-transform: none; -} - -/** - * Correct the inability to style clickable types in iOS and Safari. - */ - -button, -[type="button"], -[type="reset"], -[type="submit"] { - -webkit-appearance: button; -} - -/** - * Remove the inner border and padding in Firefox. - */ - -button::-moz-focus-inner, -[type="button"]::-moz-focus-inner, -[type="reset"]::-moz-focus-inner, -[type="submit"]::-moz-focus-inner { - border-style: none; - padding: 0; -} - -/** - * Restore the focus styles unset by the previous rule. - */ - -button:-moz-focusring, -[type="button"]:-moz-focusring, -[type="reset"]:-moz-focusring, -[type="submit"]:-moz-focusring { - outline: 1px dotted ButtonText; -} - -/** - * Correct the padding in Firefox. - */ - -fieldset { - padding: 0.35em 0.75em 0.625em; -} - -/** - * 1. Correct the text wrapping in Edge and IE. - * 2. Correct the color inheritance from `fieldset` elements in IE. - * 3. Remove the padding so developers are not caught out when they zero out - * `fieldset` elements in all browsers. - */ - -legend { - box-sizing: border-box; /* 1 */ - color: inherit; /* 2 */ - display: table; /* 1 */ - max-width: 100%; /* 1 */ - padding: 0; /* 3 */ - white-space: normal; /* 1 */ -} - -/** - * Add the correct vertical alignment in Chrome, Firefox, and Opera. - */ - -progress { - vertical-align: baseline; -} - -/** - * Remove the default vertical scrollbar in IE 10+. - */ - -textarea { - overflow: auto; -} - -/** - * 1. Add the correct box sizing in IE 10. - * 2. Remove the padding in IE 10. - */ - -[type="checkbox"], -[type="radio"] { - box-sizing: border-box; /* 1 */ - padding: 0; /* 2 */ -} - -/** - * Correct the cursor style of increment and decrement buttons in Chrome. - */ - -[type="number"]::-webkit-inner-spin-button, -[type="number"]::-webkit-outer-spin-button { - height: auto; -} - -/** - * 1. Correct the odd appearance in Chrome and Safari. - * 2. Correct the outline style in Safari. - */ - -[type="search"] { - -webkit-appearance: textfield; /* 1 */ - outline-offset: -2px; /* 2 */ -} - -/** - * Remove the inner padding in Chrome and Safari on macOS. - */ - -[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} - -/** - * 1. Correct the inability to style clickable types in iOS and Safari. - * 2. Change font properties to `inherit` in Safari. - */ - -::-webkit-file-upload-button { - -webkit-appearance: button; /* 1 */ - font: inherit; /* 2 */ -} - -/* Interactive - ========================================================================== */ - -/* - * Add the correct display in Edge, IE 10+, and Firefox. - */ - -details { - display: block; -} - -/* - * Add the correct display in all browsers. - */ - -summary { - display: list-item; -} - -/* Misc - ========================================================================== */ - -/** - * Add the correct display in IE 10+. - */ - -template { - display: none; -} - -/** - * Add the correct display in IE 10. - */ - -[hidden] { - display: none; -} diff --git a/css/printing.css b/css/printing.css deleted file mode 100644 index 37ca329..0000000 --- a/css/printing.css +++ /dev/null @@ -1,155 +0,0 @@ -body { - margin-left: 1em; - -webkit-print-color-adjust: exact !important; - print-color-adjust: exact !important; - font-family: 'Roboto Mono', monospace !important; -} - -#yaksha-logo { - display: block; - width: 100%; -} - -nav, -button, -#pages-text-toc, -.banner-image, -summary { - display: none !important; -} - -.table-of-contents { - background-color: transparent !important; -} - -img, -svg { - display: table !important; - max-width: 100% !important; -} - -ul { - display: table; - break-inside: avoid !important; -} - -div.boxes::after { - content: "Copyright (c) Bhathiya Perera"; - display: block; - text-align: center; - font-size: 1.3em; -} - -.container, -.boxes, -.box, -.content, -.note { - display: table; -} - -.content { - display: table; - page-break-inside: avoid; - break-inside: avoid; -} - -code { - font-family: 'Source Code Pro', monospace !important; - border: 1px solid transparent; - color: rgb(11, 89, 64); - background-color: transparent; - font-weight: bold; -} - -ul { - margin-left: 1.45em; -} - -ul > li { - margin-left: 0.2em; -} - -.highlight, -pre { - font-family: 'Source Code Pro', monospace !important; - page-break-inside: avoid; - break-inside: avoid; - border: 2px solid transparent; - background-color: transparent !important; -} - -h1 { - break-before: always; - font-family: 'Roboto', monospace !important; - line-height: 2.3em !important; -} - -h2, -h3, -h3, -h4, -h5, -h6 { - break-before: auto; - font-family: 'Roboto', monospace !important; - line-height: 2.1em !important; -} - -table td { - page-break-inside: avoid; - break-inside: avoid; -} - -.note { - padding: 0 0.1em; - width: calc(100% - 2.5em); - margin-left: 1em !important; - float: none; -} - -.content { - padding: 0 0.1em; - width: calc(100% - 2.5em) -} - -.boxes { - width: 100% -} - -.table-of-contents { - width: 100%; - position: relative; - padding-left: 0.3em; - margin-top: -2em; - overflow: visible -} - -.table-of-contents .real-toc { - display: table; - width: 100%; -} - -.yellow-status { - display: table; - page-break-inside: avoid; - break-inside: avoid; -} - -.green-status { - display: table; - page-break-inside: avoid; - break-inside: avoid; -} - -.red-status { - display: table; - page-break-inside: avoid; - break-inside: avoid; -} - -.blue-status { - display: table; - page-break-inside: avoid; - break-inside: avoid; -} \ No newline at end of file diff --git a/css/small-font.css b/css/small-font.css deleted file mode 100644 index 813e097..0000000 --- a/css/small-font.css +++ /dev/null @@ -1,3 +0,0 @@ -body { - font-size: 0.6vw; -} \ No newline at end of file diff --git a/css/style.css b/css/style.css deleted file mode 100644 index 1cae919..0000000 --- a/css/style.css +++ /dev/null @@ -1,898 +0,0 @@ -* { - margin: 0; - padding: 0; -} - -body { - font-family: Roboto Mono, monospace; -} - -.toc-item { - display: block; - width: calc(100% - 10px); - overflow: hidden; - margin-bottom: 0.3em; -} - -.toc-item a { - text-decoration: none; -} - -.timestamp { - font-size: 0.6em; - color: #98e372; -} - -a:link { - color: #13e15d -} - -a:visited { - color: #bb82ff -} - -a:hover { - color: #30cef3; - font-weight: bold -} - -/* From https://codepen.io/AllThingsSmitty/pen/MyqmdM */ -table { - border: 0.1em solid #14ea61; - border-collapse: collapse; - margin: 0; - padding: 0; - width: 100%; - table-layout: fixed; -} - -table caption { - font-size: 0.9em; - margin: .5em 0 .75em; -} - -table tr { - background-color: #1c1a1a; - border: 0.1em solid #14ea61; - padding: .35em; -} - -table td:nth-child(odd), table th:nth-child(odd) { - background-color: #3d3939; -} - -table th, -table td { - padding: .625em; - text-align: center; -} - -table th { - font-size: .85em; - letter-spacing: .1em; - text-transform: uppercase; -} - -@media screen and (max-width: 600px) { - table { - border: 0; - } - - table caption { - font-size: 0.9em; - } - - table thead { - border: none; - clip: rect(0 0 0 0); - height: 1px; - margin: -1px; - overflow: hidden; - padding: 0; - position: absolute; - width: 1px; - } - - table tr { - border-bottom: 3px solid #ddd; - display: block; - margin-bottom: .625em; - } - - table td { - border-bottom: 1px solid #ddd; - display: block; - font-size: .8em; - text-align: right; - } - - table td::before { - /* - * aria-label has no advantage, it won't be read inside a table - content: attr(aria-label); - */ - content: attr(data-label); - float: left; - font-weight: bold; - text-transform: uppercase; - } - - table td:last-child { - border-bottom: 0; - } -} - -h1, h2, h3, h4, h5, h6, .highlight { - margin-bottom: 0.5em; - margin-top: 0.5em; - font-family: Ubuntu, sans-serif !important; - color: #33d0de; -} - -h1 { - font-size: 2.3em; -} - -h2 { - font-size: 1.9em; -} - -h3 { - font-size: 1.8em; -} - -h4 { - font-size: 1.7em; -} - -h5 { - font-size: 1.6em; -} - -h6 { - font-size: 1.5em; -} - -.highlight { - padding: 4px; -} - -/* Based on https://www.w3schools.com/css/css3_buttons.asp */ -.button { - background-color: #4CAF50; /* Green */ - border: none; - color: white; - text-align: center; - text-decoration: none; - display: inline-block; - margin: 4px 2px; - transition-duration: 0.4s; - cursor: pointer; -} - -.action-button { - background-color: #078f7b; - color: white; - border: 2px solid #078f7b -} - -.action-button:hover { - background-color: white; - color: black; - border: 2px solid #078f7b -} - -a.read-more { - display: inline-block; - border: 1px dashed #144e4a; - color: #063632; - padding: 0 5px; - margin: auto 2px; - font-size: .8em; - text-decoration: none -} - -a.read-more:hover { - border: 1px dashed #665117; - background: #3b351b; - color: #e9b82c -} - -ul { - margin-left: 2em; -} - -ul > li { - margin-left: 1em -} - -body, html { - background-color: #2b2b2b; - color: #ffffff; - line-height: 1.45em; - width: 100% -} - -.table-of-contents { - font-size: .7em; - line-height: 1.3em; - width: 20%; - overflow-y: auto; - position: fixed; - padding-left: 0.3em; - top: 2em; - bottom: 0 -} - -.container { - width: 100%; - display: inline-block; - height: 100% -} - -.boxes { - width: 80%; - float: right; - display: inline-block -} - -.box { - display: inline-block; - width: calc(100% - 0.4em); - padding: 0.2em; - overflow-wrap: anywhere -} - -.content { - width: calc(70% - 2.5em); - padding: 0 1em; - display: inline-block; - float: left; - overflow: wrap; - overflow-wrap: anywhere -} - -.note { - display: inline-block; - width: calc(30% - 0.5em); - padding-left: 0.5em; - float: right; - font-size: .7em -} - -.box::after { - content: ""; - clear: both; - display: table -} - -code { - border: 0.05em dashed #eeeeee; - background: #10423c; - padding-left: 0.1em; - margin-top: 0.6em; -} - -.highlight { - border: 0.1em dashed #1eff00; - background-color: #000 -} - -pre { - white-space: pre-wrap; - white-space: -moz-pre-wrap; - white-space: -pre-wrap; - white-space: -o-pre-wrap; - word-wrap: break-word -} - -hr { - border: none; - border-top: 0.1em solid transparent; - margin-bottom: 1.5em -} - -.center-text { - margin-bottom: 2em; - margin-top: 2em; - text-align: center -} - -/* https://codepen.io/tbugai/pen/DBNBdm */ - - -.yellow-status:before { - background-color: #FFC182; - border-color: #FFB161; - box-shadow: 0 0 0.4em 0.1em #FFC182; - content: ' '; - display: inline-block; - width: 0.7em; - height: 0.7em; - margin-right: 1em; - border-width: 0.1em; - border-style: solid; - border-radius: 0.7em; -} - -.yellow-status { - display: inline-block; - border: 0.1em solid #FFC182; - color: #FFC182; - padding: 0 0.5em; - margin: auto 0.2em; - font-size: .8em; - border-radius: 0.7em; - font-weight: bold; -} - -.green-status:before { - background-color: #94E185; - border-color: #78D965; - box-shadow: 0 0 0.4em 0.1em #94E185; - content: ' '; - display: inline-block; - width: 0.7em; - height: 0.7em; - margin-right: 1em; - border-width: 0.1em; - border-style: solid; - border-radius: 0.7em; -} - -.green-status { - display: inline-block; - border: 0.1em solid #94E185; - color: #94E185; - padding: 0 0.5em; - margin: auto 0.2em; - font-size: .8em; - border-radius: 0.7em; - font-weight: bold; -} - -.red-status:before { - background-color: #C9404D; - border-color: #C42C3B; - box-shadow: 0 0 0.4em 0.1em #C9404D; - content: ' '; - display: inline-block; - width: 0.7em; - height: 0.7em; - margin-right: 1em; - border-width: 0.1em; - border-style: solid; - border-radius: 0.7em; -} - -.red-status { - display: inline-block; - border: 0.1em solid #C9404D; - color: #C9404D; - padding: 0 0.5em; - margin: auto 0.2em; - font-size: .8em; - border-radius: 0.7em; - font-weight: bold; -} - -.blue-status:before { - background-color: #40c4c9; - border-color: #2cb7c4; - box-shadow: 0 0 0.4em 0.1em #40c9c9; - content: ' '; - display: inline-block; - width: 0.7em; - height: 0.7em; - margin-right: 1em; - border-width: 0.1em; - border-style: solid; - border-radius: 0.7em; -} - -.blue-status { - display: inline-block; - border: 0.1em solid #40c9c9; - color: #40c9c9; - padding: 0 0.5em; - margin: auto 0.2em; - font-size: .8em; - border-radius: 0.7em; - font-weight: bold; -} - - -@media (max-width: 800px) { - body, html { - font-size: 1em; - line-height: 1.2em - } - - .note { - padding: 0 0.1em; - width: calc(100% - 2.5em) - } - - .content { - padding: 0 0.1em; - width: calc(100% - 2.5em) - } - - .boxes { - width: 100% - } - - .table-of-contents { - width: 100%; - position: sticky; - top: 0; - background: #defbff; - padding-left: 0.3em; - overflow: hidden - } - - .table-of-contents .real-toc { - display: none - } -} - -.highlight { - font-family: 'Source Code Pro', monospace !important; - font-size: 0.8em; -} - -pre { - line-height: 125%; - font-family: 'Source Code Pro', monospace !important; -} - -td.linenos .normal { - color: inherit; - background-color: transparent; - padding-left: 0.5em; - padding-right: 0.5em; -} - -span.linenos { - color: inherit; - background-color: transparent; - padding-left: 0.5em; - padding-right: 0.5em; -} - -td.linenos .special { - color: #000000; - background-color: #ffffc0; - padding-left: 0.5em; - padding-right: 0.5em; -} - -span.linenos.special { - color: #000000; - background-color: #ffffc0; - padding-left: 0.5em; - padding-right: 0.5em; -} - -.highlight .hll { - background-color: #0000ff -} - -.highlight { - background: #000000; - color: #dddddd -} - -.highlight .c { - color: #00ff00 -} - -/* Comment */ -.highlight .err { - color: #dddddd -} - -/* Error */ -.highlight .esc { - color: #dddddd -} - -/* Escape */ -.highlight .g { - color: #dddddd -} - -/* Generic */ -.highlight .k { - color: #ff0000 -} - -/* Keyword */ -.highlight .l { - color: #dddddd -} - -/* Literal */ -.highlight .n { - color: #dddddd -} - -/* Name */ -.highlight .o { - color: #dddddd -} - -/* Operator */ -.highlight .x { - color: #dddddd -} - -/* Other */ -.highlight .p { - color: #dddddd -} - -/* Punctuation */ -.highlight .ch { - color: #00ff00 -} - -/* Comment.Hashbang */ -.highlight .cm { - color: #00ff00 -} - -/* Comment.Multiline */ -.highlight .cp { - color: #e5e5e5 -} - -/* Comment.Preproc */ -.highlight .cpf { - color: #00ff00 -} - -/* Comment.PreprocFile */ -.highlight .c1 { - color: #00ff00 -} - -/* Comment.Single */ -.highlight .cs { - color: #00ff00 -} - -/* Comment.Special */ -.highlight .gd { - color: #dddddd -} - -/* Generic.Deleted */ -.highlight .ge { - color: #dddddd -} - -/* Generic.Emph */ -.highlight .ges { - color: #dddddd -} - -/* Generic.EmphStrong */ -.highlight .gr { - color: #dddddd -} - -/* Generic.Error */ -.highlight .gh { - color: #dddddd -} - -/* Generic.Heading */ -.highlight .gi { - color: #dddddd -} - -/* Generic.Inserted */ -.highlight .go { - color: #dddddd -} - -/* Generic.Output */ -.highlight .gp { - color: #dddddd -} - -/* Generic.Prompt */ -.highlight .gs { - color: #dddddd -} - -/* Generic.Strong */ -.highlight .gu { - color: #dddddd -} - -/* Generic.Subheading */ -.highlight .gt { - color: #dddddd -} - -/* Generic.Traceback */ -.highlight .kc { - color: #ff0000 -} - -/* Keyword.Constant */ -.highlight .kd { - color: #ff0000 -} - -/* Keyword.Declaration */ -.highlight .kn { - color: #ff0000 -} - -/* Keyword.Namespace */ -.highlight .kp { - color: #ff0000 -} - -/* Keyword.Pseudo */ -.highlight .kr { - color: #ff0000 -} - -/* Keyword.Reserved */ -.highlight .kt { - color: #ee82ee -} - -/* Keyword.Type */ -.highlight .ld { - color: #dddddd -} - -/* Literal.Date */ -.highlight .m { - color: #dddddd -} - -/* Literal.Number */ -.highlight .s { - color: #87ceeb -} - -/* Literal.String */ -.highlight .na { - color: #dddddd -} - -/* Name.Attribute */ -.highlight .nb { - color: #dddddd -} - -/* Name.Builtin */ -.highlight .nc { - color: #dddddd -} - -/* Name.Class */ -.highlight .no { - color: #7fffd4 -} - -/* Name.Constant */ -.highlight .nd { - color: #dddddd -} - -/* Name.Decorator */ -.highlight .ni { - color: #dddddd -} - -/* Name.Entity */ -.highlight .ne { - color: #dddddd -} - -/* Name.Exception */ -.highlight .nf { - color: #ffff00 -} - -/* Name.Function */ -.highlight .nl { - color: #dddddd -} - -/* Name.Label */ -.highlight .nn { - color: #dddddd -} - -/* Name.Namespace */ -.highlight .nx { - color: #dddddd -} - -/* Name.Other */ -.highlight .py { - color: #dddddd -} - -/* Name.Property */ -.highlight .nt { - color: #dddddd -} - -/* Name.Tag */ -.highlight .nv { - color: #eedd82 -} - -/* Name.Variable */ -.highlight .ow { - color: #dddddd -} - -/* Operator.Word */ -.highlight .pm { - color: #dddddd -} - -/* Punctuation.Marker */ -.highlight .w { - color: #dddddd -} - -/* Text.Whitespace */ -.highlight .mb { - color: #dddddd -} - -/* Literal.Number.Bin */ -.highlight .mf { - color: #dddddd -} - -/* Literal.Number.Float */ -.highlight .mh { - color: #dddddd -} - -/* Literal.Number.Hex */ -.highlight .mi { - color: #dddddd -} - -/* Literal.Number.Integer */ -.highlight .mo { - color: #dddddd -} - -/* Literal.Number.Oct */ -.highlight .sa { - color: #87ceeb -} - -/* Literal.String.Affix */ -.highlight .sb { - color: #87ceeb -} - -/* Literal.String.Backtick */ -.highlight .sc { - color: #87ceeb -} - -/* Literal.String.Char */ -.highlight .dl { - color: #87ceeb -} - -/* Literal.String.Delimiter */ -.highlight .sd { - color: #87ceeb -} - -/* Literal.String.Doc */ -.highlight .s2 { - color: #87ceeb -} - -/* Literal.String.Double */ -.highlight .se { - color: #87ceeb -} - -/* Literal.String.Escape */ -.highlight .sh { - color: #87ceeb -} - -/* Literal.String.Heredoc */ -.highlight .si { - color: #87ceeb -} - -/* Literal.String.Interpol */ -.highlight .sx { - color: #87ceeb -} - -/* Literal.String.Other */ -.highlight .sr { - color: #87ceeb -} - -/* Literal.String.Regex */ -.highlight .s1 { - color: #87ceeb -} - -/* Literal.String.Single */ -.highlight .ss { - color: #87ceeb -} - -/* Literal.String.Symbol */ -.highlight .bp { - color: #dddddd -} - -/* Name.Builtin.Pseudo */ -.highlight .fm { - color: #ffff00 -} - -/* Name.Function.Magic */ -.highlight .vc { - color: #eedd82 -} - -/* Name.Variable.Class */ -.highlight .vg { - color: #eedd82 -} - -/* Name.Variable.Global */ -.highlight .vi { - color: #eedd82 -} - -/* Name.Variable.Instance */ -.highlight .vm { - color: #eedd82 -} - -/* Name.Variable.Magic */ -.highlight .il { - color: #dddddd -} - -/* Literal.Number.Integer.Long */ - - -h1 { - line-height: 1.9em; -} - -h2, -h3, -h3, -h4, -h5, -h6 { - line-height: 1.6em; -} - -ul { - margin-left: 1.3em; -} - -ul > li { - margin-left: 0.15em; -} - diff --git a/css/style.light.css b/css/style.light.css deleted file mode 100644 index ae29a0a..0000000 --- a/css/style.light.css +++ /dev/null @@ -1,870 +0,0 @@ -* { - margin: 0; - padding: 0; -} - -body { - font-family: Roboto Mono, monospace; -} - -.toc-item { - display: block; - width: calc(100% - 10px); - overflow: hidden; - margin-bottom: 0.3em; -} - -.toc-item a { - text-decoration: none; -} - -.timestamp { - font-size: 0.6em; - color: #636363; -} - -a:link { - color: #0b722d -} - -a:visited { - color: #33046c -} - -a:hover { - color: #00a0c3; - font-weight: bold -} - -/* From https://codepen.io/AllThingsSmitty/pen/MyqmdM */ -table { - border: 0.1em solid #ccc; - border-collapse: collapse; - margin: 0; - padding: 0; - width: 100%; - table-layout: fixed; -} - -table caption { - font-size: 0.9em; - margin: .5em 0 .75em; -} - -table tr { - background-color: #f8f8f8; - border: 0.1em solid #ddd; - padding: .35em; -} - -table td:nth-child(odd), table th:nth-child(odd) { - background-color: #eeeeee; -} - -table th, -table td { - padding: .625em; - text-align: center; -} - -table th { - font-size: .85em; - letter-spacing: .1em; - text-transform: uppercase; -} - -@media screen and (max-width: 600px) { - table { - border: 0; - } - - table caption { - font-size: 0.9em; - } - - table thead { - border: none; - clip: rect(0 0 0 0); - height: 1px; - margin: -1px; - overflow: hidden; - padding: 0; - position: absolute; - width: 1px; - } - - table tr { - border-bottom: 3px solid #ddd; - display: block; - margin-bottom: .625em; - } - - table td { - border-bottom: 1px solid #ddd; - display: block; - font-size: .8em; - text-align: right; - } - - table td::before { - /* - * aria-label has no advantage, it won't be read inside a table - content: attr(aria-label); - */ - content: attr(data-label); - float: left; - font-weight: bold; - text-transform: uppercase; - } - - table td:last-child { - border-bottom: 0; - } -} - -h1, h2, h3, h4, h5, h6, .highlight { - margin-bottom: 0.5em; - margin-top: 0.5em; - font-family: Ubuntu, sans-serif !important; - color: #064146; -} - -h1 { - font-size: 2.3em; -} - -h2 { - font-size: 1.9em; -} - -h3 { - font-size: 1.8em; -} - -h4 { - font-size: 1.7em; -} - -h5 { - font-size: 1.6em; -} - -h6 { - font-size: 1.5em; -} - -.highlight { - padding: 4px; -} - -/* Based on https://www.w3schools.com/css/css3_buttons.asp */ -.button { - background-color: #4CAF50; /* Green */ - border: none; - color: white; - text-align: center; - text-decoration: none; - display: inline-block; - margin: 4px 2px; - transition-duration: 0.4s; - cursor: pointer; -} - -.action-button { - background-color: #078f7b; - color: white; - border: 2px solid #078f7b -} - -.action-button:hover { - background-color: white; - color: black; - border: 2px solid #078f7b -} - -a.read-more { - display: inline-block; - border: 1px dashed #144e4a; - color: #063632; - padding: 0 5px; - margin: auto 2px; - font-size: .8em; - text-decoration: none -} - -a.read-more:hover { - border: 1px dashed #665117; - background: #3b351b; - color: #e9b82c -} - -ul { - margin-left: 2em; -} - -ul > li { - margin-left: 1em -} - -body, html { - background-color: #ffffff; - color: #2b2b2b; - line-height: 1.45em; - width: 100% -} - -.table-of-contents { - font-size: .7em; - line-height: 1.3em; - width: 20%; - overflow-y: auto; - position: fixed; - padding-left: 0.3em; - top: 2em; - bottom: 0 -} - -.container { - width: 100%; - display: inline-block; - height: 100% -} - -.boxes { - width: 80%; - float: right; - display: inline-block -} - -.box { - display: inline-block; - width: calc(100% - 0.4em); - padding: 0.2em; - overflow-wrap: anywhere -} - -.content { - width: calc(70% - 2.5em); - padding: 0 1em; - display: inline-block; - float: left; - overflow: wrap; - overflow-wrap: anywhere -} - -.note { - display: inline-block; - width: calc(30% - 0.5em); - padding-left: 0.5em; - float: right; - font-size: .7em -} - -.box::after { - content: ""; - clear: both; - display: table -} - -code { - border: 0.05em dashed #10423c; - background: #eeeeee; - padding-left: 0.1em; - margin-top: 0.6em; -} - -.highlight { - border: 0.1em dashed gray; - background-color: #000 -} - -pre { - white-space: pre-wrap; - white-space: -moz-pre-wrap; - white-space: -pre-wrap; - white-space: -o-pre-wrap; - word-wrap: break-word -} - -hr { - border: none; - border-top: 0.1em solid transparent; - margin-bottom: 1.5em -} - -.center-text { - margin-bottom: 2em; - margin-top: 2em; - text-align: center -} - -/* https://codepen.io/tbugai/pen/DBNBdm */ - - -.yellow-status:before { - background-color: #FFC182; - border-color: #FFB161; - box-shadow: 0 0 0.4em 0.1em #FFC182; - content: ' '; - display: inline-block; - width: 0.7em; - height: 0.7em; - margin-right: 1em; - border-width: 0.1em; - border-style: solid; - border-radius: 0.7em; -} - -.yellow-status { - display: inline-block; - border: 0.1em solid #7a542c; - color: #7a542c; - padding: 0 0.5em; - margin: auto 0.2em; - font-size: .8em; - border-radius: 0.7em; - font-weight: bold; -} - -.green-status:before { - background-color: #94E185; - border-color: #78D965; - box-shadow: 0 0 0.4em 0.1em #94E185; - content: ' '; - display: inline-block; - width: 0.7em; - height: 0.7em; - margin-right: 1em; - border-width: 0.1em; - border-style: solid; - border-radius: 0.7em; -} - -.green-status { - display: inline-block; - border: 0.1em solid #48833e; - color: #48833e; - padding: 0 0.5em; - margin: auto 0.2em; - font-size: .8em; - border-radius: 0.7em; - font-weight: bold; -} - -.red-status:before { - background-color: #C9404D; - border-color: #C42C3B; - box-shadow: 0 0 0.4em 0.1em #C9404D; - content: ' '; - display: inline-block; - width: 0.7em; - height: 0.7em; - margin-right: 1em; - border-width: 0.1em; - border-style: solid; - border-radius: 0.7em; -} - -.red-status { - display: inline-block; - border: 0.1em solid #7a1d27; - color: #7a1d27; - padding: 0 0.5em; - margin: auto 0.2em; - font-size: .8em; - border-radius: 0.7em; - font-weight: bold; -} - -.blue-status:before { - background-color: #40c4c9; - border-color: #2cb7c4; - box-shadow: 0 0 0.4em 0.1em #40c9c9; - content: ' '; - display: inline-block; - width: 0.7em; - height: 0.7em; - margin-right: 1em; - border-width: 0.1em; - border-style: solid; - border-radius: 0.7em; -} - -.blue-status { - display: inline-block; - border: 0.1em solid #1b727c; - color: #1b727c; - padding: 0 0.5em; - margin: auto 0.2em; - font-size: .8em; - border-radius: 0.7em; - font-weight: bold; -} - - -@media (max-width: 800px) { - body, html { - font-size: 1em; - line-height: 1.2em - } - - .note { - padding: 0 0.1em; - width: calc(100% - 2.5em) - } - - .content { - padding: 0 0.1em; - width: calc(100% - 2.5em) - } - - .boxes { - width: 100% - } - - .table-of-contents { - width: 100%; - position: sticky; - top: 0; - background: #defbff; - padding-left: 0.3em; - overflow: hidden - } - - .table-of-contents .real-toc { - display: none - } -} - -.highlight { - font-family: 'Source Code Pro', monospace !important; - font-size: 0.8em; -} - -pre { - line-height: 125%; - font-family: 'Source Code Pro', monospace !important; -} - -td.linenos .normal { - color: inherit; - background-color: transparent; - padding-left: 0.5em; - padding-right: 0.5em; -} - -span.linenos { - color: inherit; - background-color: transparent; - padding-left: 0.5em; - padding-right: 0.5em; -} - -td.linenos .special { - color: #000000; - background-color: #ffffc0; - padding-left: 0.5em; - padding-right: 0.5em; -} - -span.linenos.special { - color: #000000; - background-color: #ffffc0; - padding-left: 0.5em; - padding-right: 0.5em; -} - -.highlight .hll { - background-color: #ffffcc -} - -.highlight { - background: #f8f8f8; -} - -.highlight .c { - color: #3D7B7B; - font-weight: bold -} - -/* Comment */ -.highlight .err { - /*border: 1px solid #FF0000*/ -} - -/* Error */ -.highlight .k { - color: #008000; - font-weight: bold -} - -/* Keyword */ -.highlight .o { - color: #666666 -} - -/* Operator */ -.highlight .ch { - color: #3D7B7B; - font-style: italic -} - -/* Comment.Hashbang */ -.highlight .cm { - color: #3D7B7B; - font-style: italic -} - -/* Comment.Multiline */ -.highlight .cp { - color: #9C6500 -} - -/* Comment.Preproc */ -.highlight .cpf { - color: #3D7B7B; - font-weight: bold -} - -/* Comment.PreprocFile */ -.highlight .c1 { - color: #3D7B7B; - font-weight: bold -} - -/* Comment.Single */ -.highlight .cs { - color: #3D7B7B; - font-weight: bold -} - -/* Comment.Special */ -.highlight .gd { - color: #A00000 -} - -/* Generic.Deleted */ -.highlight .ge { - font-style: italic -} - -/* Generic.Emph */ -.highlight .ges { - font-weight: bold; -} - -/* Generic.EmphStrong */ -.highlight .gr { - color: #E40000 -} - -/* Generic.Error */ -.highlight .gh { - color: #000080; - font-weight: bold -} - -/* Generic.Heading */ -.highlight .gi { - color: #008400 -} - -/* Generic.Inserted */ -.highlight .go { - color: #717171 -} - -/* Generic.Output */ -.highlight .gp { - color: #000080; - font-weight: bold -} - -/* Generic.Prompt */ -.highlight .gs { - font-weight: bold -} - -/* Generic.Strong */ -.highlight .gu { - color: #800080; - font-weight: bold -} - -/* Generic.Subheading */ -.highlight .gt { - color: #0044DD -} - -/* Generic.Traceback */ -.highlight .kc { - color: #008000; - font-weight: bold -} - -/* Keyword.Constant */ -.highlight .kd { - color: #008000; - font-weight: bold -} - -/* Keyword.Declaration */ -.highlight .kn { - color: #008000; - font-weight: bold -} - -/* Keyword.Namespace */ -.highlight .kp { - color: #008000 -} - -/* Keyword.Pseudo */ -.highlight .kr { - color: #008000; - font-weight: bold -} - -/* Keyword.Reserved */ -.highlight .kt { - color: #B00040 -} - -/* Keyword.Type */ -.highlight .m { - color: #666666 -} - -/* Literal.Number */ -.highlight .s { - color: #BA2121 -} - -/* Literal.String */ -.highlight .na { - color: #687822 -} - -/* Name.Attribute */ -.highlight .nb { - color: #008000 -} - -/* Name.Builtin */ -.highlight .nc { - color: #0000FF; - font-weight: bold -} - -/* Name.Class */ -.highlight .no { - color: #880000 -} - -/* Name.Constant */ -.highlight .nd { - color: #AA22FF -} - -/* Name.Decorator */ -.highlight .ni { - color: #717171; - font-weight: bold -} - -/* Name.Entity */ -.highlight .ne { - color: #CB3F38; - font-weight: bold -} - -/* Name.Exception */ -.highlight .nf { - color: #0000FF -} - -/* Name.Function */ -.highlight .nl { - color: #767600 -} - -/* Name.Label */ -.highlight .nn { - color: #0000FF; - font-weight: bold -} - -/* Name.Namespace */ -.highlight .nt { - color: #008000; - font-weight: bold -} - -/* Name.Tag */ -.highlight .nv { - color: #19177C -} - -/* Name.Variable */ -.highlight .ow { - color: #AA22FF; - font-weight: bold -} - -/* Operator.Word */ -.highlight .w { - color: #bbbbbb -} - -/* Text.Whitespace */ -.highlight .mb { - color: #666666 -} - -/* Literal.Number.Bin */ -.highlight .mf { - color: #666666 -} - -/* Literal.Number.Float */ -.highlight .mh { - color: #666666 -} - -/* Literal.Number.Hex */ -.highlight .mi { - color: #666666 -} - -/* Literal.Number.Integer */ -.highlight .mo { - color: #666666 -} - -/* Literal.Number.Oct */ -.highlight .sa { - color: #BA2121 -} - -/* Literal.String.Affix */ -.highlight .sb { - color: #BA2121 -} - -/* Literal.String.Backtick */ -.highlight .sc { - color: #BA2121 -} - -/* Literal.String.Char */ -.highlight .dl { - color: #BA2121 -} - -/* Literal.String.Delimiter */ -.highlight .sd { - color: #BA2121; - font-weight: bold -} - -/* Literal.String.Doc */ -.highlight .s2 { - color: #BA2121 -} - -/* Literal.String.Double */ -.highlight .se { - color: #AA5D1F; - font-weight: bold -} - -/* Literal.String.Escape */ -.highlight .sh { - color: #BA2121 -} - -/* Literal.String.Heredoc */ -.highlight .si { - color: #A45A77; - font-weight: bold -} - -/* Literal.String.Interpol */ -.highlight .sx { - color: #008000 -} - -/* Literal.String.Other */ -.highlight .sr { - color: #A45A77 -} - -/* Literal.String.Regex */ -.highlight .s1 { - color: #BA2121 -} - -/* Literal.String.Single */ -.highlight .ss { - color: #19177C -} - -/* Literal.String.Symbol */ -.highlight .bp { - color: #008000 -} - -/* Name.Builtin.Pseudo */ -.highlight .fm { - color: #0000FF -} - -/* Name.Function.Magic */ -.highlight .vc { - color: #19177C -} - -/* Name.Variable.Class */ -.highlight .vg { - color: #19177C -} - -/* Name.Variable.Global */ -.highlight .vi { - color: #19177C -} - -/* Name.Variable.Instance */ -.highlight .vm { - color: #19177C -} - -/* Name.Variable.Magic */ -.highlight .il { - color: #666666 -} - -/* Literal.Number.Integer.Long */ - - -h1 { - line-height: 1.9em; -} - -h2, -h3, -h3, -h4, -h5, -h6 { - line-height: 1.6em; -} - -ul { - margin-left: 1.3em; -} - -ul > li { - margin-left: 0.15em; -} - diff --git a/css/style_home.css b/css/style_home.css deleted file mode 100644 index 4f80137..0000000 --- a/css/style_home.css +++ /dev/null @@ -1,1001 +0,0 @@ -:root { - --color-primary: #9D1631; - --color-primary-lighter: #E85E7A; - --color-primary-darker: #650d1f; - --color-secondary: #F48115; - --color-secondary-lighter: #f6ac65; - --color-secondary-darker: #834002; - --color-tertiary: #151414; - --color-tertiary-lighter: #989393; - --color-bg-primary: #f6f4f4; - --color-bg-secondary: #f8f2f4; - --gradient-primary: linear-gradient(to top left, #9D1631, #f5aebc); - --gradient-secondary: linear-gradient(to top left, #F48115, #f6ac65); -} - -* { - margin: 0; - padding: 0; - box-sizing: inherit; -} - -html { - font-size: 100%; - box-sizing: border-box; -} - - -body { - font-family: 'Roboto Mono', 'Ubuntu', 'sans-serif'; - color: var(--color-tertiary); - line-height: 1.9; - background-color: var(--color-bg-primary); -} - -/********************************************************/ -/* HEADER SECTION */ -.header { - height: 90vh; - padding: 0.1rem; - display: flex; - flex-direction: column; - align-items: center; -} - -/* Top nav bar */ -.nav__bar { - display: flex; - justify-content: space-between; - align-items: center; - height: 8rem; - width: 100%; - padding: 0 5rem; - z-index: 100; - margin: 0; -} - -.nav__bar__logo { - height: 4.6rem; -} - -.nav__bar__links { - display: flex; - align-items: center; - list-style: none; - gap: 2rem; -} - -.nav__bar__item { - margin-left: 4rem; -} - -.nav__bar__link { - font-size: 1.3rem; - color: inherit; - text-decoration: none; - display: block; -} - -.nav__bar__link:hover { - text-decoration: underline; - color: var(--color-primary); -} - -.nav__bar.sticky { - position: fixed; - background-color: var(--color-bg-primary); -} - -/* Header content */ -.header__content { - margin-top: auto; - margin-bottom: auto; - display: flex; - flex-direction: row; - gap: 5rem; -} - -.header__text { - margin-top: auto; - margin-bottom: auto; -} - -.header__text h1 { - font-size: 2.5rem; - line-height: 1.45; -} - -.header__text h4 { - font-size: 1.2rem; - line-height: 1.45; -} - -.header__text__effect { - position: relative; -} - -.header__text__effect::after { - content: ''; - position: absolute; - left: 0; - height: 105%; - width: 102%; - z-index: -5; - opacity: 0.5; - transform: scale(1.09, 1.09) skewX(-25deg); - background-image: var(--gradient-primary); -} - -.header__text h4 .header__text__effect::after { - opacity: 0.8; - background-image: var(--gradient-secondary); -} - -.header__content__img { - max-width: 20rem; - height: 17.15rem; -} - -.header__icon, -.header__text { - vertical-align: middle; - display: inline-block; -} - -/* END OF HEADER SECTION */ - -/********************************************************/ -/* SAMPLE PROGRAMS SECTION */ -.sample__programs { - max-width: 100rem; - margin: 4rem auto 0 auto; -} - -.programs__tab-container { - display: flex; - justify-content: center; -} - -.program__tab { - display: inline-block; - margin: 2rem; - font-size: 1rem; - padding: 1rem 2rem; - border: none; - border-radius: 10rem; - cursor: pointer; -} - -.program__tab--link-1 { - background-color: var(--color-primary); - color: var(--color-bg-primary); - text-decoration: none; -} - -.program__tab--link-2 { - background-color: var(--color-secondary); - color: var(--color-bg-primary); - text-decoration: none; -} - -.program__tab--link-1:hover { - background-color: var(--color-primary-lighter); - color: var(--color-tertiary); - text-decoration: none; -} - -.program__tab--link-2:hover { - background-color: var(--color-secondary-lighter); - color: var(--color-tertiary); - text-decoration: none; -} - -.program__tab--1 { - background-color: var(--color-primary); - color: var(--color-bg-primary); -} - -.program__tab--2 { - background-color: var(--color-secondary); - color: var(--color-bg-primary); -} - -.program__tab--3 { - background-color: var(--color-tertiary); - color: var(--color-bg-primary); -} - -.program__tab--1:hover { - background-color: var(--color-primary-lighter); - color: var(--color-tertiary); -} - -.program__tab--2:hover { - background-color: var(--color-secondary-lighter); - color: var(--color-tertiary); -} - -.program__tab--3:hover { - background-color: var(--color-tertiary-lighter); - color: var(--color-tertiary); -} - -.tab__contents { - display: flex; - flex-direction: column; - align-items: center; - margin: 1rem auto 0 auto; - max-width: 60rem; - padding: 2rem; -} - -.tab__content--2, .tab__content--3, .code__sample--2, .code__sample--3 { - display: none; -} - -.code__sample { - max-width: 60rem; - font-size: 0.8rem; - background-color: #f8ece2; - margin: 0 auto; - padding: 1rem; - font-family: 'Source Code Pro', monospace !important; -} - -.green { - color: darkgreen; -} - -.blue { - color: blue; -} - -.purple { - color: purple; -} - -.brown { - color: brown; -} - -/* END OF SAMPLE PROGRAMS SECTION */ - -/********************************************************/ -/* PHILOSOPHY, END USER SECTIONS */ -.section { - height: auto; - padding: 7rem 3rem; - border-top: 1px solid #ddd; -} - -#section--1, #section--3 { - background-color: var(--color-bg-secondary); -} - -#section--2 { - background-color: var(--color-bg-primary); -} - -.section h2 { - font-size: 1.0rem; - color: var(--color-primary); -} - -.section__content { - padding-top: 26rem; - display: flex; - flex-direction: row; - gap: 50px; - justify-content: center; -} - -.section__text { - margin-top: auto; - margin-bottom: auto; -} - -/* END OF PHILOSOPHY, END USER SECTIONS */ - -/********************************************************/ -/* FOOTER SECTION */ -.footer { - background-color: var(--color-tertiary); - display: flex; - flex-direction: column; - align-items: center; - height: auto; - padding: 7rem 3rem; -} - -.footer__links { - display: flex; - flex-direction: row; -} - -.footer__link { - font-size: 1.3rem; - color: var(--color-secondary); - text-decoration: none; - display: block; - padding: 2rem 5rem; -} - -.footer__link:hover { - text-decoration: underline; - color: var(--color-bg-primary); -} - -.footer__logo { - height: 8rem; - margin: 2rem; -} - -/* END OF FOOTER SECTION */ - -/********************************************************/ -/* CSS FOR RESPONSIVENESS */ - -/* 8K minimum - High resolution screens */ -@media screen and (min-width: 7600px) { - .nav__bar { - padding: 10rem; - } - - .nav__bar__logo { - height: 18rem; - } - - .nav__bar__links { - gap: 15rem; - } - - .nav__bar__link { - font-size: 6rem; - } - - .header__content { - gap: 60rem; - } - - .header__text h1 { - font-size: 8rem; - } - - .header__text h4 { - font-size: 5rem; - } - - .header__content__img { - max-width: 100rem; - height: 85.72rem - } - - .section { - padding: 25rem; - } - - .section h2 { - font-size: 5rem; - } - - .section h1 { - font-size: 7rem; - } - - .sample__programs { - max-width: 200rem; - } - - .program__tab { - margin: 7rem; - font-size: 4.5rem; - padding: 5rem 10rem; - } - - .tab__contents { - margin: auto; - max-width: 200rem; - } - - .tab__contents h4 { - font-size: 4.5rem; - } - - .tab__contents img { - margin: 12rem; - } - - .code__sample { - max-width: 400rem; - font-size: 4rem; - } - - .section__content { - gap: 30rem; - } - - .section__text { - font-size: 4.5rem; - } - - .footer { - padding: 10rem 0; - } - - .footer__link { - font-size: 7rem; - } - - .footer__logo { - height: 24rem; - margin: 10rem auto 0 auto; - } -} - -/* 4K - 8K resolution */ -@media screen and (max-width: 7599px) { - .nav__bar { - padding: 7rem; - } - - .nav__bar__logo { - height: 13rem; - } - - .nav__bar__links { - gap: 7rem; - } - - .nav__bar__link { - font-size: 4rem; - } - - .header__content { - gap: 30rem; - } - - .header__text h1 { - font-size: 6rem; - } - - .header__text h4 { - font-size: 4rem; - } - - .header__content__img { - max-width: 80rem; - height: 68.57rem - } - - .section { - padding: 14rem; - } - - .section h2 { - font-size: 4rem; - } - - .section h1 { - font-size: 5rem; - } - - .sample__programs { - max-width: 200rem; - } - - .program__tab { - margin: 4rem; - font-size: 4rem; - padding: 3rem 6rem; - } - - .tab__contents { - margin: auto; - max-width: 200rem; - } - - .tab__contents h4 { - font-size: 4rem; - } - - .tab__contents img { - margin: 10rem; - } - - .code__sample { - max-width: 200rem; - font-size: 3.5rem; - } - - .section__content { - gap: 30rem; - padding-top: 15rem; - } - - .section__text { - font-size: 4rem; - } - - .footer { - padding: 20rem 0; - } - - .footer__link { - font-size: 5rem; - } - - .footer__logo { - height: 18rem; - margin: 8rem auto 0 auto; - } -} - -/* 4K : High resolution screens */ -@media screen and (max-width: 5100px) { - .nav__bar { - padding: 5rem; - } - - .nav__bar__logo { - height: 9rem; - } - - .nav__bar__links { - gap: 7rem; - } - - .nav__bar__link { - font-size: 3rem; - } - - .header__content { - gap: 30rem; - } - - .header__text h1 { - font-size: 4rem; - } - - .header__text h4 { - font-size: 2.5rem; - } - - .header__content__img { - max-width: 50rem; - height: 42.86rem; - } - - .section { - padding: 12rem; - } - - .section h2 { - font-size: 2.5rem; - } - - .section h1 { - font-size: 3.5rem; - } - - .sample__programs { - max-width: 100rem; - } - - .program__tab { - margin: 3.5rem; - font-size: 2.5rem; - padding: 2rem 5rem; - } - - .tab__contents { - margin: auto; - max-width: 100rem; - } - - .tab__contents h4 { - font-size: 2rem; - } - - .tab__contents img { - margin: 6rem; - } - - .code__sample { - max-width: 200rem; - font-size: 2rem; - } - - .section__content { - gap: 20rem; - padding-top: 13rem; - } - - .section__text { - font-size: 2.25rem; - } - - .footer { - padding: 10rem 0; - } - - .footer__link { - font-size: 3.5rem; - } - - .footer__logo { - height: 12rem; - margin: 8rem auto 0 auto; - } -} - -/* 2K - 4K resolution */ -@media screen and (max-width: 3100px) { - .nav__bar { - padding: 1rem; - } - - .nav__bar__logo { - height: 6rem; - } - - .nav__bar__links { - gap: 5rem; - } - - .nav__bar__link { - font-size: 2rem; - } - - .header__content { - gap: 15rem; - } - - .header__text h1 { - font-size: 3rem; - } - - .header__text h4 { - font-size: 2rem; - } - - .header__content__img { - max-width: 30rem; - height: 25.71rem - } - - .section { - padding: 4rem; - } - - .section h2 { - font-size: 1.6rem; - } - - .section h1 { - font-size: 2.3rem; - } - - .sample__programs { - max-width: 60rem; - } - - .program__tab { - margin: 1rem; - font-size: 2rem; - padding: 1rem 3rem; - } - - .tab__contents { - margin: auto; - max-width: 60rem; - } - - .tab__contents h4 { - font-size: 1.6rem; - } - - .tab__contents img { - margin: 2.5rem; - } - - .code__sample { - max-width: 60rem; - font-size: 1.4rem; - } - - .section__content { - gap: 10rem; - padding-top: 6rem; - } - - .section__text { - font-size: 1.4rem; - } - - .footer { - padding: 5rem 0; - } - - .footer__link { - font-size: 2rem; - } - - .footer__logo { - height: 6rem; - margin: 4rem auto 0 auto; - } -} - -/* 1080p */ -@media screen and (max-width: 2100px) { - .header { - height: auto; - } - - .nav__bar { - height: auto; - padding: 1rem; - } - - .nav__bar__logo { - height: 3.5rem; - } - - .nav__bar__links { - gap: 1.5rem; - } - - .nav__bar__link { - font-size: 1.2rem; - } - - .header__content { - margin: 10rem auto; - } - - .header__text h1 { - font-size: 2rem; - } - - .header__text h4 { - font-size: 1rem; - } - - .header__content__img { - max-width: 18rem; - height: 15.43rem; - } - - .section { - padding: 3rem; - } - - .section h2 { - font-size: 1rem; - } - - .section h1 { - font-size: 1.3rem; - } - - .sample__programs { - max-width: 80rem; - } - - .program__tab { - margin: 0.5rem 1rem; - font-size: 1rem; - padding: 1rem 2rem; - } - - .tab__contents { - margin: auto; - max-width: 80rem; - } - - .tab__contents h4 { - font-size: 1rem; - } - - .tab__contents img { - margin: 1.2rem; - } - - .code__sample { - max-width: 60rem; - font-size: 1rem; - } - - .section__content { - gap: 5rem; - padding-top: 2rem; - } - - .section__text { - font-size: 1rem; - } - - .footer { - padding: 2rem 0; - } - - .footer__link { - font-size: 1rem; - } - - .footer__logo { - height: 3rem; - margin: 2rem auto 0 auto; - } -} - -/* 720p */ -@media screen and (max-width: 1280px) { - .nav__bar { - padding: 1rem; - flex-direction: column; - } - - .nav__bar__logo { - height: 4rem; - } - - .nav__bar__links { - gap: 2rem; - } - - .nav__bar__link { - font-size: 1.4rem; - } - - .header__content { - flex-direction: column; - gap: 3rem; - align-items: center; - margin: 5rem auto; - } - - .header__text h1 { - font-size: 2rem; - } - - .header__text h4 { - font-size: 1rem; - } - - .header__content__img { - max-width: 18rem; - height: 15.43rem; - } - - .section { - padding: 3rem; - } - - .section h2 { - font-size: 1rem; - } - - .section h1 { - font-size: 1.3rem; - } - - .sample__programs { - max-width: 60rem; - } - - .program__tab { - margin: 0.5rem; - font-size: 1rem; - padding: 1rem 2rem; - } - - .tab__contents { - margin: auto; - max-width: 40rem; - } - - .tab__contents h4 { - font-size: 1rem; - } - - .tab__contents img { - margin: 1rem; - } - - .code__sample { - max-width: 40rem; - font-size: 1rem; - } - - .section__content { - gap: 5rem; - padding-top: 2rem; - } - - .section__text { - font-size: 1rem; - } - - .footer { - padding: 2rem 0; - } - - .footer__link { - font-size: 1rem; - } - - .footer__logo { - height: 3rem; - margin: 2rem auto 0 auto; - } -} - -/* 480p */ -@media screen and (max-width: 750px) { - .section { - margin: 1rem 0; - padding: 4rem 1rem; - } - - .section__content { - flex-direction: column; - align-items: center; - } - - .programs__tab-container { - margin: 1.5rem 0; - } - - .sample__programs { - margin: 0; - } - - .tab__contents { - padding: 0; - } -} - -/* Small screens - less than 640px */ -@media screen and (max-width: 640px) { - .nav__bar { - padding: 0.25rem; - } - - .nav__bar__logo { - height: 3rem; - } - - .nav__bar__links { - gap: 0.5rem; - } - - .nav__bar__link { - font-size: 0.9rem; - } - - .footer__link { - padding: 1.5rem; - } - -} - -/* Smaller screens - less than 510px */ -@media screen and (max-width: 510px) { - .nav__bar__links { - gap: 0; - } - - .nav__bar__item { - margin: auto 1rem; - } - - .nav__bar__link { - font-size: 0.9rem; - } - - .program__tab { - font-size: 0.9rem; - padding: 1rem 0.5rem; - } -} diff --git a/docs/assets/.keep b/docs/assets/.keep deleted file mode 100644 index c693f13..0000000 --- a/docs/assets/.keep +++ /dev/null @@ -1 +0,0 @@ -keep \ No newline at end of file diff --git a/docs/assets/big-font.min.css b/docs/assets/big-font.min.css deleted file mode 100644 index 409f466..0000000 --- a/docs/assets/big-font.min.css +++ /dev/null @@ -1 +0,0 @@ -body{font-size:1.4vw} \ No newline at end of file diff --git a/docs/assets/large-font.min.css b/docs/assets/large-font.min.css deleted file mode 100644 index d1e1688..0000000 --- a/docs/assets/large-font.min.css +++ /dev/null @@ -1 +0,0 @@ -body{font-size:2vw} \ No newline at end of file diff --git a/docs/assets/medium-font.min.css b/docs/assets/medium-font.min.css deleted file mode 100644 index 409f466..0000000 --- a/docs/assets/medium-font.min.css +++ /dev/null @@ -1 +0,0 @@ -body{font-size:1.4vw} \ No newline at end of file diff --git a/docs/assets/normalize.min.css b/docs/assets/normalize.min.css deleted file mode 100644 index 317bae0..0000000 --- a/docs/assets/normalize.min.css +++ /dev/null @@ -1 +0,0 @@ -/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{-webkit-text-size-adjust:100%;line-height:1.15}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none} \ No newline at end of file diff --git a/docs/assets/printing.min.css b/docs/assets/printing.min.css deleted file mode 100644 index a300b70..0000000 --- a/docs/assets/printing.min.css +++ /dev/null @@ -1 +0,0 @@ -body{font-family:Roboto Mono,monospace!important;margin-left:1em;-webkit-print-color-adjust:exact!important;print-color-adjust:exact!important}#yaksha-logo{display:block;width:100%}#pages-text-toc,.banner-image,button,nav,summary{display:none!important}.table-of-contents{background-color:transparent!important}img,svg{display:table!important;max-width:100%!important}ul{break-inside:avoid!important;display:table}div.boxes:after{content:"Copyright (c) Bhathiya Perera";display:block;font-size:1.3em;text-align:center}.box,.boxes,.container,.content,.note{display:table}.content{break-inside:avoid;page-break-inside:avoid}code{background-color:transparent;border:1px solid transparent;color:#0b5940;font-family:Source Code Pro,monospace!important;font-weight:700}ul{margin-left:1.45em}ul>li{margin-left:.2em}.highlight,pre{background-color:transparent!important;border:2px solid transparent;break-inside:avoid;font-family:Source Code Pro,monospace!important;page-break-inside:avoid}h1{break-before:always;line-height:2.3em!important}h1,h2,h3,h4,h5,h6{font-family:Roboto,monospace!important}h2,h3,h4,h5,h6{break-before:auto;line-height:2.1em!important}table td{break-inside:avoid;page-break-inside:avoid}.note{float:none;margin-left:1em!important}.content,.note{padding:0 .1em;width:calc(100% - 2.5em)}.boxes{width:100%}.table-of-contents{margin-top:-2em;overflow:visible;padding-left:.3em;position:relative;width:100%}.table-of-contents .real-toc{display:table;width:100%}.blue-status,.green-status,.red-status,.yellow-status{break-inside:avoid;display:table;page-break-inside:avoid} \ No newline at end of file diff --git a/docs/assets/script_home.js b/docs/assets/script_home.js deleted file mode 100644 index 0fe8b15..0000000 --- a/docs/assets/script_home.js +++ /dev/null @@ -1,83 +0,0 @@ -'use strict'; -const navBar = document.querySelector('.nav__bar'); - -/////////////////////////////////////////////////////////////////// -// Nav bar - making other links fade when hovering -const navBarHover = function (event) { - if (event.target.classList.contains('nav__bar__link')) { - const currentNavLink = event.target; - const allNavLinks = currentNavLink.closest('.nav__bar').querySelectorAll('.nav__bar__link'); - - allNavLinks.forEach(link => { - if (link !== currentNavLink) link.style.opacity = this; - }); - } -} - -navBar.addEventListener('mouseover', navBarHover.bind(0.5)); -navBar.addEventListener('mouseout', navBarHover.bind(1)); - -/////////////////////////////////////////////////////////////////// -// Implementing sticky navigation bar -const header = document.querySelector('.header'); -const navHeight = navBar.getBoundingClientRect().height; - -const stickyNav = function (entries) { - const [entry] = entries; - // Sticky class must only be added if header is not intersecting with viewport - if (!entry.isIntersecting) navBar.classList.add('sticky'); - else navBar.classList.remove('sticky'); -}; - -const headerObserver = new IntersectionObserver(stickyNav, { - root: null, - threshold: 0, - rootMargin: `-${navHeight}px`, -}); - -headerObserver.observe(header); - -/////////////////////////////////////////////////////////////////// -// Implementing tabbed component - -const tab1 = document.querySelector('.program__tab--1'); -const tab2 = document.querySelector('.program__tab--2'); -const tab3 = document.querySelector('.program__tab--3'); - -const tabContent1 = document.querySelector('.tab__content--1'); -const tabContent2 = document.querySelector('.tab__content--2'); -const tabContent3 = document.querySelector('.tab__content--3'); - -const codeSample1 = document.querySelector('.code__sample--1'); -const codeSample2 = document.querySelector('.code__sample--2'); -const codeSample3 = document.querySelector('.code__sample--3'); - -// When tab 1 is clicked -tab1.addEventListener('click', function () { - tabContent2.style.display = 'None'; - tabContent3.style.display = 'None'; - tabContent1.style.display = 'flex'; - codeSample2.style.display = 'None'; - codeSample3.style.display = 'None'; - codeSample1.style.display = 'flex'; -}); - -// When tab 2 is clicked -tab2.addEventListener('click', function () { - tabContent1.style.display = 'None'; - tabContent3.style.display = 'None'; - tabContent2.style.display = 'flex'; - codeSample1.style.display = 'None'; - codeSample3.style.display = 'None'; - codeSample2.style.display = 'flex'; -}); - -// When tab 3 is clicked -tab3.addEventListener('click', function () { - tabContent1.style.display = 'None'; - tabContent2.style.display = 'None'; - tabContent3.style.display = 'flex'; - codeSample1.style.display = 'None'; - codeSample2.style.display = 'None'; - codeSample3.style.display = 'flex'; -}); \ No newline at end of file diff --git a/docs/assets/small-font.min.css b/docs/assets/small-font.min.css deleted file mode 100644 index e454841..0000000 --- a/docs/assets/small-font.min.css +++ /dev/null @@ -1 +0,0 @@ -body{font-size:.6vw} \ No newline at end of file diff --git a/docs/assets/style.light.min.css b/docs/assets/style.light.min.css deleted file mode 100644 index 4e972f3..0000000 --- a/docs/assets/style.light.min.css +++ /dev/null @@ -1 +0,0 @@ -*{margin:0;padding:0}body{font-family:Roboto Mono,monospace}.toc-item{display:block;margin-bottom:.3em;overflow:hidden;width:calc(100% - 10px)}.toc-item a{text-decoration:none}.timestamp{color:#636363;font-size:.6em}a:link{color:#0b722d}a:visited{color:#33046c}a:hover{color:#00a0c3;font-weight:700}table{border:.1em solid #ccc;border-collapse:collapse;margin:0;padding:0;table-layout:fixed;width:100%}table caption{font-size:.9em;margin:.5em 0 .75em}table tr{background-color:#f8f8f8;border:.1em solid #ddd;padding:.35em}table td:nth-child(odd),table th:nth-child(odd){background-color:#eee}table td,table th{padding:.625em;text-align:center}table th{font-size:.85em;letter-spacing:.1em;text-transform:uppercase}@media screen and (max-width:600px){table{border:0}table caption{font-size:.9em}table thead{clip:rect(0 0 0 0);border:none;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}table tr{border-bottom:3px solid #ddd;display:block;margin-bottom:.625em}table td{border-bottom:1px solid #ddd;display:block;font-size:.8em;text-align:right}table td:before{content:attr(data-label);float:left;font-weight:700;text-transform:uppercase}table td:last-child{border-bottom:0}}.highlight,h1,h2,h3,h4,h5,h6{color:#064146;font-family:Ubuntu,sans-serif!important;margin-bottom:.5em;margin-top:.5em}h1{font-size:2.3em}h2{font-size:1.9em}h3{font-size:1.8em}h4{font-size:1.7em}h5{font-size:1.6em}h6{font-size:1.5em}.highlight{padding:4px}.button{background-color:#4caf50;border:none;color:#fff;cursor:pointer;display:inline-block;margin:4px 2px;text-align:center;text-decoration:none;transition-duration:.4s}.action-button{background-color:#078f7b;border:2px solid #078f7b;color:#fff}.action-button:hover{background-color:#fff;border:2px solid #078f7b;color:#000}a.read-more{border:1px dashed #144e4a;color:#063632;display:inline-block;font-size:.8em;margin:auto 2px;padding:0 5px;text-decoration:none}a.read-more:hover{background:#3b351b;border:1px dashed #665117;color:#e9b82c}ul{margin-left:2em}ul>li{margin-left:1em}body,html{background-color:#fff;color:#2b2b2b;line-height:1.45em;width:100%}.table-of-contents{bottom:0;font-size:.7em;line-height:1.3em;overflow-y:auto;padding-left:.3em;position:fixed;top:2em;width:20%}.container{height:100%;width:100%}.boxes,.container{display:inline-block}.boxes{float:right;width:80%}.box{overflow-wrap:anywhere;padding:.2em;width:calc(100% - .4em)}.box,.content{display:inline-block}.content{float:left;overflow:wrap;overflow-wrap:anywhere;padding:0 1em;width:calc(70% - 2.5em)}.note{display:inline-block;float:right;font-size:.7em;padding-left:.5em;width:calc(30% - .5em)}.box:after{clear:both;content:"";display:table}code{background:#eee;border:.05em dashed #10423c;margin-top:.6em;padding-left:.1em}.highlight{background-color:#000;border:.1em dashed gray}pre{word-wrap:break-word;white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap}hr{border:none;border-top:.1em solid transparent;margin-bottom:1.5em}.center-text{margin-bottom:2em;margin-top:2em;text-align:center}.yellow-status:before{background-color:#ffc182;border:.1em solid #ffb161;border-radius:.7em;box-shadow:0 0 .4em .1em #ffc182;content:" ";display:inline-block;height:.7em;margin-right:1em;width:.7em}.yellow-status{border:.1em solid #7a542c;border-radius:.7em;color:#7a542c;display:inline-block;font-size:.8em;font-weight:700;margin:auto .2em;padding:0 .5em}.green-status:before{background-color:#94e185;border:.1em solid #78d965;border-radius:.7em;box-shadow:0 0 .4em .1em #94e185;content:" ";display:inline-block;height:.7em;margin-right:1em;width:.7em}.green-status{border:.1em solid #48833e;border-radius:.7em;color:#48833e;display:inline-block;font-size:.8em;font-weight:700;margin:auto .2em;padding:0 .5em}.red-status:before{background-color:#c9404d;border:.1em solid #c42c3b;border-radius:.7em;box-shadow:0 0 .4em .1em #c9404d;content:" ";display:inline-block;height:.7em;margin-right:1em;width:.7em}.red-status{border:.1em solid #7a1d27;border-radius:.7em;color:#7a1d27;display:inline-block;font-size:.8em;font-weight:700;margin:auto .2em;padding:0 .5em}.blue-status:before{background-color:#40c4c9;border:.1em solid #2cb7c4;border-radius:.7em;box-shadow:0 0 .4em .1em #40c9c9;content:" ";display:inline-block;height:.7em;margin-right:1em;width:.7em}.blue-status{border:.1em solid #1b727c;border-radius:.7em;color:#1b727c;display:inline-block;font-size:.8em;font-weight:700;margin:auto .2em;padding:0 .5em}@media (max-width:800px){body,html{font-size:1em;line-height:1.2em}.content,.note{padding:0 .1em;width:calc(100% - 2.5em)}.boxes{width:100%}.table-of-contents{background:#defbff;overflow:hidden;padding-left:.3em;position:sticky;top:0;width:100%}.table-of-contents .real-toc{display:none}}.highlight{font-size:.8em}.highlight,pre{font-family:Source Code Pro,monospace!important}pre{line-height:125%}span.linenos,td.linenos .normal{background-color:transparent;color:inherit;padding-left:.5em;padding-right:.5em}span.linenos.special,td.linenos .special{background-color:#ffffc0;color:#000;padding-left:.5em;padding-right:.5em}.highlight .hll{background-color:#ffc}.highlight{background:#f8f8f8}.highlight .c{color:#3d7b7b;font-weight:700}.highlight .k{color:green;font-weight:700}.highlight .o{color:#666}.highlight .ch,.highlight .cm{color:#3d7b7b;font-style:italic}.highlight .cp{color:#9c6500}.highlight .c1,.highlight .cpf,.highlight .cs{color:#3d7b7b;font-weight:700}.highlight .gd{color:#a00000}.highlight .ge{font-style:italic}.highlight .ges{font-weight:700}.highlight .gr{color:#e40000}.highlight .gh{color:navy;font-weight:700}.highlight .gi{color:#008400}.highlight .go{color:#717171}.highlight .gp{color:navy}.highlight .gp,.highlight .gs,.highlight .gu{font-weight:700}.highlight .gu{color:purple}.highlight .gt{color:#04d}.highlight .kc,.highlight .kd,.highlight .kn{color:green;font-weight:700}.highlight .kp{color:green}.highlight .kr{color:green;font-weight:700}.highlight .kt{color:#b00040}.highlight .m{color:#666}.highlight .s{color:#ba2121}.highlight .na{color:#687822}.highlight .nb{color:green}.highlight .nc{color:#00f;font-weight:700}.highlight .no{color:#800}.highlight .nd{color:#a2f}.highlight .ni{color:#717171;font-weight:700}.highlight .ne{color:#cb3f38;font-weight:700}.highlight .nf{color:#00f}.highlight .nl{color:#767600}.highlight .nn{color:#00f;font-weight:700}.highlight .nt{color:green;font-weight:700}.highlight .nv{color:#19177c}.highlight .ow{color:#a2f;font-weight:700}.highlight .w{color:#bbb}.highlight .mb,.highlight .mf,.highlight .mh,.highlight .mi,.highlight .mo{color:#666}.highlight .dl,.highlight .sa,.highlight .sb,.highlight .sc{color:#ba2121}.highlight .sd{color:#ba2121;font-weight:700}.highlight .s2{color:#ba2121}.highlight .se{color:#aa5d1f;font-weight:700}.highlight .sh{color:#ba2121}.highlight .si{color:#a45a77;font-weight:700}.highlight .sx{color:green}.highlight .sr{color:#a45a77}.highlight .s1{color:#ba2121}.highlight .ss{color:#19177c}.highlight .bp{color:green}.highlight .fm{color:#00f}.highlight .vc,.highlight .vg,.highlight .vi,.highlight .vm{color:#19177c}.highlight .il{color:#666}h1{line-height:1.9em}h2,h3,h4,h5,h6{line-height:1.6em}ul{margin-left:1.3em}ul>li{margin-left:.15em} \ No newline at end of file diff --git a/docs/assets/style.min.css b/docs/assets/style.min.css deleted file mode 100644 index e3afed4..0000000 --- a/docs/assets/style.min.css +++ /dev/null @@ -1 +0,0 @@ -*{margin:0;padding:0}body{font-family:Roboto Mono,monospace}.toc-item{display:block;margin-bottom:.3em;overflow:hidden;width:calc(100% - 10px)}.toc-item a{text-decoration:none}.timestamp{color:#98e372;font-size:.6em}a:link{color:#13e15d}a:visited{color:#bb82ff}a:hover{color:#30cef3;font-weight:700}table{border:.1em solid #14ea61;border-collapse:collapse;margin:0;padding:0;table-layout:fixed;width:100%}table caption{font-size:.9em;margin:.5em 0 .75em}table tr{background-color:#1c1a1a;border:.1em solid #14ea61;padding:.35em}table td:nth-child(odd),table th:nth-child(odd){background-color:#3d3939}table td,table th{padding:.625em;text-align:center}table th{font-size:.85em;letter-spacing:.1em;text-transform:uppercase}@media screen and (max-width:600px){table{border:0}table caption{font-size:.9em}table thead{clip:rect(0 0 0 0);border:none;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}table tr{border-bottom:3px solid #ddd;display:block;margin-bottom:.625em}table td{border-bottom:1px solid #ddd;display:block;font-size:.8em;text-align:right}table td:before{content:attr(data-label);float:left;font-weight:700;text-transform:uppercase}table td:last-child{border-bottom:0}}.highlight,h1,h2,h3,h4,h5,h6{color:#33d0de;font-family:Ubuntu,sans-serif!important;margin-bottom:.5em;margin-top:.5em}h1{font-size:2.3em}h2{font-size:1.9em}h3{font-size:1.8em}h4{font-size:1.7em}h5{font-size:1.6em}h6{font-size:1.5em}.highlight{padding:4px}.button{background-color:#4caf50;border:none;color:#fff;cursor:pointer;display:inline-block;margin:4px 2px;text-align:center;text-decoration:none;transition-duration:.4s}.action-button{background-color:#078f7b;border:2px solid #078f7b;color:#fff}.action-button:hover{background-color:#fff;border:2px solid #078f7b;color:#000}a.read-more{border:1px dashed #144e4a;color:#063632;display:inline-block;font-size:.8em;margin:auto 2px;padding:0 5px;text-decoration:none}a.read-more:hover{background:#3b351b;border:1px dashed #665117;color:#e9b82c}ul{margin-left:2em}ul>li{margin-left:1em}body,html{background-color:#2b2b2b;color:#fff;line-height:1.45em;width:100%}.table-of-contents{bottom:0;font-size:.7em;line-height:1.3em;overflow-y:auto;padding-left:.3em;position:fixed;top:2em;width:20%}.container{height:100%;width:100%}.boxes,.container{display:inline-block}.boxes{float:right;width:80%}.box{overflow-wrap:anywhere;padding:.2em;width:calc(100% - .4em)}.box,.content{display:inline-block}.content{float:left;overflow:wrap;overflow-wrap:anywhere;padding:0 1em;width:calc(70% - 2.5em)}.note{display:inline-block;float:right;font-size:.7em;padding-left:.5em;width:calc(30% - .5em)}.box:after{clear:both;content:"";display:table}code{background:#10423c;border:.05em dashed #eee;margin-top:.6em;padding-left:.1em}.highlight{background-color:#000;border:.1em dashed #1eff00}pre{word-wrap:break-word;white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap}hr{border:none;border-top:.1em solid transparent;margin-bottom:1.5em}.center-text{margin-bottom:2em;margin-top:2em;text-align:center}.yellow-status:before{background-color:#ffc182;border:.1em solid #ffb161;border-radius:.7em;box-shadow:0 0 .4em .1em #ffc182;content:" ";display:inline-block;height:.7em;margin-right:1em;width:.7em}.yellow-status{border:.1em solid #ffc182;border-radius:.7em;color:#ffc182;display:inline-block;font-size:.8em;font-weight:700;margin:auto .2em;padding:0 .5em}.green-status:before{background-color:#94e185;border:.1em solid #78d965;border-radius:.7em;box-shadow:0 0 .4em .1em #94e185;content:" ";display:inline-block;height:.7em;margin-right:1em;width:.7em}.green-status{border:.1em solid #94e185;border-radius:.7em;color:#94e185;display:inline-block;font-size:.8em;font-weight:700;margin:auto .2em;padding:0 .5em}.red-status:before{background-color:#c9404d;border:.1em solid #c42c3b;border-radius:.7em;box-shadow:0 0 .4em .1em #c9404d;content:" ";display:inline-block;height:.7em;margin-right:1em;width:.7em}.red-status{border:.1em solid #c9404d;border-radius:.7em;color:#c9404d;display:inline-block;font-size:.8em;font-weight:700;margin:auto .2em;padding:0 .5em}.blue-status:before{background-color:#40c4c9;border:.1em solid #2cb7c4;border-radius:.7em;box-shadow:0 0 .4em .1em #40c9c9;content:" ";display:inline-block;height:.7em;margin-right:1em;width:.7em}.blue-status{border:.1em solid #40c9c9;border-radius:.7em;color:#40c9c9;display:inline-block;font-size:.8em;font-weight:700;margin:auto .2em;padding:0 .5em}@media (max-width:800px){body,html{font-size:1em;line-height:1.2em}.content,.note{padding:0 .1em;width:calc(100% - 2.5em)}.boxes{width:100%}.table-of-contents{background:#defbff;overflow:hidden;padding-left:.3em;position:sticky;top:0;width:100%}.table-of-contents .real-toc{display:none}}.highlight{font-size:.8em}.highlight,pre{font-family:Source Code Pro,monospace!important}pre{line-height:125%}span.linenos,td.linenos .normal{background-color:transparent;color:inherit;padding-left:.5em;padding-right:.5em}span.linenos.special,td.linenos .special{background-color:#ffffc0;color:#000;padding-left:.5em;padding-right:.5em}.highlight .hll{background-color:#00f}.highlight{background:#000;color:#ddd}.highlight .c{color:#0f0}.highlight .err,.highlight .esc,.highlight .g{color:#ddd}.highlight .k{color:red}.highlight .l,.highlight .n,.highlight .o,.highlight .p,.highlight .x{color:#ddd}.highlight .ch,.highlight .cm{color:#0f0}.highlight .cp{color:#e5e5e5}.highlight .c1,.highlight .cpf,.highlight .cs{color:#0f0}.highlight .gd,.highlight .ge,.highlight .ges,.highlight .gh,.highlight .gi,.highlight .go,.highlight .gp,.highlight .gr,.highlight .gs,.highlight .gt,.highlight .gu{color:#ddd}.highlight .kc,.highlight .kd,.highlight .kn,.highlight .kp,.highlight .kr{color:red}.highlight .kt{color:violet}.highlight .ld,.highlight .m{color:#ddd}.highlight .s{color:#87ceeb}.highlight .na,.highlight .nb,.highlight .nc{color:#ddd}.highlight .no{color:#7fffd4}.highlight .nd,.highlight .ne,.highlight .ni{color:#ddd}.highlight .nf{color:#ff0}.highlight .nl,.highlight .nn,.highlight .nt,.highlight .nx,.highlight .py{color:#ddd}.highlight .nv{color:#eedd82}.highlight .mb,.highlight .mf,.highlight .mh,.highlight .mi,.highlight .mo,.highlight .ow,.highlight .pm,.highlight .w{color:#ddd}.highlight .dl,.highlight .s1,.highlight .s2,.highlight .sa,.highlight .sb,.highlight .sc,.highlight .sd,.highlight .se,.highlight .sh,.highlight .si,.highlight .sr,.highlight .ss,.highlight .sx{color:#87ceeb}.highlight .bp{color:#ddd}.highlight .fm{color:#ff0}.highlight .vc,.highlight .vg,.highlight .vi,.highlight .vm{color:#eedd82}.highlight .il{color:#ddd}h1{line-height:1.9em}h2,h3,h4,h5,h6{line-height:1.6em}ul{margin-left:1.3em}ul>li{margin-left:.15em} \ No newline at end of file diff --git a/docs/assets/style_home.min.css b/docs/assets/style_home.min.css deleted file mode 100644 index 14b7bde..0000000 --- a/docs/assets/style_home.min.css +++ /dev/null @@ -1 +0,0 @@ -:root{--color-primary:#9d1631;--color-primary-lighter:#e85e7a;--color-primary-darker:#650d1f;--color-secondary:#f48115;--color-secondary-lighter:#f6ac65;--color-secondary-darker:#834002;--color-tertiary:#151414;--color-tertiary-lighter:#989393;--color-bg-primary:#f6f4f4;--color-bg-secondary:#f8f2f4;--gradient-primary:linear-gradient(to top left,#9d1631,#f5aebc);--gradient-secondary:linear-gradient(to top left,#f48115,#f6ac65)}*{box-sizing:inherit;margin:0;padding:0}html{box-sizing:border-box;font-size:100%}body{background-color:var(--color-bg-primary);color:var(--color-tertiary);font-family:Roboto Mono,Ubuntu,"sans-serif";line-height:1.9}.header{flex-direction:column;height:90vh;padding:.1rem}.header,.nav__bar{align-items:center;display:flex}.nav__bar{height:8rem;justify-content:space-between;margin:0;padding:0 5rem;width:100%;z-index:100}.nav__bar__logo{height:4.6rem}.nav__bar__links{align-items:center;display:flex;gap:2rem;list-style:none}.nav__bar__item{margin-left:4rem}.nav__bar__link{color:inherit;display:block;font-size:1.3rem;text-decoration:none}.nav__bar__link:hover{color:var(--color-primary);text-decoration:underline}.nav__bar.sticky{background-color:var(--color-bg-primary);position:fixed}.header__content{display:flex;flex-direction:row;gap:5rem}.header__content,.header__text{margin-bottom:auto;margin-top:auto}.header__text h1{font-size:2.5rem;line-height:1.45}.header__text h4{font-size:1.2rem;line-height:1.45}.header__text__effect{position:relative}.header__text__effect:after{background-image:var(--gradient-primary);content:"";height:105%;left:0;opacity:.5;position:absolute;transform:scale(1.09) skewX(-25deg);width:102%;z-index:-5}.header__text h4 .header__text__effect:after{background-image:var(--gradient-secondary);opacity:.8}.header__content__img{height:17.15rem;max-width:20rem}.header__icon,.header__text{display:inline-block;vertical-align:middle}.sample__programs{margin:4rem auto 0;max-width:100rem}.programs__tab-container{display:flex;justify-content:center}.program__tab{border:none;border-radius:10rem;cursor:pointer;display:inline-block;font-size:1rem;margin:2rem;padding:1rem 2rem}.program__tab--link-1{background-color:var(--color-primary)}.program__tab--link-1,.program__tab--link-2{color:var(--color-bg-primary);text-decoration:none}.program__tab--link-2{background-color:var(--color-secondary)}.program__tab--link-1:hover{background-color:var(--color-primary-lighter);color:var(--color-tertiary);text-decoration:none}.program__tab--link-2:hover{background-color:var(--color-secondary-lighter);color:var(--color-tertiary);text-decoration:none}.program__tab--1{background-color:var(--color-primary);color:var(--color-bg-primary)}.program__tab--2{background-color:var(--color-secondary);color:var(--color-bg-primary)}.program__tab--3{background-color:var(--color-tertiary);color:var(--color-bg-primary)}.program__tab--1:hover{background-color:var(--color-primary-lighter);color:var(--color-tertiary)}.program__tab--2:hover{background-color:var(--color-secondary-lighter);color:var(--color-tertiary)}.program__tab--3:hover{background-color:var(--color-tertiary-lighter);color:var(--color-tertiary)}.tab__contents{align-items:center;display:flex;flex-direction:column;margin:1rem auto 0;max-width:60rem;padding:2rem}.code__sample--2,.code__sample--3,.tab__content--2,.tab__content--3{display:none}.code__sample{background-color:#f8ece2;font-family:Source Code Pro,monospace!important;font-size:.8rem;margin:0 auto;max-width:60rem;padding:1rem}.green{color:#006400}.blue{color:blue}.purple{color:purple}.brown{color:brown}.section{border-top:1px solid #ddd;height:auto;padding:7rem 3rem}#section--1,#section--3{background-color:var(--color-bg-secondary)}#section--2{background-color:var(--color-bg-primary)}.section h2{color:var(--color-primary);font-size:1rem}.section__content{display:flex;flex-direction:row;gap:50px;justify-content:center;padding-top:26rem}.section__text{margin-bottom:auto;margin-top:auto}.footer{align-items:center;background-color:var(--color-tertiary);display:flex;flex-direction:column;height:auto;padding:7rem 3rem}.footer__links{display:flex;flex-direction:row}.footer__link{color:var(--color-secondary);display:block;font-size:1.3rem;padding:2rem 5rem;text-decoration:none}.footer__link:hover{color:var(--color-bg-primary);text-decoration:underline}.footer__logo{height:8rem;margin:2rem}@media screen and (min-width:7600px){.nav__bar{padding:10rem}.nav__bar__logo{height:18rem}.nav__bar__links{gap:15rem}.nav__bar__link{font-size:6rem}.header__content{gap:60rem}.header__text h1{font-size:8rem}.header__text h4{font-size:5rem}.header__content__img{height:85.72rem;max-width:100rem}.section{padding:25rem}.section h2{font-size:5rem}.section h1{font-size:7rem}.sample__programs{max-width:200rem}.program__tab{font-size:4.5rem;margin:7rem;padding:5rem 10rem}.tab__contents{margin:auto;max-width:200rem}.tab__contents h4{font-size:4.5rem}.tab__contents img{margin:12rem}.code__sample{font-size:4rem;max-width:400rem}.section__content{gap:30rem}.section__text{font-size:4.5rem}.footer{padding:10rem 0}.footer__link{font-size:7rem}.footer__logo{height:24rem;margin:10rem auto 0}}@media screen and (max-width:7599px){.nav__bar{padding:7rem}.nav__bar__logo{height:13rem}.nav__bar__links{gap:7rem}.nav__bar__link{font-size:4rem}.header__content{gap:30rem}.header__text h1{font-size:6rem}.header__text h4{font-size:4rem}.header__content__img{height:68.57rem;max-width:80rem}.section{padding:14rem}.section h2{font-size:4rem}.section h1{font-size:5rem}.sample__programs{max-width:200rem}.program__tab{font-size:4rem;margin:4rem;padding:3rem 6rem}.tab__contents{margin:auto;max-width:200rem}.tab__contents h4{font-size:4rem}.tab__contents img{margin:10rem}.code__sample{font-size:3.5rem;max-width:200rem}.section__content{gap:30rem;padding-top:15rem}.section__text{font-size:4rem}.footer{padding:20rem 0}.footer__link{font-size:5rem}.footer__logo{height:18rem;margin:8rem auto 0}}@media screen and (max-width:5100px){.nav__bar{padding:5rem}.nav__bar__logo{height:9rem}.nav__bar__links{gap:7rem}.nav__bar__link{font-size:3rem}.header__content{gap:30rem}.header__text h1{font-size:4rem}.header__text h4{font-size:2.5rem}.header__content__img{height:42.86rem;max-width:50rem}.section{padding:12rem}.section h2{font-size:2.5rem}.section h1{font-size:3.5rem}.sample__programs{max-width:100rem}.program__tab{font-size:2.5rem;margin:3.5rem;padding:2rem 5rem}.tab__contents{margin:auto;max-width:100rem}.tab__contents h4{font-size:2rem}.tab__contents img{margin:6rem}.code__sample{font-size:2rem;max-width:200rem}.section__content{gap:20rem;padding-top:13rem}.section__text{font-size:2.25rem}.footer{padding:10rem 0}.footer__link{font-size:3.5rem}.footer__logo{height:12rem;margin:8rem auto 0}}@media screen and (max-width:3100px){.nav__bar{padding:1rem}.nav__bar__logo{height:6rem}.nav__bar__links{gap:5rem}.nav__bar__link{font-size:2rem}.header__content{gap:15rem}.header__text h1{font-size:3rem}.header__text h4{font-size:2rem}.header__content__img{height:25.71rem;max-width:30rem}.section{padding:4rem}.section h2{font-size:1.6rem}.section h1{font-size:2.3rem}.sample__programs{max-width:60rem}.program__tab{font-size:2rem;margin:1rem;padding:1rem 3rem}.tab__contents{margin:auto;max-width:60rem}.tab__contents h4{font-size:1.6rem}.tab__contents img{margin:2.5rem}.code__sample{font-size:1.4rem;max-width:60rem}.section__content{gap:10rem;padding-top:6rem}.section__text{font-size:1.4rem}.footer{padding:5rem 0}.footer__link{font-size:2rem}.footer__logo{height:6rem;margin:4rem auto 0}}@media screen and (max-width:2100px){.header,.nav__bar{height:auto}.nav__bar{padding:1rem}.nav__bar__logo{height:3.5rem}.nav__bar__links{gap:1.5rem}.nav__bar__link{font-size:1.2rem}.header__content{margin:10rem auto}.header__text h1{font-size:2rem}.header__text h4{font-size:1rem}.header__content__img{height:15.43rem;max-width:18rem}.section{padding:3rem}.section h2{font-size:1rem}.section h1{font-size:1.3rem}.sample__programs{max-width:80rem}.program__tab{font-size:1rem;margin:.5rem 1rem;padding:1rem 2rem}.tab__contents{margin:auto;max-width:80rem}.tab__contents h4{font-size:1rem}.tab__contents img{margin:1.2rem}.code__sample{font-size:1rem;max-width:60rem}.section__content{gap:5rem;padding-top:2rem}.section__text{font-size:1rem}.footer{padding:2rem 0}.footer__link{font-size:1rem}.footer__logo{height:3rem;margin:2rem auto 0}}@media screen and (max-width:1280px){.nav__bar{flex-direction:column;padding:1rem}.nav__bar__logo{height:4rem}.nav__bar__links{gap:2rem}.nav__bar__link{font-size:1.4rem}.header__content{align-items:center;flex-direction:column;gap:3rem;margin:5rem auto}.header__text h1{font-size:2rem}.header__text h4{font-size:1rem}.header__content__img{height:15.43rem;max-width:18rem}.section{padding:3rem}.section h2{font-size:1rem}.section h1{font-size:1.3rem}.sample__programs{max-width:60rem}.program__tab{font-size:1rem;margin:.5rem;padding:1rem 2rem}.tab__contents{margin:auto;max-width:40rem}.tab__contents h4{font-size:1rem}.tab__contents img{margin:1rem}.code__sample{font-size:1rem;max-width:40rem}.section__content{gap:5rem;padding-top:2rem}.section__text{font-size:1rem}.footer{padding:2rem 0}.footer__link{font-size:1rem}.footer__logo{height:3rem;margin:2rem auto 0}}@media screen and (max-width:750px){.section{margin:1rem 0;padding:4rem 1rem}.section__content{align-items:center;flex-direction:column}.programs__tab-container{margin:1.5rem 0}.sample__programs{margin:0}.tab__contents{padding:0}}@media screen and (max-width:640px){.nav__bar{padding:.25rem}.nav__bar__logo{height:3rem}.nav__bar__links{gap:.5rem}.nav__bar__link{font-size:.9rem}.footer__link{padding:1.5rem}}@media screen and (max-width:510px){.nav__bar__links{gap:0}.nav__bar__item{margin:auto 1rem}.nav__bar__link,.program__tab{font-size:.9rem}.program__tab{padding:1rem .5rem}} \ No newline at end of file diff --git a/docs/blog.html b/docs/blog.html deleted file mode 100644 index 2ed7a17..0000000 --- a/docs/blog.html +++ /dev/null @@ -1 +0,0 @@ -Yaksha Programming Language

New website structure

Created 2023-08-13, Last Updated 2023-09-07
  • Author: Bhathiya Perera

Website

I have been working hard on updating the website infrastructure. New local PDF building feature is going to come in handy for downloadable documentation builds.

Additionally, (b)log section will be used for any updates.

New sr string feature

This is going to help avoid copying and freeing strings by simply referencing these strings. However, note that sr can hold references to both statically allocated string literals and to dynamically allocated strings. Statically allocated strings will also store fixed length of the underlying string.

If you delete an sr it will delete underlying string (except when it is a statically allocated string (literal)).

More features to come!

I have been writing new features I want to add as YAMA articles. Now they are in the same website and can be easily accessed.

CSS

Ha! CSS is hard. Very hard. Perhaps I should have used some prebuilt theme.

Docbox

Now this is moved into the website package itself.

\ No newline at end of file diff --git a/docs/demos.html b/docs/demos.html deleted file mode 100644 index e6d1dae..0000000 --- a/docs/demos.html +++ /dev/null @@ -1,1120 +0,0 @@ -Yaksha Programming Language

Fractal tree implementation

Created 2023-08-13, Last Updated 2023-09-07

Hint: Refresh to get a new random tree

Code
import raylib as rl
-import raylib.utils
-import libs.numbers as num
-import libs.perlin
-import libs.random
-
-
-class State:
-    width: float
-    height: float
-    angle: float
-    frame_count: u64
-    blue: rl.Color
-    green: rl.Color
-    color3: rl.Color
-
-
-def branch(x: float, y: float, length: float, angle: float, s: State) -> None:
-    if length < 4.0f:
-        leaf_width = random.random_betweenf(1.0f, 3.0f)
-        leaf_height = random.random_betweenf(3.0f, 6.0f)
-        lerped_green = utils.lerp_color(s.green, s.blue, utils.remap(x, 0.0f, s.width, 0.0f, 1.0f) * 2.0f)
-        color = utils.lerp_color(lerped_green, s.color3, utils.remap(y, 0.0f, s.height, 0.0f, 1.0f) * 1.5f)
-        rl.draw_ellipse(num.f2i(x), num.f2i(y), leaf_height, leaf_width, color)
-        return
-    wind = utils.sin_deg(perlin.noise1df(num.uu2f(s.frame_count) / 50.0f)) * 100.0f * utils.sin_deg(num.uu2f(s.frame_count) / 2.0f)
-    next_y = y - length * utils.cos_deg(angle)
-    next_x = x + length * utils.sin_deg(angle)
-    thick = utils.remap(length, 0.0f, s.height / 4.0f, 2.0f, 6.0f)
-    rl.draw_line_ex(rl.vector2(x, y), rl.vector2(next_x, next_y), thick, rl.color(152, 50, 1, 255))
-    r1 = random.random_betweenf(0.3f, 0.9f)
-    r2 = random.random_betweenf(0.5f, 0.8f)
-    branch(next_x, next_y, (length * r2), angle + s.angle + wind * 10.0f, s)
-    branch(next_x, next_y, (length * r1), angle - s.angle + wind * 10.0f, s)
-
-
-def update_draw_frame(s: State) -> None:
-    rl.clear_background(rl.color(255, 255, 255, 255))
-    branch(s.width / 2.0f, s.height, s.height / 4.0f, 0.0f, s)
-
-
-def main() -> int:
-    s: State = State()
-    s.angle = random.random_betweenf(30.0f, 45.0f)
-    s.width = 600.0f
-    s.height = 600.0f
-    s.frame_count = 0u64
-    s.blue = rl.color(0, 255, 214, 255)
-    s.green = rl.color(0, 255, 0, 255)
-    s.color3 = rl.color(255, 45, 156, 255)
-    rl.init_window(num.f2i(s.width), num.f2i(s.height), "Fractal Tree in the Wind")
-    rl.set_target_fps(120)
-    seed: u64 = random.init_random()
-    while not rl.window_should_close():
-        rl.begin_drawing()
-        update_draw_frame(s)
-        rl.draw_fps(0, 0)
-        rl.end_drawing()
-        s.frame_count += 1u64
-        random.set_seed(seed)
-    rl.close_window()
-    del s
-    return 0
-
Show demo in a new tab
Show demo inline


Space blast

Created 2023-08-13, Last Updated 2023-09-07

Hint: You need a keyboard to play this

Code
# All assets from https://www.kenney.nl/assets/
-# Code ported to Yaksha based on https://github.com/tashvit/space-blast
-
-import raylib as rl
-import raylib.utils
-import libs.numbers as num
-import libs.perlin
-import libs.random
-
-SCENE_TITLE: Const[u8] = 0u8
-SCENE_PLAY: Const[u8] = 1u8
-SCENE_GAME_OVER: Const[u8] = 2u8
-GAME_W: Const[int] = 1920
-GAME_H: Const[int] = 1080
-STAR_COUNT: Const[int] = 100
-ENEMY_COUNT: Const[int] = 20
-FPS_TARGET: Const[int] = 60
-PLAYER_BULLETS: Const[int] = 10
-ENEMY_BULLET_MAX: Const[int] = 5
-
-@onstack
-class Star:
-    x: int
-    y: int
-    speed: int
-    r: int
-
-@onstack
-class Bullet:
-    x: int
-    y: int
-
-@onstack
-class Enemy:
-    x: int
-    y: int
-    speed: int
-    type: int
-    swing: int
-    bullet: Bullet
-
-class State:
-    frame_count: u64
-    assets: Assets
-    player_x: int
-    player_y: int
-    speed: int
-    stars: Array[Star]
-    enemies: Array[Enemy]
-    scene: u8
-    player_moving: bool
-    player_bullets: Array[Bullet]
-    player_score: int
-
-class Assets:
-    loaded: bool
-    bg: rl.Color
-    white: rl.Color
-    player: rl.Texture2D
-    enemy1: rl.Texture2D
-    enemy2: rl.Texture2D
-    enemy3: rl.Texture2D
-    enemy4: rl.Texture2D
-    enemy5: rl.Texture2D
-    meteor: rl.Texture2D
-    enemy_laser: rl.Texture2D
-    player_laser: rl.Texture2D
-    enemy_laser_sound: rl.Sound
-    player_laser_sound: rl.Sound
-    explosion_sound: rl.Sound
-
-def update_stars(s: State) -> None:
-    for star: Star in s.stars:
-        star.y += star.speed
-        # if we are out of the screen recreate the star
-        if star.y > GAME_H + 10:
-            star.y = -10
-            star.x = rl.get_random_value(0, GAME_W)
-            star.r = rl.get_random_value(1, 4)
-
-def update_player_bullets(s: State, pressed_fire: bool) -> None:
-    to_fire: bool = pressed_fire
-    for bullet: Bullet in s.player_bullets:
-        if bullet.y == -999 and to_fire and s.frame_count % 8u64 == 0u64:
-            bullet.y = s.player_y - 32
-            bullet.x = s.player_x - 32
-            rl.play_sound(s.assets.player_laser_sound)
-            to_fire = False
-        if bullet.y < 0:
-            bullet.y = -999
-            bullet.x = -999
-        if bullet.y != -999:
-            bullet.y -= 10
-
-def update_player(s: State) -> None:
-    w2: int = cast("int", s.assets.player.width) / 2
-    h2: int = cast("int", s.assets.player.height) / 2
-    s.player_moving = False
-    # User pressed a key -> move the player
-    if rl.is_key_down(rl.KEY_W) or rl.is_key_down(rl.KEY_UP):
-        s.player_y -= s.speed
-        s.player_moving = True
-    if rl.is_key_down(rl.KEY_A) or rl.is_key_down(rl.KEY_LEFT):
-        s.player_x -= s.speed
-        s.player_moving = True
-    if rl.is_key_down(rl.KEY_S) or rl.is_key_down(rl.KEY_DOWN):
-        s.player_y += s.speed
-        s.player_moving = True
-    if rl.is_key_down(rl.KEY_D) or rl.is_key_down(rl.KEY_RIGHT):
-        s.player_x += s.speed
-        s.player_moving = True
-    update_player_bullets(s, rl.is_key_down(rl.KEY_SPACE))
-
-    # Ensure that the player width/height is constrained
-    # So we cannot go out of the bounds
-    if s.player_x <= w2:
-        s.player_x = w2
-    if s.player_x >= GAME_W - w2:
-        s.player_x = GAME_W - w2
-    if s.player_y <= h2:
-        s.player_y = h2
-    if s.player_y >= GAME_H - h2:
-        s.player_y = GAME_H - h2
-    # Check collisions with enemies
-    for enemy: Enemy in s.enemies:
-        enemy_collide: bool = collides(get_enemy_ship(s, enemy.type), enemy.x, enemy.y, s.assets.player, s.player_x, s.player_y)
-        bullet_collide: bool = collides(s.assets.enemy_laser, enemy.bullet.x, enemy.bullet.y, s.assets.player, s.player_x, s.player_y)
-        if enemy_collide or bullet_collide:
-            s.scene = SCENE_GAME_OVER
-            rl.play_sound(s.assets.explosion_sound)
-            break
-        for bullet: Bullet in s.player_bullets:
-            enemy_in_fire: bool = collides(get_enemy_ship(s, enemy.type), enemy.x, enemy.y, s.assets.player_laser, bullet.x, bullet.y)
-            bulllets_collide: bool = collides(s.assets.enemy_laser, enemy.bullet.x, enemy.bullet.y, s.assets.player_laser, bullet.x, bullet.y)
-            if bullet.y != -999 and enemy_in_fire:
-                s.player_score += 10
-                enemy.y = GAME_H + 50
-                bullet.y = -999
-                bullet.x = -999
-                rl.play_sound(s.assets.explosion_sound)
-            if bullet.y != -999 and bulllets_collide:
-                enemy.bullet.x = -999
-                enemy.bullet.y = -999
-                bullet.y = -999
-                bullet.x = -999
-
-def update_enemies(s: State) -> None:
-    active_bullets: int = 0
-    for enemy: Enemy in s.enemies:
-        if enemy.bullet.y != -999:
-            active_bullets += 1
-
-    for enemy: Enemy in s.enemies:
-        enemy.y += enemy.speed
-        swing: u64 = cast("u64", enemy.swing) + s.frame_count
-        enemy.x += enemy.speed * iif(swing % 60u64 < 30u64, 1, -1)
-        if enemy.y > GAME_H + 50:
-            enemy.y = -rl.get_random_value(60, 100)
-            enemy.x = rl.get_random_value(0, GAME_W)
-            enemy.type = rl.get_random_value(1, 5)
-            enemy.swing = rl.get_random_value(100, 10000)
-        elif swing % 6u64 == 0u64 and enemy.bullet.y == -999 and enemy.y > 5 and active_bullets < ENEMY_BULLET_MAX:
-            enemy.bullet.x = enemy.x + 32
-            enemy.bullet.y = enemy.y + 32
-            rl.play_sound(s.assets.enemy_laser_sound)
-            active_bullets += 1
-        if enemy.bullet.y > GAME_H + 50:
-            enemy.bullet.x = -999
-            enemy.bullet.y = -999
-            active_bullets -= 1
-        elif enemy.bullet.y != -999:
-            enemy.bullet.y += 6
-
-def draw_stars(s: State) -> None:
-    for star: Star in s.stars:
-        if star.r == 4:
-            draw_image(s.assets.meteor, star.x, star.y)
-        else:
-            rl.draw_circle(star.x, star.y, cast("float", star.r), s.assets.white)
-
-def draw_enemies(s: State) -> None:
-    for enemy: Enemy in s.enemies:
-        draw_image(get_enemy_ship(s, enemy.type), enemy.x, enemy.y)
-        if enemy.bullet.y != -999:
-            draw_image(s.assets.enemy_laser, enemy.bullet.x, enemy.bullet.y)
-
-def draw_player(s: State) -> None:
-    draw_image(s.assets.player, s.player_x, s.player_y)
-    for bullet: Bullet in s.player_bullets:
-        if bullet.y != -999:
-            draw_image(s.assets.player_laser, bullet.x, bullet.y)
-
-def game_step(d: utils.Data) -> None:
-    s: State = cast("State", d)
-    ensure_assets(s)
-    rl.begin_drawing()
-    rl.clear_background(s.assets.bg)
-    # ----------------------------------------------
-    # ----------------------------------------------
-    if s.scene == SCENE_PLAY:
-        update_player(s)
-        update_stars(s)
-        update_enemies(s)
-        if s.frame_count % 60u64 == 0u64:
-            s.player_score += 1
-    draw_stars(s)
-    draw_player(s)
-    draw_enemies(s)
-    if s.scene == SCENE_TITLE:
-        if (s.frame_count / 50u64) % 2u64 == 0u64:
-            rl.draw_text("Press [enter] to start", GAME_W / 2 - 450, GAME_H / 2 - 30, 80, s.assets.white)
-        if rl.is_key_down(rl.KEY_ENTER):
-            s.scene = SCENE_PLAY
-    if s.scene == SCENE_GAME_OVER:
-        if (s.frame_count / 50u64) % 2u64 == 0u64:
-            rl.draw_text("Game over ", GAME_W / 2 - 200, GAME_H / 2 - 30, 80, s.assets.white)
-            rl.draw_text("Press [enter] to start", GAME_W / 2 - 450, GAME_H / 2 + 50, 80, s.assets.white)
-        if rl.is_key_down(rl.KEY_ENTER):
-            s.scene = SCENE_PLAY
-            reset_state(s)
-    # -----------------------------------------------
-    # ----------------------------------------------
-    rl.draw_fps(0, 0)
-    rl.draw_text(num.i2s(s.player_score), GAME_W - 300, 0, 64, rl.color(0, 255, 0, 255))
-    rl.end_drawing()
-    s.frame_count = s.frame_count + 1u64
-
-def init_state() -> State:
-    s: State = State()
-    s.frame_count = 0u64
-    s.assets = Assets()
-    s.assets.loaded = False
-    s.stars = arrnew("Star", STAR_COUNT)
-    s.enemies = arrnew("Enemy", ENEMY_COUNT)
-    s.player_bullets = arrnew("Bullet", PLAYER_BULLETS)
-    random.init_random()
-    reset_state(s)
-    return s
-
-def reset_state(s: State) -> None:
-    s.player_x = GAME_H / 2
-    s.player_y = GAME_W / 2
-    s.speed = 5
-    s.player_score = 0
-
-    for bullet: Bullet in s.player_bullets:
-        bullet.x = -999
-        bullet.y = -999
-
-    for star: Star in s.stars:
-        star.x = rl.get_random_value(0, GAME_W)
-        star.y = rl.get_random_value(0, GAME_H)
-        star.speed = rl.get_random_value(1, 4)
-        star.r = rl.get_random_value(1, 4)
-
-    for enemy: Enemy in s.enemies:
-        enemy.x = rl.get_random_value(0, GAME_W)
-        enemy.y = -rl.get_random_value(60, 100)
-        enemy.speed = rl.get_random_value(1, 5)
-        enemy.type = rl.get_random_value(1, 5)
-        enemy.swing = rl.get_random_value(100, 10000)
-        enemy.bullet.x = -999
-        enemy.bullet.y = -999
-
-def ensure_assets(s: State) -> None:
-    if s.assets.loaded:
-        return
-    s.assets.bg = rl.color(0, 0, 0, 255)
-    s.assets.white = rl.color(255, 255, 255, 255)
-    s.assets.player = load_image("playerShip1_blue.png")
-    s.assets.enemy1 = load_image("shipBeige_manned.png")
-    s.assets.enemy2 = load_image("shipBlue_manned.png")
-    s.assets.enemy3 = load_image("shipPink_manned.png")
-    s.assets.enemy4 = load_image("shipGreen_manned.png")
-    s.assets.enemy5 = load_image("shipYellow_manned.png")
-    s.assets.meteor = load_image("meteorGrey_tiny2.png")
-    s.assets.enemy_laser = load_image("laserRed03.png")
-    s.assets.player_laser = load_image("laserBlue03.png")
-    s.assets.player_laser_sound = load_sound("laserRetro_000.ogg")
-    s.assets.enemy_laser_sound = load_sound("laserRetro_004.ogg")
-    s.assets.explosion_sound = load_sound("explosionCrunch_000.ogg")
-    s.assets.loaded = True
-
-def del_state(current: utils.Data) -> None:
-    s: State = cast("State", current)
-    if s.assets.loaded:
-        rl.unload_texture(s.assets.player)
-        rl.unload_texture(s.assets.enemy1)
-        rl.unload_texture(s.assets.enemy2)
-        rl.unload_texture(s.assets.enemy3)
-        rl.unload_texture(s.assets.enemy4)
-        rl.unload_texture(s.assets.enemy5)
-        rl.unload_texture(s.assets.enemy_laser)
-        rl.unload_texture(s.assets.player_laser)
-        rl.unload_sound(s.assets.player_laser_sound)
-        rl.unload_sound(s.assets.enemy_laser_sound)
-        rl.unload_sound(s.assets.explosion_sound)
-    del s.enemies
-    del s.stars
-    del s.assets
-    del s.player_bullets
-    del s
-
-def main() -> int:
-    s: State = init_state()
-    s.scene = SCENE_TITLE
-    rl.init_window(GAME_W, GAME_H, "Space blast")
-    rl.set_target_fps(60)
-    rl.init_audio_device()
-    while not rl.window_should_close():
-        game_step(cast("utils.Data", s))
-    del_state(cast("utils.Data", s))
-    rl.close_audio_device()
-    rl.close_window()
-    return 0
-
-# ------------ Utilities -----------
-
-def load_image(s: str) -> rl.Texture2D:
-    path: str
-    path = "assets/img/" + s
-    return rl.load_texture(path)
-
-def load_sound(s: str) -> rl.Sound:
-    path: str
-    path = "assets/audio/" + s
-    return rl.load_sound(path)
-
-def draw_image(img: rl.Texture2D, x: int, y: int) -> None:
-    w: int = cast("int", img.width)
-    h: int = cast("int", img.height)
-    rl.draw_texture(img, x - w / 2, y - h / 2, rl.color(255, 255, 255, 255))
-
-def rectangle(img: rl.Texture2D, x: int, y: int) -> rl.Rectangle:
-    w: int = cast("int", img.width) - 2
-    h: int = cast("int", img.height) - 2
-    actual_x: float = cast("float", x - w / 2) + 1.0f
-    actual_y: float = cast("float", y - h / 2) + 1.0f
-    return rl.rectangle(actual_x, actual_y, cast("float", w), cast("float", h))
-
-def collides(img1: rl.Texture2D, x1: int, y1: int, img2: rl.Texture2D, x2: int, y2: int) -> bool:
-    return rl.check_collision_recs(rectangle(img1, x1, y1), rectangle(img2, x2, y2))
-
-def get_enemy_ship(s: State, asset: int) -> rl.Texture2D:
-    enemy: rl.Texture2D
-    if asset == 1:
-        enemy = s.assets.enemy1
-    if asset == 2:
-        enemy = s.assets.enemy2
-    if asset == 3:
-        enemy = s.assets.enemy3
-    if asset == 4:
-        enemy = s.assets.enemy4
-    if asset == 5:
-        enemy = s.assets.enemy5
-    return enemy
-
Show demo in a new tab
Show demo inline


GUI Demo

Created 2023-08-13, Last Updated 2023-09-07

Try pressing the counter buttons below

Code
import raylib as rl
-import raylib.utils
-import raylib.gui
-import libs.numbers as num
-
-def main() -> int:
-    width = 200
-    height = 160
-    counter1 = 0
-    counter2 = 0
-    rl.init_window(width, height, "Counter")
-    rl.set_target_fps(120)
-    while not rl.window_should_close():
-        rl.begin_drawing()
-        rl.clear_background(rl.color(255, 255, 255, 255))
-        gui.gui_panel(rl.rectangle(10.0f, 10.0f, num.i2f(width) - 20.0f, num.i2f(height) - 20.0f), "<Counter>")
-        widget_width = num.i2f(width) - 40.0f
-        # Counter 1
-        gui.gui_label(rl.rectangle(20.0f, 40.0f, widget_width, 20.0f), "Count:" + num.i2s(counter1))
-        if gui.gui_button(rl.rectangle(20.0f, 60.0f, widget_width, 20.0f), "Count"):
-            counter1 = counter1 + 1
-        # Counter 2
-        gui.gui_label(rl.rectangle(20.0f, 80.0f, widget_width, 20.0f), "Count:" + num.i2s(counter2))
-        if gui.gui_button(rl.rectangle(20.0f, 100.0f, widget_width, 20.0f), "Count"):
-            counter2 = counter2 + 1
-        # Asciimoji status bar
-        animation = (counter1 + counter2) % 3
-        if animation == 1:
-            gui.gui_status_bar(rl.rectangle(10.0f, num.i2f(height) - 30.0f, num.i2f(width) - 20.0f, 20.0f), " \\- (- _ -) -/")
-        else:
-            gui.gui_status_bar(rl.rectangle(10.0f, num.i2f(height) - 30.0f, num.i2f(width) - 20.0f, 20.0f), " \\- (o _ o) -/")
-        rl.draw_fps(20, 540)
-        rl.end_drawing()
-    rl.close_window()
-    return 0
-
Show demo in a new tab
Show demo inline


WASM4 Demo - notes

Created 2023-08-13, Last Updated 2023-09-07

Hint: Something like Nokia ringtone maker for WASM4

Code
# =========================================================================================
-#        ________________________________
-#       /    o   oooo ooo oooo   o o o  /\
-#      /    oo  ooo  oo  oooo   o o o  / /
-#     /    _________________________  / /
-#    / // / // /// // /// // /// / / / /
-#   /___ //////////////////////////_/ /
-#   \____\________________________\_\/
-#
-#  **notes**: Application by -- Bhathiya Perera --
-#        For WASM4 Fantasy Console
-#
-# =========================================================================================
-# ASCII ART by Forrest Cook -- reference https://asciiart.website/index.php?art=music/pianos
-# Note Frequencies          -- reference https://pages.mtu.edu/~suits/notefreqs.html
-# Nokia composer web app    -- reference https://zserge.com/nokia-composer/h/
-# =========================================================================================
-# Nokia Tune:
-# 3e3 3d3 2f#2 2g#2 3c#3 3b2 2d2 2e2 3b2 3a2 2c#2 2e2 1a2 1R
-# =========================================================================================
-import w4
-import libs.numbers as num
-import libs.perlin
-import libs.random
-import libs.c as mini_clib
-
-# Total notes allowed
-MAX_NOTES       :Const[int] = 256
-FONT_WIDTH      :Const[int] = 8
-NOTE_WRAP_AROUND:Const[int] = 55
-# ======= Notes ===========
-NOTE_C:   Const[u8] = 1u8
-NOTE_C_S: Const[u8] = 2u8
-NOTE_D:   Const[u8] = 3u8
-NOTE_D_S: Const[u8] = 4u8
-NOTE_E:   Const[u8] = 5u8
-NOTE_F:   Const[u8] = 6u8
-NOTE_F_S: Const[u8] = 7u8
-NOTE_G:   Const[u8] = 8u8
-NOTE_G_S: Const[u8] = 9u8
-NOTE_A:   Const[u8] = 10u8
-NOTE_A_S: Const[u8] = 11u8
-NOTE_B:   Const[u8] = 12u8
-NOTE_REST:Const[u8] = 13u8
-# Play until we find this
-NOTE_NULL:Const[u8] = 0u8
-
-# ======= Notes Time ======
-# 1/pow(2, TIME)
-TIME_64:  Const[u8] = 6u8
-TIME_32:  Const[u8] = 5u8
-TIME_16:  Const[u8] = 4u8
-TIME_8:   Const[u8] = 3u8
-TIME_4:   Const[u8] = 2u8
-TIME_HALF:Const[u8] = 1u8
-TIME_FULL:Const[u8] = 0u8
-
-# ====Note Octaves ========
-OCTAVE_1 :Const[u8] = 0u8
-OCTAVE_2 :Const[u8] = 1u8
-OCTAVE_3 :Const[u8] = 2u8
-
-# == Editing Modes ========
-MODE_TIME:Const[u8] = 0u8
-MODE_NOTE:Const[u8] = 1u8
-MODE_OCT :Const[u8] = 2u8
-MODE_DEL :Const[u8] = 3u8
-# max, min mode
-TOTAL_MODES :Const[u8] = 4u8
-
-
-class State:
-    width: int
-    height: int
-    frame_count: u64
-    gamepad_prev: u8
-    text_buf: Array[u8]
-    # Tuple [u8 - time, u8 - note, u8 - octave, u8 - extra]
-    note_buf: Array[Tuple[u8,u8,u8,u8]]
-    note_freq: Array[int]
-    note_time: Array[int]
-    # Cursor position
-    cursor: int
-    prev_cursor: int
-    v_start: int
-    v_end: int
-    note_count: int
-    mode: u8
-    playing: bool
-    play_on: u64
-
-def clear_buf(target: Array[u8]) -> None:
-    target[0] = 0u8
-    target[1] = 0u8
-    target[2] = 0u8
-    target[3] = 0u8
-    target[4] = 0u8
-    target[5] = 0u8
-    target[6] = 0u8
-    target[7] = 0u8
-    target[8] = 0u8
-    target[9] = 0u8
-    target[10] = 0u8
-
-def i2s(x: int, target: Array[u8]) -> bool:
-    # Convert given integer to a string
-    # Support up to 10 character output (size 11 buffer is required)
-    charset: Ptr[Const[u8]] = binarydata("0123456789- \0")
-    clear_buf(target)
-    pos: int = 0
-    y: int = x
-    if x > 9999999999 or x < -999999999:
-        target[0] = cast("u8", charat(cast("str", charset), 10))
-        return False
-    if x < 0:
-        y *= -1
-        target[pos] = cast("u8", charat(cast("str", charset), 10))
-    else:
-        target[pos] = cast("u8", charat(cast("str", charset), 11))
-    pos += 1
-    if y == 0:
-        target[pos] = cast("u8", charat(cast("str", charset), 0))
-        pos += 1
-    while y != 0:
-        character: int = y % 10
-        target[pos] = cast("u8", charat(cast("str", charset), character))
-        pos += 1
-        y /= 10
-    # Reverse from 1 to pos
-    rpos: int = 1
-    rmax: int = (pos / 2) + 1
-    while rpos < rmax:
-        temp: u8 = target[rpos]
-        target[rpos] = target[pos - rpos]
-        target[pos - rpos] = temp
-        rpos += 1
-    return True
-
-def del_note(s: State) -> None:
-    if s.note_count == 0:
-        return
-    x: int = s.cursor + 1
-    last: int = s.note_count - 1
-    while x <= last:
-        s.note_buf[x - 1][0] = s.note_buf[x][0]
-        s.note_buf[x - 1][1] = s.note_buf[x][1]
-        s.note_buf[x - 1][2] = s.note_buf[x][2]
-        s.note_buf[x - 1][3] = s.note_buf[x][3]
-        x += 1
-    s.note_buf[last][0] = NOTE_NULL
-    s.note_buf[last][1] = NOTE_NULL
-    s.note_buf[last][2] = NOTE_NULL
-    s.note_buf[last][3] = NOTE_NULL
-    s.note_count -= 1
-    if s.cursor >= s.note_count:
-        s.cursor = s.note_count - 1
-    if s.cursor < 0:
-        s.cursor = 0
-
-def add_left(s: State) -> None:
-    # We are full
-    if s.note_count == MAX_NOTES:
-        return
-    if s.note_count == 0:
-        s.note_buf[0][0] = TIME_4
-        s.note_buf[0][1] = NOTE_C
-        s.note_buf[0][2] = OCTAVE_2
-        s.note_buf[0][3] = 0u8
-        s.note_count = 1
-        s.cursor = 0
-        return
-    # Add at cursor location + 1
-    # Move everything from right most to + 1 position
-    x: int = s.note_count - 1
-    while x >= s.cursor:
-        s.note_buf[x + 1][0] = s.note_buf[x][0]
-        s.note_buf[x + 1][1] = s.note_buf[x][1]
-        s.note_buf[x + 1][2] = s.note_buf[x][2]
-        s.note_buf[x + 1][3] = s.note_buf[x][3]
-        x -= 1
-    s.note_buf[s.cursor][0] = TIME_4
-    # Alternatively add note c and note rest
-    if s.note_count % 2 != 0:
-        s.note_buf[s.cursor][1] = NOTE_C
-    else:
-        s.note_buf[s.cursor][1] = NOTE_REST
-    s.note_buf[s.cursor][2] = OCTAVE_2
-    s.note_buf[s.cursor][3] = 0u8
-    s.note_count += 1
-
-def add_right(s: State) -> None:
-    # We are full
-    if s.note_count == MAX_NOTES:
-        return
-    if s.note_count == 0:
-        s.note_buf[0][0] = TIME_4
-        s.note_buf[0][1] = NOTE_C
-        s.note_buf[0][2] = OCTAVE_2
-        s.note_buf[0][3] = 0u8
-        s.note_count = 1
-        s.cursor = 0
-        return
-    # Add at cursor location + 1
-    # Move everything from right most to + 1 position
-    x: int = s.note_count - 1
-    while x >= s.cursor + 1:
-        s.note_buf[x + 1][0] = s.note_buf[x][0]
-        s.note_buf[x + 1][1] = s.note_buf[x][1]
-        s.note_buf[x + 1][2] = s.note_buf[x][2]
-        s.note_buf[x + 1][3] = s.note_buf[x][3]
-        x -= 1
-    s.note_buf[s.cursor + 1][0] = TIME_4
-    # Alternatively add note c and note rest
-    if s.note_count % 2 != 0:
-        s.note_buf[s.cursor + 1][1] = NOTE_C
-    else:
-        s.note_buf[s.cursor + 1][1] = NOTE_REST
-    s.note_buf[s.cursor + 1][2] = OCTAVE_2
-    s.note_buf[s.cursor + 1][3] = 0u8
-    s.note_count += 1
-    s.cursor += 1
-
-def up_note(s: State) -> None:
-    if s.note_count == 0:
-        return
-    if s.mode == MODE_TIME:
-        s.note_buf[s.cursor][0] += 1u8
-        if s.note_buf[s.cursor][0] > TIME_64:
-            s.note_buf[s.cursor][0] = TIME_FULL
-    if s.mode == MODE_NOTE:
-        s.note_buf[s.cursor][1] += 1u8
-        if s.note_buf[s.cursor][1] > NOTE_REST:
-            s.note_buf[s.cursor][1] = NOTE_C
-    if s.mode == MODE_OCT:
-        s.note_buf[s.cursor][2] += 1u8
-        if s.note_buf[s.cursor][2] > OCTAVE_3:
-            s.note_buf[s.cursor][2] = OCTAVE_1
-
-def down_note(s: State) -> None:
-    if s.note_count == 0:
-        return
-    if s.mode == MODE_TIME:
-        if s.note_buf[s.cursor][0] == TIME_FULL:
-            s.note_buf[s.cursor][0] = TIME_64
-        else:
-            s.note_buf[s.cursor][0] -= 1u8
-    if s.mode == MODE_NOTE:
-        if s.note_buf[s.cursor][1] == NOTE_C:
-            s.note_buf[s.cursor][1] = NOTE_REST
-        else:
-            s.note_buf[s.cursor][1] -= 1u8
-    if s.mode == MODE_OCT:
-        if s.note_buf[s.cursor][2] == OCTAVE_1:
-            s.note_buf[s.cursor][2] = OCTAVE_3
-        else:
-            s.note_buf[s.cursor][2] -= 1u8
-
-def handle_input(s: State) -> None:
-    just_pressed: u8 = w4.gamepad1() & (w4.gamepad1() ^ s.gamepad_prev)
-    if just_pressed & w4.BUTTON_2 != 0u8:
-        if s.playing:
-            # Stop
-            s.playing = False
-            s.cursor = s.prev_cursor
-            s.mode = MODE_NOTE
-        elif w4.gamepad1() & w4.BUTTON_1 != 0u8:
-            # Play
-            if s.note_count == 0:
-                return
-            s.prev_cursor = s.cursor
-            s.cursor = 0
-            s.playing = True
-        elif s.mode == MODE_DEL:
-            # Delete
-            del_note(s)
-        elif s.mode == MODE_OCT:
-            # Add left
-            add_left(s)
-        else:
-            add_right(s)
-    # Only if we are not playing
-    if not s.playing:
-        if just_pressed & w4.BUTTON_1 != 0u8:
-            s.mode += 1u8
-            s.mode %= TOTAL_MODES
-        if just_pressed & w4.BUTTON_UP != 0u8:
-            up_note(s)
-        if just_pressed & w4.BUTTON_DOWN != 0u8:
-            down_note(s)
-        if just_pressed & w4.BUTTON_LEFT != 0u8:
-            s.cursor -= 1
-            # Wrap around
-            if s.cursor < 0:
-                s.cursor = s.note_count - 1
-        if just_pressed & w4.BUTTON_RIGHT != 0u8:
-            s.cursor += 1
-            # Wrap around
-            if s.cursor > s.note_count - 1:
-                s.cursor = 0
-    s.gamepad_prev = w4.gamepad1()
-
-def draw_board(s: State) -> None:
-    w4.set_draw_colors(0x0014u16)
-    w4.text_u8(binarydata("mode:\0"), 2, 2)
-    i2s(s.note_count, s.text_buf)
-    w4.text_u8(cast("Ptr[Const[u8]]", s.text_buf), 120, 2)
-    w4.vline(118, 0, 10u32)
-    w4.vline(79, 0, 10u32)
-    w4.set_draw_colors(0x0012u16)
-    if s.note_count == 0:
-        i2s(0, s.text_buf)
-    else:
-        i2s(s.cursor + 1, s.text_buf)
-    w4.text_u8(cast("Ptr[Const[u8]]", s.text_buf), 80, 2)
-    w4.hline(0, 10, 160u32)
-    w4.hline(0, s.height - 10, 160u32)
-    if s.playing:
-        w4.text_u8(binarydata("play\0"), 44, 2)
-        w4.text_u8(binarydata("stop\0"), 55, s.height - 10 + 2)
-    elif s.mode == MODE_TIME:
-        w4.text_u8(binarydata("time\0"), 44, 2)
-        w4.text_u8(binarydata("add\x85\0"), 55, s.height - 10 + 2)
-    elif s.mode == MODE_NOTE:
-        w4.text_u8(binarydata("note\0"), 44, 2)
-        w4.text_u8(binarydata("add\x85\0"), 55, s.height - 10 + 2)
-    elif s.mode == MODE_OCT:
-        w4.text_u8(binarydata("octa\0"), 44, 2)
-        w4.text_u8(binarydata("add\x84\0"), 55, s.height - 10 + 2)
-    elif s.mode == MODE_DEL:
-        w4.set_draw_colors(0x0013u16)
-        w4.text_u8(binarydata("del \0"), 44, 2)
-        w4.text_u8(binarydata("del \0"), 55, s.height - 10 + 2)
-    w4.set_draw_colors(0x0014u16)
-    if not s.playing:
-        w4.text_u8(binarydata("\x80\0"), 2, s.height - 10 + 2)
-    w4.text_u8(binarydata("\x81\0"), 45, s.height - 10 + 2)
-    if not s.playing:
-        w4.text_u8(binarydata("\x80+\x81\0"), 88, s.height - 10 + 2)
-        w4.set_draw_colors(0x0012u16)
-        w4.text_u8(binarydata("mode\0"), 12, s.height - 10 + 2)
-    if not s.playing:
-        w4.text_u8(binarydata("play\0"), 114, s.height - 10 + 2)
-
-def draw_note(s: State, grid_pos: int, note_pos: int, cursor: bool) -> None:
-    note_data: Array[u8] = cast("Array[u8]", binarydata("cdefgabR#0"))
-    # Do not draw empty notes
-    if s.note_buf[note_pos][1] == NOTE_NULL:
-        return
-    x: int = 4 + (grid_pos % 4) * 40
-    y: int = 12 + (grid_pos / 4) * 10
-    x_delta: int = 0
-    clear_buf(s.text_buf)
-    # Put the time indicator to the buffer
-    s.text_buf[0] = note_data[9] + s.note_buf[note_pos][0]
-    if cursor:
-        w4.set_draw_colors(0x0042u16)
-    else:
-        w4.set_draw_colors(0x0012u16)
-    w4.text_u8(cast("Ptr[Const[u8]]", s.text_buf), x + x_delta, y)
-    x_delta += FONT_WIDTH
-    # Put note indicator
-    note: u8 = s.note_buf[note_pos][1]
-    if note == NOTE_C or note == NOTE_C_S:
-        s.text_buf[0] = note_data[0]
-    if note == NOTE_D or note == NOTE_D_S:
-        s.text_buf[0] = note_data[1]
-    if note == NOTE_E:
-        s.text_buf[0] = note_data[2]
-    if note == NOTE_F or note == NOTE_F_S:
-        s.text_buf[0] = note_data[3]
-    if note == NOTE_G or note == NOTE_G_S:
-        s.text_buf[0] = note_data[4]
-    if note == NOTE_A or note == NOTE_A_S:
-        s.text_buf[0] = note_data[5]
-    if note == NOTE_B:
-        s.text_buf[0] = note_data[6]
-    if note == NOTE_REST:
-        s.text_buf[0] = note_data[7]
-    elif note == NOTE_C_S or note == NOTE_D_S or note == NOTE_F_S or note == NOTE_G_S or note == NOTE_A_S:
-        s.text_buf[1] = note_data[8]
-    if cursor:
-        w4.set_draw_colors(0x0043u16)
-    else:
-        w4.set_draw_colors(0x0013u16)
-    w4.text_u8(cast("Ptr[Const[u8]]", s.text_buf), x + x_delta, y)
-    x_delta += FONT_WIDTH
-    if s.text_buf[1] != 0u8:
-        # handle '#' sign
-        x_delta += FONT_WIDTH
-    s.text_buf[1] = 0u8
-    # Put octave indicator
-    if note != NOTE_REST:
-        s.text_buf[0] = note_data[9] + 1u8 + s.note_buf[note_pos][2]
-        if cursor:
-            w4.set_draw_colors(0x0041u16)
-        else:
-            w4.set_draw_colors(0x0014u16)
-        w4.text_u8(cast("Ptr[Const[u8]]", s.text_buf), x + x_delta, y)
-
-def draw_notes(s: State) -> None:
-    # Nothing to draw
-    if s.note_count == 0:
-        return
-    if s.cursor < s.v_start:
-        # moved left
-        s.v_start = s.cursor
-        s.v_end = s.v_start + NOTE_WRAP_AROUND
-    elif s.cursor > s.v_end:
-        # moved right
-        s.v_end = s.cursor
-        s.v_start = s.v_end - NOTE_WRAP_AROUND
-    else:
-        s.v_end = s.v_start + NOTE_WRAP_AROUND
-    if s.v_start < 0:
-        s.v_start = 0
-    if s.v_end > s.note_count - 1:
-        s.v_end = s.note_count - 1
-    x: int = s.v_start
-    grid_pos: int  = 0
-    while x < s.note_count and x <= s.v_end:
-        current: bool = x == s.cursor
-        # Show current playing in playing mode
-        if s.playing:
-            prev: int = x - 1
-            if prev < 0:
-                prev = s.note_count - 1
-            current = prev == s.cursor
-        draw_note(s, grid_pos, x, current)
-        x += 1
-        grid_pos += 1
-
-def play_notes(s: State) -> None:
-    if not s.playing:
-        return
-    # Play the next note on nth frame
-    if s.play_on > s.frame_count:
-        return
-    time: u8 = s.note_buf[s.cursor][0]
-    note: u8 = s.note_buf[s.cursor][1]
-    octv: u8 = s.note_buf[s.cursor][2]
-    actual_note: u8 = octv * 12u8 + note
-    note_time: u32 = cast("u32", s.note_time[time])
-    s.play_on = s.frame_count + cast("u64", note_time)
-    if note != NOTE_REST:
-        note_freq: u32 = cast("u32", s.note_freq[actual_note])
-        w4.tone(note_freq, note_time, 50u32, 0u32)
-    s.cursor += 1
-    if s.cursor > s.note_count - 1:
-        s.cursor = 0
-
-def game_step(d: AnyPtr) -> None:
-    s: State = cast("State", d)
-    s.frame_count += 1u64
-    handle_input(s)
-    draw_board(s)
-    draw_notes(s)
-    play_notes(s)
-
-def init_state() -> State:
-    s: State = State()
-    s.width = 160
-    s.height = 160
-    s.frame_count = 0u64
-    s.play_on = 0u64
-    s.gamepad_prev = 0u8
-    s.cursor = 0
-    s.note_count = 0
-    s.v_start = 0
-    s.v_end = 0
-    s.mode = MODE_NOTE
-    s.playing = False
-    s.note_freq = array("int",0,262,277,294,311,330,349,370,392,415,440,466,495,523,554,587,622,659,698,740,784,830,880,932,988,1047,1109,1175,1245,1319,1397,1480,1568,1661,1760,1865,1976)
-    s.note_time = array("int",60,30,15,8,4,2,1)
-    # 11 character buffer for writing stuff
-    s.text_buf = cast("Array[u8]", mini_clib.calloc(cast("mini_clib.Size", 1), cast("mini_clib.Size", 11)))
-    # Set total number of notes to max notes
-    arrsetlen(s.note_buf, MAX_NOTES)
-    # Mark it all as null
-    x: int = 0
-    while x < MAX_NOTES:
-        s.note_buf[x][0] = NOTE_NULL
-        s.note_buf[x][1] = NOTE_NULL
-        s.note_buf[x][2] = NOTE_NULL
-        s.note_buf[x][3] = NOTE_NULL
-        x += 1
-    return s
-
-def del_state(current: AnyPtr) -> None:
-    del current
-
-def main() -> int:
-    # based on palette
-    # https://lospec.com/palette-list/sweet-28
-    # https://lospec.com/palette-list/bread-berry
-    w4.set_palette(0xfff678u32, 0x1fa4bfu32, 0xda4fbcu32, 0x1b1b5cu32)
-    s: State = init_state()
-    w4.set_game_state(cast("AnyPtr", s))
-    return 0
-
Show demo in a new tab
Show demo inline


WASM4 Demo - snake

Created 2023-08-13, Last Updated 2023-09-07

Hint: Snake game in Yaksha for WASM4 (ported)

Code
import w4
-import libs.random
-
-class Point:
-    # Point (x, y)
-    x: i16
-    y: i16
-
-class Snake:
-    # Snake's body and direction
-    body: Array[Point]
-    direction: Point
-
-class State:
-    # Game state
-    snake: Snake
-    fruit_sprite: Ptr[Const[u8]]
-    fruit: Point
-    frame_count: u32
-    gamepad_prev: u8
-
-def point(x: i16, y: i16) -> Point:
-    my_point: Point = Point()
-    my_point.x = x
-    my_point.y = y
-    return my_point
-
-def set_random_point(p: Point) -> Point:
-    x: i16 = cast("i16", random.random_u64() % 20u64)
-    y: i16 = cast("i16", random.random_u64() % 20u64)
-    p.x = x
-    p.y = y
-
-def random_point() -> Point:
-    p: Point = Point()
-    return set_random_point(p)
-
-def draw_snake(snake: Snake) -> None:
-    # Body
-    w4.set_draw_colors(0x0043u16)
-    i: int = 0
-    while i < len(snake.body):
-        body_part: Point = snake.body[i]
-        x: int = cast("int", body_part.x * 8i16)
-        y: int = cast("int", body_part.y * 8i16)
-        w4.rect(x, y, 8u32, 8u32)
-        i += 1
-    # Head
-    w4.set_draw_colors(0x0004u16)
-    body_part: Point = snake.body[0]
-    x: int = cast("int", body_part.x * 8i16)
-    y: int = cast("int", body_part.y * 8i16)
-    w4.rect(x, y, 8u32, 8u32)
-
-def snake_push(snake: Snake, p: Point) -> None:
-    arrput(snake.body, p)
-
-def snake_update(snake: Snake) -> None:
-    # Move snake a level up
-    position: int = len(snake.body) - 1
-    while position > 0:
-        snake.body[position].x = snake.body[position - 1].x
-        snake.body[position].y = snake.body[position - 1].y
-        position -= 1
-    snake.body[0].x = (snake.body[0].x + snake.direction.x) % 20i16
-    snake.body[0].y = (snake.body[0].y + snake.direction.y) % 20i16
-    if snake.body[0].x < 0i16:
-        snake.body[0].x = 19i16
-    if snake.body[0].y < 0i16:
-        snake.body[0].y = 19i16
-
-def snake_up(snake: Snake) -> None:
-    if snake.direction.y == 0i16:
-        snake.direction.x = 0i16
-        snake.direction.y = -1i16
-
-def snake_down(snake: Snake) -> None:
-    if snake.direction.y == 0i16:
-        snake.direction.x = 0i16
-        snake.direction.y = 1i16
-
-def snake_left(snake: Snake) -> None:
-    if snake.direction.x == 0i16:
-        snake.direction.x = -1i16
-        snake.direction.y = 0i16
-
-def snake_right(snake: Snake) -> None:
-    if snake.direction.x == 0i16:
-        snake.direction.x = 1i16
-        snake.direction.y = 0i16
-
-def snake_isdead(snake: Snake) -> bool:
-    part: int = 1
-    while part < len(snake.body):
-        if snake.body[part].x == snake.body[0].x and snake.body[part].y == snake.body[0].y:
-            return True
-        part += 1
-    return False
-
-def del_point(p: Point, ignored: int) -> bool:
-    del p
-    return True
-
-def snake_reset(snake: Snake) -> None:
-    foreach(snake.body, del_point, 0)
-    del snake.body
-    body: Array[Point]
-    arrput(body, point(2i16, 0i16))
-    arrput(body, point(1i16, 0i16))
-    arrput(body, point(0i16, 0i16))
-    snake.body = body
-    snake.direction.x = 1i16
-    snake.direction.y = 0i16
-
-def handle_input(state: State) -> None:
-    just_pressed: u8 = w4.gamepad1() & (w4.gamepad1() ^ state.gamepad_prev)
-    if just_pressed & w4.BUTTON_UP != 0u8:
-        snake_up(state.snake)
-    if just_pressed & w4.BUTTON_DOWN != 0u8:
-        snake_down(state.snake)
-    if just_pressed & w4.BUTTON_LEFT != 0u8:
-        snake_left(state.snake)
-    if just_pressed & w4.BUTTON_RIGHT != 0u8:
-        snake_right(state.snake)
-    state.gamepad_prev = w4.gamepad1()
-
-def game_step(data: AnyPtr) -> None:
-    state: State = cast("State", data)
-    state.frame_count += 1u32
-    random.set_seed(cast("u64", state.frame_count))
-    x: int = 8 * cast("int", state.fruit.x)
-    y: int = 8 * cast("int", state.fruit.y)
-
-    handle_input(state)
-    if state.frame_count % 15u32 == 0u32:
-        snake_update(state.snake)
-        if snake_isdead(state.snake):
-            snake_reset(state.snake)
-            state.fruit = set_random_point(state.fruit)
-        # Ate fruit
-        if state.snake.body[0].x == state.fruit.x and state.snake.body[0].y == state.fruit.y:
-            penultimate: int = len(state.snake.body) - 1
-            snake_push(state.snake, point(state.snake.body[penultimate].x, state.snake.body[penultimate].y))
-            state.fruit = set_random_point(state.fruit)
-
-    draw_snake(state.snake)
-    # Draw sprite
-    w4.set_draw_colors(0x4320u16)
-    w4.blit(state.fruit_sprite, x, y, 8u32, 8u32, w4.BLIT_2BPP)
-
-def main() -> int:
-    random.set_seed(0x20u64)
-    w4.set_palette(0xfbf7f3u32, 0xe5b083u32, 0x426e5du32, 0x20283du32)
-    state: State = State()
-    state.snake = Snake()
-    state.fruit = point(10i16, 8i16)
-    state.snake.direction = point(1i16, 0i16)
-    state.frame_count = 0u32
-    state.gamepad_prev = 0u8
-    body: Array[Point]
-    arrput(body, point(2i16, 0i16))
-    arrput(body, point(1i16, 0i16))
-    arrput(body, point(0i16, 0i16))
-    state.snake.body = body
-    state.fruit_sprite = binarydata("\x00\xa0\x02\x00\x0e\xf0\x36\x5c\xd6\x57\xd5\x57\x35\x5c\x0f\xf0")
-    w4.set_game_state(cast("AnyPtr", state))
-    return 0
-
Show demo in a new tab
Show demo inline
\ No newline at end of file diff --git a/docs/documentation.html b/docs/documentation.html deleted file mode 100644 index 0e87fab..0000000 --- a/docs/documentation.html +++ /dev/null @@ -1,412 +0,0 @@ -Yaksha Programming Language

1 Language Features

Created 2022-08-09, Last Updated 2023-09-03

1.1 Data Types

1.1.1 Wrapped String References

done

Wrapped string literals sr wraps multiple source strings in an uniform structure. There is no reason to delete a sr unless you want to de-allocate, referred data of the string.

You can add two sr using + operator. However, resulting value will be of type str, as memory allocation is required. It is recommended to use a string buffer for concatenating a string.

a: sr = "A"
-b: sr = "B"
-c = a + b
-# Type of c would be str
-

Type inference during creating a variable will create a value of sr type whenever "string literal" is used on RHS.

my_sr = "Hello World"
-another_sr: sr = "Hello World"
-

1.1.2 String literals

done

Internally string literals such as "hello world" are neither str or sr. They utilize a hidden data type :s: for string literal.

String literals are efficient and does not require any additional memory allocation.

If you + two string literals that will be done at compile time.

String literals are automatically converted to sr or str.

1.1.3 (Semi)Managed Strings

done

  • String allocations and de-allocations are abstracted away, so strings are immutable and automatically deleted.

  • Assignment copy values and automatically delete previous value.

  • Strings are also copied every time you create a new variable or pass it to a function or assign it to a container (object, array, etc).

  • It is not meant to be fast. It is meant to be easily usable.

  • At C code level yk__sds data structure will be used. (yk__sds is a char* with special header placed just before).

  • 💀️ Managed strings are not deleted when used in arrays, maps, or objects. (This is intentional and not a bug.)

    • You need to manage deletion of str object in this case.

    • Use libs.strings.array.del_str_array() to delete a string array.

  • Supports + operator to join two str values.

a: str = "hello world"
-# support -> datatype ✅ | literal ✅
-println(a)
-

Data Type - str

Internally this is a binary string.

sds library (part of runtime lib) takes care of the heavy lifting.

1.1.4 Standard integers

done

  • Default integer is a 32bit signed integer.

  • This is compiled to int32_t on all platforms.

a: int = 4       # datatype ✅ | literal ✅
-print("Four =")
-println(a)
-

Data Type - int or i32

1.1.5 Integer types

in progress

  • Signed types - i8, i16, i32, i64

  • Unsigned types - u8, u16, u32, u64

# Default integer type is i32
-a: int = 1       # datatype ✅ | literal ✅
-b: i32 = 2       # datatype ✅ | literal ✅
-c: i8 = 3i8      # datatype ✅ | literal ✅
-d: i16 = 4i16    # datatype ✅ | literal ✅
-e: i32 = 5i32    # datatype ✅ | literal ✅
-f: i64 = 6i64    # datatype ✅ | literal ✅
-
-# Unsigned
-g: u8 = 3u8      # datatype ✅ | literal ✅
-h: u16 = 4u16    # datatype ✅ | literal ✅
-i: u32 = 4u32    # datatype ✅ | literal ✅
-j: u64 = 5u64    # datatype ✅ | literal ✅
-

1.1.6 Float types

done

  • f32 or float - single precision floats.

  • f64 - double precision floats.

a: f32 = 1.0f    # datatype ✅ | literal ✅
-b: f64 = 2.0     # datatype ✅ | literal ✅
-c: float = 3.0f  # datatype ✅ | literal ✅
-

Data Type - f32, float and f64

1.2 Syntax features

1.2.1 Let statement

done

  • Create a new variable.

  • If you want to assign to a variable, it needs to be created.

  • If no value is provided default value for data type is used.

Default value for str is an empty string.

def main() -> int:
-    a: int = 10
-    print(a)
-    return 0
-

1.2.2 Functions

1.2.2.1 Basic functions

done

  • Return type must be mentioned always.

  • If return type is None it means no data is returned. (void in C world.)

def main() -> int:
-    print("Hello World\n")
-    return 0
-
1.2.2.2 Exposing C functions
  • 💀 You can only call @nativexxx functions from normal functions.

  • 💀 @nativexxx functions cannot call each other or normal functions.

done

1.2.2.2.1 @native - native functions
@native("getarg")
-def get_arg(n: int) -> str:
-    pass
-
-@native
-def get_global_arg(n: int) -> str:
-    ccode "yk__sdsdup(global_args[yy__n])"
-
Click to see output C code
yk__sds yy__get_arg(int32_t nn__n) { return getarg(nn__n); }
-yk__sds yy__get_global_arg(int32_t nn__n)
-{
-    yk__sdsdup(global_args[yy__n]);
-}
-

If ccode is there instead of an argument, then it is used as the message body.

1.2.2.2.2 @nativemacro - macros with arguments
@nativemacro
-def min_int(a: int, b:int) -> int:
-    ccode "((nn__a < nn__b) ? nn__a : nn__b)"
-
-@nativemacro("((nn__a > nn__b) ? nn__a : nn__b)")
-def max_int(a: int, b:int) -> int:
-    pass
-
Click to see output C code
#define yy__min_int(nn__a, nn__b) ((nn__a < nn__b) ? nn__a : nn__b)
-#define yy__max_int(nn__a, nn__b) ((nn__a > nn__b) ? nn__a : nn__b)
-
1.2.2.2.3 @nativedefine - simple #define
@nativedefine("banana")
-def banana(a: int, b: int, c:int) -> int:
-    pass
-
Click to see output C code
#define yy__banana banana
-
1.2.2.2.4 @varargs - variable argument functions
  • 💀 Can only be used with @nativedefine.

@nativedefine("yk__newsdsarray")
-@varargs
-def new(count: int, s: str) -> Array[str]:
-    pass
-
Click to see output C code
#define yy__new yk__newsdsarray
-// Assume that yk__newsdsarray is something like below
-// yk__sds *yk__newsdsarray(size_t count, ...)
-
1.2.2.3 Template functions

not started

  • Return type can also be a template-arg if that template-arg is used in parameters.

  • String passed inside @template( should be single upper case characters separated by commas.

This means it is limited to 26 template arguments max.

@native("yk__arrput")
-@template("T")
-def arrput(a: Array[T], v: T) -> None:
-    pass
-
-@native("yk__hmput")
-@template("K,V")
-def hmput(a: HashMap[K,V], key: K, value: V) -> None:
-    pass
-
-@native("yk__hmget")
-@template("K,V")
-def hmget(a: HashMap[K,V], key: K) -> V:
-    pass
-
1.2.2.4 GPU/OpenCL device functions

not startedplanned for v0.5

  • Easy access to GPU through OpenCL.

@device
-def calculate(n: int) -> int:
-   return 1 + 1
-

1.2.3 Defer statement

done

  • Defer something to happen at the end of the scope.

  • Before any return from a function.

  • Before break, continue or end of while loop body.

    • This behaviour is different from what you see in go-lang.

  • Before end of if body or end of else body.

defer works as a stack.

That means deferred expressions are executed in last deferred first executed order.

def onexit() -> int:
-    println("All done")
-    return 0
-
-def main() -> int:
-    defer onexit()
-    println("Hello World")
-    return 0
-

Output:

Hello World
-All done
-

1.2.4 Del statement

In progress

  • Delete values.

  • Delete arrays, and other builtin data structures without deleting content.

def main() -> int:
-    a: Array[int]
-    defer del a
-    arrput(a, 1)
-    arrput(a, 2)
-    arrput(a, 3)
-    println(a[0])
-    return 0
-

Compiles to free or other runtime functions.

1.2.5 Class statement

in progress

  • Create a custom data structure.

  • 💀 Templated structures are not supported yet.

  • 💀 Inheritance is not supported yet.

class Student:
-    student_id: int
-    name: str
-    address: str
-
-class Teacher:
-    teacher_id: int
-    name: str
-    address: str
-
1.2.5.1 Creating and freeing objects
def main() -> int:
-    # Non primitive types are initialized to None
-    john: Student
-    # Creating an instance, will be allocated in heap
-    # Results in a malloc
-    john = Student()
-    defer del john
-    # Set fields
-    john.student_id = 10
-    # str objects in structures are not freed automatically
-    john.name = "John Smith"
-    john.address = "1 Road, Negombo"
-    defer del john.name
-    defer del john.address
-    return 0
-

It might be better to create a custom function to delete custom objects.

def del_student(st: Student) -> None:
-    del st.name
-    del st.address
-    del st
-
-def main() -> int:
-    john: Student = Student()
-    defer del_student(john)
-
-    john.student_id = 10
-    john.name = "John Smith"
-    john.address = "1 Road, Negombo"
-    return 0
-
1.2.5.2 Exposing native structures
@nativedefine("something")
-class Something:
-    something_id: int
-
-# Use @dotaccess for purely stack allocated structs
-@nativedefine("Color")
-@dotaccess
-class Color:
-    r: int
-    g: int
-    b: int
-
Click to see output C code
#define yy__Something something
-#define yy__Color Color
-

1.2.6 Import statement

in progress

  • Import a file.

import io
-
-def main() -> int:
-    file: io.File = io.open("Haha")
-    defer io.close(file)
-    if file == None:
-        println("-- failed to read file --")
-        return 1
-    data: str = io.readall(file)
-    println("-- read file --")
-    println(data)
-    return 0
-

Name mangling takes place for this.

1.2.7 While loop

done

Loop as long as the expression evaluates to True.

def main() -> int:
-    a = 10
-    while a > 0:
-        println(a)
-        a -= 1
-    return 0
-

1.2.8 Foreach loop

done

For each allow you to iterate each element of a given array.

def main() -> int:
-    e1: Array[int] = array("int", 1, 2, 3)
-    e2 = array("int", 4, 5, 6, 7)
-    for i: int in e1:
-        for j in e2:
-            print(i)
-            print(" - ")
-            println(j)
-    del e1
-    del e2
-    return 0
-

1.2.9 Endless for loop

done

Endless for loop will iterate until break is executed.

def main() -> int:
-    c: int = 0
-    for:
-        if c == 2:
-            break
-        println(1)
-        c += 1
-    return 0
-

1.2.10 C-For loop

done

Standard for loop from C family of languages.

def add(a: int, b: int) -> int: a + b
-
-def main() -> int:
-    for (x = 0; x < 10; x = x + 1):
-        println(x)
-
-    a: str = ""
-    for (x = 0; x < 4; x += 1):
-        a += "hello "
-    println(a)
-
-    b: str = ""
-    c: str = "x"
-    for (b += c; b != "xxx"; b += c): pass
-    println(b)
-
-    for (x = 0; x < 10i8; x = add(x, 2i8)):
-        println(x)
-
-    return 0
-

Note that Yaksha allows omitting return, assuming last expression matches the return data type.

This is why add function does not have a return statement.

1.3 Builtin Functions

in progress

  • print(primitive) -> None - Print without a new line

  • println(primitive) -> None - Print + new line

  • len(Array[T]) -> int - Get length of arrays,maps

  • arrput(Array[T], T) -> None - Put item to an array

  • arrpop(Array[T]) -> T - Remove last item from an array and return it

  • arrnew("T", int) -> Array[T] - Create a new array of given size. (Uninitialized elements)

  • arrsetcap(Array[T], int) -> None - Set array capacity / grow memory. Does not affect length.

  • arrsetlen(Array[T], int) -> None - Set array length. Each element will be an uninitialized element.

  • array("T", T...) -> Array[T] - Create a new array from given elements

  • getref(T) -> Ptr[T] - Get a pointer to given object

  • unref(Ptr[T]) -> T - Dereference a pointer

  • charat(str, int) -> int - Get a character at a specific location in string

  • shnew(Array[SMEntry[T]]) -> None - Initialize Array[SMEntry[T]] object

  • shput(Array[SMEntry[T]], str, T) -> None - Put item to an Array[SMEntry[T]]

  • shget(Array[SMEntry[T]], str) -> T - Get item from an Array[SMEntry[T]]

  • shgeti(Array[SMEntry[T]], str) -> int - Get item index from an Array[SMEntry[T]] (-1 if not found)

  • hmnew(Array[MEntry[K,T]]) -> None - Initialize Array[MEntry[K,T]] object

  • hmput(Array[MEntry[K,T]], K, T) -> None - Put item to an Array[MEntry[K,T]]

  • hmget(Array[MEntry[K,T]], K) -> T - Get item from an Array[MEntry[K,T]]

  • hmgeti(Array[MEntry[K,T]], K) -> int - Get item index from an Array[MEntry[K,T]] (-1 if not found)

  • cast("T", X) -> T - Data type casting builtin

  • qsort(Array[T],Function[In[Const[AnyPtrToConst],Const[AnyPtrToConst]],Out[int]]) -> bool - Sort an array, returns True if successful

  • iif(bool, T, T) -> T - Ternary functionality

  • foreach(Array[T],Function[In[T,V],Out[bool]],V) -> bool - For each element in array execute given function

  • countif(Array[T],Function[In[T,V],Out[bool]],V) -> int - For each element in array count if function returns true

  • filter(Array[T],Function[In[T,V],Out[bool]],V) -> Array[T] - Create a new array with filtered elements based on return value of given function

  • map(Array[T],Function[In[T,V],Out[K]],V) -> Array[K] - Create a new array with result of given function

  • binarydata("data") -> Const[Ptr[Const[u8]]] - Create constant binary data (must pass in a string literal). Returns Const[Ptr[Const[u8]]] that does not need to be deleted.

  • make("T") -> Ptr[T] - Allocate a single object.

  • inlinec("T", "code") -> T - Inline C code resulting in T data type. Example - inlinec("int", "sizeof(char)")

Builtin functions may call different implementations based on input.

1.4 Non primitive data types

This section describes other essential types of builtin structures.

1.4.1 Dynamic Arrays

in progress

def main() -> int:
-    a: Array[i32]
-    # Prior to calling arrput pointer is set to None
-    defer del a
-    arrput(a, 1)
-    arrput(a, 2)
-    # Array access works with `[]`
-    print(a[0])
-    return 0
-

Must ensure array elements are freed. int need not be deleted as they are primitive types.

1.4.2 String Hash Map

in progress

HashMap with str keys and given data type values.

Values need to be deleted when no longer needed.

def main() -> int:
-    m: Array[SMEntry[int]]
-    # shnew must be called before using the array as a String Hash Map
-    shnew(m)
-    defer del m
-    shput(m, "banana", 10)
-    r: int = shget(m, "banana")
-    return r
-

Array[SMEntry[?]] keys are deleted automatically when del is invoked.

len will give the total number of elements of the String Hash Map.

1.4.3 Hash Map

in progress

Simple single key single value hashmaps.

Data type Array[MEntry[K,T]].

key and value both need to be deleted.

1.5 Macros & YakshaLisp

in progress

documentation - in progress

YakshaLisp macros are one of the most important features of Yaksha. You can think of it as an interpreted language that lives in Yaksha compiler.

Because that is what it is!

It has it's own built in functions, can use import, read/write files and even use metamacro directive to create quoted input functions(similar to defun, except input args are not evaluated and returns quoted output that is immediately evaluated). Has multiple data types (list, map, callable, string, expression). Support's q-expressions {1 2 3} (inspired by build-your-own-lisp's lisp dialect), and special forms. A simple mark and sweep garbage collector is used. Provides a mediocre REPL and ability to execute standalone lisp code using a command. Not only that, it also support reflection using builtin callables such as this and parent (which returns a mutable current or parent scope as a map).

Yo dog!, I heard you like macros, so I added meta-macro support in your macro processor.

So you can meta-program while you meta-program.

1.5.1 Philosophy?

YakshaLisp provide the ability to write token-list to token-list conversion macros. One can use my_macro!{t t t} style expansion to achieve this. So why YakshaLisp? because it needs to process a list of tokens.

Additionally, Yaksha and YakshaLisp are polar opposites of each other, therefore I think they can compliment each other nicely.

Think Yin-Yang!

1.5.1.1 What are the differences?

Language differences

YakshaYakshaLispC99
manual memory managementgarbage collectedmanual memory management
compiled (to C99)interpretedcompiled by most compilers to target platform.
can be multi-threadedonly single threadedcan be multi-threaded, etc
indent based syntaxparenthesis based syntaxC family {} scope syntax
c-like function pointersclosures, function body not evaluated unless called. First class functions/lambdafunction pointers
multiple integer types and float / double / boolonly 64bit signed integer is supported.multiple integer types and float / double / bool, enums & unions
hygienic macros using $name syntax (automated gensym), non-hygienic macros are also supported (do not use the $ prefix for identifiers), can also generate C style macros/code with nativexxx annotations and ccode keyword in some cases.metamacro / eval / parse / this / parent / q-expressions#define / #include
has statements and expressionsexpressions onlyhas statements and expressions
no support for exceptionsexceptions are a string that you can throw and catchsetjmp
no support for reflectionsupports reflection - repr / this / parentno support for reflection

1.5.2 Builtin functions, values & prelude

done

All below listed functions are available at the moment.

  • nil - this has value of {} (an empty list)

  • true - value of 1

  • false - value of 0

  • newline - value of \r\n or \n as a string.

  • +, -, *, /, modulo - basic functions

  • ==, !=, <, >, <=, >= - comparison functions

  • and, or, not - boolean operator functions

  • bitwise_and, bitwise_or, bitwise_not, bitwise_xor, bitwise_left_shift, bitwise_right_shift - bitwise operator functions to be applied to number values (underlying structure of a number is a 64bit signed integer)

  • filter, map, reduce - basic functional-programming functions

  • map_get, map_has, map_set, map_remove, map_values, map_keys - functions to manipulate map-objects.

  • access_module - access an element from another root environment (uses same imports at the top of the file as in Yaksha)

  • this, parent - returns current scope or parent scope as a map-object (can be modified)

  • magic_dot - wrapper around map_get and access_module (supports both type of objects) to read a value. Special syntax sugar symbol1::symbol2 expands to (magic_dot symbol1 symbol2)

  • io_read_file, io_write_file, print, println, input - I/O functions

  • def/define - define an undefined value in current environment with a given symbol.

  • setq - update an already defined value

  • = - combination of setq and def. try to def and if it fails use setq.

  • quote - create a list with non-evaluated expressions parsed as arguments. This has a somewhat-similar (but not 100% similar) effect to {}

  • list - create a list with all arguments to list function evaluated.

  • eval, parse, repr - evaluate a list or single expression, parse to q-expression, convert values to strings.

  • raise_error, try, try_catch - functions to use exceptions during evaluation.

  • head, tail, cons, push, pop, insert, remove - list manipulation functions

  • for, while - looping functions

  • scope, do - do these expressions in a child scope scope or in current scope (do)

  • is_list, is_list, is_int, is_string, is_truthy, is_callable, is_nil, is_metamacro, is_module - check types

  • defun, lambda - create named and anonymous functions

  • cond, if - conditions

  • random - random number between given range

  • time - unix time as number

1.5.3 Macro environments

Inside Yaksha a root (known as builtins_root) environment is created. It will house builtin functions and results of executing prelude code.

A single .yaka file in imports (or current compiled file) will have their own root environment that is a child of builtins_root.

During garbage collection, mark phase will start marking from builtins_root and file level roots.

Environment is an unordered_map with string keys. Environments and maps use same data type internally.

1.5.4 How does it look like

# ╔═╗┌─┐┌┬┐┌─┐┬┬  ┌─┐  ╔╦╗┬┌┬┐┌─┐
-# ║  │ ││││├─┘││  ├┤    ║ ││││├┤
-# ╚═╝└─┘┴ ┴┴  ┴┴─┘└─┘   ╩ ┴┴ ┴└─┘
-# ╔═╗┬┌─┐┌─┐  ╔╗ ┬ ┬┌─┐┌─┐
-# ╠╣ │┌─┘┌─┘  ╠╩╗│ │┌─┘┌─┘
-# ╚  ┴└─┘└─┘  ╚═╝└─┘└─┘└─┘
-macros!{
-    (defun to_fb (n) (+ (if (== n 1) "" " ") (cond
-        ((== 0 (modulo n 15)) "FizzBuzz")
-        ((== 0 (modulo n 3)) "Fizz")
-        ((== 0 (modulo n 5)) "Buzz")
-        (true (to_string n))
-        )))
-    (defun fizzbuzz () (list (yk_create_token YK_TOKEN_STRING (reduce + (map to_fb (range 1 101))))))
-    (yk_register {dsl fizzbuzz fizzbuzz})
-}
-
-def main() -> int:
-    println(fizzbuzz!{})
-    return 0
-


2 Yaksha library

Created 2022-08-18, Last Updated 2023-07-01

Yaksha library uses multiple 3rd party libraries, set of python scripts and few other nuts and bolts to create library sources.

Core parts of runtime library functionality starts with yk__ or YK__.

Yaksha programming language preserves anything that starts with yk__ or YK__ while prefixing any other name with yy__.

This avoids collisions with C standard library functions or keywords.

2.1 Standard Library Components

2.1.1 Core Library

in progress

Small core library with useful features.

import libs
-

2.1.2 UI Library

in progress

Use raygui with raylib.

import raylib.gui
-

2.1.3 raylib - Graphics/Game/Audio Library

in progress

Use raylib to build games and such

import raylib
-

2.1.4 CL Library

not started

Access to OpenCL features and parallel programming.

import cl
-
-@device
-def my_program(n: int) -> int:
-    return 1 + 1
-
-def main() -> int:
-    dvc: cl.device = cl.get_device(0)
-    cl.run(dvc, my_program)
-

Placeholder code, API is not designed yet.



3 Language Grammar

Created 2022-08-09, Last Updated 2023-08-05

Warning! this section needs rewriting

This describes Yaksha language grammar.

Lot learned from Crafting Interpreters book and Python grammar page.

in progress

3.1 Statements

This section describes statements and program structure. Program is made from one or more program statements. Standard statements are what goes inside functions.

program: import_statement* program_declaration*
-program_declarations:
-    | const_statement
-    | struct_statement
-    | def_statement
-standard_statement:
-    | compound_statement
-    | simple_statement
-compound_statement:
-    | if_statement
-    | while_statement
-simple_statement:
-    | let_statement
-    | return_statement
-    | defer_statement
-    | "pass"
-    | "break"
-    | "continue"
-    | expr_statement
-    | del_statement
-    | c_code_statement
-# Because defer can use del statement or any another expression.
-# Del statement has two components with and without statement end.
-base_del_statement: "del" expr
-del_statement: base_del_statement st_end
-# Defer can use a del statement or an expr
-defer_statement: "defer" (base_del_statement | expr) st_end
-# Functions
-def_statement: annotation* "def" name "(" parameters? ")" block st_end
-# Let statement creates variables
-let_statement: name ":" data_type ("=" expr)? st_end
-# If statement
-if_statement: "if" block ("else" block)?
-# While statement
-while_statement: "while" block
-# Custom data structures
-# Struct value data types must be present
-struct_value: name ":" data_type st_end
-struct_block: ":" newline ba_indent struct_value+ ba_dedent
-stuct_statement: annotation* "class" name struct_block
-# Expression statements, calling functions etc.
-expr_statement: expr st_end
-# Return statement
-return_statement: "return" expr st_end
-# Constants compiles to #defines.
-const_statement: "const" name "=" (number | string)
-# Import statements include other source files and perform name mangling
-# You need to always rename level 2+ imports
-import_statement: "import" name ( ("." name)+ "as" name )? st_end
-# Dumps unmodified C code. It would be better to encapsulate these.
-# When used with @native functions compiles to a c macro
-c_code_statement: "ccode" (string | triple_quote_string) st_end
-# Multiline or single simple statement blocks
-block: ":" (newline ba_indent standard_statement+ ba_dedent | simple_statement)
-

defer statement is special, it can take either a del statement or any expression.

This allows you to defer a del.

3.2 Data Type

data_type: data_type_part | name ("." name)? ("[" data_type_args "]")?
-data_type_args: data_type ("," data_type)*
-data_type_part: name | primitive_data_type
-primitive_data_type: "int" | "i8" | "i16" | "i32" | "i64" |
-        "u8" | "u16" | "u32" | "u64" | "str" | "float" | "bool" | "None" |
-        "f32" | "f64"
-

Data type describes, primitives, custom data types and non primitives.

3.3 Expressions

Expressions are itsy bitsy pieces that make up parts of statements.

expr: assignment
-assignment: (fncall ".")? name "=" assignment
-    | logical_not;
-logical_not: "not" logic_or
-logic_or: logic_and ("or" logic_and)*
-logic_and: equality ("and" equality)*
-equality: comparision (("!=" | "==") comparision)*
-comparision: term ((">" | ">=" | "<" | "<=") term)*
-term: factor (("-" | "+") factor)*
-factor: unary (("/" | "*") unary)*
-unary: "-" unary | fncall
-fncall: primary ( "(" arguments? ")" | "[" expr "]" | "." name )*
-primary: "True" | "False" | "None" | number | string | triple_quote_string | name |
-          "(" expr ")"
-

3.4 Useful utils

# Annotations are used to define types of functions or structures
-# Currently only @device, @native and @generic annotations are available.
-# Annotations may have a single string parameter.
-annotation: "@" name ( "(" (string | triple_quote_string ) ")" ) newline
-parameters: parameter ("," parameter)*
-parameter: name ":" datatype
-st_end: newline | eof
-newline: "\n" | "\r\n"
-eof: "end of file"
-ba_indent: "increase in indentation"
-ba_dedent: "decrease is indentation"
-

ba_indent and ba_dedent gets calculated before parsing in block_analyzer phase.



4 Compiler Internals

Created 2022-08-18, Last Updated 2023-08-13

This section describes how compiler works.

Total of 12+ passes are planned for the compiler.

4.1 What happens when you compile a .yaka file?

4.1.1 Let's look at a sample

4.1.1.1 Input code
def factorial(x: int) -> int:
-    if x <= 0:
-        return 1
-    return x * factorial(x - 1)
-
-
-def main() -> int:
-    a: int = 10
-    b: str = "b"
-    while a > 0:
-        print(factorial(a))
-        print("\n")
-        a = a - 1
-        b = "a" + b
-    print(b)
-    print("\n")
-    return 0
-
4.1.1.2 Output C code
// --yaksha header section--
-#include "yk__lib.h"
-int32_t yy__factorial(int32_t);
-int32_t yy__main();
-// --yaksha body section--
-int32_t yy__factorial(int32_t yy__x) {
-  if ((yy__x <= 0)) { return 1; }
-  return (yy__x * yy__factorial((yy__x - 1)));
-}
-int32_t yy__main() {
-  int32_t yy__a = 10;
-  yk__sds t__0 = yk__sdsnew("b");
-  yk__sds yy__b = yk__sdsdup(t__0);
-  while (1) {
-    if (!((yy__a > 0))) { break; }
-    {
-      printf("%d", (yy__factorial(yy__a)));
-      yk__sds t__1 = yk__sdsnew("\n");
-      printf("%s", (t__1));
-      yy__a = (yy__a - 1);
-      yk__sds t__2 = yk__sdsnew("a");
-      yk__sds t__3 = yk__sdscatsds(yk__sdsdup(t__2), yy__b);
-      yk__sdsfree(yy__b);
-      yy__b = yk__sdsdup(t__3);
-      yk__sdsfree(t__3);
-      yk__sdsfree(t__2);
-      yk__sdsfree(t__1);
-    }
-  }
-  printf("%s", (yy__b));
-  yk__sds t__4 = yk__sdsnew("\n");
-  printf("%s", (t__4));
-  yk__sdsfree(t__4);
-  yk__sdsfree(t__0);
-  yk__sdsfree(yy__b);
-  return 0;
-}
-// --yaksha footer section--
-int main(void) { return (int) yy__main(); }
-

Notice yk__sdsfree is automatically generated for simple string uses. This makes strings immutable. Currently, it is doing a lot of unnecessary processing. 😓

4.2 Phases of the compiler

4.2.1 Tokenizer

in progress

  • Tokenizer breaks down input to individual tokens and Identifies Keywords.

  • Parse numbers and strings and check if they are valid according to the grammar.

If any error is detected at this point we still continue up to parser so we can identify maximum number of errors.

4.2.2 Block analyzer

in progress

  • Convert indentation to ba_indent, ba_dedent type tokens.

  • Remove comments.

  • Remove extra new lines.

Only 2-spaces, 4-spaces or tab based indents are supported. Will try to guess indentation type.

Still continue to parser even after errors.

4.2.3 Parser

in progress

  • Parses tokens returned by block analyzer an AST.

  • AST is represented as a std::vector of stmt*.

Any errors from previous stages and parsing stage is printed here and program will exit.

4.2.4 Import analyzer

in progress

Import Analyzer
  • Analyzes imports.

  • Parses imported files.

  • This step will use more instances of Tokenizer, Parser and Compiler objects.

4.2.5 Def-Struct-Const Visitor

in progress

  • Visit def statements and collect functions to a map.

  • Visit class statements and collect structures to a map.

  • Visit global constants.

4.2.6 Return path analyzer

in progress

  • Analyzes return paths.

  • Ensure all functions return.

4.2.7 Type checker

in progress

  • Type checker visits AST and check for invalid types.

  • Checks for undefined variables.

  • Checks for undefined functions.

  • Checks for undefined structures.

  • Check all return types are same as that of the encapsulating functions.

4.2.8 Template Compiler

not started

  • Rewrite @template to be normal functions based on what's passed to them.

  • Rewrite fncall expressions to use newly created functions.

4.2.9 Optimizer

not started

  • Remove dead code.

  • Basic constant folding.

4.2.10 To-CL-Compiler

not startedplanned for v0.5

  • Convert @device code to OpenCL program code.

  • Copy necessary structures.

  • Check validity - no generics, no str, no allocations.

4.2.11 To-C-Compiler

in progress

  • Writes C code from AST.

  • Do any simple optimizations.

  • Handle defer statements.

  • Handle str deletions.

  • Create struct and function declarations.

4.2.12 C-To-C Compiler

not started

  • We generate code to a single C file which can then be further optimized.

  • Parse and optimize subset of generated C code.

4.3 How does the Yaksha-lang library get packaged?

Multiple sources are packaged into a single header file.

Library functionality is exposed by prefixing with yk__ or YK__.

4.3.1 Packer components

  • packer.py - Run packer DSL scripts and create packaged single header libraries.

  • inctree.py - Topological sort #include DAG to determine best order for combining headers.

  • cids.exe - Use stb_c_lexer.h library to parse C code and extract identifiers.

  • single_header_packer.py - ApoorvaJ's single header C code packager. Repo

  • python-patch - techtonik's patch script. Repo

  • fcpp- Frexx C Preprocessor by Daniel Stenberg. (Patch for Windows compilation was needed, failed to compile with MSVC, works with MingW with patch).

DAG - Directed Acyclic Graph.

4.3.2 Third Party Libraries

  • sds - Salvatore Sanfilippo's string library. (Needed a patch to support MSVC 2019)

  • stb - Single header libraries by Sean Barrett.

  • libs - Mattias Gustavsson's single header C libraries.

  • utf8proc - UTF-8 library - Jan Behrens, Public Software Group and Julia developers.

If you stack few giants, you can stand very tall on top of them.


Note - currently only sds and stb_ds is used. This selection of libraries may change.

4.3.3 Packer DSL

import re
-use_source("libs")
-for lib in ["ini", "thread", "http"]:
-    ids = extract_ids(lib + ".h")
-    P = [x for x in ids if x.startswith(lib)]
-    PU = [x for x in ids if x.startswith(lib.upper())]
-    prefix(lib + ".h", PREFIX, P)
-    prefix(lib + ".h", PREFIX_U, PU)
-    rename(lib + ".h", [[re.escape(r'yk__http://'), 'http://'],
-                        ["YK__THREAD_PRIORITY_HIGHEST", "THREAD_PRIORITY_HIGHEST"]])
-    copy_file(lib + ".h", PREFIX + lib + ".h", is_temp=False)
-    clang_format(PREFIX + lib + ".h", is_temp=False)
-

It is just Python 3.x with extra functions added and evaluated.🤫

\ No newline at end of file diff --git a/docs/images_home/apple-touch-icon.png b/docs/images_home/apple-touch-icon.png deleted file mode 100644 index ce7a0820a893eeff5f1388723872a26d5c324f36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15465 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 diff --git a/docs/images_home/counter_app.gif b/docs/images_home/counter_app.gif deleted file mode 100644 index 9524cd7ceaf01f51dc9ed77d6c37e191f6e3bb4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 91865 zcmeF%19u%vvU5cn6xnjM5J$M=va9(xVZSlk)vefRAl6QWaLU@ zRvl2=xf_e@i;a8W4w ztC*avUf7`7vZ8J8rd>0k;~t<>+x_#uRoA1ZZ=~P6Zd4L)9F}5YYGK;CXvRZjVQy(z zHfS|}QN&?501E)5Ef`Wp>okJQXLq-on$*DpIvO^ay!_4`@ zJe9)2!v9xXLgWM}IyyS$KeI!zJp8dd4za0Tv5hlvQ)lu2XO8(B2%{!F=@5(D`%ja#& zmyRmVft3{%m4B-LQ?qzdOHNfw9$vc%uKUm2P~GKp{pDoC>}tbyOv8R)V;p~DoI_(= zV&i{inj2S6nkFp%3{5uwr=_{I4bZxI-MSmtHa6RK4FL501?>8C-qiN~XX~u*@Tu=C zsDH3*U@!LXf7YD;-u@aaaTwgb7#bQLxr-ki9UTj!8vD=1`}lqI#D8XcC$7Jyni8j` zXQyuNr-#a>Z?0$N=4bE0|Ni}(zuj0k@n78BSv>FUS4}>Ti-j}IJ?=nUf8Uq z+T7gSdMMhyzTJI_+xyRR)ZyXb>G{R^#pUJo&DB`=_1)d=f9@ad?(QBRA75TxK0l{E z!JA)SFW}8O@M|9!91RA?gTcjM@EsToCI=%cOKECIh^b0(u&_ZxLO?)}zrw&G{8yR& z+YtX7lj#2s$^VDs|8htWz!1&|M6yjqf5Qp_d|SBZoS23vBq!;P!DW(*`Lf;San1|XI5X^ znQU(~ZlFCwB2nyU+8v6)EEM|l+_*m$Am{T-F-KAkmF?T$O^BK#>`0MBJc&|Qt1fyX zd94v~X2c;OkJ+}1lAHTcD1a4?XQsRTdb>|WQ4xiZ$8}}g(M`C6$nHMupTtogd#@SN z&RUE8HVd!R-L;x&3YbqBYSguYWOiHDc){y2j=5v1P({Q)p5U7$uO@1rh&&-{4-Fck z-)%OQKODI((4yUtN<0uvnvUFz;>CJbowbKdHR>f*ay>c&zbZ8hCY5f%>M-_1RTmR* zvKMb3Iky|h_1#heTGlJEBW$s+S+)TWAG!f0-OzWzo2Kw-1kQ(D=y zP`V;n2c*^~f+HTo1*--* zZS|b-I9CX3Gr(_Vo^syJz}cMsqcde~?yc%LlZ${=(#uNLp1+^K`50Qx5OX zBANb3`(9Jk6<%52YLp_@Zm~7V++b&UgGA_p!iZBBUafFp(EA{!P1@UJc>yzfRNJWH zNKTpDgS!)QIWS%|($H-d>z_4f=i0>BhzbpK8onOI9^-;|W}m6C+v>g^BU@e47Px78 z8RFe;;$#y*(V-mfBvRy@;Y>4dIfq-sONV4x6s4S~a~71ihh_g~aNotF3l(?A(Yk8A0z++mo-krh_(=cg3@IHNzO@s9LC(j1?pQEJTJcH-G^+{M;9mXSYzf|=TbGeZLR|BOuYi*L#kee+??2oW#PB#g)7U|r+gIj&Y zkGkpMhWE!>V{fDDeZmebg!tp)_NQ4(AN*+3OPfDV>m>em=~h^WAZ?1yeS2c47)#{Y z=74s%mY^VF{CvQ)v3q%3^N!%#KYV~3L`Vu4l;lt1o%RE%I)^A;nT-(Db+nflGot-% z_7DB2HovM_z79veILI`C{`8{ZEJZo@H2<;F8KXU*MRwypKv6UubwrV9I?aq0OY&G@ z-FxAC6YgxLAOIIt!ryaAQA3w7oS$=ZB?=od!e-<%Q?@r6A8xpNj$-(-V>)^pMq8py zL<(Ux6P??*+Mu0i@pQ8OZa@ZO`Y20n$Yf3kERpP!9aYb5PH>3D0SKGIQN&on-p^$r zb(aHdm&B8VhaM_U;7|-LFbwl9%()uzi+yHljqDLO=~rzhRmJ2<9p_(THmdZm)glfF(_b9W! z=+y=_%i?jBP9Nnb7qW7t%GtE46|6VZX%RKacoVCY!BEh-Z%c(v8?wsY@=NtSJC(9+ zOURn7b;UT3)w=6S>XigEy9nQFbT2bd1m%|-7;Iror)zZcJj4F^Jl3(9B}lyNFa7Ci zqnDAYH83vAZr^BAp*5K|cxE841wA(6Q2Y&lk=I3x4S^wmsxwQ~SR3Vk`je7aXF;p5 zKB@QA{A;Gpig#*#*6*pM2&LXeMqy(CsuBt-Mid5PU}L50sjVro-oaV{xB=dH0(8vO zJ9$q5L2pm(11JqH(F&Wunk*=*aywXI=rAnFOOJz)~-^sv~R% zTfB488DXoccpS6hK7l^o2qBGPwA}PQ$@|Ng=vPxLwO%M%834*vcMM;xEs1Y>ZB#YM zEs!1!3gsA&1skC`t9|;A#s5dUc0-1LvS1>0x(k6yR&%an!Y-R}4w$+2v-$V2;xT_R zZ(m1Zh>1%GGy*d(6t-$}j$B6)SL5p(7N{X!+9lDRP8vyl?%YJ0jaSofA00>mYv84* zk94#1E!k%n-)F#9An$Fdio^*a4K13gj;tqO_A+IE5LVMQlr5ZwTtDvH2?weJo_vv1 zLbR)u1m)Y>YrR`M9y6*8tu&Hd43}vK*-2=9IC5DEyn#bEl!RayqTmiBCW&c`PUYL? ziSn~U<6OK7)*gDVi)2>(d#uU<&Yb&gwxC_;xq*2+Gg^`;(QF6QTfG;-jIs!8{|s%0j?g zK*HVFg`ftEhr?ntg>dd{BGz60nDxBcfHe_=ZS)ky^(xTE*)eS=AnS4@-hnFvKS8QL z*TWSwTg-dQT!JT?NkDc0#bmMWc#V(Y=!vVYRI1+w?Y(PwYzV z2%a9f0Z94Vz6Ped51*s_MIYN8Aw*mll`p1DB#v@Jaue+=@qKN?cglo&-|A63?f;n| zw6td(vcNasnSF;0T%iiI{+Qh5JH?#+{WAZX8-fXA6;PQWMG7U zQ9s^))2a7-07Z;-upopnf(#P7ND3oHKT0)EY{mJt1DwMxgxixRb#42q2*V}J#);n}b2O-sGV+kDRh(5aRAOEn_?QqEX?^PfnAQ=PB3gYcI(INzH2atyf-0&zoj)2| zG?>gEvB{64617M)y1p$sVqCA3E&6E=ZiX%T3*7WgIU9mNHGqiDlVRMQ=|oS{+OzHv z!eG^(?-?dXHh}tF%;c)S%8t9=T$uP6yd+sb(KvidmA|BSK<8>e z{x5ji5ONJ~n(fiat1y&vXjXv`-xtA<@QBxRB>;$nGyFHJ-2mK0fDc z(f4e|_iWLV5Gk=u-?!PKqrHPC*-}1iQoi9vZLmju9XYr_I@;Z&lHsS#XGL7o;k99h zHav#Zjf7yXxp6$lAP%@SM?*X`eM6jsSOB9zW}qQ)c%up;y1VhEKkm4pL8NogyW{%6 zb7zMlqQx?y#fwzN)yaBH$Alre1pHp}uhR`+YKkw5iLDs-Y$(s{8iQA{_F%Y)6Cev{ zwT1*_L-gu+_Kta?s(Q{;LI&UX%eM!hLL};R#+jUk20(aBzxaE`dMxlIc4WdNr9kk% zAcz#X$%!KOOF`ZM0vngZlTG{@9&t2vk*%b?bKr61WpQq8aHMe{p~ImudDwJ2zQf}~ zf?Z&tV^8#oLqeZM zK@Usii$_ZzTKtUAFp}nSlBO7&VFE@gXk3OkZu*7}5mW!{hmTjl2@i+1linazphO?g z_mUl41ka)BZ!H?DBNyiXTByAmVC; z8R3QCMyJ}dNAbzyP^u!&RO2Aw>D&KG+g#UkT1z`Xi$)BAcqT()Io0z%iQz%axQ>mv z7OnJ}O!r4fM-(kIUeEZVkA(;OWzx_U4d?_g$QF%Q7yXI!#2SEMXo40VfD*0D5(oZIHZa6FvM=)@mLl%&R>_vkg)hgvZ zOY$8nwPR1drb3NEgE9z#jt`gS8-OKGL4;0Eer`*aiz|~yNuYK@8H@(+YtH9tqUY;=>vCWn0(*jEkEH+YB*Zx`knS~~1-Ae})cxQ`6|Zl> z>4aYcd{y*Ww5MOFmu@=hyB^V`UaVemaar3^^8Oyubi#=QD)mfM@DSu>f){DPJuWuu9BcAIqh+RTYkW zz=`urKN$_4<*mdOeAAf!gd^=EeJPu3nA>Ji93L&|ID3u23Ft{Tu2>9`<_wTX`_XU^_N$MOd+`mp7!yjjL9-eVde+Tj6=%B=w7 zHYQ6qh8M#~g1g4Be}~{+IPTCm9q>TC>ltJcS#ace@STtRHZWj`gYIjC`s)WtyIO0X zo#a9u)ZhUr8N&QLS^hPOQ~krGY5@`ZCcMh6gijSRKZF@EI})8N#m?UWPdd#|Z+zYs zFNJ2@Mcvk86+Ueh$10$s5XY{RXXbanpC;;_*32Qb^@$xp{h|wfK2?{-HmH3;eaB-j zm*{WA(a@f_Gmg8?$=N~VbM{mg{Z>&{kG!ewc)yV<9j5V3vWaGgGvoOk=8!%u&t6!9 zacmx@ErPyH$5hxjM_D50&lBX&+Yr&1NB#R6{fCw4gW^5!8ahLmzrc`acdp1JeVbSJAJO~c^cRnsson| z);w2z@>jj<4ehp8gFaV7h}Xh|)*=koq5{`q^4H>e*AlkYl9+XNan{p>)-w#(vjW$D z<*(=VuK(UzFZf(9BHkzw+9)&Js0iGs%HOEz-Kg8zX!zV{A_g`S0|Rt{fIwhJKCr77 z*s}%f`veXUZw?A=4jXQc25ye$Z%+1ZPH%0_es0bYZ!HLIEg5c&5u>iHNKQ=3}p*W1oU!fYPx}!*S5paY(^o010ZS(MeR$$q%sbNlf2K z0_cRI;UtOVG)?#v`TJ=`(CM#&(+9`XT+nI3*D2lXagp#@nbDa$%UMOiSxw&=Leg2? z*IAR(*>95bR-^N5;d4O2c~{U$N8fqh*SR<7d_eeO*y(7{=wiI!LOJMS5_B<}v_JiI zu^@a&OLDmsbh*~ByHaqu3A#k-y9AM3?S0?b5xzPKx)QiLJL$W+=-WO6UEPpe9~)lX z8C^etHXnkn-}t|1D6UnDm$q&LvUHwcZ_@P#+uNUxE%Z_tvjP)TpGNUt!B zZ}E~ZaSLyWz!!vt+qWs-={WDGjPGcI@8}Be82ay+w(nTLcWk8h9AJ@qF5`Qi;CsHp zd;b1=!R>ot@V#jN-Kpq_-PaXP!S{cnNb>y;irWv$;0IOGM|F`$P2)%H;78rUN4@?> zgY8En@S_RolbOhqh4GVB@RJSe*;Md#4t`Ac?Pcjah*=YEe+P-uWu~3jAA7d)M`u118WRCiwd=|4|-v=%$h%J}faU~*0<5;;s zNGFKWl4hPMMJka*Dp&JVy+SEpII>2QN-kZv-YD_M{n3i4Zf_9mJ8G3`iP}toRG#*w z9>8&nB43Z=!XS&I)2Td9=lWlf#P$~~k?xJjU?hr2yuRnPLASRfOO&E_-S$u>v+?Nf zpYFTEsY5(oii`I)b?H-1()oIib}RMxUNni=9w%#UVDDV7eEnx9Q19X(V9On_zcZr0 z_mpq&>UK0^oSb1FaD3CfP+ur{W$^BGwZ#qHf0f3+db7~tFH>mr=~uNg)ku{59C&ko zak)KKXk7CCO1Hm#@elC!K-nY;eYwv%0470Z13;oiu!$oEDm3-Oy4t0*!qXl!NuaXU zy7VDSO}Vt9h)A+aVJ{=y_M&$)%(r0bl>Lz=jJNyKgKM7gr*Y8`b+UOwKh_z;tQjH+c?#pd*oneCtAy*%&sH$?ss z`OUPc&Yrp$9GRt^78Mb&<`B9bXn}K1Y*&&CJkL~KyQtiBQ+9&M9aGe*uE0tyo~Qy! z<62b0gk7GIO0-{6Yb0~DQQ|5*^+05ScubF{7CiJ&SDI08n^E;%c3j$%=YC|+#Anb{ z)uuh%L*<NpyT%7EUClv&?yo@IB6hFJCqK z%}tZrT5O>1U@$O>5QzIUWEwVZJPIQQi7{Cu!fU^Uo{#n;aFu+}HtGX4jPv~e}*&3k?~ z&#`Ji-T5g^NU;YA|9L<7Pdn)1KrOh>XAeKO!25i6@0ZL@xJ>N55OcxD^`Zo6|LY!# zc!BS&Qu3Gk>XgNn@1x517N_yXF;f2;{uKr;yw2q8h)l z1(Q7}>lP9A*-*4oqM^HXv6PotFeebYXmgrZ97dWo5LIwjO#N3%U8ZB`XgnFb<-4pQ;6IF7Q5HCMc;n45P$K93qDcf>SGc=k}|y0hwX{N_{x zo+MdrQ~W(<2~w(7w`FEsAnbZE=JLz%#fWTNZfVJD6Q1-Bx70wBk3DEPz6L7!n*@6p z3(2C6U%Z3NN&HI`eW3QP^&ifu=5d7-69^O1cTGu>K2*aCSOP%D=Hwp=7GzRCQ^l^z zQ{)8>Hm6TI{{BhM3~VOrGn%N>{hG_f`n`^W60IOgewz%9xJDOAKhCpI9o!0O0x@Bh zfs-}kFzZh9ULrS4F0Nr83C=r$jqaRD&QNEq{Lp1EJZi~Ak++uNvYrlD;iR#;H9Eeq z&H7;soX5 z@2aH=5hZlxzhUYcuUJ(whbgN4;+it}*wrdRDeAq0ngTztYjkFkH7!duUT+?#wMXo9 zS4)>`RWlV#uwn^_$=F-xJ&5lx?qbM zeKIJ)cIzUdXVC^FqJvHF1=g=`w8Ww;(ae%dbtk=WM3VBqTd|j|&$zC%RBEBxctWjX z$l+=_3K+kwtoA*R zI0rp;Z(pbFp<7qM^1dARAMx{2Z_Y)MUo}O`bFKYFjdF>g7BofDSsTP1b&2BcG5zkn zHbe^N8Y3lWhLOECOe^ggr`59uf4%!XDn;rCoT3SIBNb7H?hT1Yk2%Tn+L#EOTS}y$ z1qJTFEL1%qZXOttw6+H?6y>XPGlRcb~9GN3~ecD>u zJ$Jdsil=>j#yQIU_o1LQ|LXdz_o#cpV~@4)^ZLJFIFBM&$0N9F(`{*j?p|AE?~TPmIL|66Av^W#jipLy&l;^>JMDJ8=Z)2VIIpHiAqO*D;M$n9S94~sgB34u{a=(57d{lHS{Kq~g;xkEH|BdB7FMvqiMRp+n zWGTq2Yjx|&Be*+qn#H?yd+RzFzGvZ{rKESY=Q>m-U=O?T?r(S14PoK?9<_+?ByZ0x zzh6LNw~_CxH|YMfuP2qmd1odV^iV0&+aiHlJ}=PzP#qn3VcCD_L`ih=bo4%B-R}=7 z1qVIq*$LSiZ~O1zlHT@PYu<1R1nl!}zdFbWS7#*a9*Jzft+x9;1ak*AYLmWi!w3Is zYh=Ea6x?DQfb$sexfhv+6otSTfNvc@&Hx~MHko&X7pcnKa03Eqc6!5$vA4?6Y(9F7NWOS%Y~<_vLFxG+pf3btVjg<%^#Nuh}0 zZ-S!f!0OHPE*k|&dRb@z#UZW~C@I0=P=#R`L4e|>B+rASYQnIVN4MPXA1?X>3K0NF z#c<`hL7IyQE>$TtB1v^F9=%p6y6F)^ixD$L9$`Uxk#9Jn7j0_aMoiqLB`-#-KSpd} z05)8s4qQAI0o5JxBX&chCh-!2(}VgB;w*LIEFWzizX#p8WEjifO+3UsH@UqMWb8lM zT$V-yVR)RT>765bhSGTg4aTSs2Kf($xrT>ae@hsf%le6qM`R57Q$ZcGBrei4k86RCb_bushkW2 zvwemB-%}1fll4%tGx0sPoN_kb6bFbD8w7_3%M_&(rY8gywH2qEC*@hzC&zk5r!S`F zxfB-a6nh2bmNpfGE~Wu*iu8y|%MsHPSc=U(ic?rK0TweWOQWlGwcs_$wDl#$_6V6R z3#9`lWxpnwsRyOux+$2RDd#et`K9rLVP#;3;^y>tRe;2Cz^oa}?4X|Fg8g)8+05p& z@@9|HkmkQb2bINx*_(&K+W@BB1N1$EDSfP|C91GbkHN1pS%{I5)(4fR3`Ho*!SIJ! zNR&}pEY-Jz>64|dJCEM`;bAccd1Wej@TMyFg=*Z#oU*|rw5Q5nA~i0mv39I^4TB-H z%sH*re{;>MyF+t7Bjm&dmBg9kWw_K{AO1Cosgij9!^0lLH)Q@uNUcwhjn$mzbx>C} z80Yj@hz%I$aG0a(9k0BYWyqJMjFhCxXQpOOt@jx7Hkk7=5C?Nbj&b%%d05PcIV^Gq zE&?vNd6&igU>4uX=9+8g54-1uu$Q_p7q=)DzpYP-X=&y&F75I!!O1O2Wol;IFCD&V zoFOmCEiYZ1YjkJ~gjftHVK3LzE}i);LBuYpX)VVxE_d-Qf5|RuWokv+YrXg^zs4;8 zT-FM$)yiyQF_>90#9qlfU(R@0ejZ;o)zXG8#cx?CT)pk+R z353<1JJ;+L(7AtK4Uy7y++Pg~>?PmelGc=EQ77gqus`%5|-Bz57&|&*OFn^ zQ?S=lsn^rE*VCoeGqlz-E!VR=*Rvzne`T)cl&|Mfue+JR%ayGns zQ*V@TZ*6DXU1%ZD3Elx-9?Cm%Qe!EViAZ_QJ0EpQwD={4{r)EzX} z{czVcJKtQ)+*&W++GyJXju`eR8QP@l4wbKgZ43cx+~IsL;gW2ieJRj^7U<9tbmR#- zjs%@#f=?vIr5vcBP%{T4*PmMJC(_4_U^PYk;B7Shoc=4cOA z#Q-)A0Ot!G@5yu+4-unc_kr5r+tbz)tdZsZE~%9nS%t}T;7B@f(^`Lz=E)SFCmh2G z0J1bj@!Hm^^atu>j^#;LOFZOyiK~V!DU{ zDOHte2Lu)7VKX}lUuM)^2TBEWK6Q-AC!bh63=7u!YKi;T3e2+8Jthg$yR$8nuhpkK&j}iw<0#7Z%V}Gf@RYX$I#j=-5 zVVt-G?a8t1nSDPHAhAHTIt2R#ndbm}3ZQ$xeVH=y3dr?&T8UeVB4!CD6EuD^i zzJ5D2m%%~h83Abi{9s7c=1FT9ruPB_R?xXTmHt!@*J~~v-KEx}AUb}v(bcvgS3Y~fy#%g!o6nAdkVmo7L!C-Zqx?$g6L76>j=a_5h zD!iXsV1HVBPTF&BG-dCkcQIyl(SG&cd9C^j8l437O$iT9AGOVZD&lBt{zY9DMLASa zT>j#8ypyv<9zgF9`#Em;``b+cc%fYsbMu@}Z z)yhVHmg%<>03Me*DJ!RdoE9_qFhSZ5+q)9O_;&v2=F;ipis$G^+qz2GA?eLJJg6$1 z;UpT-24#>q40Id$ry80RFxY2_c5HGIbs&*+tCzHwCw%dH_LesJfR6MCU&Q(v;C$m{ z&h*diGRsYr#TG0kY#WQ?PDgvs{CqQScBiO)&rRxHesx37>yYkbL0fshD(+^gafjM? zht_{5EK)Cm3J{IH7jwS*!RsNidgpd@#nR~N;ps$ld@pm&BzZjs)7}qjJPL>Fs-(lH z4Ca<%Ws}anzoGG5;&{YZPn*lnfyd85&(Fcnz=?)a-Ryy%*Asg1FA+K~k=8F! zg@&QvGq7Rfkx~D%G3qmq*Gt0cOXBfMQm}qZwtZ~7b)2(qK)+A2%xi|uYbLx;3avxf zwrKe3Bpj+am|CmA7wSUNMJ$9-Lkc_BRc8J7#Y5E-`@Y|yqmGU;|Th%E55hsyf=yn z#Am;EtK0z^|F)CPc8vKqRQelyz5hk^^*i=-e)e>s{TM<0;4}Uhv-VF#wNLXlOppHP zcMj0%{}}rhV6pu%a~;41{`iObSxOo>xB5tkVu?>`@zBz+QJ3r}wmTMdHz4@wm=-3uW@@7>;KT^h;GDL%SQ4Y!$Nc+jiJB zkBOiz=gHADW`!ppf0Nlf&9~Zwdi@r+?TXA_6&gPQuv^VD1b6$gxnb~_EDkShd*Iuk~JG}9=t>2Yb*K~0`u zsR41Y0#}c6XJjxMlhx^i?`|;B-O1_uQq|$)Y^6q_-Xp`w4iz=V>D8ydcT&HQ^1}?8 z;M?8i-*Bp5o<07T6UU2<&S2r7>?u+m=kG#Y>Ys=w2G(o6Foja>hdlZO>Q%I)E~prx zgpMfkvc-1B*h_?A2uIK4G30T46z06_yhT=E$QZ0RW_j%$Yk2XPR70PMWjO*20B*6* zw=HhmB#bW~Z9V^bt<{9vOc{!FCH_~c4A{$K3M+;NS?Vm6zcE^Ah+eOtZ17)CI;(8# z#7>J0+nP?AyjZ22a!qY01loKt#~k8Z{QPzEf`i-6(n3^Ug!zKdHeb4uScbUyJWqaV zYmX%PuEl(gCttPVBg2~0!YGDyTe%z-eunDu=Jk^@aWT7}HA&iM3q?qg)uolck@y*_ zfV+CN)xB?T=K)oKx5b(T6y)Pt<`Mqf`sRf*hX(l2&gxVT?swd_0lRMIc4~ev2h|Z4 zSf{LsW-P|&ZX-tKoIGXZ6S31SeXI7z4gW^D!8C#OIK|8Jl1|2vH>Y|S3IFq+f4S={ zJ?DGxY{Tf3Wvrcha4*jBkhPlo1{Sar$0=5U2`=N7i5D(Kxmk)-_F#kh(c8oyJWT8} z-1Z9W9XRjtw;=?TWn_+(KgVgKs!dnSK{^p>Smel zHt#*z2mOrvPH%rcd0UqflMJG$!~=j9jgFoxo(a@9m&yVhsc0DcEe?k`|(_(=z>dw3e!5qXV%9 z?>gM0Hef;FQMDV$*E4wgOW@`&Z_ayJ_q}lb^&n%v;QbgnYxV6IZ+5`_vVQQV;y(d` z-iKVZWTBVc_`=jDPq%F$tL@}|;rG34mE+eFnTnwIM_}W}JJ@BEwO{jL8!Q6BoZZiK znH;QoYYc%|B^rx@rU1)Tq=D8kfT-@Gk5aY(O)iUtsNED!Vz2~jm?4IO6d6t`NRCvB zHHed#5+TZNieyeFfmV+u#q3e6V!}5>e24afn`jQjbsUrUsVPQUavBvDOOo8}$XzCY z0_!w=_=`y`Mlyi{rzIwhUb`}mucriOh;B5_C6(XEgB)+HN}4;%mEW4mlwg%^j0rIR z!+B{3dtEKb;pR_r&<7^|%yAb81om6%{4@gq(VFT2>Dg4eHPD zUMFLcAAi?~$$duLzU^aH2vRd>R8ML(H)l2kP&1j+Pl10fG-m;Ns9D^rrws3!v->`% z*{tzHOupRk4o?o+`*7r;jo1kb*`T>f>1S-!TXI)=Xn0zxXB^#H@<1Ond_(lJu4yg5 zj|6G?7prHTz9=EiC68&FL#Hus9dbVGk2trh{{`N)6n=fsib6BYg}%AdUQt!??Ema(+1y&rl4zsC z=ckt33{#fpO7})aFvIsjjxPL3uNuy9mJVT&Ssfe`&Sl$$kyjyGrbA&1qtu0wAq~DqP5uRIu+OmCxzN_&)yrsfU$feK z*VY*H$!G%2xb_zV&=e)aWQJM0*8L?35r273`GuzK8?=-jIAr_mfixpIy@y}$$z&tJ zxG|pwXsr-pw$rHHSZ)TiH3Tv{m@@*`7XSc2FSC;ZG8W{4c3X?=um!H)&z4!ldZqa~ zd_ExXkfXhGHju@mlyU1+y}ey**U>YWaC4HTrC>NQ!9mq;=y0y#(uXBaUAvO9{kwYyNO|{LAX+=IM!15g53NdhWyg`sU}JU9k1V-Z$h})ONJkgH+hs-FXAA z^A(B=A^PI>(WYuXCpK4AqXt6E`#b{)^=sva6Emy4aeW4Anw$Y?0Zq|>D?vb^zv_o z==L`?Desq@1tBQ_;%|0=iPs| z$?LVqr;;&XIWO53vJi;Lxzl@i$FnKqqK$aMhXK}1XELls%?V8 zl7pO<40nd|bwSo*OPMaXNIKg#SYQW@oi0PGMVVtKi{vde>qA?@7@jZPZ10)3w|Mp$m z?rmlfS%vz;EqUlfvDBQY=J?L)ToGlL&dJEu33uTcJCFv)jFtsRt8EHHVN5qk3^d#e z5u?EOExuYag=aC9<|=0B(>b6vy5BV;Kck?BGesv?Ze*g96w-5h>e`kP zJk&>zM4BvRnno~MdepiFl-e8_+5|hqaWi<*>CchW`hNSm-&eJxEOhjSbpYjtgS+}0 zc|S)>@Q%pwLDVKIW=1$Wvh=3L7&%j&%jV29<~$YV!Za4r6&A`gmfAFy(kos$2HIX* zM$(6-!rtq(!5M<0bJMY*Rq3_W^!Ac!{Ts50n^Hu$MB_=`3Ku8I*K z6H?f~G>V+0B!a{eBb=uyT$nCGx++4ME>gQHQvHMm+vbS)=E2bg#m~r zrr?C=)}kY&(scwqu8$6>`oz77POpB|P{v`S@(s^f(&g{1lu z0c@*+cKQd8{=dPW7dm)ik)%h!lzniPEXO8oqY=70zL!O@E-c}dloLwK-29VGe6EKt- zeJ@F?4#>4FRX!_*s)0siAYf)Fce0xiWQe}A40Efg8m%rjL#r4}tw^e=S&6SKzz!=p ztQoaiX|;3ht*HYs6lB#Pa^f?#In~C9*2a3$wMQ{l`}D&IDEQ^fJ>Xvd@K#*>&P8Z-z}po&fpM>+JyazkypXr@Q&re~RER_bOzOtVLI z>VIh_?dodx^rsjqEWb0)VvGqNoAIOBXGkpi{+8q z(GeW}VNk=V8H!HcIi)ZI{>AM6DU#*M!qG{A?y0gKmsjbpM<<3ACuPu8 z%#l;XWkZ>i5gSR)-CNO37S*kA`9Kuz9gEI-y-w|qLDHg<9I1U$zA(Y&)kopRL8)sG zKPljIiTVZ2PkuXAo*LZuH0Qw_)_@XLy=rHtEiwkBzPeisa_1v#F z^AdIEV~*_iFy{~9Y{=|&m}BiHr^ag%wl?Y;8G=ao;2U`BLh#-S?5Z;)=1qYXo0E{s zi(ONXYm-`7(>KCM1l}h1>Kn)1o3v9G$J-`k9iy{c$E=yAZ>vq`{NS5Ez0NSKIxp*# zjLfd?KW-UD8c>I{5v^}fF$urn(xQhqp*PmUmJ)oLxw=Pg^OO+di>%^96XEFG+W%q0 zvc4^Iy!G*NMX23G$Yw|4#QnOZ@Y^z5&)6g3yd|4*t)9Ql-S`6^?0U$8OSIUq*t?G< z(Tt$C`_&0L`|0LkSwh!bz-s44)xCgW?0Q3R2M2%aLeGJ+{|7|^mp*TW0BA_xQcOm; zN5)ZjFVEJ+Ou>Lo!F9+i*+zJ_58nz9m?poEYO>K^;6nH$Uw zsX=ZB*?a)mLP+bL!+c-PbI)12N|~I+mUr`M$te)t%wpfnQwY}PH@{^Jzwe7}sZQf$ zBz5&z<`j~@6QXD#1h_M^Hj)f+ifOc1%l%mBQ5dpYxllE{b47})kEk3Z1*7AeUH-OLDA*m@Y*7q{#(*NTW*S3LJa|NUDBwQO5^|9uKT=O|Ify-~VeTrS{$a>=_pkOq zZRcbyOk*v@k>D&59rO5^xA1d}ORGg&#rct*whfK-QRlivLt)h*+(V$ytT~awuDpeb zl!V5=gx1-^F_znKwN3q*NTdDAsE|z?-dNz>Rhrhw(jDB=rSvG%n5E4NNK1WalIA(S zYW*b9C+K%o<9*=PF6B?hF-3K^n*ngovch3a z>xFB(b@S*!KVUZIK9g`F9`Cq4^FVoX8!>X|j{WBHmN6L8y*Fz&vE#Kk_LM^PE`W4? zRyTJ@Z^ub{YJ+RPs^Kk|X~@~-4G<^^fL7xaXffiw3qs|4&*60`eU?M!3uX1;BlOvx zf4<$|4Oi)a*zjba>`+$WiFEcM;(vJ*M`v&#_Lv{WSdvEzx<+}ds4?3hlK)SoT zTR>VsN|2Q9?(S}o?rxASmG176Zjc=0*hA-Bb2`^v-{0E5cl*UY`~!46KF4!i_kDfN z^NOW*^O$wTS#@=fXpWb<%lX8kkl$=n-kfN{>&V*jir3BGf;Y7qC#5Ye<)~qTi!rUZ zC9Rq_y{RR=>rPkjL?@fupzDQV{Pun$j>%Bn1H|}G;>f6?85MK>kTMa6IElyi4F@GI(TOBihJ$GBZFn@zo zTZ1D1XZ5zvy8MkM4>iS5zUp_CCdADlZOt+KEh+q&%e5`VZLQV(ZB1=$XP}a}uD14Z z{*L*!4otq*^|sD4{;u1$t^~JsP+K>uz!x0PR**{*e*0Hufp6UH)uip;q}qEF1$t#s zd(;K`OxpWwJk5mp`h5fjLfQvx%s$1m4`vGtaXvI>tLz_d3?9`Pa@m z)y_Jq#3h2X0J=Wrmz zk#BUjoj+oP;Ku{bs{w)x7e9o%_J(UNssSjjtXI0iyRuyuIIK4=UEAa50%%>=9>RCj z&!;KE_YqHb#ljCZPxnp2kFrk>{lZVoPmlA$&zOQ=&xAp@!XiDGJh6JB0dVM4s?D+b z;vuM{l8HQV2CpMb1tRtx0Sa>eagSbKAUg)Ef0B zlSS{^lC9o1*?jLyYEwI2$o#msJKL6Gqub>J0f!y=xk@Jy0^)Cth7$k-ViO_~003(Q z#+~>j|C>gD*clUkIQqY71fmcuaxw}2vqoU(bNPI=-nVci59m*9M(O(la{T_sCT=G4bz!^R_@XcbdY7kMf>1G&BQORcbrC(@b zC~xe*W+ca)=~fia+#Z?!3MHjsvtnV+JX*-ny1 z6>g!gkn*RU6un^DBER>_`#Y(oMWwrGJ4w7G=@!ohFK8U+%=R*K7A}Uv>~~wJGkhBn z^g@;UT#a*dmoUNzBDoIt^X(-JhQq=o`DpV}@45FQf~YV(BG|j5Za%P*@)D2G^TMUshTh*8J zlZ`Trzun^JND$MFGMrrGlV2NM35Vlq*oqo$n3FY*a*onYQLkUL=6`Bj`A{8oT_j-7 zTd~U32zqi_HJB!Jo|ZvHAzJY)j^d7gqKeL2{|KePGj0U;!F4C09I<7KqipnUD?Wz$ zd^$Km;cl_Wg2?@_!bhlJuPSBX=BtBlG~Z_2GErM>&Dog#a`Ss{_mx(VPWu_pO|)mQ z)Ob3_?CsiJ`=OL7t`DS6zM|_pn`j1Kn%6O;kBa2@mt5L8lH3~OmGP)LFl z736^{aR;akMIs=wlV8_FnVUMzk%H;e3Ioq(6+( zGD6D3?N9Cd;aM9M{hl2Edr2umM_4p!;+8PHZ$BT#VdTbP{+X*r3_6oi?1mdTSvA*J z#~d;gkZTVarkNzWJccL8)`&xrMGQ|)IW9%@6IK2s__injKD%O@P`rg-H#7u5zVeN% zI4J#S;Uc+tq>#yFaCm>I2GjM=AMX6(zE=na&PIk#SBo<~x@Tc90xU%Jc!ZtrTgz6HhS z0xz=x$R#3hG86uIS2^&Erf;D!;)D6Fa?zqnB&cO3!?mvRUJ@bzxP~U9-LLXVkV~bd zWTxWNt_o=6OJ&r-8iCfULYAmfITM-bw56*ep3zbTm!avb`>SFRk?`C zGUb$^nIgXHQl+Re)nb|1GOg<}jnOi-rlHv?_v>;!k3o(a;^EHxyIJ( zO53P%?LC?K)}`yJpGJh+q501H>uO)*3OzX4g|B$v>v{PK1DxUi1C2o1O+$%%rMdd> zKQsd0|D#4=6YsWpK)%X8Wq4(m?;je0h0!YKrs367_kU^xn^%F5wFNMgV)x zASt)08Mx3jE?pb0;%V?)1?**`(~1mHt`vpnuAvf*}|o=mCV_s@DmC0^t5B&mnrGRszd& zP(ZAK(zRrOFib{siBQ(9z8D;SF6h$Qd4Y8|n_S1LtfX`I569-%5^ z5V4caYl#|)n*)iWLH3U+3JMuMF_u*C%wuWk0OS-?vAjuiUmVpTI38|d;ODF0yk1g} z*u@N2i4x}Bb5~QoX|{Wbt@MCht)341v#-jNCg8fAz;8I5_fugB#IS;-fVVmAQ*=1HYIna5xulXUU>yV{ZqOL=J6NEqmkbWc~jMDo9pG@h5Qd6kXY`(H3m%; zfzsrLP&D@9iP2CpsY+G*&4qDemT);TBOZgHQi)1H-AC+j9Nrqk;jkXQqqyZ}JH;_N zey;bkrHkHcBd-{Y0X_5Bil@nLmz)3WWa1k-vmUF`QP<1b+&VsF3JX{}duE#hR&<{S+b%ITgNAnZ^oDf88%xKZQu| zv(08ZGiAXKAlhzc?N=w$?*0T8BDpeb_&_6qJDCNu33tx7Tv>807h`D$+P!zT19jj| z=H0Vw3W7*b8jl#blUXw06Nl=0dYEi&JXwaWN25?m7$jWj4yf+DRQ#aveIP-FiADbJ zPUiaPrx0nZqwN;lF8!BIrmG7C0>IL2_(EgYSE!m0|xY^%|`J|?E&|7RH6ejxbu}qXU3oPn$9-}&tt6E>Kx|im zU*GB@z&1Rm?Q(KGuNT62vtX2Bb+c$%TzRu(*>rNVY}?OxyW%)+b-P+Ga1k<#Pz_2S zU>JvH0&WE2SOdR@Qda>tBe_q3Td`71ciV~T)^|IpCRKO487|Kw3}NS)wd=kf*7pY` z#Z~u*6-}r2M>Q5Gt^3pgvaf5fviO)^F)= zJuhd}ZJw?dOl3E(3bv=03LjiW55{h zajc&-t_m5ywa5_#Po{s2+~p;7`(pVaA$X!*AAi-X!)holBgoL05UvYs1$~Gl-R#>S#_M_o?Vpw81=4bm%*ZL>`*1uTQ&bkb&kBt zU7&jE+PRN_k}aQC9_#dF<&;37ZZ3jGQ{&4TFUpUcXNUZ4Y&TBLBa~?Qw3@`qjdky% zN);(B7W%VLvsTH?a0J`hdd8#H-qq7H|D-X+HD1quTrZr}d}%`RJ#oYTxvM-iq%hzl2CQ zBO9>%z%OXgwyRf?U~!0?Iqq0ZF!#uJls|hRlSNF0+*G8Ji z8OC)q_wkI?M!Sq`xvw_&i=foShIkqTCVkV`mZ^(R8QG@dzZ+DFu1hRN`sffPqoFbO zrx59GSP!K>^^07^?~Q;xAQun|p!`(_|L$%65(AQfJAyyOfbbi{ucLp80S70xq~gJ1 zz(muF?V%JF{YJ-E^+od0>>z~Z!FuZ941O;}LU)$p{v3&fdk%MS9ZZ)?7s_m9E0cm$ zt&iu>95;MjsVC(ww?_wV7WAisAEmGX@G$~2L!%4WfO;E{_sA-Jt(qt#(cL*A!;k4M zH)#ZVV~w2o&6aT@*$+U5i|t_;`uBaFnwQ37F@ip@@)}pBQy%i!l9g&;(p68VD_H*B zjpdSp)q0=2Dj0MXdIx1=Zj%KL+zT$$s-V)Bw^f{&wb((? zsUqm3F@O z8d4QiOHe~GXS70zyOkleN}B)>(@iJG>#U~D z0AV?MqozqpUoCNbqD*REYWV<|74+@j9~-z`276W;f4xpBiD=TcIbZzYQR(CcY;(T_ zqY=wQO55f2hT}4uj||x5_eYZmha_|D>Ukj#>?b~ zoh#lq*v$7?y=bb^ZgV^{XM`uOUT^XJ0Xz4gUZejt;03u*MYG*zeG>(G|N@C-w*b&;XW)~#%LkA9Tw%6S&*KB_T4BTvQ7{2{=KQy5MJzJ4Q>Isuay9Jz( zJhy>08#4c9tuV;AR5ELF=jP22`e2|z1X~^KmIuuyPktD;|6G0q*OcpKG%Lz0iWtUc zjr?Wb3_mDL zRzoxsPc&aDEy?D?qAN*vPopi%uhTLYD^3HY(Uq1DEtOSP(_zt9)VFHUS2sbXTZpzD zF40$Y;o(=*eIs+Ps2Rj~V5pzuYpZCO*IKrWT%J=qv}uRj_yUh92Y!`yA(i}E4zh+% zTMqN+ZCbCszW>sGvAcZQaWvYmh=o9o1Bo(m~_y zv-?T;?T3O>&)%rYGpH|P{51m>9c@46xT*!NSY=Q>kH1D_JzfvvbBIDh1`>-vV&bZ< zUNsR5dqPm8GNU2DP>l15Hr4Zd-2(1agPtF6&%llS&$bF45a(q4n!zxtL0gRurFO)4 zYDl4yU;!VVPu9OpTo0zVuN%R9f}KEH3rg6u8=j0h0C8nwk;zr8Gj_tCP=eHy2={AF z6iX0^wmy;qBpY*3*qkkTOe;zhMKAv) zMDl1R%9AmSkO9~Cj1P8%=($i>()YEfjHHrT$wRvbEF;~z^x!9zKX zu>nz(tB^SFUCzBbW7oVr?CP1!b}kYXAtveTE+BF{%~?4$(XLbvhPi1BwJOBS%Tgx#)ZEtG*9A$d$*&A zf|wnIJ5+Y6Li4y#%n*l&Ncv-`TKZlO?mm4n+i%I%%=rl*S`gEI_0A0&0>! zS0V%SU%u~e0GT=En~UoZeA2ru;CK(h7UQKJ7{O8tg<_Ot-LCwJ&l98d;wqgdY6-*QW}6D z5DP#tQs>7&G7iN+n3{A$>$rAe7E8oa+b7_ld39*0593KD%ypP+DY$%&rXjHF{?jv= zgV7}O{T9n5y5!}OOh*A;piyYMRQXG3{IdEWY-JuS3d3Pb&$+p6S1v7jlTzb~SiBVF zw%r8FIN81}Qu-DWN$iVi0~KE&go|p}6dttBNbD4h!?)uC)`Xa21~&zEn2Vk{Zcf?n z{?fG|Xq&k$R{g71wB@@o*Rl7oFJ-oO{BG-cUhamy#Nr~nbPLvx;}9tbIzh*G@&#1)KZWB$p>W9TUSe6x-{!~6T-VKWwIgiSd&?M^obnJ7 zB4ynvt@KSGbdB!Ix_GPvcvr>03te<{Z~?oA*i%=B&5JG;>sMw>sF=f)oa-+`;YfUe z1AFVs&<&Z__#Y4!5Cwoc53A5ZjXl&%>SEFE0UfmSj$WID$Yl2_=~vC+qb7an*Op05 zptwb|+Ke$FuoTKfru+u>%0QYh(Lr!gDkeB8KNRwmFq_ylu^0P59iy!YKyTjoVJ#SsFb5;D$v4# z3;!_BYa?YtbXiwK?9Yp89Sf^T_Bp8Ta!B4j?nrXGxSu?*vcR-&{nC{CnSuU+k4{~x z`V;Z^43lh4^k?o3BI{fH9|=C(d)Od5WM3&7F%p-$fE*j+Vj;j~)h$F-KDJAFFNlw* zNz=cC;4Ol5eUrsVoM zxvl!0&HH(&&QWg3UGDU_0k-~_u{@7ZaGVQXP*(^bfHy$t1?U_hX8L0YnZjKX;1#5U zfTJBsTp+8unlGGP2`(6s}iMI|9H&_>j3Z)HZuUUi5jI0`N)dJxJ( zX-pQOd=Q|yp-iRA4K%b~>UWr!E~xos!Z}ETKMZ@466AVc8+DSu$`ab50ze|Dxq6VG zbJXV=u!h)^QVI2J0&pP`Har1w13=7zha_YPO9FB?)*w3GBByDDXPH7W4}_JoxEM>h zj8B9yyD~9qxFEBjSjIvuu!NcP2aKMh-m-YPK*1$wplqQbcJqYY0RWTKFZyT@zX1Km zfv7HU1`--CRzrnfVmnIA;~#`L898h6Q-BF`y zbjrRCrcz~x8?+~&HkG`NnR=%@e3J^z8cxd6z;5@$*h)QgSyf|98DCQsHd&yE&n zTVH>GQUoA2LqG%KbBRCS8x%}i|J!=cAeBrpGvr(rxb5z+1P~AvSc8~~<|0?>CE&_5 zNsR#52wxfq(_4hN6Y(rtvwx z2@c>@@aEt@P4Ni8rT((TrYEJ0kmlr{7ws=;u)xmwc{(?qn}hN&R%y>1K|?0BNJ=j` zWbd1mpeSd#y&4XpLY=)p-#c?I@lXK@&-OsTKp3*gyfgec>UDR<9vfm34FvBSPb<9w z)>7w##S9a;NGbEeEfU0~ZdeY@07ra8nzZhGCKOIGL)n2+k@IvTl(z z&Ca*9sHbnTc}<B#F=|b!MtTnQM*$bO$g>7cjO|SfT~6gR^`&6}GVn zUA9PPB3`y3g`_Nq;-v|8{aL3Q5tJgRcPx$q7g?g703ED{S4XJQI`)r;P{!t2r8~~~FfU4Z) zOn9EODdWroeDNI+73|>Ul#*-|o~=0yYg>bIZQJC^jySx4BHz+Tc zvJR$0XW6blPsurQwbT7r`}w`a2{5L_(XWB~qi~$&0EYpR2Vset08_vCvWi{uktvJ_`M zCb-z_%@W9CMgU)_SCdU6D;C>OFdBE=T&-CCR2uT6;?+mxl_}GxO|G(1kBntg!FQ?- zuRB2boss#4&6-^;sxCKeuU~~LYr;Y`GzRhX+SAMmK9}1Bhm;b$mmBa)JqD=q@(f#n!K&&~HzN*jqP5LNjl`s47j-^|+W0LNF2s(`g5M^z``EdBvd_iprOeew5qW7&5NGS4L-~(f=|*1v zEnq3^Re9!@5yYR8;uf@IYbuO>3ymN(;7C+KZB%bL9BKFMO(3DAK5SxJ7_Dj6gS$j} zD;}5ZfrO)HbG>|BDKUXXa-K&eXtA4Zm~Sz7D)p;_ti-sLvd=SxeO|j!IMA}oaC{!x zs#YA0XJkUbYlJJQ-n}p-x73pJM66xK{;tR2Jwg8`#N3u5!C1VYC%M6-BoUfJHC4$Xeh*SAHkIm_ZTST7{mnzM=Issh zoZV>|pM0kT1*xpMJ`N-0x>n*$!a#cb%ya<&W`SOX%@(tnAz@p#l7{XQ2 zV+gDkqDMI0o2JG4zV|wXL1&;Jrm3>Q%hOYOz}05D>6#Vmi^5qWmDpuZHw3rnp4GML z8=oS+iP(dlorkS5pThz30~nP=frveAtwtM=gl1MW5T<9NzS?Xt03HNK5z zv!*VJy~{~I-9uX}x75U?_7O~5Ft5iaGrx#ZuGqxdk2BkiDRfCu8!(@8HN?bcjN36} zwTT7=#X8I~iug?H{p@;~pK6JT*fl+v^u4 zIwA%W)ZPPiKG9+em;@;MN)CB0n5jD}3Pj28Wwmjh?VqGBEc}j z@JfZbBPWe;@E;t4@8X#LaDwGyLSjge_TfuhL9i>zh!*xHVewYSEq;`_b}>#zk=91? zoDG=A%%!i)_C3<{97v$@+ByY*VXD~Vxx%wvrO-6n!qqGE2Y#O}0W zu3yI9I+Fw4ZLWWMCL2a@lSb^0guBlk0u3K=-aV!UJpTXmOm;mVuRouHp3jLv7s8+` zUC@mW2$=mZ&m@G%fAvg4zf#_oj;EB*`pYv3P8RISfjyIJJ%4y6y`G`*RQHwg{^6O# zdv~Z>_O9|nZ`!*fwJII3XA)oSSflRa-=4|NAbj;x?N+CgwO+7i@6z^Cfg}F#=z6g;n*GZ&d2_Pb6+*20 z?0J9v%QFe`etvoa!Lf)yz)^rblc*9bqA)l{HKK6DKRuJw1vO$Xn0r{nk-2|*CWWC{ zCD5fPY9%lge|jd>jcQ-x=mxS%zB2jgnY8I)l_GT6u9YJ8`RSPqp{SE4kC9+|Lkadw zzM;+zWRsySE&zKbt9#gF8Jo82WSP65+2wwECgs@2CD`RT=Z)&+xz_{P6?pdw>c_gz zTZ)MV?GaO)-0tOTPl+g}X*CN<)@ki`*NO8O4_~h5-#nl@ zFBn8cC1xAFkxSB)&-7C3`AGYjY|i|3r1Pw$RH5@SYS`%Yd-=GRx8l0PtE$DLk}Jg6Lj68oL5WP1I)M7Nq8=`>;~ zMCnwOZG}kaH;5%P7zT<_k^%18zYik#!DEm}fZ(q|1PJ0^nVrApTG&`Le=NK*E-3l6 z@QTnL3H*1xi6BQP5*V!eIFQ6-IP?hb0A6^7Zn3#Cc$qVnCF1goB%``JkteN4BtO(Z z)>|l_FY_q%5};bD@k-4r?K8bhG-S0qA%8qLU%^`${@SCF?$3o+|2g3DM^d$Rt3Q@p z7M$+@Csk3Q^qlV$FO3T`h0_c0w60{QvgAD|dGqooqV6S7z$VP9pX*M62u7J!_8U0OUMBtM$X}( zXOAUl_od5vO?RvR?^B~Tz$iffR~`riIQZw|5)Zh77Wx&32|=g)0NxL_^)(VtFr2^) z-AEcd1|;KfQ!bQEWO(11G00jZm&QZA)c&cy_-m$s7a}D*$G%cF_(RnD%As^Ri6L8t z5)U0PP^w(6H5z(tHc+lp?2nxOj`rX8gZ-a8E?!&TArO<|bBY_g$!ILEPc(!3)z(x7 zOorr>qLblVsqQ!HQCDZn-bP-`?$MSkv&Dl>aCTvhMgr7Ffz_|C4I;eSSiaP`7ZUrqMl@chpap@Z!NB}v+yL{;y}K=jkeg%6mvdYiw( z&bz5b$!5EseubSa8xMBVZTo2VGJb`fU3W{VscbpoC<9Kt{N8W`Vw>;hhEkR7=lu#h z$4b&26eOzsGa@7zFo@%0kGr3f`)?7U%xJB$aQ~^lBSNy}l_zF{AF96o6%k6o7|yEY zC3*3$h>$TIW4LdliB;2fvc+l3{>44x=dGeYBSLvc!5$1{m%GEJfcu-H>gww>I;Kw0 z^8;!Z40XkM8N`;%`Pa*52NrNdDAMd(u@*sX4?O#Q1Y=GhI3h$5U@*))>}|<5gx9n} z(+AatRNX_sZ7xe;zx^{JG>jg`IJ|buKEa0LMKf}Xm&r8B$&46IASJr2FHw&>*VFw2a#H*IVD}j#!1~K{-#Ewl**F156~dxivd5^ zAB}Zd!(L6pP9a{v&u&Lirr)*Cz=iaySf}f7m~N-lRy4l(U7i?-AZo}b!SiCDBs;of zs5s$6>p=143HLFB#k0+Bqv5dIUZ8gs%@NIu4zBUM5QVGUJ}L6YbH0cwrzQS~thTOZ zMbPmn2Ij`ycD%Wc)2#giSaHARBkTlJ3Q%mhzEB$%s^^%WcFf!4zi(d>Y?2qcjdAb+ zE!~T+qvy=GZ*?$#IOW%?qewrASW3Hd## z8y)h97&)>JoO zl2>fC!MLhqDEYbHNQ%k>)mD<2kzNDBPW-$TjS^8Zfnqd>O5ySi`mgFknHcJ7)k}c= z0wZ%>oHA%p#v}T;gP~G%WwkLj3@P|fE#;7w=#kD8Sm%$;l0sF?F_FjlPn06V~~1YA;C#2Wi~x2qj2wY9D*H!xt#uNN%6WYfrZp&K;IQ+I3c*teIP6>+8xIaUze{|hGBlM~ z)lkUt@<7&5MkR2pp@`>XSKeW0TJ^L69CqGT43L>2LHS%FEx7SEVQ6NB@pGw?;L3b+ zL-D_bom~&7E6pAA=|25i*m)|ck1qdTVP{l{%8oz7&ayM}U;Yd`|4>=z{k1dAQU_-y zYCB`^-*%>%OdF~vxW`CCPxfgpvz1CW3#LNOr!&ngL%k03D+n+w*llcRXT zzs(a5$HrGyO-26>*1}_YS1j0348&3?8q1X`lMN^12?t}fpz8xt2w3qRUD$VfLf}9@ zW~37eCUUWzFa*M}Oq7ZQO;C*JRDEYkRY96bX`kultF%n~ub1o?G$W*r5TfXAboo^6 zo&{SGyBWb@;lQcpduKgxY9>_s`dzH=grFk=I3sLhVE}-E$3%kvRn2}iUu}@;kPray zQe1dw00cDj-(?O=??e32m972i%DU6I9d;*j#rLD|zJx%P`iU1u=e0)QO!_&%zs=!_ zz!kT~Z>hv$2wf8^Q{|3Nl{KhdLz`(--r+K+wcj1VKsS<4<}vJ`;6htbjN{RX-+ni- zH=Zum6vW|*Wi}HFmpKR^7+MQK@A;M6c4#@&$|6SyZZ>RO~H|2}@4>#}L z$f#wuB)+>m^zxWY=d2`!IXXd{#{=ZMzEmfDp+LgfgY$CF>U|tJAWfLlMy>dSbR#M6 z(t96>{@K|3mQO1yRf9#?>)8mCBNUCW%lqkgC;0c~@DGeh=vQU$y<3v_uNc!kMkrPA zf5n)>b{C3pq2mA3Hq^f{rbdQYTk&{r8v0>;zc423QqmZqG1EUV zri6V`-n>W=v7Z=|aZ6qzq;l!6%5Lnhtz5GGFN|qXC&@CJHw5?X3>af_l_c#WpcyNr z&bEVHqVgqkzRS-s4cG5M`c>K4aYz!;OB5*aUExuHqjUXK^sTCpllTLq&!O0 zbrcBN_sUIL9Qnl6;G1Xtw62X#!JPRtP;p+N35RRREE;Sa zJle7)D2~!r<{;d8f52TA^$=1DA_us?m?wJJ%M#XkJQX{P76|EhK)LzhylmZml`GyQ z5Iv-ut$*2BJnT4oyLl&glBdNeG`r1x%D1(sxB>;}9*YD$(u@ioWz&xz zB&^=wQ?mxVwe%*6Cx*nI5qN+g0Z3Ezl+Bc;;o!qi50QF|ow2IRaxUpRv^Ake{`)*$8y?e}}F zXSgv()Bj+qAMT`zPk5<83>fi4^ITaXf_gLX3Y^Rg%~&VJ9F*Q>tc#0nSRp5W^G1+u zQpvZxfQr!V4Lh%0LQbL)b&7xbQR+oviCiI_`rwdS>qSycfr7J4G1g$u?!Pdm5BC=- z-AF|i#^SR5xRsaRlL6Uz>lk^(qVEOa}FI_`b{2gU?)L$dq5EI0x7!GHt}#81@o-%md_ zNBeIwcqViIRca;Yrq%|7(lVAQjA zD?j83rQo6YC+aCBnauyncK0Xhc`A3tXfX9r3JgeSo$vOPz6YOv@Q*BJuFS!wAN+kQ zzeEo(>Zx5XF&*#c!30J<9fG_1nS2yF+%NaPR9dW8;XgQ@{`^KpGYFOeFZbDry=Ayu z?r+auT*B1Udp$k?&lKd!;wcv&0kEcX650@eI4{V*P|x2^KYyT}zny;mL_Pm!K%&!C zfx92;Z$RR&)6Xx|)3|geS=;&G=Qk4JBe(chgZ}^N^s|@cd2_Ir?F&n{pJV@3tbmZ0 z;{WsX6HIpq{zl4_622xg|2IH_j=rqF#QZNng8sOMccYB{FF>NAxR1$P0#jG@e+MM~ zIQ5Wpe*qF> zjoacNotE94Y|AL_-P8aSzCsUi`F$`T!M69#=ag@M#y23EucM#z+4f=0+tOuOBPr0_}UNx~K9N+vW8FtoxXkL-_U$ zU_c^n!M~9)ZUEf}2uyht+_~eglE2$thGjJn6@fJV4i66oBz6FZ4Sr%MQhItIs%GJq zL2G~ieAo+sX(vPmJh44MZ+YF{z@s{-?ANay=?8c#x{1wLL(NCi4$-*1Q#|^gc zpl2NjN#9@Cb+i{P`MwdNcT@`d#y|yqmMTd|HyxrvpvfL1qCk+Ql6Df9Mf7>F*>dXA zvfy}AsDcGFuw9DraoCZJFCSgW38f*2?0qrQS(v=yO{K%5A&pQ=OPkkmKH}GvRbj>8 ziC9{WOa#Gwkx#VBL^2Jzs^n{Ly82$f0<)kSSou8i<`WK690goDB~r3w(@EH4SwgdE z=+}43kr)_+^4dGnFlj2Wrwyfb+odW2d^|bIFD+Od4`i8Tq;1<-J)E@7&@S^{k#rQVq(6zbrP&EYo}wuGXkFn;V9or<-{rjADIVxHi+LdD*%E z>ztUQY{g(?!>7?+`MFNsg7yyOVG4ERM`ko3HPLE|xNEetdrqdMrYzpLfHi8pc^iXe zigWt~$S#@q77d<5mPXz@oFy$cbC=a;czL60uBdZ$+j5#}d55af8GnUN`09I%AAC+S zd?J-I4(`fH=Tx&hDCGS>0&H&#YE@{PKW zOjBw5CrfTn6%7F+anW`oYkv7nlDteB9+uEY7E-~|aOHMiq34!-**zQlatufavQC1< zSJ?e>$neO~;E|=Z7t!lAOaMG~9BHIzWbF&pOr1YQJz4Agjz#;`M_FSXZuI?-cuT~D zE=B>}hLqJDg9_1XVYv)Dba1IdYGZYw5HDoDnBNT(^s%M(%e`YwxEsOXWKWy-97WuH z0W!3WuK%?$`d5;#K8wDnHj&O;>jJSM2Tp!p4F7&2RG}dc=ZVSv?oKl{x}ktt{y-*% z&N>-<&gC9GP)Uxsf?mRMmTf26g1Ki53=xyohq zNE_c=+5oY!CPe<&0RLfOK%ucNCDW1(=3sFmy0M{H{>1$K!_vZ7V`J0kiM7YW@&-y% zbHDtlefk404X1GKkN>y< zuh{$*XY4$f|M5FoOmh#l!jJIxkDIvT&3)WsKcYPzw@6T12BZ`&;?p0uX+VlCL+WD} z$!(82EHN!3CJL8n%a6M}<1J$@W0zSEk9#7htrOsjoIL!eeQCwksg$v+BL1fXrI^;4 zVukCn_fLl!tljcrdSwlQrhdkVL$%TK4S z<85oVW4E0TPiMZU?Hh24z_0kv=b?)2n>gdZKK|z)u`%u2)QWdQ@1HMH$J=+g$M42G zo-cDyJNBg%@2AqAuSyg<4%Nr+=h~jHYhpT%O%xxNmY;8$$2(44#vj%mo^QKRJI_ND zA2+kxa2kMt7s8?u9|X4UCb&DLO~1o)YUmT_xmG&JuiEbWiZ696q5G%SVofyR&1)KA9M`LM~`I@L=f6~hW1U~TGU zyAY_?><2p;d?bbDLK7?w?{AUnyr~}gUCP_e)qexW8=w~o3u^Xz>xu?r8Vc)1gQf9S#pCuY6OkK zg}J$g8@lD0W7#(mP-VdWik78YjFc?6u3JtK4ic;3V zT-o=Yqlv;6jr_V0HQ^cs85ha?BWipA{ba#eE;QPZCIT)M&BQbs0X=5&HX0``s?Rn0 zz68y)1kGmw?Or3Qh$d!B!;6R}^f1*KE-VIyHB2E6Etw_`4n1xoHFmQZ?Q!23&n#xv z#0z>b9QGiaf{4V&980uoExvHdXKTM6*kATFF0F5Dp$J*Y6q z8Si5bi^7|dVx_Ej)4WLYyfP~Nkqt0eJO53Fd2FSBs9bynZ0dTnoSp4Vo| zHc;E&+5H7f7W0c^(MYmF!Hq+wmHL7G71aYuolD6p#+3yFt1^x*L&@R6uD^5v9AkyL*z--Q6wS z-7O9Co1pHcYp=c6GoI%e?|9$w?Z03-#$w+0?>?{NI?mnCGb8m5Oq23~pgs=2S>O2b zR#W-uZzCJkv>Y~;xO-()KFfVgi(eFPD#9FJCF(BBK{~V7OU%c}EaGjPy@jL{>51r2Q|(3t?J z57CvZ^mQN&PzdHjk2a2f%Eq~SarTh0%cbxloa_cKLAip&(`#Zkkb6WE)@46-{KO(` z1S}n1Kd>KFkz+^YL{MeN+nqd z5$fI^mJWq#lYS!k&LLhVIJz?&L2UTYNVP_J4A!SiIj7h7H9GRsj5Vnqk5FN+T5{Jl z!;-imnHP0R%iYe{y|OpM(W^S@eWv<6TKZH`{ZE4*4kb4ks-wn^%>?ZazW0VZ--DjK zCT4H(Aq2cfe^!45!KKXE|7i>cX=&&+>I_%o=iy^Mb>JHBfI;(s!x#+UBau6Q_V|Dc z&S=a7UZ4>pN^E!HgUNhj+BQFb5wpfQdAz~YTr9jRMJ!1Fv+of|Kv!i zd?Jb`2Iuo9M@l1sFy5~d@;Y!H;t%*e4|xzltyy_6&FzjtD)mDc0rzC8Gej@{9X5DT z77P>!l2EV0A@+?n@80r5<}e*aoYIm zrdzprdeS2K>gBs`Q7jFsGZ%|yWB&NU1zZQs9$S<#i z@7M>2Ci@WXOUa&ZE{+rDk#U~Jw?~aRJ+9;1EQ8fsorG0;Q#*Np(b#;O{#z;cLQN0& zr&X&lJbQ(T;5>?Q+%b;6VktFlv=lHAYg&4o`ADE{XHI&*3PN>zs|lt>J+cXwG_SDw z^mJvf;c$yPxS~VfKez3TPTq(1C&GAzt^MHtm(7qqH8U2d?=p_Mn~-Rk6i!8KEvJB%fevIq?2c<5yGm`<$MU4)t^wfSE>o`XliytuN1 zrDbU8A4UNSCd>^ma6I{6psx@(29p-x-%mlAI9PsZKm)ZNb?Qzd>@>WaulrWm^_BPI zg6x_4ser-$mSvkHt`ftXeMcSJ;Ii)C{;a=U;8uPK-Hqb~H4?_T{p=zgEXXxS;~Mf;>pfl= z_S+)Xvy2nvLA=nMnA}>^V9ml3Ynm3{?J<>ycTqd<2PuKX5IfZbA=LHWqN(;Gy z$cCoJFDZ_gqf^rDp(K^(i9*p}>-$|EhfhL?AMv_d@907J!{+0mhM>r;xDoX}DSP>r zZizTpV@^mz6ic7&TTwqz4%)(=sRSy{7>dd*6ixvihPCkG2Y7XO%YjlH!={HJeJT{` zD8pzfB8|TXsE6PH_0|25>GuGYSjZM-+~K3dU*IF@U2Z6w4!NI-Gr$MN&j1zb1r4ox zN!Gyk02Koa;K7VY5GzWk4P_~$NhL@r8%z1X@MP$0mF9eR<;5|Qx4Q9Eg?=A0(f17t zYe>+|+$nax(nb}`)`9U6f@h^)no4Ei?p%3?5LvxA+M7z`&HnYD!Dy zVTXXB_;-dGaDdwS#AK(aQx{SkJbjr++?ri)>PUfUjZ2-RvoK%7q&*q(B=*7v(-}Ig>cx>l$)_(G`KkN6SLhK%0A^{y~y33 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 Gef^(jd;#YG diff --git a/docs/images_home/factorial.gif b/docs/images_home/factorial.gif deleted file mode 100644 index 5904e1a162f5eeec9f6221a3475dd037fab93b6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 123961 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%0As?BLja7? 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
  • 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≪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°PDcY5a|&Zxh8T%(30kSPsiHYYVDBBeA-IUoCEaFd4&#UGzppM~(Pk5=(uA#6p7Y~0~; z-!Y+rRJb^lBu|vCgaiv6X%URzuOb&2NeD?K%4zzu6Q(qfRH|o}Y=UB&1g+pxqEeKE zhO>y||D?no>c$!xdL)H<0g)monJcbv6muFqk5?}AJi5g4pD6W5HH+v_R4(L{hT&wh|^1i@uuw~n(I!5iwRxmROC@4NxFDG9mb|qyiBQ7S+P<;`o=ED zA&zlY`G+WqB2kS|Boyb+ z3nay8MjC`5js}-N*7m3dN~B7VxGFp;LXfmCI;}y0(JobzENw7$`km2q`kEXYKnw1)F!OxhVV9O zN|2IN;M$@pO9VG39vD?0h-uePxeXIY#cnhAyUb(~xKnlWu7W>7LOC_~6A?8_*`_GY zn>_dz!J2R`GCU6sFZjdq(xTNg4B`@-I3C8$MENRw;ugF3#W0SsjAu;a8r%5BIL@(- zcg*7+`}oH|4ziGkOynXP`N&94vXYm~L{Y~gX z8~V_QPPC#I&FDru`q7Y%w4^6Z=}KGr(wK%Aur|%`qigswX0!GYf;FW)3weuC~m!JUHh67ye9Rphkc1)dzjeBmPN3Wed!L!_bJO} zHl_P(>u5`x(u9LHudhAr32e=no-j7Ir#-gOX+qrNu5zRL=hHVodYtHlYs&gODCS!b_o*B0XyYK5wj|wm23jKQM@T$CsLyr$lUOnyIhrWW{v%(%7 zNEhgZ{xr@oJb)^=ePx9M)Gg4S$)*hM{B6<8&gs=3h4SQtPPm2t!fB$&Tk+~<% zo%47j^!|v7(+mMQHHp*~g}*!}WsbNv*hK~^-j6>qUrl}IsxwyE5;~KWdR^DA&aDE?AOZN7`x*}OP_nJ;gqHj-FIGU58sN+dcN>2o0NFB?eDwKpD-?Z{VDYN zhVA^eMf*};vY*Sz5KYi55Cg`7Lb6AYF9SoB8UsT^3j@P1pisjL28L1t28LG&3=CE? z7#PG0=Ijcz0ZJ?i@Ck7R(wihK_DO*R;9!e{#W7ijnPP@B#0+MM8E#3jKPu~RQqJk5 zoa16~lj&jx8xw7h%QD@9mdk&wLkyDV8Q`jYKeNNtG?Uvn#W$lm1*zc9G z-6vz~DXrE&b@qg*bN>JT@7NK%tqQE{-7*mrKtb7dm9X z!xC`udY5og)mF}{Uw-|+-!>;j!eWEDZDyH^i|8+25sP1JXQMRygfz02|7=ZDZs99W zWLj{1;wxje9!2gDM$wH7j|7=6R5YzTz;oeq)V-{`Op)6}48C62xGB5+Y?=6iiPM$7 z-q_vD?6dg~uSHcls~_teMP|Jn_ujEq>}X%p>ihHGwWK9AOa zpd(dFTq8?MnfuWU=g|-2ZVbEC+wE#s!ZhlH; zS|x4`KXf0-05zzAYyf6dtK|HG%A(Blj1mUFd<8g1N1?PhRUxe?H8rPl`K%93Kpl!O z9Vw~B$wiq3C7Jno48=k2P70o`&Sr*|W@frZdWPX^Z@B{%E5Q`!CgzoA&B{c_AS!>EaPy!9F3W+EQN-S3>D9TUE%t=)!sVqoU0J;QN+*HhY z{E3I7Fib<^l>g~7o=<}qn3cKplDUPIg}o<>FbgZVG?*MtVOHK8qHy}gl@mwK9FaM~ ge!9V9ftMb`D{;Y+Pfn&&fmSehy85}Sb4q9e03tHm4gdfE diff --git a/docs/images_home/favicon-32x32.png b/docs/images_home/favicon-32x32.png deleted file mode 100644 index 19a83b05790258a6fb0ca288c89c47fb10ab6718..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2186 zcmZ`*2~d+s7XCxP#30HMa{f60xh8-~FhBxHID!ySISdd+R6+=H6G;#S2Q!Ec3aE%6 zWWyndAj&1@a2p~hDB_C8j*2=ecp|zxtBm8YKU+0ZwKcU}-S2h3`o4azyI*zpk)SPp zMkoRb001MQzaRwC)a8bRLsD?|=qLcd6!AVjLGe;40N53!7u}=@g3)9A6^pDIu~@u` z5Vk=&ts9Nj1&IrSvy*4~7wcwk^v`6SOe$%r(T%nk9Dr?;HKB`6)?GYebXze~pcc+P zoa9!08Th1`=VBvo6*QK!vZpSUnymc6L-9|;%3kd2`07Hh73e$D^|7NhqK=zcjhel0 z6bYfcPc5t~X6I0$zi3AqQ^eY5+TshP^9#r1ed@5EwY#(fha-bNPu`OHW~aM_K2QCj zFfK+vvPoMh!jFxMHxt#Z{a{OJMDT(4&-!&0S0^X^-;v9-C3w>J}Xdzq+hJB{@hQqA-r2}6QY!G@^Ue6m(^B(*= z%XK>0Cwro6=vb2bfmL?`<>ihq=2lA47UGPpE1^9@IZ>=1_OBg8)aCpdHm}b$-$5RD-qF*0!Mrpr_Y{D?L|YVe}B(uaUj3lD%5-ZdF)kHI~su;9T%#S7V)r zL0&nAJ_vHh$=4%NAv!+JT13F${(`gb;R)Nwy`xB<^`PV zd7Mk9AGZ$2I{Phq5agZ3t#81&=t!OyH*uQqZZ+8TjoUdL1kO=3ZJ5X#2D$B0em#zL zNy^+&CaUV1h!hI~NWtNVmqA`Xk=q*0-Gj6pA@TPh?S$smI3l^R zwTDQy=pGzpakzMpVvi#?<6U(mzM8-QDVF`(@y@=HBqQ7K6{H$xRu9p=$9_YfcAP-A z$UxfJ5G`9HJp2tw-2z?;!um&|M;o5KmPk2=Wld59Hz|TFl)VyZTS0akByz8i_!DIB z=8pbMq}@&gbpYg!P`u~_i&6|d9ckN5;9M3Z58DeXOr6`X>~hexp}DhvTUr6yA=i+m z1^LHIG|hPT9SG{F!jeb?rR-qgrJkXt_P(X1rBs<_IZ>RHAzQXWT7-{=ujaOQ;l3gf zc+~d`t6;`kjZE|ljXO;iU$mQ6Q?N#Qlh&lmMsM{drn>e(3|Mr4pWsIFRPA!ou9W*n zC;-6FY`MVzwFU_E_r?->clHJvaTe3!OA!Wx9K`6n0BhNvPfTITudDSO;IMYgnO{4 z#%v4oEjOklF!f5lZ`j(6(G0y+h&oYQ()jw}Jdk5r-MboBclV`!UXS9kuB?qvV1<6B z5RK+c1_HI|6&87x1hLs2bxfuw{|%eEI_DZH0%nlLrTcQrvkJ~HcxAL{QJWNr^&@In zDNx2Xl;}%tgee+WV>z{+Z){cNhdcxl8SR8Hy~%LaCIuBkep0oDmJWAAL7Vmj=6>M}MSdci(%Drk-fOVpoBT;!ySFMgs0wZe$5FP!g+58C8O+V5+v zAES~U4Emg@==-SG=Ow-!8;@E)Mn=y+3SYaJ{Y2%!i=%M%pM7pO&FzYNb<9}gJ0_2; zoKj&Q*an_?(xE=snea~KPjuTo>kt)?J-`2ak1D?rp7`cFlXurU8l64{*yrc=Y&;)p`-_0G~`w#v$nVE(7;@IMo#~VFg|NF=eT}>g&?ejNe;68<36+oH#Xm z+5}27Yo)JP86#23IMOs3qyQ$J$#kT9bKpQtSIDTbX);;TzIydS4#cqdgApTB zNYmow%J|e2KoR2SO%?k3xG>l*E{;qmMtIXteh}F54{)+1B|TOmRi>xO(*BB0)Swq3 zH1SV#YK$!DudqWgzc1hS;h7?_GDMO=m8Ye~#wW?B%6)Pf6^aD<3+&ZA`?w0ZJIu~* zJaFQ=@I?p!w=#5+8k$*|1r(#kS{{YVVls$E2#xIcYWcU=eS5ECl@>WxmoYpjX# Tqc^Jrasdc^w+NcOqjLTOVn;=v diff --git a/docs/images_home/safari-pinned-tab.svg b/docs/images_home/safari-pinned-tab.svg deleted file mode 100644 index fc524c9..0000000 --- a/docs/images_home/safari-pinned-tab.svg +++ /dev/null @@ -1,49 +0,0 @@ - - - - -Created by potrace 1.14, written by Peter Selinger 2001-2017 - - - - - - - - diff --git a/docs/images_home/site.webmanifest b/docs/images_home/site.webmanifest deleted file mode 100644 index a1553eb..0000000 --- a/docs/images_home/site.webmanifest +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "", - "short_name": "", - "icons": [ - { - "src": "/android-chrome-192x192.png", - "sizes": "192x192", - "type": "image/png" - }, - { - "src": "/android-chrome-384x384.png", - "sizes": "384x384", - "type": "image/png" - } - ], - "theme_color": "#ffffff", - "background_color": "#ffffff", - "display": "standalone" -} diff --git a/docs/index.html b/docs/index.html deleted file mode 100644 index 7ae03ab..0000000 --- a/docs/index.html +++ /dev/null @@ -1,415 +0,0 @@ - - - - - Yaksha Programming Language - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - -
    -
    -

    - A - manual - memory managed, -

    -

    compiled to C99,

    -

    - programming language with off-side rule - syntax -

    -
    - Yaksha language gif -
    - - - -
    - - - -
    -

    SAMPLE PROGRAMS

    -

    ALL FURY, NO FUSS

    - -
    - -
    - - - - - - -
    - - -
    -

    A randomly generated tree moving in the wind.

    - Yaksha language gif -
    - -
    -
    - Click to see code sample -
    - import raylib as rl
    - import raylib.utils
    - import libs.numbers as num
    - import libs.perlin
    - import libs.random
    -
    -
    - class State:
    -     width: float
    -     height: float
    -     angle: float
    -     frame_count: u64
    -     blue: rl.Color
    -     green: rl.Color
    -     color3: rl.Color
    -
    -
    - def branch(x: float, y: float, length: float, angle: float, s: State) -> None:
    -     if length < 4.0f:
    -         leaf_width = random.random_betweenf(1.0f, 3.0f)
    -         leaf_height = random.random_betweenf(3.0f, 6.0f)
    -         lerped_green = utils.lerp_color(s.green, s.blue, utils.remap(x, 0.0f, s.width, 0.0f, 1.0f) * 2.0f)
    -         color = utils.lerp_color(lerped_green, s.color3, utils.remap(y, 0.0f, s.height, 0.0f, 1.0f) * 1.5f)
    -         rl.draw_ellipse(num.f2i(x), num.f2i(y), leaf_height, leaf_width, color)
    -         return
    -     wind = utils.sin_deg(perlin.noise1df(num.uu2f(s.frame_count) / 50.0f)) * 100.0f * utils.sin_deg(num.uu2f(s.frame_count) / 2.0f)
    -     next_y = y - length * utils.cos_deg(angle)
    -     next_x = x + length * utils.sin_deg(angle)
    -     thick = utils.remap(length, 0.0f, s.height / 4.0f, 2.0f, 6.0f)
    -     rl.draw_line_ex(rl.vector2(x, y), rl.vector2(next_x, next_y), thick, rl.color(152, 50, 1, 255))
    -     r1 = random.random_betweenf(0.3f, 0.9f)
    -     r2 = random.random_betweenf(0.5f, 0.8f)
    -     branch(next_x, next_y, (length * r2), angle + s.angle + wind * 10.0f, s)
    -     branch(next_x, next_y, (length * r1), angle - s.angle + wind * 10.0f, s)
    -
    -
    - def update_draw_frame(s: State) -> None:
    -     rl.clear_background(rl.color(255, 255, 255, 255))
    -     branch(s.width / 2.0f, s.height, s.height / 4.0f, 0.0f, s)
    -
    -
    - def main() -> int:
    -     s: State = State()
    -     s.angle = random.random_betweenf(30.0f, 45.0f)
    -     s.width = 600.0f
    -     s.height = 600.0f
    -     s.frame_count = 0u64
    -     s.blue = rl.color(0, 255, 214, 255)
    -     s.green = rl.color(0, 255, 0, 255)
    -     s.color3 = rl.color(255, 45, 156, 255)
    -     rl.init_window(num.f2i(s.width), num.f2i(s.height), "Fractal Tree in the Wind")
    -     rl.set_target_fps(120)
    -     seed: u64 = random.init_random()
    -     while not rl.window_should_close():
    -         rl.begin_drawing()
    -         update_draw_frame(s)
    -         rl.draw_fps(0, 0)
    -         rl.end_drawing()
    -         s.frame_count += 1u64
    -         random.set_seed(seed)
    -     rl.close_window()
    -     del s
    -     return 0
    - - -
    -
    - -
    -

    An inefficient factorial calculation using recursion

    - Recursion code output image -
    - -
    -
    - Click to see code sample -
    - import libs.console
    -
    -
    - def factorial(x: int) -> int:
    -     if x <= 0:
    -         return 1
    -     return x * factorial(x - 1)
    -
    -
    - def main() -> int:
    -     a = 0
    -     while a < 10:
    -         console.cyan( "factorial")
    -         console.red( "(")
    -         print(a)
    -         console.red( ") = ")
    -         println(factorial(a))
    -         a = a + 1
    -     return 0
    - -
    -
    - -
    -

    A 2-in-1 counter as a web application (WASM)

    - Counter web application gif -
    - -
    -
    - Click to see code sample -
    - import raylib as rl
    - import raylib.utils
    - import raylib.gui
    - import libs.numbers as num
    -
    - def main() -> int:
    -     width = 200
    -     height = 160
    -     counter1 = 0
    -     counter2 = 0
    -     rl.init_window(width, height, "Counter")
    -     rl.set_target_fps(120)
    -     while not rl.window_should_close():
    -         rl.begin_drawing()
    -         rl.clear_background(rl.color(255, 255, 255, 255))
    -         gui.gui_panel(rl.rectangle(10.0f, 10.0f, num.i2f(width) - 20.0f, num.i2f(height) - 20.0f), "<Counter>")
    -         widget_width = num.i2f(width) - 40.0f
    -         #  Counter 1
    -         gui.gui_label(rl.rectangle(20.0f, 40.0f, widget_width, 20.0f), "Count:"+ num.i2s(counter1))
    -         if gui.gui_button(rl.rectangle(20.0f, 60.0f, widget_width, 20.0f), "Count"):
    -             counter1 = counter1 + 1
    -         #  Counter 2
    -         gui.gui_label(rl.rectangle(20.0f, 80.0f, widget_width, 20.0f), "Count:"+ num.i2s(counter2))
    -         if gui.gui_button(rl.rectangle(20.0f, 100.0f, widget_width, 20.0f), "Count"):
    -             counter2 = counter2 + 1
    -         #  Asciimoji status bar
    -         animation = (counter1 + counter2) % 3
    -         if animation == 1:
    -             gui.gui_status_bar(rl.rectangle(10.0f, num.i2f(height) - 30.0f, num.i2f(width) - 20.0f, 20.0f), " \\\\- (- _ -) -/")
    -         else:
    -             gui.gui_status_bar(rl.rectangle(10.0f, num.i2f(height) - 30.0f, num.i2f(width) - 20.0f, 20.0f), " \\\\- (o _ o) -/")
    -         rl.draw_fps(20, 540)
    -         rl.end_drawing()
    -     rl.close_window()
    -     return 0
    - - -
    -
    -
    -
    - - - -
    -

    PHILOSOPHY

    -

    SIMPLE. STRICT. SPEEDY.

    -
    - Yaksha language gif -
    -

    Language syntax is minimalistic and has similarities to Python.

    -

    Manual memory management is required.

    -

    New developers should be able to pick up the full syntax in a few hours.

    -
    -
    -
    - - - -
    -

    END USERS

    -

    A VERSATILE NEW TOOL

    -
    -
    -

    Yaksha aims to be a simple general purpose language with a minimalistic standard library.

    -

    One goal is to have easy access to GPU/parallel programming (this has not yet begun, and hopefully we can get there) using OpenCL.

    -

    There will be first class support for Windows.

    -

    At the moment, the author plans on using the language (once it reaches a usable level) in personal - projects.

    -
    - Yaksha language gif -
    -
    - - - - - - - diff --git a/docs/library-docs.html b/docs/library-docs.html deleted file mode 100644 index 796831d..0000000 --- a/docs/library-docs.html +++ /dev/null @@ -1,3625 +0,0 @@ -Yaksha Programming Language

    1 Core Library

    Created 2022-08-09, Last Updated 2023-03-19

    Core library can be accessed by importing libs.

    This import name is subject to change.

    1.1 libs

    def version() -> str
    -# This returns standard library version
    -# (Note: this is hardcoded)
    -

    1.2 libs.argparse

    ARGPARSE_DEFAULT: Const[int]
    -# Default behaviour of argparse
    -ARGPARSE_IGNORE_UNKNOWN_ARGS: Const[int]
    -# Ignore unknown arguments
    -ARGPARSE_STOP_AT_NON_AND_IGNORE_UNKNWON: Const[int]
    -# Do both stopping at unknown options and ignoring unknown arguments
    -ARGPARSE_STOP_AT_NON_OPTION: Const[int]
    -# Stop at non option
    -class ArgParse
    -# Arg parse state object
    -class ArgParseRemainder
    -# Remaining arguments after parsing given arguments:
    -    argc: int
    -    remainder: Array[str]
    -class ArgParseWrapper
    -# Argument parser wrapper:
    -    state: ArgParse
    -class Option
    -# An argparse option
    -# These objects are deleted when del_argparse() is called
    -# However, Array[Option] is not
    -def del_argparse(object: ArgParseWrapper) -> None
    -# Delete arg parser
    -def del_remainder(a: ArgParseRemainder) -> None
    -# Delete given argparse remainder object
    -def new(options: Array[Option], usages: Array[str]) -> ArgParseWrapper
    -# Initialize a new argument parser
    -# Note: options array last element must be opt_end()
    -def new_ex(options: Array[Option], usages: Array[str], flag: int) -> ArgParseWrapper
    -# Initialize a new argument parser (with flags)
    -# Note: options array last element must be opt_end()
    -def opt_boolean(short: str, large: str, result: Ptr[int], help: str) -> Option
    -# create a boolean option
    -def opt_end() -> Option
    -# End of options
    -def opt_float(short: str, large: str, result: Ptr[f32], help: str) -> Option
    -# create a float option
    -def opt_group(name: str) -> Option
    -# Create a command group here
    -def opt_help() -> Option
    -# Help option
    -def opt_integer(short: str, large: str, result: Ptr[int], help: str) -> Option
    -# create an integer option
    -def opt_string(short: str, large: str, result: Ptr[libs.c.CStr], help: str) -> Option
    -# create a boolean option
    -def parse(argp: ArgParse, arguments: Array[str]) -> ArgParseRemainder
    -# Parse given arguments with given argparser object
    -# Any remaining values are returned
    -# You need to delete the remainder with del_argparse_remainder()
    -def set_description(argp: ArgParse, description: str, epilog: str) -> None
    -# Set description for help message
    -def usage(argp: ArgParse) -> None
    -# Disaplay usage
    -

    1.3 libs.c

    class CBool
    -class CChar
    -class CDouble
    -class CFloat
    -class CInt
    -class CLong
    -class CShort
    -class CStr
    -# A char* string
    -class CUChar
    -class CUInt
    -class CULong
    -class CUShort
    -class Size
    -# size_t in C code
    -class VoidPtr
    -# Any pointer type
    -# void* in C
    -def acos(x: CDouble) -> CDouble
    -def asin(x: CDouble) -> CDouble
    -def atan(x: CDouble) -> CDouble
    -def atan2(x: CDouble, y: CDouble) -> CDouble
    -def calloc(n: Size, size: Size) -> VoidPtr
    -def ceil(x: CDouble) -> CDouble
    -def cos(x: CDouble) -> CDouble
    -def cosh(x: CDouble) -> CDouble
    -def fabs(x: CDouble) -> CDouble
    -def floor(x: CDouble) -> CDouble
    -def fmod(x: CDouble, y: CDouble) -> CDouble
    -def free(ptr: VoidPtr) -> None
    -def has_command_processor() -> bool
    -# Can we run system commands?
    -def itosize(i: int) -> Size
    -def log(x: CDouble) -> CDouble
    -def log10(x: CDouble) -> CDouble
    -def log2(x: CDouble) -> CDouble
    -def malloc(size: Size) -> VoidPtr
    -def memcmp(str1: VoidPtr, str2: VoidPtr, size: Size) -> CInt
    -def memcpy(dest: VoidPtr, src: VoidPtr, size: Size) -> VoidPtr
    -def memmove(dest: VoidPtr, src: VoidPtr, size: Size) -> VoidPtr
    -def memset(dest: VoidPtr, character: CInt, size: Size) -> VoidPtr
    -def pow(x: CDouble, y: CDouble) -> CDouble
    -def realloc(ptr: VoidPtr, size: Size) -> VoidPtr
    -def sin(x: CDouble) -> CDouble
    -def sinh(x: CDouble) -> CDouble
    -def sqrt(x: CDouble) -> CDouble
    -def system(program: CStr) -> None
    -# Run a system command without caring what it will do
    -# Wait for exit
    -def tan(x: CDouble) -> CDouble
    -def tanh(x: CDouble) -> CDouble
    -

    1.4 libs.console

    BLUE: Const[int]
    -# Apply blue foreground color
    -CYAN: Const[int]
    -# Apply cyan foreground color
    -GREEN: Const[int]
    -# Apply green foreground color
    -PURPLE: Const[int]
    -# Apply purple foreground color
    -RED: Const[int]
    -# Apply red foreground color
    -REWIND: Const[int]
    -# Use rewind with set_color to stop applying any color
    -WHITE: Const[int]
    -# Apply white foreground color
    -YELLOW: Const[int]
    -# Apply yellow foreground color
    -def blue(x: str) -> None
    -# Print text in console, in blue color
    -def clear() -> None
    -# Clear console
    -def color_print(color: int, x: str) -> None
    -# Print in given color and then rewind
    -def cyan(x: str) -> None
    -# Print text in console, in cyan color
    -def getch() -> int
    -# Get a single character / key press
    -# Can be used as a pause
    -def green(x: str) -> None
    -# Print text in console, in green color
    -def purple(x: str) -> None
    -# Print text in console, in purple color
    -def red(x: str) -> None
    -# Print text in console, in red color
    -def set_color(c: int) -> None
    -# Set given color
    -def white(x: str) -> None
    -# Print text in console, in white color
    -def yellow(x: str) -> None
    -# Print text in console, in yellow color
    -

    1.5 libs.fileformats.ini

    class Ini
    -# INI Object
    -def del_ini(object: Ini) -> None
    -# Delete INI object
    -def from_str(ini_data: str) -> Ini
    -# Parse INI file from given string data
    -def get(object: Ini, section: str, property: str) -> str
    -# Get a property in given section
    -# Empty string is returned if we cannot find the section
    -

    1.6 libs.fileformats.toml

    class Table
    -# TOML Table object
    -# This is like a dictionary
    -class TomlArray
    -# Array of any type
    -def array_len(x: TomlArray) -> int
    -# Get length of array
    -def bool_at(x: TomlArray, pos: int) -> bool
    -# Get bool from array at location or false
    -def bool_at_default(x: TomlArray, pos: int, default: bool) -> bool
    -# Get bool from array at location or given default
    -def del_table(x: Table) -> None
    -# Delete a table. Note that you do not need to delete child tables
    -def from_str(x: str) -> Table
    -# Parse to a TOML Table from given string
    -def get_array(x: Table, name: str) -> TomlArray
    -# Get any array from table object
    -def get_bool(x: Table, name: str) -> bool
    -# Get a bool from table or false if fails
    -def get_bool_default(x: Table, name: str, default: bool) -> bool
    -# Get a bool from table or given default
    -def get_int(x: Table, name: str) -> int
    -# Get an int from table or 0 if fails
    -def get_int_default(x: Table, name: str, default: int) -> int
    -# Get an int from table or given default
    -def get_string(x: Table, name: str) -> str
    -# Get a string from table or empty if fails
    -def get_string_array(x: Table, name: str) -> Array[str]
    -# Get an array as native string array
    -def get_string_default(x: Table, name: str, default: str) -> str
    -# Get a string from table or given default
    -def get_table(x: Table, name: str) -> Table
    -# Get a Table from given name
    -def int_at(x: TomlArray, pos: int) -> int
    -# Get int from array at location or 0
    -def int_at_default(x: TomlArray, pos: int, default: int) -> int
    -# Get int from array at locaiton or given default
    -def string_at(x: TomlArray, pos: int) -> str
    -# Get string from array at location or empty
    -def string_at_default(x: TomlArray, pos: int, default: str) -> str
    -# Get string from array at location or given default
    -def valid_array(x: TomlArray) -> bool
    -# Is this a valid array?
    -def valid_table(x: Table) -> bool
    -# Is this a valid table?
    -

    1.7 libs.io

    def readfile(fname: str) -> str
    -# Read a file to as string, on error returns empty
    -def writefile(fname: str, data: str) -> bool
    -# Write a file
    -

    1.8 libs.numbers

    def cdbl2d(a: libs.c.CDouble) -> f64
    -# c.CDouble to f64 (double precision)
    -def cstr2i(a: libs.c.CStr) -> int
    -# Convert a c-string to an integer
    -def d2cdbl(a: f64) -> libs.c.CDouble
    -# f64 (double precision) to c.CDouble
    -def d2f(a: f64) -> float
    -# f64 (double precision) to float/f32 (single precision)
    -# Warning: precision might be lost/truncated
    -def d2i(a: f64) -> int
    -# f64 (double precision) to int/i32
    -# Warning: value is truncated
    -def d2uu(a: f64) -> u64
    -def f2d(a: float) -> f64
    -# float/f32 (single precision) to f64 (double precision)
    -def f2i(a: float) -> int
    -# f32 (single precision) to int/i32
    -# Warning: value is truncated
    -def f2uu(a: float) -> u64
    -def i2d(a: int) -> f64
    -# int/i32 to f64 (double precision)
    -def i2f(a: int) -> float
    -# int/i32 to f32 (single precision)
    -def i2s(a: int) -> str
    -def i2u(a: int) -> u32
    -def i2uu(a: int) -> u64
    -def s2i(s: str) -> int
    -# Convert a str to integer
    -def u2i(a: u32) -> int
    -def uu2d(a: u64) -> f64
    -def uu2f(a: u64) -> float
    -def uu2i(a: u64) -> int
    -

    1.9 libs.os

    class Arguments
    -# UTF-8 converted arguments and argument count
    -# Do not delete, Do not modify:
    -    argc: int
    -    argv: Array[str]
    -class ProcessResult
    -# Results of run() execution
    -# Must be deleted:
    -    ok: bool
    -    output: str
    -    return_code: int
    -def cwd() -> str
    -# Get current working directory, or empty string (if failed) on return
    -def del_process_result(pr: ProcessResult) -> None
    -# Delete process result object
    -def exe() -> str
    -# Get exe file path, or empty string (if failed) on return
    -def exe_path() -> str
    -# Get exe directory path, or empty string (if failed) on return
    -def get_args() -> Arguments
    -# Get arguments
    -def getenv(name: str) -> str
    -# Get environment variable, empty if not found or error
    -def is_macos() -> bool
    -# Are we running MacOS?
    -def is_windows() -> bool
    -# Are we running Windows?
    -def run(args: Array[str]) -> ProcessResult
    -# Run give [process, arg1, arg2] command line
    -def which(binary: str) -> str
    -# Try to find full path to binary in $PATH, no need .exe for windows
    -# If we cannot find in $PATH, This will fallback to current path and exe path as well
    -#
    -# Example find zig compiler path:
    -#
    -# os.which("zig")
    -

    1.10 libs.os.cpu

    class Cpu
    -# Extracted CPU information:
    -    n_processors: int
    -    n_processors_max: int
    -    is_guess: bool
    -def info() -> Cpu
    -# Extract CPU information
    -

    1.11 libs.os.path

    def basename(p: str) -> str
    -# Get just the filename of given path
    -def dirname(p: str) -> str
    -# Get dir name of given path
    -def end_with_dot(a: str) -> bool
    -# Does the given string end with slash?
    -def end_with_slash(a: str) -> bool
    -# Does the given string end with slash?
    -def executable(p: str) -> bool
    -# Is an executable?
    -def exists(p: str) -> bool
    -# Does the file exist?
    -def forward_slash() -> bool
    -# Are we using forward slash or not?
    -# Same as using libs.os.is_windows()
    -def join(a: str, b: str) -> str
    -# Do a path join
    -def mkdir(p: str) -> bool
    -# Create given folder. (Linux uses 0755 permissions)
    -# Returns True if successful
    -def readable(p: str) -> bool
    -# Is a readable?
    -def remove_extension(p: str) -> str
    -# Remove extension
    -def writable(p: str) -> bool
    -# Is a writable?
    -

    1.12 libs.perlin

    def noise1d(x: f64) -> f64
    -# Get perlin noise in 1d (Calls 3d noise with hardcoded y, z values)
    -def noise1df(x: float) -> float
    -def noise2d(x: f64, y: f64) -> f64
    -# Get perlin noise in 2d
    -def noise2df(x: float, y: float) -> float
    -# Get perlin noise in 2d
    -def noise3d(x: f64, y: f64, z: f64) -> f64
    -# Get perlin noise in 3d
    -def noise3df(x: float, y: float, z: float) -> float
    -# Get perlin noise in 3d
    -

    1.13 libs.random

    def init_random() -> u64
    -# Set a seed to random number generator using time (crypto unsafe)
    -def random() -> f64
    -# Get a random value between 0 - 1 (crypto unsafe)
    -def random_between(a: f64, b: f64) -> f64
    -# Get a random value between a and b (crypto unsafe)
    -def random_betweenf(a: float, b: float) -> float
    -# Get a random value between a and b (crypto unsafe)
    -def random_u64() -> u64
    -# Random unsigned 64bit
    -# Uses rand() (crypto unsafe)
    -def randomf() -> float
    -# Get a random value between 0 - 1 (crypto unsafe)
    -def set_seed(seed: u64) -> None
    -# Set a seed to random number generator (crypto unsafe)
    -

    1.14 libs.strings

    def contains(haystack: str, needle: str) -> bool
    -# Does the string needle contain in string haystack?
    -def cut_from(a: str, position: int) -> str
    -# Cut a string from given position
    -def del_cstr(a: libs.c.CStr) -> None
    -# Delete a native c-string created from other other functions (calls free)
    -def del_str(a: libs.c.CStr) -> None
    -# Delete a normal string that was cast as a c-str with to_cstr
    -# You only need to use this if CStr was cast from standard str
    -def endswith(a: str, b: str) -> bool
    -# Does string a ends with string b
    -def find_char(value: str, ch: int) -> int
    -# Find first occurance of given character
    -def from_cstr(a: libs.c.CStr) -> str
    -# Create a string from CStr
    -def from_cstrlen(a: libs.c.CStr, length: int) -> str
    -# Create a string from CStr with a given length
    -def from_cstrlen_after(a: libs.c.CStr, length: int, after: int) -> str
    -# Create a new string from CStr from given after location for given length
    -def get(s: str, pos: int) -> int
    -# Get a single byte from given string and position
    -# Warning: Does not do a length check
    -# Warning: This copies the string to just get a single byte
    -def get_cstr(s: libs.c.CStr, pos: int) -> int
    -# Get a single byte from given CStr
    -# Warning: Does not do a length check
    -def isempty(s: str) -> bool
    -# Is this string empty?
    -def isempty_cstr(s: libs.c.CStr) -> bool
    -# Is an empty CStr?
    -def lpad(a: str, count: int) -> str
    -# Pad string to left to ensure string length is large or equal to count
    -def mid(a: str, position: int, number: int) -> str
    -# Cut a string from given position for number characters
    -# Returns empty() if input is invalid
    -def null_cstr() -> libs.c.CStr
    -def ord(s: str) -> int
    -# Get first byte of string
    -def ord_cstr(s: libs.c.CStr) -> int
    -# Get first byte of CStr
    -def rpad(a: str, count: int) -> str
    -# Pad string to right to ensure string length is large or equal to count
    -def set_cstr(s: libs.c.CStr, pos: int, v: int) -> None
    -# Set a byte to given CStr position
    -# Warning: Does not do a length check
    -def spaces(count: int) -> str
    -# Get a spaces only string of given count
    -def split(value: str, sep: str) -> Array[str]
    -# Split a string to a string array
    -def startswith(a: str, b: str) -> bool
    -# Does the given string a starts with b
    -def to_cstr(a: str) -> libs.c.CStr
    -# Yaksha copies managed strings that you pass in so must free this
    -def valid_cstr(s: libs.c.CStr) -> bool
    -# Is a valid CStr
    -

    1.15 libs.strings.array

    def del_str_array(sa: Array[str]) -> None
    -# Delete a string array by deleting individual string objects and array itself
    -def dup(sa: Array[str]) -> Array[str]
    -# Duplicate given array to a new array
    -# Both new array and string copies are created
    -def extend(a: Array[str], b: Array[str]) -> Array[str]
    -# Copy all strings from b to a and return a
    -# Warning! You must assign this back to a (as 'a' might be reallocated to a new address)
    -def join(values: Array[str], sep: str) -> str
    -# Join given string array with given separator and return a single string
    -def new(count: int, s: str) -> Array[str]
    -# Create new string array
    -# Example:
    -#
    -# import libs.strings.array as sarr
    -# my_array: Array[str] = sarr.new(4, "A", "B", "C", "D")
    -def prefix(sa: Array[str], prefix_str: str) -> Array[str]
    -# Mutate all strings in this array by prefixing with prefix_str
    -def suffix(sa: Array[str], suffix_str: str) -> Array[str]
    -# Mutate all strings in this array by suffixing with suffix_str
    -

    1.16 libs.strings.buffer

    class StringBuffer
    -# String buffer object
    -def append(buf: StringBuffer, v: str) -> None
    -# Append a string to string buffer
    -def del_buf(buf: StringBuffer) -> None
    -# Delete string buffer object
    -def join(buf: StringBuffer, values: Array[str], sep: str) -> None
    -# Join given values in array with provided seperator and append this to string
    -def new() -> StringBuffer
    -# Create a new empty string buffer
    -def new_size(s: int) -> StringBuffer
    -# Create a string buffer with capacity s
    -def prepend(buf: StringBuffer, v: str) -> None
    -# Prepend a string to string buffer
    -def to_str(buf: StringBuffer) -> str
    -# Get a new string out of string buffer
    -

    1.17 libs.strings.utf8

    class Utf8IterateState
    -# Iterator state for UTF-8 iteration
    -# See the codepoint for current character:
    -    step_size: int
    -    codepoint: int
    -def del_iter(s: Utf8IterateState) -> None
    -# Delete the iterator object after done
    -def iterate(s: Utf8IterateState) -> bool
    -# Go to next character
    -# Returns false if nothing to read or we ran out of length of string
    -def new_iter(s: str) -> Utf8IterateState
    -# Create a new iterator from given string
    -

    1.18 libs.thread

    BUSY: Const[int]
    -# The requested operation failed because a tesource requested by a test and return function is already in use
    -ERROR: Const[int]
    -# The requested operation failed
    -NOMEM: Const[int]
    -# The requested operation failed because it was unable to allocate memory
    -SLEEP_SUCCES: Const[int]
    -# Sleep is successful
    -SUCCESS: Const[int]
    -# The requested operation succeeded
    -TIMEOUT: Const[int]
    -# The time specified in the call was reached without acquiring the requested resource
    -class Thread
    -# Thread Object
    -def create(thr: Ptr[Thread], func: Function[In[AnyPtr], Out[int]]) -> int
    -# Create a thread with None data. Otherwise same as create_with_data()
    -def create_with_data(thr: Ptr[Thread], func: Function[In[AnyPtr], Out[int]], data: AnyPtr) -> int
    -# Create a new thread with given reference to Thread and a function that takes AnyPtr and return int
    -def current() -> Thread
    -# Get current thread object
    -def detach(thr: Thread) -> int
    -def equal(thr1: Thread, thr2: Thread) -> int
    -# Are these two equal?
    -def exit(res: int) -> None
    -# Exit current thread giving result value
    -def join(thr: Thread) -> int
    -def join_with_result(thr: Thread, res: Ptr[int]) -> int
    -def sleep(seconds: int) -> int
    -# Sleep for given seconds
    -# SLEEP_SUCCES is returned if successful
    -def sleep_ex(duration: Ptr[libs.timespec.TimeSpec], remainder: Ptr[libs.timespec.TimeSpec]) -> int
    -# remainder - this parameter will hold the remaining time until time_point upon return
    -# SLEEP_SUCCES is returned if successful
    -def yield() -> None
    -

    1.19 libs.thread.condition

    class Condition
    -# Condition Object
    -def broadcast(cnd: Ptr[Condition]) -> int
    -def destroy(cnd: Ptr[Condition]) -> None
    -def init(cnd: Ptr[Condition]) -> int
    -def signal(cnd: Ptr[Condition]) -> int
    -def timed_wait(cnd: Ptr[Condition], mtx: Ptr[libs.thread.mutex.Mutex], ts: Ptr[libs.timespec.TimeSpec]) -> int
    -def wait(cnd: Ptr[Condition], mtx: Ptr[libs.thread.mutex.Mutex]) -> int
    -

    1.20 libs.thread.mutex

    PLAIN: Const[int]
    -RECURSIVE: Const[int]
    -TIMED: Const[int]
    -class Mutex
    -# Mutex Object
    -def destroy(mtx: Ptr[Mutex]) -> None
    -def init(mtx: Ptr[Mutex], type: int) -> int
    -def lock(mtx: Ptr[Mutex]) -> int
    -def trylock(mtx: Ptr[Mutex]) -> int
    -def unlock(mtx: Ptr[Mutex]) -> int
    -

    1.21 libs.thread.pool

    ERROR_INVALID: Const[int]
    -ERROR_LOCK_FAILURE: Const[int]
    -ERROR_QUEUE_FULL: Const[int]
    -ERROR_SHUTDOWN: Const[int]
    -ERROR_THREAD_FAILURE: Const[int]
    -GRACEFUL_SHUTDOWN: Const[int]
    -# We are waiting for tasks to be completed
    -IMMEDIATE_SHUTDOWN: Const[int]
    -# Default (shutdown all threads forcefully) and close the pool
    -MAX_QUEUE_SIZE: Const[u32]
    -# Maximum queue size for thread pool
    -MAX_THREAD_SIZE: Const[u8]
    -# Maximum threads we can create is 64
    -NO_SHUTDOWN: Const[int]
    -# Not going to shutdown
    -SUCCESS: Const[int]
    -class ThreadPool
    -# Thread pool object:
    -    lock: libs.thread.mutex.Mutex
    -    notify: libs.thread.condition.Condition
    -    threads: Array[libs.thread.Thread]
    -    queue: Array[Tuple[Function[In[AnyPtr], Out], AnyPtr]]
    -    thread_count: int
    -    queue_size: int
    -    head: int
    -    tail: int
    -    count: int
    -    shutdown: int
    -    started: int
    -def add(tpool: ThreadPool, func: Function[In[AnyPtr], Out], arg: AnyPtr) -> int
    -# Add given task to the thread pool to be executed
    -# returns SUCCESS if successful
    -def create(thread_count: u8, queue_size: u32) -> ThreadPool
    -# Create a new thread pool with given thread count and queue size
    -# On success ThreadPool is returned else, it should be equal to None
    -def destroy(tpool: ThreadPool, graceful: bool) -> int
    -# Attempt to destroy thread pool, if SUCCESS is returned pool is deallocated as well
    -def internal_del_pool(tpool: ThreadPool) -> int
    -# Clean up thread pool data
    -def internal_tpool_work(tpool_obj: AnyPtr) -> int
    -# Perform work as a thread in the managed thread pool
    -

    1.22 libs.thread.tss

    class Key
    -# Key to access/create thread specific storage
    -# Declare a variable and use with getref() when calling create()
    -def create(key: Ptr[Key]) -> int
    -# Create with no auto deletion
    -def create_with_deleter(key: Ptr[Key], deleter: Function[In[AnyPtr], Out]) -> int
    -# Create TSS with a custom deleter function
    -def del_data(key: Key) -> None
    -def get(key: Key) -> AnyPtr
    -def set(key: Key, data: AnyPtr) -> int
    -

    1.23 libs.timespec

    class TimeSpec
    -def add_nanoseconds(a: Ptr[TimeSpec], n: i64) -> None
    -def add_seconds(a: Ptr[TimeSpec], n: int) -> None
    -def compare_ex(a: Ptr[TimeSpec], b: Ptr[TimeSpec]) -> i64
    -def create() -> TimeSpec
    -def create_ex(seconds: int) -> TimeSpec
    -def equal(a: TimeSpec, b: TimeSpec) -> bool
    -# is a == b
    -def get_nanoseconds(t: TimeSpec) -> i64
    -def get_seconds(t: TimeSpec) -> int
    -def get_utc_now(t: Ptr[TimeSpec]) -> bool
    -# Load UTC now into given pointer
    -# If successful True is returned
    -def greater(a: TimeSpec, b: TimeSpec) -> bool
    -# is a > b ?
    -def in_future(seconds: int) -> TimeSpec
    -def in_future_ex(seconds: int, nanoseconds: i64) -> TimeSpec
    -def lessser(a: TimeSpec, b: TimeSpec) -> bool
    -# is a < b ?
    -def now() -> TimeSpec
    -


    2 Raylib

    Created 2022-08-14, Last Updated 2023-04-07

    Raylib can be accessed by importing raylib.

    raylib is created by Ramon Santamaria and contributors.

    Yaksha wraps raylib using a generator script.

    2.1 raylib

    BLEND_ADDITIVE: Const[int]
    -# Blend textures adding colors
    -BLEND_ADD_COLORS: Const[int]
    -# Blend textures adding colors (alternative)
    -BLEND_ALPHA: Const[int]
    -# Blend textures considering alpha (default)
    -BLEND_ALPHA_PREMULTIPLY: Const[int]
    -# Blend premultiplied textures considering alpha
    -BLEND_CUSTOM: Const[int]
    -# Blend textures using custom src/dst factors (use rlSetBlendFactors())
    -BLEND_CUSTOM_SEPARATE: Const[int]
    -# Blend textures using custom rgb/alpha separate src/dst factors (use rlSetBlendFactorsSeparate())
    -BLEND_MULTIPLIED: Const[int]
    -# Blend textures multiplying colors
    -BLEND_SUBTRACT_COLORS: Const[int]
    -# Blend textures subtracting colors (alternative)
    -CAMERA_CUSTOM: Const[int]
    -# Custom camera
    -CAMERA_FIRST_PERSON: Const[int]
    -# First person camera
    -CAMERA_FREE: Const[int]
    -# Free camera
    -CAMERA_ORBITAL: Const[int]
    -# Orbital camera
    -CAMERA_ORTHOGRAPHIC: Const[int]
    -# Orthographic projection
    -CAMERA_PERSPECTIVE: Const[int]
    -# Perspective projection
    -CAMERA_THIRD_PERSON: Const[int]
    -# Third person camera
    -CUBEMAP_LAYOUT_AUTO_DETECT: Const[int]
    -# Automatically detect layout type
    -CUBEMAP_LAYOUT_CROSS_FOUR_BY_THREE: Const[int]
    -# Layout is defined by a 4x3 cross with cubemap faces
    -CUBEMAP_LAYOUT_CROSS_THREE_BY_FOUR: Const[int]
    -# Layout is defined by a 3x4 cross with cubemap faces
    -CUBEMAP_LAYOUT_LINE_HORIZONTAL: Const[int]
    -# Layout is defined by a horizontal line with faces
    -CUBEMAP_LAYOUT_LINE_VERTICAL: Const[int]
    -# Layout is defined by a vertical line with faces
    -CUBEMAP_LAYOUT_PANORAMA: Const[int]
    -# Layout is defined by a panorama image (equirrectangular map)
    -FLAG_FULLSCREEN_MODE: Const[int]
    -# Set to run program in fullscreen
    -FLAG_INTERLACED_HINT: Const[int]
    -# Set to try enabling interlaced video format (for V3D)
    -FLAG_MSAA_4X_HINT: Const[int]
    -# Set to try enabling MSAA 4X
    -FLAG_VSYNC_HINT: Const[int]
    -# Set to try enabling V-Sync on GPU
    -FLAG_WINDOW_ALWAYS_RUN: Const[int]
    -# Set to allow windows running while minimized
    -FLAG_WINDOW_HIDDEN: Const[int]
    -# Set to hide window
    -FLAG_WINDOW_HIGHDPI: Const[int]
    -# Set to support HighDPI
    -FLAG_WINDOW_MAXIMIZED: Const[int]
    -# Set to maximize window (expanded to monitor)
    -FLAG_WINDOW_MINIMIZED: Const[int]
    -# Set to minimize window (iconify)
    -FLAG_WINDOW_MOUSE_PASSTHROUGH: Const[int]
    -# Set to support mouse passthrough, only supported when FLAG_WINDOW_UNDECORATED
    -FLAG_WINDOW_RESIZABLE: Const[int]
    -# Set to allow resizable window
    -FLAG_WINDOW_TOPMOST: Const[int]
    -# Set to window always on top
    -FLAG_WINDOW_TRANSPARENT: Const[int]
    -# Set to allow transparent framebuffer
    -FLAG_WINDOW_UNDECORATED: Const[int]
    -# Set to disable window decoration (frame and buttons)
    -FLAG_WINDOW_UNFOCUSED: Const[int]
    -# Set to window non focused
    -FONT_BITMAP: Const[int]
    -# Bitmap font generation, no anti-aliasing
    -FONT_DEFAULT: Const[int]
    -# Default font generation, anti-aliased
    -FONT_SDF: Const[int]
    -# SDF font generation, requires external shader
    -GAMEPAD_AXIS_LEFT_TRIGGER: Const[int]
    -# Gamepad back trigger left, pressure level: [1..-1]
    -GAMEPAD_AXIS_LEFT_X: Const[int]
    -# Gamepad left stick X axis
    -GAMEPAD_AXIS_LEFT_Y: Const[int]
    -# Gamepad left stick Y axis
    -GAMEPAD_AXIS_RIGHT_TRIGGER: Const[int]
    -# Gamepad back trigger right, pressure level: [1..-1]
    -GAMEPAD_AXIS_RIGHT_X: Const[int]
    -# Gamepad right stick X axis
    -GAMEPAD_AXIS_RIGHT_Y: Const[int]
    -# Gamepad right stick Y axis
    -GAMEPAD_BUTTON_LEFT_FACE_DOWN: Const[int]
    -# Gamepad left DPAD down button
    -GAMEPAD_BUTTON_LEFT_FACE_LEFT: Const[int]
    -# Gamepad left DPAD left button
    -GAMEPAD_BUTTON_LEFT_FACE_RIGHT: Const[int]
    -# Gamepad left DPAD right button
    -GAMEPAD_BUTTON_LEFT_FACE_UP: Const[int]
    -# Gamepad left DPAD up button
    -GAMEPAD_BUTTON_LEFT_THUMB: Const[int]
    -# Gamepad joystick pressed button left
    -GAMEPAD_BUTTON_LEFT_TRIGGER_1: Const[int]
    -# Gamepad top/back trigger left (first), it could be a trailing button
    -GAMEPAD_BUTTON_LEFT_TRIGGER_2: Const[int]
    -# Gamepad top/back trigger left (second), it could be a trailing button
    -GAMEPAD_BUTTON_MIDDLE: Const[int]
    -# Gamepad center buttons, middle one (i.e. PS3: PS, Xbox: XBOX)
    -GAMEPAD_BUTTON_MIDDLE_LEFT: Const[int]
    -# Gamepad center buttons, left one (i.e. PS3: Select)
    -GAMEPAD_BUTTON_MIDDLE_RIGHT: Const[int]
    -# Gamepad center buttons, right one (i.e. PS3: Start)
    -GAMEPAD_BUTTON_RIGHT_FACE_DOWN: Const[int]
    -# Gamepad right button down (i.e. PS3: Cross, Xbox: A)
    -GAMEPAD_BUTTON_RIGHT_FACE_LEFT: Const[int]
    -# Gamepad right button left (i.e. PS3: Circle, Xbox: B)
    -GAMEPAD_BUTTON_RIGHT_FACE_RIGHT: Const[int]
    -# Gamepad right button right (i.e. PS3: Square, Xbox: X)
    -GAMEPAD_BUTTON_RIGHT_FACE_UP: Const[int]
    -# Gamepad right button up (i.e. PS3: Triangle, Xbox: Y)
    -GAMEPAD_BUTTON_RIGHT_THUMB: Const[int]
    -# Gamepad joystick pressed button right
    -GAMEPAD_BUTTON_RIGHT_TRIGGER_1: Const[int]
    -# Gamepad top/back trigger right (one), it could be a trailing button
    -GAMEPAD_BUTTON_RIGHT_TRIGGER_2: Const[int]
    -# Gamepad top/back trigger right (second), it could be a trailing button
    -GAMEPAD_BUTTON_UNKNOWN: Const[int]
    -# Unknown button, just for error checking
    -GESTURE_DOUBLETAP: Const[int]
    -# Double tap gesture
    -GESTURE_DRAG: Const[int]
    -# Drag gesture
    -GESTURE_HOLD: Const[int]
    -# Hold gesture
    -GESTURE_NONE: Const[int]
    -# No gesture
    -GESTURE_PINCH_IN: Const[int]
    -# Pinch in gesture
    -GESTURE_PINCH_OUT: Const[int]
    -# Pinch out gesture
    -GESTURE_SWIPE_DOWN: Const[int]
    -# Swipe down gesture
    -GESTURE_SWIPE_LEFT: Const[int]
    -# Swipe left gesture
    -GESTURE_SWIPE_RIGHT: Const[int]
    -# Swipe right gesture
    -GESTURE_SWIPE_UP: Const[int]
    -# Swipe up gesture
    -GESTURE_TAP: Const[int]
    -# Tap gesture
    -KEY_A: Const[int]
    -# Key: A | a
    -KEY_APOSTROPHE: Const[int]
    -# Key: '
    -KEY_B: Const[int]
    -# Key: B | b
    -KEY_BACK: Const[int]
    -# Key: Android back button
    -KEY_BACKSLASH: Const[int]
    -# Key: '\'
    -KEY_BACKSPACE: Const[int]
    -# Key: Backspace
    -KEY_C: Const[int]
    -# Key: C | c
    -KEY_CAPS_LOCK: Const[int]
    -# Key: Caps lock
    -KEY_COMMA: Const[int]
    -# Key: ,
    -KEY_D: Const[int]
    -# Key: D | d
    -KEY_DELETE: Const[int]
    -# Key: Del
    -KEY_DOWN: Const[int]
    -# Key: Cursor down
    -KEY_E: Const[int]
    -# Key: E | e
    -KEY_EIGHT: Const[int]
    -# Key: 8
    -KEY_END: Const[int]
    -# Key: End
    -KEY_ENTER: Const[int]
    -# Key: Enter
    -KEY_EQUAL: Const[int]
    -# Key: =
    -KEY_ESCAPE: Const[int]
    -# Key: Esc
    -KEY_F: Const[int]
    -# Key: F | f
    -KEY_F1: Const[int]
    -# Key: F1
    -KEY_F10: Const[int]
    -# Key: F10
    -KEY_F11: Const[int]
    -# Key: F11
    -KEY_F12: Const[int]
    -# Key: F12
    -KEY_F2: Const[int]
    -# Key: F2
    -KEY_F3: Const[int]
    -# Key: F3
    -KEY_F4: Const[int]
    -# Key: F4
    -KEY_F5: Const[int]
    -# Key: F5
    -KEY_F6: Const[int]
    -# Key: F6
    -KEY_F7: Const[int]
    -# Key: F7
    -KEY_F8: Const[int]
    -# Key: F8
    -KEY_F9: Const[int]
    -# Key: F9
    -KEY_FIVE: Const[int]
    -# Key: 5
    -KEY_FOUR: Const[int]
    -# Key: 4
    -KEY_G: Const[int]
    -# Key: G | g
    -KEY_GRAVE: Const[int]
    -# Key: `
    -KEY_H: Const[int]
    -# Key: H | h
    -KEY_HOME: Const[int]
    -# Key: Home
    -KEY_I: Const[int]
    -# Key: I | i
    -KEY_INSERT: Const[int]
    -# Key: Ins
    -KEY_J: Const[int]
    -# Key: J | j
    -KEY_K: Const[int]
    -# Key: K | k
    -KEY_KB_MENU: Const[int]
    -# Key: KB menu
    -KEY_KP_0: Const[int]
    -# Key: Keypad 0
    -KEY_KP_1: Const[int]
    -# Key: Keypad 1
    -KEY_KP_2: Const[int]
    -# Key: Keypad 2
    -KEY_KP_3: Const[int]
    -# Key: Keypad 3
    -KEY_KP_4: Const[int]
    -# Key: Keypad 4
    -KEY_KP_5: Const[int]
    -# Key: Keypad 5
    -KEY_KP_6: Const[int]
    -# Key: Keypad 6
    -KEY_KP_7: Const[int]
    -# Key: Keypad 7
    -KEY_KP_8: Const[int]
    -# Key: Keypad 8
    -KEY_KP_9: Const[int]
    -# Key: Keypad 9
    -KEY_KP_ADD: Const[int]
    -# Key: Keypad +
    -KEY_KP_DECIMAL: Const[int]
    -# Key: Keypad .
    -KEY_KP_DIVIDE: Const[int]
    -# Key: Keypad /
    -KEY_KP_ENTER: Const[int]
    -# Key: Keypad Enter
    -KEY_KP_EQUAL: Const[int]
    -# Key: Keypad =
    -KEY_KP_MULTIPLY: Const[int]
    -# Key: Keypad *
    -KEY_KP_SUBTRACT: Const[int]
    -# Key: Keypad -
    -KEY_L: Const[int]
    -# Key: L | l
    -KEY_LEFT: Const[int]
    -# Key: Cursor left
    -KEY_LEFT_ALT: Const[int]
    -# Key: Alt left
    -KEY_LEFT_BRACKET: Const[int]
    -# Key: [
    -KEY_LEFT_CONTROL: Const[int]
    -# Key: Control left
    -KEY_LEFT_SHIFT: Const[int]
    -# Key: Shift left
    -KEY_LEFT_SUPER: Const[int]
    -# Key: Super left
    -KEY_M: Const[int]
    -# Key: M | m
    -KEY_MENU: Const[int]
    -# Key: Android menu button
    -KEY_MINUS: Const[int]
    -# Key: -
    -KEY_N: Const[int]
    -# Key: N | n
    -KEY_NINE: Const[int]
    -# Key: 9
    -KEY_NULL: Const[int]
    -# Key: NULL, used for no key pressed
    -KEY_NUM_LOCK: Const[int]
    -# Key: Num lock
    -KEY_O: Const[int]
    -# Key: O | o
    -KEY_ONE: Const[int]
    -# Key: 1
    -KEY_P: Const[int]
    -# Key: P | p
    -KEY_PAGE_DOWN: Const[int]
    -# Key: Page down
    -KEY_PAGE_UP: Const[int]
    -# Key: Page up
    -KEY_PAUSE: Const[int]
    -# Key: Pause
    -KEY_PERIOD: Const[int]
    -# Key: .
    -KEY_PRINT_SCREEN: Const[int]
    -# Key: Print screen
    -KEY_Q: Const[int]
    -# Key: Q | q
    -KEY_R: Const[int]
    -# Key: R | r
    -KEY_RIGHT: Const[int]
    -# Key: Cursor right
    -KEY_RIGHT_ALT: Const[int]
    -# Key: Alt right
    -KEY_RIGHT_BRACKET: Const[int]
    -# Key: ]
    -KEY_RIGHT_CONTROL: Const[int]
    -# Key: Control right
    -KEY_RIGHT_SHIFT: Const[int]
    -# Key: Shift right
    -KEY_RIGHT_SUPER: Const[int]
    -# Key: Super right
    -KEY_S: Const[int]
    -# Key: S | s
    -KEY_SCROLL_LOCK: Const[int]
    -# Key: Scroll down
    -KEY_SEMICOLON: Const[int]
    -# Key: ;
    -KEY_SEVEN: Const[int]
    -# Key: 7
    -KEY_SIX: Const[int]
    -# Key: 6
    -KEY_SLASH: Const[int]
    -# Key: /
    -KEY_SPACE: Const[int]
    -# Key: Space
    -KEY_T: Const[int]
    -# Key: T | t
    -KEY_TAB: Const[int]
    -# Key: Tab
    -KEY_THREE: Const[int]
    -# Key: 3
    -KEY_TWO: Const[int]
    -# Key: 2
    -KEY_U: Const[int]
    -# Key: U | u
    -KEY_UP: Const[int]
    -# Key: Cursor up
    -KEY_V: Const[int]
    -# Key: V | v
    -KEY_VOLUME_DOWN: Const[int]
    -# Key: Android volume down button
    -KEY_VOLUME_UP: Const[int]
    -# Key: Android volume up button
    -KEY_W: Const[int]
    -# Key: W | w
    -KEY_X: Const[int]
    -# Key: X | x
    -KEY_Y: Const[int]
    -# Key: Y | y
    -KEY_Z: Const[int]
    -# Key: Z | z
    -KEY_ZERO: Const[int]
    -# Key: 0
    -LOG_ALL: Const[int]
    -# Display all logs
    -LOG_DEBUG: Const[int]
    -# Debug logging, used for internal debugging, it should be disabled on release builds
    -LOG_ERROR: Const[int]
    -# Error logging, used on unrecoverable failures
    -LOG_FATAL: Const[int]
    -# Fatal logging, used to abort program: exit(EXIT_FAILURE)
    -LOG_INFO: Const[int]
    -# Info logging, used for program execution info
    -LOG_NONE: Const[int]
    -# Disable logging
    -LOG_TRACE: Const[int]
    -# Trace logging, intended for internal use only
    -LOG_WARNING: Const[int]
    -# Warning logging, used on recoverable failures
    -MATERIAL_MAP_ALBEDO: Const[int]
    -# Albedo material (same as: MATERIAL_MAP_DIFFUSE)
    -MATERIAL_MAP_BRDF: Const[int]
    -# Brdf material
    -MATERIAL_MAP_CUBEMAP: Const[int]
    -# Cubemap material (NOTE: Uses GL_TEXTURE_CUBE_MAP)
    -MATERIAL_MAP_EMISSION: Const[int]
    -# Emission material
    -MATERIAL_MAP_HEIGHT: Const[int]
    -# Heightmap material
    -MATERIAL_MAP_IRRADIANCE: Const[int]
    -# Irradiance material (NOTE: Uses GL_TEXTURE_CUBE_MAP)
    -MATERIAL_MAP_METALNESS: Const[int]
    -# Metalness material (same as: MATERIAL_MAP_SPECULAR)
    -MATERIAL_MAP_NORMAL: Const[int]
    -# Normal material
    -MATERIAL_MAP_OCCLUSION: Const[int]
    -# Ambient occlusion material
    -MATERIAL_MAP_PREFILTER: Const[int]
    -# Prefilter material (NOTE: Uses GL_TEXTURE_CUBE_MAP)
    -MATERIAL_MAP_ROUGHNESS: Const[int]
    -# Roughness material
    -MOUSE_BUTTON_BACK: Const[int]
    -# Mouse button back (advanced mouse device)
    -MOUSE_BUTTON_EXTRA: Const[int]
    -# Mouse button extra (advanced mouse device)
    -MOUSE_BUTTON_FORWARD: Const[int]
    -# Mouse button forward (advanced mouse device)
    -MOUSE_BUTTON_LEFT: Const[int]
    -# Mouse button left
    -MOUSE_BUTTON_MIDDLE: Const[int]
    -# Mouse button middle (pressed wheel)
    -MOUSE_BUTTON_RIGHT: Const[int]
    -# Mouse button right
    -MOUSE_BUTTON_SIDE: Const[int]
    -# Mouse button side (advanced mouse device)
    -MOUSE_CURSOR_ARROW: Const[int]
    -# Arrow shape
    -MOUSE_CURSOR_CROSSHAIR: Const[int]
    -# Cross shape
    -MOUSE_CURSOR_DEFAULT: Const[int]
    -# Default pointer shape
    -MOUSE_CURSOR_IBEAM: Const[int]
    -# Text writing cursor shape
    -MOUSE_CURSOR_NOT_ALLOWED: Const[int]
    -# The operation-not-allowed shape
    -MOUSE_CURSOR_POINTING_HAND: Const[int]
    -# Pointing hand cursor
    -MOUSE_CURSOR_RESIZE_ALL: Const[int]
    -# The omnidirectional resize/move cursor shape
    -MOUSE_CURSOR_RESIZE_EW: Const[int]
    -# Horizontal resize/move arrow shape
    -MOUSE_CURSOR_RESIZE_NESW: Const[int]
    -# The top-right to bottom-left diagonal resize/move arrow shape
    -MOUSE_CURSOR_RESIZE_NS: Const[int]
    -# Vertical resize/move arrow shape
    -MOUSE_CURSOR_RESIZE_NWSE: Const[int]
    -# Top-left to bottom-right diagonal resize/move arrow shape
    -NPATCH_NINE_PATCH: Const[int]
    -# Npatch layout: 3x3 tiles
    -NPATCH_THREE_PATCH_HORIZONTAL: Const[int]
    -# Npatch layout: 3x1 tiles
    -NPATCH_THREE_PATCH_VERTICAL: Const[int]
    -# Npatch layout: 1x3 tiles
    -PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA: Const[int]
    -# 8 bpp
    -PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA: Const[int]
    -# 2 bpp
    -PIXELFORMAT_COMPRESSED_DXT1_RGB: Const[int]
    -# 4 bpp (no alpha)
    -PIXELFORMAT_COMPRESSED_DXT1_RGBA: Const[int]
    -# 4 bpp (1 bit alpha)
    -PIXELFORMAT_COMPRESSED_DXT3_RGBA: Const[int]
    -# 8 bpp
    -PIXELFORMAT_COMPRESSED_DXT5_RGBA: Const[int]
    -# 8 bpp
    -PIXELFORMAT_COMPRESSED_ETC1_RGB: Const[int]
    -# 4 bpp
    -PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA: Const[int]
    -# 8 bpp
    -PIXELFORMAT_COMPRESSED_ETC2_RGB: Const[int]
    -# 4 bpp
    -PIXELFORMAT_COMPRESSED_PVRT_RGB: Const[int]
    -# 4 bpp
    -PIXELFORMAT_COMPRESSED_PVRT_RGBA: Const[int]
    -# 4 bpp
    -PIXELFORMAT_UNCOMPRESSED_GRAYSCALE: Const[int]
    -# 8 bit per pixel (no alpha)
    -PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA: Const[int]
    -# 8*2 bpp (2 channels)
    -PIXELFORMAT_UNCOMPRESSED_R32: Const[int]
    -# 32 bpp (1 channel - float)
    -PIXELFORMAT_UNCOMPRESSED_R32G32B32: Const[int]
    -# 32*3 bpp (3 channels - float)
    -PIXELFORMAT_UNCOMPRESSED_R32G32B32A32: Const[int]
    -# 32*4 bpp (4 channels - float)
    -PIXELFORMAT_UNCOMPRESSED_R4G4B4A4: Const[int]
    -# 16 bpp (4 bit alpha)
    -PIXELFORMAT_UNCOMPRESSED_R5G5B5A1: Const[int]
    -# 16 bpp (1 bit alpha)
    -PIXELFORMAT_UNCOMPRESSED_R5G6B5: Const[int]
    -# 16 bpp
    -PIXELFORMAT_UNCOMPRESSED_R8G8B8: Const[int]
    -# 24 bpp
    -PIXELFORMAT_UNCOMPRESSED_R8G8B8A8: Const[int]
    -# 32 bpp
    -SHADER_ATTRIB_FLOAT: Const[int]
    -# Shader attribute type: float
    -SHADER_ATTRIB_VEC2: Const[int]
    -# Shader attribute type: vec2 (2 float)
    -SHADER_ATTRIB_VEC3: Const[int]
    -# Shader attribute type: vec3 (3 float)
    -SHADER_ATTRIB_VEC4: Const[int]
    -# Shader attribute type: vec4 (4 float)
    -SHADER_LOC_COLOR_AMBIENT: Const[int]
    -# Shader location: vector uniform: ambient color
    -SHADER_LOC_COLOR_DIFFUSE: Const[int]
    -# Shader location: vector uniform: diffuse color
    -SHADER_LOC_COLOR_SPECULAR: Const[int]
    -# Shader location: vector uniform: specular color
    -SHADER_LOC_MAP_ALBEDO: Const[int]
    -# Shader location: sampler2d texture: albedo (same as: SHADER_LOC_MAP_DIFFUSE)
    -SHADER_LOC_MAP_BRDF: Const[int]
    -# Shader location: sampler2d texture: brdf
    -SHADER_LOC_MAP_CUBEMAP: Const[int]
    -# Shader location: samplerCube texture: cubemap
    -SHADER_LOC_MAP_EMISSION: Const[int]
    -# Shader location: sampler2d texture: emission
    -SHADER_LOC_MAP_HEIGHT: Const[int]
    -# Shader location: sampler2d texture: height
    -SHADER_LOC_MAP_IRRADIANCE: Const[int]
    -# Shader location: samplerCube texture: irradiance
    -SHADER_LOC_MAP_METALNESS: Const[int]
    -# Shader location: sampler2d texture: metalness (same as: SHADER_LOC_MAP_SPECULAR)
    -SHADER_LOC_MAP_NORMAL: Const[int]
    -# Shader location: sampler2d texture: normal
    -SHADER_LOC_MAP_OCCLUSION: Const[int]
    -# Shader location: sampler2d texture: occlusion
    -SHADER_LOC_MAP_PREFILTER: Const[int]
    -# Shader location: samplerCube texture: prefilter
    -SHADER_LOC_MAP_ROUGHNESS: Const[int]
    -# Shader location: sampler2d texture: roughness
    -SHADER_LOC_MATRIX_MODEL: Const[int]
    -# Shader location: matrix uniform: model (transform)
    -SHADER_LOC_MATRIX_MVP: Const[int]
    -# Shader location: matrix uniform: model-view-projection
    -SHADER_LOC_MATRIX_NORMAL: Const[int]
    -# Shader location: matrix uniform: normal
    -SHADER_LOC_MATRIX_PROJECTION: Const[int]
    -# Shader location: matrix uniform: projection
    -SHADER_LOC_MATRIX_VIEW: Const[int]
    -# Shader location: matrix uniform: view (camera transform)
    -SHADER_LOC_VECTOR_VIEW: Const[int]
    -# Shader location: vector uniform: view
    -SHADER_LOC_VERTEX_COLOR: Const[int]
    -# Shader location: vertex attribute: color
    -SHADER_LOC_VERTEX_NORMAL: Const[int]
    -# Shader location: vertex attribute: normal
    -SHADER_LOC_VERTEX_POSITION: Const[int]
    -# Shader location: vertex attribute: position
    -SHADER_LOC_VERTEX_TANGENT: Const[int]
    -# Shader location: vertex attribute: tangent
    -SHADER_LOC_VERTEX_TEXCOORD01: Const[int]
    -# Shader location: vertex attribute: texcoord01
    -SHADER_LOC_VERTEX_TEXCOORD02: Const[int]
    -# Shader location: vertex attribute: texcoord02
    -SHADER_UNIFORM_FLOAT: Const[int]
    -# Shader uniform type: float
    -SHADER_UNIFORM_INT: Const[int]
    -# Shader uniform type: int
    -SHADER_UNIFORM_IVEC2: Const[int]
    -# Shader uniform type: ivec2 (2 int)
    -SHADER_UNIFORM_IVEC3: Const[int]
    -# Shader uniform type: ivec3 (3 int)
    -SHADER_UNIFORM_IVEC4: Const[int]
    -# Shader uniform type: ivec4 (4 int)
    -SHADER_UNIFORM_SAMPLER2D: Const[int]
    -# Shader uniform type: sampler2d
    -SHADER_UNIFORM_VEC2: Const[int]
    -# Shader uniform type: vec2 (2 float)
    -SHADER_UNIFORM_VEC3: Const[int]
    -# Shader uniform type: vec3 (3 float)
    -SHADER_UNIFORM_VEC4: Const[int]
    -# Shader uniform type: vec4 (4 float)
    -TEXTURE_FILTER_ANISOTROPIC_16X: Const[int]
    -# Anisotropic filtering 16x
    -TEXTURE_FILTER_ANISOTROPIC_4X: Const[int]
    -# Anisotropic filtering 4x
    -TEXTURE_FILTER_ANISOTROPIC_8X: Const[int]
    -# Anisotropic filtering 8x
    -TEXTURE_FILTER_BILINEAR: Const[int]
    -# Linear filtering
    -TEXTURE_FILTER_POINT: Const[int]
    -# No filter, just pixel approximation
    -TEXTURE_FILTER_TRILINEAR: Const[int]
    -# Trilinear filtering (linear with mipmaps)
    -TEXTURE_WRAP_CLAMP: Const[int]
    -# Clamps texture to edge pixel in tiled mode
    -TEXTURE_WRAP_MIRROR_CLAMP: Const[int]
    -# Mirrors and clamps to border the texture in tiled mode
    -TEXTURE_WRAP_MIRROR_REPEAT: Const[int]
    -# Mirrors and repeats the texture in tiled mode
    -TEXTURE_WRAP_REPEAT: Const[int]
    -# Repeats texture in tiled mode
    -class AudioStream
    -# AudioStream, custom audio stream
    -class BoneInfo
    -# Bone, skeletal animation bone
    -class BoundingBox
    -# BoundingBox:
    -    min: Vector3
    -    max: Vector3
    -class CChar32
    -class CFloat2
    -class CFloat4
    -class Camera
    -# Camera type fallback, defaults to Camera3D:
    -    position: Vector3
    -    target: Vector3
    -    up: Vector3
    -    fovy: float
    -    projection: libs.c.CInt
    -class Camera2D
    -# Camera2D, defines position/orientation in 2d space:
    -    offset: Vector2
    -    target: Vector2
    -    rotation: float
    -    zoom: float
    -class Camera3D
    -# Camera, defines position/orientation in 3d space:
    -    position: Vector3
    -    target: Vector3
    -    up: Vector3
    -    fovy: float
    -    projection: libs.c.CInt
    -class Color
    -# Color, 4 components, R8G8B8A8 (32bit):
    -    r: libs.c.CUChar
    -    g: libs.c.CUChar
    -    b: libs.c.CUChar
    -    a: libs.c.CUChar
    -class DTMatrix2
    -class FilePathList
    -# File path list
    -class Font
    -# Font, font texture and GlyphInfo array data:
    -    baseSize: libs.c.CInt
    -    glyphCount: libs.c.CInt
    -    glyphPadding: libs.c.CInt
    -    texture: Texture2D
    -    recs: Ptr[Rectangle]
    -    glyphs: Ptr[GlyphInfo]
    -class GlyphInfo
    -# GlyphInfo, font characters glyphs info:
    -    value: libs.c.CInt
    -    offsetX: libs.c.CInt
    -    offsetY: libs.c.CInt
    -    advanceX: libs.c.CInt
    -    image: Image
    -class Image
    -# Image, pixel data stored in CPU memory (RAM):
    -    data: AnyPtr
    -    width: libs.c.CInt
    -    height: libs.c.CInt
    -    mipmaps: libs.c.CInt
    -    format: libs.c.CInt
    -class Material
    -# Material, includes shader and maps
    -class MaterialMap
    -# MaterialMap:
    -    texture: Texture2D
    -    color: Color
    -    value: float
    -class Matrix
    -# Matrix, 4x4 components, column major, OpenGL style, right-handed:
    -    m0: float
    -    m4: float
    -    m8: float
    -    m12: float
    -    m1: float
    -    m5: float
    -    m9: float
    -    m13: float
    -    m2: float
    -    m6: float
    -    m10: float
    -    m14: float
    -    m3: float
    -    m7: float
    -    m11: float
    -    m15: float
    -class Mesh
    -# Mesh, vertex data and vao/vbo
    -class Model
    -# Model, meshes, materials and animation data
    -class ModelAnimation
    -# ModelAnimation
    -class Music
    -# Music, audio stream, anything longer than ~10 seconds should be streamed:
    -    stream: AudioStream
    -    frameCount: libs.c.CUInt
    -    looping: bool
    -    ctxType: libs.c.CInt
    -    ctxData: AnyPtr
    -class NPatchInfo
    -# NPatchInfo, n-patch layout info:
    -    source: Rectangle
    -    left: libs.c.CInt
    -    top: libs.c.CInt
    -    right: libs.c.CInt
    -    bottom: libs.c.CInt
    -    layout: libs.c.CInt
    -class Quaternion
    -# Quaternion, 4 components (Vector4 alias):
    -    x: float
    -    y: float
    -    z: float
    -    w: float
    -class RAudioBufferPtr
    -class RAudioProcessorPtr
    -class Ray
    -# Ray, ray for raycasting:
    -    position: Vector3
    -    direction: Vector3
    -class RayCollision
    -# RayCollision, ray hit information:
    -    hit: bool
    -    distance: float
    -    point: Vector3
    -    normal: Vector3
    -class Rectangle
    -# Rectangle, 4 components:
    -    x: float
    -    y: float
    -    width: float
    -    height: float
    -class RenderTexture
    -# RenderTexture, fbo for texture rendering:
    -    id: libs.c.CUInt
    -    texture: Texture
    -    depth: Texture
    -class RenderTexture2D
    -# RenderTexture2D, same as RenderTexture:
    -    id: libs.c.CUInt
    -    p_texture: Texture
    -    depth: Texture
    -class Shader
    -# Shader
    -class Sound
    -# Sound:
    -    stream: AudioStream
    -    frameCount: libs.c.CUInt
    -class Texture
    -# Texture, tex data stored in GPU memory (VRAM):
    -    id: libs.c.CUInt
    -    width: libs.c.CInt
    -    height: libs.c.CInt
    -    mipmaps: libs.c.CInt
    -    format: libs.c.CInt
    -class Texture2D
    -# Texture2D, same as Texture:
    -    id: libs.c.CUInt
    -    width: libs.c.CInt
    -    height: libs.c.CInt
    -    mipmaps: libs.c.CInt
    -    format: libs.c.CInt
    -class TextureCubemap
    -# TextureCubemap, same as Texture:
    -    id: libs.c.CUInt
    -    width: libs.c.CInt
    -    height: libs.c.CInt
    -    mipmaps: libs.c.CInt
    -    format: libs.c.CInt
    -class Transform
    -# Transform, vertex transformation data:
    -    translation: Vector3
    -    rotation: Quaternion
    -    scale: Vector3
    -class Vector2
    -# Vector2, 2 components:
    -    x: float
    -    y: float
    -class Vector3
    -# Vector3, 3 components:
    -    x: float
    -    y: float
    -    z: float
    -class Vector4
    -# Vector4, 4 components:
    -    x: float
    -    y: float
    -    z: float
    -    w: float
    -class VrDeviceInfo
    -# VrDeviceInfo, Head-Mounted-Display device parameters
    -class VrStereoConfig
    -# VrStereoConfig, VR stereo rendering configuration for simulator
    -class Wave
    -# Wave, audio wave data:
    -    frameCount: libs.c.CUInt
    -    sampleRate: libs.c.CUInt
    -    sampleSize: libs.c.CUInt
    -    channels: libs.c.CUInt
    -    data: AnyPtr
    -def begin_blend_mode(mode: int) -> None
    -# Begin blending mode (alpha, additive, multiplied, subtract, custom)
    -def begin_drawing() -> None
    -# Setup canvas (framebuffer) to start drawing
    -def begin_mode_2d(p_camera: Camera2D) -> None
    -# Begin 2D mode with custom camera (2D)
    -def begin_mode_3d(p_camera: Camera3D) -> None
    -# Begin 3D mode with custom camera (3D)
    -def begin_scissor_mode(x: int, y: int, width: int, height: int) -> None
    -# Begin scissor mode (define screen area for following drawing)
    -def begin_shader_mode(shader: Shader) -> None
    -# Begin custom shader drawing
    -def begin_texture_mode(target: RenderTexture2D) -> None
    -# Begin drawing to render texture
    -def begin_vr_stereo_mode(config: VrStereoConfig) -> None
    -# Begin stereo rendering (requires VR simulator)
    -def bounding_box(min: Vector3, max: Vector3) -> BoundingBox
    -# Factory function for: BoundingBox
    -def camera(position: Vector3, target: Vector3, up: Vector3, fovy: float, projection: int) -> Camera
    -# Factory function for: Camera
    -def camera_2d(offset: Vector2, target: Vector2, rotation: float, zoom: float) -> Camera2D
    -# Factory function for: Camera2D
    -def camera_3d(position: Vector3, target: Vector3, up: Vector3, fovy: float, projection: int) -> Camera3D
    -# Factory function for: Camera3D
    -def change_directory(dir: str) -> bool
    -# Change working directory, return true on success
    -def check_collision_box_sphere(box: BoundingBox, center: Vector3, radius: float) -> bool
    -# Check collision between box and sphere
    -def check_collision_boxes(box1: BoundingBox, box2: BoundingBox) -> bool
    -# Check collision between two bounding boxes
    -def check_collision_circle_rec(center: Vector2, radius: float, rec: Rectangle) -> bool
    -# Check collision between circle and rectangle
    -def check_collision_circles(center1: Vector2, radius1: float, center2: Vector2, radius2: float) -> bool
    -# Check collision between two circles
    -def check_collision_lines(start_pos1: Vector2, end_pos1: Vector2, start_pos2: Vector2, end_pos2: Vector2, collision_point: Ptr[Vector2]) -> bool
    -# Check the collision between two lines defined by two points each, returns collision point by reference
    -def check_collision_point_circle(point: Vector2, center: Vector2, radius: float) -> bool
    -# Check if point is inside circle
    -def check_collision_point_line(point: Vector2, p1: Vector2, p2: Vector2, threshold: int) -> bool
    -# Check if point belongs to line created between two points [p1] and [p2] with defined margin in pixels [threshold]
    -def check_collision_point_poly(point: Vector2, points: Ptr[Vector2], point_count: int) -> bool
    -# Check if point is within a polygon described by array of vertices
    -def check_collision_point_rec(point: Vector2, rec: Rectangle) -> bool
    -# Check if point is inside rectangle
    -def check_collision_point_triangle(point: Vector2, p1: Vector2, p2: Vector2, p3: Vector2) -> bool
    -# Check if point is inside a triangle
    -def check_collision_recs(rec1: Rectangle, rec2: Rectangle) -> bool
    -# Check collision between two rectangles
    -def check_collision_spheres(center1: Vector3, radius1: float, center2: Vector3, radius2: float) -> bool
    -# Check collision between two spheres
    -def clear_background(p_color: Color) -> None
    -# Set background color (framebuffer clear color)
    -def clear_window_state(flags: u32) -> None
    -# Clear window configuration state flags
    -def close_audio_device() -> None
    -# Close the audio device and context
    -def close_window() -> None
    -# Close window and unload OpenGL context
    -def codepoint_to_utf8(codepoint: int, utf8_size: Ptr[libs.c.CInt]) -> Ptr[Const[libs.c.CChar]]
    -# Encode one codepoint into UTF-8 byte array (array length returned as parameter)
    -def color(r: int, g: int, b: int, a: int) -> Color
    -# Factory function for: Color
    -def color_alpha(p_color: Color, alpha: float) -> Color
    -# Get color with alpha applied, alpha goes from 0.0f to 1.0f
    -def color_alpha_blend(dst: Color, src: Color, tint: Color) -> Color
    -# Get src alpha-blended into dst color with tint
    -def color_brightness(p_color: Color, factor: float) -> Color
    -# Get color with brightness correction, brightness factor goes from -1.0f to 1.0f
    -def color_contrast(p_color: Color, contrast: float) -> Color
    -# Get color with contrast correction, contrast values between -1.0f and 1.0f
    -def color_from_hsv(hue: float, saturation: float, value: float) -> Color
    -# Get a Color from HSV values, hue [0..360], saturation/value [0..1]
    -def color_from_normalized(normalized: Vector4) -> Color
    -# Get Color from normalized values [0..1]
    -def color_normalize(p_color: Color) -> Vector4
    -# Get Color normalized as float [0..1]
    -def color_tint(p_color: Color, tint: Color) -> Color
    -# Get color multiplied with another color
    -def color_to_hsv(p_color: Color) -> Vector3
    -# Get HSV values for a Color, hue [0..360], saturation/value [0..1]
    -def color_to_int(p_color: Color) -> int
    -# Get hexadecimal value for a Color
    -def compress_data(data: Ptr[Const[libs.c.CUChar]], data_size: int, comp_data_size: Ptr[libs.c.CInt]) -> Ptr[libs.c.CUChar]
    -# Compress data (DEFLATE algorithm), memory must be MemFree()
    -def decode_data_base64(data: Ptr[Const[libs.c.CUChar]], output_size: Ptr[libs.c.CInt]) -> Ptr[libs.c.CUChar]
    -# Decode Base64 string data, memory must be MemFree()
    -def decompress_data(comp_data: Ptr[Const[libs.c.CUChar]], comp_data_size: int, data_size: Ptr[libs.c.CInt]) -> Ptr[libs.c.CUChar]
    -# Decompress data (DEFLATE algorithm), memory must be MemFree()
    -def directory_exists(dir_path: str) -> bool
    -# Check if a directory path exists
    -def disable_cursor() -> None
    -# Disables cursor (lock cursor)
    -def disable_event_waiting() -> None
    -# Disable waiting for events on EndDrawing(), automatic events polling
    -def draw_billboard(p_camera: Camera, p_texture: Texture2D, position: Vector3, size: float, tint: Color) -> None
    -# Draw a billboard texture
    -def draw_billboard_pro(p_camera: Camera, p_texture: Texture2D, source: Rectangle, position: Vector3, up: Vector3, size: Vector2, origin: Vector2, rotation: float, tint: Color) -> None
    -# Draw a billboard texture defined by source and rotation
    -def draw_billboard_rec(p_camera: Camera, p_texture: Texture2D, source: Rectangle, position: Vector3, size: Vector2, tint: Color) -> None
    -# Draw a billboard texture defined by source
    -def draw_bounding_box(box: BoundingBox, p_color: Color) -> None
    -# Draw bounding box (wires)
    -def draw_capsule(start_pos: Vector3, end_pos: Vector3, radius: float, slices: int, rings: int, p_color: Color) -> None
    -# Draw a capsule with the center of its sphere caps at startPos and endPos
    -def draw_capsule_wires(start_pos: Vector3, end_pos: Vector3, radius: float, slices: int, rings: int, p_color: Color) -> None
    -# Draw capsule wireframe with the center of its sphere caps at startPos and endPos
    -def draw_circle(center_x: int, center_y: int, radius: float, p_color: Color) -> None
    -# Draw a color-filled circle
    -def draw_circle_3d(center: Vector3, radius: float, rotation_axis: Vector3, rotation_angle: float, p_color: Color) -> None
    -# Draw a circle in 3D world space
    -def draw_circle_gradient(center_x: int, center_y: int, radius: float, color1: Color, color2: Color) -> None
    -# Draw a gradient-filled circle
    -def draw_circle_lines(center_x: int, center_y: int, radius: float, p_color: Color) -> None
    -# Draw circle outline
    -def draw_circle_sector(center: Vector2, radius: float, start_angle: float, end_angle: float, segments: int, p_color: Color) -> None
    -# Draw a piece of a circle
    -def draw_circle_sector_lines(center: Vector2, radius: float, start_angle: float, end_angle: float, segments: int, p_color: Color) -> None
    -# Draw circle sector outline
    -def draw_circle_v(center: Vector2, radius: float, p_color: Color) -> None
    -# Draw a color-filled circle (Vector version)
    -def draw_cube(position: Vector3, width: float, height: float, length: float, p_color: Color) -> None
    -# Draw cube
    -def draw_cube_v(position: Vector3, size: Vector3, p_color: Color) -> None
    -# Draw cube (Vector version)
    -def draw_cube_wires(position: Vector3, width: float, height: float, length: float, p_color: Color) -> None
    -# Draw cube wires
    -def draw_cube_wires_v(position: Vector3, size: Vector3, p_color: Color) -> None
    -# Draw cube wires (Vector version)
    -def draw_cylinder(position: Vector3, radius_top: float, radius_bottom: float, height: float, slices: int, p_color: Color) -> None
    -# Draw a cylinder/cone
    -def draw_cylinder_ex(start_pos: Vector3, end_pos: Vector3, start_radius: float, end_radius: float, sides: int, p_color: Color) -> None
    -# Draw a cylinder with base at startPos and top at endPos
    -def draw_cylinder_wires(position: Vector3, radius_top: float, radius_bottom: float, height: float, slices: int, p_color: Color) -> None
    -# Draw a cylinder/cone wires
    -def draw_cylinder_wires_ex(start_pos: Vector3, end_pos: Vector3, start_radius: float, end_radius: float, sides: int, p_color: Color) -> None
    -# Draw a cylinder wires with base at startPos and top at endPos
    -def draw_ellipse(center_x: int, center_y: int, radius_h: float, radius_v: float, p_color: Color) -> None
    -# Draw ellipse
    -def draw_ellipse_lines(center_x: int, center_y: int, radius_h: float, radius_v: float, p_color: Color) -> None
    -# Draw ellipse outline
    -def draw_fps(pos_x: int, pos_y: int) -> None
    -# Draw current FPS
    -def draw_grid(slices: int, spacing: float) -> None
    -# Draw a grid (centered at (0, 0, 0))
    -def draw_line(start_pos_x: int, start_pos_y: int, end_pos_x: int, end_pos_y: int, p_color: Color) -> None
    -# Draw a line
    -def draw_line_3d(start_pos: Vector3, end_pos: Vector3, p_color: Color) -> None
    -# Draw a line in 3D world space
    -def draw_line_bezier(start_pos: Vector2, end_pos: Vector2, thick: float, p_color: Color) -> None
    -# Draw a line using cubic-bezier curves in-out
    -def draw_line_bezier_cubic(start_pos: Vector2, end_pos: Vector2, start_control_pos: Vector2, end_control_pos: Vector2, thick: float, p_color: Color) -> None
    -# Draw line using cubic bezier curves with 2 control points
    -def draw_line_bezier_quad(start_pos: Vector2, end_pos: Vector2, control_pos: Vector2, thick: float, p_color: Color) -> None
    -# Draw line using quadratic bezier curves with a control point
    -def draw_line_ex(start_pos: Vector2, end_pos: Vector2, thick: float, p_color: Color) -> None
    -# Draw a line defining thickness
    -def draw_line_strip(points: Ptr[Vector2], point_count: int, p_color: Color) -> None
    -# Draw lines sequence
    -def draw_line_v(start_pos: Vector2, end_pos: Vector2, p_color: Color) -> None
    -# Draw a line (Vector version)
    -def draw_mesh(mesh: Mesh, material: Material, p_transform: Matrix) -> None
    -# Draw a 3d mesh with material and transform
    -def draw_mesh_instanced(mesh: Mesh, material: Material, transforms: Ptr[Const[Matrix]], instances: int) -> None
    -# Draw multiple mesh instances with material and different transforms
    -def draw_model(model: Model, position: Vector3, scale: float, tint: Color) -> None
    -# Draw a model (with texture if set)
    -def draw_model_ex(model: Model, position: Vector3, rotation_axis: Vector3, rotation_angle: float, scale: Vector3, tint: Color) -> None
    -# Draw a model with extended parameters
    -def draw_model_wires(model: Model, position: Vector3, scale: float, tint: Color) -> None
    -# Draw a model wires (with texture if set)
    -def draw_model_wires_ex(model: Model, position: Vector3, rotation_axis: Vector3, rotation_angle: float, scale: Vector3, tint: Color) -> None
    -# Draw a model wires (with texture if set) with extended parameters
    -def draw_pixel(pos_x: int, pos_y: int, p_color: Color) -> None
    -# Draw a pixel
    -def draw_pixel_v(position: Vector2, p_color: Color) -> None
    -# Draw a pixel (Vector version)
    -def draw_plane(center_pos: Vector3, size: Vector2, p_color: Color) -> None
    -# Draw a plane XZ
    -def draw_point_3d(position: Vector3, p_color: Color) -> None
    -# Draw a point in 3D space, actually a small line
    -def draw_poly(center: Vector2, sides: int, radius: float, rotation: float, p_color: Color) -> None
    -# Draw a regular polygon (Vector version)
    -def draw_poly_lines(center: Vector2, sides: int, radius: float, rotation: float, p_color: Color) -> None
    -# Draw a polygon outline of n sides
    -def draw_poly_lines_ex(center: Vector2, sides: int, radius: float, rotation: float, line_thick: float, p_color: Color) -> None
    -# Draw a polygon outline of n sides with extended parameters
    -def draw_ray(p_ray: Ray, p_color: Color) -> None
    -# Draw a ray line
    -def draw_rectangle(pos_x: int, pos_y: int, width: int, height: int, p_color: Color) -> None
    -# Draw a color-filled rectangle
    -def draw_rectangle_gradient_ex(rec: Rectangle, col1: Color, col2: Color, col3: Color, col4: Color) -> None
    -# Draw a gradient-filled rectangle with custom vertex colors
    -def draw_rectangle_gradient_h(pos_x: int, pos_y: int, width: int, height: int, color1: Color, color2: Color) -> None
    -# Draw a horizontal-gradient-filled rectangle
    -def draw_rectangle_gradient_v(pos_x: int, pos_y: int, width: int, height: int, color1: Color, color2: Color) -> None
    -# Draw a vertical-gradient-filled rectangle
    -def draw_rectangle_lines(pos_x: int, pos_y: int, width: int, height: int, p_color: Color) -> None
    -# Draw rectangle outline
    -def draw_rectangle_lines_ex(rec: Rectangle, line_thick: float, p_color: Color) -> None
    -# Draw rectangle outline with extended parameters
    -def draw_rectangle_pro(rec: Rectangle, origin: Vector2, rotation: float, p_color: Color) -> None
    -# Draw a color-filled rectangle with pro parameters
    -def draw_rectangle_rec(rec: Rectangle, p_color: Color) -> None
    -# Draw a color-filled rectangle
    -def draw_rectangle_rounded(rec: Rectangle, roundness: float, segments: int, p_color: Color) -> None
    -# Draw rectangle with rounded edges
    -def draw_rectangle_rounded_lines(rec: Rectangle, roundness: float, segments: int, line_thick: float, p_color: Color) -> None
    -# Draw rectangle with rounded edges outline
    -def draw_rectangle_v(position: Vector2, size: Vector2, p_color: Color) -> None
    -# Draw a color-filled rectangle (Vector version)
    -def draw_ring(center: Vector2, inner_radius: float, outer_radius: float, start_angle: float, end_angle: float, segments: int, p_color: Color) -> None
    -# Draw ring
    -def draw_ring_lines(center: Vector2, inner_radius: float, outer_radius: float, start_angle: float, end_angle: float, segments: int, p_color: Color) -> None
    -# Draw ring outline
    -def draw_sphere(center_pos: Vector3, radius: float, p_color: Color) -> None
    -# Draw sphere
    -def draw_sphere_ex(center_pos: Vector3, radius: float, rings: int, slices: int, p_color: Color) -> None
    -# Draw sphere with extended parameters
    -def draw_sphere_wires(center_pos: Vector3, radius: float, rings: int, slices: int, p_color: Color) -> None
    -# Draw sphere wires
    -def draw_text(text: str, pos_x: int, pos_y: int, font_size: int, p_color: Color) -> None
    -# Draw text (using default font)
    -def draw_text_codepoint(p_font: Font, codepoint: int, position: Vector2, font_size: float, tint: Color) -> None
    -# Draw one character (codepoint)
    -def draw_text_codepoints(p_font: Font, codepoints: Ptr[Const[libs.c.CInt]], count: int, position: Vector2, font_size: float, spacing: float, tint: Color) -> None
    -# Draw multiple character (codepoint)
    -def draw_text_ex(p_font: Font, text: str, position: Vector2, font_size: float, spacing: float, tint: Color) -> None
    -# Draw text using font and additional parameters
    -def draw_text_pro(p_font: Font, text: str, position: Vector2, origin: Vector2, rotation: float, font_size: float, spacing: float, tint: Color) -> None
    -# Draw text using Font and pro parameters (rotation)
    -def draw_texture(p_texture: Texture2D, pos_x: int, pos_y: int, tint: Color) -> None
    -# Draw a Texture2D
    -def draw_texture_ex(p_texture: Texture2D, position: Vector2, rotation: float, scale: float, tint: Color) -> None
    -# Draw a Texture2D with extended parameters
    -def draw_texture_n_patch(p_texture: Texture2D, p_n_patch_info: NPatchInfo, dest: Rectangle, origin: Vector2, rotation: float, tint: Color) -> None
    -# Draws a texture (or part of it) that stretches or shrinks nicely
    -def draw_texture_pro(p_texture: Texture2D, source: Rectangle, dest: Rectangle, origin: Vector2, rotation: float, tint: Color) -> None
    -# Draw a part of a texture defined by a rectangle with 'pro' parameters
    -def draw_texture_rec(p_texture: Texture2D, source: Rectangle, position: Vector2, tint: Color) -> None
    -# Draw a part of a texture defined by a rectangle
    -def draw_texture_v(p_texture: Texture2D, position: Vector2, tint: Color) -> None
    -# Draw a Texture2D with position defined as Vector2
    -def draw_triangle(v1: Vector2, v2: Vector2, v3: Vector2, p_color: Color) -> None
    -# Draw a color-filled triangle (vertex in counter-clockwise order!)
    -def draw_triangle_3d(v1: Vector3, v2: Vector3, v3: Vector3, p_color: Color) -> None
    -# Draw a color-filled triangle (vertex in counter-clockwise order!)
    -def draw_triangle_fan(points: Ptr[Vector2], point_count: int, p_color: Color) -> None
    -# Draw a triangle fan defined by points (first vertex is the center)
    -def draw_triangle_lines(v1: Vector2, v2: Vector2, v3: Vector2, p_color: Color) -> None
    -# Draw triangle outline (vertex in counter-clockwise order!)
    -def draw_triangle_strip(points: Ptr[Vector2], point_count: int, p_color: Color) -> None
    -# Draw a triangle strip defined by points
    -def draw_triangle_strip_3d(points: Ptr[Vector3], point_count: int, p_color: Color) -> None
    -# Draw a triangle strip defined by points
    -def enable_cursor() -> None
    -# Enables cursor (unlock cursor)
    -def enable_event_waiting() -> None
    -# Enable waiting for events on EndDrawing(), no automatic event polling
    -def encode_data_base64(data: Ptr[Const[libs.c.CUChar]], data_size: int, output_size: Ptr[libs.c.CInt]) -> libs.c.CStr
    -# Encode data to Base64 string, memory must be MemFree()
    -def end_blend_mode() -> None
    -# End blending mode (reset to default: alpha blending)
    -def end_drawing() -> None
    -# End canvas drawing and swap buffers (double buffering)
    -def end_mode_2d() -> None
    -# Ends 2D mode with custom camera
    -def end_mode_3d() -> None
    -# Ends 3D mode and returns to default 2D orthographic mode
    -def end_scissor_mode() -> None
    -# End scissor mode
    -def end_shader_mode() -> None
    -# End custom shader drawing (use default shader)
    -def end_texture_mode() -> None
    -# Ends drawing to render texture
    -def end_vr_stereo_mode() -> None
    -# End stereo rendering (requires VR simulator)
    -def export_data_as_code(data: Ptr[Const[libs.c.CUChar]], size: u32, file_name: str) -> bool
    -# Export data to code (.h), returns true on success
    -def export_font_as_code(p_font: Font, file_name: str) -> bool
    -# Export font as code file, returns true on success
    -def export_image(p_image: Image, file_name: str) -> bool
    -# Export image data to file, returns true on success
    -def export_image_as_code(p_image: Image, file_name: str) -> bool
    -# Export image as code file defining an array of bytes, returns true on success
    -def export_mesh(mesh: Mesh, file_name: str) -> bool
    -# Export mesh data to file, returns true on success
    -def export_wave(p_wave: Wave, file_name: str) -> bool
    -# Export wave data to file, returns true on success
    -def export_wave_as_code(p_wave: Wave, file_name: str) -> bool
    -# Export wave sample data to code (.h), returns true on success
    -def fade(p_color: Color, alpha: float) -> Color
    -# Get color with alpha applied, alpha goes from 0.0f to 1.0f
    -def file_exists(file_name: str) -> bool
    -# Check if file exists
    -def font(base_size: int, glyph_count: int, glyph_padding: int, p_texture: Texture2D, recs: Ptr[Rectangle], glyphs: Ptr[GlyphInfo]) -> Font
    -# Factory function for: Font
    -def gen_image_cellular(width: int, height: int, tile_size: int) -> Image
    -# Generate image: cellular algorithm, bigger tileSize means bigger cells
    -def gen_image_checked(width: int, height: int, checks_x: int, checks_y: int, col1: Color, col2: Color) -> Image
    -# Generate image: checked
    -def gen_image_color(width: int, height: int, p_color: Color) -> Image
    -# Generate image: plain color
    -def gen_image_font_atlas(chars: Ptr[Const[GlyphInfo]], recs: Ptr[Ptr[Rectangle]], glyph_count: int, font_size: int, padding: int, pack_method: int) -> Image
    -# Generate image font atlas using chars info
    -def gen_image_gradient_h(width: int, height: int, left: Color, right: Color) -> Image
    -# Generate image: horizontal gradient
    -def gen_image_gradient_radial(width: int, height: int, density: float, inner: Color, outer: Color) -> Image
    -# Generate image: radial gradient
    -def gen_image_gradient_v(width: int, height: int, top: Color, bottom: Color) -> Image
    -# Generate image: vertical gradient
    -def gen_image_perlin_noise(width: int, height: int, offset_x: int, offset_y: int, scale: float) -> Image
    -# Generate image: perlin noise
    -def gen_image_text(width: int, height: int, text: str) -> Image
    -# Generate image: grayscale image from text data
    -def gen_image_white_noise(width: int, height: int, factor: float) -> Image
    -# Generate image: white noise
    -def gen_mesh_cone(radius: float, height: float, slices: int) -> Mesh
    -# Generate cone/pyramid mesh
    -def gen_mesh_cube(width: float, height: float, length: float) -> Mesh
    -# Generate cuboid mesh
    -def gen_mesh_cubicmap(cubicmap: Image, cube_size: Vector3) -> Mesh
    -# Generate cubes-based map mesh from image data
    -def gen_mesh_cylinder(radius: float, height: float, slices: int) -> Mesh
    -# Generate cylinder mesh
    -def gen_mesh_heightmap(heightmap: Image, size: Vector3) -> Mesh
    -# Generate heightmap mesh from image data
    -def gen_mesh_hemi_sphere(radius: float, rings: int, slices: int) -> Mesh
    -# Generate half-sphere mesh (no bottom cap)
    -def gen_mesh_knot(radius: float, size: float, rad_seg: int, sides: int) -> Mesh
    -# Generate trefoil knot mesh
    -def gen_mesh_plane(width: float, length: float, res_x: int, res_z: int) -> Mesh
    -# Generate plane mesh (with subdivisions)
    -def gen_mesh_poly(sides: int, radius: float) -> Mesh
    -# Generate polygonal mesh
    -def gen_mesh_sphere(radius: float, rings: int, slices: int) -> Mesh
    -# Generate sphere mesh (standard sphere)
    -def gen_mesh_tangents(mesh: Ptr[Mesh]) -> None
    -# Compute mesh tangents
    -def gen_mesh_torus(radius: float, size: float, rad_seg: int, sides: int) -> Mesh
    -# Generate torus mesh
    -def gen_texture_mipmaps(p_texture: Ptr[Texture2D]) -> None
    -# Generate GPU mipmaps for a texture
    -def get_application_directory() -> Ptr[Const[libs.c.CChar]]
    -# Get the directory if the running application (uses static string)
    -def get_camera_matrix(p_camera: Camera) -> Matrix
    -# Get camera transform matrix (view matrix)
    -def get_camera_matrix_2d(p_camera: Camera2D) -> Matrix
    -# Get camera 2d transform matrix
    -def get_char_pressed() -> int
    -# Get char pressed (unicode), call it multiple times for chars queued, returns 0 when the queue is empty
    -def get_clipboard_text() -> Ptr[Const[libs.c.CChar]]
    -# Get clipboard text content
    -def get_codepoint(text: str, codepoint_size: Ptr[libs.c.CInt]) -> int
    -# Get next codepoint in a UTF-8 encoded string, 0x3f('?') is returned on failure
    -def get_codepoint_count(text: str) -> int
    -# Get total number of codepoints in a UTF-8 encoded string
    -def get_codepoint_next(text: str, codepoint_size: Ptr[libs.c.CInt]) -> int
    -# Get next codepoint in a UTF-8 encoded string, 0x3f('?') is returned on failure
    -def get_codepoint_previous(text: str, codepoint_size: Ptr[libs.c.CInt]) -> int
    -# Get previous codepoint in a UTF-8 encoded string, 0x3f('?') is returned on failure
    -def get_collision_rec(rec1: Rectangle, rec2: Rectangle) -> Rectangle
    -# Get collision rectangle for two rectangles collision
    -def get_color(hex_value: u32) -> Color
    -# Get Color structure from hexadecimal value
    -def get_current_monitor() -> int
    -# Get current connected monitor
    -def get_directory_path(file_path: str) -> Ptr[Const[libs.c.CChar]]
    -# Get full path for a given fileName with path (uses static string)
    -def get_file_extension(file_name: str) -> Ptr[Const[libs.c.CChar]]
    -# Get pointer to extension for a filename string (includes dot: '.png')
    -def get_file_length(file_name: str) -> int
    -# Get file length in bytes (NOTE: GetFileSize() conflicts with windows.h)
    -def get_file_mod_time(file_name: str) -> i64
    -# Get file modification time (last write time)
    -def get_file_name(file_path: str) -> Ptr[Const[libs.c.CChar]]
    -# Get pointer to filename for a path string
    -def get_file_name_without_ext(file_path: str) -> Ptr[Const[libs.c.CChar]]
    -# Get filename string without extension (uses static string)
    -def get_font_default() -> Font
    -# Get the default Font
    -def get_fps() -> int
    -# Get current FPS
    -def get_frame_time() -> float
    -# Get time in seconds for last frame drawn (delta time)
    -def get_gamepad_axis_count(gamepad: int) -> int
    -# Get gamepad axis count for a gamepad
    -def get_gamepad_axis_movement(gamepad: int, axis: int) -> float
    -# Get axis movement value for a gamepad axis
    -def get_gamepad_button_pressed() -> int
    -# Get the last gamepad button pressed
    -def get_gamepad_name(gamepad: int) -> Ptr[Const[libs.c.CChar]]
    -# Get gamepad internal name id
    -def get_gesture_detected() -> int
    -# Get latest detected gesture
    -def get_gesture_drag_angle() -> float
    -# Get gesture drag angle
    -def get_gesture_drag_vector() -> Vector2
    -# Get gesture drag vector
    -def get_gesture_hold_duration() -> float
    -# Get gesture hold time in milliseconds
    -def get_gesture_pinch_angle() -> float
    -# Get gesture pinch angle
    -def get_gesture_pinch_vector() -> Vector2
    -# Get gesture pinch delta
    -def get_glyph_atlas_rec(p_font: Font, codepoint: int) -> Rectangle
    -# Get glyph rectangle in font atlas for a codepoint (unicode character), fallback to '?' if not found
    -def get_glyph_index(p_font: Font, codepoint: int) -> int
    -# Get glyph index position in font for a codepoint (unicode character), fallback to '?' if not found
    -def get_glyph_info(p_font: Font, codepoint: int) -> GlyphInfo
    -# Get glyph font info data for a codepoint (unicode character), fallback to '?' if not found
    -def get_image_alpha_border(p_image: Image, threshold: float) -> Rectangle
    -# Get image alpha border rectangle
    -def get_image_color(p_image: Image, x: int, y: int) -> Color
    -# Get image pixel color at (x, y) position
    -def get_key_pressed() -> int
    -# Get key pressed (keycode), call it multiple times for keys queued, returns 0 when the queue is empty
    -def get_mesh_bounding_box(mesh: Mesh) -> BoundingBox
    -# Compute mesh bounding box limits
    -def get_model_bounding_box(model: Model) -> BoundingBox
    -# Compute model bounding box limits (considers all meshes)
    -def get_monitor_count() -> int
    -# Get number of connected monitors
    -def get_monitor_height(monitor: int) -> int
    -# Get specified monitor height (current video mode used by monitor)
    -def get_monitor_name(monitor: int) -> Ptr[Const[libs.c.CChar]]
    -# Get the human-readable, UTF-8 encoded name of the primary monitor
    -def get_monitor_physical_height(monitor: int) -> int
    -# Get specified monitor physical height in millimetres
    -def get_monitor_physical_width(monitor: int) -> int
    -# Get specified monitor physical width in millimetres
    -def get_monitor_position(monitor: int) -> Vector2
    -# Get specified monitor position
    -def get_monitor_refresh_rate(monitor: int) -> int
    -# Get specified monitor refresh rate
    -def get_monitor_width(monitor: int) -> int
    -# Get specified monitor width (current video mode used by monitor)
    -def get_mouse_delta() -> Vector2
    -# Get mouse delta between frames
    -def get_mouse_position() -> Vector2
    -# Get mouse position XY
    -def get_mouse_ray(mouse_position: Vector2, p_camera: Camera) -> Ray
    -# Get a ray trace from mouse position
    -def get_mouse_wheel_move() -> float
    -# Get mouse wheel movement for X or Y, whichever is larger
    -def get_mouse_wheel_move_v() -> Vector2
    -# Get mouse wheel movement for both X and Y
    -def get_mouse_x() -> int
    -# Get mouse position X
    -def get_mouse_y() -> int
    -# Get mouse position Y
    -def get_music_time_length(p_music: Music) -> float
    -# Get music time length (in seconds)
    -def get_music_time_played(p_music: Music) -> float
    -# Get current music time played (in seconds)
    -def get_pixel_color(src_ptr: AnyPtr, format: int) -> Color
    -# Get Color from a source pixel pointer of certain format
    -def get_pixel_data_size(width: int, height: int, format: int) -> int
    -# Get pixel data size in bytes for certain format
    -def get_prev_directory_path(dir_path: str) -> Ptr[Const[libs.c.CChar]]
    -# Get previous directory path for a given path (uses static string)
    -def get_random_value(min: int, max: int) -> int
    -# Get a random value between min and max (both included)
    -def get_ray_collision_box(p_ray: Ray, box: BoundingBox) -> RayCollision
    -# Get collision info between ray and box
    -def get_ray_collision_mesh(p_ray: Ray, mesh: Mesh, p_transform: Matrix) -> RayCollision
    -# Get collision info between ray and mesh
    -def get_ray_collision_quad(p_ray: Ray, p1: Vector3, p2: Vector3, p3: Vector3, p4: Vector3) -> RayCollision
    -# Get collision info between ray and quad
    -def get_ray_collision_sphere(p_ray: Ray, center: Vector3, radius: float) -> RayCollision
    -# Get collision info between ray and sphere
    -def get_ray_collision_triangle(p_ray: Ray, p1: Vector3, p2: Vector3, p3: Vector3) -> RayCollision
    -# Get collision info between ray and triangle
    -def get_render_height() -> int
    -# Get current render height (it considers HiDPI)
    -def get_render_width() -> int
    -# Get current render width (it considers HiDPI)
    -def get_screen_height() -> int
    -# Get current screen height
    -def get_screen_to_world_2d(position: Vector2, p_camera: Camera2D) -> Vector2
    -# Get the world space position for a 2d camera screen space position
    -def get_screen_width() -> int
    -# Get current screen width
    -def get_shader_location(shader: Shader, uniform_name: str) -> int
    -# Get shader uniform location
    -def get_shader_location_attrib(shader: Shader, attrib_name: str) -> int
    -# Get shader attribute location
    -def get_time() -> f64
    -# Get elapsed time in seconds since InitWindow()
    -def get_touch_point_count() -> int
    -# Get number of touch points
    -def get_touch_point_id(index: int) -> int
    -# Get touch point identifier for given index
    -def get_touch_position(index: int) -> Vector2
    -# Get touch position XY for a touch point index (relative to screen size)
    -def get_touch_x() -> int
    -# Get touch position X for touch point 0 (relative to screen size)
    -def get_touch_y() -> int
    -# Get touch position Y for touch point 0 (relative to screen size)
    -def get_window_handle() -> AnyPtr
    -# Get native window handle
    -def get_window_position() -> Vector2
    -# Get window position XY on monitor
    -def get_window_scale_dpi() -> Vector2
    -# Get window scale DPI factor
    -def get_working_directory() -> Ptr[Const[libs.c.CChar]]
    -# Get current working directory (uses static string)
    -def get_world_to_screen(position: Vector3, p_camera: Camera) -> Vector2
    -# Get the screen space position for a 3d world space position
    -def get_world_to_screen_2d(position: Vector2, p_camera: Camera2D) -> Vector2
    -# Get the screen space position for a 2d camera world space position
    -def get_world_to_screen_ex(position: Vector3, p_camera: Camera, width: int, height: int) -> Vector2
    -# Get size position for a 3d world space position
    -def glyph_info(value: int, offset_x: int, offset_y: int, advance_x: int, p_image: Image) -> GlyphInfo
    -# Factory function for: GlyphInfo
    -def hide_cursor() -> None
    -# Hides cursor
    -def image(data: AnyPtr, width: int, height: int, mipmaps: int, format: int) -> Image
    -# Factory function for: Image
    -def image_alpha_clear(p_image: Ptr[Image], p_color: Color, threshold: float) -> None
    -# Clear alpha channel to desired color
    -def image_alpha_crop(p_image: Ptr[Image], threshold: float) -> None
    -# Crop image depending on alpha value
    -def image_alpha_mask(p_image: Ptr[Image], alpha_mask: Image) -> None
    -# Apply alpha mask to image
    -def image_alpha_premultiply(p_image: Ptr[Image]) -> None
    -# Premultiply alpha channel
    -def image_blur_gaussian(p_image: Ptr[Image], blur_size: int) -> None
    -# Apply Gaussian blur using a box blur approximation
    -def image_clear_background(dst: Ptr[Image], p_color: Color) -> None
    -# Clear image background with given color
    -def image_color_brightness(p_image: Ptr[Image], brightness: int) -> None
    -# Modify image color: brightness (-255 to 255)
    -def image_color_contrast(p_image: Ptr[Image], contrast: float) -> None
    -# Modify image color: contrast (-100 to 100)
    -def image_color_grayscale(p_image: Ptr[Image]) -> None
    -# Modify image color: grayscale
    -def image_color_invert(p_image: Ptr[Image]) -> None
    -# Modify image color: invert
    -def image_color_replace(p_image: Ptr[Image], p_color: Color, replace: Color) -> None
    -# Modify image color: replace color
    -def image_color_tint(p_image: Ptr[Image], p_color: Color) -> None
    -# Modify image color: tint
    -def image_copy(p_image: Image) -> Image
    -# Create an image duplicate (useful for transformations)
    -def image_crop(p_image: Ptr[Image], crop: Rectangle) -> None
    -# Crop an image to a defined rectangle
    -def image_dither(p_image: Ptr[Image], r_bpp: int, g_bpp: int, b_bpp: int, a_bpp: int) -> None
    -# Dither image data to 16bpp or lower (Floyd-Steinberg dithering)
    -def image_draw(dst: Ptr[Image], src: Image, src_rec: Rectangle, dst_rec: Rectangle, tint: Color) -> None
    -# Draw a source image within a destination image (tint applied to source)
    -def image_draw_circle(dst: Ptr[Image], center_x: int, center_y: int, radius: int, p_color: Color) -> None
    -# Draw a filled circle within an image
    -def image_draw_circle_lines(dst: Ptr[Image], center_x: int, center_y: int, radius: int, p_color: Color) -> None
    -# Draw circle outline within an image
    -def image_draw_circle_lines_v(dst: Ptr[Image], center: Vector2, radius: int, p_color: Color) -> None
    -# Draw circle outline within an image (Vector version)
    -def image_draw_circle_v(dst: Ptr[Image], center: Vector2, radius: int, p_color: Color) -> None
    -# Draw a filled circle within an image (Vector version)
    -def image_draw_line(dst: Ptr[Image], start_pos_x: int, start_pos_y: int, end_pos_x: int, end_pos_y: int, p_color: Color) -> None
    -# Draw line within an image
    -def image_draw_line_v(dst: Ptr[Image], start: Vector2, end: Vector2, p_color: Color) -> None
    -# Draw line within an image (Vector version)
    -def image_draw_pixel(dst: Ptr[Image], pos_x: int, pos_y: int, p_color: Color) -> None
    -# Draw pixel within an image
    -def image_draw_pixel_v(dst: Ptr[Image], position: Vector2, p_color: Color) -> None
    -# Draw pixel within an image (Vector version)
    -def image_draw_rectangle(dst: Ptr[Image], pos_x: int, pos_y: int, width: int, height: int, p_color: Color) -> None
    -# Draw rectangle within an image
    -def image_draw_rectangle_lines(dst: Ptr[Image], rec: Rectangle, thick: int, p_color: Color) -> None
    -# Draw rectangle lines within an image
    -def image_draw_rectangle_rec(dst: Ptr[Image], rec: Rectangle, p_color: Color) -> None
    -# Draw rectangle within an image
    -def image_draw_rectangle_v(dst: Ptr[Image], position: Vector2, size: Vector2, p_color: Color) -> None
    -# Draw rectangle within an image (Vector version)
    -def image_draw_text(dst: Ptr[Image], text: str, pos_x: int, pos_y: int, font_size: int, p_color: Color) -> None
    -# Draw text (using default font) within an image (destination)
    -def image_draw_text_ex(dst: Ptr[Image], p_font: Font, text: str, position: Vector2, font_size: float, spacing: float, tint: Color) -> None
    -# Draw text (custom sprite font) within an image (destination)
    -def image_flip_horizontal(p_image: Ptr[Image]) -> None
    -# Flip image horizontally
    -def image_flip_vertical(p_image: Ptr[Image]) -> None
    -# Flip image vertically
    -def image_format(p_image: Ptr[Image], new_format: int) -> None
    -# Convert image data to desired format
    -def image_from_image(p_image: Image, rec: Rectangle) -> Image
    -# Create an image from another image piece
    -def image_mipmaps(p_image: Ptr[Image]) -> None
    -# Compute all mipmap levels for a provided image
    -def image_resize(p_image: Ptr[Image], new_width: int, new_height: int) -> None
    -# Resize image (Bicubic scaling algorithm)
    -def image_resize_canvas(p_image: Ptr[Image], new_width: int, new_height: int, offset_x: int, offset_y: int, fill: Color) -> None
    -# Resize canvas and fill with color
    -def image_resize_nn(p_image: Ptr[Image], new_width: int, new_height: int) -> None
    -# Resize image (Nearest-Neighbor scaling algorithm)
    -def image_rotate_ccw(p_image: Ptr[Image]) -> None
    -# Rotate image counter-clockwise 90deg
    -def image_rotate_cw(p_image: Ptr[Image]) -> None
    -# Rotate image clockwise 90deg
    -def image_text(text: str, font_size: int, p_color: Color) -> Image
    -# Create an image from text (default font)
    -def image_text_ex(p_font: Font, text: str, font_size: float, spacing: float, tint: Color) -> Image
    -# Create an image from text (custom sprite font)
    -def image_to_pot(p_image: Ptr[Image], fill: Color) -> None
    -# Convert image to POT (power-of-two)
    -def init_audio_device() -> None
    -# Initialize audio device and context
    -def init_window(width: int, height: int, title: str) -> None
    -# Initialize window and OpenGL context
    -def is_audio_device_ready() -> bool
    -# Check if audio device has been initialized successfully
    -def is_audio_stream_playing(stream: AudioStream) -> bool
    -# Check if audio stream is playing
    -def is_audio_stream_processed(stream: AudioStream) -> bool
    -# Check if any audio stream buffers requires refill
    -def is_audio_stream_ready(stream: AudioStream) -> bool
    -# Checks if an audio stream is ready
    -def is_cursor_hidden() -> bool
    -# Check if cursor is not visible
    -def is_cursor_on_screen() -> bool
    -# Check if cursor is on the screen
    -def is_file_dropped() -> bool
    -# Check if a file has been dropped into window
    -def is_file_extension(file_name: str, ext: str) -> bool
    -# Check file extension (including point: .png, .wav)
    -def is_font_ready(p_font: Font) -> bool
    -# Check if a font is ready
    -def is_gamepad_available(gamepad: int) -> bool
    -# Check if a gamepad is available
    -def is_gamepad_button_down(gamepad: int, button: int) -> bool
    -# Check if a gamepad button is being pressed
    -def is_gamepad_button_pressed(gamepad: int, button: int) -> bool
    -# Check if a gamepad button has been pressed once
    -def is_gamepad_button_released(gamepad: int, button: int) -> bool
    -# Check if a gamepad button has been released once
    -def is_gamepad_button_up(gamepad: int, button: int) -> bool
    -# Check if a gamepad button is NOT being pressed
    -def is_gesture_detected(gesture: int) -> bool
    -# Check if a gesture have been detected
    -def is_image_ready(p_image: Image) -> bool
    -# Check if an image is ready
    -def is_key_down(key: int) -> bool
    -# Check if a key is being pressed
    -def is_key_pressed(key: int) -> bool
    -# Check if a key has been pressed once
    -def is_key_released(key: int) -> bool
    -# Check if a key has been released once
    -def is_key_up(key: int) -> bool
    -# Check if a key is NOT being pressed
    -def is_material_ready(material: Material) -> bool
    -# Check if a material is ready
    -def is_model_animation_valid(model: Model, anim: ModelAnimation) -> bool
    -# Check model animation skeleton match
    -def is_model_ready(model: Model) -> bool
    -# Check if a model is ready
    -def is_mouse_button_down(button: int) -> bool
    -# Check if a mouse button is being pressed
    -def is_mouse_button_pressed(button: int) -> bool
    -# Check if a mouse button has been pressed once
    -def is_mouse_button_released(button: int) -> bool
    -# Check if a mouse button has been released once
    -def is_mouse_button_up(button: int) -> bool
    -# Check if a mouse button is NOT being pressed
    -def is_music_ready(p_music: Music) -> bool
    -# Checks if a music stream is ready
    -def is_music_stream_playing(p_music: Music) -> bool
    -# Check if music is playing
    -def is_path_file(path: str) -> bool
    -# Check if a given path is a file or a directory
    -def is_render_texture_ready(target: RenderTexture2D) -> bool
    -# Check if a render texture is ready
    -def is_shader_ready(shader: Shader) -> bool
    -# Check if a shader is ready
    -def is_sound_playing(p_sound: Sound) -> bool
    -# Check if a sound is currently playing
    -def is_sound_ready(p_sound: Sound) -> bool
    -# Checks if a sound is ready
    -def is_texture_ready(p_texture: Texture2D) -> bool
    -# Check if a texture is ready
    -def is_wave_ready(p_wave: Wave) -> bool
    -# Checks if wave data is ready
    -def is_window_focused() -> bool
    -# Check if window is currently focused (only PLATFORM_DESKTOP)
    -def is_window_fullscreen() -> bool
    -# Check if window is currently fullscreen
    -def is_window_hidden() -> bool
    -# Check if window is currently hidden (only PLATFORM_DESKTOP)
    -def is_window_maximized() -> bool
    -# Check if window is currently maximized (only PLATFORM_DESKTOP)
    -def is_window_minimized() -> bool
    -# Check if window is currently minimized (only PLATFORM_DESKTOP)
    -def is_window_ready() -> bool
    -# Check if window has been initialized successfully
    -def is_window_resized() -> bool
    -# Check if window has been resized last frame
    -def is_window_state(flag: u32) -> bool
    -# Check if one specific window flag is enabled
    -def load_audio_stream(sample_rate: u32, sample_size: u32, channels: u32) -> AudioStream
    -# Load audio stream (to stream raw audio pcm data)
    -def load_codepoints(text: str, count: Ptr[libs.c.CInt]) -> Ptr[libs.c.CInt]
    -# Load all codepoints from a UTF-8 text string, codepoints count returned by parameter
    -def load_directory_files(dir_path: str) -> FilePathList
    -# Load directory filepaths
    -def load_directory_files_ex(base_path: str, filter: str, scan_subdirs: bool) -> FilePathList
    -# Load directory filepaths with extension filtering and recursive directory scan
    -def load_dropped_files() -> FilePathList
    -# Load dropped filepaths
    -def load_file_data(file_name: str, bytes_read: Ptr[libs.c.CUInt]) -> Ptr[libs.c.CUChar]
    -# Load file data as byte array (read)
    -def load_file_text(file_name: str) -> libs.c.CStr
    -# Load text data from file (read), returns a '\0' terminated string
    -def load_font(file_name: str) -> Font
    -# Load font from file into GPU memory (VRAM)
    -def load_font_data(file_data: Ptr[Const[libs.c.CUChar]], data_size: int, font_size: int, font_chars: Ptr[libs.c.CInt], glyph_count: int, type: int) -> Ptr[GlyphInfo]
    -# Load font data for further use
    -def load_font_ex(file_name: str, font_size: int, font_chars: Ptr[libs.c.CInt], glyph_count: int) -> Font
    -# Load font from file with extended parameters, use NULL for fontChars and 0 for glyphCount to load the default character set
    -def load_font_from_image(p_image: Image, key: Color, first_char: int) -> Font
    -# Load font from Image (XNA style)
    -def load_font_from_memory(file_type: str, file_data: Ptr[Const[libs.c.CUChar]], data_size: int, font_size: int, font_chars: Ptr[libs.c.CInt], glyph_count: int) -> Font
    -# Load font from memory buffer, fileType refers to extension: i.e. '.ttf'
    -def load_image(file_name: str) -> Image
    -# Load image from file into CPU memory (RAM)
    -def load_image_anim(file_name: str, frames: Ptr[libs.c.CInt]) -> Image
    -# Load image sequence from file (frames appended to image.data)
    -def load_image_colors(p_image: Image) -> Ptr[Color]
    -# Load color data from image as a Color array (RGBA - 32bit)
    -def load_image_from_memory(file_type: str, file_data: Ptr[Const[libs.c.CUChar]], data_size: int) -> Image
    -# Load image from memory buffer, fileType refers to extension: i.e. '.png'
    -def load_image_from_screen() -> Image
    -# Load image from screen buffer and (screenshot)
    -def load_image_from_texture(p_texture: Texture2D) -> Image
    -# Load image from GPU texture data
    -def load_image_palette(p_image: Image, max_palette_size: int, color_count: Ptr[libs.c.CInt]) -> Ptr[Color]
    -# Load colors palette from image as a Color array (RGBA - 32bit)
    -def load_image_raw(file_name: str, width: int, height: int, format: int, header_size: int) -> Image
    -# Load image from RAW file data
    -def load_material_default() -> Material
    -# Load default material (Supports: DIFFUSE, SPECULAR, NORMAL maps)
    -def load_materials(file_name: str, material_count: Ptr[libs.c.CInt]) -> Ptr[Material]
    -# Load materials from model file
    -def load_model(file_name: str) -> Model
    -# Load model from files (meshes and materials)
    -def load_model_animations(file_name: str, anim_count: Ptr[libs.c.CUInt]) -> Ptr[ModelAnimation]
    -# Load model animations from file
    -def load_model_from_mesh(mesh: Mesh) -> Model
    -# Load model from generated mesh (default material)
    -def load_music_stream(file_name: str) -> Music
    -# Load music stream from file
    -def load_music_stream_from_memory(file_type: str, data: Ptr[Const[libs.c.CUChar]], data_size: int) -> Music
    -# Load music stream from data
    -def load_render_texture(width: int, height: int) -> RenderTexture2D
    -# Load texture for rendering (framebuffer)
    -def load_shader(vs_file_name: str, fs_file_name: str) -> Shader
    -# Load shader from files and bind default locations
    -def load_shader_from_memory(vs_code: str, fs_code: str) -> Shader
    -# Load shader from code strings and bind default locations
    -def load_sound(file_name: str) -> Sound
    -# Load sound from file
    -def load_sound_from_wave(p_wave: Wave) -> Sound
    -# Load sound from wave data
    -def load_texture(file_name: str) -> Texture2D
    -# Load texture from file into GPU memory (VRAM)
    -def load_texture_cubemap(p_image: Image, layout: int) -> TextureCubemap
    -# Load cubemap from image, multiple image cubemap layouts supported
    -def load_texture_from_image(p_image: Image) -> Texture2D
    -# Load texture from image data
    -def load_utf8(codepoints: Ptr[Const[libs.c.CInt]], length: int) -> libs.c.CStr
    -# Load UTF-8 text encoded from codepoints array
    -def load_vr_stereo_config(device: VrDeviceInfo) -> VrStereoConfig
    -# Load VR stereo config for VR simulator device parameters
    -def load_wave(file_name: str) -> Wave
    -# Load wave data from file
    -def load_wave_from_memory(file_type: str, file_data: Ptr[Const[libs.c.CUChar]], data_size: int) -> Wave
    -# Load wave from memory buffer, fileType refers to extension: i.e. '.wav'
    -def load_wave_samples(p_wave: Wave) -> Ptr[libs.c.CFloat]
    -# Load samples data from wave as a 32bit float data array
    -def material_map(p_texture: Texture2D, p_color: Color, value: float) -> MaterialMap
    -# Factory function for: MaterialMap
    -def matrix(m0: float, m4: float, m8: float, m12: float, m1: float, m5: float, m9: float, m13: float, m2: float, m6: float, m10: float, m14: float, m3: float, m7: float, m11: float, m15: float) -> Matrix
    -# Factory function for: Matrix
    -def maximize_window() -> None
    -# Set window state: maximized, if resizable (only PLATFORM_DESKTOP)
    -def measure_text(text: str, font_size: int) -> int
    -# Measure string width for default font
    -def measure_text_ex(p_font: Font, text: str, font_size: float, spacing: float) -> Vector2
    -# Measure string size for Font
    -def mem_alloc(size: u32) -> AnyPtr
    -# Internal memory allocator
    -def mem_free(ptr: AnyPtr) -> None
    -# Internal memory free
    -def mem_realloc(ptr: AnyPtr, size: u32) -> AnyPtr
    -# Internal memory reallocator
    -def minimize_window() -> None
    -# Set window state: minimized, if resizable (only PLATFORM_DESKTOP)
    -def music(stream: AudioStream, frame_count: u32, looping: bool, ctx_type: int, ctx_data: AnyPtr) -> Music
    -# Factory function for: Music
    -def n_patch_info(source: Rectangle, left: int, top: int, right: int, bottom: int, layout: int) -> NPatchInfo
    -# Factory function for: NPatchInfo
    -def open_url(url: str) -> None
    -# Open URL with default system browser (if available)
    -def pause_audio_stream(stream: AudioStream) -> None
    -# Pause audio stream
    -def pause_music_stream(p_music: Music) -> None
    -# Pause music playing
    -def pause_sound(p_sound: Sound) -> None
    -# Pause a sound
    -def play_audio_stream(stream: AudioStream) -> None
    -# Play audio stream
    -def play_music_stream(p_music: Music) -> None
    -# Start music playing
    -def play_sound(p_sound: Sound) -> None
    -# Play a sound
    -def poll_input_events() -> None
    -# Register all input events
    -def quaternion(x: float, y: float, z: float, w: float) -> Quaternion
    -# Factory function for: Quaternion
    -def ray(position: Vector3, direction: Vector3) -> Ray
    -# Factory function for: Ray
    -def ray_collision(hit: bool, distance: float, point: Vector3, normal: Vector3) -> RayCollision
    -# Factory function for: RayCollision
    -def rectangle(x: float, y: float, width: float, height: float) -> Rectangle
    -# Factory function for: Rectangle
    -def render_texture(id: u32, p_texture: Texture, depth: Texture) -> RenderTexture
    -# Factory function for: RenderTexture
    -def render_texture_2d(id: u32, p_texture: Texture, depth: Texture) -> RenderTexture2D
    -# Factory function for: RenderTexture2D
    -def restore_window() -> None
    -# Set window state: not minimized/maximized (only PLATFORM_DESKTOP)
    -def resume_audio_stream(stream: AudioStream) -> None
    -# Resume audio stream
    -def resume_music_stream(p_music: Music) -> None
    -# Resume playing paused music
    -def resume_sound(p_sound: Sound) -> None
    -# Resume a paused sound
    -def save_file_data(file_name: str, data: AnyPtr, bytes_to_write: u32) -> bool
    -# Save data to file from byte array (write), returns true on success
    -def save_file_text(file_name: str, text: str) -> bool
    -# Save text data to file (write), string must be '\0' terminated, returns true on success
    -def seek_music_stream(p_music: Music, position: float) -> None
    -# Seek music to a position (in seconds)
    -def set_audio_stream_buffer_size_default(size: int) -> None
    -# Default size for new audio streams
    -def set_audio_stream_pan(stream: AudioStream, pan: float) -> None
    -# Set pan for audio stream (0.5 is centered)
    -def set_audio_stream_pitch(stream: AudioStream, pitch: float) -> None
    -# Set pitch for audio stream (1.0 is base level)
    -def set_audio_stream_volume(stream: AudioStream, volume: float) -> None
    -# Set volume for audio stream (1.0 is max level)
    -def set_clipboard_text(text: str) -> None
    -# Set clipboard text content
    -def set_config_flags(flags: u32) -> None
    -# Setup init configuration flags (view FLAGS)
    -def set_exit_key(key: int) -> None
    -# Set a custom key to exit program (default is ESC)
    -def set_gamepad_mappings(mappings: str) -> int
    -# Set internal gamepad mappings (SDL_GameControllerDB)
    -def set_gestures_enabled(flags: u32) -> None
    -# Enable a set of gestures using flags
    -def set_master_volume(volume: float) -> None
    -# Set master volume (listener)
    -def set_material_texture(material: Ptr[Material], map_type: int, p_texture: Texture2D) -> None
    -# Set texture for a material map type (MATERIAL_MAP_DIFFUSE, MATERIAL_MAP_SPECULAR...)
    -def set_model_mesh_material(model: Ptr[Model], mesh_id: int, material_id: int) -> None
    -# Set material for a mesh
    -def set_mouse_cursor(cursor: int) -> None
    -# Set mouse cursor
    -def set_mouse_offset(offset_x: int, offset_y: int) -> None
    -# Set mouse offset
    -def set_mouse_position(x: int, y: int) -> None
    -# Set mouse position XY
    -def set_mouse_scale(scale_x: float, scale_y: float) -> None
    -# Set mouse scaling
    -def set_music_pan(p_music: Music, pan: float) -> None
    -# Set pan for a music (0.5 is center)
    -def set_music_pitch(p_music: Music, pitch: float) -> None
    -# Set pitch for a music (1.0 is base level)
    -def set_music_volume(p_music: Music, volume: float) -> None
    -# Set volume for music (1.0 is max level)
    -def set_pixel_color(dst_ptr: AnyPtr, p_color: Color, format: int) -> None
    -# Set color formatted into destination pixel pointer
    -def set_random_seed(seed: u32) -> None
    -# Set the seed for the random number generator
    -def set_shader_value(shader: Shader, loc_index: int, value: AnyPtrToConst, uniform_type: int) -> None
    -# Set shader uniform value
    -def set_shader_value_matrix(shader: Shader, loc_index: int, mat: Matrix) -> None
    -# Set shader uniform value (matrix 4x4)
    -def set_shader_value_texture(shader: Shader, loc_index: int, p_texture: Texture2D) -> None
    -# Set shader uniform value for texture (sampler2d)
    -def set_shader_value_v(shader: Shader, loc_index: int, value: AnyPtrToConst, uniform_type: int, count: int) -> None
    -# Set shader uniform value vector
    -def set_shapes_texture(p_texture: Texture2D, source: Rectangle) -> None
    -# Set texture and rectangle to be used on shapes drawing
    -def set_sound_pan(p_sound: Sound, pan: float) -> None
    -# Set pan for a sound (0.5 is center)
    -def set_sound_pitch(p_sound: Sound, pitch: float) -> None
    -# Set pitch for a sound (1.0 is base level)
    -def set_sound_volume(p_sound: Sound, volume: float) -> None
    -# Set volume for a sound (1.0 is max level)
    -def set_target_fps(fps: int) -> None
    -# Set target FPS (maximum)
    -def set_texture_filter(p_texture: Texture2D, filter: int) -> None
    -# Set texture scaling filter mode
    -def set_texture_wrap(p_texture: Texture2D, wrap: int) -> None
    -# Set texture wrapping mode
    -def set_trace_log_level(log_level: int) -> None
    -# Set the current threshold (minimum) log level
    -def set_window_icon(p_image: Image) -> None
    -# Set icon for window (single image, RGBA 32bit, only PLATFORM_DESKTOP)
    -def set_window_icons(images: Ptr[Image], count: int) -> None
    -# Set icon for window (multiple images, RGBA 32bit, only PLATFORM_DESKTOP)
    -def set_window_min_size(width: int, height: int) -> None
    -# Set window minimum dimensions (for FLAG_WINDOW_RESIZABLE)
    -def set_window_monitor(monitor: int) -> None
    -# Set monitor for the current window (fullscreen mode)
    -def set_window_opacity(opacity: float) -> None
    -# Set window opacity [0.0f..1.0f] (only PLATFORM_DESKTOP)
    -def set_window_position(x: int, y: int) -> None
    -# Set window position on screen (only PLATFORM_DESKTOP)
    -def set_window_size(width: int, height: int) -> None
    -# Set window dimensions
    -def set_window_state(flags: u32) -> None
    -# Set window configuration state using flags (only PLATFORM_DESKTOP)
    -def set_window_title(title: str) -> None
    -# Set title for window (only PLATFORM_DESKTOP)
    -def show_cursor() -> None
    -# Shows cursor
    -def sound(stream: AudioStream, frame_count: u32) -> Sound
    -# Factory function for: Sound
    -def stop_audio_stream(stream: AudioStream) -> None
    -# Stop audio stream
    -def stop_music_stream(p_music: Music) -> None
    -# Stop music playing
    -def stop_sound(p_sound: Sound) -> None
    -# Stop playing a sound
    -def swap_screen_buffer() -> None
    -# Swap back buffer with front buffer (screen drawing)
    -def take_screenshot(file_name: str) -> None
    -# Takes a screenshot of current screen (filename extension defines format)
    -def text_append(text: str, append: str, position: Ptr[libs.c.CInt]) -> None
    -# Append text at specific position and move cursor!
    -def text_copy(dst: str, src: str) -> int
    -# Copy one string to another, returns bytes copied
    -def text_find_index(text: str, find: str) -> int
    -# Find first text occurrence within a string
    -def text_insert(text: str, insert: str, position: int) -> libs.c.CStr
    -# Insert text in a position (WARNING: memory must be freed!)
    -def text_is_equal(text1: str, text2: str) -> bool
    -# Check if two text string are equal
    -def text_join(text_list: Ptr[Ptr[Const[libs.c.CChar]]], count: int, delimiter: str) -> Ptr[Const[libs.c.CChar]]
    -# Join text strings with delimiter
    -def text_length(text: str) -> u32
    -# Get text length, checks for '\0' ending
    -def text_replace(text: str, replace: str, by: str) -> libs.c.CStr
    -# Replace text string (WARNING: memory must be freed!)
    -def text_split(text: str, delimiter: int, count: Ptr[libs.c.CInt]) -> Ptr[Ptr[Const[libs.c.CChar]]]
    -# Split text into multiple strings
    -def text_subtext(text: str, position: int, length: int) -> Ptr[Const[libs.c.CChar]]
    -# Get a piece of a text string
    -def text_to_integer(text: str) -> int
    -# Get integer value from text (negative values not supported)
    -def text_to_lower(text: str) -> Ptr[Const[libs.c.CChar]]
    -# Get lower case version of provided string
    -def text_to_pascal(text: str) -> Ptr[Const[libs.c.CChar]]
    -# Get Pascal case notation version of provided string
    -def text_to_upper(text: str) -> Ptr[Const[libs.c.CChar]]
    -# Get upper case version of provided string
    -def texture(id: u32, width: int, height: int, mipmaps: int, format: int) -> Texture
    -# Factory function for: Texture
    -def texture_2d(id: u32, width: int, height: int, mipmaps: int, format: int) -> Texture2D
    -# Factory function for: Texture2D
    -def texture_cubemap(id: u32, width: int, height: int, mipmaps: int, format: int) -> TextureCubemap
    -# Factory function for: TextureCubemap
    -def toggle_fullscreen() -> None
    -# Toggle window state: fullscreen/windowed (only PLATFORM_DESKTOP)
    -def transform(translation: Vector3, rotation: Quaternion, scale: Vector3) -> Transform
    -# Factory function for: Transform
    -def unload_audio_stream(stream: AudioStream) -> None
    -# Unload audio stream and free memory
    -def unload_codepoints(codepoints: Ptr[libs.c.CInt]) -> None
    -# Unload codepoints data from memory
    -def unload_directory_files(files: FilePathList) -> None
    -# Unload filepaths
    -def unload_dropped_files(files: FilePathList) -> None
    -# Unload dropped filepaths
    -def unload_file_data(data: Ptr[libs.c.CUChar]) -> None
    -# Unload file data allocated by LoadFileData()
    -def unload_file_text(text: str) -> None
    -# Unload file text data allocated by LoadFileText()
    -def unload_font(p_font: Font) -> None
    -# Unload font from GPU memory (VRAM)
    -def unload_font_data(chars: Ptr[GlyphInfo], glyph_count: int) -> None
    -# Unload font chars info data (RAM)
    -def unload_image(p_image: Image) -> None
    -# Unload image from CPU memory (RAM)
    -def unload_image_colors(colors: Ptr[Color]) -> None
    -# Unload color data loaded with LoadImageColors()
    -def unload_image_palette(colors: Ptr[Color]) -> None
    -# Unload colors palette loaded with LoadImagePalette()
    -def unload_material(material: Material) -> None
    -# Unload material from GPU memory (VRAM)
    -def unload_mesh(mesh: Mesh) -> None
    -# Unload mesh data from CPU and GPU
    -def unload_model(model: Model) -> None
    -# Unload model (including meshes) from memory (RAM and/or VRAM)
    -def unload_model_animation(anim: ModelAnimation) -> None
    -# Unload animation data
    -def unload_model_animations(animations: Ptr[ModelAnimation], count: u32) -> None
    -# Unload animation array data
    -def unload_music_stream(p_music: Music) -> None
    -# Unload music stream
    -def unload_render_texture(target: RenderTexture2D) -> None
    -# Unload render texture from GPU memory (VRAM)
    -def unload_shader(shader: Shader) -> None
    -# Unload shader from GPU memory (VRAM)
    -def unload_sound(p_sound: Sound) -> None
    -# Unload sound
    -def unload_texture(p_texture: Texture2D) -> None
    -# Unload texture from GPU memory (VRAM)
    -def unload_utf8(text: str) -> None
    -# Unload UTF-8 text encoded from codepoints array
    -def unload_vr_stereo_config(config: VrStereoConfig) -> None
    -# Unload VR stereo config
    -def unload_wave(p_wave: Wave) -> None
    -# Unload wave data
    -def unload_wave_samples(samples: Ptr[libs.c.CFloat]) -> None
    -# Unload samples data loaded with LoadWaveSamples()
    -def update_audio_stream(stream: AudioStream, data: AnyPtrToConst, frame_count: int) -> None
    -# Update audio stream buffers with data
    -def update_camera(p_camera: Ptr[Camera], mode: int) -> None
    -# Update camera position for selected mode
    -def update_camera_pro(p_camera: Ptr[Camera], movement: Vector3, rotation: Vector3, zoom: float) -> None
    -# Update camera movement/rotation
    -def update_mesh_buffer(mesh: Mesh, index: int, data: AnyPtrToConst, data_size: int, offset: int) -> None
    -# Update mesh vertex data in GPU for a specific buffer index
    -def update_model_animation(model: Model, anim: ModelAnimation, frame: int) -> None
    -# Update model animation pose
    -def update_music_stream(p_music: Music) -> None
    -# Updates buffers for music streaming
    -def update_sound(p_sound: Sound, data: AnyPtrToConst, sample_count: int) -> None
    -# Update sound buffer with new data
    -def update_texture(p_texture: Texture2D, pixels: AnyPtrToConst) -> None
    -# Update GPU texture with new data
    -def update_texture_rec(p_texture: Texture2D, rec: Rectangle, pixels: AnyPtrToConst) -> None
    -# Update GPU texture rectangle with new data
    -def upload_mesh(mesh: Ptr[Mesh], dynamic: bool) -> None
    -# Upload mesh vertex data in GPU and provide VAO/VBO ids
    -def vector2(x: float, y: float) -> Vector2
    -# Factory function for: Vector2
    -def vector3(x: float, y: float, z: float) -> Vector3
    -# Factory function for: Vector3
    -def vector4(x: float, y: float, z: float, w: float) -> Vector4
    -# Factory function for: Vector4
    -def wait_time(seconds: f64) -> None
    -# Wait for some time (halt program execution)
    -def wave(frame_count: u32, sample_rate: u32, sample_size: u32, channels: u32, data: AnyPtr) -> Wave
    -# Factory function for: Wave
    -def wave_copy(p_wave: Wave) -> Wave
    -# Copy a wave to a new wave
    -def wave_crop(p_wave: Ptr[Wave], init_sample: int, final_sample: int) -> None
    -# Crop a wave to defined samples range
    -def wave_format(p_wave: Ptr[Wave], sample_rate: int, sample_size: int, channels: int) -> None
    -# Convert wave data to desired format
    -def window_should_close() -> bool
    -# Check if KEY_ESCAPE pressed or Close icon pressed
    -

    2.2 raylib.gl

    RL_ATTACHMENT_COLOR_CHANNEL0: Const[int]
    -# Framebuffer attachment type: color 0
    -RL_ATTACHMENT_COLOR_CHANNEL1: Const[int]
    -# Framebuffer attachment type: color 1
    -RL_ATTACHMENT_COLOR_CHANNEL2: Const[int]
    -# Framebuffer attachment type: color 2
    -RL_ATTACHMENT_COLOR_CHANNEL3: Const[int]
    -# Framebuffer attachment type: color 3
    -RL_ATTACHMENT_COLOR_CHANNEL4: Const[int]
    -# Framebuffer attachment type: color 4
    -RL_ATTACHMENT_COLOR_CHANNEL5: Const[int]
    -# Framebuffer attachment type: color 5
    -RL_ATTACHMENT_COLOR_CHANNEL6: Const[int]
    -# Framebuffer attachment type: color 6
    -RL_ATTACHMENT_COLOR_CHANNEL7: Const[int]
    -# Framebuffer attachment type: color 7
    -RL_ATTACHMENT_CUBEMAP_NEGATIVE_X: Const[int]
    -# Framebuffer texture attachment type: cubemap, -X side
    -RL_ATTACHMENT_CUBEMAP_NEGATIVE_Y: Const[int]
    -# Framebuffer texture attachment type: cubemap, -Y side
    -RL_ATTACHMENT_CUBEMAP_NEGATIVE_Z: Const[int]
    -# Framebuffer texture attachment type: cubemap, -Z side
    -RL_ATTACHMENT_CUBEMAP_POSITIVE_X: Const[int]
    -# Framebuffer texture attachment type: cubemap, +X side
    -RL_ATTACHMENT_CUBEMAP_POSITIVE_Y: Const[int]
    -# Framebuffer texture attachment type: cubemap, +Y side
    -RL_ATTACHMENT_CUBEMAP_POSITIVE_Z: Const[int]
    -# Framebuffer texture attachment type: cubemap, +Z side
    -RL_ATTACHMENT_DEPTH: Const[int]
    -# Framebuffer attachment type: depth
    -RL_ATTACHMENT_RENDERBUFFER: Const[int]
    -# Framebuffer texture attachment type: renderbuffer
    -RL_ATTACHMENT_STENCIL: Const[int]
    -# Framebuffer attachment type: stencil
    -RL_ATTACHMENT_TEXTURE2D: Const[int]
    -# Framebuffer texture attachment type: texture2d
    -RL_BLEND_ADDITIVE: Const[int]
    -# Blend textures adding colors
    -RL_BLEND_ADD_COLORS: Const[int]
    -# Blend textures adding colors (alternative)
    -RL_BLEND_ALPHA: Const[int]
    -# Blend textures considering alpha (default)
    -RL_BLEND_ALPHA_PREMULTIPLY: Const[int]
    -# Blend premultiplied textures considering alpha
    -RL_BLEND_CUSTOM: Const[int]
    -# Blend textures using custom src/dst factors (use rlSetBlendFactors())
    -RL_BLEND_CUSTOM_SEPARATE: Const[int]
    -# Blend textures using custom src/dst factors (use rlSetBlendFactorsSeparate())
    -RL_BLEND_MULTIPLIED: Const[int]
    -# Blend textures multiplying colors
    -RL_BLEND_SUBTRACT_COLORS: Const[int]
    -# Blend textures subtracting colors (alternative)
    -RL_CULL_FACE_BACK: Const[int]
    -RL_CULL_FACE_FRONT: Const[int]
    -RL_LOG_ALL: Const[int]
    -# Display all logs
    -RL_LOG_DEBUG: Const[int]
    -# Debug logging, used for internal debugging, it should be disabled on release builds
    -RL_LOG_ERROR: Const[int]
    -# Error logging, used on unrecoverable failures
    -RL_LOG_FATAL: Const[int]
    -# Fatal logging, used to abort program: exit(EXIT_FAILURE)
    -RL_LOG_INFO: Const[int]
    -# Info logging, used for program execution info
    -RL_LOG_NONE: Const[int]
    -# Disable logging
    -RL_LOG_TRACE: Const[int]
    -# Trace logging, intended for internal use only
    -RL_LOG_WARNING: Const[int]
    -# Warning logging, used on recoverable failures
    -RL_OPENGL_11: Const[int]
    -# OpenGL 1.1
    -RL_OPENGL_21: Const[int]
    -# OpenGL 2.1 (GLSL 120)
    -RL_OPENGL_33: Const[int]
    -# OpenGL 3.3 (GLSL 330)
    -RL_OPENGL_43: Const[int]
    -# OpenGL 4.3 (using GLSL 330)
    -RL_OPENGL_ES_20: Const[int]
    -# OpenGL ES 2.0 (GLSL 100)
    -RL_PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA: Const[int]
    -# 8 bpp
    -RL_PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA: Const[int]
    -# 2 bpp
    -RL_PIXELFORMAT_COMPRESSED_DXT1_RGB: Const[int]
    -# 4 bpp (no alpha)
    -RL_PIXELFORMAT_COMPRESSED_DXT1_RGBA: Const[int]
    -# 4 bpp (1 bit alpha)
    -RL_PIXELFORMAT_COMPRESSED_DXT3_RGBA: Const[int]
    -# 8 bpp
    -RL_PIXELFORMAT_COMPRESSED_DXT5_RGBA: Const[int]
    -# 8 bpp
    -RL_PIXELFORMAT_COMPRESSED_ETC1_RGB: Const[int]
    -# 4 bpp
    -RL_PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA: Const[int]
    -# 8 bpp
    -RL_PIXELFORMAT_COMPRESSED_ETC2_RGB: Const[int]
    -# 4 bpp
    -RL_PIXELFORMAT_COMPRESSED_PVRT_RGB: Const[int]
    -# 4 bpp
    -RL_PIXELFORMAT_COMPRESSED_PVRT_RGBA: Const[int]
    -# 4 bpp
    -RL_PIXELFORMAT_UNCOMPRESSED_GRAYSCALE: Const[int]
    -# 8 bit per pixel (no alpha)
    -RL_PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA: Const[int]
    -# 8*2 bpp (2 channels)
    -RL_PIXELFORMAT_UNCOMPRESSED_R32: Const[int]
    -# 32 bpp (1 channel - float)
    -RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32: Const[int]
    -# 32*3 bpp (3 channels - float)
    -RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32: Const[int]
    -# 32*4 bpp (4 channels - float)
    -RL_PIXELFORMAT_UNCOMPRESSED_R4G4B4A4: Const[int]
    -# 16 bpp (4 bit alpha)
    -RL_PIXELFORMAT_UNCOMPRESSED_R5G5B5A1: Const[int]
    -# 16 bpp (1 bit alpha)
    -RL_PIXELFORMAT_UNCOMPRESSED_R5G6B5: Const[int]
    -# 16 bpp
    -RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8: Const[int]
    -# 24 bpp
    -RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8A8: Const[int]
    -# 32 bpp
    -RL_SHADER_ATTRIB_FLOAT: Const[int]
    -# Shader attribute type: float
    -RL_SHADER_ATTRIB_VEC2: Const[int]
    -# Shader attribute type: vec2 (2 float)
    -RL_SHADER_ATTRIB_VEC3: Const[int]
    -# Shader attribute type: vec3 (3 float)
    -RL_SHADER_ATTRIB_VEC4: Const[int]
    -# Shader attribute type: vec4 (4 float)
    -RL_SHADER_LOC_COLOR_AMBIENT: Const[int]
    -# Shader location: vector uniform: ambient color
    -RL_SHADER_LOC_COLOR_DIFFUSE: Const[int]
    -# Shader location: vector uniform: diffuse color
    -RL_SHADER_LOC_COLOR_SPECULAR: Const[int]
    -# Shader location: vector uniform: specular color
    -RL_SHADER_LOC_MAP_ALBEDO: Const[int]
    -# Shader location: sampler2d texture: albedo (same as: RL_SHADER_LOC_MAP_DIFFUSE)
    -RL_SHADER_LOC_MAP_BRDF: Const[int]
    -# Shader location: sampler2d texture: brdf
    -RL_SHADER_LOC_MAP_CUBEMAP: Const[int]
    -# Shader location: samplerCube texture: cubemap
    -RL_SHADER_LOC_MAP_EMISSION: Const[int]
    -# Shader location: sampler2d texture: emission
    -RL_SHADER_LOC_MAP_HEIGHT: Const[int]
    -# Shader location: sampler2d texture: height
    -RL_SHADER_LOC_MAP_IRRADIANCE: Const[int]
    -# Shader location: samplerCube texture: irradiance
    -RL_SHADER_LOC_MAP_METALNESS: Const[int]
    -# Shader location: sampler2d texture: metalness (same as: RL_SHADER_LOC_MAP_SPECULAR)
    -RL_SHADER_LOC_MAP_NORMAL: Const[int]
    -# Shader location: sampler2d texture: normal
    -RL_SHADER_LOC_MAP_OCCLUSION: Const[int]
    -# Shader location: sampler2d texture: occlusion
    -RL_SHADER_LOC_MAP_PREFILTER: Const[int]
    -# Shader location: samplerCube texture: prefilter
    -RL_SHADER_LOC_MAP_ROUGHNESS: Const[int]
    -# Shader location: sampler2d texture: roughness
    -RL_SHADER_LOC_MATRIX_MODEL: Const[int]
    -# Shader location: matrix uniform: model (transform)
    -RL_SHADER_LOC_MATRIX_MVP: Const[int]
    -# Shader location: matrix uniform: model-view-projection
    -RL_SHADER_LOC_MATRIX_NORMAL: Const[int]
    -# Shader location: matrix uniform: normal
    -RL_SHADER_LOC_MATRIX_PROJECTION: Const[int]
    -# Shader location: matrix uniform: projection
    -RL_SHADER_LOC_MATRIX_VIEW: Const[int]
    -# Shader location: matrix uniform: view (camera transform)
    -RL_SHADER_LOC_VECTOR_VIEW: Const[int]
    -# Shader location: vector uniform: view
    -RL_SHADER_LOC_VERTEX_COLOR: Const[int]
    -# Shader location: vertex attribute: color
    -RL_SHADER_LOC_VERTEX_NORMAL: Const[int]
    -# Shader location: vertex attribute: normal
    -RL_SHADER_LOC_VERTEX_POSITION: Const[int]
    -# Shader location: vertex attribute: position
    -RL_SHADER_LOC_VERTEX_TANGENT: Const[int]
    -# Shader location: vertex attribute: tangent
    -RL_SHADER_LOC_VERTEX_TEXCOORD01: Const[int]
    -# Shader location: vertex attribute: texcoord01
    -RL_SHADER_LOC_VERTEX_TEXCOORD02: Const[int]
    -# Shader location: vertex attribute: texcoord02
    -RL_SHADER_UNIFORM_FLOAT: Const[int]
    -# Shader uniform type: float
    -RL_SHADER_UNIFORM_INT: Const[int]
    -# Shader uniform type: int
    -RL_SHADER_UNIFORM_IVEC2: Const[int]
    -# Shader uniform type: ivec2 (2 int)
    -RL_SHADER_UNIFORM_IVEC3: Const[int]
    -# Shader uniform type: ivec3 (3 int)
    -RL_SHADER_UNIFORM_IVEC4: Const[int]
    -# Shader uniform type: ivec4 (4 int)
    -RL_SHADER_UNIFORM_SAMPLER2D: Const[int]
    -# Shader uniform type: sampler2d
    -RL_SHADER_UNIFORM_VEC2: Const[int]
    -# Shader uniform type: vec2 (2 float)
    -RL_SHADER_UNIFORM_VEC3: Const[int]
    -# Shader uniform type: vec3 (3 float)
    -RL_SHADER_UNIFORM_VEC4: Const[int]
    -# Shader uniform type: vec4 (4 float)
    -RL_TEXTURE_FILTER_ANISOTROPIC_16X: Const[int]
    -# Anisotropic filtering 16x
    -RL_TEXTURE_FILTER_ANISOTROPIC_4X: Const[int]
    -# Anisotropic filtering 4x
    -RL_TEXTURE_FILTER_ANISOTROPIC_8X: Const[int]
    -# Anisotropic filtering 8x
    -RL_TEXTURE_FILTER_BILINEAR: Const[int]
    -# Linear filtering
    -RL_TEXTURE_FILTER_POINT: Const[int]
    -# No filter, just pixel approximation
    -RL_TEXTURE_FILTER_TRILINEAR: Const[int]
    -# Trilinear filtering (linear with mipmaps)
    -class rlDrawCall
    -# of those state-change happens (this is done in core module):
    -    mode: libs.c.CInt
    -    vertexCount: libs.c.CInt
    -    vertexAlignment: libs.c.CInt
    -    textureId: libs.c.CUInt
    -class rlRenderBatch
    -# rlRenderBatch type:
    -    bufferCount: libs.c.CInt
    -    currentBuffer: libs.c.CInt
    -    vertexBuffer: Ptr[raylib.rlVertexBuffer]
    -    draws: Ptr[raylib.rlDrawCall]
    -    drawCounter: libs.c.CInt
    -    currentDepth: float
    -class rlVertexBuffer
    -# Dynamic vertex buffers (position + texcoords + colors + indices arrays)
    -class rlglData
    -def rl_active_draw_buffers(count: int) -> None
    -# Activate multiple draw color buffers
    -def rl_active_texture_slot(slot: int) -> None
    -# Select and active a texture slot
    -def rl_begin(mode: int) -> None
    -# Initialize drawing mode (how to organize vertex)
    -def rl_bind_image_texture(id: u32, index: u32, format: int, readonly: bool) -> None
    -# Bind image texture
    -def rl_bind_shader_buffer(id: u32, index: u32) -> None
    -# Bind SSBO buffer
    -def rl_check_errors() -> None
    -# Check and log OpenGL error codes
    -def rl_check_render_batch_limit(v_count: int) -> bool
    -# Check internal buffer overflow for a given number of vertex
    -def rl_clear_color(r: int, g: int, b: int, a: int) -> None
    -# Clear color buffer with color
    -def rl_clear_screen_buffers() -> None
    -# Clear used screen buffers (color and depth)
    -def rl_color3f(x: float, y: float, z: float) -> None
    -# Define one vertex (color) - 3 float
    -def rl_color4f(x: float, y: float, z: float, w: float) -> None
    -# Define one vertex (color) - 4 float
    -def rl_color4ub(r: int, g: int, b: int, a: int) -> None
    -# Define one vertex (color) - 4 byte
    -def rl_compile_shader(shader_code: str, type: int) -> u32
    -# Compile custom shader and return shader id (type: RL_VERTEX_SHADER, RL_FRAGMENT_SHADER, RL_COMPUTE_SHADER)
    -def rl_compute_shader_dispatch(group_x: u32, group_y: u32, group_z: u32) -> None
    -# Dispatch compute shader (equivalent to *draw* for graphics pipeline)
    -def rl_copy_shader_buffer(dest_id: u32, src_id: u32, dest_offset: u32, src_offset: u32, count: u32) -> None
    -# Copy SSBO data between buffers
    -def rl_cubemap_parameters(id: u32, param: int, value: int) -> None
    -# Set cubemap parameters (filter, wrap)
    -def rl_disable_backface_culling() -> None
    -# Disable backface culling
    -def rl_disable_color_blend() -> None
    -# Disable color blending
    -def rl_disable_depth_mask() -> None
    -# Disable depth write
    -def rl_disable_depth_test() -> None
    -# Disable depth test
    -def rl_disable_framebuffer() -> None
    -# Disable render texture (fbo), return to default framebuffer
    -def rl_disable_scissor_test() -> None
    -# Disable scissor test
    -def rl_disable_shader() -> None
    -# Disable shader program
    -def rl_disable_smooth_lines() -> None
    -# Disable line aliasing
    -def rl_disable_state_pointer(vertex_attrib_type: int) -> None
    -# Disable attribute state pointer
    -def rl_disable_stereo_render() -> None
    -# Disable stereo rendering
    -def rl_disable_texture() -> None
    -# Disable texture
    -def rl_disable_texture_cubemap() -> None
    -# Disable texture cubemap
    -def rl_disable_vertex_array() -> None
    -# Disable vertex array (VAO, if supported)
    -def rl_disable_vertex_attribute(index: u32) -> None
    -# Disable vertex attribute index
    -def rl_disable_vertex_buffer() -> None
    -# Disable vertex buffer (VBO)
    -def rl_disable_vertex_buffer_element() -> None
    -# Disable vertex buffer element (VBO element)
    -def rl_disable_wire_mode() -> None
    -# Disable wire mode
    -def rl_draw_call(mode: int, vertex_count: int, vertex_alignment: int, texture_id: u32) -> rlDrawCall
    -# Factory function for: rlDrawCall
    -def rl_draw_render_batch(batch: Ptr[raylib.rlRenderBatch]) -> None
    -# Draw render batch data (Update->Draw->Reset)
    -def rl_draw_render_batch_active() -> None
    -# Update and draw internal render batch
    -def rl_draw_vertex_array(offset: int, count: int) -> None
    -def rl_draw_vertex_array_elements(offset: int, count: int, buffer: AnyPtrToConst) -> None
    -def rl_draw_vertex_array_elements_instanced(offset: int, count: int, buffer: AnyPtrToConst, instances: int) -> None
    -def rl_draw_vertex_array_instanced(offset: int, count: int, instances: int) -> None
    -def rl_enable_backface_culling() -> None
    -# Enable backface culling
    -def rl_enable_color_blend() -> None
    -# Enable color blending
    -def rl_enable_depth_mask() -> None
    -# Enable depth write
    -def rl_enable_depth_test() -> None
    -# Enable depth test
    -def rl_enable_framebuffer(id: u32) -> None
    -# Enable render texture (fbo)
    -def rl_enable_scissor_test() -> None
    -# Enable scissor test
    -def rl_enable_shader(id: u32) -> None
    -# Enable shader program
    -def rl_enable_smooth_lines() -> None
    -# Enable line aliasing
    -def rl_enable_state_pointer(vertex_attrib_type: int, buffer: AnyPtr) -> None
    -# Enable attribute state pointer
    -def rl_enable_stereo_render() -> None
    -# Enable stereo rendering
    -def rl_enable_texture(id: u32) -> None
    -# Enable texture
    -def rl_enable_texture_cubemap(id: u32) -> None
    -# Enable texture cubemap
    -def rl_enable_vertex_array(vao_id: u32) -> bool
    -# Enable vertex array (VAO, if supported)
    -def rl_enable_vertex_attribute(index: u32) -> None
    -# Enable vertex attribute index
    -def rl_enable_vertex_buffer(id: u32) -> None
    -# Enable vertex buffer (VBO)
    -def rl_enable_vertex_buffer_element(id: u32) -> None
    -# Enable vertex buffer element (VBO element)
    -def rl_enable_wire_mode() -> None
    -# Enable wire mode
    -def rl_end() -> None
    -# Finish vertex providing
    -def rl_framebuffer_attach(fbo_id: u32, tex_id: u32, attach_type: int, tex_type: int, mip_level: int) -> None
    -# Attach texture/renderbuffer to a framebuffer
    -def rl_framebuffer_complete(id: u32) -> bool
    -# Verify framebuffer is complete
    -def rl_frustum(left: f64, right: f64, bottom: f64, top: f64, znear: f64, zfar: f64) -> None
    -def rl_gen_texture_mipmaps(id: u32, width: int, height: int, format: int, mipmaps: Ptr[libs.c.CInt]) -> None
    -# Generate mipmap data for selected texture
    -def rl_get_framebuffer_height() -> int
    -# Get default framebuffer height
    -def rl_get_framebuffer_width() -> int
    -# Get default framebuffer width
    -def rl_get_gl_texture_formats(format: int, gl_internal_format: Ptr[libs.c.CUInt], gl_format: Ptr[libs.c.CUInt], gl_type: Ptr[libs.c.CUInt]) -> None
    -# Get OpenGL internal formats
    -def rl_get_line_width() -> float
    -# Get the line drawing width
    -def rl_get_location_attrib(shader_id: u32, attrib_name: str) -> int
    -# Get shader location attribute
    -def rl_get_location_uniform(shader_id: u32, uniform_name: str) -> int
    -# Get shader location uniform
    -def rl_get_matrix_modelview() -> raylib.Matrix
    -# Get internal modelview matrix
    -def rl_get_matrix_projection() -> raylib.Matrix
    -# Get internal projection matrix
    -def rl_get_matrix_projection_stereo(eye: int) -> raylib.Matrix
    -# Get internal projection matrix for stereo render (selected eye)
    -def rl_get_matrix_transform() -> raylib.Matrix
    -# Get internal accumulated transform matrix
    -def rl_get_matrix_view_offset_stereo(eye: int) -> raylib.Matrix
    -# Get internal view offset matrix for stereo render (selected eye)
    -def rl_get_pixel_format_name(format: u32) -> Ptr[Const[libs.c.CChar]]
    -# Get name string for pixel format
    -def rl_get_shader_buffer_size(id: u32) -> u32
    -# Get SSBO buffer size
    -def rl_get_shader_id_default() -> u32
    -# Get default shader id
    -def rl_get_shader_locs_default() -> Ptr[libs.c.CInt]
    -# Get default shader locations
    -def rl_get_texture_id_default() -> u32
    -# Get default texture id
    -def rl_get_version() -> int
    -# Get current OpenGL version
    -def rl_is_stereo_render_enabled() -> bool
    -# Check if stereo render is enabled
    -def rl_load_compute_shader_program(shader_id: u32) -> u32
    -# Load compute shader program
    -def rl_load_draw_cube() -> None
    -# Load and draw a cube
    -def rl_load_draw_quad() -> None
    -# Load and draw a quad
    -def rl_load_extensions(loader: AnyPtr) -> None
    -# Load OpenGL extensions (loader function required)
    -def rl_load_framebuffer(width: int, height: int) -> u32
    -# Load an empty framebuffer
    -def rl_load_identity() -> None
    -# Reset current matrix to identity matrix
    -def rl_load_render_batch(num_buffers: int, buffer_elements: int) -> raylib.rlRenderBatch
    -# Load a render batch system
    -def rl_load_shader_buffer(size: u32, data: AnyPtrToConst, usage_hint: int) -> u32
    -# Load shader storage buffer object (SSBO)
    -def rl_load_shader_code(vs_code: str, fs_code: str) -> u32
    -# Load shader from code strings
    -def rl_load_shader_program(v_shader_id: u32, f_shader_id: u32) -> u32
    -# Load custom shader program
    -def rl_load_texture(data: AnyPtrToConst, width: int, height: int, format: int, mipmap_count: int) -> u32
    -# Load texture in GPU
    -def rl_load_texture_cubemap(data: AnyPtrToConst, size: int, format: int) -> u32
    -# Load texture cubemap
    -def rl_load_texture_depth(width: int, height: int, use_render_buffer: bool) -> u32
    -# Load depth texture/renderbuffer (to be attached to fbo)
    -def rl_load_vertex_array() -> u32
    -# Load vertex array (vao) if supported
    -def rl_load_vertex_buffer(buffer: AnyPtrToConst, size: int, dynamic: bool) -> u32
    -# Load a vertex buffer attribute
    -def rl_load_vertex_buffer_element(buffer: AnyPtrToConst, size: int, dynamic: bool) -> u32
    -# Load a new attributes element buffer
    -def rl_matrix_mode(mode: int) -> None
    -# Choose the current matrix to be transformed
    -def rl_normal3f(x: float, y: float, z: float) -> None
    -# Define one vertex (normal) - 3 float
    -def rl_ortho(left: f64, right: f64, bottom: f64, top: f64, znear: f64, zfar: f64) -> None
    -def rl_pop_matrix() -> None
    -# Pop latest inserted matrix from stack
    -def rl_push_matrix() -> None
    -# Push the current matrix to stack
    -def rl_read_screen_pixels(width: int, height: int) -> Ptr[libs.c.CUChar]
    -# Read screen pixel data (color buffer)
    -def rl_read_shader_buffer(id: u32, dest: AnyPtr, count: u32, offset: u32) -> None
    -# Read SSBO buffer data (GPU->CPU)
    -def rl_read_texture_pixels(id: u32, width: int, height: int, format: int) -> AnyPtr
    -# Read texture pixel data
    -def rl_render_batch(buffer_count: int, current_buffer: int, vertex_buffer: Ptr[raylib.rlVertexBuffer], draws: Ptr[raylib.rlDrawCall], draw_counter: int, current_depth: float) -> rlRenderBatch
    -# Factory function for: rlRenderBatch
    -def rl_rotatef(angle: float, x: float, y: float, z: float) -> None
    -# Multiply the current matrix by a rotation matrix
    -def rl_scalef(x: float, y: float, z: float) -> None
    -# Multiply the current matrix by a scaling matrix
    -def rl_scissor(x: int, y: int, width: int, height: int) -> None
    -# Scissor test
    -def rl_set_blend_factors(gl_src_factor: int, gl_dst_factor: int, gl_equation: int) -> None
    -# Set blending mode factor and equation (using OpenGL factors)
    -def rl_set_blend_factors_separate(gl_src_rgb: int, gl_dst_rgb: int, gl_src_alpha: int, gl_dst_alpha: int, gl_eq_rgb: int, gl_eq_alpha: int) -> None
    -# Set blending mode factors and equations separately (using OpenGL factors)
    -def rl_set_blend_mode(mode: int) -> None
    -# Set blending mode
    -def rl_set_cull_face(mode: int) -> None
    -# Set face culling mode
    -def rl_set_framebuffer_height(height: int) -> None
    -# Set current framebuffer height
    -def rl_set_framebuffer_width(width: int) -> None
    -# Set current framebuffer width
    -def rl_set_line_width(width: float) -> None
    -# Set the line drawing width
    -def rl_set_matrix_modelview(view: raylib.Matrix) -> None
    -# Set a custom modelview matrix (replaces internal modelview matrix)
    -def rl_set_matrix_projection(proj: raylib.Matrix) -> None
    -# Set a custom projection matrix (replaces internal projection matrix)
    -def rl_set_matrix_projection_stereo(right: raylib.Matrix, left: raylib.Matrix) -> None
    -# Set eyes projection matrices for stereo rendering
    -def rl_set_matrix_view_offset_stereo(right: raylib.Matrix, left: raylib.Matrix) -> None
    -# Set eyes view offsets matrices for stereo rendering
    -def rl_set_render_batch_active(batch: Ptr[raylib.rlRenderBatch]) -> None
    -# Set the active render batch for rlgl (NULL for default internal)
    -def rl_set_shader(id: u32, locs: Ptr[libs.c.CInt]) -> None
    -# Set shader currently active (id and locations)
    -def rl_set_texture(id: u32) -> None
    -# Set current texture for render batch and check buffers limits
    -def rl_set_uniform(loc_index: int, value: AnyPtrToConst, uniform_type: int, count: int) -> None
    -# Set shader value uniform
    -def rl_set_uniform_matrix(loc_index: int, mat: raylib.Matrix) -> None
    -# Set shader value matrix
    -def rl_set_uniform_sampler(loc_index: int, texture_id: u32) -> None
    -# Set shader value sampler
    -def rl_set_vertex_attribute(index: u32, comp_size: int, type: int, normalized: bool, stride: int, pointer: AnyPtrToConst) -> None
    -def rl_set_vertex_attribute_default(loc_index: int, value: AnyPtrToConst, attrib_type: int, count: int) -> None
    -# Set vertex attribute default value
    -def rl_set_vertex_attribute_divisor(index: u32, divisor: int) -> None
    -def rl_tex_coord2f(x: float, y: float) -> None
    -# Define one vertex (texture coordinate) - 2 float
    -def rl_texture_parameters(id: u32, param: int, value: int) -> None
    -# Set texture parameters (filter, wrap)
    -def rl_translatef(x: float, y: float, z: float) -> None
    -# Multiply the current matrix by a translation matrix
    -def rl_unload_framebuffer(id: u32) -> None
    -# Delete framebuffer from GPU
    -def rl_unload_render_batch(batch: raylib.rlRenderBatch) -> None
    -# Unload render batch system
    -def rl_unload_shader_buffer(ssbo_id: u32) -> None
    -# Unload shader storage buffer object (SSBO)
    -def rl_unload_shader_program(id: u32) -> None
    -# Unload shader program
    -def rl_unload_texture(id: u32) -> None
    -# Unload texture from GPU memory
    -def rl_unload_vertex_array(vao_id: u32) -> None
    -def rl_unload_vertex_buffer(vbo_id: u32) -> None
    -def rl_update_shader_buffer(id: u32, data: AnyPtrToConst, data_size: u32, offset: u32) -> None
    -# Update SSBO buffer data
    -def rl_update_texture(id: u32, offset_x: int, offset_y: int, width: int, height: int, format: int, data: AnyPtrToConst) -> None
    -# Update GPU texture with new data
    -def rl_update_vertex_buffer(buffer_id: u32, data: AnyPtrToConst, data_size: int, offset: int) -> None
    -# Update GPU buffer with new data
    -def rl_update_vertex_buffer_elements(id: u32, data: AnyPtrToConst, data_size: int, offset: int) -> None
    -# Update vertex buffer elements with new data
    -def rl_vertex2f(x: float, y: float) -> None
    -# Define one vertex (position) - 2 float
    -def rl_vertex2i(x: int, y: int) -> None
    -# Define one vertex (position) - 2 int
    -def rl_vertex3f(x: float, y: float, z: float) -> None
    -# Define one vertex (position) - 3 float
    -def rl_viewport(x: int, y: int, width: int, height: int) -> None
    -# Set the viewport area
    -def rlgl_close() -> None
    -# De-initialize rlgl (buffers, shaders, textures)
    -def rlgl_init(width: int, height: int) -> None
    -# Initialize rlgl (buffers, shaders, textures, states)
    -

    2.3 raylib.gui

    ARROWS_SIZE: Const[int]
    -ARROWS_VISIBLE: Const[int]
    -ARROW_PADDING: Const[int]
    -# DropdownBox arrow separation from border and items
    -BACKGROUND_COLOR: Const[int]
    -# Background color
    -BASE_COLOR_DISABLED: Const[int]
    -BASE_COLOR_FOCUSED: Const[int]
    -BASE_COLOR_NORMAL: Const[int]
    -BASE_COLOR_PRESSED: Const[int]
    -BORDER_COLOR_DISABLED: Const[int]
    -BORDER_COLOR_FOCUSED: Const[int]
    -BORDER_COLOR_NORMAL: Const[int]
    -BORDER_COLOR_PRESSED: Const[int]
    -BORDER_WIDTH: Const[int]
    -BUTTON: Const[int]
    -CHECKBOX: Const[int]
    -CHECK_PADDING: Const[int]
    -# CheckBox internal check padding
    -COLORPICKER: Const[int]
    -COLOR_SELECTOR_SIZE: Const[int]
    -COMBOBOX: Const[int]
    -COMBO_BUTTON_SPACING: Const[int]
    -# ComboBox button separation
    -COMBO_BUTTON_WIDTH: Const[int]
    -# ComboBox right button width
    -DEFAULT: Const[int]
    -DROPDOWNBOX: Const[int]
    -DROPDOWN_ITEMS_SPACING: Const[int]
    -# DropdownBox items separation
    -GROUP_PADDING: Const[int]
    -# ToggleGroup separation between toggles
    -HUEBAR_PADDING: Const[int]
    -# ColorPicker right hue bar separation from panel
    -HUEBAR_SELECTOR_HEIGHT: Const[int]
    -# ColorPicker right hue bar selector height
    -HUEBAR_SELECTOR_OVERFLOW: Const[int]
    -# ColorPicker right hue bar selector overflow
    -HUEBAR_WIDTH: Const[int]
    -# ColorPicker right hue bar width
    -ICON_1UP: Const[int]
    -ICON_219: Const[int]
    -ICON_220: Const[int]
    -ICON_221: Const[int]
    -ICON_222: Const[int]
    -ICON_223: Const[int]
    -ICON_224: Const[int]
    -ICON_225: Const[int]
    -ICON_226: Const[int]
    -ICON_227: Const[int]
    -ICON_228: Const[int]
    -ICON_229: Const[int]
    -ICON_230: Const[int]
    -ICON_231: Const[int]
    -ICON_232: Const[int]
    -ICON_233: Const[int]
    -ICON_234: Const[int]
    -ICON_235: Const[int]
    -ICON_236: Const[int]
    -ICON_237: Const[int]
    -ICON_238: Const[int]
    -ICON_239: Const[int]
    -ICON_240: Const[int]
    -ICON_241: Const[int]
    -ICON_242: Const[int]
    -ICON_243: Const[int]
    -ICON_244: Const[int]
    -ICON_245: Const[int]
    -ICON_246: Const[int]
    -ICON_247: Const[int]
    -ICON_248: Const[int]
    -ICON_249: Const[int]
    -ICON_250: Const[int]
    -ICON_251: Const[int]
    -ICON_252: Const[int]
    -ICON_253: Const[int]
    -ICON_254: Const[int]
    -ICON_255: Const[int]
    -ICON_ALARM: Const[int]
    -ICON_ALPHA_CLEAR: Const[int]
    -ICON_ALPHA_MULTIPLY: Const[int]
    -ICON_ARROW_DOWN: Const[int]
    -ICON_ARROW_DOWN_FILL: Const[int]
    -ICON_ARROW_LEFT: Const[int]
    -ICON_ARROW_LEFT_FILL: Const[int]
    -ICON_ARROW_RIGHT: Const[int]
    -ICON_ARROW_RIGHT_FILL: Const[int]
    -ICON_ARROW_UP: Const[int]
    -ICON_ARROW_UP_FILL: Const[int]
    -ICON_AUDIO: Const[int]
    -ICON_BIN: Const[int]
    -ICON_BOX: Const[int]
    -ICON_BOX_BOTTOM: Const[int]
    -ICON_BOX_BOTTOM_LEFT: Const[int]
    -ICON_BOX_BOTTOM_RIGHT: Const[int]
    -ICON_BOX_CENTER: Const[int]
    -ICON_BOX_CIRCLE_MASK: Const[int]
    -ICON_BOX_CONCENTRIC: Const[int]
    -ICON_BOX_CORNERS_BIG: Const[int]
    -ICON_BOX_CORNERS_SMALL: Const[int]
    -ICON_BOX_DOTS_BIG: Const[int]
    -ICON_BOX_DOTS_SMALL: Const[int]
    -ICON_BOX_GRID: Const[int]
    -ICON_BOX_GRID_BIG: Const[int]
    -ICON_BOX_LEFT: Const[int]
    -ICON_BOX_MULTISIZE: Const[int]
    -ICON_BOX_RIGHT: Const[int]
    -ICON_BOX_TOP: Const[int]
    -ICON_BOX_TOP_LEFT: Const[int]
    -ICON_BOX_TOP_RIGHT: Const[int]
    -ICON_BREAKPOINT_OFF: Const[int]
    -ICON_BREAKPOINT_ON: Const[int]
    -ICON_BRUSH_CLASSIC: Const[int]
    -ICON_BRUSH_PAINTER: Const[int]
    -ICON_BURGER_MENU: Const[int]
    -ICON_CAMERA: Const[int]
    -ICON_CASE_SENSITIVE: Const[int]
    -ICON_CLOCK: Const[int]
    -ICON_COIN: Const[int]
    -ICON_COLOR_BUCKET: Const[int]
    -ICON_COLOR_PICKER: Const[int]
    -ICON_CORNER: Const[int]
    -ICON_CPU: Const[int]
    -ICON_CRACK: Const[int]
    -ICON_CRACK_POINTS: Const[int]
    -ICON_CROP: Const[int]
    -ICON_CROP_ALPHA: Const[int]
    -ICON_CROSS: Const[int]
    -ICON_CROSSLINE: Const[int]
    -ICON_CROSS_SMALL: Const[int]
    -ICON_CUBE: Const[int]
    -ICON_CUBE_FACE_BACK: Const[int]
    -ICON_CUBE_FACE_BOTTOM: Const[int]
    -ICON_CUBE_FACE_FRONT: Const[int]
    -ICON_CUBE_FACE_LEFT: Const[int]
    -ICON_CUBE_FACE_RIGHT: Const[int]
    -ICON_CUBE_FACE_TOP: Const[int]
    -ICON_CURSOR_CLASSIC: Const[int]
    -ICON_CURSOR_HAND: Const[int]
    -ICON_CURSOR_MOVE: Const[int]
    -ICON_CURSOR_MOVE_FILL: Const[int]
    -ICON_CURSOR_POINTER: Const[int]
    -ICON_CURSOR_SCALE: Const[int]
    -ICON_CURSOR_SCALE_FILL: Const[int]
    -ICON_CURSOR_SCALE_LEFT: Const[int]
    -ICON_CURSOR_SCALE_LEFT_FILL: Const[int]
    -ICON_CURSOR_SCALE_RIGHT: Const[int]
    -ICON_CURSOR_SCALE_RIGHT_FILL: Const[int]
    -ICON_DEMON: Const[int]
    -ICON_DITHERING: Const[int]
    -ICON_DOOR: Const[int]
    -ICON_EMPTYBOX: Const[int]
    -ICON_EMPTYBOX_SMALL: Const[int]
    -ICON_EXIT: Const[int]
    -ICON_EXPLOSION: Const[int]
    -ICON_EYE_OFF: Const[int]
    -ICON_EYE_ON: Const[int]
    -ICON_FILE: Const[int]
    -ICON_FILETYPE_ALPHA: Const[int]
    -ICON_FILETYPE_AUDIO: Const[int]
    -ICON_FILETYPE_BINARY: Const[int]
    -ICON_FILETYPE_HOME: Const[int]
    -ICON_FILETYPE_IMAGE: Const[int]
    -ICON_FILETYPE_INFO: Const[int]
    -ICON_FILETYPE_PLAY: Const[int]
    -ICON_FILETYPE_TEXT: Const[int]
    -ICON_FILETYPE_VIDEO: Const[int]
    -ICON_FILE_ADD: Const[int]
    -ICON_FILE_COPY: Const[int]
    -ICON_FILE_CUT: Const[int]
    -ICON_FILE_DELETE: Const[int]
    -ICON_FILE_EXPORT: Const[int]
    -ICON_FILE_NEW: Const[int]
    -ICON_FILE_OPEN: Const[int]
    -ICON_FILE_PASTE: Const[int]
    -ICON_FILE_SAVE: Const[int]
    -ICON_FILE_SAVE_CLASSIC: Const[int]
    -ICON_FILTER: Const[int]
    -ICON_FILTER_BILINEAR: Const[int]
    -ICON_FILTER_POINT: Const[int]
    -ICON_FILTER_TOP: Const[int]
    -ICON_FOLDER: Const[int]
    -ICON_FOLDER_ADD: Const[int]
    -ICON_FOLDER_FILE_OPEN: Const[int]
    -ICON_FOLDER_OPEN: Const[int]
    -ICON_FOLDER_SAVE: Const[int]
    -ICON_FOUR_BOXES: Const[int]
    -ICON_FX: Const[int]
    -ICON_GEAR: Const[int]
    -ICON_GEAR_BIG: Const[int]
    -ICON_GEAR_EX: Const[int]
    -ICON_GRID: Const[int]
    -ICON_GRID_FILL: Const[int]
    -ICON_HAND_POINTER: Const[int]
    -ICON_HEART: Const[int]
    -ICON_HELP: Const[int]
    -ICON_HEX: Const[int]
    -ICON_HIDPI: Const[int]
    -ICON_HOUSE: Const[int]
    -ICON_INFO: Const[int]
    -ICON_KEY: Const[int]
    -ICON_LASER: Const[int]
    -ICON_LAYERS: Const[int]
    -ICON_LAYERS_VISIBLE: Const[int]
    -ICON_LENS: Const[int]
    -ICON_LENS_BIG: Const[int]
    -ICON_LIFE_BARS: Const[int]
    -ICON_LINK: Const[int]
    -ICON_LINK_BOXES: Const[int]
    -ICON_LINK_BROKE: Const[int]
    -ICON_LINK_MULTI: Const[int]
    -ICON_LINK_NET: Const[int]
    -ICON_LOCK_CLOSE: Const[int]
    -ICON_LOCK_OPEN: Const[int]
    -ICON_MAGNET: Const[int]
    -ICON_MAILBOX: Const[int]
    -ICON_MIPMAPS: Const[int]
    -ICON_MODE_2D: Const[int]
    -ICON_MODE_3D: Const[int]
    -ICON_MONITOR: Const[int]
    -ICON_MUTATE: Const[int]
    -ICON_MUTATE_FILL: Const[int]
    -ICON_NONE: Const[int]
    -ICON_NOTEBOOK: Const[int]
    -ICON_OK_TICK: Const[int]
    -ICON_PENCIL: Const[int]
    -ICON_PENCIL_BIG: Const[int]
    -ICON_PHOTO_CAMERA: Const[int]
    -ICON_PHOTO_CAMERA_FLASH: Const[int]
    -ICON_PLAYER: Const[int]
    -ICON_PLAYER_JUMP: Const[int]
    -ICON_PLAYER_NEXT: Const[int]
    -ICON_PLAYER_PAUSE: Const[int]
    -ICON_PLAYER_PLAY: Const[int]
    -ICON_PLAYER_PLAY_BACK: Const[int]
    -ICON_PLAYER_PREVIOUS: Const[int]
    -ICON_PLAYER_RECORD: Const[int]
    -ICON_PLAYER_STOP: Const[int]
    -ICON_POT: Const[int]
    -ICON_PRINTER: Const[int]
    -ICON_REDO: Const[int]
    -ICON_REDO_FILL: Const[int]
    -ICON_REG_EXP: Const[int]
    -ICON_REPEAT: Const[int]
    -ICON_REPEAT_FILL: Const[int]
    -ICON_REREDO: Const[int]
    -ICON_REREDO_FILL: Const[int]
    -ICON_RESIZE: Const[int]
    -ICON_RESTART: Const[int]
    -ICON_ROM: Const[int]
    -ICON_ROTATE: Const[int]
    -ICON_ROTATE_FILL: Const[int]
    -ICON_RUBBER: Const[int]
    -ICON_SCALE: Const[int]
    -ICON_SHIELD: Const[int]
    -ICON_SHUFFLE: Const[int]
    -ICON_SHUFFLE_FILL: Const[int]
    -ICON_SPECIAL: Const[int]
    -ICON_SQUARE_TOGGLE: Const[int]
    -ICON_STAR: Const[int]
    -ICON_STEP_INTO: Const[int]
    -ICON_STEP_OUT: Const[int]
    -ICON_STEP_OVER: Const[int]
    -ICON_SUITCASE: Const[int]
    -ICON_SUITCASE_ZIP: Const[int]
    -ICON_SYMMETRY: Const[int]
    -ICON_SYMMETRY_HORIZONTAL: Const[int]
    -ICON_SYMMETRY_VERTICAL: Const[int]
    -ICON_TARGET: Const[int]
    -ICON_TARGET_BIG: Const[int]
    -ICON_TARGET_BIG_FILL: Const[int]
    -ICON_TARGET_MOVE: Const[int]
    -ICON_TARGET_MOVE_FILL: Const[int]
    -ICON_TARGET_POINT: Const[int]
    -ICON_TARGET_SMALL: Const[int]
    -ICON_TARGET_SMALL_FILL: Const[int]
    -ICON_TEXT_A: Const[int]
    -ICON_TEXT_NOTES: Const[int]
    -ICON_TEXT_POPUP: Const[int]
    -ICON_TEXT_T: Const[int]
    -ICON_TOOLS: Const[int]
    -ICON_UNDO: Const[int]
    -ICON_UNDO_FILL: Const[int]
    -ICON_VERTICAL_BARS: Const[int]
    -ICON_VERTICAL_BARS_FILL: Const[int]
    -ICON_WATER_DROP: Const[int]
    -ICON_WAVE: Const[int]
    -ICON_WAVE_SINUS: Const[int]
    -ICON_WAVE_SQUARE: Const[int]
    -ICON_WAVE_TRIANGULAR: Const[int]
    -ICON_WINDOW: Const[int]
    -ICON_ZOOM_ALL: Const[int]
    -ICON_ZOOM_BIG: Const[int]
    -ICON_ZOOM_CENTER: Const[int]
    -ICON_ZOOM_MEDIUM: Const[int]
    -ICON_ZOOM_SMALL: Const[int]
    -LABEL: Const[int]
    -# Used also for: LABELBUTTON
    -LINE_COLOR: Const[int]
    -# Line control color
    -LISTVIEW: Const[int]
    -LIST_ITEMS_HEIGHT: Const[int]
    -# ListView items height
    -LIST_ITEMS_SPACING: Const[int]
    -# ListView items separation
    -PROGRESSBAR: Const[int]
    -PROGRESS_PADDING: Const[int]
    -# ProgressBar internal padding
    -RESERVED: Const[int]
    -SCROLLBAR: Const[int]
    -SCROLLBAR_SIDE: Const[int]
    -# ListView scrollbar side (0-left, 1-right)
    -SCROLLBAR_WIDTH: Const[int]
    -# ListView scrollbar size (usually width)
    -SCROLL_PADDING: Const[int]
    -SCROLL_SLIDER_PADDING: Const[int]
    -# (SLIDERBAR, SLIDER_PADDING)
    -SCROLL_SLIDER_SIZE: Const[int]
    -SCROLL_SPEED: Const[int]
    -SLIDER: Const[int]
    -# Used also for: SLIDERBAR
    -SLIDER_PADDING: Const[int]
    -# Slider/SliderBar internal bar padding
    -SLIDER_WIDTH: Const[int]
    -# Slider size of internal bar
    -SPINNER: Const[int]
    -# Uses: BUTTON, VALUEBOX
    -SPIN_BUTTON_SPACING: Const[int]
    -# Spinner buttons separation
    -SPIN_BUTTON_WIDTH: Const[int]
    -# Spinner left/right buttons width
    -STATE_DISABLED: Const[int]
    -STATE_FOCUSED: Const[int]
    -STATE_NORMAL: Const[int]
    -STATE_PRESSED: Const[int]
    -STATUSBAR: Const[int]
    -TEXTBOX: Const[int]
    -# Used also for: TEXTBOXMULTI
    -TEXT_ALIGNMENT: Const[int]
    -TEXT_ALIGN_CENTER: Const[int]
    -TEXT_ALIGN_LEFT: Const[int]
    -TEXT_ALIGN_RIGHT: Const[int]
    -TEXT_COLOR_DISABLED: Const[int]
    -TEXT_COLOR_FOCUSED: Const[int]
    -TEXT_COLOR_NORMAL: Const[int]
    -TEXT_COLOR_PRESSED: Const[int]
    -TEXT_INNER_PADDING: Const[int]
    -# TextBox/TextBoxMulti/ValueBox/Spinner inner text padding
    -TEXT_LINES_SPACING: Const[int]
    -# TextBoxMulti lines separation
    -TEXT_PADDING: Const[int]
    -TEXT_SIZE: Const[int]
    -# Text size (glyphs max height)
    -TEXT_SPACING: Const[int]
    -# Text spacing between glyphs
    -TOGGLE: Const[int]
    -# Used also for: TOGGLEGROUP
    -VALUEBOX: Const[int]
    -class GuiStyleProp
    -# Style property:
    -    controlId: libs.c.CUShort
    -    propertyId: libs.c.CUShort
    -    propertyValue: libs.c.CUInt
    -def gui_button(bounds: raylib.Rectangle, text: str) -> bool
    -# Button control, returns true when clicked
    -def gui_check_box(bounds: raylib.Rectangle, text: str, checked: bool) -> bool
    -# Check Box control, returns true when active
    -def gui_color_bar_alpha(bounds: raylib.Rectangle, text: str, alpha: float) -> float
    -# Color Bar Alpha control
    -def gui_color_bar_hue(bounds: raylib.Rectangle, text: str, value: float) -> float
    -# Color Bar Hue control
    -def gui_color_panel(bounds: raylib.Rectangle, text: str, p_color: raylib.Color) -> raylib.Color
    -# Color Panel control
    -def gui_color_picker(bounds: raylib.Rectangle, text: str, p_color: raylib.Color) -> raylib.Color
    -# Color Picker control (multiple color controls)
    -def gui_combo_box(bounds: raylib.Rectangle, text: str, active: int) -> int
    -# Combo Box control, returns selected item index
    -def gui_disable() -> None
    -# Disable gui controls (global state)
    -def gui_disable_tooltip() -> None
    -# Disable gui tooltips (global state)
    -def gui_draw_icon(icon_id: int, pos_x: int, pos_y: int, pixel_size: int, p_color: raylib.Color) -> None
    -def gui_dropdown_box(bounds: raylib.Rectangle, text: str, active: Ptr[libs.c.CInt], edit_mode: bool) -> bool
    -# Dropdown Box control, returns selected item
    -def gui_dummy_rec(bounds: raylib.Rectangle, text: str) -> None
    -# Dummy control for placeholders
    -def gui_enable() -> None
    -# Enable gui controls (global state)
    -def gui_enable_tooltip() -> None
    -# Enable gui tooltips (global state)
    -def gui_fade(alpha: float) -> None
    -# Set gui controls alpha (global state), alpha goes from 0.0f to 1.0f
    -def gui_get_font() -> raylib.Font
    -# Get gui custom font (global state)
    -def gui_get_icons() -> Ptr[libs.c.CUInt]
    -# Get raygui icons data pointer
    -def gui_get_state() -> int
    -# Get gui state (global state)
    -def gui_get_style(control: int, property: int) -> int
    -# Get one style property
    -def gui_grid(bounds: raylib.Rectangle, text: str, spacing: float, subdivs: int) -> raylib.Vector2
    -# Grid control, returns mouse cell position
    -def gui_group_box(bounds: raylib.Rectangle, text: str) -> None
    -# Group Box control with text name
    -def gui_icon_text(icon_id: int, text: str) -> Ptr[Const[libs.c.CChar]]
    -# Get text with icon id prepended (if supported)
    -def gui_is_locked() -> bool
    -# Check if gui is locked (global state)
    -def gui_label(bounds: raylib.Rectangle, text: str) -> None
    -# Label control, shows text
    -def gui_label_button(bounds: raylib.Rectangle, text: str) -> bool
    -# Label button control, show true when clicked
    -def gui_line(bounds: raylib.Rectangle, text: str) -> None
    -# Line separator control, could contain text
    -def gui_list_view(bounds: raylib.Rectangle, text: str, scroll_index: Ptr[libs.c.CInt], active: int) -> int
    -# List View control, returns selected list item index
    -def gui_list_view_ex(bounds: raylib.Rectangle, text: Ptr[Ptr[Const[libs.c.CChar]]], count: int, focus: Ptr[libs.c.CInt], scroll_index: Ptr[libs.c.CInt], active: int) -> int
    -# List View with extended parameters
    -def gui_load_icons(file_name: str, load_icons_name: bool) -> Ptr[Ptr[libs.c.CChar]]
    -# Load raygui icons file (.rgi) into internal icons data
    -def gui_load_style(file_name: str) -> None
    -# Load style file over global style variable (.rgs)
    -def gui_load_style_default() -> None
    -# Load style default over global style
    -def gui_lock() -> None
    -# Lock gui controls (global state)
    -def gui_message_box(bounds: raylib.Rectangle, title: str, message: str, buttons: str) -> int
    -# Message Box control, displays a message
    -def gui_panel(bounds: raylib.Rectangle, text: str) -> None
    -# Panel control, useful to group controls
    -def gui_progress_bar(bounds: raylib.Rectangle, text_left: str, text_right: str, value: float, min_value: float, max_value: float) -> float
    -# Progress Bar control, shows current progress value
    -def gui_scroll_panel(bounds: raylib.Rectangle, text: str, content: raylib.Rectangle, scroll: Ptr[raylib.Vector2]) -> raylib.Rectangle
    -# Scroll Panel control
    -def gui_set_font(p_font: raylib.Font) -> None
    -# Set gui custom font (global state)
    -def gui_set_icon_scale(scale: int) -> None
    -# Set icon drawing size
    -def gui_set_state(state: int) -> None
    -# Set gui state (global state)
    -def gui_set_style(control: int, property: int, value: int) -> None
    -# Set one style property
    -def gui_set_tooltip(tooltip: str) -> None
    -# Set tooltip string
    -def gui_slider(bounds: raylib.Rectangle, text_left: str, text_right: str, value: float, min_value: float, max_value: float) -> float
    -# Slider control, returns selected value
    -def gui_slider_bar(bounds: raylib.Rectangle, text_left: str, text_right: str, value: float, min_value: float, max_value: float) -> float
    -# Slider Bar control, returns selected value
    -def gui_spinner(bounds: raylib.Rectangle, text: str, value: Ptr[libs.c.CInt], min_value: int, max_value: int, edit_mode: bool) -> bool
    -# Spinner control, returns selected value
    -def gui_status_bar(bounds: raylib.Rectangle, text: str) -> None
    -# Status Bar control, shows info text
    -def gui_style_prop(control_id: int, property_id: int, property_value: u32) -> GuiStyleProp
    -# Factory function for: GuiStyleProp
    -def gui_tab_bar(bounds: raylib.Rectangle, text: Ptr[Ptr[Const[libs.c.CChar]]], count: int, active: Ptr[libs.c.CInt]) -> int
    -# Tab Bar control, returns TAB to be closed or -1
    -def gui_text_box(bounds: raylib.Rectangle, text: str, text_size: int, edit_mode: bool) -> bool
    -# Text Box control, updates input text
    -def gui_text_box_multi(bounds: raylib.Rectangle, text: str, text_size: int, edit_mode: bool) -> bool
    -# Text Box control with multiple lines
    -def gui_text_input_box(bounds: raylib.Rectangle, title: str, message: str, buttons: str, text: str, text_max_size: int, secret_view_active: Ptr[libs.c.CInt]) -> int
    -# Text Input Box control, ask for text, supports secret
    -def gui_toggle(bounds: raylib.Rectangle, text: str, active: bool) -> bool
    -# Toggle Button control, returns true when active
    -def gui_toggle_group(bounds: raylib.Rectangle, text: str, active: int) -> int
    -# Toggle Group control, returns active toggle index
    -def gui_unlock() -> None
    -# Unlock gui controls (global state)
    -def gui_value_box(bounds: raylib.Rectangle, text: str, value: Ptr[libs.c.CInt], min_value: int, max_value: int, edit_mode: bool) -> bool
    -# Value Box control, updates input text with numbers
    -def gui_window_box(bounds: raylib.Rectangle, title: str) -> bool
    -# Window Box control, shows a window that can be closed
    -

    2.4 raylib.math

    class float16
    -class float3
    -# NOTE: Helper types to be used instead of array return types for *ToFloat functions
    -def clamp(value: float, min: float, max: float) -> float
    -def float_equals(x: float, y: float) -> int
    -def lerp(start: float, end: float, amount: float) -> float
    -def matrix_add(left: raylib.Matrix, right: raylib.Matrix) -> raylib.Matrix
    -def matrix_determinant(mat: raylib.Matrix) -> float
    -def matrix_frustum(left: f64, right: f64, bottom: f64, top: f64, near: f64, far: f64) -> raylib.Matrix
    -def matrix_identity() -> raylib.Matrix
    -def matrix_invert(mat: raylib.Matrix) -> raylib.Matrix
    -def matrix_look_at(eye: raylib.Vector3, target: raylib.Vector3, up: raylib.Vector3) -> raylib.Matrix
    -def matrix_multiply(left: raylib.Matrix, right: raylib.Matrix) -> raylib.Matrix
    -def matrix_ortho(left: f64, right: f64, bottom: f64, top: f64, near: f64, far: f64) -> raylib.Matrix
    -def matrix_perspective(fovy: f64, aspect: f64, near: f64, far: f64) -> raylib.Matrix
    -def matrix_rotate(axis: raylib.Vector3, angle: float) -> raylib.Matrix
    -def matrix_rotate_x(angle: float) -> raylib.Matrix
    -def matrix_rotate_xyz(angle: raylib.Vector3) -> raylib.Matrix
    -def matrix_rotate_y(angle: float) -> raylib.Matrix
    -def matrix_rotate_z(angle: float) -> raylib.Matrix
    -def matrix_rotate_zyx(angle: raylib.Vector3) -> raylib.Matrix
    -def matrix_scale(x: float, y: float, z: float) -> raylib.Matrix
    -def matrix_subtract(left: raylib.Matrix, right: raylib.Matrix) -> raylib.Matrix
    -def matrix_to_float_v(mat: raylib.Matrix) -> raylib.float16
    -def matrix_trace(mat: raylib.Matrix) -> float
    -def matrix_translate(x: float, y: float, z: float) -> raylib.Matrix
    -def matrix_transpose(mat: raylib.Matrix) -> raylib.Matrix
    -def normalize(value: float, start: float, end: float) -> float
    -def quaternion_add(q1: raylib.Quaternion, q2: raylib.Quaternion) -> raylib.Quaternion
    -def quaternion_add_value(q: raylib.Quaternion, add: float) -> raylib.Quaternion
    -def quaternion_divide(q1: raylib.Quaternion, q2: raylib.Quaternion) -> raylib.Quaternion
    -def quaternion_equals(p: raylib.Quaternion, q: raylib.Quaternion) -> int
    -def quaternion_from_axis_angle(axis: raylib.Vector3, angle: float) -> raylib.Quaternion
    -def quaternion_from_euler(pitch: float, yaw: float, roll: float) -> raylib.Quaternion
    -def quaternion_from_matrix(mat: raylib.Matrix) -> raylib.Quaternion
    -def quaternion_from_vector3_to_vector3(p_from: raylib.Vector3, to: raylib.Vector3) -> raylib.Quaternion
    -def quaternion_identity() -> raylib.Quaternion
    -def quaternion_invert(q: raylib.Quaternion) -> raylib.Quaternion
    -def quaternion_length(q: raylib.Quaternion) -> float
    -def quaternion_lerp(q1: raylib.Quaternion, q2: raylib.Quaternion, amount: float) -> raylib.Quaternion
    -def quaternion_multiply(q1: raylib.Quaternion, q2: raylib.Quaternion) -> raylib.Quaternion
    -def quaternion_nlerp(q1: raylib.Quaternion, q2: raylib.Quaternion, amount: float) -> raylib.Quaternion
    -def quaternion_normalize(q: raylib.Quaternion) -> raylib.Quaternion
    -def quaternion_scale(q: raylib.Quaternion, mul: float) -> raylib.Quaternion
    -def quaternion_slerp(q1: raylib.Quaternion, q2: raylib.Quaternion, amount: float) -> raylib.Quaternion
    -def quaternion_subtract(q1: raylib.Quaternion, q2: raylib.Quaternion) -> raylib.Quaternion
    -def quaternion_subtract_value(q: raylib.Quaternion, sub: float) -> raylib.Quaternion
    -def quaternion_to_axis_angle(q: raylib.Quaternion, out_axis: Ptr[raylib.Vector3], out_angle: Ptr[libs.c.CFloat]) -> None
    -def quaternion_to_euler(q: raylib.Quaternion) -> raylib.Vector3
    -def quaternion_to_matrix(q: raylib.Quaternion) -> raylib.Matrix
    -def quaternion_transform(q: raylib.Quaternion, mat: raylib.Matrix) -> raylib.Quaternion
    -def remap(value: float, input_start: float, input_end: float, output_start: float, output_end: float) -> float
    -def vector2_add(v1: raylib.Vector2, v2: raylib.Vector2) -> raylib.Vector2
    -def vector2_add_value(v: raylib.Vector2, add: float) -> raylib.Vector2
    -def vector2_angle(v1: raylib.Vector2, v2: raylib.Vector2) -> float
    -def vector2_clamp(v: raylib.Vector2, min: raylib.Vector2, max: raylib.Vector2) -> raylib.Vector2
    -def vector2_clamp_value(v: raylib.Vector2, min: float, max: float) -> raylib.Vector2
    -def vector2_distance(v1: raylib.Vector2, v2: raylib.Vector2) -> float
    -def vector2_distance_sqr(v1: raylib.Vector2, v2: raylib.Vector2) -> float
    -def vector2_divide(v1: raylib.Vector2, v2: raylib.Vector2) -> raylib.Vector2
    -def vector2_dot_product(v1: raylib.Vector2, v2: raylib.Vector2) -> float
    -def vector2_equals(p: raylib.Vector2, q: raylib.Vector2) -> int
    -def vector2_invert(v: raylib.Vector2) -> raylib.Vector2
    -def vector2_length(v: raylib.Vector2) -> float
    -def vector2_length_sqr(v: raylib.Vector2) -> float
    -def vector2_lerp(v1: raylib.Vector2, v2: raylib.Vector2, amount: float) -> raylib.Vector2
    -def vector2_line_angle(start: raylib.Vector2, end: raylib.Vector2) -> float
    -def vector2_move_towards(v: raylib.Vector2, target: raylib.Vector2, max_distance: float) -> raylib.Vector2
    -def vector2_multiply(v1: raylib.Vector2, v2: raylib.Vector2) -> raylib.Vector2
    -def vector2_negate(v: raylib.Vector2) -> raylib.Vector2
    -def vector2_normalize(v: raylib.Vector2) -> raylib.Vector2
    -def vector2_one() -> raylib.Vector2
    -def vector2_reflect(v: raylib.Vector2, normal: raylib.Vector2) -> raylib.Vector2
    -def vector2_rotate(v: raylib.Vector2, angle: float) -> raylib.Vector2
    -def vector2_scale(v: raylib.Vector2, scale: float) -> raylib.Vector2
    -def vector2_subtract(v1: raylib.Vector2, v2: raylib.Vector2) -> raylib.Vector2
    -def vector2_subtract_value(v: raylib.Vector2, sub: float) -> raylib.Vector2
    -def vector2_transform(v: raylib.Vector2, mat: raylib.Matrix) -> raylib.Vector2
    -def vector2_zero() -> raylib.Vector2
    -def vector3_add(v1: raylib.Vector3, v2: raylib.Vector3) -> raylib.Vector3
    -def vector3_add_value(v: raylib.Vector3, add: float) -> raylib.Vector3
    -def vector3_angle(v1: raylib.Vector3, v2: raylib.Vector3) -> float
    -def vector3_barycenter(p: raylib.Vector3, a: raylib.Vector3, b: raylib.Vector3, c: raylib.Vector3) -> raylib.Vector3
    -def vector3_clamp(v: raylib.Vector3, min: raylib.Vector3, max: raylib.Vector3) -> raylib.Vector3
    -def vector3_clamp_value(v: raylib.Vector3, min: float, max: float) -> raylib.Vector3
    -def vector3_cross_product(v1: raylib.Vector3, v2: raylib.Vector3) -> raylib.Vector3
    -def vector3_distance(v1: raylib.Vector3, v2: raylib.Vector3) -> float
    -def vector3_distance_sqr(v1: raylib.Vector3, v2: raylib.Vector3) -> float
    -def vector3_divide(v1: raylib.Vector3, v2: raylib.Vector3) -> raylib.Vector3
    -def vector3_dot_product(v1: raylib.Vector3, v2: raylib.Vector3) -> float
    -def vector3_equals(p: raylib.Vector3, q: raylib.Vector3) -> int
    -def vector3_invert(v: raylib.Vector3) -> raylib.Vector3
    -def vector3_length(v: Const[raylib.Vector3]) -> float
    -def vector3_length_sqr(v: Const[raylib.Vector3]) -> float
    -def vector3_lerp(v1: raylib.Vector3, v2: raylib.Vector3, amount: float) -> raylib.Vector3
    -def vector3_max(v1: raylib.Vector3, v2: raylib.Vector3) -> raylib.Vector3
    -def vector3_min(v1: raylib.Vector3, v2: raylib.Vector3) -> raylib.Vector3
    -def vector3_multiply(v1: raylib.Vector3, v2: raylib.Vector3) -> raylib.Vector3
    -def vector3_negate(v: raylib.Vector3) -> raylib.Vector3
    -def vector3_normalize(v: raylib.Vector3) -> raylib.Vector3
    -def vector3_one() -> raylib.Vector3
    -def vector3_ortho_normalize(v1: Ptr[raylib.Vector3], v2: Ptr[raylib.Vector3]) -> None
    -def vector3_perpendicular(v: raylib.Vector3) -> raylib.Vector3
    -def vector3_reflect(v: raylib.Vector3, normal: raylib.Vector3) -> raylib.Vector3
    -def vector3_refract(v: raylib.Vector3, n: raylib.Vector3, r: float) -> raylib.Vector3
    -def vector3_rotate_by_axis_angle(v: raylib.Vector3, axis: raylib.Vector3, angle: float) -> raylib.Vector3
    -def vector3_rotate_by_quaternion(v: raylib.Vector3, q: raylib.Quaternion) -> raylib.Vector3
    -def vector3_scale(v: raylib.Vector3, scalar: float) -> raylib.Vector3
    -def vector3_subtract(v1: raylib.Vector3, v2: raylib.Vector3) -> raylib.Vector3
    -def vector3_subtract_value(v: raylib.Vector3, sub: float) -> raylib.Vector3
    -def vector3_to_float_v(v: raylib.Vector3) -> raylib.float3
    -def vector3_transform(v: raylib.Vector3, mat: raylib.Matrix) -> raylib.Vector3
    -def vector3_unproject(source: raylib.Vector3, projection: raylib.Matrix, view: raylib.Matrix) -> raylib.Vector3
    -def vector3_zero() -> raylib.Vector3
    -def wrap(value: float, min: float, max: float) -> float
    -

    2.5 raylib.utils

    class Data
    -# Arbitary data (void*)
    -def clear() -> None
    -# Clear background with RAYWHITE colour
    -def cos_deg(x: float) -> float
    -def is_desktop() -> bool
    -# Are we running in raylib in desktop?
    -def is_hot_reload() -> bool
    -# Are we running in raylib with hot reload?
    -def is_web() -> bool
    -# Are we running in raylib WASM/Web?
    -def lerp_color(a: raylib.Color, b: raylib.Color, fraction: float) -> raylib.Color
    -def pi() -> float
    -# Get approximate PI value
    -def remap(x: float, a: float, b: float, c: float, d: float) -> float
    -# Map x to be from 'a to b' range to 'c to d' range
    -def run_game_loop(fps: int, data: Data) -> int
    -# Run def game_step(d: utils.Data) in a loop
    -# Warning! this assumes you have def game_step(d: utils.Data) present in code
    -# Warning! game_step def must be present in same file as main()
    -# See wind_tree_gs.yaka for a sample of how to use this.
    -# Use only if you run into slowness with standard while loop
    -def sin_deg(x: float) -> float
    -def tan_deg(x: float) -> float
    -def todeg(radians: float) -> float
    -def torad(degrees: float) -> float
    -


    3 WASM4 Support Library

    Created 2022-10-21, Last Updated 2023-03-19

    Support for WASM4 fantasy console.

    Additionally following function in libs work.

    • libs.random.random_u64

    • libs.random.set_seed

    wasm4 is created by Bruno Garcia and contributors.

    Yaksha wraps wasm4.h

    3.1 w4

    BLIT_1BPP: Const[u32]
    -BLIT_2BPP: Const[u32]
    -BLIT_FLIP_X: Const[u32]
    -BLIT_FLIP_Y: Const[u32]
    -BLIT_ROTATE: Const[u32]
    -BUTTON_1: Const[u8]
    -BUTTON_2: Const[u8]
    -BUTTON_DOWN: Const[u8]
    -BUTTON_LEFT: Const[u8]
    -BUTTON_RIGHT: Const[u8]
    -BUTTON_UP: Const[u8]
    -MOUSE_LEFT: Const[u8]
    -MOUSE_MIDDLE: Const[u8]
    -MOUSE_RIGHT: Const[u8]
    -SCREEN_SIZE: Const[int]
    -# Screen size of wasm4 console
    -SYSTEM_HIDE_GAMEPAD_OVERLAY: Const[u8]
    -SYSTEM_PRESERVE_FRAMEBUFFER: Const[u8]
    -TONE_MODE1: Const[u32]
    -TONE_MODE2: Const[u32]
    -TONE_MODE3: Const[u32]
    -TONE_MODE4: Const[u32]
    -TONE_NOISE: Const[u32]
    -TONE_PAN_LEFT: Const[u32]
    -TONE_PAN_RIGHT: Const[u32]
    -TONE_PULSE1: Const[u32]
    -TONE_PULSE2: Const[u32]
    -TONE_TRIANGLE: Const[u32]
    -def blit(data: Ptr[Const[u8]], x: int, y: int, width: u32, height: u32, flags: u32) -> None
    -# Copies pixels to the framebuffer
    -def blit_sub(data: Ptr[Const[u8]], x: int, y: int, width: u32, height: u32, src_x: u32, src_y: u32, stride: u32, flags: u32) -> None
    -# Copies a subregion within a larger sprite atlas to the framebuffer
    -def diskr(dest: AnyPtr, size: u32) -> u32
    -# Reads up to `size` bytes from persistent storage into the pointer `dest`
    -def diskw(src: AnyPtrToConst, size: u32) -> u32
    -# Writes up to `size` bytes from the pointer `src` into persistent storage
    -def draw_colors() -> u16
    -# Read draw colors
    -def framebuffer() -> Ptr[u8]
    -# Access pointer to framebuffer
    -def gamepad1() -> u8
    -# Read gamepad 1 value
    -def gamepad2() -> u8
    -# Read gamepad 2 value
    -def gamepad3() -> u8
    -# Read gamepad 3 value
    -def gamepad4() -> u8
    -# Read gamepad 4 value
    -def hline(x: int, y: int, length: u32) -> None
    -# Draws a horizontal line
    -def line(x1: int, y1: int, x2: int, y2: int) -> None
    -# Draws a line between two points
    -def mouse_buttons() -> u8
    -# Read mouse buttons
    -def mouse_x() -> i16
    -# Read mouse x
    -def mouse_y() -> i16
    -# Read mouse y
    -def netplay() -> int
    -def oval(x: int, y: int, width: u32, height: u32) -> None
    -# Draws an oval (or circle)
    -def palette() -> Ptr[u32]
    -# Get a pointer to pallet
    -def rect(x: int, y: int, width: u32, height: u32) -> None
    -# Draws a rectangle
    -def set_draw_colors(value: u16) -> None
    -# Set draw colors
    -def set_game_state(data: AnyPtr) -> None
    -# Set a state value to be passed to game_step() function
    -def set_palette(c1: u32, c2: u32, c3: u32, c4: u32) -> None
    -# Set palette
    -def set_system_flags(value: u8) -> None
    -# Set system flags
    -def system_flags() -> u8
    -# Read system flags
    -def text(text_data: str, x: int, y: int) -> None
    -# Draws text using the built-in system font
    -def text_u8(text_data: Ptr[Const[u8]], x: int, y: int) -> None
    -# Draws text from given binarydata("text") (or manually created u8 Ptr) (no string allocation)
    -def tone(frequency: u32, duration: u32, volume: u32, flags: u32) -> None
    -# Plays a sound tone
    -def trace(text_data: str) -> None
    -# Prints a message to the debug console
    -def trace_u8(text_data: Ptr[Const[u8]]) -> None
    -# Prints a message to the debug console from given binarydata("text") (or manually created u8 Ptr) (no string allocation)
    -def vline(x: int, y: int, length: u32) -> None
    -# Draws a vertical line
    -
    \ No newline at end of file diff --git a/docs/safari-pinned-tab.svg b/docs/safari-pinned-tab.svg deleted file mode 100644 index fc524c9..0000000 --- a/docs/safari-pinned-tab.svg +++ /dev/null @@ -1,49 +0,0 @@ - - - - -Created by potrace 1.14, written by Peter Selinger 2001-2017 - - - - - - - - diff --git a/docs/site.webmanifest b/docs/site.webmanifest deleted file mode 100644 index a1553eb..0000000 --- a/docs/site.webmanifest +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "", - "short_name": "", - "icons": [ - { - "src": "/android-chrome-192x192.png", - "sizes": "192x192", - "type": "image/png" - }, - { - "src": "/android-chrome-384x384.png", - "sizes": "384x384", - "type": "image/png" - } - ], - "theme_color": "#ffffff", - "background_color": "#ffffff", - "display": "standalone" -} diff --git a/docs/tutorials.html b/docs/tutorials.html deleted file mode 100644 index 4fe1233..0000000 --- a/docs/tutorials.html +++ /dev/null @@ -1,118 +0,0 @@ -Yaksha Programming Language

    1 Getting started

    Created 2023-07-30, Last Updated 2023-09-07
    • Author(s): Bhathiya Perera

    1.1 Setting things up

    1.1.1 Downloading

    • Head to releases

    • Pick an archive format you like .7z or .zip (both has same content and .7z is almost always likely to be smaller in size)

    • Since this is a new language we recommend you always download latest version. Please expect things to not work.

    1.1.2 Installing

    • After download is completed you can extract the archive. Here are few ways:

    • GNU/Linux: use 7za or unzip depending on archive format.
    • Now you can add bin directory to PATH.

    • If you are in GNU/Linux ensure that binaries in the bin directory have +x (executable) permission assigned. chmod +x *

    1.1.3 Basics of Yaksha Programming Language

    1.1.3.1 Hello World

    Steps:

    First save below code to a file named "hello.yaka"

    def main() -> int:
    -    println("Hello World!")
    -    return 0
    -

    In Yaksha we use .yaka extension for source files. Also, we use -> to denote return type of a function.

    Additionally entry point of a program is main function. Main function must always return an int value. In this case we return 0 to indicate that program has exited successfully. Additionally we use println builtin function to print a line to standard output.

    Now you can compile it using yaksha command.

    yaksha build -R hello.yaka
    -

    Internally yaksha build command will invoke carpntr binary included in the distribution. carpntr is the builder tool for Yaksha. It will compile the source file and generate a binary named hello in the current directory. Additionally it will generate a hello.c file which is the C code generated by the compiler. You can inspect this file to see how the compiler works. -R option for carpntr (or yaksha build) will execute the binary after compilation.

    carpntr (or yaksha build) has many options. You can see them by running yaksha build --help or carpntr --help. Under the hood carpntr uses bundled zig compiler (with zig cc) and compile c code to a binary.

    1.1.3.2 Comments

    Yaksha programming language use # as an indicator for starting a comment.

    # This is a comment
    -def main() -> int:
    -    a = "Hello # This is not a comment"
    -    println(a)
    -    # We can also omit return here
    -    0
    -
    1.1.3.3 Data types

    Yaksha has many data types. Here are few of them:

    • int: 32 bit signed integer (Examples: 1, 100i32)
    • float: 32 bit floating point number (Examples: 1.0f, 100.0f)
    • bool: Boolean value (Examples: True, False)
    • str: partially memory managed string type. (You need to cleanup if you assign to a struct/class or into an array) (Examples: "Hello World!", """Hello World!""")
    • sr: a reference to a string.
    • None: represents NULL value or void

    You can find more data types and how to use them in the documentation. Since this is a tutorial we will not cover them here.

    About str:

    str is a partially memory managed string type. This means that if you just use str without assigning it to struct/class/arrays or any other data structures you don't need to worry about memory management. However, if you do, you need to cleanup. str implementation uses lot of copying and deletions. This is not the most efficient way to do things. However, it is the easiest way to do things.

    About None:

    None compiles to either NULL or void depending on the context. You can use None to indicate that a function does not return anything. You can also compare heap structures with None to check if they are NULL.

    1.1.3.4 Builtin functions

    Out of the box Yaksha provides few builtin functions. Builtin functions compile to various things, therefore they cannot be referenced to create Function[...] variables.

    Here are few of them:

    • println: prints a line to standard output
    • print: prints to standard output (no line ending)
    1.1.3.5 Variables

    You can create a variable by simply using a let statement.

    Statements such as a = 1 can be either a let statement or an assignment.

    def main() -> int:
    -    a = 1      # let
    -    b: int = 2 # let
    -    a += 2
    -    a += b
    -    b = a      # assignment
    -    println(b)
    -    return 0
    -

    When creating a variable, an identifier should be on the left hand side.

    a = 10
    -

    This make above statement valid.

    10 = 20
    -

    However, a statement such as above is invalid.

    You will get an error message like test_file.yaka:2:8 at "=" --> Invalid assignment target!

    Following will not even parse

    10: int = 20
    -

    This will generate an error such as test_file.yaka:2:7 at ":" --> Expect new line after value for expression.

    Ambiguity in assignment vs let.

    Parser does not know if a = 10 is an assignment or a let statement. So it is up to the later steps of the compiler to determine if a is already defined or not. And based on the outcome, type of a is inferred and can be promoted to a let statement. However, unlike languages such as Python type of a cannot be changed later on. Once defined it should remain same type.

    1.1.3.6 Statements

    Yaksha support various statements such as loops (for and while), if statements, break, continue, return, defer, del, def, pass, import and class (or struct) statements.

    See below for a sample usage of a while loop.

    def main() -> int:
    -    while True:
    -        println("loop")
    -        break
    -    return 0
    -

    In above example we are using a def statement to create our main function. Which will be the entry point of any Yaksha program. while statement will be executed once printing the world loop in your terminal emulator / console. Program will return 0 to indicate success.

    1.1.3.7 Defining a function
    def add(a: int, b: int) -> int: a + b
    -

    Above is an example of how we can define a function called add which can add two integers a and b and return a + b. In above function we have omitted return statement as that can be inferred by the compiler.

    def function_name(p1: dt1, p2: dt2, ...) -> return_datatype:
    -    ...
    -    # body of the function
    -    ...
    -

    Standard functions look like above. p1, p2 are parameters and dt1, dt2 are associated data types.

    There are two possible ways of passing arguments to a function. by value and by reference. Primitive data types (and str) are always passed by value. (By value means a new copy is created when invoking a function). Additionally Tuple data types and structs are also passed by value. Objects created from classes are passed by reference. Additionally Ptr, Array and AnyPtr will be passed by reference as well. sr works same as a reference.

    Now let's try and use our add function.

    def add(a: int, b: int) -> a + b
    -
    -def main() -> int:
    -    println(add(1, 2))
    -    return 0
    -
    1.1.3.8 Defining a struct
    struct A:
    -    a: int
    -
    -def main() -> int:
    -    item: A
    -    item.a = 0
    -    return 0
    -

    When a structure is created, values are initialised to be of garbage values. You can also assign values to this immediately.

    1.1.3.9 Scopes

    Yaksha scopes are created with blocks. Variables created inside the scopes are not leaked outside. If you need any variable to be accessed outside, you need to ensure that the variable is first created outside.

    if a == 5:
    -    b: int = 5
    -else:
    -    b: int = 10
    -println(b)    # ❌ <----- you cannot access b
    -

    Correct usage would be

    b: int = 10
    -if a == 5:
    -    b = 5
    -println(b)
    -

    This way you can access b afterwards.

    1.1.3.10 Importing libraries

    Yaksha comes with builtin libraries. Standard libraries can be accessed under libs namespace. Additionallyraylib for raylib and w4 for wasm4 library.

    import libs.console
    -
    -def factorial(x: int) -> int:
    -    if x <= 0:
    -        return 1
    -    return x * factorial(x - 1)
    -
    -def main() -> int:
    -    a = 0
    -    while a < 10:
    -        console.cyan("factorial")
    -        console.red("(")
    -        print(a)
    -        console.red(") = ")
    -        println(factorial(a))
    -        a = a + 1
    -    return 0
    -

    Above code sample calculates factorial in a recursive manner. libs.console allow us to access cross platform console/terminal emulator functionality. You can use functions such as console.cyan(string) to print coloured text.

    1.1.3.10.1 How import works

    import libs.c -> this will add c as a globally accessible namespace for content of libs.c.

    If you use something like import libs.c as clib then globally accessible namespace would be clib

    Accessing as libs.console.cyan is invalid. You should use your_alias_here.cyan or console.cyan



    2 YakshaLisp and macros in Yaksha

    Created 2023-12-14, Last Updated 2023-12-15
    • Author(s): Bhathiya Perera

    YakshaLisp is the builtin macro processing system in the Yaksha language. In this tutorial we will go through YakshaLisp basics, some builtin functions and how you can use those.

    2.1 What makes YakshaLisp different from Yaksha

    From the point of view of Yaksha language. YakshaLisp exist only during the compilation phase. Most of the programming languages consist of a DSL that acts as the meta programming layer. Think YakshaLisp as such DSL that exist to generate code.

    2.2 YakshaLisp basics

    Before we take a look at how to write macros, we need to understand how YakshaLisp works.

    You can execute YakshaLisp REPL by running yaksha lisp command. (This is a very simple REPL)

    2.2.1 Defining and setting a value

    (def a 1)  # <--- a is initialized to 1
    -(setq a 2) # <--- a value is changed to 2
    -           # a is now set to 2
    -

    Shortcut.

    (= a 1)   # <--- def or setq
    -

    2.2.2 S-expressions

    (def a 1)  # <--- this is an S-expression
    -

    2.2.3 Q-expressions

    (def a (quote 1 2 3))
    -(def b {1 2 3})
    -(== a b) # <---- truthy
    -

    Q-expressions are inspired by the make your own lisp. (However, we also do have special forms).

    2.2.3.1 Difference between list, quote and Q-Expressions
    (def a (list 1 2 3)) # <--- a is created with `list`
    -(def b {1 2 3})      # <--- b created with `{}`
    -(def c (quote 1 2 3))# <--- c is created with `quote`
    -(== a b)             # <--- ==/!= type mismatch
    -(== b c)             # <--- truthy
    -(== (map eval b) a)  # <--- truthy
    -

    Individual elements in Q-expressions are not evaluated. However, if you want to evaluate them, you can use eval function with map function.

    (quote ...) is same as {...}. However, quote is a function with a special form.

    (map eval {(+ 0 1) (+ 1 1) (+ 1 2)}) # <---- {1 2 3}
    -

    2.2.4 Builtin values

    • nil - falsey value, it is same as {}

    • true - truthy value, it is same as 1

    • false - falsey value, it is same as 0

    • newline - newline character, either "\r\n" or "\n"

    2.2.5 Simple builtins

    (def a (+ 1 2)) # <----- a is 3
    -(def b (- 2 1)) # <----- b is 1
    -(def c (* 2 3)) # <----- c is 6
    -(def d (/ 6 2)) # <----- d is 3
    -

    2.2.6 Comparison builtins

    (def a (== 1 1)) # <----- a is true
    -(def b (!= 1 1)) # <----- b is false
    -(def c (< 1 2))  # <----- c is true
    -(def d (> 1 2))  # <----- d is false
    -(def e (<= 1 2)) # <----- e is true
    -(def f (>= 1 2)) # <----- f is false
    -

    2.2.7 Logical builtins

    (def a (and true true))  # <----- a is true
    -(def b (and true false)) # <----- b is false
    -(def c (or true false))  # <----- c is true
    -(def d (or false false)) # <----- d is false
    -(def e (not true))       # <----- e is false
    -(def f (not false))      # <----- f is true
    -

    2.2.8 If builtin

    (def a (if true 1 2)) # <----- a is 1
    -(def b (if false 1 2))# <----- b is 2
    -(def c (if true 1))   # <----- c is 1
    -(def d (if false 1))  # <----- d is nil (same as {})
    -

    2.3 DSL macros

    Currently YakshaLisp can be used to write DSL macros. In this tutorial we will go through how to write a simple DSL macro.

    macros! {
    -    # Get an integer_decimal token 7
    -    (defun ymacro_get () (list (ykt_integer_decimal 7)))
    -    # create a DSL macro named get! that executes above (defun ymacro_get...) function
    -    (yk_register {dsl get ymacro_get})
    -}
    -
    -def main() -> int:
    -    e1 = array("int", 4, 5, 6, get!{})
    -    for i: int in e1:
    -        println(i)
    -    del e1
    -    return 0
    -

    This should print 4, 5, 6, 7 in individual lines. yk_register is a builtin function that registers a DSL macro. dsl is the type of the macro. get is the name of the macro. ymacro_get is the YakshaLisp function that executes when the macro is called.

    \ No newline at end of file diff --git a/docs/yama.html b/docs/yama.html deleted file mode 100644 index 2d760c1..0000000 --- a/docs/yama.html +++ /dev/null @@ -1,470 +0,0 @@ -Yaksha Programming Language

    YAMA 0001 - Exposing C enums/#defines/consts

    Created 2023-07-30, Last Updated 2023-12-13
    • Author(s): Bhathiya Perera
    • Status : ✅

    Problem

    In C we can define enums such as below.

    // Simple
    -enum something1 {
    -  SOMETHING1,
    -  ANOTHER1
    -};
    -
    -// Separate typedef
    -enum something2 {
    -  SOMETHING2,
    -  ANOTHER2
    -};
    -typedef enum something2 something2_t;
    -
    -// Combined
    -typedef enum
    -{
    -  SOMETHING3,
    -  ANOTHER3
    -} something3_t;
    -

    Currently we can use something like

    SOMETHING: Const[int] = 0
    -ANOTHER: Const[int] = 1
    -

    This however make it annoying to maintain, as we now have a copy of the enum value.

    We can use below as well.

    @nativemacro("SOMETHING")
    -def something() -> int:
    -    pass
    -

    This does not copy the value, but make it annoying to use the API as now we need to access this as something().

    Suggestions

    Suggestion 1

    # Expose enum value / #define value
    -nativexp "SOMETHING" as SOMETHING: Const[int]
    -
    -# Some simple constant calculations
    -nativexp """1 + 1""" as TWO: Const[int]
    -
    • Pro:
    • Clearly define that this is a native expression
    • Con:
    • Looks different

    Suggestion 2

    TWO: Const[int] = ccode """1 + 1"""
    -
    • Pro:
    • Consistent syntax
    • Clearly define that this is a native expression (ccode)
    • Con:
    • None

    Suggestion 3

    TWO: Const[int] <- nativexp """1 + 1"""
    -
    • Pro:
    • Clearly define that this is a native expression
    • Con:
    • Looks different

    Suggestion 4

    nativexp """1 + 1""" -> TWO: Const[int]
    -
    • Pro:
    • None
    • Con:
    • Looks different

    Suggestion 5

    TWO: Const[int] = nativexp """1 + 1"""
    -
    • Pro:
    • Consistent syntax
    • Clearly define that this is a native expression (ccode)
    • Con:
    • New keyword is introduced

    This would compile to

    #define yk__TWO (1 + 1)
    -

    Conclusion

    I'm going with suggestion 2 as it uses already existing keywords and also at the same time looks consistent with current constants.



    YAMA 0002 - Adding support for stack allocated structs

    Created 2023-07-30, Last Updated 2023-12-13
    • Author(s): Bhathiya Perera
    • Status : ✅

    Problem

    class Enemy:
    -    x: int
    -    y: int
    -    hit_points: int
    -
    -def main() -> int:
    -    enemies: Array[Enemy] = arrnew("Enemy", 2)
    -    enemies[0] = Enemy()
    -    enemies[1] = Enemy()
    -    return 0
    -

    Given a structure like above, it makes no sense to allocate individual objects in heap all the time.

    We can avoid it by using Tuple however we lose the information about field names then.

    Keep in mind that the Tuple's in Yaksha are mutable (Mutable Tuples are what we have at the moment, may or may not change in future).

    Suggestions

    Suggestion 1

    @namedtuple
    -class Enemy:
    -    x: int
    -    y: int
    -    hit_points: int
    -
    • Pro:
    • Consistent syntax
    • Does not introduce a new keyword
    • Con:
    • No way to tell that this get allocated in stack?

    Suggestion 2

    @dataclass
    -class Enemy:
    -    x: int
    -    y: int
    -    hit_points: int
    -
    • Pro:
    • Consistent syntax
    • Does not introduce a new keyword
    • Familiarity
    • Con:
    • No way to tell that this get allocated in stack?
    • Looks like python but different might make it confusing

    Suggestion 3

    class Enemy:
    -    x: int
    -    y: int
    -    hit_points: int
    -Enemy()     # << allocate on stack
    -new Enemy() # << allocate on heap
    -
    • Pro:
    • Similar to how C++ works.
    • new - del pairing
    • Con:
    • Need to rewrite everything to follow this convention
    • Note⚠️⚠️:
    • Perhaps reconsider this approach at some point

    Suggestion 4 ✅

    @onstack
    -class Enemy:
    -    x: int
    -    y: int
    -    hit_points: int
    -# Rename @dotaccess to @onstack
    -# And use that for this purpose
    -Enemy() # This is disallowed. Just create a variable and you can use it.
    -
    • Pro:
    • Defines that this is different from a normal class
    • Clearly visible that this get allocated on stack
    • Con:
    • Require changes to how @dotaccess works currently

    Conclusion

    I am thinking suggestion 4 is the best approach.

    Update

    Additionally Yaksha now supports struct keyword. That act as a syntax sugar for @onstack class.



    YAMA 0003 - For loop / loop

    Created 2023-07-30, Last Updated 2023-12-13
    • Author(s): Bhathiya Perera
    • Status : ✅

    Problem

    Yaksha programming language does not offer a for syntax sugar. This is annoying for someone coming from Python or other languages that has this feature.

    We have foreach builtin and while loop, which can be used at the moment. for can make certain things easy.

    Use case 1 - for each element in array ✅

    How it works now

    items: Array[int] = get_it()
    -
    -c: int = 0
    -length: int = len(items)
    -
    -while c < length:
    -    if items[c] == 2:
    -        c += 1
    -        continue
    -    println(items[c])
    -    c += 1
    -

    Syntax sugar (we will keep compulsory data types for now)

    for item: int in get_it(): # get_it should return Array[T]
    -    if item == 2:
    -        continue
    -    println(item)
    -

    Desugared

    yy__1t: Array[int] = get_it()
    -yy__2t: int = 0
    -yy__3t: int = len(yk__1t)
    -
    -while yy__2t < yy__3t:
    -    ccode """#define yy__item yy__1t[yy__2t]\n// desugar begin"""
    -    expose_native item: int      # To expose what we put in above C code
    -    if item == 2:
    -        yy__2t += 1
    -        continue                 # Continue must increase the counter
    -    println(item)
    -    ccode """#undef yy__item\n// desugar end"""
    -    yy__2t += 1               # Increase count at the very end
    -

    Use case 2 - endless loops ✅

    Syntax sugar

    for:
    -    game_step()
    -    log_stuff()
    -

    Desugared

    while True:
    -    game_step()
    -    log_stuff()
    -

    Use case 3 - custom iterators / iterables ⚠️(deferred at this step)

    Syntax sugar

    def next_book(x: Books) -> Book:
    -    pass
    -
    -def has_next_book(x: Books) -> bool:
    -    pass
    -
    -def process() -> None:
    -    books: Books = get_it()
    -    it: Iterator[Book] = iterator("Book", books, next_book, has_next_book)
    -    for element: Book in it:
    -        print_book(element)
    -

    Use case 4 - range for loops ⚠️(not required a we have c-like for loops)

    Syntax sugar

    # Example 1
    -r: Range[int] = range(1, 5, 2)
    -for i: int in r:
    -    if i == 1: # do not print 1
    -       continue
    -    println(i)
    -
    -# Example 2
    -for i: int in range(1, 5, 2):
    -    if i == 1: # do not print 1
    -       continue
    -    println(i)
    -

    Desugared

    r: Tuple[int, int, int]
    -r[0] = 1
    -r[1] = 5
    -r[2] = 2
    -
    -hidden__c = r[0]
    -while hidden__c < r[1]:
    -    i: int = hidden__c
    -    if i == 1:
    -        hidden__c += r[2]
    -        continue
    -    println(i)
    -    hidden__c += r[2]
    -

    Conclusion

    Iterators/Ranges are deferred for now. It would be better to come up with a generic Iterator approach for these.

    At the moment I think endless loops and simple for-each style loops should be implemented.



    YAMA 0004 - Iterators

    Created 2023-07-30, Last Updated 2023-12-13
    • Author(s): Bhathiya Perera
    • Status : Draft

    Problem

    We would like to introduce support for iterators, such that it allows Yaksha to simply iterate arbitrary content.

    Use case 1 - custom iterators / iterables

    Syntax sugar

    def next_book(x: Ptr[Books]) -> Book:
    -    pass
    -
    -def has_next_book(x: Ptr[Books]) -> bool:
    -    pass
    -
    -def process() -> None:
    -    books: Books = get_it()
    -    # Books is the mutable state that is passed to next_book and has_next_book
    -    # Book is the type that is returned from the next_book
    -    it: Iterator[Book] = iterator(books, next_book, has_next_book)
    -
    -    for element: Book in it:
    -        print_book(element)
    -

    Desugared

    def next_book(x: Ptr[Books]) -> Book:
    -    pass
    -
    -def has_next_book(x: Ptr[Books]) -> bool:
    -    pass
    -
    -def process() -> None:
    -    books: Books = get_it()
    -
    -    it: Tuple[Books, .., ..]
    -    it[0] = books
    -    it[1] = next_book
    -    it[2] = has_next_book
    -
    -    while (it[1])(getref(it[0])):
    -        element: Book = (it[2])(getref(it[0]))
    -        print_book(element)
    -

    Use case 2 - range for loops

    Syntax sugar

    # Example 1
    -r: Iterator[int] = range(1, 5, 2)
    -for i: int in r:
    -    if i == 1: # do not print 1
    -       continue
    -    println(i)
    -
    -# Example 2 (would desugar similarly)
    -for i: int in range(1, 5, 2):
    -    if i == 1: # do not print 1
    -       continue
    -    println(i)
    -

    Desugared

    r: Tuple[Tuple[int, int, int, int], .., ..]
    -yy__1t: Tuple[int, int, int, int]
    -yy__1t[0] = 1       # start
    -yy__1t[1] = 5       # stop *non inclusive
    -yy__1t[2] = 2       # step
    -yy__1t[3] = yy__1t[0] # current item
    -r[0] = yy__1t
    -r[1] = yk__next_range
    -r[2] = yk__has_range
    -
    -while (r[1])(getref(r[0])):
    -    i: int = (r[2])(getref(r[0]))
    -    if i == 1:
    -        continue
    -    println(i)
    -

    Conclusion

    Iterators make a fine addition to foreach loop.



    YAMA 0005 - DSL macros for Yaksha

    Created 2023-07-30, Last Updated 2023-12-15
    • Author(s): Bhathiya Perera
    • Status : In Progress

    Problem

    Macros allow for compile time code generation. Yaksha already supports multiple ways of exposing and defining C macros. However, C macros are not easy to use. Other than for exposing things written in C one should avoid using C macros in Yaksha (@nativexxx).

    Proposal

    YakshaLisp would be a language of its own. Capable of executing at compile time of Yaksha (and also as a command line interpreter).

    WHY?

    • Lisp is a great language for meta programming.

    • Lisp can be used to manipulate lists. (List processing 😄)

    • Token list to token list transformation is a good fit for lisp.

    • Simplest form of syntax to learn.

    • Yak-shaving is fun. (Did you see what I did there? 😄)

    • Feels nicer and user-friendly than C macros and @nativexxx in Yaksha.

    Command line interpreter

    Use YakshaLisp as its own programming language.

    • yaksha lisp - Run YakshaLisp interpreter REPL (Just YakshaLisp code, no macros!{} required)

    • yaksha lisp <file> - Execute just YakshaLisp code. (Don't use macros!{} here)

    DSL macros

    DSL macros get a list of tokens and outputs a list of tokens. This allows for more complex logic to be written in YakshaLisp macros.

    Any DSL macro inside {} will be also expanded.

    Most nested macro invocation will be expanded first. These macros can call other macros as you call a function and support iteration and recursion. These macros will only be expanded once.

    Builtin functionality of YakshaLisp
    • Printing to console ✅

    • Reading from console ✅ - Requires enable_print to be called, before calling print and println, console output of yaksha compile maybe altered using this. Therefore, this is disabled by default.

    • Reading/writing text files ✅

    • Strings, decimal Integers ✅

    • List manipulation ✅

    • Maps (string -> value only) ✅

    • Map literals, and manipulation ✅

    • Working with Yaksha tokens ✅

    • Iteration ✅

    • Conditions - if, cond ✅

    • Few functional built ins - map, reduce, range ✅

    • Q-Expressions inspired by Build Your Own Lisp lisp dialect. ✅ (This is somewhat similar to '(+ 1 2 3))

    • Eval and parse ✅

    • Token generation for Yaksha ✅

    • Executing commands 🟡 (Implemented. however, this is enabled all the time)

    • Macros for YakshaLisp ✅

    • Imports ✅

    • Hygienic macros - gensym ✅ / metagensym 🟡

    • Garbage collection ✅

    Item 1 - Initial DSL macro support ✅

    # ╔═╗┌─┐┌┬┐┌─┐┬┬  ┌─┐  ╔╦╗┬┌┬┐┌─┐
    -# ║  │ ││││├─┘││  ├┤    ║ ││││├┤
    -# ╚═╝└─┘┴ ┴┴  ┴┴─┘└─┘   ╩ ┴┴ ┴└─┘
    -# ╔═╗┬┌─┐┌─┐  ╔╗ ┬ ┬┌─┐┌─┐
    -# ╠╣ │┌─┘┌─┘  ╠╩╗│ │┌─┘┌─┘
    -# ╚  ┴└─┘└─┘  ╚═╝└─┘└─┘└─┘
    -macros!{
    -    (defun to_fb (n) (+ (if (== n 1) "" " ") (cond
    -        ((== 0 (modulo n 15)) "FizzBuzz")
    -        ((== 0 (modulo n 3)) "Fizz")
    -        ((== 0 (modulo n 5)) "Buzz")
    -        (true (to_string n))
    -        )))
    -    (defun fizzbuzz () (list (yk_create_token YK_TOKEN_STRING (reduce + (map to_fb (range 1 101))))))
    -    (yk_register {dsl fizzbuzz fizzbuzz})
    -}
    -
    -def main() -> int:
    -    println(fizzbuzz!{})
    -    return 0
    -

    Item 2 - Hygienic DSL macros using gensym ✅ and metagensym 🟡

    • gensym - This is not a function unlike metagensym, simply return a name such as $a (any valid Yaksha IDENTIFIER prefixed with $) and it will be replaced with a unique symbol. ✅

    • metagensym - Generates a unique symbol to be used in YakshaLisp code.

    Item 3 - Macros for YakshaLisp via metamacro

    Did you ever think that your meta programming might benefit from meta-meta programming?

    Macros get all parameters non-evaluated. The output from macro will be evaluated (in calling scope) and needs to be a list of expressions.

    Other than that it is similar to a defun. Metamacros are executed similarly to functions and can also call other metamacros or defuns.

    If you consider just YakshaLisp as it's own language, this allows you to meta program in YakshaLisp during runtime of YakshaLisp.

    • (is_callable my_meta) --> false, this is true only for builtins, def, lambda.

    macros!{
    -    (metamacro twice (x) (+ (list x) (list x)))
    -    # since x is an expression (non evaluated), it can be converted to {}
    -    # by simply calling list.
    -    # x ----> (= value (+ value 1))) # as an expr
    -    # (list x) ---> {(= value (+ value 1))}
    -    # (+ (list x) (list x)) ---> {
    -    #    (= value (+ value 1)) (= value (+ value 1))
    -    #    }
    -    # now evaluated in calling scope
    -    # (eval {...}) --> increase value by 1 twice
    -    (= value 1)
    -    (twice (= value (+ value 1)))
    -    # This would set success
    -    (if (== value 3) (= success 1))
    -}
    -
    -def main() -> int:
    -    return 0
    -
    (twice (println "Hello")) ----> (eval {(println "Hello") (println "Hello")})
    -

    Item 4 - Import macros from other files ✅

    import libs.macro as m
    -macros!{
    -    (enable_print)
    -    (m.twice (println "Hello"))
    -}
    -
    -def main() -> int:
    -    return 0
    -

    Item 5 - Execute commands 🟡

    Will be disabled by default. Can be enabled by a setting a flag in yaksha.toml or setting an environment variable YAKSHA_SERIOUSLY_ENABLE_SHELL_EXEC to True.

    import libs.macro.shell as m
    -
    -def main() -> int:
    -    m.execute!{"echo Hello World"}
    -    println(m.readout!{"echo Hello World", "Failed"})
    -    return 0
    -

    Item 6 - Tracing macro expansion and debugging (not started, planned) ❌

    Allow Yaksha compiler to output macro expansion steps. This will be useful for debugging macros.

    Design TBD.

    Some tracing features are supported by YakshaLisp if DEBUG is enabled during compilation of Yaksha, but this does not look nice and only useful for Yaksha/YakshaLisp language development. Perhaps these DEBUG features can be made to output more readable output and enable/disable with a flag instead of #ifdef DEBUG.

    Item 7 - Garbage collection ✅

    YakshaLisp will have a simple mark and sweep garbage collector. This will be used to manage memory allocated by YakshaLisp.



    YAMA 0006 - C 2 C Compiler - Intermediate C99 to C99 optimizing compiler

    Created 2023-07-30, Last Updated 2023-12-13
    • Author(s): Bhathiya Perera
    • Status : Draft

    Problem

    Yaksha uses C as a final compilation target. This is to introduce a way to have an intermediate C as a IR that can then be compiled to C

    Naming

    • iC99 - Intermediate C 99

    Language

    • Looks like C99.

    • Loops -> for, while, do while

    • structs, constants, unions, #define

    • We have built-ins such as yk__sdsnew, etc.

    #define yy__raylib_Music Music
    -
    -i32 yy__main() {
    -  yy__raylib_Music x;
    -
    -  return 0;
    -}
    -

    Architecture

    • Tokenize

    • Level 1 -> no keyword recognition

    • Recognizes normal operators, identifiers, #?? and comments

    • Discard comments

    • Parse all with pre-processor statements

    • Remove comments

    • Apply #defines -> until there are no changes present

    • AST based

    • Only works with 1 file

    • Entry points yy__main yy__game_step, yy__init_state

    Optimizations

    Opt 01 - apply all #defines starting with yy__

    • Implement a simple pre-processor, however only capable of applying #defines that start with yy__

    • Opt 01.01 - Support non function like macros

    • Opt 01.02 - Support for function like macros

    Opt 02 - data types

    • Opt 02.01 - Push down support of integer data types from Yaksha compiler to iC99.

    • Instead of having extra complexity at the compiler level for i32 ike data types, we push it to iC99.

    Opt 03 - clean up

    • Opt 03.01 - Remove any method that cannot be reached from yy__main()

    • Opt 03.02 - Remove any operation in same block after return

    Opt 04 - constant folding

    • Opt 04.01 - Apply -

    • Opt 04.02 - Remove excess ( ) parentheses

    • Opt 04.03 - Do basic math

    • Opt 04.04 - Apply basic string built-ins

    • Opt 04.05 - Apply basic array built-ins

    • Opt 04.06 - Dead code elimination

    Opt 05 - apply constant function calls

    • Everything is a constant expression?

    • For each function things with simple math, assignments and built ins are considered pure

    • Any of these pure functions can be invoked during compile time and folded

    Opt 06 - small function in-lining

    • Inline small functions < 20 lines?

    Opt 07 - multiple rounds of previous optimizations

    while changed:

    • Opt 03

    • Opt 04

    • Opt 05

    • Opt 06



    YAMA 0007 - Additional features for structs

    Created 2023-07-30, Last Updated 2023-12-13
    • Author(s): Bhathiya Perera
    • Status : In Progress

    Structures are at the moment can be created as follows

    @onstack
    -class Banana:
    -    color: int
    -    origin: int
    -
    -# Orange is a heap allocated class
    -class Orange:
    -    color: int
    -    origin: int
    -

    Item 1 - Allocate single object on heap

    a: Ptr[Banana] = make("Banana")
    -
    -b: Orange = make("Orange")
    -

    Item 2 - Create structures or classes ✅

    a: Banana = Banana {color: YELLOW, origin: SRI_LANKA}
    -
    struct Banana a = (struct Banana){.color = YELLOW, .origin = SRI_LANKA};
    -
    b: Orange = Orange {color: ORANGE, origin: SOUTH_AFRICA}
    -
    struct Orange* _temp = calloc(1, sizeof(struct Orange));
    -_temp->color  = ORANGE;
    -_temp->origin = SOUTH_AFRICA;
    -
    -struct Orange* b = _temp;
    -

    Item 3 - Introduce struct keyword, desugar to @onstack class

    struct Banana:
    -    color: int
    -    origin: int
    -


    YAMA 0008 - Sugar methods

    Created 2023-07-30, Last Updated 2023-12-13
    • Author(s): Bhathiya Perera
    • Status : Draft

    Idea 01 - Arrow

    struct Banana:
    -    color: int
    -    origin: int
    -
    -def display(b: Ptr[Banana]) -> None:
    -    return
    -
    -def main() -> int:
    -    b: Banana = ...
    -    b->display()
    -    return 0
    -

    Idea 02 - Dot ✅

    @onstack
    -class Banana:
    -    color: int
    -    origin: int
    -
    -def display(b: Ptr[Banana]) -> None:
    -    return
    -
    -def main() -> int:
    -    b: Banana = ...
    -    b.display()
    -    return 0
    -

    If @onstack or struct then we need to use Ptr[DataType] otherwise DataType can be used.

    Going with . as it is already valid AST. Additionally, we can find the method during type checking and desugar it.

    display(getref(b))
    -


    YAMA 0009 - Strings revisited

    Created 2023-08-13, Last Updated 2023-12-13
    • Author(s): Bhathiya Perera
    • Status : Draft

    Strings in programming languages are tough to design. You can make things simple by using it like a value type (Copying and deleting it). However, value like strings come at a cost as it does large number of alloc/dealloc resulting in fragmented memory. In WASM4 or embedded (potential future scenario) cases, this kind of alloc/dealloc is not acceptable.

    This is an all or nothing proposal. Need to support all scenarios explained below. After this is completed, libs/runtime needs to rewritten to use new sr data type instead of str data type.

    There is also an invisible string data type literal that is only available at compile time (a: literal = "hi" is invalid).

    This type will be auto-magically converted to sr.

    This is considered to avoid wasting time doing - runtime concatenation and runtime comparison of literals.

    • Breaking changes** - a = "hello" results in a's data type to be sr instead of str and sr is now a builtin data type.

    Few areas to explore

    String reference

    • String reference does not own the underlying heap allocated memory of a string.

    • No need to delete or duplicate.

    • But it is dangerous to store it in a structure as it might be invalid later on.

    Static storage strings

    • Immutable static strings that lives in the static storage, lasts for the whole life time of the program.

    • No need to de-allocate.

    • Can store as a reference anywhere you like.

    • Not copied when passing.

    String buffers

    • Mutable string that owns memory.

    • Not copied when passing to a function.

    • Can use same underlying yk__sds as data structure.

    Semi managed value like strings

    • What str represents in Yaksha.

    • What is semi-managed? you need to manually de-allocate when a copy is added to a container.

    String literals

    • This is a "Hello World" like string literal in Yaksha.

    • This is currently automatically converted to str.

    • We can consider string literals to be static storage strings.

    • Length is known at compile time.

    Library/runtime use

    • Runtime functionality will not need to de-allocate strings. Once we switch to use of sr data type.

    Implementation

    Underlying data structure

    struct yk__bstr { // Yaksha Base String
    -    union {
    -        yk__sds h;              // reference to a heap allocated string
    -        const char * s;         // reference to a statically allocated string
    -        char* c;                // reference to c.CStr that is heap allocated
    -    };
    -    size_t l;
    -    enum yk__bstr_type { yk__bstr_str, yk__bstr_static, yk__bstr_cstr } t;
    -};
    -

    Yaksha

    First we assume we have something like below defined, that takes the new data type sr as an argument.

    literal is a hidden data type -- this cannot be used by end users directly. (Internally represented as :s:)

    Legend
    • ✅ - Completed

    • N - No allocation should happen here (except in Windows due to need to convert to utf16).

    • A - Alloc/Dealloc happens

    • C - Compile time

    • ! - Type-checking / compile error

    def do_something(s: sr) -> int: # N
    -    print("Printing sr: ")      # N
    -    println(s)                  # N
    -    return 0
    -
    -def takes_str(s: str) -> int:   # A (arg is copied here and deleted in the function)
    -    print("Printing str: ")     # N
    -    println(s)                  # N
    -    return 0
    -
    Create sr data type ✅
    • Have it compile to struct yk__bstr

    Passing a literal to sr
    def main() -> int:
    -    do_something("Oi")           # N
    -    return 0
    -
    Passing an str to sr and creating a str with literal
    def main() -> int:
    -    s: str = "Oi"                # A
    -    s2: str = "Ha"               # A
    -    do_something(s)              # N
    -    do_something(s2)             # N
    -    return 0
    -
    Passing a literal/sr to str
    def main() -> int:
    -    do_something("Oi")           # A
    -    a: sr = "ha"                 # A
    -    takes_str(a)                 # N
    -    takes_str("Oi oi")           # N
    -    return 0
    -
    Variable using sr as data type ✅
    def main() -> int:
    -    oi = "Oi"                    # A
    -    do_something(oi)             # A
    -    takes_str("Oi oi")           # N
    -    return 0
    -
    Concatenation of strs --> str
    def main() -> int:
    -    s: str = "Oi"                # N
    -    s2: str = " Hello"           # N
    -    takes_str(s + s2)            # NN
    -    return 0
    -
    Concatenation of literals --> literal
    def main() -> int:
    -    do_something("Oi" + " Hello there" + " Another") # NC
    -    takes_str("Oi" + " Hello there" + " Another")    # AC
    -    return 0
    -
    Concatenation of 2 or more srs --> str
    def main() -> int:               # A
    -    a: sr = "Hi"                 # A
    -    b: sr = " there"             # A
    -    do_something(a + b + a)      # NA
    -    takes_str(a + b)             # NN
    -    return 0
    -
    Concatenation of 2 or more of mixed str, sr and literals --> str
    def main() -> int:
    -    a: str = "Hello"             # N
    -    b: sr = " World"             # A
    -    c = a + b + " Hehe"          # NNN
    -    do_something(c)              # A
    -    takes_str(c)                 # N
    -    d = "Ha " + b + " " + a      # NNNN
    -    takes_str(d)                 # N
    -    do_something(d)              # A
    -    return 0
    -
    Comparison of literals ("a" == "a") --> bool
    def main() -> int:
    -    println("a" == "a")          # AC
    -    println("a" == "b")          # AC
    -    println("a" != "a")          # AC
    -    println("a" != "b")          # AC
    -    return 0
    -
    Comparison of mixed str, sr and literals --> bool
    def main() -> int:
    -    a: str = "a"                 # N
    -    b: sr = "oi"                 # A
    -    println(b == b)              # A
    -    println(a == a)              # A
    -    println((a == b) or (a != b))# AA
    -    println("a" == a)            # AA
    -    println(b != a)              # AA
    -    println(b != "x")            # AA
    -    return 0
    -
    Wrap/Unwrap c.CStr, Const[Ptr[Const[c.Char]]] as sr
    • Create a simple wrapper function in libs.c to wrap c.CStr --> getref_cstr

    • Create a simple wrapper function in libs.c to unwrap c.CStr --> unref_cstr

    • Create a simple wrapper function in libs.c to wrap Const[Ptr[Const[c.Char]]] --> getref_ccstr

    • Create a simple wrapper function in libs.c to unwrap Const[Ptr[Const[c.Char]]] --> unref_ccstr

    • See do_something and take_str

    Wrap Array[u8] as sr
    • Create a simple wrapper function in libs.strings to wrap getref_u8a

    Wrap Ptr[u8] as sr
    • Create a simple wrapper function in libs.strings to wrap getref_u8p

    Compare with None ✅
    def main() -> int:
    -    a: sr = "a"                  # N
    -    b: str = "b"                 # A
    -    println(a == None)           # N
    -    println(b == None)           # N
    -    println("a" != None)         # NC
    -    println("a" == None)         # NC
    -    println(None != a)           # N
    -    println(None != b)           # N
    -    println(None == "a")         # NC
    -    println(None != "a")         # NC
    -    return 0
    -

    Additional tasks

    • Update documentation explaining sr data type.



    YAMA 0010 - Numbers auto casting when widening

    Created 2023-08-13, Last Updated 2023-09-07
    • Author(s): Bhathiya Perera
    • Status : ✅

    Following casting is suggested for basic binary mathematical operations.

    Assignment would follow same casting style, except lhs needs to be wider.

    Bitwise operations would require manual casting to same data type.

        .-------------.
    -    |    bool     |
    -    '.-----------.'
    -     |          .V-.
    -     |          |i8|
    -     |          '.-'
    -    .V----------.|
    -    |    u8     ||
    -    '.---------.'|
    -    .V-------. | |
    -    |  u16   | | |
    -    '.------.' | |
    -    .V----. |  | |
    -    | u32 | |  | |
    -    '.---.' |  | |
    -    .V--.|  |  | |
    -    |u64||  |  | |
    -    '.--'|  |  | |
    -.---.|   |  |  | |
    -|f64||   |  |  | |
    -'^--'|   |  |  | |
    -.'---V-. |  |  | |
    -| f32  | |  |  | |
    -'^-----' |  |  | |
    -.'-------V-.|  | |
    -|   i64    ||  | |
    -'^---------'|  | |
    -.'----------V-.| |
    -|     i32     || |
    -'^------------'| |
    -.'-------------V-V-.
    -|       i16        |
    -'------------------'
    -


    YAMA 0011 - Add minimal support for a HTTP client in Yaksha

    Created 2023-11-12, Last Updated 2023-12-13
    • Author(s): Bhathiya Perera
    • Status : 🟡

    Summary

    All programming languages provide a way to make HTTP requests. However, this is currently not available to Yaksha. This proposal aims to add minimal support for HTTP requests to Yaksha.

    Design

    We plan on using mongoose to implement this feature. Mongoose is a lightweight HTTP server written in C. It is easy to integrate. However, it's license is GPL and users of http library will have to be aware of this.

    Client

    Simple HTTP client will use following structure. This will be placed in a separate module called http/client.yaka.

    # Mongoose mgr data structure
    -@nativedefine("struct mg_mgr")
    -stuct MongooseMgr:
    -    pass
    -
    -# Mongoose connection data structure
    -@nativedefine("struct mg_connection")
    -struct MongooseCon:
    -    pass
    -
    -# HTTP client data structure using above 2 structs
    -struct HttpClient:
    -    mgr: MongooseMgr
    -    nc: Ptr[MongooseCon]
    -    success: bool
    -
    -def http_client(url: sr) -> HttpClient:
    -    pass  # placeholder
    -
    -def request(method: sr, url: sr, data: sr, callback: Function[..]) -> HttpRequest:
    -    pass  # placeholder
    -

    Usage of the client will be as follows:

    import http.client as client
    -
    -def callback(...): # placeholder
    -    pass
    -
    -def main() -> int:
    -    cl = client.http_client("http://localhost:8080")
    -    cl.request("GET", "/api/v1/users", "", callback)
    -    defer free_http_client(cl)
    -    return 0
    -

    Required changes to Yaksha ecosystem

    • Implement ability to support fixed sized arrays in Yaksha (parser, compiler, etc).

    • Implement ability in YakshaLisp to execute programs and access output.

    • Implement ability in carpntr to use YakshaLisp to build programs. (Either use program execution ability or use make/cmake to build programs)

    • Implement ability in YakshaLisp to detect platform and use appropriate build system.

    • CI - Add ability to build Yaksha release on supported platforms using github actions. (Instead of cross compiling)

    • Remove hammer and just use cmake to build Yaksha.

    • Update build and other scripts accordingly.

    Third party libraries to be included

    • mongoose - for making HTTP requests

    • mbedtls - for TLS support

    • reproc - for executing programs



    YAMA 0012 - Fixed size arrays

    Created 2023-12-19, Last Updated 2023-12-19
    • Author(s): Bhathiya Perera
    • Status : Draft

    Fixed size arrays are an important feature in C. Allowing us to create arrays in the stack and pass them around without worrying about memory management. This is a proposal to add static arrays to Yaksha.

    Problem with arrays in C is that it decays to pointers. This is a problem when passing arrays to functions. And we need to pass the size of the array as well. Another problem is array size is not considered part of the data type (as it decays, information is lost).

    So in Yaksha I would prefer to have a data type that mentions the size of the array as well. FixedArr[u8,10] would be different from FixedArr[u8,20].

    def receive_a(item_a: FixedArr[int, 3]) -> int:
    -    item_a[0] + item_a[2]
    -
    -def main() -> int:
    -    a = fixedarr(1, 2, 3)
    -    b = fixedarr(1, 2, 3, receive_a(a))
    -    for (i = 0; i < len(b); i++): # <----------- len(b) simply becomes 4
    -        println(b[i])
    -    println(a[4]) # <------ this will result in an error
    -    0
    -

    Phase 1 - Initial fixed array support

    • Add support for the data type fixedarr(...) builtin.

    • Add support for setting and getting individual items.

    • Add support for passing to other functions.

    • Add support for compiling len(x) to an integer.

    • Add support for checking if a passed in literal integer is larger than allowed.

    • Note this will not be checked in runtime

    • FixedArr[Const[int]] <--------- elements cannot be updated

    Phase 2 - Add support for more builtins

    • Add foreach and other builtins that expect Arrays to work with FixedArr

    • Add to documentation

    • Add support for intellij and other editors

    • Double check this works in structs.

    • Add support for things like float[3] etc in raylib wrapper generator using FixedArr.

    \ No newline at end of file diff --git a/downloadable_artifacts/.keep b/downloadable_artifacts/.keep deleted file mode 100644 index 4bd537c..0000000 --- a/downloadable_artifacts/.keep +++ /dev/null @@ -1 +0,0 @@ -Keep this folder \ No newline at end of file diff --git a/package.json b/package.json index 5c45ce3..9adf5f1 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,9 @@ "astro": "astro" }, "dependencies": { - "astro": "^4.0.6" + "@astrojs/tailwind": "^5.0.3", + "astro": "^4.0.6", + "daisyui": "^4.4.22", + "tailwindcss": "^3.4.0" } -} \ No newline at end of file +} diff --git a/docs/android-chrome-192x192.png b/public/android-chrome-192x192.png similarity index 100% rename from docs/android-chrome-192x192.png rename to public/android-chrome-192x192.png diff --git a/docs/android-chrome-384x384.png b/public/android-chrome-384x384.png similarity index 100% rename from docs/android-chrome-384x384.png rename to public/android-chrome-384x384.png diff --git a/docs/apple-touch-icon.png b/public/apple-touch-icon.png similarity index 100% rename from docs/apple-touch-icon.png rename to public/apple-touch-icon.png diff --git a/docs/browserconfig.xml b/public/browserconfig.xml similarity index 100% rename from docs/browserconfig.xml rename to public/browserconfig.xml diff --git a/other-sources/Yaksha-Imports.drawio b/public/drawings/Yaksha-Imports.drawio similarity index 100% rename from other-sources/Yaksha-Imports.drawio rename to public/drawings/Yaksha-Imports.drawio diff --git a/other-sources/Yaksha-RT.drawio b/public/drawings/Yaksha-RT.drawio similarity index 100% rename from other-sources/Yaksha-RT.drawio rename to public/drawings/Yaksha-RT.drawio diff --git a/docs/favicon-16x16.png b/public/favicon-16x16.png similarity index 100% rename from docs/favicon-16x16.png rename to public/favicon-16x16.png diff --git a/docs/favicon-32x32.png b/public/favicon-32x32.png similarity index 100% rename from docs/favicon-32x32.png rename to public/favicon-32x32.png diff --git a/docs/favicon.ico b/public/favicon.ico similarity index 100% rename from docs/favicon.ico rename to public/favicon.ico diff --git a/public/favicon.svg b/public/favicon.svg deleted file mode 100644 index f157bd1..0000000 --- a/public/favicon.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - diff --git a/docs/images_home/carpntr_tool_run.gif b/public/imgs/carpntr_tool_run.gif similarity index 100% rename from docs/images_home/carpntr_tool_run.gif rename to public/imgs/carpntr_tool_run.gif diff --git a/docs/images_home/code_scroll_yaksha.gif b/public/imgs/code_scroll_yaksha.gif similarity index 100% rename from docs/images_home/code_scroll_yaksha.gif rename to public/imgs/code_scroll_yaksha.gif diff --git a/docs/images_home/typing_code_yaksha.gif b/public/imgs/typing_code_yaksha.gif similarity index 100% rename from docs/images_home/typing_code_yaksha.gif rename to public/imgs/typing_code_yaksha.gif diff --git a/docs/images_home/wind_tree.gif b/public/imgs/wind_tree.gif similarity index 100% rename from docs/images_home/wind_tree.gif rename to public/imgs/wind_tree.gif diff --git a/docs/images_home/yaksha_logo.png b/public/imgs/yaksha_logo.png similarity index 100% rename from docs/images_home/yaksha_logo.png rename to public/imgs/yaksha_logo.png diff --git a/docs/images_home/yk-banner.png b/public/imgs/yk-banner1.png similarity index 100% rename from docs/images_home/yk-banner.png rename to public/imgs/yk-banner1.png diff --git a/docs/images/yk-banner.png b/public/imgs/yk-banner2.png similarity index 100% rename from docs/images/yk-banner.png rename to public/imgs/yk-banner2.png diff --git a/docs/images/yk-imports.png b/public/imgs/yk-imports.png similarity index 100% rename from docs/images/yk-imports.png rename to public/imgs/yk-imports.png diff --git a/docs/images/yk-rt.png b/public/imgs/yk-rt.png similarity index 100% rename from docs/images/yk-rt.png rename to public/imgs/yk-rt.png diff --git a/docs/images/yk-sample1.png b/public/imgs/yk-sample1.png similarity index 100% rename from docs/images/yk-sample1.png rename to public/imgs/yk-sample1.png diff --git a/docs/images/yk-sample2.gif b/public/imgs/yk-sample2.gif similarity index 100% rename from docs/images/yk-sample2.gif rename to public/imgs/yk-sample2.gif diff --git a/docs/mstile-150x150.png b/public/mstile-150x150.png similarity index 100% rename from docs/mstile-150x150.png rename to public/mstile-150x150.png diff --git a/docs/static_demos/gui/gui_window.html b/public/static_demos/gui/gui_window.html similarity index 100% rename from docs/static_demos/gui/gui_window.html rename to public/static_demos/gui/gui_window.html diff --git a/docs/static_demos/gui/gui_window.js b/public/static_demos/gui/gui_window.js similarity index 100% rename from docs/static_demos/gui/gui_window.js rename to public/static_demos/gui/gui_window.js diff --git a/docs/static_demos/gui/gui_window.wasm b/public/static_demos/gui/gui_window.wasm similarity index 100% rename from docs/static_demos/gui/gui_window.wasm rename to public/static_demos/gui/gui_window.wasm diff --git a/docs/static_demos/gui/gui_window.yaka b/public/static_demos/gui/gui_window.yaka similarity index 100% rename from docs/static_demos/gui/gui_window.yaka rename to public/static_demos/gui/gui_window.yaka diff --git a/docs/static_demos/notes_wasm4/notes.html b/public/static_demos/notes_wasm4/notes.html similarity index 100% rename from docs/static_demos/notes_wasm4/notes.html rename to public/static_demos/notes_wasm4/notes.html diff --git a/docs/static_demos/notes_wasm4/notes.wasm b/public/static_demos/notes_wasm4/notes.wasm similarity index 100% rename from docs/static_demos/notes_wasm4/notes.wasm rename to public/static_demos/notes_wasm4/notes.wasm diff --git a/docs/static_demos/notes_wasm4/notes.yaka b/public/static_demos/notes_wasm4/notes.yaka similarity index 100% rename from docs/static_demos/notes_wasm4/notes.yaka rename to public/static_demos/notes_wasm4/notes.yaka diff --git a/docs/static_demos/snake_wasm4/snake.html b/public/static_demos/snake_wasm4/snake.html similarity index 100% rename from docs/static_demos/snake_wasm4/snake.html rename to public/static_demos/snake_wasm4/snake.html diff --git a/docs/static_demos/snake_wasm4/snake_w4.wasm b/public/static_demos/snake_wasm4/snake_w4.wasm similarity index 100% rename from docs/static_demos/snake_wasm4/snake_w4.wasm rename to public/static_demos/snake_wasm4/snake_w4.wasm diff --git a/docs/static_demos/snake_wasm4/snake_w4.yaka b/public/static_demos/snake_wasm4/snake_w4.yaka similarity index 100% rename from docs/static_demos/snake_wasm4/snake_w4.yaka rename to public/static_demos/snake_wasm4/snake_w4.yaka diff --git a/docs/static_demos/space_blast/space_blast.data b/public/static_demos/space_blast/space_blast.data similarity index 100% rename from docs/static_demos/space_blast/space_blast.data rename to public/static_demos/space_blast/space_blast.data diff --git a/docs/static_demos/space_blast/space_blast.html b/public/static_demos/space_blast/space_blast.html similarity index 100% rename from docs/static_demos/space_blast/space_blast.html rename to public/static_demos/space_blast/space_blast.html diff --git a/docs/static_demos/space_blast/space_blast.js b/public/static_demos/space_blast/space_blast.js similarity index 100% rename from docs/static_demos/space_blast/space_blast.js rename to public/static_demos/space_blast/space_blast.js diff --git a/docs/static_demos/space_blast/space_blast.wasm b/public/static_demos/space_blast/space_blast.wasm similarity index 100% rename from docs/static_demos/space_blast/space_blast.wasm rename to public/static_demos/space_blast/space_blast.wasm diff --git a/docs/static_demos/space_blast/space_blast.yaka b/public/static_demos/space_blast/space_blast.yaka similarity index 100% rename from docs/static_demos/space_blast/space_blast.yaka rename to public/static_demos/space_blast/space_blast.yaka diff --git a/docs/static_demos/tree/wind_tree.html b/public/static_demos/tree/wind_tree.html similarity index 100% rename from docs/static_demos/tree/wind_tree.html rename to public/static_demos/tree/wind_tree.html diff --git a/docs/static_demos/tree/wind_tree.js b/public/static_demos/tree/wind_tree.js similarity index 100% rename from docs/static_demos/tree/wind_tree.js rename to public/static_demos/tree/wind_tree.js diff --git a/docs/static_demos/tree/wind_tree.wasm b/public/static_demos/tree/wind_tree.wasm similarity index 100% rename from docs/static_demos/tree/wind_tree.wasm rename to public/static_demos/tree/wind_tree.wasm diff --git a/run.sh b/run.sh deleted file mode 100755 index d6f642f..0000000 --- a/run.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env bash -python build.py -./server.sh diff --git a/server.cmd b/server.cmd deleted file mode 100644 index f719e47..0000000 --- a/server.cmd +++ /dev/null @@ -1 +0,0 @@ -python -m http.server --directory docs --bind 127.0.0.1 5005 diff --git a/server.sh b/server.sh deleted file mode 100755 index 13fb443..0000000 --- a/server.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/usr/bin/env bash -python -m http.server --directory docs --bind 127.0.0.1 5005 diff --git a/src/components/Footer.astro b/src/components/Footer.astro new file mode 100644 index 0000000..af60e85 --- /dev/null +++ b/src/components/Footer.astro @@ -0,0 +1,26 @@ + diff --git a/src/components/NavBar.astro b/src/components/NavBar.astro new file mode 100644 index 0000000..f996ed7 --- /dev/null +++ b/src/components/NavBar.astro @@ -0,0 +1,55 @@ +--- +const pathname = new URL(Astro.request.url).pathname; +const currentPath = pathname.slice(1); + +const activePageStyling = (path: string) => path == currentPath ? "text-primary" : ""; +--- + + \ No newline at end of file diff --git a/src/env.d.ts b/src/env.d.ts index f964fe0..acef35f 100644 --- a/src/env.d.ts +++ b/src/env.d.ts @@ -1 +1,2 @@ +/// /// diff --git a/src/layouts/Layout.astro b/src/layouts/Layout.astro index 7b552be..1681d0b 100644 --- a/src/layouts/Layout.astro +++ b/src/layouts/Layout.astro @@ -1,4 +1,7 @@ --- +import Footer from '../components/Footer.astro'; +import NavBar from '../components/NavBar.astro'; + interface Props { title: string; } @@ -12,40 +15,15 @@ const { title } = Astro.props; - + {title} - + +
    + +
    +